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
#undef KEEP_LOGFILES_OPEN
57
#undef DEBUG_OUTPUT_TO_SCREEN
58
#undef CHECK_STAT_ON_NEW_FILES
59
#undef CHECK_ACCESS_ON_NEW_FILES
61
/* =========================================================================
62
External function declarations
63
========================================================================= */
65
/* setup the internal variables used by the logger (called automatically) */
68
/* Setup the log filename and the loglevel, and the type of log it is. */
69
bool log_setup(char *filename, enum loglevels loglevel, enum logtypes logtype,
72
/* Setup the Level and type of log that will be logged to syslog. */
73
void syslog_setup(enum loglevels loglevel, enum logtypes logtype,
74
int display_options, int facility);
76
/* finish up and close the logs */
79
/* This function sets up the processname */
80
void set_processname(char *processname);
83
void make_log(enum loglevels loglevel, enum logtypes logtype,
85
#ifndef DISABLE_LOGGER
86
make_log_func set_log_location(char *srcfilename, int srclinenumber);
88
/* =========================================================================
90
========================================================================= */
92
/* A structure containing object level stuff */
93
struct tag_log_file_data {
94
char log_filename[PATH_MAX]; /* Name of file */
95
FILE *log_file; /* FILE pointer to file */
96
enum loglevels log_level; /* Log Level to put in this file */
100
typedef struct tag_log_file_data log_file_data_pair[2];
102
/* A structure containg class level stuff */
103
struct tag_global_log_data {
106
char *temp_src_filename;
107
int temp_src_linenumber;
108
char processname[16];
111
char *log_file_directory; /* Path of directory containing log files */
112
log_file_data_pair **logs;
115
struct what_to_print_array {
117
bool print_processname;
125
/* =========================================================================
126
Internal function declarations
127
========================================================================= */
129
void generate_message_details(char *message_details_buffer,
130
int message_details_buffer_length,
131
struct tag_log_file_data *log_struct,
132
enum loglevels loglevel, enum logtypes logtype);
134
int get_syslog_equivalent(enum loglevels loglevel);
136
static char *get_command_name(char *commandpath);
138
/* =========================================================================
140
========================================================================= */
142
/* A populated instance */
144
static log_file_data_pair default_log_file_data_pair = {
146
/*log_filename:*/ "\0\0\0\0\0\0\0\0",
148
/*log_level:*/ log_debug,
149
/*display_options:*/ logoption_pid
152
/*log_filename:*/ LOGFILEPATH,
154
/*log_level:*/ log_debug,
155
/*display_options:*/ logoption_pid
158
static log_file_data_pair logger_log_file_data_pair = {
160
/*log_filename:*/ "\0\0\0\0\0\0\0\0",
162
/*log_level:*/ log_warning,
163
/*display_options:*/ logoption_pid
166
/*log_filename:*/ LOGFILEPATH,
168
/*log_level:*/ log_maxdebug,
169
/*display_options:*/ logoption_pid
172
static log_file_data_pair *log_file_data_array[logtype_end_of_list_marker] =
173
{&default_log_file_data_pair};
175
/* The class (populated) */
176
static struct tag_global_log_data global_log_data = {
177
/*struct_size:*/ sizeof(struct tag_global_log_data),
178
/*temp_src_filename:*/ NULL,
179
/*temp_src_linenumber:*/ 0,
181
/*facility:*/ logfacility_daemon,
182
/*log_file_directory:*/ "",
186
/* macro to get access to the array */
187
#define log_file_arr (global_log_data.logs)
189
/* Array to store text to list given a log type */
190
static const char * arr_logtype_strings[] = LOGTYPE_STRING_IDENTIFIERS;
191
static const int num_logtype_strings = COUNT_ARRAY(arr_logtype_strings);
193
/* Array for charachters representing log severity in the log file */
194
static const char arr_loglevel_chars[] = {'S', 'E', 'W', 'N', 'I', 'D'};
195
static const int num_loglevel_chars = COUNT_ARRAY(arr_loglevel_chars);
197
static const char * arr_loglevel_strings[] = LOGLEVEL_STRING_IDENTIFIERS;
198
static const int num_loglevel_strings = COUNT_ARRAY(arr_loglevel_strings);
200
#else /* #ifndef DISABLE_LOGGER */
201
char *disabled_logger_processname=NULL;
202
#endif /* DISABLE_LOGGER */
203
/* =========================================================================
204
Global function definitions
205
========================================================================= */
207
#ifndef DISABLE_LOGGER
209
/* remember I'm keeping a copy of the actual char * Filename, so you mustn't
210
delete it, until you've finished with the log. Also you're responsible
211
for deleting it when you have finished with it. */
214
if (global_log_data.logs==NULL)
216
/* first check default_log_file_data_pair */
218
/* next clear out the log_file_data_array */
219
memset(log_file_data_array, 0, sizeof(log_file_data_array));
220
/* now set default_log_file_data_pairs */
221
log_file_data_array[logtype_default] = &default_log_file_data_pair;
222
log_file_data_array[logtype_logger] = &logger_log_file_data_pair;
224
/* now setup the global_log_data struct */
225
global_log_data.logs = log_file_data_array;
227
/* make_log_entry(log_debug, logtype_logger, "log_init ran for the first time"); */
230
#endif /* #ifndef DISABLE_LOGGER */
232
bool log_setup(char *filename, enum loglevels loglevel, enum logtypes logtype,
235
#ifndef DISABLE_LOGGER
245
log_file_data_pair *logs;
249
logs = log_file_arr[logtype];
251
LOG(log_info, logtype_logger, "doing log_setup, type %d, level %d, filename \"%s\"", logtype, loglevel, filename);
253
/* LOG(log_extradebug+10, logtype_logger, "checking array for logtype is malloc'd"); */
254
/* has the given logtype already been assigned memory? */
257
logs = (log_file_data_pair *)malloc(sizeof(log_file_data_pair));
260
LOG(log_severe, logtype_logger, "can't calloc in log_setup");
265
memcpy(logs, log_file_arr[logtype_default], sizeof(log_file_data_pair));
267
log_file_arr[logtype] = logs;
268
(*logs)[1].log_file = NULL;
272
/* I think this checks if we're logging to stdout or not. Probably unused */
273
if ( ((*logs)[1].log_file == stdout) && ((*logs)[1].log_file != NULL) )
275
fclose((*logs)[1].log_file);
276
(*logs)[1].log_file = NULL;
279
/* check if we need to append the given filename to a directory */
280
if (strlen(global_log_data.log_file_directory)>0)
282
lastchar[0] = global_log_data.
283
log_file_directory[strlen(global_log_data.log_file_directory)-1];
285
if (lastchar[0] == '/' || lastchar[0] == '\\' || lastchar[0] == ':')
288
/* this should probably be a platform specific path separator */
296
#ifdef DEBUG_OUTPUT_TO_SCREEN
297
printf("filename is %s stored at location %p\n", (*logs)[1].log_filename,
298
(*logs)[1].log_filename);
299
#endif /* DEBUG_OUTPUT_TO_SCREEN */
300
if (filename == NULL)
302
strncpy((*logs)[1].log_filename,
303
(*(log_file_arr[0]))[1].log_filename, PATH_MAX);
307
sprintf((*logs)[1].log_filename, "%s%s%s",
308
global_log_data.log_file_directory,
311
(*logs)[1].log_level = loglevel;
312
(*logs)[1].display_options = display_options;
314
#ifdef DEBUG_OUTPUT_TO_SCREEN
315
printf("filename is %s stored at location %p\n", (*logs)[1].log_filename,
316
(*logs)[1].log_filename);
317
#endif /* DEBUG_OUTPUT_TO_SCREEN */
319
#ifdef CHECK_STAT_ON_NEW_FILES
323
#ifdef DEBUG_OUTPUT_TO_SCREEN
324
printf("about to stat file %s\n", (*logs)[1].log_filename);
326
firstattempt = stat((*logs)[1].log_filename, &statbuf);
328
if (firstattempt == -1)
330
#ifdef DEBUG_OUTPUT_TO_SCREEN
331
printf("about to call Log with %d, %d, %s, %s\n",
332
log_note, logtype_logger,
333
"can't stat Logfile",
334
(*logs)[1].log_filename
338
/* syslog(LOG_INFO, "stat failed"); */
339
LOG(log_warning, logtype_logger, "stat fails on file %s",
340
(*logs)[1].log_filename);
342
if (strlen(global_log_data.log_file_directory)>0)
344
retval = stat(global_log_data.log_file_directory, &statbuf);
347
#ifdef DEBUG_OUTPUT_TO_SCREEN
348
printf("can't stat dir either so I'm giving up\n");
350
LOG(log_severe, logtype_logger, "can't stat directory %s either",
351
global_log_data.log_file_directory);
357
#ifdef CHECK_ACCESS_ON_NEW_FILES
358
access = ((statbuf.st_uid == uid)?(statbuf.st_mode & S_IWUSR):0) +
359
((statbuf.st_gid == gid)?(statbuf.st_mode & S_IWGRP):0) +
360
(statbuf.st_mode & S_IWOTH);
364
#ifdef DEBUG_OUTPUT_TO_SCREEN
365
printf("failing with %d, %d, %s, %s\n", log_note, logtype_logger,
366
"can't access Logfile %s", (*logs)[1].log_filename);
369
LOG(log_note, logtype_logger, "can't access file %s",
370
(*logs)[1].log_filename);
373
#endif /* CHECK_ACCESS_ON_NEW_FILES */
374
#endif /* CHECK_STAT_ON_NEW_FILES */
375
#ifdef KEEP_LOGFILES_OPEN
376
if ((*logs)[1].log_file!=NULL)
377
fclose((*logs)[1].log_file);
379
(*logs)[1].log_file = fopen((*logs)[1].log_filename, "at");
380
if ((*logs)[1].log_file == NULL)
382
LOG(log_severe, logtype_logger, "can't open Logfile %s",
383
(*logs)[1].log_filename
389
LOG(log_debug7, logtype_logger, "log_file_arr[%d] now contains: "
390
"{log_filename:%s, log_file:%p, log_level: %d}", logtype,
391
(*logs)[1].log_filename, (*logs)[1].log_file, (*logs)[1].log_level);
392
LOG(log_debug, logtype_logger, "log_setup[%d] done", logtype);
394
#endif /* DISABLE_LOGGER */
399
void syslog_setup(enum loglevels loglevel, enum logtypes logtype,
400
int display_options, int facility)
402
#ifndef DISABLE_LOGGER
403
log_file_data_pair *logs;
407
logs = log_file_arr[logtype];
409
LOG(log_info, logtype_logger, "doing syslog_setup, type %d, level %d", logtype, loglevel);
413
logs = (log_file_data_pair *)malloc(sizeof(log_file_data_pair));
416
LOG(log_severe, logtype_logger, "can't calloc in log_setup");
420
memcpy(logs, log_file_arr[logtype_default], sizeof(log_file_data_pair));
421
log_file_arr[logtype] = logs;
425
(*logs)[0].log_file = NULL;
426
(*logs)[0].log_filename[0] = 0;
427
(*logs)[0].log_level = loglevel;
428
(*logs)[0].display_options = display_options;
429
global_log_data.facility = facility;
431
openlog(global_log_data.processname, (*logs)[0].display_options,
432
global_log_data.facility);
434
LOG(log_debug7, logtype_logger, "log_file_arr[%d] now contains: "
435
"{log_filename:%s, log_file:%p, log_level: %d}", logtype,
436
(*logs)[0].log_filename, (*logs)[0].log_file, (*logs)[0].log_level);
437
LOG(log_debug, logtype_logger, "syslog_setup[%d] done", logtype);
438
#else /* DISABLE_LOGGER */
439
/* behave like a normal openlog call */
440
openlog(disabled_logger_processname, display_options, facility);
441
#endif /* DISABLE_LOGGER */
446
#ifndef DISABLE_LOGGER
447
log_file_data_pair *logs;
450
LOG(log_info, logtype_logger, "log_close called");
452
for(n=(sizeof(log_file_arr)-1);n>0;n--)
454
logs = log_file_arr[n];
455
#ifdef KEEP_LOGFILES_OPEN
456
if ((*logs)[1].log_file!=NULL)
457
fclose((*logs)[1].log_file);
458
#endif /* KEEP_LOGFILES_OPEN */
461
LOG(log_debug, logtype_logger, "freeing log entry at %d", n);
462
#ifdef DEBUG_OUTPUT_TO_SCREEN
463
printf("Freeing log_data %d, stored at %p\n", n, logs);
464
printf("\t(filename) %s\t(type) %s\n", (*logs)[1].log_filename,
465
((n<num_logtype_strings)?arr_logtype_strings[n]:""));
466
#endif /* DEBUG_OUTPUT_TO_SCREEN */
469
log_file_arr[n] = NULL;
471
#ifdef DEBUG_OUTPUT_TO_SCREEN
472
printf("Freeing log_data %d, stored at %p\n", n, log_file_arr[n]);
473
printf("\t(filename) %s\t(type) %s\n",
474
(*(log_file_arr[n]))[1].log_filename,
475
((n<num_logtype_strings)?arr_logtype_strings[n]:"")
477
#endif /* DEBUG_OUTPUT_TO_SCREEN */
478
#endif /* DISABLE_LOGGER */
480
LOG(log_debug, logtype_logger, "log_close done");
485
/* This function sets up the processname */
486
void set_processname(char *processname)
488
#ifndef DISABLE_LOGGER
489
/* strncpy(global_log_data.processname, GetCommandName(processname), 15); */
490
strncpy(global_log_data.processname, processname, 15);
491
global_log_data.processname[15] = 0;
492
#else /* DISABLE_LOGGER */
493
disabled_logger_processname = processname;
494
#endif /* DISABLE_LOGGER */
497
#ifndef DISABLE_LOGGER
498
/* This is called by the macro so set the location of the caller of Log */
499
make_log_func set_log_location(char *srcfilename, int srclinenumber)
501
#ifdef DEBUG_OUTPUT_TO_SCREEN
502
printf("Setting Log Location\n");
504
global_log_data.temp_src_filename = srcfilename;
505
global_log_data.temp_src_linenumber = srclinenumber;
507
return make_log_entry;
509
#endif /* DISABLE_LOGGER */
511
/* -------------------------------------------------------------------------
512
MakeLog has 1 main flaws:
513
The message in its entirity, must fit into the tempbuffer.
514
So it must be shorter than MAXLOGSIZE
515
------------------------------------------------------------------------- */
516
void make_log_entry(enum loglevels loglevel, enum logtypes logtype,
520
char log_buffer[MAXLOGSIZE];
521
#ifndef DISABLE_LOGGER
522
char log_details_buffer[MAXLOGSIZE];
524
log_file_data_pair *logs;
527
/* fn is not reentrant but is used in signal handler
528
* with LOGGER it's a little late source name and line number
529
* are already changed.
531
static int inlog = 0;
537
#ifndef DISABLE_LOGGER
540
logs = log_file_arr[logtype];
544
logs = log_file_arr[logtype_default];
546
#ifdef DEBUG_OUTPUT_TO_SCREEN
547
printf("Making Log\n");
550
#endif /* DISABLE_LOGGER */
552
/* Initialise the Messages */
553
va_start(args, message);
555
vsnprintf(log_buffer, sizeof(log_buffer), message, args);
557
/* Finished with args for now */
560
#ifdef DISABLE_LOGGER
561
syslog(get_syslog_equivalent(loglevel), "%s", log_buffer);
562
#else /* DISABLE_LOGGER */
565
/* check if sysloglevel is high enough */
566
if ((*logs)[0].log_level>=loglevel)
568
int sysloglevel = get_syslog_equivalent(loglevel);
570
generate_message_details(log_details_buffer, sizeof(log_details_buffer),
571
&(*logs)[0], loglevel, logtype);
573
#ifdef DEBUG_OUTPUT_TO_SCREEN
574
printf("About to log %s %s\n", log_details_buffer, log_buffer);
575
printf("about to do syslog\n");
576
printf("done onw syslog\n");
578
syslog(sysloglevel, "%s: %s", log_details_buffer, log_buffer);
580
syslog(sysloglevel, "%s:%s: %s", log_levelString,
581
log_typeString, LogBuffer);
587
#ifdef DEBUG_OUTPUT_TO_SCREEN
588
printf("about to do the filelog\n");
590
/* check if log_level is high enough */
591
if ((*logs)[1].log_level>=loglevel) {
593
#ifdef DEBUG_OUTPUT_TO_SCREEN
594
printf("Open the Log, FILE* is %p\n", (*logs)[1].log_file);
596
/* if log isn't open, open it */
597
if ((*logs)[1].log_file==NULL) {
598
#ifdef DEBUG_OUTPUT_TO_SCREEN
599
printf("Opening the Log, filename is %s\n", (*logs)[1].log_filename);
601
(*logs)[1].log_file = fopen((*logs)[1].log_filename, "at");
602
if ((*logs)[1].log_file == NULL)
604
(*logs)[1].log_file = stdout;
605
LOG(log_severe, logtype_logger, "can't open Logfile %s",
606
(*logs)[1].log_filename
612
generate_message_details(log_details_buffer, sizeof(log_details_buffer),
613
&(*logs)[1], loglevel, logtype);
615
#ifdef DEBUG_OUTPUT_TO_SCREEN
616
printf("Files open, lets log\n");
617
printf("FILE* is %p\n", (*logs)[1].log_file);
618
printf("%s: %s\n", log_details_buffer, log_buffer);
621
fprintf((*logs)[1].log_file, "%s: %s\n", log_details_buffer, log_buffer);
623
#ifndef KEEP_LOGFILES_OPEN
624
if ((*logs)[1].log_file != stdout)
626
#ifdef DEBUG_OUTPUT_TO_SCREEN
627
printf("Closing %s\n", (*logs)[1].log_filename);
629
fclose((*logs)[1].log_file);
630
(*logs)[1].log_file = NULL;
631
#ifdef DEBUG_OUTPUT_TO_SCREEN
639
global_log_data.temp_src_filename = NULL;
640
global_log_data.temp_src_linenumber = 0;
641
#endif /* DISABLE_LOGGER */
645
#ifndef DISABLE_LOGGER
646
void load_proccessname_from_proc()
648
pid_t pid = getpid();
649
char buffer[PATH_MAX];
654
sprintf(buffer, "/proc/%d/stat", pid);
655
statfile = fopen(buffer, "rt");
656
fgets(buffer, PATH_MAX-1, statfile);
659
ptr = (char *)strrchr(buffer, ')');
661
memset(procname, 0, sizeof procname);
662
sscanf(buffer, "%d (%15c", &pid, procname); /* comm[16] in kernel */
664
set_processname(procname);
667
/* =========================================================================
668
Internal function definitions
669
========================================================================= */
671
static char *get_command_name(char *commandpath)
674
#ifdef DEBUG_OUTPUT_TO_SCREEN
675
printf("getting command name %s\n",commandpath);
677
ptr = (char *)strrchr(commandpath, '/');
683
#ifdef DEBUG_OUTPUT_TO_SCREEN
684
printf("Concluded %s\n", ptr);
689
void workout_what_to_print(struct what_to_print_array *what_to_print,
690
struct tag_log_file_data *log_struct)
692
/* is this a syslog entry? */
693
if (log_struct->log_filename[0]==0)
695
what_to_print->print_datetime = false;
696
what_to_print->print_processname = false;
697
what_to_print->print_pid = false;
701
what_to_print->print_datetime = true;
702
what_to_print->print_processname = true;
704
/* pid is dealt with at the syslog level if we're syslogging */
705
what_to_print->print_pid =
706
(((log_struct->display_options & logoption_pid) == 0)?false:true);
709
what_to_print->print_srcfile =
710
(((log_struct->display_options & logoption_nfile) == 0)?true:false);
711
what_to_print->print_srcline =
712
(((log_struct->display_options & logoption_nline) == 0)?true:false);
714
what_to_print->print_errlevel = true;
715
what_to_print->print_errtype = true;
718
void generate_message_details(char *message_details_buffer,
719
int message_details_buffer_length,
720
struct tag_log_file_data *log_struct,
721
enum loglevels loglevel, enum logtypes logtype)
724
char processinfo[64];
726
char *ptr = message_details_buffer;
728
int len = message_details_buffer_length;
730
char log_buffer[MAXLOGSIZE];
731
const char *logtype_string;
733
char loglevel_string[12]; /* max int size is 2 billion, or 10 digits */
735
struct what_to_print_array what_to_print;
737
workout_what_to_print(&what_to_print, log_struct);
739
#ifdef DEBUG_OUTPUT_TO_SCREEN
740
printf("Making MessageDetails\n");
749
if (what_to_print.print_datetime)
754
/* some people might prefer localtime() to gmtime() */
755
strftime(ptr, len, "%b %d %H:%M:%S", localtime(&thetime));
756
#ifdef DEBUG_OUTPUT_TO_SCREEN
757
printf("date is %s\n", ptr);
760
templen = strlen(ptr);
762
if (what_to_print.print_processname || what_to_print.print_pid)
763
strncat(ptr, " ", len);
765
strncat(ptr, ":", len);
777
if (what_to_print.print_processname)
779
strncpy(ptr, global_log_data.processname, len);
781
templen = strlen(ptr);
786
if (what_to_print.print_pid)
788
pid_t pid = getpid();
790
sprintf(ptr, "[%d]", pid);
792
templen = strlen(ptr);
797
if (what_to_print.print_srcfile || what_to_print.print_srcline)
799
char sprintf_buffer[8];
802
sprintf_buffer[0] = '[';
803
if (what_to_print.print_srcfile)
805
strcpy(&sprintf_buffer[1], "%s");
806
buff_ptr = &sprintf_buffer[3];
808
if (what_to_print.print_srcfile && what_to_print.print_srcline)
810
strcpy(&sprintf_buffer[3], ":");
811
buff_ptr = &sprintf_buffer[4];
813
if (what_to_print.print_srcline)
815
strcpy(buff_ptr, "%d");
816
buff_ptr = &buff_ptr[2];
818
strcpy(buff_ptr, "]");
821
ok sprintf string is ready, now is the 1st parameter src or linenumber
823
if (what_to_print.print_srcfile)
825
sprintf(ptr, sprintf_buffer,
826
global_log_data.temp_src_filename,
827
global_log_data.temp_src_linenumber);
831
sprintf(ptr, sprintf_buffer, global_log_data.temp_src_linenumber);
834
#ifdef DEBUG_OUTPUT_TO_SCREEN
835
printf("Process info is %s\n", ptr);
838
templen = strlen(ptr);
844
if (what_to_print.print_processname || what_to_print.print_pid ||
845
what_to_print.print_srcfile || what_to_print.print_srcline)
847
strncat(ptr, ": ", len);
853
loglevel_string[0] = 0;
854
ptr = loglevel_string;
857
if (what_to_print.print_errlevel)
859
if ((loglevel/10) >= (num_loglevel_chars-1))
861
sprintf(ptr, "%c%d", arr_loglevel_chars[num_loglevel_chars-1],
866
sprintf(ptr, "%c", arr_loglevel_chars[loglevel/10]);
869
templen = strlen(ptr);
874
if (what_to_print.print_errtype)
876
const char *logtype_string;
878
/* get string represnetation of the Log Type */
879
if (logtype<num_logtype_strings)
880
logtype_string = arr_logtype_strings[logtype];
884
if (what_to_print.print_errlevel)
886
strncat(ptr, ":", len);
890
sprintf(ptr, "%s", logtype_string);
893
message_details_buffer[message_details_buffer_length-1] = 0;
895
#ifdef DEBUG_OUTPUT_TO_SCREEN
896
printf("Message Details are %s\n", message_details_buffer);
899
#endif /* DISABLE_LOGGER */
901
int get_syslog_equivalent(enum loglevels loglevel)
905
/* The question is we know how bad it is for us,
906
but how should that translate in the syslogs? */
911
case 2: /* warning */
915
case 4: /* information */
922
/* void setuplog(char *logsource, char *logtype, char *loglevel, char *filename) */
923
void setuplog(char *logtype, char *loglevel, char *filename)
925
#ifndef DISABLE_LOGGER
926
/* -[un]setuplog <logtype> <loglevel> [<filename>]*/
928
This should be rewritten so that somehow logsource is assumed and everything
929
can be taken from default if needs be.
931
/* const char* sources[] = {"syslog", "filelog"}; */
932
const char *null = "";
933
int sourcenum, typenum, levelnum;
934
log_file_data_pair *logs = log_file_arr[logtype_default];
937
LOG(log_extradebug, logtype_logger, "Attempting setuplog: %s %s %s %s",
938
logsource, logtype, loglevel, filename);
940
LOG(log_info, logtype_logger, "setuplog is parsing logtype:%s, loglevel:%s, filename:%s",
941
logtype, loglevel, filename);
945
LOG(log_note, logtype_logger, "no logsource given, default is assumed");
950
for(typenum=0;typenum<num_logtype_strings;typenum++)
952
if (strcasecmp(logtype, arr_logtype_strings[typenum])==0)
955
if (typenum>=num_logtype_strings)
957
LOG(log_warning, logtype_logger, "%s is not a valid log type", logtype);
963
LOG(log_note, logtype_logger, "no loglevel given, severe is assumed");
968
for(levelnum=0;levelnum<num_loglevel_strings;levelnum++)
970
if (strcasecmp(loglevel, arr_loglevel_strings[levelnum])==0)
973
if (levelnum>=num_loglevel_strings)
975
LOG(log_warning, logtype_logger, "%s is not a valid log level", loglevel);
980
if ((typenum>=num_logtype_strings) || (levelnum>=num_loglevel_strings))
982
LOG(log_warning, logtype_logger, "sanity check failed: (%s:%d), (%s:%d)",
983
logtype, typenum, loglevel, levelnum);
987
/* now match the order of the text string with the actual enum value (10 times) */
990
/* is this a syslog setup or a filelog setup */
991
if (filename==NULL) /* must be syslog */
993
LOG(log_debug6, logtype_logger, "calling syslog_setup(%d, %d, ...)", levelnum, typenum);
994
syslog_setup(levelnum, typenum,
995
(*logs)[0].display_options,
996
global_log_data.facility);
998
else /* this must be a filelog */
1000
LOG(log_debug6, logtype_logger, "calling log_setup(%s, %d, %d, ...)", filename, levelnum, typenum);
1001
log_setup(filename, levelnum, typenum,
1002
(*logs)[0].display_options);
1005
#endif /* DISABLE_LOGGER */