diff options
author | Guido van Rossum <guido@python.org> | 1995-10-11 16:15:28 (GMT) |
---|---|---|
committer | Guido van Rossum <guido@python.org> | 1995-10-11 16:15:28 (GMT) |
commit | c1822a4dd1b5276211be041c7ac216c549c787a4 (patch) | |
tree | 3e68d3e69bc28d09403ecca872afd7d8192d272b /Modules | |
parent | 7d0590b544283c2adada7c289616bb4971d4159d (diff) | |
download | cpython-c1822a4dd1b5276211be041c7ac216c549c787a4.zip cpython-c1822a4dd1b5276211be041c7ac216c549c787a4.tar.gz cpython-c1822a4dd1b5276211be041c7ac216c549c787a4.tar.bz2 |
changes by Steve Clift
Diffstat (limited to 'Modules')
-rw-r--r-- | Modules/syslogmodule.c | 172 |
1 files changed, 92 insertions, 80 deletions
diff --git a/Modules/syslogmodule.c b/Modules/syslogmodule.c index aca6746..06c4f34 100644 --- a/Modules/syslogmodule.c +++ b/Modules/syslogmodule.c @@ -22,6 +22,20 @@ WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. ******************************************************************/ +/****************************************************************** + +Revision history: + +95/06/29 (Steve Clift) + - Changed arg parsing to use PyArg_ParseTuple. + - Added PyErr_Clear() call(s) where needed. + - Fix core dumps if user message contains format specifiers. + - Change openlog arg defaults to match normal syslog behaviour. + - Plug memory leak in openlog(). + - Fix setlogmask() to return previous mask value. + +******************************************************************/ + /* syslog module */ #include "Python.h" @@ -33,18 +47,21 @@ syslog_openlog(self, args) PyObject * self; PyObject * args; { - char *ident = ""; - PyObject * ident_o; - long logopt = LOG_PID; + long logopt = 0; long facility = LOG_USER; - if (!PyArg_Parse(args, "(Sll);ident string, logoption, facility", &ident_o, &logopt, &facility)) - if (!PyArg_Parse(args, "(Sl);ident string, logoption", &ident_o, &logopt)) - if (!PyArg_Parse(args, "S;ident string", &ident_o)) + + static PyObject *ident_o = NULL; + + Py_XDECREF(ident_o); + if (!PyArg_ParseTuple(args, "S|ll;ident string [, logoption [, facility]]", + &ident_o, &logopt, &facility)) { return NULL; + } Py_INCREF(ident_o); /* This is needed because openlog() does NOT make a copy - and syslog() later uses it.. cannot trash it. */ - ident = PyString_AsString(ident_o); - openlog(ident,logopt,facility); + and syslog() later uses it.. cannot trash it. */ + + openlog(PyString_AsString(ident_o), logopt, facility); + Py_INCREF(Py_None); return Py_None; } @@ -54,13 +71,17 @@ syslog_syslog(self, args) PyObject * self; PyObject * args; { - int priority = LOG_INFO; - char *message; + char *message, *s; + int priority = LOG_INFO | LOG_USER; - if (!PyArg_Parse(args,"(is);priority, message string",&priority,&message)) - if (!PyArg_Parse(args,"s;message string",&message)) + if (!PyArg_ParseTuple(args, "is;[priority,] message string", + &priority, &message)) { + PyErr_Clear(); + if (!PyArg_ParseTuple(args, "s;[priority,] message string", &message)) { return NULL; - syslog(priority, message); + } + } + syslog(priority, "%s", message); Py_INCREF(Py_None); return Py_None; } @@ -70,7 +91,7 @@ syslog_closelog(self, args) PyObject * self; PyObject * args; { - if (!PyArg_NoArgs(args)) + if (!PyArg_ParseTuple(args, "")) return NULL; closelog(); Py_INCREF(Py_None); @@ -82,12 +103,12 @@ syslog_setlogmask(self, args) PyObject * self; PyObject * args; { - long maskpri; - if (!PyArg_Parse(args,"l;mask for priority",&maskpri)) + long maskpri, omaskpri; + + if (!PyArg_ParseTuple(args,"l;mask for priority",&maskpri)) return NULL; - setlogmask(maskpri); - Py_INCREF(Py_None); - return Py_None; + omaskpri = setlogmask(maskpri); + return PyInt_FromLong(omaskpri); } static PyObject * @@ -97,7 +118,7 @@ syslog_log_mask(self, args) { long mask; long pri; - if (!PyArg_Parse(args,"l",&pri)) + if (!PyArg_ParseTuple(args,"l",&pri)) return NULL; mask = LOG_MASK(pri); return PyInt_FromLong(mask); @@ -110,7 +131,7 @@ syslog_log_upto(self, args) { long mask; long pri; - if (!PyArg_Parse(args,"l",&pri)) + if (!PyArg_ParseTuple(args,"l",&pri)) return NULL; mask = LOG_UPTO(pri); return PyInt_FromLong(mask); @@ -119,77 +140,68 @@ syslog_log_upto(self, args) /* List of functions defined in the module */ static PyMethodDef syslog_methods[] = { - {"openlog", (PyCFunction)syslog_openlog}, - {"closelog", (PyCFunction)syslog_closelog}, - {"syslog", (PyCFunction)syslog_syslog}, - {"setlogmask", (PyCFunction)syslog_setlogmask}, - {"LOG_MASK", (PyCFunction)syslog_log_mask}, - {"LOG_UPTO", (PyCFunction)syslog_log_upto}, - {NULL, NULL} /* sentinel */ + {"openlog", syslog_openlog, METH_VARARGS}, + {"closelog", syslog_closelog, METH_VARARGS}, + {"syslog", syslog_syslog, METH_VARARGS}, + {"setlogmask", syslog_setlogmask, METH_VARARGS}, + {"LOG_MASK", syslog_log_mask, METH_VARARGS}, + {"LOG_UPTO", syslog_log_upto, METH_VARARGS}, + {NULL, NULL, 0} }; /* Initialization function for the module */ +#define DICT_SET_INT(d, s, x) \ + PyDict_SetItemString(d, s, PyInt_FromLong((long) (x))) + void initsyslog() { - PyObject *m, *d, *x; + PyObject *m, *d; /* Create the module and add the functions */ m = Py_InitModule("syslog", syslog_methods); /* Add some symbolic constants to the module */ d = PyModule_GetDict(m); - x = PyInt_FromLong(LOG_EMERG); - PyDict_SetItemString(d, "LOG_EMERG", x); - x = PyInt_FromLong(LOG_ALERT); - PyDict_SetItemString(d, "LOG_ALERT", x); - x = PyInt_FromLong(LOG_CRIT); - PyDict_SetItemString(d, "LOG_CRIT", x); - x = PyInt_FromLong(LOG_ERR); - PyDict_SetItemString(d, "LOG_ERR", x); - x = PyInt_FromLong(LOG_WARNING); - PyDict_SetItemString(d, "LOG_WARNING", x); - x = PyInt_FromLong(LOG_NOTICE); - PyDict_SetItemString(d, "LOG_NOTICE", x); - x = PyInt_FromLong(LOG_INFO); - PyDict_SetItemString(d, "LOG_INFO", x); - x = PyInt_FromLong(LOG_DEBUG); - PyDict_SetItemString(d, "LOG_DEBUG", x); - x = PyInt_FromLong(LOG_PID); - PyDict_SetItemString(d, "LOG_PID", x); - x = PyInt_FromLong(LOG_CONS); - PyDict_SetItemString(d, "LOG_CONS", x); - x = PyInt_FromLong(LOG_NDELAY); - PyDict_SetItemString(d, "LOG_NDELAY", x); - x = PyInt_FromLong(LOG_NOWAIT); - PyDict_SetItemString(d, "LOG_NOWAIT", x); - x = PyInt_FromLong(LOG_KERN); - PyDict_SetItemString(d, "LOG_KERN", x); - x = PyInt_FromLong(LOG_USER); - PyDict_SetItemString(d, "LOG_USER", x); - x = PyInt_FromLong(LOG_MAIL); - PyDict_SetItemString(d, "LOG_MAIL", x); - x = PyInt_FromLong(LOG_DAEMON); - PyDict_SetItemString(d, "LOG_DAEMON", x); - x = PyInt_FromLong(LOG_LPR); - PyDict_SetItemString(d, "LOG_LPR", x); - x = PyInt_FromLong(LOG_LOCAL0); - PyDict_SetItemString(d, "LOG_LOCAL0", x); - x = PyInt_FromLong(LOG_LOCAL1); - PyDict_SetItemString(d, "LOG_LOCAL1", x); - x = PyInt_FromLong(LOG_LOCAL2); - PyDict_SetItemString(d, "LOG_LOCAL2", x); - x = PyInt_FromLong(LOG_LOCAL3); - PyDict_SetItemString(d, "LOG_LOCAL3", x); - x = PyInt_FromLong(LOG_LOCAL4); - PyDict_SetItemString(d, "LOG_LOCAL4", x); - x = PyInt_FromLong(LOG_LOCAL5); - PyDict_SetItemString(d, "LOG_LOCAL5", x); - x = PyInt_FromLong(LOG_LOCAL6); - PyDict_SetItemString(d, "LOG_LOCAL6", x); - x = PyInt_FromLong(LOG_LOCAL7); - PyDict_SetItemString(d, "LOG_LOCAL7", x); + + /* Priorities */ + DICT_SET_INT(d, "LOG_EMERG", LOG_EMERG); + DICT_SET_INT(d, "LOG_ALERT", LOG_ALERT); + DICT_SET_INT(d, "LOG_CRIT", LOG_CRIT); + DICT_SET_INT(d, "LOG_ERR", LOG_ERR); + DICT_SET_INT(d, "LOG_WARNING", LOG_WARNING); + DICT_SET_INT(d, "LOG_NOTICE", LOG_NOTICE); + DICT_SET_INT(d, "LOG_INFO", LOG_INFO); + DICT_SET_INT(d, "LOG_DEBUG", LOG_DEBUG); + + /* openlog() option flags */ + DICT_SET_INT(d, "LOG_PID", LOG_PID); + DICT_SET_INT(d, "LOG_CONS", LOG_CONS); + DICT_SET_INT(d, "LOG_NDELAY", LOG_NDELAY); + DICT_SET_INT(d, "LOG_NOWAIT", LOG_NOWAIT); +#ifdef LOG_PERROR + DICT_SET_INT(d, "LOG_PERROR", LOG_PERROR); +#endif + + /* Facilities */ + DICT_SET_INT(d, "LOG_KERN", LOG_KERN); + DICT_SET_INT(d, "LOG_USER", LOG_USER); + DICT_SET_INT(d, "LOG_MAIL", LOG_MAIL); + DICT_SET_INT(d, "LOG_DAEMON", LOG_DAEMON); + DICT_SET_INT(d, "LOG_AUTH", LOG_AUTH); + DICT_SET_INT(d, "LOG_LPR", LOG_LPR); + DICT_SET_INT(d, "LOG_NEWS", LOG_NEWS); + DICT_SET_INT(d, "LOG_UUCP", LOG_UUCP); + DICT_SET_INT(d, "LOG_CRON", LOG_CRON); + DICT_SET_INT(d, "LOG_LOCAL0", LOG_LOCAL0); + DICT_SET_INT(d, "LOG_LOCAL1", LOG_LOCAL1); + DICT_SET_INT(d, "LOG_LOCAL2", LOG_LOCAL2); + DICT_SET_INT(d, "LOG_LOCAL3", LOG_LOCAL3); + DICT_SET_INT(d, "LOG_LOCAL4", LOG_LOCAL4); + DICT_SET_INT(d, "LOG_LOCAL5", LOG_LOCAL5); + DICT_SET_INT(d, "LOG_LOCAL6", LOG_LOCAL6); + DICT_SET_INT(d, "LOG_LOCAL7", LOG_LOCAL7); /* Check for errors */ if (PyErr_Occurred()) |