5 /* =========================================================================
7 logger.c is part of the utils section in the libatalk library,
8 which is part of the netatalk project.
10 logger.c was written by Simon Bazley (sibaz@sibaz.com)
12 I believe libatalk is released under the L/GPL licence.
14 Just incase, it is, thats the licence I'm applying to this file.
18 ==========================================================================
20 Logger.c is intended as an alternative to syslog for logging
22 ---------------------------------------------------------------
24 The initial plan is to create a structure for general information needed
27 Initally I'll hard code the neccesary stuff to start a log, this should
28 probably be moved elsewhere when some code is written to read the log
29 file locations from the config files.
31 As a more longterm idea, I'll code this so that the data struct can be
32 duplicated to allow multiple concurrent log files, although this is
33 probably a recipe for wasted resources.
35 ========================================================================= */
43 #include <sys/types.h>
48 #include <atalk/boolean.h>
49 #include <atalk/logger.h>
51 #define COUNT_ARRAY(array) (sizeof((array))/sizeof((array)[0]))
52 #define NUMOF COUNT_ARRAY
53 #define KEEP_LOGFILES_OPEN
57 #undef DEBUG_OUTPUT_TO_SCREEN
58 #undef CHECK_STAT_ON_NEW_FILES
59 #undef CHECK_ACCESS_ON_NEW_FILES
60 #define OPEN_LOGS_AS_UID 0
62 /* =========================================================================
63 External function declarations
64 ========================================================================= */
66 /* setup the internal variables used by the logger (called automatically) */
69 /* Setup the log filename and the loglevel, and the type of log it is. */
70 bool log_setup(char *filename, enum loglevels loglevel, enum logtypes logtype,
73 /* Setup the Level and type of log that will be logged to syslog. */
74 void syslog_setup(enum loglevels loglevel, enum logtypes logtype,
75 int display_options, int facility);
77 /* finish up and close the logs */
80 /* This function sets up the processname */
81 void set_processname(char *processname);
84 void make_log(enum loglevels loglevel, enum logtypes logtype,
86 int get_syslog_equivalent(enum loglevels loglevel);
88 #ifndef DISABLE_LOGGER
89 make_log_func set_log_location(char *srcfilename, int srclinenumber);
91 /* =========================================================================
93 ========================================================================= */
95 /* A structure containing object level stuff */
96 struct tag_log_file_data {
97 char log_filename[PATH_MAX]; /* Name of file */
98 FILE *log_file; /* FILE pointer to file */
99 enum loglevels log_level; /* Log Level to put in this file */
103 typedef struct tag_log_file_data log_file_data_pair[2];
105 /* A structure containg class level stuff */
106 struct tag_global_log_data {
109 char *temp_src_filename;
110 int temp_src_linenumber;
111 char processname[16];
114 char *log_file_directory; /* Path of directory containing log files */
115 log_file_data_pair **logs;
118 struct what_to_print_array {
120 bool print_processname;
128 /* =========================================================================
129 Internal function declarations
130 ========================================================================= */
132 void generate_message_details(char *message_details_buffer,
133 int message_details_buffer_length,
134 struct tag_log_file_data *log_struct,
135 enum loglevels loglevel, enum logtypes logtype);
137 static char *get_command_name(char *commandpath);
139 /* =========================================================================
141 ========================================================================= */
143 /* A populated instance */
145 static log_file_data_pair default_log_file_data_pair = {
147 /*log_filename:*/ "\0\0\0\0\0\0\0\0",
149 /*log_level:*/ log_debug,
150 /*display_options:*/ logoption_pid
153 /*log_filename:*/ LOGFILEPATH,
155 /*log_level:*/ log_debug,
156 /*display_options:*/ logoption_pid
159 static log_file_data_pair logger_log_file_data_pair = {
161 /*log_filename:*/ "\0\0\0\0\0\0\0\0",
163 /*log_level:*/ log_warning,
164 /*display_options:*/ logoption_pid
167 /*log_filename:*/ LOGFILEPATH,
169 /*log_level:*/ log_maxdebug,
170 /*display_options:*/ logoption_pid
173 static log_file_data_pair *log_file_data_array[logtype_end_of_list_marker] =
174 {&default_log_file_data_pair};
176 /* The class (populated) */
177 static struct tag_global_log_data global_log_data = {
178 /*struct_size:*/ sizeof(struct tag_global_log_data),
179 /*temp_src_filename:*/ NULL,
180 /*temp_src_linenumber:*/ 0,
182 /*facility:*/ logfacility_daemon,
183 /*log_file_directory:*/ "",
187 /* macro to get access to the array */
188 #define log_file_arr (global_log_data.logs)
190 /* Array to store text to list given a log type */
191 static const char * arr_logtype_strings[] = LOGTYPE_STRING_IDENTIFIERS;
192 static const int num_logtype_strings = COUNT_ARRAY(arr_logtype_strings);
194 /* Array for charachters representing log severity in the log file */
195 static const char arr_loglevel_chars[] = {'S', 'E', 'W', 'N', 'I', 'D'};
196 static const int num_loglevel_chars = COUNT_ARRAY(arr_loglevel_chars);
198 static const char * arr_loglevel_strings[] = LOGLEVEL_STRING_IDENTIFIERS;
199 static const int num_loglevel_strings = COUNT_ARRAY(arr_loglevel_strings);
201 #else /* #ifndef DISABLE_LOGGER */
202 char *disabled_logger_processname=NULL;
203 #endif /* DISABLE_LOGGER */
204 /* =========================================================================
205 Global function definitions
206 ========================================================================= */
208 #ifndef DISABLE_LOGGER
210 /* remember I'm keeping a copy of the actual char * Filename, so you mustn't
211 delete it, until you've finished with the log. Also you're responsible
212 for deleting it when you have finished with it. */
215 if (global_log_data.logs==NULL)
217 /* first check default_log_file_data_pair */
219 /* next clear out the log_file_data_array */
220 memset(log_file_data_array, 0, sizeof(log_file_data_array));
221 /* now set default_log_file_data_pairs */
222 log_file_data_array[logtype_default] = &default_log_file_data_pair;
223 log_file_data_array[logtype_logger] = &logger_log_file_data_pair;
225 /* now setup the global_log_data struct */
226 global_log_data.logs = log_file_data_array;
228 /* make_log_entry(log_debug, logtype_logger, "log_init ran for the first time"); */
231 #endif /* #ifndef DISABLE_LOGGER */
233 bool log_setup(char *filename, enum loglevels loglevel, enum logtypes logtype,
236 #ifndef DISABLE_LOGGER
238 #ifdef CHECK_STAT_ON_NEW_FILES
248 log_file_data_pair *logs;
252 logs = log_file_arr[logtype];
254 LOG(log_info, logtype_logger, "doing log_setup, type %d, level %d, filename \"%s\"", logtype, loglevel, filename);
256 /* LOG(log_extradebug+10, logtype_logger, "checking array for logtype is malloc'd"); */
257 /* has the given logtype already been assigned memory? */
260 logs = (log_file_data_pair *)malloc(sizeof(log_file_data_pair));
263 LOG(log_severe, logtype_logger, "can't calloc in log_setup");
268 memcpy(logs, log_file_arr[logtype_default], sizeof(log_file_data_pair));
270 log_file_arr[logtype] = logs;
271 (*logs)[1].log_file = NULL;
275 /* I think this checks if we're logging to stdout or not. Probably unused */
276 if ( ((*logs)[1].log_file == stdout) && ((*logs)[1].log_file != NULL) )
278 fclose((*logs)[1].log_file);
279 (*logs)[1].log_file = NULL;
282 /* check if we need to append the given filename to a directory */
283 if (strlen(global_log_data.log_file_directory)>0)
285 lastchar[0] = global_log_data.
286 log_file_directory[strlen(global_log_data.log_file_directory)-1];
288 if (lastchar[0] == '/' || lastchar[0] == '\\' || lastchar[0] == ':')
291 /* this should probably be a platform specific path separator */
299 #ifdef DEBUG_OUTPUT_TO_SCREEN
300 printf("filename is %s stored at location %p\n", (*logs)[1].log_filename,
301 (*logs)[1].log_filename);
302 #endif /* DEBUG_OUTPUT_TO_SCREEN */
303 if (filename == NULL)
305 strncpy((*logs)[1].log_filename,
306 (*(log_file_arr[0]))[1].log_filename, PATH_MAX);
310 sprintf((*logs)[1].log_filename, "%s%s%s",
311 global_log_data.log_file_directory,
314 (*logs)[1].log_level = loglevel;
315 (*logs)[1].display_options = display_options;
317 #ifdef DEBUG_OUTPUT_TO_SCREEN
318 printf("filename is %s stored at location %p\n", (*logs)[1].log_filename,
319 (*logs)[1].log_filename);
320 #endif /* DEBUG_OUTPUT_TO_SCREEN */
322 #ifdef CHECK_STAT_ON_NEW_FILES
326 #ifdef DEBUG_OUTPUT_TO_SCREEN
327 printf("about to stat file %s\n", (*logs)[1].log_filename);
329 firstattempt = stat((*logs)[1].log_filename, &statbuf);
331 if (firstattempt == -1)
333 #ifdef DEBUG_OUTPUT_TO_SCREEN
334 printf("about to call Log with %d, %d, %s, %s\n",
335 log_note, logtype_logger,
336 "can't stat Logfile",
337 (*logs)[1].log_filename
341 /* syslog(LOG_INFO, "stat failed"); */
342 LOG(log_warning, logtype_logger, "stat fails on file %s",
343 (*logs)[1].log_filename);
345 if (strlen(global_log_data.log_file_directory)>0)
347 retval = stat(global_log_data.log_file_directory, &statbuf);
350 #ifdef DEBUG_OUTPUT_TO_SCREEN
351 printf("can't stat dir either so I'm giving up\n");
353 LOG(log_severe, logtype_logger, "can't stat directory %s either",
354 global_log_data.log_file_directory);
360 #ifdef CHECK_ACCESS_ON_NEW_FILES
361 access = ((statbuf.st_uid == uid)?(statbuf.st_mode & S_IWUSR):0) +
362 ((statbuf.st_gid == gid)?(statbuf.st_mode & S_IWGRP):0) +
363 (statbuf.st_mode & S_IWOTH);
367 #ifdef DEBUG_OUTPUT_TO_SCREEN
368 printf("failing with %d, %d, %s, %s\n", log_note, logtype_logger,
369 "can't access Logfile %s", (*logs)[1].log_filename);
372 LOG(log_note, logtype_logger, "can't access file %s",
373 (*logs)[1].log_filename);
376 #endif /* CHECK_ACCESS_ON_NEW_FILES */
377 #endif /* CHECK_STAT_ON_NEW_FILES */
379 #ifdef KEEP_LOGFILES_OPEN
380 if ((*logs)[1].log_file!=NULL)
381 fclose((*logs)[1].log_file);
383 (*logs)[1].log_file = fopen((*logs)[1].log_filename, "at");
384 if ((*logs)[1].log_file == NULL)
386 LOG(log_severe, logtype_logger, "can't open Logfile %s",
387 (*logs)[1].log_filename
394 LOG(log_debug7, logtype_logger, "log_file_arr[%d] now contains: "
395 "{log_filename:%s, log_file:%p, log_level: %d}", logtype,
396 (*logs)[1].log_filename, (*logs)[1].log_file, (*logs)[1].log_level);
397 LOG(log_debug, logtype_logger, "log_setup[%d] done", logtype);
399 #endif /* DISABLE_LOGGER */
404 void syslog_setup(enum loglevels loglevel, enum logtypes logtype,
405 int display_options, int facility)
407 #ifndef DISABLE_LOGGER
408 log_file_data_pair *logs;
412 logs = log_file_arr[logtype];
414 LOG(log_info, logtype_logger, "doing syslog_setup, type %d, level %d", logtype, loglevel);
418 logs = (log_file_data_pair *)malloc(sizeof(log_file_data_pair));
421 LOG(log_severe, logtype_logger, "can't calloc in log_setup");
425 memcpy(logs, log_file_arr[logtype_default], sizeof(log_file_data_pair));
426 log_file_arr[logtype] = logs;
430 (*logs)[0].log_file = NULL;
431 (*logs)[0].log_filename[0] = 0;
432 (*logs)[0].log_level = loglevel;
433 (*logs)[0].display_options = display_options;
434 global_log_data.facility = facility;
436 openlog(global_log_data.processname, (*logs)[0].display_options,
437 global_log_data.facility);
439 LOG(log_debug7, logtype_logger, "log_file_arr[%d] now contains: "
440 "{log_filename:%s, log_file:%p, log_level: %d}", logtype,
441 (*logs)[0].log_filename, (*logs)[0].log_file, (*logs)[0].log_level);
442 LOG(log_debug, logtype_logger, "syslog_setup[%d] done", logtype);
443 #else /* DISABLE_LOGGER */
444 /* behave like a normal openlog call */
445 openlog(disabled_logger_processname, display_options, facility);
446 #endif /* DISABLE_LOGGER */
451 #ifndef DISABLE_LOGGER
452 log_file_data_pair *logs;
455 LOG(log_info, logtype_logger, "log_close called");
457 for(n=(sizeof(log_file_arr)-1);n>0;n--)
459 logs = log_file_arr[n];
460 #ifdef KEEP_LOGFILES_OPEN
461 if ((*logs)[1].log_file!=NULL)
462 fclose((*logs)[1].log_file);
463 #endif /* KEEP_LOGFILES_OPEN */
466 LOG(log_debug, logtype_logger, "freeing log entry at %d", n);
467 #ifdef DEBUG_OUTPUT_TO_SCREEN
468 printf("Freeing log_data %d, stored at %p\n", n, logs);
469 printf("\t(filename) %s\t(type) %s\n", (*logs)[1].log_filename,
470 ((n<num_logtype_strings)?arr_logtype_strings[n]:""));
471 #endif /* DEBUG_OUTPUT_TO_SCREEN */
474 log_file_arr[n] = NULL;
476 #ifdef DEBUG_OUTPUT_TO_SCREEN
477 printf("Freeing log_data %d, stored at %p\n", n, log_file_arr[n]);
478 printf("\t(filename) %s\t(type) %s\n",
479 (*(log_file_arr[n]))[1].log_filename,
480 ((n<num_logtype_strings)?arr_logtype_strings[n]:"")
482 #endif /* DEBUG_OUTPUT_TO_SCREEN */
483 #endif /* DISABLE_LOGGER */
485 LOG(log_debug, logtype_logger, "log_close done");
490 /* This function sets up the processname */
491 void set_processname(char *processname)
493 #ifndef DISABLE_LOGGER
494 /* strncpy(global_log_data.processname, GetCommandName(processname), 15); */
495 strncpy(global_log_data.processname, processname, 15);
496 global_log_data.processname[15] = 0;
497 #else /* DISABLE_LOGGER */
498 disabled_logger_processname = processname;
499 #endif /* DISABLE_LOGGER */
502 #ifndef DISABLE_LOGGER
503 /* This is called by the macro so set the location of the caller of Log */
504 make_log_func set_log_location(char *srcfilename, int srclinenumber)
506 #ifdef DEBUG_OUTPUT_TO_SCREEN
507 printf("Setting Log Location\n");
509 global_log_data.temp_src_filename = srcfilename;
510 global_log_data.temp_src_linenumber = srclinenumber;
512 return make_log_entry;
514 #endif /* DISABLE_LOGGER */
516 /* ----------------------
517 * chainsawed from ethereal
522 #define isprint(c) ((c) >= 0x20 && (c) < 0x7f)
524 static char *format_text(char *fmtbuf, const char *string)
527 const char *stringend = string + strlen(string);
532 while (string < stringend) {
539 fmtbuf[column] = '\\';
543 fmtbuf[column] = '\\';
547 fmtbuf[column] = 'a';
551 fmtbuf[column] = 'b';
555 fmtbuf[column] = 'f';
559 fmtbuf[column] = 'n';
563 fmtbuf[column] = 'r';
567 fmtbuf[column] = 't';
571 fmtbuf[column] = 'v';
576 fmtbuf[column] = i + '0';
579 fmtbuf[column] = i + '0';
582 fmtbuf[column] = i + '0';
588 fmtbuf[column] = '\0';
591 /* -------------------------------------------------------------------------
592 MakeLog has 1 main flaws:
593 The message in its entirity, must fit into the tempbuffer.
594 So it must be shorter than MAXLOGSIZE
595 ------------------------------------------------------------------------- */
596 void make_log_entry(enum loglevels loglevel, enum logtypes logtype,
600 char temp_buffer[MAXLOGSIZE];
601 char log_buffer[4*MAXLOGSIZE];
602 /* fn is not reentrant but is used in signal handler
603 * with LOGGER it's a little late source name and line number
604 * are already changed.
606 static int inlog = 0;
608 #ifndef DISABLE_LOGGER
609 char log_details_buffer[MAXLOGSIZE];
610 #ifdef OPEN_LOGS_AS_UID
613 log_file_data_pair *logs;
620 #ifndef DISABLE_LOGGER
623 logs = log_file_arr[logtype];
627 logs = log_file_arr[logtype_default];
629 #ifdef DEBUG_OUTPUT_TO_SCREEN
630 printf("Making Log\n");
633 #endif /* DISABLE_LOGGER */
635 /* Initialise the Messages */
636 va_start(args, message);
638 vsnprintf(temp_buffer, sizeof(temp_buffer), message, args);
640 /* Finished with args for now */
642 format_text(log_buffer, temp_buffer);
644 #ifdef DISABLE_LOGGER
645 syslog(get_syslog_equivalent(loglevel), "%s", log_buffer);
646 #else /* DISABLE_LOGGER */
649 /* check if sysloglevel is high enough */
650 if ((*logs)[0].log_level>=loglevel)
652 int sysloglevel = get_syslog_equivalent(loglevel);
654 generate_message_details(log_details_buffer, sizeof(log_details_buffer),
655 &(*logs)[0], loglevel, logtype);
657 #ifdef DEBUG_OUTPUT_TO_SCREEN
658 printf("About to log %s %s\n", log_details_buffer, log_buffer);
659 printf("about to do syslog\n");
660 printf("done onw syslog\n");
662 syslog(sysloglevel, "%s: %s", log_details_buffer, log_buffer);
664 syslog(sysloglevel, "%s:%s: %s", log_levelString,
665 log_typeString, LogBuffer);
671 #ifdef DEBUG_OUTPUT_TO_SCREEN
672 printf("about to do the filelog\n");
674 /* check if log_level is high enough */
675 if ((*logs)[1].log_level>=loglevel) {
677 #ifdef DEBUG_OUTPUT_TO_SCREEN
678 printf("Open the Log, FILE* is %p\n", (*logs)[1].log_file);
680 /* if log isn't open, open it */
681 if ((*logs)[1].log_file==NULL) {
682 #ifdef DEBUG_OUTPUT_TO_SCREEN
683 printf("Opening the Log, filename is %s\n", (*logs)[1].log_filename);
685 #ifdef OPEN_LOGS_AS_UID
686 process_uid = getuid();
687 setuid(OPEN_LOGS_AS_UID);
689 (*logs)[1].log_file = fopen((*logs)[1].log_filename, "at");
690 #ifdef OPEN_LOGS_AS_UID
693 if ((*logs)[1].log_file == NULL)
695 (*logs)[1].log_file = stdout;
696 LOG(log_severe, logtype_logger, "can't open Logfile %s",
697 (*logs)[1].log_filename
703 generate_message_details(log_details_buffer, sizeof(log_details_buffer),
704 &(*logs)[1], loglevel, logtype);
706 #ifdef DEBUG_OUTPUT_TO_SCREEN
707 printf("Files open, lets log\n");
708 printf("FILE* is %p\n", (*logs)[1].log_file);
709 printf("%s: %s\n", log_details_buffer, log_buffer);
712 fprintf((*logs)[1].log_file, "%s: %s\n", log_details_buffer, log_buffer);
714 #ifndef KEEP_LOGFILES_OPEN
715 if ((*logs)[1].log_file != stdout)
717 #ifdef DEBUG_OUTPUT_TO_SCREEN
718 printf("Closing %s\n", (*logs)[1].log_filename);
720 fclose((*logs)[1].log_file);
721 (*logs)[1].log_file = NULL;
722 #ifdef DEBUG_OUTPUT_TO_SCREEN
726 #else // KEEP_LOGFILES_OPEN
727 fflush((*logs)[1].log_file);
728 #endif // KEEP_LOGFILES_OPEN
732 global_log_data.temp_src_filename = NULL;
733 global_log_data.temp_src_linenumber = 0;
734 #endif /* DISABLE_LOGGER */
738 #ifndef DISABLE_LOGGER
739 void load_proccessname_from_proc()
741 pid_t pid = getpid();
742 char buffer[PATH_MAX];
747 sprintf(buffer, "/proc/%d/stat", pid);
748 statfile = fopen(buffer, "rt");
749 fgets(buffer, PATH_MAX-1, statfile);
752 ptr = (char *)strrchr(buffer, ')');
754 memset(procname, 0, sizeof procname);
755 sscanf(buffer, "%d (%15c", &pid, procname); /* comm[16] in kernel */
757 set_processname(procname);
760 /* =========================================================================
761 Internal function definitions
762 ========================================================================= */
764 static char *get_command_name(char *commandpath)
767 #ifdef DEBUG_OUTPUT_TO_SCREEN
768 printf("getting command name %s\n",commandpath);
770 ptr = (char *)strrchr(commandpath, '/');
776 #ifdef DEBUG_OUTPUT_TO_SCREEN
777 printf("Concluded %s\n", ptr);
782 void workout_what_to_print(struct what_to_print_array *what_to_print,
783 struct tag_log_file_data *log_struct)
785 /* is this a syslog entry? */
786 if (log_struct->log_filename[0]==0)
788 what_to_print->print_datetime = false;
789 what_to_print->print_processname = false;
790 what_to_print->print_pid = false;
794 what_to_print->print_datetime = true;
795 what_to_print->print_processname = true;
797 /* pid is dealt with at the syslog level if we're syslogging */
798 what_to_print->print_pid =
799 (((log_struct->display_options & logoption_pid) == 0)?false:true);
802 what_to_print->print_srcfile =
803 (((log_struct->display_options & logoption_nfile) == 0)?true:false);
804 what_to_print->print_srcline =
805 (((log_struct->display_options & logoption_nline) == 0)?true:false);
807 what_to_print->print_errlevel = true;
808 what_to_print->print_errtype = true;
811 void generate_message_details(char *message_details_buffer,
812 int message_details_buffer_length,
813 struct tag_log_file_data *log_struct,
814 enum loglevels loglevel, enum logtypes logtype)
818 char processinfo[64];
819 char log_buffer[MAXLOGSIZE];
820 const char *logtype_string;
822 char loglevel_string[12]; /* max int size is 2 billion, or 10 digits */
825 char *ptr = message_details_buffer;
827 int len = message_details_buffer_length;
830 struct what_to_print_array what_to_print;
832 workout_what_to_print(&what_to_print, log_struct);
834 #ifdef DEBUG_OUTPUT_TO_SCREEN
835 printf("Making MessageDetails\n");
844 if (what_to_print.print_datetime)
849 /* some people might prefer localtime() to gmtime() */
850 strftime(ptr, len, "%b %d %H:%M:%S", localtime(&thetime));
851 #ifdef DEBUG_OUTPUT_TO_SCREEN
852 printf("date is %s\n", ptr);
855 templen = strlen(ptr);
857 if (what_to_print.print_processname || what_to_print.print_pid)
858 strncat(ptr, " ", len);
860 strncat(ptr, ":", len);
872 if (what_to_print.print_processname)
874 strncpy(ptr, global_log_data.processname, len);
876 templen = strlen(ptr);
881 if (what_to_print.print_pid)
883 pid_t pid = getpid();
885 sprintf(ptr, "[%d]", pid);
887 templen = strlen(ptr);
892 if (what_to_print.print_srcfile || what_to_print.print_srcline)
894 char sprintf_buffer[8];
897 sprintf_buffer[0] = '[';
898 if (what_to_print.print_srcfile)
900 strcpy(&sprintf_buffer[1], "%s");
901 buff_ptr = &sprintf_buffer[3];
903 if (what_to_print.print_srcfile && what_to_print.print_srcline)
905 strcpy(&sprintf_buffer[3], ":");
906 buff_ptr = &sprintf_buffer[4];
908 if (what_to_print.print_srcline)
910 strcpy(buff_ptr, "%d");
911 buff_ptr = &buff_ptr[2];
913 strcpy(buff_ptr, "]");
916 ok sprintf string is ready, now is the 1st parameter src or linenumber
918 if (what_to_print.print_srcfile)
920 sprintf(ptr, sprintf_buffer,
921 global_log_data.temp_src_filename,
922 global_log_data.temp_src_linenumber);
926 sprintf(ptr, sprintf_buffer, global_log_data.temp_src_linenumber);
929 #ifdef DEBUG_OUTPUT_TO_SCREEN
930 printf("Process info is %s\n", ptr);
933 templen = strlen(ptr);
939 if (what_to_print.print_processname || what_to_print.print_pid ||
940 what_to_print.print_srcfile || what_to_print.print_srcline)
942 strncat(ptr, ": ", len);
948 loglevel_string[0] = 0;
949 ptr = loglevel_string;
952 if (what_to_print.print_errlevel)
954 if ((loglevel/10) >= (num_loglevel_chars-1))
956 sprintf(ptr, "%c%d", arr_loglevel_chars[num_loglevel_chars-1],
961 sprintf(ptr, "%c", arr_loglevel_chars[loglevel/10]);
964 templen = strlen(ptr);
969 if (what_to_print.print_errtype)
971 const char *logtype_string;
973 /* get string represnetation of the Log Type */
974 if (logtype<num_logtype_strings)
975 logtype_string = arr_logtype_strings[logtype];
979 if (what_to_print.print_errlevel)
981 strncat(ptr, ":", len);
985 sprintf(ptr, "%s", logtype_string);
988 message_details_buffer[message_details_buffer_length-1] = 0;
990 #ifdef DEBUG_OUTPUT_TO_SCREEN
991 printf("Message Details are %s\n", message_details_buffer);
994 #endif /* DISABLE_LOGGER */
996 int get_syslog_equivalent(enum loglevels loglevel)
1000 /* The question is we know how bad it is for us,
1001 but how should that translate in the syslogs? */
1002 case 0: /* severe */
1006 case 2: /* warning */
1010 case 4: /* information */
1012 default: /* debug */
1017 /* void setuplog(char *logsource, char *logtype, char *loglevel, char *filename) */
1018 void setuplog(char *logtype, char *loglevel, char *filename)
1020 #ifndef DISABLE_LOGGER
1021 /* -[un]setuplog <logtype> <loglevel> [<filename>]*/
1023 This should be rewritten so that somehow logsource is assumed and everything
1024 can be taken from default if needs be.
1026 /* const char* sources[] = {"syslog", "filelog"}; */
1027 int typenum, levelnum;
1028 log_file_data_pair *logs = log_file_arr[logtype_default];
1031 LOG(log_extradebug, logtype_logger, "Attempting setuplog: %s %s %s %s",
1032 logsource, logtype, loglevel, filename);
1034 LOG(log_info, logtype_logger, "setuplog is parsing logtype:%s, loglevel:%s, filename:%s",
1035 logtype, loglevel, filename);
1039 LOG(log_note, logtype_logger, "no logsource given, default is assumed");
1044 for(typenum=0;typenum<num_logtype_strings;typenum++)
1046 if (strcasecmp(logtype, arr_logtype_strings[typenum])==0)
1049 if (typenum>=num_logtype_strings)
1051 LOG(log_warning, logtype_logger, "%s is not a valid log type", logtype);
1057 LOG(log_note, logtype_logger, "no loglevel given, severe is assumed");
1062 for(levelnum=0;levelnum<num_loglevel_strings;levelnum++)
1064 if (strcasecmp(loglevel, arr_loglevel_strings[levelnum])==0)
1067 if (levelnum>=num_loglevel_strings)
1069 LOG(log_warning, logtype_logger, "%s is not a valid log level", loglevel);
1074 if ((typenum>=num_logtype_strings) || (levelnum>=num_loglevel_strings))
1076 LOG(log_warning, logtype_logger, "sanity check failed: (%s:%d), (%s:%d)",
1077 logtype, typenum, loglevel, levelnum);
1081 /* now match the order of the text string with the actual enum value (10 times) */
1084 /* is this a syslog setup or a filelog setup */
1085 if (filename==NULL) /* must be syslog */
1087 LOG(log_debug6, logtype_logger, "calling syslog_setup(%d, %d, ...)", levelnum, typenum);
1088 syslog_setup(levelnum, typenum,
1089 (*logs)[0].display_options,
1090 global_log_data.facility);
1092 else /* this must be a filelog */
1094 LOG(log_debug6, logtype_logger, "calling log_setup(%s, %d, %d, ...)", filename, levelnum, typenum);
1095 log_setup(filename, levelnum, typenum,
1096 (*logs)[0].display_options);
1099 #endif /* DISABLE_LOGGER */