summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMats O Jansson <maja@cvs.openbsd.org>2001-02-04 20:42:13 +0000
committerMats O Jansson <maja@cvs.openbsd.org>2001-02-04 20:42:13 +0000
commit188fba77536064f7792bb8d0660180698e4673f8 (patch)
treef15de4b7f242ebf778b3c3a5ced9fa965d79737d
parent1f2e1421f3ad0919744754aeb577231be4951c2e (diff)
Add support for pseudo devices. This is done by adding more information
in ioconf.c. The only thing that can be done with pseudo devices is changing the number of created units. -moj ok deraadt@
-rw-r--r--usr.sbin/config/cmd.c12
-rw-r--r--usr.sbin/config/mkioconf.c15
-rw-r--r--usr.sbin/config/ukc.c22
-rw-r--r--usr.sbin/config/ukc.h30
-rw-r--r--usr.sbin/config/ukcutil.c163
5 files changed, 216 insertions, 26 deletions
diff --git a/usr.sbin/config/cmd.c b/usr.sbin/config/cmd.c
index cba1816ee1a..029ecc90332 100644
--- a/usr.sbin/config/cmd.c
+++ b/usr.sbin/config/cmd.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: cmd.c,v 1.4 2001/01/31 22:41:32 maja Exp $ */
+/* $OpenBSD: cmd.c,v 1.5 2001/02/04 20:42:12 maja Exp $ */
/*
* Copyright (c) 1999-2001 Mats O Jansson. All rights reserved.
@@ -30,7 +30,7 @@
*/
#ifndef LINT
-static char rcsid[] = "$OpenBSD: cmd.c,v 1.4 2001/01/31 22:41:32 maja Exp $";
+static char rcsid[] = "$OpenBSD: cmd.c,v 1.5 2001/02/04 20:42:12 maja Exp $";
#endif
#include <sys/types.h>
@@ -230,6 +230,14 @@ Xlist(cmd)
cd++;
}
+ if (nopdev == 0) {
+ while(i <= (totdev+maxpseudo)) {
+ if (more())
+ break;
+ pdev(i++);
+ }
+ }
+
cnt = -1;
return (CMD_CONT);
diff --git a/usr.sbin/config/mkioconf.c b/usr.sbin/config/mkioconf.c
index 980a7ae3f3e..1547bfc2370 100644
--- a/usr.sbin/config/mkioconf.c
+++ b/usr.sbin/config/mkioconf.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: mkioconf.c,v 1.15 1999/10/02 07:38:20 deraadt Exp $ */
+/* $OpenBSD: mkioconf.c,v 1.16 2001/02/04 20:42:12 maja Exp $ */
/* $NetBSD: mkioconf.c,v 1.41 1996/11/11 14:18:49 mycroft Exp $ */
/*
@@ -464,6 +464,7 @@ emitpseudo(fp)
{
register struct devi *i;
register struct devbase *d;
+ int cnt = 0;
if (fputs("\n/* pseudo-devices */\n", fp) < 0)
return (1);
@@ -471,6 +472,18 @@ emitpseudo(fp)
if (fprintf(fp, "extern void %sattach __P((int));\n",
i->i_base->d_name) < 0)
return (1);
+ if (fputs("\nchar *pdevnames[] = {\n", fp) < 0)
+ return (1);
+ for (i = allpseudo; i != NULL; i = i->i_next) {
+ d = i->i_base;
+ if (fprintf(fp, "\t\"%s\",\n", d->d_name) < 0)
+ return (1);
+ cnt++;
+ }
+ if (fputs("};\n", fp) < 0)
+ return (1);
+ if (fprintf(fp, "\nint pdevnames_size = %d;\n", cnt) < 0)
+ return (1);
if (fputs("\nstruct pdevinit pdevinit[] = {\n", fp) < 0)
return (1);
for (i = allpseudo; i != NULL; i = i->i_next) {
diff --git a/usr.sbin/config/ukc.c b/usr.sbin/config/ukc.c
index 2a455d3d7f2..a8b52805d48 100644
--- a/usr.sbin/config/ukc.c
+++ b/usr.sbin/config/ukc.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: ukc.c,v 1.4 2001/01/31 22:41:32 maja Exp $ */
+/* $OpenBSD: ukc.c,v 1.5 2001/02/04 20:42:12 maja Exp $ */
/*
* Copyright (c) 1999-2001 Mats O Jansson. All rights reserved.
@@ -30,7 +30,7 @@
*/
#ifndef LINT
-static char rcsid[] = "$OpenBSD: ukc.c,v 1.4 2001/01/31 22:41:32 maja Exp $";
+static char rcsid[] = "$OpenBSD: ukc.c,v 1.5 2001/02/04 20:42:12 maja Exp $";
#endif
#include <sys/types.h>
@@ -124,8 +124,6 @@ ukc(file, outfile, uflag, force)
if (force == 0 && outfile == NULL)
printf("warning: no output file specified\n");
- init();
-
if ((nl[IA_EXTRALOC].n_type == 0) ||
(nl[I_NEXTRALOC].n_type == 0) ||
(nl[I_UEXTRALOC].n_type == 0) ||
@@ -137,6 +135,16 @@ WARNING the commands add and change might not work.\n");
oldkernel = 1;
}
+ if ((nl[P_PDEVNAMES].n_type == 0) ||
+ (nl[I_PDEVSIZE].n_type == 0) ||
+ (nl[S_PDEVINIT].n_type == 0)) {
+ printf("\
+WARNING this kernel doesn't support pseudo devices.\n");
+ nopdev = 1;
+ }
+
+ init();
+
if (uflag) {
if (ok) {
if (strcmp(adjust((caddr_t)nl[P_VERSION].n_value),
@@ -177,6 +185,7 @@ init()
int i = 0,fd;
struct cfdata *cd;
short *ln;
+ int *p;
#ifdef NOTDEF
struct winsize w;
#endif
@@ -205,6 +214,11 @@ init()
totdev = totdev - 1;
+ if (nopdev == 0) {
+ p = (int *)adjust((caddr_t)nl[I_PDEVSIZE].n_value);
+ maxpseudo = *p;
+ }
+
if ((fd = open("/dev/tty", O_RDWR)) < 0)
fd = 2;
diff --git a/usr.sbin/config/ukc.h b/usr.sbin/config/ukc.h
index 0188a2d26f5..a11280e1836 100644
--- a/usr.sbin/config/ukc.h
+++ b/usr.sbin/config/ukc.h
@@ -1,7 +1,7 @@
-/* $OpenBSD: ukc.h,v 1.3 2001/01/24 20:12:27 art Exp $ */
+/* $OpenBSD: ukc.h,v 1.4 2001/02/04 20:42:12 maja Exp $ */
/*
- * Copyright (c) 1999 Mats O Jansson. All rights reserved.
+ * Copyright (c) 1999-2001 Mats O Jansson. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
@@ -47,7 +47,10 @@
#define I_HISTLEN 12
#define CA_HISTORY 13
#define TZ_TZ 14
-#define NLENTRIES 15
+#define P_PDEVNAMES 15
+#define I_PDEVSIZE 16
+#define S_PDEVINIT 17
+#define NLENTRIES 18
#ifdef UKC_MAIN
struct nlist nl[] = {
@@ -66,6 +69,9 @@ struct nlist nl[] = {
{ "_userconf_histlen" },
{ "_userconf_history" },
{ "_tz" },
+ { "_pdevnames" },
+ { "_pdevnames_size" },
+ { "_pdevinit" },
{ NULL },
};
struct nlist knl[] = {
@@ -84,30 +90,39 @@ struct nlist knl[] = {
{ "_userconf_histlen" },
{ "_userconf_history" },
{ "_tz" },
+ { "_pdevnames" },
+ { "_pdevnames_size" },
+ { "_pdevinit" },
{ NULL },
};
int maxdev = 0;
int totdev = 0;
+int maxpseudo = 0;
int maxlocnames = 0;
int base = 16;
int cnt = -1;
int lines = 18;
int oldkernel = 0;
+int nopdev = 0;
#else
extern struct nlist nl[];
extern int maxdev;
extern int totdev;
+extern int maxpseudo;
extern int maxlocnames;
extern int base;
extern int cnt;
extern int lines;
extern int oldkernel;
+extern int nopdev;
#endif
-struct cfdata *get_cfdata __P((int));
-short *get_locnamp __P((int));
-caddr_t *get_locnames __P((int));
-int *get_extraloc __P((int));
+struct cfdata *get_cfdata __P((int));
+short *get_locnamp __P((int));
+caddr_t *get_locnames __P((int));
+int *get_extraloc __P((int));
+caddr_t *get_pdevnames __P((int));
+struct pdevinit *get_pdevinit __P((int));
int more __P(());
void pnum __P((int));
@@ -139,3 +154,4 @@ void process_history __P((int, char *));
#endif _UTIL_H
+
diff --git a/usr.sbin/config/ukcutil.c b/usr.sbin/config/ukcutil.c
index c7c52ab4052..4b62684f664 100644
--- a/usr.sbin/config/ukcutil.c
+++ b/usr.sbin/config/ukcutil.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: ukcutil.c,v 1.5 2001/01/31 22:41:32 maja Exp $ */
+/* $OpenBSD: ukcutil.c,v 1.6 2001/02/04 20:42:12 maja Exp $ */
/*
* Copyright (c) 1999-2001 Mats O Jansson. All rights reserved.
@@ -30,7 +30,7 @@
*/
#ifndef LINT
-static char rcsid[] = "$OpenBSD: ukcutil.c,v 1.5 2001/01/31 22:41:32 maja Exp $";
+static char rcsid[] = "$OpenBSD: ukcutil.c,v 1.6 2001/02/04 20:42:12 maja Exp $";
#endif
#include <sys/types.h>
@@ -81,6 +81,26 @@ get_extraloc(idx)
idx*sizeof(int)));
}
+caddr_t *
+get_pdevnames(idx)
+ int idx;
+{
+ caddr_t *p;
+
+ p = (caddr_t *)adjust((caddr_t)nl[P_PDEVNAMES].n_value +
+ idx*sizeof(caddr_t));
+ return(caddr_t *)adjust((caddr_t)*p);
+
+}
+
+struct pdevinit *
+get_pdevinit(idx)
+ int idx;
+{
+ return((struct pdevinit *)(adjust((caddr_t)nl[S_PDEVINIT].n_value) +
+ idx*sizeof(struct pdevinit)));
+}
+
int
more()
{
@@ -169,8 +189,23 @@ pdev(devno)
int *i;
caddr_t *p;
char c;
+ struct pdevinit *pi;
+
+ if (nopdev == 0) {
+ if ((devno > maxdev) && (devno <= totdev)) {
+ printf("%3d free slot (for add)\n", devno);
+ return;
+ }
+ if ((devno > totdev) && (devno <= (totdev+maxpseudo))) {
+ pi = get_pdevinit(devno-totdev-1);
+ printf("%3d %s count %d (pseudo device)\n", devno,
+ get_pdevnames(devno-totdev-1),
+ pi->pdev_count);
+ return;
+ }
+ }
- if (devno > maxdev) {
+ if (devno > maxdev) {
printf("Unknown devno (max is %d)\n", maxdev);
return;
}
@@ -374,6 +409,7 @@ change(devno)
{
struct cfdata *cd,*c;
caddr_t *p;
+ struct pdevinit *pi;
int i,share = 0,*j,*k,*l;
short *ln,*lk;
@@ -452,9 +488,31 @@ change(devno)
printf(" changed\n");
pdev(devno);
}
- } else {
- printf("Unknown devno (max is %d)\n", maxdev);
+ return;
+ }
+
+ if (nopdev == 0) {
+ if ((devno > maxdev) && (devno <= totdev)) {
+ printf("%3d can't change free slot\n", devno);
+ return;
+ }
+ if ((devno > totdev) && (devno <= (totdev+maxpseudo))) {
+
+ pdev(devno);
+
+ if (ask_yn("change")) {
+
+ pi = get_pdevinit(devno-totdev-1);
+
+ modify("count", &pi->pdev_count);
+ printf("%3d %s changed\n", devno, get_pdevnames(devno-totdev-1));
+ pdev(devno);
+ }
+ return;
+ }
}
+
+ printf("Unknown devno (max is %d)\n", totdev+maxpseudo);
}
void
@@ -464,6 +522,7 @@ change_history(devno,str)
{
struct cfdata *cd,*c;
caddr_t *p;
+ struct pdevinit *pi;
int i,share = 0,*j,*k,*l;
short *ln,*lk;
@@ -549,9 +608,35 @@ change_history(devno,str)
printf(" changed\n");
pdev(devno);
- } else {
- printf("Unknown devno (max is %d)\n", maxdev);
+ return;
+ }
+
+ if (nopdev == 0) {
+ if ((devno > maxdev) && (devno <= totdev)) {
+ printf("%3d can't change free slot\n", devno);
+ return;
+ }
+ if ((devno > totdev) && (devno <= (totdev+maxpseudo))) {
+
+ pdev(devno);
+
+ pi = get_pdevinit(devno-totdev-1);
+
+ if (*str) {
+ pi->pdev_count = atoi(str);
+ if (*str == '-') str++;
+ while ((*str >= '0') && (*str <= '9')) str++;
+ if (*str == ' ') str++;
+ }
+
+ printf("%3d %s changed\n", devno, get_pdevnames(devno-totdev-1));
+ pdev(devno);
+
+ return;
+ }
}
+
+ printf("Unknown devno (max is %d)\n", totdev+maxpseudo);
}
void
@@ -588,9 +673,24 @@ disable(devno)
if (done)
printf(" already");
printf(" disabled\n");
- } else {
- printf("Unknown devno (max is %d)\n", maxdev);
+
+ return;
}
+
+ if (nopdev == 0) {
+ if ((devno > maxdev) && (devno <= totdev)) {
+ printf("%3d can't disable free slot\n", devno);
+ return;
+ }
+ if ((devno > totdev) && (devno <= (totdev+maxpseudo))) {
+ printf("%3d %s can't disable pseudo device\n", devno,
+ get_pdevnames(devno-totdev-1));
+ return;
+ }
+ }
+
+ printf("Unknown devno (max is %d)\n", totdev+maxpseudo);
+
}
void
@@ -627,9 +727,23 @@ enable(devno)
if (done)
printf(" already");
printf(" enabled\n");
- } else {
- printf("Unknown devno (max is %d)\n", maxdev);
+
+ return;
}
+
+ if (nopdev == 0) {
+ if ((devno > maxdev) && (devno <= totdev)) {
+ printf("%3d can't enable free slot\n", devno);
+ return;
+ }
+ if ((devno > totdev) && (devno <= (totdev+maxpseudo))) {
+ printf("%3d %s can't enable pseudo device\n", devno,
+ get_pdevnames(devno-totdev-1));
+ return;
+ }
+ }
+
+ printf("Unknown devno (max is %d)\n", totdev+maxpseudo);
}
void
@@ -827,6 +941,31 @@ common_dev(dev, len, unit, state, routine)
cd++;
}
+ if (nopdev == 0) {
+ for (i = 0; i < maxpseudo; i++) {
+ if ((strncasecmp(dev,(char *)get_pdevnames(i),
+ len) == 0) && (state == FSTATE_FOUND)) {
+ switch(routine) {
+ case UC_CHANGE:
+ change(totdev+1+i);
+ break;
+ case UC_ENABLE:
+ enable(totdev+1+i);
+ break;
+ case UC_DISABLE:
+ disable(totdev+1+i);
+ break;
+ case UC_FIND:
+ pdev(totdev+1+i);
+ break;
+ default:
+ printf("Unknown pseudo routine /%c/\n",routine);
+ break;
+ }
+ }
+ }
+ }
+
switch (routine) {
case UC_CHANGE:
break;
@@ -943,7 +1082,7 @@ add(dev, len, unit, state)
}
if (state == FSTATE_FOUND) {
- printf("Device not complete number or * is missing/n");
+ printf("Device not complete number or * is missing\n");
return;
}