--------------------- PatchSet 7743 Date: 2006/05/14 01:32:26 Author: hno Branch: customlog-2_5 Tag: (none) Log: Bug #1489: add syslog priority and facility to access_log by Gonzalo Arana Members: src/logfile.c:1.5.38.3.4.1->1.5.38.3.4.2 Index: squid/src/logfile.c =================================================================== RCS file: /cvsroot/squid-sf//squid/src/logfile.c,v retrieving revision 1.5.38.3.4.1 retrieving revision 1.5.38.3.4.2 diff -u -r1.5.38.3.4.1 -r1.5.38.3.4.2 --- squid/src/logfile.c 2 Mar 2005 20:50:03 -0000 1.5.38.3.4.1 +++ squid/src/logfile.c 14 May 2006 01:32:26 -0000 1.5.38.3.4.2 @@ -36,16 +36,100 @@ static void logfileWriteWrapper(Logfile * lf, const void *buf, size_t len); +#if HAVE_SYSLOG +struct syslog_symbol_t +{ + const char* name; + int value; +}; + +static int syslog_ntoa (const char* s) +{ +#define syslog_symbol(a) #a, a + static syslog_symbol_t _symbols[] = { +#ifdef LOG_AUTHPRIV + { syslog_symbol(LOG_AUTHPRIV) }, +#endif +#ifdef LOG_DAEMON + { syslog_symbol(LOG_DAEMON) }, +#endif +#ifdef LOG_LOCAL0 + { syslog_symbol(LOG_LOCAL0) }, +#endif +#ifdef LOG_LOCAL1 + { syslog_symbol(LOG_LOCAL1) }, +#endif +#ifdef LOG_LOCAL2 + { syslog_symbol(LOG_LOCAL2) }, +#endif +#ifdef LOG_LOCAL3 + { syslog_symbol(LOG_LOCAL3) }, +#endif +#ifdef LOG_LOCAL4 + { syslog_symbol(LOG_LOCAL4) }, +#endif +#ifdef LOG_LOCAL5 + { syslog_symbol(LOG_LOCAL5) }, +#endif +#ifdef LOG_LOCAL6 + { syslog_symbol(LOG_LOCAL6) }, +#endif +#ifdef LOG_LOCAL7 + { syslog_symbol(LOG_LOCAL7) }, +#endif +#ifdef LOG_USER + { syslog_symbol(LOG_USER) }, +#endif +#ifdef LOG_ERR + { syslog_symbol(LOG_ERR) }, +#endif +#ifdef LOG_WARNING + { syslog_symbol(LOG_WARNING) }, +#endif +#ifdef LOG_NOTICE + { syslog_symbol(LOG_NOTICE) }, +#endif +#ifdef LOG_INFO + { syslog_symbol(LOG_INFO) }, +#endif +#ifdef LOG_DEBUG + { syslog_symbol(LOG_DEBUG) }, +#endif + { NULL, 0 } + }; + for (syslog_symbol_t* p = _symbols; p->name != NULL; ++p) + if (!strcmp(s, p->name) || !strcmp(s, p->name+4)) + return p->value; + return 0; +} + +#define PRIORITY_MASK (LOG_ERR | LOG_WARNING | LOG_NOTICE | LOG_INFO | LOG_DEBUG) +#endif /* HAVE_SYSLOG */ + Logfile * logfileOpen(const char *path, size_t bufsz, int fatal_flag) { Logfile *lf = xcalloc(1, sizeof(*lf)); xstrncpy(lf->path, path, MAXPATHLEN); - if (strcmp(path, "syslog") == 0) { +#if HAVE_SYSLOG + if (strcmp(path, "syslog") == 0 || strncmp(path, "syslog:", 7) == 0) { lf->flags.syslog = 1; - lf->syslog_priority = LOG_INFO; lf->fd = -1; - } else { + if (path[6] != '\0') { + char *priority = path + 7; + char *facility = strchr(priority, '|'); + if (facility) { + *facility++ = '\0'; + lf->syslog_priority |= syslog_ntoa(facility); + } + lf->syslog_priority |= syslog_ntoa(priority); + } + + if (lf->syslog_priority & PRIORITY_MASK == 0) + lf->syslog_priority |= LOG_INFO; + } else +#endif + { int fd = file_open(path, O_WRONLY | O_CREAT | O_TEXT); if (DISK_ERROR == fd) { if (ENOENT == errno && fatal_flag) { @@ -128,10 +212,12 @@ void logfileWrite(Logfile * lf, void *buf, size_t len) { +#if HAVE_SYSLOG if (lf->flags.syslog) { syslog(lf->syslog_priority, "%s", (char *)buf); return; } +#endif if (0 == lf->bufsz) { /* buffering disabled */ logfileWriteWrapper(lf, buf, len);