Annotation of 43BSD/lib/libc/net/res_init.c, revision 1.1

1.1     ! root        1: /*
        !             2:  * Copyright (c) 1985 Regents of the University of California.
        !             3:  * All rights reserved.  The Berkeley software License Agreement
        !             4:  * specifies the terms and conditions for redistribution.
        !             5:  */
        !             6: 
        !             7: #if defined(LIBC_SCCS) && !defined(lint)
        !             8: static char sccsid[] = "@(#)res_init.c 6.5 (Berkeley) 4/11/86";
        !             9: #endif LIBC_SCCS and not lint
        !            10: 
        !            11: #include <sys/types.h>
        !            12: #include <sys/socket.h>
        !            13: #include <netinet/in.h>
        !            14: #include <stdio.h>
        !            15: #include <arpa/nameser.h>
        !            16: #include <resolv.h>
        !            17: 
        !            18: /*
        !            19:  * Resolver configuration file. Contains the address of the
        !            20:  * inital name server to query and the default domain for
        !            21:  * non fully qualified domain names.
        !            22:  */
        !            23: 
        !            24: #ifdef CONFFILE
        !            25: char    *conffile = CONFFILE;
        !            26: #else
        !            27: char    *conffile = "/etc/resolv.conf";
        !            28: #endif
        !            29: 
        !            30: /*
        !            31:  * Resolver state default settings
        !            32:  */
        !            33: 
        !            34: #ifndef RES_TIMEOUT
        !            35: #define RES_TIMEOUT 4
        !            36: #endif
        !            37: 
        !            38: struct state _res = {
        !            39:     RES_TIMEOUT,                 /* retransmition time interval */
        !            40:     4,                           /* number of times to retransmit */
        !            41:     RES_RECURSE|RES_DEFNAMES,    /* options flags */
        !            42:     1,                           /* number of name servers */
        !            43: };
        !            44: 
        !            45: /*
        !            46:  * Set up default settings.  If the configuration file exist, the values
        !            47:  * there will have precedence.  Otherwise, the server address is set to
        !            48:  * INADDR_ANY and the default domain name comes from the gethostname().
        !            49:  *
        !            50:  * The configuration file should only be used if you want to redefine your
        !            51:  * domain or run without a server on your machine.
        !            52:  *
        !            53:  * Return 0 if completes successfully, -1 on error
        !            54:  */
        !            55: res_init()
        !            56: {
        !            57:     register FILE *fp;
        !            58:     char buf[BUFSIZ], *cp;
        !            59:     extern u_long inet_addr();
        !            60:     extern char *index();
        !            61:     extern char *strcpy(), *strncpy();
        !            62: #ifdef DEBUG
        !            63:     extern char *getenv();
        !            64: #endif DEBUG
        !            65:     int n = 0;    /* number of nameserver records read from file */
        !            66: 
        !            67:     _res.nsaddr.sin_addr.s_addr = INADDR_ANY;
        !            68:     _res.nsaddr.sin_family = AF_INET;
        !            69:     _res.nsaddr.sin_port = htons(NAMESERVER_PORT);
        !            70:     _res.nscount = 1;
        !            71:     _res.defdname[0] = '\0';
        !            72: 
        !            73:     if ((fp = fopen(conffile, "r")) != NULL) {
        !            74:         /* read the config file */
        !            75:         while (fgets(buf, sizeof(buf), fp) != NULL) {
        !            76:             /* read default domain name */
        !            77:             if (!strncmp(buf, "domain", sizeof("domain") - 1)) {
        !            78:                 cp = buf + sizeof("domain") - 1;
        !            79:                 while (*cp == ' ' || *cp == '\t')
        !            80:                     cp++;
        !            81:                 if (*cp == '\0')
        !            82:                     continue;
        !            83:                 (void)strncpy(_res.defdname, cp, sizeof(_res.defdname));
        !            84:                 _res.defdname[sizeof(_res.defdname) - 1] = '\0';
        !            85:                 if ((cp = index(_res.defdname, '\n')) != NULL)
        !            86:                     *cp = '\0';
        !            87:                 continue;
        !            88:             }
        !            89:             /* read nameservers to query */
        !            90:             if (!strncmp(buf, "nameserver", 
        !            91:                sizeof("nameserver") - 1) && (n < MAXNS)) {
        !            92:                 cp = buf + sizeof("nameserver") - 1;
        !            93:                 while (*cp == ' ' || *cp == '\t')
        !            94:                     cp++;
        !            95:                 if (*cp == '\0')
        !            96:                     continue;
        !            97:                 _res.nsaddr_list[n].sin_addr.s_addr = inet_addr(cp);
        !            98:                 if (_res.nsaddr_list[n].sin_addr.s_addr == (unsigned)-1) 
        !            99:                     _res.nsaddr_list[n].sin_addr.s_addr = INADDR_ANY;
        !           100:                 _res.nsaddr_list[n].sin_family = AF_INET;
        !           101:                 _res.nsaddr_list[n].sin_port = htons(NAMESERVER_PORT);
        !           102:                 if ( ++n >= MAXNS) { 
        !           103:                     n = MAXNS;
        !           104: #ifdef DEBUG
        !           105:                     if ( _res.options & RES_DEBUG )
        !           106:                         printf("MAXNS reached, reading resolv.conf\n");
        !           107: #endif DEBUG
        !           108:                 }
        !           109:                 continue;
        !           110:             }
        !           111:         }
        !           112:         if ( n > 1 ) 
        !           113:             _res.nscount = n;
        !           114:         (void) fclose(fp);
        !           115:     }
        !           116:     if (_res.defdname[0] == 0) {
        !           117:         if (gethostname(buf, sizeof(_res.defdname)) == 0 &&
        !           118:            (cp = index(buf, '.')))
        !           119:              (void)strcpy(_res.defdname, cp + 1);
        !           120:     }
        !           121: 
        !           122: #ifdef DEBUG
        !           123:     /* Allow user to override the local domain definition */
        !           124:     if ((cp = getenv("LOCALDOMAIN")) != NULL)
        !           125:         (void)strncpy(_res.defdname, cp, sizeof(_res.defdname));
        !           126: #endif DEBUG
        !           127:     _res.options |= RES_INIT;
        !           128:     return(0);
        !           129: }

unix.superglobalmegacorp.com

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