Date: Fri, 3 Jan 2003 02:25:34 +0100 From: Paul Schenkeveld <fb-hackers@psconsult.nl> To: Tim Kientzle <kientzle@acm.org> Cc: freebsd-hackers@FreeBSD.ORG Subject: Re: Reading rc.conf from C programs? Message-ID: <20030103022534.A11923@psconsult.nl> In-Reply-To: <3E14C866.1040306@acm.org>; from kientzle@acm.org on Thu, Jan 02, 2003 at 03:16:54PM -0800 References: <1041540674.3e14a642d30b5@webmail1.isg.siue.edu> <4967.1041540976@critter.freebsd.dk> <20030102230154.A8638@psconsult.nl> <3E14C866.1040306@acm.org>
next in thread | previous in thread | raw e-mail | index | archive | help
On Thu, Jan 02, 2003 at 03:16:54PM -0800, Tim Kientzle wrote: > Paul Schenkeveld wrote: > > > If people think that -q is a good option for printenv, I can come up > > with a patch for the standard printenv. Opinions? > > > Some form of unambiguous output from printenv > would be nice. I would suggest quoting both the > variable name and the value just to be on the safe side. > > Even better: modify 'env' to support > that format as input. Then you could > use, e.g., > printenv -q >saved_environment > to record the environment and then use > env - -r saved_environment <command> > to recreate that environment. I've rolled a patch for a recent -STABLE printenv (see below). Comments? Anyone care to commit this? Will see if I can do a patch for env over the weekend. -- Paul Schenkeveld, Consultant PSconsult ICT Services BV --- /usr/src/usr.bin/printenv/printenv.1 Wed Jun 26 10:25:30 2002 +++ src/printenv/printenv.1 Fri Jan 3 02:14:11 2003 @@ -42,6 +42,9 @@ .Nd print out the environment, set and print environment .Sh SYNOPSIS .Nm +.Op Fl e +.Op Fl q +.Op Fl Q .Op Ar name .Nm env .Op Fl @@ -81,6 +84,17 @@ .Pp The options are as follows: .Bl -tag -width indent +.It Fl e +Output +.Nm export +commands for every environment variable. +.It Fl q +Double quote the value of every environment variable, +special characters ("\\`$) will be preceeded bay a backslash. +.It Fl Q +Like +.Fl q +but also quote the name of the variable. .It Fl i Execute the .Ar utility --- /usr/src/usr.bin/printenv/printenv.c Sat Mar 29 05:31:36 1997 +++ src/printenv/printenv.c Fri Jan 3 02:18:32 2003 @@ -49,6 +49,8 @@ #include <unistd.h> void usage __P((void)); +void print_var __P((char *, int)); +void print_quoted __P((char *)); /* * printenv @@ -62,12 +64,25 @@ char *argv[]; { extern char **environ; - register char *cp, **ep; + register char *cp, **ep, *eq; register size_t len; int ch; + int flags = 0; +#define eFLAG 1 +#define qFLAG 2 +#define QFLAG 4 - while ((ch = getopt(argc, argv, "")) != -1) + while ((ch = getopt(argc, argv, "eqQ")) != -1) switch(ch) { + case 'e': + flags |= eFLAG; + break; + case 'q': + flags |= qFLAG; + break; + case 'Q': + flags |= qFLAG | QFLAG; + break; case '?': default: usage(); @@ -76,8 +91,18 @@ argv += optind; if (argc == 0) { - for (ep = environ; *ep; ep++) - (void)printf("%s\n", *ep); + for (ep = environ; *ep; ep++) { + if (flags & eFLAG) { + for (eq = *ep; *eq && *eq != '='; ) + eq++; + printf("export %s%.*s%s; ", + flags & QFLAG ? "\"" : "", + eq - *ep, + *ep, + flags & QFLAG ? "\"" : ""); + } + print_var(*ep, flags); + } exit(0); } len = strlen(*argv); @@ -85,7 +110,12 @@ if (!memcmp(*ep, *argv, len)) { cp = *ep + len; if (!*cp || *cp == '=') { - (void)printf("%s\n", *cp ? cp + 1 : cp); + if (flags & qFLAG) { + print_quoted(*ep); + putchar('\n'); + } + else + (void)printf("%s\n", *cp ? cp + 1 : cp); exit(0); } } @@ -93,8 +123,50 @@ } void +print_var(var, flags) + char *var; + int flags; +{ + register char *eq; + for (eq = var; eq && *eq && *eq != '='; ) + eq++; + if (*eq == '=') { + *eq++ = '\0'; + if (flags & QFLAG) + print_quoted(var); + else + printf("%s", var); + putchar('='); + if (flags & qFLAG) + print_quoted(eq); + else + printf("%s", eq); + putchar('\n'); + } +} + +void +print_quoted(str) + char *str; +{ + putchar('"'); + for ( ; *str; str++) + switch (*str) { + case '\\': + case '"': + case '`': + case '$': + putchar('\\'); + /* FALL THRU */ + default: + putchar(*str); + } + putchar('"'); +} + +void usage() { - (void)fprintf(stderr, "usage: printenv [name]\n"); + (void)fprintf(stderr, "usage: printenv [-eqQ] [name]\n"); exit(1); } To Unsubscribe: send mail to majordomo@FreeBSD.org with "unsubscribe freebsd-hackers" in the body of the message
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20030103022534.A11923>