1e44e373cbc311e211d379e0633d53af4210d29faGuido van Rossum/***********************************************************
2f6971e2958a162298885b6069cc137d973fac356Guido van RossumCopyright 1994 by Lance Ellinghouse,
3f6971e2958a162298885b6069cc137d973fac356Guido van RossumCathedral City, California Republic, United States of America.
4e44e373cbc311e211d379e0633d53af4210d29faGuido van Rossum
5e44e373cbc311e211d379e0633d53af4210d29faGuido van Rossum                        All Rights Reserved
6e44e373cbc311e211d379e0633d53af4210d29faGuido van Rossum
7f95a1b3c53bdd678b64aa608d4375660033460c3Antoine PitrouPermission to use, copy, modify, and distribute this software and its
8f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitroudocumentation for any purpose and without fee is hereby granted,
9e44e373cbc311e211d379e0633d53af4210d29faGuido van Rossumprovided that the above copyright notice appear in all copies and that
10f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrouboth that copyright notice and this permission notice appear in
11f6971e2958a162298885b6069cc137d973fac356Guido van Rossumsupporting documentation, and that the name of Lance Ellinghouse
12f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrounot be used in advertising or publicity pertaining to distribution
13f6971e2958a162298885b6069cc137d973fac356Guido van Rossumof the software without specific, written prior permission.
14e44e373cbc311e211d379e0633d53af4210d29faGuido van Rossum
15f6971e2958a162298885b6069cc137d973fac356Guido van RossumLANCE ELLINGHOUSE DISCLAIMS ALL WARRANTIES WITH REGARD TO
16e44e373cbc311e211d379e0633d53af4210d29faGuido van RossumTHIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
17f95a1b3c53bdd678b64aa608d4375660033460c3Antoine PitrouFITNESS, IN NO EVENT SHALL LANCE ELLINGHOUSE BE LIABLE FOR ANY SPECIAL,
18f95a1b3c53bdd678b64aa608d4375660033460c3Antoine PitrouINDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING
19f95a1b3c53bdd678b64aa608d4375660033460c3Antoine PitrouFROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT,
20f95a1b3c53bdd678b64aa608d4375660033460c3Antoine PitrouNEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION
21f6971e2958a162298885b6069cc137d973fac356Guido van RossumWITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
22e44e373cbc311e211d379e0633d53af4210d29faGuido van Rossum
23e44e373cbc311e211d379e0633d53af4210d29faGuido van Rossum******************************************************************/
24e44e373cbc311e211d379e0633d53af4210d29faGuido van Rossum
25c1822a4dd1b5276211be041c7ac216c549c787a4Guido van Rossum/******************************************************************
26c1822a4dd1b5276211be041c7ac216c549c787a4Guido van Rossum
27c1822a4dd1b5276211be041c7ac216c549c787a4Guido van RossumRevision history:
28c1822a4dd1b5276211be041c7ac216c549c787a4Guido van Rossum
2913daf12b47f628a77dbd174a43dc72ed32f00b5bSean Reifscheider2010/04/20 (Sean Reifschneider)
3013daf12b47f628a77dbd174a43dc72ed32f00b5bSean Reifscheider  - Use basename(sys.argv[0]) for the default "ident".
3113daf12b47f628a77dbd174a43dc72ed32f00b5bSean Reifscheider  - Arguments to openlog() are now keyword args and are all optional.
3213daf12b47f628a77dbd174a43dc72ed32f00b5bSean Reifscheider  - syslog() calls openlog() if it hasn't already been called.
3313daf12b47f628a77dbd174a43dc72ed32f00b5bSean Reifscheider
34ae94cf292ba0317ac70a5eca3004a2fa5bcaad80Guido van Rossum1998/04/28 (Sean Reifschneider)
35ae94cf292ba0317ac70a5eca3004a2fa5bcaad80Guido van Rossum  - When facility not specified to syslog() method, use default from openlog()
36ae94cf292ba0317ac70a5eca3004a2fa5bcaad80Guido van Rossum    (This is how it was claimed to work in the documentation)
37ae94cf292ba0317ac70a5eca3004a2fa5bcaad80Guido van Rossum  - Potential resource leak of o_ident, now cleaned up in closelog()
38ae94cf292ba0317ac70a5eca3004a2fa5bcaad80Guido van Rossum  - Minor comment accuracy fix.
39ae94cf292ba0317ac70a5eca3004a2fa5bcaad80Guido van Rossum
40c1822a4dd1b5276211be041c7ac216c549c787a4Guido van Rossum95/06/29 (Steve Clift)
41c1822a4dd1b5276211be041c7ac216c549c787a4Guido van Rossum  - Changed arg parsing to use PyArg_ParseTuple.
42c1822a4dd1b5276211be041c7ac216c549c787a4Guido van Rossum  - Added PyErr_Clear() call(s) where needed.
43c1822a4dd1b5276211be041c7ac216c549c787a4Guido van Rossum  - Fix core dumps if user message contains format specifiers.
447e47402264cf87b9bbb61fc9ff610af08add7c7bThomas Wouters  - Change openlog arg defaults to match normal syslog behavior.
45c1822a4dd1b5276211be041c7ac216c549c787a4Guido van Rossum  - Plug memory leak in openlog().
46c1822a4dd1b5276211be041c7ac216c549c787a4Guido van Rossum  - Fix setlogmask() to return previous mask value.
47c1822a4dd1b5276211be041c7ac216c549c787a4Guido van Rossum
48c1822a4dd1b5276211be041c7ac216c549c787a4Guido van Rossum******************************************************************/
49c1822a4dd1b5276211be041c7ac216c549c787a4Guido van Rossum
50e44e373cbc311e211d379e0633d53af4210d29faGuido van Rossum/* syslog module */
51e44e373cbc311e211d379e0633d53af4210d29faGuido van Rossum
52a597dde3f1959127c33296a77f76331b59449c01Guido van Rossum#include "Python.h"
5313daf12b47f628a77dbd174a43dc72ed32f00b5bSean Reifscheider#include "osdefs.h"
54e44e373cbc311e211d379e0633d53af4210d29faGuido van Rossum
55e44e373cbc311e211d379e0633d53af4210d29faGuido van Rossum#include <syslog.h>
56e44e373cbc311e211d379e0633d53af4210d29faGuido van Rossum
57ae94cf292ba0317ac70a5eca3004a2fa5bcaad80Guido van Rossum/*  only one instance, only one syslog, so globals should be ok  */
58f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitroustatic PyObject *S_ident_o = NULL;                      /*  identifier, held by openlog()  */
597f810cd91576ad43babdbd94647ceda613024fbbSean Reifscheiderstatic char S_log_open = 0;
60ae94cf292ba0317ac70a5eca3004a2fa5bcaad80Guido van Rossum
61ae94cf292ba0317ac70a5eca3004a2fa5bcaad80Guido van Rossum
6213daf12b47f628a77dbd174a43dc72ed32f00b5bSean Reifscheiderstatic PyObject *
6313daf12b47f628a77dbd174a43dc72ed32f00b5bSean Reifscheidersyslog_get_argv(void)
6413daf12b47f628a77dbd174a43dc72ed32f00b5bSean Reifscheider{
65f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    /* Figure out what to use for as the program "ident" for openlog().
66f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou     * This swallows exceptions and continues rather than failing out,
67f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou     * because the syslog module can still be used because openlog(3)
68f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou     * is optional.
69f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou     */
70f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou
71e239d23e8cc66605f548585ad4489a8f12fc070dAlexander Belopolsky    Py_ssize_t argv_len, scriptlen;
72f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    PyObject *scriptobj;
73d63a3b8beb4a0841cb59fb3515347ccaab34b733Martin v. Löwis    Py_ssize_t slash;
74bd303c165bc914fc943026ece55f4ebd225614c9Victor Stinner    PyObject *argv = PySys_GetObject("argv");
75f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou
76f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if (argv == NULL) {
77f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        return(NULL);
78f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    }
79f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou
80f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    argv_len = PyList_Size(argv);
81f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if (argv_len == -1) {
82f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        PyErr_Clear();
83f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        return(NULL);
84f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    }
85f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if (argv_len == 0) {
86f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        return(NULL);
87f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    }
88f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou
89f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    scriptobj = PyList_GetItem(argv, 0);
90f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if (!PyUnicode_Check(scriptobj)) {
91f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        return(NULL);
92f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    }
93c4f281eba3f2b33bc0a7d7172c44f3d1237c09b3Victor Stinner    scriptlen = PyUnicode_GET_LENGTH(scriptobj);
94e239d23e8cc66605f548585ad4489a8f12fc070dAlexander Belopolsky    if (scriptlen == 0) {
95f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        return(NULL);
96f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    }
97f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou
98c4f281eba3f2b33bc0a7d7172c44f3d1237c09b3Victor Stinner    slash = PyUnicode_FindChar(scriptobj, SEP, 0, scriptlen, -1);
99d63a3b8beb4a0841cb59fb3515347ccaab34b733Martin v. Löwis    if (slash == -2)
100d63a3b8beb4a0841cb59fb3515347ccaab34b733Martin v. Löwis        return NULL;
101d63a3b8beb4a0841cb59fb3515347ccaab34b733Martin v. Löwis    if (slash != -1) {
102c4f281eba3f2b33bc0a7d7172c44f3d1237c09b3Victor Stinner        return PyUnicode_Substring(scriptobj, slash, scriptlen);
103f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    } else {
104f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        Py_INCREF(scriptobj);
105f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        return(scriptobj);
106f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    }
107f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou
108f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    return(NULL);
10913daf12b47f628a77dbd174a43dc72ed32f00b5bSean Reifscheider}
11013daf12b47f628a77dbd174a43dc72ed32f00b5bSean Reifscheider
11113daf12b47f628a77dbd174a43dc72ed32f00b5bSean Reifscheider
112f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitroustatic PyObject *
11313daf12b47f628a77dbd174a43dc72ed32f00b5bSean Reifscheidersyslog_openlog(PyObject * self, PyObject * args, PyObject *kwds)
114e44e373cbc311e211d379e0633d53af4210d29faGuido van Rossum{
115f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    long logopt = 0;
116f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    long facility = LOG_USER;
117f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    PyObject *new_S_ident_o = NULL;
118f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    static char *keywords[] = {"ident", "logoption", "facility", 0};
119e239d23e8cc66605f548585ad4489a8f12fc070dAlexander Belopolsky    char *ident = NULL;
120f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou
121f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if (!PyArg_ParseTupleAndKeywords(args, kwds,
122f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou                          "|Ull:openlog", keywords, &new_S_ident_o, &logopt, &facility))
123f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        return NULL;
124f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou
125f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if (new_S_ident_o) {
126f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        Py_INCREF(new_S_ident_o);
127e239d23e8cc66605f548585ad4489a8f12fc070dAlexander Belopolsky    }
128f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou
129f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    /*  get sys.argv[0] or NULL if we can't for some reason  */
130f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if (!new_S_ident_o) {
131f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        new_S_ident_o = syslog_get_argv();
132e239d23e8cc66605f548585ad4489a8f12fc070dAlexander Belopolsky    }
133f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou
134f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    Py_XDECREF(S_ident_o);
135f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    S_ident_o = new_S_ident_o;
136f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou
137f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    /* At this point, S_ident_o should be INCREF()ed.  openlog(3) does not
138f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou     * make a copy, and syslog(3) later uses it.  We can't garbagecollect it
139f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou     * If NULL, just let openlog figure it out (probably using C argv[0]).
140f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou     */
141e239d23e8cc66605f548585ad4489a8f12fc070dAlexander Belopolsky    if (S_ident_o) {
14206515833fef7b8b5c7968edf72367d94ff7eb1e0Serhiy Storchaka        ident = PyUnicode_AsUTF8(S_ident_o);
143e239d23e8cc66605f548585ad4489a8f12fc070dAlexander Belopolsky        if (ident == NULL)
144e239d23e8cc66605f548585ad4489a8f12fc070dAlexander Belopolsky            return NULL;
145e239d23e8cc66605f548585ad4489a8f12fc070dAlexander Belopolsky    }
146f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou
147e239d23e8cc66605f548585ad4489a8f12fc070dAlexander Belopolsky    openlog(ident, logopt, facility);
148f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    S_log_open = 1;
149f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou
150f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    Py_INCREF(Py_None);
151f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    return Py_None;
152e44e373cbc311e211d379e0633d53af4210d29faGuido van Rossum}
153e44e373cbc311e211d379e0633d53af4210d29faGuido van Rossum
15443a476ac002186c28ceccf36009fffe43ce68b0cBarry Warsaw
155f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitroustatic PyObject *
15641c36ffe83d22e84cc072130b3914d66d9d722f0Peter Schneider-Kampsyslog_syslog(PyObject * self, PyObject * args)
157e44e373cbc311e211d379e0633d53af4210d29faGuido van Rossum{
158f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    PyObject *message_object;
159f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    const char *message;
160f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    int   priority = LOG_INFO;
161f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou
162f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if (!PyArg_ParseTuple(args, "iU;[priority,] message string",
163f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou                          &priority, &message_object)) {
164f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        PyErr_Clear();
165f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        if (!PyArg_ParseTuple(args, "U;[priority,] message string",
166f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou                              &message_object))
167f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            return NULL;
168f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    }
169f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou
17006515833fef7b8b5c7968edf72367d94ff7eb1e0Serhiy Storchaka    message = PyUnicode_AsUTF8(message_object);
171f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if (message == NULL)
172f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        return NULL;
173f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou
174f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    /*  if log is not opened, open it now  */
175f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if (!S_log_open) {
176f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        PyObject *openargs;
177f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou
178f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        /* Continue even if PyTuple_New fails, because openlog(3) is optional.
179f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou         * So, we can still do loggin in the unlikely event things are so hosed
180f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou         * that we can't do this tuple.
181f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou         */
182f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        if ((openargs = PyTuple_New(0))) {
183f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            PyObject *openlog_ret = syslog_openlog(self, openargs, NULL);
184f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            Py_XDECREF(openlog_ret);
185f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou            Py_DECREF(openargs);
186f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        }
187f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    }
188f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou
189f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    Py_BEGIN_ALLOW_THREADS;
190f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    syslog(priority, "%s", message);
191f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    Py_END_ALLOW_THREADS;
192f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    Py_RETURN_NONE;
193e44e373cbc311e211d379e0633d53af4210d29faGuido van Rossum}
194e44e373cbc311e211d379e0633d53af4210d29faGuido van Rossum
195f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitroustatic PyObject *
1964d70c3d9dded0f0fa7a73c67217a71111d05df4dThomas Wouterssyslog_closelog(PyObject *self, PyObject *unused)
197e44e373cbc311e211d379e0633d53af4210d29faGuido van Rossum{
198f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if (S_log_open) {
199f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        closelog();
200505ff755d704c73ac613d3e8fed02c79c6ae555aSerhiy Storchaka        Py_CLEAR(S_ident_o);
201f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        S_log_open = 0;
202f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    }
203f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    Py_INCREF(Py_None);
204f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    return Py_None;
205e44e373cbc311e211d379e0633d53af4210d29faGuido van Rossum}
206e44e373cbc311e211d379e0633d53af4210d29faGuido van Rossum
207f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitroustatic PyObject *
20841c36ffe83d22e84cc072130b3914d66d9d722f0Peter Schneider-Kampsyslog_setlogmask(PyObject *self, PyObject *args)
209e44e373cbc311e211d379e0633d53af4210d29faGuido van Rossum{
210f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    long maskpri, omaskpri;
211c1822a4dd1b5276211be041c7ac216c549c787a4Guido van Rossum
212f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if (!PyArg_ParseTuple(args, "l;mask for priority", &maskpri))
213f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        return NULL;
214f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    omaskpri = setlogmask(maskpri);
215f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    return PyLong_FromLong(omaskpri);
216e44e373cbc311e211d379e0633d53af4210d29faGuido van Rossum}
217e44e373cbc311e211d379e0633d53af4210d29faGuido van Rossum
218f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitroustatic PyObject *
21941c36ffe83d22e84cc072130b3914d66d9d722f0Peter Schneider-Kampsyslog_log_mask(PyObject *self, PyObject *args)
220e44e373cbc311e211d379e0633d53af4210d29faGuido van Rossum{
221f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    long mask;
222f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    long pri;
223f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if (!PyArg_ParseTuple(args, "l:LOG_MASK", &pri))
224f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        return NULL;
225f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    mask = LOG_MASK(pri);
226f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    return PyLong_FromLong(mask);
227e44e373cbc311e211d379e0633d53af4210d29faGuido van Rossum}
228e44e373cbc311e211d379e0633d53af4210d29faGuido van Rossum
229f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitroustatic PyObject *
23041c36ffe83d22e84cc072130b3914d66d9d722f0Peter Schneider-Kampsyslog_log_upto(PyObject *self, PyObject *args)
231e44e373cbc311e211d379e0633d53af4210d29faGuido van Rossum{
232f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    long mask;
233f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    long pri;
234f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if (!PyArg_ParseTuple(args, "l:LOG_UPTO", &pri))
235f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        return NULL;
236f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    mask = LOG_UPTO(pri);
237f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    return PyLong_FromLong(mask);
238e44e373cbc311e211d379e0633d53af4210d29faGuido van Rossum}
239e44e373cbc311e211d379e0633d53af4210d29faGuido van Rossum
240e44e373cbc311e211d379e0633d53af4210d29faGuido van Rossum/* List of functions defined in the module */
241e44e373cbc311e211d379e0633d53af4210d29faGuido van Rossum
242f6971e2958a162298885b6069cc137d973fac356Guido van Rossumstatic PyMethodDef syslog_methods[] = {
243f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    {"openlog",         (PyCFunction) syslog_openlog,           METH_VARARGS | METH_KEYWORDS},
244f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    {"closelog",        syslog_closelog,        METH_NOARGS},
245f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    {"syslog",          syslog_syslog,          METH_VARARGS},
246f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    {"setlogmask",      syslog_setlogmask,      METH_VARARGS},
247f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    {"LOG_MASK",        syslog_log_mask,        METH_VARARGS},
248f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    {"LOG_UPTO",        syslog_log_upto,        METH_VARARGS},
249f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    {NULL,              NULL,                   0}
250e44e373cbc311e211d379e0633d53af4210d29faGuido van Rossum};
251e44e373cbc311e211d379e0633d53af4210d29faGuido van Rossum
252ae94cf292ba0317ac70a5eca3004a2fa5bcaad80Guido van Rossum/* Initialization function for the module */
253c1822a4dd1b5276211be041c7ac216c549c787a4Guido van Rossum
2541a21451b1d73b65af949193208372e86bf308411Martin v. Löwis
2551a21451b1d73b65af949193208372e86bf308411Martin v. Löwisstatic struct PyModuleDef syslogmodule = {
256f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    PyModuleDef_HEAD_INIT,
257f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    "syslog",
258f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    NULL,
259f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    -1,
260f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    syslog_methods,
261f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    NULL,
262f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    NULL,
263f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    NULL,
264f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    NULL
2651a21451b1d73b65af949193208372e86bf308411Martin v. Löwis};
2661a21451b1d73b65af949193208372e86bf308411Martin v. Löwis
267fe51c6d66e0fbf6a142036bee2c448bd7fe8fefcMark HammondPyMODINIT_FUNC
2681a21451b1d73b65af949193208372e86bf308411Martin v. LöwisPyInit_syslog(void)
269e44e373cbc311e211d379e0633d53af4210d29faGuido van Rossum{
270f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    PyObject *m;
271f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou
272f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    /* Create the module and add the functions */
273f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    m = PyModule_Create(&syslogmodule);
274f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    if (m == NULL)
275f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou        return NULL;
276f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou
277f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    /* Add some symbolic constants to the module */
278f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou
279f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    /* Priorities */
28074ca886788fd116b026fdaa5980a48f09bce9befCharles-Francois Natali    PyModule_AddIntMacro(m, LOG_EMERG);
28174ca886788fd116b026fdaa5980a48f09bce9befCharles-Francois Natali    PyModule_AddIntMacro(m, LOG_ALERT);
28274ca886788fd116b026fdaa5980a48f09bce9befCharles-Francois Natali    PyModule_AddIntMacro(m, LOG_CRIT);
28374ca886788fd116b026fdaa5980a48f09bce9befCharles-Francois Natali    PyModule_AddIntMacro(m, LOG_ERR);
28474ca886788fd116b026fdaa5980a48f09bce9befCharles-Francois Natali    PyModule_AddIntMacro(m, LOG_WARNING);
28574ca886788fd116b026fdaa5980a48f09bce9befCharles-Francois Natali    PyModule_AddIntMacro(m, LOG_NOTICE);
28674ca886788fd116b026fdaa5980a48f09bce9befCharles-Francois Natali    PyModule_AddIntMacro(m, LOG_INFO);
28774ca886788fd116b026fdaa5980a48f09bce9befCharles-Francois Natali    PyModule_AddIntMacro(m, LOG_DEBUG);
288f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou
289f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    /* openlog() option flags */
29074ca886788fd116b026fdaa5980a48f09bce9befCharles-Francois Natali    PyModule_AddIntMacro(m, LOG_PID);
29174ca886788fd116b026fdaa5980a48f09bce9befCharles-Francois Natali    PyModule_AddIntMacro(m, LOG_CONS);
29274ca886788fd116b026fdaa5980a48f09bce9befCharles-Francois Natali    PyModule_AddIntMacro(m, LOG_NDELAY);
293eac0939ddd56f60664de9cb85aa32910d7b22c78R David Murray#ifdef LOG_ODELAY
29474ca886788fd116b026fdaa5980a48f09bce9befCharles-Francois Natali    PyModule_AddIntMacro(m, LOG_ODELAY);
295eac0939ddd56f60664de9cb85aa32910d7b22c78R David Murray#endif
296bcc207484a0f8f27a684e11194e7430c0710f66dGuido van Rossum#ifdef LOG_NOWAIT
29774ca886788fd116b026fdaa5980a48f09bce9befCharles-Francois Natali    PyModule_AddIntMacro(m, LOG_NOWAIT);
298bcc207484a0f8f27a684e11194e7430c0710f66dGuido van Rossum#endif
299c1822a4dd1b5276211be041c7ac216c549c787a4Guido van Rossum#ifdef LOG_PERROR
30074ca886788fd116b026fdaa5980a48f09bce9befCharles-Francois Natali    PyModule_AddIntMacro(m, LOG_PERROR);
301c1822a4dd1b5276211be041c7ac216c549c787a4Guido van Rossum#endif
302c1822a4dd1b5276211be041c7ac216c549c787a4Guido van Rossum
303f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    /* Facilities */
30474ca886788fd116b026fdaa5980a48f09bce9befCharles-Francois Natali    PyModule_AddIntMacro(m, LOG_KERN);
30574ca886788fd116b026fdaa5980a48f09bce9befCharles-Francois Natali    PyModule_AddIntMacro(m, LOG_USER);
30674ca886788fd116b026fdaa5980a48f09bce9befCharles-Francois Natali    PyModule_AddIntMacro(m, LOG_MAIL);
30774ca886788fd116b026fdaa5980a48f09bce9befCharles-Francois Natali    PyModule_AddIntMacro(m, LOG_DAEMON);
30874ca886788fd116b026fdaa5980a48f09bce9befCharles-Francois Natali    PyModule_AddIntMacro(m, LOG_AUTH);
30974ca886788fd116b026fdaa5980a48f09bce9befCharles-Francois Natali    PyModule_AddIntMacro(m, LOG_LPR);
31074ca886788fd116b026fdaa5980a48f09bce9befCharles-Francois Natali    PyModule_AddIntMacro(m, LOG_LOCAL0);
31174ca886788fd116b026fdaa5980a48f09bce9befCharles-Francois Natali    PyModule_AddIntMacro(m, LOG_LOCAL1);
31274ca886788fd116b026fdaa5980a48f09bce9befCharles-Francois Natali    PyModule_AddIntMacro(m, LOG_LOCAL2);
31374ca886788fd116b026fdaa5980a48f09bce9befCharles-Francois Natali    PyModule_AddIntMacro(m, LOG_LOCAL3);
31474ca886788fd116b026fdaa5980a48f09bce9befCharles-Francois Natali    PyModule_AddIntMacro(m, LOG_LOCAL4);
31574ca886788fd116b026fdaa5980a48f09bce9befCharles-Francois Natali    PyModule_AddIntMacro(m, LOG_LOCAL5);
31674ca886788fd116b026fdaa5980a48f09bce9befCharles-Francois Natali    PyModule_AddIntMacro(m, LOG_LOCAL6);
31774ca886788fd116b026fdaa5980a48f09bce9befCharles-Francois Natali    PyModule_AddIntMacro(m, LOG_LOCAL7);
318e44e373cbc311e211d379e0633d53af4210d29faGuido van Rossum
319ae94cf292ba0317ac70a5eca3004a2fa5bcaad80Guido van Rossum#ifndef LOG_SYSLOG
320f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou#define LOG_SYSLOG              LOG_DAEMON
321ae94cf292ba0317ac70a5eca3004a2fa5bcaad80Guido van Rossum#endif
322ae94cf292ba0317ac70a5eca3004a2fa5bcaad80Guido van Rossum#ifndef LOG_NEWS
323f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou#define LOG_NEWS                LOG_MAIL
324ae94cf292ba0317ac70a5eca3004a2fa5bcaad80Guido van Rossum#endif
325ae94cf292ba0317ac70a5eca3004a2fa5bcaad80Guido van Rossum#ifndef LOG_UUCP
326f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou#define LOG_UUCP                LOG_MAIL
327ae94cf292ba0317ac70a5eca3004a2fa5bcaad80Guido van Rossum#endif
328ae94cf292ba0317ac70a5eca3004a2fa5bcaad80Guido van Rossum#ifndef LOG_CRON
329f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou#define LOG_CRON                LOG_DAEMON
330ae94cf292ba0317ac70a5eca3004a2fa5bcaad80Guido van Rossum#endif
331ae94cf292ba0317ac70a5eca3004a2fa5bcaad80Guido van Rossum
33274ca886788fd116b026fdaa5980a48f09bce9befCharles-Francois Natali    PyModule_AddIntMacro(m, LOG_SYSLOG);
33374ca886788fd116b026fdaa5980a48f09bce9befCharles-Francois Natali    PyModule_AddIntMacro(m, LOG_CRON);
33474ca886788fd116b026fdaa5980a48f09bce9befCharles-Francois Natali    PyModule_AddIntMacro(m, LOG_UUCP);
33574ca886788fd116b026fdaa5980a48f09bce9befCharles-Francois Natali    PyModule_AddIntMacro(m, LOG_NEWS);
336eac0939ddd56f60664de9cb85aa32910d7b22c78R David Murray
337eac0939ddd56f60664de9cb85aa32910d7b22c78R David Murray#ifdef LOG_AUTHPRIV
33874ca886788fd116b026fdaa5980a48f09bce9befCharles-Francois Natali    PyModule_AddIntMacro(m, LOG_AUTHPRIV);
339eac0939ddd56f60664de9cb85aa32910d7b22c78R David Murray#endif
340eac0939ddd56f60664de9cb85aa32910d7b22c78R David Murray
341f95a1b3c53bdd678b64aa608d4375660033460c3Antoine Pitrou    return m;
342e44e373cbc311e211d379e0633d53af4210d29faGuido van Rossum}
343