Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 27 Apr 2010 06:14:30 +0000 (UTC)
From:      Warner Losh <imp@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r207265 - head/usr.sbin/config
Message-ID:  <201004270614.o3R6EU2A022396@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: imp
Date: Tue Apr 27 06:14:30 2010
New Revision: 207265
URL: http://svn.freebsd.org/changeset/base/207265

Log:
  Require the option that's mapped be listed in the options file.  This
  will allow people with old config options to either have it just work
  (if config is new enough), or get a version error (if their config is
  about 7.0 or newer) rather than getting a cryptic error about
  duplicated options in the options file, or getting an error about an
  unknown option, at which point they'd update their config file only to
  learn they need a new config, only to learn they didn't really need to
  update their config file...  All this because our version checking was
  in the wrong place for the past decade...
  
  # hopefully this is the last change, and we'll be able to config with an
  # 8.0 GENERIC file on stable/8 after I merge this change and add the
  # compat options.
  
  MFC after:	3 days

Modified:
  head/usr.sbin/config/mkoptions.c

Modified: head/usr.sbin/config/mkoptions.c
==============================================================================
--- head/usr.sbin/config/mkoptions.c	Tue Apr 27 05:39:13 2010	(r207264)
+++ head/usr.sbin/config/mkoptions.c	Tue Apr 27 06:14:30 2010	(r207265)
@@ -292,32 +292,49 @@ tooption(char *name)
 
 	
 static void
-insert_option(char *this, char *val, int flags)
+check_duplicate(const char *fname, const char *this)
 {
 	struct opt_list *po;
 
+	SLIST_FOREACH(po, &otab, o_next) {
+		if (eq(po->o_name, this)) {
+			printf("%s: Duplicate option %s.\n",
+			       fname, this);
+			exit(1);
+		}
+	}
+}
+
+static void
+insert_option(const char *fname, char *this, char *val)
+{
+	struct opt_list *po;
+
+	check_duplicate(fname, this);
 	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;
+	po->o_flags = 0;
 	SLIST_INSERT_HEAD(&otab, po, o_next);
 }
 
-
 static void
-check_duplicate(const char *fname, const char *this)
+update_option(const char *this, char *val, int flags)
 {
 	struct opt_list *po;
 
 	SLIST_FOREACH(po, &otab, o_next) {
 		if (eq(po->o_name, this)) {
-			printf("%s: Duplicate option %s.\n",
-			       fname, this);
-			exit(1);
+			free(po->o_file);
+			po->o_file = val;
+			po->o_flags = flags;
+			return;
 		}
 	}
+	printf("Compat option %s not listed in options file.\n", this);
+	exit(1);
 }
 
 static int
@@ -355,8 +372,10 @@ read_option_file(const char *fname, int 
 			free(s);
 		}
 		val = ns(val);
-		check_duplicate(fname, this);
-		insert_option(this, val, flags);
+		if (flags == 0)
+			insert_option(fname, this, val);
+		else
+			update_option(this, val, flags);
 	}
 	(void)fclose(fp);
 	return (1);



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201004270614.o3R6EU2A022396>