Add a toc format that is also valid input for `pkg pack`

Signed-off-by: David Oberhollenzer <goliath@infraroot.at>
This commit is contained in:
David Oberhollenzer 2019-02-04 18:47:34 +01:00
parent 27c802fed0
commit d55ee9bd72
4 changed files with 58 additions and 0 deletions

View File

@ -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);

View File

@ -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)

View File

@ -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);

View File

@ -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);