void do_firedns_getip6(firedns_state *state, char * string) { int fd; fd_set s; int n; struct timeval tv; char *m; struct in6_addr addr6; fprintf(stderr,"taking firedns_getip6(%s): ",string); fd = firedns_getip6(state, string); fprintf(stderr,"%d\n",fd); if (fd == -1) return; tv.tv_sec = 5; tv.tv_usec = 0; FD_ZERO(&s); FD_SET(fd,&s); n = select(fd + 1,&s,NULL,NULL,&tv); (void) n; m = firedns_getresult(state, fd); if (m == NULL) fprintf(stderr,"getting result: (null)\n"); else { memcpy(&addr6,m,sizeof(struct in6_addr)); char result[256]; firedns_ntoa6(&addr6, result); fprintf(stderr,"getting result: %s\n", result); } }
void do_firedns_dnsbl_lookup(firedns_state *state, char * ip, char * string) { int fd; fd_set s; int n; struct timeval tv; char *m; struct in_addr *i; struct in_addr buf4; i = firedns_aton4(ip, &buf4); fprintf(stderr,"taking firedns_dnsbl_lookup(%s,%s): ",ip,string); fd = firedns_dnsbl_lookup_txt(state, i,string); fprintf(stderr,"%d\n",fd); if (fd == -1) return; tv.tv_sec = 5; tv.tv_usec = 0; FD_ZERO(&s); FD_SET(fd,&s); n = select(fd + 1,&s,NULL,NULL,&tv); (void) n; m = firedns_getresult(state, fd); fprintf(stderr,"getting result: %s\n",m); }
void do_firedns_getname6(firedns_state *state, char * string) { int fd; fd_set s; int n; struct timeval tv; char *m; struct in6_addr *addr6; struct in6_addr buf6; fprintf(stderr,"taking firedns_getname6(%s): ",string); addr6 = firedns_aton6(string, &buf6); if (addr6 == NULL) { fprintf(stderr,"(null)\n"); return; } fd = firedns_getname6(state, addr6); fprintf(stderr,"%d\n",fd); if (fd == -1) return; tv.tv_sec = 5; tv.tv_usec = 0; FD_ZERO(&s); FD_SET(fd,&s); n = select(fd + 1,&s,NULL,NULL,&tv); (void) n; m = firedns_getresult(state, fd); fprintf(stderr,"getting result: %s\n",m); }
void do_firedns_gettxt(firedns_state *state, char * string) { int fd; fd_set s; int n; struct timeval tv; char *m; fprintf(stderr,"taking firedns_gettxt(%s): ",string); fd = firedns_gettxt(state, string); fprintf(stderr,"%d\n",fd); if (fd == -1) return; tv.tv_sec = 5; tv.tv_usec = 0; FD_ZERO(&s); FD_SET(fd,&s); n = select(fd + 1,&s,NULL,NULL,&tv); (void) n; m = firedns_getresult(state, fd); fprintf(stderr,"getting result: %s\n",m); }
char *firedns_resolvetxt(firedns_state* self, const char* name) { int fd; int t,i; char * restrict ret; fd_set s; struct timeval tv; for (t = 0; t < FIREDNS_TRIES; t++) { fd = firedns_gettxt(self, name); if (fd == -1) return NULL; tv.tv_sec = 5; tv.tv_usec = 0; FD_ZERO(&s); FD_SET(fd,&s); i = select(fd + 1,&s,NULL,NULL,&tv); ret = firedns_getresult(self, fd); if (ret != NULL || i != 0) return ret; } return NULL; }
struct firedns_mxlist *firedns_resolvemxalist(const char *name) { int t,i,n,c = 0; int cname_fd[256] = {0}; int alist_fd[256] = {0}; int a6list_fd[256] = {0}; void *ret; struct firedns_mxlist *mxlist, *iter; fd_set s; struct timeval tv; int firstround = 1; mxlist = firedns_resolvemxlist_r(name); if (mxlist == NULL) { mxlist = (struct firedns_mxlist *) firestring_malloc(sizeof(struct firedns_mxlist) + strlen(name) + 1 + FIREDNS_ALIGN); mxlist->next = NULL; mxlist->cname = NULL; mxlist->ip4list = NULL; mxlist->ip6list = NULL; mxlist->protocol = FIREDNS_MX_SMTP; mxlist->priority = 0; mxlist->name = (char *) firedns_align(((char *)mxlist) + sizeof(struct firedns_mxlist)); strcpy(mxlist->name,name); } /* walk the list and allocate A space */ iter = mxlist; while (iter != NULL) { iter->ip4list = (struct firedns_ip4list *) firestring_malloc(RESULTSIZE); iter->ip6list = (struct firedns_ip6list *) firestring_malloc(RESULTSIZE); iter->cname = (char *) firestring_malloc(RESULTSIZE); iter = iter->next; c += 3; } /* check CNAME and A list records for each MX returned */ for (t = 0; t < FIREDNS_TRIES; t++) { iter = mxlist; n = i = 0; FD_ZERO(&s); while (iter != NULL) { if (cname_fd[i] != -1) { if (!firstround) (void) firedns_getresult(cname_fd[i]); cname_fd[i] = firedns_getcname(iter->name); if (cname_fd[i] == -1) { firedns_free_mxalist(mxlist); return NULL; } FD_SET(cname_fd[i],&s); n = max(n,cname_fd[i]); } if (alist_fd[i] != -1) { if (!firstround) (void) firedns_getresult(alist_fd[i]); alist_fd[i] = firedns_getip4list(iter->name); if (alist_fd[i] == -1) { firedns_free_mxalist(mxlist); return NULL; } FD_SET(alist_fd[i],&s); n = max(n,alist_fd[i]); } if (a6list_fd[i] != -1) { if (!firstround) (void) firedns_getresult(a6list_fd[i]); a6list_fd[i] = firedns_getip6list(iter->name); if (a6list_fd[i] == -1) { firedns_free_mxalist(mxlist); return NULL; } FD_SET(a6list_fd[i],&s); n = max(n,a6list_fd[i]); } i++; iter = iter->next; } firstround = 0; tv.tv_sec = 5; tv.tv_usec = 0; i = select(n + 1,&s,NULL,NULL,&tv); /* hack to make FIREDNS_TRIES sorta work as expected */ if (i == 0) continue; else t--; iter = mxlist; i = 0; while (iter != NULL) { if (cname_fd[i] != -1 && FD_ISSET(cname_fd[i],&s)) { ret = firedns_getresult_s(cname_fd[i],iter->cname); if (ret == NULL) { free(iter->cname); iter->cname = NULL; } cname_fd[i] = -1; c--; } if (alist_fd[i] != -1 && FD_ISSET(alist_fd[i],&s)) { ret = firedns_getresult_s(alist_fd[i],(char *)iter->ip4list); if (ret == NULL) { free(iter->ip4list); iter->ip4list = NULL; } alist_fd[i] = -1; c--; } if (a6list_fd[i] != -1 && FD_ISSET(a6list_fd[i],&s)) { ret = firedns_getresult_s(a6list_fd[i],(char *)iter->ip6list); if (ret == NULL) { free(iter->ip6list); iter->ip6list = NULL; } a6list_fd[i] = -1; c--; } i++; iter = iter->next; } if (c == 0) return mxlist; } iter = mxlist; i = 0; while (iter != NULL && c > 0) { if (cname_fd[i] != -1) { (void) firedns_getresult(cname_fd[i]); free(iter->cname); iter->cname = NULL; cname_fd[i] = -1; c--; } if (alist_fd[i] != -1) { (void) firedns_getresult(alist_fd[i]); free(iter->ip4list); iter->ip4list = NULL; alist_fd[i] = -1; c--; } if (a6list_fd[i] != -1) { (void) firedns_getresult(a6list_fd[i]); free(iter->ip6list); iter->ip6list = NULL; a6list_fd[i] = -1; c--; } i++; iter = iter->next; } free(mxlist); return NULL; }