Skip site navigation (1)Skip section navigation (2)
Date:      Thu, 3 Jan 2008 18:19:05 -0800
From:      Alfred Perlstein <alfred@freebsd.org>
To:        Julian Elischer <julian@elischer.org>
Cc:        arch@freebsd.org
Subject:   Re: RFC: sysctl additional functions/macros
Message-ID:  <20080104021905.GE76698@elvis.mu.org>
In-Reply-To: <477D931D.4000303@elischer.org>
References:  <477D931D.4000303@elischer.org>

next in thread | previous in thread | raw e-mail | index | archive | help
Yes, but EINVAL please.

Another idea would be a simplified SYSCTL_INT_PROC
that allowed one to define a function like so:

int
sysctl_handle_int_proc(void *handle, int *newval, int *max, int *min)
{


}

If this function returned '0' then 'newval' would be accepted.
Otherwise the function should return an error, most likely EINVAL.

The point being that a lot of these maximums may take a calculation
and we should make it as easy as possible to do this calculation
and provide the function for doing so.

One would also set the min/max values so that one could query
the acceptable bounds of a tunable, or even the bounds of of
the tuneable.

(Note: if *newval == NULL, we're just querying max/min, not
doing a set operation.)

(Note 2: "handle" is so you can have a common handler and
possibly switch() off of handle for multiple sysctl ints to
reduce the number of functions required.)

-Alfred

* Julian Elischer <julian@elischer.org> [080103 17:57] wrote:
> I would like to extend the current SYSCTL_INT() with 
> SYSCTL_INT_CLAMPED() or similar, where you also supply a
> maximum acceptable value. (and maybe a clue as to what to say if it is 
> a bad value).
> 
> so many users of SYSCTL_INT don't check for bad values because it's so
> much harder (you need to supply your own handler), and so many
> simple handlers exist fo rthe people that DO check that it seems to
> me that we should provide a pre-canned way to do this....
> 
> we are limited to using the existing structure,
> but as we have no existing callers we can redefine
> one element....
> 
> I would suggest:
> 
> I'd like to test for a minimum too but I think I can only squeeze one 
> field out of the existing struct sysctl_oid.
> 
> SYSCTL_INT_CLAMPED(parent, nbr, name, access, ptr, max, descr)
>                                                   ^^^^
> 
> anyone think it's a bad idea?
> After all the macros are evaluated, (etc.) it would call:
> ( off the top of my head )
> 
> int
> sysctl_handle_int_max(SYSCTL_HANDLER_ARGS)
>         {
>         int  error = 0;
> 
>         error = SYSCTL_OUT(req, arg1, sizeof(int));
> 
>         if (error || !req->newptr)
>                 return (error);
> 
>         if (*(int *)arg1 > (int)arg2)
>                 error = EDOOFUS;
>         else
>                 error = SYSCTL_IN(req, arg1, sizeof(int));
>         return (error);
> }
> _______________________________________________
> freebsd-arch@freebsd.org mailing list
> http://lists.freebsd.org/mailman/listinfo/freebsd-arch
> To unsubscribe, send any mail to "freebsd-arch-unsubscribe@freebsd.org"

-- 
- Alfred Perlstein



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