# HG changeset patch # User Olaf Wintermann # Date 1506159903 -7200 # Node ID 7db4dbf4e6f91051d2ea6b1af77f46b141364c07 # Parent 8722a668fb2a35a78558a0f538bd77be2bba9e55 adds lock timeout diff -r 8722a668fb2a -r 7db4dbf4e6f9 dav/main.c --- a/dav/main.c Fri Sep 22 20:42:33 2017 +0200 +++ b/dav/main.c Sat Sep 23 11:45:03 2017 +0200 @@ -176,7 +176,7 @@ fprintf( stderr, " remove-property [-pc] [-n ] \n"); - fprintf(stderr, " lock [-pc] \n"); + fprintf(stderr, " lock [-pc] [-T timeout] \n"); fprintf(stderr, " unlock [-pc] [-L ] \n"); fprintf(stderr, " info [-pc] \n"); fprintf(stderr, " date [url]\n"); @@ -201,6 +201,7 @@ fprintf(stderr, " -e show extended flags\n"); fprintf(stderr, " -O override resources\n"); fprintf(stderr, " -L specificy lock token\n"); + fprintf(stderr, " -T timeout in seconds\n"); fprintf(stderr, " -n specify namespace uri\n"); fprintf(stderr, " -N disable authentication prompt (all commands)\n"); fprintf(stderr, " -i disable cert verification (all commands)\n"); @@ -1322,9 +1323,19 @@ return -1; } + time_t timeout = 0; + char *timeoutstr = cmd_getoption(a, "timeout"); + if(timeoutstr) { + if(!sstrcasecmp(sstr(timeoutstr), S("infinity"))) { + timeout = -1; + } else { + timeout = (time_t)atoi(timeoutstr); // TODO: use strtol + } + } + DavResource *res = dav_resource_new(sn, path); for(int i=0;i<2;i++) { - if(!dav_lock(res)) { + if(!dav_lock_t(res, timeout)) { break; } if(i == 0 && sn->error == DAV_UNAUTHORIZED && request_auth(repo, sn, a)) { diff -r 8722a668fb2a -r 7db4dbf4e6f9 dav/optparser.c --- a/dav/optparser.c Fri Sep 22 20:42:33 2017 +0200 +++ b/dav/optparser.c Sat Sep 23 11:45:03 2017 +0200 @@ -184,6 +184,20 @@ } break; } + case 'T': { + if(!option) { + option = "timeout"; + optchar = 'T'; + } else { + fprintf( + stderr, + "Missing argument for option -%c\n", + optchar); + cmd_args_free(a); + return NULL; + } + break; + } } } } else if(option) { diff -r 8722a668fb2a -r 7db4dbf4e6f9 libidav/methods.c --- a/libidav/methods.c Fri Sep 22 20:42:33 2017 +0200 +++ b/libidav/methods.c Sat Sep 23 11:45:03 2017 +0200 @@ -111,7 +111,7 @@ return ret; } -UcxBuffer* create_allprop_propfind_request() { +UcxBuffer* create_allprop_propfind_request(void) { UcxBuffer *buf = ucx_buffer_new(NULL, 512, UCX_BUFFER_AUTOFREE); sstr_t s; @@ -247,7 +247,7 @@ return buf; } -UcxBuffer* create_basic_propfind_request() { +UcxBuffer* create_basic_propfind_request(void) { UcxBuffer *buf = ucx_buffer_new(NULL, 512, UCX_BUFFER_AUTOEXTEND); sstr_t s; @@ -1077,7 +1077,7 @@ } -UcxBuffer* create_lock_request() { +UcxBuffer* create_lock_request(void) { UcxBuffer *buf = ucx_buffer_new(NULL, 512, UCX_BUFFER_AUTOEXTEND); sstr_t s; @@ -1156,13 +1156,24 @@ return ret; } -CURLcode do_lock_request(CURL *handle, UcxBuffer *request, UcxBuffer *response) { +CURLcode do_lock_request(CURL *handle, UcxBuffer *request, UcxBuffer *response, time_t timeout) { curl_easy_setopt(handle, CURLOPT_CUSTOMREQUEST, "LOCK"); curl_easy_setopt(handle, CURLOPT_UPLOAD, 1L); request->pos = 0; - // clear headers + // clear headers struct curl_slist *headers = NULL; + + if(timeout != 0) { + sstr_t thdr; + if(timeout < 0) { + thdr = ucx_sprintf("%s", "Timeout: Infinite"); + } else { + thdr = ucx_sprintf("Timeout: Second-%u", (unsigned int)timeout); + } + headers = curl_slist_append(headers, thdr.ptr); + free(thdr.ptr); + } curl_easy_setopt(handle, CURLOPT_HTTPHEADER, headers); curl_easy_setopt(handle, CURLOPT_UPLOAD, 1); @@ -1175,6 +1186,10 @@ CURLcode ret = curl_easy_perform(handle); + if(headers) { + curl_slist_free_all(headers); + } + return ret; } diff -r 8722a668fb2a -r 7db4dbf4e6f9 libidav/methods.h --- a/libidav/methods.h Fri Sep 22 20:42:33 2017 +0200 +++ b/libidav/methods.h Sat Sep 23 11:45:03 2017 +0200 @@ -79,9 +79,9 @@ dav_read_func read_func, size_t length); -UcxBuffer* create_allprop_propfind_request(); +UcxBuffer* create_allprop_propfind_request(void); UcxBuffer* create_propfind_request(DavSession *sn, UcxList *properties); -UcxBuffer* create_basic_propfind_request(); +UcxBuffer* create_basic_propfind_request(void); PropfindParser* create_propfind_parser(UcxBuffer *response, char *url); void destroy_propfind_parser(PropfindParser *parser); @@ -113,9 +113,9 @@ CURLcode do_copy_move_request(CURL *handle, char *dest, char *lock, DavBool copy, DavBool override); -UcxBuffer* create_lock_request(); +UcxBuffer* create_lock_request(void); int parse_lock_response(DavSession *sn, UcxBuffer *response, LockDiscovery *lock); -CURLcode do_lock_request(CURL *handle, UcxBuffer *request, UcxBuffer *response); +CURLcode do_lock_request(CURL *handle, UcxBuffer *request, UcxBuffer *response, time_t timeout); CURLcode do_unlock_request(CURL *handle, char *locktoken); #ifdef __cplusplus diff -r 8722a668fb2a -r 7db4dbf4e6f9 libidav/resource.c --- a/libidav/resource.c Fri Sep 22 20:42:33 2017 +0200 +++ b/libidav/resource.c Sat Sep 23 11:45:03 2017 +0200 @@ -998,13 +998,17 @@ } int dav_lock(DavResource *res) { + return dav_lock_t(res, 0); +} + +int dav_lock_t(DavResource *res, time_t timeout) { DavSession *sn = res->session; CURL *handle = sn->handle; util_set_url(sn, dav_resource_get_href(res)); UcxBuffer *request = create_lock_request(); UcxBuffer *response = ucx_buffer_new(NULL, 512, UCX_BUFFER_AUTOEXTEND); - CURLcode ret = do_lock_request(handle, request, response); + CURLcode ret = do_lock_request(handle, request, response, timeout); //printf("\nlock\n"); //printf("%.*s\n\n", request->size, request->space); diff -r 8722a668fb2a -r 7db4dbf4e6f9 libidav/webdav.h --- a/libidav/webdav.h Fri Sep 22 20:42:33 2017 +0200 +++ b/libidav/webdav.h Sat Sep 23 11:45:03 2017 +0200 @@ -242,6 +242,7 @@ int dav_moveto(DavResource *res, char *url, DavBool override); int dav_lock(DavResource *res); +int dav_lock_t(DavResource *res, time_t timeout); int dav_unlock(DavResource *res); char* dav_get_property(DavResource *res, char *name);