📄 setup.c
字号:
*p++= 0; return i; x_badline: saveerr(ads,EINVAL); while ((c= getc(file)) != EOF && c != '\n'); return -2;}static int gl_text(adns_state ads, getline_ctx *src_io, const char *filename, int lno, char *buf, int buflen) { const char *cp= src_io->text; int l; if (!cp || !*cp) return -1; if (*cp == ';' || *cp == '\n') cp++; l= strcspn(cp,";\n"); src_io->text = cp+l; if (l >= buflen) { adns__diag(ads,-1,0,"%s:%d: line too long, ignored",filename,lno); saveerr(ads,EINVAL); return -2; } memcpy(buf,cp,l); buf[l]= 0; return l;}static void readconfiggeneric(adns_state ads, const char *filename, int (*getline)(adns_state ads, getline_ctx*, const char *filename, int lno, char *buf, int buflen), /* Returns >=0 for success, -1 for EOF or error * (error will have been reported), or -2 for * bad line was encountered, try again. */ getline_ctx gl_ctx) { char linebuf[2000], *p, *q; int lno, l, dirl; const struct configcommandinfo *ccip; for (lno=1; (l= getline(ads,&gl_ctx, filename,lno, linebuf,sizeof(linebuf))) != -1; lno++) { if (l == -2) continue; while (l>0 && ctype_whitespace(linebuf[l-1])) l--; linebuf[l]= 0; p= linebuf; while (ctype_whitespace(*p)) p++; if (*p == '#' || !*p) continue; q= p; while (*q && !ctype_whitespace(*q)) q++; dirl= q-p; for (ccip=configcommandinfos; ccip->name && !(strlen(ccip->name)==dirl && !memcmp(ccip->name,p,q-p)); ccip++); if (!ccip->name) { adns__diag(ads,-1,0,"%s:%d: unknown configuration directive `%.*s'", filename,lno,q-p,p); continue; } while (ctype_whitespace(*q)) q++; ccip->fn(ads,filename,lno,q); }}static const char *instrum_getenv(adns_state ads, const char *envvar) { const char *value; value= getenv(envvar); 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;}static void readconfig(adns_state ads, const char *filename, int warnmissing) { getline_ctx gl_ctx; gl_ctx.file= fopen(filename,"r"); if (!gl_ctx.file) { if (errno == ENOENT) { if (warnmissing) adns__debug(ads,-1,0,"configuration file `%s' does not exist",filename); return; } saveerr(ads,errno); adns__diag(ads,-1,0,"cannot open configuration file `%s': %s", filename,strerror(errno)); return; } readconfiggeneric(ads,filename,gl_file,gl_ctx); fclose(gl_ctx.file);}static void readconfigtext(adns_state ads, const char *text, const char *showname) { getline_ctx gl_ctx; gl_ctx.text= text; readconfiggeneric(ads,showname,gl_text,gl_ctx);} static void readconfigenv(adns_state ads, const char *envvar) { const char *filename; if (ads->iflags & adns_if_noenv) { adns__debug(ads,-1,0,"not checking environment variable `%s'",envvar); return; } filename= instrum_getenv(ads,envvar); if (filename) readconfig(ads,filename,1);}static void readconfigenvtext(adns_state ads, const char *envvar) { const char *textdata; if (ads->iflags & adns_if_noenv) { adns__debug(ads,-1,0,"not checking environment variable `%s'",envvar); return; } textdata= instrum_getenv(ads,envvar); if (textdata) readconfigtext(ads,textdata,envvar);}int adns__setnonblock(adns_state ads, int fd) { int r; r= fcntl(fd,F_GETFL,0); if (r<0) return errno; r |= O_NONBLOCK; r= fcntl(fd,F_SETFL,r); if (r<0) return errno; return 0;}static int init_begin(adns_state *ads_r, adns_initflags flags, FILE *diagfile) { adns_state ads; ads= malloc(sizeof(*ads)); if (!ads) return errno; ads->iflags= flags; ads->diagfile= diagfile; ads->configerrno= 0; LIST_INIT(ads->udpw); LIST_INIT(ads->tcpw); LIST_INIT(ads->childw); LIST_INIT(ads->output); ads->forallnext= 0; ads->nextid= 0x311f; ads->udpsocket= ads->tcpsocket= -1; adns__vbuf_init(&ads->tcpsend); adns__vbuf_init(&ads->tcprecv); ads->tcprecv_skip= 0; ads->nservers= ads->nsortlist= ads->nsearchlist= ads->tcpserver= 0; ads->searchndots= 1; ads->tcpstate= server_disconnected; timerclear(&ads->tcptimeout); ads->searchlist= 0; *ads_r= ads; return 0;}static int init_finish(adns_state ads) { struct in_addr ia; struct protoent *proto; int r; if (!ads->nservers) { if (ads->diagfile && ads->iflags & adns_if_debug) fprintf(ads->diagfile,"adns: no nameservers, using localhost\n"); ia.s_addr= htonl(INADDR_LOOPBACK); addserver(ads,ia); } proto= getprotobyname("udp"); if (!proto) { r= ENOPROTOOPT; goto x_free; } ads->udpsocket= socket(AF_INET,SOCK_DGRAM,proto->p_proto); if (ads->udpsocket<0) { r= errno; goto x_free; } r= adns__setnonblock(ads,ads->udpsocket); if (r) { r= errno; goto x_closeudp; } return 0; x_closeudp: close(ads->udpsocket); x_free: free(ads); return r;}static void init_abort(adns_state ads) { if (ads->nsearchlist) { free(ads->searchlist[0]); free(ads->searchlist); } free(ads);}int adns_init(adns_state *ads_r, adns_initflags flags, FILE *diagfile) { adns_state ads; const char *res_options, *adns_res_options; int r; r= init_begin(&ads, flags, diagfile ? diagfile : stderr); if (r) return r; res_options= instrum_getenv(ads,"RES_OPTIONS"); adns_res_options= instrum_getenv(ads,"ADNS_RES_OPTIONS"); ccf_options(ads,"RES_OPTIONS",-1,res_options); ccf_options(ads,"ADNS_RES_OPTIONS",-1,adns_res_options); readconfig(ads,"/etc/resolv.conf",1); readconfig(ads,"/etc/resolv-adns.conf",0); readconfigenv(ads,"RES_CONF"); readconfigenv(ads,"ADNS_RES_CONF"); readconfigenvtext(ads,"RES_CONF_TEXT"); readconfigenvtext(ads,"ADNS_RES_CONF_TEXT"); ccf_options(ads,"RES_OPTIONS",-1,res_options); ccf_options(ads,"ADNS_RES_OPTIONS",-1,adns_res_options); ccf_search(ads,"LOCALDOMAIN",-1,instrum_getenv(ads,"LOCALDOMAIN")); ccf_search(ads,"ADNS_LOCALDOMAIN",-1,instrum_getenv(ads,"ADNS_LOCALDOMAIN")); if (ads->configerrno && ads->configerrno != EINVAL) { r= ads->configerrno; init_abort(ads); return r; } r= init_finish(ads); if (r) return r; adns__consistency(ads,0,cc_entex); *ads_r= ads; return 0;}int adns_init_strcfg(adns_state *ads_r, adns_initflags flags, FILE *diagfile, const char *configtext) { adns_state ads; int r; r= init_begin(&ads, flags, diagfile); if (r) return r; readconfigtext(ads,configtext,"<supplied configuration text>"); if (ads->configerrno) { r= ads->configerrno; init_abort(ads); return r; } r= init_finish(ads); if (r) return r; adns__consistency(ads,0,cc_entex); *ads_r= ads; return 0;}void adns_finish(adns_state ads) { adns__consistency(ads,0,cc_entex); for (;;) { if (ads->udpw.head) adns_cancel(ads->udpw.head); else if (ads->tcpw.head) adns_cancel(ads->tcpw.head); else if (ads->childw.head) adns_cancel(ads->childw.head); else if (ads->output.head) adns_cancel(ads->output.head); else break; } close(ads->udpsocket); if (ads->tcpsocket >= 0) close(ads->tcpsocket); adns__vbuf_free(&ads->tcpsend); adns__vbuf_free(&ads->tcprecv); freesearchlist(ads); free(ads);}void adns_forallqueries_begin(adns_state ads) { adns__consistency(ads,0,cc_entex); ads->forallnext= ads->udpw.head ? ads->udpw.head : ads->tcpw.head ? ads->tcpw.head : ads->childw.head ? ads->childw.head : ads->output.head;} adns_query adns_forallqueries_next(adns_state ads, void **context_r) { adns_query qu, nqu; adns__consistency(ads,0,cc_entex); nqu= ads->forallnext; for (;;) { qu= nqu; if (!qu) return 0; if (qu->next) { nqu= qu->next; } else if (qu == ads->udpw.tail) { nqu= ads->tcpw.head ? ads->tcpw.head : ads->childw.head ? ads->childw.head : ads->output.head; } else if (qu == ads->tcpw.tail) { nqu= ads->childw.head ? ads->childw.head : ads->output.head; } else if (qu == ads->childw.tail) { nqu= ads->output.head; } else { nqu= 0; } if (!qu->parent) break; } ads->forallnext= nqu; if (context_r) *context_r= qu->ctx.ext; return qu;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -