Fri, 26 Feb 2016 20:54:42 +0100
more specific error messages in dav-sync
separated print_resource_error from main.c to error.c and using this function in dav-sync for improved error messages
dav-sync also aborts when an error occurs
dav/Makefile | file | annotate | diff | comparison | revisions | |
dav/error.c | file | annotate | diff | comparison | revisions | |
dav/error.h | file | annotate | diff | comparison | revisions | |
dav/main.c | file | annotate | diff | comparison | revisions | |
dav/sync.c | file | annotate | diff | comparison | revisions |
--- a/dav/Makefile Fri Feb 12 18:26:58 2016 +0100 +++ b/dav/Makefile Fri Feb 26 20:54:42 2016 +0100 @@ -31,12 +31,14 @@ DAV_SRC = main.c DAV_SRC += config.c DAV_SRC += optparser.c +DAV_SRC += error.c SYNC_SRC = sync.c SYNC_SRC += config.c SYNC_SRC += scfg.c SYNC_SRC += sopt.c SYNC_SRC += db.c +SYNC_SRC += error.c DAV_OBJ = $(DAV_SRC:%.c=../build/tool/%$(OBJ_EXT))
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/dav/error.c Fri Feb 26 20:54:42 2016 +0100 @@ -0,0 +1,98 @@ +/* + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER. + * + * Copyright 2016 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 "../libidav/utils.h" + +#include "error.h" + +void print_resource_error(DavSession *sn, char *path) { + char *res_url = util_concat_path(sn->base_url, path); + switch(sn->error) { + default: { + fprintf(stderr, "Operation failed for resource %s.\n", res_url); + if(sn->errorstr) { + fprintf(stderr, "%s\n", sn->errorstr); + } + break; + } + case DAV_NOT_FOUND: { + fprintf(stderr, "Resource %s not found.\n", res_url); + break; + } + case DAV_UNAUTHORIZED: { + fprintf(stderr, "Authentication required.\n"); + break; + } + case DAV_FORBIDDEN: { + fprintf(stderr, "Access forbidden.\n"); + break; + } + case DAV_METHOD_NOT_ALLOWED: { + fprintf(stderr, "Method not allowed.\n"); + } + case DAV_CONFLICT: { + fprintf( + stderr, + "Missing intermediate collections for resource %s.\n", + res_url); + } + case DAV_UNSUPPORTED_PROTOCOL: { + fprintf(stderr, "Unsupported protocol.\n"); + if(sn->errorstr) { + fprintf(stderr, "%s\n", sn->errorstr); + } + break; + } + case DAV_COULDNT_RESOLVE_PROXY: { + fprintf(stderr, "Cannot resolve proxy host.\n"); + break; + } + case DAV_COULDNT_RESOLVE_HOST: { + fprintf(stderr, "Cannot resolve host name.\n"); + break; + } + case DAV_COULDNT_CONNECT: { + fprintf(stderr, "Cannot connect to host.\n"); + break; + } + case DAV_TIMEOUT: { + fprintf(stderr, "Operation timed out.\n"); + break; + } + case DAV_SSL_ERROR: { + fprintf(stderr, "SSL error.\n"); + if(sn->errorstr) { + fprintf(stderr, "%s\n", sn->errorstr); + } + } + } + free(res_url); +}
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/dav/error.h Fri Feb 26 20:54:42 2016 +0100 @@ -0,0 +1,46 @@ +/* + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER. + * + * Copyright 2016 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. + */ + +#ifndef ERROR_H +#define ERROR_H + +#include "../libidav/webdav.h" + +#ifdef __cplusplus +extern "C" { +#endif + +void print_resource_error(DavSession *sn, char *path); + + +#ifdef __cplusplus +} +#endif + +#endif /* ERROR_H */ +
--- a/dav/main.c Fri Feb 12 18:26:58 2016 +0100 +++ b/dav/main.c Fri Feb 26 20:54:42 2016 +0100 @@ -42,6 +42,7 @@ #include <libidav/crypto.h> #include <libidav/session.h> #include "config.h" +#include "error.h" #include "main.h" static DavContext *ctx; @@ -266,70 +267,6 @@ return repo; } -void print_resource_error(DavSession *sn, char *path) { - char *res_url = util_concat_path(sn->base_url, path); - switch(sn->error) { - default: { - fprintf(stderr, "Operation failed for resource %s.\n", res_url); - if(sn->errorstr) { - fprintf(stderr, "%s\n", sn->errorstr); - } - break; - } - case DAV_NOT_FOUND: { - fprintf(stderr, "Resource %s not found.\n", res_url); - break; - } - case DAV_UNAUTHORIZED: { - fprintf(stderr, "Authentication required.\n"); - break; - } - case DAV_FORBIDDEN: { - fprintf(stderr, "Access forbidden.\n"); - break; - } - case DAV_METHOD_NOT_ALLOWED: { - fprintf(stderr, "Method not allowed.\n"); - } - case DAV_CONFLICT: { - fprintf( - stderr, - "Missing intermediate collections for resource %s.\n", - res_url); - } - case DAV_UNSUPPORTED_PROTOCOL: { - fprintf(stderr, "Unsupported protocol.\n"); - if(sn->errorstr) { - fprintf(stderr, "%s\n", sn->errorstr); - } - break; - } - case DAV_COULDNT_RESOLVE_PROXY: { - fprintf(stderr, "Cannot resolve proxy host.\n"); - break; - } - case DAV_COULDNT_RESOLVE_HOST: { - fprintf(stderr, "Cannot resolve host name.\n"); - break; - } - case DAV_COULDNT_CONNECT: { - fprintf(stderr, "Cannot connect to host.\n"); - break; - } - case DAV_TIMEOUT: { - fprintf(stderr, "Operation timed out.\n"); - break; - } - case DAV_SSL_ERROR: { - fprintf(stderr, "SSL error.\n"); - if(sn->errorstr) { - fprintf(stderr, "%s\n", sn->errorstr); - } - } - } - free(res_url); -} - int set_session_config(DavSession *sn, CmdArgs *a) { char *plain = cmd_getoption(a, "plain"); char *crypt = cmd_getoption(a, "crypt");
--- a/dav/sync.c Fri Feb 12 18:26:58 2016 +0100 +++ b/dav/sync.c Fri Feb 26 20:54:42 2016 +0100 @@ -45,6 +45,7 @@ #include "scfg.h" #include "sopt.h" #include "db.h" +#include "error.h" #include "sync.h" #include "ucx/properties.h" @@ -90,7 +91,7 @@ ret = cmd_push(args); } else if(!strcasecmp(cmd, "version") || !strcasecmp(cmd, "-version") || !strcasecmp(cmd, "--version")) { #ifdef DEBUG - fprintf(stderr, "dav-synv %s unstable\n", DAV_VERSION); + fprintf(stderr, "dav-sync %s unstable\n", DAV_VERSION); #else fprintf(stderr, "dav-sync %s\n", DAV_VERSION); #endif @@ -106,11 +107,12 @@ fprintf(stderr, "Commands:\n"); fprintf(stderr, " pull [-c] <directory>\n"); - fprintf(stderr, " push [-r] <directory>\n\n"); + //fprintf(stderr, " push [-r] <directory>\n\n"); + fprintf(stderr, " push <directory>\n\n"); fprintf(stderr, "Options:\n"); - fprintf(stderr, " -c Disable conflict detection\n"); - fprintf(stderr, " -r Read changes from stdin\n\n"); + fprintf(stderr, " -c Disable conflict detection\n\n"); + //fprintf(stderr, " -r Read changes from stdin\n\n"); } static int res_matches_filter(SyncDirectory *dir, char *res_path) { @@ -191,13 +193,14 @@ DavResource *ls = dav_query(sn, "select D:getetag,idav:status from / with depth = infinity"); if(!ls) { - fprintf(stderr, "Error\n"); + print_resource_error(sn, "/"); // TODO: free return -1; } if(!ls->children) { // TODO: free + fprintf(stderr, "Repository is empty\n"); return 0; // empty repository } @@ -591,16 +594,24 @@ // upload every changed file if (local_resource_is_changed(dir, db, local_res)) { DavResource *res = dav_resource_new(sn, local_res->path); + if(!res) { + print_resource_error(sn, local_res->path); + break; + } if(local_res->isdirectory) { printf("mkcol: %s\n", local_res->path); if(sync_mkdir(dir, res, local_res)) { - // TODO: I don't know what to do now + print_resource_error(sn, res->path); + dav_resource_free(res); + break; } } else { printf("put: %s\n", local_res->path); if(sync_put_resource(dir, res, local_res)) { - // TODO: I don't know what to do now + print_resource_error(sn, res->path); + dav_resource_free(res); + break; } } dav_resource_free(res); @@ -621,6 +632,10 @@ if (!res_matches_filter(dir, local->path+1)) { if(sync_delete_remote_resource(sn, local)) { ucx_map_cstr_put(lclres, local->path, local); + if(sn->error != DAV_NOT_FOUND) { + print_resource_error(sn, local->path); + break; + } } } }