tAdd function to retrieve version from an installed pack - pm - barely a pack manager
 (HTM) git clone git://z3bra.org/pm
 (DIR) Log
 (DIR) Files
 (DIR) Refs
 (DIR) README
 (DIR) LICENSE
       ---
 (DIR) commit 1be3eff999d9f349dbc430701429058d30152778
 (DIR) parent b701a8feda3f99c087b21d82c87429919b056e67
 (HTM) Author: z3bra <willyatmailoodotorg>
       Date:   Thu, 16 Jun 2016 13:02:13 +0200
       
       Add function to retrieve version from an installed pack
       
       Diffstat:
         M pm.c                                |      39 ++++++++++++++++++++++---------
       
       1 file changed, 28 insertions(+), 11 deletions(-)
       ---
 (DIR) diff --git a/pm.c b/pm.c
       t@@ -55,9 +55,11 @@ 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(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_version(const char *datadir, const char *name, char version[]);
        int inspect(const char *datadir, const char *packname);
        
        int write_metadata(const char *datadir, struct pack *pack);
       t@@ -142,6 +144,29 @@ base_name(char *path)
                return b ? b + 1 : path;
        }
        
       +int
       +inspect_version(const char *datadir, const char *name, char version[LINE_MAX])
       +{
       +        FILE *stream;
       +        size_t len = 0;
       +        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;
       +        } else {
       +                fgets(version, LINE_MAX, stream);
       +                if ((lf = strchr(version, '\n')) != NULL)
       +                        *lf = 0;
       +        }
       +
       +        if (stream)
       +                fclose(stream);
       +
       +        return 0;
       +}
        
        /*
         * Check for collisions between the filesystem and the tarball
       t@@ -214,7 +239,7 @@ inspect_system(int fd, const char *datadir)
        {
                DIR *d;
                struct dirent *p;
       -        char tmp[PATH_MAX] = "";
       +        char tmp[PATH_MAX] = "", ver[LINE_MAX];
                int meta;
                size_t len;
        
       t@@ -225,16 +250,8 @@ inspect_system(int fd, const char *datadir)
        
                while ((p = readdir(d)))
                        if (strcmp(p->d_name, ".") && strcmp(p->d_name, "..")) {
       -                        snprintf(tmp, PATH_MAX, "%s/%s/version",
       -                                 datadir, p->d_name);
       -
       -                        if ((meta = open(tmp, O_RDONLY)) < 0) {
       -                                sprintf(tmp, "(unknown)");
       -                        } else {
       -                                len = read(meta, tmp, 32);
       -                                tmp[len - 1] = 0;
       -                        }
       -                        dprintf(fd, "%s\t%s\n", p->d_name, tmp);
       +                        inspect_version(datadir, p->d_name, ver);
       +                        dprintf(fd, "%s\t%s\n", p->d_name, ver);
                        }
        
                closedir(d);