bug 2113: unix-socket start up race

pull/2714/head
Victor Julien 8 years ago
parent 5b56d324c4
commit c513896786

@ -67,6 +67,7 @@ const char *RunModeUnixSocketGetDefaultMode(void)
#ifdef BUILD_UNIX_SOCKET #ifdef BUILD_UNIX_SOCKET
static int RunModeUnixSocketSingle(void);
static int unix_manager_file_task_running = 0; static int unix_manager_file_task_running = 0;
static int unix_manager_file_task_failed = 0; static int unix_manager_file_task_failed = 0;
@ -1007,14 +1008,17 @@ TmEcode UnixSocketHostbitList(json_t *cmd, json_t* answer, void *data_unused)
} }
#endif /* BUILD_UNIX_SOCKET */ #endif /* BUILD_UNIX_SOCKET */
#ifdef BUILD_UNIX_SOCKET
/** /**
* \brief Single thread version of the Pcap file processing. * \brief Single thread version of the Pcap file processing.
*/ */
int RunModeUnixSocketSingle(void) static int RunModeUnixSocketSingle(void)
{ {
#ifdef BUILD_UNIX_SOCKET
PcapCommand *pcapcmd = SCMalloc(sizeof(PcapCommand)); PcapCommand *pcapcmd = SCMalloc(sizeof(PcapCommand));
if (UnixManagerInit() != 0)
return 1;
if (unlikely(pcapcmd == NULL)) { if (unlikely(pcapcmd == NULL)) {
SCLogError(SC_ERR_MEM_ALLOC, "Can not allocate pcap command"); SCLogError(SC_ERR_MEM_ALLOC, "Can not allocate pcap command");
return 1; return 1;
@ -1023,20 +1027,19 @@ int RunModeUnixSocketSingle(void)
pcapcmd->running = 0; pcapcmd->running = 0;
pcapcmd->currentfile = NULL; pcapcmd->currentfile = NULL;
UnixManagerThreadSpawn(1);
unix_socket_mode_is_running = 1;
UnixManagerRegisterCommand("pcap-file", UnixSocketAddPcapFile, pcapcmd, UNIX_CMD_TAKE_ARGS); UnixManagerRegisterCommand("pcap-file", UnixSocketAddPcapFile, pcapcmd, UNIX_CMD_TAKE_ARGS);
UnixManagerRegisterCommand("pcap-file-number", UnixSocketPcapFilesNumber, pcapcmd, 0); UnixManagerRegisterCommand("pcap-file-number", UnixSocketPcapFilesNumber, pcapcmd, 0);
UnixManagerRegisterCommand("pcap-file-list", UnixSocketPcapFilesList, pcapcmd, 0); UnixManagerRegisterCommand("pcap-file-list", UnixSocketPcapFilesList, pcapcmd, 0);
UnixManagerRegisterCommand("pcap-current", UnixSocketPcapCurrent, pcapcmd, 0); UnixManagerRegisterCommand("pcap-current", UnixSocketPcapCurrent, pcapcmd, 0);
UnixManagerRegisterBackgroundTask(UnixSocketPcapFilesCheck, pcapcmd); UnixManagerRegisterBackgroundTask(UnixSocketPcapFilesCheck, pcapcmd);
#endif
UnixManagerThreadSpawn(1);
unix_socket_mode_is_running = 1;
return 0; return 0;
} }
#endif
int RunModeUnixSocketIsActive(void) int RunModeUnixSocketIsActive(void)
{ {

@ -23,7 +23,6 @@
#ifndef __RUNMODE_UNIX_SOCKET_H__ #ifndef __RUNMODE_UNIX_SOCKET_H__
#define __RUNMODE_UNIX_SOCKET_H__ #define __RUNMODE_UNIX_SOCKET_H__
int RunModeUnixSocketSingle(void);
void RunModeUnixSocketRegister(void); void RunModeUnixSocketRegister(void);
const char *RunModeUnixSocketGetDefaultMode(void); const char *RunModeUnixSocketGetDefaultMode(void);

@ -846,22 +846,13 @@ TmEcode UnixManagerRegisterBackgroundTask(TmEcode (*Func)(void *),
SCReturnInt(TM_ECODE_OK); SCReturnInt(TM_ECODE_OK);
} }
typedef struct UnixManagerThreadData_ { int UnixManagerInit(void)
int padding;
} UnixManagerThreadData;
static TmEcode UnixManagerThreadInit(ThreadVars *t, const void *initdata, void **data)
{ {
UnixManagerThreadData *utd = SCCalloc(1, sizeof(*utd));
if (utd == NULL)
return TM_ECODE_FAILED;
if (UnixNew(&command) == 0) { if (UnixNew(&command) == 0) {
int failure_fatal = 0; int failure_fatal = 0;
if (ConfGetBool("engine.init-failure-fatal", &failure_fatal) != 1) { if (ConfGetBool("engine.init-failure-fatal", &failure_fatal) != 1) {
SCLogDebug("ConfGetBool could not load the value."); SCLogDebug("ConfGetBool could not load the value.");
} }
SCFree(utd);
if (failure_fatal) { if (failure_fatal) {
SCLogError(SC_ERR_INITIALIZATION, SCLogError(SC_ERR_INITIALIZATION,
"Unable to create unix command socket"); "Unable to create unix command socket");
@ -869,7 +860,7 @@ static TmEcode UnixManagerThreadInit(ThreadVars *t, const void *initdata, void *
} else { } else {
SCLogWarning(SC_ERR_INITIALIZATION, SCLogWarning(SC_ERR_INITIALIZATION,
"Unable to create unix command socket"); "Unable to create unix command socket");
return TM_ECODE_FAILED; return -1;
} }
} }
@ -893,6 +884,19 @@ static TmEcode UnixManagerThreadInit(ThreadVars *t, const void *initdata, void *
UnixManagerRegisterCommand("remove-hostbit", UnixSocketHostbitRemove, &command, UNIX_CMD_TAKE_ARGS); UnixManagerRegisterCommand("remove-hostbit", UnixSocketHostbitRemove, &command, UNIX_CMD_TAKE_ARGS);
UnixManagerRegisterCommand("list-hostbit", UnixSocketHostbitList, &command, UNIX_CMD_TAKE_ARGS); UnixManagerRegisterCommand("list-hostbit", UnixSocketHostbitList, &command, UNIX_CMD_TAKE_ARGS);
return 0;
}
typedef struct UnixManagerThreadData_ {
int padding;
} UnixManagerThreadData;
static TmEcode UnixManagerThreadInit(ThreadVars *t, const void *initdata, void **data)
{
UnixManagerThreadData *utd = SCCalloc(1, sizeof(*utd));
if (utd == NULL)
return TM_ECODE_FAILED;
*data = utd; *data = utd;
return TM_ECODE_OK; return TM_ECODE_OK;
} }

@ -33,6 +33,7 @@
SCCtrlCondT unix_manager_ctrl_cond; SCCtrlCondT unix_manager_ctrl_cond;
SCCtrlMutex unix_manager_ctrl_mutex; SCCtrlMutex unix_manager_ctrl_mutex;
int UnixManagerInit(void);
void UnixManagerThreadSpawn(int mode); void UnixManagerThreadSpawn(int mode);
void UnixSocketKillSocketThread(void); void UnixSocketKillSocketThread(void);

Loading…
Cancel
Save