extern "C" int getaddrinfo(const char *node, const char *service, const struct addrinfo *hints, struct addrinfo **res) { struct addrinfo_extended addrinfo_res[ADDRINFO_MAX_RES]; struct addrinfo *rp; int numResults = 0; WRAPPER_HEADER(int, getaddrinfo, _real_getaddrinfo, node, service, hints, res); if (SYNC_IS_REPLAY) { WRAPPER_REPLAY_START(getaddrinfo); if (retval == 0) { *res = GET_FIELD(my_entry, getaddrinfo, ret_res); numResults = GET_FIELD(my_entry, getaddrinfo, num_res); WRAPPER_REPLAY_READ_FROM_READ_LOG(getaddrinfo, (void*) addrinfo_res, (numResults * sizeof (struct addrinfo_extended))); for (int i = 0; i < numResults; i++) { struct addrinfo_extended *ext_info = &addrinfo_res[i]; struct addrinfo *_addrinfo = &(addrinfo_res[i]._addrinfo); struct sockaddr *_sockaddr = &(addrinfo_res[i]._sockaddr); memcpy(ext_info->_addrinfo_p, _addrinfo, sizeof(struct addrinfo)); memcpy(_addrinfo->ai_addr, _sockaddr, _addrinfo->ai_addrlen); if (_addrinfo->ai_canonname != NULL) { strncpy(_addrinfo->ai_canonname, ext_info->canonname, sizeof(ext_info->canonname)); } } } WRAPPER_REPLAY_END(getaddrinfo); } else if (SYNC_IS_RECORD) { isOptionalEvent = true; retval = _real_getaddrinfo(node, service, hints, res); isOptionalEvent = false; if (retval == 0) { SET_FIELD2(my_entry, getaddrinfo, ret_res, *res); for (rp = *res; rp != NULL; rp = rp->ai_next) { JASSERT(numResults < ADDRINFO_MAX_RES); struct addrinfo_extended *ext_info = &addrinfo_res[numResults]; struct addrinfo *_addrinfo = &(addrinfo_res[numResults]._addrinfo); struct sockaddr *_sockaddr = &(addrinfo_res[numResults]._sockaddr); ext_info->_addrinfo_p = rp; memcpy(_addrinfo, rp, sizeof (struct addrinfo)); memcpy(_sockaddr, rp->ai_addr, rp->ai_addrlen); if (rp->ai_canonname != NULL) { strncpy(ext_info->canonname, rp->ai_canonname, sizeof(ext_info->canonname)); } numResults++; } WRAPPER_LOG_WRITE_INTO_READ_LOG(getaddrinfo, (void*) addrinfo_res, (numResults * sizeof (struct addrinfo_extended))); } SET_FIELD2(my_entry, getaddrinfo, num_res, numResults); WRAPPER_LOG_WRITE_ENTRY(my_entry); } return retval; }
void jalib::_JRefAbort(const char* msg){ JASSERT(false)(msg); UNREACHABLE(); }