dav/main.c

changeset 29
938957a4eea7
parent 28
4e46c65711ef
child 30
9a5a7a513a96
--- 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 <key>] <url> <file>\n");
     fprintf(stderr, "        mkdir <url>\n");
     fprintf(stderr, "        remove <url>\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;
+}

mercurial