summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-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;
}