how to use the function copyout()
Felix-KM
Felix-KM at yandex.ru
Mon Jul 25 12:35:36 GMT 2005
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?
More information about the freebsd-hackers
mailing list