⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 uuxqt.c

📁 unix v7是最后一个广泛发布的研究型UNIX版本
💻 C
字号:
#include "uucp.h"#include "uucpdefs.h"#include <sys/types.h>#include <sys/stat.h>#include <sys/dir.h>#define APPCMD(d) {\char *p;\for (p = d; *p != '\0';) *cmdp++ = *p++;\*cmdp++ = ' ';\*cmdp = '\0';}/* *	uuxqt will execute commands set up by a uux command, *	usually from a remote machine - set by uucp. */char *Cmds[] = {	"mail",	"rmail",	"lpr",	"opr",	"fsend",	"fget",	NULL	};#define CMDOK(a, b)	cmdok(a,b)#define PATH	"PATH=/bin:/usr/bin;"/*  to remove restrictions from uuxqt *  redefine CMDOK 0 * *  to add allowable commands, add to the list under Cmds[] */main(argc, argv)char *argv[];{	char xcmd[100];	int cmdnok;	char xfile[MAXFULLNAME], user[10], buf[BUFSIZ];	char lbuf[30];	char cfile[NAMESIZE], dfile[MAXFULLNAME];	char file[NAMESIZE];	char fin[MAXFULLNAME], sysout[NAMESIZE], fout[MAXFULLNAME];	FILE *xfp, *dfp, *fp;	char path[MAXFULLNAME];	char cmd[BUFSIZ];	char *cmdp, prm[MAXFULLNAME], *ptr;	char *getprm();	int uid, ret;	int stcico = 0;	Debug = 0;	Ofn = 1;	Ifn = 0;	while (argc>1 && argv[1][0] == '-') {		switch(argv[1][1]){		case 'x':			Debug = atoi(&argv[1][2]);			if (Debug <= 0)				Debug = 1;			break;		default:			sprintf(stderr, "unknown flag %s\n", argv[1]);				break;		}		--argc;  argv++;	}	DEBUG(4, "\n\n** %s **\n", "START");	chdir(Spool);	strcpy(Wrkdir, Spool);	uid = getuid();	guinfo(uid, User, path);	DEBUG(4, "User - %s\n", User);	if (ulockf(X_LOCK, X_LOCKTIME) != 0)		exit(0);	DEBUG(4, "process %s\n", "");	while (gtxfile(xfile) > 0) {		DEBUG(4, "xfile - %s\n", xfile);		xfp = fopen(xfile, "r");		ASSERT(xfp != NULL, "CAN'T OPEN %s", xfile);		/*  initialize to default  */		strcpy(user, User);		strcpy(fin, "/dev/null");		strcpy(fout, "/dev/null");		sprintf(sysout, "%.7s", Myname);		while (fgets(buf, BUFSIZ, xfp) != NULL) {			switch (buf[0]) {			case X_USER:				sscanf(&buf[1], "%s%s", user, Rmtname);				break;			case X_STDIN:				sscanf(&buf[1], "%s", fin);				expfile(fin);				break;			case X_STDOUT:				sscanf(&buf[1], "%s%s", fout, sysout);				sysout[7] = '\0';				if (fout[0] != '~' || prefix(sysout, Myname))					expfile(fout);				break;			case X_CMD:				strcpy(cmd, &buf[2]);				if (*(cmd + strlen(cmd) - 1) == '\n')					*(cmd + strlen(cmd) - 1) = '\0';				break;			default:				break;			}		}		fclose(xfp);		DEBUG(4, "fin - %s, ", fin);		DEBUG(4, "fout - %s, ", fout);		DEBUG(4, "sysout - %s, ", sysout);		DEBUG(4, "user - %s\n", user);		DEBUG(4, "cmd - %s\n", cmd);		/*  command execution  */		if (strcmp(fout, "/dev/null") == SAME)			strcpy(dfile,"/dev/null");		else			gename(DATAPRE, sysout, 'O', dfile);		/* expand file names where necessary */		expfile(dfile);		strcpy(buf, PATH);		cmdp = buf + strlen(buf);		ptr = cmd;		xcmd[0] = '\0';		cmdnok = 0;		while ((ptr = getprm(ptr, prm)) != NULL) {			if (prm[0] == ';' || prm[0] == '^'			  || prm[0] == '|') {				xcmd[0] = '\0';				APPCMD(prm);				continue;			}			if ((cmdnok = CMDOK(xcmd, prm)) != 0) 				/*  command not valid  */				break;			if (prm[0] == '~')				expfile(prm);			APPCMD(prm);		}		if (cmdnok) {			sprintf(lbuf, "%s XQT DENIED", user);			logent(cmd, lbuf);			DEBUG(4, "bad command %s\n", prm);			goto rmfiles;		}		sprintf(lbuf, "%s XQT", user);		logent(buf, lbuf);		DEBUG(4, "cmd %s\n", buf);		mvxfiles(xfile);		chdir(XQTDIR);		ret = shio(buf, fin, dfile, user);		DEBUG(4, "exit cmd - %d\n", ret);		chdir(Spool);		rmxfiles(xfile);		if (ret != 0) {			/*  exit status not zero */			dfp = fopen(dfile, "a");			ASSERT(dfp != NULL, "CAN'T OPEN %s", dfile);			fprintf(dfp, "exit status %d", ret);			fclose(dfp);		}		if (strcmp(fout, "/dev/null") != SAME) {			if (prefix(sysout, Myname)) {				xmv(dfile, fout);			}			else {				gename(CMDPRE, sysout, 'O', cfile);				fp = fopen(cfile, "w");				ASSERT(fp != NULL, "OPEN %s", cfile);				chmod(cfile, 0666);				fprintf(fp, "S %s %s %s - %s 0666\n",				dfile, fout, user, lastpart(dfile));				fclose(fp);			}		}	rmfiles:		xfp = fopen(xfile, "r");		ASSERT(xfp != NULL, "CAN'T OPEN %s", xfile);		while (fgets(buf, BUFSIZ, xfp) != NULL) {			if (buf[0] != X_RQDFILE)				continue;			sscanf(&buf[1], "%s", file);			unlink(file);		}		unlink(xfile);	}	if (stcico)		xuucico("");	cleanup(0);}cleanup(code)int code;{	logcls();	rmlock(NULL);	exit(code);}/******* *	gtxfile(file)	get a file to execute *	char *file; * *	return codes:  0 - no file  |  1 - file to execute */gtxfile(file)char *file;{	static FILE *pdir;	char pre[2];	if (pdir == NULL) {		pdir = fopen(Spool, "r");		ASSERT(pdir != NULL, "GTXFILE CAN'T OPEN %s", Spool);	}	pre[0] = XQTPRE;	pre[1] = '\0';	while (gnamef(pdir, file) != 0) {		DEBUG(4, "file - %s\n", file);		if (!prefix(pre, file))			continue;		if (gotfiles(file))			/*  return file to execute */			return(1);	}	fclose(pdir);	return(0);}/*** *	gotfiles(file)		check for needed files *	char *file; * *	return codes:  0 - not ready  |  1 - all files ready */gotfiles(file)char *file;{	struct stat stbuf;	FILE *fp;	char buf[BUFSIZ], rqfile[MAXFULLNAME];	fp = fopen(file, "r");	if (fp == NULL)		return(0);	while (fgets(buf, BUFSIZ, fp) != NULL) {		DEBUG(4, "%s\n", buf);		if (buf[0] != X_RQDFILE)			continue;		sscanf(&buf[1], "%s", rqfile);		expfile(rqfile);		if (stat(rqfile, &stbuf) == -1) {			fclose(fp);			return(0);		}	}	fclose(fp);	return(1);}/*** *	rmxfiles(xfile)		remove execute files to x-directory *	char *xfile; * *	return codes - none */rmxfiles(xfile)char *xfile;{	FILE *fp;	char buf[BUFSIZ], file[NAMESIZE], tfile[NAMESIZE];	char tfull[MAXFULLNAME];	if((fp = fopen(xfile, "r")) == NULL)		return;	while (fgets(buf, BUFSIZ, fp) != NULL) {		if (buf[0] != X_RQDFILE)			continue;		if (sscanf(&buf[1], "%s%s", file, tfile) < 2)			continue;		sprintf(tfull, "%s/%s", XQTDIR, tfile);		unlink(tfull);	}	fclose(fp);	return;}/*** *	mvxfiles(xfile)		move execute files to x-directory *	char *xfile; * *	return codes - none */mvxfiles(xfile)char *xfile;{	FILE *fp;	char buf[BUFSIZ], ffile[MAXFULLNAME], tfile[NAMESIZE];	char tfull[MAXFULLNAME];	int ret;	if((fp = fopen(xfile, "r")) == NULL)		return;	while (fgets(buf, BUFSIZ, fp) != NULL) {		if (buf[0] != X_RQDFILE)			continue;		if (sscanf(&buf[1], "%s%s", ffile, tfile) < 2)			continue;		expfile(ffile);		sprintf(tfull, "%s/%s", XQTDIR, tfile);		unlink(tfull);		ret = link(ffile, tfull);		ASSERT(ret == 0, "LINK RET-%d", ret);		unlink(ffile);	}	fclose(fp);	return;}/*** *	cmdok(xc, cmd)		check for valid command *	char *xc, *cmd; * *	return 0 - ok | 1 nok */cmdok(xc, cmd)char *xc, *cmd;{	char **ptr;	if (xc[0] != '\0')		return(0);	ptr = Cmds;	while(*ptr != NULL) {DEBUG(4, "cmd %s, ", cmd);DEBUG(4, "ptr %s\n", *ptr);		if (strcmp(cmd, *ptr) == SAME)			break;	ptr++;	}	if (*ptr == NULL)		return(1);	strcpy(xc, cmd);	return(0);}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -