tMake remote_sync() implementation simpler - repo - list/download/sync packs with remote repositories
 (DIR) Log
 (DIR) Files
 (DIR) Refs
 (DIR) README
       ---
 (DIR) commit a3970bdfaa5cd9b7300827205f9875fc29ec736b
 (DIR) parent b7ea949712bf597433985871df74f03857f52e03
 (HTM) Author: z3bra <contactatz3bradotorg>
       Date:   Thu, 15 Dec 2016 17:29:05 +0100
       
       Make remote_sync() implementation simpler
       
       The process of openning a file to write has now been moved OUTSIDE the
       remote_sync() function to make the function more generic and thus
       simpler to use.
       
       Diffstat:
         M repo.c                              |     100 ++++++++++++++++++-------------
       
       1 file changed, 58 insertions(+), 42 deletions(-)
       ---
 (DIR) diff --git a/repo.c b/repo.c
       t@@ -34,7 +34,7 @@ struct pack *pack_load(char *);
        struct repo *add_repo(struct repos *, char *);
        int local_load(struct packs *, char *);
        int local_list(char *);
       -int remote_sync(char *, char *, char *);
       +int remote_sync(char *, FILE *);
        
        void
        usage(char *name)
       t@@ -117,6 +117,7 @@ local_load(struct packs *plist, char *local)
                                TAILQ_INSERT_TAIL(plist, p, entries);
                        p = NULL;
                }
       +        fclose(list);
                return 0;
        }
        
       t@@ -133,12 +134,10 @@ local_list(char *local)
        }
        
        int
       -remote_sync(char *remote, char *local, char *file)
       +remote_sync(char *url, FILE *fd)
        {
       -        int ret = 0;
                ssize_t len;
       -        char *url, *enc, *fn;
       -        FILE *list;
       +        char *fn, *base, *encfile, *encurl;
                CURL *c;
                CURLcode r;
        
       t@@ -146,61 +145,51 @@ remote_sync(char *remote, char *local, char *file)
                if (!c)
                        return -1;
        
       -        enc = curl_easy_escape(c, file, strlen(file));
       -        len = strlen(remote) + strlen(enc);
       -        url = malloc(len + 1);
       -        if (!url) {
       -                perror("malloc");
       -                ret = -1;
       -                goto synccleanup;
       -        }
       -        snprintf(url, len + 1, "%s%s", remote, enc);
       -        url[len] = 0;
        
       -        len = strlen(local) + strlen(file);
       -        fn = malloc(len + 1);
       -        if (!fn) {
       +        fn = strdup(basename(url));
       +        base = strdup(dirname(url));
       +        encfile = curl_easy_escape(c, fn, strlen(fn));
       +
       +        len = strlen(base) + strlen(encfile) + 1;
       +        encurl = malloc(len + 1);
       +        if (!encurl) {
                        perror("malloc");
       -                ret = 1;
       -                goto synccleanup;
       -        }
       -        snprintf(fn, len + 1, "%s%s", local, file);
       -        fn[len] = 0;
       -        list = fopen(fn, "w");
       -        if (!list) {
       -                perror("fopen");
       -                ret = -1;
       -                goto synccleanup;
       +                exit(1);
                }
       +        snprintf(encurl, len + 1, "%s/%s", base, encfile);
        
       -        curl_easy_setopt(c, CURLOPT_URL, url);
       -        curl_easy_setopt(c, CURLOPT_WRITEDATA, list);
       +        curl_easy_setopt(c, CURLOPT_URL, encurl);
       +        curl_easy_setopt(c, CURLOPT_WRITEDATA, fd);
                r = curl_easy_perform(c);
       -        if (r != CURLE_OK)
       -                fprintf(stderr, "%s: %s\n", url, curl_easy_strerror(r));
       -synccleanup:
       -        if (url)
       -                free(url);
       -        if (fn)
       -                free(fn);
       -        curl_easy_cleanup(c);
       -        if (list)
       -                fclose(list);
       -        return ret;
       +        if (r != CURLE_OK) {
       +                fprintf(stderr, "%s: %s\n", encurl, curl_easy_strerror(r));
       +                return r;
       +        }
       +
       +        free(fn);
       +        curl_free(encfile);
       +
       +        return 0;
        }
        
        int
        main (int argc, char *argv[])
        {
       +        int   sflag = 0;
                char *argv0, *n;
       +        char  fn[PATH_MAX], url[PATH_MAX];
       +        FILE *fd;
                struct packs plist;
       +        struct repos rlist;
                struct pack *p = NULL;
       +        struct repo *r = NULL;
        
                TAILQ_INIT(&plist);
       +        TAILQ_INIT(&rlist);
        
                ARGBEGIN{
                case 's':
       -                remote_sync(REMOTEREPO, LOCALREPO, LISTFILE);
       +                sflag = 1;
                        break;
                case 'l':
                        local_list(LOCALREPO);
       t@@ -210,10 +199,37 @@ main (int argc, char *argv[])
                        usage(argv0);
                }ARGEND;
        
       +        if (TAILQ_EMPTY(&rlist)) {
       +                add_repo(&rlist, REMOTEREPO);
       +        }
       +
       +        if (sflag) {
       +                snprintf(fn, PATH_MAX, "%s/%s", LOCALREPO, LISTFILE);
       +                fd = fopen(fn, "w");
       +                if (!fd) {
       +                        perror(fn);
       +                        exit(1);
       +                }
       +                TAILQ_FOREACH(r, &rlist, entries) {
       +                        snprintf(url, PATH_MAX, "%s/%s", r->url, LISTFILE);
       +                        remote_sync(url, fd);
       +                }
       +                fclose(fd);
       +        }
       +
                local_load(&plist, LOCALREPO);
                while ((n = *(argv++))) {
                        TAILQ_FOREACH(p, &plist, entries) {
                                if (!strncmp(p->name, n, PATH_MAX)) {
       +                                snprintf(fn, PATH_MAX, "%s/%s", LOCALREPO, basename(p->url));
       +                                fd = fopen(fn, "w");
       +                                if (!fd) {
       +                                        perror(fn);
       +                                        continue;
       +                                }
       +                                remote_sync(p->url, fd);
       +                                puts(fn);
       +                                fclose(fd);
                                        break;
                                }
                        }