e6a1ba4f96f8ff8efeb743c9699a4cdb778b86c4
[metze/samba/wip.git] / lib / util / 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 "replace.h"
23 #include <talloc.h>
24 #include "system/filesys.h"
25 #include "system/syslog.h"
26 #include "system/locale.h"
27 #include "time_basic.h"
28 #include "close_low_fd.h"
29 #include "memory.h"
30 #include "util_strlist.h" /* LIST_SEP */
31 #include "blocking.h"
32 #include "debug.h"
33
34 /* define what facility to use for syslog */
35 #ifndef SYSLOG_FACILITY
36 #define SYSLOG_FACILITY LOG_DAEMON
37 #endif
38
39 /* -------------------------------------------------------------------------- **
40  * Defines...
41  */
42
43 /*
44  * format_bufr[FORMAT_BUFR_SIZE - 1] should always be reserved
45  * for a terminating null byte.
46  */
47 #define FORMAT_BUFR_SIZE 1024
48
49 /* -------------------------------------------------------------------------- **
50  * This module implements Samba's debugging utility.
51  *
52  * The syntax of a debugging log file is represented as:
53  *
54  *  <debugfile> :== { <debugmsg> }
55  *
56  *  <debugmsg>  :== <debughdr> '\n' <debugtext>
57  *
58  *  <debughdr>  :== '[' TIME ',' LEVEL ']' [ [FILENAME ':'] [FUNCTION '()'] ]
59  *
60  *  <debugtext> :== { <debugline> }
61  *
62  *  <debugline> :== TEXT '\n'
63  *
64  * TEXT     is a string of characters excluding the newline character.
65  * LEVEL    is the DEBUG level of the message (an integer in the range 0..10).
66  * TIME     is a timestamp.
67  * FILENAME is the name of the file from which the debug message was generated.
68  * FUNCTION is the function from which the debug message was generated.
69  *
70  * Basically, what that all means is:
71  *
72  * - A debugging log file is made up of debug messages.
73  *
74  * - Each debug message is made up of a header and text.  The header is
75  *   separated from the text by a newline.
76  *
77  * - The header begins with the timestamp and debug level of the message
78  *   enclosed in brackets.  The filename and function from which the
79  *   message was generated may follow.  The filename is terminated by a
80  *   colon, and the function name is terminated by parenthesis.
81  *
82  * - The message text is made up of zero or more lines, each terminated by
83  *   a newline.
84  */
85
86 /* state variables for the debug system */
87 static struct {
88         bool initialized;
89         enum debug_logtype logtype; /* The type of logging we are doing: eg stdout, file, stderr */
90         char prog_name[255];
91         bool reopening_logs;
92         bool schedule_reopen_logs;
93
94         struct debug_settings settings;
95         debug_callback_fn callback;
96         void *callback_private;
97 } state = {
98         .settings = {
99                 .timestamp_logs = true
100         },
101 };
102
103 struct debug_class {
104         /*
105          * The debug loglevel of the class.
106          */
107         int loglevel;
108
109         /*
110          * An optional class specific logfile, may be NULL in which case the
111          * "global" logfile is used and fd is -1.
112          */
113         char *logfile;
114         int fd;
115 };
116
117 static const char *default_classname_table[] = {
118         [DBGC_ALL] =                    "all",
119         [DBGC_TDB] =                    "tdb",
120         [DBGC_PRINTDRIVERS] =           "printdrivers",
121         [DBGC_LANMAN] =                 "lanman",
122         [DBGC_SMB] =                    "smb",
123         [DBGC_RPC_PARSE] =              "rpc_parse",
124         [DBGC_RPC_SRV] =                "rpc_srv",
125         [DBGC_RPC_CLI] =                "rpc_cli",
126         [DBGC_PASSDB] =                 "passdb",
127         [DBGC_SAM] =                    "sam",
128         [DBGC_AUTH] =                   "auth",
129         [DBGC_WINBIND] =                "winbind",
130         [DBGC_VFS] =                    "vfs",
131         [DBGC_IDMAP] =                  "idmap",
132         [DBGC_QUOTA] =                  "quota",
133         [DBGC_ACLS] =                   "acls",
134         [DBGC_LOCKING] =                "locking",
135         [DBGC_MSDFS] =                  "msdfs",
136         [DBGC_DMAPI] =                  "dmapi",
137         [DBGC_REGISTRY] =               "registry",
138         [DBGC_SCAVENGER] =              "scavenger",
139         [DBGC_DNS] =                    "dns",
140         [DBGC_LDB] =                    "ldb",
141         [DBGC_TEVENT] =                 "tevent",
142         [DBGC_AUTH_AUDIT] =             "auth_audit",
143         [DBGC_AUTH_AUDIT_JSON] =        "auth_json_audit",
144         [DBGC_KERBEROS] =               "kerberos",
145         [DBGC_DRS_REPL] =               "drs_repl",
146         [DBGC_SMB2] =                   "smb2",
147         [DBGC_SMB2_CREDITS] =           "smb2_credits",
148         [DBGC_DSDB_AUDIT] =             "dsdb_audit",
149         [DBGC_DSDB_AUDIT_JSON] =        "dsdb_json_audit",
150         [DBGC_DSDB_PWD_AUDIT]  =        "dsdb_password_audit",
151         [DBGC_DSDB_PWD_AUDIT_JSON] =    "dsdb_password_json_audit",
152         [DBGC_DSDB_TXN_AUDIT]  =        "dsdb_transaction_audit",
153         [DBGC_DSDB_TXN_AUDIT_JSON] =    "dsdb_transaction_json_audit",
154         [DBGC_DSDB_GROUP_AUDIT] =       "dsdb_group_audit",
155         [DBGC_DSDB_GROUP_AUDIT_JSON] =  "dsdb_group_json_audit",
156 };
157
158 /*
159  * This is to allow reading of dbgc_config before the debug
160  * system has been initialized.
161  */
162 static struct debug_class debug_class_list_initial[ARRAY_SIZE(default_classname_table)] = {
163         [DBGC_ALL] = (struct debug_class) { .fd = 2 },
164 };
165
166 static size_t debug_num_classes = 0;
167 static struct debug_class *dbgc_config = debug_class_list_initial;
168
169 static int current_msg_level = 0;
170 static int current_msg_class = 0;
171
172 #if defined(WITH_SYSLOG) || defined(HAVE_LIBSYSTEMD_JOURNAL) || defined(HAVE_LIBSYSTEMD)
173 static int debug_level_to_priority(int level)
174 {
175         /*
176          * map debug levels to syslog() priorities
177          */
178         static const int priority_map[] = {
179                 LOG_ERR,     /* 0 */
180                 LOG_WARNING, /* 1 */
181                 LOG_NOTICE,  /* 2 */
182                 LOG_NOTICE,  /* 3 */
183                 LOG_NOTICE,  /* 4 */
184                 LOG_NOTICE,  /* 5 */
185                 LOG_INFO,    /* 6 */
186                 LOG_INFO,    /* 7 */
187                 LOG_INFO,    /* 8 */
188                 LOG_INFO,    /* 9 */
189         };
190         int priority;
191
192         if( level >= ARRAY_SIZE(priority_map) || level < 0)
193                 priority = LOG_DEBUG;
194         else
195                 priority = priority_map[level];
196
197         return priority;
198 }
199 #endif
200
201 /* -------------------------------------------------------------------------- **
202  * Debug backends. When logging to DEBUG_FILE, send the log entries to
203  * all active backends.
204  */
205
206 static void debug_file_log(int msg_level,
207                            const char *msg, const char *msg_no_nl)
208 {
209         ssize_t ret;
210         int fd;
211
212         check_log_size();
213
214         if (dbgc_config[current_msg_class].fd != -1) {
215                 fd = dbgc_config[current_msg_class].fd;
216         } else {
217                 fd = dbgc_config[DBGC_ALL].fd;
218         }
219
220         do {
221                 ret = write(fd, msg, strlen(msg));
222         } while (ret == -1 && errno == EINTR);
223 }
224
225 #ifdef WITH_SYSLOG
226 static void debug_syslog_reload(bool enabled, bool previously_enabled,
227                                 const char *prog_name, char *option)
228 {
229         if (enabled && !previously_enabled) {
230                 const char *ident = NULL;
231                 if ((prog_name != NULL) && (prog_name[0] != '\0')) {
232                         ident = prog_name;
233                 }
234 #ifdef LOG_DAEMON
235                 openlog(ident, LOG_PID, SYSLOG_FACILITY);
236 #else
237                 /* for old systems that have no facility codes. */
238                 openlog(ident, LOG_PID);
239 #endif
240                 return;
241         }
242
243         if (!enabled && previously_enabled) {
244                 closelog();
245         }
246 }
247
248 static void debug_syslog_log(int msg_level,
249                              const char *msg, const char *msg_no_nl)
250 {
251         int priority;
252
253         priority = debug_level_to_priority(msg_level);
254
255         /*
256          * Specify the facility to interoperate with other syslog
257          * callers (vfs_full_audit for example).
258          */
259         priority |= SYSLOG_FACILITY;
260
261         syslog(priority, "%s", msg);
262 }
263 #endif /* WITH_SYSLOG */
264
265 #if defined(HAVE_LIBSYSTEMD_JOURNAL) || defined(HAVE_LIBSYSTEMD)
266 #include <systemd/sd-journal.h>
267 static void debug_systemd_log(int msg_level,
268                               const char *msg, const char *msg_no_nl)
269 {
270         sd_journal_send("MESSAGE=%s", msg_no_nl,
271                         "PRIORITY=%d", debug_level_to_priority(msg_level),
272                         "LEVEL=%d", msg_level,
273                         NULL);
274 }
275 #endif
276
277 #ifdef HAVE_LTTNG_TRACEF
278 #include <lttng/tracef.h>
279 static void debug_lttng_log(int msg_level,
280                             const char *msg, const char *msg_no_nl)
281 {
282         tracef(msg_no_nl);
283 }
284 #endif /* WITH_LTTNG_TRACEF */
285
286 #ifdef HAVE_GPFS
287 #include "gpfswrap.h"
288 static void debug_gpfs_reload(bool enabled, bool previously_enabled,
289                               const char *prog_name, char *option)
290 {
291         gpfswrap_init();
292
293         if (enabled && !previously_enabled) {
294                 gpfswrap_init_trace();
295                 return;
296         }
297
298         if (!enabled && previously_enabled) {
299                 gpfswrap_fini_trace();
300                 return;
301         }
302
303         if (enabled) {
304                 /*
305                  * Trigger GPFS library to adjust state if necessary.
306                  */
307                 gpfswrap_query_trace();
308         }
309 }
310
311 static void debug_gpfs_log(int msg_level,
312                            const char *msg, const char *msg_no_nl)
313 {
314         gpfswrap_add_trace(msg_level, msg_no_nl);
315 }
316 #endif /* HAVE_GPFS */
317
318 #define DEBUG_RINGBUF_SIZE (1024 * 1024)
319 #define DEBUG_RINGBUF_SIZE_OPT "size="
320
321 static char *debug_ringbuf;
322 static size_t debug_ringbuf_size;
323 static size_t debug_ringbuf_ofs;
324
325 /* We ensure in debug_ringbuf_log() that this is always \0 terminated */
326 char *debug_get_ringbuf(void)
327 {
328         return debug_ringbuf;
329 }
330
331 /* Return the size of the ringbuf (including a \0 terminator) */
332 size_t debug_get_ringbuf_size(void)
333 {
334         return debug_ringbuf_size;
335 }
336
337 static void debug_ringbuf_reload(bool enabled, bool previously_enabled,
338                                  const char *prog_name, char *option)
339 {
340         bool cmp;
341         size_t optlen = strlen(DEBUG_RINGBUF_SIZE_OPT);
342
343         debug_ringbuf_size = DEBUG_RINGBUF_SIZE;
344         debug_ringbuf_ofs = 0;
345
346         SAFE_FREE(debug_ringbuf);
347
348         if (!enabled) {
349                 return;
350         }
351
352         if (option != NULL) {
353                 cmp = strncmp(option, DEBUG_RINGBUF_SIZE_OPT, optlen);
354                 if (cmp == 0) {
355                         debug_ringbuf_size = (size_t)strtoull(
356                                 option + optlen, NULL, 10);
357                 }
358         }
359
360         debug_ringbuf = calloc(debug_ringbuf_size, sizeof(char));
361         if (debug_ringbuf == NULL) {
362                 return;
363         }
364 }
365
366 static void debug_ringbuf_log(int msg_level,
367                               const char *msg,
368                               const char *msg_no_nl)
369 {
370         size_t msglen = strlen(msg);
371         size_t allowed_size;
372
373         if (debug_ringbuf == NULL) {
374                 return;
375         }
376
377         /* Ensure the buffer is always \0 terminated */
378         allowed_size = debug_ringbuf_size - 1;
379
380         if (msglen > allowed_size) {
381                 return;
382         }
383
384         if ((debug_ringbuf_ofs + msglen) < debug_ringbuf_ofs) {
385                 return;
386         }
387
388         if ((debug_ringbuf_ofs + msglen) > allowed_size) {
389                 debug_ringbuf_ofs = 0;
390         }
391
392         memcpy(debug_ringbuf + debug_ringbuf_ofs, msg, msglen);
393         debug_ringbuf_ofs += msglen;
394 }
395
396 static struct debug_backend {
397         const char *name;
398         int log_level;
399         int new_log_level;
400         void (*reload)(bool enabled, bool prev_enabled,
401                        const char *prog_name, char *option);
402         void (*log)(int msg_level, const char *msg, const char *msg_no_nl);
403         char *option;
404 } debug_backends[] = {
405         {
406                 .name = "file",
407                 .log = debug_file_log,
408         },
409 #ifdef WITH_SYSLOG
410         {
411                 .name = "syslog",
412                 .reload = debug_syslog_reload,
413                 .log = debug_syslog_log,
414         },
415 #endif
416
417 #if defined(HAVE_LIBSYSTEMD_JOURNAL) || defined(HAVE_LIBSYSTEMD)
418         {
419                 .name = "systemd",
420                 .log = debug_systemd_log,
421         },
422 #endif
423
424 #ifdef HAVE_LTTNG_TRACEF
425         {
426                 .name = "lttng",
427                 .log = debug_lttng_log,
428         },
429 #endif
430
431 #ifdef HAVE_GPFS
432         {
433                 .name = "gpfs",
434                 .reload = debug_gpfs_reload,
435                 .log = debug_gpfs_log,
436         },
437 #endif
438         {
439                 .name = "ringbuf",
440                 .log = debug_ringbuf_log,
441                 .reload = debug_ringbuf_reload,
442         },
443 };
444
445 static struct debug_backend *debug_find_backend(const char *name)
446 {
447         unsigned i;
448
449         for (i = 0; i < ARRAY_SIZE(debug_backends); i++) {
450                 if (strcmp(name, debug_backends[i].name) == 0) {
451                         return &debug_backends[i];
452                 }
453         }
454
455         return NULL;
456 }
457
458 /*
459  * parse "backend[:option][@loglevel]
460  */
461 static void debug_backend_parse_token(char *tok)
462 {
463         char *backend_name_option, *backend_name,*backend_level, *saveptr;
464         char *backend_option;
465         struct debug_backend *b;
466
467         /*
468          * First parse into backend[:option] and loglevel
469          */
470         backend_name_option = strtok_r(tok, "@\0", &saveptr);
471         if (backend_name_option == NULL) {
472                 return;
473         }
474
475         backend_level = strtok_r(NULL, "\0", &saveptr);
476
477         /*
478          * Now parse backend[:option]
479          */
480         backend_name = strtok_r(backend_name_option, ":\0", &saveptr);
481         if (backend_name == NULL) {
482                 return;
483         }
484
485         backend_option = strtok_r(NULL, "\0", &saveptr);
486
487         /*
488          * Find and update backend
489          */
490         b = debug_find_backend(backend_name);
491         if (b == NULL) {
492                 return;
493         }
494
495         if (backend_level == NULL) {
496                 b->new_log_level = MAX_DEBUG_LEVEL;
497         } else {
498                 b->new_log_level = atoi(backend_level);
499         }
500
501         if (backend_option != NULL) {
502                 b->option = strdup(backend_option);
503                 if (b->option == NULL) {
504                         return;
505                 }
506         }
507 }
508
509 /*
510  * parse "backend1[:option1][@loglevel1] backend2[option2][@loglevel2] ... "
511  * and enable/disable backends accordingly
512  */
513 static void debug_set_backends(const char *param)
514 {
515         size_t str_len = strlen(param);
516         char str[str_len+1];
517         char *tok, *saveptr;
518         unsigned i;
519
520         /*
521          * initialize new_log_level to detect backends that have been
522          * disabled
523          */
524         for (i = 0; i < ARRAY_SIZE(debug_backends); i++) {
525                 SAFE_FREE(debug_backends[i].option);
526                 debug_backends[i].new_log_level = -1;
527         }
528
529         memcpy(str, param, str_len + 1);
530
531         tok = strtok_r(str, LIST_SEP, &saveptr);
532         if (tok == NULL) {
533                 return;
534         }
535
536         while (tok != NULL) {
537                 debug_backend_parse_token(tok);
538                 tok = strtok_r(NULL, LIST_SEP, &saveptr);
539         }
540
541         /*
542          * Let backends react to config changes
543          */
544         for (i = 0; i < ARRAY_SIZE(debug_backends); i++) {
545                 struct debug_backend *b = &debug_backends[i];
546
547                 if (b->reload) {
548                         bool enabled = b->new_log_level > -1;
549                         bool previously_enabled = b->log_level > -1;
550
551                         b->reload(enabled, previously_enabled, state.prog_name,
552                                   b->option);
553                 }
554                 b->log_level = b->new_log_level;
555         }
556 }
557
558 static void debug_backends_log(const char *msg, int msg_level)
559 {
560         char msg_no_nl[FORMAT_BUFR_SIZE];
561         size_t i;
562         size_t len;
563
564         /*
565          * Some backends already add an extra newline, so also provide
566          * a buffer without the newline character.
567          */
568         len = MIN(strlen(msg), FORMAT_BUFR_SIZE - 1);
569         if ((len > 0) && (msg[len - 1] == '\n')) {
570                 len--;
571         }
572
573         memcpy(msg_no_nl, msg, len);
574         msg_no_nl[len] = '\0';
575
576         for (i = 0; i < ARRAY_SIZE(debug_backends); i++) {
577                 if (msg_level <= debug_backends[i].log_level) {
578                         debug_backends[i].log(msg_level, msg, msg_no_nl);
579                 }
580         }
581 }
582
583 /* -------------------------------------------------------------------------- **
584  * External variables.
585  */
586
587 /*
588    used to check if the user specified a
589    logfile on the command line
590 */
591 bool    override_logfile;
592
593 int debuglevel_get_class(size_t idx)
594 {
595         return dbgc_config[idx].loglevel;
596 }
597
598 void debuglevel_set_class(size_t idx, int level)
599 {
600         dbgc_config[idx].loglevel = level;
601 }
602
603
604 /* -------------------------------------------------------------------------- **
605  * Internal variables.
606  *
607  *  debug_count     - Number of debug messages that have been output.
608  *                    Used to check log size.
609  *
610  *  current_msg_level    - Internal copy of the message debug level.  Written by
611  *                    dbghdr() and read by Debug1().
612  *
613  *  format_bufr     - Used to format debug messages.  The dbgtext() function
614  *                    prints debug messages to a string, and then passes the
615  *                    string to format_debug_text(), which uses format_bufr
616  *                    to build the formatted output.
617  *
618  *  format_pos      - Marks the first free byte of the format_bufr.
619  *
620  *
621  *  log_overflow    - When this variable is true, never attempt to check the
622  *                    size of the log. This is a hack, so that we can write
623  *                    a message using DEBUG, from open_logs() when we
624  *                    are unable to open a new log file for some reason.
625  */
626
627 static int     debug_count    = 0;
628 static char format_bufr[FORMAT_BUFR_SIZE];
629 static size_t     format_pos     = 0;
630 static bool    log_overflow   = false;
631
632 /*
633  * Define all the debug class selection names here. Names *MUST NOT* contain
634  * white space. There must be one name for each DBGC_<class name>, and they
635  * must be in the table in the order of DBGC_<class name>..
636  */
637
638 static char **classname_table = NULL;
639
640
641 /* -------------------------------------------------------------------------- **
642  * Functions...
643  */
644
645 static void debug_init(void);
646
647 /***************************************************************************
648  Free memory pointed to by global pointers.
649 ****************************************************************************/
650
651 void gfree_debugsyms(void)
652 {
653         unsigned i;
654
655         TALLOC_FREE(classname_table);
656
657         if ( dbgc_config != debug_class_list_initial ) {
658                 TALLOC_FREE( dbgc_config );
659                 dbgc_config = discard_const_p(struct debug_class,
660                                                    debug_class_list_initial);
661         }
662
663         debug_num_classes = 0;
664
665         state.initialized = false;
666
667         for (i = 0; i < ARRAY_SIZE(debug_backends); i++) {
668                 SAFE_FREE(debug_backends[i].option);
669         }
670 }
671
672 /****************************************************************************
673 utility lists registered debug class names's
674 ****************************************************************************/
675
676 char *debug_list_class_names_and_levels(void)
677 {
678         char *buf = NULL;
679         size_t i;
680         /* prepare strings */
681         for (i = 0; i < debug_num_classes; i++) {
682                 buf = talloc_asprintf_append(buf,
683                                              "%s:%d%s",
684                                              classname_table[i],
685                                              dbgc_config[i].loglevel,
686                                              i == (debug_num_classes - 1) ? "\n" : " ");
687                 if (buf == NULL) {
688                         return NULL;
689                 }
690         }
691         return buf;
692 }
693
694 /****************************************************************************
695  Utility to translate names to debug class index's (internal version).
696 ****************************************************************************/
697
698 static int debug_lookup_classname_int(const char* classname)
699 {
700         size_t i;
701
702         if (!classname) return -1;
703
704         for (i=0; i < debug_num_classes; i++) {
705                 if (strcmp(classname, classname_table[i])==0)
706                         return i;
707         }
708         return -1;
709 }
710
711 /****************************************************************************
712  Add a new debug class to the system.
713 ****************************************************************************/
714
715 int debug_add_class(const char *classname)
716 {
717         int ndx;
718         struct debug_class *new_class_list = NULL;
719         char **new_name_list;
720         int default_level;
721
722         if (classname == NULL) {
723                 return -1;
724         }
725
726         /* check the init has yet been called */
727         debug_init();
728
729         ndx = debug_lookup_classname_int(classname);
730         if (ndx >= 0) {
731                 return ndx;
732         }
733         ndx = debug_num_classes;
734
735         if (dbgc_config == debug_class_list_initial) {
736                 /* Initial loading... */
737                 new_class_list = NULL;
738         } else {
739                 new_class_list = dbgc_config;
740         }
741
742         default_level = dbgc_config[DBGC_ALL].loglevel;
743
744         new_class_list = talloc_realloc(NULL,
745                                         new_class_list,
746                                         struct debug_class,
747                                         ndx + 1);
748         if (new_class_list == NULL) {
749                 return -1;
750         }
751
752         dbgc_config = new_class_list;
753
754         dbgc_config[ndx] = (struct debug_class) {
755                 .loglevel = default_level,
756                 .fd = -1,
757         };
758
759         new_name_list = talloc_realloc(NULL, classname_table, char *, ndx + 1);
760         if (new_name_list == NULL) {
761                 return -1;
762         }
763         classname_table = new_name_list;
764
765         classname_table[ndx] = talloc_strdup(classname_table, classname);
766         if (classname_table[ndx] == NULL) {
767                 return -1;
768         }
769
770         debug_num_classes = ndx + 1;
771
772         return ndx;
773 }
774
775 /****************************************************************************
776  Utility to translate names to debug class index's (public version).
777 ****************************************************************************/
778
779 static int debug_lookup_classname(const char *classname)
780 {
781         int ndx;
782
783         if (!classname || !*classname)
784                 return -1;
785
786         ndx = debug_lookup_classname_int(classname);
787
788         if (ndx != -1)
789                 return ndx;
790
791         DEBUG(0, ("debug_lookup_classname(%s): Unknown class\n",
792                   classname));
793         return debug_add_class(classname);
794 }
795
796 /****************************************************************************
797  Dump the current registered debug levels.
798 ****************************************************************************/
799
800 static void debug_dump_status(int level)
801 {
802         size_t q;
803
804         DEBUG(level, ("INFO: Current debug levels:\n"));
805         for (q = 0; q < debug_num_classes; q++) {
806                 const char *classname = classname_table[q];
807                 DEBUGADD(level, ("  %s: %d\n",
808                                  classname,
809                                  dbgc_config[q].loglevel));
810         }
811 }
812
813 static bool debug_parse_param(char *param)
814 {
815         char *class_name;
816         char *class_file = NULL;
817         char *class_level;
818         char *saveptr = NULL;
819         int ndx;
820
821         class_name = strtok_r(param, ":", &saveptr);
822         if (class_name == NULL) {
823                 return false;
824         }
825
826         class_level = strtok_r(NULL, "@\0", &saveptr);
827         if (class_level == NULL) {
828                 return false;
829         }
830
831         class_file = strtok_r(NULL, "\0", &saveptr);
832
833         ndx = debug_lookup_classname(class_name);
834         if (ndx == -1) {
835                 return false;
836         }
837
838         dbgc_config[ndx].loglevel = atoi(class_level);
839
840         if (class_file == NULL) {
841                 return true;
842         }
843
844         TALLOC_FREE(dbgc_config[ndx].logfile);
845
846         dbgc_config[ndx].logfile = talloc_strdup(NULL, class_file);
847         if (dbgc_config[ndx].logfile == NULL) {
848                 return false;
849         }
850         return true;
851 }
852
853 /****************************************************************************
854  Parse the debug levels from smb.conf. Example debug level string:
855   3 tdb:5 printdrivers:7
856  Note: the 1st param has no "name:" preceeding it.
857 ****************************************************************************/
858
859 bool debug_parse_levels(const char *params_str)
860 {
861         size_t str_len = strlen(params_str);
862         char str[str_len+1];
863         char *tok, *saveptr;
864         size_t i;
865
866         /* Just in case */
867         debug_init();
868
869         memcpy(str, params_str, str_len+1);
870
871         tok = strtok_r(str, LIST_SEP, &saveptr);
872         if (tok == NULL) {
873                 return true;
874         }
875
876         /* Allow DBGC_ALL to be specified w/o requiring its class name e.g."10"
877          * v.s. "all:10", this is the traditional way to set DEBUGLEVEL
878          */
879         if (isdigit(tok[0])) {
880                 dbgc_config[DBGC_ALL].loglevel = atoi(tok);
881                 tok = strtok_r(NULL, LIST_SEP, &saveptr);
882         } else {
883                 dbgc_config[DBGC_ALL].loglevel = 0;
884         }
885
886         /* Array is debug_num_classes long */
887         for (i = DBGC_ALL+1; i < debug_num_classes; i++) {
888                 dbgc_config[i].loglevel = dbgc_config[DBGC_ALL].loglevel;
889                 TALLOC_FREE(dbgc_config[i].logfile);
890         }
891
892         while (tok != NULL) {
893                 bool ok;
894
895                 ok = debug_parse_param(tok);
896                 if (!ok) {
897                         DEBUG(0,("debug_parse_params: unrecognized debug "
898                                  "class name or format [%s]\n", tok));
899                         return false;
900                 }
901
902                 tok = strtok_r(NULL, LIST_SEP, &saveptr);
903         }
904
905         debug_dump_status(5);
906
907         return true;
908 }
909
910 /* setup for logging of talloc warnings */
911 static void talloc_log_fn(const char *msg)
912 {
913         DEBUG(0,("%s", msg));
914 }
915
916 void debug_setup_talloc_log(void)
917 {
918         talloc_set_log_fn(talloc_log_fn);
919 }
920
921
922 /****************************************************************************
923 Init debugging (one time stuff)
924 ****************************************************************************/
925
926 static void debug_init(void)
927 {
928         size_t i;
929
930         if (state.initialized)
931                 return;
932
933         state.initialized = true;
934
935         debug_setup_talloc_log();
936
937         for (i = 0; i < ARRAY_SIZE(default_classname_table); i++) {
938                 debug_add_class(default_classname_table[i]);
939         }
940         dbgc_config[DBGC_ALL].fd = 2;
941
942         for (i = 0; i < ARRAY_SIZE(debug_backends); i++) {
943                 debug_backends[i].log_level = -1;
944                 debug_backends[i].new_log_level = -1;
945         }
946 }
947
948 void debug_set_settings(struct debug_settings *settings,
949                         const char *logging_param,
950                         int syslog_level, bool syslog_only)
951 {
952         char fake_param[256];
953         size_t len = 0;
954
955         /*
956          * This forces in some smb.conf derived values into the debug
957          * system. There are no pointers in this structure, so we can
958          * just structure-assign it in
959          */
960         state.settings = *settings;
961
962         /*
963          * If 'logging' is not set, create backend settings from
964          * deprecated 'syslog' and 'syslog only' parameters
965          */
966         if (logging_param != NULL) {
967                 len = strlen(logging_param);
968         }
969         if (len == 0) {
970                 if (syslog_only) {
971                         snprintf(fake_param, sizeof(fake_param),
972                                  "syslog@%d", syslog_level - 1);
973                 } else {
974                         snprintf(fake_param, sizeof(fake_param),
975                                  "syslog@%d file@%d", syslog_level -1,
976                                  MAX_DEBUG_LEVEL);
977                 }
978
979                 logging_param = fake_param;
980         }
981
982         debug_set_backends(logging_param);
983 }
984
985 /**
986   control the name of the logfile and whether logging will be to stdout, stderr
987   or a file, and set up syslog
988
989   new_log indicates the destination for the debug log (an enum in
990   order of precedence - once set to DEBUG_FILE, it is not possible to
991   reset to DEBUG_STDOUT for example.  This makes it easy to override
992   for debug to stderr on the command line, as the smb.conf cannot
993   reset it back to file-based logging
994 */
995 void setup_logging(const char *prog_name, enum debug_logtype new_logtype)
996 {
997         debug_init();
998         if (state.logtype < new_logtype) {
999                 state.logtype = new_logtype;
1000         }
1001         if (prog_name) {
1002                 const char *p = strrchr(prog_name, '/');
1003
1004                 if (p) {
1005                         prog_name = p + 1;
1006                 }
1007
1008                 strlcpy(state.prog_name, prog_name, sizeof(state.prog_name));
1009         }
1010         reopen_logs_internal();
1011 }
1012
1013 /***************************************************************************
1014  Set the logfile name.
1015 **************************************************************************/
1016
1017 void debug_set_logfile(const char *name)
1018 {
1019         if (name == NULL || *name == 0) {
1020                 /* this copes with calls when smb.conf is not loaded yet */
1021                 return;
1022         }
1023         TALLOC_FREE(dbgc_config[DBGC_ALL].logfile);
1024         dbgc_config[DBGC_ALL].logfile = talloc_strdup(NULL, name);
1025 }
1026
1027 static void debug_close_fd(int fd)
1028 {
1029         if (fd > 2) {
1030                 close(fd);
1031         }
1032 }
1033
1034 bool debug_get_output_is_stderr(void)
1035 {
1036         return (state.logtype == DEBUG_DEFAULT_STDERR) || (state.logtype == DEBUG_STDERR);
1037 }
1038
1039 bool debug_get_output_is_stdout(void)
1040 {
1041         return (state.logtype == DEBUG_DEFAULT_STDOUT) || (state.logtype == DEBUG_STDOUT);
1042 }
1043
1044 void debug_set_callback(void *private_ptr, debug_callback_fn fn)
1045 {
1046         debug_init();
1047         if (fn) {
1048                 state.logtype = DEBUG_CALLBACK;
1049                 state.callback_private = private_ptr;
1050                 state.callback = fn;
1051         } else {
1052                 state.logtype = DEBUG_DEFAULT_STDERR;
1053                 state.callback_private = NULL;
1054                 state.callback = NULL;
1055         }
1056 }
1057
1058 static void debug_callback_log(const char *msg, int msg_level)
1059 {
1060         size_t msg_len = strlen(msg);
1061         char msg_copy[msg_len];
1062
1063         if ((msg_len > 0) && (msg[msg_len-1] == '\n')) {
1064                 memcpy(msg_copy, msg, msg_len-1);
1065                 msg_copy[msg_len-1] = '\0';
1066                 msg = msg_copy;
1067         }
1068
1069         state.callback(state.callback_private, msg_level, msg);
1070 }
1071
1072 /**************************************************************************
1073  reopen the log files
1074  note that we now do this unconditionally
1075  We attempt to open the new debug fp before closing the old. This means
1076  if we run out of fd's we just keep using the old fd rather than aborting.
1077  Fix from dgibson@linuxcare.com.
1078 **************************************************************************/
1079
1080 static bool reopen_one_log(int *fd, const char *logfile)
1081 {
1082         int old_fd = *fd;
1083         int new_fd;
1084
1085         if (logfile == NULL) {
1086                 debug_close_fd(old_fd);
1087                 *fd = -1;
1088                 return true;
1089         }
1090
1091         new_fd = open(logfile, O_WRONLY|O_APPEND|O_CREAT, 0644);
1092         if (new_fd == -1) {
1093                 log_overflow = true;
1094                 DBG_ERR("Unable to open new log file '%s': %s\n",
1095                         logfile, strerror(errno));
1096                 log_overflow = false;
1097                 return false;
1098         }
1099
1100         debug_close_fd(old_fd);
1101         smb_set_close_on_exec(new_fd);
1102         *fd = new_fd;
1103
1104         return true;
1105 }
1106
1107 /**
1108   reopen the log file (usually called because the log file name might have changed)
1109 */
1110 bool reopen_logs_internal(void)
1111 {
1112         mode_t oldumask;
1113         int new_fd = 0;
1114         size_t i;
1115         bool ok;
1116
1117         if (state.reopening_logs) {
1118                 return true;
1119         }
1120
1121         /* Now clear the SIGHUP induced flag */
1122         state.schedule_reopen_logs = false;
1123
1124         switch (state.logtype) {
1125         case DEBUG_CALLBACK:
1126                 return true;
1127         case DEBUG_STDOUT:
1128         case DEBUG_DEFAULT_STDOUT:
1129                 debug_close_fd(dbgc_config[DBGC_ALL].fd);
1130                 dbgc_config[DBGC_ALL].fd = 1;
1131                 return true;
1132
1133         case DEBUG_DEFAULT_STDERR:
1134         case DEBUG_STDERR:
1135                 debug_close_fd(dbgc_config[DBGC_ALL].fd);
1136                 dbgc_config[DBGC_ALL].fd = 2;
1137                 return true;
1138
1139         case DEBUG_FILE:
1140                 break;
1141         }
1142
1143         oldumask = umask( 022 );
1144
1145         for (i = DBGC_ALL; i < debug_num_classes; i++) {
1146                 if (dbgc_config[DBGC_ALL].logfile != NULL) {
1147                         break;
1148                 }
1149         }
1150         if (i == debug_num_classes) {
1151                 return false;
1152         }
1153
1154         state.reopening_logs = true;
1155
1156         for (i = DBGC_ALL; i < debug_num_classes; i++) {
1157                 ok = reopen_one_log(&dbgc_config[i].fd,
1158                                     dbgc_config[i].logfile);
1159                 if (!ok) {
1160                         break;
1161                 }
1162         }
1163
1164         /* Fix from klausr@ITAP.Physik.Uni-Stuttgart.De
1165          * to fix problem where smbd's that generate less
1166          * than 100 messages keep growing the log.
1167          */
1168         force_check_log_size();
1169         (void)umask(oldumask);
1170
1171         /*
1172          * If log file was opened or created successfully, take over stderr to
1173          * catch output into logs.
1174          */
1175         if (new_fd != -1) {
1176                 if (dup2(dbgc_config[DBGC_ALL].fd, 2) == -1) {
1177                         /* Close stderr too, if dup2 can't point it -
1178                            at the logfile.  There really isn't much
1179                            that can be done on such a fundamental
1180                            failure... */
1181                         close_low_fd(2);
1182                 }
1183         }
1184
1185         state.reopening_logs = false;
1186
1187         return ok;
1188 }
1189
1190 /**************************************************************************
1191  Force a check of the log size.
1192  ***************************************************************************/
1193
1194 void force_check_log_size( void )
1195 {
1196         debug_count = 100;
1197 }
1198
1199 _PUBLIC_ void debug_schedule_reopen_logs(void)
1200 {
1201         state.schedule_reopen_logs = true;
1202 }
1203
1204
1205 /***************************************************************************
1206  Check to see if there is any need to check if the logfile has grown too big.
1207 **************************************************************************/
1208
1209 bool need_to_check_log_size(void)
1210 {
1211         int maxlog;
1212         size_t i;
1213
1214         if (debug_count < 100) {
1215                 return false;
1216         }
1217
1218         maxlog = state.settings.max_log_size * 1024;
1219         if (maxlog <= 0) {
1220                 debug_count = 0;
1221                 return false;
1222         }
1223
1224         if (dbgc_config[DBGC_ALL].fd > 2) {
1225                 return true;
1226         }
1227
1228         for (i = DBGC_ALL + 1; i < debug_num_classes; i++) {
1229                 if (dbgc_config[i].fd != -1) {
1230                         return true;
1231                 }
1232         }
1233
1234         debug_count = 0;
1235         return false;
1236 }
1237
1238 /**************************************************************************
1239  Check to see if the log has grown to be too big.
1240  **************************************************************************/
1241
1242 static void do_one_check_log_size(off_t maxlog, int *_fd, const char *logfile)
1243 {
1244         char name[strlen(logfile) + 5];
1245         struct stat st;
1246         int fd = *_fd;
1247         int ret;
1248         bool ok;
1249
1250         if (maxlog == 0) {
1251                 return;
1252         }
1253
1254         ret = fstat(fd, &st);
1255         if (ret != 0) {
1256                 return;
1257         }
1258         if (st.st_size < maxlog ) {
1259                 return;
1260         }
1261
1262         /* reopen_logs_internal() modifies *_fd */
1263         (void)reopen_logs_internal();
1264         fd = *_fd;
1265
1266         if (fd <= 2) {
1267                 return;
1268         }
1269         ret = fstat(fd, &st);
1270         if (ret != 0) {
1271                 return;
1272         }
1273         if (st.st_size < maxlog) {
1274                 return;
1275         }
1276
1277         snprintf(name, sizeof(name), "%s.old", logfile);
1278
1279         (void)rename(logfile, name);
1280
1281         ok = reopen_logs_internal();
1282         if (ok) {
1283                 return;
1284         }
1285         /* We failed to reopen a log - continue using the old name. */
1286         (void)rename(name, logfile);
1287 }
1288
1289 static void do_check_log_size(off_t maxlog)
1290 {
1291         size_t i;
1292
1293         for (i = DBGC_ALL; i < debug_num_classes; i++) {
1294                 if (dbgc_config[i].fd == -1) {
1295                         continue;
1296                 }
1297                 if (dbgc_config[i].logfile == NULL) {
1298                         continue;
1299                 }
1300                 do_one_check_log_size(maxlog,
1301                                       &dbgc_config[i].fd,
1302                                       dbgc_config[i].logfile);
1303         }
1304 }
1305
1306 void check_log_size( void )
1307 {
1308         off_t maxlog;
1309
1310         /*
1311          *  We need to be root to check/change log-file, skip this and let the main
1312          *  loop check do a new check as root.
1313          */
1314
1315 #if _SAMBA_BUILD_ == 3
1316         if (geteuid() != sec_initial_uid())
1317 #else
1318         if( geteuid() != 0)
1319 #endif
1320         {
1321                 /* We don't check sec_initial_uid() here as it isn't
1322                  * available in common code and we don't generally
1323                  * want to rotate and the possibly lose logs in
1324                  * make test or the build farm */
1325                 return;
1326         }
1327
1328         if(log_overflow || (!state.schedule_reopen_logs && !need_to_check_log_size())) {
1329                 return;
1330         }
1331
1332         maxlog = state.settings.max_log_size * 1024;
1333
1334         if (state.schedule_reopen_logs) {
1335                 (void)reopen_logs_internal();
1336         }
1337
1338         do_check_log_size(maxlog);
1339
1340         /*
1341          * Here's where we need to panic if dbgc_config[DBGC_ALL].fd == 0 or -1
1342          * (invalid values)
1343          */
1344
1345         if (dbgc_config[DBGC_ALL].fd <= 0) {
1346                 /* This code should only be reached in very strange
1347                  * circumstances. If we merely fail to open the new log we
1348                  * should stick with the old one. ergo this should only be
1349                  * reached when opening the logs for the first time: at
1350                  * startup or when the log level is increased from zero.
1351                  * -dwg 6 June 2000
1352                  */
1353                 int fd = open( "/dev/console", O_WRONLY, 0);
1354                 if (fd != -1) {
1355                         smb_set_close_on_exec(fd);
1356                         dbgc_config[DBGC_ALL].fd = fd;
1357                         DBG_ERR("check_log_size: open of debug file %s failed "
1358                                 "- using console.\n",
1359                                 dbgc_config[DBGC_ALL].logfile);
1360                 } else {
1361                         /*
1362                          * We cannot continue without a debug file handle.
1363                          */
1364                         abort();
1365                 }
1366         }
1367         debug_count = 0;
1368 }
1369
1370 /*************************************************************************
1371  Write an debug message on the debugfile.
1372  This is called by dbghdr() and format_debug_text().
1373 ************************************************************************/
1374
1375 static void Debug1(const char *msg)
1376 {
1377         int old_errno = errno;
1378
1379         debug_count++;
1380
1381         switch(state.logtype) {
1382         case DEBUG_CALLBACK:
1383                 debug_callback_log(msg, current_msg_level);
1384                 break;
1385         case DEBUG_STDOUT:
1386         case DEBUG_STDERR:
1387         case DEBUG_DEFAULT_STDOUT:
1388         case DEBUG_DEFAULT_STDERR:
1389                 if (dbgc_config[DBGC_ALL].fd > 0) {
1390                         ssize_t ret;
1391                         do {
1392                                 ret = write(dbgc_config[DBGC_ALL].fd,
1393                                             msg,
1394                                             strlen(msg));
1395                         } while (ret == -1 && errno == EINTR);
1396                 }
1397                 break;
1398         case DEBUG_FILE:
1399                 debug_backends_log(msg, current_msg_level);
1400                 break;
1401         };
1402
1403         errno = old_errno;
1404 }
1405
1406 /**************************************************************************
1407  Print the buffer content via Debug1(), then reset the buffer.
1408  Input:  none
1409  Output: none
1410 ****************************************************************************/
1411
1412 static void bufr_print( void )
1413 {
1414         format_bufr[format_pos] = '\0';
1415         (void)Debug1(format_bufr);
1416         format_pos = 0;
1417 }
1418
1419 /***************************************************************************
1420  Format the debug message text.
1421
1422  Input:  msg - Text to be added to the "current" debug message text.
1423
1424  Output: none.
1425
1426  Notes:  The purpose of this is two-fold.  First, each call to syslog()
1427          (used by Debug1(), see above) generates a new line of syslog
1428          output.  This is fixed by storing the partial lines until the
1429          newline character is encountered.  Second, printing the debug
1430          message lines when a newline is encountered allows us to add
1431          spaces, thus indenting the body of the message and making it
1432          more readable.
1433 **************************************************************************/
1434
1435 static void format_debug_text( const char *msg )
1436 {
1437         size_t i;
1438         bool timestamp = (state.logtype == DEBUG_FILE && (state.settings.timestamp_logs));
1439
1440         debug_init();
1441
1442         for( i = 0; msg[i]; i++ ) {
1443                 /* Indent two spaces at each new line. */
1444                 if(timestamp && 0 == format_pos) {
1445                         format_bufr[0] = format_bufr[1] = ' ';
1446                         format_pos = 2;
1447                 }
1448
1449                 /* If there's room, copy the character to the format buffer. */
1450                 if (format_pos < FORMAT_BUFR_SIZE - 1)
1451                         format_bufr[format_pos++] = msg[i];
1452
1453                 /* If a newline is encountered, print & restart. */
1454                 if( '\n' == msg[i] )
1455                         bufr_print();
1456
1457                 /* If the buffer is full dump it out, reset it, and put out a line
1458                  * continuation indicator.
1459                  */
1460                 if (format_pos >= FORMAT_BUFR_SIZE - 1) {
1461                         bufr_print();
1462                         (void)Debug1( " +>\n" );
1463                 }
1464         }
1465
1466         /* Just to be safe... */
1467         format_bufr[format_pos] = '\0';
1468 }
1469
1470 /***************************************************************************
1471  Flush debug output, including the format buffer content.
1472
1473  Input:  none
1474  Output: none
1475 ***************************************************************************/
1476
1477 void dbgflush( void )
1478 {
1479         bufr_print();
1480 }
1481
1482 /***************************************************************************
1483  Print a Debug Header.
1484
1485  Input:  level    - Debug level of the message (not the system-wide debug
1486                     level. )
1487          cls      - Debuglevel class of the calling module.
1488          location - Pointer to a string containing the name of the file
1489                     from which this function was called, or an empty string
1490                     if the __FILE__ macro is not implemented.
1491          func     - Pointer to a string containing the name of the function
1492                     from which this function was called, or an empty string
1493                     if the __FUNCTION__ macro is not implemented.
1494
1495  Output: Always true.  This makes it easy to fudge a call to dbghdr()
1496          in a macro, since the function can be called as part of a test.
1497          Eg: ( (level <= DEBUGLEVEL) && (dbghdr(level,"",line)) )
1498
1499  Notes:  This function takes care of setting current_msg_level.
1500
1501 ****************************************************************************/
1502
1503 bool dbghdrclass(int level, int cls, const char *location, const char *func)
1504 {
1505         /* Ensure we don't lose any real errno value. */
1506         int old_errno = errno;
1507         bool verbose = false;
1508         char header_str[300];
1509         size_t hs_len;
1510         struct timeval tv;
1511         struct timeval_buf tvbuf;
1512
1513         if( format_pos ) {
1514                 /* This is a fudge.  If there is stuff sitting in the format_bufr, then
1515                  * the *right* thing to do is to call
1516                  *   format_debug_text( "\n" );
1517                  * to write the remainder, and then proceed with the new header.
1518                  * Unfortunately, there are several places in the code at which
1519                  * the DEBUG() macro is used to build partial lines.  That in mind,
1520                  * we'll work under the assumption that an incomplete line indicates
1521                  * that a new header is *not* desired.
1522                  */
1523                 return( true );
1524         }
1525
1526         /* Set current_msg_level. */
1527         current_msg_level = level;
1528
1529         /* Set current message class */
1530         current_msg_class = cls;
1531
1532         /* Don't print a header if we're logging to stdout. */
1533         if ( state.logtype != DEBUG_FILE ) {
1534                 return( true );
1535         }
1536
1537         /* Print the header if timestamps are turned on.  If parameters are
1538          * not yet loaded, then default to timestamps on.
1539          */
1540         if (!(state.settings.timestamp_logs ||
1541               state.settings.debug_prefix_timestamp)) {
1542                 return true;
1543         }
1544
1545         GetTimeOfDay(&tv);
1546         timeval_str_buf(&tv, false, state.settings.debug_hires_timestamp,
1547                         &tvbuf);
1548
1549         hs_len = snprintf(header_str, sizeof(header_str), "[%s, %2d",
1550                           tvbuf.buf, level);
1551         if (hs_len >= sizeof(header_str)) {
1552                 goto full;
1553         }
1554
1555         if (unlikely(dbgc_config[cls].loglevel >= 10)) {
1556                 verbose = true;
1557         }
1558
1559         if (verbose || state.settings.debug_pid) {
1560                 hs_len += snprintf(
1561                         header_str + hs_len, sizeof(header_str) - hs_len,
1562                         ", pid=%u", (unsigned int)getpid());
1563                 if (hs_len >= sizeof(header_str)) {
1564                         goto full;
1565                 }
1566         }
1567
1568         if (verbose || state.settings.debug_uid) {
1569                 hs_len += snprintf(
1570                         header_str + hs_len, sizeof(header_str) - hs_len,
1571                         ", effective(%u, %u), real(%u, %u)",
1572                         (unsigned int)geteuid(), (unsigned int)getegid(),
1573                         (unsigned int)getuid(), (unsigned int)getgid());
1574                 if (hs_len >= sizeof(header_str)) {
1575                         goto full;
1576                 }
1577         }
1578
1579         if ((verbose || state.settings.debug_class)
1580             && (cls != DBGC_ALL)) {
1581                 hs_len += snprintf(
1582                         header_str + hs_len, sizeof(header_str) - hs_len,
1583                         ", class=%s", classname_table[cls]);
1584                 if (hs_len >= sizeof(header_str)) {
1585                         goto full;
1586                 }
1587         }
1588
1589         /*
1590          * No +=, see man man strlcat
1591          */
1592         hs_len = strlcat(header_str, "] ", sizeof(header_str));
1593         if (hs_len >= sizeof(header_str)) {
1594                 goto full;
1595         }
1596
1597         if (!state.settings.debug_prefix_timestamp) {
1598                 hs_len += snprintf(
1599                         header_str + hs_len, sizeof(header_str) - hs_len,
1600                         "%s(%s)\n", location, func);
1601                 if (hs_len >= sizeof(header_str)) {
1602                         goto full;
1603                 }
1604         }
1605
1606 full:
1607         (void)Debug1(header_str);
1608
1609         errno = old_errno;
1610         return( true );
1611 }
1612
1613 /***************************************************************************
1614  Add text to the body of the "current" debug message via the format buffer.
1615
1616   Input:  format_str  - Format string, as used in printf(), et. al.
1617           ...         - Variable argument list.
1618
1619   ..or..  va_alist    - Old style variable parameter list starting point.
1620
1621   Output: Always true.  See dbghdr() for more info, though this is not
1622           likely to be used in the same way.
1623
1624 ***************************************************************************/
1625
1626 static inline bool __dbgtext_va(const char *format_str, va_list ap) PRINTF_ATTRIBUTE(1,0);
1627 static inline bool __dbgtext_va(const char *format_str, va_list ap)
1628 {
1629         char *msgbuf = NULL;
1630         bool ret = true;
1631         int res;
1632
1633         res = vasprintf(&msgbuf, format_str, ap);
1634         if (res != -1) {
1635                 format_debug_text(msgbuf);
1636         } else {
1637                 ret = false;
1638         }
1639         SAFE_FREE(msgbuf);
1640         return ret;
1641 }
1642
1643 bool dbgtext_va(const char *format_str, va_list ap)
1644 {
1645         return __dbgtext_va(format_str, ap);
1646 }
1647
1648 bool dbgtext(const char *format_str, ... )
1649 {
1650         va_list ap;
1651         bool ret;
1652
1653         va_start(ap, format_str);
1654         ret = __dbgtext_va(format_str, ap);
1655         va_end(ap);
1656
1657         return ret;
1658 }