Skip site navigation (1)Skip section navigation (2)
Date:      Sun, 15 Jul 2001 04:36:42 -0700
From:      Dima Dorfman <dima@unixfreak.org>
To:        audit@freebsd.org
Subject:   queue(3) patch for config(8)
Message-ID:  <20010715113642.C42CC3E2F@bazooka.unixfreak.org>

next in thread | raw e-mail | index | archive | help
Attached is a patch which converts config(8) to use the queue(3) API.
Please review.

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?20010715113642.C42CC3E2F>