Skip site navigation (1)Skip section navigation (2)
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>