pm

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

commit a96b471ef2c41c2d2a6d2763b8b869561b54c00a
parent c293e2c77808dc0c1f1b292111dd18dd19280a46
Author: z3bra <willyatmailoodotorg>
Date:   Mon Apr 18 18:12:30 +0200

Handle reading arguments from stdin

This has been implemented for the install/update/delete actions.
For install/update, `pm` will read path of files to be installed.
For delete, `pm` expects pack names to be deleted.

The implementation has to be cleaned up, as the code is duplicated and
featured directly in the main().
But for now, it works!

Diffstat:
pm.c | 62++++++++++++++++++++++++++++++++++++++++++++++++++++----------
1 file changed, 52 insertions(+), 10 deletions(-)
diff --git a/pm.c b/pm.c @@ -50,6 +50,7 @@ void usage(char *name); int is_empty(char *dir); int mkdir_parents(char *dir, mode_t mode); char *base_name(char *path); +char *slurp(int fd); struct pack *pack_load(char *path); void pack_free(struct pack *p); @@ -67,15 +68,13 @@ int delete_node(char *path); int delete_content(char *map, size_t size); int delete(const char *rootfs, const char *datadir, const char *name); -char *argv0; - int verbose = 0; int overwrite = 0; void usage(char *name) { - fprintf(stderr, "usage: %s -adfi <pack>\n" , name); + fprintf(stderr, "usage: %s -adfiuv [pack]\n" , name); } @@ -140,6 +139,32 @@ base_name(char *path) return b ? b + 1 : path; } +/* + * Fills the array passed as argument with lines read from the file descriptor. + * Returns the number of lines read + */ +char * +slurp(int fd) +{ + size_t len = 0; + off_t i = 0; + char *path = NULL; + + path = malloc(PATH_MAX); + while ((len = read(fd, &path[i], 1)) > 0) { + if (i >= PATH_MAX || path[i] == '\n') { + path[i] = '\0'; + break; + } + i++; + } + + if (i == 0) { + free(path); + path = NULL; + } + return path; +} /* * Check for collisions between the filesystem and the tarball @@ -650,7 +675,7 @@ int main (int argc, char **argv) { int r = 0; - char *n = NULL; + char *n = NULL, *argv0; struct pack *p = NULL; uint8_t action = ACTION_DEFAULT; char rootfs[PATH_MAX] = ""; @@ -688,27 +713,44 @@ main (int argc, char **argv) switch (action) { case ACTION_INSTALL: - while (*argv) { - if ((p = pack_load(*(argv++)))) { + /* 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: - while (*argv) { - if ((p = pack_load(*(argv++)))) { + /* 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: - while (*argv) - r += delete(rootfs, datadir, *argv++); + /* 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); + + /* slurp() allocates memory that must be freed */ + if (argc == 0) { + free(n); + } + } break; case ACTION_INSPECT: