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