Annotation of researchv9/ipc/src/libin/tcp_lib.c, revision 1.1.1.1

1.1       root        1: #include <sys/inet/tcp_user.h>
                      2: #include <sys/inet/socket.h>
                      3: #include <ctype.h>
                      4: #include <stdio.h>
                      5: #include <errno.h>
                      6: #include "config.h"
                      7: 
                      8: extern errno;
                      9: 
                     10: tcp_sock()
                     11: {
                     12:        int fd, n;
                     13:        char name[32];
                     14: 
                     15:        for(n = 01; n < 100; n += 2){
                     16:                sprintf(name, "/dev/tcp%02d", n);
                     17:                fd = open(name, 2);
                     18:                if(fd >= 0)
                     19:                        return(fd);
                     20:                if(errno != ENXIO)
                     21:                        break;
                     22:        }
                     23:        perror(name);
                     24:        return(-1);
                     25: }
                     26: 
                     27: tcp_connect(fd, tp)
                     28:        int fd;
                     29:        struct tcpuser *tp;
                     30: {
                     31:        tp->code = TCPC_CONNECT;
                     32:        if (write(fd, (char *)tp, sizeof(struct tcpuser))!=sizeof(struct tcpuser))
                     33:                return -1;
                     34:        if (read(fd, (char *)tp, sizeof(struct tcpuser))!=sizeof(struct tcpuser))
                     35:                return -2;
                     36:        if(tp->code != TCPC_OK)
                     37:                return -3;
                     38:        return 0;
                     39: }
                     40: 
                     41: tcp_listen(fd, tp)
                     42:        int fd;
                     43:        struct tcpuser *tp;
                     44: {
                     45:        tp->code = TCPC_LISTEN;
                     46:        if (write(fd, (char *)tp, sizeof(struct tcpuser))!=sizeof(struct tcpuser))
                     47:                return -1;
                     48:        if (read(fd, (char *)tp, sizeof(struct tcpuser))!=sizeof(struct tcpuser))
                     49:                return -1;
                     50:        if(tp->code != TCPC_OK)
                     51:                return -1;
                     52:        return 0;
                     53: }
                     54: 
                     55: tcp_accept(fd, tp)
                     56:        int fd;
                     57:        struct tcpuser *tp;
                     58: {
                     59:        char name[128];
                     60: 
                     61:        if (read(fd, (char *)tp, sizeof(struct tcpuser))!=sizeof(struct tcpuser))
                     62:                return -1;
                     63:        if (tp->code != TCPC_OK)
                     64:                return -1;
                     65:        sprintf(name, "/dev/tcp%02d", tp->param);
                     66:        return open(name, 2);
                     67: }
                     68: 
                     69: tcp_rcmd(host, port, locuser, remuser, cmd, fd2p)
                     70: char *host, *port, *locuser, *remuser, *cmd;
                     71: int *fd2p;
                     72: {
                     73:        char buf[1];
                     74:        int fd;
                     75:        struct in_service *sp;
                     76:        struct tcpuser tu;
                     77:        in_addr in_address();
                     78: 
                     79:        tu.faddr = in_address(host);
                     80:        if(tu.faddr == 0){
                     81:                fprintf(stderr, "%s: unknown host\n", host);
                     82:                return(-1);
                     83:        }
                     84:        sp = in_service(port, "tcp", 0L);
                     85:        if(sp == 0){
                     86:                fprintf(stderr, "%s: unknown service\n", port);
                     87:                return(-1);
                     88:        }
                     89:        tu.fport = sp->port;
                     90:        fd = tcp_sock();
                     91:        if(fd < 0){
                     92:                perror(host);
                     93:                return(-1);
                     94:        }
                     95:        tu.laddr = INADDR_ANY;
                     96:        tu.lport = 0;
                     97:        tu.param = 0;
                     98:        if(tcp_connect(fd, &tu) < 0){
                     99:                fprintf(stderr, "%s: connection failed\n", host);
                    100:                goto bad;
                    101:        }
                    102: 
                    103:        if(fd2p == 0)
                    104:                write(fd, "", 1);
                    105:        else
                    106:                goto bad;       /* later */
                    107: 
                    108:        write(fd, locuser, strlen(locuser)+1);
                    109:        write(fd, remuser, strlen(remuser)+1);
                    110:        write(fd, cmd, strlen(cmd)+1);
                    111: 
                    112:        if(read(fd, buf, 1) != 1){
                    113:                perror(host);
                    114:                goto bad;
                    115:        }
                    116:        if(buf[0] != 0){
                    117:                while(read(fd, buf, 1) == 1){
                    118:                        write(2, buf, 1);
                    119:                        if(buf[0] == '\n')
                    120:                                break;
                    121:                }
                    122:                goto bad;
                    123:        }
                    124:        return(fd);
                    125: bad:
                    126:        close(fd);
                    127:        return(-1);
                    128: }

unix.superglobalmegacorp.com

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