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 <[email protected]>
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 <[email protected]>
> ---
>  ...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?= <[email protected]>
> +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 <[email protected]>
> +
> +* 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 <[email protected]>
> +
> +* tcl: Do not duplicate const strings
> +
> +---------
> +
> +Signed-off-by: Michal Suchanek <[email protected]>
> +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 (#110689): 
https://lists.openembedded.org/g/openembedded-devel/message/110689
Mute This Topic: https://lists.openembedded.org/mt/106473144/21656
Group Owner: [email protected]
Unsubscribe: https://lists.openembedded.org/g/openembedded-devel/unsub 
[[email protected]]
-=-=-=-=-=-=-=-=-=-=-=-

Reply via email to