timedc.c
来自「<B>Digital的Unix操作系统VAX 4.2源码</B>」· C语言 代码 · 共 265 行
C
265 行
#ifndef lintstatic char *sccsid = "@(#)timedc.c 4.1 (ULTRIX) 7/2/90";#endif lint/************************************************************************ * * * Copyright (c) 1988 by * * Digital Equipment Corporation, Maynard, MA * * All rights reserved. * * * * This software is furnished under a license and may be used and * * copied only in accordance with the terms of such license and * * with the inclusion of the above copyright notice. This * * software or any other copies thereof may not be provided or * * otherwise made available to any other person. No title to and * * ownership of the software is hereby transferred. * * * * This software is derived from software received from the * * University of California, Berkeley, and from Bell * * Laboratories. Use, duplication, or disclosure is subject to * * restrictions under license agreements with University of * * California and with AT&T. * * * * The information in this software is subject to change without * * notice and should not be construed as a commitment by Digital * * Equipment Corporation. * * * * Digital assumes no responsibility for the use or reliability * * of its software on equipment which is not supplied by Digital. * * * ************************************************************************//* * Copyright (c) 1983 Regents of the University of California. * All rights reserved. The Berkeley software License Agreement * specifies the terms and conditions for redistribution. *static char sccsid[] = "@(#)timedc.c 2.3 (Berkeley) 6/5/86"; */#include "timedc.h"#include <signal.h>#include <ctype.h>#include <setjmp.h>#include <syslog.h>int top;int margc;int fromatty;char *margv[20];char cmdline[200];jmp_buf toplevel;int intr();int priv_resources();struct cmd *getcmd();main(argc, argv) char *argv[];{ register struct cmd *c;/* openlog("timedc", LOG_ODELAY, LOG_AUTH);*/ openlog("timedc", LOG_NOTICE); /* * security dictates! */ if (priv_resources() < 0) { fprintf(stderr, "Could not get priviledged resources\n"); exit(1); } if (setuid(getuid()) < 0) { syslog(LOG_ERR, "setuid: %m"); exit(1); } if (--argc > 0) { c = getcmd(*++argv); if (c == (struct cmd *)-1) { printf("?Ambiguous command\n"); exit(1); } if (c == 0) { printf("?Invalid command\n"); exit(1); } if (c->c_priv && getuid()) { printf("?Privileged command\n"); exit(1); } (*c->c_handler)(argc, argv); exit(0); } fromatty = isatty(fileno(stdin)); top = setjmp(toplevel) == 0; if (top) (void) signal(SIGINT, intr); for (;;) { cmdscanner(top); top = 1; }}intr(){ if (!fromatty) exit(0); longjmp(toplevel, 1);}/* * Command parser. */cmdscanner(top) int top;{ register struct cmd *c; extern struct cmd cmdtab[]; extern int help(); if (!top) putchar('\n'); for (;;) { if (fromatty) { printf("timedc> "); (void) fflush(stdout); } if (gets(cmdline) == 0) quit(); if (cmdline[0] == 0) break; makeargv(); c = getcmd(margv[0]); if (c == (struct cmd *)-1) { printf("?Ambiguous command\n"); continue; } if (c == 0) { printf("?Invalid command\n"); continue; } if (c->c_priv && getuid()) { printf("?Privileged command\n"); continue; } (*c->c_handler)(margc, margv); } longjmp(toplevel, 0);}struct cmd *getcmd(name) register char *name;{ register char *p, *q; register struct cmd *c, *found; register int nmatches, longest; extern int NCMDS; longest = 0; nmatches = 0; found = 0; for (c = cmdtab; c < &cmdtab[NCMDS]; c++) { p = c->c_name; for (q = name; *q == *p++; q++) if (*q == 0) /* exact match? */ return(c); if (!*q) { /* the name was a prefix */ if (q - name > longest) { longest = q - name; nmatches = 1; found = c; } else if (q - name == longest) nmatches++; } } if (nmatches > 1) return((struct cmd *)-1); return(found);}/* * Slice a string up into argc/argv. */makeargv(){ register char *cp; register char **argp = margv; margc = 0; for (cp = cmdline; *cp;) { while (isspace(*cp)) cp++; if (*cp == '\0') break; *argp++ = cp; margc += 1; while (*cp != '\0' && !isspace(*cp)) cp++; if (*cp == '\0') break; *cp++ = '\0'; } *argp++ = 0;}#define HELPINDENT (sizeof ("directory"))/* * Help command. */help(argc, argv) int argc; char *argv[];{ register struct cmd *c; if (argc == 1) { register int i, j, w; int columns, width = 0, lines; extern int NCMDS; printf("Commands may be abbreviated. Commands are:\n\n"); for (c = cmdtab; c < &cmdtab[NCMDS]; c++) { int len = strlen(c->c_name); if (len > width) width = len; } width = (width + 8) &~ 7; columns = 80 / width; if (columns == 0) columns = 1; lines = (NCMDS + columns - 1) / columns; for (i = 0; i < lines; i++) { for (j = 0; j < columns; j++) { c = cmdtab + j * lines + i; printf("%s", c->c_name); if (c + lines >= &cmdtab[NCMDS]) { printf("\n"); break; } w = strlen(c->c_name); while (w < width) { w = (w + 8) &~ 7; putchar('\t'); } } } return; } while (--argc > 0) { register char *arg; arg = *++argv; c = getcmd(arg); if (c == (struct cmd *)-1) printf("?Ambiguous help command %s\n", arg); else if (c == (struct cmd *)0) printf("?Invalid help command %s\n", arg); else printf("%-*s\t%s\n", HELPINDENT, c->c_name, c->c_help); }}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?