/* 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); }
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); }