This patch makes the parameters of rrd_lastupdate_r optimal. It looks worse than it is. I just added a few != NULL ifs.
I'll make use of this in an upcoming patch.
Index: src/rrd_lastupdate.c =================================================================== --- src/rrd_lastupdate.c (revision 2062) +++ src/rrd_lastupdate.c (working copy) @@ -106,59 +106,81 @@ return (-1); } - *ret_last_update = rrd.live_head->last_up; - *ret_ds_count = rrd.stat_head->ds_cnt; - *ret_ds_names = (char **) malloc (rrd.stat_head->ds_cnt * sizeof(char *)); - if (*ret_ds_names == NULL) { - rrd_set_error ("malloc fetch ret_ds_names array"); - rrd_close (rrd_file); - rrd_free (&rrd); - return (-1); + if(ret_last_update != NULL) + { + *ret_last_update = rrd.live_head->last_up; } - memset (*ret_ds_names, 0, rrd.stat_head->ds_cnt * sizeof(char *)); - *ret_last_ds = (char **) malloc (rrd.stat_head->ds_cnt * sizeof(char *)); - if (*ret_last_ds == NULL) { - rrd_set_error ("malloc fetch ret_last_ds array"); - free (*ret_ds_names); - *ret_ds_names = NULL; - rrd_close (rrd_file); - rrd_free (&rrd); - return (-1); - } - memset (*ret_last_ds, 0, rrd.stat_head->ds_cnt * sizeof(char *)); + if(ret_ds_count != NULL) + { + *ret_ds_count = rrd.stat_head->ds_cnt; - for (i = 0; i < rrd.stat_head->ds_cnt; i++) { - (*ret_ds_names)[i] = sprintf_alloc("%s", rrd.ds_def[i].ds_nam); - (*ret_last_ds)[i] = sprintf_alloc("%s", rrd.pdp_prep[i].last_ds); + if(ret_ds_names != NULL) + { + *ret_ds_names = (char **) malloc (rrd.stat_head->ds_cnt * sizeof(char *)); + if (*ret_ds_names == NULL) { + rrd_set_error ("malloc fetch ret_ds_names array"); + rrd_close (rrd_file); + rrd_free (&rrd); + return (-1); + } + memset (*ret_ds_names, 0, rrd.stat_head->ds_cnt * sizeof(char *)); + } - if (((*ret_ds_names)[i] == NULL) || ((*ret_last_ds)[i] == NULL)) - break; - } + if(ret_last_ds != NULL) + { + *ret_last_ds = (char **) malloc (rrd.stat_head->ds_cnt * sizeof(char *)); + if (*ret_last_ds == NULL) { + rrd_set_error ("malloc fetch ret_last_ds array"); + free (*ret_ds_names); + *ret_ds_names = NULL; + rrd_close (rrd_file); + rrd_free (&rrd); + return (-1); + } + memset (*ret_last_ds, 0, rrd.stat_head->ds_cnt * sizeof(char *)); + } - /* Check if all names and values could be copied and free everything if - * not. */ - if (i < rrd.stat_head->ds_cnt) { - rrd_set_error ("sprintf_alloc failed"); - for (i = 0; i < rrd.stat_head->ds_cnt; i++) { - if ((*ret_ds_names)[i] != NULL) - { - free ((*ret_ds_names)[i]); - (*ret_ds_names)[i] = NULL; - } - if ((*ret_last_ds)[i] != NULL) - { - free ((*ret_last_ds)[i]); - (*ret_last_ds)[i] = NULL; - } - } - free (*ret_ds_names); - *ret_ds_names = NULL; - free (*ret_last_ds); - *ret_last_ds = NULL; - rrd_close (rrd_file); - rrd_free (&rrd); - return (-1); + for (i = 0; i < rrd.stat_head->ds_cnt; i++) { + if(ret_ds_names != NULL) + (*ret_ds_names)[i] = sprintf_alloc("%s", rrd.ds_def[i].ds_nam); + if(ret_last_ds != NULL) + (*ret_last_ds)[i] = sprintf_alloc("%s", rrd.pdp_prep[i].last_ds); + + if ((ret_ds_names != NULL && (*ret_ds_names)[i] == NULL) || (ret_last_ds != NULL && (*ret_last_ds)[i] == NULL)) + break; + } + + /* Check if all names and values could be copied and free everything if + * not. */ + if (i < rrd.stat_head->ds_cnt) { + rrd_set_error ("sprintf_alloc failed"); + for (i = 0; i < rrd.stat_head->ds_cnt; i++) { + if (ret_ds_names != NULL && (*ret_ds_names)[i] != NULL) + { + free ((*ret_ds_names)[i]); + (*ret_ds_names)[i] = NULL; + } + if (ret_last_ds != NULL && (*ret_last_ds)[i] != NULL) + { + free ((*ret_last_ds)[i]); + (*ret_last_ds)[i] = NULL; + } + } + if(ret_ds_names != NULL) + { + free (*ret_ds_names); + *ret_ds_names = NULL; + } + if(ret_last_ds != NULL) + { + free (*ret_last_ds); + *ret_last_ds = NULL; + } + rrd_close (rrd_file); + rrd_free (&rrd); + return (-1); + } } rrd_free(&rrd);
_______________________________________________ rrd-developers mailing list rrd-developers@lists.oetiker.ch https://lists.oetiker.ch/cgi-bin/listinfo/rrd-developers