882 break; |
882 break; |
883 } |
883 } |
884 } |
884 } |
885 |
885 |
886 // check if extended attributes have changed |
886 // check if extended attributes have changed |
887 if(dir->metadata & FINFO_XATTR == FINFO_XATTR) { |
887 if((dir->metadata & FINFO_XATTR) == FINFO_XATTR) { |
888 DavXmlNode *xattr = dav_get_property_ns(res, DAV_NS, "xattributes"); |
888 DavXmlNode *xattr = dav_get_property_ns(res, DAV_NS, "xattributes"); |
889 char *xattr_hash = get_xattr_hash(xattr); |
889 char *xattr_hash = get_xattr_hash(xattr); |
890 if(nullstrcmp(xattr_hash, local->xattr_hash)) { |
890 if(nullstrcmp(xattr_hash, local->xattr_hash)) { |
891 ret = REMOTE_CHANGE_METADATA; |
891 ret = REMOTE_CHANGE_METADATA; |
892 break; |
892 break; |
893 } |
893 } |
894 } |
894 } |
895 |
895 |
896 // check if finfo has changed |
896 // check if finfo has changed |
897 DavXmlNode *finfo = dav_get_property_ns(res, DAV_NS, "finfo"); |
897 DavXmlNode *finfo = dav_get_property_ns(res, DAV_NS, "finfo"); |
898 if(dir->metadata & FINFO_MODE == FINFO_MODE) { |
898 if((dir->metadata & FINFO_MODE) == FINFO_MODE) { |
899 FileInfo f; |
899 FileInfo f; |
900 finfo_get_values(finfo, &f); |
900 finfo_get_values(finfo, &f); |
901 if(f.mode_set && f.mode != local->mode) { |
901 if(f.mode_set && f.mode != local->mode) { |
902 ret = REMOTE_CHANGE_METADATA; |
902 ret = REMOTE_CHANGE_METADATA; |
903 break; |
903 break; |
1979 res->tags_updated = 1; // tags removed |
1979 res->tags_updated = 1; // tags removed |
1980 } |
1980 } |
1981 res->metadata_updated = res->tags_updated; |
1981 res->metadata_updated = res->tags_updated; |
1982 } |
1982 } |
1983 |
1983 |
1984 if(dir->metadata & FINFO_MODE == FINFO_MODE) { |
1984 if((dir->metadata & FINFO_MODE) == FINFO_MODE) { |
1985 if(db_res->mode != res->mode) { |
1985 if(db_res->mode != res->mode) { |
1986 res->finfo_updated = 1; |
1986 res->finfo_updated = 1; |
1987 res->metadata_updated = 1; |
1987 res->metadata_updated = 1; |
1988 } |
1988 } |
1989 } |
1989 } |
1990 if(dir->metadata & FINFO_OWNER == FINFO_OWNER) { |
1990 if((dir->metadata & FINFO_OWNER) == FINFO_OWNER) { |
1991 if(db_res->uid != res->uid || db_res->gid != res->gid) { |
1991 if(db_res->uid != res->uid || db_res->gid != res->gid) { |
1992 res->finfo_updated = 1; |
1992 res->finfo_updated = 1; |
1993 res->metadata_updated = 1; |
1993 res->metadata_updated = 1; |
1994 } |
1994 } |
1995 } |
1995 } |
1996 |
1996 |
1997 if(dir->metadata & FINFO_XATTR == FINFO_XATTR) { |
1997 if((dir->metadata & FINFO_XATTR) == FINFO_XATTR) { |
1998 char *path = util_concat_path(dir->path, db_res->path); |
1998 char *path = util_concat_path(dir->path, db_res->path); |
1999 XAttributes *xattr = file_get_attributes(path); |
1999 XAttributes *xattr = file_get_attributes(path); |
2000 // test if xattr are added, removed or changed |
2000 // test if xattr are added, removed or changed |
2001 if((db_res->xattr_hash && !xattr) || |
2001 if((db_res->xattr_hash && !xattr) || |
2002 (!db_res->xattr_hash && xattr) || |
2002 (!db_res->xattr_hash && xattr) || |
2239 |
2239 |
2240 DavXmlNode *fileinfo = dav_get_property_ns(res, DAV_NS, "finfo"); |
2240 DavXmlNode *fileinfo = dav_get_property_ns(res, DAV_NS, "finfo"); |
2241 if(fileinfo) { |
2241 if(fileinfo) { |
2242 FileInfo f; |
2242 FileInfo f; |
2243 finfo_get_values(fileinfo, &f); |
2243 finfo_get_values(fileinfo, &f); |
2244 if(dir->metadata & FINFO_DATE == FINFO_DATE && f.date_set) { |
2244 if((dir->metadata & FINFO_DATE) == FINFO_DATE && f.date_set) { |
2245 // set mtime |
2245 // set mtime |
2246 struct utimbuf t; |
2246 struct utimbuf t; |
2247 t.actime = f.last_modified; |
2247 t.actime = f.last_modified; |
2248 t.modtime = f.last_modified; |
2248 t.modtime = f.last_modified; |
2249 if(utime(path, &t)) { |
2249 if(utime(path, &t)) { |
2250 fprintf(stderr, "utime failed for file: %s : %s\n", path, strerror(errno)); |
2250 fprintf(stderr, "utime failed for file: %s : %s\n", path, strerror(errno)); |
2251 ret = 1; |
2251 ret = 1; |
2252 } |
2252 } |
2253 } |
2253 } |
2254 if(dir->metadata & FINFO_MODE == FINFO_MODE && f.mode_set) { |
2254 if((dir->metadata & FINFO_MODE) == FINFO_MODE && f.mode_set) { |
2255 // set mode |
2255 // set mode |
2256 if(chmod(path, f.mode)) { |
2256 if(chmod(path, f.mode)) { |
2257 fprintf(stderr, "chmod failed for file: %s : %s\n", path, strerror(errno)); |
2257 fprintf(stderr, "chmod failed for file: %s : %s\n", path, strerror(errno)); |
2258 ret = 1; |
2258 ret = 1; |
2259 } |
2259 } |
3935 } |
3935 } |
3936 |
3936 |
3937 void sync_print_get_file_err(const char *path, int err) { |
3937 void sync_print_get_file_err(const char *path, int err) { |
3938 switch(err) { |
3938 switch(err) { |
3939 case 1: fprintf(stderr, "File %s: not found\n", path); break; |
3939 case 1: fprintf(stderr, "File %s: not found\n", path); break; |
3940 case 2: fprintf(stderr, "File %s: permission denied\n"); break; |
3940 case 2: fprintf(stderr, "File %s: permission denied\n", path); break; |
3941 case 3: fprintf(stderr, "File %s: stat failed: %s\n", path, strerror(errno)); break; |
3941 case 3: fprintf(stderr, "File %s: stat failed: %s\n", path, strerror(errno)); break; |
3942 case 4: fprintf(stderr, "File %s is not in any syncdir\n", path); break; |
3942 case 4: fprintf(stderr, "File %s is not in any syncdir\n", path); break; |
3943 case 5: fprintf(stderr, "File %s is in multiple syncdirs\n", path); break; |
3943 case 5: fprintf(stderr, "File %s is in multiple syncdirs\n", path); break; |
3944 case 6: fprintf(stderr, "Syncdir not found\n"); break; |
3944 case 6: fprintf(stderr, "Syncdir not found\n"); break; |
3945 } |
3945 } |