- Fixes 2 shutdown problems
[mirror/scst/.git] / iscsi-scst / usr / log.c
1 /*
2  *  Copyright (C) 2002-2003 Ardis Technolgies <roman@ardistech.com>
3  *  Copyright (C) 2007 Vladislav Bolkhovitin
4  *  Copyright (C) 2007 CMS Distribution Limited
5  * 
6  *  This program is free software; you can redistribute it and/or
7  *  modify it under the terms of the GNU General Public License
8  *  as published by the Free Software Foundation, version 2
9  *  of the License.
10  * 
11  *  This program is distributed in the hope that it will be useful,
12  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
13  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14  *  GNU General Public License for more details.
15  */
16
17 #include <ctype.h>
18 #include <stdarg.h>
19 #include <stdio.h>
20 #include <syslog.h>
21 #include <sys/time.h>
22 #include <string.h>
23
24 #include "iscsid.h"
25
26 int log_daemon = 1;
27 int log_level = 0;
28
29 void log_init(void)
30 {
31         if (log_daemon)
32                 openlog("iscsi-scstd", 0, LOG_DAEMON);
33 }
34
35 static void dolog(int prio, const char *fmt, va_list ap)
36 {
37         if (log_daemon) {
38                 int len = strlen(fmt);
39                 char f[len+1+1];
40                 if (fmt[len] != '\n')
41                         sprintf(f, "%s\n", fmt);
42                 else
43                         sprintf(f, "%s", fmt);
44                 vsyslog(prio, f, ap);
45         } else {
46                 struct timeval time;
47
48                 gettimeofday(&time, NULL);
49                 fprintf(stderr, "%ld.%06ld: ", time.tv_sec, time.tv_usec);
50                 vfprintf(stderr, fmt, ap);
51                 fprintf(stderr, "\n");
52                 fflush(stderr);
53         }
54 }
55
56 void log_info(const char *fmt, ...)
57 {
58         va_list ap;
59         va_start(ap, fmt);
60         dolog(LOG_INFO, fmt, ap);
61         va_end(ap);
62 }
63
64 void log_warning(const char *fmt, ...)
65 {
66         va_list ap;
67         va_start(ap, fmt);
68         dolog(LOG_WARNING, fmt, ap);
69         va_end(ap);
70 }
71
72 void log_error(const char *fmt, ...)
73 {
74         va_list ap;
75         va_start(ap, fmt);
76         dolog(LOG_ERR, fmt, ap);
77         va_end(ap);
78 }
79
80 void log_debug(int level, const char *fmt, ...)
81 {
82         if (log_level > level) {
83                 va_list ap;
84                 va_start(ap, fmt);
85                 dolog(LOG_DEBUG, fmt, ap);
86                 va_end(ap);
87         }
88 }
89
90 static void __dump_line(int level, unsigned char *buf, int *cp)
91 {
92         char line[16*3+5], *lp = line;
93         int i, cnt;
94
95         cnt = *cp;
96         if (!cnt)
97                 return;
98         for (i = 0; i < 16; i++) {
99                 if (i < cnt)
100                         lp += sprintf(lp, " %02x", buf[i]);
101                 else
102                         lp += sprintf(lp, "   ");
103                 if ((i % 4) == 3)
104                         lp += sprintf(lp, " |");
105                 if (i >= cnt || !isprint(buf[i]))
106                         buf[i] =  ' ';
107         }
108         log_debug(level, "%s %.16s |", line, buf);
109         *cp = 0;
110 }
111
112 static void __dump_char(int level, unsigned char *buf, int *cp, int ch)
113 {
114         int cnt = (*cp)++;
115
116         buf[cnt] = ch;
117         if (cnt == 15)
118                 __dump_line(level, buf, cp);
119 }
120
121 #define dump_line() __dump_line(level, char_buf, &char_cnt)
122 #define dump_char(ch) __dump_char(level, char_buf, &char_cnt, ch)
123
124 void log_pdu(int level, struct PDU *pdu)
125 {
126         unsigned char char_buf[16];
127         int char_cnt = 0;
128         unsigned char *buf;
129         int i;
130         return;
131
132         if (log_level <= level)
133                 return;
134
135         buf = (void *)&pdu->bhs;
136         log_debug(level, "BHS: (%p)", buf);
137         for (i = 0; i < BHS_SIZE; i++)
138                 dump_char(*buf++);
139         dump_line();
140
141         buf = (void *)pdu->ahs;
142         log_debug(level, "AHS: (%p)", buf);
143         for (i = 0; i < pdu->ahssize; i++)
144                 dump_char(*buf++);
145         dump_line();
146
147         buf = (void *)pdu->data;
148         log_debug(level, "Data: (%p)", buf);
149         for (i = 0; i < pdu->datasize; i++)
150                 dump_char(*buf++);
151         dump_line();
152 }