]> git.ipfire.org Git - thirdparty/squid.git/blame - src/log/ModSyslog.cc
SourceFormat Enforcement
[thirdparty/squid.git] / src / log / ModSyslog.cc
CommitLineData
82b7abe3 1/*
4ac4a490 2 * Copyright (C) 1996-2017 The Squid Software Foundation and contributors
82b7abe3 3 *
bbc27441
AJ
4 * Squid software is distributed under GPLv2+ license and includes
5 * contributions from numerous individuals and organizations.
6 * Please see the COPYING and CONTRIBUTORS files for details.
82b7abe3
AJ
7 */
8
bbc27441
AJ
9/* DEBUG: section 50 Log file handling */
10
582c2af2
FC
11#include "squid.h"
12#include "Debug.h"
82b7abe3
AJ
13
14#if HAVE_SYSLOG
15
16#include "log/File.h"
17#include "log/ModSyslog.h"
18
19/* Define LOG_AUTHPRIV as LOG_AUTH on systems still using the old deprecated LOG_AUTH */
20#if !defined(LOG_AUTHPRIV) && defined(LOG_AUTH)
21#define LOG_AUTHPRIV LOG_AUTH
22#endif
23
24typedef struct {
25 const char *name;
26 int value;
27} syslog_symbol_t;
28
29static int
30syslog_ntoa(const char *s)
31{
32#define syslog_symbol(a) #a, a
9d65168e 33 static syslog_symbol_t symbols[] = {
82b7abe3 34#ifdef LOG_AUTHPRIV
9d65168e 35 {syslog_symbol(LOG_AUTHPRIV)},
82b7abe3
AJ
36#endif
37#ifdef LOG_DAEMON
9d65168e 38 {syslog_symbol(LOG_DAEMON)},
82b7abe3
AJ
39#endif
40#ifdef LOG_LOCAL0
9d65168e 41 {syslog_symbol(LOG_LOCAL0)},
82b7abe3
AJ
42#endif
43#ifdef LOG_LOCAL1
9d65168e 44 {syslog_symbol(LOG_LOCAL1)},
82b7abe3
AJ
45#endif
46#ifdef LOG_LOCAL2
9d65168e 47 {syslog_symbol(LOG_LOCAL2)},
82b7abe3
AJ
48#endif
49#ifdef LOG_LOCAL3
9d65168e 50 {syslog_symbol(LOG_LOCAL3)},
82b7abe3
AJ
51#endif
52#ifdef LOG_LOCAL4
9d65168e 53 {syslog_symbol(LOG_LOCAL4)},
82b7abe3
AJ
54#endif
55#ifdef LOG_LOCAL5
9d65168e 56 {syslog_symbol(LOG_LOCAL5)},
82b7abe3
AJ
57#endif
58#ifdef LOG_LOCAL6
9d65168e 59 {syslog_symbol(LOG_LOCAL6)},
82b7abe3
AJ
60#endif
61#ifdef LOG_LOCAL7
9d65168e 62 {syslog_symbol(LOG_LOCAL7)},
82b7abe3
AJ
63#endif
64#ifdef LOG_USER
9d65168e 65 {syslog_symbol(LOG_USER)},
82b7abe3
AJ
66#endif
67#ifdef LOG_ERR
9d65168e 68 {syslog_symbol(LOG_ERR)},
82b7abe3
AJ
69#endif
70#ifdef LOG_WARNING
9d65168e 71 {syslog_symbol(LOG_WARNING)},
82b7abe3
AJ
72#endif
73#ifdef LOG_NOTICE
9d65168e 74 {syslog_symbol(LOG_NOTICE)},
82b7abe3
AJ
75#endif
76#ifdef LOG_INFO
9d65168e 77 {syslog_symbol(LOG_INFO)},
82b7abe3
AJ
78#endif
79#ifdef LOG_DEBUG
9d65168e 80 {syslog_symbol(LOG_DEBUG)},
82b7abe3 81#endif
9d65168e 82 {NULL, 0}
82b7abe3
AJ
83 };
84 syslog_symbol_t *p;
85
86 for (p = symbols; p->name != NULL; ++p)
9d65168e
A
87 if (!strcmp(s, p->name) || !strcasecmp(s, p->name + 4))
88 return p->value;
82b7abe3 89
e0236918 90 debugs(1, DBG_IMPORTANT, "Unknown syslog facility/priority '" << s << "'");
82b7abe3
AJ
91 return 0;
92}
93
94typedef struct {
95 int syslog_priority;
96} l_syslog_t;
97
98#define PRIORITY_MASK (LOG_ERR | LOG_WARNING | LOG_NOTICE | LOG_INFO | LOG_DEBUG)
99
100static void
ced8def3 101logfile_mod_syslog_writeline(Logfile * lf, const char *buf, size_t)
82b7abe3
AJ
102{
103 l_syslog_t *ll = (l_syslog_t *) lf->data;
104 syslog(ll->syslog_priority, "%s", (char *) buf);
105}
106
107static void
ced8def3 108logfile_mod_syslog_linestart(Logfile *)
82b7abe3
AJ
109{
110}
111
112static void
ced8def3 113logfile_mod_syslog_lineend(Logfile *)
82b7abe3
AJ
114{
115}
116
117static void
ced8def3 118logfile_mod_syslog_flush(Logfile *)
82b7abe3
AJ
119{
120}
121
122static void
efc23871 123logfile_mod_syslog_rotate(Logfile *, const int16_t)
82b7abe3
AJ
124{
125}
126
127static void
ced8def3 128logfile_mod_syslog_close(Logfile *lf)
82b7abe3
AJ
129{
130 xfree(lf->data);
131 lf->data = NULL;
132}
133
82b7abe3
AJ
134/*
135 * This code expects the path to be syslog:<priority>
136 */
137int
ced8def3 138logfile_mod_syslog_open(Logfile * lf, const char *path, size_t, int)
82b7abe3
AJ
139{
140 lf->f_close = logfile_mod_syslog_close;
141 lf->f_linewrite = logfile_mod_syslog_writeline;
142 lf->f_linestart = logfile_mod_syslog_linestart;
143 lf->f_lineend = logfile_mod_syslog_lineend;
144 lf->f_flush = logfile_mod_syslog_flush;
145 lf->f_rotate = logfile_mod_syslog_rotate;
146
147 l_syslog_t *ll = static_cast<l_syslog_t*>(xcalloc(1, sizeof(*ll)));
148 lf->data = ll;
149
150 ll->syslog_priority = LOG_INFO;
151
152 if (path[6] != '\0') {
153 char *priority = xstrdup(path);
154 char *facility = (char *) strchr(priority, '.');
155 if (!facility)
156 facility = (char *) strchr(priority, '|');
157 if (facility) {
a38ec4b1
FC
158 *facility = '\0';
159 ++facility;
82b7abe3
AJ
160 ll->syslog_priority |= syslog_ntoa(facility);
161 }
162 ll->syslog_priority |= syslog_ntoa(priority);
163 xfree(priority);
164 if ((ll->syslog_priority & PRIORITY_MASK) == 0)
9d65168e 165 ll->syslog_priority |= LOG_INFO;
82b7abe3
AJ
166 }
167
168 return 1;
169}
170#endif
f53969cc 171