static TAILQ_HEAD(, OutputModule_) output_modules =
TAILQ_HEAD_INITIALIZER(output_modules);
+/**
+ * Registry of flags to be updated on file rotation notification.
+ */
+typedef struct OutputFileRolloverFlag_ {
+ int *flag;
+
+ TAILQ_ENTRY(OutputFileRolloverFlag_) entries;
+} OutputFileRolloverFlag;
+
+TAILQ_HEAD(, OutputFileRolloverFlag_) output_file_rotation_flags =
+ TAILQ_HEAD_INITIALIZER(output_file_rotation_flags);
+
/**
* \brief Register an output module.
*
if (ssh_loggers)
ssh_loggers--;
}
+
+void OutputRegisterFileRotationFlag(int *flag)
+{
+ OutputFileRolloverFlag *flag_entry = SCCalloc(1, sizeof(*flag_entry));
+ if (unlikely(flag_entry == NULL)) {
+ SCLogError(SC_ERR_MEM_ALLOC,
+ "Failed to allocate memory to register file rotation flag");
+ return;
+ }
+ flag_entry->flag = flag;
+ TAILQ_INSERT_TAIL(&output_file_rotation_flags, flag_entry, entries);
+}
+
+void OutputNotifyFileRotation(void)
+{
+ OutputFileRolloverFlag *flag;
+ TAILQ_FOREACH(flag, &output_file_rotation_flags, entries) {
+ *(flag->flag) = 1;
+ }
+}
int OutputSshLoggerEnable(void);
void OutputSshLoggerDisable(void);
+void OutputRegisterFileRotationFlag(int *flag);
+void OutputNotifyFileRotation(void);
+
#endif /* ! __OUTPUT_H__ */
return;
}
+/**
+ * SIGHUP handler. Just set sighup_count. The main loop will act on
+ * it.
+ */
+static void SignalHandlerSigHup(/*@unused@*/ int sig) {
+ sighup_count = 1;
+}
+
#ifdef DBG_MEM_ALLOC
#ifndef _GLOBAL_MEM_
#define _GLOBAL_MEM_
#ifndef OS_WIN32
/* SIGHUP is not implemented on WIN32 */
- UtilSignalHandlerSetup(SIGHUP, SIG_IGN);
+ UtilSignalHandlerSetup(SIGHUP, SignalHandlerSigHup);
/* Try to get user/group to run suricata as if
command line as not decide of that */
TmThreadCheckThreadState();
+ if (sighup_count > 0) {
+ OutputNotifyFileRotation();
+ sighup_count--;
+ }
+
usleep(10* 1000);
}