svn commit: r207492 - stable/8/usr.sbin/config
Warner Losh
imp at FreeBSD.org
Sun May 2 06:18:08 UTC 2010
Author: imp
Date: Sun May 2 06:18:08 2010
New Revision: 207492
URL: http://svn.freebsd.org/changeset/base/207492
Log:
MFC r207263:
Redo how we add compat options so as to be compatible with old
versions of config. Remove support for the syntax OLD = NEW form the
options file, and instead have a new file $S/conf/options-compat.
This file will be parsed as OLD NEW on each line. Bump version of
config. Since nothing in -current ever used this, there's no hazards
for current users, so I'm not bumping the version in the
Makefiles.$MACHINE. No need, really, for this version bump in
-current, but this was introduced into -stable before I realized the
version check was ineffective there, so the verison bump doesn't hurt
here and keeps the two branches in sync, versionwise, after the MFC.
Modified:
stable/8/usr.sbin/config/configvers.h
stable/8/usr.sbin/config/mkoptions.c
Directory Properties:
stable/8/usr.sbin/config/ (props changed)
Modified: stable/8/usr.sbin/config/configvers.h
==============================================================================
--- stable/8/usr.sbin/config/configvers.h Sun May 2 06:14:36 2010 (r207491)
+++ stable/8/usr.sbin/config/configvers.h Sun May 2 06:18:08 2010 (r207492)
@@ -49,5 +49,5 @@
*
* $FreeBSD$
*/
-#define CONFIGVERS 600008
+#define CONFIGVERS 600009
#define MAJOR_VERS(x) ((x) / 100000)
Modified: stable/8/usr.sbin/config/mkoptions.c
==============================================================================
--- stable/8/usr.sbin/config/mkoptions.c Sun May 2 06:14:36 2010 (r207491)
+++ stable/8/usr.sbin/config/mkoptions.c Sun May 2 06:18:08 2010 (r207492)
@@ -166,7 +166,7 @@ do_option(char *name)
fprintf(outf, "#define %s %s\n", name, value);
} /* else empty file */
- (void) fclose(outf);
+ (void)fclose(outf);
return;
}
basefile = "";
@@ -225,7 +225,7 @@ do_option(char *name)
if (cp == (char *)EOF)
break;
}
- (void) fclose(inf);
+ (void)fclose(inf);
if (!tidy && ((value == NULL && oldvalue == NULL) ||
(value && oldvalue && eq(value, oldvalue)))) {
while (!SLIST_EMPTY(&op_head)) {
@@ -263,7 +263,7 @@ do_option(char *name)
free(op->op_value);
free(op);
}
- (void) fclose(outf);
+ (void)fclose(outf);
}
/*
@@ -277,7 +277,7 @@ tooption(char *name)
struct opt_list *po;
/* "cannot happen"? the otab list should be complete.. */
- (void) strlcpy(nbuf, "options.h", sizeof(nbuf));
+ (void)strlcpy(nbuf, "options.h", sizeof(nbuf));
SLIST_FOREACH(po, &otab, o_next) {
if (eq(po->o_name, name)) {
@@ -286,78 +286,30 @@ tooption(char *name)
}
}
- (void) strlcpy(hbuf, path(nbuf), sizeof(hbuf));
+ (void)strlcpy(hbuf, path(nbuf), sizeof(hbuf));
return (hbuf);
}
-/*
- * read the options and options.<machine> files
- */
+
static void
-read_options(void)
+insert_option(char *this, char *val, int flags)
{
- FILE *fp;
- char fname[MAXPATHLEN];
- char *wd, *this, *val;
struct opt_list *po;
- int first = 1;
- char genopt[MAXPATHLEN];
- int flags = 0;
- SLIST_INIT(&otab);
- (void) snprintf(fname, sizeof(fname), "../../conf/options");
-openit:
- fp = fopen(fname, "r");
- if (fp == 0) {
- return;
- }
-next:
- flags = 0;
- wd = get_word(fp);
- if (wd == (char *)EOF) {
- (void) fclose(fp);
- if (first == 1) {
- first++;
- (void) snprintf(fname, sizeof fname, "../../conf/options.%s", machinename);
- fp = fopen(fname, "r");
- if (fp != 0)
- goto next;
- (void) snprintf(fname, sizeof fname, "options.%s", machinename);
- goto openit;
- }
- return;
- }
- if (wd == 0)
- goto next;
- if (wd[0] == '#')
- {
- while (((wd = get_word(fp)) != (char *)EOF) && wd)
- ;
- goto next;
- }
- this = ns(wd);
- val = get_word(fp);
- if (val == (char *)EOF)
- return;
- if (val == 0) {
- char *s = ns(this);
- (void) snprintf(genopt, sizeof(genopt), "opt_%s.h", lower(s));
- val = genopt;
- free(s);
- } else if (eq(val, "=")) {
- val = get_word(fp);
- if (val == (char *)EOF) {
- printf("%s: unexpected end of file\n", fname);
- exit(1);
- }
- if (val == 0) {
- printf("%s: Expected a right hand side at %s\n", fname,
- this);
- exit(1);
- }
- flags |= OL_ALIAS;
- }
- val = ns(val);
+ po = (struct opt_list *) calloc(1, sizeof *po);
+ if (po == NULL)
+ err(EXIT_FAILURE, "calloc");
+ po->o_name = this;
+ po->o_file = val;
+ po->o_flags = flags;
+ SLIST_INSERT_HEAD(&otab, po, o_next);
+}
+
+
+static void
+check_duplicate(const char *fname, const char *this)
+{
+ struct opt_list *po;
SLIST_FOREACH(po, &otab, o_next) {
if (eq(po->o_name, this)) {
@@ -366,16 +318,67 @@ next:
exit(1);
}
}
-
- po = (struct opt_list *) calloc(1, sizeof *po);
- if (po == NULL)
- err(EXIT_FAILURE, "calloc");
- po->o_name = this;
- po->o_file = val;
- po->o_flags = flags;
- SLIST_INSERT_HEAD(&otab, po, o_next);
+}
+
+static int
+read_option_file(const char *fname, int flags)
+{
+ FILE *fp;
+ char *wd, *this, *val;
+ char genopt[MAXPATHLEN];
- goto next;
+ fp = fopen(fname, "r");
+ if (fp == 0)
+ return (0);
+ while ((wd = get_word(fp)) != (char *)EOF) {
+ if (wd == 0)
+ continue;
+ if (wd[0] == '#') {
+ while (((wd = get_word(fp)) != (char *)EOF) && wd)
+ continue;
+ continue;
+ }
+ this = ns(wd);
+ val = get_word(fp);
+ if (val == (char *)EOF)
+ return (1);
+ if (val == 0) {
+ if (flags) {
+ printf("%s: compat file requires two words "
+ "per line at %s\n", fname, this);
+ exit(1);
+ }
+ char *s = ns(this);
+ (void)snprintf(genopt, sizeof(genopt), "opt_%s.h",
+ lower(s));
+ val = genopt;
+ free(s);
+ }
+ val = ns(val);
+ check_duplicate(fname, this);
+ insert_option(this, val, flags);
+ }
+ (void)fclose(fp);
+ return (1);
+}
+
+/*
+ * read the options and options.<machine> files
+ */
+static void
+read_options(void)
+{
+ char fname[MAXPATHLEN];
+
+ SLIST_INIT(&otab);
+ read_option_file("../../conf/options", 0);
+ (void)snprintf(fname, sizeof fname, "../../conf/options.%s",
+ machinename);
+ if (!read_option_file(fname, 0)) {
+ (void)snprintf(fname, sizeof fname, "options.%s", machinename);
+ read_option_file(fname, 0);
+ }
+ read_option_file("../../conf/options-compat", OL_ALIAS);
}
static char *
More information about the svn-src-all
mailing list