source: python/vendor/Python-2.6.5/Modules/syslogmodule.c

Last change on this file was 2, checked in by Yuri Dario, 15 years ago

Initial import for vendor code.

  • Property svn:eol-style set to native
File size: 6.6 KB
Line 
1/***********************************************************
2Copyright 1994 by Lance Ellinghouse,
3Cathedral City, California Republic, United States of America.
4
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
11supporting 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.
14
15LANCE ELLINGHOUSE DISCLAIMS ALL WARRANTIES WITH REGARD TO
16THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
17FITNESS, 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.
22
23******************************************************************/
24
25/******************************************************************
26
27Revision history:
28
291998/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
3595/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 */
52static PyObject *S_ident_o = NULL; /* identifier, held by openlog() */
53
54
55static PyObject *
56syslog_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
81static PyObject *
82syslog_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
102static PyObject *
103syslog_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
112static PyObject *
113syslog_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
123static PyObject *
124syslog_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
134static PyObject *
135syslog_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
147static 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
159PyMODINIT_FUNC
160initsyslog(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}
Note: See TracBrowser for help on using the repository browser.