From: Zbigniew Jędrzejewski-Szmek Date: Thu, 7 Mar 2013 16:28:44 +0000 (-0500) Subject: systemd-python: refuse path and flags together in __init__ X-Git-Tag: v198~29 X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?p=elogind.git;a=commitdiff_plain;h=0eff0f3bce1d0826765f6e84ff046b10fe5a1a12;hp=17edd81a9d1265952c662d5f49c70895d0ab17d7 systemd-python: refuse path and flags together in __init__ It's better to explictly check, instead of just documenting it. The return value from init is changed from 1 to -1 on error. Python seems to ignore 1 every second time. Looks like a bug in Python, but the return value doesn't seem to be documented anywhere, and -1 works as expected... so let's just use that. --- diff --git a/src/python-systemd/_reader.c b/src/python-systemd/_reader.c index c435dadec..42029abd4 100644 --- a/src/python-systemd/_reader.c +++ b/src/python-systemd/_reader.c @@ -64,7 +64,7 @@ static int set_error(int r, const char* path, const char* invalid_message) { errno = -r; PyErr_SetFromErrnoWithFilename(PyExc_OSError, path); } - return 1; + return -1; } #if PY_MAJOR_VERSION >= 3 @@ -94,25 +94,34 @@ static void Reader_dealloc(Reader* self) } PyDoc_STRVAR(Reader__doc__, - "Reader([flags][,path]) -> ...\n\n" + "Reader([flags | path]) -> ...\n\n" "Reader allows filtering and retrieval of Journal entries.\n" + "Note: this is a low-level interface, and probably not what you\n" + "want, use systemd.journal.Reader instead.\n\n" "Argument `flags` sets open flags of the journal, which can be one\n" "of, or ORed combination of constants: LOCAL_ONLY (default) opens\n" "journal on local machine only; RUNTIME_ONLY opens only\n" "volatile journal files; and SYSTEM_ONLY opens only\n" - "journal files of system services and the kernel.\n" + "journal files of system services and the kernel.\n\n" "Argument `path` is the directory of journal files. Note that\n" - "currently flags are ignored when `path` is present as they are\n" - "not relevant."); + "`flags` and `path` are exclusive.\n"); static int Reader_init(Reader *self, PyObject *args, PyObject *keywds) { - int flags = SD_JOURNAL_LOCAL_ONLY, r; + int flags = 0, r; char *path = NULL; static const char* const kwlist[] = {"flags", "path", NULL}; if (!PyArg_ParseTupleAndKeywords(args, keywds, "|iz", (char**) kwlist, &flags, &path)) - return 1; + return -1; + + if (!flags) + flags = SD_JOURNAL_LOCAL_ONLY; + else + if (path) { + PyErr_SetString(PyExc_ValueError, "cannot use both flags and path"); + return -1; + } Py_BEGIN_ALLOW_THREADS if (path) diff --git a/src/python-systemd/journal.py b/src/python-systemd/journal.py index e9c09e874..1ed726c33 100644 --- a/src/python-systemd/journal.py +++ b/src/python-systemd/journal.py @@ -114,7 +114,7 @@ class Reader(_Reader): See systemd.journal-fields(7) for more info on typical fields found in the journal. """ - def __init__(self, flags=LOCAL_ONLY, path=None, converters=None): + def __init__(self, flags=0, path=None, converters=None): """Create an instance of Reader, which allows filtering and return of journal entries. @@ -125,8 +125,7 @@ class Reader(_Reader): journal files of system services and the kernel. Argument `path` is the directory of journal files. Note that - currently flags are ignored when `path` is present as they are - currently not relevant. + `flags` and `path` are exclusive. Argument `converters` is a dictionary which updates the DEFAULT_CONVERTERS to convert journal field values. Field