diff --git a/Lib/test/test_syslog.py b/Lib/test/test_syslog.py new file mode 100644 index 00000000000..3f22c0da380 --- /dev/null +++ b/Lib/test/test_syslog.py @@ -0,0 +1,37 @@ + +import syslog +import unittest +from test import test_support + +# XXX(nnorwitz): This test sucks. I don't know of a platform independent way +# to verify that the messages were really logged. +# The only purpose of this test is to verify the code doesn't crash or leak. + +class Test(unittest.TestCase): + + def test_openlog(self): + syslog.openlog('python') + + def test_syslog(self): + syslog.openlog('python') + syslog.syslog('test message from python test_syslog') + syslog.syslog(syslog.LOG_ERR, 'test error from python test_syslog') + + def test_closelog(self): + syslog.openlog('python') + syslog.closelog() + + def test_setlogmask(self): + syslog.setlogmask(syslog.LOG_DEBUG) + + def test_log_mask(self): + syslog.LOG_MASK(syslog.LOG_INFO) + + def test_log_upto(self): + syslog.LOG_UPTO(syslog.LOG_INFO) + +def test_main(): + test_support.run_unittest(__name__) + +if __name__ == "__main__": + test_main() diff --git a/Modules/syslogmodule.c b/Modules/syslogmodule.c index 4a77916942b..08e4a369d45 100644 --- a/Modules/syslogmodule.c +++ b/Modules/syslogmodule.c @@ -58,9 +58,10 @@ syslog_openlog(PyObject * self, PyObject * args) long logopt = 0; long facility = LOG_USER; PyObject *new_S_ident_o; + const char *ident; if (!PyArg_ParseTuple(args, - "S|ll;ident string [, logoption [, facility]]", + "U|ll;ident string [, logoption [, facility]]", &new_S_ident_o, &logopt, &facility)) return NULL; @@ -71,7 +72,10 @@ syslog_openlog(PyObject * self, PyObject * args) S_ident_o = new_S_ident_o; Py_INCREF(S_ident_o); - openlog(PyString_AsString(S_ident_o), logopt, facility); + ident = PyUnicode_AsString(S_ident_o); + if (ident == NULL) + return NULL; + openlog(ident, logopt, facility); Py_INCREF(Py_None); return Py_None; @@ -81,17 +85,21 @@ syslog_openlog(PyObject * self, PyObject * args) static PyObject * syslog_syslog(PyObject * self, PyObject * args) { - char *message; + PyObject *message_object; + const char *message; int priority = LOG_INFO; - if (!PyArg_ParseTuple(args, "is;[priority,] message string", - &priority, &message)) { + if (!PyArg_ParseTuple(args, "iU;[priority,] message string", + &priority, &message_objecct)) { PyErr_Clear(); - if (!PyArg_ParseTuple(args, "s;[priority,] message string", - &message)) + if (!PyArg_ParseTuple(args, "U;[priority,] message string", + &message_objecct)) return NULL; } + message = PyUnicode_AsString(message_object); + if (message == NULL) + return NULL; syslog(priority, "%s", message); Py_INCREF(Py_None); return Py_None;