-----BEGIN PGP SIGNED MESSAGE----- Hash: SHA512 Am Thu, 5 Jul 2018 17:53:51 +0000 (UTC) Kyle Evans <kev...@freebsd.org> schrieb:
> Author: kevans > Date: Thu Jul 5 17:53:51 2018 > New Revision: 336011 > URL: https://svnweb.freebsd.org/changeset/base/336011 > > Log: > config(8): De-dupe hint/env vars within a single file > > r335653 flipped the order in which hints/env files are concatenated to match > the order in which vars are processed by the kernel. This is the other > hammer to drop. > > Use nv(9) to de-dupe entries within a single `hint` or `env` file, using the > latest value specified for a key. This leaves some duplicates if a variable > is specified in multiple hint/env files or via `envvar` in a kernel config, > but the reversed order of concatenation (from r335653) makes this a > non-issue as the latest-specified version will be seen first. > > This change also silently rewrote hint bits to use the same sanitization > process that ian@ wrote for r335642. To the kernel, hints and env vars are > basically the same thing through early boot, then get merged into the > dynamic environment once kmem becomes available and the dynamic environment > is created. They should be subjected to the same restrictions. > > MFC after: 1 month > > Modified: > head/usr.sbin/config/Makefile > head/usr.sbin/config/mkmakefile.c > > Modified: head/usr.sbin/config/Makefile > ============================================================================== > --- head/usr.sbin/config/Makefile Thu Jul 5 17:28:06 2018 > (r336010) > +++ head/usr.sbin/config/Makefile Thu Jul 5 17:53:51 2018 > (r336011) > @@ -18,7 +18,7 @@ CFLAGS+= -I. -I${SRCDIR} > > NO_WMISSING_VARIABLE_DECLARATIONS= > > -LIBADD= l sbuf > +LIBADD= l nv sbuf > > CLEANFILES+= kernconf.c > > > Modified: head/usr.sbin/config/mkmakefile.c > ============================================================================== > --- head/usr.sbin/config/mkmakefile.c Thu Jul 5 17:28:06 2018 > (r336010) > +++ head/usr.sbin/config/mkmakefile.c Thu Jul 5 17:53:51 2018 > (r336011) > @@ -49,6 +49,8 @@ static const char rcsid[] = > #include <stdbool.h> > #include <stdio.h> > #include <string.h> > +#include <sys/cnv.h> > +#include <sys/nv.h> > #include <sys/param.h> > #include "y.tab.h" > #include "config.h" > @@ -62,6 +64,10 @@ static void do_objs(FILE *); > static void do_before_depend(FILE *); > static int opteq(const char *, const char *); > static void read_files(void); > +static void sanitize_envline(char *result, const char *src); > +static void process_into_file(char *line, FILE *ofp); > +static void process_into_nvlist(char *line, nvlist_t *nvl); > +static void dump_nvlist(nvlist_t *nvl, FILE *ofp); > > static void errout(const char *fmt, ...) > { > @@ -180,64 +186,6 @@ makefile(void) > moveifchanged(path("Makefile.new"), path("Makefile")); > } > > -/* > - * Build hints.c from the skeleton > - */ > -void > -makehints(void) > -{ > - FILE *ifp, *ofp; > - char line[BUFSIZ]; > - char *s; > - struct hint *hint; > - > - ofp = fopen(path("hints.c.new"), "w"); > - if (ofp == NULL) > - err(1, "%s", path("hints.c.new")); > - fprintf(ofp, "#include <sys/types.h>\n"); > - fprintf(ofp, "#include <sys/systm.h>\n"); > - fprintf(ofp, "\n"); > - fprintf(ofp, "char static_hints[] = {\n"); > - STAILQ_FOREACH(hint, &hints, hint_next) { > - ifp = fopen(hint->hint_name, "r"); > - if (ifp == NULL) > - err(1, "%s", hint->hint_name); > - while (fgets(line, BUFSIZ, ifp) != NULL) { > - /* zap trailing CR and/or LF */ > - while ((s = strrchr(line, '\n')) != NULL) > - *s = '\0'; > - while ((s = strrchr(line, '\r')) != NULL) > - *s = '\0'; > - /* remove # comments */ > - s = strchr(line, '#'); > - if (s) > - *s = '\0'; > - /* remove any whitespace and " characters */ > - s = line; > - while (*s) { > - if (*s == ' ' || *s == '\t' || *s == '"') { > - while (*s) { > - s[0] = s[1]; > - s++; > - } > - /* start over */ > - s = line; > - continue; > - } > - s++; > - } > - /* anything left? */ > - if (*line == '\0') > - continue; > - fprintf(ofp, "\"%s\\0\"\n", line); > - } > - fclose(ifp); > - } > - fprintf(ofp, "\"\\0\"\n};\n"); > - fclose(ofp); > - moveifchanged(path("hints.c.new"), path("hints.c")); > -} > - > static void > sanitize_envline(char *result, const char *src) > { > @@ -295,14 +243,96 @@ sanitize_envline(char *result, const char *src) > *dst = 0; > } > > +static void > +process_into_file(char *line, FILE *ofp) > +{ > + char result[BUFSIZ]; > + > + sanitize_envline(result, line); > + /* anything left? */ > + if (*result == '\0') > + return; > + fprintf(ofp, "\"%s\\0\"\n", result); > +} > + > +static void > +process_into_nvlist(char *line, nvlist_t *nvl) > +{ > + char result[BUFSIZ], *s; > + > + sanitize_envline(result, line); > + /* anything left? */ > + if (*result == '\0') > + return; > + s = strchr(result, '='); > + *s = 0; > + if (nvlist_exists(nvl, result)) > + nvlist_free(nvl, result); > + nvlist_add_string(nvl, result, s + 1); > +} > + > +static void > +dump_nvlist(nvlist_t *nvl, FILE *ofp) > +{ > + const char *name; > + void *cookie; > + > + if (nvl == NULL) > + return; > + > + while (!nvlist_empty(nvl)) { > + cookie = NULL; > + name = nvlist_next(nvl, NULL, &cookie); > + fprintf(ofp, "\"%s=%s\\0\"\n", name, > + cnvlist_get_string(cookie)); > + > + cnvlist_free_string(nvl, cookie); > + } > +} > + > /* > + * Build hints.c from the skeleton > + */ > +void > +makehints(void) > +{ > + FILE *ifp, *ofp; > + nvlist_t *nvl; > + char line[BUFSIZ]; > + struct hint *hint; > + > + ofp = fopen(path("hints.c.new"), "w"); > + if (ofp == NULL) > + err(1, "%s", path("hints.c.new")); > + fprintf(ofp, "#include <sys/types.h>\n"); > + fprintf(ofp, "#include <sys/systm.h>\n"); > + fprintf(ofp, "\n"); > + fprintf(ofp, "char static_hints[] = {\n"); > + nvl = nvlist_create(0); > + STAILQ_FOREACH(hint, &hints, hint_next) { > + ifp = fopen(hint->hint_name, "r"); > + if (ifp == NULL) > + err(1, "%s", hint->hint_name); > + while (fgets(line, BUFSIZ, ifp) != NULL) > + process_into_nvlist(line, nvl); > + dump_nvlist(nvl, ofp); > + fclose(ifp); > + } > + nvlist_destroy(nvl); > + fprintf(ofp, "\"\\0\"\n};\n"); > + fclose(ofp); > + moveifchanged(path("hints.c.new"), path("hints.c")); > +} > + > +/* > * Build env.c from the skeleton > */ > void > makeenv(void) > { > FILE *ifp, *ofp; > - char line[BUFSIZ], result[BUFSIZ], *linep; > + nvlist_t *nvl; > + char line[BUFSIZ]; > struct envvar *envvar; > > ofp = fopen(path("env.c.new"), "w"); > @@ -312,27 +342,20 @@ makeenv(void) > fprintf(ofp, "#include <sys/systm.h>\n"); > fprintf(ofp, "\n"); > fprintf(ofp, "char static_env[] = {\n"); > + nvl = nvlist_create(0); > STAILQ_FOREACH(envvar, &envvars, envvar_next) { > if (envvar->env_is_file) { > ifp = fopen(envvar->env_str, "r"); > if (ifp == NULL) > err(1, "%s", envvar->env_str); > - while (fgets(line, BUFSIZ, ifp) != NULL) { > - sanitize_envline(result, line); > - /* anything left? */ > - if (*result == '\0') > - continue; > - fprintf(ofp, "\"%s\\0\"\n", result); > - } > + while (fgets(line, BUFSIZ, ifp) != NULL) > + process_into_nvlist(line, nvl); > + dump_nvlist(nvl, ofp); > fclose(ifp); > - } else { > - linep = envvar->env_str; > - sanitize_envline(result, linep); > - if (*result == '\0') > - continue; > - fprintf(ofp, "\"%s\\0\"\n", result); > - } > + } else > + process_into_file(envvar->env_str, ofp); > } > + nvlist_destroy(nvl); > fprintf(ofp, "\"\\0\"\n};\n"); > fclose(ofp); > moveifchanged(path("env.c.new"), path("env.c")); > _______________________________________________ > svn-src-head@freebsd.org mailing list > https://lists.freebsd.org/mailman/listinfo/svn-src-head > To unsubscribe, send any mail to "svn-src-head-unsubscr...@freebsd.org" This commit might be responsible for a broken buildworld: [...] - --- _bootstrap-tools-usr.sbin/config --- - --- mkmakefile.o --- /usr/src/usr.sbin/config/mkmakefile.c:289:28: error: too many arguments to function call, expected single argument 'cookie', have 2 arguments cnvlist_free_string(nvl, cookie); ~~~~~~~~~~~~~~~~~~~ ^~~~~~ /usr/include/sys/cnv.h:106:1: note: 'cnvlist_free_string' declared here void cnvlist_free_string(void *cookie); ^ - --- _bootstrap-tools-kerberos5/tools/asn1_compile --- ===> kerberos5/tools/asn1_compile (obj,all,install) - --- _bootstrap-tools-usr.sbin/config --- 1 error generated. - -- O. Hartmann Ich widerspreche der Nutzung oder Übermittlung meiner Daten für Werbezwecke oder für die Markt- oder Meinungsforschung (§ 28 Abs. 4 BDSG). -----BEGIN PGP SIGNATURE----- iLUEARMKAB0WIQQZVZMzAtwC2T/86TrS528fyFhYlAUCWz5cMgAKCRDS528fyFhY lLsjAf9P4FROEe3BIDCINakLgjIQUxVGHyHPYNehnRVCo5fIW9flEflKKZAJ3Q8N p4UXkiaieiPjblflr+9h6NtvBo+pAf4oZdE9iRvoYx/bUqxsG/dIwfCGd7bKgYCG uOPyIRX14ckVT8QH99qGtAwEu62T1jTl4his3b5Pg7wbuzj7N3bH =8pkh -----END PGP SIGNATURE----- _______________________________________________ svn-src-head@freebsd.org mailing list https://lists.freebsd.org/mailman/listinfo/svn-src-head To unsubscribe, send any mail to "svn-src-head-unsubscr...@freebsd.org"