Annotation of researchv9/ipc/src/servers/tcpd.c, revision 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.