|
|
1.1 ! root 1: #include <stdio.h> ! 2: #include <ctype.h> ! 3: #include <sys/inet/tcp_user.h> ! 4: ! 5: int debug; ! 6: ! 7: main(argc, argv) ! 8: int argc; ! 9: char **argv; ! 10: { ! 11: int myport; ! 12: int mysock; ! 13: struct in_service *sp; ! 14: struct tcpuser tu; ! 15: char *lname; ! 16: char *cmd; ! 17: char *catargs(); ! 18: ! 19: if (argc < 3) { ! 20: fprintf(stderr, "usage: tcpd service login [ cmd ]\n"); ! 21: exit(1); ! 22: } ! 23: if (isdigit(argv[1][0])) ! 24: myport = atoi(argv[1]); ! 25: else { ! 26: sp = in_service(argv[1], "tcp", 0); ! 27: if (sp == NULL) { ! 28: fprintf(stderr, "tcpd: unlisted service %s\n", argv[1]); ! 29: exit(1); ! 30: } ! 31: myport = sp->port; ! 32: } ! 33: tu.laddr = 0; ! 34: tu.lport = myport; ! 35: lname = argv[2]; ! 36: if (argc > 3 && strcmp(argv[3], "-x") == 0) { ! 37: debug++; ! 38: argv++; ! 39: argc--; ! 40: } ! 41: cmd = catargs(&argv[3], argc - 3); ! 42: if (debug) ! 43: fprintf(stderr, "starting: %d: %s: %s\n", myport, lname, cmd); ! 44: if ((mysock = tcp_sock()) < 0) { ! 45: fprintf(stderr, "tcpd: no socket\n"); ! 46: exit(1); ! 47: } ! 48: tu.fport = 0; ! 49: tu.faddr = 0; ! 50: tu.param = 0; ! 51: if (tcp_listen(mysock, &tu) < 0) { ! 52: fprintf(stderr, "tcpd: can't listen\n"); ! 53: exit(1); ! 54: } ! 55: for (;;) ! 56: daemon(mysock, lname, cmd); ! 57: } ! 58: ! 59: char * ! 60: catargs(ap, n) ! 61: register char **ap; ! 62: register int n; ! 63: { ! 64: static char buf[200]; ! 65: ! 66: if (n <= 0) ! 67: return (NULL); ! 68: while (--n >= 0) ! 69: strcat(buf, *ap++); ! 70: return (buf); ! 71: } ! 72: ! 73: daemon(s, lname, cmd) ! 74: int s; ! 75: char *lname; ! 76: char *cmd; ! 77: { ! 78: int fd; ! 79: int pid; ! 80: struct tcpuser tu; ! 81: ! 82: tu.lport = 0; ! 83: tu.laddr = 0; ! 84: tu.fport = 0; ! 85: tu.faddr = 0; ! 86: tu.param = 0; ! 87: if ((fd = tcp_accept(s, &tu)) < 0) { ! 88: fprintf(stderr, "uucpd: can't accept\n"); ! 89: perror("accept"); ! 90: return; ! 91: } ! 92: if (debug) ! 93: logconn(tu.faddr, tu.fport, fd); ! 94: if ((pid = fork()) < 0) { ! 95: fprintf(stderr, "uucpd: can't fork\n"); ! 96: close(fd); ! 97: return; ! 98: } ! 99: else if (pid != 0) { ! 100: close(fd); ! 101: while (wait((int *)0) != pid) ! 102: ; ! 103: return; ! 104: } ! 105: if ((pid = fork()) != 0) ! 106: _exit(1); ! 107: close(s); ! 108: dup2(fd, 0); ! 109: dup2(0, 1); ! 110: dup2(0, 2); ! 111: dup2(0, 3); ! 112: execl("/etc/login", "login", "-f", lname, cmd ? cmd: NULL, NULL); ! 113: perror("tcpd login"); ! 114: _exit(1); ! 115: } ! 116: ! 117: logconn(fa, fp, fd) ! 118: in_addr fa; ! 119: tcp_port fp; ! 120: int fd; ! 121: { ! 122: long t; ! 123: ! 124: time(&t); ! 125: fprintf(stderr, "%.15s conn from %s port %d fd %d\n", ! 126: ctime(&t)+4, in_ntoa(fa), fp, fd); ! 127: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.