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