Annotation of 43BSDReno/contrib/isode-beta/compat/internet.c, revision 1.1.1.1

1.1       root        1: /* internet.c - TCP/IP abstractions */
                      2: 
                      3: #ifndef        lint
                      4: static char *rcsid = "$Header: /f/osi/compat/RCS/internet.c,v 7.1 90/01/11 18:35:06 mrose Exp $";
                      5: #endif
                      6: 
                      7: /* 
                      8:  * $Header: /f/osi/compat/RCS/internet.c,v 7.1 90/01/11 18:35:06 mrose Exp $
                      9:  *
                     10:  *
                     11:  * $Log:       internet.c,v $
                     12:  * Revision 7.1  90/01/11  18:35:06  mrose
                     13:  * real-sync
                     14:  * 
                     15:  * Revision 7.0  89/11/23  21:23:03  mrose
                     16:  * Release 6.0
                     17:  * 
                     18:  */
                     19: 
                     20: /*
                     21:  *                               NOTICE
                     22:  *
                     23:  *    Acquisition, use, and distribution of this module and related
                     24:  *    materials are subject to the restrictions of a license agreement.
                     25:  *    Consult the Preface in the User's Manual for the full terms of
                     26:  *    this agreement.
                     27:  *
                     28:  */
                     29: 
                     30: 
                     31: /* LINTLIBRARY */
                     32: 
                     33: #include <ctype.h>
                     34: #include <errno.h>
                     35: #include <stdio.h>
                     36: #include "general.h"
                     37: #include "manifest.h"
                     38: #include "tailor.h"
                     39: 
                     40: /*  */
                     41: 
                     42: #ifdef TCP
                     43: #include "internet.h"
                     44: 
                     45: 
                     46: extern int  errno;
                     47: 
                     48: /*    Berkeley UNIX: 4.2 */
                     49: 
                     50: #ifdef SOCKETS
                     51: 
                     52: /* For real networking, nothing is better than 4BSD! */
                     53: 
                     54: 
                     55: int    start_tcp_client (sock, priv)
                     56: struct sockaddr_in *sock;
                     57: int    priv;
                     58: {
                     59:     register int    port;
                     60:     int     eindex,
                     61:            sd;
                     62: #ifdef BSD43
                     63:     int            onoff;
                     64: #endif
                     65: 
                     66:     if ((sd = socket (AF_INET, SOCK_STREAM, 0)) == NOTOK) {
                     67:        SLOG (compat_log, LLOG_EXCEPTIONS, "failed", ("socket"));
                     68:        return NOTOK;
                     69:     }
                     70: 
                     71:     if (sock == NULL)
                     72:        goto got_socket;
                     73: 
                     74:     for (port = IPPORT_RESERVED - priv;; priv ? port-- : port++) {
                     75:        sock -> sin_port = htons ((u_short) port);
                     76: 
                     77:        if (bind (sd, (struct sockaddr *) sock, sizeof *sock) != NOTOK)
                     78:            break;
                     79: 
                     80:        switch (errno) {
                     81:            case EADDRINUSE: 
                     82:                if (!priv || (port >= IPPORT_RESERVED / 2))
                     83:                    continue;   /* else fall */
                     84: 
                     85:            case EADDRNOTAVAIL: 
                     86:            default:
                     87:                eindex = errno;
                     88:                SLOG (compat_log, LLOG_EXCEPTIONS, "failed", ("bind"));
                     89:                (void) close_tcp_socket (sd);
                     90:                errno = eindex;
                     91:                return NOTOK;
                     92:        }
                     93:     }
                     94: 
                     95: got_socket: ;
                     96: #ifndef        BSD43
                     97:     if (setsockopt (sd, SOL_SOCKET, SO_KEEPALIVE, NULLCP, 0) == NOTOK)
                     98:        SLOG (compat_log, LLOG_EXCEPTIONS, "failed", ("set SO_KEEPALIVE"));
                     99: #else
                    100:     onoff = 1;
                    101:     if (setsockopt (sd, SOL_SOCKET, SO_KEEPALIVE, (char *) &onoff,
                    102:                       sizeof onoff) == NOTOK)
                    103:        SLOG (compat_log, LLOG_EXCEPTIONS, "failed", ("set SO_KEEPALIVE"));
                    104: #endif
                    105: 
                    106:     return sd;
                    107: }
                    108: 
                    109: /*  */
                    110: 
                    111: int    start_tcp_server (sock, backlog, opt1, opt2)
                    112: struct sockaddr_in *sock;
                    113: int    backlog,
                    114:        opt1,
                    115:        opt2;
                    116: {
                    117:     register int    port;
                    118:     int     eindex,
                    119:            sd;
                    120: #ifdef BSD43
                    121:     int            onoff;
                    122: #endif
                    123: 
                    124:     if ((sd = socket (AF_INET, SOCK_STREAM, 0)) == NOTOK) {
                    125:        SLOG (compat_log, LLOG_EXCEPTIONS, "failed", ("socket"));
                    126:        return NOTOK;
                    127:     }
                    128: 
                    129:     if (sock -> sin_port != 0) {
                    130:        if (bind (sd, (struct sockaddr *) sock, sizeof *sock) != NOTOK)
                    131:            goto got_socket;
                    132: 
                    133:        eindex = errno;
                    134:        SLOG (compat_log, LLOG_EXCEPTIONS, "failed", ("bind"));
                    135:        (void) close_tcp_socket (sd);
                    136:        errno = eindex;
                    137:        return NOTOK;
                    138:     }
                    139: 
                    140:     for (port = IPPORT_RESERVED;; port++) {
                    141:        sock -> sin_port = htons ((u_short) port);
                    142: 
                    143:        if (bind (sd, (struct sockaddr *) sock, sizeof *sock) != NOTOK)
                    144:            break;
                    145: 
                    146:        switch (errno) {
                    147:            case EADDRINUSE: 
                    148:                continue;
                    149: 
                    150:            case EADDRNOTAVAIL: 
                    151:            default:
                    152:                eindex = errno;
                    153:                SLOG (compat_log, LLOG_EXCEPTIONS, "failed", ("bind"));
                    154:                (void) close_tcp_socket (sd);
                    155:                errno = eindex;
                    156:                return NOTOK;
                    157:        }
                    158:     }
                    159: 
                    160: got_socket: ;
                    161: #ifndef        BSD43
                    162:     if (setsockopt (sd, SOL_SOCKET, SO_KEEPALIVE, NULLCP, 0) == NOTOK)
                    163:        SLOG (compat_log, LLOG_EXCEPTIONS, "failed", ("set SO_KEEPALIVE"));
                    164:     if (opt1 && setsockopt (sd, SOL_SOCKET, opt1, NULLCP, 0) == NOTOK)
                    165:        SLOG (compat_log, LLOG_EXCEPTIONS, "failed",
                    166:              ("set socket option 0x%x", opt1));
                    167:     if (opt2 && setsockopt (sd, SOL_SOCKET, opt2, NULLCP, 0) == NOTOK)
                    168:        SLOG (compat_log, LLOG_EXCEPTIONS, "failed",
                    169:              ("set socket option 0x%x", opt2));
                    170: #else
                    171:     onoff = 1;
                    172:     if (setsockopt (sd, SOL_SOCKET, SO_KEEPALIVE, (char *) &onoff,
                    173:                       sizeof onoff) == NOTOK)
                    174:        SLOG (compat_log, LLOG_EXCEPTIONS, "failed", ("set SO_KEEPALIVE"));
                    175:     if (opt1
                    176:            && setsockopt (sd, SOL_SOCKET, opt1, (char *) &onoff, sizeof onoff)
                    177:                    == NOTOK)
                    178:        SLOG (compat_log, LLOG_EXCEPTIONS, "failed",
                    179:              ("set socket option 0x%x", opt1));
                    180:     if (opt2
                    181:            && setsockopt (sd, SOL_SOCKET, opt2, (char *) &onoff, sizeof onoff)
                    182:                    == NOTOK)
                    183:        SLOG (compat_log, LLOG_EXCEPTIONS, "failed",
                    184:              ("set socket option 0x%x", opt2));
                    185: #endif
                    186: 
                    187:     (void) listen (sd, backlog);
                    188: 
                    189:     return sd;
                    190: }
                    191: 
                    192: /*  */
                    193: 
                    194: int    join_tcp_client (fd, sock)
                    195: int    fd;
                    196: struct sockaddr_in *sock;
                    197: {
                    198:     int     eindex,
                    199:            len = sizeof *sock,
                    200:            result;
                    201: 
                    202:     if ((result = accept (fd, (struct sockaddr *) sock, &len)) == NOTOK) {
                    203:        eindex = errno;
                    204:        SLOG (compat_log, LLOG_EXCEPTIONS, "failed", ("accept"));
                    205:        errno = eindex;
                    206:     }
                    207: 
                    208:     return result;
                    209: }
                    210: 
                    211: /*  */
                    212: 
                    213: int    join_tcp_server (fd, sock)
                    214: int    fd;
                    215: struct sockaddr_in *sock;
                    216: {
                    217:     int     eindex,
                    218:            result;
                    219: 
                    220:     if ((result = connect (fd, (struct sockaddr *) sock, sizeof *sock))
                    221:            == NOTOK) {
                    222:        eindex = errno;
                    223:        SLOG (compat_log, LLOG_EXCEPTIONS, "failed", ("connect"));
                    224:        errno = eindex;
                    225:     }
                    226: 
                    227:     return result;
                    228: }
                    229: 
                    230: /*  */
                    231: 
                    232: close_tcp_socket (fd)
                    233: int    fd;
                    234: {
                    235: #ifdef never_do_this_if_from_join_tcp_client
                    236:     (void) shutdown (fd, 2);
                    237: #endif
                    238: 
                    239:     return (close (fd));
                    240: }
                    241: 
                    242: #endif
                    243: 
                    244: /*    AT&T UNIX: 5r3 using TLI */
                    245: 
                    246: 
                    247: /*    AT&T UNIX: 5 with EXOS 8044 TCP/IP card */
                    248: 
                    249: #ifdef EXOS
                    250: 
                    251: /* If we had a getsockname() for the EXOS card, then we could postpone some
                    252:    of the binding until connect time.  But since we don't, our hand is forced
                    253:    and we must prematurely bind the sockets to IP addresses. */
                    254: 
                    255: 
                    256: start_tcp_client (sock, priv)
                    257: struct sockaddr_in *sock;
                    258: int    priv;
                    259: {
                    260:     register int    port;
                    261:     int     sd;
                    262:     register struct hostent *hp;
                    263: 
                    264:     if (sock == NULL)
                    265:        return socket (SOCK_STREAM, 0, (struct sockaddr *) 0, SO_KEEPALIVE);
                    266: 
                    267:     if (sock -> sin_addr.s_addr == 0) {
                    268:        if ((hp = gethostbyname ("localhost")) == NULL) {
                    269:            errno = EADDRNOTAVAIL;
                    270:            return NOTOK;
                    271:        }
                    272:        sock -> sin_family = hp -> h_addrtype;
                    273:        inaddr_copy (hp, sock);
                    274:     }
                    275: 
                    276:     for (port = IPPORT_RESERVED - priv;; priv ? port-- : port++) {
                    277:        sock -> sin_port = htons ((u_short) port);
                    278: 
                    279:        if ((sd = socket (SOCK_STREAM, 0, (struct sockaddr *) sock,
                    280:                          SO_KEEPALIVE)) != NOTOK)
                    281:            return sd;
                    282: 
                    283:        switch (errno) {
                    284:            case EADDRINUSE: 
                    285:                if (!priv || (port >= IPPORT_RESERVED / 2))
                    286:                    continue;   /* else fall */
                    287: 
                    288:            case EADDRNOTAVAIL: 
                    289:            default: 
                    290:                return NOTOK;
                    291:        }
                    292:     }
                    293: }
                    294: 
                    295: /*  */
                    296: 
                    297: int    start_tcp_server (sock, backlog, opt1, opt2)
                    298: struct sockaddr_in *sock;
                    299: int    backlog,
                    300:        opt1,
                    301:        opt2;
                    302: {
                    303:     register int    port;
                    304:     int     sd;
                    305:     register struct hostent *hp;
                    306: 
                    307:     if (backlog != 1)
                    308:        return socket (SOCK_STREAM, 0, (struct sockaddr *) sock,
                    309:                    SO_ACCEPTCONN | SO_KEEPALIVE | opt1 | opt2);
                    310: 
                    311:     if (sock -> sin_addr.s_addr == 0) {
                    312:        if ((hp = gethostbyname ("localhost")) == NULL) {
                    313:            errno = EADDRNOTAVAIL;
                    314:            return NOTOK;
                    315:        }
                    316:        sock -> sin_family = hp -> h_addrtype;
                    317:        inaddr_copy (hp, sock);
                    318:     }
                    319: 
                    320:     for (port = IPPORT_RESERVED;; port++) {
                    321:        sock -> sin_port = htons ((u_short) port);
                    322: 
                    323:        if ((sd = socket (SOCK_STREAM, 0, (struct sockaddr *) sock,
                    324:                    SO_ACCEPTCONN | SO_KEEPALIVE | opt1 | opt2)) != NOTOK)
                    325:            return sd;
                    326: 
                    327:        switch (errno) {
                    328:            case EADDRINUSE: 
                    329:                continue;
                    330: 
                    331:            case EADDRNOTAVAIL: 
                    332:            default: 
                    333:                return NOTOK;
                    334:        }
                    335:     }
                    336: }
                    337: 
                    338: #endif
                    339: 
                    340: /*    GETHOSTENT PLUS */
                    341: 
                    342: static char *empty = NULL;
                    343: #ifdef h_addr
                    344: static char *addrs[2] = { NULL };
                    345: #endif
                    346: 
                    347: struct hostent *gethostbystring (s)
                    348: char   *s;
                    349: {
                    350:     register struct hostent *h;
                    351: #ifndef        DG
                    352:     static u_long iaddr;
                    353: #else
                    354:     static struct in_addr iaddr;
                    355: #endif
                    356:     static struct hostent   hs;
                    357: 
                    358:     iaddr = inet_addr (s);
                    359: #ifndef        DG
                    360:     if (iaddr == NOTOK)
                    361: #else
                    362:     if (iaddr.s_addr == NOTOK)
                    363: #endif
                    364:        return gethostbyname (s);
                    365: 
                    366:     h = &hs;
                    367:     h -> h_name = s;
                    368:     h -> h_aliases = &empty;
                    369:     h -> h_addrtype = AF_INET;
                    370:     h -> h_length = sizeof (iaddr);
                    371: #ifdef h_addr
                    372:     h -> h_addr_list = addrs;
                    373:     bzero ((char *) addrs, sizeof addrs);
                    374: #endif
                    375:     h -> h_addr = (char *) &iaddr;
                    376: 
                    377:     return h;
                    378: }
                    379: 
                    380: /*    AT&T UNIX: 5 with EXOS 8044 TCP/IP card */
                    381: 
                    382: #ifdef EXOS
                    383: 
                    384: long   rhost ();
                    385: char   *raddr ();
                    386: 
                    387: 
                    388: struct hostent *gethostbyaddr (addr, len, type)
                    389: char   *addr;
                    390: int    len,
                    391:        type;
                    392: {
                    393:     long    iaddr;
                    394:     char   *name;
                    395:     static char buffer[BUFSIZ];
                    396:     static struct hostent   hs;
                    397:     register struct hostent *h = &hs;
                    398: 
                    399:     if (len != sizeof (long) || type != AF_INET)
                    400:        return NULL;
                    401:     bcopy (addr, (char *) &iaddr, len);
                    402:     if ((name = raddr (iaddr)) == NULL)
                    403:        return NULL;
                    404: 
                    405:     (void) strcpy (buffer, name);
                    406:     free (name);
                    407: 
                    408:     h -> h_name = buffer;
                    409:     h -> h_aliases = &empty;
                    410:     h -> h_addrtype = type;
                    411:     h -> h_length = len;
                    412:     h -> h_addr = addr;
                    413: 
                    414:     return h;
                    415: }
                    416: 
                    417: 
                    418: struct hostent *gethostbyname (name)
                    419: char   *name;
                    420: {
                    421:     static long iaddr;
                    422:     static char buffer[BUFSIZ];
                    423:     static struct hostent   hs;
                    424:     register struct hostent *h = &hs;
                    425: 
                    426:     if ((iaddr = rhost (&name)) == NOTOK)
                    427:        return NULL;
                    428: 
                    429:     (void) strcpy (buffer, name);
                    430:     free (name);
                    431: 
                    432:     h -> h_name = buffer;
                    433:     h -> h_aliases = &empty;
                    434:     h -> h_addrtype = AF_INET;
                    435:     h -> h_length = sizeof (iaddr);
                    436:     h -> h_addr = (char *) &iaddr;
                    437: 
                    438:     return h;
                    439: 
                    440: }
                    441: 
                    442: /*  */
                    443: 
                    444: /* really only need the "tsap" entry in this table... but why not? */
                    445: 
                    446: static struct servent   services[] = {
                    447:     "tsap", NULL, 102, "tcp",
                    448:     "miscellany", NULL, 17000, "lpp",
                    449: 
                    450:     "echo", NULL, 7, "tcp",            /* Network standard functions */
                    451:     "echo", NULL, 7, "udp",
                    452:     "sink", NULL, 9, "tcp",
                    453:     "sink", NULL, 9, "udp",
                    454:     "users", NULL, 11, "tcp",
                    455:     "users", NULL, 11, "udp",
                    456:     "daytime", NULL, 13, "tcp",
                    457:     "daytime", NULL, 13, "udp",
                    458:     "netstat", NULL, 15, "tcp",
                    459:     "netstat", NULL, 15, "udp",
                    460:     "qotd", NULL, 17, "tcp",
                    461:     "qotd", NULL, 17, "udp",
                    462:     "chargen", NULL, 19, "tcp",
                    463:     "chargen", NULL, 19, "udp",
                    464:     "ftp", NULL, 21, "tcp",
                    465:     "telnet", NULL, 23, "tcp",
                    466:     "smtp", NULL, 25, "tcp",
                    467:     "imagen", NULL, 35, "udp",
                    468:     "time", NULL, 37, "tcp",
                    469:     "time", NULL, 37, "udp",
                    470:     "name", NULL, 42, "tcp",
                    471:     "name", NULL, 42, "udp",
                    472:     "whois", NULL, 43, "tcp",
                    473:     "whois", NULL, 43, "udp",
                    474:     "nameserver", NULL, 53, "tcp",
                    475:     "nameserver", NULL, 53, "udp",
                    476:     "mtp", NULL, 57, "tcp",
                    477:     "hostnames", NULL, 101, "tcp",
                    478:     "pop", NULL, 109, "tcp",
                    479:     "pwdgen", NULL, 129, "tcp",
                    480:     "pwdgen", NULL, 129, "udp",
                    481:     "x25bridge", NULL, 146, "tcp",
                    482:     "iso-ip", NULL, 147, "udp",
                    483: 
                    484:     "tftp", NULL, 69, "udp",           /* Host specific functions */
                    485:     "rje", NULL, 77, "tcp",
                    486:     "nmui", NULL, 77, "udp",
                    487:     "finger", NULL, 79, "tcp",
                    488:     "finger", NULL, 79, "udp",
                    489:     "link", NULL, 87, "tcp",
                    490:     "supdup", NULL, 95, "tcp",
                    491:     "path", NULL, 117, "tcp",
                    492: 
                    493:     "exec", NULL, 512, "tcp",          /* UNIX TCP sockets */
                    494:     "login", NULL, 513, "tcp",
                    495:     "shell", NULL, 514, "tcp",
                    496:     "printer", NULL, 515, "tcp",
                    497:     "rfile", NULL, 522, "tcp",
                    498:     "ingreslock", NULL, 1524, "tcp",
                    499: 
                    500:     "biff", NULL, 512, "udp",          /* UNIX UDP sockets */
                    501:     "who", NULL, 513, "udp",
                    502:     "syslog", NULL, 514, "udp",
                    503:     "talk", NULL, 517, "udp",
                    504:     "routed", NULL, 520, "udp",
                    505:     "router_1", NULL, 521, "udp",
                    506: 
                    507:     NULL, &empty, 0, NULL
                    508: };
                    509: 
                    510: 
                    511: 
                    512: struct servent *getservbyname (name, proto)
                    513: register char   *name,
                    514:                *proto;
                    515: {
                    516:     register struct servent *s;
                    517: 
                    518:     for (s = services; s -> s_name; s++)
                    519:        if (strcmp (name, s -> s_name) == 0
                    520:                && strcmp (proto, s -> s_proto) == 0) {
                    521:            if (s -> s_aliases == NULL) {
                    522:                s -> s_aliases = &empty;
                    523:                s -> s_port = htons ((u_short) s -> s_port);
                    524:            }
                    525: 
                    526:            return s;
                    527:        }
                    528: 
                    529:     return NULL;
                    530: }
                    531: 
                    532: /*  */
                    533: 
                    534: #define        s2a(b)  (((int) (b)) & 0xff)
                    535: 
                    536: char   *inet_ntoa (in)
                    537: struct in_addr in;
                    538: {
                    539:     register char  *s = (char *) &in;
                    540:     static char addr[4 * 3 + 3 + 1];
                    541: 
                    542:     (void) sprintf (addr, "%d.%d.%d.%d",
                    543:            s2a (s[0]), s2a (s[1]), s2a (s[2]), s2a (s[3]));
                    544: 
                    545:     return addr;
                    546: }
                    547: 
                    548: 
                    549: u_long inet_addr (cp)
                    550: char   *cp;
                    551: {
                    552:     register int    base;
                    553:     register char   c;
                    554:     register u_long val;
                    555:     u_long     parts[4];
                    556:     register u_long *pp = parts;
                    557: 
                    558:     for (;;) {
                    559:        val = 0, base = 10;
                    560:        if (*cp == '0')
                    561:            base = 8, cp++;
                    562:        if (*cp == 'x' || *cp == 'X')
                    563:            base = 16, cp++;
                    564: 
                    565:        for (; isxdigit (c = *cp); cp++)
                    566:            if (base == 16)
                    567:                val = (val << 4) + (c + 10 - (islower (c) ? 'a' : 'A'));
                    568:            else
                    569:                if (isdigit (c))
                    570:                    val = (val * base) + (c - '0');
                    571:                else
                    572:                    break;
                    573: 
                    574:        switch (*cp) {
                    575:            case '.': 
                    576:                if (pp >= parts + 4)
                    577:                    return NOTOK;
                    578:                *pp++ = val, cp++;
                    579:                continue;
                    580: 
                    581:            default: 
                    582:                if (*cp && !isspace (*cp))
                    583:                    return NOTOK;
                    584:                *pp++ = val;
                    585:                break;
                    586:        }
                    587: 
                    588:        break;
                    589:     }
                    590: 
                    591:     switch (pp - parts) {
                    592:        case 1:
                    593:            val = parts[0];
                    594:            break;
                    595: 
                    596:        case 2:
                    597:            val = ((parts[0] & 0xff) << 24)
                    598:                        | (parts[1] & 0xffffff);
                    599:            break;
                    600: 
                    601:        case 3:
                    602:            val = ((parts[0] & 0xff) << 24)
                    603:                        | ((parts[1] & 0xff) << 16)
                    604:                        | (parts[2] & 0xffff);
                    605:            break;
                    606: 
                    607:        case 4:
                    608:            val = ((parts[0] & 0xff) << 24)
                    609:                        | ((parts[1] & 0xff) << 16)
                    610:                        | ((parts[2] & 0xff) << 8)
                    611:                        | (parts[3] & 0xff);
                    612:            break;
                    613: 
                    614:        default:
                    615:            return NOTOK;
                    616:     }
                    617: 
                    618:     return htonl (val);
                    619: }
                    620: 
                    621: u_long inet_network (cp)
                    622: char   *cp;
                    623: {
                    624:     register int    base;
                    625:     register char   c;
                    626:     register u_long val;
                    627:     u_long     parts[4];
                    628:     register u_long *pp = parts;
                    629: 
                    630:     for (;;) {
                    631:        val = 0, base = 10;
                    632:        if (*cp == '0')
                    633:            base = 8, cp++;
                    634:        if (*cp == 'x' || *cp == 'X')
                    635:            base = 16, cp++;
                    636: 
                    637:        for (; isxdigit (c = *cp); cp++)
                    638:            if (base == 16)
                    639:                val = (val << 4) + (c + 10 - (islower (c) ? 'a' : 'A'));
                    640:            else
                    641:                if (isdigit (c))
                    642:                    val = (val * base) + (c - '0');
                    643:                else
                    644:                    break;
                    645: 
                    646:        switch (*cp) {
                    647:            case '.': 
                    648:                if (pp >= parts + 4)
                    649:                    return NOTOK;
                    650:                *pp++ = val, cp++;
                    651:                continue;
                    652: 
                    653:            default: 
                    654:                if (*cp && !isspace (*cp))
                    655:                    return NOTOK;
                    656:                *pp++ = val;
                    657:                break;
                    658:        }
                    659: 
                    660:        break;
                    661:     }
                    662: 
                    663:     switch (pp - parts) {
                    664:        case 1:
                    665:            val = (parts[0] & 0xff) << 24;
                    666:            break;
                    667: 
                    668:        case 2:
                    669:            val = ((parts[0] & 0xff) << 24)
                    670:                        | ((parts[1] & 0xff) << 16);
                    671:            break;
                    672: 
                    673:        case 3:
                    674:            val = ((parts[0] & 0xff) << 24)
                    675:                        | ((parts[1] & 0xff) << 16)
                    676:                        | ((parts[2] & 0xff) << 8)
                    677:            break;
                    678: 
                    679:        case 4:
                    680:            val = ((parts[0] & 0xff) << 24)
                    681:                        | ((parts[1] & 0xff) << 16)
                    682:                        | ((parts[2] & 0xff) << 8)
                    683:                        | (parts[3] & 0xff);
                    684:            break;
                    685: 
                    686:        default:
                    687:            return NOTOK;
                    688:     }
                    689: 
                    690:     return htonl (val);
                    691: }
                    692: #endif
                    693: #endif

unix.superglobalmegacorp.com

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