pm

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

commit 5f251565fd50d808e101a1dcbce3ed48fb9502bb
parent 9d2a5bb11a9e4ca685764375ff8dd6e0f4062b9a
Author: z3bra <willyatmailoodotorg>
Date:   Sat Jun 18 01:17:35 +0200

Pass datadir as an argument to pack_delete()

Diffstat:
pm.c | 22+++++++++++++---------
1 file changed, 13 insertions(+), 9 deletions(-)
diff --git a/pm.c b/pm.c @@ -56,8 +56,7 @@ struct pack *pack_load_directory(const char *datadir, char *path); struct pack *pack_load(const char *datadir, char *path); void pack_free(struct pack *p); int pack_install(const char *rootfs, const char *datadir, struct pack *p); -int pack_delete(const char *rootfs, struct pack *p); - +int pack_delete(const char *rootfs, const char *datadir, struct pack *p); int inspect_collision(const char *rootfs, struct pack *p); int inspect_system(int fd, const char *datadir); @@ -147,6 +146,7 @@ base_name(char *path) return b ? b + 1 : path; } + int inspect_version(const char *datadir, const char *name, char version[LINE_MAX]) { @@ -154,7 +154,6 @@ inspect_version(const char *datadir, const char *name, char version[LINE_MAX]) char tmp[PATH_MAX] = "", *lf = NULL; snprintf(tmp, PATH_MAX, "%s/%s/version", datadir, name); - if ((stream = fopen(tmp, "r")) == NULL) { sprintf(version, "(unknown)"); return 1; @@ -170,6 +169,7 @@ inspect_version(const char *datadir, const char *name, char version[LINE_MAX]) return 0; } + /* * Check for collisions between the filesystem and the tarball */ @@ -515,10 +515,15 @@ delete_content(char *map, size_t size) * beginning of the file. If it's an \n, we replace it by 0 and * process to the deletion of the inode, either with rmdir or * unlink. + * + * When setting the path, the current offset is either at the + * start of the file, or on a 0 (freshly replaced \n). In case + * We are on a 0, the path should be set to the string just + * after (&map[off] + 1). This doesn't apply to start of file. */ for (off=size-1; off>0 && map[off] != '\n'; off--); map[off] = (off > 0 ? 0 : *map); - path = (off < size-1 ? &map[off] + 1 : NULL); + path = (off < size-1 ? &map[off] + (off>0?1:0) : NULL); if (path != NULL && strnlen(path, PATH_MAX) > 0) { if (delete_node(path) < 0) @@ -536,14 +541,14 @@ delete_content(char *map, size_t size) * and call delete_content() */ int -pack_delete(const char *rootfs, struct pack *p) +pack_delete(const char *rootfs, const char *datadir, struct pack *p) { int fd; char *addr = NULL; char tmp[PATH_MAX]; struct stat st; - snprintf(tmp, PATH_MAX, "%s/files", p->path); + snprintf(tmp, PATH_MAX, "%s/%s/files", datadir, p->name); if (stat(tmp, &st) < 0 && errno == ENOENT) { fprintf(stderr, "%s: not installed\n", p->name); return -1; @@ -625,7 +630,7 @@ update(const char *rootfs, const char *datadir, char *path) if ((p = pack_load(datadir, path)) == NULL) return ERR_PACK_LOAD; - if (delete(rootfs, datadir, p->name) != 0) + if (pack_delete(rootfs, datadir, p) != 0) return ERR_DELETE; r += pack_install(rootfs, datadir, p); @@ -642,12 +647,11 @@ delete(const char *rootfs, const char *datadir, char *name) struct pack *p = NULL; char tmp[PATH_MAX] = ""; - snprintf(tmp, PATH_MAX, "%s/%s", datadir, name); if ((p = pack_load(datadir, tmp)) == NULL) return ERR_PACK_LOAD; - r += pack_delete(rootfs, p); + r += pack_delete(rootfs, datadir, p); pack_free(p); return r;