Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 26 Jul 2005 09:39:13 -0600
From:      Scott Long <scottl@samsco.org>
To:        Felix-KM@yandex.ru
Cc:        NKoch@demig.de, freebsd-hackers@freebsd.org
Subject:   Re: how to use the function copyout()
Message-ID:  <42E65921.8060400@samsco.org>
In-Reply-To: <42E5EA4F.00000A.07557@colgate.yandex.ru>
References:  <000001c59129$6099b560$4801a8c0@ws-ew-3.W2KDEMIG> <42E5EA4F.00000A.07557@colgate.yandex.ru>

next in thread | previous in thread | raw e-mail | index | archive | help
Felix-KM wrote:
>>I think that could work (only an idea, not tested):
>>
>>
>>struct Region
>>{
>>  void * p;
>>  size_t s;
>>};
>>
>>
>>#define IOBIG _IOWR ('b', 123, struct Region)
>>
>>
>>userland:
>>
>>  char data[1000];
>>  struct Region r;
>>
>>  r.p = data;
>>  r.s = sizeof data;
>>  int error = ioctl (fd, IOBIG, &r);
>>
>>
>>kernel:
>>  int my_ioctl(..., caddr_t data, ...)
>>  {
>>    ...
>>    char data[1000];
>>    ...
>>    return copyout(data, ((struct Region *) data)->p, ((struct Region *)
>>data)->s);
>>  }
>>
>>
>>Have a try and tell us if it works.
>>
>>
>>Norbert
>>
> 
> 
> Yes! Now the program works!
> I have changed the code in this way:
> 
> struct Region
> {
>   void * p;
>   size_t s;
> };
> 
> #define IOBIG _IOWR ('b', 123, struct Region)
> 

Unless your ioctl handler is going to modify values in the Region struct
and pass them back out to userland, you should just use _IOR instead of 
_IORW.

Scott



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