Skip site navigation (1)Skip section navigation (2)
Date:      Sun, 22 Aug 2004 00:18:20 -0700
From:      John-Mark Gurney <gurney_j@resnet.uoregon.edu>
To:        Alfred Perlstein <alfred@freebsd.org>
Cc:        hackers@freebsd.org
Subject:   Re: sysctl hacks
Message-ID:  <20040822071820.GA29902@funkthat.com>
In-Reply-To: <20040822064707.GF26612@elvis.mu.org>
References:  <20040821200205.GE26612@elvis.mu.org> <46719.1093120181@critter.freebsd.dk> <20040822064707.GF26612@elvis.mu.org>

next in thread | previous in thread | raw e-mail | index | archive | help
Alfred Perlstein wrote this message on Sat, Aug 21, 2004 at 23:47 -0700:
> * Poul-Henning Kamp <phk@phk.freebsd.dk> [040821 13:29] wrote:
> > In message <20040821200205.GE26612@elvis.mu.org>, Alfred Perlstein writes:
> > >I'm doing some work that requires that I have a sysctl structure
> > >be passed around, but inside that structure are several pointers I
> > >may need to dereference.
> > >
> > >Basically:
> > >
> > >struct mysysctldata {
> > >   .... (data here)
> > >   void *moredata;
> > >   size_t morelen;
> > >};
> > >
> > >What is the proper way of sysctl'ing IN the data from moredata?
> > >
> > >I need to make a copy of the sysctl req, but... I'm not sure what
> > >to initialize the 'lock' member to.
> > 
> > Just use the SYSCTL_IN() and ..._OUT() functions.
> 
> :(
> 
> I wasn't clear.
> 
> I have a sysctl node that takes a struct like so:
> 
> struct mysysctldata {
>   .... (data here)
>   struct moredata * vc_ptr;
>   size_t len vc_len;
> }
> 
> If I use SYSCTL_IN(), then I can get "mysysctldata", but I only
> get the pointer to "moredata", now I want to get a copy of 
> "moredata", what's a good way to do this?
> 
> I have a macro that does this:
> 
> #define VCTLTOREQ(vc, req)						\
> 	do {								\
> 		(req)->newptr = (vc)->vc_ptr;				\
> 		(req)->newlen = (vc)->vc_len;				\
> 		(req)->newidx = 0;					\
> 	} while (0)
> 
> Is that right?

After reading the sysctl code, it appears that you can't do that..
SYSCTL_IN only lets you read serially from the buffer passed in...  so
you have to have all the data serially in userland...  once you do a
SYSCTL_IN of x bytes of data, the pointer is updated to skip those x,
and the next call will read in the bytes following the first read...

Hope this helps.

-- 
  John-Mark Gurney				Voice: +1 415 225 5579

     "All that I will do, has been done, All that I have, has not."



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