svn commit: r336011 - head/usr.sbin/config
Kyle Evans
kevans at freebsd.org
Thu Jul 5 18:26:50 UTC 2018
On Thu, Jul 5, 2018 at 12:57 PM, O. Hartmann <ohartmann at walstatt.org> wrote:
> -----BEGIN PGP SIGNED MESSAGE-----
> Hash: SHA512
>
> Am Thu, 5 Jul 2018 17:53:51 +0000 (UTC)
> Kyle Evans <kevans at 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 at freebsd.org mailing list
>> https://lists.freebsd.org/mailman/listinfo/svn-src-head
>> To unsubscribe, send any mail to "svn-src-head-unsubscribe at 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.
More information about the svn-src-all
mailing list