Re: how to use the function copyout()
From: Kamal R. Prasad (kamalpr_at_yahoo.com)
Date: 07/25/05
- Previous message: Leubner, Achim: "RE: aac_pci.c Patch (support for HP ML110 G2)"
- In reply to: Felix-KM: "how to use the function copyout()"
- Next in thread: Scott Long: "Re: how to use the function copyout()"
- Reply: Scott Long: "Re: how to use the function copyout()"
- Messages sorted by: [ date ] [ thread ] [ subject ] [ author ]
Date: Mon, 25 Jul 2005 06:05:28 -0700 (PDT) To: Felix-KM@yandex.ru, freebsd-hackers@freebsd.org
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
_______________________________________________
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"
- Previous message: Leubner, Achim: "RE: aac_pci.c Patch (support for HP ML110 G2)"
- In reply to: Felix-KM: "how to use the function copyout()"
- Next in thread: Scott Long: "Re: how to use the function copyout()"
- Reply: Scott Long: "Re: how to use the function copyout()"
- Messages sorted by: [ date ] [ thread ] [ subject ] [ author ]
Relevant Pages
|
|