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