Fix by Sean Reifschneider:

- When facility not specified to syslog() method, use default from openlog()
    (This is how it was claimed to work in the documentation)
  - Potential resource leak of o_ident, now cleaned up in closelog()
  - Minor comment accuracy fix.
This commit is contained in:
Guido van Rossum 1998-05-08 21:52:55 +00:00
parent 27c225e826
commit ae94cf292b
1 changed files with 38 additions and 25 deletions

View File

@ -26,6 +26,12 @@ WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
Revision history: Revision history:
1998/04/28 (Sean Reifschneider)
- When facility not specified to syslog() method, use default from openlog()
(This is how it was claimed to work in the documentation)
- Potential resource leak of o_ident, now cleaned up in closelog()
- Minor comment accuracy fix.
95/06/29 (Steve Clift) 95/06/29 (Steve Clift)
- Changed arg parsing to use PyArg_ParseTuple. - Changed arg parsing to use PyArg_ParseTuple.
- Added PyErr_Clear() call(s) where needed. - Added PyErr_Clear() call(s) where needed.
@ -42,6 +48,10 @@ Revision history:
#include <syslog.h> #include <syslog.h>
/* only one instance, only one syslog, so globals should be ok */
static PyObject *S_ident_o = NULL; /* identifier, held by openlog() */
static PyObject * static PyObject *
syslog_openlog(self, args) syslog_openlog(self, args)
PyObject * self; PyObject * self;
@ -50,20 +60,19 @@ syslog_openlog(self, args)
long logopt = 0; long logopt = 0;
long facility = LOG_USER; long facility = LOG_USER;
static PyObject *ident_o = NULL;
Py_XDECREF(ident_o); Py_XDECREF(S_ident_o);
if (!PyArg_ParseTuple(args, if (!PyArg_ParseTuple(args,
"S|ll;ident string [, logoption [, facility]]", "S|ll;ident string [, logoption [, facility]]",
&ident_o, &logopt, &facility)) &S_ident_o, &logopt, &facility))
return NULL; return NULL;
/* This is needed because openlog() does NOT make a copy /* This is needed because openlog() does NOT make a copy
* and syslog() later uses it.. cannot trash it. * and syslog() later uses it.. cannot trash it.
*/ */
Py_INCREF(ident_o); Py_INCREF(S_ident_o);
openlog(PyString_AsString(ident_o), logopt, facility); openlog(PyString_AsString(S_ident_o), logopt, facility);
Py_INCREF(Py_None); Py_INCREF(Py_None);
return Py_None; return Py_None;
@ -76,7 +85,7 @@ syslog_syslog(self, args)
PyObject * args; PyObject * args;
{ {
char *message; char *message;
int priority = LOG_INFO | LOG_USER; int priority = LOG_INFO;
if (!PyArg_ParseTuple(args, "is;[priority,] message string", if (!PyArg_ParseTuple(args, "is;[priority,] message string",
&priority, &message)) { &priority, &message)) {
@ -85,6 +94,7 @@ syslog_syslog(self, args)
&message)) &message))
return NULL; return NULL;
} }
syslog(priority, "%s", message); syslog(priority, "%s", message);
Py_INCREF(Py_None); Py_INCREF(Py_None);
return Py_None; return Py_None;
@ -98,6 +108,8 @@ syslog_closelog(self, args)
if (!PyArg_ParseTuple(args, "")) if (!PyArg_ParseTuple(args, ""))
return NULL; return NULL;
closelog(); closelog();
Py_XDECREF(S_ident_o);
S_ident_o = NULL;
Py_INCREF(Py_None); Py_INCREF(Py_None);
return Py_None; return Py_None;
} }
@ -153,7 +165,7 @@ static PyMethodDef syslog_methods[] = {
{NULL, NULL, 0} {NULL, NULL, 0}
}; };
/* Initialization function for the module */ /* helper function for initialization function */
static void static void
ins(d, s, x) ins(d, s, x)
@ -168,6 +180,7 @@ ins(d, s, x)
} }
} }
/* Initialization function for the module */
void void
initsyslog() initsyslog()
@ -205,25 +218,7 @@ initsyslog()
ins(d, "LOG_MAIL", LOG_MAIL); ins(d, "LOG_MAIL", LOG_MAIL);
ins(d, "LOG_DAEMON", LOG_DAEMON); ins(d, "LOG_DAEMON", LOG_DAEMON);
ins(d, "LOG_AUTH", LOG_AUTH); ins(d, "LOG_AUTH", LOG_AUTH);
#ifdef LOG_SYSLOG
ins(d, "LOG_SYSLOG", LOG_SYSLOG);
#endif
ins(d, "LOG_LPR", LOG_LPR); ins(d, "LOG_LPR", LOG_LPR);
#ifdef LOG_NEWS
ins(d, "LOG_NEWS", LOG_NEWS);
#else
ins(d, "LOG_NEWS", LOG_MAIL);
#endif
#ifdef LOG_UUCP
ins(d, "LOG_UUCP", LOG_UUCP);
#else
ins(d, "LOG_UUCP", LOG_MAIL);
#endif
#ifdef LOG_CRON
ins(d, "LOG_CRON", LOG_CRON);
#else
ins(d, "LOG_CRON", LOG_DAEMON);
#endif
ins(d, "LOG_LOCAL0", LOG_LOCAL0); ins(d, "LOG_LOCAL0", LOG_LOCAL0);
ins(d, "LOG_LOCAL1", LOG_LOCAL1); ins(d, "LOG_LOCAL1", LOG_LOCAL1);
ins(d, "LOG_LOCAL2", LOG_LOCAL2); ins(d, "LOG_LOCAL2", LOG_LOCAL2);
@ -233,6 +228,24 @@ initsyslog()
ins(d, "LOG_LOCAL6", LOG_LOCAL6); ins(d, "LOG_LOCAL6", LOG_LOCAL6);
ins(d, "LOG_LOCAL7", LOG_LOCAL7); ins(d, "LOG_LOCAL7", LOG_LOCAL7);
#ifndef LOG_SYSLOG
#define LOG_SYSLOG LOG_DAEMON
#endif
#ifndef LOG_NEWS
#define LOG_NEWS LOG_MAIL
#endif
#ifndef LOG_UUCP
#define LOG_UUCP LOG_MAIL
#endif
#ifndef LOG_CRON
#define LOG_CRON LOG_DAEMON
#endif
ins(d, "LOG_SYSLOG", LOG_SYSLOG);
ins(d, "LOG_CRON", LOG_CRON);
ins(d, "LOG_UUCP", LOG_UUCP);
ins(d, "LOG_NEWS", LOG_NEWS);
/* Check for errors */ /* Check for errors */
if (PyErr_Occurred()) if (PyErr_Occurred())
Py_FatalError("can't initialize module syslog"); Py_FatalError("can't initialize module syslog");