/* * This is the registration function. * * When you provide "--plugin=my-plugin.so" on the command line to * an application, the application calls this function to determine * the new switches and/or fields that "my-plugin" provides. * * This function is called with three arguments: the first two * describe the version of the plug-in API, and the third is a * pointer that is currently unused. */ skplugin_err_t SKPLUGIN_SETUP_FN( uint16_t major_version, uint16_t minor_version, void UNUSED(*plug_in_data)) { skplugin_err_t err; const char *env; /* Check the plug-in API version */ err = skpinSimpleCheckVersion(major_version, minor_version, PLUGIN_API_VERSION_MAJOR, PLUGIN_API_VERSION_MINOR, skAppPrintErr); if (err != SKPLUGIN_OK) { return err; } env = getenv("INCOMING_FLOWTYPES"); if (env && *env) { parseFlowtypes(env, (void*)&incoming_flowtypes); } env = getenv("OUTGOING_FLOWTYPES"); if (env && *env) { parseFlowtypes(env, (void*)&outgoing_flowtypes); } /* register options for all apps that use key-field */ err = skpinRegOption2("incoming-flowtypes", REQUIRED_ARG, "List of flowtypes representing incoming flows", NULL, parseFlowtypes, (void*)&incoming_flowtypes, 5, SKPLUGIN_APP_CUT, SKPLUGIN_APP_GROUP, SKPLUGIN_APP_SORT, SKPLUGIN_APP_STATS_FIELD, SKPLUGIN_APP_UNIQ_FIELD); if (err != SKPLUGIN_OK && err != SKPLUGIN_ERR_DID_NOT_REGISTER) { return err; } err = skpinRegOption2("outgoing-flowtypes", REQUIRED_ARG, "List of flowtypes representing outgoing flows", NULL, parseFlowtypes, (void*)&outgoing_flowtypes, 5, SKPLUGIN_APP_CUT, SKPLUGIN_APP_GROUP, SKPLUGIN_APP_SORT, SKPLUGIN_APP_STATS_FIELD, SKPLUGIN_APP_UNIQ_FIELD); if (err != SKPLUGIN_OK && err != SKPLUGIN_ERR_DID_NOT_REGISTER) { return err; } err = skpinRegCleanup(cleanup); if (SKPLUGIN_OK != err) { return err; } return SKPLUGIN_OK; }
/* the registration function called by skplugin.c */ skplugin_err_t SKPLUGIN_SETUP_FN( uint16_t major_version, uint16_t minor_version, void UNUSED(*pi_data)) { skplugin_err_t rv; skplugin_callbacks_t regdata; /* Check API version */ rv = skpinSimpleCheckVersion(major_version, minor_version, PLUGIN_API_VERSION_MAJOR, PLUGIN_API_VERSION_MINOR, skAppPrintErr); if (rv != SKPLUGIN_OK) { return rv; } /* Register the function to use for filtering */ memset(®data, 0, sizeof(regdata)); regdata.filter = check; return skpinRegFilter(NULL, ®data, NULL); }
/* the registration function */ skplugin_err_t skAddressTypesAddFields( uint16_t major_version, uint16_t minor_version, void UNUSED(*pi_data)) { int i, j; skplugin_field_t *field = NULL; skplugin_callbacks_t regdata; skplugin_err_t rv; /* Check API version */ rv = skpinSimpleCheckVersion(major_version, minor_version, PLUGIN_API_VERSION_MAJOR, PLUGIN_API_VERSION_MINOR, skAppPrintErr); if (rv != SKPLUGIN_OK) { return rv; } /* register the fields to use for rwcut, rwuniq, rwsort */ memset(®data, 0, sizeof(regdata)); regdata.init = addrtypeInit; regdata.cleanup = addrtypeCleanup; regdata.column_width = ADDRTYPE_TEXT_WIDTH; regdata.bin_bytes = sizeof(uint8_t); regdata.rec_to_text = recToText; regdata.rec_to_bin = recToBin; regdata.bin_to_text = binToText; for (i = 0; plugin_fields[i].name; ++i) { rv = skpinRegField(&field, plugin_fields[i].name, NULL, ®data, (void*)&plugin_fields[i].val); if (SKPLUGIN_OK != rv) { return rv; } for (j = 0; plugin_fields[i].aliases[j]; ++j) { rv = skpinAddFieldAlias(field, plugin_fields[i].aliases[j]); if (SKPLUGIN_OK != rv) { return rv; } } } /* sanity check */ assert((sizeof(plugin_options)/sizeof(struct option)) == (sizeof(plugin_help)/sizeof(char*))); /* register the options to use for rwfilter. when the option is * given, we will call skpinRegFilter() to register the filter * function. */ for (i = 0; plugin_options[i].name; ++i) { rv = skpinRegOption2(plugin_options[i].name, plugin_options[i].has_arg, plugin_help[i], NULL, &optionsHandler, (void*)&plugin_options[i].val, 1, SKPLUGIN_FN_FILTER); if (SKPLUGIN_OK != rv && SKPLUGIN_ERR_DID_NOT_REGISTER != rv) { return rv; } } return SKPLUGIN_OK; }
/* Public entry point */ skplugin_err_t skPrefixMapAddFields( uint16_t major_version, uint16_t minor_version, void UNUSED(*data)) { skplugin_err_t err; #define PMAP_FILE_HELP(str_arg) \ ("Prefix map file to read. Def. None. When the argument has\n" \ "\tthe form \"<mapfile>:<filename>\"," \ " the \"mapname\" is used to generate\n" \ str_arg) assert(strlen(src_dir_name) == strlen(dst_dir_name)); /* Check API version */ err = skpinSimpleCheckVersion(major_version, minor_version, PLUGIN_API_VERSION_MAJOR, PLUGIN_API_VERSION_MINOR, skAppPrintErr); if (err != SKPLUGIN_OK) { return err; } /* Initialize global variables */ pmap_vector = skVectorNew(sizeof(pmap_data_t *)); if (pmap_vector == NULL) { ERR_NO_MEM(pmap_vector); return SKPLUGIN_ERR; } /* Add --pmap-file to apps that accept RWREC: rwcut, rwsort, etc */ err = skpinRegOption2(pmap_file_option, REQUIRED_ARG, PMAP_FILE_HELP( "\tfield names. As such, this switch must" " precede the --fields switch."), NULL, pmapfile_handler, NULL, 2, SKPLUGIN_FN_REC_TO_TEXT, SKPLUGIN_FN_REC_TO_BIN); if (err == SKPLUGIN_ERR_FATAL) { return err; } /* Add --pmap-column-width to apps that produce TEXT: rwcut, rwuniq */ err = skpinRegOption2(pmap_column_width_option, REQUIRED_ARG, "Maximum column width to use for output.", NULL, pmap_column_width_handler, NULL, 2, SKPLUGIN_FN_REC_TO_TEXT, SKPLUGIN_FN_BIN_TO_TEXT); if (err == SKPLUGIN_ERR_FATAL) { return err; } /* Add --pmap-file to rwfilter */ err = skpinRegOption2(pmap_file_option, REQUIRED_ARG, PMAP_FILE_HELP( "\tfiltering switches. This switch must" " precede other --pmap-* switches."), NULL, pmapfile_handler, NULL, 1, SKPLUGIN_FN_FILTER); if (err == SKPLUGIN_ERR_FATAL) { return err; } /* Register cleanup function */ skpinRegCleanup(pmap_teardown); return SKPLUGIN_OK; }
/* the registration function called by skplugin.c */ skplugin_err_t SKPLUGIN_SETUP_FN( uint16_t major_version, uint16_t minor_version, void UNUSED(*pi_data)) { int i; skplugin_field_t *field; skplugin_err_t rv; skplugin_callbacks_t regdata; /* Check API version */ rv = skpinSimpleCheckVersion(major_version, minor_version, PLUGIN_API_VERSION_MAJOR, PLUGIN_API_VERSION_MINOR, skAppPrintErr); if (rv != SKPLUGIN_OK) { return rv; } assert((sizeof(plugin_options)/sizeof(struct option)) == (sizeof(plugin_help)/sizeof(char*))); /* register the options for rwfilter. when the option is given, * we call skpinRegFilter() to register the filter function. * NOTE: Skip the first entry in the plugin_options[] array. */ for (i = 1; plugin_options[i].name; ++i) { rv = skpinRegOption2(plugin_options[i].name, plugin_options[i].has_arg, plugin_help[i], NULL, &optionsHandler, (void*)&plugin_options[i].val, 1, SKPLUGIN_FN_FILTER); if (SKPLUGIN_OK != rv && SKPLUGIN_ERR_DID_NOT_REGISTER != rv) { return rv; } } /* the first entry in the plugin_options[] array is usable by all * applications */ rv = skpinRegOption2(plugin_options[0].name, plugin_options[0].has_arg, plugin_help[0], NULL, &optionsHandler, (void*)&plugin_options[0].val, 3, SKPLUGIN_FN_FILTER, SKPLUGIN_FN_REC_TO_TEXT, SKPLUGIN_FN_REC_TO_BIN); if (SKPLUGIN_OK != rv && SKPLUGIN_ERR_DID_NOT_REGISTER != rv) { return rv; } /* register the key fields to use for rwcut, rwuniq, rwsort, * rwstats */ memset(®data, 0, sizeof(regdata)); regdata.column_width = RATE_TEXT_WIDTH; regdata.bin_bytes = RATE_BINARY_SIZE_KEY; regdata.rec_to_text = recToTextKey; regdata.rec_to_bin = recToBinKey; regdata.bin_to_text = binToTextKey; for (i = 0; plugin_fields[i].name; ++i) { rv = skpinRegField(&field, plugin_fields[i].name, plugin_fields[i].description, ®data, (void*)&plugin_fields[i].val); if (SKPLUGIN_OK != rv) { return rv; } } /* register the aggregate value fields to use for rwuniq and * rwstats */ memset(®data, 0, sizeof(regdata)); regdata.column_width = RATE_TEXT_WIDTH; regdata.bin_bytes = RATE_BINARY_SIZE_AGG; regdata.add_rec_to_bin = addRecToBinAgg; regdata.bin_to_text = binToTextAgg; regdata.bin_merge = binMergeAgg; regdata.bin_compare = binCompareAgg; for (++i; plugin_fields[i].name; ++i) { if (PAYLOAD_BYTES_AGG == plugin_fields[i].val) { /* special case size of payload-bytes */ regdata.bin_bytes = sizeof(uint64_t); rv = skpinRegField(&field, plugin_fields[i].name, plugin_fields[i].description, ®data, (void*)&plugin_fields[i].val); regdata.bin_bytes = RATE_BINARY_SIZE_AGG; } else { rv = skpinRegField(&field, plugin_fields[i].name, plugin_fields[i].description, ®data, (void*)&plugin_fields[i].val); } if (SKPLUGIN_OK != rv) { return rv; } } return SKPLUGIN_OK; }