00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044
00045
00046
00047
00048
00049
00050
00051
00052
00053
00054
00055
00056
00057
00058
00059
00060
00086 #include <cfg/syslog.h>
00087 #include <sys/confos.h>
00088 #include <sys/confnet.h>
00089
00090 #include <stdlib.h>
00091 #include <string.h>
00092 #include <stdio.h>
00093 #include <stdarg.h>
00094 #include <io.h>
00095 #include <time.h>
00096 #include <memdebug.h>
00097
00098 #define SYSLOG_INTERNAL
00099 #include <sys/syslog.h>
00100
00101 #ifndef SYSLOG_PERROR_ONLY
00102
00103 #include <sys/socket.h>
00104 #include <arpa/inet.h>
00105 static UDPSOCKET *syslog_sock;
00106
00107 #ifndef SYSLOG_PORT
00108 #define SYSLOG_PORT 514
00109 #endif
00110
00111 static uint32_t syslog_server;
00112 static uint16_t syslog_port = SYSLOG_PORT;
00113
00114 #endif
00115
00120
00121 static int syslog_fac = LOG_USER;
00122 static int syslog_mask = 0xFF;
00123
00124 static int syslog_stat;
00125 static size_t syslog_taglen;
00126 static char *syslog_tag;
00127 char *syslog_buf;
00128
00138 size_t syslog_header(int pri)
00139 {
00140 size_t rc;
00141
00142
00143 pri &= LOG_PRIMASK | LOG_FACMASK;
00144
00145
00146 if ((LOG_MASK(LOG_PRI(pri)) & syslog_mask) == 0) {
00147 return 0;
00148 }
00149
00150
00151 if ((pri & LOG_FACMASK) == 0) {
00152 pri |= syslog_fac;
00153 }
00154
00155
00156 if (syslog_buf == 0) {
00157 openlog(0, syslog_stat | LOG_NDELAY, syslog_fac);
00158 }
00159
00160
00161
00162 rc = sprintf(syslog_buf, "<%d>", pri);
00163
00164
00165
00166 #ifdef SYSLOG_RFC5424
00167 syslog_buf[rc++] = '1';
00168 #endif
00169
00170
00171 #ifdef SYSLOG_OMIT_TIMESTAMP
00172
00173 #ifdef SYSLOG_RFC5424
00174 syslog_buf[rc++] = ' ';
00175 syslog_buf[rc++] = '-';
00176 #endif
00177
00178 #else
00179 {
00180 time_t now;
00181 struct _tm *tip;
00182
00183 time(&now);
00184
00185 #ifdef SYSLOG_RFC5424
00186 tip = gmtime(&now);
00187 rc += sprintf(&syslog_buf[rc], " %04d-%02d-%02dT%02d:%02d:%02dZ",
00188 tip->tm_year + 1900, tip->tm_mon + 1, tip->tm_mday,
00189 tip->tm_hour, tip->tm_min, tip->tm_sec);
00190 #else
00191 {
00192 static char mon_name[] = "JanFebMarAprMayJunJulAugSepOctNovDec";
00193
00194 tip = localtime(&now);
00195 rc += sprintf(&syslog_buf[rc], "%.3s%3d %02d:%02d:%02d",
00196 &mon_name[tip->tm_mon * 3], tip->tm_mday,
00197 tip->tm_hour, tip->tm_min, tip->tm_sec);
00198 }
00199 #endif
00200
00201 }
00202 #endif
00203
00204
00205 #ifdef SYSLOG_OMIT_HOSTNAME
00206
00207 #ifdef SYSLOG_RFC5424
00208 syslog_buf[rc++] = ' ';
00209 syslog_buf[rc++] = '-';
00210 #endif
00211
00212 #else
00213
00214 #ifdef SYSLOG_RFC5424
00215 syslog_buf[rc++] = ' ';
00216 if (confnet.cdn_cip_addr) {
00217 strcpy(&syslog_buf[rc], inet_ntoa(confnet.cdn_cip_addr));
00218 rc += strlen(&syslog_buf[rc]);
00219 }
00220 else if (confos.hostname[0]) {
00221 strcpy(&syslog_buf[rc], confos.hostname);
00222 rc += strlen(&syslog_buf[rc]);
00223 }
00224 else if (confnet.cdn_ip_addr) {
00225 strcpy(&syslog_buf[rc], inet_ntoa(confnet.cdn_ip_addr));
00226 rc += strlen(&syslog_buf[rc]);
00227 } else {
00228 syslog_buf[rc++] = '-';
00229 }
00230 #else
00231 syslog_buf[rc++] = ' ';
00232 strcpy(&syslog_buf[rc], confos.hostname);
00233 rc += strlen(confos.hostname);
00234 #endif
00235
00236 #endif
00237
00238
00239 if (syslog_taglen) {
00240 syslog_buf[rc++] = ' ';
00241 strcpy(&syslog_buf[rc], syslog_tag);
00242 rc += syslog_taglen;
00243 #ifndef SYSLOG_RFC5424
00244 syslog_buf[rc++] = ':';
00245 #endif
00246 }
00247
00248
00249 #ifdef SYSLOG_RFC5424
00250 syslog_buf[rc++] = ' ';
00251 syslog_buf[rc++] = '-';
00252 syslog_buf[rc++] = ' ';
00253 syslog_buf[rc++] = '-';
00254 #endif
00255
00256 syslog_buf[rc++] = ' ';
00257 syslog_buf[rc] = '\0';
00258
00259 return rc;
00260 }
00261
00262 #ifndef SYSLOG_PERROR_ONLY
00263
00270 void syslog_flush(size_t len)
00271 {
00272
00273 if (syslog_stat & LOG_PERROR) {
00274 _write(_fileno(stderr), syslog_buf, len);
00275 _write(_fileno(stderr), "\n", 1);
00276 }
00277
00278
00279 if (syslog_server) {
00280 NutUdpSendTo(syslog_sock, syslog_server, syslog_port, syslog_buf, len);
00281 }
00282 }
00283 #endif
00284
00295 void vsyslog(int pri, CONST char *fmt, va_list ap)
00296 {
00297
00298 size_t cnt = syslog_header(pri);
00299
00300 if (cnt) {
00301 #ifdef SYSLOG_PERROR_ONLY
00302 fputs(syslog_buf, stderr);
00303 vfprintf(stderr, fmt, ap);
00304 fputc('\n', stderr);
00305 #else
00306
00307 if (cnt + strlen(fmt) >= SYSLOG_MAXBUF) {
00308 puts("Buffer overflow");
00309 return;
00310 }
00311 cnt += vsprintf(&syslog_buf[cnt], fmt, ap);
00312 syslog_flush(cnt);
00313 #endif
00314 }
00315 }
00316
00336 void syslog(int pri, CONST char *fmt, ...)
00337 {
00338 va_list ap;
00339
00340 va_start(ap, fmt);
00341 vsyslog(pri, (char *) fmt, ap);
00342 va_end(ap);
00343 }
00344
00355 int setlogmask(int logmask)
00356 {
00357 int rc = syslog_mask;
00358
00359 if (logmask) {
00360 syslog_mask = logmask;
00361 }
00362 return rc;
00363 }
00364
00373 uint32_t setlogserver(uint32_t ip, uint16_t port)
00374 {
00375 #ifdef SYSLOG_PERROR_ONLY
00376 return (uint32_t)-1;
00377 #else
00378 uint32_t rc = syslog_server;
00379
00380 syslog_server = ip;
00381 if (port) {
00382 syslog_port = port;
00383 }
00384 return rc;
00385 #endif
00386 }
00387
00419 void openlog(CONST char *ident, int logstat, int logfac)
00420 {
00421 if (ident == 0) {
00422 ident = syslog_tag;
00423 syslog_taglen = 0;
00424 }
00425
00426 closelog();
00427
00428 syslog_stat = logstat;
00429 syslog_fac = logfac;
00430 if (ident && *ident) {
00431 syslog_taglen = strlen(ident);
00432 syslog_tag = malloc(syslog_taglen + 1);
00433 strcpy(syslog_tag, ident);
00434 }
00435 if (syslog_stat & LOG_NDELAY) {
00436 if (syslog_buf == 0) {
00437 syslog_buf = malloc(SYSLOG_MAXBUF);
00438 }
00439 #ifndef SYSLOG_PERROR_ONLY
00440 if (syslog_sock == 0) {
00441 syslog_sock = NutUdpCreateSocket(514);
00442 }
00443 #endif
00444 }
00445 }
00446
00450 void closelog(void)
00451 {
00452 if (syslog_buf) {
00453 free(syslog_buf);
00454 syslog_buf = 0;
00455 }
00456 if (syslog_taglen) {
00457 free(syslog_tag);
00458 syslog_taglen = 0;
00459 }
00460 #ifndef SYSLOG_PERROR_ONLY
00461 if (syslog_sock) {
00462 NutUdpDestroySocket(syslog_sock);
00463 syslog_sock = 0;
00464 }
00465 #endif
00466 }
00467