Annotation of researchv8dc/cmd/inet/libin/tcp_lib.c, revision 1.1.1.1

1.1       root        1: #include <sys/inet/tcp_user.h>
                      2: #include <ctype.h>
                      3: #include <stdio.h>
                      4: #include <errno.h>
                      5: #include "config.h"
                      6: 
                      7: extern errno;
                      8: unsigned int tcp_localaddr = INADDR_ANY;
                      9: unsigned int tcp_acceptaddr;
                     10: 
                     11: tcp_sock()
                     12: {
                     13:        int fd, n;
                     14:        char name[32];
                     15: 
                     16:        for(n = 01; n < 100; n += 2){
                     17:                sprintf(name, "/dev/tcp%02d", n);
                     18:                fd = open(name, 2);
                     19:                if(fd >= 0)
                     20:                        return(fd);
                     21:                if(errno != ENXIO)
                     22:                        break;
                     23:        }
                     24:        perror(name);
                     25:        return(-1);
                     26: }
                     27: 
                     28: tcp_connect(fd, lport, faddr, fport)
                     29: int fd;
                     30: tcp_port lport, fport;
                     31: in_addr faddr;
                     32: {
                     33:        struct tcpreply tr;
                     34: 
                     35:        errno = 0;
                     36:        if(tcp_cmd(fd, TCPC_CONNECT, lport, faddr, fport) < 0)
                     37:                return(-1);
                     38:        if(tcp_wait(fd, &tr) < 0)
                     39:                return(-1);
                     40:        if(tr.reply != TCPR_OK)
                     41:                return(-1);
                     42:        return(0);
                     43: }
                     44: 
                     45: tcp_wait(fd, trp)
                     46: int fd;
                     47: struct tcpreply *trp;
                     48: {
                     49:        int n;
                     50:        /* timeout? */
                     51:        n = read(fd, trp, sizeof(struct tcpreply));
                     52:        if(n != sizeof(struct tcpreply))
                     53:                return(-1);
                     54:        return(0);
                     55: }
                     56: 
                     57: tcp_listen(fd, lport, faddr, fport)
                     58: int fd;
                     59: tcp_port lport, fport;
                     60: in_addr faddr;
                     61: {
                     62:        struct tcpreply tr;
                     63: 
                     64:        if(tcp_cmd(fd, TCPC_LISTEN, lport, faddr, fport) < 0)
                     65:                return(-1);
                     66:        return(0);
                     67: }
                     68: 
                     69: tcp_cmd(fd, cmd, lport, faddr, fport)
                     70: int fd;
                     71: int cmd;
                     72: tcp_port lport, fport;
                     73: in_addr faddr;
                     74: {
                     75:        struct tcpuser tu;
                     76: 
                     77:        tu.cmd = cmd;
                     78:        tu.src = tcp_localaddr;
                     79:        tu.dst = faddr;
                     80:        tu.sport = lport;
                     81:        tu.dport = fport;
                     82:        if(write(fd, &tu, sizeof(tu)) != sizeof(tu)){
                     83:                perror("cmd write");
                     84:                return(-1);
                     85:        }
                     86:        return(0);
                     87: }
                     88: 
                     89: tcp_accept(fd, faddrp, fportp, devp)
                     90: int fd;
                     91: in_addr *faddrp;
                     92: tcp_port *fportp;
                     93: int *devp;
                     94: {
                     95:        char name[32];
                     96:        int nfd;
                     97:        struct tcpreply tr;
                     98: 
                     99:        if(tcp_wait(fd, &tr) < 0)
                    100:                return(-1);
                    101:        if(tr.reply != TCPR_OK)
                    102:                return(-1);
                    103:        *devp = tr.tcpdev;
                    104:        sprintf(name, "/dev/tcp%02d", tr.tcpdev);
                    105:        nfd = open(name, 2);
                    106:        if(nfd < 0)
                    107:                return(-1);
                    108:        if (faddrp != 0)
                    109:                *faddrp = tr.dst;
                    110:        if (fportp != 0)
                    111:                *fportp = tr.dport;
                    112:        tcp_acceptaddr = tr.src;
                    113:        return(nfd);
                    114: }
                    115: 
                    116: 
                    117: tcp_rcmd(host, port, locuser, remuser, cmd, fd2p)
                    118: char *host, *port, *locuser, *remuser, *cmd;
                    119: int *fd2p;
                    120: {
                    121:        char buf[1];
                    122:        int fd;
                    123:        unsigned int faddr, fport;
                    124:        struct in_service *sp;
                    125: 
                    126:        faddr = in_address(host);
                    127:        if(faddr == 0){
                    128:                fprintf(stderr, "%s: unknown host\n", host);
                    129:                return(-1);
                    130:        }
                    131:        sp = in_service(port, "tcp", 0);
                    132:        if(sp == 0){
                    133:                fprintf(stderr, "%s: unknown service\n", port);
                    134:                return(-1);
                    135:        }
                    136:        fport = sp->port;
                    137:        fd = tcp_sock();
                    138:        if(fd < 0){
                    139:                perror(host);
                    140:                return(-1);
                    141:        }
                    142:        if(tcp_connect(fd, 0, faddr, fport) < 0){
                    143:                fprintf(stderr, "%s: connection failed\n", host);
                    144:                goto bad;
                    145:        }
                    146: 
                    147:        if(fd2p == 0)
                    148:                write(fd, "", 1);
                    149:        else
                    150:                goto bad;       /* later */
                    151: 
                    152:        write(fd, locuser, strlen(locuser)+1);
                    153:        write(fd, remuser, strlen(remuser)+1);
                    154:        write(fd, cmd, strlen(cmd)+1);
                    155: 
                    156:        if(read(fd, buf, 1) != 1){
                    157:                perror(host);
                    158:                goto bad;
                    159:        }
                    160:        if(buf[0] != 0){
                    161:                while(read(fd, buf, 1) == 1){
                    162:                        write(2, buf, 1);
                    163:                        if(buf[0] == '\n')
                    164:                                break;
                    165:                }
                    166:                goto bad;
                    167:        }
                    168:        return(fd);
                    169: bad:
                    170:        close(fd);
                    171:        return(-1);
                    172: }
                    173: 

unix.superglobalmegacorp.com

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