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