From owner-freebsd-stable@FreeBSD.ORG Thu Feb 28 08:13:30 2013 Return-Path: Delivered-To: freebsd-stable@freebsd.org Received: from mx1.freebsd.org (mx1.FreeBSD.org [8.8.178.115]) by hub.freebsd.org (Postfix) with ESMTP id 9DE7CCC0 for ; Thu, 28 Feb 2013 08:13:30 +0000 (UTC) (envelope-from jdc@koitsu.org) Received: from qmta07.emeryville.ca.mail.comcast.net (qmta07.emeryville.ca.mail.comcast.net [IPv6:2001:558:fe2d:43:76:96:30:64]) by mx1.freebsd.org (Postfix) with ESMTP id 824D11188 for ; Thu, 28 Feb 2013 08:13:30 +0000 (UTC) Received: from omta13.emeryville.ca.mail.comcast.net ([76.96.30.52]) by qmta07.emeryville.ca.mail.comcast.net with comcast id 5kA71l00117UAYkA7kDWqF; Thu, 28 Feb 2013 08:13:30 +0000 Received: from koitsu.strangled.net ([67.180.84.87]) by omta13.emeryville.ca.mail.comcast.net with comcast id 5kDV1l0061t3BNj8ZkDVXk; Thu, 28 Feb 2013 08:13:29 +0000 Received: by icarus.home.lan (Postfix, from userid 1000) id 22D6373A31; Thu, 28 Feb 2013 00:13:29 -0800 (PST) Date: Thu, 28 Feb 2013 00:13:29 -0800 From: Jeremy Chadwick To: Andreas Nilsson Subject: Re: rc.d/sysctl fails to parse sysctl.conf Message-ID: <20130228081329.GA6194@icarus.home.lan> References: MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: User-Agent: Mutt/1.5.21 (2010-09-15) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=comcast.net; s=q20121106; t=1362039210; bh=/c2GCSdvVgV8Raiw+bAHBPssCaaX6nWRV9g8HJJp0tk=; h=Received:Received:Received:Date:From:To:Subject:Message-ID: MIME-Version:Content-Type; b=HCvg9wV7nKvJtAn880ufwospSniMIwDWqUmE3iA1RyUowhVw6rbM40L63LVUxt+aN 2TN4s4c6nLRrCEVFhXcIkF4iuiKO/XgjXTyHlesRj0QariUTnQnhy5w60BFYesDOMb Bmy+yfbpm7AHh/g8d6a9v41rwadINtNI5M2566GGzEzc1SS7HWvouNhWDWRXSCfg9V Kr9hpy5A6ewOXXGw4v8+MFCMhePofKHNW4CrRc+6BQWDQ2ZvvHTzWqp/FqK0VKiERy JuNsfJAg3tpaDC7QohNEHGxAglStYVjGnM1a+q5RKJ/rlQOtoeKb2uPacow6YrFUg2 whWLHtdk13hqw== Cc: Chris Rees , FreeBSD Stable Mailing List X-BeenThere: freebsd-stable@freebsd.org X-Mailman-Version: 2.1.14 Precedence: list List-Id: Production branch of FreeBSD source code List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Thu, 28 Feb 2013 08:13:30 -0000 On Thu, Feb 28, 2013 at 08:45:11AM +0100, Andreas Nilsson wrote: > On Wed, Feb 27, 2013 at 10:39 PM, Chris Rees wrote: > > > On 27 February 2013 21:19, Andreas Nilsson 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@koitsu.org | | UNIX Systems Administrator http://jdc.koitsu.org/ | | Mountain View, CA, US | | Making life hard for others since 1977. PGP 4BD6C0CB |