int analyzer_ppp_pap_cleanup(struct analyzer *analyzer) { struct analyzer_ppp_pap_priv *priv = analyzer->priv; if (!priv) return POM_OK; int res = POM_OK; if (priv->evt_auth) res += event_unregister(priv->evt_auth); free(priv); return res; }
int main(int argc, char **argv) { address_tuple_t tuple; char *progname; char *server = NULL; char *port = NULL; char *myeid = NULL; char *pidfile = NULL; char *vnodeid = NULL; char buf[BUFSIZ], ipaddr[32]; char hostname[MAXHOSTNAMELEN]; struct hostent *he; int c; struct in_addr myip; FILE *fp; progname = argv[0]; while ((c = getopt(argc, argv, "ds:p:e:i:v:")) != -1) { switch (c) { case 'd': debug++; break; case 's': server = optarg; break; case 'p': port = optarg; break; case 'i': pidfile = optarg; break; case 'e': myeid = optarg; break; case 'v': vnodeid = optarg; break; default: usage(progname); } } argc -= optind; argv += optind; if (argc) usage(progname); if (! myeid) fatal("Must provide pid/eid"); if (debug) loginit(0, 0); else { loginit(1, "evproxy"); /* See below for daemonization */ } /* * Get our IP address. Thats how we name this host to the * event System. */ if (gethostname(hostname, MAXHOSTNAMELEN) == -1) { fatal("could not get hostname: %s\n", strerror(errno)); } if (! (he = gethostbyname(hostname))) { fatal("could not get IP address from hostname: %s", hostname); } memcpy((char *)&myip, he->h_addr, he->h_length); strcpy(ipaddr, inet_ntoa(myip)); /* * If server is not specified, then it defaults to EVENTSERVER. * This allows the client to work on either users.emulab.net * or on a client node. */ if (!server) server = "event-server"; /* * XXX Need to daemonize earlier or the threads go away. */ if (!debug) daemon(0, 0); /* * Convert server/port to elvin thing. * * XXX This elvin string stuff should be moved down a layer. */ snprintf(buf, sizeof(buf), "elvin://%s%s%s", server, (port ? ":" : ""), (port ? port : "")); server = buf; /* * Construct an address tuple for generating the event. */ tuple = address_tuple_alloc(); if (tuple == NULL) { fatal("could not allocate an address tuple"); } /* Register with the event system on boss */ bosshandle = event_register(server, 1); if (bosshandle == NULL) { fatal("could not register with remote event system"); } /* Register with the event system on the local node */ localhandle = event_register("elvin://localhost", 1); if (localhandle == NULL) { fatal("could not register with local event system"); } /* * Create a subscription to pass to the remote server. We want * all events for this node, or all events for the experiment * if the node is unspecified (we want to avoid getting events * that are directed at specific nodes that are not us!). */ sprintf(buf, "%s,%s", ADDRESSTUPLE_ALL, ipaddr); tuple->host = buf; tuple->expt = myeid; /* Subscribe to the test event: */ if (! event_subscribe(bosshandle, callback, tuple, "event received")) { fatal("could not subscribe to events on remote server"); } tuple->host = ADDRESSTUPLE_ALL; tuple->scheduler = 1; if (! event_subscribe(localhandle, sched_callback, tuple, NULL)) { fatal("could not subscribe to events on remote server"); } signal(SIGTERM, sigterm); /* * Stash the pid away. */ if (! pidfile) { sprintf(buf, "%s/evproxy.pid", _PATH_VARRUN); pidfile = buf; } fp = fopen(pidfile, "w"); if (fp != NULL) { fprintf(fp, "%d\n", getpid()); (void) fclose(fp); } /* Begin the event loop, waiting to receive event notifications */ while (! stop) { struct timeval tv = { 5, 0 }; select(0, NULL, NULL, NULL, &tv); } unlink(pidfile); /* Unregister with the remote event system: */ if (event_unregister(bosshandle) == 0) { fatal("could not unregister with remote event system"); } /* Unregister with the local event system: */ if (event_unregister(localhandle) == 0) { fatal("could not unregister with local event system"); } return 0; }
int main(int argc, char **argv) { address_tuple_t tuple; char *server = NULL; char *port = NULL; char *keyfile = NULL; char *pidfile = NULL; char *logfile = NULL; char *progname; char c; char buf[BUFSIZ]; extern char build_info[]; pideid = NULL; progname = argv[0]; while ((c = getopt(argc, argv, "s:p:e:l:dk:i:Vu:N:")) != -1) { switch (c) { case 'd': debug++; break; case 's': server = optarg; break; case 'p': port = optarg; break; case 'e': pideid = optarg; break; case 'i': pidfile = optarg; break; case 'l': logfile = optarg; break; case 'k': keyfile = optarg; break; case 'u': swapper = optarg; break; case 'N': nodelocal_dir = optarg; break; case 'V': fprintf(stderr, "%s\n", build_info); exit(0); break; default: usage(progname); } } if (!pideid) usage(progname); if (debug) loginit(0, 0); else { if (logfile) loginit(0, logfile); else loginit(1, "linktest"); /* See below for daemonization */ } /* * Convert server/port to elvin thing. * * XXX This elvin string stuff should be moved down a layer. */ if (server) { snprintf(buf, sizeof(buf), "elvin://%s%s%s", server, (port ? ":" : ""), (port ? port : "")); server = buf; } /* * Construct an address tuple for subscribing to events for * this node. */ tuple = address_tuple_alloc(); if (tuple == NULL) { fatal("could not allocate an address tuple"); } /* * Ask for just the events we care about. */ tuple->expt = pideid; tuple->objtype = TBDB_OBJECTTYPE_LINKTEST; tuple->eventtype = TBDB_EVENTTYPE_START "," TBDB_EVENTTYPE_KILL; /* * Register with the event system. */ handle = event_register_withkeyfile(server, 0, keyfile); if (handle == NULL) { fatal("could not register with event system"); } /* * Subscribe to the event we specified above. */ if (! event_subscribe(handle, callback, tuple, NULL)) { fatal("could not subscribe to event"); } tuple->objtype = TBDB_OBJECTTYPE_TIME; tuple->objname = ADDRESSTUPLE_ANY; tuple->eventtype = TBDB_EVENTTYPE_START; /* * Subscribe to the TIME start event we specified above. */ if (! event_subscribe(handle, start_callback, tuple, NULL)) { fatal("could not subscribe to event"); } /* * Do this now, once we have had a chance to fail on the above * event system calls. */ if (!debug) daemon(0, 1); /* * Write out a pidfile if root (after we daemonize). */ if (!getuid()) { FILE *fp; if (pidfile) strcpy(buf, pidfile); else sprintf(buf, "%s/linktest.pid", _PATH_VARRUN); fp = fopen(buf, "w"); if (fp != NULL) { fprintf(fp, "%d\n", getpid()); (void) fclose(fp); } } /* * Initialize variables used to control child execution */ locked = FALSE; if(signal(SIGCHLD,sigchld_handler) == SIG_ERR) { fatal("could not install child handler"); } /* * Begin the event loop, waiting to receive event notifications: */ event_main(handle); /* * Unregister with the event system: */ if (event_unregister(handle) == 0) { fatal("could not unregister with event system"); } return 0; }