Source-Changes archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

Re: CVS commit: basesrc



>  > Is there good reason for upgrading our resolver library to bind 8's
>  > now, or should we wait for bind 9?
> 
> IIRC, bind8's resolver library is tightly coupled w/ IRS, whereas we
> use nsswitch.

parts of it are coupled.

        get*by*() calls
                irs_*() calls
                        res_n*()

if irs_*() and res_n*() were dropped in, and if BIND's thread-safe (due to
their use of thread specific globals) versions of get*by*() were merged into
the nsswitch-style logic, then you'd have the best(*) of both worlds.

(*) if you think multiple worlds are good, which i at least do not.

e.g., see bsd/os "netstat -rn" which calls irs_nw() so as to get back rfc1101-
style netmasks from dns (or netmasks from /etc/networks for that matter.)

e.g., here's a program altavista uses to translate ip addresses to hostnames
en masse, using 1200 concurrent threads on one of their multiprocessors:

/*
 * manyhosts - thread-aware program to convert lots of addresses to hostnames
 * vix 12sep98 [wrote, during altavista contract]
 */

#ifndef lint
static const char rcsid[] = "$Id: manyhosts.c,v 1.2 1998/12/29 05:03:41 vixie 
Exp $";
#endif

#include <sys/types.h>
#include <sys/socket.h>

#include <netinet/in.h>
#include <arpa/inet.h>
#include <arpa/nameser.h>

#include <irs.h>
#include <netdb.h>
#include <pthread.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define P(x) if (!(x)) { perror(#x); exit(1); } else (void)0

static void *run(void *);

static int running = 0;
static pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
static pthread_cond_t cond = PTHREAD_COND_INITIALIZER;

main(int argc, char **argv) {
        int n;

        if (argc != 2) {
                fprintf(stderr, "usage: %s #threads\n", argv[0]);
                exit(1);
        }
        n = atoi(argv[1]);
        if (n < 1 || n > 65535) {
                fprintf(stderr, "%s: \"%s\" seems an unlikely #threads\n",
                        argv[0], argv[1]);
                exit(1);
        }
        setlinebuf(stdout);
        if (getenv("RES_OPTIONS") == NULL)
                putenv("RES_OPTIONS=rotate attempts:1 timeout:10");
        P(pthread_mutex_lock(&mutex) == 0);
        while (n-- > 0) {
                pthread_t t;

                P(pthread_create(&t, NULL, run, NULL) == 0);
                P(pthread_detach(t) == 0);
                running++;
        }
        P(pthread_cond_wait(&cond, &mutex) == 0);
        exit(0);
}

static void *
run(void *uap) /*UNUSED*/ {
        struct irs_acc *irs_dns;
        struct irs_ho *irs_ho;
        char line[20];

        /*
         * Instantiate an IRS DNS map class and host map object, which will
         * (as of BIND 8.1.3) have its own private DNS resolver context.
         */
        irs_dns = irs_dns_acc("");
        P(irs_dns != NULL);
        irs_ho = (*irs_dns->ho_map)(irs_dns);
        P(irs_ho != NULL);
        /*
         * Read host addresses until EOF.
         */
        while (fgets(line, sizeof line, stdin)) {       /* rendezvous point */
                char *nl = strchr(line, '\n');
                u_char addr[NS_INADDRSZ];
                struct hostent *hp;

                if (nl != NULL)
                        *nl = '\0';
                if (inet_pton(AF_INET, line, addr) < 1) {
                        printf("%s: _bad\n", line);
                        continue;
                }
                hp = (*irs_ho->byaddr)(irs_ho, addr, NS_INADDRSZ, AF_INET);
                if (hp == NULL) {
                        printf("%s: _not\n", line);     /* XXX reason? */
                        continue;
                }
                printf("%s: %s\n", line, hp->h_name);
        }
        (*irs_ho->close)(irs_ho);
        (*irs_dns->close)(irs_dns);
        P(pthread_mutex_lock(&mutex) == 0);
        if (--running == 0)
                P(pthread_cond_signal(&cond) == 0);
        P(pthread_mutex_unlock(&mutex) == 0);
        return (NULL);
}



Home | Main Index | Thread Index | Old Index