Example #1
0
	/* assert(0); */
	return;
}

#ifndef __KERNEL__	/* gfarm_sockaddr_to_name:: apl */
gfarm_error_t
gfarm_sockaddr_to_name(struct sockaddr *addr, char **namep)
{
	struct addrinfo hints, *res, *res0;
	struct sockaddr_in *sin1, *sin2;
	char *s, name[NI_MAXHOST];

	if (gfarm_getnameinfo(addr, sizeof(*addr), name, sizeof(name),
	    NULL, 0, NI_NAMEREQD) != 0) {
		gflog_debug(GFARM_MSG_1000863,
			"Cannot get name info from IP address: %s",
			gfarm_error_string(
		GFARM_ERR_CANNOT_RESOLVE_AN_IP_ADDRESS_INTO_A_HOSTNAME));
		return (GFARM_ERR_CANNOT_RESOLVE_AN_IP_ADDRESS_INTO_A_HOSTNAME);
	}

	memset(&hints, 0, sizeof(hints));
	hints.ai_family = addr->sa_family;
	if (gfarm_getaddrinfo(name, NULL, &hints, &res0) != 0) {
		gflog_debug(GFARM_MSG_1000864,
			"gfarm_getaddrinfo() failed: %s",
			gfarm_error_string(
			GFARM_ERRMSG_REVERSE_LOOKUP_NAME_IS_NOT_RESOLVABLE));
		return (GFARM_ERRMSG_REVERSE_LOOKUP_NAME_IS_NOT_RESOLVABLE);
	}
	for (res = res0; res; res = res->ai_next) {
		if (res->ai_family != addr->sa_family)
			continue;
		switch (res->ai_family) {
		case AF_INET:
			sin1 = (struct sockaddr_in *)res->ai_addr;
			sin2 = (struct sockaddr_in *)addr;
			if (sin1->sin_addr.s_addr == sin2->sin_addr.s_addr) {
				s = strdup(name);
				gfarm_freeaddrinfo(res0);
				if (s == NULL) {
					gflog_debug(GFARM_MSG_1000865,
						"allocation of string failed:"
						" %s",
						gfarm_error_string(
						GFARM_ERR_NO_MEMORY));
					return (GFARM_ERR_NO_MEMORY);
				}
				*namep = s;
				return (GFARM_ERR_NO_ERROR); /* success */
			}
			break;
		}
	}
	gfarm_freeaddrinfo(res0);
	return (GFARM_ERRMSG_REVERSE_LOOKUP_NAME_DOES_NOT_MATCH);
}
Example #2
0
gfarm_error_t
gfarm_bind_source_ip(int sock, const char *source_ip)
{
	struct addrinfo shints, *sres;
	int rv, save_errno;

	memset(&shints, 0, sizeof(shints));
	shints.ai_family = AF_INET;
	shints.ai_socktype = SOCK_STREAM;
	shints.ai_flags = AI_PASSIVE;
	if (gfarm_getaddrinfo(source_ip, NULL, &shints, &sres) != 0)
		return (GFARM_ERR_UNKNOWN_HOST);

	rv = bind(sock, sres->ai_addr, sres->ai_addrlen);
	save_errno = errno;
	gfarm_freeaddrinfo(sres);
	if (rv == -1)
		return (gfarm_errno_to_error(save_errno));
	return (GFARM_ERR_NO_ERROR);
}