X-Git-Url: https://git.distorted.org.uk/~mdw/adns/blobdiff_plain/d05cc33061a2dc90fe499e72fb50b766588891f3..11c8bf9bc50213e3774f8367ce3d5b17b2f95c49:/src/setup.c diff --git a/src/setup.c b/src/setup.c index 463779d..3852603 100644 --- a/src/setup.c +++ b/src/setup.c @@ -1,4 +1,25 @@ -/**/ +/* + * setup.c + * - configuration file parsing + * - management of global state + */ +/* + * This file is part of adns, which is Copyright (C) 1997, 1998 Ian Jackson + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2, or (at your option) + * any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + */ #include #include @@ -11,93 +32,19 @@ #include "internal.h" -void adns__vdiag(adns_state ads, const char *pfx, adns_initflags prevent, - int serv, const char *fmt, va_list al) { - if (!(ads->iflags & adns_if_debug) && (!prevent || (ads->iflags & prevent))) return; - if (serv>=0) { - fprintf(stderr,"adns%s: nameserver %s: ",pfx,inet_ntoa(ads->servers[serv].addr)); - } else { - fprintf(stderr,"adns%s: ",pfx); - } - vfprintf(stderr,fmt,al); - fputc('\n',stderr); -} - -void adns__debug(adns_state ads, int serv, const char *fmt, ...) { - va_list al; - - va_start(al,fmt); - adns__vdiag(ads," debug",0,serv,fmt,al); - va_end(al); -} - -void adns__warn(adns_state ads, int serv, const char *fmt, ...) { - va_list al; - - va_start(al,fmt); - adns__vdiag(ads," warning",adns_if_noerrprint|adns_if_noserverwarn,serv,fmt,al); - va_end(al); -} - -void adns__diag(adns_state ads, int serv, const char *fmt, ...) { - va_list al; - - va_start(al,fmt); - adns__vdiag(ads,"",adns_if_noerrprint,serv,fmt,al); - va_end(al); -} - - -void adns__vbuf_init(vbuf *vb) { - vb->used= vb->avail= 0; vb->buf= 0; -} - -int adns__vbuf_ensure(vbuf *vb, int want) { - void *nb; - - if (vb->avail >= want) return 1; - nb= realloc(vb->buf,want); if (!nb) return 0; - vb->buf= nb; - vb->avail= want; - return 1; -} - -void adns__vbuf_appendq(vbuf *vb, const byte *data, int len) { - memcpy(vb->buf+vb->used,data,len); - vb->used+= len; -} - -int adns__vbuf_append(vbuf *vb, const byte *data, int len) { - int newlen; - void *nb; - - newlen= vb->used+len; - if (vb->avail < newlen) { - newlen <<= 1; - nb= realloc(vb->buf,newlen); - if (!nb) { newlen >>= 1; nb= realloc(vb->buf,newlen); } - if (!nb) return 0; - vb->buf= nb; - vb->avail= newlen; - } - adns__vbuf_appendq(vb,data,len); - return 1; -} - - static void addserver(adns_state ads, struct in_addr addr) { int i; struct server *ss; for (i=0; inservers; i++) { if (ads->servers[i].addr.s_addr == addr.s_addr) { - adns__debug(ads,-1,"duplicate nameserver %s ignored",inet_ntoa(addr)); + adns__debug(ads,-1,0,"duplicate nameserver %s ignored",inet_ntoa(addr)); return; } } if (ads->nservers>=MAXSERVERS) { - adns__diag(ads,-1,"too many nameservers, ignoring %s",inet_ntoa(addr)); + adns__diag(ads,-1,0,"too many nameservers, ignoring %s",inet_ntoa(addr)); return; } @@ -126,22 +73,22 @@ static void ccf_nameserver(adns_state ads, const char *fn, int lno, const char * configparseerr(ads,fn,lno,"invalid nameserver address `%s'",buf); return; } - adns__debug(ads,-1,"using nameserver %s",inet_ntoa(ia)); + adns__debug(ads,-1,0,"using nameserver %s",inet_ntoa(ia)); addserver(ads,ia); } static void ccf_search(adns_state ads, const char *fn, int lno, const char *buf) { if (!buf) return; - adns__diag(ads,-1,"warning - `search' ignored FIXME"); + adns__diag(ads,-1,0,"warning - `search' ignored fixme"); } static void ccf_sortlist(adns_state ads, const char *fn, int lno, const char *buf) { - adns__diag(ads,-1,"warning - `sortlist' ignored FIXME"); + adns__diag(ads,-1,0,"warning - `sortlist' ignored fixme"); } static void ccf_options(adns_state ads, const char *fn, int lno, const char *buf) { if (!buf) return; - adns__diag(ads,-1,"warning - `options' ignored FIXME"); + adns__diag(ads,-1,0,"warning - `options' ignored fixme"); } static void ccf_clearnss(adns_state ads, const char *fn, int lno, const char *buf) { @@ -170,10 +117,10 @@ static void readconfig(adns_state ads, const char *filename) { file= fopen(filename,"r"); if (!file) { if (errno == ENOENT) { - adns__debug(ads,-1,"configuration file `%s' does not exist",filename); + adns__debug(ads,-1,0,"configuration file `%s' does not exist",filename); return; } - adns__diag(ads,-1,"cannot open configuration file `%s': %s", + adns__diag(ads,-1,0,"cannot open configuration file `%s': %s", filename,strerror(errno)); return; } @@ -182,7 +129,7 @@ static void readconfig(adns_state ads, const char *filename) { l= strlen(linebuf); if (!l) continue; if (linebuf[l-1] != '\n' && !feof(file)) { - adns__diag(ads,-1,"%s:%d: line too long",filename,lno); + adns__diag(ads,-1,0,"%s:%d: line too long",filename,lno); while ((c= getc(file)) != EOF && c != '\n') { } if (c == EOF) break; continue; @@ -198,7 +145,7 @@ static void readconfig(adns_state ads, const char *filename) { ccip->name && strncmp(ccip->name,p,q-p); ccip++); if (!ccip->name) { - adns__diag(ads,-1,"%s:%d: unknown configuration directive `%.*s'", + adns__diag(ads,-1,0,"%s:%d: unknown configuration directive `%.*s'", filename,lno,q-p,p); continue; } @@ -206,7 +153,7 @@ static void readconfig(adns_state ads, const char *filename) { ccip->fn(ads,filename,lno,q); } if (ferror(file)) { - adns__diag(ads,-1,"%s:%d: read error: %s",filename,lno,strerror(errno)); + adns__diag(ads,-1,0,"%s:%d: read error: %s",filename,lno,strerror(errno)); } fclose(file); } @@ -215,8 +162,8 @@ static const char *instrum_getenv(adns_state ads, const char *envvar) { const char *value; value= getenv(envvar); - if (!value) adns__debug(ads,-1,"environment variable %s not set",envvar); - else adns__debug(ads,-1,"environment variable %s set to `%s'",envvar,value); + if (!value) adns__debug(ads,-1,0,"environment variable %s not set",envvar); + else adns__debug(ads,-1,0,"environment variable %s set to `%s'",envvar,value); return value; } @@ -224,7 +171,7 @@ static void readconfigenv(adns_state ads, const char *envvar) { const char *filename; if (ads->iflags & adns_if_noenv) { - adns__debug(ads,-1,"not checking environment variable `%s'",envvar); + adns__debug(ads,-1,0,"not checking environment variable `%s'",envvar); return; } filename= instrum_getenv(ads,envvar); @@ -255,7 +202,6 @@ int adns_init(adns_state *ads_r, adns_initflags flags, FILE *diagfile) { LIST_INIT(ads->output); ads->nextid= 0x311f; ads->udpsocket= ads->tcpsocket= -1; - adns__vbuf_init(&ads->rqbuf); adns__vbuf_init(&ads->tcpsend); adns__vbuf_init(&ads->tcprecv); ads->nservers= ads->tcpserver= 0; @@ -289,16 +235,19 @@ int adns_init(adns_state *ads_r, adns_initflags flags, FILE *diagfile) { ads->udpsocket= socket(AF_INET,SOCK_DGRAM,proto->p_proto); if (ads->udpsocket<0) { r= errno; goto x_free; } - /*fixme: nonblock */ + r= adns__setnonblock(ads,ads->udpsocket); + if (r) { r= errno; goto x_closeudp; } *ads_r= ads; return 0; + x_closeudp: + close(ads->udpsocket); x_free: free(ads); return r; } int adns_finish(adns_state ads) { - abort(); /* FIXME */ + abort(); /* fixme */ }