Пример #1
0
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);
	}
}
Пример #2
0
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);
}
Пример #3
0
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);
}
Пример #4
0
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);
}
Пример #5
0
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;
}
Пример #6
0
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;
}