Skip site navigation (1)Skip section navigation (2)
Date:      Mon, 25 Jul 2005 06:05:28 -0700 (PDT)
From:      "Kamal R. Prasad" <kamalpr@yahoo.com>
To:        Felix-KM@yandex.ru, freebsd-hackers@freebsd.org
Subject:   Re: how to use the function copyout()
Message-ID:  <20050725130528.59033.qmail@web52709.mail.yahoo.com>
In-Reply-To: <42E4DC88.000006.21996@camay.yandex.ru>

next in thread | previous in thread | raw e-mail | index | archive | help
Im not sure of the bug in your code, but you have got
to assume that copyout() would fail if the user/kernel
addr passed to it is not accessible.

regards
-kamal


--- Felix-KM <Felix-KM@yandex.ru> wrote:

> 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?
> _______________________________________________
> freebsd-hackers@freebsd.org mailing list
>
http://lists.freebsd.org/mailman/listinfo/freebsd-hackers
> To unsubscribe, send any mail to
> "freebsd-hackers-unsubscribe@freebsd.org"
> 


------------------------------------------------------------
Kamal R. Prasad
UNIX systems consultant 
http://www.kamalprasad.com/
kamalp@acm.org

In theory, there is no difference between theory and practice. In practice, there is.
------------------------------------------------------------


		
____________________________________________________
Start your day with Yahoo! - make it your home page 
http://www.yahoo.com/r/hs 
 



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20050725130528.59033.qmail>