/* * appTeardown() * * Teardown all modules, close all files, and tidy up all * application state. * * This function is idempotent. */ static void appTeardown( void) { static int teardownFlag = 0; RBLIST *iter; transfer_t *sndr; if (teardownFlag) { return; } teardownFlag = 1; if (!daemonized) { rbdestroy(transfers); skDLListDestroy(duplicate_dirs); skDLListDestroy(open_file_list); skdaemonTeardown(); skAppUnregister(); return; } NOTICEMSG("Begin shutting down..."); shuttingdown = 1; transferShutdown(); transferTeardown(); /* Destroy stuff */ iter = rbopenlist(transfers); CHECK_ALLOC(iter); while ((sndr = (transfer_t *)rbreadlist(iter)) != NULL) { if (sndr->ident != NULL) { free(sndr->ident); } if (sndr->addr) { skSockaddrArrayDestroy(sndr->addr); } free(sndr); } rbcloselist(iter); rbdestroy(transfers); skDLListDestroy(duplicate_dirs); skDLListDestroy(open_file_list); NOTICEMSG("Finished shutting down."); skdaemonTeardown(); skthread_teardown(); skAppUnregister(); }
/* * appTeardown() * * Teardown all modules, close all files, and tidy up all * application state. * * This function is idempotent. */ static void appTeardown( void) { static int teardownFlag = 0; int rv; if (teardownFlag) { return; } teardownFlag = 1; /* close SiLK flow output file */ if (silk_output) { rv = skStreamClose(silk_output); if (rv && rv != SKSTREAM_ERR_NOT_OPEN) { skStreamPrintLastErr(silk_output, rv, &skAppPrintErr); } skStreamDestroy(&silk_output); } skpcTeardown(); /* set level to "warning" to avoid the "Stopped logging" message */ sklogSetLevel("warning"); sklogTeardown(); skOptionsNotesTeardown(); skOptionsCtxDestroy(&optctx); skAppUnregister(); }
/* * appTeardown() * * Teardown all modules, close all files, and tidy up all * application state. * * This function is idempotent. */ void appTeardown( void) { static int teardownFlag = 0; if (teardownFlag) { return; } teardownFlag = 1; /* free our memory */ if (bins.data) { free(bins.data); } /* close the output file or process */ if (output.of_name) { skFileptrClose(&output, &skAppPrintErr); } /* close the copy-stream */ skOptionsCtxCopyStreamClose(optctx, &skAppPrintErr); skOptionsCtxDestroy(&optctx); skAppUnregister(); }
/* * appTeardown() * * Teardown all modules, close all files, and tidy up all * application state. * * This function is idempotent. */ static void appTeardown( void) { static int teardown_flag = 0; if (teardown_flag) { return; } teardown_flag = 1; skAggBagDestroy(&ab); /* close output */ skStreamClose(output); skStreamDestroy(&output); /* destroy string maps for keys and counters */ skStringMapDestroy(key_name_map); key_name_map = NULL; skStringMapDestroy(counter_name_map); counter_name_map = NULL; skAggBagOptionsTeardown(); skOptionsCtxDestroy(&optctx); skAppUnregister(); }
int main(int argc, char **argv) { SILK_FEATURES_DEFINE_STRUCT(features); int arg_index; /* verify same number of options and help strings */ assert((sizeof(appHelp)/sizeof(char *)) == (sizeof(appOptions)/sizeof(struct option))); /* register the application */ skAppRegister(argv[0]); skAppVerifyFeatures(&features, NULL); skOptionsSetUsageCallback(&appUsageLong); /* register the options */ if (skOptionsRegister(appOptions, &appOptionsHandler, NULL) || sksiteOptionsRegister(SK_SITE_FLAG_CONFIG_FILE)) { skAppPrintErr("Unable to register options"); exit(EXIT_FAILURE); } /* parse the options */ arg_index = skOptionsParse(argc, argv); if (arg_index < 0) { /* options parsing should print error */ skAppUsage(); /* never returns */ } /* ensure the site config is available */ if (sksiteConfigure(1)) { exit(EXIT_FAILURE); } /* if we are printing more than one sensor and a --print-* switch * was given, set the width of the sensor name fields so the * values align */ if ((argc != arg_index + 1) && (print_descriptions || print_classes)) { sensor_name_width = -1 * (int)sksiteSensorGetMaxNameStrLen(); } if (argc > arg_index) { for ( ; arg_index < argc; ++arg_index) { printByNameOrNumber(argv[arg_index]); } } else { /* no args. print all */ printAllSensors(); } skAppUnregister(); return 0; }
/* * appTeardown() * * Teardown all modules, close all files, and tidy up all * application state. * * This function is idempotent. */ static void appTeardown( void) { static int teardownFlag = 0; if (teardownFlag) { return; } teardownFlag = 1; skAppUnregister(); }
/* * appTeardown() * * Teardown all modules, close all files, and tidy up all * application state. * * This function is idempotent. */ static void appTeardown( void) { static int teardownFlag = 0; if (teardownFlag) { return; } teardownFlag = 1; skStreamDestroy(&out); skAppUnregister(); }
/* * appTeardown() * * Teardown all modules, close all files, and tidy up all * application state. * * This function is idempotent. */ static void appTeardown( void) { static int teardownFlag = 0; if (teardownFlag) { return; } teardownFlag = 1; skOptionsNotesTeardown(); skOptionsCtxDestroy(&optctx); skAppUnregister(); }
/* * appTeardown() * * Teardown all modules, close all files, and tidy up all * application state. * * This function is idempotent. * * NOTE: Make this extern due to declaration in rwfilter.h. */ void appTeardown( void) { static int teardownFlag = 0; if (teardownFlag) { return; } teardownFlag = 1; /* cleanup */ fglobTeardown(); skAppUnregister(); }
/* * appTeardown() * * Teardown all modules, close all files, and tidy up all * application state. * * This function is idempotent. */ static void appTeardown( void) { static int teardownFlag = 0; if (teardownFlag) { return; } teardownFlag = 1; #error "Anything you put in setup should now be torn down" /* for example, close sample output file */ skStreamDestroy(&out_stream); skAppUnregister(); }
/* * appTeardown() * * Teardown all modules, close all files, and tidy up all * application state. * * This function is idempotent. */ static void appTeardown( void) { static int teardownFlag = 0; if (teardownFlag) { return; } teardownFlag = 1; if (ipset) { skIPSetDestroy(&ipset); } skStreamDestroy(&in_stream); skStreamDestroy(&out_stream); skIPSetOptionsTeardown(); skAppUnregister(); }
/* * appTeardown() * * Teardown all modules, close all files, and tidy up all * application state. * * This function is idempotent. */ static void appTeardown( void) { static uint8_t teardownFlag = 0; if (teardownFlag) { return; } teardownFlag = 1; /* Close all files */ if (g_pkt_input) { pcap_close(g_pkt_input); } if (g_output_dumper) { pcap_dump_close(g_output_dumper); } if (g_output) { pcap_close(g_output); } skAppUnregister(); }
int main(int UNUSED(argc), char UNUSED(**argv)) { skDQErr_t err; pthread_t a, b, c; int rv; char *v; skAppRegister("skdeque-test"); skthread_init("main"); rv = sklogSetup(0); assert(rv == 0); rv = sklogSetDestination("stderr"); assert(rv == 0); rv = sklogOpen(); assert(rv == 0); rv = sklogSetLevel("debug"); assert(rv == 0); rv = sklogEnableThreadedLogging(); assert(rv == 0); rv = sklogSetStampFunction(&log_stamp); assert(rv == 0); da = skDequeCreate(); db = skDequeCreate(); dc = skDequeCreate(); /*** Single threaded tests ***/ /* check empty deque */ CHECK_EMPTY(da); /* push first element onto 'da' and check */ err = skDequePushFront(da, (void*)xa); XASSERT(err == SKDQ_SUCCESS); err = skDequeBack(da, (void**)&v); XASSERT(err == SKDQ_SUCCESS); XASSERT(v == xa); err = skDequeFront(da, (void**)&v); XASSERT(err == SKDQ_SUCCESS); XASSERT(v == xa); XASSERT(1 == skDequeSize(da)); /* push first element onto 'db' and check */ err = skDequePushBack(db, (void*)xb); XASSERT(err == SKDQ_SUCCESS); err = skDequeBack(db, (void**)&v); XASSERT(err == SKDQ_SUCCESS); XASSERT(v == xb); err = skDequeFront(db, (void**)&v); XASSERT(err == SKDQ_SUCCESS); XASSERT(v == xb); XASSERT(1 == skDequeSize(db)); /* push first element onto 'dc' */ err = skDequePushFront(dc, (void*)xc); XASSERT(err == SKDQ_SUCCESS); /* push second element onto front 'da' and check */ err = skDequePushFront(da, (void*)xx); XASSERT(err == SKDQ_SUCCESS); err = skDequeBack(da, (void**)&v); XASSERT(err == SKDQ_SUCCESS); XASSERT(v == xa); err = skDequeFront(da, (void**)&v); XASSERT(err == SKDQ_SUCCESS); XASSERT(v == xx); XASSERT(2 == skDequeSize(da)); /* push second element onto 'db' and 'dc' */ err = skDequePushFront(db, (void*)xy); XASSERT(err == SKDQ_SUCCESS); err = skDequePushFront(dc, (void*)xz); XASSERT(err == SKDQ_SUCCESS); /* push third element onto back of 'da' and check */ err = skDequePushBack(da, (void*)xa); XASSERT(err == SKDQ_SUCCESS); err = skDequeBack(da, (void**)&v); XASSERT(err == SKDQ_SUCCESS); XASSERT(v == xa); err = skDequeFront(da, (void**)&v); XASSERT(err == SKDQ_SUCCESS); XASSERT(v == xx); XASSERT(3 == skDequeSize(da)); /* push third element onto back of 'db' and 'dc' */ err = skDequePushBack(db, (void*)xb); XASSERT(err == SKDQ_SUCCESS); err = skDequePushBack(dc, (void*)xc); XASSERT(err == SKDQ_SUCCESS); /* push fourth element onto back of 'da' and check */ err = skDequePushBack(da, (void*)xx); XASSERT(err == SKDQ_SUCCESS); err = skDequeBack(da, (void**)&v); XASSERT(err == SKDQ_SUCCESS); XASSERT(v == xx); err = skDequeFront(da, (void**)&v); XASSERT(err == SKDQ_SUCCESS); XASSERT(v == xx); XASSERT(4 == skDequeSize(da)); /* push fourth element onto back of 'db' and 'dc' */ err = skDequePushBack(db, (void*)xy); XASSERT(err == SKDQ_SUCCESS); err = skDequePushBack(dc, (void*)xz); XASSERT(err == SKDQ_SUCCESS); /* pop four elements from 'da', each from the front */ err = skDequePopFront(da, (void**)&v); XASSERT(err == SKDQ_SUCCESS); XASSERT(v == xx); XASSERT(3 == skDequeSize(da)); err = skDequePopFront(da, (void**)&v); XASSERT(err == SKDQ_SUCCESS); XASSERT(v == xa); XASSERT(2 == skDequeSize(da)); err = skDequePopFront(da, (void**)&v); XASSERT(err == SKDQ_SUCCESS); XASSERT(v == xa); XASSERT(1 == skDequeSize(da)); err = skDequePopFront(da, (void**)&v); XASSERT(err == SKDQ_SUCCESS); XASSERT(v == xx); XASSERT(0 == skDequeSize(da)); /* verify 'da' is empty */ CHECK_EMPTY(da); /* pop four elements from 'db', each from the back */ err = skDequePopBack(db, (void**)&v); XASSERT(err == SKDQ_SUCCESS); XASSERT(v == xy); XASSERT(3 == skDequeSize(db)); err = skDequePopBack(db, (void**)&v); XASSERT(err == SKDQ_SUCCESS); XASSERT(v == xb); XASSERT(2 == skDequeSize(db)); err = skDequePopBack(db, (void**)&v); XASSERT(err == SKDQ_SUCCESS); XASSERT(v == xb); XASSERT(1 == skDequeSize(db)); err = skDequePopBack(db, (void**)&v); XASSERT(err == SKDQ_SUCCESS); XASSERT(v == xy); XASSERT(0 == skDequeSize(db)); /* verify 'db' is empty */ CHECK_EMPTY(db); /* pop four elements from 'dc' */ err = skDequePopFrontNB(dc, (void**)&v); XASSERT(err == SKDQ_SUCCESS); XASSERT(v == xz); err = skDequePopBackNB(dc, (void**)&v); XASSERT(err == SKDQ_SUCCESS); XASSERT(v == xz); err = skDequePopFrontNB(dc, (void**)&v); XASSERT(err == SKDQ_SUCCESS); XASSERT(v == xc); err = skDequePopBackNB(dc, (void**)&v); XASSERT(err == SKDQ_SUCCESS); XASSERT(v == xc); err = skDequePopBackNB(dc, (void**)&v); XASSERT(err == SKDQ_EMPTY); /* verify 'dc' is empty */ CHECK_EMPTY(dc); /* create a merged queue from 'da' and 'db' */ dd = skDequeCreateMerged(da, db); /* verify 'dd' is empty */ CHECK_EMPTY(dd); /* push the first element onto each of 'da' and 'db' */ err = skDequePushBack(da, (void*)xa); XASSERT(err == SKDQ_SUCCESS); err = skDequePushBack(db, (void*)xx); XASSERT(err == SKDQ_SUCCESS); /* check sizes */ XASSERT(1 == skDequeSize(da)); XASSERT(1 == skDequeSize(db)); XASSERT(2 == skDequeSize(dd)); /* peek at front and back of merged deck */ err = skDequeBack(dd, (void**)&v); XASSERT(err == SKDQ_SUCCESS); XASSERT(v == xx); err = skDequeFront(dd, (void**)&v); XASSERT(err == SKDQ_SUCCESS); XASSERT(v == xa); /* push the second element onto each of 'da' and 'db' */ err = skDequePushBack(da, (void*)xb); XASSERT(err == SKDQ_SUCCESS); err = skDequePushBack(db, (void*)xy); XASSERT(err == SKDQ_SUCCESS); /* peek at front and back of merged deck */ err = skDequeBack(dd, (void**)&v); XASSERT(err == SKDQ_SUCCESS); XASSERT(v == xy); err = skDequeFront(dd, (void**)&v); XASSERT(err == SKDQ_SUCCESS); XASSERT(v == xa); /* push a third element onto front and back of merged deck */ err = skDequePushFront(dd, (void*)xc); XASSERT(err == SKDQ_SUCCESS); err = skDequePushBack(db, (void*)xz); XASSERT(err == SKDQ_SUCCESS); /* check sizes */ XASSERT(3 == skDequeSize(da)); XASSERT(3 == skDequeSize(db)); XASSERT(6 == skDequeSize(dd)); /* peek at front and back of 'da' */ err = skDequeBack(da, (void**)&v); XASSERT(err == SKDQ_SUCCESS); XASSERT(v == xb); err = skDequeFront(da, (void**)&v); XASSERT(err == SKDQ_SUCCESS); XASSERT(v == xc); /* peek at front and back of 'db' */ err = skDequeBack(db, (void**)&v); XASSERT(err == SKDQ_SUCCESS); XASSERT(v == xz); err = skDequeFront(db, (void**)&v); XASSERT(err == SKDQ_SUCCESS); XASSERT(v == xx); /* pop three elements from front of 'dd' */ XASSERT(6 == skDequeSize(dd)); err = skDequePopFrontNB(dd, (void**)&v); XASSERT(err == SKDQ_SUCCESS); XASSERT(v == xc); err = skDequePopFrontNB(dd, (void**)&v); XASSERT(err == SKDQ_SUCCESS); XASSERT(v == xa); err = skDequePopFrontNB(dd, (void**)&v); XASSERT(err == SKDQ_SUCCESS); XASSERT(v == xb); /* verify 'da' is empty */ CHECK_EMPTY(da); /* pop three elements from front of 'dd' */ XASSERT(3 == skDequeSize(dd)); XASSERT(3 == skDequeSize(db)); err = skDequePopFrontNB(dd, (void**)&v); XASSERT(err == SKDQ_SUCCESS); XASSERT(v == xx); err = skDequePopFrontNB(dd, (void**)&v); XASSERT(err == SKDQ_SUCCESS); XASSERT(v == xy); err = skDequePopFrontNB(dd, (void**)&v); XASSERT(err == SKDQ_SUCCESS); XASSERT(v == xz); /* verify 'db' is empty */ CHECK_EMPTY(db); /* verify 'dd' is empty */ CHECK_EMPTY(dd); /* done with 'dd' */ skDequeDestroy(dd); /* verify 'da' and 'db' are still empty (and valid) */ CHECK_EMPTY(da); CHECK_EMPTY(db); /*** Multi-threaded tests ***/ rv = skthread_create("a", &a, thread_a, NULL); XASSERT(rv == 0); rv = skthread_create("b", &b, thread_b, NULL); XASSERT(rv == 0); rv = skthread_create("c", &c, thread_c, NULL); XASSERT(rv == 0); rv = pthread_join(a, NULL); XASSERT(rv == 0); rv = pthread_join(b, NULL); XASSERT(rv == 0); rv = pthread_join(c, NULL); XASSERT(rv == 0); skDequeDestroy(dc); skDequeDestroy(db); skDequeDestroy(da); sklogClose(); sklogTeardown(); skthread_teardown(); skAppUnregister(); return 0; }