symbian-qemu-0.9.1-12/python-2.6.1/Modules/syslogmodule.c
changeset 1 2fb8b9db1c86
equal deleted inserted replaced
0:ffa851df0825 1:2fb8b9db1c86
       
     1 /***********************************************************
       
     2 Copyright 1994 by Lance Ellinghouse,
       
     3 Cathedral City, California Republic, United States of America.
       
     4 
       
     5                         All Rights Reserved
       
     6 
       
     7 Permission to use, copy, modify, and distribute this software and its 
       
     8 documentation for any purpose and without fee is hereby granted, 
       
     9 provided that the above copyright notice appear in all copies and that
       
    10 both that copyright notice and this permission notice appear in 
       
    11 supporting documentation, and that the name of Lance Ellinghouse
       
    12 not be used in advertising or publicity pertaining to distribution 
       
    13 of the software without specific, written prior permission.
       
    14 
       
    15 LANCE ELLINGHOUSE DISCLAIMS ALL WARRANTIES WITH REGARD TO
       
    16 THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
       
    17 FITNESS, IN NO EVENT SHALL LANCE ELLINGHOUSE BE LIABLE FOR ANY SPECIAL, 
       
    18 INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING 
       
    19 FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, 
       
    20 NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION 
       
    21 WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
       
    22 
       
    23 ******************************************************************/
       
    24 
       
    25 /******************************************************************
       
    26 
       
    27 Revision history:
       
    28 
       
    29 1998/04/28 (Sean Reifschneider)
       
    30   - When facility not specified to syslog() method, use default from openlog()
       
    31     (This is how it was claimed to work in the documentation)
       
    32   - Potential resource leak of o_ident, now cleaned up in closelog()
       
    33   - Minor comment accuracy fix.
       
    34 
       
    35 95/06/29 (Steve Clift)
       
    36   - Changed arg parsing to use PyArg_ParseTuple.
       
    37   - Added PyErr_Clear() call(s) where needed.
       
    38   - Fix core dumps if user message contains format specifiers.
       
    39   - Change openlog arg defaults to match normal syslog behavior.
       
    40   - Plug memory leak in openlog().
       
    41   - Fix setlogmask() to return previous mask value.
       
    42 
       
    43 ******************************************************************/
       
    44 
       
    45 /* syslog module */
       
    46 
       
    47 #include "Python.h"
       
    48 
       
    49 #include <syslog.h>
       
    50 
       
    51 /*  only one instance, only one syslog, so globals should be ok  */
       
    52 static PyObject *S_ident_o = NULL;			/*  identifier, held by openlog()  */
       
    53 
       
    54 
       
    55 static PyObject * 
       
    56 syslog_openlog(PyObject * self, PyObject * args)
       
    57 {
       
    58 	long logopt = 0;
       
    59 	long facility = LOG_USER;
       
    60 	PyObject *new_S_ident_o;
       
    61 
       
    62 	if (!PyArg_ParseTuple(args,
       
    63 			      "S|ll;ident string [, logoption [, facility]]",
       
    64 			      &new_S_ident_o, &logopt, &facility))
       
    65 		return NULL;
       
    66 
       
    67 	/* This is needed because openlog() does NOT make a copy
       
    68 	 * and syslog() later uses it.. cannot trash it.
       
    69 	 */
       
    70 	Py_XDECREF(S_ident_o);
       
    71 	S_ident_o = new_S_ident_o;
       
    72 	Py_INCREF(S_ident_o);
       
    73 
       
    74 	openlog(PyString_AsString(S_ident_o), logopt, facility);
       
    75 
       
    76 	Py_INCREF(Py_None);
       
    77 	return Py_None;
       
    78 }
       
    79 
       
    80 
       
    81 static PyObject * 
       
    82 syslog_syslog(PyObject * self, PyObject * args)
       
    83 {
       
    84 	char *message;
       
    85 	int   priority = LOG_INFO;
       
    86 
       
    87 	if (!PyArg_ParseTuple(args, "is;[priority,] message string",
       
    88 			      &priority, &message)) {
       
    89 		PyErr_Clear();
       
    90 		if (!PyArg_ParseTuple(args, "s;[priority,] message string",
       
    91 				      &message))
       
    92 			return NULL;
       
    93 	}
       
    94 
       
    95 	Py_BEGIN_ALLOW_THREADS;
       
    96 	syslog(priority, "%s", message);
       
    97 	Py_END_ALLOW_THREADS;
       
    98 	Py_INCREF(Py_None);
       
    99 	return Py_None;
       
   100 }
       
   101 
       
   102 static PyObject * 
       
   103 syslog_closelog(PyObject *self, PyObject *unused)
       
   104 {
       
   105 	closelog();
       
   106 	Py_XDECREF(S_ident_o);
       
   107 	S_ident_o = NULL;
       
   108 	Py_INCREF(Py_None);
       
   109 	return Py_None;
       
   110 }
       
   111 
       
   112 static PyObject * 
       
   113 syslog_setlogmask(PyObject *self, PyObject *args)
       
   114 {
       
   115 	long maskpri, omaskpri;
       
   116 
       
   117 	if (!PyArg_ParseTuple(args, "l;mask for priority", &maskpri))
       
   118 		return NULL;
       
   119 	omaskpri = setlogmask(maskpri);
       
   120 	return PyInt_FromLong(omaskpri);
       
   121 }
       
   122 
       
   123 static PyObject * 
       
   124 syslog_log_mask(PyObject *self, PyObject *args)
       
   125 {
       
   126 	long mask;
       
   127 	long pri;
       
   128 	if (!PyArg_ParseTuple(args, "l:LOG_MASK", &pri))
       
   129 		return NULL;
       
   130 	mask = LOG_MASK(pri);
       
   131 	return PyInt_FromLong(mask);
       
   132 }
       
   133 
       
   134 static PyObject * 
       
   135 syslog_log_upto(PyObject *self, PyObject *args)
       
   136 {
       
   137 	long mask;
       
   138 	long pri;
       
   139 	if (!PyArg_ParseTuple(args, "l:LOG_UPTO", &pri))
       
   140 		return NULL;
       
   141 	mask = LOG_UPTO(pri);
       
   142 	return PyInt_FromLong(mask);
       
   143 }
       
   144 
       
   145 /* List of functions defined in the module */
       
   146 
       
   147 static PyMethodDef syslog_methods[] = {
       
   148 	{"openlog",	syslog_openlog,		METH_VARARGS},
       
   149 	{"closelog",	syslog_closelog,	METH_NOARGS},
       
   150 	{"syslog",	syslog_syslog,		METH_VARARGS},
       
   151 	{"setlogmask",	syslog_setlogmask,	METH_VARARGS},
       
   152 	{"LOG_MASK",	syslog_log_mask,	METH_VARARGS},
       
   153 	{"LOG_UPTO",	syslog_log_upto,	METH_VARARGS},
       
   154 	{NULL,		NULL,			0}
       
   155 };
       
   156 
       
   157 /* Initialization function for the module */
       
   158 
       
   159 PyMODINIT_FUNC
       
   160 initsyslog(void)
       
   161 {
       
   162 	PyObject *m;
       
   163 
       
   164 	/* Create the module and add the functions */
       
   165 	m = Py_InitModule("syslog", syslog_methods);
       
   166 	if (m == NULL)
       
   167 		return;
       
   168 
       
   169 	/* Add some symbolic constants to the module */
       
   170 
       
   171 	/* Priorities */
       
   172 	PyModule_AddIntConstant(m, "LOG_EMERG",	  LOG_EMERG);
       
   173 	PyModule_AddIntConstant(m, "LOG_ALERT",	  LOG_ALERT);
       
   174 	PyModule_AddIntConstant(m, "LOG_CRIT",	  LOG_CRIT);
       
   175 	PyModule_AddIntConstant(m, "LOG_ERR",	  LOG_ERR);
       
   176 	PyModule_AddIntConstant(m, "LOG_WARNING", LOG_WARNING);
       
   177 	PyModule_AddIntConstant(m, "LOG_NOTICE",  LOG_NOTICE);
       
   178 	PyModule_AddIntConstant(m, "LOG_INFO",	  LOG_INFO);
       
   179 	PyModule_AddIntConstant(m, "LOG_DEBUG",	  LOG_DEBUG);
       
   180 
       
   181 	/* openlog() option flags */
       
   182 	PyModule_AddIntConstant(m, "LOG_PID",	  LOG_PID);
       
   183 	PyModule_AddIntConstant(m, "LOG_CONS",	  LOG_CONS);
       
   184 	PyModule_AddIntConstant(m, "LOG_NDELAY",  LOG_NDELAY);
       
   185 #ifdef LOG_NOWAIT
       
   186 	PyModule_AddIntConstant(m, "LOG_NOWAIT",  LOG_NOWAIT);
       
   187 #endif
       
   188 #ifdef LOG_PERROR
       
   189 	PyModule_AddIntConstant(m, "LOG_PERROR",  LOG_PERROR);
       
   190 #endif
       
   191 
       
   192 	/* Facilities */
       
   193 	PyModule_AddIntConstant(m, "LOG_KERN",	  LOG_KERN);
       
   194 	PyModule_AddIntConstant(m, "LOG_USER",	  LOG_USER);
       
   195 	PyModule_AddIntConstant(m, "LOG_MAIL",	  LOG_MAIL);
       
   196 	PyModule_AddIntConstant(m, "LOG_DAEMON",  LOG_DAEMON);
       
   197 	PyModule_AddIntConstant(m, "LOG_AUTH",	  LOG_AUTH);
       
   198 	PyModule_AddIntConstant(m, "LOG_LPR",	  LOG_LPR);
       
   199 	PyModule_AddIntConstant(m, "LOG_LOCAL0",  LOG_LOCAL0);
       
   200 	PyModule_AddIntConstant(m, "LOG_LOCAL1",  LOG_LOCAL1);
       
   201 	PyModule_AddIntConstant(m, "LOG_LOCAL2",  LOG_LOCAL2);
       
   202 	PyModule_AddIntConstant(m, "LOG_LOCAL3",  LOG_LOCAL3);
       
   203 	PyModule_AddIntConstant(m, "LOG_LOCAL4",  LOG_LOCAL4);
       
   204 	PyModule_AddIntConstant(m, "LOG_LOCAL5",  LOG_LOCAL5);
       
   205 	PyModule_AddIntConstant(m, "LOG_LOCAL6",  LOG_LOCAL6);
       
   206 	PyModule_AddIntConstant(m, "LOG_LOCAL7",  LOG_LOCAL7);
       
   207 
       
   208 #ifndef LOG_SYSLOG
       
   209 #define LOG_SYSLOG		LOG_DAEMON
       
   210 #endif
       
   211 #ifndef LOG_NEWS
       
   212 #define LOG_NEWS		LOG_MAIL
       
   213 #endif
       
   214 #ifndef LOG_UUCP
       
   215 #define LOG_UUCP		LOG_MAIL
       
   216 #endif
       
   217 #ifndef LOG_CRON
       
   218 #define LOG_CRON		LOG_DAEMON
       
   219 #endif
       
   220 
       
   221 	PyModule_AddIntConstant(m, "LOG_SYSLOG",  LOG_SYSLOG);
       
   222 	PyModule_AddIntConstant(m, "LOG_CRON",	  LOG_CRON);
       
   223 	PyModule_AddIntConstant(m, "LOG_UUCP",	  LOG_UUCP);
       
   224 	PyModule_AddIntConstant(m, "LOG_NEWS",	  LOG_NEWS);
       
   225 }