pm

barely a pack manager
git clone git://z3bra.org/pm
Log | Files | Refs | README | LICENSE

commit 9971c62e398790939966c62bb1af1fa98fc5c4c2
parent a96b471ef2c41c2d2a6d2763b8b869561b54c00a
Author: z3bra <willyatmailoodotorg>
Date:   Tue Apr 19 12:59:55 +0200

Refactor code in the main()

install() and update() are now wrappers for pack_install(), and take a
char *path as argument instead of the pack structure.
This brings consistency in the code (as with delete()) and provide a
cleaner interface to deal with inline arguments or stdin.

In the meantime, use of the "const" keyword has been reworked to provide
type checks.

Diffstat:
pm.c | 121++++++++++++++++++++++++++++++++++++++++++++++---------------------------------
1 file changed, 70 insertions(+), 51 deletions(-)
diff --git a/pm.c b/pm.c @@ -54,18 +54,22 @@ char *slurp(int fd); struct pack *pack_load(char *path); void pack_free(struct pack *p); +int pack_install(const char *rootfs, const char *datadir, struct pack *p); -int inspect_collision(char *rootfs, struct pack *p); -int inspect_system(int fd, char *datadir); -int inspect_files(int fd, char *datadir, char *packname); -int inspect(char *datadir, char *packname); +int inspect_collision(const char *rootfs, struct pack *p); +int inspect_system(int fd, const char *datadir); +int inspect_files(int fd, const char *datadir, const char *packname); +int inspect(const char *datadir, const char *packname); -int write_metadata(char *datadir, struct pack *pack); +int write_metadata(const char *datadir, struct pack *pack); int write_entry(struct archive *a, struct archive *w); -int unpack(char *rootfs, char *datadir, struct pack *p); -int install(char *rootfs, char *datadir, struct pack *p); +int unpack(const char *rootfs, const char *datadir, struct pack *p); int delete_node(char *path); int delete_content(char *map, size_t size); + +/* action wrappers around CLI arguments */ +int install(const char *rootfs, const char *datadir, char *path); +int update(const char *rootfs, const char *datadir, char *path); int delete(const char *rootfs, const char *datadir, const char *name); int verbose = 0; @@ -170,7 +174,7 @@ slurp(int fd) * Check for collisions between the filesystem and the tarball */ int -inspect_collision(char *rootfs, struct pack *p) +inspect_collision(const char *rootfs, struct pack *p) { int r = 0; char cwd[PATH_MAX] = ""; @@ -208,7 +212,7 @@ inspect_collision(char *rootfs, struct pack *p) * Write files installed by a pack to a file descriptor */ int -inspect_files(int fd, char *datadir, char *packname) +inspect_files(int fd, const char *datadir, const char *packname) { int meta; char tmp[PATH_MAX] = ""; @@ -233,7 +237,7 @@ inspect_files(int fd, char *datadir, char *packname) * Write packs installed in datadir to a file descriptor */ int -inspect_system(int fd, char *datadir) +inspect_system(int fd, const char *datadir) { DIR *d; struct dirent *p; @@ -270,7 +274,7 @@ inspect_system(int fd, char *datadir) * files, or listing packs actually installed */ int -inspect(char *datadir, char *packname) +inspect(const char *datadir, const char *packname) { /* name is NULL, list packs installed */ if (!packname) @@ -286,7 +290,7 @@ inspect(char *datadir, char *packname) * + datadir/packname/version - version of the pack installed */ int -write_metadata(char *datadir, struct pack *p) +write_metadata(const char *datadir, struct pack *p) { int fd, r; struct stat st; @@ -348,7 +352,7 @@ write_entry(struct archive *a, struct archive *w) * Extract a tarball to the given directory */ int -unpack(char *rootfs, char *datadir, struct pack *p) +unpack(const char *rootfs, const char *datadir, struct pack *p) { int r, fd; struct archive *a; @@ -418,7 +422,7 @@ unpack(char *rootfs, char *datadir, struct pack *p) * If overwrite is set to 1, it will overwrite all files */ int -install(char *rootfs, char *datadir, struct pack *p) +pack_install(const char *rootfs, const char *datadir, struct pack *p) { int r; char tmp[PATH_MAX] = ""; @@ -601,6 +605,48 @@ delete(const char *rootfs, const char *datadir, const char *packname) /* + * Install a pack from the given path. This wraps load/install of a pack + */ +int +install(const char *rootfs, const char *datadir, char *path) +{ + int r = 0; + struct pack *p = NULL; + + if ((p = pack_load(path)) == NULL) + return ERR_PACK_LOAD; + + r += pack_install(rootfs, datadir, p); + pack_free(p); + + return r; +} + + +/* + * Update a pack. This should be as easy as delete/install. + * Deletion is required in case the file structure changes + */ +int +update(const char *rootfs, const char *datadir, char *path) +{ + int r = 0; + struct pack *p = NULL; + + if ((p = pack_load(path)) == NULL) + return ERR_PACK_LOAD; + + if (delete(rootfs, datadir, p->name) != 0) + return ERR_DELETE; + + r += pack_install(rootfs, datadir, p); + pack_free(p); + + return r; +} + + +/* * Load a pack from a tarball and return a pack structure */ struct pack * @@ -676,7 +722,6 @@ main (int argc, char **argv) { int r = 0; char *n = NULL, *argv0; - struct pack *p = NULL; uint8_t action = ACTION_DEFAULT; char rootfs[PATH_MAX] = ""; char datadir[PATH_MAX] = ""; @@ -713,51 +758,25 @@ main (int argc, char **argv) switch (action) { case ACTION_INSTALL: - /* black magic to read from stdin if no arguments given */ - while ((argc>0 && (n = *argv++) != NULL) || (n=slurp(0)) != NULL) { - if ((p = pack_load(n))) { - r += install(rootfs, datadir, p); - pack_free(p); - } - /* slurp() allocates memory that must be freed */ - if (argc == 0) { - free(n); - } - } - break; - case ACTION_UPDATE: - /* black magic to read from stdin if no arguments given */ - while ((argc>0 && (n = *argv++) != NULL) || (n=slurp(0)) != NULL) { - if ((p = pack_load(n))) { - if (delete(rootfs, datadir, p->name) == 0) - r += install(rootfs, datadir, p); - pack_free(p); - } - /* slurp() allocates memory that must be freed */ - if (argc == 0) { - free(n); - } - } - break; - case ACTION_DELETE: - /* black magic to read from stdin if no arguments given */ - while ((argc>0 && (n = *argv++) != NULL) || (n=slurp(0)) != NULL) { - r += delete(rootfs, datadir, n); + /* These action require a read from stdin if no arg is given */ + while ((argc>0 && (n=strdup(*argv++))!=NULL) || (n=slurp(0))!=NULL) { - /* slurp() allocates memory that must be freed */ - if (argc == 0) { - free(n); - } + if (action == ACTION_INSTALL) + r += install(rootfs, datadir, n); + if (action == ACTION_UPDATE) + r += update(rootfs, datadir, n); + if (action == ACTION_DELETE) + r += delete(rootfs, datadir, n); + + free(n); } break; - case ACTION_INSPECT: if (inspect(datadir, n) != 0) return ERR_INSPECT; break; - default: usage(argv0); return ERR_INVALID_ACTION;