/* * Ivy probe * * Copyright (C) 1997-2000 * Centre d'Études de la Navigation Aérienne * * Main and only file * * Authors: François-Régis Colin * * $Id$ * * Please refer to file version.h for the * copyright notice regarding this software */ #define IVYMAINLOOP #include #include #include #include #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; }