X-Git-Url: https://git.octo.it/?a=blobdiff_plain;f=src%2Fpython.c;h=b90902498d69fdb1b48e3048ac6515dda3200399;hb=4ac3040668e7a9b595edd334a9179a5f6ae42461;hp=e7795c751ef757fc2c97611d0838035df3b79acf;hpb=fc6f1e3d33d646391adb5cedc62e7b3904c15003;p=collectd.git diff --git a/src/python.c b/src/python.c index e7795c75..b9090249 100644 --- a/src/python.c +++ b/src/python.c @@ -305,21 +305,34 @@ void cpy_log_exception(const char *context) { list = PyObject_CallFunction(cpy_format_exception, "NNN", type, value, traceback); /* New reference. Steals references from "type", "value" and "traceback". */ if (list) l = PyObject_Length(list); + for (i = 0; i < l; ++i) { - char *s; PyObject *line; - + char const *msg; + char *cpy; + line = PyList_GET_ITEM(list, i); /* Borrowed reference. */ Py_INCREF(line); - s = strdup(cpy_unicode_or_bytes_to_string(&line)); + + msg = cpy_unicode_or_bytes_to_string(&line); Py_DECREF(line); - if (s[strlen(s) - 1] == '\n') - s[strlen(s) - 1] = 0; + if (msg == NULL) + continue; + + cpy = strdup(msg); + if (cpy == NULL) + continue; + + if (cpy[strlen(cpy) - 1] == '\n') + cpy[strlen(cpy) - 1] = 0; + Py_BEGIN_ALLOW_THREADS - ERROR("%s", s); + ERROR("%s", cpy); Py_END_ALLOW_THREADS - free(s); + + free(cpy); } + Py_XDECREF(list); PyErr_Clear(); } @@ -342,7 +355,7 @@ static int cpy_read_callback(user_data_t *data) { } static int cpy_write_callback(const data_set_t *ds, const value_list_t *value_list, user_data_t *data) { - int i; + size_t i; cpy_callback_t *c = data->data; PyObject *ret, *list, *temp, *dict = NULL; Values *v; @@ -355,22 +368,13 @@ static int cpy_write_callback(const data_set_t *ds, const value_list_t *value_li } for (i = 0; i < value_list->values_len; ++i) { if (ds->ds[i].type == DS_TYPE_COUNTER) { - if ((long) value_list->values[i].counter == value_list->values[i].counter) - PyList_SetItem(list, i, PyInt_FromLong(value_list->values[i].counter)); - else - PyList_SetItem(list, i, PyLong_FromUnsignedLongLong(value_list->values[i].counter)); + PyList_SetItem(list, i, PyLong_FromUnsignedLongLong(value_list->values[i].counter)); } else if (ds->ds[i].type == DS_TYPE_GAUGE) { PyList_SetItem(list, i, PyFloat_FromDouble(value_list->values[i].gauge)); } else if (ds->ds[i].type == DS_TYPE_DERIVE) { - if ((long) value_list->values[i].derive == value_list->values[i].derive) - PyList_SetItem(list, i, PyInt_FromLong(value_list->values[i].derive)); - else - PyList_SetItem(list, i, PyLong_FromLongLong(value_list->values[i].derive)); + PyList_SetItem(list, i, PyLong_FromLongLong(value_list->values[i].derive)); } else if (ds->ds[i].type == DS_TYPE_ABSOLUTE) { - if ((long) value_list->values[i].absolute == value_list->values[i].absolute) - PyList_SetItem(list, i, PyInt_FromLong(value_list->values[i].absolute)); - else - PyList_SetItem(list, i, PyLong_FromUnsignedLongLong(value_list->values[i].absolute)); + PyList_SetItem(list, i, PyLong_FromUnsignedLongLong(value_list->values[i].absolute)); } else { Py_BEGIN_ALLOW_THREADS ERROR("cpy_write_callback: Unknown value type %d.", ds->ds[i].type); @@ -386,7 +390,7 @@ static int cpy_write_callback(const data_set_t *ds, const value_list_t *value_li } dict = PyDict_New(); /* New reference. */ if (value_list->meta) { - int i, num; + int num; char **table; meta_data_t *meta = value_list->meta; @@ -547,7 +551,12 @@ static PyObject *cpy_register_generic(cpy_callback_t **list_head, PyObject *args Py_INCREF(callback); Py_XINCREF(data); + c = malloc(sizeof(*c)); + if (c == NULL) + return NULL; + memset (c, 0, sizeof (*c)); + c->name = strdup(buf); c->callback = callback; c->data = data; @@ -566,7 +575,7 @@ static PyObject *float_or_none(float number) { } static PyObject *cpy_get_dataset(PyObject *self, PyObject *args) { - int i; + size_t i; char *name; const data_set_t *ds; PyObject *list, *tuple; @@ -618,7 +627,7 @@ static PyObject *cpy_register_generic_userdata(void *reg, void *handler, PyObjec char buf[512]; reg_function_t *register_function = (reg_function_t *) reg; cpy_callback_t *c = NULL; - user_data_t *user_data = NULL; + user_data_t user_data; char *name = NULL; PyObject *callback = NULL, *data = NULL; static char *kwlist[] = {"callback", "data", "name", NULL}; @@ -634,26 +643,32 @@ static PyObject *cpy_register_generic_userdata(void *reg, void *handler, PyObjec Py_INCREF(callback); Py_XINCREF(data); + c = malloc(sizeof(*c)); + if (c == NULL) + return NULL; + memset (c, 0, sizeof (*c)); + c->name = strdup(buf); c->callback = callback; c->data = data; c->next = NULL; - user_data = malloc(sizeof(*user_data)); - user_data->free_func = cpy_destroy_user_data; - user_data->data = c; - register_function(buf, handler, user_data); + + memset (&user_data, 0, sizeof (user_data)); + user_data.free_func = cpy_destroy_user_data; + user_data.data = c; + + register_function(buf, handler, &user_data); return cpy_string_to_unicode_or_bytes(buf); } static PyObject *cpy_register_read(PyObject *self, PyObject *args, PyObject *kwds) { char buf[512]; cpy_callback_t *c = NULL; - user_data_t *user_data = NULL; + user_data_t user_data; double interval = 0; char *name = NULL; PyObject *callback = NULL, *data = NULL; - struct timespec ts; static char *kwlist[] = {"callback", "interval", "data", "name", NULL}; if (PyArg_ParseTupleAndKeywords(args, kwds, "O|dOet", kwlist, &callback, &interval, &data, NULL, &name) == 0) return NULL; @@ -667,18 +682,23 @@ static PyObject *cpy_register_read(PyObject *self, PyObject *args, PyObject *kwd Py_INCREF(callback); Py_XINCREF(data); + c = malloc(sizeof(*c)); + if (c == NULL) + return NULL; + memset (c, 0, sizeof (*c)); + c->name = strdup(buf); c->callback = callback; c->data = data; c->next = NULL; - user_data = malloc(sizeof(*user_data)); - user_data->free_func = cpy_destroy_user_data; - user_data->data = c; - ts.tv_sec = interval; - ts.tv_nsec = (interval - ts.tv_sec) * 1000000000; - plugin_register_complex_read(/* group = */ NULL, buf, - cpy_read_callback, &ts, user_data); + + memset (&user_data, 0, sizeof (user_data)); + user_data.free_func = cpy_destroy_user_data; + user_data.data = c; + + plugin_register_complex_read(/* group = */ "python", buf, + cpy_read_callback, DOUBLE_TO_CDTIME_T (interval), &user_data); return cpy_string_to_unicode_or_bytes(buf); } @@ -778,7 +798,7 @@ static PyObject *cpy_unregister_generic(cpy_callback_t **list_head, PyObject *ar for (tmp = *list_head; tmp; prev = tmp, tmp = tmp->next) if (strcmp(name, tmp->name) == 0) break; - + Py_DECREF(arg); if (tmp == NULL) { PyErr_Format(PyExc_RuntimeError, "Unable to unregister %s callback '%s'.", desc, name); @@ -1030,7 +1050,7 @@ PyMODINIT_FUNC PyInit_collectd(void) { } #endif -static int cpy_init_python() { +static int cpy_init_python(void) { PyObject *sys; PyObject *module;