Sat, 03 Oct 2015 13:33:15 +0200
dav-sync detects broken uploads
46
0542668d0f26
added new sync tool
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
1 | /* |
0542668d0f26
added new sync tool
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
2 | * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER. |
0542668d0f26
added new sync tool
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
3 | * |
75
56962faf2b42
copyright update
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
73
diff
changeset
|
4 | * Copyright 2015 Olaf Wintermann. All rights reserved. |
46
0542668d0f26
added new sync tool
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
5 | * |
0542668d0f26
added new sync tool
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
6 | * Redistribution and use in source and binary forms, with or without |
0542668d0f26
added new sync tool
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
7 | * modification, are permitted provided that the following conditions are met: |
0542668d0f26
added new sync tool
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
8 | * |
0542668d0f26
added new sync tool
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
9 | * 1. Redistributions of source code must retain the above copyright |
0542668d0f26
added new sync tool
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
10 | * notice, this list of conditions and the following disclaimer. |
0542668d0f26
added new sync tool
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
11 | * |
0542668d0f26
added new sync tool
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
12 | * 2. Redistributions in binary form must reproduce the above copyright |
0542668d0f26
added new sync tool
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
13 | * notice, this list of conditions and the following disclaimer in the |
0542668d0f26
added new sync tool
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
14 | * documentation and/or other materials provided with the distribution. |
0542668d0f26
added new sync tool
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
15 | * |
0542668d0f26
added new sync tool
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
16 | * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" |
0542668d0f26
added new sync tool
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
17 | * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE |
0542668d0f26
added new sync tool
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
18 | * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE |
0542668d0f26
added new sync tool
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
19 | * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE |
0542668d0f26
added new sync tool
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
20 | * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR |
0542668d0f26
added new sync tool
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
21 | * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF |
0542668d0f26
added new sync tool
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
22 | * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS |
0542668d0f26
added new sync tool
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
23 | * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN |
0542668d0f26
added new sync tool
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
24 | * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) |
0542668d0f26
added new sync tool
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
25 | * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE |
0542668d0f26
added new sync tool
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
26 | * POSSIBILITY OF SUCH DAMAGE. |
0542668d0f26
added new sync tool
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
27 | */ |
0542668d0f26
added new sync tool
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
28 | |
0542668d0f26
added new sync tool
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
29 | #include <stdio.h> |
0542668d0f26
added new sync tool
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
30 | #include <stdlib.h> |
0542668d0f26
added new sync tool
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
31 | #include <string.h> |
0542668d0f26
added new sync tool
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
32 | #include <errno.h> |
0542668d0f26
added new sync tool
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
33 | #include <unistd.h> |
0542668d0f26
added new sync tool
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
34 | #include <time.h> |
0542668d0f26
added new sync tool
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
35 | #include <libxml/xmlerror.h> |
0542668d0f26
added new sync tool
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
36 | #include <sys/types.h> |
0542668d0f26
added new sync tool
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
37 | #include <ucx/string.h> |
52
91517b874a86
added conflict detection
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
51
diff
changeset
|
38 | #include <ucx/utils.h> |
46
0542668d0f26
added new sync tool
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
39 | #include <dirent.h> |
0542668d0f26
added new sync tool
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
40 | |
0542668d0f26
added new sync tool
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
41 | #include <libidav/webdav.h> |
0542668d0f26
added new sync tool
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
42 | #include <libidav/utils.h> |
0542668d0f26
added new sync tool
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
43 | |
0542668d0f26
added new sync tool
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
44 | #include "config.h" |
0542668d0f26
added new sync tool
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
45 | #include "scfg.h" |
0542668d0f26
added new sync tool
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
46 | #include "sopt.h" |
0542668d0f26
added new sync tool
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
47 | #include "db.h" |
0542668d0f26
added new sync tool
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
48 | |
0542668d0f26
added new sync tool
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
49 | #include "sync.h" |
53
ddc4efc9b0f8
added usage info and some options
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
52
diff
changeset
|
50 | #include "ucx/properties.h" |
46
0542668d0f26
added new sync tool
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
51 | |
0542668d0f26
added new sync tool
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
52 | static DavContext *ctx; |
0542668d0f26
added new sync tool
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
53 | |
0542668d0f26
added new sync tool
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
54 | static void xmlerrorfnc(void * c, const char * msg, ... ) { |
0542668d0f26
added new sync tool
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
55 | // nothing |
0542668d0f26
added new sync tool
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
56 | } |
0542668d0f26
added new sync tool
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
57 | |
0542668d0f26
added new sync tool
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
58 | int main(int argc, char **argv) { |
0542668d0f26
added new sync tool
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
59 | if(argc < 2) { |
0542668d0f26
added new sync tool
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
60 | fprintf(stderr, "Missing command\n"); |
0542668d0f26
added new sync tool
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
61 | print_usage(argv[0]); |
0542668d0f26
added new sync tool
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
62 | return -1; |
0542668d0f26
added new sync tool
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
63 | } |
0542668d0f26
added new sync tool
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
64 | |
0542668d0f26
added new sync tool
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
65 | char *cmd = argv[1]; |
0542668d0f26
added new sync tool
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
66 | CmdArgs *args = cmd_parse_args(argc - 2, argv + 2); |
0542668d0f26
added new sync tool
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
67 | if(!args) { |
0542668d0f26
added new sync tool
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
68 | print_usage(argv[0]); |
0542668d0f26
added new sync tool
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
69 | return -1; |
0542668d0f26
added new sync tool
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
70 | } |
0542668d0f26
added new sync tool
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
71 | |
0542668d0f26
added new sync tool
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
72 | xmlGenericErrorFunc fnc = xmlerrorfnc; |
0542668d0f26
added new sync tool
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
73 | initGenericErrorDefaultFunc(&fnc); |
0542668d0f26
added new sync tool
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
74 | ctx = dav_context_new(); |
0542668d0f26
added new sync tool
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
75 | load_config(ctx); |
54 | 76 | |
77 | // copy proxy config | |
78 | memcpy(ctx->http_proxy, get_http_proxy(), sizeof(Proxy)); | |
79 | memcpy(ctx->https_proxy, get_https_proxy(), sizeof(Proxy)); | |
80 | ||
46
0542668d0f26
added new sync tool
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
81 | if(load_sync_config()) { |
0542668d0f26
added new sync tool
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
82 | return EXIT_FAILURE; |
0542668d0f26
added new sync tool
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
83 | } |
0542668d0f26
added new sync tool
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
84 | |
0542668d0f26
added new sync tool
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
85 | int ret = EXIT_FAILURE; |
0542668d0f26
added new sync tool
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
86 | if(!strcmp(cmd, "pull")) { |
0542668d0f26
added new sync tool
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
87 | ret = cmd_pull(args); |
0542668d0f26
added new sync tool
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
88 | } else if(!strcmp(cmd, "push")) { |
47
fbbbeed4ba8f
added push command for dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
46
diff
changeset
|
89 | ret = cmd_push(args); |
46
0542668d0f26
added new sync tool
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
90 | } |
0542668d0f26
added new sync tool
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
91 | |
58
1708cba82ca3
added include / exclude patterns
Mike Becker <universe@uap-core.de>
parents:
57
diff
changeset
|
92 | // TODO: cleanup sync config (don't forget to call regfree for regex) |
1708cba82ca3
added include / exclude patterns
Mike Becker <universe@uap-core.de>
parents:
57
diff
changeset
|
93 | |
46
0542668d0f26
added new sync tool
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
94 | return ret; |
0542668d0f26
added new sync tool
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
95 | } |
0542668d0f26
added new sync tool
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
96 | |
0542668d0f26
added new sync tool
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
97 | void print_usage(char *cmd) { |
53
ddc4efc9b0f8
added usage info and some options
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
52
diff
changeset
|
98 | fprintf(stderr, "Usage: %s command [options] arguments...\n\n", cmd); |
46
0542668d0f26
added new sync tool
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
99 | |
53
ddc4efc9b0f8
added usage info and some options
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
52
diff
changeset
|
100 | fprintf(stderr, "Commands:\n"); |
ddc4efc9b0f8
added usage info and some options
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
52
diff
changeset
|
101 | fprintf(stderr, " pull [-c] <directory>\n"); |
ddc4efc9b0f8
added usage info and some options
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
52
diff
changeset
|
102 | fprintf(stderr, " push [-r] <directory>\n\n"); |
ddc4efc9b0f8
added usage info and some options
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
52
diff
changeset
|
103 | |
ddc4efc9b0f8
added usage info and some options
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
52
diff
changeset
|
104 | fprintf(stderr, "Options:\n"); |
ddc4efc9b0f8
added usage info and some options
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
52
diff
changeset
|
105 | fprintf(stderr, " -c Disable conflict detection\n"); |
ddc4efc9b0f8
added usage info and some options
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
52
diff
changeset
|
106 | fprintf(stderr, " -r Read changes from stdin\n\n"); |
46
0542668d0f26
added new sync tool
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
107 | } |
0542668d0f26
added new sync tool
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
108 | |
58
1708cba82ca3
added include / exclude patterns
Mike Becker <universe@uap-core.de>
parents:
57
diff
changeset
|
109 | static int res_matches_filter(SyncDirectory *dir, char *res_path) { |
65
d4077e8175f3
added optional trash for deleted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
64
diff
changeset
|
110 | // trash filter |
d4077e8175f3
added optional trash for deleted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
64
diff
changeset
|
111 | if (dir->trash) { |
d4077e8175f3
added optional trash for deleted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
64
diff
changeset
|
112 | sstr_t rpath = sstr(util_concat_path(dir->path, res_path)); |
d4077e8175f3
added optional trash for deleted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
64
diff
changeset
|
113 | if (sstrprefix(rpath, sstr(dir->trash))) { |
d4077e8175f3
added optional trash for deleted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
64
diff
changeset
|
114 | free(rpath.ptr); |
d4077e8175f3
added optional trash for deleted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
64
diff
changeset
|
115 | return 1; |
d4077e8175f3
added optional trash for deleted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
64
diff
changeset
|
116 | } |
d4077e8175f3
added optional trash for deleted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
64
diff
changeset
|
117 | free(rpath.ptr); |
d4077e8175f3
added optional trash for deleted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
64
diff
changeset
|
118 | } |
d4077e8175f3
added optional trash for deleted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
64
diff
changeset
|
119 | |
d4077e8175f3
added optional trash for deleted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
64
diff
changeset
|
120 | // include/exclude filter |
58
1708cba82ca3
added include / exclude patterns
Mike Becker <universe@uap-core.de>
parents:
57
diff
changeset
|
121 | UCX_FOREACH(inc, dir->include) { |
1708cba82ca3
added include / exclude patterns
Mike Becker <universe@uap-core.de>
parents:
57
diff
changeset
|
122 | regex_t* pattern = (regex_t*) inc->data; |
61
e9b102d5a6f6
fixed include/exclude filter for dav-sync
Mike Becker <universe@uap-core.de>
parents:
58
diff
changeset
|
123 | if (regexec(pattern, res_path, 0, NULL, 0) == 0) { |
e9b102d5a6f6
fixed include/exclude filter for dav-sync
Mike Becker <universe@uap-core.de>
parents:
58
diff
changeset
|
124 | UCX_FOREACH(exc, dir->exclude) { |
e9b102d5a6f6
fixed include/exclude filter for dav-sync
Mike Becker <universe@uap-core.de>
parents:
58
diff
changeset
|
125 | regex_t* pattern = (regex_t*) exc->data; |
e9b102d5a6f6
fixed include/exclude filter for dav-sync
Mike Becker <universe@uap-core.de>
parents:
58
diff
changeset
|
126 | if (regexec(pattern, res_path, 0, NULL, 0) == 0) { |
e9b102d5a6f6
fixed include/exclude filter for dav-sync
Mike Becker <universe@uap-core.de>
parents:
58
diff
changeset
|
127 | return 1; |
e9b102d5a6f6
fixed include/exclude filter for dav-sync
Mike Becker <universe@uap-core.de>
parents:
58
diff
changeset
|
128 | } |
e9b102d5a6f6
fixed include/exclude filter for dav-sync
Mike Becker <universe@uap-core.de>
parents:
58
diff
changeset
|
129 | } |
e9b102d5a6f6
fixed include/exclude filter for dav-sync
Mike Becker <universe@uap-core.de>
parents:
58
diff
changeset
|
130 | return 0; |
58
1708cba82ca3
added include / exclude patterns
Mike Becker <universe@uap-core.de>
parents:
57
diff
changeset
|
131 | } |
1708cba82ca3
added include / exclude patterns
Mike Becker <universe@uap-core.de>
parents:
57
diff
changeset
|
132 | } |
61
e9b102d5a6f6
fixed include/exclude filter for dav-sync
Mike Becker <universe@uap-core.de>
parents:
58
diff
changeset
|
133 | return 1; |
58
1708cba82ca3
added include / exclude patterns
Mike Becker <universe@uap-core.de>
parents:
57
diff
changeset
|
134 | } |
1708cba82ca3
added include / exclude patterns
Mike Becker <universe@uap-core.de>
parents:
57
diff
changeset
|
135 | |
73
41e88442ad4e
ssl version is now configurable
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
72
diff
changeset
|
136 | static DavSession* create_session(DavContext *ctx, Repository *repo, char *url) { |
41e88442ad4e
ssl version is now configurable
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
72
diff
changeset
|
137 | DavSession *sn = dav_session_new_auth( |
41e88442ad4e
ssl version is now configurable
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
72
diff
changeset
|
138 | ctx, |
41e88442ad4e
ssl version is now configurable
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
72
diff
changeset
|
139 | url, |
41e88442ad4e
ssl version is now configurable
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
72
diff
changeset
|
140 | repo->user, |
41e88442ad4e
ssl version is now configurable
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
72
diff
changeset
|
141 | repo->password); |
41e88442ad4e
ssl version is now configurable
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
72
diff
changeset
|
142 | curl_easy_setopt(sn->handle, CURLOPT_SSLVERSION, repo->ssl_version); |
41e88442ad4e
ssl version is now configurable
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
72
diff
changeset
|
143 | sn->flags = get_repository_flags(repo); |
41e88442ad4e
ssl version is now configurable
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
72
diff
changeset
|
144 | sn->key = dav_context_get_key(ctx, repo->default_key); |
41e88442ad4e
ssl version is now configurable
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
72
diff
changeset
|
145 | return sn; |
41e88442ad4e
ssl version is now configurable
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
72
diff
changeset
|
146 | } |
41e88442ad4e
ssl version is now configurable
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
72
diff
changeset
|
147 | |
46
0542668d0f26
added new sync tool
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
148 | int cmd_pull(CmdArgs *a) { |
0542668d0f26
added new sync tool
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
149 | if(a->argc != 1) { |
0542668d0f26
added new sync tool
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
150 | fprintf(stderr, "Too %s arguments\n", a->argc < 1 ? "few" : "many"); |
0542668d0f26
added new sync tool
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
151 | return -1; |
0542668d0f26
added new sync tool
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
152 | } |
0542668d0f26
added new sync tool
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
153 | |
0542668d0f26
added new sync tool
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
154 | SyncDirectory *dir = scfg_get_dir(a->argv[0]); |
0542668d0f26
added new sync tool
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
155 | if(!dir) { |
0542668d0f26
added new sync tool
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
156 | fprintf(stderr, "Unknown sync dir: %s\n", a->argv[0]); |
0542668d0f26
added new sync tool
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
157 | return -1; |
0542668d0f26
added new sync tool
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
158 | } |
0542668d0f26
added new sync tool
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
159 | |
0542668d0f26
added new sync tool
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
160 | Repository *repo = get_repository(sstr(dir->repository)); |
0542668d0f26
added new sync tool
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
161 | if(!repo) { |
0542668d0f26
added new sync tool
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
162 | fprintf(stderr, "Unkown repository %s\n", dir->name); |
0542668d0f26
added new sync tool
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
163 | return -1; |
0542668d0f26
added new sync tool
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
164 | } |
0542668d0f26
added new sync tool
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
165 | |
49
c5759ac76c1b
dav-sync detects locally removed files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
48
diff
changeset
|
166 | SyncDatabase *db = load_db(dir->database); |
46
0542668d0f26
added new sync tool
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
167 | if(!db) { |
0542668d0f26
added new sync tool
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
168 | fprintf(stderr, "Cannot load database file: %s\n", dir->database); |
0542668d0f26
added new sync tool
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
169 | return -1; |
0542668d0f26
added new sync tool
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
170 | } |
0542668d0f26
added new sync tool
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
171 | |
56
99f7816fcf01
added collection config for sync directories
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
55
diff
changeset
|
172 | char *new_url = NULL; |
99f7816fcf01
added collection config for sync directories
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
55
diff
changeset
|
173 | if(dir->collection) { |
99f7816fcf01
added collection config for sync directories
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
55
diff
changeset
|
174 | new_url = util_concat_path(repo->url, dir->collection); |
99f7816fcf01
added collection config for sync directories
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
55
diff
changeset
|
175 | } |
73
41e88442ad4e
ssl version is now configurable
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
72
diff
changeset
|
176 | DavSession *sn = create_session(ctx, repo, new_url ? new_url : repo->url); |
56
99f7816fcf01
added collection config for sync directories
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
55
diff
changeset
|
177 | if(new_url) { |
99f7816fcf01
added collection config for sync directories
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
55
diff
changeset
|
178 | free(new_url); |
99f7816fcf01
added collection config for sync directories
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
55
diff
changeset
|
179 | } |
68
f6d3db6113d3
added verbose option + encryption flag fixes
Mike Becker <universe@uap-core.de>
parents:
66
diff
changeset
|
180 | if (cmd_getoption(a, "verbose")) { |
f6d3db6113d3
added verbose option + encryption flag fixes
Mike Becker <universe@uap-core.de>
parents:
66
diff
changeset
|
181 | curl_easy_setopt(sn->handle, CURLOPT_VERBOSE, 1L); |
f6d3db6113d3
added verbose option + encryption flag fixes
Mike Becker <universe@uap-core.de>
parents:
66
diff
changeset
|
182 | curl_easy_setopt(sn->handle, CURLOPT_STDERR, stderr); |
f6d3db6113d3
added verbose option + encryption flag fixes
Mike Becker <universe@uap-core.de>
parents:
66
diff
changeset
|
183 | } |
46
0542668d0f26
added new sync tool
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
184 | |
144
c2c02c9b3be4
dav-sync detects broken uploads
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
135
diff
changeset
|
185 | DavResource *ls = dav_query(sn, "select D:getetag,idav:status from / with depth = infinity"); |
46
0542668d0f26
added new sync tool
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
186 | if(!ls) { |
0542668d0f26
added new sync tool
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
187 | fprintf(stderr, "Error\n"); |
0542668d0f26
added new sync tool
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
188 | // TODO: free |
0542668d0f26
added new sync tool
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
189 | return -1; |
0542668d0f26
added new sync tool
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
190 | } |
0542668d0f26
added new sync tool
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
191 | |
0542668d0f26
added new sync tool
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
192 | if(!ls->children) { |
0542668d0f26
added new sync tool
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
193 | // TODO: free |
0542668d0f26
added new sync tool
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
194 | return 0; // empty repository |
0542668d0f26
added new sync tool
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
195 | } |
50
9c486ea25161
dav-sync detects remote removed files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
49
diff
changeset
|
196 | |
9c486ea25161
dav-sync detects remote removed files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
49
diff
changeset
|
197 | UcxMap *svrres = ucx_map_new(db->resources->count); |
9c486ea25161
dav-sync detects remote removed files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
49
diff
changeset
|
198 | |
46
0542668d0f26
added new sync tool
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
199 | UcxList *stack = ucx_list_prepend(NULL, ls->children); |
0542668d0f26
added new sync tool
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
200 | while(stack) { |
0542668d0f26
added new sync tool
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
201 | DavResource *res = stack->data; |
0542668d0f26
added new sync tool
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
202 | stack = ucx_list_remove(stack, stack); |
49
c5759ac76c1b
dav-sync detects locally removed files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
48
diff
changeset
|
203 | |
58
1708cba82ca3
added include / exclude patterns
Mike Becker <universe@uap-core.de>
parents:
57
diff
changeset
|
204 | while(res) { |
1708cba82ca3
added include / exclude patterns
Mike Becker <universe@uap-core.de>
parents:
57
diff
changeset
|
205 | if (res_matches_filter(dir, res->path)) { |
1708cba82ca3
added include / exclude patterns
Mike Becker <universe@uap-core.de>
parents:
57
diff
changeset
|
206 | res = res->next; |
1708cba82ca3
added include / exclude patterns
Mike Becker <universe@uap-core.de>
parents:
57
diff
changeset
|
207 | continue; |
1708cba82ca3
added include / exclude patterns
Mike Becker <universe@uap-core.de>
parents:
57
diff
changeset
|
208 | } |
1708cba82ca3
added include / exclude patterns
Mike Becker <universe@uap-core.de>
parents:
57
diff
changeset
|
209 | |
144
c2c02c9b3be4
dav-sync detects broken uploads
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
135
diff
changeset
|
210 | char *status = dav_get_property(res, "idav:status"); |
c2c02c9b3be4
dav-sync detects broken uploads
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
135
diff
changeset
|
211 | if(status && !strcmp(status, "broken")) { |
c2c02c9b3be4
dav-sync detects broken uploads
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
135
diff
changeset
|
212 | res = res->next; |
c2c02c9b3be4
dav-sync detects broken uploads
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
135
diff
changeset
|
213 | continue; |
c2c02c9b3be4
dav-sync detects broken uploads
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
135
diff
changeset
|
214 | } |
c2c02c9b3be4
dav-sync detects broken uploads
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
135
diff
changeset
|
215 | |
50
9c486ea25161
dav-sync detects remote removed files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
49
diff
changeset
|
216 | // download the resource |
53
ddc4efc9b0f8
added usage info and some options
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
52
diff
changeset
|
217 | if(sync_get_resource(a, dir, res, db)) { |
46
0542668d0f26
added new sync tool
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
218 | fprintf(stderr, "sync_get_resource failed for resource: %s\n", res->path); |
0542668d0f26
added new sync tool
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
219 | } |
0542668d0f26
added new sync tool
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
220 | |
64
112dbf7ba8b0
changed sync behavior
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
61
diff
changeset
|
221 | // add every resource from the server to svrres |
112dbf7ba8b0
changed sync behavior
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
61
diff
changeset
|
222 | // then db-resources only contains resources which are not on the |
112dbf7ba8b0
changed sync behavior
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
61
diff
changeset
|
223 | // server |
50
9c486ea25161
dav-sync detects remote removed files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
49
diff
changeset
|
224 | LocalResource *local = ucx_map_cstr_get(db->resources, res->path); |
9c486ea25161
dav-sync detects remote removed files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
49
diff
changeset
|
225 | ucx_map_cstr_put(svrres, res->path, local); |
9c486ea25161
dav-sync detects remote removed files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
49
diff
changeset
|
226 | ucx_map_cstr_remove(db->resources, res->path); |
9c486ea25161
dav-sync detects remote removed files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
49
diff
changeset
|
227 | |
46
0542668d0f26
added new sync tool
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
228 | if(res->children) { |
0542668d0f26
added new sync tool
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
229 | stack = ucx_list_prepend(stack, res->children); |
0542668d0f26
added new sync tool
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
230 | } |
0542668d0f26
added new sync tool
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
231 | res = res->next; |
0542668d0f26
added new sync tool
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
232 | } |
0542668d0f26
added new sync tool
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
233 | } |
0542668d0f26
added new sync tool
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
234 | |
64
112dbf7ba8b0
changed sync behavior
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
61
diff
changeset
|
235 | // delete every remotely removed resource |
50
9c486ea25161
dav-sync detects remote removed files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
49
diff
changeset
|
236 | UcxMapIterator i = ucx_map_iterator(db->resources); |
9c486ea25161
dav-sync detects remote removed files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
49
diff
changeset
|
237 | LocalResource *local; |
9c486ea25161
dav-sync detects remote removed files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
49
diff
changeset
|
238 | UCX_MAP_FOREACH(key, local, i) { |
58
1708cba82ca3
added include / exclude patterns
Mike Becker <universe@uap-core.de>
parents:
57
diff
changeset
|
239 | if (res_matches_filter(dir, local->path)) { |
1708cba82ca3
added include / exclude patterns
Mike Becker <universe@uap-core.de>
parents:
57
diff
changeset
|
240 | continue; |
1708cba82ca3
added include / exclude patterns
Mike Becker <universe@uap-core.de>
parents:
57
diff
changeset
|
241 | } |
64
112dbf7ba8b0
changed sync behavior
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
61
diff
changeset
|
242 | // sync_remove_resource does all necessary tests |
65
d4077e8175f3
added optional trash for deleted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
64
diff
changeset
|
243 | sync_remove_local_resource(dir, local); |
50
9c486ea25161
dav-sync detects remote removed files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
49
diff
changeset
|
244 | } |
9c486ea25161
dav-sync detects remote removed files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
49
diff
changeset
|
245 | ucx_map_free(db->resources); |
9c486ea25161
dav-sync detects remote removed files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
49
diff
changeset
|
246 | db->resources = svrres; |
9c486ea25161
dav-sync detects remote removed files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
49
diff
changeset
|
247 | |
58
1708cba82ca3
added include / exclude patterns
Mike Becker <universe@uap-core.de>
parents:
57
diff
changeset
|
248 | // TODO: cleanup - BUT DONT CLEANUP SYNC CONFIG (do this in main!) |
47
fbbbeed4ba8f
added push command for dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
46
diff
changeset
|
249 | |
46
0542668d0f26
added new sync tool
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
250 | // store db |
47
fbbbeed4ba8f
added push command for dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
46
diff
changeset
|
251 | if(store_db(db, dir->database)) { |
fbbbeed4ba8f
added push command for dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
46
diff
changeset
|
252 | fprintf(stderr, "Cannot store sync db\n"); |
fbbbeed4ba8f
added push command for dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
46
diff
changeset
|
253 | return -1; |
fbbbeed4ba8f
added push command for dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
46
diff
changeset
|
254 | } |
46
0542668d0f26
added new sync tool
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
255 | |
0542668d0f26
added new sync tool
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
256 | return 0; |
0542668d0f26
added new sync tool
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
257 | } |
0542668d0f26
added new sync tool
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
258 | |
53
ddc4efc9b0f8
added usage info and some options
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
52
diff
changeset
|
259 | int sync_get_resource(CmdArgs *a, SyncDirectory *dir, DavResource *res, SyncDatabase *db) { |
64
112dbf7ba8b0
changed sync behavior
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
61
diff
changeset
|
260 | int cdt = cmd_getoption(a, "conflict") ? 0 : 1; // conflict detection |
51
e94bf8530d56
dav-sync deletes removed files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
50
diff
changeset
|
261 | |
49
c5759ac76c1b
dav-sync detects locally removed files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
48
diff
changeset
|
262 | LocalResource *local = ucx_map_cstr_get(db->resources, res->path); |
c5759ac76c1b
dav-sync detects locally removed files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
48
diff
changeset
|
263 | char *local_path = util_concat_path(dir->path, res->path); |
c5759ac76c1b
dav-sync detects locally removed files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
48
diff
changeset
|
264 | |
46
0542668d0f26
added new sync tool
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
265 | char *etag = dav_get_property(res, "D:getetag"); |
49
c5759ac76c1b
dav-sync detects locally removed files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
48
diff
changeset
|
266 | struct stat s; |
65
d4077e8175f3
added optional trash for deleted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
64
diff
changeset
|
267 | if(local) { |
d4077e8175f3
added optional trash for deleted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
64
diff
changeset
|
268 | int exists = 1; |
49
c5759ac76c1b
dav-sync detects locally removed files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
48
diff
changeset
|
269 | if(stat(local_path, &s)) { |
64
112dbf7ba8b0
changed sync behavior
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
61
diff
changeset
|
270 | // Ignore the fact, that the file is locally removed. If the |
112dbf7ba8b0
changed sync behavior
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
61
diff
changeset
|
271 | // server has an updated version, we readd the file or the |
112dbf7ba8b0
changed sync behavior
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
61
diff
changeset
|
272 | // next push will delete it on the server. |
112dbf7ba8b0
changed sync behavior
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
61
diff
changeset
|
273 | if(errno != ENOENT) { |
52
91517b874a86
added conflict detection
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
51
diff
changeset
|
274 | fprintf(stderr, "Cannot stat file: %s\n", local_path); |
49
c5759ac76c1b
dav-sync detects locally removed files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
48
diff
changeset
|
275 | free(local_path); |
c5759ac76c1b
dav-sync detects locally removed files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
48
diff
changeset
|
276 | return -1; |
65
d4077e8175f3
added optional trash for deleted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
64
diff
changeset
|
277 | } else { |
d4077e8175f3
added optional trash for deleted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
64
diff
changeset
|
278 | exists = 0; |
49
c5759ac76c1b
dav-sync detects locally removed files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
48
diff
changeset
|
279 | } |
c5759ac76c1b
dav-sync detects locally removed files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
48
diff
changeset
|
280 | } |
52
91517b874a86
added conflict detection
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
51
diff
changeset
|
281 | |
48
08d5544c92fb
fixed etag handling
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
47
diff
changeset
|
282 | if(local->etag) { |
08d5544c92fb
fixed etag handling
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
47
diff
changeset
|
283 | sstr_t e = sstr(etag); |
08d5544c92fb
fixed etag handling
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
47
diff
changeset
|
284 | if(sstrprefix(e, S("W/"))) { |
08d5544c92fb
fixed etag handling
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
47
diff
changeset
|
285 | e = sstrsubs(e, 2); |
08d5544c92fb
fixed etag handling
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
47
diff
changeset
|
286 | } |
08d5544c92fb
fixed etag handling
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
47
diff
changeset
|
287 | if(!strcmp(e.ptr, local->etag)) { |
08d5544c92fb
fixed etag handling
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
47
diff
changeset
|
288 | // resource is already up-to-date on the client |
08d5544c92fb
fixed etag handling
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
47
diff
changeset
|
289 | return 0; |
08d5544c92fb
fixed etag handling
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
47
diff
changeset
|
290 | } |
46
0542668d0f26
added new sync tool
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
291 | } |
52
91517b874a86
added conflict detection
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
51
diff
changeset
|
292 | |
65
d4077e8175f3
added optional trash for deleted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
64
diff
changeset
|
293 | if(cdt && exists && s.st_mtime != local->last_modified) { |
52
91517b874a86
added conflict detection
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
51
diff
changeset
|
294 | // file modified on the server and on the client |
91517b874a86
added conflict detection
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
51
diff
changeset
|
295 | rename_local_file(dir, db, local->path); |
91517b874a86
added conflict detection
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
51
diff
changeset
|
296 | } |
91517b874a86
added conflict detection
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
51
diff
changeset
|
297 | } else { |
91517b874a86
added conflict detection
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
51
diff
changeset
|
298 | if(stat(local_path, &s)) { |
91517b874a86
added conflict detection
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
51
diff
changeset
|
299 | if(errno != ENOENT) { |
91517b874a86
added conflict detection
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
51
diff
changeset
|
300 | fprintf(stderr, "Cannot stat file: %s\n", local_path); |
91517b874a86
added conflict detection
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
51
diff
changeset
|
301 | } |
64
112dbf7ba8b0
changed sync behavior
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
61
diff
changeset
|
302 | } else if(S_ISDIR(s.st_mode)) { |
112dbf7ba8b0
changed sync behavior
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
61
diff
changeset
|
303 | //fprintf(stderr, "Error: file %s is a directory\n", local_path); |
112dbf7ba8b0
changed sync behavior
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
61
diff
changeset
|
304 | } else if(cdt) { |
112dbf7ba8b0
changed sync behavior
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
61
diff
changeset
|
305 | // rename file on conflict |
52
91517b874a86
added conflict detection
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
51
diff
changeset
|
306 | rename_local_file(dir, db, res->path); |
91517b874a86
added conflict detection
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
51
diff
changeset
|
307 | } |
46
0542668d0f26
added new sync tool
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
308 | } |
52
91517b874a86
added conflict detection
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
51
diff
changeset
|
309 | |
46
0542668d0f26
added new sync tool
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
310 | int ret = 0; |
0542668d0f26
added new sync tool
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
311 | if(res->iscollection) { |
0542668d0f26
added new sync tool
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
312 | mode_t mode = S_IRWXU | S_IRGRP | S_IXGRP | S_IROTH | S_IXOTH; |
0542668d0f26
added new sync tool
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
313 | if(util_mkdir(local_path, mode) && errno != EEXIST) { |
0542668d0f26
added new sync tool
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
314 | ret = -1; |
0542668d0f26
added new sync tool
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
315 | } |
0542668d0f26
added new sync tool
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
316 | } else { |
72
aac29f2e8030
dav now opens files in binary mode
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
68
diff
changeset
|
317 | FILE *out = fopen(local_path, "wb"); |
46
0542668d0f26
added new sync tool
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
318 | if(!out) { |
52
91517b874a86
added conflict detection
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
51
diff
changeset
|
319 | fprintf(stderr, "Cannot open output file: %s\n", local_path); |
46
0542668d0f26
added new sync tool
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
320 | free(local_path); |
0542668d0f26
added new sync tool
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
321 | return -1; |
0542668d0f26
added new sync tool
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
322 | } |
52
91517b874a86
added conflict detection
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
51
diff
changeset
|
323 | printf("get: %s\n", res->path); |
46
0542668d0f26
added new sync tool
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
324 | if(dav_get_content(res, out, (dav_write_func)fwrite)) { |
0542668d0f26
added new sync tool
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
325 | ret = -1; |
0542668d0f26
added new sync tool
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
326 | } |
0542668d0f26
added new sync tool
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
327 | fclose(out); |
47
fbbbeed4ba8f
added push command for dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
46
diff
changeset
|
328 | |
52
91517b874a86
added conflict detection
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
51
diff
changeset
|
329 | if(stat(local_path, &s)) { |
91517b874a86
added conflict detection
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
51
diff
changeset
|
330 | fprintf(stderr, "Cannot stat file: %s\n", local_path); |
91517b874a86
added conflict detection
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
51
diff
changeset
|
331 | } |
91517b874a86
added conflict detection
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
51
diff
changeset
|
332 | |
47
fbbbeed4ba8f
added push command for dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
46
diff
changeset
|
333 | if(ret == 0) { |
fbbbeed4ba8f
added push command for dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
46
diff
changeset
|
334 | if(!local) { |
49
c5759ac76c1b
dav-sync detects locally removed files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
48
diff
changeset
|
335 | // new local resource |
47
fbbbeed4ba8f
added push command for dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
46
diff
changeset
|
336 | local = calloc(1, sizeof(LocalResource)); |
fbbbeed4ba8f
added push command for dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
46
diff
changeset
|
337 | local->path = strdup(res->path); |
49
c5759ac76c1b
dav-sync detects locally removed files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
48
diff
changeset
|
338 | ucx_map_cstr_put(db->resources, local->path, local); |
47
fbbbeed4ba8f
added push command for dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
46
diff
changeset
|
339 | } |
fbbbeed4ba8f
added push command for dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
46
diff
changeset
|
340 | |
fbbbeed4ba8f
added push command for dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
46
diff
changeset
|
341 | if(local->etag) { |
fbbbeed4ba8f
added push command for dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
46
diff
changeset
|
342 | free(local->etag); |
fbbbeed4ba8f
added push command for dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
46
diff
changeset
|
343 | } |
49
c5759ac76c1b
dav-sync detects locally removed files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
48
diff
changeset
|
344 | // set metadata from stat |
47
fbbbeed4ba8f
added push command for dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
46
diff
changeset
|
345 | local->etag = etag; |
54 | 346 | local->last_modified = s.st_mtime; |
47
fbbbeed4ba8f
added push command for dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
46
diff
changeset
|
347 | local->size = s.st_size; |
fbbbeed4ba8f
added push command for dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
46
diff
changeset
|
348 | } |
46
0542668d0f26
added new sync tool
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
349 | } |
0542668d0f26
added new sync tool
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
350 | |
0542668d0f26
added new sync tool
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
351 | free(local_path); |
0542668d0f26
added new sync tool
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
352 | return ret; |
0542668d0f26
added new sync tool
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
353 | } |
0542668d0f26
added new sync tool
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
354 | |
65
d4077e8175f3
added optional trash for deleted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
64
diff
changeset
|
355 | void sync_remove_local_resource(SyncDirectory *dir, LocalResource *res) { |
50
9c486ea25161
dav-sync detects remote removed files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
49
diff
changeset
|
356 | char *local_path = util_concat_path(dir->path, res->path); |
9c486ea25161
dav-sync detects remote removed files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
49
diff
changeset
|
357 | struct stat s; |
9c486ea25161
dav-sync detects remote removed files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
49
diff
changeset
|
358 | if(stat(local_path, &s)) { |
9c486ea25161
dav-sync detects remote removed files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
49
diff
changeset
|
359 | free(local_path); |
9c486ea25161
dav-sync detects remote removed files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
49
diff
changeset
|
360 | return; |
9c486ea25161
dav-sync detects remote removed files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
49
diff
changeset
|
361 | } |
9c486ea25161
dav-sync detects remote removed files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
49
diff
changeset
|
362 | |
54 | 363 | if(s.st_mtime != res->last_modified) { |
50
9c486ea25161
dav-sync detects remote removed files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
49
diff
changeset
|
364 | free(local_path); |
9c486ea25161
dav-sync detects remote removed files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
49
diff
changeset
|
365 | return; |
9c486ea25161
dav-sync detects remote removed files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
49
diff
changeset
|
366 | } |
9c486ea25161
dav-sync detects remote removed files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
49
diff
changeset
|
367 | |
9c486ea25161
dav-sync detects remote removed files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
49
diff
changeset
|
368 | printf("delete: %s\n", res->path); |
65
d4077e8175f3
added optional trash for deleted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
64
diff
changeset
|
369 | |
d4077e8175f3
added optional trash for deleted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
64
diff
changeset
|
370 | if(dir->trash) { |
d4077e8175f3
added optional trash for deleted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
64
diff
changeset
|
371 | move_to_trash(dir, local_path); |
d4077e8175f3
added optional trash for deleted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
64
diff
changeset
|
372 | } else if(unlink(local_path)) { |
50
9c486ea25161
dav-sync detects remote removed files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
49
diff
changeset
|
373 | fprintf(stderr, "Cannot remove file %s\n", local_path); |
9c486ea25161
dav-sync detects remote removed files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
49
diff
changeset
|
374 | } |
9c486ea25161
dav-sync detects remote removed files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
49
diff
changeset
|
375 | free(local_path); |
9c486ea25161
dav-sync detects remote removed files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
49
diff
changeset
|
376 | } |
9c486ea25161
dav-sync detects remote removed files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
49
diff
changeset
|
377 | |
52
91517b874a86
added conflict detection
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
51
diff
changeset
|
378 | void rename_local_file(SyncDirectory *dir, SyncDatabase *db, char *path) { |
91517b874a86
added conflict detection
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
51
diff
changeset
|
379 | char *local_path = util_concat_path(dir->path, path); |
91517b874a86
added conflict detection
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
51
diff
changeset
|
380 | char *parent = util_parent_path(local_path); |
91517b874a86
added conflict detection
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
51
diff
changeset
|
381 | |
91517b874a86
added conflict detection
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
51
diff
changeset
|
382 | int rev = 0; |
91517b874a86
added conflict detection
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
51
diff
changeset
|
383 | struct stat s; |
91517b874a86
added conflict detection
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
51
diff
changeset
|
384 | int loop = 1; |
91517b874a86
added conflict detection
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
51
diff
changeset
|
385 | do { |
91517b874a86
added conflict detection
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
51
diff
changeset
|
386 | sstr_t new_path = ucx_asprintf( |
91517b874a86
added conflict detection
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
51
diff
changeset
|
387 | ucx_default_allocator(), |
91517b874a86
added conflict detection
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
51
diff
changeset
|
388 | "%sorig.%d.%s", |
91517b874a86
added conflict detection
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
51
diff
changeset
|
389 | parent, |
91517b874a86
added conflict detection
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
51
diff
changeset
|
390 | rev, |
91517b874a86
added conflict detection
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
51
diff
changeset
|
391 | util_resource_name(path)); |
91517b874a86
added conflict detection
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
51
diff
changeset
|
392 | |
91517b874a86
added conflict detection
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
51
diff
changeset
|
393 | |
91517b874a86
added conflict detection
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
51
diff
changeset
|
394 | if(stat(new_path.ptr, &s)) { |
91517b874a86
added conflict detection
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
51
diff
changeset
|
395 | if(errno == ENOENT) { |
91517b874a86
added conflict detection
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
51
diff
changeset
|
396 | loop = 0; |
91517b874a86
added conflict detection
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
51
diff
changeset
|
397 | printf("conflict: %s\n", local_path); |
91517b874a86
added conflict detection
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
51
diff
changeset
|
398 | if(rename(local_path, new_path.ptr)) { |
65
d4077e8175f3
added optional trash for deleted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
64
diff
changeset
|
399 | //printf("errno: %d\n", errno); |
52
91517b874a86
added conflict detection
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
51
diff
changeset
|
400 | fprintf( |
91517b874a86
added conflict detection
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
51
diff
changeset
|
401 | stderr, |
91517b874a86
added conflict detection
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
51
diff
changeset
|
402 | "Cannot rename file %s to %s\n", |
91517b874a86
added conflict detection
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
51
diff
changeset
|
403 | local_path, |
91517b874a86
added conflict detection
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
51
diff
changeset
|
404 | new_path.ptr); |
91517b874a86
added conflict detection
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
51
diff
changeset
|
405 | } |
91517b874a86
added conflict detection
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
51
diff
changeset
|
406 | } |
91517b874a86
added conflict detection
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
51
diff
changeset
|
407 | } |
91517b874a86
added conflict detection
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
51
diff
changeset
|
408 | rev++; |
91517b874a86
added conflict detection
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
51
diff
changeset
|
409 | free(new_path.ptr); |
91517b874a86
added conflict detection
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
51
diff
changeset
|
410 | } while(loop); |
91517b874a86
added conflict detection
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
51
diff
changeset
|
411 | free(parent); |
91517b874a86
added conflict detection
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
51
diff
changeset
|
412 | } |
91517b874a86
added conflict detection
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
51
diff
changeset
|
413 | |
65
d4077e8175f3
added optional trash for deleted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
64
diff
changeset
|
414 | void move_to_trash(SyncDirectory *dir, char *path) { |
d4077e8175f3
added optional trash for deleted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
64
diff
changeset
|
415 | char *new_path = NULL; |
d4077e8175f3
added optional trash for deleted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
64
diff
changeset
|
416 | for (int i=0;;i++) { |
d4077e8175f3
added optional trash for deleted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
64
diff
changeset
|
417 | sstr_t np = ucx_asprintf( |
d4077e8175f3
added optional trash for deleted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
64
diff
changeset
|
418 | ucx_default_allocator(), |
d4077e8175f3
added optional trash for deleted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
64
diff
changeset
|
419 | "%s%d-%s", |
d4077e8175f3
added optional trash for deleted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
64
diff
changeset
|
420 | dir->trash, |
d4077e8175f3
added optional trash for deleted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
64
diff
changeset
|
421 | i, |
d4077e8175f3
added optional trash for deleted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
64
diff
changeset
|
422 | util_resource_name(path)); |
d4077e8175f3
added optional trash for deleted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
64
diff
changeset
|
423 | |
d4077e8175f3
added optional trash for deleted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
64
diff
changeset
|
424 | struct stat s; |
d4077e8175f3
added optional trash for deleted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
64
diff
changeset
|
425 | if(stat(np.ptr, &s)) { |
d4077e8175f3
added optional trash for deleted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
64
diff
changeset
|
426 | if(errno == ENOENT) { |
d4077e8175f3
added optional trash for deleted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
64
diff
changeset
|
427 | new_path = np.ptr; |
d4077e8175f3
added optional trash for deleted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
64
diff
changeset
|
428 | } |
d4077e8175f3
added optional trash for deleted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
64
diff
changeset
|
429 | break; |
d4077e8175f3
added optional trash for deleted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
64
diff
changeset
|
430 | } |
d4077e8175f3
added optional trash for deleted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
64
diff
changeset
|
431 | free(np.ptr); |
d4077e8175f3
added optional trash for deleted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
64
diff
changeset
|
432 | }; |
d4077e8175f3
added optional trash for deleted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
64
diff
changeset
|
433 | |
d4077e8175f3
added optional trash for deleted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
64
diff
changeset
|
434 | if(!new_path) { |
d4077e8175f3
added optional trash for deleted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
64
diff
changeset
|
435 | fprintf(stderr, "Cannot move file %s to trash.\n", path); |
d4077e8175f3
added optional trash for deleted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
64
diff
changeset
|
436 | return; |
d4077e8175f3
added optional trash for deleted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
64
diff
changeset
|
437 | } |
d4077e8175f3
added optional trash for deleted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
64
diff
changeset
|
438 | |
d4077e8175f3
added optional trash for deleted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
64
diff
changeset
|
439 | if(rename(path, new_path)) { |
d4077e8175f3
added optional trash for deleted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
64
diff
changeset
|
440 | //printf("errno: %d\n", errno); |
d4077e8175f3
added optional trash for deleted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
64
diff
changeset
|
441 | fprintf( |
d4077e8175f3
added optional trash for deleted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
64
diff
changeset
|
442 | stderr, |
d4077e8175f3
added optional trash for deleted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
64
diff
changeset
|
443 | "Cannot rename file %s to %s\n", |
d4077e8175f3
added optional trash for deleted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
64
diff
changeset
|
444 | path, |
d4077e8175f3
added optional trash for deleted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
64
diff
changeset
|
445 | new_path); |
d4077e8175f3
added optional trash for deleted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
64
diff
changeset
|
446 | } |
d4077e8175f3
added optional trash for deleted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
64
diff
changeset
|
447 | |
d4077e8175f3
added optional trash for deleted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
64
diff
changeset
|
448 | free(new_path); |
d4077e8175f3
added optional trash for deleted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
64
diff
changeset
|
449 | } |
d4077e8175f3
added optional trash for deleted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
64
diff
changeset
|
450 | |
46
0542668d0f26
added new sync tool
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
451 | int cmd_push(CmdArgs *a) { |
47
fbbbeed4ba8f
added push command for dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
46
diff
changeset
|
452 | if(a->argc != 1) { |
fbbbeed4ba8f
added push command for dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
46
diff
changeset
|
453 | fprintf(stderr, "Too %s arguments\n", a->argc < 1 ? "few" : "many"); |
fbbbeed4ba8f
added push command for dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
46
diff
changeset
|
454 | return -1; |
fbbbeed4ba8f
added push command for dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
46
diff
changeset
|
455 | } |
fbbbeed4ba8f
added push command for dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
46
diff
changeset
|
456 | |
fbbbeed4ba8f
added push command for dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
46
diff
changeset
|
457 | SyncDirectory *dir = scfg_get_dir(a->argv[0]); |
fbbbeed4ba8f
added push command for dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
46
diff
changeset
|
458 | if(!dir) { |
fbbbeed4ba8f
added push command for dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
46
diff
changeset
|
459 | fprintf(stderr, "Unknown sync dir: %s\n", a->argv[0]); |
fbbbeed4ba8f
added push command for dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
46
diff
changeset
|
460 | return -1; |
fbbbeed4ba8f
added push command for dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
46
diff
changeset
|
461 | } |
fbbbeed4ba8f
added push command for dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
46
diff
changeset
|
462 | |
fbbbeed4ba8f
added push command for dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
46
diff
changeset
|
463 | Repository *repo = get_repository(sstr(dir->repository)); |
fbbbeed4ba8f
added push command for dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
46
diff
changeset
|
464 | if(!repo) { |
fbbbeed4ba8f
added push command for dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
46
diff
changeset
|
465 | fprintf(stderr, "Unkown repository %s\n", dir->name); |
fbbbeed4ba8f
added push command for dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
46
diff
changeset
|
466 | return -1; |
fbbbeed4ba8f
added push command for dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
46
diff
changeset
|
467 | } |
fbbbeed4ba8f
added push command for dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
46
diff
changeset
|
468 | |
49
c5759ac76c1b
dav-sync detects locally removed files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
48
diff
changeset
|
469 | SyncDatabase *db = load_db(dir->database); |
47
fbbbeed4ba8f
added push command for dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
46
diff
changeset
|
470 | if(!db) { |
fbbbeed4ba8f
added push command for dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
46
diff
changeset
|
471 | fprintf(stderr, "Cannot load database file: %s\n", dir->database); |
fbbbeed4ba8f
added push command for dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
46
diff
changeset
|
472 | return -1; |
fbbbeed4ba8f
added push command for dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
46
diff
changeset
|
473 | } |
fbbbeed4ba8f
added push command for dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
46
diff
changeset
|
474 | |
56
99f7816fcf01
added collection config for sync directories
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
55
diff
changeset
|
475 | char *new_url = NULL; |
99f7816fcf01
added collection config for sync directories
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
55
diff
changeset
|
476 | if(dir->collection) { |
99f7816fcf01
added collection config for sync directories
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
55
diff
changeset
|
477 | new_url = util_concat_path(repo->url, dir->collection); |
99f7816fcf01
added collection config for sync directories
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
55
diff
changeset
|
478 | } |
73
41e88442ad4e
ssl version is now configurable
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
72
diff
changeset
|
479 | DavSession *sn = create_session(ctx, repo, new_url ? new_url : repo->url); |
56
99f7816fcf01
added collection config for sync directories
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
55
diff
changeset
|
480 | if(new_url) { |
99f7816fcf01
added collection config for sync directories
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
55
diff
changeset
|
481 | free(new_url); |
99f7816fcf01
added collection config for sync directories
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
55
diff
changeset
|
482 | } |
68
f6d3db6113d3
added verbose option + encryption flag fixes
Mike Becker <universe@uap-core.de>
parents:
66
diff
changeset
|
483 | if (cmd_getoption(a, "verbose")) { |
f6d3db6113d3
added verbose option + encryption flag fixes
Mike Becker <universe@uap-core.de>
parents:
66
diff
changeset
|
484 | curl_easy_setopt(sn->handle, CURLOPT_VERBOSE, 1L); |
f6d3db6113d3
added verbose option + encryption flag fixes
Mike Becker <universe@uap-core.de>
parents:
66
diff
changeset
|
485 | curl_easy_setopt(sn->handle, CURLOPT_STDERR, stderr); |
f6d3db6113d3
added verbose option + encryption flag fixes
Mike Becker <universe@uap-core.de>
parents:
66
diff
changeset
|
486 | } |
47
fbbbeed4ba8f
added push command for dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
46
diff
changeset
|
487 | |
51
e94bf8530d56
dav-sync deletes removed files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
50
diff
changeset
|
488 | // upload all changed files |
53
ddc4efc9b0f8
added usage info and some options
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
52
diff
changeset
|
489 | UcxList *resources = cmd_getoption(a, "read") ? |
ddc4efc9b0f8
added usage info and some options
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
52
diff
changeset
|
490 | read_changes(dir, db) : local_scan(dir, db); |
ddc4efc9b0f8
added usage info and some options
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
52
diff
changeset
|
491 | |
64
112dbf7ba8b0
changed sync behavior
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
61
diff
changeset
|
492 | UcxMap *lclres = ucx_map_new(db->resources->count); |
47
fbbbeed4ba8f
added push command for dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
46
diff
changeset
|
493 | UCX_FOREACH(elm, resources) { |
57 | 494 | LocalResource *local_res = elm->data; |
58
1708cba82ca3
added include / exclude patterns
Mike Becker <universe@uap-core.de>
parents:
57
diff
changeset
|
495 | if (!res_matches_filter(dir, local_res->path+1)) { |
64
112dbf7ba8b0
changed sync behavior
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
61
diff
changeset
|
496 | // upload every changed file |
112dbf7ba8b0
changed sync behavior
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
61
diff
changeset
|
497 | if (local_resource_is_changed(dir, db, local_res)) { |
112dbf7ba8b0
changed sync behavior
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
61
diff
changeset
|
498 | printf("put: %s\n", local_res->path); |
112dbf7ba8b0
changed sync behavior
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
61
diff
changeset
|
499 | DavResource *res = dav_resource_new(sn, local_res->path); |
112dbf7ba8b0
changed sync behavior
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
61
diff
changeset
|
500 | if(sync_put_resource(dir, res, local_res)) { |
112dbf7ba8b0
changed sync behavior
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
61
diff
changeset
|
501 | // TODO: I don't know what to do now |
112dbf7ba8b0
changed sync behavior
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
61
diff
changeset
|
502 | } |
112dbf7ba8b0
changed sync behavior
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
61
diff
changeset
|
503 | dav_resource_free(res); |
58
1708cba82ca3
added include / exclude patterns
Mike Becker <universe@uap-core.de>
parents:
57
diff
changeset
|
504 | } |
64
112dbf7ba8b0
changed sync behavior
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
61
diff
changeset
|
505 | |
112dbf7ba8b0
changed sync behavior
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
61
diff
changeset
|
506 | // remove every locally available resource from db->resource |
112dbf7ba8b0
changed sync behavior
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
61
diff
changeset
|
507 | // the remaining elements are all deleted files |
112dbf7ba8b0
changed sync behavior
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
61
diff
changeset
|
508 | ucx_map_cstr_put(lclres, local_res->path, local_res); |
112dbf7ba8b0
changed sync behavior
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
61
diff
changeset
|
509 | ucx_map_cstr_remove(db->resources, local_res->path); // TODO: element leaked |
57 | 510 | } |
47
fbbbeed4ba8f
added push command for dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
46
diff
changeset
|
511 | } |
fbbbeed4ba8f
added push command for dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
46
diff
changeset
|
512 | ucx_list_free(resources); |
fbbbeed4ba8f
added push command for dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
46
diff
changeset
|
513 | |
51
e94bf8530d56
dav-sync deletes removed files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
50
diff
changeset
|
514 | // delete all removed files |
64
112dbf7ba8b0
changed sync behavior
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
61
diff
changeset
|
515 | UcxMapIterator i = ucx_map_iterator(db->resources); |
51
e94bf8530d56
dav-sync deletes removed files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
50
diff
changeset
|
516 | LocalResource *local; |
e94bf8530d56
dav-sync deletes removed files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
50
diff
changeset
|
517 | UCX_MAP_FOREACH(key, local, i) { |
66 | 518 | if (!res_matches_filter(dir, local->path+1)) { |
519 | if(sync_delete_remote_resource(sn, local)) { | |
520 | ucx_map_cstr_put(lclres, local->path, local); | |
521 | } | |
51
e94bf8530d56
dav-sync deletes removed files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
50
diff
changeset
|
522 | } |
e94bf8530d56
dav-sync deletes removed files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
50
diff
changeset
|
523 | } |
64
112dbf7ba8b0
changed sync behavior
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
61
diff
changeset
|
524 | ucx_map_free(db->resources); |
112dbf7ba8b0
changed sync behavior
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
61
diff
changeset
|
525 | db->resources = lclres; |
51
e94bf8530d56
dav-sync deletes removed files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
50
diff
changeset
|
526 | |
e94bf8530d56
dav-sync deletes removed files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
50
diff
changeset
|
527 | // TODO: free res |
e94bf8530d56
dav-sync deletes removed files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
50
diff
changeset
|
528 | |
47
fbbbeed4ba8f
added push command for dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
46
diff
changeset
|
529 | // store db |
fbbbeed4ba8f
added push command for dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
46
diff
changeset
|
530 | if(store_db(db, dir->database)) { |
fbbbeed4ba8f
added push command for dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
46
diff
changeset
|
531 | fprintf(stderr, "Cannot store sync db\n"); |
fbbbeed4ba8f
added push command for dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
46
diff
changeset
|
532 | return -1; |
fbbbeed4ba8f
added push command for dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
46
diff
changeset
|
533 | } |
fbbbeed4ba8f
added push command for dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
46
diff
changeset
|
534 | |
46
0542668d0f26
added new sync tool
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
535 | return 0; |
0542668d0f26
added new sync tool
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
536 | } |
0542668d0f26
added new sync tool
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
537 | |
49
c5759ac76c1b
dav-sync detects locally removed files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
48
diff
changeset
|
538 | UcxList* local_scan(SyncDirectory *dir, SyncDatabase *db) { |
47
fbbbeed4ba8f
added push command for dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
46
diff
changeset
|
539 | UcxList *resources = NULL; |
fbbbeed4ba8f
added push command for dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
46
diff
changeset
|
540 | |
fbbbeed4ba8f
added push command for dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
46
diff
changeset
|
541 | char *path = strdup("/"); |
fbbbeed4ba8f
added push command for dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
46
diff
changeset
|
542 | UcxList *stack = ucx_list_prepend(NULL, path); |
fbbbeed4ba8f
added push command for dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
46
diff
changeset
|
543 | while(stack) { |
fbbbeed4ba8f
added push command for dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
46
diff
changeset
|
544 | // get a directory path from the stack and read all entries |
fbbbeed4ba8f
added push command for dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
46
diff
changeset
|
545 | // if an entry is a directory, put it on the stack |
fbbbeed4ba8f
added push command for dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
46
diff
changeset
|
546 | |
fbbbeed4ba8f
added push command for dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
46
diff
changeset
|
547 | char *p = stack->data; |
fbbbeed4ba8f
added push command for dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
46
diff
changeset
|
548 | stack = ucx_list_remove(stack, stack); |
fbbbeed4ba8f
added push command for dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
46
diff
changeset
|
549 | char *local_path = util_concat_path(dir->path, p); |
fbbbeed4ba8f
added push command for dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
46
diff
changeset
|
550 | DIR *local_dir = opendir(local_path); |
fbbbeed4ba8f
added push command for dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
46
diff
changeset
|
551 | |
fbbbeed4ba8f
added push command for dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
46
diff
changeset
|
552 | if(!local_dir) { |
fbbbeed4ba8f
added push command for dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
46
diff
changeset
|
553 | fprintf(stderr, "Cannot open directory %s\n", local_path); |
fbbbeed4ba8f
added push command for dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
46
diff
changeset
|
554 | } else { |
55
4cb389452a44
replaced readdir_r with readdir
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
54
diff
changeset
|
555 | struct dirent *ent; |
4cb389452a44
replaced readdir_r with readdir
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
54
diff
changeset
|
556 | while((ent = readdir(local_dir)) != NULL) { |
47
fbbbeed4ba8f
added push command for dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
46
diff
changeset
|
557 | if(!strcmp(ent->d_name, ".") || !strcmp(ent->d_name, "..")) { |
fbbbeed4ba8f
added push command for dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
46
diff
changeset
|
558 | continue; |
fbbbeed4ba8f
added push command for dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
46
diff
changeset
|
559 | } |
fbbbeed4ba8f
added push command for dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
46
diff
changeset
|
560 | |
fbbbeed4ba8f
added push command for dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
46
diff
changeset
|
561 | char *new_path = util_concat_path(p, ent->d_name); |
53
ddc4efc9b0f8
added usage info and some options
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
52
diff
changeset
|
562 | int isdir; |
64
112dbf7ba8b0
changed sync behavior
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
61
diff
changeset
|
563 | LocalResource *res = local_resource_new(dir, db, new_path, &isdir); |
53
ddc4efc9b0f8
added usage info and some options
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
52
diff
changeset
|
564 | if(isdir) { |
ddc4efc9b0f8
added usage info and some options
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
52
diff
changeset
|
565 | stack = ucx_list_prepend(stack, new_path); |
ddc4efc9b0f8
added usage info and some options
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
52
diff
changeset
|
566 | } else if(res) { |
57 | 567 | resources = ucx_list_append(resources, res); |
47
fbbbeed4ba8f
added push command for dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
46
diff
changeset
|
568 | free(new_path); |
fbbbeed4ba8f
added push command for dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
46
diff
changeset
|
569 | } else { |
53
ddc4efc9b0f8
added usage info and some options
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
52
diff
changeset
|
570 | free(new_path); |
47
fbbbeed4ba8f
added push command for dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
46
diff
changeset
|
571 | } |
fbbbeed4ba8f
added push command for dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
46
diff
changeset
|
572 | } |
fbbbeed4ba8f
added push command for dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
46
diff
changeset
|
573 | closedir(local_dir); |
55
4cb389452a44
replaced readdir_r with readdir
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
54
diff
changeset
|
574 | |
47
fbbbeed4ba8f
added push command for dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
46
diff
changeset
|
575 | } |
fbbbeed4ba8f
added push command for dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
46
diff
changeset
|
576 | free(local_path); |
fbbbeed4ba8f
added push command for dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
46
diff
changeset
|
577 | free(p); |
fbbbeed4ba8f
added push command for dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
46
diff
changeset
|
578 | } |
fbbbeed4ba8f
added push command for dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
46
diff
changeset
|
579 | |
fbbbeed4ba8f
added push command for dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
46
diff
changeset
|
580 | return resources; |
fbbbeed4ba8f
added push command for dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
46
diff
changeset
|
581 | } |
fbbbeed4ba8f
added push command for dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
46
diff
changeset
|
582 | |
53
ddc4efc9b0f8
added usage info and some options
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
52
diff
changeset
|
583 | UcxList* read_changes(SyncDirectory *dir, SyncDatabase *db) { |
ddc4efc9b0f8
added usage info and some options
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
52
diff
changeset
|
584 | UcxProperties *parser = ucx_properties_new(); |
ddc4efc9b0f8
added usage info and some options
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
52
diff
changeset
|
585 | parser->delimiter = ':'; |
ddc4efc9b0f8
added usage info and some options
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
52
diff
changeset
|
586 | |
ddc4efc9b0f8
added usage info and some options
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
52
diff
changeset
|
587 | UcxList *resources = NULL; |
ddc4efc9b0f8
added usage info and some options
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
52
diff
changeset
|
588 | sstr_t name; |
ddc4efc9b0f8
added usage info and some options
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
52
diff
changeset
|
589 | sstr_t value; |
ddc4efc9b0f8
added usage info and some options
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
52
diff
changeset
|
590 | |
ddc4efc9b0f8
added usage info and some options
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
52
diff
changeset
|
591 | char buf[STDIN_BUF_SIZE]; |
ddc4efc9b0f8
added usage info and some options
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
52
diff
changeset
|
592 | size_t r; |
ddc4efc9b0f8
added usage info and some options
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
52
diff
changeset
|
593 | while(!feof(stdin)) { |
ddc4efc9b0f8
added usage info and some options
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
52
diff
changeset
|
594 | r = fread(buf, 1, STDIN_BUF_SIZE, stdin); |
ddc4efc9b0f8
added usage info and some options
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
52
diff
changeset
|
595 | ucx_properties_fill(parser, buf, r); |
ddc4efc9b0f8
added usage info and some options
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
52
diff
changeset
|
596 | while(ucx_properties_next(parser, &name, &value)) { |
ddc4efc9b0f8
added usage info and some options
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
52
diff
changeset
|
597 | if(value.length == 0) { |
ddc4efc9b0f8
added usage info and some options
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
52
diff
changeset
|
598 | fprintf(stderr, "Wrong input\n"); |
ddc4efc9b0f8
added usage info and some options
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
52
diff
changeset
|
599 | continue; |
ddc4efc9b0f8
added usage info and some options
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
52
diff
changeset
|
600 | } |
ddc4efc9b0f8
added usage info and some options
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
52
diff
changeset
|
601 | if(value.ptr[0] == '"' |
ddc4efc9b0f8
added usage info and some options
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
52
diff
changeset
|
602 | && value.length > 2 |
ddc4efc9b0f8
added usage info and some options
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
52
diff
changeset
|
603 | && value.ptr[value.length - 1] == '"') |
ddc4efc9b0f8
added usage info and some options
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
52
diff
changeset
|
604 | { |
ddc4efc9b0f8
added usage info and some options
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
52
diff
changeset
|
605 | value.ptr[value.length - 1] = '\0'; |
ddc4efc9b0f8
added usage info and some options
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
52
diff
changeset
|
606 | value.ptr++; |
ddc4efc9b0f8
added usage info and some options
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
52
diff
changeset
|
607 | value.length -= 2; |
ddc4efc9b0f8
added usage info and some options
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
52
diff
changeset
|
608 | } |
ddc4efc9b0f8
added usage info and some options
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
52
diff
changeset
|
609 | value = sstrdup(value); |
ddc4efc9b0f8
added usage info and some options
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
52
diff
changeset
|
610 | |
ddc4efc9b0f8
added usage info and some options
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
52
diff
changeset
|
611 | if(!sstrcmp(name, S("put"))) { |
ddc4efc9b0f8
added usage info and some options
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
52
diff
changeset
|
612 | int isdir; |
64
112dbf7ba8b0
changed sync behavior
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
61
diff
changeset
|
613 | LocalResource *res = local_resource_new(dir, db, value.ptr, &isdir); |
53
ddc4efc9b0f8
added usage info and some options
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
52
diff
changeset
|
614 | if(res) { |
57 | 615 | resources = ucx_list_append(resources, res); |
53
ddc4efc9b0f8
added usage info and some options
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
52
diff
changeset
|
616 | } |
ddc4efc9b0f8
added usage info and some options
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
52
diff
changeset
|
617 | } else if(!sstrcmp(name, S("remove"))) { |
ddc4efc9b0f8
added usage info and some options
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
52
diff
changeset
|
618 | LocalResource *res = calloc(1, sizeof(LocalResource)); |
ddc4efc9b0f8
added usage info and some options
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
52
diff
changeset
|
619 | res->path = sstrdup(value).ptr; |
ddc4efc9b0f8
added usage info and some options
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
52
diff
changeset
|
620 | if(res) { |
ddc4efc9b0f8
added usage info and some options
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
52
diff
changeset
|
621 | ucx_map_sstr_put(db->remove, value, res); |
ddc4efc9b0f8
added usage info and some options
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
52
diff
changeset
|
622 | ucx_map_sstr_remove(db->resources, value); |
ddc4efc9b0f8
added usage info and some options
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
52
diff
changeset
|
623 | } |
ddc4efc9b0f8
added usage info and some options
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
52
diff
changeset
|
624 | |
ddc4efc9b0f8
added usage info and some options
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
52
diff
changeset
|
625 | } |
ddc4efc9b0f8
added usage info and some options
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
52
diff
changeset
|
626 | |
ddc4efc9b0f8
added usage info and some options
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
52
diff
changeset
|
627 | free(value.ptr); |
ddc4efc9b0f8
added usage info and some options
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
52
diff
changeset
|
628 | } |
ddc4efc9b0f8
added usage info and some options
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
52
diff
changeset
|
629 | } |
ddc4efc9b0f8
added usage info and some options
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
52
diff
changeset
|
630 | ucx_properties_free(parser); |
ddc4efc9b0f8
added usage info and some options
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
52
diff
changeset
|
631 | |
ddc4efc9b0f8
added usage info and some options
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
52
diff
changeset
|
632 | return resources; |
ddc4efc9b0f8
added usage info and some options
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
52
diff
changeset
|
633 | } |
ddc4efc9b0f8
added usage info and some options
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
52
diff
changeset
|
634 | |
64
112dbf7ba8b0
changed sync behavior
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
61
diff
changeset
|
635 | LocalResource* local_resource_new(SyncDirectory *dir, SyncDatabase *db, char *path, int *isdir) { |
53
ddc4efc9b0f8
added usage info and some options
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
52
diff
changeset
|
636 | char *file_path = util_concat_path(dir->path, path); |
ddc4efc9b0f8
added usage info and some options
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
52
diff
changeset
|
637 | struct stat s; |
ddc4efc9b0f8
added usage info and some options
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
52
diff
changeset
|
638 | if(stat(file_path, &s)) { |
ddc4efc9b0f8
added usage info and some options
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
52
diff
changeset
|
639 | fprintf(stderr, "Cannot stat file %s\n", file_path); |
ddc4efc9b0f8
added usage info and some options
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
52
diff
changeset
|
640 | free(file_path); |
ddc4efc9b0f8
added usage info and some options
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
52
diff
changeset
|
641 | return NULL; |
ddc4efc9b0f8
added usage info and some options
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
52
diff
changeset
|
642 | } |
ddc4efc9b0f8
added usage info and some options
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
52
diff
changeset
|
643 | free(file_path); |
ddc4efc9b0f8
added usage info and some options
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
52
diff
changeset
|
644 | |
ddc4efc9b0f8
added usage info and some options
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
52
diff
changeset
|
645 | if(!S_ISDIR(s.st_mode)) { |
ddc4efc9b0f8
added usage info and some options
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
52
diff
changeset
|
646 | *isdir = 0; |
64
112dbf7ba8b0
changed sync behavior
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
61
diff
changeset
|
647 | LocalResource *res = calloc(1, sizeof(LocalResource)); |
112dbf7ba8b0
changed sync behavior
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
61
diff
changeset
|
648 | res->path = strdup(path); |
112dbf7ba8b0
changed sync behavior
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
61
diff
changeset
|
649 | res->etag = NULL; |
112dbf7ba8b0
changed sync behavior
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
61
diff
changeset
|
650 | res->last_modified = s.st_mtime; |
112dbf7ba8b0
changed sync behavior
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
61
diff
changeset
|
651 | res->size = s.st_size; |
112dbf7ba8b0
changed sync behavior
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
61
diff
changeset
|
652 | return res; |
53
ddc4efc9b0f8
added usage info and some options
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
52
diff
changeset
|
653 | } else { |
ddc4efc9b0f8
added usage info and some options
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
52
diff
changeset
|
654 | *isdir = 1; |
ddc4efc9b0f8
added usage info and some options
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
52
diff
changeset
|
655 | } |
ddc4efc9b0f8
added usage info and some options
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
52
diff
changeset
|
656 | return NULL; |
ddc4efc9b0f8
added usage info and some options
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
52
diff
changeset
|
657 | } |
ddc4efc9b0f8
added usage info and some options
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
52
diff
changeset
|
658 | |
64
112dbf7ba8b0
changed sync behavior
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
61
diff
changeset
|
659 | int local_resource_is_changed(SyncDirectory *dir, SyncDatabase *db, LocalResource *res) { |
112dbf7ba8b0
changed sync behavior
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
61
diff
changeset
|
660 | LocalResource *db_res = ucx_map_cstr_get(db->resources, res->path); |
112dbf7ba8b0
changed sync behavior
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
61
diff
changeset
|
661 | if(db_res) { |
112dbf7ba8b0
changed sync behavior
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
61
diff
changeset
|
662 | if(db_res->etag) { |
112dbf7ba8b0
changed sync behavior
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
61
diff
changeset
|
663 | res->etag = strdup(db_res->etag); |
112dbf7ba8b0
changed sync behavior
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
61
diff
changeset
|
664 | } |
112dbf7ba8b0
changed sync behavior
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
61
diff
changeset
|
665 | |
112dbf7ba8b0
changed sync behavior
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
61
diff
changeset
|
666 | if(db_res->last_modified == res->last_modified && db_res->size == res->size) { |
112dbf7ba8b0
changed sync behavior
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
61
diff
changeset
|
667 | return 0; |
112dbf7ba8b0
changed sync behavior
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
61
diff
changeset
|
668 | } |
112dbf7ba8b0
changed sync behavior
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
61
diff
changeset
|
669 | } |
112dbf7ba8b0
changed sync behavior
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
61
diff
changeset
|
670 | return 1; |
112dbf7ba8b0
changed sync behavior
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
61
diff
changeset
|
671 | } |
112dbf7ba8b0
changed sync behavior
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
61
diff
changeset
|
672 | |
112dbf7ba8b0
changed sync behavior
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
61
diff
changeset
|
673 | |
144
c2c02c9b3be4
dav-sync detects broken uploads
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
135
diff
changeset
|
674 | int sync_set_status(DavResource *res, char *status) { |
c2c02c9b3be4
dav-sync detects broken uploads
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
135
diff
changeset
|
675 | DavResource *resource = dav_resource_new(res->session, res->path); |
c2c02c9b3be4
dav-sync detects broken uploads
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
135
diff
changeset
|
676 | dav_set_property(resource, "idav:status", status); |
c2c02c9b3be4
dav-sync detects broken uploads
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
135
diff
changeset
|
677 | int ret = dav_store(resource); |
c2c02c9b3be4
dav-sync detects broken uploads
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
135
diff
changeset
|
678 | dav_resource_free(resource); |
c2c02c9b3be4
dav-sync detects broken uploads
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
135
diff
changeset
|
679 | return ret; |
c2c02c9b3be4
dav-sync detects broken uploads
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
135
diff
changeset
|
680 | } |
c2c02c9b3be4
dav-sync detects broken uploads
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
135
diff
changeset
|
681 | |
c2c02c9b3be4
dav-sync detects broken uploads
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
135
diff
changeset
|
682 | int sync_remove_status(DavResource *res) { |
c2c02c9b3be4
dav-sync detects broken uploads
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
135
diff
changeset
|
683 | DavResource *resource = dav_resource_new(res->session, res->path); |
c2c02c9b3be4
dav-sync detects broken uploads
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
135
diff
changeset
|
684 | dav_remove_property(resource, "idav:status"); |
c2c02c9b3be4
dav-sync detects broken uploads
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
135
diff
changeset
|
685 | int ret = dav_store(resource); |
c2c02c9b3be4
dav-sync detects broken uploads
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
135
diff
changeset
|
686 | dav_resource_free(resource); |
c2c02c9b3be4
dav-sync detects broken uploads
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
135
diff
changeset
|
687 | return ret; |
c2c02c9b3be4
dav-sync detects broken uploads
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
135
diff
changeset
|
688 | } |
c2c02c9b3be4
dav-sync detects broken uploads
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
135
diff
changeset
|
689 | |
64
112dbf7ba8b0
changed sync behavior
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
61
diff
changeset
|
690 | int sync_put_resource(SyncDirectory *dir, DavResource *res, LocalResource *local) { |
47
fbbbeed4ba8f
added push command for dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
46
diff
changeset
|
691 | char *local_path = util_concat_path(dir->path, res->path); |
144
c2c02c9b3be4
dav-sync detects broken uploads
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
135
diff
changeset
|
692 | |
c2c02c9b3be4
dav-sync detects broken uploads
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
135
diff
changeset
|
693 | struct stat s; |
c2c02c9b3be4
dav-sync detects broken uploads
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
135
diff
changeset
|
694 | if(stat(local_path, &s)) { |
c2c02c9b3be4
dav-sync detects broken uploads
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
135
diff
changeset
|
695 | fprintf(stderr, "cannot stat file: %s\n", local_path); |
c2c02c9b3be4
dav-sync detects broken uploads
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
135
diff
changeset
|
696 | perror(""); |
c2c02c9b3be4
dav-sync detects broken uploads
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
135
diff
changeset
|
697 | free(local_path); |
c2c02c9b3be4
dav-sync detects broken uploads
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
135
diff
changeset
|
698 | return -1; |
c2c02c9b3be4
dav-sync detects broken uploads
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
135
diff
changeset
|
699 | } |
c2c02c9b3be4
dav-sync detects broken uploads
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
135
diff
changeset
|
700 | |
72
aac29f2e8030
dav now opens files in binary mode
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
68
diff
changeset
|
701 | FILE *in = fopen(local_path, "rb"); |
47
fbbbeed4ba8f
added push command for dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
46
diff
changeset
|
702 | if(!in) { |
fbbbeed4ba8f
added push command for dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
46
diff
changeset
|
703 | fprintf(stderr, "Cannot open file %s\n", local_path); |
fbbbeed4ba8f
added push command for dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
46
diff
changeset
|
704 | free(local_path); |
fbbbeed4ba8f
added push command for dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
46
diff
changeset
|
705 | return -1; |
fbbbeed4ba8f
added push command for dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
46
diff
changeset
|
706 | } |
fbbbeed4ba8f
added push command for dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
46
diff
changeset
|
707 | |
fbbbeed4ba8f
added push command for dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
46
diff
changeset
|
708 | dav_set_content(res, in, (dav_read_func)fread); |
fbbbeed4ba8f
added push command for dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
46
diff
changeset
|
709 | |
fbbbeed4ba8f
added push command for dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
46
diff
changeset
|
710 | int ret = -1; |
144
c2c02c9b3be4
dav-sync detects broken uploads
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
135
diff
changeset
|
711 | int created = 0; |
c2c02c9b3be4
dav-sync detects broken uploads
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
135
diff
changeset
|
712 | for(int i=0;i<dir->max_retry;i++) { |
c2c02c9b3be4
dav-sync detects broken uploads
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
135
diff
changeset
|
713 | if(!created && dav_create(res)) { |
c2c02c9b3be4
dav-sync detects broken uploads
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
135
diff
changeset
|
714 | continue; |
47
fbbbeed4ba8f
added push command for dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
46
diff
changeset
|
715 | } |
144
c2c02c9b3be4
dav-sync detects broken uploads
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
135
diff
changeset
|
716 | created = 1; |
47
fbbbeed4ba8f
added push command for dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
46
diff
changeset
|
717 | if(dav_store(res)) { |
144
c2c02c9b3be4
dav-sync detects broken uploads
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
135
diff
changeset
|
718 | continue; |
47
fbbbeed4ba8f
added push command for dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
46
diff
changeset
|
719 | } |
fbbbeed4ba8f
added push command for dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
46
diff
changeset
|
720 | ret = 0; |
fbbbeed4ba8f
added push command for dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
46
diff
changeset
|
721 | break; |
fbbbeed4ba8f
added push command for dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
46
diff
changeset
|
722 | } |
fbbbeed4ba8f
added push command for dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
46
diff
changeset
|
723 | |
144
c2c02c9b3be4
dav-sync detects broken uploads
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
135
diff
changeset
|
724 | |
c2c02c9b3be4
dav-sync detects broken uploads
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
135
diff
changeset
|
725 | |
64
112dbf7ba8b0
changed sync behavior
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
61
diff
changeset
|
726 | if(ret == 0) { |
144
c2c02c9b3be4
dav-sync detects broken uploads
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
135
diff
changeset
|
727 | // check contentlength and get new etag |
48
08d5544c92fb
fixed etag handling
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
47
diff
changeset
|
728 | DavResource *up_res = dav_get(res->session, res->path, "D:getetag"); |
08d5544c92fb
fixed etag handling
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
47
diff
changeset
|
729 | |
144
c2c02c9b3be4
dav-sync detects broken uploads
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
135
diff
changeset
|
730 | if(up_res) { |
c2c02c9b3be4
dav-sync detects broken uploads
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
135
diff
changeset
|
731 | // the new content length must be equal or greater than the file size |
c2c02c9b3be4
dav-sync detects broken uploads
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
135
diff
changeset
|
732 | if(up_res->contentlength < s.st_size) { |
c2c02c9b3be4
dav-sync detects broken uploads
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
135
diff
changeset
|
733 | fprintf(stderr, "Incomplete Upload: %s", local_path); |
c2c02c9b3be4
dav-sync detects broken uploads
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
135
diff
changeset
|
734 | ret = -1; |
c2c02c9b3be4
dav-sync detects broken uploads
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
135
diff
changeset
|
735 | // try to set the resource status to 'broken' |
c2c02c9b3be4
dav-sync detects broken uploads
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
135
diff
changeset
|
736 | sync_set_status(res, "broken"); |
c2c02c9b3be4
dav-sync detects broken uploads
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
135
diff
changeset
|
737 | } else { |
c2c02c9b3be4
dav-sync detects broken uploads
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
135
diff
changeset
|
738 | // everything seems fine, we can update the local resource |
c2c02c9b3be4
dav-sync detects broken uploads
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
135
diff
changeset
|
739 | char *etag = dav_get_property(up_res, "D:getetag"); |
c2c02c9b3be4
dav-sync detects broken uploads
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
135
diff
changeset
|
740 | if(etag) { |
c2c02c9b3be4
dav-sync detects broken uploads
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
135
diff
changeset
|
741 | if(strlen(etag) > 2 && etag[0] == 'W' && etag[1] == '/') { |
c2c02c9b3be4
dav-sync detects broken uploads
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
135
diff
changeset
|
742 | etag = etag + 2; |
c2c02c9b3be4
dav-sync detects broken uploads
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
135
diff
changeset
|
743 | } |
c2c02c9b3be4
dav-sync detects broken uploads
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
135
diff
changeset
|
744 | } |
c2c02c9b3be4
dav-sync detects broken uploads
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
135
diff
changeset
|
745 | |
c2c02c9b3be4
dav-sync detects broken uploads
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
135
diff
changeset
|
746 | if(local->etag) { |
c2c02c9b3be4
dav-sync detects broken uploads
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
135
diff
changeset
|
747 | free(local->etag); |
c2c02c9b3be4
dav-sync detects broken uploads
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
135
diff
changeset
|
748 | } |
c2c02c9b3be4
dav-sync detects broken uploads
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
135
diff
changeset
|
749 | |
c2c02c9b3be4
dav-sync detects broken uploads
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
135
diff
changeset
|
750 | if(etag) { |
c2c02c9b3be4
dav-sync detects broken uploads
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
135
diff
changeset
|
751 | local->etag = strdup(etag); |
c2c02c9b3be4
dav-sync detects broken uploads
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
135
diff
changeset
|
752 | } else { |
c2c02c9b3be4
dav-sync detects broken uploads
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
135
diff
changeset
|
753 | local->etag = NULL; |
c2c02c9b3be4
dav-sync detects broken uploads
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
135
diff
changeset
|
754 | } |
c2c02c9b3be4
dav-sync detects broken uploads
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
135
diff
changeset
|
755 | dav_resource_free(up_res); |
c2c02c9b3be4
dav-sync detects broken uploads
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
135
diff
changeset
|
756 | |
c2c02c9b3be4
dav-sync detects broken uploads
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
135
diff
changeset
|
757 | sync_remove_status(res); |
c2c02c9b3be4
dav-sync detects broken uploads
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
135
diff
changeset
|
758 | } |
64
112dbf7ba8b0
changed sync behavior
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
61
diff
changeset
|
759 | } |
144
c2c02c9b3be4
dav-sync detects broken uploads
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
135
diff
changeset
|
760 | } else { |
c2c02c9b3be4
dav-sync detects broken uploads
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
135
diff
changeset
|
761 | ret = -1; |
c2c02c9b3be4
dav-sync detects broken uploads
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
135
diff
changeset
|
762 | sync_set_status(res, "broken"); |
47
fbbbeed4ba8f
added push command for dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
46
diff
changeset
|
763 | } |
fbbbeed4ba8f
added push command for dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
46
diff
changeset
|
764 | |
fbbbeed4ba8f
added push command for dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
46
diff
changeset
|
765 | fclose(in); |
144
c2c02c9b3be4
dav-sync detects broken uploads
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
135
diff
changeset
|
766 | free(local_path); |
47
fbbbeed4ba8f
added push command for dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
46
diff
changeset
|
767 | |
64
112dbf7ba8b0
changed sync behavior
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
61
diff
changeset
|
768 | return ret; |
47
fbbbeed4ba8f
added push command for dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
46
diff
changeset
|
769 | } |
fbbbeed4ba8f
added push command for dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
46
diff
changeset
|
770 | |
65
d4077e8175f3
added optional trash for deleted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
64
diff
changeset
|
771 | int sync_delete_remote_resource(DavSession *sn, LocalResource *local_res) { |
d4077e8175f3
added optional trash for deleted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
64
diff
changeset
|
772 | DavResource *res = dav_get(sn, local_res->path, "D:getetag"); |
d4077e8175f3
added optional trash for deleted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
64
diff
changeset
|
773 | if(!res) { |
d4077e8175f3
added optional trash for deleted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
64
diff
changeset
|
774 | return sn->error == DAV_NOT_FOUND ? 0 : 1; |
d4077e8175f3
added optional trash for deleted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
64
diff
changeset
|
775 | } |
d4077e8175f3
added optional trash for deleted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
64
diff
changeset
|
776 | |
d4077e8175f3
added optional trash for deleted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
64
diff
changeset
|
777 | char *etag = dav_get_property(res, "D:getetag"); |
d4077e8175f3
added optional trash for deleted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
64
diff
changeset
|
778 | if(etag) { |
d4077e8175f3
added optional trash for deleted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
64
diff
changeset
|
779 | if(strlen(etag) > 2 && etag[0] == 'W' && etag[1] == '/') { |
d4077e8175f3
added optional trash for deleted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
64
diff
changeset
|
780 | etag = etag + 2; |
d4077e8175f3
added optional trash for deleted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
64
diff
changeset
|
781 | } |
d4077e8175f3
added optional trash for deleted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
64
diff
changeset
|
782 | } |
d4077e8175f3
added optional trash for deleted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
64
diff
changeset
|
783 | |
d4077e8175f3
added optional trash for deleted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
64
diff
changeset
|
784 | int ret = 0; |
66 | 785 | if(etag && !strcmp(etag, local_res->etag)) { |
65
d4077e8175f3
added optional trash for deleted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
64
diff
changeset
|
786 | // local resource metadata == remote resource metadata |
d4077e8175f3
added optional trash for deleted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
64
diff
changeset
|
787 | // resource can be deleted |
d4077e8175f3
added optional trash for deleted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
64
diff
changeset
|
788 | printf("delete: %s\n", res->path); |
d4077e8175f3
added optional trash for deleted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
64
diff
changeset
|
789 | if(dav_delete(res)) { |
d4077e8175f3
added optional trash for deleted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
64
diff
changeset
|
790 | if(sn->error != DAV_NOT_FOUND) { |
d4077e8175f3
added optional trash for deleted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
64
diff
changeset
|
791 | fprintf(stderr, "Cannot delete resource %s\n", res->path); |
d4077e8175f3
added optional trash for deleted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
64
diff
changeset
|
792 | } |
d4077e8175f3
added optional trash for deleted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
64
diff
changeset
|
793 | } |
d4077e8175f3
added optional trash for deleted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
64
diff
changeset
|
794 | } else { |
d4077e8175f3
added optional trash for deleted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
64
diff
changeset
|
795 | ret = 1; |
d4077e8175f3
added optional trash for deleted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
64
diff
changeset
|
796 | } |
d4077e8175f3
added optional trash for deleted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
64
diff
changeset
|
797 | |
d4077e8175f3
added optional trash for deleted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
64
diff
changeset
|
798 | // cleanup |
d4077e8175f3
added optional trash for deleted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
64
diff
changeset
|
799 | dav_resource_free(res); |
d4077e8175f3
added optional trash for deleted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
64
diff
changeset
|
800 | |
d4077e8175f3
added optional trash for deleted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
64
diff
changeset
|
801 | return ret; |
d4077e8175f3
added optional trash for deleted files
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
64
diff
changeset
|
802 | } |
47
fbbbeed4ba8f
added push command for dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
46
diff
changeset
|
803 | |
fbbbeed4ba8f
added push command for dav-sync
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
46
diff
changeset
|
804 | |
46
0542668d0f26
added new sync tool
Olaf Wintermann <olaf.wintermann@gmail.com>
parents:
diff
changeset
|
805 |