Source-Changes-HG archive
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]
[src/thorpej_scsipi]: src/usr.sbin/config Make this work again for the case w...
details: https://anonhg.NetBSD.org/src/rev/9d2715546d6c
branches: thorpej_scsipi
changeset: 477367:9d2715546d6c
user: thorpej <thorpej%NetBSD.org@localhost>
date: Thu Jan 18 07:09:48 2001 +0000
description:
Make this work again for the case where there are devices
configured, but none of those devices happen to have locators.
diffstat:
usr.sbin/config/mkioconf.c | 469 +++++++++++++++++++++++++++++++++++++++++++++
1 files changed, 469 insertions(+), 0 deletions(-)
diffs (truncated from 473 to 300 lines):
diff -r d9cf03114275 -r 9d2715546d6c usr.sbin/config/mkioconf.c
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/usr.sbin/config/mkioconf.c Thu Jan 18 07:09:48 2001 +0000
@@ -0,0 +1,469 @@
+/* $NetBSD: mkioconf.c,v 1.55.2.2 2001/01/18 07:09:48 thorpej Exp $ */
+
+/*
+ * Copyright (c) 1992, 1993
+ * The Regents of the University of California. All rights reserved.
+ *
+ * This software was developed by the Computer Systems Engineering group
+ * at Lawrence Berkeley Laboratory under DARPA contract BG 91-66 and
+ * contributed to Berkeley.
+ *
+ * All advertising materials mentioning features or use of this software
+ * must display the following acknowledgement:
+ * This product includes software developed by the University of
+ * California, Lawrence Berkeley Laboratories.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ * must display the following acknowledgement:
+ * This product includes software developed by the University of
+ * California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ * from: @(#)mkioconf.c 8.1 (Berkeley) 6/6/93
+ */
+
+#include <sys/param.h>
+#include <errno.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include "config.h"
+
+/*
+ * Make ioconf.c.
+ */
+static int cf_locnames_print(const char *, void *, void *);
+static int cforder(const void *, const void *);
+static int emitcfdata(FILE *);
+static int emitcfdrivers(FILE *);
+static int emitexterns(FILE *);
+static int emithdr(FILE *);
+static int emitloc(FILE *);
+static int emitpseudo(FILE *);
+static int emitpv(FILE *);
+static int emitroots(FILE *);
+static int emitvfslist(FILE *);
+static int emitname2blk(FILE *);
+
+#define SEP(pos, max) (((u_int)(pos) % (max)) == 0 ? "\n\t" : " ")
+
+#define ARRNAME(n, l) (strchr((n), ARRCHR) && strncmp((n), (l), strlen((l))) == 0)
+
+/*
+ * NEWLINE can only be used in the emitXXX functions.
+ * In most cases it can be subsumed into an fprintf.
+ */
+#define NEWLINE if (putc('\n', fp) < 0) return (1)
+
+int
+mkioconf(void)
+{
+ FILE *fp;
+ int v;
+
+ qsort(packed, npacked, sizeof *packed, cforder);
+ if ((fp = fopen("ioconf.c", "w")) == NULL) {
+ (void)fprintf(stderr, "config: cannot write ioconf.c: %s\n",
+ strerror(errno));
+ return (1);
+ }
+ v = emithdr(fp);
+ if (v != 0 || emitcfdrivers(fp) || emitexterns(fp) || emitloc(fp) ||
+ emitpv(fp) || emitcfdata(fp) || emitroots(fp) || emitpseudo(fp) ||
+ emitvfslist(fp) || emitname2blk(fp)) {
+ if (v >= 0)
+ (void)fprintf(stderr,
+ "config: error writing ioconf.c: %s\n",
+ strerror(errno));
+ (void)fclose(fp);
+ /* (void)unlink("ioconf.c"); */
+ return (1);
+ }
+ (void)fclose(fp);
+ return (0);
+}
+
+static int
+cforder(const void *a, const void *b)
+{
+ int n1, n2;
+
+ n1 = (*(struct devi **)a)->i_cfindex;
+ n2 = (*(struct devi **)b)->i_cfindex;
+ return (n1 - n2);
+}
+
+static int
+emithdr(FILE *ofp)
+{
+ FILE *ifp;
+ int n, rv;
+ char ifnbuf[200], buf[BUFSIZ];
+ char *ifn;
+
+ if (fprintf(ofp, "\
+/*\n\
+ * MACHINE GENERATED: DO NOT EDIT\n\
+ *\n\
+ * ioconf.c, from \"%s\"\n\
+ */\n\n", conffile) < 0)
+ return (1);
+
+ rv = 0;
+ (void)snprintf(ifnbuf, sizeof(ifnbuf), "arch/%s/conf/ioconf.incl.%s",
+ machine, machine);
+ ifn = sourcepath(ifnbuf);
+ if ((ifp = fopen(ifn, "r")) != NULL) {
+ while ((n = fread(buf, 1, sizeof(buf), ifp)) > 0)
+ if (fwrite(buf, 1, n, ofp) != n) {
+ rv = 1;
+ break;
+ }
+ if (rv == 0 && ferror(ifp)) {
+ (void)fprintf(stderr, "config: error reading %s: %s\n",
+ ifn, strerror(errno));
+ rv = -1;
+ }
+ (void)fclose(ifp);
+ } else {
+ if (fputs("\
+#include <sys/param.h>\n\
+#include <sys/conf.h>\n\
+#include <sys/device.h>\n\
+#include <sys/mount.h>\n", ofp) < 0)
+ rv = 1;
+ }
+ free(ifn);
+ return (rv);
+}
+
+static int
+emitcfdrivers(FILE *fp)
+{
+ struct devbase *d;
+
+ NEWLINE;
+ for (d = allbases; d != NULL; d = d->d_next) {
+ if (!devbase_has_instances(d, WILD))
+ continue;
+ if (fprintf(fp, "struct cfdriver %s_cd = {\n",
+ d->d_name) < 0)
+ return (1);
+ if (fprintf(fp, "\tNULL, \"%s\", %s\n",
+ d->d_name, d->d_classattr != NULL ?
+ d->d_classattr->a_devclass : "DV_DULL") < 0)
+ return (1);
+ if (fprintf(fp, "};\n\n") < 0)
+ return (1);
+ }
+ return (0);
+}
+
+static int
+emitexterns(FILE *fp)
+{
+ struct deva *da;
+
+ NEWLINE;
+ for (da = alldevas; da != NULL; da = da->d_next) {
+ if (!deva_has_instances(da, WILD))
+ continue;
+ if (fprintf(fp, "extern struct cfattach %s_ca;\n",
+ da->d_name) < 0)
+ return (1);
+ }
+ NEWLINE;
+ return (0);
+}
+
+/*
+ * Emit an initialized array of character strings describing this
+ * attribute's locators.
+ */
+static int
+cf_locnames_print(const char *name, void *value, void *arg)
+{
+ struct attr *a;
+ struct nvlist *nv;
+ FILE *fp = arg;
+
+ a = value;
+ if (a->a_locs) {
+ if (fprintf(fp, "const char *%scf_locnames[] = { ", name) < 0)
+ return (1);
+ for (nv = a->a_locs; nv; nv = nv->nv_next)
+ if (fprintf(fp, "\"%s\", ", nv->nv_name) < 0)
+ return (1);
+ if (fprintf(fp, "NULL};\n") < 0)
+ return (1);
+ }
+ return 0;
+}
+
+static int
+emitloc(FILE *fp)
+{
+ int i;
+
+ if (locators.used != 0) {
+ if (fprintf(fp, "\n/* locators */\n\
+static int loc[%d] = {", locators.used) < 0)
+ return (1);
+ for (i = 0; i < locators.used; i++)
+ if (fprintf(fp, "%s%s,", SEP(i, 8),
+ locators.vec[i]) < 0)
+ return (1);
+ if (fprintf(fp, "\n};\n") < 0)
+ return (1);
+ } else if (*packed != NULL) {
+ /* We need to have *something*. */
+ if (fprintf(fp, "\n/* locators */\n\
+static int loc[1] = { -1 };\n") < 0)
+ return (1);
+ }
+
+ if (*packed != NULL)
+ if (fprintf(fp,
+ "\nconst char *nullcf_locnames[] = {NULL};\n") < 0)
+ return (1);
+
+ if (locators.used != 0)
+ return ht_enumerate(attrtab, cf_locnames_print, fp);
+
+ return (0);
+}
+
+/*
+ * Emit global parents-vector.
+ */
+static int
+emitpv(FILE *fp)
+{
+ int i;
+
+ if (parents.used == 0)
+ return (0);
+
+ if (fprintf(fp, "\n/* parent vectors */\n\
+static short pv[%d] = {", parents.used) < 0)
+ return (1);
+ for (i = 0; i < parents.used; i++)
+ if (fprintf(fp, "%s%d,", SEP(i, 16), parents.vec[i]) < 0)
+ return (1);
+ return (fprintf(fp, "\n};\n") < 0);
+}
+
+/*
+ * Emit the cfdata array.
+ */
+static int
+emitcfdata(FILE *fp)
+{
+ struct devi **p, *i, **par;
+ int unit, v;
+ const char *state, *basename, *attachment;
+ struct nvlist *nv;
+ struct attr *a;
+ char *loc;
+ char locbuf[20];
+ const char *lastname = "";
+
+ if (fprintf(fp, "\n\
+#define NORM FSTATE_NOTFOUND\n\
+#define STAR FSTATE_STAR\n\
+\n\
Home |
Main Index |
Thread Index |
Old Index