blob: eda5490c16f1314da39b153919273aa48a909c21 [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;
Guido van Rossumc1822a41995-10-11 16:15:28 +000060
Guido van Rossumc1822a41995-10-11 16:15:28 +000061
Guido van Rossumae94cf21998-05-08 21:52:55 +000062 Py_XDECREF(S_ident_o);
Barry Warsaw43a476a1997-01-09 23:51:21 +000063 if (!PyArg_ParseTuple(args,
64 "S|ll;ident string [, logoption [, facility]]",
Guido van Rossumae94cf21998-05-08 21:52:55 +000065 &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 */
Guido van Rossumae94cf21998-05-08 21:52:55 +000071 Py_INCREF(S_ident_o);
Guido van Rossumc1822a41995-10-11 16:15:28 +000072
Guido van Rossumae94cf21998-05-08 21:52:55 +000073 openlog(PyString_AsString(S_ident_o), logopt, facility);
Barry Warsaw43a476a1997-01-09 23:51:21 +000074
75 Py_INCREF(Py_None);
76 return Py_None;
Guido van Rossume44e3731994-07-14 13:56:50 +000077}
78
Barry Warsaw43a476a1997-01-09 23:51:21 +000079
Guido van Rossumf6971e21994-08-30 12:25:20 +000080static PyObject *
Peter Schneider-Kamp41c36ff2000-07-10 12:29:26 +000081syslog_syslog(PyObject * self, PyObject * args)
Guido van Rossume44e3731994-07-14 13:56:50 +000082{
Barry Warsaw43a476a1997-01-09 23:51:21 +000083 char *message;
Guido van Rossumae94cf21998-05-08 21:52:55 +000084 int priority = LOG_INFO;
Guido van Rossume44e3731994-07-14 13:56:50 +000085
Barry Warsaw43a476a1997-01-09 23:51:21 +000086 if (!PyArg_ParseTuple(args, "is;[priority,] message string",
87 &priority, &message)) {
88 PyErr_Clear();
89 if (!PyArg_ParseTuple(args, "s;[priority,] message string",
90 &message))
91 return NULL;
92 }
Guido van Rossumae94cf21998-05-08 21:52:55 +000093
Barry Warsaw43a476a1997-01-09 23:51:21 +000094 syslog(priority, "%s", message);
95 Py_INCREF(Py_None);
96 return Py_None;
Guido van Rossume44e3731994-07-14 13:56:50 +000097}
98
Guido van Rossumf6971e21994-08-30 12:25:20 +000099static PyObject *
Peter Schneider-Kamp41c36ff2000-07-10 12:29:26 +0000100syslog_closelog(PyObject *self, PyObject *args)
Guido van Rossume44e3731994-07-14 13:56:50 +0000101{
Guido van Rossum43713e52000-02-29 13:59:29 +0000102 if (!PyArg_ParseTuple(args, ":closelog"))
Guido van Rossume44e3731994-07-14 13:56:50 +0000103 return NULL;
104 closelog();
Guido van Rossumae94cf21998-05-08 21:52:55 +0000105 Py_XDECREF(S_ident_o);
106 S_ident_o = NULL;
Guido van Rossumf6971e21994-08-30 12:25:20 +0000107 Py_INCREF(Py_None);
108 return Py_None;
Guido van Rossume44e3731994-07-14 13:56:50 +0000109}
110
Guido van Rossumf6971e21994-08-30 12:25:20 +0000111static PyObject *
Peter Schneider-Kamp41c36ff2000-07-10 12:29:26 +0000112syslog_setlogmask(PyObject *self, PyObject *args)
Guido van Rossume44e3731994-07-14 13:56:50 +0000113{
Barry Warsaw43a476a1997-01-09 23:51:21 +0000114 long maskpri, omaskpri;
Guido van Rossumc1822a41995-10-11 16:15:28 +0000115
Barry Warsaw43a476a1997-01-09 23:51:21 +0000116 if (!PyArg_ParseTuple(args, "l;mask for priority", &maskpri))
117 return NULL;
118 omaskpri = setlogmask(maskpri);
119 return PyInt_FromLong(omaskpri);
Guido van Rossume44e3731994-07-14 13:56:50 +0000120}
121
Guido van Rossumf6971e21994-08-30 12:25:20 +0000122static PyObject *
Peter Schneider-Kamp41c36ff2000-07-10 12:29:26 +0000123syslog_log_mask(PyObject *self, PyObject *args)
Guido van Rossume44e3731994-07-14 13:56:50 +0000124{
Barry Warsaw43a476a1997-01-09 23:51:21 +0000125 long mask;
126 long pri;
Guido van Rossum43713e52000-02-29 13:59:29 +0000127 if (!PyArg_ParseTuple(args, "l:LOG_MASK", &pri))
Barry Warsaw43a476a1997-01-09 23:51:21 +0000128 return NULL;
129 mask = LOG_MASK(pri);
130 return PyInt_FromLong(mask);
Guido van Rossume44e3731994-07-14 13:56:50 +0000131}
132
Guido van Rossumf6971e21994-08-30 12:25:20 +0000133static PyObject *
Peter Schneider-Kamp41c36ff2000-07-10 12:29:26 +0000134syslog_log_upto(PyObject *self, PyObject *args)
Guido van Rossume44e3731994-07-14 13:56:50 +0000135{
Barry Warsaw43a476a1997-01-09 23:51:21 +0000136 long mask;
137 long pri;
Guido van Rossum43713e52000-02-29 13:59:29 +0000138 if (!PyArg_ParseTuple(args, "l:LOG_UPTO", &pri))
Barry Warsaw43a476a1997-01-09 23:51:21 +0000139 return NULL;
140 mask = LOG_UPTO(pri);
141 return PyInt_FromLong(mask);
Guido van Rossume44e3731994-07-14 13:56:50 +0000142}
143
144/* List of functions defined in the module */
145
Guido van Rossumf6971e21994-08-30 12:25:20 +0000146static PyMethodDef syslog_methods[] = {
Guido van Rossumc1822a41995-10-11 16:15:28 +0000147 {"openlog", syslog_openlog, METH_VARARGS},
148 {"closelog", syslog_closelog, METH_VARARGS},
149 {"syslog", syslog_syslog, METH_VARARGS},
150 {"setlogmask", syslog_setlogmask, METH_VARARGS},
151 {"LOG_MASK", syslog_log_mask, METH_VARARGS},
152 {"LOG_UPTO", syslog_log_upto, METH_VARARGS},
153 {NULL, NULL, 0}
Guido van Rossume44e3731994-07-14 13:56:50 +0000154};
155
Guido van Rossumae94cf21998-05-08 21:52:55 +0000156/* helper function for initialization function */
Guido van Rossume44e3731994-07-14 13:56:50 +0000157
Barry Warsawe886ea91997-01-17 00:01:33 +0000158static void
Peter Schneider-Kamp41c36ff2000-07-10 12:29:26 +0000159ins(PyObject *d, char *s, long x)
Barry Warsaw43a476a1997-01-09 23:51:21 +0000160{
Barry Warsawe886ea91997-01-17 00:01:33 +0000161 PyObject *v = PyInt_FromLong(x);
162 if (v) {
163 PyDict_SetItemString(d, s, v);
164 Py_DECREF(v);
165 }
Barry Warsaw43a476a1997-01-09 23:51:21 +0000166}
167
Guido van Rossumae94cf21998-05-08 21:52:55 +0000168/* Initialization function for the module */
Guido van Rossumc1822a41995-10-11 16:15:28 +0000169
Guido van Rossum3886bb61998-12-04 18:50:17 +0000170DL_EXPORT(void)
Thomas Woutersf3f33dc2000-07-21 06:00:07 +0000171initsyslog(void)
Guido van Rossume44e3731994-07-14 13:56:50 +0000172{
Guido van Rossumc1822a41995-10-11 16:15:28 +0000173 PyObject *m, *d;
Guido van Rossume44e3731994-07-14 13:56:50 +0000174
175 /* Create the module and add the functions */
Guido van Rossumf6971e21994-08-30 12:25:20 +0000176 m = Py_InitModule("syslog", syslog_methods);
Guido van Rossume44e3731994-07-14 13:56:50 +0000177
178 /* Add some symbolic constants to the module */
Guido van Rossumf6971e21994-08-30 12:25:20 +0000179 d = PyModule_GetDict(m);
Guido van Rossumc1822a41995-10-11 16:15:28 +0000180
181 /* Priorities */
Barry Warsaw43a476a1997-01-09 23:51:21 +0000182 ins(d, "LOG_EMERG", LOG_EMERG);
183 ins(d, "LOG_ALERT", LOG_ALERT);
184 ins(d, "LOG_CRIT", LOG_CRIT);
185 ins(d, "LOG_ERR", LOG_ERR);
186 ins(d, "LOG_WARNING", LOG_WARNING);
187 ins(d, "LOG_NOTICE", LOG_NOTICE);
188 ins(d, "LOG_INFO", LOG_INFO);
189 ins(d, "LOG_DEBUG", LOG_DEBUG);
Guido van Rossumc1822a41995-10-11 16:15:28 +0000190
191 /* openlog() option flags */
Barry Warsaw43a476a1997-01-09 23:51:21 +0000192 ins(d, "LOG_PID", LOG_PID);
193 ins(d, "LOG_CONS", LOG_CONS);
194 ins(d, "LOG_NDELAY", LOG_NDELAY);
Guido van Rossumbcc20741998-08-04 22:53:56 +0000195#ifdef LOG_NOWAIT
Barry Warsaw43a476a1997-01-09 23:51:21 +0000196 ins(d, "LOG_NOWAIT", LOG_NOWAIT);
Guido van Rossumbcc20741998-08-04 22:53:56 +0000197#endif
Guido van Rossumc1822a41995-10-11 16:15:28 +0000198#ifdef LOG_PERROR
Barry Warsaw43a476a1997-01-09 23:51:21 +0000199 ins(d, "LOG_PERROR", LOG_PERROR);
Guido van Rossumc1822a41995-10-11 16:15:28 +0000200#endif
201
202 /* Facilities */
Barry Warsaw43a476a1997-01-09 23:51:21 +0000203 ins(d, "LOG_KERN", LOG_KERN);
204 ins(d, "LOG_USER", LOG_USER);
205 ins(d, "LOG_MAIL", LOG_MAIL);
206 ins(d, "LOG_DAEMON", LOG_DAEMON);
207 ins(d, "LOG_AUTH", LOG_AUTH);
208 ins(d, "LOG_LPR", LOG_LPR);
Barry Warsaw43a476a1997-01-09 23:51:21 +0000209 ins(d, "LOG_LOCAL0", LOG_LOCAL0);
210 ins(d, "LOG_LOCAL1", LOG_LOCAL1);
211 ins(d, "LOG_LOCAL2", LOG_LOCAL2);
212 ins(d, "LOG_LOCAL3", LOG_LOCAL3);
213 ins(d, "LOG_LOCAL4", LOG_LOCAL4);
214 ins(d, "LOG_LOCAL5", LOG_LOCAL5);
215 ins(d, "LOG_LOCAL6", LOG_LOCAL6);
216 ins(d, "LOG_LOCAL7", LOG_LOCAL7);
Guido van Rossume44e3731994-07-14 13:56:50 +0000217
Guido van Rossumae94cf21998-05-08 21:52:55 +0000218#ifndef LOG_SYSLOG
219#define LOG_SYSLOG LOG_DAEMON
220#endif
221#ifndef LOG_NEWS
222#define LOG_NEWS LOG_MAIL
223#endif
224#ifndef LOG_UUCP
225#define LOG_UUCP LOG_MAIL
226#endif
227#ifndef LOG_CRON
228#define LOG_CRON LOG_DAEMON
229#endif
230
231 ins(d, "LOG_SYSLOG", LOG_SYSLOG);
232 ins(d, "LOG_CRON", LOG_CRON);
233 ins(d, "LOG_UUCP", LOG_UUCP);
234 ins(d, "LOG_NEWS", LOG_NEWS);
Guido van Rossume44e3731994-07-14 13:56:50 +0000235}