summaryrefslogtreecommitdiff
path: root/ivyprobe.c
diff options
context:
space:
mode:
Diffstat (limited to 'ivyprobe.c')
-rw-r--r--ivyprobe.c199
1 files changed, 199 insertions, 0 deletions
diff --git a/ivyprobe.c b/ivyprobe.c
new file mode 100644
index 0000000..f41f310
--- /dev/null
+++ b/ivyprobe.c
@@ -0,0 +1,199 @@
+/*
+ * Ivy probe
+ *
+ * Copyright (C) 1997-2000
+ * Centre d'Études de la Navigation Aérienne
+ *
+ * Main and only file
+ *
+ * Authors: François-Régis Colin <fcolin@cena.fr>
+ *
+ * $Id$
+ *
+ * Please refer to file version.h for the
+ * copyright notice regarding this software
+ */
+
+
+#define IVYMAINLOOP
+
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <getopt.h>
+
+#include "ivyloop.h"
+#include "ivysocket.h"
+#include "ivy.h"
+#include "timer.h"
+
+int app_count = 0;
+int wait_count = 0;
+
+void Callback (IvyClientPtr app, void *user_data, int argc, char *argv[])
+{
+ int i;
+ printf ("%s sent ",IvyGetApplicationName(app));
+ for (i = 0; i < argc; i++)
+ printf(" '%s'",argv[i]);
+ printf("\n");
+}
+
+void HandleStdin (Channel channel, HANDLE fd, void *data)
+{
+ char buf[4096];
+ char *line;
+ char *cmd;
+ char *arg;
+ int id;
+ IvyClientPtr app;
+ int err;
+ line = fgets(buf, 4096, stdin);
+ if (!line) {
+ IvyChannelClose (channel);
+ IvyStop();
+
+ return;
+ }
+ if (*line == '.') {
+ cmd = strtok (line, ".: \n");
+
+ if (strcmp (cmd, "die") == 0) {
+ arg = strtok (NULL, " \n");
+ if (arg) {
+ app = IvyGetApplication (arg);
+ if (app)
+ IvySendDieMsg (app);
+ else printf ("No Application %s!!!\n",arg);
+ }
+
+ } else if (strcmp(cmd, "dieall-yes-i-am-sure") == 0) {
+ arg = IvyGetApplicationList();
+ arg = strtok (arg, " \n");
+ while (arg) {
+ app = IvyGetApplication (arg);
+ if (app)
+ IvySendDieMsg (app);
+ else
+ printf ("No Application %s!!!\n",arg);
+ arg = strtok (NULL, " ");
+ }
+
+ } else if (strcmp(cmd, "bind") == 0) {
+ arg = strtok (NULL, "'");
+ if (arg) {
+ IvyBindMsg (Callback, NULL, arg);
+ }
+
+ } else if (strcmp(cmd, "where") == 0) {
+ arg = strtok (NULL, " \n");
+ if (arg) {
+ app = IvyGetApplication (arg);
+ if (app)
+ printf ("Application %s on %s\n",arg, IvyGetApplicationHost (app));
+ else printf ("No Application %s!!!\n",arg);
+ }
+ } else if (strcmp(cmd, "direct") == 0) {
+ arg = strtok (NULL, " \n");
+ if (arg) {
+ app = IvyGetApplication (arg);
+ if (app) {
+ arg = strtok (NULL, " ");
+ id = atoi (arg) ;
+ arg = strtok (NULL, "'");
+ IvySendDirectMsg (app, id, arg);
+ } else
+ printf ("No Application %s!!!\n",arg);
+ }
+
+ } else if (strcmp(cmd, "who") == 0) {
+ printf("Apps: %s\n", IvyGetApplicationList());
+
+ } else if (strcmp(cmd, "help") == 0) {
+ fprintf(stderr,"Commands list:\n");
+ printf(" .help - this help\n");
+ printf(" .quit - terminate this application\n");
+ printf(" .die appname - send die msg to appname\n");
+ printf(" .dieall-yes-i-am-sure - send die msg to all applis\n");
+ printf(" .direct appname id 'arg' - send direct msg to appname\n");
+ printf(" .where appname - on which host is appname\n");
+ printf(" .bind 'regexp' - add a msg to receive\n");
+ printf(" .who - who is on the bus\n");
+ } else if (strcmp(cmd, "quit") == 0) {
+ exit(0);
+ }
+ } else {
+ cmd = strtok (buf, "\n");
+ err = IvySendMsg (cmd);
+ printf("-> Sent to %d peer%s\n", err, err == 1 ? "" : "s");
+ }
+}
+
+void ApplicationCallback (IvyClientPtr app, void *user_data, IvyApplicationEvent event)
+{
+ char *appname;
+ char *host;
+ char **msgList;
+ appname = IvyGetApplicationName (app);
+ host = IvyGetApplicationHost (app);
+ switch (event) {
+
+ case IvyApplicationConnected:
+ app_count++;
+ printf("%s connected from %s\n", appname, host);
+/* printf("Application(%s): Begin Messages\n", appname);*/
+ msgList = IvyGetApplicationMessages (app);
+ while (*msgList )
+ printf("%s subscribes to '%s'\n",appname,*msgList++);
+/* printf("Application(%s): End Messages\n",appname);*/
+ if (app_count == wait_count)
+ IvyChannelSetUp (0, NULL, NULL, HandleStdin);
+ break;
+
+ case IvyApplicationDisconnected:
+ app_count--;
+ printf("%s disconnected from %s\n", appname, host);
+ break;
+
+ default:
+ printf("%s: unkown event %d\n", appname, event);
+ break;
+ }
+}
+
+
+int main(int argc, char *argv[])
+{
+ int c;
+ int timer_test = 0;
+ char busbuf [1024] = "";
+ const char* bus = 0;
+ while ((c = getopt(argc, argv, "d:b:w:t")) != EOF)
+ switch (c) {
+ case 'b':
+ strcpy (busbuf, optarg);
+ bus = busbuf;
+ break;
+ case 'w':
+ wait_count = atoi(optarg) ;
+ break;
+ case 't':
+ timer_test = 1;
+ break;
+ }
+
+ /* Mainloop management */
+
+ IvyInit ("IVYPROBE", "IVYPROBE READY", ApplicationCallback,NULL,NULL,NULL);
+ for (; optind < argc; optind++)
+ IvyBindMsg (Callback, NULL, argv[optind]);
+
+ if (wait_count == 0)
+ IvyChannelSetUp (0, NULL, NULL, HandleStdin);
+
+ IvyStart (bus);
+
+ IvyMainLoop (0);
+ return 0;
+}