- /* unpack the reply */
- status = _lookup_all_rx(replyMsg, &data, &datalen, &token);
- switch (status)
- {
- case KERN_SUCCESS:
- break;
-
- case MIG_SERVER_DIED:
- if (--request->retry > 0)
- {
- /* retry the request */
- if (_lookup_all_tx(_lu_port, request->request.proc, request->request.data, request->request.dataLen, &request->replyPort) == KERN_SUCCESS)
- {
- request_queue(request);
- return FALSE;
- }
- }
- /* fall through */
-
- default:
- *error = HOST_NOT_FOUND;
- return TRUE;
- }
-
- datalen *= BYTES_PER_XDR_UNIT;
-
- if (token.val[0] != 0)
- {
- vm_deallocate(mach_task_self(), (vm_address_t)data, datalen);
- *error = NO_RECOVERY;
- return TRUE;
- }
-
- xdrmem_create(&inxdr, data, datalen, XDR_DECODE);
-
- count = 0;
- if (!xdr_int(&inxdr, &count))
- {
- xdr_destroy(&inxdr);
- vm_deallocate(mach_task_self(), (vm_address_t)data, datalen);
- *error = NO_RECOVERY;
- return TRUE;
- }
-
- if (count == 0)
- {
- xdr_destroy(&inxdr);
- vm_deallocate(mach_task_self(), (vm_address_t)data, datalen);
- *error = HOST_NOT_FOUND;
- *he = NULL;
- return TRUE;
- }
-
- *he = extract_host(&inxdr, request->request.want, error);
- xdr_destroy(&inxdr);
- vm_deallocate(mach_task_self(), (vm_address_t)data, datalen);
- return TRUE;
-}
-
-mach_port_t
-gethostbyaddr_async_start(const char *addr, int len, int type, gethostbyaddr_async_callback callout, void *context)
-{
- a_request_callout_t cb;
- mach_port_t mp;
-
- if (!_lu_running())
- {
- h_errno = NO_RECOVERY;
- return MACH_PORT_NULL;
- }
-
- cb.hostAddr = callout;
- mp = _gethostbyaddr_async_start(addr, len, type, cb, context, &h_errno);
- return mp;
-}
-
-void
-gethostbyaddr_async_cancel(mach_port_t port)
-{
- _async_cancel(port);
- return;
-}
-
-void
-gethostbyaddr_async_handleReply(void *replyMsg)
-{
- int error = 0;
- struct hostent *he = NULL;
- a_requests_t *request = NULL;
-
- if (_gethostbyaddr_async_handleReply(replyMsg, &request, &he, &error))
- {
- /* if we have an answer to provide */
- h_errno = error;
- (request->callout.hostAddr)(he, request->context);
-
- (void)mach_port_mod_refs(mach_task_self(), request->replyPort, MACH_PORT_RIGHT_RECEIVE, -1);
- if (request->request.data) free(request->request.data);
- free(request);
- if (he != NULL) freehostent(he);
- }
-
- return;
-}
-
-mach_port_t
-getipnodebyaddr_async_start(const void *addr, size_t len, int af, int *error, getipnodebyaddr_async_callback callout, void *context)
-{
- a_request_callout_t cb;
- mach_port_t mp;
-
- if (!_lu_running())
- {
- *error = NO_RECOVERY;
- return MACH_PORT_NULL;
- }
-
- cb.nodeAddr = callout;
- mp = _gethostbyaddr_async_start(addr, len, af, cb, context, error);