diff -r 5b58389ab9dd -r a8f8cdbf85df dav/main.c --- a/dav/main.c Fri Oct 23 22:15:12 2015 +0200 +++ b/dav/main.c Tue Jan 12 19:17:46 2016 +0100 @@ -106,6 +106,10 @@ ret = cmd_remove(args); } else if(!strcasecmp(cmd, "mkdir") || !strcasecmp(cmd, "mkcol")) { ret = cmd_mkdir(args); + } else if(!strcasecmp(cmd, "copy") || !strcasecmp(cmd, "cp")) { + ret = cmd_move(args, true); + } else if(!strcasecmp(cmd, "move") || !strcasecmp(cmd, "mv")) { + ret = cmd_move(args, false); } else if(!strcasecmp(cmd, "date")) { ret = cmd_date(args); } else if(!strcasecmp(cmd, "set-property")) { @@ -139,6 +143,8 @@ fprintf(stderr, " put [-pcR] [-k ] \n"); fprintf(stderr, " mkdir [-pc] [-k ] \n"); fprintf(stderr, " remove [-pc] \n"); + fprintf(stderr, " copy [-pc] \n"); + fprintf(stderr, " move [-pc] \n"); fprintf( stderr, " get-property [-pc] [-n ] \n"); @@ -921,6 +927,42 @@ return 0; } +int cmd_move(CmdArgs *a, int cp) { + if(a->argc != 2) { + // TODO: change, when creation of multiple dirs is supported + fprintf(stderr, "Too %s arguments\n", a->argc < 2 ? "few":"many"); + return -1; + } + + char *url1 = a->argv[0]; + char *path1 = NULL; + Repository *repo1 = url2repo(url1, &path1); + + char *url2 = a->argv[1]; + char *path2 = NULL; + Repository *repo2 = url2repo(url2, &path2); + + DavSession *sn = connect_to_repo(repo1); + if(set_session_config(sn, a)) { + return -1; + } + + if(repo1 == repo2) { + DavResource *res = dav_resource_new(sn, path1); + int err = cp ? dav_copy(res, path2) : dav_move(res, path2); + if(err) { + print_resource_error(sn, res->path); + fprintf(stderr, "Cannot %s resource.\n", cp ? "copy" : "move"); + return -1; + } + } else { + fprintf(stderr, "Copy or Move not supported for differend hosts.\n"); + return -1; + } + + return 0; +} + static size_t get_date_header_cb(void *header, int s, int n, void *data) { char **date_str = (char**)data;