Annotation of 43BSDReno/contrib/mh/zotnet/mts/client.c, revision 1.1

1.1     ! root        1: /* client.c - connect to a server */
        !             2: 
        !             3: #ifdef BSD42
        !             4: #include "../h/strings.h"
        !             5: #include <stdio.h>
        !             6: #include "mts.h"
        !             7: #include <errno.h>
        !             8: #include <sys/types.h>
        !             9: #include <sys/socket.h>
        !            10: #include <netinet/in.h>
        !            11: #include <netdb.h>
        !            12: #include <arpa/inet.h>
        !            13: 
        !            14: 
        !            15: #define        NOTOK   (-1)
        !            16: #define        OK      0
        !            17: #define        DONE    1
        !            18: 
        !            19: #define        TRUE    1
        !            20: #define        FALSE   0
        !            21: 
        !            22: #define        OOPS1   (-2)
        !            23: #define        OOPS2   (-3)
        !            24: 
        !            25: #define        MAXARGS         1000
        !            26: #define        MAXNETS         5
        !            27: #define        MAXHOSTS        25
        !            28: 
        !            29: /*  */
        !            30: 
        !            31: extern int errno;
        !            32: extern int  sys_nerr;
        !            33: extern char *sys_errlist[];
        !            34: 
        !            35: 
        !            36: struct addrent {
        !            37:     int     a_addrtype;                /* assumes AF_INET for inet_netof () */
        !            38: 
        !            39:     union {
        !            40:        int     un_net;
        !            41:        char    un_addr[14];
        !            42:     } un;
        !            43: #define        a_net   un.un_net
        !            44: #define        a_addr  un.un_addr
        !            45: };
        !            46: 
        !            47: static struct addrent *ne, *nz;
        !            48: static struct addrent nets[MAXNETS];
        !            49: 
        !            50: static struct addrent *he, *hz;
        !            51: static struct addrent hosts[MAXHOSTS];
        !            52: 
        !            53: static int rcaux(), getport(), inet(), brkany();
        !            54: static char **brkstring(), **copyip(), *getcpy();
        !            55: 
        !            56: /*  */
        !            57: 
        !            58: client(args, protocol, service, rproto, response)
        !            59:        char *args, *protocol, *service, *response;
        !            60:        int rproto;
        !            61: {
        !            62:     int     sd;
        !            63:     register char **ap;
        !            64:     char   *arguments[MAXARGS];
        !            65:     register struct hostent *hp;
        !            66: #ifndef        BIND
        !            67:     register struct netent *np;
        !            68: #endif BIND
        !            69:     register struct servent *sp;
        !            70: 
        !            71:     if ((sp = getservbyname (service, protocol)) == NULL) {
        !            72:        (void) sprintf (response, "%s/%s: unknown service", protocol, service);
        !            73:        return NOTOK;
        !            74:     }
        !            75: 
        !            76:     ap = arguments;
        !            77:     if (args != NULL && *args != NULL)
        !            78:        ap = copyip (brkstring (getcpy (args), " ", "\n"), ap);
        !            79:     else
        !            80:        if (servers != NULL && *servers != NULL)
        !            81:            ap = copyip (brkstring (getcpy (servers), " ", "\n"), ap);
        !            82:     if (ap == arguments) {
        !            83:        *ap++ = getcpy ("localhost");
        !            84:        *ap = NULL;
        !            85:     }
        !            86: 
        !            87:     nz = (ne = nets) + sizeof nets / sizeof nets[0];
        !            88:     hz = (he = hosts) + sizeof hosts / sizeof hosts[0];
        !            89: 
        !            90:     for (ap = arguments; *ap; ap++) {
        !            91:        if (**ap == '\01') {
        !            92: #ifndef        BIND
        !            93:            if (np = getnetbyname (*ap + 1)) {
        !            94:                sethostent (1);
        !            95:                while (hp = gethostent ())
        !            96:                    if (np -> n_addrtype == hp -> h_addrtype
        !            97:                            && inet (hp, np -> n_net)) {
        !            98:                        switch (sd = rcaux (sp, hp, rproto, response)) {
        !            99:                            case NOTOK:
        !           100:                                continue;
        !           101:                            case OOPS1:
        !           102:                                break;
        !           103:                            case OOPS2:
        !           104:                                return NOTOK;
        !           105: 
        !           106:                            default:
        !           107:                                return sd;
        !           108:                        }
        !           109:                        break;
        !           110:                    }
        !           111:            }
        !           112: #endif not BIND
        !           113:            continue;
        !           114:        }
        !           115: 
        !           116:        if (hp = gethostbyname (*ap)) {
        !           117:            switch (sd = rcaux (sp, hp, rproto, response)) {
        !           118:                case NOTOK:
        !           119:                case OOPS1:
        !           120:                    break;
        !           121:                case OOPS2:
        !           122:                    return NOTOK;
        !           123: 
        !           124:                default:
        !           125:                    return sd;
        !           126:            }
        !           127:            continue;
        !           128:        }
        !           129:     }
        !           130: 
        !           131:     (void) strcpy (response, "no servers available");
        !           132:     return NOTOK;
        !           133: }
        !           134: 
        !           135: /*  */
        !           136: 
        !           137: static int
        !           138: rcaux(sp, hp, rproto, response)
        !           139:        register struct servent *sp;
        !           140:        register struct hostent *hp;
        !           141:        int rproto;
        !           142:        register char *response;
        !           143: {
        !           144:     int     sd;
        !           145:     struct in_addr  in;
        !           146:     register struct addrent *ap;
        !           147:     struct sockaddr_in  in_socket;
        !           148:     register struct sockaddr_in *isock = &in_socket;
        !           149: 
        !           150:     for (ap = nets; ap < ne; ap++)
        !           151:        if (ap -> a_addrtype == hp -> h_addrtype && inet (hp, ap -> a_net))
        !           152:            return NOTOK;
        !           153: 
        !           154:     for (ap = hosts; ap < he; ap++)
        !           155:        if (ap -> a_addrtype == hp -> h_addrtype
        !           156:                && bcmp (ap -> a_addr, hp -> h_addr, hp -> h_length) == 0)
        !           157:            return NOTOK;
        !           158: 
        !           159:     if ((sd = getport (rproto, hp -> h_addrtype, response)) == NOTOK)
        !           160:        return OOPS2;
        !           161: 
        !           162:     bzero ((char *) isock, sizeof *isock);
        !           163:     isock -> sin_family = hp -> h_addrtype;
        !           164:     isock -> sin_port = sp -> s_port;
        !           165:     bcopy (hp -> h_addr, (char *) &isock -> sin_addr, hp -> h_length);
        !           166: 
        !           167:     if (connect (sd, (struct sockaddr *) isock, sizeof *isock) == NOTOK)
        !           168:        switch (errno) {
        !           169:            case ENETDOWN:
        !           170:            case ENETUNREACH:
        !           171:                (void) close (sd);
        !           172:                if (ne < nz) {
        !           173:                    ne -> a_addrtype = hp -> h_addrtype;
        !           174:                    bcopy (hp -> h_addr, (char *) &in, sizeof in);
        !           175:                    ne -> a_net = inet_netof (in);
        !           176:                    ne++;
        !           177:                }
        !           178:                return OOPS1;
        !           179: 
        !           180:            case ETIMEDOUT:
        !           181:            case ECONNREFUSED:
        !           182:            default:
        !           183:                (void) close (sd);
        !           184:                if (he < hz) {
        !           185:                    he -> a_addrtype = hp -> h_addrtype;
        !           186:                    bcopy (hp -> h_addr, he -> a_addr, hp -> h_length);
        !           187:                    he++;
        !           188:                }
        !           189:                return NOTOK;
        !           190:        }
        !           191: 
        !           192:     return sd;
        !           193: }
        !           194: 
        !           195: /*  */
        !           196: 
        !           197: static int
        !           198: getport(rproto, addrtype, response)
        !           199:        int rproto, addrtype;
        !           200:        register char *response;
        !           201: {
        !           202:     int     sd,
        !           203:             port;
        !           204:     struct sockaddr_in  in_socket,
        !           205:                        *isock = &in_socket;
        !           206: 
        !           207:     if (rproto && addrtype != AF_INET) {
        !           208:        (void) sprintf (response, "reserved ports not supported for af=%d",
        !           209:                addrtype);
        !           210:        errno = ENOPROTOOPT;
        !           211:        return NOTOK;
        !           212:     }
        !           213: 
        !           214:     if ((sd = socket (AF_INET, SOCK_STREAM, 0)) == NOTOK) {
        !           215:        (void) sprintf (response, "unable to create socket: %s",
        !           216:                errno > 0 && errno < sys_nerr ? sys_errlist[errno]
        !           217:                : "unknown error");
        !           218:        return NOTOK;
        !           219:     }
        !           220:     if (!rproto)
        !           221:        return sd;
        !           222: 
        !           223:     bzero ((char *) isock, sizeof *isock);
        !           224:     isock -> sin_family = addrtype;
        !           225:     for (port = IPPORT_RESERVED - 1;;) {
        !           226:        isock -> sin_port = htons ((u_short) port);
        !           227:        if (bind (sd, (struct sockaddr *) isock, sizeof *isock) != NOTOK)
        !           228:            return sd;
        !           229: 
        !           230:        switch (errno) {
        !           231:            case EADDRINUSE:
        !           232:            case EADDRNOTAVAIL:
        !           233:                if (--port <= IPPORT_RESERVED / 2) {
        !           234:                    (void) strcpy (response, "ports available");
        !           235:                    return NOTOK;
        !           236:                }
        !           237:                break;
        !           238: 
        !           239:            default:
        !           240:                (void) sprintf (response, "unable to bind socket: %s",
        !           241:                        errno > 0 && errno < sys_nerr ? sys_errlist[errno]
        !           242:                        : "unknown error");
        !           243:                return NOTOK;
        !           244:        }
        !           245:     }
        !           246: }
        !           247: 
        !           248: /*  */
        !           249: 
        !           250: static int
        !           251: inet(hp, net)
        !           252:        register struct hostent *hp;
        !           253:        int net;
        !           254: {
        !           255:     struct in_addr  in;
        !           256: 
        !           257:     bcopy (hp -> h_addr, (char *) &in, sizeof in);
        !           258:     return (inet_netof (in) == net);
        !           259: }
        !           260: 
        !           261: /*  */
        !           262: 
        !           263: /* static copies of three MH subroutines... (sigh) */
        !           264: 
        !           265: char  *malloc ();
        !           266: 
        !           267: 
        !           268: static char *broken[MAXARGS + 1];
        !           269: 
        !           270: 
        !           271: static char **
        !           272: brkstring(strg, brksep, brkterm)
        !           273:        register char *strg, *brksep, *brkterm;
        !           274: {
        !           275:     register int    bi;
        !           276:     register char   c,
        !           277:                    *sp;
        !           278: 
        !           279:     sp = strg;
        !           280: 
        !           281:     for (bi = 0; bi < MAXARGS; bi++) {
        !           282:        while (brkany (c = *sp, brksep))
        !           283:            *sp++ = 0;
        !           284:        if (!c || brkany (c, brkterm)) {
        !           285:            *sp = 0;
        !           286:            broken[bi] = 0;
        !           287:            return broken;
        !           288:        }
        !           289: 
        !           290:        broken[bi] = sp;
        !           291:        while ((c = *++sp) && !brkany (c, brksep) && !brkany (c, brkterm))
        !           292:            continue;
        !           293:     }
        !           294:     broken[MAXARGS] = 0;
        !           295: 
        !           296:     return broken;
        !           297: }
        !           298: 
        !           299: 
        !           300: static int
        !           301: brkany(chr, strg)
        !           302:        register char chr, *strg;
        !           303: {
        !           304:     register char  *sp;
        !           305: 
        !           306:     if (strg)
        !           307:        for (sp = strg; *sp; sp++)
        !           308:            if (chr == *sp)
        !           309:                return 1;
        !           310:     return 0;
        !           311: }
        !           312: 
        !           313: 
        !           314: static char **
        !           315: copyip(p, q)
        !           316:        register char **p, **q;
        !           317: {
        !           318:     while (*p)
        !           319:        *q++ = *p++;
        !           320:     *q = 0;
        !           321: 
        !           322:     return q;
        !           323: }
        !           324: 
        !           325: 
        !           326: static char *
        !           327: getcpy (str)
        !           328:        register char *str;
        !           329: {
        !           330:     register char  *cp;
        !           331: 
        !           332:     if ((cp = malloc ((unsigned) (strlen (str) + 1))) == NULL)
        !           333:        return NULL;
        !           334: 
        !           335:     (void) strcpy (cp, str);
        !           336:     return cp;
        !           337: }
        !           338: #endif BSD42

unix.superglobalmegacorp.com

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