Message ID | 20240603230927.4164477-1-dmitry.baryshkov@linaro.org |
---|---|
State | Accepted |
Headers | show |
Series | [meta-oe,v3,1/2] rrdtool: fix compilation with GCC 14 | expand |
This patch in itself is ok however ntopng fails now with this patch applied see https://autobuilder.yoctoproject.org/typhoon/#/builders/88/builds/3899/steps/15/logs/stdio | src/LuaEngineNtop.cpp: In function 'int ntop_rrd_tune(lua_State*)': | src/LuaEngineNtop.cpp:5430:27: error: invalid conversion from 'char**' to 'const char**' [-fpermissive] | 5430 | status = rrd_tune(argc, (char**)argv); | | ^~~~~~~~~~~~ | | | | | char** On Mon, Jun 3, 2024 at 4:09 PM Dmitry Baryshkov via lists.openembedded.org <dbaryshkov=gmail.com@lists.openembedded.org> wrote: > > Import patch from the rrdtool's git to fix building with GCC 14. Note, > it also requires fixing other tools (like lmsensors) in a similar way. > > Signed-off-by: Dmitry Baryshkov <dmitry.baryshkov@linaro.org> > --- > ...3c578f1e9f582e9c28f50d82b1f569602075.patch | 1583 +++++++++++++++++ > .../recipes-extended/rrdtool/rrdtool_1.8.0.bb | 1 + > 2 files changed, 1584 insertions(+) > create mode 100644 meta-oe/recipes-extended/rrdtool/rrdtool/b76e3c578f1e9f582e9c28f50d82b1f569602075.patch > > diff --git a/meta-oe/recipes-extended/rrdtool/rrdtool/b76e3c578f1e9f582e9c28f50d82b1f569602075.patch b/meta-oe/recipes-extended/rrdtool/rrdtool/b76e3c578f1e9f582e9c28f50d82b1f569602075.patch > new file mode 100644 > index 000000000000..7f54a3723d55 > --- /dev/null > +++ b/meta-oe/recipes-extended/rrdtool/rrdtool/b76e3c578f1e9f582e9c28f50d82b1f569602075.patch > @@ -0,0 +1,1583 @@ > +From b76e3c578f1e9f582e9c28f50d82b1f569602075 Mon Sep 17 00:00:00 2001 > +From: =?UTF-8?q?Michal=20Such=C3=A1nek?= <hramrach@gmail.com> > +Date: Fri, 5 Jan 2024 15:31:48 +0100 > +Subject: [PATCH] Constify argv, fix warnings. (#1242) > + > +* Fix perl warnings > + > + - cast POPs to void to avoid unused value warning > + - declare functions that don't set RETVAL as returning void > + > +Signed-off-by: Michal Suchanek <msuchanek@suse.de> > + > +* Constify argv > + > +rrd has no business modifying the string pointed to by passed agrv, and > +as far as gcc can see it does indeed not modify them because it compiles > +with const argv. > + > +This fixes warnings when passing const strings into rrd, and avoids the > +need to duplicate all strings in the tcl bindings. > + > +This fixes warnings like these: > +[ 3s] prog/sensord/rrd.c: In function 'rrdInit': > +[ 3s] prog/sensord/rrd.c:302:40: warning: cast discards 'const' qualifier from pointer target type [-Wcast-qual] > +[ 3s] 302 | ret = rrd_create(argc, (char**) argv); > +[ 3s] | ^ > +[ 3s] prog/sensord/rrd.c: In function 'rrdUpdate': > +[ 3s] prog/sensord/rrd.c:458:42: warning: cast discards 'const' qualifier from pointer target type [-Wcast-qual] > +[ 3s] 458 | if ((ret = rrd_update(3, (char **) /* WEAK */ argv))) { > +[ 3s] | ^ > + > +Signed-off-by: Michal Suchanek <msuchanek@suse.de> > + > +* tcl: Do not duplicate const strings > + > +--------- > + > +Signed-off-by: Michal Suchanek <msuchanek@suse.de> > +Upstream-Status: Backport [https://github.com/oetiker/rrdtool-1.x/commit/b76e3c578f1e9f582e9c28f50d82b1f569602075] > +--- > + CHANGES | 3 ++ > + bindings/lua/rrdlua.c | 25 +++++----- > + bindings/perl-shared/RRDs.xs | 36 +++++++------- > + bindings/python/rrdtoolmodule.c | 38 +++++++-------- > + bindings/ruby/main.c | 10 ++-- > + bindings/tcl/tclrrd.c | 84 ++++++++------------------------- > + src/optparse.c | 14 +++--- > + src/optparse.h | 6 +-- > + src/rrd.h | 38 +++++++-------- > + src/rrd_cgi.c | 24 +++++----- > + src/rrd_create.c | 2 +- > + src/rrd_daemon.c | 12 ++--- > + src/rrd_dump.c | 4 +- > + src/rrd_fetch.c | 2 +- > + src/rrd_first.c | 2 +- > + src/rrd_flushcached.c | 2 +- > + src/rrd_graph.c | 6 +-- > + src/rrd_graph.h | 4 +- > + src/rrd_graph_helper.c | 2 +- > + src/rrd_info.c | 2 +- > + src/rrd_last.c | 2 +- > + src/rrd_lastupdate.c | 2 +- > + src/rrd_list.c | 6 +-- > + src/rrd_modify.c | 2 +- > + src/rrd_modify.h | 2 +- > + src/rrd_resize.c | 4 +- > + src/rrd_restore.c | 2 +- > + src/rrd_tool.c | 26 +++++----- > + src/rrd_tune.c | 2 +- > + src/rrd_update.c | 4 +- > + src/rrd_xport.c | 2 +- > + src/rrdupdate.c | 7 +-- > + 32 files changed, 168 insertions(+), 209 deletions(-) > + > +diff --git a/bindings/lua/rrdlua.c b/bindings/lua/rrdlua.c > +index d1a700641..2095c3b5b 100644 > +--- a/bindings/lua/rrdlua.c > ++++ b/bindings/lua/rrdlua.c > +@@ -37,8 +37,8 @@ > + extern void rrd_freemem(void *mem); > + > + extern int luaopen_rrd (lua_State * L); > +-typedef int (*RRD_FUNCTION)(int, char **); > +-typedef rrd_info_t *(RRD_FUNCTION_V)(int, char **); > ++typedef int (*RRD_FUNCTION)(int, const char **); > ++typedef rrd_info_t *(RRD_FUNCTION_V)(int, const char **); > + > + /**********************************************************/ > + > +@@ -49,9 +49,9 @@ static void reset_rrd_state(void) > + rrd_clear_error(); > + } > + > +-static char **make_argv(const char *cmd, lua_State * L) > ++static const char **make_argv(const char *cmd, lua_State * L) > + { > +- char **argv; > ++ const char **argv; > + int i; > + int argc = lua_gettop(L) + 1; > + > +@@ -60,13 +60,12 @@ static char **make_argv(const char *cmd, lua_State * L) > + luaL_error(L, "Can't allocate memory for arguments array", cmd); > + > + /* fprintf(stderr, "Args:\n"); */ > +- argv[0] = (char *) cmd; /* Dummy arg. Cast to (char *) because rrd */ > +- /* functions don't expect (const * char) */ > ++ argv[0] = cmd; > + /* fprintf(stderr, "%s\n", argv[0]); */ > + for (i=1; i<argc; i++) { > + /* accepts string or number */ > + if (lua_isstring(L, i) || lua_isnumber(L, i)) { > +- if (!(argv[i] = (char *) lua_tostring (L, i))) { > ++ if (!(argv[i] = lua_tostring (L, i))) { > + /* raise an error and never return */ > + luaL_error(L, "%s - error duplicating string area for arg #%d", > + cmd, i); > +@@ -84,7 +83,7 @@ static char **make_argv(const char *cmd, lua_State * L) > + static int > + rrd_common_call (lua_State *L, const char *cmd, RRD_FUNCTION rrd_function) > + { > +- char **argv; > ++ const char **argv; > + int argc = lua_gettop(L) + 1; > + > + argv = make_argv(cmd, L); > +@@ -99,7 +98,7 @@ rrd_common_call (lua_State *L, const char *cmd, RRD_FUNCTION rrd_function) > + static int > + lua_rrd_infocall(lua_State *L, const char *cmd, RRD_FUNCTION_V rrd_function) > + { > +- char **argv; > ++ const char **argv; > + rrd_info_t *p, *data; > + int argc = lua_gettop(L) + 1; > + > +@@ -197,7 +196,7 @@ static int > + lua_rrd_fetch (lua_State * L) > + { > + int argc = lua_gettop(L) + 1; > +- char **argv = make_argv("fetch", L); > ++ const char **argv = make_argv("fetch", L); > + unsigned long i, j, step, ds_cnt; > + rrd_value_t *data, *p; > + char **names; > +@@ -246,7 +245,7 @@ lua_rrd_first (lua_State * L) > + { > + time_t first; > + int argc = lua_gettop(L) + 1; > +- char **argv = make_argv("first", L); > ++ const char **argv = make_argv("first", L); > + reset_rrd_state(); > + first = rrd_first(argc, argv); > + free(argv); > +@@ -260,7 +259,7 @@ lua_rrd_last (lua_State * L) > + { > + time_t last; > + int argc = lua_gettop(L) + 1; > +- char **argv = make_argv("last", L); > ++ const char **argv = make_argv("last", L); > + reset_rrd_state(); > + last = rrd_last(argc, argv); > + free(argv); > +@@ -275,7 +274,7 @@ static int > + lua_rrd_graph (lua_State * L) > + { > + int argc = lua_gettop(L) + 1; > +- char **argv = make_argv("last", L); > ++ const char **argv = make_argv("last", L); > + char **calcpr; > + int i, xsize, ysize; > + double ymin, ymax; > +diff --git a/bindings/perl-shared/RRDs.xs b/bindings/perl-shared/RRDs.xs > +index e233b5835..edce76ec4 100644 > +--- a/bindings/perl-shared/RRDs.xs > ++++ b/bindings/perl-shared/RRDs.xs > +@@ -44,11 +44,11 @@ extern "C" { > + strcpy(argv[i+1],handle); \ > + } \ > + rrd_clear_error();\ > +- RETVAL=name(items+1,argv); \ > ++ RETVAL = name(items + 1, (const char **)argv); \ > + for (i=0; i < items; i++) {\ > +- free(argv[i+1]);\ > ++ free((void *)argv[i+1]);\ > + } \ > +- free(argv);\ > ++ free((void *)argv);\ > + \ > + if (rrd_test_error()) XSRETURN_UNDEF; > + > +@@ -67,11 +67,11 @@ extern "C" { > + strcpy(argv[i+1],handle); \ > + } \ > + rrd_clear_error(); \ > +- data=name(items+1, argv); \ > ++ data = name(items + 1, (const char **)argv); \ > + for (i=0; i < items; i++) { \ > +- free(argv[i+1]); \ > ++ free((void *)argv[i+1]); \ > + } \ > +- free(argv); \ > ++ free((void *)argv); \ > + if (rrd_test_error()) XSRETURN_UNDEF; \ > + hash = newHV(); \ > + save=data; \ > +@@ -175,7 +175,7 @@ static int rrd_fetch_cb_wrapper( > + /* Check the eval first */ > + if (SvTRUE(ERRSV)) { > + rrd_set_error("perl callback failed: %s",SvPV_nolen(ERRSV)); > +- POPs; /* there is undef on top of the stack when there is an error > ++ (void)POPs; /* there is undef on top of the stack when there is an error > + and call_sv was initiated with G_EVAL|G_SCALER */ > + goto error_out; > + } > +@@ -383,7 +383,7 @@ rrd_tune(...) > + > + #ifdef HAVE_RRD_GRAPH > + > +-SV * > ++void > + rrd_graph(...) > + PROTOTYPE: @ > + PREINIT: > +@@ -404,7 +404,7 @@ rrd_graph(...) > + strcpy(argv[i+1],handle); > + } > + rrd_clear_error(); > +- rrd_graph(items+1,argv,&calcpr,&xsize,&ysize,NULL,&ymin,&ymax); > ++ rrd_graph(items+1,(const char **)argv,&calcpr,&xsize,&ysize,NULL,&ymin,&ymax); > + for (i=0; i < items; i++) { > + free(argv[i+1]); > + } > +@@ -433,7 +433,7 @@ rrd_graph(...) > + > + #endif /* HAVE_RRD_GRAPH */ > + > +-SV * > ++void > + rrd_fetch(...) > + PROTOTYPE: @ > + PREINIT: > +@@ -455,7 +455,7 @@ rrd_fetch(...) > + strcpy(argv[i+1],handle); > + } > + rrd_clear_error(); > +- rrd_fetch(items+1,argv,&start,&end,&step,&ds_cnt,&ds_namv,&data); > ++ rrd_fetch(items+1,(const char **)argv,&start,&end,&step,&ds_cnt,&ds_namv,&data); > + for (i=0; i < items; i++) { > + free(argv[i+1]); > + } > +@@ -486,7 +486,7 @@ rrd_fetch(...) > + PUSHs(sv_2mortal(newRV_noinc((SV*)names))); > + PUSHs(sv_2mortal(newRV_noinc((SV*)retar))); > + > +-SV * > ++void > + rrd_fetch_cb_register(cb) > + SV * cb > + CODE: > +@@ -496,7 +496,7 @@ rrd_fetch_cb_register(cb) > + SvSetSV(rrd_fetch_cb_svptr,cb); > + rrd_fetch_cb_register(rrd_fetch_cb_wrapper); > + > +-SV * > ++void > + rrd_times(start, end) > + char *start > + char *end > +@@ -521,7 +521,7 @@ rrd_times(start, end) > + PUSHs(sv_2mortal(newSVuv(start_tmp))); > + PUSHs(sv_2mortal(newSVuv(end_tmp))); > + > +-int > ++void > + rrd_xport(...) > + PROTOTYPE: @ > + PREINIT: > +@@ -543,7 +543,7 @@ rrd_xport(...) > + strcpy(argv[i+1],handle); > + } > + rrd_clear_error(); > +- rrd_xport(items+1,argv,&xsize,&start,&end,&step,&col_cnt,&legend_v,&data); > ++ rrd_xport(items+1,(const char **)argv,&xsize,&start,&end,&step,&col_cnt,&legend_v,&data); > + for (i=0; i < items; i++) { > + free(argv[i+1]); > + } > +@@ -657,7 +657,7 @@ rrd_flushcached(...) > + OUTPUT: > + RETVAL > + > +-SV* > ++void > + rrd_list(...) > + PROTOTYPE: @ > + PREINIT: > +@@ -667,7 +667,7 @@ rrd_list(...) > + char **argv; > + AV *list; > + PPCODE: > +- argv = (char **) malloc((items+1)*sizeof(char *)); > ++ argv = malloc((items+1)*sizeof(char *)); > + argv[0] = "dummy"; > + > + for (i = 0; i < items; i++) { > +@@ -681,7 +681,7 @@ rrd_list(...) > + > + rrd_clear_error(); > + > +- data = rrd_list(items+1, argv); > ++ data = rrd_list(items+1, (const char **)argv); > + > + for (i=0; i < items; i++) { > + free(argv[i+1]); > +diff --git a/bindings/python/rrdtoolmodule.c b/bindings/python/rrdtoolmodule.c > +index 1ab463584..f255e65bc 100644 > +--- a/bindings/python/rrdtoolmodule.c > ++++ b/bindings/python/rrdtoolmodule.c > +@@ -123,7 +123,7 @@ PyRRD_String_FromCF(enum cf_en cf) > + * @return Zero if the function succeeds, otherwise -1 > + */ > + static int > +-convert_args(char *command, PyObject *args, char ***rrdtool_argv, int *rrdtool_argc) > ++convert_args(char *command, PyObject *args, const char ***rrdtool_argv, int *rrdtool_argc) > + { > + PyObject *o, *lo; > + int i, j, args_count, argv_count, element_count; > +@@ -145,7 +145,7 @@ convert_args(char *command, PyObject *args, char ***rrdtool_argv, int *rrdtool_a > + } > + } > + > +- *rrdtool_argv = PyMem_New(char *, element_count + 1); > ++ *rrdtool_argv = PyMem_New(const char *, element_count + 1); > + > + if (*rrdtool_argv == NULL) > + return -1; > +@@ -186,7 +186,7 @@ convert_args(char *command, PyObject *args, char ***rrdtool_argv, int *rrdtool_a > + * Destroy argument vector. > + */ > + static void > +-destroy_args(char ***rrdtool_argv) > ++destroy_args(const char ***rrdtool_argv) > + { > + PyMem_Del(*rrdtool_argv); > + *rrdtool_argv = NULL; > +@@ -267,7 +267,7 @@ static char _rrdtool_create__doc__[] = "Create a new Round Robin Database.\n\n\ > + static PyObject * > + _rrdtool_create(PyObject *Py_UNUSED(self), PyObject *args) > + { > +- char **rrdtool_argv = NULL; > ++ const char **rrdtool_argv = NULL; > + int rrdtool_argc = 0; > + PyObject *ret; > + int status; > +@@ -306,7 +306,7 @@ static char _rrdtool_dump__doc__[] = "Dump an RRD to XML.\n\n\ > + static PyObject * > + _rrdtool_dump(PyObject *Py_UNUSED(self), PyObject *args) > + { > +- char **rrdtool_argv = NULL; > ++ const char **rrdtool_argv = NULL; > + int rrdtool_argc = 0; > + PyObject *ret; > + int status; > +@@ -345,7 +345,7 @@ static char _rrdtool_update__doc__[] = "Store a new set of values into\ > + static PyObject * > + _rrdtool_update(PyObject *Py_UNUSED(self), PyObject *args) > + { > +- char **rrdtool_argv = NULL; > ++ const char **rrdtool_argv = NULL; > + int rrdtool_argc = 0; > + PyObject *ret; > + int status; > +@@ -378,7 +378,7 @@ static char _rrdtool_updatev__doc__[] = "Store a new set of values into "\ > + static PyObject * > + _rrdtool_updatev(PyObject *Py_UNUSED(self), PyObject *args) > + { > +- char **rrdtool_argv = NULL; > ++ const char **rrdtool_argv = NULL; > + int rrdtool_argc = 0; > + PyObject *ret; > + rrd_info_t *data; > +@@ -419,7 +419,7 @@ static char _rrdtool_fetch__doc__[] = "Fetch data from an RRD.\n\n\ > + static PyObject * > + _rrdtool_fetch(PyObject *Py_UNUSED(self), PyObject *args) > + { > +- char **rrdtool_argv = NULL; > ++ const char **rrdtool_argv = NULL; > + int rrdtool_argc = 0; > + PyObject *ret, *range_tup, *dsnam_tup, *data_list, *t; > + rrd_value_t *data, *datai, dv; > +@@ -497,7 +497,7 @@ static char _rrdtool_flushcached__doc__[] = "Flush RRD files from memory.\n\n\ > + static PyObject * > + _rrdtool_flushcached(PyObject *Py_UNUSED(self), PyObject *args) > + { > +- char **rrdtool_argv = NULL; > ++ const char **rrdtool_argv = NULL; > + int rrdtool_argc = 0; > + PyObject *ret; > + int status; > +@@ -592,7 +592,7 @@ static char _rrdtool_graph__doc__[] = "Create a graph based on one or more " \ > + static PyObject * > + _rrdtool_graph(PyObject *Py_UNUSED(self), PyObject *args) > + { > +- char **rrdtool_argv = NULL; > ++ const char **rrdtool_argv = NULL; > + int rrdtool_argc = 0; > + PyObject *ret; > + int xsize, ysize, i, status; > +@@ -650,7 +650,7 @@ static char _rrdtool_graphv__doc__[] = "Create a graph based on one or more " \ > + static PyObject * > + _rrdtool_graphv(PyObject *Py_UNUSED(self), PyObject *args) > + { > +- char **rrdtool_argv = NULL; > ++ const char **rrdtool_argv = NULL; > + int rrdtool_argc = 0; > + PyObject *ret; > + rrd_info_t *data; > +@@ -695,7 +695,7 @@ static char _rrdtool_xport__doc__[] = "Dictionary representation of data " \ > + static PyObject * > + _rrdtool_xport(PyObject *Py_UNUSED(self), PyObject *args) > + { > +- char **rrdtool_argv = NULL; > ++ const char **rrdtool_argv = NULL; > + int rrdtool_argc = 0; > + PyObject *ret; > + int xsize, status; > +@@ -793,7 +793,7 @@ static char _rrdtool_list__doc__[] = "List RRDs in storage.\n\n" \ > + static PyObject * > + _rrdtool_list(PyObject *Py_UNUSED(self), PyObject *args) > + { > +- char **rrdtool_argv = NULL; > ++ const char **rrdtool_argv = NULL; > + int rrdtool_argc = 0; > + PyObject *ret, *str; > + char *data, *ptr, *end; > +@@ -855,7 +855,7 @@ static char _rrdtool_tune__doc__[] = "Modify some basic properties of a " \ > + static PyObject * > + _rrdtool_tune(PyObject *Py_UNUSED(self), PyObject *args) > + { > +- char **rrdtool_argv = NULL; > ++ const char **rrdtool_argv = NULL; > + int rrdtool_argc = 0; > + PyObject *ret; > + int status; > +@@ -893,7 +893,7 @@ static char _rrdtool_first__doc__[] = "Get the first UNIX timestamp of the "\ > + static PyObject * > + _rrdtool_first(PyObject *Py_UNUSED(self), PyObject *args) > + { > +- char **rrdtool_argv = NULL; > ++ const char **rrdtool_argv = NULL; > + int rrdtool_argc = 0; > + PyObject *ret; > + int ts; > +@@ -928,7 +928,7 @@ static char _rrdtool_last__doc__[] = "Get the UNIX timestamp of the most "\ > + static PyObject * > + _rrdtool_last(PyObject *Py_UNUSED(self), PyObject *args) > + { > +- char **rrdtool_argv = NULL; > ++ const char **rrdtool_argv = NULL; > + int rrdtool_argc = 0; > + PyObject *ret; > + int ts; > +@@ -965,7 +965,7 @@ static char _rrdtool_resize__doc__[] = "Modify the number of rows in a "\ > + static PyObject * > + _rrdtool_resize(PyObject *Py_UNUSED(self), PyObject *args) > + { > +- char **rrdtool_argv = NULL; > ++ const char **rrdtool_argv = NULL; > + int rrdtool_argc = 0; > + PyObject *ret; > + int status; > +@@ -1003,7 +1003,7 @@ static char _rrdtool_info__doc__[] = "Extract header information from an "\ > + static PyObject * > + _rrdtool_info(PyObject *Py_UNUSED(self), PyObject *args) > + { > +- char **rrdtool_argv = NULL; > ++ const char **rrdtool_argv = NULL; > + int rrdtool_argc = 0; > + PyObject *ret; > + rrd_info_t *data; > +@@ -1040,7 +1040,7 @@ static char _rrdtool_lastupdate__doc__[] = "Returns datetime and value stored "\ > + static PyObject * > + _rrdtool_lastupdate(PyObject *Py_UNUSED(self), PyObject *args) > + { > +- char **rrdtool_argv = NULL; > ++ const char **rrdtool_argv = NULL; > + int rrdtool_argc = 0; > + PyObject *ret, *ds_dict, *lastupd; > + int status; > +diff --git a/bindings/ruby/main.c b/bindings/ruby/main.c > +index e4cc6443d..a036b7fb8 100644 > +--- a/bindings/ruby/main.c > ++++ b/bindings/ruby/main.c > +@@ -9,7 +9,7 @@ > + > + typedef struct string_arr_t { > + int len; > +- char **strings; > ++ const char **strings; > + } string_arr; > + > + VALUE mRRD; > +@@ -18,12 +18,12 @@ VALUE rb_eRRDError; > + typedef int ( > + *RRDFUNC) ( > + int argc, > +- char **argv); > ++ const char **argv); > + > + typedef rrd_info_t *( > + *RRDINFOFUNC) ( > + int argc, > +- char **argv); > ++ const char **argv); > + > + #define RRD_CHECK_ERROR \ > + if (rrd_test_error()) \ > +@@ -72,10 +72,10 @@ void string_arr_delete( > + > + /* skip dummy first entry */ > + for (i = 1; i < a.len; i++) { > +- free(a.strings[i]); > ++ free((void *)a.strings[i]); > + } > + > +- free(a.strings); > ++ free((void *)a.strings); > + } > + > + void reset_rrd_state( > +diff --git a/bindings/tcl/tclrrd.c b/bindings/tcl/tclrrd.c > +index 2927d9251..58a4cef68 100644 > +--- a/bindings/tcl/tclrrd.c > ++++ b/bindings/tcl/tclrrd.c > +@@ -22,6 +22,7 @@ > + #include <stdlib.h> > + #include "../../src/rrd_tool.h" > + #include "../../src/rrd_format.h" > ++#include "../../src/unused.h" > + > + /* support pre-8.4 tcl */ > + > +@@ -41,47 +42,39 @@ extern int Tclrrd_SafeInit( > + * Hence, we need to do some preparation before > + * calling the rrd library functions. > + */ > +-static char **getopt_init( > ++static const char **getopt_init( > + int argc, > + CONST84 char *argv[]) > + { > +- char **argv2; > ++ const char **argv2; > + int i; > + > + argv2 = calloc(argc, sizeof(char *)); > + for (i = 0; i < argc; i++) { > +- argv2[i] = strdup(argv[i]); > ++ argv2[i] = argv[i]; > + } > + return argv2; > + } > + > + static void getopt_cleanup( > +- int argc, > +- char **argv2) > ++ int UNUSED(argc), > ++ const char **argv2) > + { > +- int i; > +- > +- for (i = 0; i < argc; i++) { > +- if (argv2[i] != NULL) { > +- free(argv2[i]); > +- } > +- } > +- free(argv2); > ++ free((void *)argv2); > + } > + > + static void getopt_free_element( > +- char *argv2[], > ++ const char *argv2[], > + int argn) > + { > + if (argv2[argn] != NULL) { > +- free(argv2[argn]); > + argv2[argn] = NULL; > + } > + } > + > + static void getopt_squieeze( > + int *argc, > +- char *argv2[]) > ++ const char *argv2[]) > + { > + int i, null_i = 0, argc_tmp = *argc; > + > +@@ -104,7 +97,7 @@ static int Rrd_Create( > + CONST84 char *argv[]) > + { > + int argv_i; > +- char **argv2; > ++ const char **argv2; > + char *parsetime_error = NULL; > + time_t last_up = time(NULL) - 10; > + long int long_tmp; > +@@ -295,7 +288,7 @@ static int Rrd_Flushcached( > + return TCL_ERROR; > + } > + > +- rrd_flushcached(argc, (char**)argv); > ++ rrd_flushcached(argc, argv); > + > + if (rrd_test_error()) { > + Tcl_AppendResult(interp, "RRD Error: ", > +@@ -380,7 +373,7 @@ static int Rrd_Update( > + CONST84 char *argv[]) > + { > + int argv_i; > +- char **argv2, *template = NULL; > ++ const char **argv2, *template = NULL; > + > + argv2 = getopt_init(argc, argv); > + > +@@ -391,16 +384,10 @@ static int Rrd_Update( > + Tcl_AppendResult(interp, "RRD Error: option '", > + argv2[argv_i - 1], "' needs an argument", > + (char *) NULL); > +- if (template != NULL) { > +- free(template); > +- } > + getopt_cleanup(argc, argv2); > + return TCL_ERROR; > + } > +- if (template != NULL) { > +- free(template); > +- } > +- template = strdup(argv2[argv_i]); > ++ template = argv2[argv_i]; > + getopt_free_element(argv2, argv_i - 1); > + getopt_free_element(argv2, argv_i); > + } else if (!strcmp(argv2[argv_i], "--")) { > +@@ -409,9 +396,6 @@ static int Rrd_Update( > + } else if (argv2[argv_i][0] == '-') { > + Tcl_AppendResult(interp, "RRD Error: unknown option '", > + argv2[argv_i], "'", (char *) NULL); > +- if (template != NULL) { > +- free(template); > +- } > + getopt_cleanup(argc, argv2); > + return TCL_ERROR; > + } > +@@ -422,18 +406,12 @@ static int Rrd_Update( > + if (argc < 2) { > + Tcl_AppendResult(interp, "RRD Error: needs rrd filename", > + (char *) NULL); > +- if (template != NULL) { > +- free(template); > +- } > + getopt_cleanup(argc, argv2); > + return TCL_ERROR; > + } > + > + rrd_update_r(argv2[1], template, argc - 2, (const char **)argv2 + 2); > + > +- if (template != NULL) { > +- free(template); > +- } > + getopt_cleanup(argc, argv2); > + > + if (rrd_test_error()) { > +@@ -454,7 +432,6 @@ static int Rrd_Info( > + { > + int status = TCL_OK; > + rrd_info_t *data; > +- char **argv2; > + > + /* TODO: support for rrdcached */ > + if (argc != 2) { > +@@ -463,9 +440,7 @@ static int Rrd_Info( > + return TCL_ERROR; > + } > + > +- argv2 = getopt_init(argc, argv); > +- > +- data = rrd_info_r(argv2[1]); > ++ data = rrd_info_r(argv[1]); > + > + if (data) { > + Tcl_SetObjResult(interp, convert_info(data)); > +@@ -477,7 +452,6 @@ static int Rrd_Info( > + status = TCL_ERROR; > + } > + > +- getopt_cleanup(argc, argv2); > + return status; > + } > + > +@@ -488,7 +462,6 @@ static int Rrd_Lastupdate( > + CONST84 char *argv[]) > + { > + time_t last_update; > +- char **argv2; > + char **ds_namv; > + char **last_ds; > + char s[30]; > +@@ -502,8 +475,7 @@ static int Rrd_Lastupdate( > + return TCL_ERROR; > + } > + > +- argv2 = getopt_init(argc, argv); > +- if (rrd_lastupdate_r(argv2[1], &last_update, > ++ if (rrd_lastupdate_r(argv[1], &last_update, > + &ds_cnt, &ds_namv, &last_ds) == 0) { > + listPtr = Tcl_GetObjResult(interp); > + for (i = 0; i < ds_cnt; i++) { > +@@ -527,7 +499,6 @@ static int Rrd_Lastupdate( > + free(ds_namv); > + } > + } > +- getopt_cleanup(argc, argv2); > + return TCL_OK; > + } > + > +@@ -543,10 +514,8 @@ static int Rrd_Fetch( > + char **ds_namv; > + Tcl_Obj *listPtr; > + char s[30]; > +- char **argv2; > + > +- argv2 = getopt_init(argc, argv); > +- if (rrd_fetch(argc, argv2, &start, &end, &step, > ++ if (rrd_fetch(argc, argv, &start, &end, &step, > + &ds_cnt, &ds_namv, &data) != -1) { > + datai = data; > + listPtr = Tcl_GetObjResult(interp); > +@@ -562,7 +531,6 @@ static int Rrd_Fetch( > + free(ds_namv); > + free(data); > + } > +- getopt_cleanup(argc, argv2); > + > + if (rrd_test_error()) { > + Tcl_AppendResult(interp, "RRD Error: ", > +@@ -590,7 +558,7 @@ static int Rrd_Graph( > + int rc, xsize, ysize; > + double ymin, ymax; > + char dimensions[50]; > +- char **argv2; > ++ const char **argv2; > + CONST84 char *save; > + > + /* > +@@ -692,11 +660,7 @@ static int Rrd_Tune( > + int argc, > + CONST84 char *argv[]) > + { > +- char **argv2; > +- > +- argv2 = getopt_init(argc, argv); > +- rrd_tune(argc, argv2); > +- getopt_cleanup(argc, argv2); > ++ rrd_tune(argc, argv); > + > + if (rrd_test_error()) { > + Tcl_AppendResult(interp, "RRD Error: ", > +@@ -716,11 +680,7 @@ static int Rrd_Resize( > + int argc, > + CONST84 char *argv[]) > + { > +- char **argv2; > +- > +- argv2 = getopt_init(argc, argv); > +- rrd_resize(argc, argv2); > +- getopt_cleanup(argc, argv2); > ++ rrd_resize(argc, argv); > + > + if (rrd_test_error()) { > + Tcl_AppendResult(interp, "RRD Error: ", > +@@ -740,11 +700,7 @@ static int Rrd_Restore( > + int argc, > + CONST84 char *argv[]) > + { > +- char **argv2; > +- > +- argv2 = getopt_init(argc, argv); > +- rrd_restore(argc, argv2); > +- getopt_cleanup(argc, argv2); > ++ rrd_restore(argc, argv); > + > + if (rrd_test_error()) { > + Tcl_AppendResult(interp, "RRD Error: ", > +diff --git a/src/optparse.c b/src/optparse.c > +index 9040ba8b2..79a3efe11 100644 > +--- a/src/optparse.c > ++++ b/src/optparse.c > +@@ -10,7 +10,7 @@ > + #define options_argv(i) \ > + ((i) < options->argc ? options->argv[i] : NULL) > + > +-void optparse_init(struct optparse *options, int argc, char **argv) > ++void optparse_init(struct optparse *options, int argc, const char **argv) > + { > + options->argv = argv; > + options->argc = argc; > +@@ -42,7 +42,7 @@ is_longopt(const char *arg) > + static void > + permute(struct optparse *options, int index) > + { > +- char *nonoption = options->argv[index]; > ++ const char *nonoption = options->argv[index]; > + for (int i = index; i < options->optind - 1; i++) > + options->argv[i] = options->argv[i + 1]; > + options->argv[options->optind - 1] = nonoption; > +@@ -67,7 +67,7 @@ int optparse(struct optparse *options, const char *optstring) > + options->errmsg[0] = '\0'; > + options->optopt = 0; > + options->optarg = NULL; > +- char *option = options_argv(options->optind); > ++ const char *option = options_argv(options->optind); > + if (option == NULL) { > + return -1; > + } else if (is_dashdash(option)) { > +@@ -88,7 +88,7 @@ int optparse(struct optparse *options, const char *optstring) > + option += options->subopt + 1; > + options->optopt = option[0]; > + int type = argtype(optstring, option[0]); > +- char *next = options_argv(options->optind + 1); > ++ const char *next = options_argv(options->optind + 1); > + switch (type) { > + case -1: > + opterror(options, "invalid option -- '%c'", option[0]); > +@@ -128,10 +128,10 @@ int optparse(struct optparse *options, const char *optstring) > + return 0; > + } > + > +-char *optparse_arg(struct optparse *options) > ++const char *optparse_arg(struct optparse *options) > + { > + options->subopt = 0; > +- char *option = options->argv[options->optind]; > ++ const char *option = options->argv[options->optind]; > + if (option != NULL) > + options->optind++; > + return option; > +@@ -222,7 +222,7 @@ optparse_long(struct optparse *options, > + int *longindex) > + { > + // printf("%i < %i\n",options->optind,options->argc); > +- char *option = options_argv(options->optind); > ++ const char *option = options_argv(options->optind); > + if (option == NULL) { > + return -1; > + } else if (is_dashdash(option)) { > +diff --git a/src/optparse.h b/src/optparse.h > +index c4b0ec19c..7a0bb3885 100644 > +--- a/src/optparse.h > ++++ b/src/optparse.h > +@@ -44,7 +44,7 @@ > + */ > + > + struct optparse { > +- char **argv; > ++ const char **argv; > + int argc; > + int permute; > + int optind; > +@@ -65,7 +65,7 @@ struct optparse_long { > + /** > + * Initializes the parser state. > + */ > +-void optparse_init(struct optparse *options, int argc, char **argv); > ++void optparse_init(struct optparse *options, int argc, const char **argv); > + > + /** > + * Read the next option in the argv array. > +@@ -98,6 +98,6 @@ optparse_long(struct optparse *options, > + * subcommand returned by optparse_arg(). This function allows you to > + * ignore the value of optind. > + */ > +-char *optparse_arg(struct optparse *options); > ++const char *optparse_arg(struct optparse *options); > + > + #endif > +diff --git a/src/rrd.h b/src/rrd.h > +index 184887ccc..b40f9a449 100644 > +--- a/src/rrd.h > ++++ b/src/rrd.h > +@@ -155,10 +155,10 @@ extern "C" { > + /* main function blocks */ > + int rrd_create( > + int, > +- char **); > ++ const char **); > + rrd_info_t *rrd_info( > + int, > +- char **); > ++ const char **); > + rrd_info_t *rrd_info_push( > + rrd_info_t *, > + char *, > +@@ -170,19 +170,19 @@ extern "C" { > + rrd_info_t *); > + char *rrd_list( > + int, > +- char **); > ++ const char **); > + char *rrd_list_r( > + int, > +- char *dirname); > ++ const char *dirname); > + int rrd_update( > + int, > +- char **); > ++ const char **); > + rrd_info_t *rrd_update_v( > + int, > +- char **); > ++ const char **); > + int rrd_graph( > + int, > +- char **, > ++ const char **, > + char ***, > + int *, > + int *, > +@@ -191,11 +191,11 @@ extern "C" { > + double *); > + rrd_info_t *rrd_graph_v( > + int, > +- char **); > ++ const char **); > + > + int rrd_fetch( > + int, > +- char **, > ++ const char **, > + time_t *, > + time_t *, > + unsigned long *, > +@@ -204,32 +204,32 @@ extern "C" { > + rrd_value_t **); > + int rrd_restore( > + int, > +- char **); > ++ const char **); > + int rrd_dump( > + int, > +- char **); > ++ const char **); > + int rrd_tune( > + int, > +- char **); > ++ const char **); > + time_t rrd_last( > + int, > +- char **); > ++ const char **); > + int rrd_lastupdate( > + int argc, > +- char **argv); > ++ const char **argv); > + time_t rrd_first( > + int, > +- char **); > ++ const char **); > + int rrd_resize( > + int, > +- char **); > ++ const char **); > + char *rrd_strversion( > + void); > + double rrd_version( > + void); > + int rrd_xport( > + int, > +- char **, > ++ const char **, > + int *, > + time_t *, > + time_t *, > +@@ -239,7 +239,7 @@ extern "C" { > + rrd_value_t **); > + int rrd_flushcached( > + int argc, > +- char **argv); > ++ const char **argv); > + > + void rrd_freemem( > + void *mem); > +@@ -323,7 +323,7 @@ extern "C" { > + const char **argv); > + int rrd_dump_opt_r( > + const char *filename, > +- char *outname, > ++ const char *outname, > + int opt_noheader); > + int rrd_dump_r( > + const char *filename, > +diff --git a/src/rrd_cgi.c b/src/rrd_cgi.c > +index b82c310db..14a4f511a 100644 > +--- a/src/rrd_cgi.c > ++++ b/src/rrd_cgi.c > +@@ -102,7 +102,7 @@ static char *rrdstrip( > + static char *scanargs( > + char *line, > + int *argc, > +- char ***args); > ++ const char ***args); > + > + /* format at-time specified times using strftime */ > + static char *printstrftime( > +@@ -317,7 +317,7 @@ static const char *putvar( > + } > + > + /* expand those RRD:* directives that can be used recursively */ > +-static char *rrd_expand_vars( > ++static const char *rrd_expand_vars( > + char *buffer) > + { > + int i; > +@@ -434,7 +434,7 @@ static int readfile( > + > + int main( > + int argc, > +- char *argv[]) > ++ const char *argv[]) > + { > + char *buffer; > + long i; > +@@ -926,7 +926,7 @@ static char *drawgraph( > + } > + calfree(); > + if (rrd_graph > +- (argc + 1, (char **) args - 1, &calcpr, &xsize, &ysize, NULL, &ymin, > ++ (argc + 1, args - 1, &calcpr, &xsize, &ysize, NULL, &ymin, > + &ymax) != -1) { > + return stralloc(calcpr[0]); > + } else { > +@@ -973,7 +973,7 @@ static char *printtimelast( > + /* not raising argc in step with args - 1 since the last argument > + will be used below for strftime */ > + > +- last = rrd_last(argc, (char **) args - 1); > ++ last = rrd_last(argc, args - 1); > + if (rrd_test_error()) { > + char err[4096]; > + > +@@ -1027,7 +1027,7 @@ static char *printtimenow( > + static char *scanargs( > + char *line, > + int *argument_count, > +- char ***arguments) > ++ const char ***arguments) > + { > + char *getP; /* read cursor */ > + char *putP; /* write cursor */ > +@@ -1039,8 +1039,8 @@ static char *scanargs( > + > + /* local array of arguments while parsing */ > + int argc = 1; > +- char **argv; > +- char **argv_tmp; /* temp variable for realloc() */ > ++ const char **argv; > ++ const char **argv_tmp; /* temp variable for realloc() */ > + > + #ifdef DEBUG_PARSER > + printf("<-- scanargs(%s) -->\n", line); > +@@ -1051,7 +1051,7 @@ static char *scanargs( > + > + /* create initial argument array of char pointers */ > + argsz = 32; > +- argv = (char **) malloc(argsz * sizeof(char *)); > ++ argv = malloc(argsz * sizeof(char *)); > + if (!argv) { > + return NULL; > + } > +@@ -1146,7 +1146,7 @@ static char *scanargs( > + if (argc == argsz - 2) { > + /* resize argument array */ > + argsz *= 2; > +- argv_tmp = (char **) rrd_realloc(argv, argsz * sizeof(char *)); > ++ argv_tmp = rrd_realloc(argv, argsz * sizeof(char *)); > + if (*argv_tmp == NULL) { > + return NULL; > + } > +@@ -1213,7 +1213,7 @@ static int parse( > + /* the name of the vairable ... */ > + char *val; > + long valln; > +- char **args; > ++ const char **args; > + char *end; > + long end_offset; > + int argc; > +@@ -1264,7 +1264,7 @@ static int parse( > + /* make sure we do not shrink the mallocd block */ > + size_t newbufsize = i + strlen(end) + valln + 1; > + > +- *buf = (char *) rrd_realloc(*buf, newbufsize); > ++ *buf = rrd_realloc(*buf, newbufsize); > + > + if (*buf == NULL) { > + perror("Realoc buf:"); > +diff --git a/src/rrd_create.c b/src/rrd_create.c > +index f9bad0866..919b4195a 100644 > +--- a/src/rrd_create.c > ++++ b/src/rrd_create.c > +@@ -76,7 +76,7 @@ static void parseGENERIC_DS( > + > + int rrd_create( > + int argc, > +- char **argv) > ++ const char **argv) > + { > + struct optparse_long longopts[] = { > + {"start", 'b', OPTPARSE_REQUIRED}, > +diff --git a/src/rrd_daemon.c b/src/rrd_daemon.c > +index 751798aa1..21c38a11d 100644 > +--- a/src/rrd_daemon.c > ++++ b/src/rrd_daemon.c > +@@ -1877,7 +1877,7 @@ static int handle_request_tune( > + HANDLER_PROTO) > + { /* {{{ */ > + int status; > +- char** argv = NULL; > ++ const char** argv = NULL; > + int argc, argc_tmp; > + char* i; > + int rc; > +@@ -1916,7 +1916,7 @@ static int handle_request_tune( > + goto done; > + } > + > +- if ((argv = (char **) malloc(argc * sizeof(char*))) == NULL) { > ++ if ((argv = malloc(argc * sizeof(char*))) == NULL) { > + rc = send_response(sock, RESP_ERR, "%s\n", rrd_strerror(ENOMEM)); > + goto done; > + } > +@@ -1927,7 +1927,7 @@ static int handle_request_tune( > + argc_tmp += 1; > + } > + > +- status = rrd_tune_r(file, argc, (const char **)argv); > ++ status = rrd_tune_r(file, argc, argv); > + if (status != 0) { > + rc = send_response(sock, RESP_ERR, "Got error %s\n", rrd_get_error()); > + goto done; > +@@ -1935,7 +1935,7 @@ static int handle_request_tune( > + rc = send_response(sock, RESP_OK, "Success\n"); > + done: > + free(file); > +- free(argv); > ++ free((void *)argv); > + return rc; > + } > + > +@@ -4505,7 +4505,7 @@ static int cleanup( > + > + static int read_options( > + int argc, > +- char **argv) > ++ const char **argv) > + { /* {{{ */ > + struct optparse_long longopts[] = { > + {NULL, 'a', OPTPARSE_REQUIRED}, > +@@ -5050,7 +5050,7 @@ static int read_options( > + > + int main( > + int argc, > +- char **argv) > ++ const char **argv) > + { > + int status; > + > +diff --git a/src/rrd_dump.c b/src/rrd_dump.c > +index a4490d594..c58e0ee4a 100644 > +--- a/src/rrd_dump.c > ++++ b/src/rrd_dump.c > +@@ -497,7 +497,7 @@ static size_t rrd_dump_opt_cb_fileout( > + > + int rrd_dump_opt_r( > + const char *filename, > +- char *outname, > ++ const char *outname, > + int opt_noheader) > + { > + FILE *out_file; > +@@ -543,7 +543,7 @@ int rrd_dump_r( > + > + int rrd_dump( > + int argc, > +- char **argv) > ++ const char **argv) > + { > + int opt; > + struct optparse_long longopts[] = { > +diff --git a/src/rrd_fetch.c b/src/rrd_fetch.c > +index c739bfc45..54780f19b 100644 > +--- a/src/rrd_fetch.c > ++++ b/src/rrd_fetch.c > +@@ -61,7 +61,7 @@ > + > + int rrd_fetch( > + int argc, > +- char **argv, > ++ const char **argv, > + time_t *start, > + time_t *end, /* which time frame do you want ? > + * will be changed to represent reality */ > +diff --git a/src/rrd_first.c b/src/rrd_first.c > +index a696c5c38..f3dde5404 100644 > +--- a/src/rrd_first.c > ++++ b/src/rrd_first.c > +@@ -13,7 +13,7 @@ > + > + time_t rrd_first( > + int argc, > +- char **argv) > ++ const char **argv) > + { > + struct optparse_long longopts[] = { > + {"rraindex", 129, OPTPARSE_REQUIRED}, > +diff --git a/src/rrd_flushcached.c b/src/rrd_flushcached.c > +index 090bca749..3bf6cd29d 100644 > +--- a/src/rrd_flushcached.c > ++++ b/src/rrd_flushcached.c > +@@ -22,7 +22,7 @@ > + #include "rrd_tool.h" > + #include "rrd_client.h" > + > +-int rrd_flushcached (int argc, char **argv) > ++int rrd_flushcached (int argc, const char **argv) > + { > + struct optparse_long longopts[] = { > + {"daemon", 'd', OPTPARSE_REQUIRED}, > +diff --git a/src/rrd_graph.c b/src/rrd_graph.c > +index b32d45085..46511e9a3 100644 > +--- a/src/rrd_graph.c > ++++ b/src/rrd_graph.c > +@@ -4607,7 +4607,7 @@ int scan_for_col( > + /* Now just a wrapper around rrd_graph_v */ > + int rrd_graph( > + int argc, > +- char **argv, > ++ const char **argv, > + char ***prdata, > + int *xsize, > + int *ysize, > +@@ -4690,7 +4690,7 @@ int rrd_graph( > + > + rrd_info_t *rrd_graph_v( > + int argc, > +- char **argv) > ++ const char **argv) > + { > + image_desc_t im; > + rrd_info_t *grinfo; > +@@ -4953,7 +4953,7 @@ void rrd_graph_init( > + > + void rrd_graph_options( > + int argc, > +- char *argv[], > ++ const char **argv, > + struct optparse *poptions, > + image_desc_t *im) > + { > +diff --git a/src/rrd_graph.h b/src/rrd_graph.h > +index 4df32ec66..083cf3800 100644 > +--- a/src/rrd_graph.h > ++++ b/src/rrd_graph.h > +@@ -473,12 +473,12 @@ void time_clean( > + > + void rrd_graph_options( > + int, > +- char **, > ++ const char **, > + struct optparse *, > + image_desc_t *); > + void rrd_graph_script( > + int, > +- char **, > ++ const char **, > + image_desc_t *const, > + int); > + int rrd_graph_color( > +diff --git a/src/rrd_graph_helper.c b/src/rrd_graph_helper.c > +index 99cdefa65..ba90e1a6c 100644 > +--- a/src/rrd_graph_helper.c > ++++ b/src/rrd_graph_helper.c > +@@ -1952,7 +1952,7 @@ static int parse_xport( > + > + void rrd_graph_script( > + int argc, > +- char *argv[], > ++ const char **argv, > + image_desc_t *const im, > + int optno) > + { > +diff --git a/src/rrd_info.c b/src/rrd_info.c > +index c0c6f68c7..eb0d4e4de 100644 > +--- a/src/rrd_info.c > ++++ b/src/rrd_info.c > +@@ -82,7 +82,7 @@ rrd_info_t > + > + rrd_info_t *rrd_info( > + int argc, > +- char **argv) > ++ const char **argv) > + { > + struct optparse_long longopts[] = { > + {"daemon", 'd', OPTPARSE_REQUIRED}, > +diff --git a/src/rrd_last.c b/src/rrd_last.c > +index 026a1e828..1aae72512 100644 > +--- a/src/rrd_last.c > ++++ b/src/rrd_last.c > +@@ -11,7 +11,7 @@ > + > + time_t rrd_last( > + int argc, > +- char **argv) > ++ const char **argv) > + { > + char *opt_daemon = NULL; > + time_t lastupdate; > +diff --git a/src/rrd_lastupdate.c b/src/rrd_lastupdate.c > +index ab30dcf67..4f7f4770e 100644 > +--- a/src/rrd_lastupdate.c > ++++ b/src/rrd_lastupdate.c > +@@ -14,7 +14,7 @@ > + #include "rrd_client.h" > + #include <stdarg.h> > + > +-int rrd_lastupdate (int argc, char **argv) > ++int rrd_lastupdate (int argc, const char **argv) > + { > + struct optparse_long longopts[] = { > + {"daemon", 'd', OPTPARSE_REQUIRED}, > +diff --git a/src/rrd_list.c b/src/rrd_list.c > +index e743b9b7d..6e96220ea 100644 > +--- a/src/rrd_list.c > ++++ b/src/rrd_list.c > +@@ -37,7 +37,7 @@ static char *move_past_prefix(const char *prefix, const char *string) > + return (char *)&(string[index]); > + } > + > +-static char *rrd_list_rec(int recursive, char *root, char *dirname) > ++static char *rrd_list_rec(int recursive, const char *root, const char *dirname) > + { > + #define SANE_ASPRINTF2(_dest_str, _format, ...) \ > + if (asprintf(&_dest_str, _format, __VA_ARGS__) == -1) { \ > +@@ -138,7 +138,7 @@ static char *rrd_list_rec(int recursive, char *root, char *dirname) > + return out; > + } > + > +-char *rrd_list_r(int recursive, char *dirname) > ++char *rrd_list_r(int recursive, const char *dirname) > + { > + #define SANE_ASPRINTF(_dest_str, _format, ...) \ > + if (asprintf(&_dest_str, _format, __VA_ARGS__) == -1) { \ > +@@ -240,7 +240,7 @@ char *rrd_list_r(int recursive, char *dirname) > + return rrd_list_rec(recursive, dirname, dirname); > + } > + > +-char *rrd_list(int argc, char **argv) > ++char *rrd_list(int argc, const char **argv) > + { > + char *opt_daemon = NULL; > + int status; > +diff --git a/src/rrd_modify.c b/src/rrd_modify.c > +index a2b07f640..70ac9e77f 100644 > +--- a/src/rrd_modify.c > ++++ b/src/rrd_modify.c > +@@ -1297,7 +1297,7 @@ static int add_rras(const rrd_t *in, rrd_t *out, const int *ds_map, > + } > + > + int handle_modify(const rrd_t *in, const char *outfilename, > +- int argc, char **argv, int optidx, > ++ int argc, const char **argv, int optidx, > + int newstep) { > + // parse add/remove options > + int rc = -1; > +diff --git a/src/rrd_modify.h b/src/rrd_modify.h > +index 52d8789be..64a39926e 100644 > +--- a/src/rrd_modify.h > ++++ b/src/rrd_modify.h > +@@ -28,7 +28,7 @@ typedef struct { > + } rra_mod_op_t; > + > + int handle_modify(const rrd_t *in, const char *outfilename, > +- int argc, char **argv, int optind, > ++ int argc, const char **argv, int optind, > + int newstep); > + > + typedef union { > +diff --git a/src/rrd_resize.c b/src/rrd_resize.c > +index fb75d81ff..742e6d141 100644 > +--- a/src/rrd_resize.c > ++++ b/src/rrd_resize.c > +@@ -12,9 +12,9 @@ > + > + int rrd_resize( > + int argc, > +- char **argv) > ++ const char **argv) > + { > +- char *infilename, outfilename[11] = "resize.rrd"; > ++ const char *infilename, outfilename[11] = "resize.rrd"; > + rrd_t rrdold, rrdnew; > + rrd_value_t buffer; > + int version; > +diff --git a/src/rrd_restore.c b/src/rrd_restore.c > +index 85d481e0c..ebef5efe8 100644 > +--- a/src/rrd_restore.c > ++++ b/src/rrd_restore.c > +@@ -1378,7 +1378,7 @@ int write_file( > + > + int rrd_restore( > + int argc, > +- char **argv) > ++ const char **argv) > + { > + struct optparse_long longopts[] = { > + {"range-check", 'r', OPTPARSE_NONE}, > +diff --git a/src/rrd_tool.c b/src/rrd_tool.c > +index cc6119d9a..56321ee1a 100644 > +--- a/src/rrd_tool.c > ++++ b/src/rrd_tool.c > +@@ -22,16 +22,16 @@ > + > + > + static void PrintUsage( > +- char *cmd); > ++ const char *cmd); > + static int CountArgs( > + char *aLine); > + static int CreateArgs( > ++ const char *, > + char *, > +- char *, > +- char **); > ++ const char **); > + static int HandleInputLine( > + int, > +- char **, > ++ const char **, > + FILE *); > + int RemoteMode = 0; > + int ChangeRoot = 0; > +@@ -42,7 +42,7 @@ int ChangeRoot = 0; > + > + > + static void PrintUsage( > +- char *cmd) > ++ const char *cmd) > + { > + > + const char *help_main = > +@@ -443,11 +443,11 @@ static char *fgetslong( > + > + int main( > + int argc, > +- char *argv[]) > ++ const char *argv[]) > + { > +- char **myargv; > ++ const char **myargv; > + char *aLine; > +- char *firstdir = ""; > ++ const char *firstdir = ""; > + > + #ifdef MUST_DISABLE_SIGFPE > + signal(SIGFPE, SIG_IGN); > +@@ -526,7 +526,7 @@ int main( > + printf("ERROR: not enough arguments\n"); > + continue; > + } > +- if ((myargv = (char **) malloc((argc + 1) * > ++ if ((myargv = malloc((argc + 1) * > + sizeof(char *))) == NULL) { > + perror("malloc"); > + exit(1); > +@@ -572,7 +572,7 @@ int main( > + resolving them portably is not really simple. */ > + static int HandleInputLine( > + int argc, > +- char **argv, > ++ const char **argv, > + FILE * out) > + { > + #if defined(HAVE_OPENDIR) && defined (HAVE_READDIR) > +@@ -887,12 +887,12 @@ static int CountArgs( > + * CreateArgs - take a string (aLine) and tokenize > + */ > + static int CreateArgs( > +- char *pName, > ++ const char *pName, > + char *aLine, > +- char **argv) > ++ const char **argv) > + { > + char *getP, *putP; > +- char **pargv = argv; > ++ const char **pargv = argv; > + char Quote = 0; > + int inArg = 0; > + int len; > +diff --git a/src/rrd_tune.c b/src/rrd_tune.c > +index 198817f37..dd3f3f7cb 100644 > +--- a/src/rrd_tune.c > ++++ b/src/rrd_tune.c > +@@ -71,7 +71,7 @@ static int set_hwsmootharg( > + > + int rrd_tune( > + int argc, > +- char **argv) > ++ const char **argv) > + { > + char *opt_daemon = NULL; > + const char *in_filename = NULL; > +diff --git a/src/rrd_update.c b/src/rrd_update.c > +index fbbe2820a..bb9a0602c 100644 > +--- a/src/rrd_update.c > ++++ b/src/rrd_update.c > +@@ -299,7 +299,7 @@ static void initialize_time( > + > + rrd_info_t *rrd_update_v( > + int argc, > +- char **argv) > ++ const char **argv) > + { > + struct optparse_long longopts[] = { > + {"template", 't', OPTPARSE_REQUIRED}, > +@@ -674,7 +674,7 @@ static int rrd_template_update(const char *filename, /* {{{ */ > + > + int rrd_update( > + int argc, > +- char **argv) > ++ const char **argv) > + { > + struct optparse_long longopts[] = { > + {"template", 't', OPTPARSE_REQUIRED}, > +diff --git a/src/rrd_xport.c b/src/rrd_xport.c > +index d15d33dd9..93c02f926 100644 > +--- a/src/rrd_xport.c > ++++ b/src/rrd_xport.c > +@@ -73,7 +73,7 @@ static int rrd_xport_format_addprints( > + > + int rrd_xport( > + int argc, > +- char **argv, > ++ const char **argv, > + int UNUSED(*xsize), > + time_t *start, > + time_t *end, /* which time frame do you want ? > +diff --git a/src/rrdupdate.c b/src/rrdupdate.c > +index cbbf48cc1..e368516c8 100644 > +--- a/src/rrdupdate.c > ++++ b/src/rrdupdate.c > +@@ -20,19 +20,20 @@ int main( > + int argc, > + char **argv) > + { > ++ const char **cargv = (const char **)argv; > + char *name=basename(argv[0]); > + rrd_info_t *info; > + > + if (!strcmp(name, "rrdcreate")) { > +- rrd_create(argc, argv); > ++ rrd_create(argc, cargv); > + } > + else if (!strcmp(name, "rrdinfo")) { > +- info=rrd_info(argc, argv); > ++ info=rrd_info(argc, cargv); > + rrd_info_print(info); > + rrd_info_free(info); > + } > + else { > +- rrd_update(argc, argv); > ++ rrd_update(argc, cargv); > + } > + > + if (rrd_test_error()) { > diff --git a/meta-oe/recipes-extended/rrdtool/rrdtool_1.8.0.bb b/meta-oe/recipes-extended/rrdtool/rrdtool_1.8.0.bb > index cbe1af2854f2..425a98f0c09b 100644 > --- a/meta-oe/recipes-extended/rrdtool/rrdtool_1.8.0.bb > +++ b/meta-oe/recipes-extended/rrdtool/rrdtool_1.8.0.bb > @@ -11,6 +11,7 @@ PV = "1.8.0" > > SRC_URI = "\ > git://github.com/oetiker/rrdtool-1.x.git;protocol=https;branch=master \ > + file://b76e3c578f1e9f582e9c28f50d82b1f569602075.patch \ > " > > S = "${WORKDIR}/git" > -- > 2.39.2 > > > -=-=-=-=-=-=-=-=-=-=-=- > Links: You receive all messages sent to this group. > View/Reply Online (#110682): https://lists.openembedded.org/g/openembedded-devel/message/110682 > Mute This Topic: https://lists.openembedded.org/mt/106473144/1997914 > Group Owner: openembedded-devel+owner@lists.openembedded.org > Unsubscribe: https://lists.openembedded.org/g/openembedded-devel/unsub [raj.khem@gmail.com] > -=-=-=-=-=-=-=-=-=-=-=- >
On Wed, 5 Jun 2024 at 00:12, Khem Raj <raj.khem@gmail.com> wrote: > > This patch in itself is ok however ntopng fails now with this patch applied see Pretty much like lmsensors, as it seems. How should we proceed? Fix all existing uses? > > https://autobuilder.yoctoproject.org/typhoon/#/builders/88/builds/3899/steps/15/logs/stdio > > | src/LuaEngineNtop.cpp: In function 'int ntop_rrd_tune(lua_State*)': > | src/LuaEngineNtop.cpp:5430:27: error: invalid conversion from > 'char**' to 'const char**' [-fpermissive] > | 5430 | status = rrd_tune(argc, (char**)argv); > | | ^~~~~~~~~~~~ > | | | > | | char** > > On Mon, Jun 3, 2024 at 4:09 PM Dmitry Baryshkov via > lists.openembedded.org <dbaryshkov=gmail.com@lists.openembedded.org> > wrote: > > > > Import patch from the rrdtool's git to fix building with GCC 14. Note, > > it also requires fixing other tools (like lmsensors) in a similar way.
On Tue, Jun 4, 2024 at 3:19 PM Dmitry Baryshkov <dbaryshkov@gmail.com> wrote: > > On Wed, 5 Jun 2024 at 00:12, Khem Raj <raj.khem@gmail.com> wrote: > > > > This patch in itself is ok however ntopng fails now with this patch applied see > > Pretty much like lmsensors, as it seems. How should we proceed? Fix > all existing uses? I am afraid, yes. > > > > > https://autobuilder.yoctoproject.org/typhoon/#/builders/88/builds/3899/steps/15/logs/stdio > > > > | src/LuaEngineNtop.cpp: In function 'int ntop_rrd_tune(lua_State*)': > > | src/LuaEngineNtop.cpp:5430:27: error: invalid conversion from > > 'char**' to 'const char**' [-fpermissive] > > | 5430 | status = rrd_tune(argc, (char**)argv); > > | | ^~~~~~~~~~~~ > > | | | > > | | char** > > > > On Mon, Jun 3, 2024 at 4:09 PM Dmitry Baryshkov via > > lists.openembedded.org <dbaryshkov=gmail.com@lists.openembedded.org> > > wrote: > > > > > > Import patch from the rrdtool's git to fix building with GCC 14. Note, > > > it also requires fixing other tools (like lmsensors) in a similar way. > > > -- > With best wishes > Dmitry
diff --git a/meta-oe/recipes-extended/rrdtool/rrdtool/b76e3c578f1e9f582e9c28f50d82b1f569602075.patch b/meta-oe/recipes-extended/rrdtool/rrdtool/b76e3c578f1e9f582e9c28f50d82b1f569602075.patch new file mode 100644 index 000000000000..7f54a3723d55 --- /dev/null +++ b/meta-oe/recipes-extended/rrdtool/rrdtool/b76e3c578f1e9f582e9c28f50d82b1f569602075.patch @@ -0,0 +1,1583 @@ +From b76e3c578f1e9f582e9c28f50d82b1f569602075 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Michal=20Such=C3=A1nek?= <hramrach@gmail.com> +Date: Fri, 5 Jan 2024 15:31:48 +0100 +Subject: [PATCH] Constify argv, fix warnings. (#1242) + +* Fix perl warnings + + - cast POPs to void to avoid unused value warning + - declare functions that don't set RETVAL as returning void + +Signed-off-by: Michal Suchanek <msuchanek@suse.de> + +* Constify argv + +rrd has no business modifying the string pointed to by passed agrv, and +as far as gcc can see it does indeed not modify them because it compiles +with const argv. + +This fixes warnings when passing const strings into rrd, and avoids the +need to duplicate all strings in the tcl bindings. + +This fixes warnings like these: +[ 3s] prog/sensord/rrd.c: In function 'rrdInit': +[ 3s] prog/sensord/rrd.c:302:40: warning: cast discards 'const' qualifier from pointer target type [-Wcast-qual] +[ 3s] 302 | ret = rrd_create(argc, (char**) argv); +[ 3s] | ^ +[ 3s] prog/sensord/rrd.c: In function 'rrdUpdate': +[ 3s] prog/sensord/rrd.c:458:42: warning: cast discards 'const' qualifier from pointer target type [-Wcast-qual] +[ 3s] 458 | if ((ret = rrd_update(3, (char **) /* WEAK */ argv))) { +[ 3s] | ^ + +Signed-off-by: Michal Suchanek <msuchanek@suse.de> + +* tcl: Do not duplicate const strings + +--------- + +Signed-off-by: Michal Suchanek <msuchanek@suse.de> +Upstream-Status: Backport [https://github.com/oetiker/rrdtool-1.x/commit/b76e3c578f1e9f582e9c28f50d82b1f569602075] +--- + CHANGES | 3 ++ + bindings/lua/rrdlua.c | 25 +++++----- + bindings/perl-shared/RRDs.xs | 36 +++++++------- + bindings/python/rrdtoolmodule.c | 38 +++++++-------- + bindings/ruby/main.c | 10 ++-- + bindings/tcl/tclrrd.c | 84 ++++++++------------------------- + src/optparse.c | 14 +++--- + src/optparse.h | 6 +-- + src/rrd.h | 38 +++++++-------- + src/rrd_cgi.c | 24 +++++----- + src/rrd_create.c | 2 +- + src/rrd_daemon.c | 12 ++--- + src/rrd_dump.c | 4 +- + src/rrd_fetch.c | 2 +- + src/rrd_first.c | 2 +- + src/rrd_flushcached.c | 2 +- + src/rrd_graph.c | 6 +-- + src/rrd_graph.h | 4 +- + src/rrd_graph_helper.c | 2 +- + src/rrd_info.c | 2 +- + src/rrd_last.c | 2 +- + src/rrd_lastupdate.c | 2 +- + src/rrd_list.c | 6 +-- + src/rrd_modify.c | 2 +- + src/rrd_modify.h | 2 +- + src/rrd_resize.c | 4 +- + src/rrd_restore.c | 2 +- + src/rrd_tool.c | 26 +++++----- + src/rrd_tune.c | 2 +- + src/rrd_update.c | 4 +- + src/rrd_xport.c | 2 +- + src/rrdupdate.c | 7 +-- + 32 files changed, 168 insertions(+), 209 deletions(-) + +diff --git a/bindings/lua/rrdlua.c b/bindings/lua/rrdlua.c +index d1a700641..2095c3b5b 100644 +--- a/bindings/lua/rrdlua.c ++++ b/bindings/lua/rrdlua.c +@@ -37,8 +37,8 @@ + extern void rrd_freemem(void *mem); + + extern int luaopen_rrd (lua_State * L); +-typedef int (*RRD_FUNCTION)(int, char **); +-typedef rrd_info_t *(RRD_FUNCTION_V)(int, char **); ++typedef int (*RRD_FUNCTION)(int, const char **); ++typedef rrd_info_t *(RRD_FUNCTION_V)(int, const char **); + + /**********************************************************/ + +@@ -49,9 +49,9 @@ static void reset_rrd_state(void) + rrd_clear_error(); + } + +-static char **make_argv(const char *cmd, lua_State * L) ++static const char **make_argv(const char *cmd, lua_State * L) + { +- char **argv; ++ const char **argv; + int i; + int argc = lua_gettop(L) + 1; + +@@ -60,13 +60,12 @@ static char **make_argv(const char *cmd, lua_State * L) + luaL_error(L, "Can't allocate memory for arguments array", cmd); + + /* fprintf(stderr, "Args:\n"); */ +- argv[0] = (char *) cmd; /* Dummy arg. Cast to (char *) because rrd */ +- /* functions don't expect (const * char) */ ++ argv[0] = cmd; + /* fprintf(stderr, "%s\n", argv[0]); */ + for (i=1; i<argc; i++) { + /* accepts string or number */ + if (lua_isstring(L, i) || lua_isnumber(L, i)) { +- if (!(argv[i] = (char *) lua_tostring (L, i))) { ++ if (!(argv[i] = lua_tostring (L, i))) { + /* raise an error and never return */ + luaL_error(L, "%s - error duplicating string area for arg #%d", + cmd, i); +@@ -84,7 +83,7 @@ static char **make_argv(const char *cmd, lua_State * L) + static int + rrd_common_call (lua_State *L, const char *cmd, RRD_FUNCTION rrd_function) + { +- char **argv; ++ const char **argv; + int argc = lua_gettop(L) + 1; + + argv = make_argv(cmd, L); +@@ -99,7 +98,7 @@ rrd_common_call (lua_State *L, const char *cmd, RRD_FUNCTION rrd_function) + static int + lua_rrd_infocall(lua_State *L, const char *cmd, RRD_FUNCTION_V rrd_function) + { +- char **argv; ++ const char **argv; + rrd_info_t *p, *data; + int argc = lua_gettop(L) + 1; + +@@ -197,7 +196,7 @@ static int + lua_rrd_fetch (lua_State * L) + { + int argc = lua_gettop(L) + 1; +- char **argv = make_argv("fetch", L); ++ const char **argv = make_argv("fetch", L); + unsigned long i, j, step, ds_cnt; + rrd_value_t *data, *p; + char **names; +@@ -246,7 +245,7 @@ lua_rrd_first (lua_State * L) + { + time_t first; + int argc = lua_gettop(L) + 1; +- char **argv = make_argv("first", L); ++ const char **argv = make_argv("first", L); + reset_rrd_state(); + first = rrd_first(argc, argv); + free(argv); +@@ -260,7 +259,7 @@ lua_rrd_last (lua_State * L) + { + time_t last; + int argc = lua_gettop(L) + 1; +- char **argv = make_argv("last", L); ++ const char **argv = make_argv("last", L); + reset_rrd_state(); + last = rrd_last(argc, argv); + free(argv); +@@ -275,7 +274,7 @@ static int + lua_rrd_graph (lua_State * L) + { + int argc = lua_gettop(L) + 1; +- char **argv = make_argv("last", L); ++ const char **argv = make_argv("last", L); + char **calcpr; + int i, xsize, ysize; + double ymin, ymax; +diff --git a/bindings/perl-shared/RRDs.xs b/bindings/perl-shared/RRDs.xs +index e233b5835..edce76ec4 100644 +--- a/bindings/perl-shared/RRDs.xs ++++ b/bindings/perl-shared/RRDs.xs +@@ -44,11 +44,11 @@ extern "C" { + strcpy(argv[i+1],handle); \ + } \ + rrd_clear_error();\ +- RETVAL=name(items+1,argv); \ ++ RETVAL = name(items + 1, (const char **)argv); \ + for (i=0; i < items; i++) {\ +- free(argv[i+1]);\ ++ free((void *)argv[i+1]);\ + } \ +- free(argv);\ ++ free((void *)argv);\ + \ + if (rrd_test_error()) XSRETURN_UNDEF; + +@@ -67,11 +67,11 @@ extern "C" { + strcpy(argv[i+1],handle); \ + } \ + rrd_clear_error(); \ +- data=name(items+1, argv); \ ++ data = name(items + 1, (const char **)argv); \ + for (i=0; i < items; i++) { \ +- free(argv[i+1]); \ ++ free((void *)argv[i+1]); \ + } \ +- free(argv); \ ++ free((void *)argv); \ + if (rrd_test_error()) XSRETURN_UNDEF; \ + hash = newHV(); \ + save=data; \ +@@ -175,7 +175,7 @@ static int rrd_fetch_cb_wrapper( + /* Check the eval first */ + if (SvTRUE(ERRSV)) { + rrd_set_error("perl callback failed: %s",SvPV_nolen(ERRSV)); +- POPs; /* there is undef on top of the stack when there is an error ++ (void)POPs; /* there is undef on top of the stack when there is an error + and call_sv was initiated with G_EVAL|G_SCALER */ + goto error_out; + } +@@ -383,7 +383,7 @@ rrd_tune(...) + + #ifdef HAVE_RRD_GRAPH + +-SV * ++void + rrd_graph(...) + PROTOTYPE: @ + PREINIT: +@@ -404,7 +404,7 @@ rrd_graph(...) + strcpy(argv[i+1],handle); + } + rrd_clear_error(); +- rrd_graph(items+1,argv,&calcpr,&xsize,&ysize,NULL,&ymin,&ymax); ++ rrd_graph(items+1,(const char **)argv,&calcpr,&xsize,&ysize,NULL,&ymin,&ymax); + for (i=0; i < items; i++) { + free(argv[i+1]); + } +@@ -433,7 +433,7 @@ rrd_graph(...) + + #endif /* HAVE_RRD_GRAPH */ + +-SV * ++void + rrd_fetch(...) + PROTOTYPE: @ + PREINIT: +@@ -455,7 +455,7 @@ rrd_fetch(...) + strcpy(argv[i+1],handle); + } + rrd_clear_error(); +- rrd_fetch(items+1,argv,&start,&end,&step,&ds_cnt,&ds_namv,&data); ++ rrd_fetch(items+1,(const char **)argv,&start,&end,&step,&ds_cnt,&ds_namv,&data); + for (i=0; i < items; i++) { + free(argv[i+1]); + } +@@ -486,7 +486,7 @@ rrd_fetch(...) + PUSHs(sv_2mortal(newRV_noinc((SV*)names))); + PUSHs(sv_2mortal(newRV_noinc((SV*)retar))); + +-SV * ++void + rrd_fetch_cb_register(cb) + SV * cb + CODE: +@@ -496,7 +496,7 @@ rrd_fetch_cb_register(cb) + SvSetSV(rrd_fetch_cb_svptr,cb); + rrd_fetch_cb_register(rrd_fetch_cb_wrapper); + +-SV * ++void + rrd_times(start, end) + char *start + char *end +@@ -521,7 +521,7 @@ rrd_times(start, end) + PUSHs(sv_2mortal(newSVuv(start_tmp))); + PUSHs(sv_2mortal(newSVuv(end_tmp))); + +-int ++void + rrd_xport(...) + PROTOTYPE: @ + PREINIT: +@@ -543,7 +543,7 @@ rrd_xport(...) + strcpy(argv[i+1],handle); + } + rrd_clear_error(); +- rrd_xport(items+1,argv,&xsize,&start,&end,&step,&col_cnt,&legend_v,&data); ++ rrd_xport(items+1,(const char **)argv,&xsize,&start,&end,&step,&col_cnt,&legend_v,&data); + for (i=0; i < items; i++) { + free(argv[i+1]); + } +@@ -657,7 +657,7 @@ rrd_flushcached(...) + OUTPUT: + RETVAL + +-SV* ++void + rrd_list(...) + PROTOTYPE: @ + PREINIT: +@@ -667,7 +667,7 @@ rrd_list(...) + char **argv; + AV *list; + PPCODE: +- argv = (char **) malloc((items+1)*sizeof(char *)); ++ argv = malloc((items+1)*sizeof(char *)); + argv[0] = "dummy"; + + for (i = 0; i < items; i++) { +@@ -681,7 +681,7 @@ rrd_list(...) + + rrd_clear_error(); + +- data = rrd_list(items+1, argv); ++ data = rrd_list(items+1, (const char **)argv); + + for (i=0; i < items; i++) { + free(argv[i+1]); +diff --git a/bindings/python/rrdtoolmodule.c b/bindings/python/rrdtoolmodule.c +index 1ab463584..f255e65bc 100644 +--- a/bindings/python/rrdtoolmodule.c ++++ b/bindings/python/rrdtoolmodule.c +@@ -123,7 +123,7 @@ PyRRD_String_FromCF(enum cf_en cf) + * @return Zero if the function succeeds, otherwise -1 + */ + static int +-convert_args(char *command, PyObject *args, char ***rrdtool_argv, int *rrdtool_argc) ++convert_args(char *command, PyObject *args, const char ***rrdtool_argv, int *rrdtool_argc) + { + PyObject *o, *lo; + int i, j, args_count, argv_count, element_count; +@@ -145,7 +145,7 @@ convert_args(char *command, PyObject *args, char ***rrdtool_argv, int *rrdtool_a + } + } + +- *rrdtool_argv = PyMem_New(char *, element_count + 1); ++ *rrdtool_argv = PyMem_New(const char *, element_count + 1); + + if (*rrdtool_argv == NULL) + return -1; +@@ -186,7 +186,7 @@ convert_args(char *command, PyObject *args, char ***rrdtool_argv, int *rrdtool_a + * Destroy argument vector. + */ + static void +-destroy_args(char ***rrdtool_argv) ++destroy_args(const char ***rrdtool_argv) + { + PyMem_Del(*rrdtool_argv); + *rrdtool_argv = NULL; +@@ -267,7 +267,7 @@ static char _rrdtool_create__doc__[] = "Create a new Round Robin Database.\n\n\ + static PyObject * + _rrdtool_create(PyObject *Py_UNUSED(self), PyObject *args) + { +- char **rrdtool_argv = NULL; ++ const char **rrdtool_argv = NULL; + int rrdtool_argc = 0; + PyObject *ret; + int status; +@@ -306,7 +306,7 @@ static char _rrdtool_dump__doc__[] = "Dump an RRD to XML.\n\n\ + static PyObject * + _rrdtool_dump(PyObject *Py_UNUSED(self), PyObject *args) + { +- char **rrdtool_argv = NULL; ++ const char **rrdtool_argv = NULL; + int rrdtool_argc = 0; + PyObject *ret; + int status; +@@ -345,7 +345,7 @@ static char _rrdtool_update__doc__[] = "Store a new set of values into\ + static PyObject * + _rrdtool_update(PyObject *Py_UNUSED(self), PyObject *args) + { +- char **rrdtool_argv = NULL; ++ const char **rrdtool_argv = NULL; + int rrdtool_argc = 0; + PyObject *ret; + int status; +@@ -378,7 +378,7 @@ static char _rrdtool_updatev__doc__[] = "Store a new set of values into "\ + static PyObject * + _rrdtool_updatev(PyObject *Py_UNUSED(self), PyObject *args) + { +- char **rrdtool_argv = NULL; ++ const char **rrdtool_argv = NULL; + int rrdtool_argc = 0; + PyObject *ret; + rrd_info_t *data; +@@ -419,7 +419,7 @@ static char _rrdtool_fetch__doc__[] = "Fetch data from an RRD.\n\n\ + static PyObject * + _rrdtool_fetch(PyObject *Py_UNUSED(self), PyObject *args) + { +- char **rrdtool_argv = NULL; ++ const char **rrdtool_argv = NULL; + int rrdtool_argc = 0; + PyObject *ret, *range_tup, *dsnam_tup, *data_list, *t; + rrd_value_t *data, *datai, dv; +@@ -497,7 +497,7 @@ static char _rrdtool_flushcached__doc__[] = "Flush RRD files from memory.\n\n\ + static PyObject * + _rrdtool_flushcached(PyObject *Py_UNUSED(self), PyObject *args) + { +- char **rrdtool_argv = NULL; ++ const char **rrdtool_argv = NULL; + int rrdtool_argc = 0; + PyObject *ret; + int status; +@@ -592,7 +592,7 @@ static char _rrdtool_graph__doc__[] = "Create a graph based on one or more " \ + static PyObject * + _rrdtool_graph(PyObject *Py_UNUSED(self), PyObject *args) + { +- char **rrdtool_argv = NULL; ++ const char **rrdtool_argv = NULL; + int rrdtool_argc = 0; + PyObject *ret; + int xsize, ysize, i, status; +@@ -650,7 +650,7 @@ static char _rrdtool_graphv__doc__[] = "Create a graph based on one or more " \ + static PyObject * + _rrdtool_graphv(PyObject *Py_UNUSED(self), PyObject *args) + { +- char **rrdtool_argv = NULL; ++ const char **rrdtool_argv = NULL; + int rrdtool_argc = 0; + PyObject *ret; + rrd_info_t *data; +@@ -695,7 +695,7 @@ static char _rrdtool_xport__doc__[] = "Dictionary representation of data " \ + static PyObject * + _rrdtool_xport(PyObject *Py_UNUSED(self), PyObject *args) + { +- char **rrdtool_argv = NULL; ++ const char **rrdtool_argv = NULL; + int rrdtool_argc = 0; + PyObject *ret; + int xsize, status; +@@ -793,7 +793,7 @@ static char _rrdtool_list__doc__[] = "List RRDs in storage.\n\n" \ + static PyObject * + _rrdtool_list(PyObject *Py_UNUSED(self), PyObject *args) + { +- char **rrdtool_argv = NULL; ++ const char **rrdtool_argv = NULL; + int rrdtool_argc = 0; + PyObject *ret, *str; + char *data, *ptr, *end; +@@ -855,7 +855,7 @@ static char _rrdtool_tune__doc__[] = "Modify some basic properties of a " \ + static PyObject * + _rrdtool_tune(PyObject *Py_UNUSED(self), PyObject *args) + { +- char **rrdtool_argv = NULL; ++ const char **rrdtool_argv = NULL; + int rrdtool_argc = 0; + PyObject *ret; + int status; +@@ -893,7 +893,7 @@ static char _rrdtool_first__doc__[] = "Get the first UNIX timestamp of the "\ + static PyObject * + _rrdtool_first(PyObject *Py_UNUSED(self), PyObject *args) + { +- char **rrdtool_argv = NULL; ++ const char **rrdtool_argv = NULL; + int rrdtool_argc = 0; + PyObject *ret; + int ts; +@@ -928,7 +928,7 @@ static char _rrdtool_last__doc__[] = "Get the UNIX timestamp of the most "\ + static PyObject * + _rrdtool_last(PyObject *Py_UNUSED(self), PyObject *args) + { +- char **rrdtool_argv = NULL; ++ const char **rrdtool_argv = NULL; + int rrdtool_argc = 0; + PyObject *ret; + int ts; +@@ -965,7 +965,7 @@ static char _rrdtool_resize__doc__[] = "Modify the number of rows in a "\ + static PyObject * + _rrdtool_resize(PyObject *Py_UNUSED(self), PyObject *args) + { +- char **rrdtool_argv = NULL; ++ const char **rrdtool_argv = NULL; + int rrdtool_argc = 0; + PyObject *ret; + int status; +@@ -1003,7 +1003,7 @@ static char _rrdtool_info__doc__[] = "Extract header information from an "\ + static PyObject * + _rrdtool_info(PyObject *Py_UNUSED(self), PyObject *args) + { +- char **rrdtool_argv = NULL; ++ const char **rrdtool_argv = NULL; + int rrdtool_argc = 0; + PyObject *ret; + rrd_info_t *data; +@@ -1040,7 +1040,7 @@ static char _rrdtool_lastupdate__doc__[] = "Returns datetime and value stored "\ + static PyObject * + _rrdtool_lastupdate(PyObject *Py_UNUSED(self), PyObject *args) + { +- char **rrdtool_argv = NULL; ++ const char **rrdtool_argv = NULL; + int rrdtool_argc = 0; + PyObject *ret, *ds_dict, *lastupd; + int status; +diff --git a/bindings/ruby/main.c b/bindings/ruby/main.c +index e4cc6443d..a036b7fb8 100644 +--- a/bindings/ruby/main.c ++++ b/bindings/ruby/main.c +@@ -9,7 +9,7 @@ + + typedef struct string_arr_t { + int len; +- char **strings; ++ const char **strings; + } string_arr; + + VALUE mRRD; +@@ -18,12 +18,12 @@ VALUE rb_eRRDError; + typedef int ( + *RRDFUNC) ( + int argc, +- char **argv); ++ const char **argv); + + typedef rrd_info_t *( + *RRDINFOFUNC) ( + int argc, +- char **argv); ++ const char **argv); + + #define RRD_CHECK_ERROR \ + if (rrd_test_error()) \ +@@ -72,10 +72,10 @@ void string_arr_delete( + + /* skip dummy first entry */ + for (i = 1; i < a.len; i++) { +- free(a.strings[i]); ++ free((void *)a.strings[i]); + } + +- free(a.strings); ++ free((void *)a.strings); + } + + void reset_rrd_state( +diff --git a/bindings/tcl/tclrrd.c b/bindings/tcl/tclrrd.c +index 2927d9251..58a4cef68 100644 +--- a/bindings/tcl/tclrrd.c ++++ b/bindings/tcl/tclrrd.c +@@ -22,6 +22,7 @@ + #include <stdlib.h> + #include "../../src/rrd_tool.h" + #include "../../src/rrd_format.h" ++#include "../../src/unused.h" + + /* support pre-8.4 tcl */ + +@@ -41,47 +42,39 @@ extern int Tclrrd_SafeInit( + * Hence, we need to do some preparation before + * calling the rrd library functions. + */ +-static char **getopt_init( ++static const char **getopt_init( + int argc, + CONST84 char *argv[]) + { +- char **argv2; ++ const char **argv2; + int i; + + argv2 = calloc(argc, sizeof(char *)); + for (i = 0; i < argc; i++) { +- argv2[i] = strdup(argv[i]); ++ argv2[i] = argv[i]; + } + return argv2; + } + + static void getopt_cleanup( +- int argc, +- char **argv2) ++ int UNUSED(argc), ++ const char **argv2) + { +- int i; +- +- for (i = 0; i < argc; i++) { +- if (argv2[i] != NULL) { +- free(argv2[i]); +- } +- } +- free(argv2); ++ free((void *)argv2); + } + + static void getopt_free_element( +- char *argv2[], ++ const char *argv2[], + int argn) + { + if (argv2[argn] != NULL) { +- free(argv2[argn]); + argv2[argn] = NULL; + } + } + + static void getopt_squieeze( + int *argc, +- char *argv2[]) ++ const char *argv2[]) + { + int i, null_i = 0, argc_tmp = *argc; + +@@ -104,7 +97,7 @@ static int Rrd_Create( + CONST84 char *argv[]) + { + int argv_i; +- char **argv2; ++ const char **argv2; + char *parsetime_error = NULL; + time_t last_up = time(NULL) - 10; + long int long_tmp; +@@ -295,7 +288,7 @@ static int Rrd_Flushcached( + return TCL_ERROR; + } + +- rrd_flushcached(argc, (char**)argv); ++ rrd_flushcached(argc, argv); + + if (rrd_test_error()) { + Tcl_AppendResult(interp, "RRD Error: ", +@@ -380,7 +373,7 @@ static int Rrd_Update( + CONST84 char *argv[]) + { + int argv_i; +- char **argv2, *template = NULL; ++ const char **argv2, *template = NULL; + + argv2 = getopt_init(argc, argv); + +@@ -391,16 +384,10 @@ static int Rrd_Update( + Tcl_AppendResult(interp, "RRD Error: option '", + argv2[argv_i - 1], "' needs an argument", + (char *) NULL); +- if (template != NULL) { +- free(template); +- } + getopt_cleanup(argc, argv2); + return TCL_ERROR; + } +- if (template != NULL) { +- free(template); +- } +- template = strdup(argv2[argv_i]); ++ template = argv2[argv_i]; + getopt_free_element(argv2, argv_i - 1); + getopt_free_element(argv2, argv_i); + } else if (!strcmp(argv2[argv_i], "--")) { +@@ -409,9 +396,6 @@ static int Rrd_Update( + } else if (argv2[argv_i][0] == '-') { + Tcl_AppendResult(interp, "RRD Error: unknown option '", + argv2[argv_i], "'", (char *) NULL); +- if (template != NULL) { +- free(template); +- } + getopt_cleanup(argc, argv2); + return TCL_ERROR; + } +@@ -422,18 +406,12 @@ static int Rrd_Update( + if (argc < 2) { + Tcl_AppendResult(interp, "RRD Error: needs rrd filename", + (char *) NULL); +- if (template != NULL) { +- free(template); +- } + getopt_cleanup(argc, argv2); + return TCL_ERROR; + } + + rrd_update_r(argv2[1], template, argc - 2, (const char **)argv2 + 2); + +- if (template != NULL) { +- free(template); +- } + getopt_cleanup(argc, argv2); + + if (rrd_test_error()) { +@@ -454,7 +432,6 @@ static int Rrd_Info( + { + int status = TCL_OK; + rrd_info_t *data; +- char **argv2; + + /* TODO: support for rrdcached */ + if (argc != 2) { +@@ -463,9 +440,7 @@ static int Rrd_Info( + return TCL_ERROR; + } + +- argv2 = getopt_init(argc, argv); +- +- data = rrd_info_r(argv2[1]); ++ data = rrd_info_r(argv[1]); + + if (data) { + Tcl_SetObjResult(interp, convert_info(data)); +@@ -477,7 +452,6 @@ static int Rrd_Info( + status = TCL_ERROR; + } + +- getopt_cleanup(argc, argv2); + return status; + } + +@@ -488,7 +462,6 @@ static int Rrd_Lastupdate( + CONST84 char *argv[]) + { + time_t last_update; +- char **argv2; + char **ds_namv; + char **last_ds; + char s[30]; +@@ -502,8 +475,7 @@ static int Rrd_Lastupdate( + return TCL_ERROR; + } + +- argv2 = getopt_init(argc, argv); +- if (rrd_lastupdate_r(argv2[1], &last_update, ++ if (rrd_lastupdate_r(argv[1], &last_update, + &ds_cnt, &ds_namv, &last_ds) == 0) { + listPtr = Tcl_GetObjResult(interp); + for (i = 0; i < ds_cnt; i++) { +@@ -527,7 +499,6 @@ static int Rrd_Lastupdate( + free(ds_namv); + } + } +- getopt_cleanup(argc, argv2); + return TCL_OK; + } + +@@ -543,10 +514,8 @@ static int Rrd_Fetch( + char **ds_namv; + Tcl_Obj *listPtr; + char s[30]; +- char **argv2; + +- argv2 = getopt_init(argc, argv); +- if (rrd_fetch(argc, argv2, &start, &end, &step, ++ if (rrd_fetch(argc, argv, &start, &end, &step, + &ds_cnt, &ds_namv, &data) != -1) { + datai = data; + listPtr = Tcl_GetObjResult(interp); +@@ -562,7 +531,6 @@ static int Rrd_Fetch( + free(ds_namv); + free(data); + } +- getopt_cleanup(argc, argv2); + + if (rrd_test_error()) { + Tcl_AppendResult(interp, "RRD Error: ", +@@ -590,7 +558,7 @@ static int Rrd_Graph( + int rc, xsize, ysize; + double ymin, ymax; + char dimensions[50]; +- char **argv2; ++ const char **argv2; + CONST84 char *save; + + /* +@@ -692,11 +660,7 @@ static int Rrd_Tune( + int argc, + CONST84 char *argv[]) + { +- char **argv2; +- +- argv2 = getopt_init(argc, argv); +- rrd_tune(argc, argv2); +- getopt_cleanup(argc, argv2); ++ rrd_tune(argc, argv); + + if (rrd_test_error()) { + Tcl_AppendResult(interp, "RRD Error: ", +@@ -716,11 +680,7 @@ static int Rrd_Resize( + int argc, + CONST84 char *argv[]) + { +- char **argv2; +- +- argv2 = getopt_init(argc, argv); +- rrd_resize(argc, argv2); +- getopt_cleanup(argc, argv2); ++ rrd_resize(argc, argv); + + if (rrd_test_error()) { + Tcl_AppendResult(interp, "RRD Error: ", +@@ -740,11 +700,7 @@ static int Rrd_Restore( + int argc, + CONST84 char *argv[]) + { +- char **argv2; +- +- argv2 = getopt_init(argc, argv); +- rrd_restore(argc, argv2); +- getopt_cleanup(argc, argv2); ++ rrd_restore(argc, argv); + + if (rrd_test_error()) { + Tcl_AppendResult(interp, "RRD Error: ", +diff --git a/src/optparse.c b/src/optparse.c +index 9040ba8b2..79a3efe11 100644 +--- a/src/optparse.c ++++ b/src/optparse.c +@@ -10,7 +10,7 @@ + #define options_argv(i) \ + ((i) < options->argc ? options->argv[i] : NULL) + +-void optparse_init(struct optparse *options, int argc, char **argv) ++void optparse_init(struct optparse *options, int argc, const char **argv) + { + options->argv = argv; + options->argc = argc; +@@ -42,7 +42,7 @@ is_longopt(const char *arg) + static void + permute(struct optparse *options, int index) + { +- char *nonoption = options->argv[index]; ++ const char *nonoption = options->argv[index]; + for (int i = index; i < options->optind - 1; i++) + options->argv[i] = options->argv[i + 1]; + options->argv[options->optind - 1] = nonoption; +@@ -67,7 +67,7 @@ int optparse(struct optparse *options, const char *optstring) + options->errmsg[0] = '\0'; + options->optopt = 0; + options->optarg = NULL; +- char *option = options_argv(options->optind); ++ const char *option = options_argv(options->optind); + if (option == NULL) { + return -1; + } else if (is_dashdash(option)) { +@@ -88,7 +88,7 @@ int optparse(struct optparse *options, const char *optstring) + option += options->subopt + 1; + options->optopt = option[0]; + int type = argtype(optstring, option[0]); +- char *next = options_argv(options->optind + 1); ++ const char *next = options_argv(options->optind + 1); + switch (type) { + case -1: + opterror(options, "invalid option -- '%c'", option[0]); +@@ -128,10 +128,10 @@ int optparse(struct optparse *options, const char *optstring) + return 0; + } + +-char *optparse_arg(struct optparse *options) ++const char *optparse_arg(struct optparse *options) + { + options->subopt = 0; +- char *option = options->argv[options->optind]; ++ const char *option = options->argv[options->optind]; + if (option != NULL) + options->optind++; + return option; +@@ -222,7 +222,7 @@ optparse_long(struct optparse *options, + int *longindex) + { + // printf("%i < %i\n",options->optind,options->argc); +- char *option = options_argv(options->optind); ++ const char *option = options_argv(options->optind); + if (option == NULL) { + return -1; + } else if (is_dashdash(option)) { +diff --git a/src/optparse.h b/src/optparse.h +index c4b0ec19c..7a0bb3885 100644 +--- a/src/optparse.h ++++ b/src/optparse.h +@@ -44,7 +44,7 @@ + */ + + struct optparse { +- char **argv; ++ const char **argv; + int argc; + int permute; + int optind; +@@ -65,7 +65,7 @@ struct optparse_long { + /** + * Initializes the parser state. + */ +-void optparse_init(struct optparse *options, int argc, char **argv); ++void optparse_init(struct optparse *options, int argc, const char **argv); + + /** + * Read the next option in the argv array. +@@ -98,6 +98,6 @@ optparse_long(struct optparse *options, + * subcommand returned by optparse_arg(). This function allows you to + * ignore the value of optind. + */ +-char *optparse_arg(struct optparse *options); ++const char *optparse_arg(struct optparse *options); + + #endif +diff --git a/src/rrd.h b/src/rrd.h +index 184887ccc..b40f9a449 100644 +--- a/src/rrd.h ++++ b/src/rrd.h +@@ -155,10 +155,10 @@ extern "C" { + /* main function blocks */ + int rrd_create( + int, +- char **); ++ const char **); + rrd_info_t *rrd_info( + int, +- char **); ++ const char **); + rrd_info_t *rrd_info_push( + rrd_info_t *, + char *, +@@ -170,19 +170,19 @@ extern "C" { + rrd_info_t *); + char *rrd_list( + int, +- char **); ++ const char **); + char *rrd_list_r( + int, +- char *dirname); ++ const char *dirname); + int rrd_update( + int, +- char **); ++ const char **); + rrd_info_t *rrd_update_v( + int, +- char **); ++ const char **); + int rrd_graph( + int, +- char **, ++ const char **, + char ***, + int *, + int *, +@@ -191,11 +191,11 @@ extern "C" { + double *); + rrd_info_t *rrd_graph_v( + int, +- char **); ++ const char **); + + int rrd_fetch( + int, +- char **, ++ const char **, + time_t *, + time_t *, + unsigned long *, +@@ -204,32 +204,32 @@ extern "C" { + rrd_value_t **); + int rrd_restore( + int, +- char **); ++ const char **); + int rrd_dump( + int, +- char **); ++ const char **); + int rrd_tune( + int, +- char **); ++ const char **); + time_t rrd_last( + int, +- char **); ++ const char **); + int rrd_lastupdate( + int argc, +- char **argv); ++ const char **argv); + time_t rrd_first( + int, +- char **); ++ const char **); + int rrd_resize( + int, +- char **); ++ const char **); + char *rrd_strversion( + void); + double rrd_version( + void); + int rrd_xport( + int, +- char **, ++ const char **, + int *, + time_t *, + time_t *, +@@ -239,7 +239,7 @@ extern "C" { + rrd_value_t **); + int rrd_flushcached( + int argc, +- char **argv); ++ const char **argv); + + void rrd_freemem( + void *mem); +@@ -323,7 +323,7 @@ extern "C" { + const char **argv); + int rrd_dump_opt_r( + const char *filename, +- char *outname, ++ const char *outname, + int opt_noheader); + int rrd_dump_r( + const char *filename, +diff --git a/src/rrd_cgi.c b/src/rrd_cgi.c +index b82c310db..14a4f511a 100644 +--- a/src/rrd_cgi.c ++++ b/src/rrd_cgi.c +@@ -102,7 +102,7 @@ static char *rrdstrip( + static char *scanargs( + char *line, + int *argc, +- char ***args); ++ const char ***args); + + /* format at-time specified times using strftime */ + static char *printstrftime( +@@ -317,7 +317,7 @@ static const char *putvar( + } + + /* expand those RRD:* directives that can be used recursively */ +-static char *rrd_expand_vars( ++static const char *rrd_expand_vars( + char *buffer) + { + int i; +@@ -434,7 +434,7 @@ static int readfile( + + int main( + int argc, +- char *argv[]) ++ const char *argv[]) + { + char *buffer; + long i; +@@ -926,7 +926,7 @@ static char *drawgraph( + } + calfree(); + if (rrd_graph +- (argc + 1, (char **) args - 1, &calcpr, &xsize, &ysize, NULL, &ymin, ++ (argc + 1, args - 1, &calcpr, &xsize, &ysize, NULL, &ymin, + &ymax) != -1) { + return stralloc(calcpr[0]); + } else { +@@ -973,7 +973,7 @@ static char *printtimelast( + /* not raising argc in step with args - 1 since the last argument + will be used below for strftime */ + +- last = rrd_last(argc, (char **) args - 1); ++ last = rrd_last(argc, args - 1); + if (rrd_test_error()) { + char err[4096]; + +@@ -1027,7 +1027,7 @@ static char *printtimenow( + static char *scanargs( + char *line, + int *argument_count, +- char ***arguments) ++ const char ***arguments) + { + char *getP; /* read cursor */ + char *putP; /* write cursor */ +@@ -1039,8 +1039,8 @@ static char *scanargs( + + /* local array of arguments while parsing */ + int argc = 1; +- char **argv; +- char **argv_tmp; /* temp variable for realloc() */ ++ const char **argv; ++ const char **argv_tmp; /* temp variable for realloc() */ + + #ifdef DEBUG_PARSER + printf("<-- scanargs(%s) -->\n", line); +@@ -1051,7 +1051,7 @@ static char *scanargs( + + /* create initial argument array of char pointers */ + argsz = 32; +- argv = (char **) malloc(argsz * sizeof(char *)); ++ argv = malloc(argsz * sizeof(char *)); + if (!argv) { + return NULL; + } +@@ -1146,7 +1146,7 @@ static char *scanargs( + if (argc == argsz - 2) { + /* resize argument array */ + argsz *= 2; +- argv_tmp = (char **) rrd_realloc(argv, argsz * sizeof(char *)); ++ argv_tmp = rrd_realloc(argv, argsz * sizeof(char *)); + if (*argv_tmp == NULL) { + return NULL; + } +@@ -1213,7 +1213,7 @@ static int parse( + /* the name of the vairable ... */ + char *val; + long valln; +- char **args; ++ const char **args; + char *end; + long end_offset; + int argc; +@@ -1264,7 +1264,7 @@ static int parse( + /* make sure we do not shrink the mallocd block */ + size_t newbufsize = i + strlen(end) + valln + 1; + +- *buf = (char *) rrd_realloc(*buf, newbufsize); ++ *buf = rrd_realloc(*buf, newbufsize); + + if (*buf == NULL) { + perror("Realoc buf:"); +diff --git a/src/rrd_create.c b/src/rrd_create.c +index f9bad0866..919b4195a 100644 +--- a/src/rrd_create.c ++++ b/src/rrd_create.c +@@ -76,7 +76,7 @@ static void parseGENERIC_DS( + + int rrd_create( + int argc, +- char **argv) ++ const char **argv) + { + struct optparse_long longopts[] = { + {"start", 'b', OPTPARSE_REQUIRED}, +diff --git a/src/rrd_daemon.c b/src/rrd_daemon.c +index 751798aa1..21c38a11d 100644 +--- a/src/rrd_daemon.c ++++ b/src/rrd_daemon.c +@@ -1877,7 +1877,7 @@ static int handle_request_tune( + HANDLER_PROTO) + { /* {{{ */ + int status; +- char** argv = NULL; ++ const char** argv = NULL; + int argc, argc_tmp; + char* i; + int rc; +@@ -1916,7 +1916,7 @@ static int handle_request_tune( + goto done; + } + +- if ((argv = (char **) malloc(argc * sizeof(char*))) == NULL) { ++ if ((argv = malloc(argc * sizeof(char*))) == NULL) { + rc = send_response(sock, RESP_ERR, "%s\n", rrd_strerror(ENOMEM)); + goto done; + } +@@ -1927,7 +1927,7 @@ static int handle_request_tune( + argc_tmp += 1; + } + +- status = rrd_tune_r(file, argc, (const char **)argv); ++ status = rrd_tune_r(file, argc, argv); + if (status != 0) { + rc = send_response(sock, RESP_ERR, "Got error %s\n", rrd_get_error()); + goto done; +@@ -1935,7 +1935,7 @@ static int handle_request_tune( + rc = send_response(sock, RESP_OK, "Success\n"); + done: + free(file); +- free(argv); ++ free((void *)argv); + return rc; + } + +@@ -4505,7 +4505,7 @@ static int cleanup( + + static int read_options( + int argc, +- char **argv) ++ const char **argv) + { /* {{{ */ + struct optparse_long longopts[] = { + {NULL, 'a', OPTPARSE_REQUIRED}, +@@ -5050,7 +5050,7 @@ static int read_options( + + int main( + int argc, +- char **argv) ++ const char **argv) + { + int status; + +diff --git a/src/rrd_dump.c b/src/rrd_dump.c +index a4490d594..c58e0ee4a 100644 +--- a/src/rrd_dump.c ++++ b/src/rrd_dump.c +@@ -497,7 +497,7 @@ static size_t rrd_dump_opt_cb_fileout( + + int rrd_dump_opt_r( + const char *filename, +- char *outname, ++ const char *outname, + int opt_noheader) + { + FILE *out_file; +@@ -543,7 +543,7 @@ int rrd_dump_r( + + int rrd_dump( + int argc, +- char **argv) ++ const char **argv) + { + int opt; + struct optparse_long longopts[] = { +diff --git a/src/rrd_fetch.c b/src/rrd_fetch.c +index c739bfc45..54780f19b 100644 +--- a/src/rrd_fetch.c ++++ b/src/rrd_fetch.c +@@ -61,7 +61,7 @@ + + int rrd_fetch( + int argc, +- char **argv, ++ const char **argv, + time_t *start, + time_t *end, /* which time frame do you want ? + * will be changed to represent reality */ +diff --git a/src/rrd_first.c b/src/rrd_first.c +index a696c5c38..f3dde5404 100644 +--- a/src/rrd_first.c ++++ b/src/rrd_first.c +@@ -13,7 +13,7 @@ + + time_t rrd_first( + int argc, +- char **argv) ++ const char **argv) + { + struct optparse_long longopts[] = { + {"rraindex", 129, OPTPARSE_REQUIRED}, +diff --git a/src/rrd_flushcached.c b/src/rrd_flushcached.c +index 090bca749..3bf6cd29d 100644 +--- a/src/rrd_flushcached.c ++++ b/src/rrd_flushcached.c +@@ -22,7 +22,7 @@ + #include "rrd_tool.h" + #include "rrd_client.h" + +-int rrd_flushcached (int argc, char **argv) ++int rrd_flushcached (int argc, const char **argv) + { + struct optparse_long longopts[] = { + {"daemon", 'd', OPTPARSE_REQUIRED}, +diff --git a/src/rrd_graph.c b/src/rrd_graph.c +index b32d45085..46511e9a3 100644 +--- a/src/rrd_graph.c ++++ b/src/rrd_graph.c +@@ -4607,7 +4607,7 @@ int scan_for_col( + /* Now just a wrapper around rrd_graph_v */ + int rrd_graph( + int argc, +- char **argv, ++ const char **argv, + char ***prdata, + int *xsize, + int *ysize, +@@ -4690,7 +4690,7 @@ int rrd_graph( + + rrd_info_t *rrd_graph_v( + int argc, +- char **argv) ++ const char **argv) + { + image_desc_t im; + rrd_info_t *grinfo; +@@ -4953,7 +4953,7 @@ void rrd_graph_init( + + void rrd_graph_options( + int argc, +- char *argv[], ++ const char **argv, + struct optparse *poptions, + image_desc_t *im) + { +diff --git a/src/rrd_graph.h b/src/rrd_graph.h +index 4df32ec66..083cf3800 100644 +--- a/src/rrd_graph.h ++++ b/src/rrd_graph.h +@@ -473,12 +473,12 @@ void time_clean( + + void rrd_graph_options( + int, +- char **, ++ const char **, + struct optparse *, + image_desc_t *); + void rrd_graph_script( + int, +- char **, ++ const char **, + image_desc_t *const, + int); + int rrd_graph_color( +diff --git a/src/rrd_graph_helper.c b/src/rrd_graph_helper.c +index 99cdefa65..ba90e1a6c 100644 +--- a/src/rrd_graph_helper.c ++++ b/src/rrd_graph_helper.c +@@ -1952,7 +1952,7 @@ static int parse_xport( + + void rrd_graph_script( + int argc, +- char *argv[], ++ const char **argv, + image_desc_t *const im, + int optno) + { +diff --git a/src/rrd_info.c b/src/rrd_info.c +index c0c6f68c7..eb0d4e4de 100644 +--- a/src/rrd_info.c ++++ b/src/rrd_info.c +@@ -82,7 +82,7 @@ rrd_info_t + + rrd_info_t *rrd_info( + int argc, +- char **argv) ++ const char **argv) + { + struct optparse_long longopts[] = { + {"daemon", 'd', OPTPARSE_REQUIRED}, +diff --git a/src/rrd_last.c b/src/rrd_last.c +index 026a1e828..1aae72512 100644 +--- a/src/rrd_last.c ++++ b/src/rrd_last.c +@@ -11,7 +11,7 @@ + + time_t rrd_last( + int argc, +- char **argv) ++ const char **argv) + { + char *opt_daemon = NULL; + time_t lastupdate; +diff --git a/src/rrd_lastupdate.c b/src/rrd_lastupdate.c +index ab30dcf67..4f7f4770e 100644 +--- a/src/rrd_lastupdate.c ++++ b/src/rrd_lastupdate.c +@@ -14,7 +14,7 @@ + #include "rrd_client.h" + #include <stdarg.h> + +-int rrd_lastupdate (int argc, char **argv) ++int rrd_lastupdate (int argc, const char **argv) + { + struct optparse_long longopts[] = { + {"daemon", 'd', OPTPARSE_REQUIRED}, +diff --git a/src/rrd_list.c b/src/rrd_list.c +index e743b9b7d..6e96220ea 100644 +--- a/src/rrd_list.c ++++ b/src/rrd_list.c +@@ -37,7 +37,7 @@ static char *move_past_prefix(const char *prefix, const char *string) + return (char *)&(string[index]); + } + +-static char *rrd_list_rec(int recursive, char *root, char *dirname) ++static char *rrd_list_rec(int recursive, const char *root, const char *dirname) + { + #define SANE_ASPRINTF2(_dest_str, _format, ...) \ + if (asprintf(&_dest_str, _format, __VA_ARGS__) == -1) { \ +@@ -138,7 +138,7 @@ static char *rrd_list_rec(int recursive, char *root, char *dirname) + return out; + } + +-char *rrd_list_r(int recursive, char *dirname) ++char *rrd_list_r(int recursive, const char *dirname) + { + #define SANE_ASPRINTF(_dest_str, _format, ...) \ + if (asprintf(&_dest_str, _format, __VA_ARGS__) == -1) { \ +@@ -240,7 +240,7 @@ char *rrd_list_r(int recursive, char *dirname) + return rrd_list_rec(recursive, dirname, dirname); + } + +-char *rrd_list(int argc, char **argv) ++char *rrd_list(int argc, const char **argv) + { + char *opt_daemon = NULL; + int status; +diff --git a/src/rrd_modify.c b/src/rrd_modify.c +index a2b07f640..70ac9e77f 100644 +--- a/src/rrd_modify.c ++++ b/src/rrd_modify.c +@@ -1297,7 +1297,7 @@ static int add_rras(const rrd_t *in, rrd_t *out, const int *ds_map, + } + + int handle_modify(const rrd_t *in, const char *outfilename, +- int argc, char **argv, int optidx, ++ int argc, const char **argv, int optidx, + int newstep) { + // parse add/remove options + int rc = -1; +diff --git a/src/rrd_modify.h b/src/rrd_modify.h +index 52d8789be..64a39926e 100644 +--- a/src/rrd_modify.h ++++ b/src/rrd_modify.h +@@ -28,7 +28,7 @@ typedef struct { + } rra_mod_op_t; + + int handle_modify(const rrd_t *in, const char *outfilename, +- int argc, char **argv, int optind, ++ int argc, const char **argv, int optind, + int newstep); + + typedef union { +diff --git a/src/rrd_resize.c b/src/rrd_resize.c +index fb75d81ff..742e6d141 100644 +--- a/src/rrd_resize.c ++++ b/src/rrd_resize.c +@@ -12,9 +12,9 @@ + + int rrd_resize( + int argc, +- char **argv) ++ const char **argv) + { +- char *infilename, outfilename[11] = "resize.rrd"; ++ const char *infilename, outfilename[11] = "resize.rrd"; + rrd_t rrdold, rrdnew; + rrd_value_t buffer; + int version; +diff --git a/src/rrd_restore.c b/src/rrd_restore.c +index 85d481e0c..ebef5efe8 100644 +--- a/src/rrd_restore.c ++++ b/src/rrd_restore.c +@@ -1378,7 +1378,7 @@ int write_file( + + int rrd_restore( + int argc, +- char **argv) ++ const char **argv) + { + struct optparse_long longopts[] = { + {"range-check", 'r', OPTPARSE_NONE}, +diff --git a/src/rrd_tool.c b/src/rrd_tool.c +index cc6119d9a..56321ee1a 100644 +--- a/src/rrd_tool.c ++++ b/src/rrd_tool.c +@@ -22,16 +22,16 @@ + + + static void PrintUsage( +- char *cmd); ++ const char *cmd); + static int CountArgs( + char *aLine); + static int CreateArgs( ++ const char *, + char *, +- char *, +- char **); ++ const char **); + static int HandleInputLine( + int, +- char **, ++ const char **, + FILE *); + int RemoteMode = 0; + int ChangeRoot = 0; +@@ -42,7 +42,7 @@ int ChangeRoot = 0; + + + static void PrintUsage( +- char *cmd) ++ const char *cmd) + { + + const char *help_main = +@@ -443,11 +443,11 @@ static char *fgetslong( + + int main( + int argc, +- char *argv[]) ++ const char *argv[]) + { +- char **myargv; ++ const char **myargv; + char *aLine; +- char *firstdir = ""; ++ const char *firstdir = ""; + + #ifdef MUST_DISABLE_SIGFPE + signal(SIGFPE, SIG_IGN); +@@ -526,7 +526,7 @@ int main( + printf("ERROR: not enough arguments\n"); + continue; + } +- if ((myargv = (char **) malloc((argc + 1) * ++ if ((myargv = malloc((argc + 1) * + sizeof(char *))) == NULL) { + perror("malloc"); + exit(1); +@@ -572,7 +572,7 @@ int main( + resolving them portably is not really simple. */ + static int HandleInputLine( + int argc, +- char **argv, ++ const char **argv, + FILE * out) + { + #if defined(HAVE_OPENDIR) && defined (HAVE_READDIR) +@@ -887,12 +887,12 @@ static int CountArgs( + * CreateArgs - take a string (aLine) and tokenize + */ + static int CreateArgs( +- char *pName, ++ const char *pName, + char *aLine, +- char **argv) ++ const char **argv) + { + char *getP, *putP; +- char **pargv = argv; ++ const char **pargv = argv; + char Quote = 0; + int inArg = 0; + int len; +diff --git a/src/rrd_tune.c b/src/rrd_tune.c +index 198817f37..dd3f3f7cb 100644 +--- a/src/rrd_tune.c ++++ b/src/rrd_tune.c +@@ -71,7 +71,7 @@ static int set_hwsmootharg( + + int rrd_tune( + int argc, +- char **argv) ++ const char **argv) + { + char *opt_daemon = NULL; + const char *in_filename = NULL; +diff --git a/src/rrd_update.c b/src/rrd_update.c +index fbbe2820a..bb9a0602c 100644 +--- a/src/rrd_update.c ++++ b/src/rrd_update.c +@@ -299,7 +299,7 @@ static void initialize_time( + + rrd_info_t *rrd_update_v( + int argc, +- char **argv) ++ const char **argv) + { + struct optparse_long longopts[] = { + {"template", 't', OPTPARSE_REQUIRED}, +@@ -674,7 +674,7 @@ static int rrd_template_update(const char *filename, /* {{{ */ + + int rrd_update( + int argc, +- char **argv) ++ const char **argv) + { + struct optparse_long longopts[] = { + {"template", 't', OPTPARSE_REQUIRED}, +diff --git a/src/rrd_xport.c b/src/rrd_xport.c +index d15d33dd9..93c02f926 100644 +--- a/src/rrd_xport.c ++++ b/src/rrd_xport.c +@@ -73,7 +73,7 @@ static int rrd_xport_format_addprints( + + int rrd_xport( + int argc, +- char **argv, ++ const char **argv, + int UNUSED(*xsize), + time_t *start, + time_t *end, /* which time frame do you want ? +diff --git a/src/rrdupdate.c b/src/rrdupdate.c +index cbbf48cc1..e368516c8 100644 +--- a/src/rrdupdate.c ++++ b/src/rrdupdate.c +@@ -20,19 +20,20 @@ int main( + int argc, + char **argv) + { ++ const char **cargv = (const char **)argv; + char *name=basename(argv[0]); + rrd_info_t *info; + + if (!strcmp(name, "rrdcreate")) { +- rrd_create(argc, argv); ++ rrd_create(argc, cargv); + } + else if (!strcmp(name, "rrdinfo")) { +- info=rrd_info(argc, argv); ++ info=rrd_info(argc, cargv); + rrd_info_print(info); + rrd_info_free(info); + } + else { +- rrd_update(argc, argv); ++ rrd_update(argc, cargv); + } + + if (rrd_test_error()) { diff --git a/meta-oe/recipes-extended/rrdtool/rrdtool_1.8.0.bb b/meta-oe/recipes-extended/rrdtool/rrdtool_1.8.0.bb index cbe1af2854f2..425a98f0c09b 100644 --- a/meta-oe/recipes-extended/rrdtool/rrdtool_1.8.0.bb +++ b/meta-oe/recipes-extended/rrdtool/rrdtool_1.8.0.bb @@ -11,6 +11,7 @@ PV = "1.8.0" SRC_URI = "\ git://github.com/oetiker/rrdtool-1.x.git;protocol=https;branch=master \ + file://b76e3c578f1e9f582e9c28f50d82b1f569602075.patch \ " S = "${WORKDIR}/git"
Import patch from the rrdtool's git to fix building with GCC 14. Note, it also requires fixing other tools (like lmsensors) in a similar way. Signed-off-by: Dmitry Baryshkov <dmitry.baryshkov@linaro.org> --- ...3c578f1e9f582e9c28f50d82b1f569602075.patch | 1583 +++++++++++++++++ .../recipes-extended/rrdtool/rrdtool_1.8.0.bb | 1 + 2 files changed, 1584 insertions(+) create mode 100644 meta-oe/recipes-extended/rrdtool/rrdtool/b76e3c578f1e9f582e9c28f50d82b1f569602075.patch