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

📄 cmds.c

📁 <B>Digital的Unix操作系统VAX 4.2源码</B>
💻 C
📖 第 1 页 / 共 2 页
字号:
#ifndef lintstatic char *sccsid = "@(#)cmds.c	4.1      ULTRIX  7/17/90";#endif lint/************************************************************************ *									* *			Copyright (c) 1984,1985,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.	* *									* ************************************************************************/#include "tip.h"/* * tip * * miscellaneous commands * *	EDIT HISTORY: *	13-Jun-1988	Randall Brown *		Changed the set variable command so that the baudrate *		can be changed by the user. * *	09-Jun-1988	Mark Parenti *		Changed signal handlers to void. * *	26-Aug-1986	Marc Teitelbaum *		Fix scripting.  When tip was folded to a single process, *		the signaling of the reader process to the writer process *		was never removed.  SIGEMT was used by the reader to *		signal the writer that scripting was to take place.  When  *		the tip process was folded into one, it didn't *		know what to do with the SIGEMT sigal - so it died.  The one  *		other signal that needs investigation is SIGIOT - (which is  *		erroneously documented in tipout.c as being the scripting  *		signal). */int	quant[] = { 60, 60, 24 };char	null = '\0';char	*sep[] = { "second", "minute", "hour" };static char *argv[10];		/* argument vector for take and put */void	timeout();		/* timeout function called on alarm */void	stopsnd();		/* SIGINT handler during file transfers */int	intprompt();		/* used in handling SIG_INT during prompt */void	intcopy();		/* interrupt routine for file transfers */extern int bauds[];		/* array of legal baud rates *//* * FTP - remote ==> local *  get a file from the remote host */getfl(c)	char c;{	char buf[256], *cp, *expand();	putchar(c);	/*	 * get the UNIX receiving file's name	 */	if (prompt("Local file name? ", copyname))		return;	cp = expand(copyname);	if ((sfd = creat(cp, 0666)) < 0) {		printf("\r\n%s: cannot creat\r\n", copyname);		return;	}	/*	 * collect parameters	 */	if (prompt("List command for remote system? ", buf)) {		unlink(copyname);		return;	}	transfer(buf, sfd, value(EOFREAD));}/* * Cu-like take command */cu_take(cc)	char cc;{	int fd, argc;	char line[BUFSIZ], *expand(), *cp;	if (prompt("[take] ", copyname))		return;	if ((argc = args(copyname, argv)) < 1 || argc > 2) {		printf("usage: <take> from [to]\r\n");		return;	}	if (argc == 1)		argv[1] = argv[0];	cp = expand(argv[1]);	if ((fd = creat(cp, 0666)) < 0) {		printf("\r\n%s: cannot create\r\n", argv[1]);		return;	}	sprintf(line, "cat %s;echo \01", argv[0]);	transfer(line, fd, "\01");}static	jmp_buf intbuf;/* * Bulk transfer routine -- *  used by getfl(), cu_take(), and pipefile() */transfer(buf, fd, eofchars)	char *buf, *eofchars;{	register int ct;	char c, buffer[BUFSIZ];#ifdef bufread	char *cp,ibuffer[BUFSIZ];	int icnt;	caddr_t incnt;#endif	register char *p = buffer;	register int cnt, eof = 0;	time_t start;	void (*f)();	pwrite(FD, buf, size(buf));	quit = 0;	/*	 * finish command	 */	pwrite(FD, "\r", 1);	do		read(FD, &c, 1);	while ((c&0177) != '\n');	ioctl(0, TIOCSETC, &defchars);#ifdef bufread	sleep(1);	/* let the transfer get started */#endif	f = signal(SIGINT, intcopy);	start = time(0);	(void) setjmp(intbuf);	for (ct = 0; !quit;) {#ifdef bufread		if(!typeahead((1<<FD), 10, 0))	    /* wait for file transfer to begin */			eof = 1;	    /* Timed out waiting for file */		(void) ioctl(FD, FIONREAD, &incnt);		icnt = read(FD, &ibuffer[0], (int) incnt < BUFSIZ ? (int) incnt :  BUFSIZ);		if(icnt <= 0)			eof = 1;		for (cp = &ibuffer[0]; icnt > 0; cp++) {		c = *cp;		c &= 0177;#else		eof = read(FD, &c, 1) <= 0;		c &= 0177;#endif		if (quit)#ifndef bufread			continue;#else			goto fini;#endif		if (eof || any(c, eofchars))#ifndef bufread			break;#else			goto fini;#endif		if (c == 0)#ifndef bufread			continue;	/* ignore nulls */#else			goto cont;#endif		if (c == '\r')#ifndef bufread			continue;#else			goto cont;#endif		*p++ = c;		if (c == '\n' && boolean(value(VERBOSE)))			printf("\r%d", ++ct);		if ((cnt = (p-buffer)) == number(value(FRAMESIZE))) {			if (write(fd, buffer, cnt) != cnt) {				printf("\r\nwrite error\r\n");				quit = 1;			}			p = buffer;		}#ifdef bufreadcont:		icnt--;	    }#endif	}#ifdef bufreadfini:#endif	if (cnt = (p-buffer))		if (write(fd, buffer, cnt) != cnt)			printf("\r\nwrite error\r\n");	if (boolean(value(VERBOSE)))		prtime(" lines transferred in ", time(0)-start);	ioctl(0, TIOCSETC, &tchars);	signal(SIGINT, SIG_DFL);	close(fd);}/* * FTP - remote ==> local process *   send remote input to local process via pipe */pipefile(){	int cpid, pdes[2];	char buf[256];	int status, p;	extern int errno;	if (prompt("Local command? ", buf))		return;	if (pipe(pdes)) {		printf("can't establish pipe\r\n");		return;	}	if ((cpid = fork()) < 0) {		printf("can't fork!\r\n");		return;	} else if (cpid) {		if (prompt("List command for remote system? ", buf)) {			close(pdes[0]), close(pdes[1]);			kill (cpid, SIGKILL);		} else {			close(pdes[0]);			signal(SIGPIPE, intcopy);			transfer(buf, pdes[1], value(EOFREAD));			signal(SIGPIPE, SIG_DFL);			while ((p = wait(&status)) > 0 && p != cpid)				;		}	} else {		register int f;		dup2(pdes[0], 0);		close(pdes[0]);		for (f = 3; f < 20; f++)			close(f);		execute(buf);		printf("can't execl!\r\n");		exit(0);	}}/* * Interrupt service routine for FTP */voidstopsnd(){	stop = 1;	signal(SIGINT, SIG_IGN);}/* * FTP - local ==> remote *  send local file to remote host *  terminate transmission with pseudo EOF sequence */sendfile(cc)	char cc;{	FILE *fd;	char *fnamex;	char *expand();	putchar(cc);	/*	 * get file name	 */	if (prompt("Local file name? ", fname))		return;	/*	 * look up file	 */	fnamex = expand(fname);	if ((fd = fopen(fnamex, "r")) == NULL) {		printf("%s: cannot open\r\n", fname);		return;	}	transmit(fd, value(EOFWRITE), NULL);	if (!boolean(value(ECHOCHECK))) {		struct sgttyb buf;		ioctl(FD, TIOCGETP, &buf);	/* this does a */		ioctl(FD, TIOCSETP, &buf);	/*   wflushtty */	}}/* * Bulk transfer routine to remote host -- *   used by sendfile() and cu_put() */	extern int maskout;transmit(fd, eofchars, command)	FILE *fd;	char *eofchars, *command;{	char *pc, lastc;	int c, ccount, lcount;	time_t start_t, stop_t;	signal(SIGINT, stopsnd);	stop = 0;	ioctl(0, TIOCSETC, &defchars);	if (command != NULL) {		for (pc = command; *pc; pc++)			send(*pc);		if (boolean(value(ECHOCHECK)))			read(FD, (char *)&c, 1);	/* trailing \n */		else {			struct sgttyb buf;			ioctl(FD, TIOCGETP, &buf);	/* this does a */			ioctl(FD, TIOCSETP, &buf);	/*   wflushtty */			sleep(5); /* wait for remote stty to take effect */		}	}	lcount = 0;	lastc = '\0';	start_t = time(0);	while (1) {		ccount = 0;		do {			c = getc(fd);			if (stop)				goto out;			if (c == EOF)				goto out;			if (c == 0177 && !boolean(value(RAWFTP)))				continue;			lastc = c;			if (c < 040) {				if (c == '\n') {					if (!boolean(value(RAWFTP)))						c = '\r';				}				else if (c == '\t') {					if (!boolean(value(RAWFTP))) {						if (boolean(value(TABEXPAND))) {							send(' ');							while ((++ccount % 8) != 0)								send(' ');							continue;						}					}				} else					if (!boolean(value(RAWFTP)))						continue;			}			send(c);		} while (c != '\r' && !boolean(value(RAWFTP)));		if (boolean(value(VERBOSE)))			printf("\r%d", ++lcount);		if (boolean(value(ECHOCHECK))) {			timedout = 0;			do {	/* wait for prompt */				if(!typeahead(maskout, (long) value(ETIMEOUT), 0))					timedout = 1;				else					read(FD, (char *)&c, 1);				if (timedout || stop) {					if (timedout)						printf("\r\ntimed out at eol\r\n");					goto out;				}			} while ((c&0177) != character(value(PROMPT)));			alarm(0);		}	}out:	if (lastc != '\n' && !boolean(value(RAWFTP)))		send('\r');	for (pc = eofchars; *pc; pc++)		send(*pc);	stop_t = time(0);	fclose(fd);	signal(SIGINT, SIG_DFL);	if (boolean(value(VERBOSE)))		if (boolean(value(RAWFTP)))			prtime(" chars transferred in ", stop_t-start_t);		else			prtime(" lines transferred in ", stop_t-start_t);	ioctl(0, TIOCSETC, &tchars);}/* * Cu-like put command */cu_put(cc)	char cc;{	FILE *fd;	char line[BUFSIZ];	int argc;	char *expand();	char *copynamex;	if (prompt("[put] ", copyname))		return;	if ((argc = args(copyname, argv)) < 1 || argc > 2) {		printf("usage: <put> from [to]\r\n");		return;	}	if (argc == 1)		argv[1] = argv[0];	copynamex = expand(argv[0]);	if ((fd = fopen(copynamex, "r")) == NULL) {		printf("%s: cannot open\r\n", copynamex);		return;	}	if (boolean(value(ECHOCHECK)))		sprintf(line, "cat>%s\r", argv[1]);	else

⌨️ 快捷键说明

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