dav/sync.c

changeset 581
3f9a9c80a2d2
parent 580
caf23cf7f96d
child 583
ec0ec7908b7d
equal deleted inserted replaced
580:caf23cf7f96d 581:3f9a9c80a2d2
1288 int *counter) 1288 int *counter)
1289 { 1289 {
1290 LocalResource *local = ucx_map_cstr_get(db->resources, path); 1290 LocalResource *local = ucx_map_cstr_get(db->resources, path);
1291 char *local_path = create_local_path(dir, path); 1291 char *local_path = create_local_path(dir, path);
1292 1292
1293 char *link = dav_get_string_property_ns(res, DAV_NS, "link"); 1293 char *link = SYNC_SYMLINK(dir) ?
1294 dav_get_string_property_ns(res, DAV_NS, "link") : NULL;
1294 1295
1295 char *etag = dav_get_string_property(res, "D:getetag"); 1296 char *etag = dav_get_string_property(res, "D:getetag");
1296 SYS_STAT s; 1297 SYS_STAT s;
1297 memset(&s, 0, sizeof(SYS_STAT)); 1298 memset(&s, 0, sizeof(SYS_STAT));
1298 1299
1299 char *blocksize_str = dav_get_string_property_ns(res, DAV_NS, "split"); 1300 char *blocksize_str = dav_get_string_property_ns(res, DAV_NS, "split");
1300 uint64_t blocksize = 0; 1301 uint64_t blocksize = 0;
1301 DavBool issplit = FALSE; 1302 DavBool issplit = FALSE;
1302 if(blocksize_str) { 1303 if(blocksize_str && !link) {
1303 if(!util_strtouint(blocksize_str, &blocksize)) { 1304 if(!util_strtouint(blocksize_str, &blocksize)) {
1304 fprintf(stderr, "Error: split property does not contain an integer.\n"); 1305 fprintf(stderr, "Error: split property does not contain an integer.\n");
1305 return 1; 1306 return 1;
1306 } 1307 }
1307 issplit = TRUE; 1308 issplit = TRUE;
1359 perror("symlink"); 1360 perror("symlink");
1360 ret = 1; 1361 ret = 1;
1361 } 1362 }
1362 } 1363 }
1363 1364
1364 if(issplit || dir->hashing) { 1365 if((issplit || dir->hashing) && !link) {
1365 if(truncate_file >= 0) { 1366 if(truncate_file >= 0) {
1366 // only true if issplit is true 1367 // only true if issplit is true
1367 if(truncate(local_path, truncate_file)) { 1368 if(truncate(local_path, truncate_file)) {
1368 perror("truncate"); 1369 perror("truncate");
1369 } 1370 }
1408 fprintf(stderr, "Cannot store metadata: %s\n", path); 1409 fprintf(stderr, "Cannot store metadata: %s\n", path);
1409 } 1410 }
1410 1411
1411 if(local->etag) { 1412 if(local->etag) {
1412 free(local->etag); 1413 free(local->etag);
1414 local->etag = NULL;
1413 } 1415 }
1414 if(local->hash) { 1416 if(local->hash) {
1415 free(local->hash); 1417 free(local->hash);
1418 local->hash = NULL;
1416 } 1419 }
1417 if(local->link_target) { 1420 if(local->link_target) {
1418 free(local->link_target); 1421 free(local->link_target);
1419 } 1422 local->link_target = NULL;
1420 1423 }
1424
1425 stat_func statfn;
1421 if(link) { 1426 if(link) {
1422 local->link_target = strdup(link); 1427 local->link_target = strdup(link);
1428 statfn = sys_lstat;
1429 } else {
1430 statfn = sys_stat;
1423 } 1431 }
1424 1432
1425 update_parts(local, part_updates, blockcount); 1433 update_parts(local, part_updates, blockcount);
1426 1434
1427 if(sys_stat(local_path, &s)) { 1435 if(statfn(local_path, &s)) {
1428 fprintf(stderr, 1436 fprintf(stderr,
1429 "Cannot stat file %s: %s\n", local_path, strerror(errno)); 1437 "Cannot stat file %s: %s\n", local_path, strerror(errno));
1430 } 1438 }
1431 1439
1432 // set metadata from stat 1440 // set metadata from stat

mercurial