blob: daee15f1fbc7d8706068d78eb624da8e87dfe298 [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)
Barry Warsaw43a476a1997-01-09 23:51:21 +000047 PyObject * self;
48 PyObject * args;
Guido van Rossume44e3731994-07-14 13:56:50 +000049{
Barry Warsaw43a476a1997-01-09 23:51:21 +000050 long logopt = 0;
51 long facility = LOG_USER;
Guido van Rossumc1822a41995-10-11 16:15:28 +000052
Barry Warsaw43a476a1997-01-09 23:51:21 +000053 static PyObject *ident_o = NULL;
Guido van Rossumc1822a41995-10-11 16:15:28 +000054
Barry Warsaw43a476a1997-01-09 23:51:21 +000055 Py_XDECREF(ident_o);
56 if (!PyArg_ParseTuple(args,
57 "S|ll;ident string [, logoption [, facility]]",
58 &ident_o, &logopt, &facility))
59 return NULL;
Guido van Rossumc1822a41995-10-11 16:15:28 +000060
Barry Warsaw43a476a1997-01-09 23:51:21 +000061 /* This is needed because openlog() does NOT make a copy
62 * and syslog() later uses it.. cannot trash it.
63 */
64 Py_INCREF(ident_o);
Guido van Rossumc1822a41995-10-11 16:15:28 +000065
Barry Warsaw43a476a1997-01-09 23:51:21 +000066 openlog(PyString_AsString(ident_o), logopt, facility);
67
68 Py_INCREF(Py_None);
69 return Py_None;
Guido van Rossume44e3731994-07-14 13:56:50 +000070}
71
Barry Warsaw43a476a1997-01-09 23:51:21 +000072
Guido van Rossumf6971e21994-08-30 12:25:20 +000073static PyObject *
Guido van Rossume44e3731994-07-14 13:56:50 +000074syslog_syslog(self, args)
Barry Warsaw43a476a1997-01-09 23:51:21 +000075 PyObject * self;
76 PyObject * args;
Guido van Rossume44e3731994-07-14 13:56:50 +000077{
Barry Warsaw43a476a1997-01-09 23:51:21 +000078 char *message;
79 int priority = LOG_INFO | LOG_USER;
Guido van Rossume44e3731994-07-14 13:56:50 +000080
Barry Warsaw43a476a1997-01-09 23:51:21 +000081 if (!PyArg_ParseTuple(args, "is;[priority,] message string",
82 &priority, &message)) {
83 PyErr_Clear();
84 if (!PyArg_ParseTuple(args, "s;[priority,] message string",
85 &message))
86 return NULL;
87 }
88 syslog(priority, "%s", message);
89 Py_INCREF(Py_None);
90 return Py_None;
Guido van Rossume44e3731994-07-14 13:56:50 +000091}
92
Guido van Rossumf6971e21994-08-30 12:25:20 +000093static PyObject *
Guido van Rossume44e3731994-07-14 13:56:50 +000094syslog_closelog(self, args)
Barry Warsaw43a476a1997-01-09 23:51:21 +000095 PyObject * self;
96 PyObject * args;
Guido van Rossume44e3731994-07-14 13:56:50 +000097{
Guido van Rossumc1822a41995-10-11 16:15:28 +000098 if (!PyArg_ParseTuple(args, ""))
Guido van Rossume44e3731994-07-14 13:56:50 +000099 return NULL;
100 closelog();
Guido van Rossumf6971e21994-08-30 12:25:20 +0000101 Py_INCREF(Py_None);
102 return Py_None;
Guido van Rossume44e3731994-07-14 13:56:50 +0000103}
104
Guido van Rossumf6971e21994-08-30 12:25:20 +0000105static PyObject *
Guido van Rossume44e3731994-07-14 13:56:50 +0000106syslog_setlogmask(self, args)
Barry Warsaw43a476a1997-01-09 23:51:21 +0000107 PyObject * self;
108 PyObject * args;
Guido van Rossume44e3731994-07-14 13:56:50 +0000109{
Barry Warsaw43a476a1997-01-09 23:51:21 +0000110 long maskpri, omaskpri;
Guido van Rossumc1822a41995-10-11 16:15:28 +0000111
Barry Warsaw43a476a1997-01-09 23:51:21 +0000112 if (!PyArg_ParseTuple(args, "l;mask for priority", &maskpri))
113 return NULL;
114 omaskpri = setlogmask(maskpri);
115 return PyInt_FromLong(omaskpri);
Guido van Rossume44e3731994-07-14 13:56:50 +0000116}
117
Guido van Rossumf6971e21994-08-30 12:25:20 +0000118static PyObject *
Guido van Rossume44e3731994-07-14 13:56:50 +0000119syslog_log_mask(self, args)
Barry Warsaw43a476a1997-01-09 23:51:21 +0000120 PyObject * self;
121 PyObject * args;
Guido van Rossume44e3731994-07-14 13:56:50 +0000122{
Barry Warsaw43a476a1997-01-09 23:51:21 +0000123 long mask;
124 long pri;
125 if (!PyArg_ParseTuple(args, "l", &pri))
126 return NULL;
127 mask = LOG_MASK(pri);
128 return PyInt_FromLong(mask);
Guido van Rossume44e3731994-07-14 13:56:50 +0000129}
130
Guido van Rossumf6971e21994-08-30 12:25:20 +0000131static PyObject *
Guido van Rossume44e3731994-07-14 13:56:50 +0000132syslog_log_upto(self, args)
Barry Warsaw43a476a1997-01-09 23:51:21 +0000133 PyObject * self;
134 PyObject * args;
Guido van Rossume44e3731994-07-14 13:56:50 +0000135{
Barry Warsaw43a476a1997-01-09 23:51:21 +0000136 long mask;
137 long pri;
138 if (!PyArg_ParseTuple(args, "l", &pri))
139 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
156/* Initialization function for the module */
157
Barry Warsawe886ea91997-01-17 00:01:33 +0000158static void
159ins(d, s, x)
Barry Warsaw43a476a1997-01-09 23:51:21 +0000160 PyObject *d;
161 char *s;
162 long x;
163{
Barry Warsawe886ea91997-01-17 00:01:33 +0000164 PyObject *v = PyInt_FromLong(x);
165 if (v) {
166 PyDict_SetItemString(d, s, v);
167 Py_DECREF(v);
168 }
Barry Warsaw43a476a1997-01-09 23:51:21 +0000169}
170
Guido van Rossumc1822a41995-10-11 16:15:28 +0000171
Guido van Rossume44e3731994-07-14 13:56:50 +0000172void
173initsyslog()
174{
Guido van Rossumc1822a41995-10-11 16:15:28 +0000175 PyObject *m, *d;
Guido van Rossume44e3731994-07-14 13:56:50 +0000176
177 /* Create the module and add the functions */
Guido van Rossumf6971e21994-08-30 12:25:20 +0000178 m = Py_InitModule("syslog", syslog_methods);
Guido van Rossume44e3731994-07-14 13:56:50 +0000179
180 /* Add some symbolic constants to the module */
Guido van Rossumf6971e21994-08-30 12:25:20 +0000181 d = PyModule_GetDict(m);
Guido van Rossumc1822a41995-10-11 16:15:28 +0000182
183 /* Priorities */
Barry Warsaw43a476a1997-01-09 23:51:21 +0000184 ins(d, "LOG_EMERG", LOG_EMERG);
185 ins(d, "LOG_ALERT", LOG_ALERT);
186 ins(d, "LOG_CRIT", LOG_CRIT);
187 ins(d, "LOG_ERR", LOG_ERR);
188 ins(d, "LOG_WARNING", LOG_WARNING);
189 ins(d, "LOG_NOTICE", LOG_NOTICE);
190 ins(d, "LOG_INFO", LOG_INFO);
191 ins(d, "LOG_DEBUG", LOG_DEBUG);
Guido van Rossumc1822a41995-10-11 16:15:28 +0000192
193 /* openlog() option flags */
Barry Warsaw43a476a1997-01-09 23:51:21 +0000194 ins(d, "LOG_PID", LOG_PID);
195 ins(d, "LOG_CONS", LOG_CONS);
196 ins(d, "LOG_NDELAY", LOG_NDELAY);
197 ins(d, "LOG_NOWAIT", LOG_NOWAIT);
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);
Guido van Rossum63df09a1996-07-30 16:55:34 +0000209#ifdef LOG_NEWS
Barry Warsaw43a476a1997-01-09 23:51:21 +0000210 ins(d, "LOG_NEWS", LOG_NEWS);
Guido van Rossum63df09a1996-07-30 16:55:34 +0000211#else
Barry Warsaw43a476a1997-01-09 23:51:21 +0000212 ins(d, "LOG_NEWS", LOG_MAIL);
Guido van Rossum63df09a1996-07-30 16:55:34 +0000213#endif
214#ifdef LOG_UUCP
Barry Warsaw43a476a1997-01-09 23:51:21 +0000215 ins(d, "LOG_UUCP", LOG_UUCP);
Guido van Rossum63df09a1996-07-30 16:55:34 +0000216#else
Barry Warsaw43a476a1997-01-09 23:51:21 +0000217 ins(d, "LOG_UUCP", LOG_MAIL);
Guido van Rossum63df09a1996-07-30 16:55:34 +0000218#endif
219#ifdef LOG_CRON
Barry Warsaw43a476a1997-01-09 23:51:21 +0000220 ins(d, "LOG_CRON", LOG_CRON);
Guido van Rossum63df09a1996-07-30 16:55:34 +0000221#else
Barry Warsaw43a476a1997-01-09 23:51:21 +0000222 ins(d, "LOG_CRON", LOG_DAEMON);
Guido van Rossum63df09a1996-07-30 16:55:34 +0000223#endif
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
233 /* Check for errors */
Guido van Rossumf6971e21994-08-30 12:25:20 +0000234 if (PyErr_Occurred())
235 Py_FatalError("can't initialize module syslog");
Guido van Rossume44e3731994-07-14 13:56:50 +0000236}