tWrite metadata during package installation - pm - barely a pack manager
 (HTM) git clone git://z3bra.org/pm
 (DIR) Log
 (DIR) Files
 (DIR) Refs
 (DIR) README
 (DIR) LICENSE
       ---
 (DIR) commit b5a2a221b195030cfc21db7696651860f9ec535c
 (DIR) parent fbd4d728ef17718ed7ee6ac2629ac3913111ff79
 (HTM) Author: z3bra <willyatmailoodotorg>
       Date:   Wed, 23 Dec 2015 11:22:19 +0100
       
       Write metadata during package installation
       
       Diffstat:
         M pm.c                                |      53 +++++++++++++++++++++++++++----
       
       1 file changed, 46 insertions(+), 7 deletions(-)
       ---
 (DIR) diff --git a/pm.c b/pm.c
       t@@ -1,6 +1,8 @@
        #include <fcntl.h>
       +#include <limits.h>
        #include <stdio.h>
        #include <stdlib.h>
       +#include <string.h>
        #include <sys/stat.h>
        #include <sys/types.h>
        
       t@@ -10,6 +12,7 @@
        #include "arg.h"
        
        #define PACKAGE_ROOT_DIR "."
       +#define PACKAGE_DATA_DIR "./metadata"
        #define PACKAGE_BUFF_SIZE 8192
        
        /* possible actions */
       t@@ -27,7 +30,8 @@ enum {
        };
        
        enum {
       -        ERROR_INVALID_ACTION = 1,
       +        ERR_INVALID_ACTION = 1,
       +        ERR_METADATA       = 2,
        };
        
        char *argv0;
       t@@ -39,10 +43,10 @@ usage(char *name)
        }
        
        /*
       - * output the content of an archive
       + * write the content of an archive to the given file descriptor
         */
        int
       -inspect(const char *filename)
       +inspect(int fd, const char *filename)
        {
                struct archive *a;
                struct archive_entry *e;
       t@@ -60,7 +64,7 @@ inspect(const char *filename)
        
                /* output each filename to stdout */
                while(archive_read_next_header(a, &e) == ARCHIVE_OK) {
       -                puts(archive_entry_pathname(e));
       +                dprintf(fd, "%s\n", archive_entry_pathname(e));
                }
        
                r = archive_read_free(a);
       t@@ -71,6 +75,38 @@ inspect(const char *filename)
        }
        
        /*
       + * write metadata about a package file
       + *
       + * TODO:
       + *        + subdir for package name
       + *        + recursive mkdir
       + *        + /deps /asdep /version
       + */
       +int
       +metadata(const char *datadir, const char *filename)
       +{
       +        int fd, r;
       +        char tmp[PATH_MAX];
       +
       +        strncpy(tmp, datadir, PATH_MAX);
       +        strncat(tmp, "/files", PATH_MAX);
       +
       +        r = mkdir(datadir, 0750);
       +        if (r < 0)
       +                return r;
       +
       +        fd = open(tmp, O_CREAT|O_WRONLY|O_TRUNC, 0644);
       +
       +        if (fd > 0) {
       +                inspect(fd, filename);
       +                close(fd);
       +                return 0;
       +        }
       +
       +        return -1;
       +}
       +
       +/*
         * pack mutliple files into an archive
         */
        int
       t@@ -211,9 +247,12 @@ main (int argc, char **argv)
        
                switch (action) {
                case ACTION_INSTALL:
       -                return unpack(PACKAGE_ROOT_DIR, packname);
       +                if (metadata(PACKAGE_DATA_DIR, packname) == 0)
       +                        return unpack(PACKAGE_ROOT_DIR, packname);
       +                fprintf(stderr, "could not write metadata for %s\n", packname);
       +                return ERR_METADATA;
                case ACTION_INSPECT:
       -                return inspect(packname);
       +                return inspect(1, packname);
                case ACTION_PACKAGE:
                        return pack(packname, argv);
                /* handle me, Octave */
       t@@ -225,7 +264,7 @@ main (int argc, char **argv)
                case ACTION_LIST_REMOTE:
                default:
                        usage(argv0);
       -                exit(ERROR_INVALID_ACTION);
       +                return ERR_INVALID_ACTION;
                }
        
                return 0;