From owner-freebsd-hackers@FreeBSD.ORG Mon Jul 25 12:35:36 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 4282C16A41F for ; Mon, 25 Jul 2005 12:35:36 +0000 (GMT) (envelope-from Felix-KM@yandex.ru) Received: from camay.yandex.ru (camay.yandex.ru [213.180.200.33]) by mx1.FreeBSD.org (Postfix) with ESMTP id BA68343D48 for ; Mon, 25 Jul 2005 12:35:35 +0000 (GMT) (envelope-from Felix-KM@yandex.ru) Received: from YAMAIL (camay.yandex.ru) by mail.yandex.ru id ; Mon, 25 Jul 2005 16:35:20 +0400 Date: Mon, 25 Jul 2005 16:35:20 +0400 (MSD) From: "Felix-KM" Sender: Felix-KM@yandex.ru Message-Id: <42E4DC88.000006.21996@camay.yandex.ru> MIME-Version: 1.0 X-Mailer: Yamail [ http://yandex.ru ] Errors-To: Felix-KM@yandex.ru To: freebsd-hackers@freebsd.org X-Source-Ip: 82.179.191.126 X-Originating-Ip: unknown Content-Type: text/plain; charset="US-ASCII" Content-Transfer-Encoding: 7bit Subject: 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: Mon, 25 Jul 2005 12:35:36 -0000 I can't understand how to use the function copyout(). It is necessary to write the data from a device driver to the array defined in user program. I do it this way: #define IOCTL_GET_B _IOWR("F", 127, 0x4) ---- 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, data, sizeof(my_sc->B)); switch (error) { case 0: printf(" IOCTL_GET_B: %d\n", my_sc->B); break; case EFAULT: printf("EFAULT\n"); break; case EIO: printf("EIO\n"); break; case ENOMEM: printf("ENOMEM\n"); break; case ENOSPC: printf("ENOSPC\n"); break; } break; default: break; } return 0; } ---user program ---------------------- ... short unsigned int Data[32768]; int main(int argc, char *argv[]) { ... if (ioctl(fd0, IOCTL_GET_B, Data) == -1) err(1, "IOCTL_GET_B"); ... } ------- Here I get EFAULT. What have I done wrong? How can I do it correctly?