Documentation clarified to mention optional parameters.
[python.git] / Modules / syslogmodule.c
blob4a77916942ba40e98013f94685c5cc3922cb1dab
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 behavior.
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(PyObject * self, PyObject * args)
58 long logopt = 0;
59 long facility = LOG_USER;
60 PyObject *new_S_ident_o;
62 if (!PyArg_ParseTuple(args,
63 "S|ll;ident string [, logoption [, facility]]",
64 &new_S_ident_o, &logopt, &facility))
65 return NULL;
67 /* This is needed because openlog() does NOT make a copy
68 * and syslog() later uses it.. cannot trash it.
70 Py_XDECREF(S_ident_o);
71 S_ident_o = new_S_ident_o;
72 Py_INCREF(S_ident_o);
74 openlog(PyString_AsString(S_ident_o), logopt, facility);
76 Py_INCREF(Py_None);
77 return Py_None;
81 static PyObject *
82 syslog_syslog(PyObject * self, PyObject * args)
84 char *message;
85 int priority = LOG_INFO;
87 if (!PyArg_ParseTuple(args, "is;[priority,] message string",
88 &priority, &message)) {
89 PyErr_Clear();
90 if (!PyArg_ParseTuple(args, "s;[priority,] message string",
91 &message))
92 return NULL;
95 syslog(priority, "%s", message);
96 Py_INCREF(Py_None);
97 return Py_None;
100 static PyObject *
101 syslog_closelog(PyObject *self, PyObject *unused)
103 closelog();
104 Py_XDECREF(S_ident_o);
105 S_ident_o = NULL;
106 Py_INCREF(Py_None);
107 return Py_None;
110 static PyObject *
111 syslog_setlogmask(PyObject *self, PyObject *args)
113 long maskpri, omaskpri;
115 if (!PyArg_ParseTuple(args, "l;mask for priority", &maskpri))
116 return NULL;
117 omaskpri = setlogmask(maskpri);
118 return PyInt_FromLong(omaskpri);
121 static PyObject *
122 syslog_log_mask(PyObject *self, PyObject *args)
124 long mask;
125 long pri;
126 if (!PyArg_ParseTuple(args, "l:LOG_MASK", &pri))
127 return NULL;
128 mask = LOG_MASK(pri);
129 return PyInt_FromLong(mask);
132 static PyObject *
133 syslog_log_upto(PyObject *self, PyObject *args)
135 long mask;
136 long pri;
137 if (!PyArg_ParseTuple(args, "l:LOG_UPTO", &pri))
138 return NULL;
139 mask = LOG_UPTO(pri);
140 return PyInt_FromLong(mask);
143 /* List of functions defined in the module */
145 static PyMethodDef syslog_methods[] = {
146 {"openlog", syslog_openlog, METH_VARARGS},
147 {"closelog", syslog_closelog, METH_NOARGS},
148 {"syslog", syslog_syslog, METH_VARARGS},
149 {"setlogmask", syslog_setlogmask, METH_VARARGS},
150 {"LOG_MASK", syslog_log_mask, METH_VARARGS},
151 {"LOG_UPTO", syslog_log_upto, METH_VARARGS},
152 {NULL, NULL, 0}
155 /* Initialization function for the module */
157 PyMODINIT_FUNC
158 initsyslog(void)
160 PyObject *m;
162 /* Create the module and add the functions */
163 m = Py_InitModule("syslog", syslog_methods);
164 if (m == NULL)
165 return;
167 /* Add some symbolic constants to the module */
169 /* Priorities */
170 PyModule_AddIntConstant(m, "LOG_EMERG", LOG_EMERG);
171 PyModule_AddIntConstant(m, "LOG_ALERT", LOG_ALERT);
172 PyModule_AddIntConstant(m, "LOG_CRIT", LOG_CRIT);
173 PyModule_AddIntConstant(m, "LOG_ERR", LOG_ERR);
174 PyModule_AddIntConstant(m, "LOG_WARNING", LOG_WARNING);
175 PyModule_AddIntConstant(m, "LOG_NOTICE", LOG_NOTICE);
176 PyModule_AddIntConstant(m, "LOG_INFO", LOG_INFO);
177 PyModule_AddIntConstant(m, "LOG_DEBUG", LOG_DEBUG);
179 /* openlog() option flags */
180 PyModule_AddIntConstant(m, "LOG_PID", LOG_PID);
181 PyModule_AddIntConstant(m, "LOG_CONS", LOG_CONS);
182 PyModule_AddIntConstant(m, "LOG_NDELAY", LOG_NDELAY);
183 #ifdef LOG_NOWAIT
184 PyModule_AddIntConstant(m, "LOG_NOWAIT", LOG_NOWAIT);
185 #endif
186 #ifdef LOG_PERROR
187 PyModule_AddIntConstant(m, "LOG_PERROR", LOG_PERROR);
188 #endif
190 /* Facilities */
191 PyModule_AddIntConstant(m, "LOG_KERN", LOG_KERN);
192 PyModule_AddIntConstant(m, "LOG_USER", LOG_USER);
193 PyModule_AddIntConstant(m, "LOG_MAIL", LOG_MAIL);
194 PyModule_AddIntConstant(m, "LOG_DAEMON", LOG_DAEMON);
195 PyModule_AddIntConstant(m, "LOG_AUTH", LOG_AUTH);
196 PyModule_AddIntConstant(m, "LOG_LPR", LOG_LPR);
197 PyModule_AddIntConstant(m, "LOG_LOCAL0", LOG_LOCAL0);
198 PyModule_AddIntConstant(m, "LOG_LOCAL1", LOG_LOCAL1);
199 PyModule_AddIntConstant(m, "LOG_LOCAL2", LOG_LOCAL2);
200 PyModule_AddIntConstant(m, "LOG_LOCAL3", LOG_LOCAL3);
201 PyModule_AddIntConstant(m, "LOG_LOCAL4", LOG_LOCAL4);
202 PyModule_AddIntConstant(m, "LOG_LOCAL5", LOG_LOCAL5);
203 PyModule_AddIntConstant(m, "LOG_LOCAL6", LOG_LOCAL6);
204 PyModule_AddIntConstant(m, "LOG_LOCAL7", LOG_LOCAL7);
206 #ifndef LOG_SYSLOG
207 #define LOG_SYSLOG LOG_DAEMON
208 #endif
209 #ifndef LOG_NEWS
210 #define LOG_NEWS LOG_MAIL
211 #endif
212 #ifndef LOG_UUCP
213 #define LOG_UUCP LOG_MAIL
214 #endif
215 #ifndef LOG_CRON
216 #define LOG_CRON LOG_DAEMON
217 #endif
219 PyModule_AddIntConstant(m, "LOG_SYSLOG", LOG_SYSLOG);
220 PyModule_AddIntConstant(m, "LOG_CRON", LOG_CRON);
221 PyModule_AddIntConstant(m, "LOG_UUCP", LOG_UUCP);
222 PyModule_AddIntConstant(m, "LOG_NEWS", LOG_NEWS);