/* * 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; }
/* 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; }