pm

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

commit a90605e2b376486576007c7acb6967ca3af0823f
parent fb204995f7751e8a1e834455275fbaa2f44f7bab
Author: z3bra <willyatmailoodotorg>
Date:   Wed Dec 30 16:31:39 2015

Perform a smart inspection

The -i flag is used to inspect packages. It can decide what to do
depending on the argument provided with it:

	# output the list of installed packs
	pm -i

	# output the content of an installed pack
	pm -i <packname>

	# output the content of a pack archive
	# (triggered if <pack> contains a '/')
	pm -i ./<packfile>

Diffstat:
 pm.c | 121 +++++++++++++++++++++++++++++++++-----------------------------------
 1 file changed, 59 insertions(+), 62 deletions(-)

diff --git a/pm.c b/pm.c @@ -14,7 +14,6 @@ #define PACKAGE_ROOT "test/rootfs" #define PACKAGE_DATA "test/metadata" -#define PACKAGE_CACHE "test/cache" #define PACKAGE_BUFF_SIZE 8192 #define PACKAGE_EXTENSION ".tar.bz2" @@ -30,12 +29,9 @@ enum { ACTION_DELETE = 1, ACTION_UPDATE = 2, ACTION_INSPECT = 3, - ACTION_LIST_FILES = 4, - ACTION_LIST_DEPS = 5, - ACTION_LIST_LOCAL = 6, - ACTION_LIST_REMOTE = 7, - ACTION_PACKAGE = 8, - ACTION_INVALID = 9 + ACTION_LIST_DEPS = 4, + ACTION_LIST_REMOTE = 5, + ACTION_INVALID = 6 }; /* error codes */ @@ -49,9 +45,10 @@ void usage(char *name); int d_empty(char *dir); int p_mkdir(char *dir, mode_t mode); char *base_name(char *path); -int inspect(int fd, char *filename); -int list_local(const char *datadir); -int list_content(const char *name); +int inspect(char *name); +int list_archive(int fd, char *filename); +int list_local(int fd, char *packname); +int list_content(int fd, char *packname); int metadata(char *datadir, char *filename); int pack(char *out, char **filename); int unpack(char *root, char *in); @@ -65,7 +62,7 @@ char *argv0; void usage(char *name) { - fprintf(stderr, "usage: %s [-l] [-acir <package> [files..]]\n" , name); + fprintf(stderr, "usage: %s -adi <pack>\n" , name); } /* @@ -125,11 +122,26 @@ base_name(char *path) return b ? b + 1 : path; } +int +inspect(char *name) +{ + /* name is NULL, list packages installed */ + if (!name) + return list_local(1, PACKAGE_DATA); + + /* if name contains a '/', assume it's an archive */ + if (strchr(name, '/')) + return list_archive(1, name); + + /* otherwise, list files installed by a package */ + return list_content(1, name); +} + /* - * write the content of an archive to the given file descriptor + * write the content of an archive to a filedes */ int -inspect(int fd, char *filename) +list_archive(int fd, char *filename) { struct archive *a; struct archive_entry *e; @@ -158,46 +170,51 @@ inspect(int fd, char *filename) } +/* + * write files installed by a package to a filedes + */ int -list_local(const char *datadir) +list_content(int fd, char *name) { - DIR *d; - struct dirent *p; + int meta; + char tmp[PATH_MAX]; - if (!(d = opendir(datadir))) { - perror("opendir"); + snprintf(tmp, PATH_MAX, "%s/%s/files", PACKAGE_DATA, name); + if ((meta = open(tmp, O_RDONLY)) < 0) { + perror("open"); return -1; } - while ((p = readdir(d))) - if (strcmp(p->d_name, ".") && strcmp(p->d_name, "..")) - printf("%s\n", p->d_name); + while (read(meta, tmp, LINE_MAX)) + dprintf(fd, "%s", tmp); - closedir(d); return 0; } + /* - * List files installed by a package + * write packages installed in PACKAGE_ROOT to a filedes */ int -list_content(const char *name) +list_local(int fd, char *datadir) { - int fd; - char tmp[PATH_MAX]; + DIR *d; + struct dirent *p; - snprintf(tmp, PATH_MAX, "%s/%s/files", PACKAGE_DATA, name); - if ((fd = open(tmp, O_RDONLY)) < 0) { - perror("open"); + if (!(d = opendir(datadir))) { + perror("opendir"); return -1; } - while (read(fd, tmp, LINE_MAX)) - printf("%s", tmp); + while ((p = readdir(d))) + if (strcmp(p->d_name, ".") && strcmp(p->d_name, "..")) + dprintf(fd, "%s\n", p->d_name); + closedir(d); return 0; } + /* * write metadata about a package file * @@ -226,7 +243,7 @@ metadata(char *datadir, char *filename) strncat(tmp, "/files", PATH_MAX); fd = open(tmp, O_CREAT|O_WRONLY|O_TRUNC, 0644); if (fd > 0) { - inspect(fd, filename); + list_archive(fd, filename); close(fd); return 0; } @@ -470,7 +487,6 @@ pack_load(char *name) return NULL; } - printf("%s - %s (%s)\n", p->name, p->version, p->path); return p; } @@ -482,31 +498,18 @@ main (int argc, char **argv) uint8_t action = ACTION_INVALID; ARGBEGIN{ - case 'c': - if (argc <3) /* what a cute variable */ - usage(argv0); - action = ACTION_PACKAGE; - n = ARGF(); - break; case 'a': action = ACTION_INSTALL; n = EARGF(usage(argv0)); break; - case 'i': - action = ACTION_INSPECT; + case 'd': + action = ACTION_DELETE; n = EARGF(usage(argv0)); break; - case 'l': - if (argc > 1) { - action = ACTION_LIST_FILES; + case 'i': + action = ACTION_INSPECT; + if (argc > 1) n = ARGF(); - } else { - action = ACTION_LIST_LOCAL; - } - break; - case 'r': - action = ACTION_DELETE; - n = EARGF(usage(argv0)); break; case 'h': default: @@ -518,6 +521,7 @@ main (int argc, char **argv) p = pack_load(n); switch (action) { + case ACTION_INSTALL: if (!p) return ERR_PACKAGE_LOAD; @@ -525,20 +529,13 @@ main (int argc, char **argv) return unpack(PACKAGE_ROOT, p->path); fprintf(stderr, "could not write metadata for %s\n", p->name); return ERR_METADATA; + case ACTION_DELETE: return delete(PACKAGE_DATA, PACKAGE_ROOT, n); + case ACTION_INSPECT: - if (!p) - return ERR_PACKAGE_LOAD; - return inspect(1, p->path); - case ACTION_PACKAGE: - if (!p) - return ERR_PACKAGE_LOAD; - return pack(p->path, argv); - case ACTION_LIST_LOCAL: - return list_local(PACKAGE_DATA); - case ACTION_LIST_FILES: - return list_content(n); + return inspect(n); + /* handle me, Octave */ case ACTION_UPDATE: case ACTION_LIST_DEPS: