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 + -
显示快捷键?