Beispiel #1
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;
    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();
}
Beispiel #2
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;
    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();
}
Beispiel #3
0
/*
 *  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();
}
Beispiel #4
0
/*
 *  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();
}
Beispiel #5
0
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;
}
Beispiel #6
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();
}
Beispiel #7
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;

    skStreamDestroy(&out);

    skAppUnregister();
}
Beispiel #8
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;

    skOptionsNotesTeardown();
    skOptionsCtxDestroy(&optctx);
    skAppUnregister();
}
Beispiel #9
0
/*
 *  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();
}
Beispiel #10
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;

#error "Anything you put in setup should now be torn down"
    /* for example, close sample output file */
    skStreamDestroy(&out_stream);

    skAppUnregister();
}
Beispiel #11
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;

    if (ipset) {
        skIPSetDestroy(&ipset);
    }
    skStreamDestroy(&in_stream);
    skStreamDestroy(&out_stream);

    skIPSetOptionsTeardown();
    skAppUnregister();
}
Beispiel #12
0
/*
 *  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();
}
Beispiel #13
0
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;
}