|
1 /*********************************************************** |
|
2 Copyright 1994 by Lance Ellinghouse, |
|
3 Cathedral City, California Republic, United States of America. |
|
4 |
|
5 All Rights Reserved |
|
6 |
|
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. |
|
14 |
|
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. |
|
22 |
|
23 ******************************************************************/ |
|
24 |
|
25 /****************************************************************** |
|
26 |
|
27 Revision history: |
|
28 |
|
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. |
|
34 |
|
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. |
|
42 |
|
43 ******************************************************************/ |
|
44 |
|
45 /* syslog module */ |
|
46 |
|
47 #include "Python.h" |
|
48 |
|
49 #include <syslog.h> |
|
50 |
|
51 /* only one instance, only one syslog, so globals should be ok */ |
|
52 static PyObject *S_ident_o = NULL; /* identifier, held by openlog() */ |
|
53 |
|
54 |
|
55 static PyObject * |
|
56 syslog_openlog(PyObject * self, PyObject * args) |
|
57 { |
|
58 long logopt = 0; |
|
59 long facility = LOG_USER; |
|
60 PyObject *new_S_ident_o; |
|
61 |
|
62 if (!PyArg_ParseTuple(args, |
|
63 "S|ll;ident string [, logoption [, facility]]", |
|
64 &new_S_ident_o, &logopt, &facility)) |
|
65 return NULL; |
|
66 |
|
67 /* This is needed because openlog() does NOT make a copy |
|
68 * and syslog() later uses it.. cannot trash it. |
|
69 */ |
|
70 Py_XDECREF(S_ident_o); |
|
71 S_ident_o = new_S_ident_o; |
|
72 Py_INCREF(S_ident_o); |
|
73 |
|
74 openlog(PyString_AsString(S_ident_o), logopt, facility); |
|
75 |
|
76 Py_INCREF(Py_None); |
|
77 return Py_None; |
|
78 } |
|
79 |
|
80 |
|
81 static PyObject * |
|
82 syslog_syslog(PyObject * self, PyObject * args) |
|
83 { |
|
84 char *message; |
|
85 int priority = LOG_INFO; |
|
86 |
|
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; |
|
93 } |
|
94 |
|
95 Py_BEGIN_ALLOW_THREADS; |
|
96 syslog(priority, "%s", message); |
|
97 Py_END_ALLOW_THREADS; |
|
98 Py_INCREF(Py_None); |
|
99 return Py_None; |
|
100 } |
|
101 |
|
102 static PyObject * |
|
103 syslog_closelog(PyObject *self, PyObject *unused) |
|
104 { |
|
105 closelog(); |
|
106 Py_XDECREF(S_ident_o); |
|
107 S_ident_o = NULL; |
|
108 Py_INCREF(Py_None); |
|
109 return Py_None; |
|
110 } |
|
111 |
|
112 static PyObject * |
|
113 syslog_setlogmask(PyObject *self, PyObject *args) |
|
114 { |
|
115 long maskpri, omaskpri; |
|
116 |
|
117 if (!PyArg_ParseTuple(args, "l;mask for priority", &maskpri)) |
|
118 return NULL; |
|
119 omaskpri = setlogmask(maskpri); |
|
120 return PyInt_FromLong(omaskpri); |
|
121 } |
|
122 |
|
123 static PyObject * |
|
124 syslog_log_mask(PyObject *self, PyObject *args) |
|
125 { |
|
126 long mask; |
|
127 long pri; |
|
128 if (!PyArg_ParseTuple(args, "l:LOG_MASK", &pri)) |
|
129 return NULL; |
|
130 mask = LOG_MASK(pri); |
|
131 return PyInt_FromLong(mask); |
|
132 } |
|
133 |
|
134 static PyObject * |
|
135 syslog_log_upto(PyObject *self, PyObject *args) |
|
136 { |
|
137 long mask; |
|
138 long pri; |
|
139 if (!PyArg_ParseTuple(args, "l:LOG_UPTO", &pri)) |
|
140 return NULL; |
|
141 mask = LOG_UPTO(pri); |
|
142 return PyInt_FromLong(mask); |
|
143 } |
|
144 |
|
145 /* List of functions defined in the module */ |
|
146 |
|
147 static PyMethodDef syslog_methods[] = { |
|
148 {"openlog", syslog_openlog, METH_VARARGS}, |
|
149 {"closelog", syslog_closelog, METH_NOARGS}, |
|
150 {"syslog", syslog_syslog, METH_VARARGS}, |
|
151 {"setlogmask", syslog_setlogmask, METH_VARARGS}, |
|
152 {"LOG_MASK", syslog_log_mask, METH_VARARGS}, |
|
153 {"LOG_UPTO", syslog_log_upto, METH_VARARGS}, |
|
154 {NULL, NULL, 0} |
|
155 }; |
|
156 |
|
157 /* Initialization function for the module */ |
|
158 |
|
159 PyMODINIT_FUNC |
|
160 initsyslog(void) |
|
161 { |
|
162 PyObject *m; |
|
163 |
|
164 /* Create the module and add the functions */ |
|
165 m = Py_InitModule("syslog", syslog_methods); |
|
166 if (m == NULL) |
|
167 return; |
|
168 |
|
169 /* Add some symbolic constants to the module */ |
|
170 |
|
171 /* Priorities */ |
|
172 PyModule_AddIntConstant(m, "LOG_EMERG", LOG_EMERG); |
|
173 PyModule_AddIntConstant(m, "LOG_ALERT", LOG_ALERT); |
|
174 PyModule_AddIntConstant(m, "LOG_CRIT", LOG_CRIT); |
|
175 PyModule_AddIntConstant(m, "LOG_ERR", LOG_ERR); |
|
176 PyModule_AddIntConstant(m, "LOG_WARNING", LOG_WARNING); |
|
177 PyModule_AddIntConstant(m, "LOG_NOTICE", LOG_NOTICE); |
|
178 PyModule_AddIntConstant(m, "LOG_INFO", LOG_INFO); |
|
179 PyModule_AddIntConstant(m, "LOG_DEBUG", LOG_DEBUG); |
|
180 |
|
181 /* openlog() option flags */ |
|
182 PyModule_AddIntConstant(m, "LOG_PID", LOG_PID); |
|
183 PyModule_AddIntConstant(m, "LOG_CONS", LOG_CONS); |
|
184 PyModule_AddIntConstant(m, "LOG_NDELAY", LOG_NDELAY); |
|
185 #ifdef LOG_NOWAIT |
|
186 PyModule_AddIntConstant(m, "LOG_NOWAIT", LOG_NOWAIT); |
|
187 #endif |
|
188 #ifdef LOG_PERROR |
|
189 PyModule_AddIntConstant(m, "LOG_PERROR", LOG_PERROR); |
|
190 #endif |
|
191 |
|
192 /* Facilities */ |
|
193 PyModule_AddIntConstant(m, "LOG_KERN", LOG_KERN); |
|
194 PyModule_AddIntConstant(m, "LOG_USER", LOG_USER); |
|
195 PyModule_AddIntConstant(m, "LOG_MAIL", LOG_MAIL); |
|
196 PyModule_AddIntConstant(m, "LOG_DAEMON", LOG_DAEMON); |
|
197 PyModule_AddIntConstant(m, "LOG_AUTH", LOG_AUTH); |
|
198 PyModule_AddIntConstant(m, "LOG_LPR", LOG_LPR); |
|
199 PyModule_AddIntConstant(m, "LOG_LOCAL0", LOG_LOCAL0); |
|
200 PyModule_AddIntConstant(m, "LOG_LOCAL1", LOG_LOCAL1); |
|
201 PyModule_AddIntConstant(m, "LOG_LOCAL2", LOG_LOCAL2); |
|
202 PyModule_AddIntConstant(m, "LOG_LOCAL3", LOG_LOCAL3); |
|
203 PyModule_AddIntConstant(m, "LOG_LOCAL4", LOG_LOCAL4); |
|
204 PyModule_AddIntConstant(m, "LOG_LOCAL5", LOG_LOCAL5); |
|
205 PyModule_AddIntConstant(m, "LOG_LOCAL6", LOG_LOCAL6); |
|
206 PyModule_AddIntConstant(m, "LOG_LOCAL7", LOG_LOCAL7); |
|
207 |
|
208 #ifndef LOG_SYSLOG |
|
209 #define LOG_SYSLOG LOG_DAEMON |
|
210 #endif |
|
211 #ifndef LOG_NEWS |
|
212 #define LOG_NEWS LOG_MAIL |
|
213 #endif |
|
214 #ifndef LOG_UUCP |
|
215 #define LOG_UUCP LOG_MAIL |
|
216 #endif |
|
217 #ifndef LOG_CRON |
|
218 #define LOG_CRON LOG_DAEMON |
|
219 #endif |
|
220 |
|
221 PyModule_AddIntConstant(m, "LOG_SYSLOG", LOG_SYSLOG); |
|
222 PyModule_AddIntConstant(m, "LOG_CRON", LOG_CRON); |
|
223 PyModule_AddIntConstant(m, "LOG_UUCP", LOG_UUCP); |
|
224 PyModule_AddIntConstant(m, "LOG_NEWS", LOG_NEWS); |
|
225 } |