From d55ee9bd72c0a10f0f38cce75422f672bad06e56 Mon Sep 17 00:00:00 2001 From: David Oberhollenzer Date: Mon, 4 Feb 2019 18:47:34 +0100 Subject: [PATCH] Add a toc format that is also valid input for `pkg pack` Signed-off-by: David Oberhollenzer --- include/filelist/image_entry.h | 1 + lib/filelist/dump_toc.c | 53 ++++++++++++++++++++++++++++++++++ main/cmd/dump/dump.c | 2 ++ main/cmd/install/install.c | 2 ++ 4 files changed, 58 insertions(+) diff --git a/include/filelist/image_entry.h b/include/filelist/image_entry.h index d8ab6c2..899e998 100644 --- a/include/filelist/image_entry.h +++ b/include/filelist/image_entry.h @@ -32,6 +32,7 @@ typedef enum { TOC_FORMAT_PRETTY = 0, TOC_FORMAT_SQFS = 1, TOC_FORMAT_INITRD = 2, + TOC_FORMAT_PKG = 3, } TOC_FORMAT; void image_entry_free(image_entry_t *ent); diff --git a/lib/filelist/dump_toc.c b/lib/filelist/dump_toc.c index 88600ba..4411f6d 100644 --- a/lib/filelist/dump_toc.c +++ b/lib/filelist/dump_toc.c @@ -131,10 +131,63 @@ static int print_initrd(image_entry_t *ent, const char *root) return 0; } +static int print_pkg(image_entry_t *ent, const char *root) +{ + mode_t mode = ent->mode & (~S_IFMT); + + switch (ent->mode & S_IFMT) { + case S_IFLNK: + mode = 0777; + fputs("slink", stdout); + break; + case S_IFREG: + fputs("file", stdout); + break; + case S_IFDIR: + fputs("dir", stdout); + break; + case S_IFCHR: + case S_IFBLK: + fputs("nod", stdout); + break; + default: + fputs("unknown file type in table of contents\n", stderr); + return -1; + } + + printf(" %s 0%o %u %u ", ent->name, mode, + (unsigned int)ent->uid, (unsigned int)ent->gid); + + switch (ent->mode & S_IFMT) { + case S_IFCHR: + printf("c %u %u", major(ent->data.device.devno), + minor(ent->data.device.devno)); + break; + case S_IFBLK: + printf("b %u %u", major(ent->data.device.devno), + minor(ent->data.device.devno)); + break; + case S_IFLNK: + fputs(ent->data.symlink.target, stdout); + break; + case S_IFREG: + if (root == NULL) { + printf("%s", ent->name); + } else { + printf("%s/%s", root, ent->name); + } + break; + } + + fputc('\n', stdout); + return 0; +} + static print_fun_t printers[] = { [TOC_FORMAT_PRETTY] = print_pretty, [TOC_FORMAT_SQFS] = print_sqfs, [TOC_FORMAT_INITRD] = print_initrd, + [TOC_FORMAT_PKG] = print_pkg, }; int dump_toc(image_entry_t *list, const char *root, TOC_FORMAT format) diff --git a/main/cmd/dump/dump.c b/main/cmd/dump/dump.c index 507ca79..9494fc2 100644 --- a/main/cmd/dump/dump.c +++ b/main/cmd/dump/dump.c @@ -30,6 +30,8 @@ static int cmd_dump(int argc, char **argv) format = TOC_FORMAT_SQFS; } else if (strcmp(optarg, "initrd") == 0) { format = TOC_FORMAT_INITRD; + } else if (strcmp(optarg, "pkg") == 0) { + format = TOC_FORMAT_PKG; } else { fprintf(stderr, "unknown format '%s'\n", optarg); diff --git a/main/cmd/install/install.c b/main/cmd/install/install.c index 16eac7b..2e26114 100644 --- a/main/cmd/install/install.c +++ b/main/cmd/install/install.c @@ -108,6 +108,8 @@ static int cmd_install(int argc, char **argv) format = TOC_FORMAT_SQFS; } else if (strcmp(optarg, "initrd") == 0) { format = TOC_FORMAT_INITRD; + } else if (strcmp(optarg, "pkg") == 0) { + format = TOC_FORMAT_PKG; } else { fprintf(stderr, "unknown format '%s'\n", optarg);