diff -r 4e46c65711ef -r 938957a4eea7 dav/main.c --- a/dav/main.c Thu Aug 22 11:25:16 2013 +0200 +++ b/dav/main.c Thu Aug 22 12:45:12 2013 +0200 @@ -88,6 +88,8 @@ ret = cmd_remove(args); } else if(!strcasecmp(cmd, "mkdir") || !strcasecmp(cmd, "mkcol")) { ret = cmd_mkdir(args); + } else if(!strcasecmp(cmd, "date")) { + ret = cmd_date(args); } else { print_usage(argv[0]); } @@ -104,6 +106,7 @@ fprintf(stderr, " put [-p] [-k ] \n"); fprintf(stderr, " mkdir \n"); fprintf(stderr, " remove \n"); + fprintf(stderr, " date [url]\n"); fprintf(stderr, "\n"); fprintf(stderr, "Options:\n"); fprintf(stderr, @@ -785,3 +788,52 @@ return 0; } + + +static size_t get_date_header_cb(void *header, int s, int n, void *data) { + char **date_str = (char**)data; + + //printf("header: %.*s\n", s*n, header); + sstr_t h = sstrn(header, s*n); + if(sstrprefix(h, S("Date:"))) { + sstr_t v = sstrsubs(h, 5); + v = sstrdup(sstrtrim(v)); + *date_str = v.ptr; + } + return s*n; +} + +int cmd_date(CmdArgs *a) { + if(a->argc < 1) { + time_t now = time(NULL); + struct tm *date = gmtime(&now); + char str[32]; + putenv("LC_TIME=C"); + size_t len = strftime(str, 32, "%a, %d %b %Y %H:%M:%S GMT\n", date); + fwrite(str, 1, len, stdout); + } else { + DavSession *sn = NULL; + char *url = a->argv[0]; + char *root = NULL; + char *path = NULL; + url_get_parts(url, &root, &path); + + Repository *repo = get_repository(root); + if(repo) { + sn = dav_session_new_auth(ctx, repo->url, repo->user, repo->password); + } else { + sn = dav_session_new(ctx, root); + } + + DavResource *res = dav_resource_new(sn, path); + char *date = NULL; + curl_easy_setopt(sn->handle, CURLOPT_HEADERFUNCTION, get_date_header_cb); + curl_easy_setopt(sn->handle, CURLOPT_WRITEHEADER, &date); + if(dav_exists(res) && date) { + printf("%s\n", date); + } else { + return -1; + } + } + return 0; +}