Subject: Re: dynamic sysctl
To: David Laight <david@l8s.co.uk>
From: Andrew Brown <atatat@atatdot.net>
List: tech-kern
Date: 11/18/2003 08:51:28
>> >> >Why not just make:
>> >> > sysctl((void *)"kern.maxproc", 0, &buf, sizeof buf, NULL, 0);
>> >> >return the value of kern.maxproc (etc).
>> >>
>> >> sounds nice, but how does that communicate the type of the returned
>> >> data to the caller? or maybe buf could then consist of a type number,
>> >> followed by a length number, followed by the actual data...
>> >
>> >Well, in most cases (ie everything except the sysctl program) the
>> >caller knows what he expects. For sysctl maybe "kern.?" could return
>> >the types of the subfields
>> >- better have 'kern.*' return "name:type.name:type"
>>
>> and...in most cases (ie, everything except the sysctl program) the
>> caller knows where the thing is that he's looking for, and does not
>> have to do auto-discovery.
>
>Except that it is safer to use the kernel's map of name => number, rather
>than have some programs using the kernel's map and others the header
>file. Especially if you don't know whether the item has a fixed name
>or a dynamic one.
you misunderstand me. i did not mean to imply that programs should
continue to use:
int name[2], namelen = 2;
name[0] = CTL_KERN;
name[1] = KERN_SECURELVL;
sysctl(&name[0], namelen, ...
though that's still supported. it's better, imho, to do this:
int name[2], namelen = 2;
sysctlnametomib("kern.securelevel", &name[0], &namelen,
NULL, NULL, NULL);
sysctl(&name[0], namelen, ...
(though i've grown particularly fond of merely using 1.9 on the
command line to represent kern.securelevel -- it's a lot lesss
typing :).
that uses the kernel's name<->number mapping and not the header file
and the program continues to "know" what it's asking for.
>The run-time cost in cpu cycles should be trivial. From a coding point
>of view sysctl_read("kern.maxproc", &buf, sizeof buf) would be less
>error prone than the current scheme.
well...you could easily do that as a library call at this point, and
kern.maxproc ain't moving... :)
fwiw, i stand by my point that while entries in the sysctl mib could
be added and removed very rapidly, i don't think that will or should
happen, since anything incredibly short-lived is almost completely
useless. such data should have a different interface.
>Maybe, in time, the numbers could be depracated....
sure, though the sysctl() interface would have to be abandoned at that
point in favor of something else.
--
|-----< "CODE WARRIOR" >-----|
codewarrior@daemon.org * "ah! i see you have the internet
twofsonet@graffiti.com (Andrew Brown) that goes *ping*!"
werdna@squooshy.com * "information is power -- share the wealth."