This source file includes following definitions.
- userconf_init
- userconf_more
- userconf_hist_cmd
- userconf_hist_int
- userconf_hist_eoc
- userconf_pnum
- userconf_pdevnam
- userconf_pdev
- userconf_number
- userconf_device
- userconf_attr
- userconf_modify
- userconf_change
- userconf_disable
- userconf_enable
- userconf_help
- userconf_list
- userconf_show
- userconf_common_attr_val
- userconf_show_attr
- userconf_common_dev
- userconf_common_attr
- userconf_add_read
- userconf_add
- userconf_parse
- user_config
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29 #include <sys/param.h>
30 #include <sys/systm.h>
31 #include <sys/device.h>
32 #include <sys/malloc.h>
33 #include <sys/time.h>
34
35 #include <dev/cons.h>
36
37 extern char *locnames[];
38 extern short locnamp[];
39 extern short cfroots[];
40 extern int cfroots_size;
41 extern int pv_size;
42 extern short pv[];
43 extern struct timezone tz;
44 extern char *pdevnames[];
45 extern int pdevnames_size;
46 extern struct pdevinit pdevinit[];
47
48 int userconf_base = 16;
49 int userconf_maxdev = -1;
50 int userconf_totdev = -1;
51 int userconf_maxlocnames = -1;
52 int userconf_cnt = -1;
53 int userconf_lines = 12;
54 int userconf_histlen = 0;
55 int userconf_histcur = 0;
56 char userconf_history[1024];
57 int userconf_histsz = sizeof(userconf_history);
58 char userconf_argbuf[40];
59 char userconf_cmdbuf[40];
60 char userconf_histbuf[40];
61
62 void userconf_init(void);
63 int userconf_more(void);
64 void userconf_modify(char *, int *);
65 void userconf_hist_cmd(char);
66 void userconf_hist_int(int);
67 void userconf_hist_eoc(void);
68 void userconf_pnum(int);
69 void userconf_pdevnam(short);
70 void userconf_pdev(short);
71 int userconf_number(char *, int *);
72 int userconf_device(char *, int *, short *, short *);
73 int userconf_attr(char *, int *);
74 void userconf_modify(char *, int *);
75 void userconf_change(int);
76 void userconf_disable(int);
77 void userconf_enable(int);
78 void userconf_help(void);
79 void userconf_list(void);
80 void userconf_show(void);
81 void userconf_common_attr_val(short, int *, char);
82 void userconf_show_attr(char *);
83 void userconf_common_dev(char *, int, short, short, char);
84 void userconf_common_attr(char *, int, char);
85 void userconf_add_read(char *, char, char *, int, int *);
86 void userconf_add(char *, int, short, short);
87 int userconf_parse(char *);
88
89 #define UC_CHANGE 'c'
90 #define UC_DISABLE 'd'
91 #define UC_ENABLE 'e'
92 #define UC_FIND 'f'
93 #define UC_SHOW 's'
94
95 char *userconf_cmds[] = {
96 "add", "a",
97 "base", "b",
98 "change", "c",
99 #if defined(DDB)
100 "ddb", "D",
101 #endif
102 "disable", "d",
103 "enable", "e",
104 "exit", "q",
105 "find", "f",
106 "help", "h",
107 "list", "l",
108 "lines", "L",
109 "quit", "q",
110 "show", "s",
111 "timezone", "t",
112 "verbose", "v",
113 "?", "h",
114 "", "",
115 };
116
117 void
118 userconf_init(void)
119 {
120 int i = 0;
121 struct cfdata *cd;
122 int ln;
123
124 while (cfdata[i].cf_attach != 0) {
125 userconf_maxdev = i;
126 userconf_totdev = i;
127
128 cd = &cfdata[i];
129 ln = cd->cf_locnames;
130 while (locnamp[ln] != -1) {
131 if (locnamp[ln] > userconf_maxlocnames)
132 userconf_maxlocnames = locnamp[ln];
133 ln++;
134 }
135 i++;
136 }
137
138 while (cfdata[i].cf_attach == 0) {
139 userconf_totdev = i;
140 i++;
141 }
142 userconf_totdev = userconf_totdev - 1;
143 }
144
145 int
146 userconf_more(void)
147 {
148 int quit = 0;
149 char c = '\0';
150
151 if (userconf_cnt != -1) {
152 if (userconf_cnt == userconf_lines) {
153 printf("--- more ---");
154 c = cngetc();
155 userconf_cnt = 0;
156 printf("\r \r");
157 }
158 userconf_cnt++;
159 if (c == 'q' || c == 'Q')
160 quit = 1;
161 }
162 return (quit);
163 }
164
165 void
166 userconf_hist_cmd(char cmd)
167 {
168 userconf_histcur = userconf_histlen;
169 if (userconf_histcur < userconf_histsz) {
170 userconf_history[userconf_histcur] = cmd;
171 userconf_histcur++;
172 }
173 }
174
175 void
176 userconf_hist_int(int val)
177 {
178 snprintf(userconf_histbuf, sizeof userconf_histbuf, " %d",val);
179 if (userconf_histcur + strlen(userconf_histbuf) < userconf_histsz) {
180 bcopy(userconf_histbuf,
181 &userconf_history[userconf_histcur],
182 strlen(userconf_histbuf));
183 userconf_histcur = userconf_histcur + strlen(userconf_histbuf);
184 }
185 }
186
187 void
188 userconf_hist_eoc(void)
189 {
190 if (userconf_histcur < userconf_histsz) {
191 userconf_history[userconf_histcur] = '\n';
192 userconf_histcur++;
193 userconf_histlen = userconf_histcur;
194 }
195 }
196
197 void
198 userconf_pnum(int val)
199 {
200 if (val > -2 && val < 16) {
201 printf("%d",val);
202 return;
203 }
204
205 switch (userconf_base) {
206 case 8:
207 printf("0%o",val);
208 break;
209 case 10:
210 printf("%d",val);
211 break;
212 case 16:
213 default:
214 printf("0x%x",val);
215 break;
216 }
217 }
218
219 void
220 userconf_pdevnam(short dev)
221 {
222 struct cfdata *cd;
223
224 cd = &cfdata[dev];
225 printf("%s", cd->cf_driver->cd_name);
226 switch (cd->cf_fstate) {
227 case FSTATE_NOTFOUND:
228 case FSTATE_DNOTFOUND:
229 printf("%d", cd->cf_unit);
230 break;
231 case FSTATE_FOUND:
232 printf("*FOUND*");
233 break;
234 case FSTATE_STAR:
235 case FSTATE_DSTAR:
236 printf("*");
237 break;
238 default:
239 printf("*UNKNOWN*");
240 break;
241 }
242 }
243
244 void
245 userconf_pdev(short devno)
246 {
247 struct cfdata *cd;
248 short *p;
249 int *l;
250 int ln;
251 char c;
252
253 if (devno > userconf_maxdev && devno <= userconf_totdev) {
254 printf("%3d free slot (for add)\n", devno);
255 return;
256 }
257
258 if (devno > userconf_totdev &&
259 devno <= userconf_totdev+pdevnames_size) {
260 printf("%3d %s count %d (pseudo device)\n", devno,
261 pdevnames[devno-userconf_totdev-1],
262 pdevinit[devno-userconf_totdev-1].pdev_count);
263 return;
264 }
265
266 if (devno > userconf_maxdev) {
267 printf("Unknown devno (max is %d)\n", userconf_maxdev);
268 return;
269 }
270
271 cd = &cfdata[devno];
272
273 printf("%3d ", devno);
274 userconf_pdevnam(devno);
275 printf(" at");
276 c = ' ';
277 p = cd->cf_parents;
278 if (*p == -1)
279 printf(" root");
280 while (*p != -1) {
281 printf("%c", c);
282 userconf_pdevnam(*p++);
283 c = '|';
284 }
285 switch (cd->cf_fstate) {
286 case FSTATE_NOTFOUND:
287 case FSTATE_FOUND:
288 case FSTATE_STAR:
289 break;
290 case FSTATE_DNOTFOUND:
291 case FSTATE_DSTAR:
292 printf(" disable");
293 break;
294 default:
295 printf(" ???");
296 break;
297 }
298 l = cd->cf_loc;
299 ln = cd->cf_locnames;
300 while (locnamp[ln] != -1) {
301 printf(" %s ", locnames[locnamp[ln]]);
302 ln++;
303 userconf_pnum(*l++);
304 }
305 printf(" flags 0x%x\n", cd->cf_flags);
306 }
307
308 int
309 userconf_number(char *c, int *val)
310 {
311 u_int num = 0;
312 int neg = 0;
313 int base = 10;
314
315 if (*c == '-') {
316 neg = 1;
317 c++;
318 }
319 if (*c == '0') {
320 base = 8;
321 c++;
322 if (*c == 'x' || *c == 'X') {
323 base = 16;
324 c++;
325 }
326 }
327 while (*c != '\n' && *c != '\t' && *c != ' ' && *c != '\0') {
328 u_char cc = *c;
329
330 if (cc >= '0' && cc <= '9')
331 cc = cc - '0';
332 else if (cc >= 'a' && cc <= 'f')
333 cc = cc - 'a' + 10;
334 else if (cc >= 'A' && cc <= 'F')
335 cc = cc - 'A' + 10;
336 else
337 return (-1);
338
339 if (cc > base)
340 return (-1);
341 num = num * base + cc;
342 c++;
343 }
344
345 if (neg && num > INT_MAX)
346 return (1);
347 *val = neg ? - num : num;
348 return (0);
349 }
350
351 int
352 userconf_device(char *cmd, int *len, short *unit, short *state)
353 {
354 short u = 0, s = FSTATE_FOUND;
355 int l = 0;
356 char *c;
357
358 c = cmd;
359 while (*c >= 'a' && *c <= 'z') {
360 l++;
361 c++;
362 }
363 if (*c == '*') {
364 s = FSTATE_STAR;
365 c++;
366 } else {
367 while (*c >= '0' && *c <= '9') {
368 s = FSTATE_NOTFOUND;
369 u = u*10 + *c - '0';
370 c++;
371 }
372 }
373 while (*c == ' ' || *c == '\t' || *c == '\n')
374 c++;
375
376 if (*c == '\0') {
377 *len = l;
378 *unit = u;
379 *state = s;
380 return(0);
381 }
382
383 return(-1);
384 }
385
386 int
387 userconf_attr(char *cmd, int *val)
388 {
389 char *c;
390 short attr = -1, i = 0, l = 0;
391
392 c = cmd;
393 while (*c != ' ' && *c != '\t' && *c != '\n' && *c != '\0') {
394 c++;
395 l++;
396 }
397
398 while (i <= userconf_maxlocnames) {
399 if (strlen(locnames[i]) == l) {
400 if (strncasecmp(cmd, locnames[i], l) == 0)
401 attr = i;
402 }
403 i++;
404 }
405
406 if (attr == -1) {
407 return (-1);
408 }
409
410 *val = attr;
411
412 return(0);
413 }
414
415 void
416 userconf_modify(char *item, int *val)
417 {
418 int ok = 0;
419 int a;
420 char *c;
421 int i;
422
423 while (!ok) {
424 printf("%s [", item);
425 userconf_pnum(*val);
426 printf("] ? ");
427
428 i = getsn(userconf_argbuf, sizeof(userconf_argbuf));
429
430 c = userconf_argbuf;
431 while (*c == ' ' || *c == '\t' || *c == '\n') c++;
432
433 if (*c != '\0') {
434 if (userconf_number(c, &a) == 0) {
435 *val = a;
436 ok = 1;
437 } else {
438 printf("Unknown argument\n");
439 }
440 } else {
441 ok = 1;
442 }
443 }
444 }
445
446 void
447 userconf_change(int devno)
448 {
449 struct cfdata *cd;
450 char c = '\0';
451 int *l;
452 int ln;
453
454 if (devno <= userconf_maxdev) {
455 userconf_pdev(devno);
456
457 while (c != 'y' && c != 'Y' && c != 'n' && c != 'N') {
458 printf("change (y/n) ?");
459 c = cngetc();
460 printf("\n");
461 }
462
463 if (c == 'y' || c == 'Y') {
464 int share = 0, i, *lk;
465
466
467 userconf_hist_cmd('c');
468 userconf_hist_int(devno);
469
470 cd = &cfdata[devno];
471 l = cd->cf_loc;
472 ln = cd->cf_locnames;
473
474
475
476
477
478
479 for (i = 0; cfdata[i].cf_driver; i++)
480 if (i != devno && cfdata[i].cf_loc == l)
481 share = 1;
482 if (share) {
483 for (i = 0; locnamp[ln+i] != -1 ; i++)
484 ;
485 lk = l = (int *)malloc(sizeof(int) * i,
486 M_TEMP, M_NOWAIT);
487 if (lk == NULL) {
488 printf("out of memory.\n");
489 return;
490 }
491 bcopy(cd->cf_loc, l, sizeof(int) * i);
492 }
493
494 while (locnamp[ln] != -1) {
495 userconf_modify(locnames[locnamp[ln]], l);
496
497
498 userconf_hist_int(*l);
499
500 ln++;
501 l++;
502 }
503 userconf_modify("flags", &cd->cf_flags);
504 userconf_hist_int(cd->cf_flags);
505
506 if (share) {
507 if (bcmp(cd->cf_loc, lk, sizeof(int) * i))
508 cd->cf_loc = lk;
509 else
510 free(lk, M_TEMP);
511 }
512
513 printf("%3d ", devno);
514 userconf_pdevnam(devno);
515 printf(" changed\n");
516 userconf_pdev(devno);
517 }
518 return;
519 }
520
521 if (devno > userconf_maxdev && devno <= userconf_totdev) {
522 printf("%3d can't change free slot\n", devno);
523 return;
524 }
525
526 if (devno > userconf_totdev &&
527 devno <= userconf_totdev+pdevnames_size) {
528 userconf_pdev(devno);
529 while (c != 'y' && c != 'Y' && c != 'n' && c != 'N') {
530 printf("change (y/n) ?");
531 c = cngetc();
532 printf("\n");
533 }
534
535 if (c == 'y' || c == 'Y') {
536
537 userconf_hist_cmd('c');
538 userconf_hist_int(devno);
539
540 userconf_modify("count",
541 &pdevinit[devno-userconf_totdev-1].pdev_count);
542 userconf_hist_int(pdevinit[devno-userconf_totdev-1].pdev_count);
543
544 printf("%3d %s changed\n", devno,
545 pdevnames[devno-userconf_totdev-1]);
546 userconf_pdev(devno);
547
548
549 userconf_hist_eoc();
550 }
551 return;
552 }
553
554 printf("Unknown devno (max is %d)\n", userconf_totdev+pdevnames_size);
555 }
556
557 void
558 userconf_disable(int devno)
559 {
560 int done = 0;
561
562 if (devno <= userconf_maxdev) {
563 switch (cfdata[devno].cf_fstate) {
564 case FSTATE_NOTFOUND:
565 cfdata[devno].cf_fstate = FSTATE_DNOTFOUND;
566 break;
567 case FSTATE_STAR:
568 cfdata[devno].cf_fstate = FSTATE_DSTAR;
569 break;
570 case FSTATE_DNOTFOUND:
571 case FSTATE_DSTAR:
572 done = 1;
573 break;
574 default:
575 printf("Error unknown state\n");
576 break;
577 }
578
579 printf("%3d ", devno);
580 userconf_pdevnam(devno);
581 if (done) {
582 printf(" already");
583 } else {
584
585 userconf_hist_cmd('d');
586 userconf_hist_int(devno);
587 userconf_hist_eoc();
588 }
589 printf(" disabled\n");
590
591 return;
592 }
593
594 if (devno > userconf_maxdev && devno <= userconf_totdev) {
595 printf("%3d can't disable free slot\n", devno);
596 return;
597 }
598
599 if (devno > userconf_totdev &&
600 devno <= userconf_totdev+pdevnames_size) {
601 printf("%3d %s can't disable pseudo device\n", devno,
602 pdevnames[devno-userconf_totdev-1]);
603 return;
604 }
605
606 printf("Unknown devno (max is %d)\n", userconf_totdev+pdevnames_size);
607 }
608
609 void
610 userconf_enable(int devno)
611 {
612 int done = 0;
613
614 if (devno <= userconf_maxdev) {
615 switch (cfdata[devno].cf_fstate) {
616 case FSTATE_DNOTFOUND:
617 cfdata[devno].cf_fstate = FSTATE_NOTFOUND;
618 break;
619 case FSTATE_DSTAR:
620 cfdata[devno].cf_fstate = FSTATE_STAR;
621 break;
622 case FSTATE_NOTFOUND:
623 case FSTATE_STAR:
624 done = 1;
625 break;
626 default:
627 printf("Error unknown state\n");
628 break;
629 }
630
631 printf("%3d ", devno);
632 userconf_pdevnam(devno);
633 if (done) {
634 printf(" already");
635 } else {
636
637 userconf_hist_cmd('e');
638 userconf_hist_int(devno);
639 userconf_hist_eoc();
640 }
641 printf(" enabled\n");
642 return;
643 }
644
645 if (devno > userconf_maxdev && devno <= userconf_totdev) {
646 printf("%3d can't enable free slot\n", devno);
647 return;
648 }
649
650 if (devno > userconf_totdev &&
651 devno <= userconf_totdev+pdevnames_size) {
652 printf("%3d %s can't enable pseudo device\n", devno,
653 pdevnames[devno-userconf_totdev-1]);
654 return;
655 }
656
657 printf("Unknown devno (max is %d)\n", userconf_totdev+pdevnames_size);
658 }
659
660 void
661 userconf_help(void)
662 {
663 int j = 0, k;
664
665 printf("command args description\n");
666 while (*userconf_cmds[j] != '\0') {
667 printf(userconf_cmds[j]);
668 k = strlen(userconf_cmds[j]);
669 while (k < 10) {
670 printf(" ");
671 k++;
672 }
673 switch (*userconf_cmds[j+1]) {
674 case 'L':
675 printf("[count] number of lines before more");
676 break;
677 case 'a':
678 printf("dev add a device");
679 break;
680 case 'b':
681 printf("8|10|16 base on large numbers");
682 break;
683 case 'c':
684 printf("devno|dev change devices");
685 break;
686 #if defined(DDB)
687 case 'D':
688 printf(" enter ddb");
689 break;
690 #endif
691 case 'd':
692 printf("attr val|devno|dev disable devices");
693 break;
694 case 'e':
695 printf("attr val|devno|dev enable devices");
696 break;
697 case 'f':
698 printf("devno|dev find devices");
699 break;
700 case 'h':
701 printf(" this message");
702 break;
703 case 'l':
704 printf(" list configuration");
705 break;
706 case 'q':
707 printf(" leave UKC");
708 break;
709 case 's':
710 printf("[attr [val]] "
711 "show attributes (or devices with an attribute)");
712 break;
713 case 't':
714 printf("[mins [dst]] set timezone/dst");
715 break;
716 case 'v':
717 printf(" toggle verbose booting");
718 break;
719 default:
720 printf(" don't know");
721 break;
722 }
723 printf("\n");
724 j += 2;
725 }
726 }
727
728 void
729 userconf_list(void)
730 {
731 int i = 0;
732
733 userconf_cnt = 0;
734
735 while (i <= (userconf_totdev+pdevnames_size)) {
736 if (userconf_more())
737 break;
738 userconf_pdev(i++);
739 }
740
741 userconf_cnt = -1;
742 }
743
744 void
745 userconf_show(void)
746 {
747 int i = 0;
748
749 userconf_cnt = 0;
750
751 while (i <= userconf_maxlocnames) {
752 if (userconf_more())
753 break;
754 printf("%s\n", locnames[i++]);
755 }
756
757 userconf_cnt = -1;
758 }
759
760 void
761 userconf_common_attr_val(short attr, int *val, char routine)
762 {
763 struct cfdata *cd;
764 int *l;
765 int ln;
766 int i = 0, quit = 0;
767
768 userconf_cnt = 0;
769
770 while (i <= userconf_maxdev) {
771 cd = &cfdata[i];
772 l = cd->cf_loc;
773 ln = cd->cf_locnames;
774 while (locnamp[ln] != -1) {
775 if (locnamp[ln] == attr) {
776 if (val == NULL) {
777 quit = userconf_more();
778 userconf_pdev(i);
779 } else {
780 if (*val == *l) {
781 quit = userconf_more();
782 switch (routine) {
783 case UC_ENABLE:
784 userconf_enable(i);
785 break;
786 case UC_DISABLE:
787 userconf_disable(i);
788 break;
789 case UC_SHOW:
790 userconf_pdev(i);
791 break;
792 default:
793 printf("Unknown routine /%c/\n",
794 routine);
795 break;
796 }
797 }
798 }
799 }
800 if (quit)
801 break;
802 ln++;
803 l++;
804 }
805 if (quit)
806 break;
807 i++;
808 }
809
810 userconf_cnt = -1;
811 }
812
813 void
814 userconf_show_attr(char *cmd)
815 {
816 char *c;
817 short attr = -1, i = 0, l = 0;
818 int a;
819
820 c = cmd;
821 while (*c != ' ' && *c != '\t' && *c != '\n' && *c != '\0') {
822 c++;
823 l++;
824 }
825 while (*c == ' ' || *c == '\t' || *c == '\n') {
826 c++;
827 }
828 while (i <= userconf_maxlocnames) {
829 if (strlen(locnames[i]) == l) {
830 if (strncasecmp(cmd, locnames[i], l) == 0) {
831 attr = i;
832 }
833 }
834 i++;
835 }
836
837 if (attr == -1) {
838 printf("Unknown attribute\n");
839 return;
840 }
841
842 if (*c == '\0') {
843 userconf_common_attr_val(attr, NULL, UC_SHOW);
844 } else {
845 if (userconf_number(c, &a) == 0) {
846 userconf_common_attr_val(attr, &a, UC_SHOW);
847 } else {
848 printf("Unknown argument\n");
849 }
850 }
851 }
852
853 void
854 userconf_common_dev(char *dev, int len, short unit, short state, char routine)
855 {
856 int i = 0;
857
858 switch (routine) {
859 case UC_CHANGE:
860 break;
861 default:
862 userconf_cnt = 0;
863 break;
864 }
865
866 while (cfdata[i].cf_attach != 0) {
867 if (strlen(cfdata[i].cf_driver->cd_name) == len) {
868
869
870
871
872
873
874
875 if (strncasecmp(dev, cfdata[i].cf_driver->cd_name,
876 len) == 0 &&
877 (state == FSTATE_FOUND ||
878 (state == FSTATE_STAR &&
879 (cfdata[i].cf_fstate == FSTATE_STAR ||
880 cfdata[i].cf_fstate == FSTATE_DSTAR)) ||
881 (state == FSTATE_NOTFOUND &&
882 cfdata[i].cf_unit == unit &&
883 (cfdata[i].cf_fstate == FSTATE_NOTFOUND ||
884 cfdata[i].cf_fstate == FSTATE_DNOTFOUND)))) {
885 if (userconf_more())
886 break;
887 switch (routine) {
888 case UC_CHANGE:
889 userconf_change(i);
890 break;
891 case UC_ENABLE:
892 userconf_enable(i);
893 break;
894 case UC_DISABLE:
895 userconf_disable(i);
896 break;
897 case UC_FIND:
898 userconf_pdev(i);
899 break;
900 default:
901 printf("Unknown routine /%c/\n",
902 routine);
903 break;
904 }
905 }
906 }
907 i++;
908 }
909
910 for (i = 0; i < pdevnames_size; i++) {
911 if (strncasecmp(dev, pdevnames[i], len) == 0 &&
912 state == FSTATE_FOUND) {
913 switch(routine) {
914 case UC_CHANGE:
915 userconf_change(userconf_totdev+1+i);
916 break;
917 case UC_ENABLE:
918 userconf_enable(userconf_totdev+1+i);
919 break;
920 case UC_DISABLE:
921 userconf_disable(userconf_totdev+1+i);
922 break;
923 case UC_FIND:
924 userconf_pdev(userconf_totdev+1+i);
925 break;
926 default:
927 printf("Unknown pseudo routine /%c/\n",routine);
928 break;
929 }
930 }
931 }
932
933 switch (routine) {
934 case UC_CHANGE:
935 break;
936 default:
937 userconf_cnt = -1;
938 break;
939 }
940 }
941
942 void
943 userconf_common_attr(char *cmd, int attr, char routine)
944 {
945 char *c;
946 short l = 0;
947 int a;
948
949 c = cmd;
950 while (*c != ' ' && *c != '\t' && *c != '\n' && *c != '\0') {
951 c++;
952 l++;
953 }
954 while (*c == ' ' || *c == '\t' || *c == '\n')
955 c++;
956
957 if (*c == '\0') {
958 printf("Value missing for attribute\n");
959 return;
960 }
961
962 if (userconf_number(c, &a) == 0) {
963 userconf_common_attr_val(attr, &a, routine);
964 } else {
965 printf("Unknown argument\n");
966 }
967 }
968
969 void
970 userconf_add_read(char *prompt, char field, char *dev, int len, int *val)
971 {
972 int ok = 0;
973 int a;
974 char *c;
975 int i;
976
977 *val = -1;
978
979 while (!ok) {
980 printf("%s ? ", prompt);
981
982 i = getsn(userconf_argbuf, sizeof(userconf_argbuf));
983
984 c = userconf_argbuf;
985 while (*c == ' ' || *c == '\t' || *c == '\n')
986 c++;
987
988 if (*c != '\0') {
989 if (userconf_number(c, &a) == 0) {
990 if (a > userconf_maxdev) {
991 printf("Unknown devno (max is %d)\n",
992 userconf_maxdev);
993 } else if (strncasecmp(dev,
994 cfdata[a].cf_driver->cd_name, len) != 0 &&
995 field == 'a') {
996 printf("Not same device type\n");
997 } else {
998 *val = a;
999 ok = 1;
1000 }
1001 } else if (*c == '?') {
1002 userconf_common_dev(dev, len, 0,
1003 FSTATE_FOUND, UC_FIND);
1004 } else if (*c == 'q' || *c == 'Q') {
1005 ok = 1;
1006 } else {
1007 printf("Unknown argument\n");
1008 }
1009 } else {
1010 ok = 1;
1011 }
1012 }
1013 }
1014
1015 void
1016 userconf_add(char *dev, int len, short unit, short state)
1017 {
1018 int i = 0, found = 0;
1019 struct cfdata new;
1020 int val, max_unit, star_unit, orig;
1021
1022 bzero(&new, sizeof(struct cfdata));
1023
1024 if (userconf_maxdev == userconf_totdev) {
1025 printf("No more space for new devices.\n");
1026 return;
1027 }
1028
1029 if (state == FSTATE_FOUND) {
1030 printf("Device not complete number or * is missing\n");
1031 return;
1032 }
1033
1034 for (i = 0; cfdata[i].cf_driver; i++)
1035 if (strlen(cfdata[i].cf_driver->cd_name) == len &&
1036 strncasecmp(dev, cfdata[i].cf_driver->cd_name, len) == 0)
1037 found = 1;
1038
1039 if (!found) {
1040 printf("No device of this type exists.\n");
1041 return;
1042 }
1043
1044 userconf_add_read("Clone Device (DevNo, 'q' or '?')",
1045 'a', dev, len, &val);
1046
1047 if (val != -1) {
1048 orig = val;
1049 new = cfdata[val];
1050 new.cf_unit = unit;
1051 new.cf_fstate = state;
1052 userconf_add_read("Insert before Device (DevNo, 'q' or '?')",
1053 'i', dev, len, &val);
1054 }
1055
1056 if (val != -1) {
1057
1058 userconf_hist_cmd('a');
1059 userconf_hist_int(orig);
1060 userconf_hist_int(unit);
1061 userconf_hist_int(state);
1062 userconf_hist_int(val);
1063 userconf_hist_eoc();
1064
1065
1066 for (i = userconf_maxdev; val <= i; i--)
1067 cfdata[i+1] = cfdata[i];
1068 cfdata[val] = new;
1069
1070
1071 for (i = 0; i < pv_size; i++) {
1072 if (pv[i] != -1 && pv[i] >= val)
1073 pv[i]++;
1074 }
1075
1076
1077 for (i = 0; i < cfroots_size; i++) {
1078 if (cfroots[i] != -1 && cfroots[i] >= val)
1079 cfroots[i]++;
1080 }
1081
1082 userconf_maxdev++;
1083
1084 max_unit = -1;
1085
1086
1087
1088 i = 0;
1089 while (cfdata[i].cf_attach != 0) {
1090 if (strlen(cfdata[i].cf_driver->cd_name) == len &&
1091 strncasecmp(dev, cfdata[i].cf_driver->cd_name,
1092 len) == 0) {
1093 switch (cfdata[i].cf_fstate) {
1094 case FSTATE_NOTFOUND:
1095 case FSTATE_DNOTFOUND:
1096 if (cfdata[i].cf_unit > max_unit)
1097 max_unit = cfdata[i].cf_unit;
1098 break;
1099 default:
1100 break;
1101 }
1102 }
1103 i++;
1104 }
1105
1106
1107
1108
1109
1110 max_unit++;
1111 star_unit = -1;
1112
1113 i = 0;
1114 while (cfdata[i].cf_attach != 0) {
1115 if (strlen(cfdata[i].cf_driver->cd_name) == len &&
1116 strncasecmp(dev, cfdata[i].cf_driver->cd_name,
1117 len) == 0) {
1118 switch (cfdata[i].cf_fstate) {
1119 case FSTATE_NOTFOUND:
1120 case FSTATE_DNOTFOUND:
1121 if (cfdata[i].cf_unit > star_unit)
1122 star_unit = cfdata[i].cf_unit;
1123 break;
1124 default:
1125 break;
1126 }
1127 }
1128 i++;
1129 }
1130 star_unit++;
1131
1132 i = 0;
1133 while (cfdata[i].cf_attach != 0) {
1134 if (strlen(cfdata[i].cf_driver->cd_name) == len &&
1135 strncasecmp(dev, cfdata[i].cf_driver->cd_name,
1136 len) == 0) {
1137 switch (cfdata[i].cf_fstate) {
1138 case FSTATE_STAR:
1139 case FSTATE_DSTAR:
1140 cfdata[i].cf_unit = max_unit;
1141 if (cfdata[i].cf_starunit1 < star_unit)
1142 cfdata[i].cf_starunit1 =
1143 star_unit;
1144 break;
1145 default:
1146 break;
1147 }
1148 }
1149 i++;
1150 }
1151 userconf_pdev(val);
1152 }
1153
1154
1155
1156 }
1157
1158 int
1159 userconf_parse(char *cmd)
1160 {
1161 char *c, *v;
1162 int i = 0, j = 0, k, a;
1163 short unit, state;
1164
1165 c = cmd;
1166 while (*c == ' ' || *c == '\t')
1167 c++;
1168 v = c;
1169 while (*c != ' ' && *c != '\t' && *c != '\n' && *c != '\0') {
1170 c++;
1171 i++;
1172 }
1173
1174 k = -1;
1175 while (*userconf_cmds[j] != '\0') {
1176 if (strlen(userconf_cmds[j]) == i) {
1177 if (strncasecmp(v, userconf_cmds[j], i) == 0)
1178 k = j;
1179 }
1180 j += 2;
1181 }
1182
1183 while (*c == ' ' || *c == '\t' || *c == '\n')
1184 c++;
1185
1186 if (k == -1) {
1187 if (*v != '\n')
1188 printf("Unknown command, try help\n");
1189 } else {
1190 switch (*userconf_cmds[k+1]) {
1191 case 'L':
1192 if (*c == '\0')
1193 printf("Argument expected\n");
1194 else if (userconf_number(c, &a) == 0)
1195 userconf_lines = a;
1196 else
1197 printf("Unknown argument\n");
1198 break;
1199 case 'a':
1200 if (*c == '\0')
1201 printf("Dev expected\n");
1202 else if (userconf_device(c, &a, &unit, &state) == 0)
1203 userconf_add(c, a, unit, state);
1204 else
1205 printf("Unknown argument\n");
1206 break;
1207 case 'b':
1208 if (*c == '\0')
1209 printf("8|10|16 expected\n");
1210 else if (userconf_number(c, &a) == 0) {
1211 if (a == 8 || a == 10 || a == 16) {
1212 userconf_base = a;
1213 } else {
1214 printf("8|10|16 expected\n");
1215 }
1216 } else
1217 printf("Unknown argument\n");
1218 break;
1219 case 'c':
1220 if (*c == '\0')
1221 printf("DevNo or Dev expected\n");
1222 else if (userconf_number(c, &a) == 0)
1223 userconf_change(a);
1224 else if (userconf_device(c, &a, &unit, &state) == 0)
1225 userconf_common_dev(c, a, unit, state, UC_CHANGE);
1226 else
1227 printf("Unknown argument\n");
1228 break;
1229 #if defined(DDB)
1230 case 'D':
1231 Debugger();
1232 break;
1233 #endif
1234 case 'd':
1235 if (*c == '\0')
1236 printf("Attr, DevNo or Dev expected\n");
1237 else if (userconf_attr(c, &a) == 0)
1238 userconf_common_attr(c, a, UC_DISABLE);
1239 else if (userconf_number(c, &a) == 0)
1240 userconf_disable(a);
1241 else if (userconf_device(c, &a, &unit, &state) == 0)
1242 userconf_common_dev(c, a, unit, state, UC_DISABLE);
1243 else
1244 printf("Unknown argument\n");
1245 break;
1246 case 'e':
1247 if (*c == '\0')
1248 printf("Attr, DevNo or Dev expected\n");
1249 else if (userconf_attr(c, &a) == 0)
1250 userconf_common_attr(c, a, UC_ENABLE);
1251 else if (userconf_number(c, &a) == 0)
1252 userconf_enable(a);
1253 else if (userconf_device(c, &a, &unit, &state) == 0)
1254 userconf_common_dev(c, a, unit, state, UC_ENABLE);
1255 else
1256 printf("Unknown argument\n");
1257 break;
1258 case 'f':
1259 if (*c == '\0')
1260 printf("DevNo or Dev expected\n");
1261 else if (userconf_number(c, &a) == 0)
1262 userconf_pdev(a);
1263 else if (userconf_device(c, &a, &unit, &state) == 0)
1264 userconf_common_dev(c, a, unit, state, UC_FIND);
1265 else
1266 printf("Unknown argument\n");
1267 break;
1268 case 'h':
1269 userconf_help();
1270 break;
1271 case 'l':
1272 if (*c == '\0')
1273 userconf_list();
1274 else
1275 printf("Unknown argument\n");
1276 break;
1277 case 'q':
1278
1279 userconf_hist_cmd('q');
1280 userconf_hist_eoc();
1281 return(-1);
1282 break;
1283 case 's':
1284 if (*c == '\0')
1285 userconf_show();
1286 else
1287 userconf_show_attr(c);
1288 break;
1289 case 't':
1290 if (*c == '\0' || userconf_number(c, &a) == 0) {
1291 if (*c != '\0') {
1292 tz.tz_minuteswest = a;
1293 while (*c != '\n' && *c != '\t' &&
1294 *c != ' ' && *c != '\0')
1295 c++;
1296 while (*c == '\t' || *c == ' ')
1297 c++;
1298 if (*c != '\0' &&
1299 userconf_number(c, &a) == 0)
1300 tz.tz_dsttime = a;
1301 userconf_hist_cmd('t');
1302 userconf_hist_int(tz.tz_minuteswest);
1303 userconf_hist_int(tz.tz_dsttime);
1304 userconf_hist_eoc();
1305 }
1306 printf("timezone = %d, dst = %d\n",
1307 tz.tz_minuteswest, tz.tz_dsttime);
1308 } else
1309 printf("Unknown argument\n");
1310 break;
1311 case 'v':
1312 autoconf_verbose = !autoconf_verbose;
1313 printf("autoconf verbose %sabled\n",
1314 autoconf_verbose ? "en" : "dis");
1315 break;
1316 default:
1317 printf("Unknown command\n");
1318 break;
1319 }
1320 }
1321 return(0);
1322 }
1323
1324 void
1325 user_config(void)
1326 {
1327 userconf_init();
1328 printf("User Kernel Config\n");
1329
1330 while (1) {
1331 printf("UKC> ");
1332 if (getsn(userconf_cmdbuf, sizeof(userconf_cmdbuf)) > 0 &&
1333 userconf_parse(userconf_cmdbuf))
1334 break;
1335 }
1336 printf("Continuing...\n");
1337 }