PageRenderTime 446ms CodeModel.GetById 151ms app.highlight 13ms RepoModel.GetById 279ms app.codeStats 0ms

/Modules/syslogmodule.c

http://unladen-swallow.googlecode.com/
C | 225 lines | 140 code | 31 blank | 54 comment | 8 complexity | 7682c318a305495ee5be6b1fc28e25f9 MD5 | raw file
  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}