repo

Unnamed repository; edit this file 'description' to name the repository.
Log | Files | Refs

commit 255d98c6c20cb6db83a1a61e7c9bf8d7630baed5
parent 598515bc64f263d554b574f3c4452bb626d3d23b
Author: z3bra <willyatmailoodotorg>
Date:   Sat Dec 10 09:18:09 +0100

Recreate local repo upon sync

Diffstat:
repo.c | 41+++++++++++++++++++++++++++++++++++++++++
1 file changed, 41 insertions(+), 0 deletions(-)
diff --git a/repo.c b/repo.c @@ -1,7 +1,11 @@ +#include <errno.h> #include <limits.h> #include <stdio.h> #include <stdlib.h> #include <string.h> +#include <sys/types.h> +#include <sys/stat.h> +#include <unistd.h> #include <curl/curl.h> @@ -18,6 +22,7 @@ struct pack { }; void usage(char *); +int mkdir_parents(char *, mode_t); int local_list(char *); int remote_sync(char *, char *); @@ -28,6 +33,30 @@ usage(char *name) exit(1); } +/* + * Recursive mkdir, taken from the ii project + * http://nion.modprobe.de/blog/archives/357-Recursive-directory-creation.html + */ +int +mkdir_parents(char *path, mode_t mode) +{ + char tmp[PATH_MAX] = ""; + char *p = NULL; + size_t len; + + snprintf(tmp, sizeof(tmp), "%s", path); + len = strlen(tmp); + if(tmp[len - 1] == '/') + tmp[len - 1] = 0; + for(p = tmp + 1; *p; p++) + if(*p == '/') { + *p = 0; + mkdir(tmp, mode); + *p = '/'; + } + return mkdir(tmp, mode); +} + int local_list(char *local) { @@ -74,6 +103,18 @@ remote_sync(char *remote, char *local) FILE *list; CURL *c; CURLcode r; + struct stat sb; + + if (stat(local, &sb) < 0) { + switch (errno) { + case ENOENT: + mkdir_parents(local, 0755); + break; + default: + perror(local); + return -1; + } + } c = curl_easy_init(); if (!c)