| /*********************************************************** |
| Copyright 1994 by Lance Ellinghouse, |
| Cathedral City, California Republic, United States of America. |
| |
| All Rights Reserved |
| |
| Permission to use, copy, modify, and distribute this software and its |
| documentation for any purpose and without fee is hereby granted, |
| provided that the above copyright notice appear in all copies and that |
| both that copyright notice and this permission notice appear in |
| supporting documentation, and that the name of Lance Ellinghouse |
| not be used in advertising or publicity pertaining to distribution |
| of the software without specific, written prior permission. |
| |
| LANCE ELLINGHOUSE DISCLAIMS ALL WARRANTIES WITH REGARD TO |
| THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND |
| FITNESS, IN NO EVENT SHALL LANCE ELLINGHOUSE BE LIABLE FOR ANY SPECIAL, |
| INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING |
| FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, |
| NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION |
| WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. |
| |
| ******************************************************************/ |
| |
| /****************************************************************** |
| |
| 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) |
| - 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 behavior. |
| - Plug memory leak in openlog(). |
| - Fix setlogmask() to return previous mask value. |
| |
| ******************************************************************/ |
| |
| /* syslog module */ |
| |
| #include "Python.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 * |
| syslog_openlog(PyObject * self, PyObject * args) |
| { |
| long logopt = 0; |
| long facility = LOG_USER; |
| |
| |
| Py_XDECREF(S_ident_o); |
| if (!PyArg_ParseTuple(args, |
| "S|ll;ident string [, logoption [, facility]]", |
| &S_ident_o, &logopt, &facility)) |
| return NULL; |
| |
| /* This is needed because openlog() does NOT make a copy |
| * and syslog() later uses it.. cannot trash it. |
| */ |
| Py_INCREF(S_ident_o); |
| |
| openlog(PyString_AsString(S_ident_o), logopt, facility); |
| |
| Py_INCREF(Py_None); |
| return Py_None; |
| } |
| |
| |
| static PyObject * |
| syslog_syslog(PyObject * self, PyObject * args) |
| { |
| char *message; |
| int priority = LOG_INFO; |
| |
| 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, "%s", message); |
| Py_INCREF(Py_None); |
| return Py_None; |
| } |
| |
| static PyObject * |
| syslog_closelog(PyObject *self, PyObject *args) |
| { |
| if (!PyArg_ParseTuple(args, ":closelog")) |
| return NULL; |
| closelog(); |
| Py_XDECREF(S_ident_o); |
| S_ident_o = NULL; |
| Py_INCREF(Py_None); |
| return Py_None; |
| } |
| |
| static PyObject * |
| syslog_setlogmask(PyObject *self, PyObject *args) |
| { |
| long maskpri, omaskpri; |
| |
| if (!PyArg_ParseTuple(args, "l;mask for priority", &maskpri)) |
| return NULL; |
| omaskpri = setlogmask(maskpri); |
| return PyInt_FromLong(omaskpri); |
| } |
| |
| static PyObject * |
| syslog_log_mask(PyObject *self, PyObject *args) |
| { |
| long mask; |
| long pri; |
| if (!PyArg_ParseTuple(args, "l:LOG_MASK", &pri)) |
| return NULL; |
| mask = LOG_MASK(pri); |
| return PyInt_FromLong(mask); |
| } |
| |
| static PyObject * |
| syslog_log_upto(PyObject *self, PyObject *args) |
| { |
| long mask; |
| long pri; |
| if (!PyArg_ParseTuple(args, "l:LOG_UPTO", &pri)) |
| return NULL; |
| mask = LOG_UPTO(pri); |
| return PyInt_FromLong(mask); |
| } |
| |
| /* List of functions defined in the module */ |
| |
| static PyMethodDef syslog_methods[] = { |
| {"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} |
| }; |
| |
| /* helper function for initialization function */ |
| |
| static void |
| ins(PyObject *d, char *s, long x) |
| { |
| PyObject *v = PyInt_FromLong(x); |
| if (v) { |
| PyDict_SetItemString(d, s, v); |
| Py_DECREF(v); |
| } |
| } |
| |
| /* Initialization function for the module */ |
| |
| DL_EXPORT(void) |
| initsyslog(void) |
| { |
| 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); |
| |
| /* Priorities */ |
| ins(d, "LOG_EMERG", LOG_EMERG); |
| ins(d, "LOG_ALERT", LOG_ALERT); |
| ins(d, "LOG_CRIT", LOG_CRIT); |
| ins(d, "LOG_ERR", LOG_ERR); |
| ins(d, "LOG_WARNING", LOG_WARNING); |
| ins(d, "LOG_NOTICE", LOG_NOTICE); |
| ins(d, "LOG_INFO", LOG_INFO); |
| ins(d, "LOG_DEBUG", LOG_DEBUG); |
| |
| /* openlog() option flags */ |
| ins(d, "LOG_PID", LOG_PID); |
| ins(d, "LOG_CONS", LOG_CONS); |
| ins(d, "LOG_NDELAY", LOG_NDELAY); |
| #ifdef LOG_NOWAIT |
| ins(d, "LOG_NOWAIT", LOG_NOWAIT); |
| #endif |
| #ifdef LOG_PERROR |
| ins(d, "LOG_PERROR", LOG_PERROR); |
| #endif |
| |
| /* Facilities */ |
| ins(d, "LOG_KERN", LOG_KERN); |
| ins(d, "LOG_USER", LOG_USER); |
| ins(d, "LOG_MAIL", LOG_MAIL); |
| ins(d, "LOG_DAEMON", LOG_DAEMON); |
| ins(d, "LOG_AUTH", LOG_AUTH); |
| ins(d, "LOG_LPR", LOG_LPR); |
| ins(d, "LOG_LOCAL0", LOG_LOCAL0); |
| ins(d, "LOG_LOCAL1", LOG_LOCAL1); |
| ins(d, "LOG_LOCAL2", LOG_LOCAL2); |
| ins(d, "LOG_LOCAL3", LOG_LOCAL3); |
| ins(d, "LOG_LOCAL4", LOG_LOCAL4); |
| ins(d, "LOG_LOCAL5", LOG_LOCAL5); |
| ins(d, "LOG_LOCAL6", LOG_LOCAL6); |
| 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 */ |
| if (PyErr_Occurred()) |
| Py_FatalError("can't initialize module syslog"); |
| } |