X-Git-Url: http://git.tuebingen.mpg.de/?p=adu.git;a=blobdiff_plain;f=select.c;h=4c2f12cbc7ab7e6f7f69bfbd7809daf866f4959a;hp=59755a66e9a1f119f0ffe28042ae4b8097f26d35;hb=a8c239250e33966020dd175e34257b4c2d4b4f2e;hpb=587e1a5b8b5b0b35a18eaf4f8852cf5b775f1e86 diff --git a/select.c b/select.c index 59755a6..4c2f12c 100644 --- a/select.c +++ b/select.c @@ -116,34 +116,37 @@ static int get_dir_name_by_number(uint64_t *dirnum, char **name) char *result = NULL, *tmp; struct osl_row *row; uint64_t val = *dirnum; - struct osl_object obj = {.data = &val, .size = sizeof(val)}; + struct osl_object obj; int ret; + char *pfx; again: + obj.data = &val; + obj.size = sizeof(val); ret = osl(osl_get_row(dir_table, DT_NUM, &obj, &row)); if (ret < 0) goto out; - ret = osl(osl_get_object(dir_table, row, DT_NAME, &obj)); - if (ret < 0) - goto out; - if (result) { - tmp = make_message("%s/%s", (char *)obj.data, result); - free(result); - result = tmp; - } else - result = adu_strdup((char *)obj.data); ret = osl(osl_get_object(dir_table, row, DT_PARENT_NUM, &obj)); if (ret < 0) goto out; val = *(uint64_t *)obj.data; + ret = osl(osl_get_object(dir_table, row, DT_NAME, &obj)); + if (ret < 0) + goto out; + 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; } @@ -151,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;