Annotation of 42BSD/lib/libc/net/rcmd.c, revision 1.1

1.1     ! root        1: #ifndef lint
        !             2: static char sccsid[] = "@(#)rcmd.c     4.8 3/19/83";
        !             3: #endif
        !             4: 
        !             5: #include <stdio.h>
        !             6: #include <sys/types.h>
        !             7: #include <sys/socket.h>
        !             8: 
        !             9: #include <netinet/in.h>
        !            10: 
        !            11: #include <netdb.h>
        !            12: #include <errno.h>
        !            13: 
        !            14: extern errno;
        !            15: char   *index(), *sprintf();
        !            16: 
        !            17: rcmd(ahost, rport, locuser, remuser, cmd, fd2p)
        !            18:        char **ahost;
        !            19:        int rport;
        !            20:        char *locuser, *remuser, *cmd;
        !            21:        int *fd2p;
        !            22: {
        !            23:        int s, timo = 1;
        !            24:        struct sockaddr_in sin, sin2, from;
        !            25:        char c;
        !            26:        int lport = IPPORT_RESERVED - 1;
        !            27:        struct hostent *hp;
        !            28: 
        !            29:        hp = gethostbyname(*ahost);
        !            30:        if (hp == 0) {
        !            31:                fprintf(stderr, "%s: unknown host\n", *ahost);
        !            32:                return (-1);
        !            33:        }
        !            34:        *ahost = hp->h_name;
        !            35: retry:
        !            36:        s = rresvport(&lport);
        !            37:        if (s < 0)
        !            38:                return (-1);
        !            39:        sin.sin_family = hp->h_addrtype;
        !            40:        bcopy(hp->h_addr, (caddr_t)&sin.sin_addr, hp->h_length);
        !            41:        sin.sin_port = rport;
        !            42:        if (connect(s, (caddr_t)&sin, sizeof (sin), 0) < 0) {
        !            43:                if (errno == EADDRINUSE) {
        !            44:                        close(s);
        !            45:                        lport--;
        !            46:                        goto retry;
        !            47:                }
        !            48:                if (errno == ECONNREFUSED && timo <= 16) {
        !            49:                        (void) close(s);
        !            50:                        sleep(timo);
        !            51:                        timo *= 2;
        !            52:                        goto retry;
        !            53:                }
        !            54:                perror(hp->h_name);
        !            55:                return (-1);
        !            56:        }
        !            57:        lport--;
        !            58:        if (fd2p == 0) {
        !            59:                write(s, "", 1);
        !            60:                lport = 0;
        !            61:        } else {
        !            62:                char num[8];
        !            63:                int s2 = rresvport(&lport), s3;
        !            64: 
        !            65:                if (s2 < 0) {
        !            66:                        (void) close(s);
        !            67:                        return (-1);
        !            68:                }
        !            69:                listen(s2, 1);
        !            70:                (void) sprintf(num, "%d", lport);
        !            71:                if (write(s, num, strlen(num)+1) != strlen(num)+1) {
        !            72:                        perror("write: setting up stderr");
        !            73:                        (void) close(s2);
        !            74:                        goto bad;
        !            75:                }
        !            76:                { int len = sizeof (from);
        !            77:                  s3 = accept(s2, &from, &len, 0);
        !            78:                  close(s2);
        !            79:                  if (s3 < 0) {
        !            80:                        perror("accept");
        !            81:                        lport = 0;
        !            82:                        goto bad;
        !            83:                  }
        !            84:                }
        !            85:                *fd2p = s3;
        !            86:                from.sin_port = ntohs((u_short)from.sin_port);
        !            87:                if (from.sin_family != AF_INET ||
        !            88:                    from.sin_port >= IPPORT_RESERVED) {
        !            89:                        fprintf(stderr,
        !            90:                            "socket: protocol failure in circuit setup.\n");
        !            91:                        goto bad2;
        !            92:                }
        !            93:        }
        !            94:        (void) write(s, locuser, strlen(locuser)+1);
        !            95:        (void) write(s, remuser, strlen(remuser)+1);
        !            96:        (void) write(s, cmd, strlen(cmd)+1);
        !            97:        if (read(s, &c, 1) != 1) {
        !            98:                perror(*ahost);
        !            99:                goto bad2;
        !           100:        }
        !           101:        if (c != 0) {
        !           102:                while (read(s, &c, 1) == 1) {
        !           103:                        (void) write(2, &c, 1);
        !           104:                        if (c == '\n')
        !           105:                                break;
        !           106:                }
        !           107:                goto bad2;
        !           108:        }
        !           109:        return (s);
        !           110: bad2:
        !           111:        if (lport)
        !           112:                (void) close(*fd2p);
        !           113: bad:
        !           114:        (void) close(s);
        !           115:        return (-1);
        !           116: }
        !           117: 
        !           118: rresvport(alport)
        !           119:        int *alport;
        !           120: {
        !           121:        struct sockaddr_in sin;
        !           122:        int s;
        !           123: 
        !           124:        sin.sin_family = AF_INET;
        !           125:        sin.sin_addr.s_addr = 0;
        !           126:        s = socket(AF_INET, SOCK_STREAM, 0, 0);
        !           127:        if (s < 0)
        !           128:                return (-1);
        !           129:        for (;;) {
        !           130:                sin.sin_port = htons((u_short)*alport);
        !           131:                if (bind(s, (caddr_t)&sin, sizeof (sin), 0) >= 0)
        !           132:                        return (s);
        !           133:                if (errno != EADDRINUSE && errno != EADDRNOTAVAIL) {
        !           134:                        perror("socket");
        !           135:                        return (-1);
        !           136:                }
        !           137:                (*alport)--;
        !           138:                if (*alport == IPPORT_RESERVED/2) {
        !           139:                        fprintf(stderr, "socket: All ports in use\n");
        !           140:                        return (-1);
        !           141:                }
        !           142:        }
        !           143: }
        !           144: 
        !           145: ruserok(rhost, superuser, ruser, luser)
        !           146:        char *rhost;
        !           147:        int superuser;
        !           148:        char *ruser, *luser;
        !           149: {
        !           150:        FILE *hostf;
        !           151:        char ahost[32];
        !           152:        int first = 1;
        !           153: 
        !           154:        hostf = superuser ? (FILE *)0 : fopen("/etc/hosts.equiv", "r");
        !           155: again:
        !           156:        if (hostf) {
        !           157:                while (fgets(ahost, sizeof (ahost), hostf)) {
        !           158:                        char *user;
        !           159:                        if (index(ahost, '\n'))
        !           160:                                *index(ahost, '\n') = 0;
        !           161:                        user = index(ahost, ' ');
        !           162:                        if (user)
        !           163:                                *user++ = 0;
        !           164:                        if (!strcmp(rhost, ahost) &&
        !           165:                            !strcmp(ruser, user ? user : luser)) {
        !           166:                                (void) fclose(hostf);
        !           167:                                return (0);
        !           168:                        }
        !           169:                }
        !           170:                (void) fclose(hostf);
        !           171:        }
        !           172:        if (first == 1) {
        !           173:                first = 0;
        !           174:                hostf = fopen(".rhosts", "r");
        !           175:                goto again;
        !           176:        }
        !           177:        return (-1);
        !           178: }

unix.superglobalmegacorp.com

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