blob: 6f192c3d5b2393bd82767c3428dd8979d2f9a7ec [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.
39 - Change openlog arg defaults to match normal syslog behaviour.
40 - 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 *
Guido van Rossume44e3731994-07-14 13:56:50 +000056syslog_openlog(self, args)
Barry Warsaw43a476a1997-01-09 23:51:21 +000057 PyObject * self;
58 PyObject * args;
Guido van Rossume44e3731994-07-14 13:56:50 +000059{
Barry Warsaw43a476a1997-01-09 23:51:21 +000060 long logopt = 0;
61 long facility = LOG_USER;
Guido van Rossumc1822a41995-10-11 16:15:28 +000062
Guido van Rossumc1822a41995-10-11 16:15:28 +000063
Guido van Rossumae94cf21998-05-08 21:52:55 +000064 Py_XDECREF(S_ident_o);
Barry Warsaw43a476a1997-01-09 23:51:21 +000065 if (!PyArg_ParseTuple(args,
66 "S|ll;ident string [, logoption [, facility]]",
Guido van Rossumae94cf21998-05-08 21:52:55 +000067 &S_ident_o, &logopt, &facility))
Barry Warsaw43a476a1997-01-09 23:51:21 +000068 return NULL;
Guido van Rossumc1822a41995-10-11 16:15:28 +000069
Barry Warsaw43a476a1997-01-09 23:51:21 +000070 /* This is needed because openlog() does NOT make a copy
71 * and syslog() later uses it.. cannot trash it.
72 */
Guido van Rossumae94cf21998-05-08 21:52:55 +000073 Py_INCREF(S_ident_o);
Guido van Rossumc1822a41995-10-11 16:15:28 +000074
Guido van Rossumae94cf21998-05-08 21:52:55 +000075 openlog(PyString_AsString(S_ident_o), logopt, facility);
Barry Warsaw43a476a1997-01-09 23:51:21 +000076
77 Py_INCREF(Py_None);
78 return Py_None;
Guido van Rossume44e3731994-07-14 13:56:50 +000079}
80
Barry Warsaw43a476a1997-01-09 23:51:21 +000081
Guido van Rossumf6971e21994-08-30 12:25:20 +000082static PyObject *
Guido van Rossume44e3731994-07-14 13:56:50 +000083syslog_syslog(self, args)
Barry Warsaw43a476a1997-01-09 23:51:21 +000084 PyObject * self;
85 PyObject * args;
Guido van Rossume44e3731994-07-14 13:56:50 +000086{
Barry Warsaw43a476a1997-01-09 23:51:21 +000087 char *message;
Guido van Rossumae94cf21998-05-08 21:52:55 +000088 int priority = LOG_INFO;
Guido van Rossume44e3731994-07-14 13:56:50 +000089
Barry Warsaw43a476a1997-01-09 23:51:21 +000090 if (!PyArg_ParseTuple(args, "is;[priority,] message string",
91 &priority, &message)) {
92 PyErr_Clear();
93 if (!PyArg_ParseTuple(args, "s;[priority,] message string",
94 &message))
95 return NULL;
96 }
Guido van Rossumae94cf21998-05-08 21:52:55 +000097
Barry Warsaw43a476a1997-01-09 23:51:21 +000098 syslog(priority, "%s", message);
99 Py_INCREF(Py_None);
100 return Py_None;
Guido van Rossume44e3731994-07-14 13:56:50 +0000101}
102
Guido van Rossumf6971e21994-08-30 12:25:20 +0000103static PyObject *
Guido van Rossume44e3731994-07-14 13:56:50 +0000104syslog_closelog(self, args)
Barry Warsaw43a476a1997-01-09 23:51:21 +0000105 PyObject * self;
106 PyObject * args;
Guido van Rossume44e3731994-07-14 13:56:50 +0000107{
Guido van Rossum43713e52000-02-29 13:59:29 +0000108 if (!PyArg_ParseTuple(args, ":closelog"))
Guido van Rossume44e3731994-07-14 13:56:50 +0000109 return NULL;
110 closelog();
Guido van Rossumae94cf21998-05-08 21:52:55 +0000111 Py_XDECREF(S_ident_o);
112 S_ident_o = NULL;
Guido van Rossumf6971e21994-08-30 12:25:20 +0000113 Py_INCREF(Py_None);
114 return Py_None;
Guido van Rossume44e3731994-07-14 13:56:50 +0000115}
116
Guido van Rossumf6971e21994-08-30 12:25:20 +0000117static PyObject *
Guido van Rossume44e3731994-07-14 13:56:50 +0000118syslog_setlogmask(self, args)
Barry Warsaw43a476a1997-01-09 23:51:21 +0000119 PyObject * self;
120 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);
127 return PyInt_FromLong(omaskpri);
Guido van Rossume44e3731994-07-14 13:56:50 +0000128}
129
Guido van Rossumf6971e21994-08-30 12:25:20 +0000130static PyObject *
Guido van Rossume44e3731994-07-14 13:56:50 +0000131syslog_log_mask(self, args)
Barry Warsaw43a476a1997-01-09 23:51:21 +0000132 PyObject * self;
133 PyObject * args;
Guido van Rossume44e3731994-07-14 13:56:50 +0000134{
Barry Warsaw43a476a1997-01-09 23:51:21 +0000135 long mask;
136 long pri;
Guido van Rossum43713e52000-02-29 13:59:29 +0000137 if (!PyArg_ParseTuple(args, "l:LOG_MASK", &pri))
Barry Warsaw43a476a1997-01-09 23:51:21 +0000138 return NULL;
139 mask = LOG_MASK(pri);
140 return PyInt_FromLong(mask);
Guido van Rossume44e3731994-07-14 13:56:50 +0000141}
142
Guido van Rossumf6971e21994-08-30 12:25:20 +0000143static PyObject *
Guido van Rossume44e3731994-07-14 13:56:50 +0000144syslog_log_upto(self, args)
Barry Warsaw43a476a1997-01-09 23:51:21 +0000145 PyObject * self;
146 PyObject * args;
Guido van Rossume44e3731994-07-14 13:56:50 +0000147{
Barry Warsaw43a476a1997-01-09 23:51:21 +0000148 long mask;
149 long pri;
Guido van Rossum43713e52000-02-29 13:59:29 +0000150 if (!PyArg_ParseTuple(args, "l:LOG_UPTO", &pri))
Barry Warsaw43a476a1997-01-09 23:51:21 +0000151 return NULL;
152 mask = LOG_UPTO(pri);
153 return PyInt_FromLong(mask);
Guido van Rossume44e3731994-07-14 13:56:50 +0000154}
155
156/* List of functions defined in the module */
157
Guido van Rossumf6971e21994-08-30 12:25:20 +0000158static PyMethodDef syslog_methods[] = {
Guido van Rossumc1822a41995-10-11 16:15:28 +0000159 {"openlog", syslog_openlog, METH_VARARGS},
160 {"closelog", syslog_closelog, METH_VARARGS},
161 {"syslog", syslog_syslog, METH_VARARGS},
162 {"setlogmask", syslog_setlogmask, METH_VARARGS},
163 {"LOG_MASK", syslog_log_mask, METH_VARARGS},
164 {"LOG_UPTO", syslog_log_upto, METH_VARARGS},
165 {NULL, NULL, 0}
Guido van Rossume44e3731994-07-14 13:56:50 +0000166};
167
Guido van Rossumae94cf21998-05-08 21:52:55 +0000168/* helper function for initialization function */
Guido van Rossume44e3731994-07-14 13:56:50 +0000169
Barry Warsawe886ea91997-01-17 00:01:33 +0000170static void
171ins(d, s, x)
Barry Warsaw43a476a1997-01-09 23:51:21 +0000172 PyObject *d;
173 char *s;
174 long x;
175{
Barry Warsawe886ea91997-01-17 00:01:33 +0000176 PyObject *v = PyInt_FromLong(x);
177 if (v) {
178 PyDict_SetItemString(d, s, v);
179 Py_DECREF(v);
180 }
Barry Warsaw43a476a1997-01-09 23:51:21 +0000181}
182
Guido van Rossumae94cf21998-05-08 21:52:55 +0000183/* Initialization function for the module */
Guido van Rossumc1822a41995-10-11 16:15:28 +0000184
Guido van Rossum3886bb61998-12-04 18:50:17 +0000185DL_EXPORT(void)
Guido van Rossume44e3731994-07-14 13:56:50 +0000186initsyslog()
187{
Guido van Rossumc1822a41995-10-11 16:15:28 +0000188 PyObject *m, *d;
Guido van Rossume44e3731994-07-14 13:56:50 +0000189
190 /* Create the module and add the functions */
Guido van Rossumf6971e21994-08-30 12:25:20 +0000191 m = Py_InitModule("syslog", syslog_methods);
Guido van Rossume44e3731994-07-14 13:56:50 +0000192
193 /* Add some symbolic constants to the module */
Guido van Rossumf6971e21994-08-30 12:25:20 +0000194 d = PyModule_GetDict(m);
Guido van Rossumc1822a41995-10-11 16:15:28 +0000195
196 /* Priorities */
Barry Warsaw43a476a1997-01-09 23:51:21 +0000197 ins(d, "LOG_EMERG", LOG_EMERG);
198 ins(d, "LOG_ALERT", LOG_ALERT);
199 ins(d, "LOG_CRIT", LOG_CRIT);
200 ins(d, "LOG_ERR", LOG_ERR);
201 ins(d, "LOG_WARNING", LOG_WARNING);
202 ins(d, "LOG_NOTICE", LOG_NOTICE);
203 ins(d, "LOG_INFO", LOG_INFO);
204 ins(d, "LOG_DEBUG", LOG_DEBUG);
Guido van Rossumc1822a41995-10-11 16:15:28 +0000205
206 /* openlog() option flags */
Barry Warsaw43a476a1997-01-09 23:51:21 +0000207 ins(d, "LOG_PID", LOG_PID);
208 ins(d, "LOG_CONS", LOG_CONS);
209 ins(d, "LOG_NDELAY", LOG_NDELAY);
Guido van Rossumbcc20741998-08-04 22:53:56 +0000210#ifdef LOG_NOWAIT
Barry Warsaw43a476a1997-01-09 23:51:21 +0000211 ins(d, "LOG_NOWAIT", LOG_NOWAIT);
Guido van Rossumbcc20741998-08-04 22:53:56 +0000212#endif
Guido van Rossumc1822a41995-10-11 16:15:28 +0000213#ifdef LOG_PERROR
Barry Warsaw43a476a1997-01-09 23:51:21 +0000214 ins(d, "LOG_PERROR", LOG_PERROR);
Guido van Rossumc1822a41995-10-11 16:15:28 +0000215#endif
216
217 /* Facilities */
Barry Warsaw43a476a1997-01-09 23:51:21 +0000218 ins(d, "LOG_KERN", LOG_KERN);
219 ins(d, "LOG_USER", LOG_USER);
220 ins(d, "LOG_MAIL", LOG_MAIL);
221 ins(d, "LOG_DAEMON", LOG_DAEMON);
222 ins(d, "LOG_AUTH", LOG_AUTH);
223 ins(d, "LOG_LPR", LOG_LPR);
Barry Warsaw43a476a1997-01-09 23:51:21 +0000224 ins(d, "LOG_LOCAL0", LOG_LOCAL0);
225 ins(d, "LOG_LOCAL1", LOG_LOCAL1);
226 ins(d, "LOG_LOCAL2", LOG_LOCAL2);
227 ins(d, "LOG_LOCAL3", LOG_LOCAL3);
228 ins(d, "LOG_LOCAL4", LOG_LOCAL4);
229 ins(d, "LOG_LOCAL5", LOG_LOCAL5);
230 ins(d, "LOG_LOCAL6", LOG_LOCAL6);
231 ins(d, "LOG_LOCAL7", LOG_LOCAL7);
Guido van Rossume44e3731994-07-14 13:56:50 +0000232
Guido van Rossumae94cf21998-05-08 21:52:55 +0000233#ifndef LOG_SYSLOG
234#define LOG_SYSLOG LOG_DAEMON
235#endif
236#ifndef LOG_NEWS
237#define LOG_NEWS LOG_MAIL
238#endif
239#ifndef LOG_UUCP
240#define LOG_UUCP LOG_MAIL
241#endif
242#ifndef LOG_CRON
243#define LOG_CRON LOG_DAEMON
244#endif
245
246 ins(d, "LOG_SYSLOG", LOG_SYSLOG);
247 ins(d, "LOG_CRON", LOG_CRON);
248 ins(d, "LOG_UUCP", LOG_UUCP);
249 ins(d, "LOG_NEWS", LOG_NEWS);
250
Guido van Rossume44e3731994-07-14 13:56:50 +0000251 /* Check for errors */
Guido van Rossumf6971e21994-08-30 12:25:20 +0000252 if (PyErr_Occurred())
253 Py_FatalError("can't initialize module syslog");
Guido van Rossume44e3731994-07-14 13:56:50 +0000254}