--- a/dav/main.c Thu May 28 14:34:46 2015 +0200 +++ b/dav/main.c Fri May 29 09:48:10 2015 +0200 @@ -109,6 +109,8 @@ ret = cmd_get_property(args); } else if(!strcasecmp(cmd, "info")) { ret = cmd_info(args); + } else if(!strcasecmp(cmd, "add-repository")) { + ret = cmd_add_repository(args); } else { print_usage(argv[0]); } @@ -1118,3 +1120,120 @@ } } +/* ---------- config commands ---------- */ + +static int getkeyvalue(char *arg, char **key, char **value) { + // splits a key=value arg + + *key = NULL; + *value = NULL; + if(!arg && !key && !value) { + return -1; + } + + int haskey = 0; + size_t len = strlen(arg); + + if(len < 3) { + return -1; + } + + int i; + for(i=0;i<len;i++) { + if(arg[i] == '=') { + haskey = 1; + break; + } + } + + if(haskey) { + sstr_t k = sstrn(arg, i); + sstr_t v = sstrn(arg+i + 1, len - i - 1); + if(k.length > 0 && v.length > 0) { + *key = sstrdup(k).ptr; + *value = sstrdup(v).ptr; + return 0; + } + } + + return -1; +} + +void repository_assistent(Repository *repo, int mode) { + char *name = NULL; + sstr_t line; + + // name + while(!name) { + if(repo->name) { + printf("repository name [%s]: ", repo->name); + } else { + printf("repository name: "); + } + fflush(stdout); + + line = util_readline(stdin); + if(line.length == 0 && repo->name) { + break; + } else { + name = line.ptr; + } + } + if(name) { + if(repo->name) { + free(repo->name); + } + repo->name = name; + } + + // TODO + + return; +} + +int cmd_add_repository(CmdArgs *a) { + char *interactive = cmd_getoption(a, "interactive"); + + if(!interactive && a->argc < 2) { + fprintf(stderr, "Too few arguments\n"); + fprintf(stderr, "Alternatively, use the interactive mode"); + return -1; + } + + Repository *repo = repository_new(); + // create repo object and fill config with cmd args + for(int i=0;i<a->argc;i++) { + char *key; + char *value; + if(!getkeyvalue(a->argv[i], &key, &value)) { + if(!strcmp(key, "password")) { + // passwords from command line args are plain text + // but the repository needs a base64 encoded password + char *pw = util_base64encode(value, strlen(value)); + free(value); + value = pw; + } + + if(repo_add_config(repo, key, value)) { + fprintf( + stderr, + "Unkown repository config element: %s\n", + key); + } + + free(key); + free(value); + } else { + fprintf(stderr, "´%s´ not in key=value format\n", a->argv[i]); + // TODO: cleanup + return -1; + } + } + + if(interactive) { + // start interactive assistent to adjust config + repository_assistent(repo, 0); + } + + return 0; +}