From 2fcfe883ebcbd4bf99f81217e6aa982f92eb6a33 Mon Sep 17 00:00:00 2001 From: Klaas Freitag Date: Tue, 30 Jul 2013 08:56:53 +0200 Subject: [PATCH] Proper error reporting for HBF PUT fails. --- modules/csync_owncloud.c | 17 +++++++++-------- src/csync_propagate.c | 20 +++++++++++++++++++- 2 files changed, 28 insertions(+), 9 deletions(-) diff --git a/modules/csync_owncloud.c b/modules/csync_owncloud.c index 02177c1f37..c4ec8a0569 100644 --- a/modules/csync_owncloud.c +++ b/modules/csync_owncloud.c @@ -1194,7 +1194,6 @@ static int owncloud_sendfile(csync_vio_method_handle_t *src, csync_vio_method_ha fhandle_t *fh = (fhandle_t *) src; int fd; int error_code = 0; - const char *error_string = NULL; char *clean_uri = NULL; off_t file_size; @@ -1289,8 +1288,11 @@ static int owncloud_sendfile(csync_vio_method_handle_t *src, csync_vio_method_ha } if( finished ) { - error_string = c_strdup(hbf_error_string(trans, state)); + SAFE_FREE(dav_session.error_string); + dav_session.error_string = c_strdup(hbf_error_string(trans, state)); error_code = hbf_fail_http_code(trans); + set_errno_from_http_errcode(error_code); + rc = 1; if (dav_session.chunk_info) { dav_session.chunk_info->start_id = trans->start_id; @@ -1306,10 +1308,8 @@ static int owncloud_sendfile(csync_vio_method_handle_t *src, csync_vio_method_ha if( rc == 0 ) { oc_notify_progress(write_ctx->url, CSYNC_NOTIFY_FINISHED_UPLOAD, file_size, file_size); } else { - oc_notify_progress(write_ctx->url, CSYNC_NOTIFY_ERROR, error_code, (long long)(error_string)); + oc_notify_progress(write_ctx->url, CSYNC_NOTIFY_ERROR, error_code, (long long)(dav_session.error_string)); } - - SAFE_FREE(error_string); } else if( c_streq( write_ctx->method, "GET") ) { /* GET a file to the file descriptor */ /* actually do the request */ @@ -1359,7 +1359,6 @@ static int owncloud_sendfile(csync_vio_method_handle_t *src, csync_vio_method_ha set_errno_from_neon_errcode(neon_stat); DEBUG_WEBDAV("Error GET: Neon: %d, errno %d", neon_stat, errno); - error_string = dav_session.error_string; error_code = errno; rc = 1; } else { @@ -1378,7 +1377,8 @@ static int owncloud_sendfile(csync_vio_method_handle_t *src, csync_vio_method_ha rc = 1; } error_code = status->code; - error_string = status->reason_phrase; + SAFE_FREE(dav_session.error_string); + dav_session.error_string = c_strdup(status->reason_phrase); } else { DEBUG_WEBDAV("http request all cool, result code %d", status->code); } @@ -1398,10 +1398,11 @@ static int owncloud_sendfile(csync_vio_method_handle_t *src, csync_vio_method_ha if( rc == 0 ) { oc_notify_progress( write_ctx->url, CSYNC_NOTIFY_FINISHED_DOWNLOAD, write_ctx->get_size , write_ctx->get_size ); } else { - oc_notify_progress( write_ctx->url, CSYNC_NOTIFY_ERROR, error_code , (long long)(error_string)); + oc_notify_progress( write_ctx->url, CSYNC_NOTIFY_ERROR, error_code , (long long)(dav_session.error_string)); } } else { DEBUG_WEBDAV("Unknown method!"); + errno = ERRNO_GENERAL_ERROR; rc = -1; } diff --git a/src/csync_propagate.c b/src/csync_propagate.c index 2c647bb9c1..6005522779 100644 --- a/src/csync_propagate.c +++ b/src/csync_propagate.c @@ -443,10 +443,28 @@ start_fd_based: } if( rc != 0 ) { + if (rc == -1) { + /* Severe error */ + switch(errno) { + case EINVAL: + ctx->error_code = CSYNC_ERR_PARAM; + break; + case ERRNO_USER_ABORT: + ctx->error_code = CSYNC_ERR_ABORTED; + break; + case ERRNO_GENERAL_ERROR: + default: + ctx->error_code = CSYNC_ERR_PROPAGATE; + break; + } + /* fetch the error string from module. */ + ctx->error_string = csync_vio_get_error_string(ctx); + } + strerror_r(errno, errbuf, sizeof(errbuf)); CSYNC_LOG(CSYNC_LOG_PRIORITY_ERROR, "file: %s, command: sendfile, error: %s from errno %d", - suri, errbuf, errno); + suri, c_streq(errbuf, "") ? csync_vio_get_error_string(ctx): errbuf, errno); if (_push_to_tmp_first(ctx)) { csync_vio_file_stat_t* sb = csync_vio_file_stat_new();