⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 setup.c

📁 larbin是一种开源的网络爬虫/网络蜘蛛
💻 C
📖 第 1 页 / 共 2 页
字号:
  *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 + -