rc.d/sysctl fails to parse sysctl.conf
Jeremy Chadwick
jdc at koitsu.org
Thu Feb 28 08:13:30 UTC 2013
On Thu, Feb 28, 2013 at 08:45:11AM +0100, Andreas Nilsson wrote:
> On Wed, Feb 27, 2013 at 10:39 PM, Chris Rees <crees at freebsd.org> wrote:
>
> > On 27 February 2013 21:19, Andreas Nilsson <andrnils at gmail.com> wrote:
> > > Hello,
> > >
> > > I tried to get my sound working, and long story short: rc.d/sysctl parses
> > > sysctl.conf wrongly if there are sysctls of the form
> > >
> > > mib=val1=val2
> > >
> > > which is what you need for sound. For reference I needed/wanted
> > >
> > > dev.hdaa.4.nid25_config=as=1,seq=15
> > > dev.hdaa.4.nid31_config=as=1
> > >
> > > I believe the following patch would address the incorrect parsing:
> > >
> > > --- /etc/rc.d/sysctl.old 2013-02-27 22:00:00.000000000 +0100
> > > +++ /etc/rc.d/sysctl 2013-02-27 22:05:24.000000000 +0100
> > > @@ -26,7 +26,7 @@
> > > \#*|'')
> > > ;;
> > > *)
> > > - mib=${var%=*}
> > > + mib=${var%%=*}
> > > val=${var#*=}
> > >
> > > if current_value=`${SYSCTL} -n ${mib}
> > > 2>/dev/null`; then
> >
> > I think that this is the right thing to do here.
> >
> > Chris
>
> As a follow-up question: is sysctl.conf supposed to handle all valid input
> one can give sysctl on the command line? Using the above example would
> normally be typed:
> sysctl dev.hdaa.4.nid25_config="as=1 seq=15"
> which works, but fails to work from sysctl.conf
This has to do with how your shell parses things (quotes, etc.) versus
how shell scripts like /etc/rc.d/sysctl do.
Assuming you read/speak sh: read /etc/rc.d/sysctl. It's not very long,
and fairly easy to follow, barring the %, %%, and # pattern modifier
parts (read sh man page for how those work). /etc/rc.d/sysctl is not a
"file parser" -- instead it relies on sh to do the work.
Once you read the script, you'll understand how/why apostrophes, double
quotes, and spaces in /etc/sysctl.conf are a problem. "Solving" this
dilemma in sh is a pain in the ass and often involves utter nonsense
like escaping (\) every character and making exceptions; folks who have
written extensive shell scripts will know what I mean when I use the
term "quoting hell".
That said, here's the general guideline: your /etc/sysctl.conf should
not contain quotes or double-quotes or spaces after the assignment (=),
generally speaking. If there is a sysctl MIB that actually
***requires*** spaces in its value, then whoever coded their driver/bit
that way should be taken out back and flogged. Hard. This is why you
probably see Andreas using a comma-delimited model (and if that works,
fantastic+great!).
That said: you can get spaces to work in /etc/sysctl.conf by escaping
them, i.e.:
some.mib=foo\ bar
You might be able to escape some types of quotes, but this gets into
"quoting hell" like I said above. Don't bother. As I said, apostrophes
(') and double-quotes (") and spaces (" "), will cause problems, and if
you read the script it'll become apparent why.
--
| Jeremy Chadwick jdc at koitsu.org |
| UNIX Systems Administrator http://jdc.koitsu.org/ |
| Mountain View, CA, US |
| Making life hard for others since 1977. PGP 4BD6C0CB |
More information about the freebsd-stable
mailing list