summaryrefslogtreecommitdiffstats
path: root/src/opk
diff options
context:
space:
mode:
Diffstat (limited to 'src/opk')
-rw-r--r--src/opk/read.c48
1 files changed, 41 insertions, 7 deletions
diff --git a/src/opk/read.c b/src/opk/read.c
index e0f3af4..5341a96 100644
--- a/src/opk/read.c
+++ b/src/opk/read.c
@@ -289,12 +289,19 @@ _opkg_opk_opk_read_data(struct opkg_opk_opk *opk)
size_t gname_len;
size_t gname_len_max;
uint64_t size_max;
+ uint32_t devmajor_max;
+ uint32_t devminor_max;
int ret_read;
char *buffer;
size_t size;
long int size_len_max;
+ long int devmajor_len_max;
+ long int devminor_len_max;
+ long int dev_len_max;
char fmt[26];
- /* "%c%s %-32s/%-32s %11d %s " */
+ /* "%c%s %-32s/%-32s %16d %s " */
+ char fmt_dev[30];
+ /* "%c%s %-32s/%-32s %9d, %7d %s " */
int len;
char mode[10];
char mtime[20];
@@ -314,6 +321,8 @@ _opkg_opk_opk_read_data(struct opkg_opk_opk *opk)
uname_len_max = 0;
gname_len_max = 0;
size_max = 0;
+ devmajor_max = 0;
+ devminor_max = 0;
while ((ret = opkg_opk_ustar_list(opk->inner_ustar, &member)) ==
OPKG_OPK_OK) {
/* If listing, link members and update max column widths. */
@@ -335,6 +344,12 @@ _opkg_opk_opk_read_data(struct opkg_opk_opk *opk)
if (member->size > size_max) {
size_max = member->size;
}
+ if (member->devmajor > devmajor_max) {
+ devmajor_max = member->devmajor;
+ }
+ if (member->devminor > devminor_max) {
+ devminor_max = member->devminor;
+ }
}
if (opk->print_data_head == NULL) {
@@ -396,9 +411,19 @@ _opkg_opk_opk_read_data(struct opkg_opk_opk *opk)
puts("");
}
ret = OPKG_OPK_OK;
- size_len_max = lrint(ceil(log10(size_max)));
- snprintf(fmt, sizeof(fmt), "%%c%%s %%-%zus/%%-%zus %%%lid %%s ",
+ size_len_max = lrint(ceil(log10( size_max)));
+ devmajor_len_max = lrint(ceil(log10(devmajor_max)));
+ devminor_len_max = lrint(ceil(log10(devminor_max)));
+ dev_len_max = devmajor_len_max + 2 /* ", " */ + devminor_len_max;
+ if (dev_len_max > size_len_max) {
+ size_len_max = dev_len_max;
+ }
+ snprintf(fmt , sizeof(fmt ), "%%c%%s %%-%zus/%%-%zus %%%lid %%s ",
uname_len_max, gname_len_max, size_len_max);
+ snprintf(fmt_dev, sizeof(fmt_dev), "%%c%%s %%-%zus/%%-%zus "
+ "%%%lid, %%%lid %%s ",
+ uname_len_max, gname_len_max,
+ size_len_max - devminor_len_max - 2, devminor_len_max);
len = 34 + uname_len_max + gname_len_max + size_len_max;
for (member = head; member != NULL;) {
if (member->mode & 00400) mode[0] = 'r'; else mode[0] = '-';
@@ -418,10 +443,19 @@ _opkg_opk_opk_read_data(struct opkg_opk_opk *opk)
localtime((const time_t *) &member->mtime));
#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Wformat-nonliteral"
- if (printf(fmt, member->type, mode,
- member->uname, member->gname,
- member->size, mtime) != len) {
- ret = OPKG_OPK_ERROR;
+ if (member->type != 'b' && member->type != 'c') {
+ if (printf(fmt, member->type, mode,
+ member->uname, member->gname,
+ member->size, mtime) != len) {
+ ret = OPKG_OPK_ERROR;
+ }
+ } else {
+ if (printf(fmt_dev, member->type, mode,
+ member->uname, member->gname,
+ member->devmajor, member->devminor,
+ mtime) != len) {
+ ret = OPKG_OPK_ERROR;
+ }
}
#pragma GCC diagnostic pop
/* Print name, ensuring it begins with "/". */