Annotation of researchv10no/cmd/nupas/ipc/otcpconnect.c, revision 1.1

1.1     ! root        1: untested - there are some minor changes in tcpconnect that have not been
        !             2: moved to this routine.
        !             3: 
        !             4: #include <stdio.h>
        !             5: #include <sys/types.h>
        !             6: #include <sys/uio.h>
        !             7: #include <sys/socket.h>
        !             8: #include <sys/ioctl.h>
        !             9: #include <sys/time.h>
        !            10: #include <netinet/in.h>
        !            11: #include <arpa/inet.h>
        !            12: #include <netdb.h>
        !            13: #include <sysexits.h>
        !            14: #include <string.h>
        !            15: 
        !            16: extern int ipcdebug;
        !            17: 
        !            18: extern char syserrstr[];
        !            19: 
        !            20: /*
        !            21:  * This is an older version of tcp_connect for systems that
        !            22:  * use the old Berkeley 4.2 gethostbyname which returned
        !            23:  * a single host entry instead of several.
        !            24:  *
        !            25:  * This code hasn't been tested as hard as the newer stuff.
        !            26:  */
        !            27: int
        !            28: tcp_connect(dest, param)
        !            29: char *dest, *param;
        !            30: {
        !            31:        struct hostent *hp;
        !            32:        struct sockaddr_in sin;
        !            33:        char    *inet_ntoa();
        !            34:        int s, port, i;
        !            35:        unsigned long addr;
        !            36:        char buf[100];
        !            37:        char *host, *service;
        !            38:        char *h_addr_list[2];
        !            39:        int errtype = 0;
        !            40:        char errstr[256];
        !            41: 
        !            42:        strcpy(buf, dest);
        !            43:        host = buf;
        !            44: 
        !            45:        if ((port = tcp_service(host)) < 0) {
        !            46:                ipcseterror(EX_NOHOST, "unknown service", "tcp_connect");
        !            47:                return(-1);
        !            48:        }
        !            49: 
        !            50:        if (ipcdebug)
        !            51:                fprintf(stderr, "TCP port number is %d\n", ntohs(port));
        !            52: 
        !            53:        if ((addr = inet_addr(host)) != (unsigned long) -1) {
        !            54:                if (ipcdebug)
        !            55:                        fprintf(stderr, "Numeric address: %s %lx\n",
        !            56:                                host, addr);
        !            57:                s = socket(AF_INET, SOCK_STREAM, 0);
        !            58:                if(s < 0){
        !            59:                        ipcsyserr("can't open socket");
        !            60:                        return(-1);
        !            61:                }
        !            62:                bzero((char *)&sin, sizeof(sin));
        !            63:                sin.sin_family = AF_INET;
        !            64:                sin.sin_port = port;
        !            65:                sin.sin_addr.s_addr = addr;
        !            66:                if(connect(s, (struct sockaddr *)&sin, sizeof (sin)) >= 0) {
        !            67:                        setopt(s);
        !            68:                        return s;
        !            69:                }
        !            70:                ipcsyserr("can't connect");
        !            71:                close(s);
        !            72:                return -1;
        !            73:        }
        !            74: 
        !            75:        if((hp = gethostbyname(host)) == (struct hostent *)0){
        !            76:                ipcseterror(EX_NOHOST,  "unknown host", "tcp_connect");
        !            77:                return(-1);
        !            78:        }
        !            79:        h_addr_list[0] = hp->h_addr;
        !            80:        h_addr_list[1] = 0;
        !            81:        for(i=0; h_addr_list[i]; i++ ){ 
        !            82:                bzero((char *)&sin, sizeof(sin));
        !            83:                bcopy(h_addr_list[i], &sin.sin_addr, hp->h_length);
        !            84:                sin.sin_family = hp->h_addrtype;
        !            85:                sin.sin_port = port;
        !            86:                if (ipcdebug)
        !            87:                        fprintf(stderr, "Trying address %s\n",
        !            88:                                inet_ntoa(sin.sin_addr));
        !            89: 
        !            90:                s = socket(AF_INET, SOCK_STREAM, 0);
        !            91:                if(s < 0){
        !            92:                        ipcsyserr("can't open socket");
        !            93:                        return(-1);
        !            94:                }
        !            95:                if(connect(s, (struct sockaddr *)&sin, sizeof (sin)) >= 0) {
        !            96:                        setopt(s);
        !            97:                        return s;
        !            98:                }
        !            99:                ipcgetsyserr();
        !           100:                if (errtype == 0 || 
        !           101:                   (errtype != EX_TEMPFAIL && ipcmaperror()==EX_TEMPFAIL)) {
        !           102:                        errtype = ipcmaperror();
        !           103:                        strcpy(errstr, syserrstr);
        !           104:                }
        !           105:                ipcsyserr("connect");
        !           106:                close(s);
        !           107:        }
        !           108: 
        !           109:        ipcseterror(errtype, errstr, "Can't connect to host");
        !           110:        return -1;
        !           111: }
        !           112: 
        !           113: setopt(s)
        !           114: int s;
        !           115: {
        !           116:        /*
        !           117:         * for some reason, the following linger does not seem
        !           118:         * to have any effect, at least on the Sun `shamash'.
        !           119:         * I have placed a sleep before the close in ../pftp/ftp.c
        !           120:         * in the routine sendrequest.
        !           121:         *      suggestions are [email protected]
        !           122:         */
        !           123:        struct linger linger;
        !           124: 
        !           125:        linger.l_onoff = 1;
        !           126:        linger.l_linger = 3000;
        !           127:        if (setsockopt(s, SOL_SOCKET, SO_LINGER, (char *)&linger,
        !           128:            sizeof (linger)) < 0)
        !           129:                ipcsyserr("error setting socket option");
        !           130:        return s;
        !           131: }
        !           132: 
        !           133: int
        !           134: tcp_service(path)
        !           135: char *path;
        !           136: {
        !           137:        struct servent *sp;
        !           138:        char *service;
        !           139: 
        !           140:        if ((service = strchr(path, '!')) == NULL)
        !           141:                service = "";
        !           142:        else
        !           143:                *service++ = '\0';
        !           144: 
        !           145:        /*
        !           146:         *  translate service/port name
        !           147:         */
        !           148:        if(strncmp(service, "tcp.", 4)==0)
        !           149:                service += 4;
        !           150:        if(strncmp(service, "/cs/", 4)==0)
        !           151:                service += 4;
        !           152:        if(strcmp(service, "")==0)
        !           153:                return 0;
        !           154:        else if(atoi(service)!=0)
        !           155:                return atoi(htons(service));
        !           156:        else if ((sp = getservbyname (service, "tcp")) != NULL)
        !           157:                return sp->s_port;
        !           158:        return -1;
        !           159: }
        !           160: 
        !           161: int
        !           162: tcp_close(fd)
        !           163: int fd;
        !           164: {
        !           165:        write(fd, &fd, 0);      /* stub - is this useful or necessary? */
        !           166:        if (shutdown(fd, 2) < 0)
        !           167:                ipcseterror(EX_SOFTWARE, "shutdown failed", "tcp_close");
        !           168:        return close(fd);
        !           169: }

unix.superglobalmegacorp.com

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