syslogmodule.c revision c1822a4dd1b5276211be041c7ac216c549c787a4
1e44e373cbc311e211d379e0633d53af4210d29faGuido van Rossum/***********************************************************
2f6971e2958a162298885b6069cc137d973fac356Guido van RossumCopyright 1994 by Lance Ellinghouse,
3f6971e2958a162298885b6069cc137d973fac356Guido van RossumCathedral City, California Republic, United States of America.
4e44e373cbc311e211d379e0633d53af4210d29faGuido van Rossum
5e44e373cbc311e211d379e0633d53af4210d29faGuido van Rossum                        All Rights Reserved
6e44e373cbc311e211d379e0633d53af4210d29faGuido van Rossum
7e44e373cbc311e211d379e0633d53af4210d29faGuido van RossumPermission to use, copy, modify, and distribute this software and its
8e44e373cbc311e211d379e0633d53af4210d29faGuido van Rossumdocumentation for any purpose and without fee is hereby granted,
9e44e373cbc311e211d379e0633d53af4210d29faGuido van Rossumprovided that the above copyright notice appear in all copies and that
10e44e373cbc311e211d379e0633d53af4210d29faGuido van Rossumboth that copyright notice and this permission notice appear in
11f6971e2958a162298885b6069cc137d973fac356Guido van Rossumsupporting documentation, and that the name of Lance Ellinghouse
12f6971e2958a162298885b6069cc137d973fac356Guido van Rossumnot be used in advertising or publicity pertaining to distribution
13f6971e2958a162298885b6069cc137d973fac356Guido van Rossumof the software without specific, written prior permission.
14e44e373cbc311e211d379e0633d53af4210d29faGuido van Rossum
15f6971e2958a162298885b6069cc137d973fac356Guido van RossumLANCE ELLINGHOUSE DISCLAIMS ALL WARRANTIES WITH REGARD TO
16e44e373cbc311e211d379e0633d53af4210d29faGuido van RossumTHIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
17f6971e2958a162298885b6069cc137d973fac356Guido van RossumFITNESS, IN NO EVENT SHALL LANCE ELLINGHOUSE BE LIABLE FOR ANY SPECIAL,
18f6971e2958a162298885b6069cc137d973fac356Guido van RossumINDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING
19f6971e2958a162298885b6069cc137d973fac356Guido van RossumFROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT,
20f6971e2958a162298885b6069cc137d973fac356Guido van RossumNEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION
21f6971e2958a162298885b6069cc137d973fac356Guido van RossumWITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
22e44e373cbc311e211d379e0633d53af4210d29faGuido van Rossum
23e44e373cbc311e211d379e0633d53af4210d29faGuido van Rossum******************************************************************/
24e44e373cbc311e211d379e0633d53af4210d29faGuido van Rossum
25c1822a4dd1b5276211be041c7ac216c549c787a4Guido van Rossum/******************************************************************
26c1822a4dd1b5276211be041c7ac216c549c787a4Guido van Rossum
27c1822a4dd1b5276211be041c7ac216c549c787a4Guido van RossumRevision history:
28c1822a4dd1b5276211be041c7ac216c549c787a4Guido van Rossum
29c1822a4dd1b5276211be041c7ac216c549c787a4Guido van Rossum95/06/29 (Steve Clift)
30c1822a4dd1b5276211be041c7ac216c549c787a4Guido van Rossum  - Changed arg parsing to use PyArg_ParseTuple.
31c1822a4dd1b5276211be041c7ac216c549c787a4Guido van Rossum  - Added PyErr_Clear() call(s) where needed.
32c1822a4dd1b5276211be041c7ac216c549c787a4Guido van Rossum  - Fix core dumps if user message contains format specifiers.
33c1822a4dd1b5276211be041c7ac216c549c787a4Guido van Rossum  - Change openlog arg defaults to match normal syslog behaviour.
34c1822a4dd1b5276211be041c7ac216c549c787a4Guido van Rossum  - Plug memory leak in openlog().
35c1822a4dd1b5276211be041c7ac216c549c787a4Guido van Rossum  - Fix setlogmask() to return previous mask value.
36c1822a4dd1b5276211be041c7ac216c549c787a4Guido van Rossum
37c1822a4dd1b5276211be041c7ac216c549c787a4Guido van Rossum******************************************************************/
38c1822a4dd1b5276211be041c7ac216c549c787a4Guido van Rossum
39e44e373cbc311e211d379e0633d53af4210d29faGuido van Rossum/* syslog module */
40e44e373cbc311e211d379e0633d53af4210d29faGuido van Rossum
41a597dde3f1959127c33296a77f76331b59449c01Guido van Rossum#include "Python.h"
42e44e373cbc311e211d379e0633d53af4210d29faGuido van Rossum
43e44e373cbc311e211d379e0633d53af4210d29faGuido van Rossum#include <syslog.h>
44e44e373cbc311e211d379e0633d53af4210d29faGuido van Rossum
45f6971e2958a162298885b6069cc137d973fac356Guido van Rossumstatic PyObject *
46e44e373cbc311e211d379e0633d53af4210d29faGuido van Rossumsyslog_openlog(self, args)
47f6971e2958a162298885b6069cc137d973fac356Guido van Rossum     PyObject * self;
48f6971e2958a162298885b6069cc137d973fac356Guido van Rossum     PyObject * args;
49e44e373cbc311e211d379e0633d53af4210d29faGuido van Rossum{
50c1822a4dd1b5276211be041c7ac216c549c787a4Guido van Rossum  long logopt = 0;
51e44e373cbc311e211d379e0633d53af4210d29faGuido van Rossum  long facility = LOG_USER;
52c1822a4dd1b5276211be041c7ac216c549c787a4Guido van Rossum
53c1822a4dd1b5276211be041c7ac216c549c787a4Guido van Rossum  static PyObject *ident_o = NULL;
54c1822a4dd1b5276211be041c7ac216c549c787a4Guido van Rossum
55c1822a4dd1b5276211be041c7ac216c549c787a4Guido van Rossum  Py_XDECREF(ident_o);
56c1822a4dd1b5276211be041c7ac216c549c787a4Guido van Rossum  if (!PyArg_ParseTuple(args, "S|ll;ident string [, logoption [, facility]]",
57c1822a4dd1b5276211be041c7ac216c549c787a4Guido van Rossum			&ident_o, &logopt, &facility)) {
58e44e373cbc311e211d379e0633d53af4210d29faGuido van Rossum	return NULL;
59c1822a4dd1b5276211be041c7ac216c549c787a4Guido van Rossum  }
60f6971e2958a162298885b6069cc137d973fac356Guido van Rossum  Py_INCREF(ident_o); /* This is needed because openlog() does NOT make a copy
61c1822a4dd1b5276211be041c7ac216c549c787a4Guido van Rossum		         and syslog() later uses it.. cannot trash it. */
62c1822a4dd1b5276211be041c7ac216c549c787a4Guido van Rossum
63c1822a4dd1b5276211be041c7ac216c549c787a4Guido van Rossum  openlog(PyString_AsString(ident_o), logopt, facility);
64c1822a4dd1b5276211be041c7ac216c549c787a4Guido van Rossum
65f6971e2958a162298885b6069cc137d973fac356Guido van Rossum  Py_INCREF(Py_None);
66f6971e2958a162298885b6069cc137d973fac356Guido van Rossum  return Py_None;
67e44e373cbc311e211d379e0633d53af4210d29faGuido van Rossum}
68e44e373cbc311e211d379e0633d53af4210d29faGuido van Rossum
69f6971e2958a162298885b6069cc137d973fac356Guido van Rossumstatic PyObject *
70e44e373cbc311e211d379e0633d53af4210d29faGuido van Rossumsyslog_syslog(self, args)
71f6971e2958a162298885b6069cc137d973fac356Guido van Rossum     PyObject * self;
72f6971e2958a162298885b6069cc137d973fac356Guido van Rossum     PyObject * args;
73e44e373cbc311e211d379e0633d53af4210d29faGuido van Rossum{
74c1822a4dd1b5276211be041c7ac216c549c787a4Guido van Rossum  char *message, *s;
75c1822a4dd1b5276211be041c7ac216c549c787a4Guido van Rossum  int   priority = LOG_INFO | LOG_USER;
76e44e373cbc311e211d379e0633d53af4210d29faGuido van Rossum
77c1822a4dd1b5276211be041c7ac216c549c787a4Guido van Rossum  if (!PyArg_ParseTuple(args, "is;[priority,] message string",
78c1822a4dd1b5276211be041c7ac216c549c787a4Guido van Rossum			&priority, &message)) {
79c1822a4dd1b5276211be041c7ac216c549c787a4Guido van Rossum    PyErr_Clear();
80c1822a4dd1b5276211be041c7ac216c549c787a4Guido van Rossum    if (!PyArg_ParseTuple(args, "s;[priority,] message string", &message)) {
81e44e373cbc311e211d379e0633d53af4210d29faGuido van Rossum      return NULL;
82c1822a4dd1b5276211be041c7ac216c549c787a4Guido van Rossum    }
83c1822a4dd1b5276211be041c7ac216c549c787a4Guido van Rossum  }
84c1822a4dd1b5276211be041c7ac216c549c787a4Guido van Rossum  syslog(priority, "%s", message);
85f6971e2958a162298885b6069cc137d973fac356Guido van Rossum  Py_INCREF(Py_None);
86f6971e2958a162298885b6069cc137d973fac356Guido van Rossum  return Py_None;
87e44e373cbc311e211d379e0633d53af4210d29faGuido van Rossum}
88e44e373cbc311e211d379e0633d53af4210d29faGuido van Rossum
89f6971e2958a162298885b6069cc137d973fac356Guido van Rossumstatic PyObject *
90e44e373cbc311e211d379e0633d53af4210d29faGuido van Rossumsyslog_closelog(self, args)
91f6971e2958a162298885b6069cc137d973fac356Guido van Rossum     PyObject * self;
92f6971e2958a162298885b6069cc137d973fac356Guido van Rossum     PyObject * args;
93e44e373cbc311e211d379e0633d53af4210d29faGuido van Rossum{
94c1822a4dd1b5276211be041c7ac216c549c787a4Guido van Rossum	if (!PyArg_ParseTuple(args, ""))
95e44e373cbc311e211d379e0633d53af4210d29faGuido van Rossum		return NULL;
96e44e373cbc311e211d379e0633d53af4210d29faGuido van Rossum	closelog();
97f6971e2958a162298885b6069cc137d973fac356Guido van Rossum	Py_INCREF(Py_None);
98f6971e2958a162298885b6069cc137d973fac356Guido van Rossum	return Py_None;
99e44e373cbc311e211d379e0633d53af4210d29faGuido van Rossum}
100e44e373cbc311e211d379e0633d53af4210d29faGuido van Rossum
101f6971e2958a162298885b6069cc137d973fac356Guido van Rossumstatic PyObject *
102e44e373cbc311e211d379e0633d53af4210d29faGuido van Rossumsyslog_setlogmask(self, args)
103f6971e2958a162298885b6069cc137d973fac356Guido van Rossum     PyObject * self;
104f6971e2958a162298885b6069cc137d973fac356Guido van Rossum     PyObject * args;
105e44e373cbc311e211d379e0633d53af4210d29faGuido van Rossum{
106c1822a4dd1b5276211be041c7ac216c549c787a4Guido van Rossum  long maskpri, omaskpri;
107c1822a4dd1b5276211be041c7ac216c549c787a4Guido van Rossum
108c1822a4dd1b5276211be041c7ac216c549c787a4Guido van Rossum  if (!PyArg_ParseTuple(args,"l;mask for priority",&maskpri))
109e44e373cbc311e211d379e0633d53af4210d29faGuido van Rossum    return NULL;
110c1822a4dd1b5276211be041c7ac216c549c787a4Guido van Rossum  omaskpri = setlogmask(maskpri);
111c1822a4dd1b5276211be041c7ac216c549c787a4Guido van Rossum  return PyInt_FromLong(omaskpri);
112e44e373cbc311e211d379e0633d53af4210d29faGuido van Rossum}
113e44e373cbc311e211d379e0633d53af4210d29faGuido van Rossum
114f6971e2958a162298885b6069cc137d973fac356Guido van Rossumstatic PyObject *
115e44e373cbc311e211d379e0633d53af4210d29faGuido van Rossumsyslog_log_mask(self, args)
116f6971e2958a162298885b6069cc137d973fac356Guido van Rossum     PyObject * self;
117f6971e2958a162298885b6069cc137d973fac356Guido van Rossum     PyObject * args;
118e44e373cbc311e211d379e0633d53af4210d29faGuido van Rossum{
119e44e373cbc311e211d379e0633d53af4210d29faGuido van Rossum  long mask;
120e44e373cbc311e211d379e0633d53af4210d29faGuido van Rossum  long pri;
121c1822a4dd1b5276211be041c7ac216c549c787a4Guido van Rossum  if (!PyArg_ParseTuple(args,"l",&pri))
122e44e373cbc311e211d379e0633d53af4210d29faGuido van Rossum    return NULL;
123e44e373cbc311e211d379e0633d53af4210d29faGuido van Rossum  mask = LOG_MASK(pri);
124f6971e2958a162298885b6069cc137d973fac356Guido van Rossum  return PyInt_FromLong(mask);
125e44e373cbc311e211d379e0633d53af4210d29faGuido van Rossum}
126e44e373cbc311e211d379e0633d53af4210d29faGuido van Rossum
127f6971e2958a162298885b6069cc137d973fac356Guido van Rossumstatic PyObject *
128e44e373cbc311e211d379e0633d53af4210d29faGuido van Rossumsyslog_log_upto(self, args)
129f6971e2958a162298885b6069cc137d973fac356Guido van Rossum     PyObject * self;
130f6971e2958a162298885b6069cc137d973fac356Guido van Rossum     PyObject * args;
131e44e373cbc311e211d379e0633d53af4210d29faGuido van Rossum{
132e44e373cbc311e211d379e0633d53af4210d29faGuido van Rossum  long mask;
133e44e373cbc311e211d379e0633d53af4210d29faGuido van Rossum  long pri;
134c1822a4dd1b5276211be041c7ac216c549c787a4Guido van Rossum  if (!PyArg_ParseTuple(args,"l",&pri))
135e44e373cbc311e211d379e0633d53af4210d29faGuido van Rossum    return NULL;
136e44e373cbc311e211d379e0633d53af4210d29faGuido van Rossum  mask = LOG_UPTO(pri);
137f6971e2958a162298885b6069cc137d973fac356Guido van Rossum  return PyInt_FromLong(mask);
138e44e373cbc311e211d379e0633d53af4210d29faGuido van Rossum}
139e44e373cbc311e211d379e0633d53af4210d29faGuido van Rossum
140e44e373cbc311e211d379e0633d53af4210d29faGuido van Rossum/* List of functions defined in the module */
141e44e373cbc311e211d379e0633d53af4210d29faGuido van Rossum
142f6971e2958a162298885b6069cc137d973fac356Guido van Rossumstatic PyMethodDef syslog_methods[] = {
143c1822a4dd1b5276211be041c7ac216c549c787a4Guido van Rossum	{"openlog",	syslog_openlog,		METH_VARARGS},
144c1822a4dd1b5276211be041c7ac216c549c787a4Guido van Rossum	{"closelog",	syslog_closelog,	METH_VARARGS},
145c1822a4dd1b5276211be041c7ac216c549c787a4Guido van Rossum	{"syslog",	syslog_syslog,		METH_VARARGS},
146c1822a4dd1b5276211be041c7ac216c549c787a4Guido van Rossum	{"setlogmask",	syslog_setlogmask,	METH_VARARGS},
147c1822a4dd1b5276211be041c7ac216c549c787a4Guido van Rossum	{"LOG_MASK",	syslog_log_mask,	METH_VARARGS},
148c1822a4dd1b5276211be041c7ac216c549c787a4Guido van Rossum	{"LOG_UPTO",	syslog_log_upto,	METH_VARARGS},
149c1822a4dd1b5276211be041c7ac216c549c787a4Guido van Rossum	{NULL,		NULL,			0}
150e44e373cbc311e211d379e0633d53af4210d29faGuido van Rossum};
151e44e373cbc311e211d379e0633d53af4210d29faGuido van Rossum
152e44e373cbc311e211d379e0633d53af4210d29faGuido van Rossum/* Initialization function for the module */
153e44e373cbc311e211d379e0633d53af4210d29faGuido van Rossum
154c1822a4dd1b5276211be041c7ac216c549c787a4Guido van Rossum#define DICT_SET_INT(d, s, x) \
155c1822a4dd1b5276211be041c7ac216c549c787a4Guido van Rossum	PyDict_SetItemString(d, s, PyInt_FromLong((long) (x)))
156c1822a4dd1b5276211be041c7ac216c549c787a4Guido van Rossum
157e44e373cbc311e211d379e0633d53af4210d29faGuido van Rossumvoid
158e44e373cbc311e211d379e0633d53af4210d29faGuido van Rossuminitsyslog()
159e44e373cbc311e211d379e0633d53af4210d29faGuido van Rossum{
160c1822a4dd1b5276211be041c7ac216c549c787a4Guido van Rossum	PyObject *m, *d;
161e44e373cbc311e211d379e0633d53af4210d29faGuido van Rossum
162e44e373cbc311e211d379e0633d53af4210d29faGuido van Rossum	/* Create the module and add the functions */
163f6971e2958a162298885b6069cc137d973fac356Guido van Rossum	m = Py_InitModule("syslog", syslog_methods);
164e44e373cbc311e211d379e0633d53af4210d29faGuido van Rossum
165e44e373cbc311e211d379e0633d53af4210d29faGuido van Rossum	/* Add some symbolic constants to the module */
166f6971e2958a162298885b6069cc137d973fac356Guido van Rossum	d = PyModule_GetDict(m);
167c1822a4dd1b5276211be041c7ac216c549c787a4Guido van Rossum
168c1822a4dd1b5276211be041c7ac216c549c787a4Guido van Rossum	/* Priorities */
169c1822a4dd1b5276211be041c7ac216c549c787a4Guido van Rossum	DICT_SET_INT(d, "LOG_EMERG",	LOG_EMERG);
170c1822a4dd1b5276211be041c7ac216c549c787a4Guido van Rossum	DICT_SET_INT(d, "LOG_ALERT",	LOG_ALERT);
171c1822a4dd1b5276211be041c7ac216c549c787a4Guido van Rossum	DICT_SET_INT(d, "LOG_CRIT",	LOG_CRIT);
172c1822a4dd1b5276211be041c7ac216c549c787a4Guido van Rossum	DICT_SET_INT(d, "LOG_ERR",	LOG_ERR);
173c1822a4dd1b5276211be041c7ac216c549c787a4Guido van Rossum	DICT_SET_INT(d, "LOG_WARNING",	LOG_WARNING);
174c1822a4dd1b5276211be041c7ac216c549c787a4Guido van Rossum	DICT_SET_INT(d, "LOG_NOTICE",	LOG_NOTICE);
175c1822a4dd1b5276211be041c7ac216c549c787a4Guido van Rossum	DICT_SET_INT(d, "LOG_INFO",	LOG_INFO);
176c1822a4dd1b5276211be041c7ac216c549c787a4Guido van Rossum	DICT_SET_INT(d, "LOG_DEBUG",	LOG_DEBUG);
177c1822a4dd1b5276211be041c7ac216c549c787a4Guido van Rossum
178c1822a4dd1b5276211be041c7ac216c549c787a4Guido van Rossum	/* openlog() option flags */
179c1822a4dd1b5276211be041c7ac216c549c787a4Guido van Rossum	DICT_SET_INT(d, "LOG_PID",	LOG_PID);
180c1822a4dd1b5276211be041c7ac216c549c787a4Guido van Rossum	DICT_SET_INT(d, "LOG_CONS",	LOG_CONS);
181c1822a4dd1b5276211be041c7ac216c549c787a4Guido van Rossum	DICT_SET_INT(d, "LOG_NDELAY",	LOG_NDELAY);
182c1822a4dd1b5276211be041c7ac216c549c787a4Guido van Rossum	DICT_SET_INT(d, "LOG_NOWAIT",	LOG_NOWAIT);
183c1822a4dd1b5276211be041c7ac216c549c787a4Guido van Rossum#ifdef LOG_PERROR
184c1822a4dd1b5276211be041c7ac216c549c787a4Guido van Rossum	DICT_SET_INT(d, "LOG_PERROR",	LOG_PERROR);
185c1822a4dd1b5276211be041c7ac216c549c787a4Guido van Rossum#endif
186c1822a4dd1b5276211be041c7ac216c549c787a4Guido van Rossum
187c1822a4dd1b5276211be041c7ac216c549c787a4Guido van Rossum	/* Facilities */
188c1822a4dd1b5276211be041c7ac216c549c787a4Guido van Rossum	DICT_SET_INT(d, "LOG_KERN",	LOG_KERN);
189c1822a4dd1b5276211be041c7ac216c549c787a4Guido van Rossum	DICT_SET_INT(d, "LOG_USER",	LOG_USER);
190c1822a4dd1b5276211be041c7ac216c549c787a4Guido van Rossum	DICT_SET_INT(d, "LOG_MAIL",	LOG_MAIL);
191c1822a4dd1b5276211be041c7ac216c549c787a4Guido van Rossum	DICT_SET_INT(d, "LOG_DAEMON",	LOG_DAEMON);
192c1822a4dd1b5276211be041c7ac216c549c787a4Guido van Rossum	DICT_SET_INT(d, "LOG_AUTH",	LOG_AUTH);
193c1822a4dd1b5276211be041c7ac216c549c787a4Guido van Rossum	DICT_SET_INT(d, "LOG_LPR",	LOG_LPR);
194c1822a4dd1b5276211be041c7ac216c549c787a4Guido van Rossum	DICT_SET_INT(d, "LOG_NEWS",	LOG_NEWS);
195c1822a4dd1b5276211be041c7ac216c549c787a4Guido van Rossum	DICT_SET_INT(d, "LOG_UUCP",	LOG_UUCP);
196c1822a4dd1b5276211be041c7ac216c549c787a4Guido van Rossum	DICT_SET_INT(d, "LOG_CRON",	LOG_CRON);
197c1822a4dd1b5276211be041c7ac216c549c787a4Guido van Rossum	DICT_SET_INT(d, "LOG_LOCAL0",	LOG_LOCAL0);
198c1822a4dd1b5276211be041c7ac216c549c787a4Guido van Rossum	DICT_SET_INT(d, "LOG_LOCAL1",	LOG_LOCAL1);
199c1822a4dd1b5276211be041c7ac216c549c787a4Guido van Rossum	DICT_SET_INT(d, "LOG_LOCAL2",	LOG_LOCAL2);
200c1822a4dd1b5276211be041c7ac216c549c787a4Guido van Rossum	DICT_SET_INT(d, "LOG_LOCAL3",	LOG_LOCAL3);
201c1822a4dd1b5276211be041c7ac216c549c787a4Guido van Rossum	DICT_SET_INT(d, "LOG_LOCAL4",	LOG_LOCAL4);
202c1822a4dd1b5276211be041c7ac216c549c787a4Guido van Rossum	DICT_SET_INT(d, "LOG_LOCAL5",	LOG_LOCAL5);
203c1822a4dd1b5276211be041c7ac216c549c787a4Guido van Rossum	DICT_SET_INT(d, "LOG_LOCAL6",	LOG_LOCAL6);
204c1822a4dd1b5276211be041c7ac216c549c787a4Guido van Rossum	DICT_SET_INT(d, "LOG_LOCAL7",	LOG_LOCAL7);
205e44e373cbc311e211d379e0633d53af4210d29faGuido van Rossum
206e44e373cbc311e211d379e0633d53af4210d29faGuido van Rossum	/* Check for errors */
207f6971e2958a162298885b6069cc137d973fac356Guido van Rossum	if (PyErr_Occurred())
208f6971e2958a162298885b6069cc137d973fac356Guido van Rossum		Py_FatalError("can't initialize module syslog");
209e44e373cbc311e211d379e0633d53af4210d29faGuido van Rossum}
210