// a software tty 2 tty null modem // this is basicly the same as // http://david.fries.net/utilities/pty2pty.php // exept: // - it doesn't change terminal settings #include #include #include #include #include #include #include #include void fatalerror(const char *msg1, const char *msg2, int code){ fprintf(stderr, "%s: %s\n", msg1, msg2); exit(code); } void fatalsyserror(char *msg){ fatalerror(msg, strerror(errno), 1); } void usage(char *me){ fprintf(stderr, "%s \n", me ? me : "sterm"); } void writebuf(char *buffer, int bytes, int to){ while (bytes) { int rv = write(to, buffer, bytes); if (-1 == rv) { fatalsyserror("write error"); } bytes -= rv; buffer += rv; } } void hexify(char *in, char *out, int bytes){ char table[] = "0123456789ABCDEF"; while (bytes){ *out++ = table[(*in >> 8) & 0x0f]; *out++ = table[*in & 0x0f]; in++; bytes--; } } void writebuf_hexified(char *buffer, int bytes, int to){ char bbuffer[bytes*2]; hexify(buffer, bbuffer, bytes); writebuf(bbuffer, bytes*2, to); } void transfer(int from, int to){ int bufsize = 4096; char buffer[bufsize]; int rv; int bytes = read(from, buffer, bufsize); if (0 == bytes) { exit(0); } // EOF if (-1 == bytes) { fatalsyserror("read error"); } writebuf(buffer, bytes, to); } int main(int argc, char **argv){ if (argc != 3) { usage(argv[0]); exit(1); } int fd1 = open(argv[1], O_RDWR); if (-1 == fd1) { fatalsyserror(argv[1]); } int fd2 = open(argv[2], O_RDWR); if (-1 == fd2) { fatalsyserror(argv[2]); } int fdmax = ((fd1>fd2) ? fd1 : fd2) + 1; while(1){ // struct timeval tv = {0,0}; fd_set inset; FD_ZERO(&inset); FD_SET(fd1, &inset); FD_SET(fd2, &inset); if (-1 == select(fdmax, &inset, NULL, NULL, NULL)){ fatalsyserror("select()"); } if (FD_ISSET(fd1, &inset)){ transfer(fd1, fd2); } else if (FD_ISSET(fd2, &inset)){ transfer(fd2, fd1); } } }