hostinfo_t *rename_host(char *oldhostname, enum locator_servicetype_t servicetype, char *newhostname) { xtreePos_t handle, newhandle; hostinfo_t *itm = NULL; handle = xtreeFind(hitree[servicetype], oldhostname); if (handle == xtreeEnd(hitree[servicetype])) return NULL; newhandle = xtreeFind(hitree[servicetype], newhostname); if (newhandle != xtreeEnd(hitree[servicetype])) { errprintf("Ignored rename of %s to %s - new name already exists\n", oldhostname, newhostname); return NULL; } itm = xtreeData(hitree[servicetype], handle); xtreeDelete(hitree[servicetype], oldhostname); xfree(itm->hostname); itm->hostname = strdup(newhostname); xtreeAdd(hitree[servicetype], itm->hostname, itm); return itm; }
int main(int argc, char **argv) { char buf[1024], key[1024], data[1024]; void *th = NULL; xtreePos_t n; xtreeStatus_t stat; char *rec, *p; do { printf("New, Add, Find, Delete, dUmp, deStroy : "); fflush(stdout); if (fgets(buf, sizeof(buf), stdin) == NULL) return 0; switch (*buf) { case 'N': case 'n': th = xtreeNew(strcasecmp); break; case 'A': case 'a': printf("Key:");fflush(stdout); fgets(key, sizeof(key), stdin); p = strchr(key, '\n'); if (p) *p = '\0'; printf("Data:");fflush(stdout); fgets(data, sizeof(data), stdin); p = strchr(data, '\n'); if (p) *p = '\0'; stat = xtreeAdd(th, strdup(key), strdup(data)); printf("Result: %d\n", stat); break; case 'D': case 'd': printf("Key:");fflush(stdout); fgets(key, sizeof(key), stdin); p = strchr(key, '\n'); if (p) *p = '\0'; rec = xtreeDelete(th, key); if (rec) { printf("Existing record deleted: Data was '%s'\n", rec); } else { printf("No record\n"); } break; case 'F': case 'f': printf("Key:");fflush(stdout); fgets(key, sizeof(key), stdin); p = strchr(key, '\n'); if (p) *p = '\0'; n = xtreeFind(th, key); if (n != xtreeEnd(th)) { printf("Found record: Data was '%s'\n", (char *)xtreeData(th, n)); } else { printf("No record\n"); } break; case 'U': case 'u': n = xtreeFirst(th); while (n != xtreeEnd(th)) { printf("Key '%s', data '%s'\n", (char *)xtreeKey(th, n), (char *)xtreeData(th, n)); n = xtreeNext(th, n); } break; case 'S': case 's': xtreeDestroy(th); th = NULL; break; } } while (1); return 0; }
void send_test_results(listhead_t *head, char *collector, int issubmodule, char *location, int usebackfeed) { char msgline[4096]; listitem_t *walk; xtreePos_t handle; void *hostresults = xtreeNew(strcasecmp); if (usebackfeed) combo_start_local(); else combo_start(); for (walk = head->head; (walk); walk = walk->next) { hostresult_t *hres; myconn_t *rec = (myconn_t *)walk->data; char *s; if (rec->ignoreresult) continue; switch (rec->talkprotocol) { case TALK_PROTO_PING: if (!issubmodule && (rec->talkresult == TALK_OK)) { add_to_sub_queue(rec, "ping", location, NULL); continue; } break; #ifdef HAVE_LDAP case TALK_PROTO_LDAP: if (!issubmodule && (rec->talkresult == TALK_OK)) { char *creds = xmh_item(rec->hostinfo, XMH_LDAPLOGIN); add_to_sub_queue(rec, "ldap", location, creds, NULL); continue; } break; #endif case TALK_PROTO_EXTERNAL: if (!issubmodule && (rec->talkresult == TALK_OK)) { if (strncmp(rec->testspec, "rpc=", 4) == 0) add_to_sub_queue(rec, "rpc", location, NULL); else add_to_sub_queue(rec, rec->testspec, location, NULL); continue; } break; default: break; } handle = xtreeFind(hostresults, xmh_item(rec->hostinfo, XMH_HOSTNAME)); if (handle == xtreeEnd(hostresults)) { hres = (hostresult_t *)calloc(1, sizeof(hostresult_t)); hres->hinfo = rec->hostinfo; hres->txt = newstrbuffer(0); xtreeAdd(hostresults, xmh_item(rec->hostinfo, XMH_HOSTNAME), hres); snprintf(msgline, sizeof(msgline), "client/%s %s.netcollect netcollect\n", collector, xmh_item(rec->hostinfo, XMH_HOSTNAME)); addtobuffer(hres->txt, msgline); } else { hres = xtreeData(hostresults, handle); } switch (rec->talkprotocol) { case TALK_PROTO_DNSQUERY: snprintf(msgline, sizeof(msgline), "\n[dns=%s]\n", rec->testspec); addtobuffer(hres->txt, msgline); break; case TALK_PROTO_PING: snprintf(msgline, sizeof(msgline), "\n[ping=%s]\n", rec->netparams.destinationip); addtobuffer(hres->txt, msgline); snprintf(msgline, sizeof(msgline), "SourceSpec: %s\n", rec->testspec); addtobuffer(hres->txt, msgline); break; default: snprintf(msgline, sizeof(msgline), "\n[%s]\n", rec->testspec); addtobuffer(hres->txt, msgline); break; } snprintf(msgline, sizeof(msgline), "Handler: %s\n", talkproto_names[rec->talkprotocol]); addtobuffer(hres->txt, msgline); snprintf(msgline, sizeof(msgline), "StartTime: %d\nEndTime: %d\n", (int)rec->teststarttime, (int)rec->testendtime); addtobuffer(hres->txt, msgline); if (rec->netparams.lookupstring) { snprintf(msgline, sizeof(msgline), "TargetHostname: %s\n", rec->netparams.lookupstring); addtobuffer(hres->txt, msgline); } snprintf(msgline, sizeof(msgline), "TargetIP: %s\n", rec->netparams.destinationip); addtobuffer(hres->txt, msgline); snprintf(msgline, sizeof(msgline), "TargetPort: %d\n", rec->netparams.destinationport); addtobuffer(hres->txt, msgline); if (rec->netparams.sourceip) { snprintf(msgline, sizeof(msgline), "SourceIP: %s\n", rec->netparams.sourceip); addtobuffer(hres->txt, msgline); } if (location) { snprintf(msgline, sizeof(msgline), "Location: %s\n", location); addtobuffer(hres->txt, msgline); } if (rec->talkprotocol == TALK_PROTO_PING) s = "ICMP"; else { switch (rec->netparams.socktype) { case CONN_SOCKTYPE_STREAM: s = "TCP"; break; case CONN_SOCKTYPE_DGRAM: s = "UDP"; break; default: s = "UNKNOWN"; break; } } snprintf(msgline, sizeof(msgline), "Protocol: %s\n", s); addtobuffer(hres->txt, msgline); switch (rec->netparams.sslhandling) { case CONN_SSL_NO: s = "NO"; break; case CONN_SSL_YES: s = "YES"; break; case CONN_SSL_STARTTLS_CLIENT: s = "STARTTLS_CLIENT"; break; case CONN_SSL_STARTTLS_SERVER: s = "STARTTLS_SERVER"; break; default: s = "UNKNOWN"; break; } snprintf(msgline, sizeof(msgline), "SSL: %s\n", s); addtobuffer(hres->txt, msgline); switch (rec->talkresult) { case TALK_CONN_FAILED: s = "CONN_FAILED"; break; case TALK_CONN_TIMEOUT: s = "CONN_TIMEOUT"; break; case TALK_OK: s = "OK"; break; case TALK_BADDATA: s = "BADDATA"; break; case TALK_BADSSLHANDSHAKE: s = "BADSSLHANDSHAKE"; break; case TALK_INTERRUPTED: s = "INTERRUPTED"; break; case TALK_CANNOT_RESOLVE: s = "CANNOT_RESOLVE"; break; case TALK_MODULE_FAILED: s = "MODULE_FAILED"; break; default: s = "UNKNOWN"; break; } snprintf(msgline, sizeof(msgline), "Status: %s\n", s); addtobuffer(hres->txt, msgline); snprintf(msgline, sizeof(msgline), "TestID: %lu\nElapsedMS: %d.%02d\nDNSMS: %d.%02d\nTimeoutMS: %d\nIntervalMS: %d\n", rec->testid, (rec->elapsedus / 1000), (rec->elapsedus % 1000), (rec->dnselapsedus / 1000), (rec->dnselapsedus % 1000), rec->timeout*1000, rec->interval*1000); addtobuffer(hres->txt, msgline); snprintf(msgline, sizeof(msgline), "BytesRead: %u\nBytesWritten: %u\n", rec->bytesread, rec->byteswritten); addtobuffer(hres->txt, msgline); if (rec->peercertificate) { char exps[50]; addtobuffer(hres->txt, "PeerCertificateSubject: "); addtobuffer(hres->txt, rec->peercertificate); addtobuffer(hres->txt, "\n"); addtobuffer(hres->txt, "PeerCertificateIssuer: "); addtobuffer(hres->txt, rec->peercertificateissuer); addtobuffer(hres->txt, "\n"); strftime(exps, sizeof(exps), "%Y-%m-%d %H:%M:%S UTC", gmtime(&rec->peercertificatestart)); snprintf(msgline, sizeof(msgline), "PeerCertificateStart: %d %s\n", (int)rec->peercertificatestart, exps); addtobuffer(hres->txt, msgline); strftime(exps, sizeof(exps), "%Y-%m-%d %H:%M:%S UTC", gmtime(&rec->peercertificateexpiry)); snprintf(msgline, sizeof(msgline), "PeerCertificateExpiry: %d %s\n", (int)rec->peercertificateexpiry, exps); addtobuffer(hres->txt, msgline); snprintf(msgline, sizeof(msgline), "PeerCertificateKeysize: %d\n", (int)rec->peercertificatekeysize); addtobuffer(hres->txt, msgline); snprintf(msgline, sizeof(msgline), "PeerCertificateDetails: %d\n", (int)strlen(rec->peercertificatedetails)+1); addtobuffer(hres->txt, msgline); addtobuffer(hres->txt, rec->peercertificatedetails); addtobuffer(hres->txt, "\n"); } switch (rec->talkprotocol) { case TALK_PROTO_PLAIN: result_plain(rec, hres->txt); break; case TALK_PROTO_NTP: result_ntp(rec, hres->txt); break; case TALK_PROTO_HTTP: result_http(rec, hres->txt); break; case TALK_PROTO_DNSQUERY: result_dns(rec, hres->txt); break; case TALK_PROTO_PING: result_subqueue("PING", rec, hres->txt); break; #ifdef HAVE_LDAP case TALK_PROTO_LDAP: result_subqueue("LDAP", rec, hres->txt); break; #endif case TALK_PROTO_EXTERNAL: result_subqueue(rec->testspec, rec, hres->txt); break; default: break; } } for (handle = xtreeFirst(hostresults); handle != xtreeEnd(hostresults); handle = xtreeNext(hostresults, handle)) { hostresult_t *hres = xtreeData(hostresults, handle); combo_add(hres->txt); freestrbuffer(hres->txt); xtreeDelete(hostresults, xmh_item(hres->hinfo, XMH_HOSTNAME)); xfree(hres); } xtreeDestroy(hostresults); combo_end(); }