Initial revision
[freeradius.git] / src / main / log.c
1 /*
2  * log.c        Logging module.
3  *
4  */
5
6 char log_sccsid[] =
7 "@(#)log.c      1.3 Copyright 1999 Cistron Internet Services B.V,";
8
9 #include        "autoconf.h"
10
11 #include        <stdio.h>
12 #include        <stdlib.h>
13 #include        <string.h>
14 #include        <unistd.h>
15 #include        <stdarg.h>
16 #include        <time.h>
17 #include        "radiusd.h"
18
19 extern char     *radlog_dir;
20
21
22 /*
23  *      Log the message to the logfile. Include the severity and
24  *      a time stamp.
25  */
26 static int do_log(int lvl, char *fmt, va_list ap)
27 {
28         FILE    *msgfd;
29         unsigned char   *s = ": ";
30         char    buffer[2048];
31         time_t  timeval;
32         int     len;
33
34         if ((lvl & L_CONS) || radlog_dir == NULL || debug_flag) {
35                 lvl &= ~L_CONS;
36                 if (!debug_flag) fprintf(stderr, "%s: ", progname);
37                 vfprintf(stderr, fmt, ap);
38                 fprintf(stderr, "\n");
39         }
40         if (radlog_dir == NULL || debug_flag) return 0;
41
42         if (strcmp(radlog_dir, "stdout") != 0) {
43                 sprintf(buffer, "%s/%s", radlog_dir, RADIUS_LOG);
44                 if((msgfd = fopen(buffer, "a")) == NULL) {
45                         fprintf(stderr, "%s: Couldn't open %s for logging\n",
46                                         progname, buffer);
47                         return -1;
48                 }
49         } else {
50                 msgfd = stdout;
51         }
52
53         timeval = time(0);
54         strcpy(buffer, ctime(&timeval));
55         switch(lvl) {
56                 case L_DBG:
57                         s = ": Debug: ";
58                         break;
59                 case L_AUTH:
60                         s = ": Auth: ";
61                         break;
62                 case L_PROXY:
63                         s = ": Proxy: ";
64                         break;
65                 case L_INFO:
66                         s = ": Info: ";
67                         break;
68                 case L_ERR:
69                         s = ": Error: ";
70                         break;
71         }
72         strcpy(buffer + 24, s);
73         len = strlen(buffer);
74
75         vsprintf(buffer + len, fmt, ap);
76
77         /*
78          *      Filter out characters not in Latin-1.
79          */
80         for (s = buffer; *s; s++) {
81                 if (*s == '\r' || *s == '\n')
82                         *s = ' ';
83                 else if (*s < 32 || (*s >= 128 && *s <= 160))
84                         *s = '?';
85         }
86         strcat(buffer, "\n");
87
88         fputs(buffer, msgfd);
89         if (msgfd != stdout) fclose(msgfd);
90
91         return 0;
92 }
93
94 int log_debug(char *msg, ...)
95 {
96         va_list ap;
97         int r;
98
99         va_start(ap, msg);
100         r = do_log(L_DBG, msg, ap);
101         va_end(ap);
102
103         return r;
104 }
105
106 int log(int lvl, char *msg, ...)
107 {
108         va_list ap;
109         int r;
110
111         va_start(ap, msg);
112         r = do_log(lvl, msg, ap);
113         va_end(ap);
114
115         return r;
116 }
117