]> git.ipfire.org Git - thirdparty/suricata.git/commitdiff
unix-manager: convert to thread module
authorVictor Julien <victor@inliniac.net>
Wed, 13 May 2015 14:52:11 +0000 (16:52 +0200)
committerVictor Julien <victor@inliniac.net>
Wed, 13 May 2015 14:52:11 +0000 (16:52 +0200)
Sync command thread for unix manager with other managers and make
it a full thread module.

src/suricata.c
src/tm-modules.c
src/tm-modules.h
src/tm-threads-common.h
src/tm-threads.c
src/tm-threads.h
src/unix-manager.c
src/unix-manager.h

index d0971ab4843f4bb2a1f9000d78c929f82ea4e7fd..6a8f0679508d4d29bbb60571f3090d990ff08046 100644 (file)
@@ -797,6 +797,8 @@ int g_ut_covered;
 
 void RegisterAllModules()
 {
+    /* commanders */
+    TmModuleUnixManagerRegister();
     /* managers */
     TmModuleFlowManagerRegister();
     TmModuleFlowRecyclerRegister();
index bd990b4e119c9b15f7ce5ff047c7a99b2854663d..3c6d6d22927127d5517025e97df8f309a114bab5 100644 (file)
@@ -267,6 +267,7 @@ const char * TmModuleTmmIdToString(TmmId id)
         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);
index a606306c5590e1ddca63e95d18181c732ddd26b2..6502b21c1080683185840930bba4d2121ed42b17 100644 (file)
@@ -34,6 +34,7 @@
 #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;
index c18e50876521bbc1a6720ccdefc38350ea376bbd..5affa40c1866c5bbd8e71f0504ffcf6b1f123117 100644 (file)
@@ -104,6 +104,8 @@ typedef enum {
     TMM_FLOWMANAGER,
     TMM_FLOWRECYCLER,
 
+    TMM_UNIXMANAGER,
+
     TMM_LUALOG,
     TMM_SIZE,
 } TmmId;
index 92f35e5178d845ce1f174a28c554742d521e5dca..b77f52af4dbdb4bddd0d9bf84753472b19d6a067 100644 (file)
@@ -662,6 +662,8 @@ TmEcode TmThreadSetSlots(ThreadVars *tv, char *name, void *(*fn_p)(void *))
         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;
@@ -1227,6 +1229,39 @@ ThreadVars *TmThreadCreateMgmtThreadByName(char *name, char *module,
     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
index 0c92a4bdb09d4255850ad5ed8854bf1c5ce47588..363a30b8b3d28de081c7d7f4d1d3d5155a7c30ac 100644 (file)
@@ -92,6 +92,8 @@ ThreadVars *TmThreadCreateMgmtThread(char *name, void *(fn_p)(void *), int);
 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);
index e86bae81aab94719975b23f497818de906d6ba89..b8eb0045ca44d10ef92de05cae8afe9ed9447f0c 100644 (file)
@@ -841,13 +841,31 @@ TmEcode UnixManagerRegisterBackgroundTask(TmEcode (*Func)(void *),
     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);
@@ -863,8 +881,7 @@ void *UnixManagerThread(void *td)
         if (failure_fatal) {
             exit(EXIT_FAILURE);
         } else {
-            TmThreadsSetFlag(th_v, THV_INIT_DONE|THV_RUNNING_DONE);
-            pthread_exit((void *) 0);
+            return TM_ECODE_FAILED;
         }
     }
 
@@ -904,10 +921,7 @@ void *UnixManagerThread(void *td)
 
         UnixCommandBackgroundTasks(&command);
     }
-    TmThreadWaitForFlag(th_v, THV_DEINIT);
-
-    TmThreadsSetFlag(th_v, THV_CLOSED);
-    pthread_exit((void *) 0);
+    return TM_ECODE_OK;
 }
 
 
@@ -922,8 +936,8 @@ void UnixManagerThreadSpawn(int mode)
     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");
@@ -997,3 +1011,15 @@ void UnixSocketKillSocketThread(void)
 }
 
 #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 */
+}
index 2bbdee11ed997c11783bb02ed05bf6a2874b99ae..848da76137d63d0f67aae43734dd51de05bbdc56 100644 (file)
@@ -46,4 +46,6 @@ TmEcode UnixManagerRegisterBackgroundTask(
         void *data);
 #endif
 
+void TmModuleUnixManagerRegister(void);
+
 #endif /* UNIX_MANAGER_H */