Date: Wed, 19 Dec 2012 17:58:54 -0500 From: Mark Johnston <markjdb@gmail.com> To: d@delphij.net Cc: Ian Lepore <freebsd@damnhippie.dyndns.org>, "src-committers@freebsd.org" <src-committers@freebsd.org>, Jilles Tjoelker <jilles@stack.nl>, Garrett Cooper <yanegomi@gmail.com>, "svn-src-all@freebsd.org" <svn-src-all@freebsd.org>, Alfred Perlstein <bright@mu.org>, Xin LI <delphij@freebsd.org>, "svn-src-head@freebsd.org" <svn-src-head@freebsd.org>, Andrey Zonov <zont@freebsd.org> Subject: Re: svn commit: r244198 - in head: etc/rc.d sbin/sysctl Message-ID: <20121219225854.GA8399@oddish> In-Reply-To: <50D23961.7090803@delphij.net> References: <50D1D720.80206@FreeBSD.org> <1355931456.1198.203.camel@revolution.hippie.lan> <05CC5BAD-B968-4A7A-8097-A3344D970D63@mu.org> <1355932607.1198.206.camel@revolution.hippie.lan> <F158CD10-B65B-4BBA-BCAD-6A52BC5C8FDF@mu.org> <50D2128A.7030205@delphij.net> <20121219210418.GA83983@stack.nl> <CAGH67wRTdBCZLq1R8-yqD6EBZ%2B=F228-0o_8TvU3b0KZD6vUfg@mail.gmail.com> <CAGH67wT1L_9ia7-hdHST6q8iCdtmFifZcHixCQhBTiZEH8YAcw@mail.gmail.com> <50D23961.7090803@delphij.net>
next in thread | previous in thread | raw e-mail | index | archive | help
On Wed, Dec 19, 2012 at 02:02:09PM -0800, Xin Li wrote: > -----BEGIN PGP SIGNED MESSAGE----- > Hash: SHA256 > > On 12/19/12 13:12, Garrett Cooper wrote: > > On Wed, Dec 19, 2012 at 1:10 PM, Garrett Cooper > > <yanegomi@gmail.com> wrote: > > > > ... > > > >> find -exec / echo | xargs ? Seems like there's a better way to > >> solve this. > > > > Of course we also might be overengineering the problem (my > > suggestion definitely was overengineered). Why not pass in the > > appropriate arguments via sysctl_args in /etc/rc.conf ? Thanks, > > Irrelevant. Consider this (extreme) situation: someone distributes > several sets of sysctl values tuned for certain situations, like > tcp.conf, supermicro.conf, ... and wants to put them together in a > directory, it's useful to source from the directory without having to > do a generation of command line on boot, so when something goes wrong, > they just remove the pack rather than changing /etc/rc.conf. At work I've changed the -f flag of syslogd and newsyslog to accept a directory which gets non-recursively searched for input files. This way we can have a directory, say /etc/syslog.d, into which package install scripts can easily drop config files. For something like sysctl this might be a bit much, but it's just a thought. The example diff below is what I have in mind. -Mark diff --git a/sbin/sysctl/sysctl.c b/sbin/sysctl/sysctl.c index 8fad089..c880b45 100644 --- a/sbin/sysctl/sysctl.c +++ b/sbin/sysctl/sysctl.c @@ -42,6 +42,7 @@ static const char rcsid[] = #endif /* not lint */ #include <sys/param.h> +#include <sys/types.h> #include <sys/time.h> #include <sys/resource.h> #include <sys/stat.h> @@ -49,6 +50,7 @@ static const char rcsid[] = #include <sys/vmmeter.h> #include <ctype.h> +#include <dirent.h> #include <err.h> #include <errno.h> #include <inttypes.h> @@ -64,6 +66,7 @@ static const char *conffile; static int aflag, bflag, dflag, eflag, hflag, iflag; static int Nflag, nflag, oflag, qflag, Tflag, Wflag, xflag; +static int handlefile(const char *); static int oidfmt(int *, int, char *, u_int *); static int parsefile(const char *); static int parse(const char *, int); @@ -165,7 +168,7 @@ main(int argc, char **argv) warncount = 0; if (conffile != NULL) - warncount += parsefile(conffile); + warncount += handlefile(conffile); while (argc-- > 0) warncount += parse(*argv++, 0); @@ -402,6 +405,48 @@ parse(const char *string, int lineno) } static int +handlefile(const char *filename) +{ + DIR *dir; + struct dirent *de; + struct stat sb; + char path[MAXPATHLEN], *fname; + size_t off; + int warncount = 0; + + if (stat(filename, &sb)) + err(EX_NOINPUT, "%s", filename); + if (S_ISREG(sb.st_mode)) { + return (parsefile(filename)); + } else if (!S_ISDIR(sb.st_mode)) + errx(EX_USAGE, "invalid input file '%s'", filename); + + dir = opendir(filename); + if (dir == NULL) + err(EX_NOINPUT, "%s", filename); + off = strlcpy(path, filename, sizeof(path) - 1); + if (off >= sizeof(path) - 1) + errx(EX_NOINPUT, "input path '%s' too long", filename); + + fname = path + off; + *fname++ = '/'; + off++; + while ((de = readdir(dir)) != NULL) { + strlcpy(fname, de->d_name, sizeof(path) - off); + if (stat(path, &sb)) { + warn("%s", path); + continue; + } else if (!S_ISREG(sb.st_mode)) + continue; + + warncount += parsefile(path); + } + closedir(dir); + + return (warncount); +} + +static int parsefile(const char *filename) { FILE *file;
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20121219225854.GA8399>