Sat, 01 Dec 2012 20:34:55 +0100
added put method
/* * 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 <unistd.h> #include <libxml/xmlerror.h> #include <sys/types.h> #include <sys/stat.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); } else if(!strcmp(argv[1], "put")) { return cmd_put(argc - 2, argv + 2); } print_usage(); return -1; } void print_usage() { } void get_file(CURL *curl, char *url, char *path) { curl_easy_setopt(curl, CURLOPT_URL, url); curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, 0); 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); // handle some errors (http://curl.haxx.se/libcurl/c/libcurl-errors.html) switch(res) { case CURLE_OK: { return; } case CURLE_REMOTE_ACCESS_DENIED: { break; } case CURLE_SSL_CONNECT_ERROR: { break; } case CURLE_LOGIN_DENIED: { break; } case CURLE_REMOTE_FILE_NOT_FOUND: { break; } default: { break; } } unlink(path); } void put_file(CURL *curl, char *url, char *path) { curl_easy_setopt(curl, CURLOPT_URL, url); curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, 0); curl_easy_setopt(curl, CURLOPT_PUT, 1L); struct stat s; if(stat(path, &s) != 0) { perror("stat"); fprintf(stderr, "file: %s\n", path); return; } FILE *in = fopen(path, "r"); curl_easy_setopt(curl, CURLOPT_UPLOAD, 1L); curl_easy_setopt(curl, CURLOPT_READFUNCTION, fread); curl_easy_setopt(curl, CURLOPT_READDATA, in); curl_easy_setopt(curl, CURLOPT_INFILESIZE_LARGE, (curl_off_t)s.st_size); CURLcode res = curl_easy_perform(curl); fclose(in); if(res != CURLE_OK) { fprintf(stderr, "put_file: %s\n", curl_easy_strerror(res)); } } 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; } int cmd_put(int argc, char **argv) { if(argc == 0) { return -1; } char *url = argv[0]; // TODO: use arg as url or alias char *path; if(argc > 0) { path = argv[1]; } else { fprintf(stderr, "put: missing file argument\n"); return -1; } char *uploadurl = util_upload_url(url, path); CURL *curl = curl_easy_init(); // TODO: check possible name conflicts put_file(curl, uploadurl, path); curl_easy_cleanup(curl); }