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

📄 tip.c

📁 linux系统环境下的tip拨号程序,可移植到ARM
💻 C
📖 第 1 页 / 共 2 页
字号:
	}	while ((n = read(fd, ibuf, sizeof(ibuf))) > 0) {		bp = ibuf;		while (n > 0) {			FD_ZERO(&outfds);			FD_SET(rfd, &infds);			FD_SET(rfd, &outfds);			if (select(rfd + 1, &infds, &outfds, NULL, NULL) <= 0)				break;			if (FD_ISSET(rfd, &infds)) {				rc = read(rfd, obuf, sizeof(obuf));				if (rc <= 0) {					close(fd);					return;				}				write(ofd, obuf, rc);			}			if (FD_ISSET(rfd, &outfds)) {				rc = write(rfd, bp, 1);				if (rc <= 0)					break;				n -= rc;				bp += rc;			}		}	}	close(fd);}/*****************************************************************************//* *	Do the connection session. Pass data between local and remote *	ports. */int loopit(){	fd_set	infds;	char	*bp;	int	maxfd, n;	int	partialescape = 0;	maxfd = ifd;	if (maxfd < rfd)		maxfd = rfd;	maxfd++;	for (;;) {		FD_ZERO(&infds);		FD_SET(ifd, &infds);		FD_SET(rfd, &infds);		if (select(maxfd, &infds, NULL, NULL, NULL) < 0) {			fprintf(stderr, "ERROR: select() failed, errno=%d\n",				errno);			exit(1);		}		if (FD_ISSET(rfd, &infds)) {			bp = ibuf;			if ((n = read(rfd, ibuf, sizeof(ibuf))) < 0) {				fprintf(stderr, "ERROR: read(fd=%d) failed, "					"errno=%d\n", rfd, errno);				exit(1);			}			if (n == 0)				break;			if (translate) {				n = translateread(ibuf, obuf, n);				bp = obuf;			}			if (write(ofd, bp, n) < 0) {				fprintf(stderr, "ERROR: write(fd=%d) failed, "					"errno=%d\n", 1, errno);				exit(1);			}			if (cfd > 0)				write(cfd, bp, n);		}		if (FD_ISSET(ifd, &infds)) {			bp = ibuf;			if ((n = read(ifd, ibuf, sizeof(ibuf))) < 0) {				fprintf(stderr, "ERROR: read(fd=%d) failed, "					"errno=%d\n", 1, errno);				exit(1);			}			if (n == 0)				break;#ifdef ALTERNATE			if ((n == 1) && (*bp == 26))				break;#else			if ((n == 1) && (*bp == 0x1d))				break;			if ((n == 1) && (*bp == 0x1))				break;#endif			if (partialescape) {				partialescape = 0;				if (*bp == '.')					break;				else if (*bp == 's') {					send_file();					continue;				}			} else {				partialescape = ((n == 1) && (*bp == '~')) ? 1 : 0;				if (partialescape)					continue;			}			if (translate) {				n = translatewrite(ibuf, obuf, n);				bp = obuf;			}			if (write(rfd, bp, n) < 0) {				fprintf(stderr, "ERROR: write(rfd=%d) failed, "					"errno=%d\n", rfd, errno);				exit(1);			}		}	}	return (0);}/*****************************************************************************/int opensoc(void){	struct sockaddr_in	s;	struct sockaddr		p;	socklen_t		plen;	int			fd;	if ((fd = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) < 0) {		fprintf(stderr, "ERROR: failed to create socket(), "			"errno=%d\n", errno);		exit(1);	}	s.sin_family = AF_INET;	s.sin_addr.s_addr = htonl(INADDR_ANY);	s.sin_port = htons(tcpport);	if (bind(fd, (struct sockaddr *) &s, sizeof(s)) < 0) {		fprintf(stderr, "ERROR: failed to bind() socket, "			"errno=%d\n", errno);		exit(1);	}	if (listen(fd, 1) < 0) {		fprintf(stderr, "ERROR: failed to listen() socket, "			"errno=%d\n", errno);		exit(1);	}	plen = sizeof(p);	if ((ifd = accept(fd, &p, &plen)) < 0) {		fprintf(stderr, "ERROR: failed to accept() on socket, "			"errno=%d\n", errno);		exit(1);	}	close(fd);	ofd = ifd;}/*****************************************************************************/void usage(FILE *fp, int rc){	fprintf(fp, "Usage: tip [-?heonxrwcqt125678] [-s speed] [-w file] "		"[-p tcpport] [-l device] [device]\n\n"		"\t-h?\tthis help\n"		"\t-q\tquiet mode (no helpful messages)\n"		"\t-1\t1 stop bits (default)\n"		"\t-2\t2 stop bits\n"		"\t-5\t5 data bits\n"		"\t-6\t6 data bits\n"		"\t-7\t7 data bits\n"		"\t-8\t8 data bits (default)\n"		"\t-e\teven parity\n"		"\t-o\todd parity\n"		"\t-n\tno parity (default)\n"		"\t-c\tuse clocal mode (no disconnect)\n"		"\t-t\ttranslate 5 bit codes to ascii\n"		"\t-x\tuse software flow (xon/xoff)\n"		"\t-r\tuse hardware flow (rts/cts)\n"		"\t-f\tpass xon/xoff flow control to remote\n"		"\t-s\tbaud rate (default 9600)\n"		"\t-w\tcapture remote output to local file\n"		"\t-p\tbind to tcpport instead of using stdin/stdout\n"		"\t-l\tdevice to use\n"		"\t-d\tdownload file name\n");	exit(rc);}/*****************************************************************************/int main(int argc, char *argv[]){	int	c;	ifd = 0;	ofd = 1;	gotdevice = 0;	while ((c = getopt(argc, argv, "?heonxrcqtf125678w:s:p:l:d:")) > 0) {		switch (c) {		case 'v':			printf("%s: version %s\n", argv[0], version);			exit(0);		case '1':			twostopb = 0;			break;		case '2':			twostopb = 1;			break;		case '5':			databits = 5;			break;		case '6':			databits = 6;			break;		case '7':			databits = 7;			break;		case '8':			databits = 8;			break;		case 't':			translate++;			break;		case 'r':			hardware++;			break;		case 'x':			software++;			break;		case 'f':			passflow++;			break;		case 'o':			parity = PARITY_ODD;			break;		case 'e':			parity = PARITY_EVEN;			break;		case 'n':			parity = PARITY_NONE;			break;		case 's':			baud = atoi(optarg);			if (baud2flag(baud) < 0) {				fprintf(stderr,					"ERROR: baud speed specified %d\n",					baud);				exit(1);			}			break;		case 'c':			clocal++;			break;		case 'q':			verbose = 0;			break;		case 'w':			capfile = optarg;			break;		case 'l':			gotdevice++;			devname = optarg;			break;		case 'p':			tcpport = atoi(optarg);			break;		case 'd':			filename = optarg;			break;		case 'h':		case '?':			usage(stdout, 0);			break;		default:			fprintf(stderr, "ERROR: unkown option '%c'\n", c);			usage(stderr, 1);			break;		}	}	if ((optind < argc) && (gotdevice == 0)) {		gotdevice++;		devname = argv[optind++];	}	if (gotdevice == 0) {		fprintf(stderr, "ERROR: no device specified\n");		usage(stderr, 1);	}	if (optind < argc) {		fprintf(stderr, "ERROR: too many arguments\n");		usage(stderr, 1);	}	/*	 *	Check device is real, and open it.  If it is format IP:port	 *	then it is a TCP connection to IP, port N.	 */	if (strchr(devname, ':')) {		struct sockaddr_in	s;		char			*port;				port = strchr(devname, ':');		*port++ = '\0';		if ((rfd = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) < 0) {			fprintf(stderr, "ERROR: failed to create socket(), "				"errno=%d\n", errno);			exit(1);		}		s.sin_family = AF_INET;		if (inet_aton(devname, &s.sin_addr) == 0) {			fprintf(stderr, "ERROR: IP address not in W.X.Y.Z format\n");			exit(1);		}		s.sin_port = htons(atoi(port));		if (connect(rfd, (struct sockaddr *) &s, sizeof(s)) < 0) {			fprintf(stderr, "ERROR: failed to bind() socket, "				"errno=%d\n", errno);			exit(1);		}		net_connection = 1;	} else if ((rfd = open(devname, (O_RDWR | O_NDELAY))) < 0) {		fprintf(stderr, "ERROR: failed to open %s, errno=%d\n",			devname, errno);		exit(0);	}	if (capfile != NULL) {		if ((cfd = open(capfile, (O_WRONLY | O_TRUNC | O_CREAT), 0660)) < 0) {			fprintf(stderr, "ERROR: failed to open(%s), errno=%d\n",				capfile, errno);			exit(0);		}	}	if (tcpport) {		opensoc();	} else {		savelocaltermios();		setlocaltermios();		printf("Connected.\n");	}	if (!net_connection) {	    saveremotetermios();	    setremotetermios();	}	/*	 *	Set the signal handler to restore the old termios .	 */	sact.sa_handler = sighandler;	sigaction(SIGHUP, &sact, NULL);	sigaction(SIGINT, &sact, NULL);	sigaction(SIGQUIT, &sact, NULL);	sigaction(SIGPIPE, &sact, NULL);	sigaction(SIGTERM, &sact, NULL);	loopit();	if (tcpport) {		close(ifd);		close(ofd);	} else {		printf("Disconnected.\n");		if (!net_connection)		    restoreremotetermios();		restorelocaltermios();	}	if (cfd > 0)		close(cfd);	close(rfd);	exit(0);}/*****************************************************************************/

⌨️ 快捷键说明

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