+ this_dir = para_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;
+}
+
+const uint64_t size_unit_divisors[] = {
+ [size_unit_arg_b] = 1ULL,
+ [size_unit_arg_k] = 1024ULL,
+ [size_unit_arg_m] = 1024ULL * 1024ULL,
+ [size_unit_arg_g] = 1024ULL * 1024ULL * 1024ULL,
+ [size_unit_arg_t] = 1024ULL * 1024ULL * 1024ULL * 1024ULL,
+};
+
+const uint64_t count_unit_divisors[] = {
+
+ [count_unit_arg_n] = 1ULL,
+ [count_unit_arg_k] = 1000ULL,
+ [count_unit_arg_m] = 1000ULL * 1000ULL,
+ [count_unit_arg_g] = 1000ULL * 1000ULL * 1000ULL,
+ [count_unit_arg_t] = 1000ULL * 1000ULL * 1000ULL * 1000ULL,
+};
+
+const char size_unit_abbrevs[] = " BKMGT";
+const char count_unit_abbrevs[] = " kmgt";
+
+static enum enum_size_unit format_size_value(enum enum_size_unit unit,
+ uint64_t value, int print_unit, char *result)
+{
+ enum enum_size_unit u = unit;
+ char unit_buf[2] = "\0\0";
+
+ if (unit == size_unit_arg_h) /* human readable */
+ for (u = size_unit_arg_b; u < size_unit_arg_t &&
+ value > size_unit_divisors[u + 1]; u++)
+ ; /* nothing */
+ if (print_unit)
+ unit_buf[0] = size_unit_abbrevs[u];
+ sprintf(result, "%llu%s",
+ (long long unsigned)value / size_unit_divisors[u], unit_buf);
+ return u;
+}
+
+static enum enum_count_unit format_count_value(enum enum_count_unit unit,
+ uint64_t value, int print_unit, char *result)
+{
+ enum enum_count_unit u = unit;
+ char unit_buf[2] = "\0\0";
+
+ if (unit == count_unit_arg_h) /* human readable */
+ for (u = count_unit_arg_n; u < count_unit_arg_t &&
+ value > count_unit_divisors[u + 1]; u++)
+ ; /* nothing */
+ if (print_unit)
+ unit_buf[0] = count_unit_abbrevs[u];
+ sprintf(result, "%llu%s",
+ (long long unsigned)value / count_unit_divisors[u], unit_buf);
+ return u;