aboutsummaryrefslogtreecommitdiffstats
path: root/contrib/tools/python/src/Modules/syslogmodule.c
diff options
context:
space:
mode:
authornkozlovskiy <nmk@ydb.tech>2023-09-29 12:24:06 +0300
committernkozlovskiy <nmk@ydb.tech>2023-09-29 12:41:34 +0300
commite0e3e1717e3d33762ce61950504f9637a6e669ed (patch)
treebca3ff6939b10ed60c3d5c12439963a1146b9711 /contrib/tools/python/src/Modules/syslogmodule.c
parent38f2c5852db84c7b4d83adfcb009eb61541d1ccd (diff)
downloadydb-e0e3e1717e3d33762ce61950504f9637a6e669ed.tar.gz
add ydb deps
Diffstat (limited to 'contrib/tools/python/src/Modules/syslogmodule.c')
-rw-r--r--contrib/tools/python/src/Modules/syslogmodule.c306
1 files changed, 306 insertions, 0 deletions
diff --git a/contrib/tools/python/src/Modules/syslogmodule.c b/contrib/tools/python/src/Modules/syslogmodule.c
new file mode 100644
index 0000000000..37eaebc975
--- /dev/null
+++ b/contrib/tools/python/src/Modules/syslogmodule.c
@@ -0,0 +1,306 @@
+/***********************************************************
+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:
+
+2010/04/20 (Sean Reifschneider)
+ - Use basename(sys.argv[0]) for the default "ident".
+ - Arguments to openlog() are now keyword args and are all optional.
+ - syslog() calls openlog() if it hasn't already been called.
+
+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 "osdefs.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 char S_log_open = 0;
+
+
+static PyObject *
+syslog_get_argv(void)
+{
+ /* Figure out what to use for as the program "ident" for openlog().
+ * This swallows exceptions and continues rather than failing out,
+ * because the syslog module can still be used because openlog(3)
+ * is optional.
+ */
+
+ Py_ssize_t argv_len;
+ PyObject *scriptobj;
+ char *atslash;
+ PyObject *argv = PySys_GetObject("argv");
+
+ if (argv == NULL) {
+ return(NULL);
+ }
+
+ argv_len = PyList_Size(argv);
+ if (argv_len == -1) {
+ PyErr_Clear();
+ return(NULL);
+ }
+ if (argv_len == 0) {
+ return(NULL);
+ }
+
+ scriptobj = PyList_GetItem(argv, 0);
+ if (!PyString_Check(scriptobj)) {
+ return(NULL);
+ }
+ if (PyString_GET_SIZE(scriptobj) == 0) {
+ return(NULL);
+ }
+
+ atslash = strrchr(PyString_AsString(scriptobj), SEP);
+ if (atslash) {
+ return(PyString_FromString(atslash + 1));
+ } else {
+ Py_INCREF(scriptobj);
+ return(scriptobj);
+ }
+
+ return(NULL);
+}
+
+
+static PyObject *
+syslog_openlog(PyObject * self, PyObject * args, PyObject *kwds)
+{
+ long logopt = 0;
+ long facility = LOG_USER;
+ PyObject *new_S_ident_o = NULL;
+ static char *keywords[] = {"ident", "logoption", "facility", 0};
+
+ if (!PyArg_ParseTupleAndKeywords(args, kwds,
+ "|Sll:openlog", keywords, &new_S_ident_o, &logopt, &facility))
+ return NULL;
+
+ if (new_S_ident_o) { Py_INCREF(new_S_ident_o); }
+
+ /* get sys.argv[0] or NULL if we can't for some reason */
+ if (!new_S_ident_o) {
+ new_S_ident_o = syslog_get_argv();
+ }
+
+ Py_XDECREF(S_ident_o);
+ S_ident_o = new_S_ident_o;
+
+ /* At this point, S_ident_o should be INCREF()ed. openlog(3) does not
+ * make a copy, and syslog(3) later uses it. We can't garbagecollect it
+ * If NULL, just let openlog figure it out (probably using C argv[0]).
+ */
+
+ openlog(S_ident_o ? PyString_AsString(S_ident_o) : NULL, logopt, facility);
+ S_log_open = 1;
+
+ 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;
+ }
+
+ /* if log is not opened, open it now */
+ if (!S_log_open) {
+ PyObject *openargs;
+
+ /* Continue even if PyTuple_New fails, because openlog(3) is optional.
+ * So, we can still do loggin in the unlikely event things are so hosed
+ * that we can't do this tuple.
+ */
+ if ((openargs = PyTuple_New(0))) {
+ PyObject *openlog_ret = syslog_openlog(self, openargs, NULL);
+ Py_XDECREF(openlog_ret);
+ Py_DECREF(openargs);
+ }
+ }
+
+ Py_BEGIN_ALLOW_THREADS;
+ syslog(priority, "%s", message);
+ Py_END_ALLOW_THREADS;
+ Py_INCREF(Py_None);
+ return Py_None;
+}
+
+static PyObject *
+syslog_closelog(PyObject *self, PyObject *unused)
+{
+ if (S_log_open) {
+ closelog();
+ Py_XDECREF(S_ident_o);
+ S_ident_o = NULL;
+ S_log_open = 0;
+ }
+ 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", (PyCFunction) syslog_openlog, METH_VARARGS | METH_KEYWORDS},
+ {"closelog", syslog_closelog, METH_NOARGS},
+ {"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 */
+
+PyMODINIT_FUNC
+initsyslog(void)
+{
+ PyObject *m;
+
+ /* Create the module and add the functions */
+ m = Py_InitModule("syslog", syslog_methods);
+ if (m == NULL)
+ return;
+
+ /* Add some symbolic constants to the module */
+
+ /* Priorities */
+ PyModule_AddIntConstant(m, "LOG_EMERG", LOG_EMERG);
+ PyModule_AddIntConstant(m, "LOG_ALERT", LOG_ALERT);
+ PyModule_AddIntConstant(m, "LOG_CRIT", LOG_CRIT);
+ PyModule_AddIntConstant(m, "LOG_ERR", LOG_ERR);
+ PyModule_AddIntConstant(m, "LOG_WARNING", LOG_WARNING);
+ PyModule_AddIntConstant(m, "LOG_NOTICE", LOG_NOTICE);
+ PyModule_AddIntConstant(m, "LOG_INFO", LOG_INFO);
+ PyModule_AddIntConstant(m, "LOG_DEBUG", LOG_DEBUG);
+
+ /* openlog() option flags */
+ PyModule_AddIntConstant(m, "LOG_PID", LOG_PID);
+ PyModule_AddIntConstant(m, "LOG_CONS", LOG_CONS);
+ PyModule_AddIntConstant(m, "LOG_NDELAY", LOG_NDELAY);
+#ifdef LOG_NOWAIT
+ PyModule_AddIntConstant(m, "LOG_NOWAIT", LOG_NOWAIT);
+#endif
+#ifdef LOG_PERROR
+ PyModule_AddIntConstant(m, "LOG_PERROR", LOG_PERROR);
+#endif
+
+ /* Facilities */
+ PyModule_AddIntConstant(m, "LOG_KERN", LOG_KERN);
+ PyModule_AddIntConstant(m, "LOG_USER", LOG_USER);
+ PyModule_AddIntConstant(m, "LOG_MAIL", LOG_MAIL);
+ PyModule_AddIntConstant(m, "LOG_DAEMON", LOG_DAEMON);
+ PyModule_AddIntConstant(m, "LOG_AUTH", LOG_AUTH);
+ PyModule_AddIntConstant(m, "LOG_LPR", LOG_LPR);
+ PyModule_AddIntConstant(m, "LOG_LOCAL0", LOG_LOCAL0);
+ PyModule_AddIntConstant(m, "LOG_LOCAL1", LOG_LOCAL1);
+ PyModule_AddIntConstant(m, "LOG_LOCAL2", LOG_LOCAL2);
+ PyModule_AddIntConstant(m, "LOG_LOCAL3", LOG_LOCAL3);
+ PyModule_AddIntConstant(m, "LOG_LOCAL4", LOG_LOCAL4);
+ PyModule_AddIntConstant(m, "LOG_LOCAL5", LOG_LOCAL5);
+ PyModule_AddIntConstant(m, "LOG_LOCAL6", LOG_LOCAL6);
+ PyModule_AddIntConstant(m, "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
+
+ PyModule_AddIntConstant(m, "LOG_SYSLOG", LOG_SYSLOG);
+ PyModule_AddIntConstant(m, "LOG_CRON", LOG_CRON);
+ PyModule_AddIntConstant(m, "LOG_UUCP", LOG_UUCP);
+ PyModule_AddIntConstant(m, "LOG_NEWS", LOG_NEWS);
+}