]> git.saurik.com Git - apple/network_cmds.git/blob - timed.tproj/timedc.tproj/timedc.c
network_cmds-245.15.tar.gz
[apple/network_cmds.git] / timed.tproj / timedc.tproj / timedc.c
1 /*
2 * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
3 *
4 * @APPLE_LICENSE_HEADER_START@
5 *
6 * "Portions Copyright (c) 1999 Apple Computer, Inc. All Rights
7 * Reserved. This file contains Original Code and/or Modifications of
8 * Original Code as defined in and that are subject to the Apple Public
9 * Source License Version 1.0 (the 'License'). You may not use this file
10 * except in compliance with the License. Please obtain a copy of the
11 * License at http://www.apple.com/publicsource and read it before using
12 * this file.
13 *
14 * The Original Code and all software distributed under the License are
15 * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
16 * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
17 * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
18 * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT. Please see the
19 * License for the specific language governing rights and limitations
20 * under the License."
21 *
22 * @APPLE_LICENSE_HEADER_END@
23 */
24 /*-
25 * Copyright (c) 1985, 1993
26 * The Regents of the University of California. All rights reserved.
27 *
28 * Redistribution and use in source and binary forms, with or without
29 * modification, are permitted provided that the following conditions
30 * are met:
31 * 1. Redistributions of source code must retain the above copyright
32 * notice, this list of conditions and the following disclaimer.
33 * 2. Redistributions in binary form must reproduce the above copyright
34 * notice, this list of conditions and the following disclaimer in the
35 * documentation and/or other materials provided with the distribution.
36 * 3. All advertising materials mentioning features or use of this software
37 * must display the following acknowledgement:
38 * This product includes software developed by the University of
39 * California, Berkeley and its contributors.
40 * 4. Neither the name of the University nor the names of its contributors
41 * may be used to endorse or promote products derived from this software
42 * without specific prior written permission.
43 *
44 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
45 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
46 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
47 * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
48 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
49 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
50 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
51 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
52 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
53 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
54 * SUCH DAMAGE.
55 */
56
57 #ifndef lint
58 static char copyright[] =
59 "@(#) Copyright (c) 1985, 1993\n\
60 The Regents of the University of California. All rights reserved.\n";
61 #endif /* not lint */
62
63 #ifndef lint
64 static char sccsid[] = "@(#)timedc.c 8.1 (Berkeley) 6/6/93";
65 #endif /* not lint */
66
67 #ifdef sgi
68 #ident "$Revision: 1.1 $"
69 #endif
70
71 #include "timedc.h"
72 #include <strings.h>
73 #include <signal.h>
74 #include <ctype.h>
75 #include <setjmp.h>
76 #include <unistd.h>
77 #include <stdlib.h>
78 #include <syslog.h>
79
80 int trace = 0;
81 FILE *fd = 0;
82 int margc;
83 int fromatty;
84 char *margv[20];
85 char cmdline[200];
86 jmp_buf toplevel;
87 static struct cmd *getcmd __P((char *));
88
89 int
90 main(argc, argv)
91 int argc;
92 char *argv[];
93 {
94 register struct cmd *c;
95
96 openlog("timedc", LOG_ODELAY, LOG_AUTH);
97
98 /*
99 * security dictates!
100 */
101 if (priv_resources() < 0) {
102 fprintf(stderr, "Could not get privileged resources\n");
103 exit(1);
104 }
105 (void) setuid(getuid());
106
107 if (--argc > 0) {
108 c = getcmd(*++argv);
109 if (c == (struct cmd *)-1) {
110 printf("?Ambiguous command\n");
111 exit(1);
112 }
113 if (c == 0) {
114 printf("?Invalid command\n");
115 exit(1);
116 }
117 if (c->c_priv && getuid()) {
118 printf("?Privileged command\n");
119 exit(1);
120 }
121 (*c->c_handler)(argc, argv);
122 exit(0);
123 }
124
125 fromatty = isatty(fileno(stdin));
126 if (setjmp(toplevel))
127 putchar('\n');
128 (void) signal(SIGINT, intr);
129 for (;;) {
130 if (fromatty) {
131 printf("timedc> ");
132 (void) fflush(stdout);
133 }
134 if (fgets(cmdline, sizeof(cmdline), stdin) == 0)
135 quit();
136 if (cmdline[0] == 0)
137 break;
138 makeargv();
139 if (margv[0] == 0)
140 continue;
141 c = getcmd(margv[0]);
142 if (c == (struct cmd *)-1) {
143 printf("?Ambiguous command\n");
144 continue;
145 }
146 if (c == 0) {
147 printf("?Invalid command\n");
148 continue;
149 }
150 if (c->c_priv && getuid()) {
151 printf("?Privileged command\n");
152 continue;
153 }
154 (*c->c_handler)(margc, margv);
155 }
156 return 0;
157 }
158
159 void
160 intr(signo)
161 int signo;
162 {
163 if (!fromatty)
164 exit(0);
165 longjmp(toplevel, 1);
166 }
167
168
169 static struct cmd *
170 getcmd(name)
171 char *name;
172 {
173 register char *p, *q;
174 register struct cmd *c, *found;
175 register int nmatches, longest;
176 extern int NCMDS;
177
178 longest = 0;
179 nmatches = 0;
180 found = 0;
181 for (c = cmdtab; c < &cmdtab[NCMDS]; c++) {
182 p = c->c_name;
183 for (q = name; *q == *p++; q++)
184 if (*q == 0) /* exact match? */
185 return(c);
186 if (!*q) { /* the name was a prefix */
187 if (q - name > longest) {
188 longest = q - name;
189 nmatches = 1;
190 found = c;
191 } else if (q - name == longest)
192 nmatches++;
193 }
194 }
195 if (nmatches > 1)
196 return((struct cmd *)-1);
197 return(found);
198 }
199
200 /*
201 * Slice a string up into argc/argv.
202 */
203 void
204 makeargv()
205 {
206 register char *cp;
207 register char **argp = margv;
208
209 margc = 0;
210 for (cp = cmdline; *cp;) {
211 while (isspace(*cp))
212 cp++;
213 if (*cp == '\0')
214 break;
215 *argp++ = cp;
216 margc += 1;
217 while (*cp != '\0' && !isspace(*cp))
218 cp++;
219 if (*cp == '\0')
220 break;
221 *cp++ = '\0';
222 }
223 *argp++ = 0;
224 }
225
226 #define HELPINDENT (sizeof ("directory"))
227
228 /*
229 * Help command.
230 */
231 void
232 help(argc, argv)
233 int argc;
234 char *argv[];
235 {
236 register struct cmd *c;
237
238 if (argc == 1) {
239 register int i, j, w;
240 int columns, width = 0, lines;
241 extern int NCMDS;
242
243 printf("Commands may be abbreviated. Commands are:\n\n");
244 for (c = cmdtab; c < &cmdtab[NCMDS]; c++) {
245 int len = strlen(c->c_name);
246
247 if (len > width)
248 width = len;
249 }
250 width = (width + 8) &~ 7;
251 columns = 80 / width;
252 if (columns == 0)
253 columns = 1;
254 lines = (NCMDS + columns - 1) / columns;
255 for (i = 0; i < lines; i++) {
256 for (j = 0; j < columns; j++) {
257 c = cmdtab + j * lines + i;
258 printf("%s", c->c_name);
259 if (c + lines >= &cmdtab[NCMDS]) {
260 printf("\n");
261 break;
262 }
263 w = strlen(c->c_name);
264 while (w < width) {
265 w = (w + 8) &~ 7;
266 putchar('\t');
267 }
268 }
269 }
270 return;
271 }
272 while (--argc > 0) {
273 register char *arg;
274 arg = *++argv;
275 c = getcmd(arg);
276 if (c == (struct cmd *)-1)
277 printf("?Ambiguous help command %s\n", arg);
278 else if (c == (struct cmd *)0)
279 printf("?Invalid help command %s\n", arg);
280 else
281 printf("%-*s\t%s\n", (int)HELPINDENT,
282 c->c_name, c->c_help);
283 }
284 }