svn commit: r336011 - head/usr.sbin/config
O. Hartmann
ohartmann at walstatt.org
Thu Jul 5 17:58:27 UTC 2018
-----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.
- --
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-----
More information about the svn-src-all
mailing list