]>
Commit | Line | Data |
---|---|---|
82b7abe3 | 1 | /* |
b8ae064d | 2 | * Copyright (C) 1996-2023 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 | 11 | #include "squid.h" |
675b8408 | 12 | #include "debug/Stream.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 | ||
24 | typedef struct { | |
25 | const char *name; | |
26 | int value; | |
27 | } syslog_symbol_t; | |
28 | ||
29 | static int | |
30 | syslog_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 |
aee3523a | 82 | {nullptr, 0} |
82b7abe3 AJ |
83 | }; |
84 | syslog_symbol_t *p; | |
85 | ||
aee3523a | 86 | for (p = symbols; p->name != nullptr; ++p) |
9d65168e A |
87 | if (!strcmp(s, p->name) || !strcasecmp(s, p->name + 4)) |
88 | return p->value; | |
82b7abe3 | 89 | |
d816f28d | 90 | debugs(1, DBG_IMPORTANT, "ERROR: Unknown syslog facility/priority '" << s << "'"); |
82b7abe3 AJ |
91 | return 0; |
92 | } | |
93 | ||
94 | typedef 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 | ||
100 | static void | |
ced8def3 | 101 | logfile_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 | ||
107 | static void | |
ced8def3 | 108 | logfile_mod_syslog_linestart(Logfile *) |
82b7abe3 AJ |
109 | { |
110 | } | |
111 | ||
112 | static void | |
ced8def3 | 113 | logfile_mod_syslog_lineend(Logfile *) |
82b7abe3 AJ |
114 | { |
115 | } | |
116 | ||
117 | static void | |
ced8def3 | 118 | logfile_mod_syslog_flush(Logfile *) |
82b7abe3 AJ |
119 | { |
120 | } | |
121 | ||
122 | static void | |
efc23871 | 123 | logfile_mod_syslog_rotate(Logfile *, const int16_t) |
82b7abe3 AJ |
124 | { |
125 | } | |
126 | ||
127 | static void | |
ced8def3 | 128 | logfile_mod_syslog_close(Logfile *lf) |
82b7abe3 AJ |
129 | { |
130 | xfree(lf->data); | |
aee3523a | 131 | lf->data = nullptr; |
82b7abe3 AJ |
132 | } |
133 | ||
82b7abe3 AJ |
134 | /* |
135 | * This code expects the path to be syslog:<priority> | |
136 | */ | |
137 | int | |
ced8def3 | 138 | logfile_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 |