chiark / gitweb /
systemd-python: refuse path and flags together in __init__
authorZbigniew Jędrzejewski-Szmek <zbyszek@in.waw.pl>
Thu, 7 Mar 2013 16:28:44 +0000 (11:28 -0500)
committerZbigniew Jędrzejewski-Szmek <zbyszek@in.waw.pl>
Thu, 7 Mar 2013 16:29:08 +0000 (11:29 -0500)
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.

src/python-systemd/_reader.c
src/python-systemd/journal.py

index c435dad..42029ab 100644 (file)
@@ -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)
index e9c09e8..1ed726c 100644 (file)
@@ -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