From f105ba98db90331d9576277a58800b30dedb9ffd Mon Sep 17 00:00:00 2001 From: Andre Noll Date: Thu, 5 Jun 2008 18:58:38 +0200 Subject: [PATCH 1/1] Fix and simplify get_dir_name_by_number() and friends. That was quite buggy. Fortunately, this fixed version is even simpler than the buggy code we've had before. --- select.c | 39 +++++++++++---------------------------- 1 file changed, 11 insertions(+), 28 deletions(-) diff --git a/select.c b/select.c index 00b0325..4c2f12c 100644 --- a/select.c +++ b/select.c @@ -118,6 +118,7 @@ static int get_dir_name_by_number(uint64_t *dirnum, char **name) uint64_t val = *dirnum; struct osl_object obj; int ret; + char *pfx; again: obj.data = &val; @@ -132,22 +133,20 @@ again: ret = osl(osl_get_object(dir_table, row, DT_NAME, &obj)); if (ret < 0) goto out; - if (val || conf.print_base_dir_given) { - if (result) { - tmp = make_message("%s/%s", (char *)obj.data, result); - free(result); - result = tmp; - } else - result = adu_strdup((char *)obj.data); - } + pfx = (conf.print_base_dir_given || val)? (char *)obj.data : "."; + tmp = make_message("%s/%s", pfx, result? result : ""); + free(result); + result = tmp; if (val) goto again; out: if (ret < 0) { free(result); *name = NULL; - } else + } else { + assert(result); *name = result; + } return ret; } @@ -155,30 +154,14 @@ static int get_dir_name_of_row(struct osl_row *dir_table_row, char **name) { struct osl_object obj; int ret; - char *this_dir, *prefix = NULL; *name = NULL; - ret = osl(osl_get_object(dir_table, dir_table_row, DT_NAME, &obj)); + ret = osl(osl_get_object(dir_table, dir_table_row, DT_NUM, &obj)); if (ret < 0) return ret; - this_dir = adu_strdup((char *)obj.data); - ret = osl(osl_get_object(dir_table, dir_table_row, DT_PARENT_NUM, &obj)); - if (ret < 0) - goto out; - if (!*(uint64_t *)obj.data) { - *name = this_dir; - return 1; - } - ret = get_dir_name_by_number((uint64_t *)obj.data, &prefix); - if (ret < 0) - goto out; - *name = make_message("%s/%s", prefix, this_dir); - free(prefix); - ret = 1; -out: - free(this_dir); - return ret; + return get_dir_name_by_number((uint64_t *)obj.data, name); } + static int user_stats_loop_function(struct osl_row *row, void *data) { struct user_stats_info *usi = data; -- 2.39.2