Skip site navigation (1)Skip section navigation (2)
Date:      Wed, 18 Jul 2001 02:01:16 -0700
From:      Dima Dorfman <dima@unixfreak.org>
To:        Sheldon Hearn <sheldonh@starjuice.net>
Cc:        audit@freebsd.org, peter@freebsd.org
Subject:   Re: queue(3) patch for config(8) 
Message-ID:  <20010718090116.8CCCB3E2F@bazooka.unixfreak.org>
In-Reply-To: <6891.995279747@axl.seasidesoftware.co.za>; from sheldonh@starjuice.net on "Mon, 16 Jul 2001 12:35:47 %2B0200"

next in thread | previous in thread | raw e-mail | index | archive | help
Sheldon Hearn <sheldonh@starjuice.net> writes:
> This one should almost certainly go past Peter Wemm.

Okay.  Peter (cc'd), the discussion is about a patch (attached below)
to config(8) which converts all of its lists to the queue(3) API.
This will make future modifications (esp. those which start removing
arbitrary nodes from these lists) less error-prone.  Please review.

Thanks,

					Dima Dorfman
					dima@unixfreak.org


Index: config.h
===================================================================
RCS file: /stl/src/FreeBSD/src/usr.sbin/config/config.h,v
retrieving revision 1.49
diff -u -r1.49 config.h
--- config.h	2001/07/12 02:08:51	1.49
+++ config.h	2001/07/15 11:35:25
@@ -38,11 +38,12 @@
  * Config.
  */
 #include <sys/types.h>
+#include <sys/queue.h>
 #include <stdlib.h>
 #include <string.h>
 
 struct file_list {
-	struct	file_list *f_next;
+	TAILQ_ENTRY(file_list) f_list;
 	char	*f_fn;			/* the name */
 	int     f_type;                 /* type or count */
 	u_char	f_flags;		/* see below */
@@ -52,6 +53,8 @@
 	char	*f_needs;
 	char	*f_warn;		/* warning message */
 };
+TAILQ_HEAD(file_list_headt, file_list);
+extern struct file_list_headt ftab_head;
 
 /*
  * Types.
@@ -74,12 +77,14 @@
 #define ISDUP		16
 
 struct device {
+	TAILQ_ENTRY(device) d_list;
 	int	d_done;			/* processed */
 	char	*d_name;		/* name of device (e.g. rk11) */
 	int	d_count;		/* device count */
 #define	UNKNOWN -2	/* -2 means not set yet */
-	struct	device *d_next;		/* Next one in list */
 };
+TAILQ_HEAD(device_headt, device);
+extern struct device_headt dtab_head;
 
 struct config {
 	char	*s_sysname;
@@ -99,9 +104,11 @@
  * These and the options (below) are put in the C flags in the makefile.
  */
 struct cputype {
+	LIST_ENTRY(cputype) cpu_list;
 	char	*cpu_name;
-	struct	cputype *cpu_next;
-} *cputype;
+};
+LIST_HEAD(cputype_headt, cputype);
+extern struct cputype_headt cputype_head;
 
 /*
  * A set of options may also be specified which are like CPU types,
@@ -109,17 +116,20 @@
  * A separate set of options may be defined for make-style options.
  */
 struct opt {
+	LIST_ENTRY(opt) op_list;
 	char	*op_name;
 	char	*op_value;
 	int	op_ownfile;	/* true = own file, false = makefile */
-	struct	opt *op_next;
-} *opt, *mkopt;
+};
+LIST_HEAD(opt_headt, opt);
+extern struct opt_headt opt_head, mkopt_head;
 
 struct opt_list {
+	LIST_ENTRY(opt_list) o_list;
 	char *o_name;
 	char *o_file;
-	struct opt_list *o_next;
 } *otab;
+LIST_HEAD(opt_list_headt, opt_list);
 
 extern char	*ident;
 extern char	*hints;
@@ -138,13 +148,9 @@
 void	makefile(void);
 void	headers(void);
 
-extern struct	device *dtab;
-
 extern char	errbuf[80];
 extern int	yyline;
 extern const	char *yyfile;
-
-extern struct	file_list *ftab;
 
 extern int	profiling;
 extern int	debugging;
Index: config.y
===================================================================
RCS file: /stl/src/FreeBSD/src/usr.sbin/config/config.y,v
retrieving revision 1.55
diff -u -r1.55 config.y
--- config.y	2001/07/12 02:08:51	1.55
+++ config.y	2001/07/15 11:35:25
@@ -71,15 +71,13 @@
 
 #include "config.h"
 
-static struct	device *curp = 0;
-
-struct  device *dtab;
+struct	device_headt dtab_head;
 char	*ident;
 char	*hints;
 int	hintmode;
 int	yyline;
 const	char *yyfile;
-struct  file_list *ftab;
+struct	file_list_headt ftab_head;
 char	errbuf[80];
 int	maxusers;
 
@@ -130,8 +128,7 @@
 		    (struct cputype *)malloc(sizeof (struct cputype));
 		memset(cp, 0, sizeof(*cp));
 		cp->cpu_name = $2;
-		cp->cpu_next = cputype;
-		cputype = cp;
+		LIST_INSERT_HEAD(&cputype_head, cp, cpu_list);
 	      } |
 	OPTIONS Opt_list
 		|
@@ -163,7 +160,7 @@
 
 System_id:
 	Save_id
-	      = { newopt(&mkopt, ns("KERNEL"), $1); };
+	      = { newopt(&mkopt_head, ns("KERNEL"), $1); };
 
 System_parameter_list:
 	  System_parameter_list ID
@@ -181,14 +178,14 @@
 	      = {
 		char *s;
 
-		newopt(&opt, $1, NULL);
+		newopt(&opt_head, $1, NULL);
 		if ((s = strchr($1, '=')))
 			errx(1, "%s:%d: The `=' in options should not be "
 			    "quoted", yyfile, yyline);
 	      } |
 	Save_id EQUALS Opt_value
 	      = {
-		newopt(&opt, $1, $3);
+		newopt(&opt_head, $1, $3);
 	      } ;
 
 Opt_value:
@@ -215,7 +212,7 @@
 
 Mkoption:
 	Save_id EQUALS Opt_value
-	      = { newopt(&mkopt, $1, $3); } ;
+	      = { newopt(&mkopt_head, $1, $3); } ;
 
 Dev:
 	ID
@@ -225,13 +222,13 @@
 Device_spec:
 	DEVICE Dev
 	      = {
-		newopt(&opt, devopt($2), ns("1"));
+		newopt(&opt_head, devopt($2), ns("1"));
 		/* and the device part */
 		newdev($2, UNKNOWN);
 		} |
 	DEVICE Dev NUMBER
 	      = {
-		newopt(&opt, devopt($2), ns("1"));
+		newopt(&opt_head, devopt($2), ns("1"));
 		/* and the device part */
 		newdev($2, $3);
 		if ($3 == 0)
@@ -260,16 +257,11 @@
 	memset(np, 0, sizeof(*np));
 	np->d_name = name;
 	np->d_count = count;
-	np->d_next = 0;
-	if (curp == 0)
-		dtab = np;
-	else
-		curp->d_next = np;
-	curp = np;
+	TAILQ_INSERT_TAIL(&dtab_head, np, d_list);
 }
 
 static void
-newopt(struct opt **list, char *name, char *value)
+newopt(struct opt_headt *headp, char *name, char *value)
 {
 	struct opt *op;
 
@@ -278,6 +270,5 @@
 	op->op_name = name;
 	op->op_ownfile = 0;
 	op->op_value = value;
-	op->op_next = *list;
-	*list = op;
+	LIST_INSERT_HEAD(headp, op, op_list);
 }
Index: main.c
===================================================================
RCS file: /stl/src/FreeBSD/src/usr.sbin/config/main.c,v
retrieving revision 1.53
diff -u -r1.53 main.c
--- main.c	2001/07/12 02:08:51	1.53
+++ main.c	2001/07/15 11:35:25
@@ -143,7 +143,7 @@
 	else if ((buf.st_mode & S_IFMT) != S_IFDIR)
 		errx(2, "%s isn't a directory", p);
 
-	dtab = NULL;
+	TAILQ_INIT(&dtab_head);
 	yyfile = *argv;
 	if (yyparse())
 		exit(3);
@@ -421,7 +421,7 @@
 
 	remember("y.tab.h");
 	remember("setdefs.h");
-	for (fl = ftab; fl != NULL; fl = fl->f_next)
+	TAILQ_FOREACH(fl, &ftab_head, f_list)
 		remember(fl->f_fn);
 
 	/*
Index: mkheaders.c
===================================================================
RCS file: /stl/src/FreeBSD/src/usr.sbin/config/mkheaders.c,v
retrieving revision 1.22
diff -u -r1.22 mkheaders.c
--- mkheaders.c	2001/01/31 11:18:49	1.22
+++ mkheaders.c	2001/07/15 11:35:25
@@ -62,10 +62,10 @@
 	struct device *dp;
 	int match;
 
-	for (fl = ftab; fl != 0; fl = fl->f_next) {
+	TAILQ_FOREACH(fl, &ftab_head, f_list) {
 		if (fl->f_needs != 0) {
 			match = 0;
-			for (dp = dtab; dp != 0; dp = dp->d_next) {
+			TAILQ_FOREACH(dp, &dtab_head, d_list) {
 				if (eq(dp->d_name, fl->f_needs)) {
 					match++;
 					dp->d_done |= DEVDONE;
@@ -75,7 +75,7 @@
 				do_header(fl->f_needs, match);
 		}
 	}
-	for (dp = dtab; dp != 0; dp = dp->d_next) {
+	TAILQ_FOREACH(dp, &dtab_head, d_list) {
 		if (!(dp->d_done & DEVDONE))
 			errx(1, "Error: device \"%s\" is unknown",
 			       dp->d_name);
@@ -86,7 +86,8 @@
 do_header(char *dev, int match)
 {
 	char *file, *name, *inw;
-	struct file_list *fl, *fl_head, *tflp;
+	struct file_list *fl;
+	struct file_list_headt localfl_head;
 	struct device *dp;
 	FILE *inf, *outf;
 	int inc, oldcount;
@@ -97,7 +98,8 @@
 	 * and "hicount" will be the highest unit declared.  do_header()
 	 * must use this higher of these values.
 	 */
-	for (hicount = count = 0, dp = dtab; dp != 0; dp = dp->d_next) {
+	hicount = count = 0;
+	TAILQ_FOREACH(dp, &dtab_head, d_list) {
 		if (eq(dp->d_name, dev)) {
 			count =
 			    dp->d_count != UNKNOWN ? dp->d_count : 1;
@@ -119,7 +121,7 @@
 		(void) fclose(outf);
 		return;
 	}
-	fl_head = NULL;
+	TAILQ_INIT(&localfl_head);
 	for (;;) {
 		char *cp;
 		if ((inw = get_word(inf)) == 0 || inw == (char *)EOF)
@@ -142,13 +144,13 @@
 		bzero(fl, sizeof(*fl));
 		fl->f_fn = inw;		/* malloced */
 		fl->f_type = inc;
-		fl->f_next = fl_head;
-		fl_head = fl;
+		TAILQ_INSERT_HEAD(&localfl_head, fl, f_list);
 	}
 	(void) fclose(inf);
 	if (count == oldcount) {
-		for (fl = fl_head; fl != NULL; fl = tflp) {
-			tflp = fl->f_next;
+		while (!TAILQ_EMPTY(&localfl_head)) {
+			fl = TAILQ_FIRST(&localfl_head);
+			TAILQ_REMOVE(&localfl_head, fl, f_list);
 			free(fl->f_fn);
 			free(fl);
 		}
@@ -159,16 +161,16 @@
 		bzero(fl, sizeof(*fl));
 		fl->f_fn = ns(name);
 		fl->f_type = count;
-		fl->f_next = fl_head;
-		fl_head = fl;
+		TAILQ_INSERT_HEAD(&localfl_head, fl, f_list);
 	}
 	outf = fopen(file, "w");
 	if (outf == 0)
 		err(1, "%s", file);
-	for (fl = fl_head; fl != NULL; fl = tflp) {
+	while (!TAILQ_EMPTY(&localfl_head)) {
+		fl = TAILQ_FIRST(&localfl_head);
+		TAILQ_REMOVE(&localfl_head, fl, f_list);
 		fprintf(outf,
 		    "#define %s %u\n", fl->f_fn, count ? fl->f_type : 0);
-		tflp = fl->f_next;
 		free(fl->f_fn);
 		free(fl);
 	}
Index: mkmakefile.c
===================================================================
RCS file: /stl/src/FreeBSD/src/usr.sbin/config/mkmakefile.c,v
retrieving revision 1.68
diff -u -r1.68 mkmakefile.c
--- mkmakefile.c	2001/02/28 02:53:32	1.68
+++ mkmakefile.c	2001/07/15 11:35:25
@@ -69,8 +69,6 @@
 		wd = word; \
 	}
 
-static struct file_list *fcur;
-
 static char *tail(char *);
 static void do_clean(FILE *);
 static void do_rules(FILE *);
@@ -88,7 +86,7 @@
 {
 	struct file_list *fp;
 
-	for (fp = ftab ; fp != 0; fp = fp->f_next) {
+	TAILQ_FOREACH(fp, &ftab_head, f_list) {
 		if (eq(fp->f_fn, file))
 			return (fp);
 	}
@@ -105,11 +103,7 @@
 
 	fp = (struct file_list *) malloc(sizeof *fp);
 	bzero(fp, sizeof *fp);
-	if (fcur == 0)
-		fcur = ftab = fp;
-	else
-		fcur->f_next = fp;
-	fcur = fp;
+	TAILQ_INSERT_TAIL(&ftab_head, fp, f_list);
 	return (fp);
 }
 
@@ -142,12 +136,12 @@
 	if (profiling)
 		fprintf(ofp, " -DGPROF");
 
-	if (cputype == 0) {
+	if (LIST_EMPTY(&cputype_head)) {
 		printf("cpu type must be specified\n");
 		exit(1);
 	}
 	fprintf(ofp, "\n");
-	for (op = mkopt; op; op = op->op_next)
+	LIST_FOREACH(op, &mkopt_head, op_list)
 		fprintf(ofp, "%s=%s\n", op->op_name, op->op_value);
 	if (debugging)
 		fprintf(ofp, "DEBUG=-g\n");
@@ -254,7 +248,7 @@
 
 /*
  * Read in the information about files used in making the system.
- * Store it in the ftab linked list.
+ * Store it in the ftab_head list.
  */
 static void
 read_files(void)
@@ -268,7 +262,7 @@
 	int nreqs, first = 1, isdup, std, filetype,
 	    imp_rule, no_obj, needcount, before_depend, mandatory;
 
-	ftab = 0;
+	TAILQ_INIT(&ftab_head);
 	if (ident == NULL) {
 		printf("no ident line specified\n");
 		exit(1);
@@ -428,7 +422,7 @@
 		needs = ns(wd);
 	if (isdup)
 		goto invis;
-	for (dp = dtab; dp != 0; dp = dp->d_next)
+	TAILQ_FOREACH(dp, &dtab_head, d_list)
 		if (eq(dp->d_name, wd)) {
 			if (std && dp->d_count <= 0)
 				dp->d_count = 1;
@@ -444,7 +438,7 @@
 		       this, wd);
 		exit(1);
 	}
-	for (op = opt; op != 0; op = op->op_next)
+	LIST_FOREACH(op, &opt_head, op_list)
 		if (op->op_value == 0 && opteq(op->op_name, wd)) {
 			if (nreqs == 1) {
 				free(needs);
@@ -531,7 +525,7 @@
 
 	fputs("BEFORE_DEPEND=", fp);
 	lpos = 15;
-	for (tp = ftab; tp; tp = tp->f_next)
+	TAILQ_FOREACH(tp, &ftab_head, f_list)
 		if (tp->f_flags & BEFORE_DEPEND) {
 			len = strlen(tp->f_fn);
 			if ((len = 3 + len) + lpos > 72) {
@@ -557,7 +551,7 @@
 
 	fprintf(fp, "OBJS=");
 	lpos = 6;
-	for (tp = ftab; tp != 0; tp = tp->f_next) {
+	TAILQ_FOREACH(tp, &ftab_head, f_list) {
 		if (tp->f_type == INVISIBLE || tp->f_flags & NO_OBJ)
 			continue;
 		sp = tail(tp->f_fn);
@@ -593,7 +587,7 @@
 
 	fprintf(fp, "%sFILES=", SUFF);
 	lpos = 8;
-	for (tp = ftab; tp; tp = tp->f_next)
+	TAILQ_FOREACH(tp, &ftab_head, f_list)
 		if (tp->f_type != INVISIBLE && tp->f_type != NODEPEND) {
 			len = strlen(tp->f_fn);
 			if (tp->f_fn[len - slen - 1] != '.')
@@ -636,7 +630,7 @@
 	struct file_list *ftp;
 	char *compilewith;
 
-	for (ftp = ftab; ftp != 0; ftp = ftp->f_next) {
+	TAILQ_FOREACH(ftp, &ftab_head, f_list) {
 		if (ftp->f_type == INVISIBLE)
 			continue;
 		if (ftp->f_warn)
@@ -702,7 +696,7 @@
 
 	fputs("CLEAN=", fp);
 	lpos = 7;
-	for (tp = ftab; tp; tp = tp->f_next)
+	TAILQ_FOREACH(tp, &ftab_head, f_list)
 		if (tp->f_clean) {
 			len = strlen(tp->f_clean);
 			if (len + lpos > 72) {
Index: mkoptions.c
===================================================================
RCS file: /stl/src/FreeBSD/src/usr.sbin/config/mkoptions.c,v
retrieving revision 1.28
diff -u -r1.28 mkoptions.c
--- mkoptions.c	2001/02/28 02:07:47	1.28
+++ mkoptions.c	2001/07/15 11:35:25
@@ -52,6 +52,11 @@
 #include "config.h"
 #include "y.tab.h"
 
+struct cputype_headt cputype_head = LIST_HEAD_INITIALIZER(cputype_head);
+struct opt_headt opt_head = LIST_HEAD_INITIALIZER(opt_head);
+struct opt_headt mkopt_head = LIST_HEAD_INITIALIZER(mkopt_head);
+struct opt_list_headt otab_head = LIST_HEAD_INITIALIZER(otab_head);
+
 static	struct users {
 	int	u_default;
 	int	u_min;
@@ -72,12 +77,11 @@
 	struct opt *op;
 
 	/* Fake the cpu types as options. */
-	for (cp = cputype; cp != NULL; cp = cp->cpu_next) {
+	LIST_FOREACH(cp, &cputype_head, cpu_list) {
 		op = (struct opt *)malloc(sizeof(*op));
 		memset(op, 0, sizeof(*op));
 		op->op_name = ns(cp->cpu_name);
-		op->op_next = opt;
-		opt = op;
+		LIST_INSERT_HEAD(&opt_head, op, op_list);
 	}	
 
 	if (maxusers == 0) {
@@ -95,13 +99,12 @@
 	op->op_name = ns("MAXUSERS");
 	snprintf(buf, sizeof(buf), "%d", maxusers);
 	op->op_value = ns(buf);
-	op->op_next = opt;
-	opt = op;
+	LIST_INSERT_HEAD(&opt_head, op, op_list);
 
 	read_options();
-	for (ol = otab; ol != 0; ol = ol->o_next)
+	LIST_FOREACH(ol, &otab_head, o_list)
 		do_option(ol->o_name);
-	for (op = opt; op; op = op->op_next) {
+	LIST_FOREACH(op, &opt_head, op_list) {
 		if (!op->op_ownfile && strncmp(op->op_name, "DEV_", 4)) {
 			printf("%s: unknown option \"%s\"\n",
 			       PREFIX, op->op_name);
@@ -120,7 +123,8 @@
 	char *file, *inw;
 	const char *basefile;
 	struct opt_list *ol;
-	struct opt *op, *op_head, *topp;
+	struct opt *op;
+	struct opt_headt localopt_head;
 	FILE *inf, *outf;
 	char *value;
 	char *oldvalue;
@@ -133,7 +137,7 @@
 	 * Check to see if the option was specified..
 	 */
 	value = NULL;
-	for (op = opt; op; op = op->op_next) {
+	LIST_FOREACH(op, &opt_head, op_list) {
 		if (eq(name, op->op_name)) {
 			oldvalue = value;
 			value = op->op_value;
@@ -164,13 +168,13 @@
 		return;
 	}
 	basefile = "";
-	for (ol = otab; ol != 0; ol = ol->o_next)
+	LIST_FOREACH(ol, &otab_head, o_list)
 		if (eq(name, ol->o_name)) {
 			basefile = ol->o_file;
 			break;
 		}
 	oldvalue = NULL;
-	op_head = NULL;
+	LIST_INIT(&localopt_head);
 	seen = 0;
 	tidy = 0;
 	for (;;) {
@@ -194,7 +198,7 @@
 			invalue = value;
 			seen++;
 		}
-		for (ol = otab; ol != 0; ol = ol->o_next)
+		LIST_FOREACH(ol, &otab_head, o_list)
 			if (eq(inw, ol->o_name))
 				break;
 		if (!eq(inw, name) && !ol) {
@@ -210,8 +214,7 @@
 			bzero(op, sizeof(*op));
 			op->op_name = inw;
 			op->op_value = invalue;
-			op->op_next = op_head;
-			op_head = op;
+			LIST_INSERT_HEAD(&localopt_head, op, op_list);
 		}
 
 		/* EOL? */
@@ -221,9 +224,10 @@
 	}
 	(void) fclose(inf);
 	if (!tidy && ((value == NULL && oldvalue == NULL) ||
-	    (value && oldvalue && eq(value, oldvalue)))) {	
-		for (op = op_head; op != NULL; op = topp) {
-			topp = op->op_next;
+	    (value && oldvalue && eq(value, oldvalue)))) {
+		while (!LIST_EMPTY(&localopt_head)) {
+			op = LIST_FIRST(&localopt_head);
+			LIST_REMOVE(op, op_list);
 			free(op->op_name);
 			free(op->op_value);
 			free(op);
@@ -237,20 +241,20 @@
 		bzero(op, sizeof(*op));
 		op->op_name = ns(name);
 		op->op_value = value ? ns(value) : NULL;
-		op->op_next = op_head;
-		op_head = op;
+		LIST_INSERT_HEAD(&localopt_head, op, op_list);
 	}
 
 	outf = fopen(file, "w");
 	if (outf == 0)
 		err(1, "%s", file);
-	for (op = op_head; op != NULL; op = topp) {
+	while (!LIST_EMPTY(&localopt_head)) {
+		op = LIST_FIRST(&localopt_head);
+		LIST_REMOVE(op, op_list);
 		/* was the option in the config file? */
 		if (op->op_value) {
 			fprintf(outf, "#define %s %s\n",
 				op->op_name, op->op_value);
 		}
-		topp = op->op_next;
 		free(op->op_name);
 		free(op->op_value);
 		free(op);
@@ -271,7 +275,7 @@
 	/* "cannot happen"?  the otab list should be complete.. */
 	(void) strlcpy(nbuf, "options.h", sizeof(nbuf));
 
-	for (po = otab ; po != 0; po = po->o_next) {
+	LIST_FOREACH(po, &otab_head, o_list) {
 		if (eq(po->o_name, name)) {
 			strlcpy(nbuf, po->o_file, sizeof(nbuf));
 			break;
@@ -341,7 +345,7 @@
 	}
 	val = ns(val);
 
-	for (po = otab ; po != 0; po = po->o_next) {
+	LIST_FOREACH(po, &otab_head, o_list) {
 		if (eq(po->o_name, this)) {
 			printf("%s: Duplicate option %s.\n",
 			       fname, this);
@@ -353,8 +357,7 @@
 	bzero(po, sizeof(*po));
 	po->o_name = this;
 	po->o_file = val;
-	po->o_next = otab;
-	otab = po;
+	LIST_INSERT_HEAD(&otab_head, po, o_list);
 
 	goto next;
 }

To Unsubscribe: send mail to majordomo@FreeBSD.org
with "unsubscribe freebsd-audit" in the body of the message




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