URI: 
       tInitial commit - repo - list/download/sync packs with remote repositories
   DIR Log
   DIR Files
   DIR Refs
   DIR README
       ---
   DIR commit 598515bc64f263d554b574f3c4452bb626d3d23b
  HTML Author: z3bra <willyatmailoodotorg>
       Date:   Sat, 10 Dec 2016 09:01:50 +0100
       
       Initial commit
       
       Diffstat:
         A arg.h                               |      65 +++++++++++++++++++++++++++++++
         A config.mk                           |      13 +++++++++++++
         A mkfile                              |      18 ++++++++++++++++++
         A repo.c                              |     140 +++++++++++++++++++++++++++++++
       
       4 files changed, 236 insertions(+), 0 deletions(-)
       ---
   DIR diff --git a/arg.h b/arg.h
       t@@ -0,0 +1,65 @@
       +/*
       + * Copy me if you can.
       + * by 20h
       + */
       +
       +#ifndef ARG_H__
       +#define ARG_H__
       +
       +extern char *argv0;
       +
       +/* use main(int argc, char *argv[]) */
       +#define ARGBEGIN        for (argv0 = *argv, argv++, argc--;\
       +                                        argv[0] && argv[0][1]\
       +                                        && argv[0][0] == '-';\
       +                                        argc--, argv++) {\
       +                                char argc_;\
       +                                char **argv_;\
       +                                int brk_;\
       +                                if (argv[0][1] == '-' && argv[0][2] == '\0') {\
       +                                        argv++;\
       +                                        argc--;\
       +                                        break;\
       +                                }\
       +                                for (brk_ = 0, argv[0]++, argv_ = argv;\
       +                                                argv[0][0] && !brk_;\
       +                                                argv[0]++) {\
       +                                        if (argv_ != argv)\
       +                                                break;\
       +                                        argc_ = argv[0][0];\
       +                                        switch (argc_)
       +
       +/* Handles obsolete -NUM syntax */
       +#define ARGNUM                                case '0':\
       +                                        case '1':\
       +                                        case '2':\
       +                                        case '3':\
       +                                        case '4':\
       +                                        case '5':\
       +                                        case '6':\
       +                                        case '7':\
       +                                        case '8':\
       +                                        case '9'
       +
       +#define ARGEND                        }\
       +                        }
       +
       +#define ARGC()                argc_
       +
       +#define ARGNUMF()        (brk_ = 1, estrtonum(argv[0], 0, INT_MAX))
       +
       +#define EARGF(x)        ((argv[0][1] == '\0' && argv[1] == NULL)?\
       +                                ((x), abort(), (char *)0) :\
       +                                (brk_ = 1, (argv[0][1] != '\0')?\
       +                                        (&argv[0][1]) :\
       +                                        (argc--, argv++, argv[0])))
       +
       +#define ARGF()                ((argv[0][1] == '\0' && argv[1] == NULL)?\
       +                                (char *)0 :\
       +                                (brk_ = 1, (argv[0][1] != '\0')?\
       +                                        (&argv[0][1]) :\
       +                                        (argc--, argv++, argv[0])))
       +
       +#define LNGARG()        &argv[0][0]
       +
       +#endif
   DIR diff --git a/config.mk b/config.mk
       t@@ -0,0 +1,13 @@
       +VERSION = 0.0
       +
       +CC = cc
       +LD = ${CC}
       +
       +PREFIX = /usr/local
       +MANDIR = ${PREFIX}/man
       +
       +CPPFLAGS = -DVERSION=\"${VERSION}\"
       +CFLAGS = ${CPPFLAGS} -Wall -Wextra -pedantic -g
       +LDFLAGS = -static
       +LIBS = -lcurl -lssl -lcrypto -ldl -lz -lpthread 
       +
   DIR diff --git a/mkfile b/mkfile
       t@@ -0,0 +1,18 @@
       +<config.mk
       +
       +repo: repo.o
       +        $LD -o $target $prereq $LDFLAGS $LIBS
       +
       +%.o: %.c
       +        $CC $CFLAGS -c $stem.c -o $stem.o
       +
       +clean:V:
       +        rm -f *.o repo
       +
       +install:V: all
       +        mkdir -p ${DESTDIR}${PREFIX}/bin
       +        cp repo ${DESTDIR}${PREFIX}/bin/repo
       +        chmod 755 ${DESTDIR}${PREFIX}/bin/repo
       +
       +uninstall:V:
       +        rm ${DESTDIR}${PREFIX}/bin/repo
   DIR diff --git a/repo.c b/repo.c
       t@@ -0,0 +1,139 @@
       +#include <limits.h>
       +#include <stdio.h>
       +#include <stdlib.h>
       +#include <string.h>
       +
       +#include <curl/curl.h>
       +
       +#include "arg.h"
       +
       +#define LISTFILE   "/.list"
       +#define LOCALREPO  "local"
       +#define REMOTEREPO "http://localhost"
       +
       +struct pack {
       +        char *name;
       +        char *version;
       +        char *filename;
       +};
       +
       +void usage(char *);
       +int local_list(char *);
       +int remote_sync(char *, char *);
       +
       +void
       +usage(char *name)
       +{
       +        fprintf(stderr, "usage: %s [-sl] [PACK..]\n", name);
       +        exit(1);
       +}
       +
       +int
       +local_list(char *local)
       +{
       +        int ret = 0;
       +        ssize_t len = 0;
       +        char *fn;
       +        char buf[LINE_MAX] = "";
       +        FILE *list;
       +
       +        len = strlen(local) + strlen(LISTFILE);
       +        fn = malloc(len + 1);
       +        if (!fn) {
       +                perror("malloc");
       +                return -1;
       +        }
       +        snprintf(fn, len + 1, "%s%s", local, LISTFILE);
       +        fn[len] = 0;
       +        list = fopen(fn, "r");
       +        if (!list) {
       +                perror("fopen");
       +                free(fn);
       +                return -1;
       +        }
       +
       +        while ((len = fread(buf, 1, LINE_MAX, list))) {
       +                if (len < 0) {
       +                        perror("fread");
       +                        return ret = -1;
       +                }
       +                fwrite(buf, 1, len, stdout);
       +        }
       +
       +        fclose(list);
       +        free(fn);
       +        return ret;
       +}
       +
       +int
       +remote_sync(char *remote, char *local)
       +{
       +        int ret = 0;
       +        ssize_t len;
       +        char *url, *fn;
       +        FILE *list;
       +        CURL *c;
       +        CURLcode r;
       +
       +        c = curl_easy_init();
       +        if (!c)
       +                return -1;
       +
       +        len = strlen(remote) + strlen(LISTFILE);
       +        url = malloc(len + 1);
       +        if (!url) {
       +                perror("malloc");
       +                ret = -1;
       +                goto synccleanup;
       +        }
       +        snprintf(url, len + 1, "%s%s", remote, LISTFILE);
       +        url[len] = 0;
       +
       +        len = strlen(local) + strlen(LISTFILE);
       +        fn = malloc(len + 1);
       +        if (!fn) {
       +                perror("malloc");
       +                ret = 1;
       +                goto synccleanup;
       +        }
       +        snprintf(fn, len + 1, "%s%s", local, LISTFILE);
       +        fn[len] = 0;
       +        list = fopen(fn, "w");
       +        if (!list) {
       +                perror("fopen");
       +                ret = -1;
       +                goto synccleanup;
       +        }
       +
       +        curl_easy_setopt(c, CURLOPT_URL, url);
       +        curl_easy_setopt(c, CURLOPT_WRITEDATA, list);
       +        r = curl_easy_perform(c);
       +        if (r != CURLE_OK)
       +                fprintf(stderr, "%s\n", curl_easy_strerror(r));
       +synccleanup:
       +        if (url)
       +                free(url);
       +        if (fn)
       +                free(fn);
       +        curl_easy_cleanup(c);
       +        if (list)
       +                fclose(list);
       +        return ret;
       +}
       +
       +int
       +main (int argc, char *argv[])
       +{
       +        char *argv0;
       +        ARGBEGIN{
       +        case 's':
       +                remote_sync(REMOTEREPO, LOCALREPO);
       +                break;
       +        case 'l':
       +                local_list(LOCALREPO);
       +                break;
       +        default:
       +                usage(argv0);
       +        }ARGEND;
       +        return 0;
       +}
       +\ No newline at end of file