Date: Mon, 25 Jul 2005 16:35:20 +0400 (MSD) From: "Felix-KM" <Felix-KM@yandex.ru> To: freebsd-hackers@freebsd.org Subject: how to use the function copyout() Message-ID: <42E4DC88.000006.21996@camay.yandex.ru>
next in thread | raw e-mail | index | archive | help
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?
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?42E4DC88.000006.21996>