root/source3/lib/debug.c

/* [<][>][^][v][top][bottom][index][help] */

DEFINITIONS

This source file includes following definitions.
  1. gfree_debugsyms
  2. debug_list_class_names_and_levels
  3. debug_classname_from_index
  4. debug_lookup_classname_int
  5. debug_add_class
  6. debug_lookup_classname
  7. debug_dump_status
  8. debug_parse_params
  9. debug_parse_levels
  10. debug_message
  11. debuglevel_message
  12. debug_init
  13. debug_register_msgs
  14. setup_logging
  15. debug_set_logfile
  16. reopen_logs
  17. force_check_log_size
  18. need_to_check_log_size
  19. check_log_size
  20. Debug1
  21. bufr_print
  22. format_debug_text
  23. dbgflush
  24. dbghdrclass
  25. dbghdr
  26. dbgtext
  27. debug_ctx

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

/* [<][>][^][v][top][bottom][index][help] */