]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
changes by Steve Clift
authorGuido van Rossum <guido@python.org>
Wed, 11 Oct 1995 16:15:28 +0000 (16:15 +0000)
committerGuido van Rossum <guido@python.org>
Wed, 11 Oct 1995 16:15:28 +0000 (16:15 +0000)
Modules/syslogmodule.c

index aca674686cdb0c502c1dbf323d8c51ecbfc0f4e6..06c4f342186c68eddd6aab409d36ecf8ad09e741 100644 (file)
@@ -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())