diff --git a/Makefile.am b/Makefile.am index 59ed72c..e820c3b 100644 --- a/Makefile.am +++ b/Makefile.am @@ -11,7 +11,7 @@ GLOBALHDR += include/image_entry.h include/pkgio.h include/input_file.h MAIN = main/pkg.c main/util.c main/compressor.c main/command.c main/pkgreader.c MAIN += main/pkgwriter.c main/image_entry.c main/image_entry_sort.c MAIN += main/mkdir_p.c main/pkgio_rd_image_entry.c main/pkg_unpack.c -MAIN += main/input_file.c +MAIN += main/input_file.c main/dump_toc.c pkg_SOURCES = $(GLOBALHDR) $(MAIN) pkg_CFLAGS = $(AM_CFLAGS) @@ -30,7 +30,7 @@ pkg_SOURCES += main/cmd/pack/pack.h main/cmd/pack/pack.c pkg_SOURCES += main/cmd/pack/desc.c main/cmd/pack/write_hdr.c # dump command -pkg_SOURCES += main/cmd/dump/dump.c main/cmd/dump/dump.h main/cmd/dump/dump_toc.c +pkg_SOURCES += main/cmd/dump/dump.c main/cmd/dump/dump.h pkg_SOURCES += main/cmd/dump/dump_header.c # install command diff --git a/include/image_entry.h b/include/image_entry.h index 54f3a1d..a1fd79d 100644 --- a/include/image_entry.h +++ b/include/image_entry.h @@ -26,10 +26,18 @@ typedef struct image_entry_t { } data; } image_entry_t; +typedef enum { + TOC_FORMAT_PRETTY = 0, + TOC_FORMAT_SQFS = 1, + TOC_FORMAT_INITRD = 2, +} TOC_FORMAT; + void image_entry_free(image_entry_t *ent); void image_entry_free_list(image_entry_t *list); image_entry_t *image_entry_sort(image_entry_t *list); +int dump_toc(image_entry_t *list, const char *root, TOC_FORMAT format); + #endif /* IMAGE_ENTRY_H */ diff --git a/main/cmd/dump/dump.h b/main/cmd/dump/dump.h index 90f674b..0db98c6 100644 --- a/main/cmd/dump/dump.h +++ b/main/cmd/dump/dump.h @@ -14,20 +14,12 @@ #include "pkgio.h" #include "util.h" -typedef enum { - TOC_FORMAT_PRETTY = 0, - TOC_FORMAT_SQFS = 1, - TOC_FORMAT_INITRD = 2, -} TOC_FORMAT; - typedef enum { DUMP_TOC = 0x01, DUMP_DEPS = 0x02, DUMP_ALL = (DUMP_TOC | DUMP_DEPS), } DUMP_FLAGS; -int dump_toc(image_entry_t *list, const char *root, TOC_FORMAT format); - int dump_header(pkg_reader_t *pkg, int flags); #endif /* DUMP_H */ diff --git a/main/cmd/install/install.c b/main/cmd/install/install.c index 3ee0b12..9cb07f0 100644 --- a/main/cmd/install/install.c +++ b/main/cmd/install/install.c @@ -2,13 +2,17 @@ static const struct option long_opts[] = { { "root", required_argument, NULL, 'r' }, - { "no-chown", required_argument, NULL, 'o' }, - { "no-chmod", required_argument, NULL, 'm' }, + { "no-chown", no_argument, NULL, 'o' }, + { "no-chmod", no_argument, NULL, 'm' }, + { "no-dependencies", no_argument, NULL, 'd' }, { "repo-dir", required_argument, NULL, 'R' }, + { "list-packages", no_argument, NULL, 'p' }, + { "list-files", no_argument, NULL, 'l' }, + { "format", required_argument, NULL, 'F' }, { NULL, 0, NULL, 0 }, }; -static const char *short_opts = "R:r:om"; +static const char *short_opts = "r:omdRplF:"; static int unpack_packages(int repofd, int rootfd, int flags, struct pkg_dep_list *list) @@ -32,11 +36,53 @@ static int unpack_packages(int repofd, int rootfd, int flags, return 0; } +static void list_packages(struct pkg_dep_list *list) +{ + struct pkg_dep_node *it; + + for (it = list->head; it != NULL; it = it->next) + printf("%s\n", it->name); +} + +static int list_files(int repofd, const char *rootdir, TOC_FORMAT format, + struct pkg_dep_list *list) +{ + struct pkg_dep_node *it; + image_entry_t *toc; + pkg_reader_t *rd; + + for (it = list->head; it != NULL; it = it->next) { + rd = pkg_reader_open_repo(repofd, it->name); + if (rd == NULL) + return -1; + + toc = image_entry_list_from_package(rd); + if (toc == NULL) { + pkg_reader_close(rd); + return -1; + } + + if (dump_toc(toc, rootdir, format)) { + image_entry_free_list(toc); + pkg_reader_close(rd); + return -1; + } + + image_entry_free_list(toc); + pkg_reader_close(rd); + } + + return 0; +} + static int cmd_install(int argc, char **argv) { int i, rootfd = AT_FDCWD, repofd = AT_FDCWD, flags = 0; + int ret = EXIT_FAILURE, mode = INSTALL_MODE_INSTALL; + TOC_FORMAT format = TOC_FORMAT_PRETTY; + const char *rootdir = NULL; struct pkg_dep_list list; - int ret = EXIT_FAILURE; + bool resolve_deps = true; memset(&list, 0, sizeof(list)); @@ -46,6 +92,26 @@ static int cmd_install(int argc, char **argv) break; switch (i) { + case 'd': + resolve_deps = false; + break; + case 'p': + mode = INSTALL_MODE_LIST_PKG; + break; + case 'l': + mode = INSTALL_MODE_LIST_FILES; + break; + case 'F': + if (strcmp(optarg, "sqfs") == 0) { + format = TOC_FORMAT_SQFS; + } else if (strcmp(optarg, "initrd") == 0) { + format = TOC_FORMAT_INITRD; + } else { + fprintf(stderr, "unknown format '%s'\n", + optarg); + goto out; + } + break; case 'R': if (repofd != AT_FDCWD) { fputs("repo specified more than once\n", @@ -75,6 +141,8 @@ static int cmd_install(int argc, char **argv) perror(optarg); goto out; } + + rootdir = optarg; break; case 'o': flags |= UNPACK_NO_CHOWN; @@ -93,14 +161,27 @@ static int cmd_install(int argc, char **argv) goto out; } - if (collect_dependencies(repofd, &list)) - goto out; + if (resolve_deps) { + if (collect_dependencies(repofd, &list)) + goto out; - if (sort_by_dependencies(&list)) - goto out; + if (sort_by_dependencies(&list)) + goto out; + } - if (unpack_packages(repofd, rootfd, flags, &list)) - goto out; + switch (mode) { + case INSTALL_MODE_LIST_PKG: + list_packages(&list); + break; + case INSTALL_MODE_LIST_FILES: + if (list_files(repofd, rootdir, format, &list)) + goto out; + break; + default: + if (unpack_packages(repofd, rootfd, flags, &list)) + goto out; + break; + } ret = EXIT_SUCCESS; out: @@ -130,7 +211,23 @@ static command_t install = { " Keep the uid/gid of the user who runs the program.\n" " --no-chmod, -m Do not change permission flags of the extarcted\n" " data. Use 0644 for all files and 0755 for all\n" -" directories.\n", +" directories.\n" +" --no-dependencies, -d Do not resolve dependencies, only install files\n" +" packages listed on the command line.\n" +" --list-packages, -p Do not install packages, print out final package\n" +" list that would be installed.\n" +" --list-files, -l Do not install packages, print out table of\n" +" contents for all packages that would be installed.\n" +" --format, -F Specify what format to use for printing the table\n" +" of contents. Default is a pretty printed, human\n" +" readable version.\n" +"\n" +" If \"sqfs\" is specified, a squashfs pseudo file\n" +" is genareated for setting permissions bits and\n" +" ownership appropriately.\n" +"\n" +" If \"initrd\" is specified, a format appropriate\n" +" for Linux gen_init_cpio is produced.\n", .run_cmd = cmd_install, }; diff --git a/main/cmd/install/install.h b/main/cmd/install/install.h index 506321c..c64f413 100644 --- a/main/cmd/install/install.h +++ b/main/cmd/install/install.h @@ -1,6 +1,7 @@ #ifndef INSTALL_H #define INSTALL_H +#include #include #include #include @@ -8,11 +9,18 @@ #include #include +#include "image_entry.h" #include "pkgreader.h" #include "command.h" #include "pkgio.h" #include "util.h" +enum { + INSTALL_MODE_INSTALL = 0, + INSTALL_MODE_LIST_PKG, + INSTALL_MODE_LIST_FILES, +}; + struct pkg_dep_node { char *name; diff --git a/main/cmd/dump/dump_toc.c b/main/dump_toc.c similarity index 95% rename from main/cmd/dump/dump_toc.c rename to main/dump_toc.c index 231db89..5fb950d 100644 --- a/main/cmd/dump/dump_toc.c +++ b/main/dump_toc.c @@ -1,4 +1,8 @@ -#include "dump.h" +#include +#include +#include + +#include "image_entry.h" typedef int (*print_fun_t)(image_entry_t *ent, const char *root);