summaryrefslogtreecommitdiff
path: root/source3
diff options
context:
space:
mode:
Diffstat (limited to 'source3')
-rw-r--r--source3/include/proto.h2
-rw-r--r--source3/lib/util.c47
-rw-r--r--source3/nmbd/nmbd.c21
-rw-r--r--source3/nmbd/nmbd_packets.c19
-rw-r--r--source3/smbd/server.c13
5 files changed, 98 insertions, 4 deletions
diff --git a/source3/include/proto.h b/source3/include/proto.h
index 7c2966b64f..1245b21039 100644
--- a/source3/include/proto.h
+++ b/source3/include/proto.h
@@ -1368,6 +1368,8 @@ BOOL user_in_list(char *user,char *list);
/*The following definitions come from util.c */
+int sig_usr2(void);
+int sig_usr1(void);
void setup_logging(char *pname,BOOL interactive);
void reopen_logs(void);
char *tmpdir(void);
diff --git a/source3/lib/util.c b/source3/lib/util.c
index 125db2ed1e..5c81a14c66 100644
--- a/source3/lib/util.c
+++ b/source3/lib/util.c
@@ -92,6 +92,53 @@ static BOOL stdout_logging = False;
static char *filename_dos(char *path,char *buf);
+#if defined(SIGUSR2)
+/**************************************************************************** **
+ catch a sigusr2 - decrease the debug log level.
+ **************************************************************************** */
+int sig_usr2(void)
+{
+ BlockSignals( True, SIGUSR2);
+
+ DEBUGLEVEL--;
+
+ if(DEBUGLEVEL < 0)
+ DEBUGLEVEL = 0;
+
+ DEBUG( 0, ( "Got SIGUSR2 set debug level to %d.\n", DEBUGLEVEL ) );
+
+ BlockSignals( False, SIGUSR2);
+#ifndef DONT_REINSTALL_SIG
+ signal(SIGUSR2, SIGNAL_CAST sig_usr2);
+#endif
+ return(0);
+}
+#endif /* SIGUSR1 */
+
+#if defined(SIGUSR1)
+/**************************************************************************** **
+ catch a sigusr1 - increase the debug log level.
+ **************************************************************************** */
+int sig_usr1(void)
+{
+ BlockSignals( True, SIGUSR1);
+
+ DEBUGLEVEL++;
+
+ if(DEBUGLEVEL > 10)
+ DEBUGLEVEL = 10;
+
+ DEBUG( 0, ( "Got SIGUSR1 set debug level to %d.\n", DEBUGLEVEL ) );
+
+ BlockSignals( False, SIGUSR1);
+#ifndef DONT_REINSTALL_SIG
+ signal(SIGUSR1, SIGNAL_CAST sig_usr1);
+#endif
+ return(0);
+}
+#endif /* SIGUSR1 */
+
+
/*******************************************************************
get ready for syslog stuff
******************************************************************/
diff --git a/source3/nmbd/nmbd.c b/source3/nmbd/nmbd.c
index da98fbfde3..744942ba46 100644
--- a/source3/nmbd/nmbd.c
+++ b/source3/nmbd/nmbd.c
@@ -75,11 +75,11 @@ static int sig_term()
announce_my_servers_removed();
exit(0);
+
/* Keep compiler happy.. */
return 0;
} /* sig_term */
-
/**************************************************************************** **
catch a sighup
**************************************************************************** */
@@ -577,6 +577,17 @@ int main(int argc,char *argv[])
signal( SIGHUP, SIGNAL_CAST sig_hup );
signal( SIGTERM, SIGNAL_CAST sig_term );
+ /* Setup the signals that allow the debug log level
+ to by dynamically changed. */
+
+#if defined(SIGUSR1)
+ signal( SIGUSR1, SIGNAL_CAST sig_usr1 );
+#endif /* SIGUSR1 */
+
+#if defined(SIGUSR2)
+ signal( SIGUSR2, SIGNAL_CAST sig_usr2 );
+#endif /* SIGUSR2 */
+
while((opt = getopt(argc, argv, "as:T:I:C:bAi:B:N:Rn:l:d:Dp:hSH:G:f:")) != EOF)
{
switch (opt)
@@ -755,8 +766,14 @@ int main(int argc,char *argv[])
exit(1);
}
- /* We can only take sigterm signals in the select. */
+ /* We can only take signals in the select. */
BlockSignals( True, SIGTERM );
+#if defined(SIGUSR1)
+ BlockSignals( True, SIGUSR1);
+#endif /* SIGUSR1 */
+#if defined(SIGUSR2)
+ BlockSignals( True, SIGUSR2);
+#endif /* SIGUSR2 */
process();
close_sockets();
diff --git a/source3/nmbd/nmbd_packets.c b/source3/nmbd/nmbd_packets.c
index 4fb0543967..03bd3889fa 100644
--- a/source3/nmbd/nmbd_packets.c
+++ b/source3/nmbd/nmbd_packets.c
@@ -1650,10 +1650,27 @@ BOOL listen_for_packets(BOOL run_election)
timeout.tv_sec = (run_election||num_response_packets) ? 1 : NMBD_SELECT_LOOP;
timeout.tv_usec = 0;
- /* We can only take term signals when we are in the select. */
+ /* Prepare for the select - allow certain signals. */
+
BlockSignals(False, SIGTERM);
+#if defined(SIGUSR1)
+ BlockSignals(False, SIGUSR1);
+#endif /* SIGUSR1 */
+#if defined(SIGUSR2)
+ BlockSignals(False, SIGUSR2);
+#endif /* SIGUSR2 */
+
selrtn = sys_select(&fds,&timeout);
+
+ /* We can only take signals when we are in the select - block them again here. */
+
BlockSignals(True, SIGTERM);
+#if defined(SIGUSR1)
+ BlockSignals(True, SIGUSR1);
+#endif /* SIGUSR1 */
+#if defined(SIGUSR2)
+ BlockSignals(True, SIGUSR2);
+#endif /* SIGUSR2 */
if(selrtn > 0)
{
diff --git a/source3/smbd/server.c b/source3/smbd/server.c
index 5e5f129959..5eb360bbe7 100644
--- a/source3/smbd/server.c
+++ b/source3/smbd/server.c
@@ -5243,7 +5243,18 @@ static void usage(char *pname)
#ifndef NO_SIGNAL_TEST
signal(SIGHUP,SIGNAL_CAST sig_hup);
#endif
-
+
+ /* Setup the signals that allow the debug log level
+ to by dynamically changed. */
+
+#if defined(SIGUSR1)
+ signal( SIGUSR1, SIGNAL_CAST sig_usr1 );
+#endif /* SIGUSR1 */
+
+#if defined(SIGUSR2)
+ signal( SIGUSR2, SIGNAL_CAST sig_usr2 );
+#endif /* SIGUSR2 */
+
DEBUG(3,("%s loaded services\n",timestring()));
if (!is_daemon && !is_a_socket(0))