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;
+}
+
+