blob: 30d373127ba09d8a755bfcade4b08e2182ebd866 [file] [log] [blame]
Guido van Rossume44e3731994-07-14 13:56:50 +00001/***********************************************************
Guido van Rossumf6971e21994-08-30 12:25:20 +00002Copyright 1994 by Lance Ellinghouse,
3Cathedral City, California Republic, United States of America.
Guido van Rossume44e3731994-07-14 13:56:50 +00004
5 All Rights Reserved
6
7Permission to use, copy, modify, and distribute this software and its
8documentation for any purpose and without fee is hereby granted,
9provided that the above copyright notice appear in all copies and that
10both that copyright notice and this permission notice appear in
Guido van Rossumf6971e21994-08-30 12:25:20 +000011supporting documentation, and that the name of Lance Ellinghouse
12not be used in advertising or publicity pertaining to distribution
13of the software without specific, written prior permission.
Guido van Rossume44e3731994-07-14 13:56:50 +000014
Guido van Rossumf6971e21994-08-30 12:25:20 +000015LANCE ELLINGHOUSE DISCLAIMS ALL WARRANTIES WITH REGARD TO
Guido van Rossume44e3731994-07-14 13:56:50 +000016THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
Guido van Rossumf6971e21994-08-30 12:25:20 +000017FITNESS, IN NO EVENT SHALL LANCE ELLINGHOUSE BE LIABLE FOR ANY SPECIAL,
18INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING
19FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT,
20NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION
21WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
Guido van Rossume44e3731994-07-14 13:56:50 +000022
23******************************************************************/
24
Guido van Rossumc1822a41995-10-11 16:15:28 +000025/******************************************************************
26
27Revision history:
28
Sean Reifscheiderf6ce3cb2010-04-23 08:31:55 +0000292010/04/20 (Sean Reifschneider)
30 - Use basename(sys.argv[0]) for the default "ident".
31 - Arguments to openlog() are now keyword args and are all optional.
32 - syslog() calls openlog() if it hasn't already been called.
33
Guido van Rossumae94cf21998-05-08 21:52:55 +0000341998/04/28 (Sean Reifschneider)
35 - When facility not specified to syslog() method, use default from openlog()
36 (This is how it was claimed to work in the documentation)
37 - Potential resource leak of o_ident, now cleaned up in closelog()
38 - Minor comment accuracy fix.
39
Guido van Rossumc1822a41995-10-11 16:15:28 +00004095/06/29 (Steve Clift)
41 - Changed arg parsing to use PyArg_ParseTuple.
42 - Added PyErr_Clear() call(s) where needed.
43 - Fix core dumps if user message contains format specifiers.
Thomas Wouters7e474022000-07-16 12:04:32 +000044 - Change openlog arg defaults to match normal syslog behavior.
Guido van Rossumc1822a41995-10-11 16:15:28 +000045 - Plug memory leak in openlog().
46 - Fix setlogmask() to return previous mask value.
47
48******************************************************************/
49
Guido van Rossume44e3731994-07-14 13:56:50 +000050/* syslog module */
Guido van Rossume44e3731994-07-14 13:56:50 +000051
Guido van Rossuma597dde1995-01-10 20:56:29 +000052#include "Python.h"
Sean Reifscheiderf6ce3cb2010-04-23 08:31:55 +000053#include "osdefs.h"
Guido van Rossume44e3731994-07-14 13:56:50 +000054
55#include <syslog.h>
56
Guido van Rossumae94cf21998-05-08 21:52:55 +000057/* only one instance, only one syslog, so globals should be ok */
58static PyObject *S_ident_o = NULL; /* identifier, held by openlog() */
59
60
Sean Reifscheiderf6ce3cb2010-04-23 08:31:55 +000061static PyObject *
62syslog_get_argv(void)
63{
64 /* Figure out what to use for as the program "ident" for openlog().
65 * This swallows exceptions and continues rather than failing out,
66 * because the syslog module can still be used because openlog(3)
67 * is optional.
68 */
69
70 Py_ssize_t argv_len;
71 PyObject *scriptobj;
72 char *atslash;
73 PyObject *argv = PySys_GetObject("argv");
74
75 if (argv == NULL) {
76 return(NULL);
77 }
78
79 argv_len = PyList_Size(argv);
80 if (argv_len == -1) {
81 PyErr_Clear();
82 return(NULL);
83 }
84 if (argv_len == 0) {
85 return(NULL);
86 }
87
88 scriptobj = PyList_GetItem(argv, 0);
89 if (!PyString_Check(scriptobj)) {
90 return(NULL);
91 }
92 if (PyString_GET_SIZE(scriptobj) == 0) {
93 return(NULL);
94 }
95
96 atslash = strrchr(PyString_AsString(scriptobj), SEP);
97 if (atslash) {
98 return(PyString_FromString(atslash + 1));
99 } else {
100 Py_INCREF(scriptobj);
101 return(scriptobj);
102 }
103
104 return(NULL);
105}
106
107
Guido van Rossumf6971e21994-08-30 12:25:20 +0000108static PyObject *
Sean Reifscheiderf6ce3cb2010-04-23 08:31:55 +0000109syslog_openlog(PyObject * self, PyObject * args, PyObject *kwds)
Guido van Rossume44e3731994-07-14 13:56:50 +0000110{
Barry Warsaw43a476a1997-01-09 23:51:21 +0000111 long logopt = 0;
112 long facility = LOG_USER;
Sean Reifscheiderf6ce3cb2010-04-23 08:31:55 +0000113 PyObject *new_S_ident_o = NULL;
114 static char *keywords[] = {"ident", "logoption", "facility", 0};
Guido van Rossumc1822a41995-10-11 16:15:28 +0000115
Sean Reifscheiderf6ce3cb2010-04-23 08:31:55 +0000116 if (!PyArg_ParseTupleAndKeywords(args, kwds,
117 "|Sll:openlog", keywords, &new_S_ident_o, &logopt, &facility))
Barry Warsaw43a476a1997-01-09 23:51:21 +0000118 return NULL;
Guido van Rossumc1822a41995-10-11 16:15:28 +0000119
Sean Reifscheiderf6ce3cb2010-04-23 08:31:55 +0000120 if (new_S_ident_o) { Py_INCREF(new_S_ident_o); }
121
122 /* get either sys.argv[0] or use "python" otherwise */
123 if (!new_S_ident_o) {
124 new_S_ident_o = syslog_get_argv();
125 }
126
Raymond Hettinger6f5b7412004-12-16 23:52:04 +0000127 Py_XDECREF(S_ident_o);
128 S_ident_o = new_S_ident_o;
Guido van Rossumc1822a41995-10-11 16:15:28 +0000129
Sean Reifscheiderf6ce3cb2010-04-23 08:31:55 +0000130 /* At this point, S_ident_o should be INCREF()ed. openlog(3) does not
131 * make a copy, and syslog(3) later uses it. We can't garbagecollect it
132 */
133
134 openlog(S_ident_o ? PyString_AsString(S_ident_o) : NULL, logopt, facility);
Barry Warsaw43a476a1997-01-09 23:51:21 +0000135
136 Py_INCREF(Py_None);
137 return Py_None;
Guido van Rossume44e3731994-07-14 13:56:50 +0000138}
139
Barry Warsaw43a476a1997-01-09 23:51:21 +0000140
Guido van Rossumf6971e21994-08-30 12:25:20 +0000141static PyObject *
Peter Schneider-Kamp41c36ff2000-07-10 12:29:26 +0000142syslog_syslog(PyObject * self, PyObject * args)
Guido van Rossume44e3731994-07-14 13:56:50 +0000143{
Barry Warsaw43a476a1997-01-09 23:51:21 +0000144 char *message;
Guido van Rossumae94cf21998-05-08 21:52:55 +0000145 int priority = LOG_INFO;
Guido van Rossume44e3731994-07-14 13:56:50 +0000146
Barry Warsaw43a476a1997-01-09 23:51:21 +0000147 if (!PyArg_ParseTuple(args, "is;[priority,] message string",
148 &priority, &message)) {
149 PyErr_Clear();
150 if (!PyArg_ParseTuple(args, "s;[priority,] message string",
151 &message))
152 return NULL;
153 }
Guido van Rossumae94cf21998-05-08 21:52:55 +0000154
Sean Reifscheiderf6ce3cb2010-04-23 08:31:55 +0000155 /* call openlog if no current identifier */
156 if (!S_ident_o) {
157 PyObject *openargs;
158
159 /* Continue even if PyTuple_New fails, because openlog(3) is optional.
160 * So, we can still do loggin in the unlikely event things are so hosed
161 * that we can't do this tuple.
162 */
163 if ((openargs = PyTuple_New(0))) {
164 PyObject *openlog_ret = syslog_openlog(self, openargs, NULL);
165 Py_XDECREF(openlog_ret);
166 Py_DECREF(openargs);
167 }
168 }
169
Christian Heimesf0476e82008-02-23 17:42:31 +0000170 Py_BEGIN_ALLOW_THREADS;
Barry Warsaw43a476a1997-01-09 23:51:21 +0000171 syslog(priority, "%s", message);
Christian Heimesf0476e82008-02-23 17:42:31 +0000172 Py_END_ALLOW_THREADS;
Barry Warsaw43a476a1997-01-09 23:51:21 +0000173 Py_INCREF(Py_None);
174 return Py_None;
Guido van Rossume44e3731994-07-14 13:56:50 +0000175}
176
Guido van Rossumf6971e21994-08-30 12:25:20 +0000177static PyObject *
Georg Brandl96a8c392006-05-29 21:04:52 +0000178syslog_closelog(PyObject *self, PyObject *unused)
Guido van Rossume44e3731994-07-14 13:56:50 +0000179{
Guido van Rossume44e3731994-07-14 13:56:50 +0000180 closelog();
Guido van Rossumae94cf21998-05-08 21:52:55 +0000181 Py_XDECREF(S_ident_o);
182 S_ident_o = NULL;
Guido van Rossumf6971e21994-08-30 12:25:20 +0000183 Py_INCREF(Py_None);
184 return Py_None;
Guido van Rossume44e3731994-07-14 13:56:50 +0000185}
186
Guido van Rossumf6971e21994-08-30 12:25:20 +0000187static PyObject *
Peter Schneider-Kamp41c36ff2000-07-10 12:29:26 +0000188syslog_setlogmask(PyObject *self, PyObject *args)
Guido van Rossume44e3731994-07-14 13:56:50 +0000189{
Barry Warsaw43a476a1997-01-09 23:51:21 +0000190 long maskpri, omaskpri;
Guido van Rossumc1822a41995-10-11 16:15:28 +0000191
Barry Warsaw43a476a1997-01-09 23:51:21 +0000192 if (!PyArg_ParseTuple(args, "l;mask for priority", &maskpri))
193 return NULL;
194 omaskpri = setlogmask(maskpri);
195 return PyInt_FromLong(omaskpri);
Guido van Rossume44e3731994-07-14 13:56:50 +0000196}
197
Guido van Rossumf6971e21994-08-30 12:25:20 +0000198static PyObject *
Peter Schneider-Kamp41c36ff2000-07-10 12:29:26 +0000199syslog_log_mask(PyObject *self, PyObject *args)
Guido van Rossume44e3731994-07-14 13:56:50 +0000200{
Barry Warsaw43a476a1997-01-09 23:51:21 +0000201 long mask;
202 long pri;
Guido van Rossum43713e52000-02-29 13:59:29 +0000203 if (!PyArg_ParseTuple(args, "l:LOG_MASK", &pri))
Barry Warsaw43a476a1997-01-09 23:51:21 +0000204 return NULL;
205 mask = LOG_MASK(pri);
206 return PyInt_FromLong(mask);
Guido van Rossume44e3731994-07-14 13:56:50 +0000207}
208
Guido van Rossumf6971e21994-08-30 12:25:20 +0000209static PyObject *
Peter Schneider-Kamp41c36ff2000-07-10 12:29:26 +0000210syslog_log_upto(PyObject *self, PyObject *args)
Guido van Rossume44e3731994-07-14 13:56:50 +0000211{
Barry Warsaw43a476a1997-01-09 23:51:21 +0000212 long mask;
213 long pri;
Guido van Rossum43713e52000-02-29 13:59:29 +0000214 if (!PyArg_ParseTuple(args, "l:LOG_UPTO", &pri))
Barry Warsaw43a476a1997-01-09 23:51:21 +0000215 return NULL;
216 mask = LOG_UPTO(pri);
217 return PyInt_FromLong(mask);
Guido van Rossume44e3731994-07-14 13:56:50 +0000218}
219
220/* List of functions defined in the module */
221
Guido van Rossumf6971e21994-08-30 12:25:20 +0000222static PyMethodDef syslog_methods[] = {
Sean Reifscheiderf6ce3cb2010-04-23 08:31:55 +0000223 {"openlog", (PyCFunction) syslog_openlog, METH_VARARGS | METH_KEYWORDS},
Georg Brandl96a8c392006-05-29 21:04:52 +0000224 {"closelog", syslog_closelog, METH_NOARGS},
Guido van Rossumc1822a41995-10-11 16:15:28 +0000225 {"syslog", syslog_syslog, METH_VARARGS},
226 {"setlogmask", syslog_setlogmask, METH_VARARGS},
227 {"LOG_MASK", syslog_log_mask, METH_VARARGS},
228 {"LOG_UPTO", syslog_log_upto, METH_VARARGS},
229 {NULL, NULL, 0}
Guido van Rossume44e3731994-07-14 13:56:50 +0000230};
231
Guido van Rossumae94cf21998-05-08 21:52:55 +0000232/* Initialization function for the module */
Guido van Rossumc1822a41995-10-11 16:15:28 +0000233
Mark Hammondfe51c6d2002-08-02 02:27:13 +0000234PyMODINIT_FUNC
Thomas Woutersf3f33dc2000-07-21 06:00:07 +0000235initsyslog(void)
Guido van Rossume44e3731994-07-14 13:56:50 +0000236{
Fred Drake4baedc12002-04-01 14:53:37 +0000237 PyObject *m;
Guido van Rossume44e3731994-07-14 13:56:50 +0000238
239 /* Create the module and add the functions */
Guido van Rossumf6971e21994-08-30 12:25:20 +0000240 m = Py_InitModule("syslog", syslog_methods);
Neal Norwitz1ac754f2006-01-19 06:09:39 +0000241 if (m == NULL)
242 return;
Guido van Rossume44e3731994-07-14 13:56:50 +0000243
244 /* Add some symbolic constants to the module */
Guido van Rossumc1822a41995-10-11 16:15:28 +0000245
246 /* Priorities */
Fred Drake4baedc12002-04-01 14:53:37 +0000247 PyModule_AddIntConstant(m, "LOG_EMERG", LOG_EMERG);
248 PyModule_AddIntConstant(m, "LOG_ALERT", LOG_ALERT);
249 PyModule_AddIntConstant(m, "LOG_CRIT", LOG_CRIT);
250 PyModule_AddIntConstant(m, "LOG_ERR", LOG_ERR);
251 PyModule_AddIntConstant(m, "LOG_WARNING", LOG_WARNING);
252 PyModule_AddIntConstant(m, "LOG_NOTICE", LOG_NOTICE);
253 PyModule_AddIntConstant(m, "LOG_INFO", LOG_INFO);
254 PyModule_AddIntConstant(m, "LOG_DEBUG", LOG_DEBUG);
Guido van Rossumc1822a41995-10-11 16:15:28 +0000255
256 /* openlog() option flags */
Fred Drake4baedc12002-04-01 14:53:37 +0000257 PyModule_AddIntConstant(m, "LOG_PID", LOG_PID);
258 PyModule_AddIntConstant(m, "LOG_CONS", LOG_CONS);
259 PyModule_AddIntConstant(m, "LOG_NDELAY", LOG_NDELAY);
Guido van Rossumbcc20741998-08-04 22:53:56 +0000260#ifdef LOG_NOWAIT
Fred Drake4baedc12002-04-01 14:53:37 +0000261 PyModule_AddIntConstant(m, "LOG_NOWAIT", LOG_NOWAIT);
Guido van Rossumbcc20741998-08-04 22:53:56 +0000262#endif
Guido van Rossumc1822a41995-10-11 16:15:28 +0000263#ifdef LOG_PERROR
Fred Drake4baedc12002-04-01 14:53:37 +0000264 PyModule_AddIntConstant(m, "LOG_PERROR", LOG_PERROR);
Guido van Rossumc1822a41995-10-11 16:15:28 +0000265#endif
266
267 /* Facilities */
Fred Drake4baedc12002-04-01 14:53:37 +0000268 PyModule_AddIntConstant(m, "LOG_KERN", LOG_KERN);
269 PyModule_AddIntConstant(m, "LOG_USER", LOG_USER);
270 PyModule_AddIntConstant(m, "LOG_MAIL", LOG_MAIL);
271 PyModule_AddIntConstant(m, "LOG_DAEMON", LOG_DAEMON);
272 PyModule_AddIntConstant(m, "LOG_AUTH", LOG_AUTH);
273 PyModule_AddIntConstant(m, "LOG_LPR", LOG_LPR);
274 PyModule_AddIntConstant(m, "LOG_LOCAL0", LOG_LOCAL0);
275 PyModule_AddIntConstant(m, "LOG_LOCAL1", LOG_LOCAL1);
276 PyModule_AddIntConstant(m, "LOG_LOCAL2", LOG_LOCAL2);
277 PyModule_AddIntConstant(m, "LOG_LOCAL3", LOG_LOCAL3);
278 PyModule_AddIntConstant(m, "LOG_LOCAL4", LOG_LOCAL4);
279 PyModule_AddIntConstant(m, "LOG_LOCAL5", LOG_LOCAL5);
280 PyModule_AddIntConstant(m, "LOG_LOCAL6", LOG_LOCAL6);
281 PyModule_AddIntConstant(m, "LOG_LOCAL7", LOG_LOCAL7);
Guido van Rossume44e3731994-07-14 13:56:50 +0000282
Guido van Rossumae94cf21998-05-08 21:52:55 +0000283#ifndef LOG_SYSLOG
284#define LOG_SYSLOG LOG_DAEMON
285#endif
286#ifndef LOG_NEWS
287#define LOG_NEWS LOG_MAIL
288#endif
289#ifndef LOG_UUCP
290#define LOG_UUCP LOG_MAIL
291#endif
292#ifndef LOG_CRON
293#define LOG_CRON LOG_DAEMON
294#endif
295
Fred Drake4baedc12002-04-01 14:53:37 +0000296 PyModule_AddIntConstant(m, "LOG_SYSLOG", LOG_SYSLOG);
297 PyModule_AddIntConstant(m, "LOG_CRON", LOG_CRON);
298 PyModule_AddIntConstant(m, "LOG_UUCP", LOG_UUCP);
299 PyModule_AddIntConstant(m, "LOG_NEWS", LOG_NEWS);
Guido van Rossume44e3731994-07-14 13:56:50 +0000300}