/** * Removes an entry from a plugin data store. * * @param type[in] The store type. * @param pluginID[in] The plugin identifier. * @param store[in] The store. * @param classid[in] The entry class identifier. */ void hplugins_removeFromHPData(enum HPluginDataTypes type, uint32 pluginID, struct hplugin_data_store *store, uint32 classid) { struct hplugin_data_entry *entry; int i; if (!HPM->data_store_validate(type, &store, false)) { /* woo it failed! */ ShowError("HPM:removeFromHPData:%s: failed, type %u (%u|%u)\n", HPM->pid2name(pluginID), type, pluginID, classid); return; } if (!store) return; ARR_FIND(0, VECTOR_LENGTH(store->entries), i, VECTOR_INDEX(store->entries, i)->pluginID == pluginID && VECTOR_INDEX(store->entries, i)->classid == classid); if (i == VECTOR_LENGTH(store->entries)) return; entry = VECTOR_INDEX(store->entries, i); VECTOR_ERASE(store->entries, i); // Erase and compact aFree(entry->data); // when it's removed we delete it regardless of autofree aFree(entry); }
EIO_Status CConnTest::ExtraCheckOnFailure(void) { static const STimeout kTimeout = { 5, 0 }; static const STimeout kTimeSlice = { 0, 100000 }; static const struct { const char* host; const char* vhost; } kTests[] = { // 0. NCBI default { "", 0 }, // NCBI // 1. External server(s) { "www.google.com", 0 }, // NB: Google's public DNS (also @8.8.8.8), responds at :80 as well { "8.8.4.4", "www.google.com" }, // 2. NCBI servers, explicitly { "www.be-md.ncbi.nlm.nih.gov", "www.ncbi.nlm.nih.gov" }, // NCBI main { "www.st-va.ncbi.nlm.nih.gov", "www.ncbi.nlm.nih.gov" }, // NCBI colo { "130.14.29.110", "www.ncbi.nlm.nih.gov" }, // NCBI main { "165.112.7.20", "www.ncbi.nlm.nih.gov" } // NCBI colo }; m_CheckPoint.clear(); PreCheck(eNone, 0/*main*/, "Failback HTTP access check"); SConnNetInfo* net_info = ConnNetInfo_Create(0, eDebugPrintout_Data); if (!net_info) { PostCheck(eNone, 0/*main*/, eIO_Unknown, "Cannot create network info structure"); return eIO_Unknown; } net_info->req_method = eReqMethod_Head; net_info->timeout = &kTimeout; net_info->max_try = 0; m_Timeout = 0; CDeadline deadline(kTimeout.sec, kTimeout.usec * 1000); time_t sec; unsigned int nanosec; deadline.GetExpirationTime(&sec, &nanosec); ::sprintf(net_info->path, "/NcbiTest%08lX%08lX", (unsigned long) sec, (unsigned long) nanosec); vector< AutoPtr<CConn_HttpStream> > http; for (size_t n = 0; n < sizeof(kTests) / sizeof(kTests[0]); ++n) { char user_header[80]; _ASSERT(::strlen(kTests[n].host) < sizeof(net_info->host) - 1); if (kTests[n].host[0]) ::strcpy(net_info->host, kTests[n].host); if (kTests[n].vhost) { _ASSERT(::strlen(kTests[n].vhost) + 6 < sizeof(user_header) - 1); ::sprintf(user_header, "Host: %s", kTests[n].vhost); } else *user_header = '\0'; SAuxData* auxdata = new SAuxData(m_Canceled, 0); http.push_back(new CConn_HttpStream(net_info, user_header, s_AnyHeader, auxdata, s_Adjust, s_Cleanup)); http.back()->SetCanceledCallback(m_Canceled); } EIO_Status status = eIO_Success; do { if (!http.size()) break; ERASE_ITERATE(vector< AutoPtr<CConn_HttpStream> >, h, http) { CONN conn = (*h)->GetCONN(); if (!conn) { VECTOR_ERASE(h, http); if (status == eIO_Success) status = eIO_Unknown; continue; } EIO_Status readst = CONN_Wait(conn, eIO_Read, &kTimeSlice); if (readst > eIO_Timeout) { if (readst == eIO_Interrupt) { status = eIO_Interrupt; break; } if (status < readst && (*h)->GetStatusCode() != 404) status = readst; VECTOR_ERASE(h, http); continue; } } } while (status != eIO_Interrupt && !deadline.IsExpired()); if (status == eIO_Success && http.size()) status = eIO_Timeout; PostCheck(eNone, 0/*main*/, status, kEmptyStr); return status; }