X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=blobdiff_plain;f=src%2Fpython-systemd%2F_reader.c;h=5d743eb5628e53e234b75b4af87c52a22fa78eed;hb=71766afa2d80ffe1b03c410f6d5ffdc140883314;hp=963da11dc6783ee5a6dbe0bfe9cd80bbc96a2d80;hpb=c4e9b5b557ba956e316933c31bbefa8b48fa3f93;p=elogind.git diff --git a/src/python-systemd/_reader.c b/src/python-systemd/_reader.c index 963da11dc..5d743eb56 100644 --- a/src/python-systemd/_reader.c +++ b/src/python-systemd/_reader.c @@ -25,8 +25,6 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA typedef struct { PyObject_HEAD sd_journal *j; - PyObject *default_call; - PyObject *call_dict; } Journal; static PyTypeObject JournalType; @@ -34,76 +32,11 @@ static void Journal_dealloc(Journal* self) { sd_journal_close(self->j); - Py_XDECREF(self->default_call); - Py_XDECREF(self->call_dict); Py_TYPE(self)->tp_free((PyObject*)self); } -static PyObject * -Journal_new(PyTypeObject *type, PyObject *args, PyObject *kwds) -{ - Journal *self; - - self = (Journal *)type->tp_alloc(type, 0); - if (self != NULL) { - PyObject *globals, *temp; - - globals = PyEval_GetBuiltins(); - temp = PyImport_ImportModule("functools"); - PyDict_SetItemString(globals, "functools", temp); - Py_DECREF(temp); - temp = PyImport_ImportModule("datetime"); - PyDict_SetItemString(globals, "datetime", temp); - Py_DECREF(temp); - -#if PY_MAJOR_VERSION >=3 - self->default_call = PyRun_String("functools.partial(str, encoding='utf-8')", Py_eval_input, globals, NULL); -#else - self->default_call = PyRun_String("functools.partial(unicode, encoding='utf-8')", Py_eval_input, globals, NULL); -#endif - - self->call_dict = PyRun_String("{" - "'PRIORITY': int," - "'LEADER': int," - "'SESSION_ID': int," - "'USERSPACE_USEC': int," - "'INITRD_USEC': int," - "'KERNEL_USEC': int," - "'_UID': int," - "'_GID': int," - "'_PID': int," - "'SYSLOG_FACILITY': int," - "'SYSLOG_PID': int," - "'_AUDIT_SESSION': int," - "'_AUDIT_LOGINUID': int," - "'_SYSTEMD_SESSION': int," - "'_SYSTEMD_OWNER_UID': int," - "'CODE_LINE': int," - "'ERRNO': int," - "'EXIT_STATUS': int," - "'_SOURCE_REALTIME_TIMESTAMP': lambda x: datetime.datetime.fromtimestamp(float(x)/1E6)," - "'__REALTIME_TIMESTAMP': lambda x: datetime.datetime.fromtimestamp(float(x)/1E6)," - "'_SOURCE_MONOTONIC_TIMESTAMP': lambda x: datetime.timedelta(microseconds=float(x))," - "'__MONOTONIC_TIMESTAMP': lambda x: datetime.timedelta(microseconds=float(x))," -#if PY_MAJOR_VERSION >=3 - "'COREDUMP': bytes," -#else - "'COREDUMP': str," -#endif - "'COREDUMP_PID': int," - "'COREDUMP_UID': int," - "'COREDUMP_GID': int," - "'COREDUMP_SESSION': int," - "'COREDUMP_SIGNAL': int," - "'COREDUMP_TIMESTAMP': lambda x: datetime.datetime.fromtimestamp(float(x)/1E6)," - "}", Py_eval_input, globals, NULL); - } - - return (PyObject *) self; -} - PyDoc_STRVAR(Journal__doc__, -"Journal([flags][, default_call][, call_dict][,path]) -> ...\n" +"Journal([flags][,path]) -> ...\n" "Journal instance\n\n" "Returns instance of Journal, which allows filtering and return\n" "of journal entries.\n" @@ -112,13 +45,6 @@ PyDoc_STRVAR(Journal__doc__, "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" -"Argument `default_call` must be a callable that accepts one\n" -"argument which is string/bytes value of a field and returns\n" -"python object.\n" -"Argument `call_dict` is a dictionary where the key represents\n" -"a field name, and value is a callable as per `default_call`.\n" -"A set of sane defaults for `default_call` and `call_dict` are\n" -"present.\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."); @@ -127,96 +53,32 @@ Journal_init(Journal *self, PyObject *args, PyObject *keywds) { int flags=SD_JOURNAL_LOCAL_ONLY; char *path=NULL; - PyObject *default_call=NULL, *call_dict=NULL; - static char *kwlist[] = {"flags", "default_call", "call_dict", "path", NULL}; - if (! PyArg_ParseTupleAndKeywords(args, keywds, "|iOOs", kwlist, - &flags, &default_call, &call_dict, &path)) + static char *kwlist[] = {"flags", "path", NULL}; + if (! PyArg_ParseTupleAndKeywords(args, keywds, "|is", kwlist, + &flags, &path)) return 1; - if (default_call) { - if (PyCallable_Check(default_call) || default_call == Py_None) { - Py_DECREF(self->default_call); - self->default_call = default_call; - Py_INCREF(self->default_call); - }else{ - PyErr_SetString(PyExc_TypeError, "Default call not callable"); - return 1; - } - } - - if (call_dict) { - if (PyDict_Check(call_dict)) { - Py_DECREF(self->call_dict); - self->call_dict = call_dict; - Py_INCREF(self->call_dict); - }else if (call_dict == Py_None) { - Py_DECREF(self->call_dict); - self->call_dict = PyDict_New(); - }else{ - PyErr_SetString(PyExc_TypeError, "Call dictionary must be dict type"); - return 1; - } - } - int r; + Py_BEGIN_ALLOW_THREADS if (path) { r = sd_journal_open_directory(&self->j, path, 0); }else{ - Py_BEGIN_ALLOW_THREADS r = sd_journal_open(&self->j, flags); - Py_END_ALLOW_THREADS } - if (r == -EINVAL) { - PyErr_SetString(PyExc_ValueError, "Invalid flags or path"); + Py_END_ALLOW_THREADS + if (r < 0) { + errno = -r; + PyObject *errtype = r == -EINVAL ? PyExc_ValueError : + r == -ENOMEM ? PyExc_MemoryError : + PyExc_OSError; + PyErr_SetFromErrnoWithFilename(errtype, path); return -1; - }else if (r == -ENOMEM) { - PyErr_SetString(PyExc_MemoryError, "Not enough memory"); - return 1; - }else if (r < 0) { - PyErr_SetString(PyExc_RuntimeError, "Error opening journal"); - return 1; } return 0; } -static PyObject * -Journal___process_field(Journal *self, PyObject *key, const void *value, ssize_t value_len) -{ - PyObject *callable=NULL, *return_value=NULL; - if (PyDict_Check(self->call_dict)) - callable = PyDict_GetItem(self->call_dict, key); - - if (PyCallable_Check(callable)) { -#if PY_MAJOR_VERSION >=3 - return_value = PyObject_CallFunction(callable, "y#", value, value_len); -#else - return_value = PyObject_CallFunction(callable, "s#", value, value_len); -#endif - if (!return_value) - PyErr_Clear(); - } - if (!return_value && PyCallable_Check(self->default_call)) -#if PY_MAJOR_VERSION >=3 - return_value = PyObject_CallFunction(self->default_call, "y#", value, value_len); -#else - return_value = PyObject_CallFunction(self->default_call, "s#", value, value_len); -#endif - if (!return_value) { - PyErr_Clear(); -#if PY_MAJOR_VERSION >=3 - return_value = PyBytes_FromStringAndSize(value, value_len); -#else - return_value = PyString_FromStringAndSize(value, value_len); -#endif - } - if (!return_value) { - return_value = Py_None; - } - return return_value; -} - PyDoc_STRVAR(Journal_get_next__doc__, "get_next([skip]) -> dict\n\n" "Return dictionary of the next log entry. Optional skip value will\n" @@ -228,30 +90,27 @@ Journal_get_next(Journal *self, PyObject *args) if (! PyArg_ParseTuple(args, "|L", &skip)) return NULL; + if (skip == 0LL) { + PyErr_SetString(PyExc_ValueError, "Skip number must positive/negative integer"); + return NULL; + } + int r; + Py_BEGIN_ALLOW_THREADS if (skip == 1LL) { - Py_BEGIN_ALLOW_THREADS r = sd_journal_next(self->j); - Py_END_ALLOW_THREADS }else if (skip == -1LL) { - Py_BEGIN_ALLOW_THREADS r = sd_journal_previous(self->j); - Py_END_ALLOW_THREADS }else if (skip > 1LL) { - Py_BEGIN_ALLOW_THREADS r = sd_journal_next_skip(self->j, skip); - Py_END_ALLOW_THREADS }else if (skip < -1LL) { - Py_BEGIN_ALLOW_THREADS r = sd_journal_previous_skip(self->j, -skip); - Py_END_ALLOW_THREADS - }else{ - PyErr_SetString(PyExc_ValueError, "Skip number must positive/negative integer"); - return NULL; } + Py_END_ALLOW_THREADS if (r < 0) { - PyErr_SetString(PyExc_RuntimeError, "Error getting next message"); + errno = -r; + PyErr_SetFromErrno(PyExc_OSError); return NULL; }else if ( r == 0) { //EOF return PyDict_New(); @@ -272,10 +131,10 @@ Journal_get_next(Journal *self, PyObject *args) #else key = PyString_FromStringAndSize(msg, delim_ptr - (const char*) msg); #endif - value = Journal___process_field(self, key, delim_ptr + 1, (const char*) msg + msg_len - (delim_ptr + 1) ); + value = PyBytes_FromStringAndSize(delim_ptr + 1, (const char*) msg + msg_len - (delim_ptr + 1) ); if (PyDict_Contains(dict, key)) { cur_value = PyDict_GetItem(dict, key); - if (PyList_CheckExact(cur_value) && PyList_Size(cur_value) > 1) { + if (PyList_CheckExact(cur_value)) { PyList_Append(cur_value, value); }else{ tmp_list = PyList_New(0); @@ -301,7 +160,7 @@ Journal_get_next(Journal *self, PyObject *args) #else key = PyString_FromString("__REALTIME_TIMESTAMP"); #endif - value = Journal___process_field(self, key, realtime_str, strlen(realtime_str)); + value = PyBytes_FromString(realtime_str); PyDict_SetItem(dict, key, value); Py_DECREF(key); Py_DECREF(value); @@ -317,7 +176,7 @@ Journal_get_next(Journal *self, PyObject *args) #else key = PyString_FromString("__MONOTONIC_TIMESTAMP"); #endif - value = Journal___process_field(self, key, monotonic_str, strlen(monotonic_str)); + value = PyBytes_FromString(monotonic_str); PyDict_SetItem(dict, key, value); Py_DECREF(key); @@ -331,7 +190,7 @@ Journal_get_next(Journal *self, PyObject *args) #else key = PyString_FromString("__CURSOR"); #endif - value = Journal___process_field(self, key, cursor, strlen(cursor)); + value = PyBytes_FromString(cursor); PyDict_SetItem(dict, key, value); free(cursor); Py_DECREF(key); @@ -352,11 +211,7 @@ Journal_get_previous(Journal *self, PyObject *args) if (! PyArg_ParseTuple(args, "|L", &skip)) return NULL; - PyObject *dict, *arg; - arg = Py_BuildValue("(L)", -skip); - dict = Journal_get_next(self, arg); - Py_DECREF(arg); - return dict; + return PyObject_CallMethod((PyObject *)self, "get_next", "L", -skip); } PyDoc_STRVAR(Journal_add_match__doc__, @@ -396,14 +251,12 @@ Journal_add_match(Journal *self, PyObject *args, PyObject *keywds) if (PyErr_Occurred()) return NULL; r = sd_journal_add_match(self->j, arg_match, arg_match_len); - if (r == -EINVAL) { - PyErr_SetString(PyExc_ValueError, "Invalid match"); - return NULL; - }else if (r == -ENOMEM) { - PyErr_SetString(PyExc_MemoryError, "Not enough memory"); - return NULL; - }else if (r < 0) { - PyErr_SetString(PyExc_RuntimeError, "Error adding match"); + if (r < 0) { + errno = -r; + PyObject *errtype = r == -EINVAL ? PyExc_ValueError : + r == -ENOMEM ? PyExc_MemoryError : + PyExc_OSError; + PyErr_SetFromErrno(errtype); return NULL; } } @@ -485,11 +338,11 @@ Journal_add_disjunction(Journal *self, PyObject *args) { int r; r = sd_journal_add_disjunction(self->j); - if (r == -ENOMEM) { - PyErr_SetString(PyExc_MemoryError, "Not enough memory"); - return NULL; - }else if (r < 0) { - PyErr_SetString(PyExc_RuntimeError, "Error adding disjunction"); + if (r < 0) { + errno = -r; + PyObject *errtype = r == -ENOMEM ? PyExc_MemoryError : + PyExc_OSError; + PyErr_SetFromErrno(errtype); return NULL; } Py_RETURN_NONE; @@ -523,46 +376,45 @@ Journal_seek(Journal *self, PyObject *args, PyObject *keywds) &offset, &whence)) return NULL; - PyObject *arg; + PyObject *result=NULL; if (whence == SEEK_SET){ int r; Py_BEGIN_ALLOW_THREADS r = sd_journal_seek_head(self->j); Py_END_ALLOW_THREADS if (r < 0) { - PyErr_SetString(PyExc_RuntimeError, "Error seeking to head"); + errno = -r; + PyErr_SetFromErrno(PyExc_OSError); return NULL; } if (offset > 0LL) { - arg = Py_BuildValue("(L)", offset); - Py_DECREF(Journal_get_next(self, arg)); - Py_DECREF(arg); + result = PyObject_CallMethod((PyObject *)self, "get_next", "L", offset); } }else if (whence == SEEK_CUR){ - arg = Py_BuildValue("(L)", offset); - Py_DECREF(Journal_get_next(self, arg)); - Py_DECREF(arg); + result = PyObject_CallMethod((PyObject *)self, "get_next", "L", offset); }else if (whence == SEEK_END){ int r; Py_BEGIN_ALLOW_THREADS r = sd_journal_seek_tail(self->j); Py_END_ALLOW_THREADS if (r < 0) { - PyErr_SetString(PyExc_RuntimeError, "Error seeking to tail"); + errno = -r; + PyErr_SetFromErrno(PyExc_OSError); return NULL; } - arg = Py_BuildValue("(L)", -1LL); - Py_DECREF(Journal_get_next(self, arg)); - Py_DECREF(arg); if (offset < 0LL) { - arg = Py_BuildValue("(L)", offset); - Py_DECREF(Journal_get_next(self, arg)); - Py_DECREF(arg); + result = PyObject_CallMethod((PyObject *)self, "get_next", "L", offset); + }else{ + result = PyObject_CallMethod((PyObject *)self, "get_next", "L", -1LL); } }else{ PyErr_SetString(PyExc_ValueError, "Invalid value for whence"); - return NULL; } + + if (result) + Py_DECREF(result); + if (PyErr_Occurred()) + return NULL; Py_RETURN_NONE; } @@ -610,7 +462,8 @@ Journal_seek_realtime(Journal *self, PyObject *args) r = sd_journal_seek_realtime_usec(self->j, timestamp); Py_END_ALLOW_THREADS if (r < 0) { - PyErr_SetString(PyExc_RuntimeError, "Error seek to time"); + errno = -r; + PyErr_SetFromErrno(PyExc_OSError); return NULL; } Py_RETURN_NONE; @@ -660,8 +513,9 @@ Journal_seek_monotonic(Journal *self, PyObject *args) if (r == -EINVAL) { PyErr_SetString(PyExc_ValueError, "Invalid bootid"); return NULL; - } else if (r < 0) { - PyErr_SetString(PyExc_RuntimeError, "Error processing bootid"); + }else if (r < 0) { + errno = -r; + PyErr_SetFromErrno(PyExc_OSError); return NULL; } }else{ @@ -669,8 +523,9 @@ Journal_seek_monotonic(Journal *self, PyObject *args) if (r == -EIO) { PyErr_SetString(PyExc_IOError, "Error getting current boot ID"); return NULL; - } else if (r < 0) { - PyErr_SetString(PyExc_RuntimeError, "Error getting current boot ID"); + }else if (r < 0) { + errno = -r; + PyErr_SetFromErrno(PyExc_OSError); return NULL; } } @@ -679,7 +534,8 @@ Journal_seek_monotonic(Journal *self, PyObject *args) r = sd_journal_seek_monotonic_usec(self->j, sd_id, timestamp); Py_END_ALLOW_THREADS if (r < 0) { - PyErr_SetString(PyExc_RuntimeError, "Error seek to time"); + errno = -r; + PyErr_SetFromErrno(PyExc_OSError); return NULL; } Py_RETURN_NONE; @@ -702,14 +558,19 @@ Journal_wait(Journal *self, PyObject *args, PyObject *keywds) return NULL; int r; + Py_BEGIN_ALLOW_THREADS if ( timeout == 0LL) { - Py_BEGIN_ALLOW_THREADS r = sd_journal_wait(self->j, (uint64_t) -1); - Py_END_ALLOW_THREADS }else{ - Py_BEGIN_ALLOW_THREADS r = sd_journal_wait(self->j, timeout * 1E6); - Py_END_ALLOW_THREADS + } + Py_END_ALLOW_THREADS + if (r < 0) { + errno = -r; + PyObject *errtype = r == -ENOMEM ? PyExc_MemoryError : + PyExc_OSError; + PyErr_SetFromErrno(errtype); + return NULL; } #if PY_MAJOR_VERSION >=3 return PyLong_FromLong(r); @@ -732,14 +593,12 @@ Journal_seek_cursor(Journal *self, PyObject *args) Py_BEGIN_ALLOW_THREADS r = sd_journal_seek_cursor(self->j, cursor); Py_END_ALLOW_THREADS - if (r == -EINVAL) { - PyErr_SetString(PyExc_ValueError, "Invalid cursor"); - return NULL; - }else if (r == -ENOMEM) { - PyErr_SetString(PyExc_MemoryError, "Not enough memory"); - return NULL; - }else if (r < 0) { - PyErr_SetString(PyExc_RuntimeError, "Error seeking to cursor"); + if (r < 0) { + errno = -r; + PyObject *errtype = r == -EINVAL ? PyExc_ValueError : + r == -ENOMEM ? PyExc_MemoryError : + PyExc_OSError; + PyErr_SetFromErrno(errtype); return NULL; } Py_RETURN_NONE; @@ -755,13 +614,10 @@ Journal_iter(PyObject *self) static PyObject * Journal_iternext(PyObject *self) { - Journal *iter = (Journal *)self; - PyObject *dict, *arg; + PyObject *dict; Py_ssize_t dict_size; - arg = Py_BuildValue("()"); - dict = Journal_get_next(iter, arg); - Py_DECREF(arg); + dict = PyObject_CallMethod(self, "get_next", ""); dict_size = PyDict_Size(dict); if ((int64_t) dict_size > 0LL) { return dict; @@ -788,14 +644,12 @@ Journal_query_unique(Journal *self, PyObject *args) Py_BEGIN_ALLOW_THREADS r = sd_journal_query_unique(self->j, query); Py_END_ALLOW_THREADS - if (r == -EINVAL) { - PyErr_SetString(PyExc_ValueError, "Invalid field name"); - return NULL; - } else if (r == -ENOMEM) { - PyErr_SetString(PyExc_MemoryError, "Not enough memory"); - return NULL; - } else if (r < 0) { - PyErr_SetString(PyExc_RuntimeError, "Error querying journal"); + if (r < 0) { + errno = -r; + PyObject *errtype = r == -EINVAL ? PyExc_ValueError : + r == -ENOMEM ? PyExc_MemoryError : + PyExc_OSError; + PyErr_SetFromErrno(errtype); return NULL; } @@ -813,7 +667,7 @@ Journal_query_unique(Journal *self, PyObject *args) SD_JOURNAL_FOREACH_UNIQUE(self->j, uniq, uniq_len) { delim_ptr = memchr(uniq, '=', uniq_len); - value = Journal___process_field(self, key, delim_ptr + 1, (const char*) uniq + uniq_len - (delim_ptr + 1)); + value = PyBytes_FromStringAndSize(delim_ptr + 1, (const char*) uniq + uniq_len - (delim_ptr + 1)); PySet_Add(value_set, value); Py_DECREF(value); } @@ -822,150 +676,6 @@ Journal_query_unique(Journal *self, PyObject *args) } #endif //def SD_JOURNAL_FOREACH_UNIQUE -PyDoc_STRVAR(Journal_log_level__doc__, -"log_level(level) -> None\n\n" -"Sets maximum log level by setting matches for PRIORITY."); -static PyObject * -Journal_log_level(Journal *self, PyObject *args) -{ - int level; - if (! PyArg_ParseTuple(args, "i", &level)) - return NULL; - - if (level < 0 || level > 7) { - PyErr_SetString(PyExc_ValueError, "Log level should be 0 <= level <= 7"); - return NULL; - } - int i; - char level_str[2]; - PyObject *arg, *keywds; - for(i = 0; i <= level; i++) { - sprintf(level_str, "%i", i); - arg = PyTuple_New(0); - keywds = Py_BuildValue("{s:s}", "PRIORITY", level_str); - Journal_add_match(self, arg, keywds); - Py_DECREF(arg); - Py_DECREF(keywds); - if (PyErr_Occurred()) - return NULL; - } - Py_RETURN_NONE; -} - -PyDoc_STRVAR(Journal_this_boot__doc__, -"this_boot() -> None\n\n" -"Sets match filter for the current _BOOT_ID."); -static PyObject * -Journal_this_boot(Journal *self, PyObject *args) -{ - sd_id128_t sd_id; - int r; - r = sd_id128_get_boot(&sd_id); - if (r == -EIO) { - PyErr_SetString(PyExc_IOError, "Error getting current boot ID"); - return NULL; - } else if (r < 0) { - PyErr_SetString(PyExc_RuntimeError, "Error getting current boot ID"); - return NULL; - } - - char bootid[33]; - sd_id128_to_string(sd_id, bootid); - - PyObject *arg, *keywds; - arg = PyTuple_New(0); - keywds = Py_BuildValue("{s:s}", "_BOOT_ID", bootid); - Journal_add_match(self, arg, keywds); - Py_DECREF(arg); - Py_DECREF(keywds); - if (PyErr_Occurred()) - return NULL; - - Py_RETURN_NONE; -} - -PyDoc_STRVAR(Journal_this_machine__doc__, -"this_machine() -> None\n\n" -"Sets match filter for the current _MACHINE_ID."); -static PyObject * -Journal_this_machine(Journal *self, PyObject *args) -{ - sd_id128_t sd_id; - int r; - r = sd_id128_get_machine(&sd_id); - if (r == -EIO) { - PyErr_SetString(PyExc_IOError, "Error getting current boot ID"); - return NULL; - } else if (r < 0) { - PyErr_SetString(PyExc_RuntimeError, "Error getting current boot ID"); - return NULL; - } - - char machineid[33]; - sd_id128_to_string(sd_id, machineid); - - PyObject *arg, *keywds; - arg = PyTuple_New(0); - keywds = Py_BuildValue("{s:s}", "_MACHINE_ID", machineid); - Journal_add_match(self, arg, keywds); - Py_DECREF(arg); - Py_DECREF(keywds); - if (PyErr_Occurred()) - return NULL; - - Py_RETURN_NONE; -} - -static PyObject * -Journal_get_default_call(Journal *self, void *closure) -{ - Py_INCREF(self->default_call); - return self->default_call; -} - -static int -Journal_set_default_call(Journal *self, PyObject *value, void *closure) -{ - if (value == NULL) { - PyErr_SetString(PyExc_TypeError, "Cannot delete default_call"); - return -1; - } - if (! PyCallable_Check(value)) { - PyErr_SetString(PyExc_TypeError, "default_call must be callable"); - return -1; - } - Py_DECREF(self->default_call); - Py_INCREF(value); - self->default_call = value; - - return 0; -} - -static PyObject * -Journal_get_call_dict(Journal *self, void *closure) -{ - Py_INCREF(self->call_dict); - return self->call_dict; -} - -static int -Journal_set_call_dict(Journal *self, PyObject *value, void *closure) -{ - if (value == NULL) { - PyErr_SetString(PyExc_TypeError, "Cannot delete call_dict"); - return -1; - } - if (! PyDict_Check(value)) { - PyErr_SetString(PyExc_TypeError, "call_dict must be dict type"); - return -1; - } - Py_DECREF(self->call_dict); - Py_INCREF(value); - self->call_dict = value; - - return 0; -} - static PyObject * Journal_get_data_threshold(Journal *self, void *closure) { @@ -974,8 +684,9 @@ Journal_get_data_threshold(Journal *self, void *closure) int r; r = sd_journal_get_data_threshold(self->j, &cvalue); - if (r < 0){ - PyErr_SetString(PyExc_RuntimeError, "Error getting data threshold"); + if (r < 0) { + errno = -r; + PyErr_SetFromErrno(PyExc_OSError); return NULL; } @@ -1008,9 +719,10 @@ Journal_set_data_threshold(Journal *self, PyObject *value, void *closure) #else r = sd_journal_set_data_threshold(self->j, (size_t) PyInt_AsLong(value)); #endif - if (r < 0){ - PyErr_SetString(PyExc_RuntimeError, "Error setting data threshold"); - return -1; + if (r < 0) { + errno = -r; + PyErr_SetFromErrno(PyExc_OSError); + return NULL; } return 0; } @@ -1021,16 +733,6 @@ static PyGetSetDef Journal_getseters[] = { (setter)Journal_set_data_threshold, "data threshold", NULL}, - {"call_dict", - (getter)Journal_get_call_dict, - (setter)Journal_set_call_dict, - "dictionary of calls for each field", - NULL}, - {"default_call", - (getter)Journal_get_default_call, - (setter)Journal_set_default_call, - "default call for values for fields", - NULL}, {NULL} }; @@ -1059,12 +761,6 @@ static PyMethodDef Journal_methods[] = { {"query_unique", (PyCFunction)Journal_query_unique, METH_VARARGS, Journal_query_unique__doc__}, #endif - {"log_level", (PyCFunction)Journal_log_level, METH_VARARGS, - Journal_log_level__doc__}, - {"this_boot", (PyCFunction)Journal_this_boot, METH_NOARGS, - Journal_this_boot__doc__}, - {"this_machine", (PyCFunction)Journal_this_machine, METH_NOARGS, - Journal_this_machine__doc__}, {NULL} /* Sentinel */ }; @@ -1106,7 +802,7 @@ static PyTypeObject JournalType = { 0, /* tp_dictoffset */ (initproc)Journal_init, /* tp_init */ 0, /* tp_alloc */ - Journal_new, /* tp_new */ + PyType_GenericNew, /* tp_new */ }; #if PY_MAJOR_VERSION >= 3 @@ -1149,7 +845,7 @@ init_reader(void) #endif Py_INCREF(&JournalType); - PyModule_AddObject(m, "Journal", (PyObject *)&JournalType); + PyModule_AddObject(m, "_Journal", (PyObject *)&JournalType); PyModule_AddIntConstant(m, "NOP", SD_JOURNAL_NOP); PyModule_AddIntConstant(m, "APPEND", SD_JOURNAL_APPEND); PyModule_AddIntConstant(m, "INVALIDATE", SD_JOURNAL_INVALIDATE);