summaryrefslogtreecommitdiff
path: root/usr.sbin/config
diff options
context:
space:
mode:
authorKyle Evans <kevans@FreeBSD.org>2018-07-05 17:53:51 +0000
committerKyle Evans <kevans@FreeBSD.org>2018-07-05 17:53:51 +0000
commit51c854f02808834e56c3bb7d5092980a66114165 (patch)
treea2cdb984730b9739ee6b51d5d0d23f657560db8a /usr.sbin/config
parent945a6b310b3577a71943e902e8ffb8a785355b44 (diff)
downloadsrc-test2-51c854f02808834e56c3bb7d5092980a66114165.tar.gz
src-test2-51c854f02808834e56c3bb7d5092980a66114165.zip
Notes
Diffstat (limited to 'usr.sbin/config')
-rw-r--r--usr.sbin/config/Makefile2
-rw-r--r--usr.sbin/config/mkmakefile.c169
2 files changed, 97 insertions, 74 deletions
diff --git a/usr.sbin/config/Makefile b/usr.sbin/config/Makefile
index 845a3263dfc5..800192e50f26 100644
--- a/usr.sbin/config/Makefile
+++ b/usr.sbin/config/Makefile
@@ -18,7 +18,7 @@ CFLAGS+= -I. -I${SRCDIR}
NO_WMISSING_VARIABLE_DECLARATIONS=
-LIBADD= l sbuf
+LIBADD= l nv sbuf
CLEANFILES+= kernconf.c
diff --git a/usr.sbin/config/mkmakefile.c b/usr.sbin/config/mkmakefile.c
index bc9104b691b7..12b83e44ffd9 100644
--- a/usr.sbin/config/mkmakefile.c
+++ b/usr.sbin/config/mkmakefile.c
@@ -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,6 +243,87 @@ 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
*/
@@ -302,7 +331,8 @@ 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"));