|
|
1.1 root 1: #ifndef lint
2: static char sccsid[] = "@(#)lpc.c 4.4 (Berkeley) 7/17/83";
3: #endif
4:
5: /*
6: * lpc -- line printer control program
7: */
8: #include <stdio.h>
9: #include <signal.h>
10: #include <ctype.h>
11: #include <setjmp.h>
12:
13: #include "lpc.h"
14:
15: int fromatty;
16:
17: char cmdline[200];
18: int margc;
19: char *margv[20];
20: int top;
21: int intr();
22: struct cmd *getcmd();
23:
24: jmp_buf toplevel;
25:
26: main(argc, argv)
27: char *argv[];
28: {
29: register struct cmd *c;
30: extern char *name;
31:
32: name = argv[0];
33:
34: if (--argc > 0) {
35: c = getcmd(*++argv);
36: if (c == (struct cmd *)-1) {
37: printf("?Ambiguous command\n");
38: exit(1);
39: }
40: if (c == 0) {
41: printf("?Invalid command\n");
42: exit(1);
43: }
44: if (c->c_priv && getuid()) {
45: printf("?Privileged command\n");
46: exit(1);
47: }
48: (*c->c_handler)(argc, argv);
49: exit(0);
50: }
51: fromatty = isatty(fileno(stdin));
52: top = setjmp(toplevel) == 0;
53: if (top)
54: signal(SIGINT, intr);
55: for (;;) {
56: cmdscanner(top);
57: top = 1;
58: }
59: }
60:
61: intr()
62: {
63: if (!fromatty)
64: exit(0);
65: longjmp(toplevel, 1);
66: }
67:
68: /*
69: * Command parser.
70: */
71: cmdscanner(top)
72: int top;
73: {
74: register struct cmd *c;
75: extern struct cmd cmdtab[];
76: extern int help();
77:
78: if (!top)
79: putchar('\n');
80: for (;;) {
81: if (fromatty) {
82: printf("lpc> ");
83: fflush(stdout);
84: }
85: if (gets(cmdline) == 0)
86: quit();
87: if (cmdline[0] == 0)
88: break;
89: makeargv();
90: c = getcmd(margv[0]);
91: if (c == (struct cmd *)-1) {
92: printf("?Ambiguous command\n");
93: continue;
94: }
95: if (c == 0) {
96: printf("?Invalid command\n");
97: continue;
98: }
99: if (c->c_priv && getuid()) {
100: printf("?Privileged command\n");
101: continue;
102: }
103: (*c->c_handler)(margc, margv);
104: }
105: longjmp(toplevel, 0);
106: }
107:
108: struct cmd *
109: getcmd(name)
110: register char *name;
111: {
112: register char *p, *q;
113: register struct cmd *c, *found;
114: register int nmatches, longest;
115:
116: longest = 0;
117: nmatches = 0;
118: found = 0;
119: for (c = cmdtab; p = c->c_name; c++) {
120: for (q = name; *q == *p++; q++)
121: if (*q == 0) /* exact match? */
122: return(c);
123: if (!*q) { /* the name was a prefix */
124: if (q - name > longest) {
125: longest = q - name;
126: nmatches = 1;
127: found = c;
128: } else if (q - name == longest)
129: nmatches++;
130: }
131: }
132: if (nmatches > 1)
133: return((struct cmd *)-1);
134: return(found);
135: }
136:
137: /*
138: * Slice a string up into argc/argv.
139: */
140: makeargv()
141: {
142: register char *cp;
143: register char **argp = margv;
144:
145: margc = 0;
146: for (cp = cmdline; *cp;) {
147: while (isspace(*cp))
148: cp++;
149: if (*cp == '\0')
150: break;
151: *argp++ = cp;
152: margc += 1;
153: while (*cp != '\0' && !isspace(*cp))
154: cp++;
155: if (*cp == '\0')
156: break;
157: *cp++ = '\0';
158: }
159: *argp++ = 0;
160: }
161:
162: #define HELPINDENT (sizeof ("directory"))
163:
164: /*
165: * Help command.
166: */
167: help(argc, argv)
168: int argc;
169: char *argv[];
170: {
171: register struct cmd *c;
172:
173: if (argc == 1) {
174: register int i, j, w;
175: int columns, width = 0, lines;
176: extern int NCMDS;
177:
178: printf("Commands may be abbreviated. Commands are:\n\n");
179: for (c = cmdtab; c < &cmdtab[NCMDS]; c++) {
180: int len = strlen(c->c_name);
181:
182: if (len > width)
183: width = len;
184: }
185: width = (width + 8) &~ 7;
186: columns = 80 / width;
187: if (columns == 0)
188: columns = 1;
189: lines = (NCMDS + columns - 1) / columns;
190: for (i = 0; i < lines; i++) {
191: for (j = 0; j < columns; j++) {
192: c = cmdtab + j * lines + i;
193: printf("%s", c->c_name);
194: if (c + lines >= &cmdtab[NCMDS]) {
195: printf("\n");
196: break;
197: }
198: w = strlen(c->c_name);
199: while (w < width) {
200: w = (w + 8) &~ 7;
201: putchar('\t');
202: }
203: }
204: }
205: return;
206: }
207: while (--argc > 0) {
208: register char *arg;
209: arg = *++argv;
210: c = getcmd(arg);
211: if (c == (struct cmd *)-1)
212: printf("?Ambiguous help command %s\n", arg);
213: else if (c == (struct cmd *)0)
214: printf("?Invalid help command %s\n", arg);
215: else
216: printf("%-*s\t%s\n", HELPINDENT,
217: c->c_name, c->c_help);
218: }
219: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.