mirror of https://github.com/python/cpython.git
240 lines
6.2 KiB
C
240 lines
6.2 KiB
C
/***********************************************************
|
|
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");
|
|
}
|