Blame missing_d/getaddrinfo.c

Packit 575503
#ifndef HAVE_SOCKETS
Packit 575503
#error getaddrinfo.c included by mistake! no socket support!
Packit 575503
#else
Packit 575503
#include <sys/types.h>
Packit 575503
#include <sys/socket.h>
Packit 575503
#ifdef HAVE_NETDB_H
Packit 575503
#include <netdb.h>
Packit 575503
#endif
Packit 575503
#ifdef HAVE_NETINET_IN_H
Packit 575503
#include <netinet/in.h>
Packit 575503
#endif
Packit 575503
#ifdef HAVE_ARPA_INET_H
Packit 575503
#include <arpa/inet.h>
Packit 575503
#endif
Packit 575503
#include <errno.h>
Packit 575503
#include <string.h>	/* strerror */
Packit 575503
Packit 575503
#include "getaddrinfo.h"
Packit 575503
Packit 575503
void
Packit 575503
freeaddrinfo(struct addrinfo *res)
Packit 575503
{
Packit 575503
	if (res->ai_addr != NULL)
Packit 575503
		free(res->ai_addr);
Packit 575503
	free(res);
Packit 575503
}
Packit 575503
Packit 575503
int
Packit 575503
getaddrinfo(const char *hostname, const char *portname,
Packit 575503
	struct addrinfo *hints, struct addrinfo **res)
Packit 575503
{
Packit 575503
	struct addrinfo *out;
Packit 575503
	if (res == NULL)
Packit 575503
		return EINVAL;
Packit 575503
Packit 575503
	out = (struct addrinfo *) calloc(1, sizeof(*out));
Packit 575503
	if (out == NULL) {
Packit 575503
		*res = NULL;
Packit 575503
		return ENOMEM;
Packit 575503
	}
Packit 575503
Packit 575503
	out->ai_addr = (struct sockaddr *) malloc(sizeof(struct sockaddr_in));
Packit 575503
	if (out->ai_addr == NULL) {
Packit 575503
		free(out);
Packit 575503
		*res = NULL;
Packit 575503
		return ENOMEM;
Packit 575503
	}
Packit 575503
Packit 575503
	out->ai_socktype = SOCK_STREAM;
Packit 575503
	if (hints != NULL) {
Packit 575503
		if (hints->ai_socktype)
Packit 575503
			out->ai_socktype = hints->ai_socktype;
Packit 575503
		if (hints->ai_protocol)
Packit 575503
			out->ai_protocol = hints->ai_protocol;
Packit 575503
	}
Packit 575503
Packit 575503
	if (out->ai_protocol == 0) {
Packit 575503
		switch (out->ai_socktype) {
Packit 575503
		case SOCK_STREAM:
Packit 575503
			out->ai_protocol = IPPROTO_TCP;
Packit 575503
			break;
Packit 575503
		case SOCK_DGRAM:
Packit 575503
			out->ai_protocol = IPPROTO_UDP;
Packit 575503
			break;
Packit 575503
		case SOCK_RAW:
Packit 575503
			out->ai_protocol = IPPROTO_RAW;
Packit 575503
			break;
Packit 575503
		}
Packit 575503
	}
Packit 575503
Packit 575503
	out->ai_addrlen = sizeof(struct sockaddr_in);
Packit 575503
	memset(out->ai_addr, '\0', sizeof(struct sockaddr_in));
Packit 575503
Packit 575503
	if (hostname != NULL) {
Packit 575503
		struct hostent *he;
Packit 575503
		he = gethostbyname(hostname);
Packit 575503
		if (he != NULL && he->h_addr_list != NULL) {
Packit 575503
			((struct sockaddr_in *)out->ai_addr)->sin_addr.s_addr
Packit 575503
				= ((struct in_addr *)he->h_addr_list[0])->s_addr;
Packit 575503
		} else {
Packit 575503
			freeaddrinfo(out);
Packit 575503
			return EADDRNOTAVAIL;
Packit 575503
		}
Packit 575503
	} else {
Packit 575503
		if (!(out->ai_flags & AI_PASSIVE))
Packit 575503
			((struct sockaddr_in *)out->ai_addr)->sin_addr.s_addr
Packit 575503
							= htonl(INADDR_ANY);
Packit 575503
	}
Packit 575503
	((struct sockaddr_in *)out->ai_addr)->sin_family = AF_INET;
Packit 575503
	out->ai_family = AF_INET;
Packit 575503
Packit 575503
	if (portname != NULL && *portname) {
Packit 575503
		long portnum;
Packit 575503
		char *end;
Packit 575503
		portnum = strtol(portname, &end, 10);
Packit 575503
		if (*end == '\0' && portnum > 0 && portnum < 65536) {
Packit 575503
			((struct sockaddr_in *)out->ai_addr)->sin_port
Packit 575503
							= htons(portnum);
Packit 575503
		} else {
Packit 575503
			struct servent *se;
Packit 575503
			se = getservbyname(portname, NULL);
Packit 575503
			if (se != NULL) {
Packit 575503
				((struct sockaddr_in *)out->ai_addr)->sin_port
Packit 575503
							= se->s_port;
Packit 575503
			}
Packit 575503
		}
Packit 575503
	}
Packit 575503
Packit 575503
	*res = out;
Packit 575503
Packit 575503
	return 0;
Packit 575503
}
Packit 575503
Packit 575503
const char *
Packit 575503
gai_strerror(int errcode)
Packit 575503
{
Packit 575503
	return strerror(errcode);
Packit 575503
}
Packit 575503
#endif