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

📄 getaddrinfo.c

📁 bind 9.3结合mysql数据库
💻 C
📖 第 1 页 / 共 2 页
字号:
		if (err != 0)			return (err);	}	if (ai_list == NULL)		return (EAI_NODATA);done:	ai_list = ai_reverse(ai_list);	*res = ai_list;	return (0);}static char *lwres_strsep(char **stringp, const char *delim) {	char *string = *stringp;	char *s;	const char *d;	char sc, dc;	if (string == NULL)		return (NULL);	for (s = string; *s != '\0'; s++) {		sc = *s;		for (d = delim; (dc = *d) != '\0'; d++)			if (sc == dc) {				*s++ = '\0';				*stringp = s;				return (string);			}	}	*stringp = NULL;	return (string);}static voidset_order(int family, int (**net_order)(const char *, int, struct addrinfo **,					int, int)){	char *order, *tok;	int found;	if (family) {		switch (family) {		case AF_INET:			*net_order++ = add_ipv4;			break;		case AF_INET6:			*net_order++ = add_ipv6;			break;		}	} else {		order = getenv("NET_ORDER");		found = 0;		while (order != NULL) {			/*			 * We ignore any unknown names.			 */			tok = lwres_strsep(&order, ":");			if (strcasecmp(tok, "inet6") == 0) {				if ((found & FOUND_IPV6) == 0)					*net_order++ = add_ipv6;				found |= FOUND_IPV6;			} else if (strcasecmp(tok, "inet") == 0 ||			    strcasecmp(tok, "inet4") == 0) {				if ((found & FOUND_IPV4) == 0)					*net_order++ = add_ipv4;				found |= FOUND_IPV4;			}		}		/*		 * Add in anything that we didn't find.		 */		if ((found & FOUND_IPV4) == 0)			*net_order++ = add_ipv4;		if ((found & FOUND_IPV6) == 0)			*net_order++ = add_ipv6;	}	*net_order = NULL;	return;}static char v4_loop[4] = { 127, 0, 0, 1 };/* * The test against 0 is there to keep the Solaris compiler * from complaining about "end-of-loop code not reached". */#define ERR(code) \	do { result = (code);			\		if (result != 0) goto cleanup;	\	} while (0)static intadd_ipv4(const char *hostname, int flags, struct addrinfo **aip,	int socktype, int port){	struct addrinfo *ai;	lwres_context_t *lwrctx = NULL;	lwres_gabnresponse_t *by = NULL;	lwres_addr_t *addr;	lwres_result_t lwres;	int result = 0;	lwres = lwres_context_create(&lwrctx, NULL, NULL, NULL, 0);	if (lwres != LWRES_R_SUCCESS)		ERR(EAI_FAIL);	(void) lwres_conf_parse(lwrctx, lwres_resolv_conf);	if (hostname == NULL && (flags & AI_PASSIVE) == 0) {		ai = ai_clone(*aip, AF_INET);		if (ai == NULL) {			lwres_freeaddrinfo(*aip);			ERR(EAI_MEMORY);		}		*aip = ai;		ai->ai_socktype = socktype;		SIN(ai->ai_addr)->sin_port = port;		memcpy(&SIN(ai->ai_addr)->sin_addr, v4_loop, 4);	} else {		lwres = lwres_getaddrsbyname(lwrctx, hostname,					     LWRES_ADDRTYPE_V4, &by);		if (lwres != LWRES_R_SUCCESS) {			if (lwres == LWRES_R_NOTFOUND)				goto cleanup;			else				ERR(EAI_FAIL);		}		addr = LWRES_LIST_HEAD(by->addrs);		while (addr != NULL) {			ai = ai_clone(*aip, AF_INET);			if (ai == NULL) {				lwres_freeaddrinfo(*aip);				ERR(EAI_MEMORY);			}			*aip = ai;			ai->ai_socktype = socktype;			SIN(ai->ai_addr)->sin_port = port;			memcpy(&SIN(ai->ai_addr)->sin_addr,			       addr->address, 4);			if (flags & AI_CANONNAME) {				ai->ai_canonname = strdup(by->realname);				if (ai->ai_canonname == NULL)					ERR(EAI_MEMORY);			}			addr = LWRES_LIST_NEXT(addr, link);		}	} cleanup:	if (by != NULL)		lwres_gabnresponse_free(lwrctx, &by);	if (lwrctx != NULL) {		lwres_conf_clear(lwrctx);		lwres_context_destroy(&lwrctx);	}	return (result);}static char v6_loop[16] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1 };static intadd_ipv6(const char *hostname, int flags, struct addrinfo **aip,	 int socktype, int port){	struct addrinfo *ai;	lwres_context_t *lwrctx = NULL;	lwres_gabnresponse_t *by = NULL;	lwres_addr_t *addr;	lwres_result_t lwres;	int result = 0;	lwres = lwres_context_create(&lwrctx, NULL, NULL, NULL, 0);	if (lwres != LWRES_R_SUCCESS)		ERR(EAI_FAIL);	(void) lwres_conf_parse(lwrctx, lwres_resolv_conf);	if (hostname == NULL && (flags & AI_PASSIVE) == 0) {		ai = ai_clone(*aip, AF_INET6);		if (ai == NULL) {			lwres_freeaddrinfo(*aip);			ERR(EAI_MEMORY);		}		*aip = ai;		ai->ai_socktype = socktype;		SIN6(ai->ai_addr)->sin6_port = port;		memcpy(&SIN6(ai->ai_addr)->sin6_addr, v6_loop, 16);	} else {		lwres = lwres_getaddrsbyname(lwrctx, hostname,					     LWRES_ADDRTYPE_V6, &by);		if (lwres != LWRES_R_SUCCESS) {			if (lwres == LWRES_R_NOTFOUND)				goto cleanup;			else				ERR(EAI_FAIL);		}		addr = LWRES_LIST_HEAD(by->addrs);		while (addr != NULL) {			ai = ai_clone(*aip, AF_INET6);			if (ai == NULL) {				lwres_freeaddrinfo(*aip);				ERR(EAI_MEMORY);			}			*aip = ai;			ai->ai_socktype = socktype;			SIN6(ai->ai_addr)->sin6_port = port;			memcpy(&SIN6(ai->ai_addr)->sin6_addr,			       addr->address, 16);			if (flags & AI_CANONNAME) {				ai->ai_canonname = strdup(by->realname);				if (ai->ai_canonname == NULL)					ERR(EAI_MEMORY);			}			addr = LWRES_LIST_NEXT(addr, link);		}	} cleanup:	if (by != NULL)		lwres_gabnresponse_free(lwrctx, &by);	if (lwrctx != NULL) {		lwres_conf_clear(lwrctx);		lwres_context_destroy(&lwrctx);	}	return (result);}voidlwres_freeaddrinfo(struct addrinfo *ai) {	struct addrinfo *ai_next;	while (ai != NULL) {		ai_next = ai->ai_next;		if (ai->ai_addr != NULL)			free(ai->ai_addr);		if (ai->ai_canonname)			free(ai->ai_canonname);		free(ai);		ai = ai_next;	}}#ifdef AF_LOCALstatic intget_local(const char *name, int socktype, struct addrinfo **res) {	struct addrinfo *ai;	struct sockaddr_un *sun;	if (socktype == 0)		return (EAI_SOCKTYPE);	ai = ai_alloc(AF_LOCAL, sizeof(*sun));	if (ai == NULL)		return (EAI_MEMORY);	sun = SUN(ai->ai_addr);	strncpy(sun->sun_path, name, sizeof(sun->sun_path));	ai->ai_socktype = socktype;	/*	 * ai->ai_flags, ai->ai_protocol, ai->ai_canonname,	 * and ai->ai_next were initialized to zero.	 */	*res = ai;	return (0);}#endif/* * Allocate an addrinfo structure, and a sockaddr structure * of the specificed length.  We initialize: *	ai_addrlen *	ai_family *	ai_addr *	ai_addr->sa_family *	ai_addr->sa_len	(LWRES_PLATFORM_HAVESALEN) * and everything else is initialized to zero. */static struct addrinfo *ai_alloc(int family, int addrlen) {	struct addrinfo *ai;	ai = (struct addrinfo *)calloc(1, sizeof(*ai));	if (ai == NULL)		return (NULL);	ai->ai_addr = SA(calloc(1, addrlen));	if (ai->ai_addr == NULL) {		free(ai);		return (NULL);	}	ai->ai_addrlen = addrlen;	ai->ai_family = family;	ai->ai_addr->sa_family = family;#ifdef LWRES_PLATFORM_HAVESALEN	ai->ai_addr->sa_len = addrlen;#endif	return (ai);}static struct addrinfo *ai_clone(struct addrinfo *oai, int family) {	struct addrinfo *ai;	ai = ai_alloc(family, ((family == AF_INET6) ?	    sizeof(struct sockaddr_in6) : sizeof(struct sockaddr_in)));	if (ai == NULL) {		lwres_freeaddrinfo(oai);		return (NULL);	}	if (oai == NULL)		return (ai);	ai->ai_flags = oai->ai_flags;	ai->ai_socktype = oai->ai_socktype;	ai->ai_protocol = oai->ai_protocol;	ai->ai_canonname = NULL;	ai->ai_next = oai;	return (ai);}static struct addrinfo *ai_reverse(struct addrinfo *oai) {	struct addrinfo *nai, *tai;	nai = NULL;	while (oai != NULL) {		/*		 * Grab one off the old list.		 */		tai = oai;		oai = oai->ai_next;		/*		 * Put it on the front of the new list.		 */		tai->ai_next = nai;		nai = tai;	}	return (nai);}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -