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

📄 cmds.c

📁 早期freebsd实现
💻 C
📖 第 1 页 / 共 2 页
字号:
timeout(){	signal(SIGALRM, timeout);	timedout = 1;}/* * Stolen from consh() -- puts a remote file on the output of a local command. *	Identical to consh() except for where stdout goes. */pipeout(c){	char buf[256];	int cpid, status, p;	time_t start;	putchar(c);	if (prompt("Local command? ", buf))		return;	kill(pid, SIGIOT);	/* put TIPOUT into a wait state */	signal(SIGINT, SIG_IGN);	signal(SIGQUIT, SIG_IGN);	ioctl(0, TIOCSETC, &defchars);	read(repdes[0], (char *)&ccc, 1);	/*	 * Set up file descriptors in the child and	 *  let it go...	 */	if ((cpid = fork()) < 0)		printf("can't fork!\r\n");	else if (cpid) {		start = time(0);		while ((p = wait(&status)) > 0 && p != cpid)			;	} else {		register int i;		dup2(FD, 1);		for (i = 3; i < 20; i++)			close(i);		signal(SIGINT, SIG_DFL);		signal(SIGQUIT, SIG_DFL);		execute(buf);		printf("can't find `%s'\r\n", buf);		exit(0);	}	if (boolean(value(VERBOSE)))		prtime("away for ", time(0)-start);	write(fildes[1], (char *)&ccc, 1);	ioctl(0, TIOCSETC, &tchars);	signal(SIGINT, SIG_DFL);	signal(SIGQUIT, SIG_DFL);}#ifdef CONNECT/* * Fork a program with: *  0 <-> remote tty in *  1 <-> remote tty out *  2 <-> local tty out */consh(c){	char buf[256];	int cpid, status, p;	time_t start;	putchar(c);	if (prompt("Local command? ", buf))		return;	kill(pid, SIGIOT);	/* put TIPOUT into a wait state */	signal(SIGINT, SIG_IGN);	signal(SIGQUIT, SIG_IGN);	ioctl(0, TIOCSETC, &defchars);	read(repdes[0], (char *)&ccc, 1);	/*	 * Set up file descriptors in the child and	 *  let it go...	 */	if ((cpid = fork()) < 0)		printf("can't fork!\r\n");	else if (cpid) {		start = time(0);		while ((p = wait(&status)) > 0 && p != cpid)			;	} else {		register int i;		dup2(FD, 0);		dup2(3, 1);		for (i = 3; i < 20; i++)			close(i);		signal(SIGINT, SIG_DFL);		signal(SIGQUIT, SIG_DFL);		execute(buf);		printf("can't find `%s'\r\n", buf);		exit(0);	}	if (boolean(value(VERBOSE)))		prtime("away for ", time(0)-start);	write(fildes[1], (char *)&ccc, 1);	ioctl(0, TIOCSETC, &tchars);	signal(SIGINT, SIG_DFL);	signal(SIGQUIT, SIG_DFL);}#endif/* * Escape to local shell */shell(){	int shpid, status;	extern char **environ;	char *cp;	printf("[sh]\r\n");	signal(SIGINT, SIG_IGN);	signal(SIGQUIT, SIG_IGN);	unraw();	if (shpid = fork()) {		while (shpid != wait(&status));		raw();		printf("\r\n!\r\n");		signal(SIGINT, SIG_DFL);		signal(SIGQUIT, SIG_DFL);		return;	} else {		signal(SIGQUIT, SIG_DFL);		signal(SIGINT, SIG_DFL);		if ((cp = rindex(value(SHELL), '/')) == NULL)			cp = value(SHELL);		else			cp++;		shell_uid();		execl(value(SHELL), cp, 0);		printf("\r\ncan't execl!\r\n");		exit(1);	}}/* * TIPIN portion of scripting *   initiate the conversation with TIPOUT */setscript(){	char c;	/*	 * enable TIPOUT side for dialogue	 */	kill(pid, SIGEMT);	if (boolean(value(SCRIPT)))		write(fildes[1], value(RECORD), size(value(RECORD)));	write(fildes[1], "\n", 1);	/*	 * wait for TIPOUT to finish	 */	read(repdes[0], &c, 1);	if (c == 'n')		printf("can't create %s\r\n", value(RECORD));}/* * Change current working directory of *   local portion of tip */chdirectory(){	char dirname[80];	register char *cp = dirname;	if (prompt("[cd] ", dirname)) {		if (stoprompt)			return;		cp = value(HOME);	}	if (chdir(cp) < 0)		printf("%s: bad directory\r\n", cp);	printf("!\r\n");}tipabort(msg)	char *msg;{	kill(pid, SIGTERM);	disconnect(msg);	if (msg != NOSTR)		printf("\r\n%s", msg);	printf("\r\n[EOT]\r\n");	daemon_uid();	(void)uu_unlock(uucplock);	unraw();	exit(0);}finish(){	char *dismsg;	if ((dismsg = value(DISCONNECT)) != NOSTR) {		write(FD, dismsg, strlen(dismsg));		sleep(5);	}	tipabort(NOSTR);}voidintcopy(){	raw();	quit = 1;	longjmp(intbuf, 1);}execute(s)	char *s;{	register char *cp;	if ((cp = rindex(value(SHELL), '/')) == NULL)		cp = value(SHELL);	else		cp++;	shell_uid();	execl(value(SHELL), cp, "-c", s, 0);}args(buf, a)	char *buf, *a[];{	register char *p = buf, *start;	register char **parg = a;	register int n = 0;	do {		while (*p && (*p == ' ' || *p == '\t'))			p++;		start = p;		if (*p)			*parg = p;		while (*p && (*p != ' ' && *p != '\t'))			p++;		if (p != start)			parg++, n++;		if (*p)			*p++ = '\0';	} while (*p);	return(n);}prtime(s, a)	char *s;	time_t a;{	register i;	int nums[3];	for (i = 0; i < 3; i++) {		nums[i] = (int)(a % quant[i]);		a /= quant[i];	}	printf("%s", s);	while (--i >= 0)		if (nums[i] || i == 0 && nums[1] == 0 && nums[2] == 0)			printf("%d %s%c ", nums[i], sep[i],				nums[i] == 1 ? '\0' : 's');	printf("\r\n!\r\n");}variable(){	char	buf[256];	if (prompt("[set] ", buf))		return;	vlex(buf);	if (vtable[BEAUTIFY].v_access&CHANGED) {		vtable[BEAUTIFY].v_access &= ~CHANGED;		kill(pid, SIGSYS);	}	if (vtable[SCRIPT].v_access&CHANGED) {		vtable[SCRIPT].v_access &= ~CHANGED;		setscript();		/*		 * So that "set record=blah script" doesn't		 *  cause two transactions to occur.		 */		if (vtable[RECORD].v_access&CHANGED)			vtable[RECORD].v_access &= ~CHANGED;	}	if (vtable[RECORD].v_access&CHANGED) {		vtable[RECORD].v_access &= ~CHANGED;		if (boolean(value(SCRIPT)))			setscript();	}	if (vtable[TAND].v_access&CHANGED) {		vtable[TAND].v_access &= ~CHANGED;		if (boolean(value(TAND)))			tandem("on");		else			tandem("off");	} 	if (vtable[LECHO].v_access&CHANGED) { 		vtable[LECHO].v_access &= ~CHANGED; 		HD = boolean(value(LECHO)); 	}	if (vtable[PARITY].v_access&CHANGED) {		vtable[PARITY].v_access &= ~CHANGED;		setparity();	}}/* * Turn tandem mode on or off for remote tty. */tandem(option)	char *option;{	struct sgttyb rmtty;	ioctl(FD, TIOCGETP, &rmtty);	if (strcmp(option,"on") == 0) {		rmtty.sg_flags |= TANDEM;		arg.sg_flags |= TANDEM;	} else {		rmtty.sg_flags &= ~TANDEM;		arg.sg_flags &= ~TANDEM;	}	ioctl(FD, TIOCSETP, &rmtty);	ioctl(0,  TIOCSETP, &arg);}/* * Send a break. */genbrk(){	ioctl(FD, TIOCSBRK, NULL);	sleep(1);	ioctl(FD, TIOCCBRK, NULL);}/* * Suspend tip */suspend(c)	char c;{	unraw();	kill(c == CTRL('y') ? getpid() : 0, SIGTSTP);	raw();}/* *	expand a file name if it includes shell meta characters */char *expand(name)	char name[];{	static char xname[BUFSIZ];	char cmdbuf[BUFSIZ];	register int pid, l, rc;	register char *cp, *Shell;	int s, pivec[2], (*sigint)();	if (!anyof(name, "~{[*?$`'\"\\"))		return(name);	/* sigint = signal(SIGINT, SIG_IGN); */	if (pipe(pivec) < 0) {		perror("pipe");		/* signal(SIGINT, sigint) */		return(name);	}	sprintf(cmdbuf, "echo %s", name);	if ((pid = vfork()) == 0) {		Shell = value(SHELL);		if (Shell == NOSTR)			Shell = _PATH_BSHELL;		close(pivec[0]);		close(1);		dup(pivec[1]);		close(pivec[1]);		close(2);		shell_uid();		execl(Shell, Shell, "-c", cmdbuf, 0);		_exit(1);	}	if (pid == -1) {		perror("fork");		close(pivec[0]);		close(pivec[1]);		return(NOSTR);	}	close(pivec[1]);	l = read(pivec[0], xname, BUFSIZ);	close(pivec[0]);	while (wait(&s) != pid);		;	s &= 0377;	if (s != 0 && s != SIGPIPE) {		fprintf(stderr, "\"Echo\" failed\n");		return(NOSTR);	}	if (l < 0) {		perror("read");		return(NOSTR);	}	if (l == 0) {		fprintf(stderr, "\"%s\": No match\n", name);		return(NOSTR);	}	if (l == BUFSIZ) {		fprintf(stderr, "Buffer overflow expanding \"%s\"\n", name);		return(NOSTR);	}	xname[l] = 0;	for (cp = &xname[l-1]; *cp == '\n' && cp > xname; cp--)		;	*++cp = '\0';	return(xname);}/* * Are any of the characters in the two strings the same? */anyof(s1, s2)	register char *s1, *s2;{	register int c;	while (c = *s1++)		if (any(c, s2))			return(1);	return(0);}

⌨️ 快捷键说明

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