83
short int logg_verbose = 0, logg_nowarn = 0, logg_lock = 1, logg_time = 0, logg_foreground = 1, logg_noflush = 0;
84
unsigned int logg_size = 0;
73
short int logg_verbose = 0, logg_lock = 1, logg_time = 0, logg_foreground = 1;
85
75
const char *logg_file = NULL;
86
76
#if defined(USE_SYSLOG) && !defined(C_AIX)
90
80
short int mprintf_disabled = 0, mprintf_verbose = 0, mprintf_quiet = 0,
91
mprintf_stdout = 0, mprintf_nowarn = 0, mprintf_send_timeout = 100;
93
#define ARGLEN(args, str, len) \
95
size_t arglen = 1, i; \
97
va_start(args, str); \
99
for(i = 0; i < len - 1; i++) { \
100
if(str[i] == '%') { \
103
pt = va_arg(args, char *); \
105
arglen += strlen(pt); \
108
va_arg(args, double); \
112
va_arg(args, long); \
126
83
int mdprintf(int desc, const char *str, ...)
129
char buffer[512], *abuffer = NULL, *buff;
130
int bytes, todo, ret=0;
133
ARGLEN(args, str, len);
134
if(len <= sizeof(buffer)) {
135
len = sizeof(buffer);
138
abuffer = malloc(len);
140
len = sizeof(buffer);
146
89
va_start(args, str);
147
bytes = vsnprintf(buff, len, str, args);
90
bytes = vsnprintf(buff, sizeof(buff), str, args);
152
if(len > sizeof(buffer))
156
if((size_t) bytes >= len)
160
#ifdef CL_THREAD_SAFE
161
/* make sure we don't mix sends from multiple threads,
162
* important for IDSESSION */
163
pthread_mutex_lock(&mdprintf_mutex);
166
ret = send(desc, buff, bytes, 0);
169
if (errno != EWOULDBLOCK)
171
/* didn't send anything yet */
172
#ifdef CL_THREAD_SAFE
173
pthread_mutex_unlock(&mdprintf_mutex);
176
tv.tv_usec = mprintf_send_timeout*1000;
181
ret = select(desc+1, NULL, &wfds, NULL, &tv);
182
} while (ret < 0 && errno == EINTR);
183
#ifdef CL_THREAD_SAFE
184
pthread_mutex_lock(&mdprintf_mutex);
196
#ifdef CL_THREAD_SAFE
197
pthread_mutex_unlock(&mdprintf_mutex);
200
if(len > sizeof(buffer))
203
return ret < 0 ? -1 : bytes;
96
if(bytes >= (int) sizeof(buff))
97
bytes = sizeof(buff) - 1;
99
return send(desc, buff, bytes, 0);
206
void logg_close(void)
102
void logg_close(void) {
104
#ifdef CL_THREAD_SAFE
105
pthread_mutex_lock(&logg_mutex);
111
#ifdef CL_THREAD_SAFE
112
pthread_mutex_unlock(&logg_mutex);
208
115
#if defined(USE_SYSLOG) && !defined(C_AIX)
213
#ifdef CL_THREAD_SAFE
214
pthread_mutex_lock(&logg_mutex);
220
#ifdef CL_THREAD_SAFE
221
pthread_mutex_unlock(&logg_mutex);
230
* # - normal, not foreground (logfile and syslog only)
235
* Default Foreground LogVerbose Debug Syslog
236
* ! yes mprintf yes yes LOG_ERR
237
* ^ yes mprintf yes yes LOG_WARNING
238
* ~ yes mprintf yes yes LOG_INFO
239
* # yes no yes yes LOG_INFO
240
* * no mprintf yes yes LOG_DEBUG
241
* $ no mprintf no yes LOG_DEBUG
242
* none yes mprintf yes yes LOG_INFO
244
122
int logg(const char *str, ...)
124
va_list args, argscpy, argsout;
250
char buffer[1025], *abuffer = NULL, *buff;
126
char *pt, *timestr, vbuff[1025];
253
129
mode_t old_umask;
256
if ((*str == '$' && logg_verbose < 2) ||
257
(*str == '*' && !logg_verbose))
260
ARGLEN(args, str, len);
261
if(len <= sizeof(buffer)) {
262
len = sizeof(buffer);
265
abuffer = malloc(len);
267
len = sizeof(buffer);
273
132
va_start(args, str);
274
vsnprintf(buff, len, str, args);
133
/* va_copy is less portable so we just use va_start once more */
134
va_start(argscpy, str);
135
va_start(argsout, str);
278
137
#ifdef CL_THREAD_SAFE
279
138
pthread_mutex_lock(&logg_mutex);
283
142
old_umask = umask(0037);
284
if((logg_fp = fopen(logg_file, "at")) == NULL) {
143
if((logg_fd = fopen(logg_file, "a")) == NULL) {
285
144
umask(old_umask);
286
145
#ifdef CL_THREAD_SAFE
287
146
pthread_mutex_unlock(&logg_mutex);
289
148
printf("ERROR: Can't open %s in append mode (check permissions!).\n", logg_file);
290
if(len > sizeof(buffer))
293
150
} else umask(old_umask);
297
153
memset(&fl, 0, sizeof(fl));
298
154
fl.l_type = F_WRLCK;
299
if(fcntl(fileno(logg_fp), F_SETLK, &fl) == -1) {
301
if(errno == EOPNOTSUPP)
302
printf("WARNING: File locking not supported (NFS?)\n");
155
if(fcntl(fileno(logg_fd), F_SETLK, &fl) == -1) {
306
156
#ifdef CL_THREAD_SAFE
307
pthread_mutex_unlock(&logg_mutex);
157
pthread_mutex_unlock(&logg_mutex);
309
printf("ERROR: %s is locked by another process\n", logg_file);
310
if(len > sizeof(buffer))
320
165
if(stat(logg_file, &sb) != -1) {
321
if((unsigned int) sb.st_size > logg_size) {
166
if(sb.st_size > logg_size) {
322
167
logg_file = NULL;
323
fprintf(logg_fp, "Log size = %u, max = %u\n", (unsigned int) sb.st_size, logg_size);
324
fprintf(logg_fp, "LOGGING DISABLED (Maximal log file size exceeded).\n");
168
fprintf(logg_fd, "Log size = %d, maximal = %d\n", (int) sb.st_size, logg_size);
169
fprintf(logg_fd, "LOGGING DISABLED (Maximal log file size exceeded).\n");
332
char flush = !logg_noflush;
333
177
/* Need to avoid logging time for verbose messages when logverbose
334
178
is not set or we get a bunch of timestamps in the log without
336
if(logg_time && ((*buff != '*') || logg_verbose)) {
180
if(logg_time && ((*str != '*') || logg_verbose)) {
339
cli_ctime(&currtime, timestr, sizeof(timestr));
340
/* cut trailing \n */
341
timestr[strlen(timestr)-1] = '\0';
342
fprintf(logg_fp, "%s -> ", timestr);
182
pt = ctime(&currtime);
183
timestr = mcalloc(strlen(pt), sizeof(char));
184
strncpy(timestr, pt, strlen(pt) - 1);
185
fprintf(logg_fd, "%s -> ", timestr);
346
fprintf(logg_fp, "ERROR: %s", buff + 1);
348
} else if(*buff == '^') {
350
fprintf(logg_fp, "WARNING: %s", buff + 1);
352
} else if(*buff == '*' || *buff == '$') {
353
fprintf(logg_fp, "%s", buff + 1);
354
} else if(*buff == '#' || *buff == '~') {
355
fprintf(logg_fp, "%s", buff + 1);
357
fprintf(logg_fp, "%s", buff);
191
fprintf(logg_fd, "ERROR: ");
192
vfprintf(logg_fd, str + 1, args);
193
} else if(*str == '^') {
194
fprintf(logg_fd, "WARNING: ");
195
vfprintf(logg_fd, str + 1, args);
196
} else if(*str == '*') {
198
vfprintf(logg_fd, str + 1, args);
199
} else if(*str == '#') {
200
vfprintf(logg_fd, str + 1, args);
201
} else vfprintf(logg_fd, str, args);
364
208
#if defined(USE_SYSLOG) && !defined(C_AIX)
365
209
if(logg_syslog) {
367
syslog(LOG_ERR, "%s", buff + 1);
368
} else if(buff[0] == '^') {
370
syslog(LOG_WARNING, "%s", buff + 1);
371
} else if(buff[0] == '*' || buff[0] == '$') {
372
syslog(LOG_DEBUG, "%s", buff + 1);
373
} else if(buff[0] == '#' || buff[0] == '~') {
374
syslog(LOG_INFO, "%s", buff + 1);
375
} else syslog(LOG_INFO, "%s", buff);
211
vsnprintf(vbuff, 1024, str, argscpy);
214
if(vbuff[0] == '!') {
215
syslog(LOG_ERR, "%s", vbuff + 1);
216
} else if(vbuff[0] == '^') {
217
syslog(LOG_WARNING, "%s", vbuff + 1);
218
} else if(vbuff[0] == '*') {
220
syslog(LOG_DEBUG, "%s", vbuff + 1);
222
} else if(vbuff[0] == '#') {
223
syslog(LOG_INFO, "%s", vbuff + 1);
224
} else syslog(LOG_INFO, "%s", vbuff);
380
229
if(logg_foreground) {
231
vsnprintf(vbuff, 1024, str, argsout);
234
mprintf("%s", vbuff);
385
237
#ifdef CL_THREAD_SAFE
386
238
pthread_mutex_unlock(&logg_mutex);
389
if(len > sizeof(buffer))