More %d (uid_t) stuff...
[sfrench/samba-autobuild/.git] / source / lib / debug.c
1 /*
2    Unix SMB/Netbios implementation.
3    Version 1.9.
4    Samba utility functions
5    Copyright (C) Andrew Tridgell 1992-1998
6
7    This program is free software; you can redistribute it and/or modify
8    it under the terms of the GNU General Public License as published by
9    the Free Software Foundation; either version 2 of the License, or
10    (at your option) any later version.
11
12    This program is distributed in the hope that it will be useful,
13    but WITHOUT ANY WARRANTY; without even the implied warranty of
14    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15    GNU General Public License for more details.
16
17    You should have received a copy of the GNU General Public License
18    along with this program; if not, write to the Free Software
19    Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
20 */
21
22 #include "includes.h"
23
24 /* -------------------------------------------------------------------------- **
25  * Defines...
26  *
27  *  FORMAT_BUFR_MAX - Index of the last byte of the format buffer;
28  *                    format_bufr[FORMAT_BUFR_MAX] should always be reserved
29  *                    for a terminating nul byte.
30  */
31
32 #define FORMAT_BUFR_MAX ( sizeof( format_bufr ) - 1 )
33
34 /* -------------------------------------------------------------------------- **
35  * This module implements Samba's debugging utility.
36  *
37  * The syntax of a debugging log file is represented as:
38  *
39  *  <debugfile> :== { <debugmsg> }
40  *
41  *  <debugmsg>  :== <debughdr> '\n' <debugtext>
42  *
43  *  <debughdr>  :== '[' TIME ',' LEVEL ']' [ [FILENAME ':'] [FUNCTION '()'] ]
44  *
45  *  <debugtext> :== { <debugline> }
46  *
47  *  <debugline> :== TEXT '\n'
48  *
49  * TEXT     is a string of characters excluding the newline character.
50  * LEVEL    is the DEBUG level of the message (an integer in the range 0..10).
51  * TIME     is a timestamp.
52  * FILENAME is the name of the file from which the debug message was generated.
53  * FUNCTION is the function from which the debug message was generated.
54  *
55  * Basically, what that all means is:
56  *
57  * - A debugging log file is made up of debug messages.
58  *
59  * - Each debug message is made up of a header and text.  The header is
60  *   separated from the text by a newline.
61  *
62  * - The header begins with the timestamp and debug level of the message
63  *   enclosed in brackets.  The filename and function from which the
64  *   message was generated may follow.  The filename is terminated by a
65  *   colon, and the function name is terminated by parenthesis.
66  *
67  * - The message text is made up of zero or more lines, each terminated by
68  *   a newline.
69  */
70
71 /* -------------------------------------------------------------------------- **
72  * External variables.
73  *
74  *  dbf           - Global debug file handle.
75  *  debugf        - Debug file name.
76  *  append_log    - If True, then the output file will be opened in append
77  *                  mode.
78  *  DEBUGLEVEL    - System-wide debug message limit.  Messages with message-
79  *                  levels higher than DEBUGLEVEL will not be processed.
80  */
81
82 FILE   *dbf        = NULL;
83 pstring debugf     = "";
84 BOOL    append_log = False;
85
86 int     DEBUGLEVEL_CLASS[DBGC_LAST];
87 int     DEBUGLEVEL = DEBUGLEVEL_CLASS;
88
89
90 /* -------------------------------------------------------------------------- **
91  * Internal variables.
92  *
93  *  stdout_logging  - Default False, if set to True then dbf will be set to
94  *                    stdout and debug output will go to dbf only, and not
95  *                    to syslog.  Set in setup_logging() and read in Debug1().
96  *
97  *  debug_count     - Number of debug messages that have been output.
98  *                    Used to check log size.
99  *
100  *  syslog_level    - Internal copy of the message debug level.  Written by
101  *                    dbghdr() and read by Debug1().
102  *
103  *  format_bufr     - Used to format debug messages.  The dbgtext() function
104  *                    prints debug messages to a string, and then passes the
105  *                    string to format_debug_text(), which uses format_bufr
106  *                    to build the formatted output.
107  *
108  *  format_pos      - Marks the first free byte of the format_bufr.
109  * 
110  *
111  *  log_overflow    - When this variable is True, never attempt to check the
112  *                    size of the log. This is a hack, so that we can write
113  *                    a message using DEBUG, from open_logs() when we
114  *                    are unable to open a new log file for some reason.
115  */
116
117 static BOOL    stdout_logging = False;
118 static int     debug_count    = 0;
119 #ifdef WITH_SYSLOG
120 static int     syslog_level   = 0;
121 #endif
122 static pstring format_bufr    = { '\0' };
123 static size_t     format_pos     = 0;
124 static BOOL    log_overflow   = False;
125
126 /*
127 * Define all the debug class selection names here. Names *MUST NOT* contain 
128 * white space. There must be one name for each DBGC_<class name>, and they 
129 * must be in the table in the order of DBGC_<class name>.. 
130 */
131 char *classname_table[] = {
132         "all",               /* DBGC_ALL; index references traditional DEBUGLEVEL */
133         "tdb",               /* DBGC_TDB        */
134         "printdrivers",      /* DBGC_PRINTDRIVERS */
135         "lanman",            /* DBGC_LANMAN */
136 };
137
138
139 /* -------------------------------------------------------------------------- **
140  * Functions...
141  */
142
143 /****************************************************************************
144 utility access to debug class names's
145 ****************************************************************************/
146 char* debug_classname_from_index(int ndx)
147 {
148         return classname_table[ndx];
149 }
150
151 /****************************************************************************
152 utility to translate names to debug class index's
153 ****************************************************************************/
154 int debug_lookup_classname(char* classname)
155 {
156         int i;
157
158         if (!classname) return -1;
159
160         for (i=0; i<DBGC_LAST; i++) {
161                 if (strcmp(classname, classname_table[i])==0)
162                         return i;
163         }
164         return -1;
165 }
166
167 /****************************************************************************
168 parse the debug levels from smbcontrol. Example debug level parameter:
169   printdrivers:7
170 ****************************************************************************/
171 BOOL debug_parse_params(char **params, int *debuglevel_class)
172 {
173         int   i, ndx;
174         char *class_name;
175         char *class_level;
176         
177         /* Set the new debug level array to the current DEBUGLEVEL array */
178         memcpy(debuglevel_class, DEBUGLEVEL_CLASS, sizeof(DEBUGLEVEL_CLASS));
179
180         /* Allow DBGC_ALL to be specifies w/o requiring its class name e.g."10"  
181          * v.s. "all:10", this is the traditional way to set DEBUGLEVEL 
182          */
183         if (isdigit((int)params[0][0])) {
184                 debuglevel_class[DBGC_ALL] = atoi(params[0]);
185                 i = 1; /* start processing at the next params */
186         }
187         else
188                 i = 0; /* DBGC_ALL not specified  OR calss name was included */
189
190         /* Fill in new debug class levels */
191         for (; i < DBGC_LAST && params[i]; i++) {
192                 if ((class_name=strtok(params[i],":")) &&
193                         (class_level=strtok(NULL, "\0")) &&
194             ((ndx = debug_lookup_classname(class_name)) != -1)) {
195                                 debuglevel_class[ndx] = atoi(class_level);
196                 } else {
197                         DEBUG(0,("debug_parse_params: unrecognized debug class name or format [%s]\n", params[i]));
198                         return False;
199                 }
200         }
201
202         return True;
203 }
204
205 /****************************************************************************
206 parse the debug levels from smb.conf. Example debug level string:
207   3 tdb:5 printdrivers:7
208 Note: the 1st param has no "name:" preceeding it.
209 ****************************************************************************/
210 BOOL debug_parse_levels(char *params_str)
211 {
212         int  i;
213         char *params[DBGC_LAST];
214         int  debuglevel_class[DBGC_LAST];       
215
216         ZERO_ARRAY(params);
217         ZERO_ARRAY(debuglevel_class);
218
219         if ((params[0]=strtok(params_str," ,"))) {
220                 for (i=1; i<DBGC_LAST;i++) {
221                         if ((params[i]=strtok(NULL," ,"))==NULL)
222                                 break;
223                 }
224         }
225         else
226                 return False;
227
228         if (debug_parse_params(params, debuglevel_class)) {
229                 debug_message(0, getpid(), (void*)debuglevel_class, sizeof(debuglevel_class));
230                 return True;
231         } else
232                 return False;
233 }
234
235 /****************************************************************************
236 receive a "set debug level" message
237 ****************************************************************************/
238 void debug_message(int msg_type, pid_t src, void *buf, size_t len)
239 {
240         int i;
241
242         /* Set the new DEBUGLEVEL_CLASS array from the pased array */
243         memcpy(DEBUGLEVEL_CLASS, buf, sizeof(DEBUGLEVEL_CLASS));
244         
245         DEBUG(1,("INFO: Debug class %s level = %d   (pid %u from pid %u)\n",
246                         classname_table[DBGC_ALL],
247                         DEBUGLEVEL_CLASS[DBGC_ALL], (unsigned int)getpid(), (unsigned int)src));
248
249         for (i=1; i<DBGC_LAST; i++) {
250                 if (DEBUGLEVEL_CLASS[i])
251                          DEBUGADD(1,("INFO: Debug class %s level = %d\n", 
252                                                 classname_table[i], DEBUGLEVEL_CLASS[i]));
253         }
254 }
255
256
257 /****************************************************************************
258 send a "set debug level" message
259 ****************************************************************************/
260 void debug_message_send(pid_t pid, int level)
261 {
262         message_send_pid(pid, MSG_DEBUG, &level, sizeof(int), False);
263 }
264
265
266 /* ************************************************************************** **
267  * get ready for syslog stuff
268  * ************************************************************************** **
269  */
270 void setup_logging(char *pname, BOOL interactive)
271 {
272         message_register(MSG_DEBUG, debug_message);
273
274         /* reset to allow multiple setup calls, going from interactive to
275            non-interactive */
276         stdout_logging = False;
277         dbf = NULL;
278
279         if (interactive) {
280                 stdout_logging = True;
281                 dbf = stdout;
282         }
283 #ifdef WITH_SYSLOG
284         else {
285                 char *p = strrchr( pname,'/' );
286                 if (p)
287                         pname = p + 1;
288 #ifdef LOG_DAEMON
289                 openlog( pname, LOG_PID, SYSLOG_FACILITY );
290 #else /* for old systems that have no facility codes. */
291                 openlog( pname, LOG_PID );
292 #endif
293         }
294 #endif
295 } /* setup_logging */
296
297 /* ************************************************************************** **
298  * reopen the log files
299  * note that we now do this unconditionally
300  * We attempt to open the new debug fp before closing the old. This means
301  * if we run out of fd's we just keep using the old fd rather than aborting.
302  * Fix from dgibson@linuxcare.com.
303  * ************************************************************************** **
304  */
305
306 BOOL reopen_logs( void )
307 {
308         pstring fname;
309         mode_t oldumask;
310         FILE *new_dbf = NULL;
311         BOOL ret = True;
312
313         if (DEBUGLEVEL_CLASS[ DBGC_ALL ] <= 0) {
314                 if (dbf) {
315                         (void)fclose(dbf);
316                         dbf = NULL;
317                 }
318                 return True;
319         }
320
321         oldumask = umask( 022 );
322   
323         pstrcpy(fname, debugf );
324         if (lp_loaded() && (*lp_logfile()))
325                 pstrcpy(fname, lp_logfile());
326
327         pstrcpy( debugf, fname );
328         if (append_log)
329                 new_dbf = sys_fopen( debugf, "a" );
330         else
331                 new_dbf = sys_fopen( debugf, "w" );
332
333         if (!new_dbf) {
334                 log_overflow = True;
335                 DEBUG(0, ("Unable to open new log file %s: %s\n", debugf, strerror(errno)));
336                 log_overflow = False;
337                 fflush(dbf);
338                 ret = False;
339         } else {
340                 setbuf(new_dbf, NULL);
341                 if (dbf)
342                         (void) fclose(dbf);
343                 dbf = new_dbf;
344         }
345
346         /* Fix from klausr@ITAP.Physik.Uni-Stuttgart.De
347          * to fix problem where smbd's that generate less
348          * than 100 messages keep growing the log.
349          */
350         force_check_log_size();
351         (void)umask(oldumask);
352
353         return ret;
354 }
355
356 /* ************************************************************************** **
357  * Force a check of the log size.
358  * ************************************************************************** **
359  */
360 void force_check_log_size( void )
361 {
362   debug_count = 100;
363 }
364
365 /***************************************************************************
366  Check to see if there is any need to check if the logfile has grown too big.
367 **************************************************************************/
368
369 BOOL need_to_check_log_size( void )
370 {
371         int maxlog;
372
373         if( debug_count++ < 100 )
374                 return( False );
375
376         maxlog = lp_max_log_size() * 1024;
377         if( !dbf || maxlog <= 0 ) {
378                 debug_count = 0;
379                 return(False);
380         }
381         return( True );
382 }
383
384 /* ************************************************************************** **
385  * Check to see if the log has grown to be too big.
386  * ************************************************************************** **
387  */
388
389 void check_log_size( void )
390 {
391         int         maxlog;
392         SMB_STRUCT_STAT st;
393
394         /*
395          *  We need to be root to check/change log-file, skip this and let the main
396          *  loop check do a new check as root.
397          */
398
399         if( geteuid() != 0 )
400                 return;
401
402         if(log_overflow || !need_to_check_log_size() )
403                 return;
404
405         maxlog = lp_max_log_size() * 1024;
406
407         if( sys_fstat( fileno( dbf ), &st ) == 0 && st.st_size > maxlog ) {
408                 (void)reopen_logs();
409                 if( dbf && get_file_size( debugf ) > maxlog ) {
410                         pstring name;
411
412                         slprintf( name, sizeof(name)-1, "%s.old", debugf );
413                         (void)rename( debugf, name );
414       
415                         if (!reopen_logs()) {
416                                 /* We failed to reopen a log - continue using the old name. */
417                                 (void)rename(name, debugf);
418                         }
419                 }
420         }
421
422         /*
423          * Here's where we need to panic if dbf == NULL..
424          */
425
426         if(dbf == NULL) {
427                 /* This code should only be reached in very strange
428                         circumstances. If we merely fail to open the new log we
429                         should stick with the old one. ergo this should only be
430                         reached when opening the logs for the first time: at
431                         startup or when the log level is increased from zero.
432                         -dwg 6 June 2000
433                 */
434                 dbf = sys_fopen( "/dev/console", "w" );
435                 if(dbf) {
436                         DEBUG(0,("check_log_size: open of debug file %s failed - using console.\n",
437                                         debugf ));
438                 } else {
439                         /*
440                          * We cannot continue without a debug file handle.
441                          */
442                         abort();
443                 }
444         }
445         debug_count = 0;
446 } /* check_log_size */
447
448 /* ************************************************************************** **
449  * Write an debug message on the debugfile.
450  * This is called by dbghdr() and format_debug_text().
451  * ************************************************************************** **
452  */
453 #ifdef HAVE_STDARG_H
454  int Debug1( char *format_str, ... )
455 {
456 #else
457  int Debug1(va_alist)
458 va_dcl
459 {  
460   char *format_str;
461 #endif
462   va_list ap;  
463   int old_errno = errno;
464
465   if( stdout_logging )
466     {
467 #ifdef HAVE_STDARG_H
468     va_start( ap, format_str );
469 #else
470     va_start( ap );
471     format_str = va_arg( ap, char * );
472 #endif
473     if(dbf)
474       (void)vfprintf( dbf, format_str, ap );
475     va_end( ap );
476     errno = old_errno;
477     return( 0 );
478     }
479   
480 #ifdef WITH_SYSLOG
481   if( !lp_syslog_only() )
482 #endif
483     {
484     if( !dbf )
485       {
486       mode_t oldumask = umask( 022 );
487
488       if( append_log )
489         dbf = sys_fopen( debugf, "a" );
490       else
491         dbf = sys_fopen( debugf, "w" );
492       (void)umask( oldumask );
493       if( dbf )
494         {
495         setbuf( dbf, NULL );
496         }
497       else
498         {
499         errno = old_errno;
500         return(0);
501         }
502       }
503     }
504
505 #ifdef WITH_SYSLOG
506   if( syslog_level < lp_syslog() )
507     {
508     /* map debug levels to syslog() priorities
509      * note that not all DEBUG(0, ...) calls are
510      * necessarily errors
511      */
512     static int priority_map[] = { 
513       LOG_ERR,     /* 0 */
514       LOG_WARNING, /* 1 */
515       LOG_NOTICE,  /* 2 */
516       LOG_INFO,    /* 3 */
517       };
518     int     priority;
519     pstring msgbuf;
520
521     if( syslog_level >= ( sizeof(priority_map) / sizeof(priority_map[0]) )
522      || syslog_level < 0)
523       priority = LOG_DEBUG;
524     else
525       priority = priority_map[syslog_level];
526       
527 #ifdef HAVE_STDARG_H
528     va_start( ap, format_str );
529 #else
530     va_start( ap );
531     format_str = va_arg( ap, char * );
532 #endif
533     vslprintf( msgbuf, sizeof(msgbuf)-1, format_str, ap );
534     va_end( ap );
535       
536     msgbuf[255] = '\0';
537     syslog( priority, "%s", msgbuf );
538     }
539 #endif
540   
541   check_log_size();
542
543 #ifdef WITH_SYSLOG
544   if( !lp_syslog_only() )
545 #endif
546     {
547 #ifdef HAVE_STDARG_H
548     va_start( ap, format_str );
549 #else
550     va_start( ap );
551     format_str = va_arg( ap, char * );
552 #endif
553     if(dbf)
554       (void)vfprintf( dbf, format_str, ap );
555     va_end( ap );
556     if(dbf)
557       (void)fflush( dbf );
558     }
559
560   errno = old_errno;
561
562   return( 0 );
563   } /* Debug1 */
564
565
566 /* ************************************************************************** **
567  * Print the buffer content via Debug1(), then reset the buffer.
568  *
569  *  Input:  none
570  *  Output: none
571  *
572  * ************************************************************************** **
573  */
574 static void bufr_print( void )
575   {
576   format_bufr[format_pos] = '\0';
577   (void)Debug1( "%s", format_bufr );
578   format_pos = 0;
579   } /* bufr_print */
580
581 /* ************************************************************************** **
582  * Format the debug message text.
583  *
584  *  Input:  msg - Text to be added to the "current" debug message text.
585  *
586  *  Output: none.
587  *
588  *  Notes:  The purpose of this is two-fold.  First, each call to syslog()
589  *          (used by Debug1(), see above) generates a new line of syslog
590  *          output.  This is fixed by storing the partial lines until the
591  *          newline character is encountered.  Second, printing the debug
592  *          message lines when a newline is encountered allows us to add
593  *          spaces, thus indenting the body of the message and making it
594  *          more readable.
595  *
596  * ************************************************************************** **
597  */
598 static void format_debug_text( char *msg )
599   {
600   size_t i;
601   BOOL timestamp = (!stdout_logging && (lp_timestamp_logs() || 
602                                         !(lp_loaded())));
603
604   for( i = 0; msg[i]; i++ )
605     {
606     /* Indent two spaces at each new line. */
607     if(timestamp && 0 == format_pos)
608       {
609       format_bufr[0] = format_bufr[1] = ' ';
610       format_pos = 2;
611       }
612
613     /* If there's room, copy the character to the format buffer. */
614     if( format_pos < FORMAT_BUFR_MAX )
615       format_bufr[format_pos++] = msg[i];
616
617     /* If a newline is encountered, print & restart. */
618     if( '\n' == msg[i] )
619       bufr_print();
620
621     /* If the buffer is full dump it out, reset it, and put out a line
622      * continuation indicator.
623      */
624     if( format_pos >= FORMAT_BUFR_MAX )
625       {
626       bufr_print();
627       (void)Debug1( " +>\n" );
628       }
629     }
630
631   /* Just to be safe... */
632   format_bufr[format_pos] = '\0';
633   } /* format_debug_text */
634
635 /* ************************************************************************** **
636  * Flush debug output, including the format buffer content.
637  *
638  *  Input:  none
639  *  Output: none
640  *
641  * ************************************************************************** **
642  */
643 void dbgflush( void )
644   {
645   bufr_print();
646   if(dbf)
647     (void)fflush( dbf );
648   } /* dbgflush */
649
650 /* ************************************************************************** **
651  * Print a Debug Header.
652  *
653  *  Input:  level - Debug level of the message (not the system-wide debug
654  *                  level.
655  *          file  - Pointer to a string containing the name of the file
656  *                  from which this function was called, or an empty string
657  *                  if the __FILE__ macro is not implemented.
658  *          func  - Pointer to a string containing the name of the function
659  *                  from which this function was called, or an empty string
660  *                  if the __FUNCTION__ macro is not implemented.
661  *          line  - line number of the call to dbghdr, assuming __LINE__
662  *                  works.
663  *
664  *  Output: Always True.  This makes it easy to fudge a call to dbghdr()
665  *          in a macro, since the function can be called as part of a test.
666  *          Eg: ( (level <= DEBUGLEVEL) && (dbghdr(level,"",line)) )
667  *
668  *  Notes:  This function takes care of setting syslog_level.
669  *
670  * ************************************************************************** **
671  */
672
673 BOOL dbghdr( int level, char *file, char *func, int line )
674 {
675   /* Ensure we don't lose any real errno value. */
676   int old_errno = errno;
677
678   if( format_pos ) {
679     /* This is a fudge.  If there is stuff sitting in the format_bufr, then
680      * the *right* thing to do is to call
681      *   format_debug_text( "\n" );
682      * to write the remainder, and then proceed with the new header.
683      * Unfortunately, there are several places in the code at which
684      * the DEBUG() macro is used to build partial lines.  That in mind,
685      * we'll work under the assumption that an incomplete line indicates
686      * that a new header is *not* desired.
687      */
688     return( True );
689   }
690
691 #ifdef WITH_SYSLOG
692   /* Set syslog_level. */
693   syslog_level = level;
694 #endif
695
696   /* Don't print a header if we're logging to stdout. */
697   if( stdout_logging )
698     return( True );
699
700   /* Print the header if timestamps are turned on.  If parameters are
701    * not yet loaded, then default to timestamps on.
702    */
703   if( lp_timestamp_logs() || !(lp_loaded()) ) {
704     char header_str[200];
705
706         header_str[0] = '\0';
707
708         if( lp_debug_pid())
709           slprintf(header_str,sizeof(header_str)-1,", pid=%u",(unsigned int)sys_getpid());
710
711         if( lp_debug_uid()) {
712       size_t hs_len = strlen(header_str);
713           slprintf(header_str + hs_len,
714                sizeof(header_str) - 1 - hs_len,
715                            ", effective(%u, %u), real(%u, %u)",
716                (unsigned int)geteuid(), (unsigned int)getegid(),
717                            (unsigned int)getuid(), (unsigned int)getgid()); 
718         }
719   
720     /* Print it all out at once to prevent split syslog output. */
721     (void)Debug1( "[%s, %d%s] %s:%s(%d)\n",
722                   timestring(lp_debug_hires_timestamp()), level,
723                                   header_str, file, func, line );
724   }
725
726   errno = old_errno;
727   return( True );
728 }
729
730 /* ************************************************************************** **
731  * Add text to the body of the "current" debug message via the format buffer.
732  *
733  *  Input:  format_str  - Format string, as used in printf(), et. al.
734  *          ...         - Variable argument list.
735  *
736  *  ..or..  va_alist    - Old style variable parameter list starting point.
737  *
738  *  Output: Always True.  See dbghdr() for more info, though this is not
739  *          likely to be used in the same way.
740  *
741  * ************************************************************************** **
742  */
743 #ifdef HAVE_STDARG_H
744  BOOL dbgtext( char *format_str, ... )
745   {
746   va_list ap;
747   pstring msgbuf;
748
749   va_start( ap, format_str ); 
750   vslprintf( msgbuf, sizeof(msgbuf)-1, format_str, ap );
751   va_end( ap );
752
753   format_debug_text( msgbuf );
754
755   return( True );
756   } /* dbgtext */
757
758 #else
759  BOOL dbgtext( va_alist )
760  va_dcl
761   {
762   char *format_str;
763   va_list ap;
764   pstring msgbuf;
765
766   va_start( ap );
767   format_str = va_arg( ap, char * );
768   vslprintf( msgbuf, sizeof(msgbuf)-1, format_str, ap );
769   va_end( ap );
770
771   format_debug_text( msgbuf );
772
773   return( True );
774   } /* dbgtext */
775
776 #endif
777
778 /* ************************************************************************** */