config(8) lobotomy, please see commit msg in sys.

(I have no idea why cvs didn't take these changes before.)
This commit is contained in:
Poul-Henning Kamp 1999-05-09 17:23:38 +00:00
parent 35ce6c413e
commit bb4d56144e
7 changed files with 45 additions and 614 deletions

View File

@ -57,25 +57,15 @@ struct file_list {
* root device, etc. for system specifications
*/
union {
struct { /* when swap specification */
dev_t fuw_swapdev;
int fuw_swapsize;
int fuw_swapflag;
} fuw;
struct { /* when system specification */
dev_t fus_rootdev;
dev_t fus_dumpdev;
char * fus_rootdev;
} fus;
struct { /* when component dev specification */
dev_t fup_compdev;
int fup_compinfo;
} fup;
} fun;
#define f_swapdev fun.fuw.fuw_swapdev
#define f_swapsize fun.fuw.fuw_swapsize
#define f_swapflag fun.fuw.fuw_swapflag
#define f_rootdev fun.fus.fus_rootdev
#define f_dumpdev fun.fus.fus_dumpdev
#define f_compdev fun.fup.fup_compdev
#define f_compinfo fun.fup.fup_compinfo
};
@ -183,8 +173,6 @@ char *get_quoted_word __P((FILE *));
char *path __P((char *));
char *raisestr __P((char *));
void moveifchanged __P((const char *, const char *));
dev_t nametodev __P((char *, int, int, char));
char *devtoname __P((dev_t));
void init_dev __P((struct device *));
void newbus_ioconf __P((void));
int yyparse __P((void));
@ -207,7 +195,6 @@ extern int profiling;
extern int debugging;
extern int maxusers;
extern u_int loadaddress;
extern int old_config_present; /* Old config/build directory still there */

View File

@ -6,13 +6,11 @@
%token AND
%token ANY
%token ARGS
%token AT
%token BIO
%token BUS
%token CAM
%token COMMA
%token CONFIG
%token CONFLICTS
%token CONTROLLER
%token CPU
@ -21,7 +19,6 @@
%token DISK
%token DRIVE
%token DRQ
%token DUMPS
%token EQUALS
%token FLAGS
%token IDENT
@ -36,18 +33,15 @@
%token MINUS
%token NET
%token NEXUS
%token ON
%token OPTIONS
%token MAKEOPTIONS
%token PORT
%token PRIORITY
%token PSEUDO_DEVICE
%token ROOT
%token SEMICOLON
%token SEQUENTIAL
%token SIZE
%token SLAVE
%token SWAP
%token TARGET
%token TTY
%token TRACE
@ -62,10 +56,6 @@
%type <str> Opt_value
%type <str> Dev
%type <str> device_name
%type <val> major_minor
%type <val> root_device_spec root_device_specs
%type <val> dump_device_spec
%type <file> swap_device_spec
%{
@ -104,9 +94,6 @@
* @(#)config.y 8.1 (Berkeley) 6/6/93
*/
#include <sys/disklabel.h>
#include <sys/diskslice.h>
#include <ctype.h>
#include <err.h>
#include <stdio.h>
@ -120,7 +107,7 @@ static struct device *curp = 0;
struct device *dtab;
char *ident;
int yyline;
struct file_list *ftab, *conf_list, **confp, *comp_list, **compp;
struct file_list *ftab, *conf_list, **confp;
char errbuf[80];
int maxusers;
int do_trace;
@ -129,12 +116,8 @@ int seen_scbus;
#define ns(s) strdup(s)
static int alreadychecked __P((dev_t, dev_t[], dev_t *));
static void deverror __P((char *, char *));
static int finddev __P((dev_t));
static struct device *connect __P((char *, int));
static struct device *huhcon __P((char *));
static dev_t *verifyswap __P((struct file_list *, dev_t *, dev_t *));
static void yyerror __P((char *s));
@ -142,7 +125,6 @@ static void yyerror __P((char *s));
%%
Configuration:
Many_specs
= { verifysystemspecs(); }
;
Many_specs:
@ -193,155 +175,9 @@ Config_spec:
|
IDENT ID
= { ident = $2; } |
System_spec
|
MAXUSERS NUMBER
= { maxusers = $2; };
System_spec:
System_id System_parameter_list
= { checksystemspec(*confp); }
;
System_id:
CONFIG Save_id
= { mkconf($2); }
;
System_parameter_list:
System_parameter_list System_parameter
| System_parameter
;
System_parameter:
addr_spec
| swap_spec
| root_spec
| dump_spec
| arg_spec
;
addr_spec:
AT NUMBER
= { loadaddress = $2; }
;
swap_spec:
SWAP optional_on swap_device_list
= { yyerror("swap specification obsolete, ignored"); }
;
swap_device_list:
swap_device_list AND swap_device
| swap_device
;
swap_device:
swap_device_spec optional_size optional_sflag
;
swap_device_spec:
device_name
= {
struct file_list *fl = newflist(SWAPSPEC);
if (eq($1, "generic"))
fl->f_fn = $1;
else {
fl->f_swapdev = nametodev($1, 0,
COMPATIBILITY_SLICE, 'b');
fl->f_fn = devtoname(fl->f_swapdev);
}
$$ = fl;
}
| major_minor
= {
struct file_list *fl = newflist(SWAPSPEC);
fl->f_swapdev = $1;
fl->f_fn = devtoname($1);
$$ = fl;
}
;
root_spec:
ROOT optional_on root_device_specs
= {
struct file_list *fl = *confp;
if (fl && fl->f_rootdev != NODEV)
yyerror("extraneous root device specification");
else
fl->f_rootdev = $3;
}
;
root_device_specs:
root_device_spec AND root_device_specs
= {
warnx("extraneous root devices ignored");
$$ = $1;
}
| root_device_spec
;
root_device_spec:
device_name
= { $$ = nametodev($1, 0, COMPATIBILITY_SLICE, 'a'); }
| major_minor
;
dump_spec:
DUMPS optional_on dump_device_spec
= {
struct file_list *fl = *confp;
if (fl && fl->f_dumpdev != NODEV)
yyerror("extraneous dump device specification");
else
fl->f_dumpdev = $3;
}
;
dump_device_spec:
device_name
= { $$ = nametodev($1, 0, COMPATIBILITY_SLICE, 'b'); }
| major_minor
;
arg_spec:
ARGS optional_on arg_device_spec
= { yyerror("arg device specification obsolete, ignored"); }
;
arg_device_spec:
device_name
| major_minor
;
major_minor:
MAJOR NUMBER MINOR NUMBER
= { $$ = makedev($2, $4); }
;
optional_on:
ON
| /* empty */
;
optional_size:
SIZE NUMBER
= { yyerror("`size nnn' swap spec obsolete"); }
| /* empty */
;
optional_sflag:
SEQUENTIAL
= { yyerror("`sequential' swap spec obsolete"); }
| /* empty */
;
device_name:
Save_id
= { $$ = $1; }
@ -611,28 +447,6 @@ newdev(dp)
curp = np;
}
/*
* note that a configuration should be made
*/
static void
mkconf(sysname)
char *sysname;
{
register struct file_list *fl, **flp;
fl = (struct file_list *) malloc(sizeof *fl);
memset(fl, 0, sizeof(*fl));
fl->f_type = SYSTEMSPEC;
fl->f_needs = sysname;
fl->f_rootdev = NODEV;
fl->f_dumpdev = NODEV;
fl->f_fn = 0;
fl->f_next = 0;
for (flp = confp; *flp; flp = &(*flp)->f_next)
;
*flp = fl;
confp = flp;
}
static struct file_list *
newflist(ftype)
@ -643,54 +457,11 @@ newflist(ftype)
fl->f_type = ftype;
fl->f_next = 0;
fl->f_swapdev = NODEV;
fl->f_swapsize = 0;
fl->f_needs = 0;
fl->f_fn = 0;
return (fl);
}
/*
* Add a swap device to the system's configuration
*/
static void
mkswap(system, fl, size, flag)
struct file_list *system, *fl;
int size, flag;
{
register struct file_list **flp;
if (system == 0 || system->f_type != SYSTEMSPEC) {
yyerror("\"swap\" spec precedes \"config\" specification");
return;
}
if (size < 0) {
yyerror("illegal swap partition size");
return;
}
/*
* Append swap description to the end of the list.
*/
flp = &system->f_next;
for (; *flp && (*flp)->f_type == SWAPSPEC; flp = &(*flp)->f_next)
;
fl->f_next = *flp;
*flp = fl;
fl->f_swapsize = size;
fl->f_swapflag = flag;
/*
* If first swap device for this system,
* set up f_fn field to insure swap
* files are created with unique names.
*/
if (system->f_fn)
return;
if (eq(fl->f_fn, "generic"))
system->f_fn = ns(fl->f_fn);
else
system->f_fn = ns(system->f_needs);
}
/*
* find the pointer to connect to the given device and number.
* returns 0 if no such device and prints an error message
@ -841,140 +612,5 @@ checksystemspec(fl)
}
swap = fl->f_next;
generic = swap && swap->f_type == SWAPSPEC && eq(swap->f_fn, "generic");
if (fl->f_rootdev == NODEV && !generic) {
yyerror("no root device specified");
exit(1);
}
/*
* Default swap area to be in 'b' partition of root's
* device. If root specified to be other than on 'a'
* partition, give warning, something probably amiss.
*/
if (swap == 0 || swap->f_type != SWAPSPEC) {
dev_t dev;
swap = newflist(SWAPSPEC);
dev = fl->f_rootdev;
if (dkpart(dev) != 0) {
(void) snprintf(buf, sizeof(buf),
"Warning, swap defaulted to 'b' partition with root on '%c' partition",
dkpart(dev) + 'a');
yyerror(buf);
}
swap->f_swapdev = dkmodpart(dev, SWAP_PART);
swap->f_fn = devtoname(swap->f_swapdev);
mkswap(fl, swap, 0);
}
/*
* Make sure a generic swap isn't specified, along with
* other stuff (user must really be confused).
*/
if (generic) {
if (fl->f_rootdev != NODEV)
yyerror("root device specified with generic swap");
if (fl->f_dumpdev != NODEV)
yyerror("dump device specified with generic swap");
return;
}
/*
* Warn if dump device is not a swap area.
*/
if (fl->f_dumpdev != NODEV && fl->f_dumpdev != swap->f_swapdev) {
struct file_list *p = swap->f_next;
for (; p && p->f_type == SWAPSPEC; p = p->f_next)
if (fl->f_dumpdev == p->f_swapdev)
return;
(void) snprintf(buf, sizeof(buf),
"Warning: dump device is not a swap partition");
yyerror(buf);
}
}
/*
* Verify all devices specified in the system specification
* are present in the device specifications.
*/
static void
verifysystemspecs()
{
register struct file_list *fl;
dev_t checked[50];
register dev_t *pchecked = checked;
for (fl = conf_list; fl; fl = fl->f_next) {
if (fl->f_type != SYSTEMSPEC)
continue;
if (!finddev(fl->f_rootdev))
deverror(fl->f_needs, "root");
*pchecked++ = fl->f_rootdev;
pchecked = verifyswap(fl->f_next, checked, pchecked);
if (!alreadychecked(fl->f_dumpdev, checked, pchecked)) {
if (!finddev(fl->f_dumpdev))
deverror(fl->f_needs, "dump");
*pchecked++ = fl->f_dumpdev;
}
}
}
/*
* Do as above, but for swap devices.
*/
static dev_t *
verifyswap(fl, checked, pchecked)
register struct file_list *fl;
dev_t checked[];
register dev_t *pchecked;
{
for (;fl && fl->f_type == SWAPSPEC; fl = fl->f_next) {
if (eq(fl->f_fn, "generic"))
continue;
if (alreadychecked(fl->f_swapdev, checked, pchecked))
continue;
if (!finddev(fl->f_swapdev))
warnx("swap device %s not configured", fl->f_fn);
*pchecked++ = fl->f_swapdev;
}
return (pchecked);
}
/*
* Has a device already been checked
* for its existence in the configuration?
*/
static int
alreadychecked(dev, list, last)
dev_t dev, list[];
register dev_t *last;
{
register dev_t *p;
for (p = list; p < last; p++)
if (dkmodpart(*p, 0) != dkmodpart(dev, 0))
return (1);
return (0);
}
static void
deverror(systemname, devtype)
char *systemname, *devtype;
{
warnx("%s: %s device not configured", systemname, devtype);
}
/*
* Look for the device in the list of
* configured hardware devices. Must
* take into account stuff wildcarded.
*/
/*ARGSUSED*/
static int
finddev(dev)
dev_t dev;
{
/* punt on this right now */
return (1);
}

View File

@ -6,6 +6,6 @@
* The numbering scheme is inspired by the sys/conf/newvers.sh RELDATE
* and <osreldate.h> system.
*
* $Id: configvers.h,v 1.12 1999/04/16 21:28:10 peter Exp $
* $Id: configvers.h,v 1.13 1999/04/24 21:38:48 peter Exp $
*/
#define CONFIGVERS 400014
#define CONFIGVERS 400015

View File

@ -52,13 +52,11 @@ struct kt {
int kt_val;
} key_words[] = {
{ "and", AND },
{ "args", ARGS },
{ "at", AT },
{ "bio", BIO }, /* XXX going away */
{ "bus", BUS },
{ "cam", CAM }, /* XXX going away */
{ "conflicts", CONFLICTS },
{ "config", CONFIG },
{ "controller", CONTROLLER },
{ "cpu", CPU },
{ "device", DEVICE },
@ -66,7 +64,6 @@ struct kt {
{ "disk", DISK },
{ "drive", DRIVE },
{ "drq", DRQ },
{ "dumps", DUMPS },
{ "flags", FLAGS },
{ "ident", IDENT },
{ "iomem", IOMEM },
@ -80,16 +77,13 @@ struct kt {
{ "minor", MINOR },
{ "net", NET }, /* XXX going away */
{ "nexus", NEXUS },
{ "on", ON },
{ "options", OPTIONS },
{ "port", PORT },
{ "priority", PRIORITY },
{ "pseudo-device",PSEUDO_DEVICE },
{ "root", ROOT },
{ "sequential", SEQUENTIAL },
{ "size", SIZE },
{ "slave", SLAVE },
{ "swap", SWAP },
{ "tape", DEVICE },
{ "target", TARGET },
{ "tty", TTY }, /* XXX going away */
@ -128,7 +122,7 @@ ID [A-Za-z_][-A-Za-z_0-9]*
if ((i = kw_lookup(yytext)) == -1)
REJECT;
if (i == CONTROLLER || i == DEVICE || i == DISK ||
i == PSEUDO_DEVICE || i == AT || i == ON)
i == PSEUDO_DEVICE || i == AT)
BEGIN NONUM;
tprintf("(%s) ", yytext);
return i;

View File

@ -42,7 +42,7 @@ static const char copyright[] =
static char sccsid[] = "@(#)main.c 8.1 (Berkeley) 6/6/93";
#endif
static const char rcsid[] =
"$Id: main.c,v 1.31 1999/04/18 13:36:29 peter Exp $";
"$Id: main.c,v 1.32 1999/04/24 18:59:19 peter Exp $";
#endif /* not lint */
#include <sys/types.h>
@ -70,11 +70,32 @@ static int no_config_clobber = TRUE;
int old_config_present;
int debugging;
int profiling;
u_int loadaddress;
static void usage __P((void));
static void configfile __P((void));
/*
* note that a configuration should be made
*/
static void
mkconf(sysname)
char *sysname;
{
register struct file_list *fl, **flp;
fl = (struct file_list *) malloc(sizeof *fl);
memset(fl, 0, sizeof(*fl));
fl->f_type = SYSTEMSPEC;
fl->f_needs = sysname;
fl->f_rootdev = 0;
fl->f_fn = 0;
fl->f_next = 0;
for (flp = confp; *flp; flp = &(*flp)->f_next)
;
*flp = fl;
confp = flp;
}
/*
* Config builds a set of files for building a UNIX
* system given a description of the desired system.
@ -143,10 +164,9 @@ main(argc, argv)
else
old_config_present = 1;
loadaddress = -1;
dtab = NULL;
confp = &conf_list;
compp = &comp_list;
mkconf("kernel");
if (yyparse())
exit(3);
switch (machine) {

View File

@ -36,7 +36,7 @@
static char sccsid[] = "@(#)mkmakefile.c 8.1 (Berkeley) 6/6/93";
#endif
static const char rcsid[] =
"$Id: mkmakefile.c,v 1.40 1999/04/19 13:53:07 peter Exp $";
"$Id: mkmakefile.c,v 1.41 1999/04/24 18:59:19 peter Exp $";
#endif /* not lint */
/*
@ -73,7 +73,6 @@ static const char rcsid[] =
static struct file_list *fcur;
static char *tail __P((char *));
static void do_swapspec __P((FILE *, char *));
static void do_clean __P((FILE *));
static void do_load __P((FILE *));
static void do_rules __P((FILE *));
@ -178,9 +177,6 @@ makefile()
}
}
fprintf(ofp, "\n");
if (loadaddress != -1) {
fprintf(ofp, "LOAD_ADDRESS=%X\n", loadaddress);
}
for (op = mkopt; op; op = op->op_next)
fprintf(ofp, "%s=%s\n", op->op_name, op->op_value);
if (debugging)
@ -569,7 +565,7 @@ do_objs(fp)
for (fl = conf_list; fl; fl = fl->f_next) {
if (fl->f_type != SWAPSPEC)
continue;
(void) snprintf(swapname, sizeof(swapname), "swap%s.c", fl->f_fn);
(void) snprintf(swapname, sizeof(swapname), "swapkernel.c");
if (eq(sp, swapname))
goto cont;
}
@ -618,16 +614,12 @@ do_cfiles(fp)
}
for (fl = conf_list; fl; fl = fl->f_next)
if (fl->f_type == SYSTEMSPEC) {
(void) snprintf(swapname, sizeof(swapname), "swap%s.c", fl->f_fn);
(void) snprintf(swapname, sizeof(swapname), "swapkernel.c");
if ((len = 3 + strlen(swapname)) + lpos > 72) {
lpos = 8;
fputs("\\\n\t", fp);
}
if (eq(fl->f_fn, "generic"))
fprintf(fp, "$S/%s/%s/%s ",
machinename, machinename, swapname);
else
fprintf(fp, "%s ", swapname);
fprintf(fp, "%s ", swapname);
lpos += len + 1;
}
if (lpos != 8)
@ -823,33 +815,18 @@ do_systemspec(f, fl, first)
{
fprintf(f, "KERNEL=\t%s\n", fl->f_needs);
fprintf(f, "${FULLKERNEL}: ${SYSTEM_DEP} swap%s.o", fl->f_fn);
fprintf(f, "${FULLKERNEL}: ${SYSTEM_DEP}");
if (first)
fprintf(f, " vers.o");
fprintf(f, "\n\t${SYSTEM_LD_HEAD}\n");
fprintf(f, "\t${SYSTEM_LD} swap%s.o\n", fl->f_fn);
fprintf(f, "\t${SYSTEM_LD}\n", fl->f_fn);
fprintf(f, "\t${SYSTEM_LD_TAIL}\n\n");
do_swapspec(f, fl->f_fn);
for (fl = fl->f_next; fl; fl = fl->f_next)
if (fl->f_type != SWAPSPEC)
break;
return (fl);
}
static void
do_swapspec(f, name)
FILE *f;
register char *name;
{
if (!eq(name, "generic"))
fprintf(f, "swap%s.o: swap%s.c\n", name, name);
else
fprintf(f, "swapgeneric.o: $S/%s/%s/swapgeneric.c\n",
machinename, machinename);
fprintf(f, "\t${NORMAL_C}\n\n");
}
char *
raisestr(str)
register char *str;

View File

@ -36,7 +36,7 @@
static char sccsid[] = "@(#)mkswapconf.c 8.1 (Berkeley) 6/6/93";
#endif
static const char rcsid[] =
"$Id: mkswapconf.c,v 1.18 1999/04/18 13:36:29 peter Exp $";
"$Id: mkswapconf.c,v 1.19 1999/04/24 18:59:19 peter Exp $";
#endif /* not lint */
/*
@ -45,23 +45,19 @@ static const char rcsid[] =
#include <err.h>
#include <unistd.h>
#include <sys/disklabel.h>
#include <sys/diskslice.h>
#include <ctype.h>
#include <stdio.h>
#include <string.h>
#include "config.h"
#define ns(s) strdup(s)
static void initdevtable __P((void));
static struct file_list *do_swap __P((struct file_list *));
void
swapconf()
{
FILE *fp;
char newswapname[80];
char swapname[80];
register struct file_list *swap;
register struct file_list *fl;
fl = conf_list;
@ -70,199 +66,20 @@ swapconf()
fl = fl->f_next;
continue;
}
fl = do_swap(fl);
break;
}
}
static struct file_list *
do_swap(fl)
register struct file_list *fl;
{
FILE *fp;
char newswapname[80];
char swapname[80];
register struct file_list *swap;
if (eq(fl->f_fn, "generic")) {
fl = fl->f_next;
return (fl->f_next);
}
(void) snprintf(swapname, sizeof(swapname), "swap%s.c", fl->f_fn);
(void) snprintf(newswapname, sizeof(newswapname), "swap%s.c.new", fl->f_fn);
(void) snprintf(swapname, sizeof(swapname), "swapkernel.c");
(void) snprintf(newswapname, sizeof(newswapname), "swapkernel.c.new");
fp = fopen(path(newswapname), "w");
if (fp == 0)
err(1, "%s", path(newswapname));
fprintf(fp, "#include <sys/param.h>\n");
fprintf(fp, "#include <sys/conf.h>\n");
fprintf(fp, "\n");
/*
* If there aren't any swap devices
* specified, just return, the error
* has already been noted.
*/
swap = fl->f_next;
if (swap == 0 || swap->f_type != SWAPSPEC) {
(void) unlink(path(newswapname));
fclose(fp);
return (swap);
}
fprintf(fp, "dev_t\trootdev = makedev(%d, 0x%08x);\t\t/* %s */\n",
major(fl->f_rootdev), minor(fl->f_rootdev),
devtoname(fl->f_rootdev));
if (fl->f_dumpdev != NODEV) {
fprintf(fp, "dev_t\tdumpdev = makedev(%d, 0x%08x);\t\t/* %s */\n",
major(fl->f_dumpdev), minor(fl->f_dumpdev),
devtoname(fl->f_dumpdev));
} else {
fprintf(fp, "dev_t\tdumpdev = NODEV;\t\t\t/* unconfigured */\n");
}
fprintf(fp, "char\t*rootdevname = \"%s\";\n", fl->f_rootdev);
fclose(fp);
moveifchanged(path(newswapname), path(swapname));
return (swap);
return;
}
static int devtablenotread = 1;
static struct devdescription {
char *dev_name;
int dev_major;
struct devdescription *dev_next;
} *devtable;
/*
* Given a device name specification figure out:
* major device number
* partition
* device name
* unit number
* This is a hack, but the system still thinks in
* terms of major/minor instead of string names.
*/
dev_t
nametodev(name, defunit, defslice, defpartition)
char *name;
int defunit;
int defslice;
char defpartition;
{
char *cp, partition;
int unit, slice;
register struct devdescription *dp;
cp = name;
if (cp == 0)
errx(1, "internal error, nametodev");
while (*cp && !isdigit(*cp))
cp++;
unit = *cp ? atoi(cp) : defunit;
if (unit < 0 || unit > 31) {
warnx(
"%s: invalid device specification, unit out of range", name);
unit = defunit; /* carry on more checking */
}
if (*cp) {
*cp++ = '\0';
while (*cp && isdigit(*cp))
cp++;
}
slice = defslice;
if (*cp == 's') {
++cp;
if (*cp) {
slice = atoi(cp);
if (slice < 0 || slice >= MAX_SLICES - 1) {
warnx(
"%s: invalid device specification, slice out of range",
cp);
slice = defslice;
}
if (slice != COMPATIBILITY_SLICE)
slice++;
*cp++ = '\0';
while (*cp && isdigit(*cp))
cp++;
}
}
partition = *cp ? *cp : defpartition;
if (partition < 'a' || partition > 'h') {
warnx("%c: invalid device specification, bad partition", *cp);
partition = defpartition; /* carry on */
}
if (devtablenotread)
initdevtable();
for (dp = devtable; dp; dp = dp->dev_next)
if (eq(name, dp->dev_name))
break;
if (dp == 0) {
warnx("%s: unknown device", name);
return (NODEV);
}
return (makedev(dp->dev_major,
dkmakeminor(unit, slice, partition - 'a')));
}
char *
devtoname(dev)
dev_t dev;
{
char buf[80];
register struct devdescription *dp;
int part;
char partname[2];
int slice;
char slicename[32];
if (devtablenotread)
initdevtable();
for (dp = devtable; dp; dp = dp->dev_next)
if (major(dev) == dp->dev_major)
break;
if (dp == 0)
dp = devtable;
part = dkpart(dev);
slice = dkslice(dev);
slicename[0] = partname[0] = '\0';
if (slice != WHOLE_DISK_SLICE || part != RAW_PART) {
partname[0] = 'a' + part;
partname[1] = '\0';
if (slice != COMPATIBILITY_SLICE)
snprintf(slicename, sizeof(slicename), "s%d", slice - 1);
}
(void) snprintf(buf, sizeof(buf), "%s%d%s%s", dp->dev_name,
dkunit(dev), slicename, partname);
return (ns(buf));
}
static void
initdevtable()
{
char linebuf[256];
char buf[BUFSIZ];
int maj;
register struct devdescription **dp = &devtable;
FILE *fp;
(void) snprintf(buf, sizeof(buf), "../conf/devices.%s", machinename);
fp = fopen(buf, "r");
if (fp == NULL)
errx(1, "can't open %s", buf);
while(fgets(linebuf,256,fp)) {
/*******************************\
* Allow a comment *
\*******************************/
if(linebuf[0] == '#') continue;
if (sscanf(linebuf, "%s\t%d\n", buf, &maj) == 2) {
*dp = (struct devdescription *)malloc(sizeof (**dp));
memset(*dp, 0, sizeof(**dp));
(*dp)->dev_name = ns(buf);
(*dp)->dev_major = maj;
dp = &(*dp)->dev_next;
} else {
fprintf(stderr,"illegal line in devices file\n");
break;
}
}
*dp = 0;
fclose(fp);
devtablenotread = 0;
}