blob: 06c4f342186c68eddd6aab409d36ecf8ad09e741 [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
2995/06/29 (Steve Clift)
30 - Changed arg parsing to use PyArg_ParseTuple.
31 - Added PyErr_Clear() call(s) where needed.
32 - Fix core dumps if user message contains format specifiers.
33 - Change openlog arg defaults to match normal syslog behaviour.
34 - Plug memory leak in openlog().
35 - Fix setlogmask() to return previous mask value.
36
37******************************************************************/
38
Guido van Rossume44e3731994-07-14 13:56:50 +000039/* syslog module */
Guido van Rossume44e3731994-07-14 13:56:50 +000040
Guido van Rossuma597dde1995-01-10 20:56:29 +000041#include "Python.h"
Guido van Rossume44e3731994-07-14 13:56:50 +000042
43#include <syslog.h>
44
Guido van Rossumf6971e21994-08-30 12:25:20 +000045static PyObject *
Guido van Rossume44e3731994-07-14 13:56:50 +000046syslog_openlog(self, args)
Guido van Rossumf6971e21994-08-30 12:25:20 +000047 PyObject * self;
48 PyObject * args;
Guido van Rossume44e3731994-07-14 13:56:50 +000049{
Guido van Rossumc1822a41995-10-11 16:15:28 +000050 long logopt = 0;
Guido van Rossume44e3731994-07-14 13:56:50 +000051 long facility = LOG_USER;
Guido van Rossumc1822a41995-10-11 16:15:28 +000052
53 static PyObject *ident_o = NULL;
54
55 Py_XDECREF(ident_o);
56 if (!PyArg_ParseTuple(args, "S|ll;ident string [, logoption [, facility]]",
57 &ident_o, &logopt, &facility)) {
Guido van Rossume44e3731994-07-14 13:56:50 +000058 return NULL;
Guido van Rossumc1822a41995-10-11 16:15:28 +000059 }
Guido van Rossumf6971e21994-08-30 12:25:20 +000060 Py_INCREF(ident_o); /* This is needed because openlog() does NOT make a copy
Guido van Rossumc1822a41995-10-11 16:15:28 +000061 and syslog() later uses it.. cannot trash it. */
62
63 openlog(PyString_AsString(ident_o), logopt, facility);
64
Guido van Rossumf6971e21994-08-30 12:25:20 +000065 Py_INCREF(Py_None);
66 return Py_None;
Guido van Rossume44e3731994-07-14 13:56:50 +000067}
68
Guido van Rossumf6971e21994-08-30 12:25:20 +000069static PyObject *
Guido van Rossume44e3731994-07-14 13:56:50 +000070syslog_syslog(self, args)
Guido van Rossumf6971e21994-08-30 12:25:20 +000071 PyObject * self;
72 PyObject * args;
Guido van Rossume44e3731994-07-14 13:56:50 +000073{
Guido van Rossumc1822a41995-10-11 16:15:28 +000074 char *message, *s;
75 int priority = LOG_INFO | LOG_USER;
Guido van Rossume44e3731994-07-14 13:56:50 +000076
Guido van Rossumc1822a41995-10-11 16:15:28 +000077 if (!PyArg_ParseTuple(args, "is;[priority,] message string",
78 &priority, &message)) {
79 PyErr_Clear();
80 if (!PyArg_ParseTuple(args, "s;[priority,] message string", &message)) {
Guido van Rossume44e3731994-07-14 13:56:50 +000081 return NULL;
Guido van Rossumc1822a41995-10-11 16:15:28 +000082 }
83 }
84 syslog(priority, "%s", message);
Guido van Rossumf6971e21994-08-30 12:25:20 +000085 Py_INCREF(Py_None);
86 return Py_None;
Guido van Rossume44e3731994-07-14 13:56:50 +000087}
88
Guido van Rossumf6971e21994-08-30 12:25:20 +000089static PyObject *
Guido van Rossume44e3731994-07-14 13:56:50 +000090syslog_closelog(self, args)
Guido van Rossumf6971e21994-08-30 12:25:20 +000091 PyObject * self;
92 PyObject * args;
Guido van Rossume44e3731994-07-14 13:56:50 +000093{
Guido van Rossumc1822a41995-10-11 16:15:28 +000094 if (!PyArg_ParseTuple(args, ""))
Guido van Rossume44e3731994-07-14 13:56:50 +000095 return NULL;
96 closelog();
Guido van Rossumf6971e21994-08-30 12:25:20 +000097 Py_INCREF(Py_None);
98 return Py_None;
Guido van Rossume44e3731994-07-14 13:56:50 +000099}
100
Guido van Rossumf6971e21994-08-30 12:25:20 +0000101static PyObject *
Guido van Rossume44e3731994-07-14 13:56:50 +0000102syslog_setlogmask(self, args)
Guido van Rossumf6971e21994-08-30 12:25:20 +0000103 PyObject * self;
104 PyObject * args;
Guido van Rossume44e3731994-07-14 13:56:50 +0000105{
Guido van Rossumc1822a41995-10-11 16:15:28 +0000106 long maskpri, omaskpri;
107
108 if (!PyArg_ParseTuple(args,"l;mask for priority",&maskpri))
Guido van Rossume44e3731994-07-14 13:56:50 +0000109 return NULL;
Guido van Rossumc1822a41995-10-11 16:15:28 +0000110 omaskpri = setlogmask(maskpri);
111 return PyInt_FromLong(omaskpri);
Guido van Rossume44e3731994-07-14 13:56:50 +0000112}
113
Guido van Rossumf6971e21994-08-30 12:25:20 +0000114static PyObject *
Guido van Rossume44e3731994-07-14 13:56:50 +0000115syslog_log_mask(self, args)
Guido van Rossumf6971e21994-08-30 12:25:20 +0000116 PyObject * self;
117 PyObject * args;
Guido van Rossume44e3731994-07-14 13:56:50 +0000118{
119 long mask;
120 long pri;
Guido van Rossumc1822a41995-10-11 16:15:28 +0000121 if (!PyArg_ParseTuple(args,"l",&pri))
Guido van Rossume44e3731994-07-14 13:56:50 +0000122 return NULL;
123 mask = LOG_MASK(pri);
Guido van Rossumf6971e21994-08-30 12:25:20 +0000124 return PyInt_FromLong(mask);
Guido van Rossume44e3731994-07-14 13:56:50 +0000125}
126
Guido van Rossumf6971e21994-08-30 12:25:20 +0000127static PyObject *
Guido van Rossume44e3731994-07-14 13:56:50 +0000128syslog_log_upto(self, args)
Guido van Rossumf6971e21994-08-30 12:25:20 +0000129 PyObject * self;
130 PyObject * args;
Guido van Rossume44e3731994-07-14 13:56:50 +0000131{
132 long mask;
133 long pri;
Guido van Rossumc1822a41995-10-11 16:15:28 +0000134 if (!PyArg_ParseTuple(args,"l",&pri))
Guido van Rossume44e3731994-07-14 13:56:50 +0000135 return NULL;
136 mask = LOG_UPTO(pri);
Guido van Rossumf6971e21994-08-30 12:25:20 +0000137 return PyInt_FromLong(mask);
Guido van Rossume44e3731994-07-14 13:56:50 +0000138}
139
140/* List of functions defined in the module */
141
Guido van Rossumf6971e21994-08-30 12:25:20 +0000142static PyMethodDef syslog_methods[] = {
Guido van Rossumc1822a41995-10-11 16:15:28 +0000143 {"openlog", syslog_openlog, METH_VARARGS},
144 {"closelog", syslog_closelog, METH_VARARGS},
145 {"syslog", syslog_syslog, METH_VARARGS},
146 {"setlogmask", syslog_setlogmask, METH_VARARGS},
147 {"LOG_MASK", syslog_log_mask, METH_VARARGS},
148 {"LOG_UPTO", syslog_log_upto, METH_VARARGS},
149 {NULL, NULL, 0}
Guido van Rossume44e3731994-07-14 13:56:50 +0000150};
151
152/* Initialization function for the module */
153
Guido van Rossumc1822a41995-10-11 16:15:28 +0000154#define DICT_SET_INT(d, s, x) \
155 PyDict_SetItemString(d, s, PyInt_FromLong((long) (x)))
156
Guido van Rossume44e3731994-07-14 13:56:50 +0000157void
158initsyslog()
159{
Guido van Rossumc1822a41995-10-11 16:15:28 +0000160 PyObject *m, *d;
Guido van Rossume44e3731994-07-14 13:56:50 +0000161
162 /* Create the module and add the functions */
Guido van Rossumf6971e21994-08-30 12:25:20 +0000163 m = Py_InitModule("syslog", syslog_methods);
Guido van Rossume44e3731994-07-14 13:56:50 +0000164
165 /* Add some symbolic constants to the module */
Guido van Rossumf6971e21994-08-30 12:25:20 +0000166 d = PyModule_GetDict(m);
Guido van Rossumc1822a41995-10-11 16:15:28 +0000167
168 /* Priorities */
169 DICT_SET_INT(d, "LOG_EMERG", LOG_EMERG);
170 DICT_SET_INT(d, "LOG_ALERT", LOG_ALERT);
171 DICT_SET_INT(d, "LOG_CRIT", LOG_CRIT);
172 DICT_SET_INT(d, "LOG_ERR", LOG_ERR);
173 DICT_SET_INT(d, "LOG_WARNING", LOG_WARNING);
174 DICT_SET_INT(d, "LOG_NOTICE", LOG_NOTICE);
175 DICT_SET_INT(d, "LOG_INFO", LOG_INFO);
176 DICT_SET_INT(d, "LOG_DEBUG", LOG_DEBUG);
177
178 /* openlog() option flags */
179 DICT_SET_INT(d, "LOG_PID", LOG_PID);
180 DICT_SET_INT(d, "LOG_CONS", LOG_CONS);
181 DICT_SET_INT(d, "LOG_NDELAY", LOG_NDELAY);
182 DICT_SET_INT(d, "LOG_NOWAIT", LOG_NOWAIT);
183#ifdef LOG_PERROR
184 DICT_SET_INT(d, "LOG_PERROR", LOG_PERROR);
185#endif
186
187 /* Facilities */
188 DICT_SET_INT(d, "LOG_KERN", LOG_KERN);
189 DICT_SET_INT(d, "LOG_USER", LOG_USER);
190 DICT_SET_INT(d, "LOG_MAIL", LOG_MAIL);
191 DICT_SET_INT(d, "LOG_DAEMON", LOG_DAEMON);
192 DICT_SET_INT(d, "LOG_AUTH", LOG_AUTH);
193 DICT_SET_INT(d, "LOG_LPR", LOG_LPR);
194 DICT_SET_INT(d, "LOG_NEWS", LOG_NEWS);
195 DICT_SET_INT(d, "LOG_UUCP", LOG_UUCP);
196 DICT_SET_INT(d, "LOG_CRON", LOG_CRON);
197 DICT_SET_INT(d, "LOG_LOCAL0", LOG_LOCAL0);
198 DICT_SET_INT(d, "LOG_LOCAL1", LOG_LOCAL1);
199 DICT_SET_INT(d, "LOG_LOCAL2", LOG_LOCAL2);
200 DICT_SET_INT(d, "LOG_LOCAL3", LOG_LOCAL3);
201 DICT_SET_INT(d, "LOG_LOCAL4", LOG_LOCAL4);
202 DICT_SET_INT(d, "LOG_LOCAL5", LOG_LOCAL5);
203 DICT_SET_INT(d, "LOG_LOCAL6", LOG_LOCAL6);
204 DICT_SET_INT(d, "LOG_LOCAL7", LOG_LOCAL7);
Guido van Rossume44e3731994-07-14 13:56:50 +0000205
206 /* Check for errors */
Guido van Rossumf6971e21994-08-30 12:25:20 +0000207 if (PyErr_Occurred())
208 Py_FatalError("can't initialize module syslog");
Guido van Rossume44e3731994-07-14 13:56:50 +0000209}