diff -r 0f94d369bb02 -r 1bcaac272cdf dav/main.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/dav/main.c Fri Nov 30 21:18:13 2012 +0100 @@ -0,0 +1,127 @@ +/* + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER. + * + * Copyright 2012 Olaf Wintermann. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +#include +#include +#include +#include + +#include "propfind.h" +#include "utils.h" +#include "main.h" + +void xmlerrorfnc(void * ctx, const char * msg, ... ) { + // nothing +} + +int main(int argc, char **argv) { + xmlGenericErrorFunc fnc = xmlerrorfnc; + initGenericErrorDefaultFunc(&fnc); + + if(argc < 2) { + print_usage(); + return -1; + } + + if(!strcmp(argv[1], "list") || !strcmp(argv[1], "ls")) { + return cmd_list(argc - 2, argv + 2); + } else if(!strcmp(argv[1], "get")) { + return cmd_get(argc - 2, argv + 2); + } + + print_usage(); + return -1; +} + +void print_usage() { + +} + +int cmd_list(int argc, char **argv) { + if(argc == 0) { + return -1; + } + + char *url = argv[0]; // TODO: use arg as url or alias + + CURL *curl = curl_easy_init(); + curl_easy_setopt(curl, CURLOPT_URL, url); + Propfind *propfind = dav_propfind(curl); + + UCX_FOREACH(UcxDlist*, propfind->children, ch) { + DavResource *resource = ch->data; + printf("%s\n", resource->name); + } + + // TODO: free propfind stuff + curl_easy_cleanup(curl); + + return 0; +} + +int cmd_get(int argc, char **argv) { + if(argc == 0) { + return -1; + } + + char *url = argv[0]; // TODO: use arg as url or alias + + CURL *curl = curl_easy_init(); + curl_easy_setopt(curl, CURLOPT_URL, url); + Propfind *propfind = dav_propfind(curl); + + if(propfind->resource->collection) { + UCX_FOREACH(UcxDlist*, propfind->children, chd) { + DavResource *resource = chd->data; + if(!resource->collection) { + char *resurl = util_child_url(propfind->url, resource->href); + get_file(curl, resurl, resource->name); + } + } + } else { + get_file(curl, propfind->url, propfind->resource->name); + } + + // TODO: free propfind stuff + curl_easy_cleanup(curl); + + return 0; +} + +void get_file(CURL *curl, char *url, char *path) { + curl_easy_setopt(curl, CURLOPT_URL, url); + + FILE *out = fopen(path, "w"); + + curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, fwrite); + curl_easy_setopt(curl, CURLOPT_WRITEDATA, out); + + CURLcode res = curl_easy_perform(curl); + + fclose(out); +}