blob: 6f2a8683e83713a7e06dcb7ede96513581cf6c26 [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
Guido van Rossumae94cf21998-05-08 21:52:55 +0000291998/04/28 (Sean Reifschneider)
30 - When facility not specified to syslog() method, use default from openlog()
31 (This is how it was claimed to work in the documentation)
32 - Potential resource leak of o_ident, now cleaned up in closelog()
33 - Minor comment accuracy fix.
34
Guido van Rossumc1822a41995-10-11 16:15:28 +00003595/06/29 (Steve Clift)
36 - Changed arg parsing to use PyArg_ParseTuple.
37 - Added PyErr_Clear() call(s) where needed.
38 - Fix core dumps if user message contains format specifiers.
Thomas Wouters7e474022000-07-16 12:04:32 +000039 - Change openlog arg defaults to match normal syslog behavior.
Guido van Rossumc1822a41995-10-11 16:15:28 +000040 - Plug memory leak in openlog().
41 - Fix setlogmask() to return previous mask value.
42
43******************************************************************/
44
Guido van Rossume44e3731994-07-14 13:56:50 +000045/* syslog module */
Guido van Rossume44e3731994-07-14 13:56:50 +000046
Guido van Rossuma597dde1995-01-10 20:56:29 +000047#include "Python.h"
Guido van Rossume44e3731994-07-14 13:56:50 +000048
49#include <syslog.h>
50
Guido van Rossumae94cf21998-05-08 21:52:55 +000051/* only one instance, only one syslog, so globals should be ok */
52static PyObject *S_ident_o = NULL; /* identifier, held by openlog() */
53
54
Guido van Rossumf6971e21994-08-30 12:25:20 +000055static PyObject *
Peter Schneider-Kamp41c36ff2000-07-10 12:29:26 +000056syslog_openlog(PyObject * self, PyObject * args)
Guido van Rossume44e3731994-07-14 13:56:50 +000057{
Barry Warsaw43a476a1997-01-09 23:51:21 +000058 long logopt = 0;
59 long facility = LOG_USER;
Raymond Hettinger6f5b7412004-12-16 23:52:04 +000060 PyObject *new_S_ident_o;
Neal Norwitz8d3654d2007-08-25 00:21:36 +000061 const char *ident;
Guido van Rossumc1822a41995-10-11 16:15:28 +000062
Barry Warsaw43a476a1997-01-09 23:51:21 +000063 if (!PyArg_ParseTuple(args,
Neal Norwitz8d3654d2007-08-25 00:21:36 +000064 "U|ll;ident string [, logoption [, facility]]",
Raymond Hettinger6f5b7412004-12-16 23:52:04 +000065 &new_S_ident_o, &logopt, &facility))
Barry Warsaw43a476a1997-01-09 23:51:21 +000066 return NULL;
Guido van Rossumc1822a41995-10-11 16:15:28 +000067
Barry Warsaw43a476a1997-01-09 23:51:21 +000068 /* This is needed because openlog() does NOT make a copy
69 * and syslog() later uses it.. cannot trash it.
70 */
Raymond Hettinger6f5b7412004-12-16 23:52:04 +000071 Py_XDECREF(S_ident_o);
72 S_ident_o = new_S_ident_o;
Guido van Rossumae94cf21998-05-08 21:52:55 +000073 Py_INCREF(S_ident_o);
Guido van Rossumc1822a41995-10-11 16:15:28 +000074
Neal Norwitz8d3654d2007-08-25 00:21:36 +000075 ident = PyUnicode_AsString(S_ident_o);
76 if (ident == NULL)
77 return NULL;
78 openlog(ident, logopt, facility);
Barry Warsaw43a476a1997-01-09 23:51:21 +000079
80 Py_INCREF(Py_None);
81 return Py_None;
Guido van Rossume44e3731994-07-14 13:56:50 +000082}
83
Barry Warsaw43a476a1997-01-09 23:51:21 +000084
Guido van Rossumf6971e21994-08-30 12:25:20 +000085static PyObject *
Peter Schneider-Kamp41c36ff2000-07-10 12:29:26 +000086syslog_syslog(PyObject * self, PyObject * args)
Guido van Rossume44e3731994-07-14 13:56:50 +000087{
Neal Norwitz8d3654d2007-08-25 00:21:36 +000088 PyObject *message_object;
89 const char *message;
Guido van Rossumae94cf21998-05-08 21:52:55 +000090 int priority = LOG_INFO;
Guido van Rossume44e3731994-07-14 13:56:50 +000091
Neal Norwitz8d3654d2007-08-25 00:21:36 +000092 if (!PyArg_ParseTuple(args, "iU;[priority,] message string",
Neal Norwitzfa06e5f2007-08-25 00:29:58 +000093 &priority, &message_object)) {
Barry Warsaw43a476a1997-01-09 23:51:21 +000094 PyErr_Clear();
Neal Norwitz8d3654d2007-08-25 00:21:36 +000095 if (!PyArg_ParseTuple(args, "U;[priority,] message string",
Neal Norwitzfa06e5f2007-08-25 00:29:58 +000096 &message_object))
Barry Warsaw43a476a1997-01-09 23:51:21 +000097 return NULL;
98 }
Guido van Rossumae94cf21998-05-08 21:52:55 +000099
Neal Norwitz8d3654d2007-08-25 00:21:36 +0000100 message = PyUnicode_AsString(message_object);
101 if (message == NULL)
102 return NULL;
Christian Heimes05e8be12008-02-23 18:30:17 +0000103 Py_BEGIN_ALLOW_THREADS;
Barry Warsaw43a476a1997-01-09 23:51:21 +0000104 syslog(priority, "%s", message);
Christian Heimes05e8be12008-02-23 18:30:17 +0000105 Py_END_ALLOW_THREADS;
106 Py_RETURN_NONE;
Guido van Rossume44e3731994-07-14 13:56:50 +0000107}
108
Guido van Rossumf6971e21994-08-30 12:25:20 +0000109static PyObject *
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000110syslog_closelog(PyObject *self, PyObject *unused)
Guido van Rossume44e3731994-07-14 13:56:50 +0000111{
Guido van Rossume44e3731994-07-14 13:56:50 +0000112 closelog();
Guido van Rossumae94cf21998-05-08 21:52:55 +0000113 Py_XDECREF(S_ident_o);
114 S_ident_o = NULL;
Guido van Rossumf6971e21994-08-30 12:25:20 +0000115 Py_INCREF(Py_None);
116 return Py_None;
Guido van Rossume44e3731994-07-14 13:56:50 +0000117}
118
Guido van Rossumf6971e21994-08-30 12:25:20 +0000119static PyObject *
Peter Schneider-Kamp41c36ff2000-07-10 12:29:26 +0000120syslog_setlogmask(PyObject *self, PyObject *args)
Guido van Rossume44e3731994-07-14 13:56:50 +0000121{
Barry Warsaw43a476a1997-01-09 23:51:21 +0000122 long maskpri, omaskpri;
Guido van Rossumc1822a41995-10-11 16:15:28 +0000123
Barry Warsaw43a476a1997-01-09 23:51:21 +0000124 if (!PyArg_ParseTuple(args, "l;mask for priority", &maskpri))
125 return NULL;
126 omaskpri = setlogmask(maskpri);
Christian Heimes217cfd12007-12-02 14:31:20 +0000127 return PyLong_FromLong(omaskpri);
Guido van Rossume44e3731994-07-14 13:56:50 +0000128}
129
Guido van Rossumf6971e21994-08-30 12:25:20 +0000130static PyObject *
Peter Schneider-Kamp41c36ff2000-07-10 12:29:26 +0000131syslog_log_mask(PyObject *self, PyObject *args)
Guido van Rossume44e3731994-07-14 13:56:50 +0000132{
Barry Warsaw43a476a1997-01-09 23:51:21 +0000133 long mask;
134 long pri;
Guido van Rossum43713e52000-02-29 13:59:29 +0000135 if (!PyArg_ParseTuple(args, "l:LOG_MASK", &pri))
Barry Warsaw43a476a1997-01-09 23:51:21 +0000136 return NULL;
137 mask = LOG_MASK(pri);
Christian Heimes217cfd12007-12-02 14:31:20 +0000138 return PyLong_FromLong(mask);
Guido van Rossume44e3731994-07-14 13:56:50 +0000139}
140
Guido van Rossumf6971e21994-08-30 12:25:20 +0000141static PyObject *
Peter Schneider-Kamp41c36ff2000-07-10 12:29:26 +0000142syslog_log_upto(PyObject *self, PyObject *args)
Guido van Rossume44e3731994-07-14 13:56:50 +0000143{
Barry Warsaw43a476a1997-01-09 23:51:21 +0000144 long mask;
145 long pri;
Guido van Rossum43713e52000-02-29 13:59:29 +0000146 if (!PyArg_ParseTuple(args, "l:LOG_UPTO", &pri))
Barry Warsaw43a476a1997-01-09 23:51:21 +0000147 return NULL;
148 mask = LOG_UPTO(pri);
Christian Heimes217cfd12007-12-02 14:31:20 +0000149 return PyLong_FromLong(mask);
Guido van Rossume44e3731994-07-14 13:56:50 +0000150}
151
152/* List of functions defined in the module */
153
Guido van Rossumf6971e21994-08-30 12:25:20 +0000154static PyMethodDef syslog_methods[] = {
Guido van Rossumc1822a41995-10-11 16:15:28 +0000155 {"openlog", syslog_openlog, METH_VARARGS},
Thomas Wouters4d70c3d2006-06-08 14:42:34 +0000156 {"closelog", syslog_closelog, METH_NOARGS},
Guido van Rossumc1822a41995-10-11 16:15:28 +0000157 {"syslog", syslog_syslog, METH_VARARGS},
158 {"setlogmask", syslog_setlogmask, METH_VARARGS},
159 {"LOG_MASK", syslog_log_mask, METH_VARARGS},
160 {"LOG_UPTO", syslog_log_upto, METH_VARARGS},
161 {NULL, NULL, 0}
Guido van Rossume44e3731994-07-14 13:56:50 +0000162};
163
Guido van Rossumae94cf21998-05-08 21:52:55 +0000164/* Initialization function for the module */
Guido van Rossumc1822a41995-10-11 16:15:28 +0000165
Mark Hammondfe51c6d2002-08-02 02:27:13 +0000166PyMODINIT_FUNC
Thomas Woutersf3f33dc2000-07-21 06:00:07 +0000167initsyslog(void)
Guido van Rossume44e3731994-07-14 13:56:50 +0000168{
Fred Drake4baedc12002-04-01 14:53:37 +0000169 PyObject *m;
Guido van Rossume44e3731994-07-14 13:56:50 +0000170
171 /* Create the module and add the functions */
Guido van Rossumf6971e21994-08-30 12:25:20 +0000172 m = Py_InitModule("syslog", syslog_methods);
Neal Norwitz1ac754f2006-01-19 06:09:39 +0000173 if (m == NULL)
174 return;
Guido van Rossume44e3731994-07-14 13:56:50 +0000175
176 /* Add some symbolic constants to the module */
Guido van Rossumc1822a41995-10-11 16:15:28 +0000177
178 /* Priorities */
Fred Drake4baedc12002-04-01 14:53:37 +0000179 PyModule_AddIntConstant(m, "LOG_EMERG", LOG_EMERG);
180 PyModule_AddIntConstant(m, "LOG_ALERT", LOG_ALERT);
181 PyModule_AddIntConstant(m, "LOG_CRIT", LOG_CRIT);
182 PyModule_AddIntConstant(m, "LOG_ERR", LOG_ERR);
183 PyModule_AddIntConstant(m, "LOG_WARNING", LOG_WARNING);
184 PyModule_AddIntConstant(m, "LOG_NOTICE", LOG_NOTICE);
185 PyModule_AddIntConstant(m, "LOG_INFO", LOG_INFO);
186 PyModule_AddIntConstant(m, "LOG_DEBUG", LOG_DEBUG);
Guido van Rossumc1822a41995-10-11 16:15:28 +0000187
188 /* openlog() option flags */
Fred Drake4baedc12002-04-01 14:53:37 +0000189 PyModule_AddIntConstant(m, "LOG_PID", LOG_PID);
190 PyModule_AddIntConstant(m, "LOG_CONS", LOG_CONS);
191 PyModule_AddIntConstant(m, "LOG_NDELAY", LOG_NDELAY);
Guido van Rossumbcc20741998-08-04 22:53:56 +0000192#ifdef LOG_NOWAIT
Fred Drake4baedc12002-04-01 14:53:37 +0000193 PyModule_AddIntConstant(m, "LOG_NOWAIT", LOG_NOWAIT);
Guido van Rossumbcc20741998-08-04 22:53:56 +0000194#endif
Guido van Rossumc1822a41995-10-11 16:15:28 +0000195#ifdef LOG_PERROR
Fred Drake4baedc12002-04-01 14:53:37 +0000196 PyModule_AddIntConstant(m, "LOG_PERROR", LOG_PERROR);
Guido van Rossumc1822a41995-10-11 16:15:28 +0000197#endif
198
199 /* Facilities */
Fred Drake4baedc12002-04-01 14:53:37 +0000200 PyModule_AddIntConstant(m, "LOG_KERN", LOG_KERN);
201 PyModule_AddIntConstant(m, "LOG_USER", LOG_USER);
202 PyModule_AddIntConstant(m, "LOG_MAIL", LOG_MAIL);
203 PyModule_AddIntConstant(m, "LOG_DAEMON", LOG_DAEMON);
204 PyModule_AddIntConstant(m, "LOG_AUTH", LOG_AUTH);
205 PyModule_AddIntConstant(m, "LOG_LPR", LOG_LPR);
206 PyModule_AddIntConstant(m, "LOG_LOCAL0", LOG_LOCAL0);
207 PyModule_AddIntConstant(m, "LOG_LOCAL1", LOG_LOCAL1);
208 PyModule_AddIntConstant(m, "LOG_LOCAL2", LOG_LOCAL2);
209 PyModule_AddIntConstant(m, "LOG_LOCAL3", LOG_LOCAL3);
210 PyModule_AddIntConstant(m, "LOG_LOCAL4", LOG_LOCAL4);
211 PyModule_AddIntConstant(m, "LOG_LOCAL5", LOG_LOCAL5);
212 PyModule_AddIntConstant(m, "LOG_LOCAL6", LOG_LOCAL6);
213 PyModule_AddIntConstant(m, "LOG_LOCAL7", LOG_LOCAL7);
Guido van Rossume44e3731994-07-14 13:56:50 +0000214
Guido van Rossumae94cf21998-05-08 21:52:55 +0000215#ifndef LOG_SYSLOG
216#define LOG_SYSLOG LOG_DAEMON
217#endif
218#ifndef LOG_NEWS
219#define LOG_NEWS LOG_MAIL
220#endif
221#ifndef LOG_UUCP
222#define LOG_UUCP LOG_MAIL
223#endif
224#ifndef LOG_CRON
225#define LOG_CRON LOG_DAEMON
226#endif
227
Fred Drake4baedc12002-04-01 14:53:37 +0000228 PyModule_AddIntConstant(m, "LOG_SYSLOG", LOG_SYSLOG);
229 PyModule_AddIntConstant(m, "LOG_CRON", LOG_CRON);
230 PyModule_AddIntConstant(m, "LOG_UUCP", LOG_UUCP);
231 PyModule_AddIntConstant(m, "LOG_NEWS", LOG_NEWS);
Guido van Rossume44e3731994-07-14 13:56:50 +0000232}