From owner-freebsd-hackers@FreeBSD.ORG Tue Jul 26 07:46:31 2005 Return-Path: X-Original-To: freebsd-hackers@freebsd.org Delivered-To: freebsd-hackers@freebsd.org Received: from mx1.FreeBSD.org (mx1.freebsd.org [216.136.204.125]) by hub.freebsd.org (Postfix) with ESMTP id 489B116A41F for ; Tue, 26 Jul 2005 07:46:31 +0000 (GMT) (envelope-from Felix-KM@yandex.ru) Received: from colgate.yandex.ru (colgate.yandex.ru [213.180.200.34]) by mx1.FreeBSD.org (Postfix) with ESMTP id DB9D443D45 for ; Tue, 26 Jul 2005 07:46:30 +0000 (GMT) (envelope-from Felix-KM@yandex.ru) Received: from YAMAIL (colgate.yandex.ru) by mail.yandex.ru id ; Tue, 26 Jul 2005 11:46:23 +0400 Date: Tue, 26 Jul 2005 11:46:23 +0400 (MSD) From: "Felix-KM" Sender: Felix-KM@yandex.ru Message-Id: <42E5EA4F.00000A.07557@colgate.yandex.ru> MIME-Version: 1.0 X-Mailer: Yamail [ http://yandex.ru ] Errors-To: Felix-KM@yandex.ru To: NKoch@demig.de In-Reply-To: <000001c59129$6099b560$4801a8c0@ws-ew-3.W2KDEMIG> References: <000001c59129$6099b560$4801a8c0@ws-ew-3.W2KDEMIG> X-Source-Ip: 82.179.191.126 X-Originating-Ip: unknown Content-Type: text/plain; charset="US-ASCII" Content-Transfer-Encoding: 7bit Cc: freebsd-hackers@freebsd.org Subject: RE: how to use the function copyout() X-BeenThere: freebsd-hackers@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list Reply-To: Felix-KM@yandex.ru List-Id: Technical Discussions relating to FreeBSD List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Tue, 26 Jul 2005 07:46:31 -0000 > I think that could work (only an idea, not tested): > > > struct Region > { > void * p; > size_t s; > }; > > > #define IOBIG _IOWR ('b', 123, struct Region) > > > userland: > > char data[1000]; > struct Region r; > > r.p = data; > r.s = sizeof data; > int error = ioctl (fd, IOBIG, &r); > > > kernel: > int my_ioctl(..., caddr_t data, ...) > { > ... > char data[1000]; > ... > return copyout(data, ((struct Region *) data)->p, ((struct Region *) > data)->s); > } > > > Have a try and tell us if it works. > > > Norbert > Yes! Now the program works! I have changed the code in this way: struct Region { void * p; size_t s; }; #define IOBIG _IOWR ('b', 123, struct Region) ---- driver ---- struct my_softc { ... short unsigned int B; }; ... static int my_ioctl(struct cdev *dev, u_long cmd, caddr_t data, int flag, struct thread *td) { struct my_softc *my_sc; int unit, error; unit = minor(dev); my_sc = (struct my_softc *)devclass_get_softc(my_devclass, unit); if (my_sc == NULL) return (ENXIO); switch(cmd) { ... case IOCTL_GET_B: error = copyout(&my_sc->B, (((struct Datas *)data)->d)+0x1850, sizeof(my_sc->B)); break; default: break; } return 0; } ---user program ---------------------- ... short unsigned int data[32768]; struct Region r; int main(int argc, char *argv[]) { ... r.p = data; r.s = sizeof data; if (ioctl(fd0, IOCTL_GET_B, &r) == -1) err(1, "IOCTL_GET_B"); ... } Now I have access to each element of the array (e.g. 0x1850). Thank you very much!