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

📄 cmds.c

📁 <B>Digital的Unix操作系统VAX 4.2源码</B>
💻 C
📖 第 1 页 / 共 2 页
字号:
		sprintf(line, "stty -echo;cat>%s;stty echo\r", argv[1]);	transmit(fd, "\04", line);}/* * FTP - send single character *  wait for echo & handle timeout */send(c)	char c;{	char cc;	int retry = 0;	cc = c;	pwrite(FD, &cc, 1);#ifdef notdef	if (number(value(CDELAY)) > 0 && c != '\r')		nap(number(value(CDELAY)));#endif	if (!boolean(value(ECHOCHECK))) {#ifdef notdef		if (number(value(LDELAY)) > 0 && c == '\r')			nap(number(value(LDELAY)));#endif		return;	}tryagain:	timedout = 0;	if(!typeahead(maskout, (long) value(ETIMEOUT), 0))		timedout = 1;	else		read(FD, &cc, 1);	if (timedout) {		printf("\r\ntimeout error (%s)\r\n", ctrl(c));		if (retry++ > 3)			return;		pwrite(FD, &null, 1); /* poke it */		goto tryagain;	}}voidtimeout(){	signal(SIGALRM, timeout);	timedout = 1;}#ifdef CONNECT/* * Fork a program with: *  0 <-> local tty in *  1 <-> local tty out *  2 <-> local tty out *  3 <-> remote tty in *  4 <-> remote tty out */consh(c){	char buf[256];	int cpid, status, p;	time_t start;	putchar(c);	if (prompt("Local command? ", buf))		return;	signal(SIGINT, SIG_IGN);	signal(SIGQUIT, SIG_IGN);	ioctl(0, TIOCSETC, &defchars);	/*	 * 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, 3);		dup2(3, 4);		for (i = 5; 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);	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++;		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	 */	if (boolean(value(SCRIPT))) {		/* this used to be where the SIGEMT signal was sent - marc */		if (boolean(value(SCRIPT)) && fscript != NULL)			fclose(fscript);		if ((fscript = fopen(value(RECORD), "a")) == NULL)			printf("can't create %s\r\n", value(RECORD));		else			boolean(value(SCRIPT)) = TRUE;	} else {		boolean(value(SCRIPT)) = FALSE;	}}/* * 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");}finish(){	char *dismsg;	if ((dismsg = value(DISCONNECT)) != NOSTR) {		write(FD,dismsg,strlen(dismsg));		sleep(5);	}	if (boolean(value(SCRIPT)) && fscript != NULL)		fclose(fscript);	disconnect();	printf("\r\n[EOT]\r\n");	delock(uucplock);	unraw();	exit(0);}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++;	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])			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;	}	if (vtable[BAUDRATE].v_access&CHANGED) {	    	vtable[BAUDRATE].v_access &= ~CHANGED;		setbaudrate();	}	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();	}}/* * Checks the new baudrate to see if valid. If it is, then the line * is reset to that baudrate, else it is left to the existing baudrate * and the vtable[BAUDRATE] entry is set to the old baudrate. */setbaudrate(){    int i;    if ((i = speed(number(value(BAUDRATE)))) == NULL) {	printf("bad baud rate, resetting to old value\r\n");	resetbdrate();    } else {	ttysetup(i);    }}/* * Resets the vtable value of the baudrate to that of the line */resetbdrate(){    struct sgttyb tty;    ioctl(FD, TIOCGETP, &tty);    number(value(BAUDRATE)) = bauds[tty.sg_ispeed];}/* * 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(){	unraw();	kill(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 = "/bin/sh";		close(pivec[0]);		close(1);		dup(pivec[1]);		close(pivec[1]);		close(2);		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 + -