debug Explain the behaviour of setup_logging() more clearly
[sfrench/samba-autobuild/.git] / source3 / lib / debug.c
1 /*
2    Unix SMB/CIFS implementation.
3    Samba utility functions
4    Copyright (C) Andrew Tridgell 1992-1998
5    Copyright (C) Elrond               2002
6    Copyright (C) Simo Sorce           2002
7
8    This program is free software; you can redistribute it and/or modify
9    it under the terms of the GNU General Public License as published by
10    the Free Software Foundation; either version 3 of the License, or
11    (at your option) any later version.
12
13    This program is distributed in the hope that it will be useful,
14    but WITHOUT ANY WARRANTY; without even the implied warranty of
15    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16    GNU General Public License for more details.
17
18    You should have received a copy of the GNU General Public License
19    along with this program.  If not, see <http://www.gnu.org/licenses/>.
20 */
21
22 #include "includes.h"
23 #include "librpc/gen_ndr/messaging.h"
24
25 /* -------------------------------------------------------------------------- **
26  * Defines...
27  *
28  *  FORMAT_BUFR_MAX - Index of the last byte of the format buffer;
29  *                    format_bufr[FORMAT_BUFR_MAX] should always be reserved
30  *                    for a terminating null byte.
31  */
32
33 #define FORMAT_BUFR_SIZE 1024
34 #define FORMAT_BUFR_MAX (FORMAT_BUFR_SIZE - 1)
35
36 /* -------------------------------------------------------------------------- **
37  * This module implements Samba's debugging utility.
38  *
39  * The syntax of a debugging log file is represented as:
40  *
41  *  <debugfile> :== { <debugmsg> }
42  *
43  *  <debugmsg>  :== <debughdr> '\n' <debugtext>
44  *
45  *  <debughdr>  :== '[' TIME ',' LEVEL ']' [ [FILENAME ':'] [FUNCTION '()'] ]
46  *
47  *  <debugtext> :== { <debugline> }
48  *
49  *  <debugline> :== TEXT '\n'
50  *
51  * TEXT     is a string of characters excluding the newline character.
52  * LEVEL    is the DEBUG level of the message (an integer in the range 0..10).
53  * TIME     is a timestamp.
54  * FILENAME is the name of the file from which the debug message was generated.
55  * FUNCTION is the function from which the debug message was generated.
56  *
57  * Basically, what that all means is:
58  *
59  * - A debugging log file is made up of debug messages.
60  *
61  * - Each debug message is made up of a header and text.  The header is
62  *   separated from the text by a newline.
63  *
64  * - The header begins with the timestamp and debug level of the message
65  *   enclosed in brackets.  The filename and function from which the
66  *   message was generated may follow.  The filename is terminated by a
67  *   colon, and the function name is terminated by parenthesis.
68  *
69  * - The message text is made up of zero or more lines, each terminated by
70  *   a newline.
71  */
72
73 /* state variables for the debug system */
74 static struct {
75         int fd;   /* The log file handle */
76         enum debug_logtype logtype; /* The type of logging we are doing: eg stdout, file, stderr */
77         const char *prog_name;
78         bool reopening_logs;
79 } state;
80
81 /* -------------------------------------------------------------------------- **
82  * External variables.
83  *
84  *  debugf        - Debug file name.
85  *  DEBUGLEVEL    - System-wide debug message limit.  Messages with message-
86  *                  levels higher than DEBUGLEVEL will not be processed.
87  */
88
89 static char *debugf = NULL;
90 bool    debug_warn_unknown_class = True;
91 bool    debug_auto_add_unknown_class = True;
92
93 /*
94    used to check if the user specified a
95    logfile on the command line
96 */
97 bool    override_logfile;
98
99 /*
100  * This is to allow assignment to DEBUGLEVEL before the debug
101  * system has been initialized.
102  */
103 static int debug_all_class_hack = 1;
104 static bool debug_all_class_isset_hack = True;
105
106 static int debug_num_classes = 0;
107 int     *DEBUGLEVEL_CLASS = &debug_all_class_hack;
108 bool    *DEBUGLEVEL_CLASS_ISSET = &debug_all_class_isset_hack;
109
110 /* DEBUGLEVEL is #defined to *debug_level */
111 int     DEBUGLEVEL = &debug_all_class_hack;
112
113
114 /* -------------------------------------------------------------------------- **
115  * Internal variables.
116  *
117  *  debug_count     - Number of debug messages that have been output.
118  *                    Used to check log size.
119  *
120  *  syslog_level    - Internal copy of the message debug level.  Written by
121  *                    dbghdr() and read by Debug1().
122  *
123  *  format_bufr     - Used to format debug messages.  The dbgtext() function
124  *                    prints debug messages to a string, and then passes the
125  *                    string to format_debug_text(), which uses format_bufr
126  *                    to build the formatted output.
127  *
128  *  format_pos      - Marks the first free byte of the format_bufr.
129  * 
130  *
131  *  log_overflow    - When this variable is True, never attempt to check the
132  *                    size of the log. This is a hack, so that we can write
133  *                    a message using DEBUG, from open_logs() when we
134  *                    are unable to open a new log file for some reason.
135  */
136
137 static int     debug_count    = 0;
138 #ifdef WITH_SYSLOG
139 static int     syslog_level   = 0;
140 #endif
141 static char *format_bufr = NULL;
142 static size_t     format_pos     = 0;
143 static bool    log_overflow   = False;
144
145 /*
146  * Define all the debug class selection names here. Names *MUST NOT* contain 
147  * white space. There must be one name for each DBGC_<class name>, and they 
148  * must be in the table in the order of DBGC_<class name>.. 
149  */
150 static const char *default_classname_table[] = {
151         "all",               /* DBGC_ALL; index refs traditional DEBUGLEVEL */
152         "tdb",               /* DBGC_TDB          */
153         "printdrivers",      /* DBGC_PRINTDRIVERS */
154         "lanman",            /* DBGC_LANMAN       */
155         "smb",               /* DBGC_SMB          */
156         "rpc_parse",         /* DBGC_RPC_PARSE    */
157         "rpc_srv",           /* DBGC_RPC_SRV      */
158         "rpc_cli",           /* DBGC_RPC_CLI      */
159         "passdb",            /* DBGC_PASSDB       */
160         "sam",               /* DBGC_SAM          */
161         "auth",              /* DBGC_AUTH         */
162         "winbind",           /* DBGC_WINBIND      */
163         "vfs",               /* DBGC_VFS          */
164         "idmap",             /* DBGC_IDMAP        */
165         "quota",             /* DBGC_QUOTA        */
166         "acls",              /* DBGC_ACLS         */
167         "locking",           /* DBGC_LOCKING      */
168         "msdfs",             /* DBGC_MSDFS        */
169         "dmapi",             /* DBGC_DMAPI        */
170         "registry",          /* DBGC_REGISTRY     */
171         NULL
172 };
173
174 static char **classname_table = NULL;
175
176
177 /* -------------------------------------------------------------------------- **
178  * Functions...
179  */
180
181 /***************************************************************************
182  Free memory pointed to by global pointers.
183 ****************************************************************************/
184
185 static bool initialized;
186
187 void gfree_debugsyms(void)
188 {
189         int i;
190
191         if ( classname_table ) {
192                 for ( i = 0; i < debug_num_classes; i++ ) {
193                         SAFE_FREE( classname_table[i] );
194                 }
195                 SAFE_FREE( classname_table );
196         }
197
198         if ( DEBUGLEVEL_CLASS != &debug_all_class_hack ) {
199                 SAFE_FREE( DEBUGLEVEL_CLASS );
200                 DEBUGLEVEL_CLASS = &debug_all_class_hack;
201         }
202
203         if ( DEBUGLEVEL_CLASS_ISSET != &debug_all_class_isset_hack ) {
204                 SAFE_FREE( DEBUGLEVEL_CLASS_ISSET );
205                 DEBUGLEVEL_CLASS_ISSET = &debug_all_class_isset_hack;
206         }
207
208         SAFE_FREE(format_bufr);
209
210         debug_num_classes = 0;
211
212         debug_level = DEBUGLEVEL_CLASS;
213
214         initialized = false;
215 }
216
217 /****************************************************************************
218 utility lists registered debug class names's
219 ****************************************************************************/
220
221 #define MAX_CLASS_NAME_SIZE 1024
222
223 static char *debug_list_class_names_and_levels(void)
224 {
225         int i, dim;
226         char **list;
227         char *buf = NULL;
228         char *b;
229         bool err = False;
230
231         if (DEBUGLEVEL_CLASS == &debug_all_class_hack) {
232                 return NULL;
233         }
234
235         list = SMB_CALLOC_ARRAY(char *, debug_num_classes + 1);
236         if (!list) {
237                 return NULL;
238         }
239
240         /* prepare strings */
241         for (i = 0, dim = 0; i < debug_num_classes; i++) {
242                 int l = asprintf(&list[i],
243                                 "%s:%d ",
244                                 classname_table[i],
245                                 DEBUGLEVEL_CLASS_ISSET[i]?DEBUGLEVEL_CLASS[i]:DEBUGLEVEL);
246                 if (l < 0 || l > MAX_CLASS_NAME_SIZE) {
247                         err = True;
248                         goto done;
249                 }
250                 dim += l;
251         }
252
253         /* create single string list - add space for newline */
254         b = buf = (char *)SMB_MALLOC(dim+1);
255         if (!buf) {
256                 err = True;
257                 goto done;
258         }
259         for (i = 0; i < debug_num_classes; i++) {
260                 int l = strlen(list[i]);
261                 strncpy(b, list[i], l);
262                 b = b + l;
263         }
264         b[-1] = '\n'; /* replace last space with newline */
265         b[0] = '\0';  /* null terminate string */
266
267 done:
268         /* free strings list */
269         for (i = 0; i < debug_num_classes; i++) {
270                 SAFE_FREE(list[i]);
271         }
272         SAFE_FREE(list);
273
274         if (err) {
275                 return NULL;
276         } else {
277                 return buf;
278         }
279 }
280
281 /****************************************************************************
282  Utility access to debug class names's.
283 ****************************************************************************/
284
285 const char *debug_classname_from_index(int ndx)
286 {
287         if (ndx < 0 || ndx >= debug_num_classes)
288                 return NULL;
289         else
290                 return classname_table[ndx];
291 }
292
293 /****************************************************************************
294  Utility to translate names to debug class index's (internal version).
295 ****************************************************************************/
296
297 static int debug_lookup_classname_int(const char* classname)
298 {
299         int i;
300
301         if (!classname) return -1;
302
303         for (i=0; i < debug_num_classes; i++) {
304                 if (strcmp(classname, classname_table[i])==0)
305                         return i;
306         }
307         return -1;
308 }
309
310 /****************************************************************************
311  Add a new debug class to the system.
312 ****************************************************************************/
313
314 int debug_add_class(const char *classname)
315 {
316         int ndx;
317         void *new_ptr;
318
319         if (!classname)
320                 return -1;
321
322         /* check the init has yet been called */
323         debug_init();
324
325         ndx = debug_lookup_classname_int(classname);
326         if (ndx >= 0)
327                 return ndx;
328         ndx = debug_num_classes;
329
330         new_ptr = DEBUGLEVEL_CLASS;
331         if (DEBUGLEVEL_CLASS == &debug_all_class_hack) {
332                 /* Initial loading... */
333                 new_ptr = NULL;
334         }
335         new_ptr = SMB_REALLOC_ARRAY(new_ptr, int, debug_num_classes + 1);
336         if (!new_ptr)
337                 return -1;
338         DEBUGLEVEL_CLASS = (int *)new_ptr;
339         DEBUGLEVEL_CLASS[ndx] = 0;
340
341         /* debug_level is the pointer used for the DEBUGLEVEL-thingy */
342         if (ndx==0) {
343                 /* Transfer the initial level from debug_all_class_hack */
344                 DEBUGLEVEL_CLASS[ndx] = DEBUGLEVEL;
345         }
346         debug_level = DEBUGLEVEL_CLASS;
347
348         new_ptr = DEBUGLEVEL_CLASS_ISSET;
349         if (new_ptr == &debug_all_class_isset_hack) {
350                 new_ptr = NULL;
351         }
352         new_ptr = SMB_REALLOC_ARRAY(new_ptr, bool, debug_num_classes + 1);
353         if (!new_ptr)
354                 return -1;
355         DEBUGLEVEL_CLASS_ISSET = (bool *)new_ptr;
356         DEBUGLEVEL_CLASS_ISSET[ndx] = False;
357
358         new_ptr = SMB_REALLOC_ARRAY(classname_table, char *, debug_num_classes + 1);
359         if (!new_ptr)
360                 return -1;
361         classname_table = (char **)new_ptr;
362
363         classname_table[ndx] = SMB_STRDUP(classname);
364         if (! classname_table[ndx])
365                 return -1;
366         
367         debug_num_classes++;
368
369         return ndx;
370 }
371
372 /****************************************************************************
373  Utility to translate names to debug class index's (public version).
374 ****************************************************************************/
375
376 int debug_lookup_classname(const char *classname)
377 {
378         int ndx;
379        
380         if (!classname || !*classname)
381                 return -1;
382
383         ndx = debug_lookup_classname_int(classname);
384
385         if (ndx != -1)
386                 return ndx;
387
388         if (debug_warn_unknown_class) {
389                 DEBUG(0, ("debug_lookup_classname(%s): Unknown class\n",
390                           classname));
391         }
392         if (debug_auto_add_unknown_class) {
393                 return debug_add_class(classname);
394         }
395         return -1;
396 }
397
398 /****************************************************************************
399  Dump the current registered debug levels.
400 ****************************************************************************/
401
402 static void debug_dump_status(int level)
403 {
404         int q;
405
406         DEBUG(level, ("INFO: Current debug levels:\n"));
407         for (q = 0; q < debug_num_classes; q++) {
408                 DEBUGADD(level, ("  %s: %s/%d\n",
409                                  classname_table[q],
410                                  (DEBUGLEVEL_CLASS_ISSET[q]
411                                   ? "True" : "False"),
412                                  DEBUGLEVEL_CLASS[q]));
413         }
414 }
415
416 /****************************************************************************
417  parse the debug levels from smbcontrol. Example debug level parameter:
418  printdrivers:7
419 ****************************************************************************/
420
421 static bool debug_parse_params(char **params)
422 {
423         int   i, ndx;
424         char *class_name;
425         char *class_level;
426
427         if (!params)
428                 return False;
429
430         /* Allow DBGC_ALL to be specified w/o requiring its class name e.g."10"  
431          * v.s. "all:10", this is the traditional way to set DEBUGLEVEL 
432          */
433         if (isdigit((int)params[0][0])) {
434                 DEBUGLEVEL_CLASS[DBGC_ALL] = atoi(params[0]);
435                 DEBUGLEVEL_CLASS_ISSET[DBGC_ALL] = True;
436                 i = 1; /* start processing at the next params */
437         } else {
438                 i = 0; /* DBGC_ALL not specified OR class name was included */
439         }
440
441         /* Fill in new debug class levels */
442         for (; i < debug_num_classes && params[i]; i++) {
443                 char *saveptr;
444                 if ((class_name = strtok_r(params[i],":", &saveptr)) &&
445                         (class_level = strtok_r(NULL, "\0", &saveptr)) &&
446             ((ndx = debug_lookup_classname(class_name)) != -1)) {
447                                 DEBUGLEVEL_CLASS[ndx] = atoi(class_level);
448                                 DEBUGLEVEL_CLASS_ISSET[ndx] = True;
449                 } else {
450                         DEBUG(0,("debug_parse_params: unrecognized debug class name or format [%s]\n", params[i]));
451                         return False;
452                 }
453         }
454
455         return True;
456 }
457
458 /****************************************************************************
459  Parse the debug levels from smb.conf. Example debug level string:
460   3 tdb:5 printdrivers:7
461  Note: the 1st param has no "name:" preceeding it.
462 ****************************************************************************/
463
464 bool debug_parse_levels(const char *params_str)
465 {
466         char **params;
467
468         /* Just in case */
469         debug_init();
470
471         params = str_list_make_v3(talloc_tos(), params_str, NULL);
472
473         if (debug_parse_params(params)) {
474                 debug_dump_status(5);
475                 TALLOC_FREE(params);
476                 return True;
477         } else {
478                 TALLOC_FREE(params);
479                 return False;
480         }
481 }
482
483 /****************************************************************************
484  Receive a "set debug level" message.
485 ****************************************************************************/
486
487 void debug_message(struct messaging_context *msg_ctx,
488                           void *private_data, 
489                           uint32_t msg_type, 
490                           struct server_id src,
491                           DATA_BLOB *data)
492 {
493         const char *params_str = (const char *)data->data;
494
495         /* Check, it's a proper string! */
496         if (params_str[(data->length)-1] != '\0') {
497                 DEBUG(1, ("Invalid debug message from pid %u to pid %u\n",
498                           (unsigned int)procid_to_pid(&src),
499                           (unsigned int)getpid()));
500                 return;
501         }
502
503         DEBUG(3, ("INFO: Remote set of debug to `%s'  (pid %u from pid %u)\n",
504                   params_str, (unsigned int)getpid(),
505                   (unsigned int)procid_to_pid(&src)));
506
507         debug_parse_levels(params_str);
508 }
509
510 /****************************************************************************
511  Return current debug level.
512 ****************************************************************************/
513
514 static void debuglevel_message(struct messaging_context *msg_ctx,
515                                void *private_data, 
516                                uint32_t msg_type, 
517                                struct server_id src,
518                                DATA_BLOB *data)
519 {
520         char *message = debug_list_class_names_and_levels();
521
522         if (!message) {
523                 DEBUG(0,("debuglevel_message - debug_list_class_names_and_levels returned NULL\n"));
524                 return;
525         }
526
527         DEBUG(1,("INFO: Received REQ_DEBUGLEVEL message from PID %s\n",
528                  procid_str_static(&src)));
529         messaging_send_buf(msg_ctx, src, MSG_DEBUGLEVEL,
530                            (uint8 *)message, strlen(message) + 1);
531
532         SAFE_FREE(message);
533 }
534
535 /****************************************************************************
536 Init debugging (one time stuff)
537 ****************************************************************************/
538
539 void debug_init(void)
540 {
541         const char **p;
542
543         if (initialized)
544                 return;
545
546         initialized = true;
547
548         for(p = default_classname_table; *p; p++) {
549                 debug_add_class(*p);
550         }
551         format_bufr = (char *)SMB_MALLOC(FORMAT_BUFR_SIZE);
552         if (!format_bufr) {
553                 smb_panic("debug_init: unable to create buffer");
554         }
555 }
556
557 void debug_register_msgs(struct messaging_context *msg_ctx)
558 {
559         messaging_register(msg_ctx, NULL, MSG_DEBUG, debug_message);
560         messaging_register(msg_ctx, NULL, MSG_REQ_DEBUGLEVEL,
561                            debuglevel_message);
562 }
563
564 /**
565   control the name of the logfile and whether logging will be to stdout, stderr
566   or a file, and set up syslog
567
568   new_log indicates the destination for the debug log (an enum in
569   order of precedence - once set to DEBUG_FILE, it is not possible to
570   reset to DEBUG_STDOUT for example.  This makes it easy to override
571   for debug to stderr on the command line, as the smb.conf cannot
572   reset it back to file-based logging
573 */
574 void setup_logging(const char *prog_name, enum debug_logtype new_logtype)
575 {
576         debug_init();
577         if (state.logtype < new_logtype) {
578                 state.logtype = new_logtype;
579         }
580         if (prog_name) {
581                 state.prog_name = prog_name;
582         }
583         reopen_logs();
584
585         if (state.logtype == DEBUG_FILE) {
586 #ifdef WITH_SYSLOG
587                 const char *p = strrchr_m( prog_name,'/' );
588                 if (p)
589                         prog_name = p + 1;
590 #ifdef LOG_DAEMON
591                 openlog( prog_name, LOG_PID, SYSLOG_FACILITY );
592 #else
593                 /* for old systems that have no facility codes. */
594                 openlog( prog_name, LOG_PID );
595 #endif
596 #endif
597         }
598 }
599
600 /***************************************************************************
601  Set the logfile name.
602 **************************************************************************/
603
604 void debug_set_logfile(const char *name)
605 {
606         SAFE_FREE(debugf);
607         debugf = SMB_STRDUP(name);
608 }
609
610 static void debug_close_fd(int fd)
611 {
612         if (fd > 2) {
613                 close(fd);
614         }
615 }
616
617 /**************************************************************************
618  reopen the log files
619  note that we now do this unconditionally
620  We attempt to open the new debug fp before closing the old. This means
621  if we run out of fd's we just keep using the old fd rather than aborting.
622  Fix from dgibson@linuxcare.com.
623 **************************************************************************/
624
625 /**
626   reopen the log file (usually called because the log file name might have changed)
627 */
628 bool reopen_logs(void)
629 {
630         mode_t oldumask;
631         int new_fd = 0;
632         int old_fd = 0;
633         bool ret = True;
634
635         char *fname = NULL;
636         if (state.reopening_logs) {
637                 return true;
638         }
639
640         switch (state.logtype) {
641         case DEBUG_STDOUT:
642                 debug_close_fd(state.fd);
643                 state.fd = 1;
644                 return true;
645
646         case DEBUG_DEFAULT_STDERR:
647         case DEBUG_STDERR:
648                 debug_close_fd(state.fd);
649                 state.fd = 2;
650                 return true;
651
652         case DEBUG_FILE:
653                 break;
654         }
655
656         oldumask = umask( 022 );
657
658         fname = debugf;
659         if (!fname) {
660                 return false;
661         }
662         debugf = NULL;
663
664         if (lp_loaded()) {
665                 char *logfname;
666
667                 logfname = lp_logfile();
668                 if (*logfname) {
669                         SAFE_FREE(fname);
670                         fname = SMB_STRDUP(logfname);
671                         if (!fname) {
672                                 return false;
673                         }
674                 }
675         }
676
677         debugf = fname;
678         new_fd = open( debugf, O_WRONLY|O_APPEND|O_CREAT, 0644);
679
680         if (new_fd == -1) {
681                 log_overflow = True;
682                 DEBUG(0, ("Unable to open new log file %s: %s\n", debugf, strerror(errno)));
683                 log_overflow = False;
684                 ret = False;
685         } else {
686                 old_fd = state.fd;
687                 state.fd = new_fd;
688                 debug_close_fd(old_fd);
689         }
690
691         /* Fix from klausr@ITAP.Physik.Uni-Stuttgart.De
692          * to fix problem where smbd's that generate less
693          * than 100 messages keep growing the log.
694          */
695         force_check_log_size();
696         (void)umask(oldumask);
697
698         /* Take over stderr to catch output into logs */
699         if (state.fd > 0 && dup2(state.fd, 2) == -1) {
700                 close_low_fds(True); /* Close stderr too, if dup2 can't point it
701                                         at the logfile */
702         }
703
704         return ret;
705 }
706
707 /**************************************************************************
708  Force a check of the log size.
709  ***************************************************************************/
710
711 void force_check_log_size( void )
712 {
713         debug_count = 100;
714 }
715
716 /***************************************************************************
717  Check to see if there is any need to check if the logfile has grown too big.
718 **************************************************************************/
719
720 bool need_to_check_log_size( void )
721 {
722         int maxlog;
723
724         if( debug_count < 100 )
725                 return( False );
726
727         maxlog = lp_max_log_size() * 1024;
728         if ( state.fd > 0 || maxlog <= 0 ) {
729                 debug_count = 0;
730                 return(False);
731         }
732         return( True );
733 }
734
735 /**************************************************************************
736  Check to see if the log has grown to be too big.
737  **************************************************************************/
738
739 void check_log_size( void )
740 {
741         int         maxlog;
742         SMB_STRUCT_STAT st;
743
744         /*
745          *  We need to be root to check/change log-file, skip this and let the main
746          *  loop check do a new check as root.
747          */
748
749         if( geteuid() != sec_initial_uid() )
750                 return;
751
752         if(log_overflow || !need_to_check_log_size() )
753                 return;
754
755         maxlog = lp_max_log_size() * 1024;
756
757         if(sys_fstat(state.fd, &st, false) == 0
758            && st.st_ex_size > maxlog ) {
759                 (void)reopen_logs();
760                 if( state.fd > 0 && get_file_size( debugf ) > maxlog ) {
761                         char *name = NULL;
762
763                         if (asprintf(&name, "%s.old", debugf ) < 0) {
764                                 return;
765                         }
766                         (void)rename(debugf, name);
767
768                         if (!reopen_logs()) {
769                                 /* We failed to reopen a log - continue using the old name. */
770                                 (void)rename(name, debugf);
771                         }
772                         SAFE_FREE(name);
773                 }
774         }
775
776         /*
777          * Here's where we need to panic if state.fd == 0 or -1 (invalid values)
778          */
779
780         if (state.fd <= 0) {
781                 /* This code should only be reached in very strange
782                  * circumstances. If we merely fail to open the new log we
783                  * should stick with the old one. ergo this should only be
784                  * reached when opening the logs for the first time: at
785                  * startup or when the log level is increased from zero.
786                  * -dwg 6 June 2000
787                  */
788                 int fd = open( "/dev/console", O_WRONLY, 0);
789                 if (fd != -1) {
790                         state.fd = fd;
791                         DEBUG(0,("check_log_size: open of debug file %s failed - using console.\n",
792                                         debugf ));
793                 } else {
794                         /*
795                          * We cannot continue without a debug file handle.
796                          */
797                         abort();
798                 }
799         }
800         debug_count = 0;
801 }
802
803 /*************************************************************************
804  Write an debug message on the debugfile.
805  This is called by dbghdr() and format_debug_text().
806 ************************************************************************/
807
808  int Debug1( const char *format_str, ... )
809 {
810         va_list ap;
811         int old_errno = errno;
812
813         debug_count++;
814
815         if ( state.logtype != DEBUG_FILE ) {
816                 va_start( ap, format_str );
817                 if (state.fd > 0)
818                         (void)vdprintf( state.fd, format_str, ap );
819                 va_end( ap );
820                 errno = old_errno;
821                 goto done;
822         }
823
824         /* prevent recursion by checking if reopen_logs() has temporaily
825            set the debugf string to NULL */
826         if( debugf == NULL)
827                 goto done;
828
829 #ifdef WITH_SYSLOG
830         if( !lp_syslog_only() )
831 #endif
832         {
833                 if( state.fd <= 0 ) {
834                         mode_t oldumask = umask( 022 );
835                         int fd = open( debugf, O_WRONLY|O_APPEND|O_CREAT, 0644 );
836                         (void)umask( oldumask );
837                         if(fd == -1) {
838                                 errno = old_errno;
839                                 goto done;
840                         }
841                         state.fd = fd;
842                 }
843         }
844
845 #ifdef WITH_SYSLOG
846         if( syslog_level < lp_syslog() ) {
847                 /* map debug levels to syslog() priorities
848                  * note that not all DEBUG(0, ...) calls are
849                  * necessarily errors */
850                 static const int priority_map[4] = {
851                         LOG_ERR,     /* 0 */
852                         LOG_WARNING, /* 1 */
853                         LOG_NOTICE,  /* 2 */
854                         LOG_INFO,    /* 3 */
855                 };
856                 int     priority;
857                 char *msgbuf = NULL;
858                 int ret;
859
860                 if( syslog_level >= ARRAY_SIZE(priority_map) || syslog_level < 0)
861                         priority = LOG_DEBUG;
862                 else
863                         priority = priority_map[syslog_level];
864
865                 /*
866                  * Specify the facility to interoperate with other syslog
867                  * callers (vfs_full_audit for example).
868                  */
869                 priority |= SYSLOG_FACILITY;
870
871                 va_start(ap, format_str);
872                 ret = vasprintf(&msgbuf, format_str, ap);
873                 va_end(ap);
874
875                 if (ret != -1) {
876                         syslog(priority, "%s", msgbuf);
877                 }
878                 SAFE_FREE(msgbuf);
879         }
880 #endif
881
882         check_log_size();
883
884 #ifdef WITH_SYSLOG
885         if( !lp_syslog_only() )
886 #endif
887         {
888                 va_start( ap, format_str );
889                 if (state.fd > 0)
890                         (void)vdprintf( state.fd, format_str, ap );
891                 va_end( ap );
892         }
893
894  done:
895         errno = old_errno;
896
897         return( 0 );
898 }
899
900
901 /**************************************************************************
902  Print the buffer content via Debug1(), then reset the buffer.
903  Input:  none
904  Output: none
905 ****************************************************************************/
906
907 static void bufr_print( void )
908 {
909         format_bufr[format_pos] = '\0';
910         (void)Debug1( "%s", format_bufr );
911         format_pos = 0;
912 }
913
914 /***************************************************************************
915  Format the debug message text.
916
917  Input:  msg - Text to be added to the "current" debug message text.
918
919  Output: none.
920
921  Notes:  The purpose of this is two-fold.  First, each call to syslog()
922          (used by Debug1(), see above) generates a new line of syslog
923          output.  This is fixed by storing the partial lines until the
924          newline character is encountered.  Second, printing the debug
925          message lines when a newline is encountered allows us to add
926          spaces, thus indenting the body of the message and making it
927          more readable.
928 **************************************************************************/
929
930 static void format_debug_text( const char *msg )
931 {
932         size_t i;
933         bool timestamp = (state.logtype == DEBUG_FILE && (lp_timestamp_logs() || !(lp_loaded())));
934
935         if (!format_bufr) {
936                 debug_init();
937         }
938
939         for( i = 0; msg[i]; i++ ) {
940                 /* Indent two spaces at each new line. */
941                 if(timestamp && 0 == format_pos) {
942                         format_bufr[0] = format_bufr[1] = ' ';
943                         format_pos = 2;
944                 }
945
946                 /* If there's room, copy the character to the format buffer. */
947                 if( format_pos < FORMAT_BUFR_MAX )
948                         format_bufr[format_pos++] = msg[i];
949
950                 /* If a newline is encountered, print & restart. */
951                 if( '\n' == msg[i] )
952                         bufr_print();
953
954                 /* If the buffer is full dump it out, reset it, and put out a line
955                  * continuation indicator.
956                  */
957                 if( format_pos >= FORMAT_BUFR_MAX ) {
958                         bufr_print();
959                         (void)Debug1( " +>\n" );
960                 }
961         }
962
963         /* Just to be safe... */
964         format_bufr[format_pos] = '\0';
965 }
966
967 /***************************************************************************
968  Flush debug output, including the format buffer content.
969
970  Input:  none
971  Output: none
972 ***************************************************************************/
973
974 void dbgflush( void )
975 {
976         bufr_print();
977 }
978
979 /***************************************************************************
980  Print a Debug Header.
981
982  Input:  level - Debug level of the message (not the system-wide debug
983                   level. )
984           cls   - Debuglevel class of the calling module.
985           file  - Pointer to a string containing the name of the file
986                   from which this function was called, or an empty string
987                   if the __FILE__ macro is not implemented.
988           func  - Pointer to a string containing the name of the function
989                   from which this function was called, or an empty string
990                   if the __FUNCTION__ macro is not implemented.
991          line  - line number of the call to dbghdr, assuming __LINE__
992                  works.
993
994   Output: Always True.  This makes it easy to fudge a call to dbghdr()
995           in a macro, since the function can be called as part of a test.
996           Eg: ( (level <= DEBUGLEVEL) && (dbghdr(level,"",line)) )
997
998   Notes:  This function takes care of setting syslog_level.
999
1000 ****************************************************************************/
1001
1002 bool dbghdrclass(int level, int cls, const char *location, const char *func)
1003 {
1004         /* Ensure we don't lose any real errno value. */
1005         int old_errno = errno;
1006
1007         if( format_pos ) {
1008                 /* This is a fudge.  If there is stuff sitting in the format_bufr, then
1009                  * the *right* thing to do is to call
1010                  *   format_debug_text( "\n" );
1011                  * to write the remainder, and then proceed with the new header.
1012                  * Unfortunately, there are several places in the code at which
1013                  * the DEBUG() macro is used to build partial lines.  That in mind,
1014                  * we'll work under the assumption that an incomplete line indicates
1015                  * that a new header is *not* desired.
1016                  */
1017                 return( True );
1018         }
1019
1020 #ifdef WITH_SYSLOG
1021         /* Set syslog_level. */
1022         syslog_level = level;
1023 #endif
1024
1025         /* Don't print a header if we're logging to stdout. */
1026         if ( state.logtype != DEBUG_FILE ) {
1027                 return( True );
1028         }
1029
1030         /* Print the header if timestamps are turned on.  If parameters are
1031          * not yet loaded, then default to timestamps on.
1032          */
1033         if( lp_timestamp_logs() || lp_debug_prefix_timestamp() || !(lp_loaded()) ) {
1034                 char header_str[200];
1035
1036                 header_str[0] = '\0';
1037
1038                 if( lp_debug_pid())
1039                         slprintf(header_str,sizeof(header_str)-1,", pid=%u",(unsigned int)sys_getpid());
1040
1041                 if( lp_debug_uid()) {
1042                         size_t hs_len = strlen(header_str);
1043                         slprintf(header_str + hs_len,
1044                         sizeof(header_str) - 1 - hs_len,
1045                                 ", effective(%u, %u), real(%u, %u)",
1046                                 (unsigned int)geteuid(), (unsigned int)getegid(),
1047                                 (unsigned int)getuid(), (unsigned int)getgid()); 
1048                 }
1049
1050                 if (lp_debug_class() && (cls != DBGC_ALL)) {
1051                         size_t hs_len = strlen(header_str);
1052                         slprintf(header_str + hs_len,
1053                                  sizeof(header_str) -1 - hs_len,
1054                                  ", class=%s",
1055                                  default_classname_table[cls]);
1056                 }
1057   
1058                 /* Print it all out at once to prevent split syslog output. */
1059                 if( lp_debug_prefix_timestamp() ) {
1060                     (void)Debug1( "[%s, %2d%s] ",
1061                         current_timestring(talloc_tos(),
1062                                            lp_debug_hires_timestamp()),
1063                         level, header_str);
1064                 } else {
1065                     (void)Debug1( "[%s, %2d%s] %s(%s)\n",
1066                         current_timestring(talloc_tos(),
1067                                            lp_debug_hires_timestamp()),
1068                         level, header_str, location, func );
1069                 }
1070         }
1071
1072         errno = old_errno;
1073         return( True );
1074 }
1075
1076 bool dbghdr(int level, const char *location, const char *func)
1077 {
1078         /* For compatibility with Samba 4, which doesn't have debug classes */
1079         return dbghdrclass(level, 0, location, func);
1080 }
1081
1082 /***************************************************************************
1083  Add text to the body of the "current" debug message via the format buffer.
1084
1085   Input:  format_str  - Format string, as used in printf(), et. al.
1086           ...         - Variable argument list.
1087
1088   ..or..  va_alist    - Old style variable parameter list starting point.
1089
1090   Output: Always True.  See dbghdr() for more info, though this is not
1091           likely to be used in the same way.
1092
1093 ***************************************************************************/
1094
1095  bool dbgtext( const char *format_str, ... )
1096 {
1097         va_list ap;
1098         char *msgbuf = NULL;
1099         bool ret = true;
1100         int res;
1101
1102         va_start(ap, format_str);
1103         res = vasprintf(&msgbuf, format_str, ap);
1104         va_end(ap);
1105
1106         if (res != -1) {
1107                 format_debug_text(msgbuf);
1108         } else {
1109                 ret = false;
1110         }
1111         SAFE_FREE(msgbuf);
1112         return ret;
1113 }