📄 tip.c
字号:
} 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 + -