summaryrefslogtreecommitdiff
path: root/source3/lib
diff options
context:
space:
mode:
authorAndrew Bartlett <abartlet@samba.org>2010-10-29 14:19:32 +1100
committerAndrew Bartlett <abartlet@samba.org>2010-11-02 04:36:04 +0000
commit9da4ace1d9789d300ab298bc34694c44b2062f30 (patch)
tree0c4ce1fa4f3a97934c9504263fdfc86a28e39705 /source3/lib
parent4ae27891f8ac0a56d68b0544e78d6c17ade0c1c9 (diff)
downloadsamba-9da4ace1d9789d300ab298bc34694c44b2062f30.tar.gz
samba-9da4ace1d9789d300ab298bc34694c44b2062f30.tar.bz2
samba-9da4ace1d9789d300ab298bc34694c44b2062f30.zip
s3-debug Impove setup_logging() to specify logging to stderr
This change improves the setup_logging() API so that callers which wish to set up logging to stderr can simply ask for it, rather than directly modify the dbf global variable. Andrew Bartlett
Diffstat (limited to 'source3/lib')
-rw-r--r--source3/lib/debug.c164
-rw-r--r--source3/lib/netapi/netapi.c5
-rw-r--r--source3/lib/smbconf/testsuite.c2
3 files changed, 92 insertions, 79 deletions
diff --git a/source3/lib/debug.c b/source3/lib/debug.c
index 3edf9608ca..321b08e099 100644
--- a/source3/lib/debug.c
+++ b/source3/lib/debug.c
@@ -70,16 +70,22 @@
* a newline.
*/
+/* state variables for the debug system */
+static struct {
+ XFILE *dbf; /* The log file handle */
+ enum debug_logtype logtype; /* The type of logging we are doing: eg stdout, file, stderr */
+ const char *prog_name;
+ bool reopening_logs;
+} state;
+
/* -------------------------------------------------------------------------- **
* External variables.
*
- * dbf - Global debug file handle.
* debugf - Debug file name.
* DEBUGLEVEL - System-wide debug message limit. Messages with message-
* levels higher than DEBUGLEVEL will not be processed.
*/
-XFILE *dbf = NULL;
static char *debugf = NULL;
bool debug_warn_unknown_class = True;
bool debug_auto_add_unknown_class = True;
@@ -109,10 +115,6 @@ int DEBUGLEVEL = &debug_all_class_hack;
/* -------------------------------------------------------------------------- **
* Internal variables.
*
- * stdout_logging - Default False, if set to True then dbf will be set to
- * stdout and debug output will go to dbf only, and not
- * to syslog. Set in setup_logging() and read in Debug1().
- *
* debug_count - Number of debug messages that have been output.
* Used to check log size.
*
@@ -133,7 +135,6 @@ int DEBUGLEVEL = &debug_all_class_hack;
* are unable to open a new log file for some reason.
*/
-static bool stdout_logging = False;
static int debug_count = 0;
#ifdef WITH_SYSLOG
static int syslog_level = 0;
@@ -564,55 +565,36 @@ void debug_register_msgs(struct messaging_context *msg_ctx)
debuglevel_message);
}
-/***************************************************************************
- Get ready for syslog stuff
-**************************************************************************/
-
-void setup_logging(const char *pname, bool interactive)
+/**
+ control the name of the logfile and whether logging will be to stdout, stderr
+ or a file, and set up syslog
+*/
+void setup_logging(const char *prog_name, enum debug_logtype new_logtype)
{
debug_init();
-
- /* reset to allow multiple setup calls, going from interactive to
- non-interactive */
- stdout_logging = False;
- if (dbf) {
- x_fflush(dbf);
- if (dbf != x_stdout) {
- (void) x_fclose(dbf);
- }
+ if (state.logtype < new_logtype) {
+ state.logtype = new_logtype;
}
-
- dbf = NULL;
-
- if (interactive) {
- stdout_logging = True;
- dbf = x_stdout;
- x_setbuf( x_stdout, NULL );
+ if (prog_name) {
+ state.prog_name = prog_name;
}
+ reopen_logs();
+
+ if (state.logtype == DEBUG_FILE) {
#ifdef WITH_SYSLOG
- else {
- const char *p = strrchr_m( pname,'/' );
+ const char *p = strrchr_m( prog_name,'/' );
if (p)
- pname = p + 1;
+ prog_name = p + 1;
#ifdef LOG_DAEMON
- openlog( pname, LOG_PID, SYSLOG_FACILITY );
+ openlog( prog_name, LOG_PID, SYSLOG_FACILITY );
#else
/* for old systems that have no facility codes. */
- openlog( pname, LOG_PID );
+ openlog( prog_name, LOG_PID );
#endif
- }
#endif
+ }
}
-/**
- Just run logging to stdout for this program
-*/
-_PUBLIC_ void setup_logging_stdout(void)
-{
- setup_logging(NULL, True);
-}
-
-
/***************************************************************************
Set the logfile name.
**************************************************************************/
@@ -623,6 +605,18 @@ void debug_set_logfile(const char *name)
debugf = SMB_STRDUP(name);
}
+static void debug_close_xfile(XFILE *dbf)
+{
+ if (dbf && (dbf != x_stderr && dbf != x_stdout)) {
+ x_fclose(dbf);
+ }
+}
+
+void debug_close_dbf(void)
+{
+ debug_close_xfile(state.dbf);
+ state.dbf = NULL;
+}
/**************************************************************************
reopen the log files
note that we now do this unconditionally
@@ -631,16 +625,37 @@ void debug_set_logfile(const char *name)
Fix from dgibson@linuxcare.com.
**************************************************************************/
-bool reopen_logs( void )
+/**
+ reopen the log file (usually called because the log file name might have changed)
+*/
+bool reopen_logs(void)
{
- char *fname = NULL;
mode_t oldumask;
XFILE *new_dbf = NULL;
XFILE *old_dbf = NULL;
bool ret = True;
- if (stdout_logging)
- return True;
+ char *fname = NULL;
+ if (state.reopening_logs) {
+ return true;
+ }
+
+ switch (state.logtype) {
+ case DEBUG_STDOUT:
+ state.dbf = x_stdout;
+ x_setbuf( x_stdout, NULL );
+ return true;
+
+ case DEBUG_DEFAULT_STDERR:
+ case DEBUG_STDERR:
+ debug_close_xfile(state.dbf);
+ state.dbf = x_stderr;
+ x_setbuf( x_stderr, NULL );
+ return true;
+
+ case DEBUG_FILE:
+ break;
+ }
oldumask = umask( 022 );
@@ -670,15 +685,15 @@ bool reopen_logs( void )
log_overflow = True;
DEBUG(0, ("Unable to open new log file %s: %s\n", debugf, strerror(errno)));
log_overflow = False;
- if (dbf)
- x_fflush(dbf);
+ if (state.dbf)
+ x_fflush(state.dbf);
ret = False;
} else {
x_setbuf(new_dbf, NULL);
- old_dbf = dbf;
- dbf = new_dbf;
+ old_dbf = state.dbf;
+ state.dbf = new_dbf;
if (old_dbf)
- (void) x_fclose(old_dbf);
+ debug_close_xfile(old_dbf);
}
/* Fix from klausr@ITAP.Physik.Uni-Stuttgart.De
@@ -689,7 +704,7 @@ bool reopen_logs( void )
(void)umask(oldumask);
/* Take over stderr to catch output into logs */
- if (dbf && dup2(x_fileno(dbf), 2) == -1) {
+ if (state.dbf && dup2(x_fileno(state.dbf), 2) == -1) {
close_low_fds(True); /* Close stderr too, if dup2 can't point it
at the logfile */
}
@@ -718,7 +733,7 @@ bool need_to_check_log_size( void )
return( False );
maxlog = lp_max_log_size() * 1024;
- if( !dbf || maxlog <= 0 ) {
+ if( !state.dbf || maxlog <= 0 ) {
debug_count = 0;
return(False);
}
@@ -747,10 +762,10 @@ void check_log_size( void )
maxlog = lp_max_log_size() * 1024;
- if(sys_fstat(x_fileno(dbf), &st, false) == 0
+ if(sys_fstat(x_fileno(state.dbf), &st, false) == 0
&& st.st_ex_size > maxlog ) {
(void)reopen_logs();
- if( dbf && get_file_size( debugf ) > maxlog ) {
+ if( state.dbf && get_file_size( debugf ) > maxlog ) {
char *name = NULL;
if (asprintf(&name, "%s.old", debugf ) < 0) {
@@ -770,7 +785,7 @@ void check_log_size( void )
* Here's where we need to panic if dbf == NULL..
*/
- if(dbf == NULL) {
+ if(state.dbf == NULL) {
/* This code should only be reached in very strange
* circumstances. If we merely fail to open the new log we
* should stick with the old one. ergo this should only be
@@ -778,8 +793,8 @@ void check_log_size( void )
* startup or when the log level is increased from zero.
* -dwg 6 June 2000
*/
- dbf = x_fopen( "/dev/console", O_WRONLY, 0);
- if(dbf) {
+ state.dbf = x_fopen( "/dev/console", O_WRONLY, 0);
+ if(state.dbf) {
DEBUG(0,("check_log_size: open of debug file %s failed - using console.\n",
debugf ));
} else {
@@ -804,10 +819,10 @@ void check_log_size( void )
debug_count++;
- if( stdout_logging ) {
+ if ( state.logtype != DEBUG_FILE ) {
va_start( ap, format_str );
- if(dbf)
- (void)x_vfprintf( dbf, format_str, ap );
+ if(state.dbf)
+ (void)x_vfprintf( state.dbf, format_str, ap );
va_end( ap );
errno = old_errno;
goto done;
@@ -822,13 +837,13 @@ void check_log_size( void )
if( !lp_syslog_only() )
#endif
{
- if( !dbf ) {
+ if( !state.dbf ) {
mode_t oldumask = umask( 022 );
- dbf = x_fopen( debugf, O_WRONLY|O_APPEND|O_CREAT, 0644 );
+ state.dbf = x_fopen( debugf, O_WRONLY|O_APPEND|O_CREAT, 0644 );
(void)umask( oldumask );
- if( dbf ) {
- x_setbuf( dbf, NULL );
+ if( state.dbf ) {
+ x_setbuf( state.dbf, NULL );
} else {
errno = old_errno;
goto done;
@@ -880,11 +895,11 @@ void check_log_size( void )
#endif
{
va_start( ap, format_str );
- if(dbf)
- (void)x_vfprintf( dbf, format_str, ap );
+ if(state.dbf)
+ (void)x_vfprintf( state.dbf, format_str, ap );
va_end( ap );
- if(dbf)
- (void)x_fflush( dbf );
+ if(state.dbf)
+ (void)x_fflush( state.dbf );
}
done:
@@ -926,7 +941,7 @@ static void bufr_print( void )
static void format_debug_text( const char *msg )
{
size_t i;
- bool timestamp = (!stdout_logging && (lp_timestamp_logs() || !(lp_loaded())));
+ bool timestamp = (state.logtype == DEBUG_FILE && (lp_timestamp_logs() || !(lp_loaded())));
if (!format_bufr) {
debug_init();
@@ -970,8 +985,8 @@ static void format_debug_text( const char *msg )
void dbgflush( void )
{
bufr_print();
- if(dbf)
- (void)x_fflush( dbf );
+ if(state.dbf)
+ (void)x_fflush( state.dbf );
}
/***************************************************************************
@@ -1021,8 +1036,9 @@ bool dbghdrclass(int level, int cls, const char *location, const char *func)
#endif
/* Don't print a header if we're logging to stdout. */
- if( stdout_logging )
+ if ( state.logtype != DEBUG_FILE ) {
return( True );
+ }
/* Print the header if timestamps are turned on. If parameters are
* not yet loaded, then default to timestamps on.
diff --git a/source3/lib/netapi/netapi.c b/source3/lib/netapi/netapi.c
index c4c2556b0b..3004246743 100644
--- a/source3/lib/netapi/netapi.c
+++ b/source3/lib/netapi/netapi.c
@@ -80,11 +80,8 @@ NET_API_STATUS libnetapi_init(struct libnetapi_ctx **context)
}
/* prevent setup_logging() from closing x_stderr... */
- dbf = 0;
- setup_logging("libnetapi", true);
+ setup_logging("libnetapi", DEBUG_STDERR);
- dbf = x_stderr;
- x_setbuf(x_stderr, NULL);
AllowDebugChange = false;
load_case_tables();
diff --git a/source3/lib/smbconf/testsuite.c b/source3/lib/smbconf/testsuite.c
index 2c6fedc4ca..80754dd20c 100644
--- a/source3/lib/smbconf/testsuite.c
+++ b/source3/lib/smbconf/testsuite.c
@@ -294,7 +294,7 @@ int main(int argc, const char **argv)
};
load_case_tables();
- dbf = x_stderr;
+ setup_logging(argv[0], DEBUG_STDERR);
/* parse options */
pc = poptGetContext("smbconftort", argc, (const char **)argv,