Annotation of researchv9/ipc/src/servers/tcpd.c, revision 1.1.1.1

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: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.