Added 'list_only' option (and modified 'run()' to respect it).
[python/dscho.git] / Modules / syslogmodule.c
blob60889b1530ce93ac24fb0afd910d716f802ca9c3
1 /***********************************************************
2 Copyright 1994 by Lance Ellinghouse,
3 Cathedral City, California Republic, United States of America.
5 All Rights Reserved
7 Permission to use, copy, modify, and distribute this software and its
8 documentation for any purpose and without fee is hereby granted,
9 provided that the above copyright notice appear in all copies and that
10 both that copyright notice and this permission notice appear in
11 supporting documentation, and that the name of Lance Ellinghouse
12 not be used in advertising or publicity pertaining to distribution
13 of the software without specific, written prior permission.
15 LANCE ELLINGHOUSE DISCLAIMS ALL WARRANTIES WITH REGARD TO
16 THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
17 FITNESS, IN NO EVENT SHALL LANCE ELLINGHOUSE BE LIABLE FOR ANY SPECIAL,
18 INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING
19 FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT,
20 NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION
21 WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
23 ******************************************************************/
25 /******************************************************************
27 Revision history:
29 1998/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.
35 95/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.
43 ******************************************************************/
45 /* syslog module */
47 #include "Python.h"
49 #include <syslog.h>
51 /* only one instance, only one syslog, so globals should be ok */
52 static PyObject *S_ident_o = NULL; /* identifier, held by openlog() */
55 static PyObject *
56 syslog_openlog(self, args)
57 PyObject * self;
58 PyObject * args;
60 long logopt = 0;
61 long facility = LOG_USER;
64 Py_XDECREF(S_ident_o);
65 if (!PyArg_ParseTuple(args,
66 "S|ll;ident string [, logoption [, facility]]",
67 &S_ident_o, &logopt, &facility))
68 return NULL;
70 /* This is needed because openlog() does NOT make a copy
71 * and syslog() later uses it.. cannot trash it.
73 Py_INCREF(S_ident_o);
75 openlog(PyString_AsString(S_ident_o), logopt, facility);
77 Py_INCREF(Py_None);
78 return Py_None;
82 static PyObject *
83 syslog_syslog(self, args)
84 PyObject * self;
85 PyObject * args;
87 char *message;
88 int priority = LOG_INFO;
90 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;
98 syslog(priority, "%s", message);
99 Py_INCREF(Py_None);
100 return Py_None;
103 static PyObject *
104 syslog_closelog(self, args)
105 PyObject * self;
106 PyObject * args;
108 if (!PyArg_ParseTuple(args, ""))
109 return NULL;
110 closelog();
111 Py_XDECREF(S_ident_o);
112 S_ident_o = NULL;
113 Py_INCREF(Py_None);
114 return Py_None;
117 static PyObject *
118 syslog_setlogmask(self, args)
119 PyObject * self;
120 PyObject * args;
122 long maskpri, omaskpri;
124 if (!PyArg_ParseTuple(args, "l;mask for priority", &maskpri))
125 return NULL;
126 omaskpri = setlogmask(maskpri);
127 return PyInt_FromLong(omaskpri);
130 static PyObject *
131 syslog_log_mask(self, args)
132 PyObject * self;
133 PyObject * args;
135 long mask;
136 long pri;
137 if (!PyArg_ParseTuple(args, "l", &pri))
138 return NULL;
139 mask = LOG_MASK(pri);
140 return PyInt_FromLong(mask);
143 static PyObject *
144 syslog_log_upto(self, args)
145 PyObject * self;
146 PyObject * args;
148 long mask;
149 long pri;
150 if (!PyArg_ParseTuple(args, "l", &pri))
151 return NULL;
152 mask = LOG_UPTO(pri);
153 return PyInt_FromLong(mask);
156 /* List of functions defined in the module */
158 static PyMethodDef syslog_methods[] = {
159 {"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}
168 /* helper function for initialization function */
170 static void
171 ins(d, s, x)
172 PyObject *d;
173 char *s;
174 long x;
176 PyObject *v = PyInt_FromLong(x);
177 if (v) {
178 PyDict_SetItemString(d, s, v);
179 Py_DECREF(v);
183 /* Initialization function for the module */
185 DL_EXPORT(void)
186 initsyslog()
188 PyObject *m, *d;
190 /* Create the module and add the functions */
191 m = Py_InitModule("syslog", syslog_methods);
193 /* Add some symbolic constants to the module */
194 d = PyModule_GetDict(m);
196 /* Priorities */
197 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);
206 /* openlog() option flags */
207 ins(d, "LOG_PID", LOG_PID);
208 ins(d, "LOG_CONS", LOG_CONS);
209 ins(d, "LOG_NDELAY", LOG_NDELAY);
210 #ifdef LOG_NOWAIT
211 ins(d, "LOG_NOWAIT", LOG_NOWAIT);
212 #endif
213 #ifdef LOG_PERROR
214 ins(d, "LOG_PERROR", LOG_PERROR);
215 #endif
217 /* Facilities */
218 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);
224 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);
233 #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
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);
251 /* Check for errors */
252 if (PyErr_Occurred())
253 Py_FatalError("can't initialize module syslog");