void RegisterAllModules()
{
+ /* commanders */
+ TmModuleUnixManagerRegister();
/* managers */
TmModuleFlowManagerRegister();
TmModuleFlowRecyclerRegister();
CASE_CODE (TMM_OUTPUTJSON);
CASE_CODE (TMM_FLOWMANAGER);
CASE_CODE (TMM_FLOWRECYCLER);
+ CASE_CODE (TMM_UNIXMANAGER);
CASE_CODE (TMM_LUALOG);
CASE_CODE (TMM_LOGSTATSLOG);
CASE_CODE (TMM_RECEIVENETMAP);
#define TM_FLAG_DETECT_TM 0x08
#define TM_FLAG_LOGAPI_TM 0x10 /**< TM is run by Log API */
#define TM_FLAG_MANAGEMENT_TM 0x20
+#define TM_FLAG_COMMAND_TM 0x40
typedef struct TmModule_ {
char *name;
TMM_FLOWMANAGER,
TMM_FLOWRECYCLER,
+ TMM_UNIXMANAGER,
+
TMM_LUALOG,
TMM_SIZE,
} TmmId;
tv->tm_func = TmThreadsSlotPktAcqLoop;
} else if (strcmp(name, "management") == 0) {
tv->tm_func = TmThreadsManagement;
+ } else if (strcmp(name, "command") == 0) {
+ tv->tm_func = TmThreadsManagement;
} else if (strcmp(name, "custom") == 0) {
if (fn_p == NULL)
goto error;
return tv;
}
+/**
+ * \brief Creates and returns the TV instance for a Command thread (CMD).
+ * This function supports only custom slot functions and hence a
+ * function pointer should be sent as an argument.
+ *
+ * \param name Name of this TV instance
+ * \param module Name of TmModule with COMMAND flag set.
+ * \param mucond Flag to indicate whether to initialize the condition
+ * and the mutex variables for this newly created TV.
+ *
+ * \retval the newly created TV instance, or NULL on error
+ */
+ThreadVars *TmThreadCreateCmdThreadByName(char *name, char *module,
+ int mucond)
+{
+ ThreadVars *tv = NULL;
+
+ tv = TmThreadCreate(name, NULL, NULL, NULL, NULL, "command", NULL, mucond);
+
+ if (tv != NULL) {
+ tv->type = TVT_CMD;
+ tv->id = TmThreadsRegisterThread(tv, tv->type);
+ TmThreadSetCPU(tv, MANAGEMENT_CPU_SET);
+
+ TmModule *m = TmModuleGetByName(module);
+ if (m) {
+ TmSlotSetFuncAppend(tv, m, NULL);
+ }
+ }
+
+ return tv;
+}
+
/**
* \brief Creates and returns the TV instance for a CMD thread.
* This function supports only custom slot functions and hence a
ThreadVars *TmThreadCreateMgmtThreadByName(char *name, char *module,
int mucond);
ThreadVars *TmThreadCreateCmdThread(char *name, void *(fn_p)(void *), int);
+ThreadVars *TmThreadCreateCmdThreadByName(char *name, char *module,
+ int mucond);
TmEcode TmThreadSpawn(ThreadVars *);
void TmThreadSetFlags(ThreadVars *, uint8_t);
void TmThreadSetAOF(ThreadVars *, uint8_t);
SCReturnInt(TM_ECODE_OK);
}
-void *UnixManagerThread(void *td)
+typedef struct UnixManagerThreadData_ {
+ int padding;
+} UnixManagerThreadData;
+
+static TmEcode UnixManagerThreadInit(ThreadVars *t, void *initdata, void **data)
+{
+ UnixManagerThreadData *utd = SCCalloc(1, sizeof(*utd));
+ if (utd == NULL)
+ return TM_ECODE_FAILED;
+
+ *data = utd;
+ return TM_ECODE_OK;
+}
+
+static TmEcode UnixManagerThreadDeinit(ThreadVars *t, void *data)
+{
+ SCFree(data);
+ return TM_ECODE_OK;
+}
+
+static TmEcode UnixManager(ThreadVars *th_v, void *thread_data)
{
- ThreadVars *th_v = (ThreadVars *)td;
int ret;
/* set the thread name */
- (void) SCSetThreadName(th_v->name);
SCLogDebug("%s started...", th_v->name);
th_v->sc_perf_pca = SCPerfGetAllCountersArray(&th_v->sc_perf_pctx);
if (failure_fatal) {
exit(EXIT_FAILURE);
} else {
- TmThreadsSetFlag(th_v, THV_INIT_DONE|THV_RUNNING_DONE);
- pthread_exit((void *) 0);
+ return TM_ECODE_FAILED;
}
}
UnixCommandBackgroundTasks(&command);
}
- TmThreadWaitForFlag(th_v, THV_DEINIT);
-
- TmThreadsSetFlag(th_v, THV_CLOSED);
- pthread_exit((void *) 0);
+ return TM_ECODE_OK;
}
SCCtrlCondInit(&unix_manager_ctrl_cond, NULL);
SCCtrlMutexInit(&unix_manager_ctrl_mutex, NULL);
- tv_unixmgr = TmThreadCreateCmdThread("UnixManagerThread",
- UnixManagerThread, 0);
+ tv_unixmgr = TmThreadCreateCmdThreadByName("UnixManagerThread",
+ "UnixManager", 0);
if (tv_unixmgr == NULL) {
SCLogError(SC_ERR_INITIALIZATION, "TmThreadsCreate failed");
}
#endif /* BUILD_UNIX_SOCKET */
+
+void TmModuleUnixManagerRegister (void)
+{
+#ifdef BUILD_UNIX_SOCKET
+ tmm_modules[TMM_UNIXMANAGER].name = "UnixManager";
+ tmm_modules[TMM_UNIXMANAGER].ThreadInit = UnixManagerThreadInit;
+ tmm_modules[TMM_UNIXMANAGER].ThreadDeinit = UnixManagerThreadDeinit;
+ tmm_modules[TMM_UNIXMANAGER].Management = UnixManager;
+ tmm_modules[TMM_UNIXMANAGER].cap_flags = 0;
+ tmm_modules[TMM_UNIXMANAGER].flags = TM_FLAG_COMMAND_TM;
+#endif /* BUILD_UNIX_SOCKET */
+}
void *data);
#endif
+void TmModuleUnixManagerRegister(void);
+
#endif /* UNIX_MANAGER_H */