static PyObject * DNSResolver_func_getnameinfo(DNSResolver *self, PyObject *args, PyObject *kwargs) { char *addr; int port, flags, length; struct in_addr addr4; struct in6_addr addr6; struct sockaddr *sa; struct sockaddr_in sa4; struct sockaddr_in6 sa6; ares_cb_data_t *cb_data; PyObject *callback; if (!PyArg_ParseTuple(args, "(si)iO:getnameinfo", &addr, &port, &flags, &callback)) { return NULL; } if (!PyCallable_Check(callback)) { PyErr_SetString(PyExc_TypeError, "a callable is required"); return NULL; } if (port < 0 || port > 65536) { PyErr_SetString(PyExc_ValueError, "port must be between 0 and 65536"); return NULL; } if (uv_inet_pton(AF_INET, addr, &addr4) == 1) { sa4 = uv_ip4_addr(addr, port); sa = (struct sockaddr *)&sa4; length = sizeof(struct sockaddr_in); } else if (uv_inet_pton(AF_INET6, addr, &addr6) == 1) { sa6 = uv_ip6_addr(addr, port); sa = (struct sockaddr *)&sa6; length = sizeof(struct sockaddr_in6); } else { PyErr_SetString(PyExc_ValueError, "invalid IP address"); return NULL; } cb_data = (ares_cb_data_t*) PyMem_Malloc(sizeof *cb_data); if (!cb_data) { return PyErr_NoMemory(); } Py_INCREF(callback); cb_data->resolver = self; cb_data->cb = callback; ares_getnameinfo(self->channel, sa, length, flags, &nameinfo_cb, (void *)cb_data); Py_RETURN_NONE; }
static PyObject * Channel_func_getnameinfo(Channel *self, PyObject *args) { char *addr; int port, flags, length; struct in_addr addr4; struct in6_addr addr6; struct sockaddr *sa; struct sockaddr_in sa4; struct sockaddr_in6 sa6; PyObject *callback; CHECK_CHANNEL(self); if (!PyArg_ParseTuple(args, "(si)iO:getnameinfo", &addr, &port, &flags, &callback)) { return NULL; } if (!PyCallable_Check(callback)) { PyErr_SetString(PyExc_TypeError, "a callable is required"); return NULL; } if (port < 0 || port > 65535) { PyErr_SetString(PyExc_ValueError, "port must be between 0 and 65535"); return NULL; } if (ares_inet_pton(AF_INET, addr, &addr4) == 1) { sa4 = uv_ip4_addr(addr, port); sa = (struct sockaddr *)&sa4; length = sizeof(struct sockaddr_in); } else if (ares_inet_pton(AF_INET6, addr, &addr6) == 1) { sa6 = uv_ip6_addr(addr, port); sa = (struct sockaddr *)&sa6; length = sizeof(struct sockaddr_in6); } else { PyErr_SetString(PyExc_ValueError, "invalid IP address"); return NULL; } Py_INCREF(callback); ares_getnameinfo(self->channel, sa, length, flags, &nameinfo_cb, (void *)callback); Py_RETURN_NONE; }
static Eina_Bool _ecore_con_info_ares_getnameinfo(Ecore_Con_CAres *arg, int addrtype, const char *name, struct sockaddr *addr, int addrlen) { int length = 0; if (name) length = strlen(name) + 1; else length = 1; arg->result = malloc(sizeof(Ecore_Con_Info) + length); if (!arg->result) return EINA_FALSE; /* FIXME: What to do when hint is not set ? */ arg->result->info.ai_flags = arg->hints.ai_flags; arg->result->info.ai_socktype = arg->hints.ai_socktype; arg->result->info.ai_protocol = arg->hints.ai_protocol; arg->result->info.ai_family = addrtype; arg->result->info.ai_addrlen = addrlen; arg->result->info.ai_addr = addr; arg->result->info.ai_canonname = (char *)(arg->result + 1); if (!name) *arg->result->info.ai_canonname = '\0'; else strcpy(arg->result->info.ai_canonname, name); arg->result->info.ai_next = NULL; ares_getnameinfo( info_channel, addr, addrlen, ARES_NI_NUMERICSERV | ARES_NI_NUMERICHOST | ARES_NI_LOOKUPSERVICE | ARES_NI_LOOKUPHOST, (ares_nameinfo_callback)_ecore_con_info_ares_nameinfo, arg); return EINA_TRUE; }
void LLAres::getNameInfo(const struct sockaddr &sa, socklen_t salen, int flags, NameInfoResponder *resp) { ares_getnameinfo(chan_, &sa, salen, flags, nameinfo_callback, new LLPointer<NameInfoResponder>(resp)); }