16f04f5bdeccc1ad1d90c6f17d150e956bec6ecb kent Mon Jan 13 19:34:09 2014 -0800 Librarified some message-the-hub stuff so can reuse diff --git src/parasol/lib/paraMessage.c src/parasol/lib/paraMessage.c index eb3b738..04f3e59 100644 --- src/parasol/lib/paraMessage.c +++ src/parasol/lib/paraMessage.c @@ -261,31 +261,77 @@ while (TRUE) { result = pmSendString(pm, ru, string); if (result) break; warn("pmSendString timed out!"); ++tries; if (tries >= PMSENDMAXTRIES) break; warn("pmSendString: will sleep %d seconds and retry", PMSENDSLEEP); sleep(PMSENDSLEEP); } return result; } +char *pmHubSendSimple(char *message, char *host) +/* Send message to host, no response. */ +{ +struct rudp *ru = rudpMustOpen(); +struct paraMessage pm; +pmInitFromName(&pm, host, paraHubPort); +if (!pmSendStringWithRetries(&pm, ru, message)) + noWarnAbort(); +rudpClose(&ru); +return cloneString(pm.data); +} + char *pmHubSingleLineQuery(char *query, char *host) /* Send message to hub and get single line response. * This should be freeMem'd when done. */ { struct rudp *ru = rudpMustOpen(); struct paraMessage pm; pmInitFromName(&pm, host, paraHubPort); if (!pmSendStringWithRetries(&pm, ru, query)) noWarnAbort(); if (!pmReceive(&pm, ru)) noWarnAbort(); rudpClose(&ru); return cloneString(pm.data); } +struct slRef *pmHubMultilineQuery(char *query, char *host) +/* Send a command with a multiline response to hub, + * and return response as a list of strings. */ +{ +struct slRef *list = NULL; +struct rudp *ru = rudpMustOpen(); +struct paraMessage pm; +struct paraMultiMessage pmm; +char *row[256]; +int count = 0; +pmInitFromName(&pm, host, paraHubPort); +/* ensure the multi-message response comes from the correct ip and has no duplicate msgs*/ +pmmInit(&pmm, &pm, pm.ipAddress.sin_addr); +if (!pmSendStringWithRetries(&pm, ru, query)) + noWarnAbort(); +for (;;) + { + if (!pmmReceive(&pmm, ru)) + break; + if (pm.size == 0) + break; + count = chopByChar(pm.data, '\n', row, sizeof(row)); + if (count > 1) --count; /* for multiline, count is inflated by one */ + + int i; + for(i=0;i<count;++i) + refAdd(&list, cloneString(row[i])); + } +rudpClose(&ru); +slReverse(&list); +return list; +} + +