Date: Thu, 5 Jul 2018 13:26:26 -0500 From: Kyle Evans <kevans@freebsd.org> To: "O. Hartmann" <ohartmann@walstatt.org> Cc: src-committers <src-committers@freebsd.org>, svn-src-all@freebsd.org, svn-src-head@freebsd.org Subject: Re: svn commit: r336011 - head/usr.sbin/config Message-ID: <CACNAnaGrqVP_w5KO2QmzoBFR_MtBFFPxWiNb-zbM6%2B4NSeHx-g@mail.gmail.com> In-Reply-To: <20180705195810.12487074@thor.intern.walstatt.dynvpn.de> References: <201807051753.w65HrpQm085589@repo.freebsd.org> <20180705195810.12487074@thor.intern.walstatt.dynvpn.de>
next in thread | previous in thread | raw e-mail | index | archive | help
On Thu, Jul 5, 2018 at 12:57 PM, O. Hartmann <ohartmann@walstatt.org> wrote: > -----BEGIN PGP SIGNED MESSAGE----- > Hash: SHA512 > > Am Thu, 5 Jul 2018 17:53:51 +0000 (UTC) > Kyle Evans <kevans@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-unsubscribe@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. > > Hmm... indeed, r335343 removed the nvlist argument. Taking a look- I guess config(8) needs libnv to be built with bootstrap-tools and link against that- I'll poke at it for a bit and revert in short order if I can't figure it out.
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?CACNAnaGrqVP_w5KO2QmzoBFR_MtBFFPxWiNb-zbM6%2B4NSeHx-g>