Fri, 30 Nov 2012 21:18:13 +0100
added existing source code
/* * 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 <stdio.h> #include <stdlib.h> #include <string.h> #include <libxml/xmlerror.h> #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); }