static int remote_build_list(int syncfd, copyinfo **filelist, const char *rpath, const char *lpath) { copyinfo *dirlist = NULL; sync_ls_build_list_cb_args args; args.filelist = filelist; args.dirlist = &dirlist; args.rpath = rpath; args.lpath = lpath; /* Put the files/dirs in rpath on the lists. */ if (sync_ls(syncfd, rpath, sync_ls_build_list_cb, (void *)&args)) { return 1; } /* Recurse into each directory we found. */ while (dirlist != NULL) { copyinfo *next = dirlist->next; if (remote_build_list(syncfd, filelist, dirlist->src, dirlist->dst)) { return 1; } free(dirlist); dirlist = next; } return 0; }
static int copy_remote_dir_local(int fd, const char *rpath, const char *lpath, int copy_attrs) { copyinfo *filelist = 0; copyinfo *ci, *next; int pulled = 0; int skipped = 0; /* Make sure that both directory paths end in a slash. */ if (rpath[0] == 0 || lpath[0] == 0) return -1; if (rpath[strlen(rpath) - 1] != '/') { int tmplen = strlen(rpath) + 2; char *tmp = malloc(tmplen); if (tmp == 0) return -1; snprintf(tmp, tmplen, "%s/", rpath); rpath = tmp; } if (lpath[strlen(lpath) - 1] != '/') { int tmplen = strlen(lpath) + 2; char *tmp = malloc(tmplen); if (tmp == 0) return -1; snprintf(tmp, tmplen, "%s/", lpath); lpath = tmp; } fprintf(stderr, "pull: building file list...\n"); /* Recursively build the list of files to copy. */ if (remote_build_list(fd, &filelist, rpath, lpath)) { return -1; } for (ci = filelist; ci != 0; ci = next) { next = ci->next; if (ci->flag == 0) { fprintf(stderr, "pull: %s -> %s\n", ci->src, ci->dst); if (sync_recv(fd, ci->src, ci->dst, 0 /* no show progress */)) { return 1; } if (copy_attrs && set_time_and_mode(ci->dst, ci->time, ci->mode)) { return 1; } pulled++; } else { skipped++; } free(ci); } fprintf(stderr, "%d file%s pulled. %d file%s skipped.\n", pulled, (pulled == 1) ? "" : "s", skipped, (skipped == 1) ? "" : "s"); return 0; }
static int copy_remote_dir_local(int fd, const char *rpath, const char *lpath, int checktimestamps) { copyinfo *filelist = 0; copyinfo *ci, *next; int pulled = 0; int skipped = 0; /* Make sure that both directory paths end in a slash. */ if (rpath[0] == 0 || lpath[0] == 0) return -1; if (rpath[strlen(rpath) - 1] != '/') { int tmplen = strlen(rpath) + 2; char *tmp = malloc(tmplen); if (tmp == 0) return -1; snprintf(tmp, tmplen, "%s/", rpath); rpath = tmp; } if (lpath[strlen(lpath) - 1] != '/') { int tmplen = strlen(lpath) + 2; char *tmp = malloc(tmplen); if (tmp == 0) return -1; snprintf(tmp, tmplen, "%s/", lpath); lpath = tmp; } fprintf(stderr, "pull: building file list...\n"); /* Recursively build the list of files to copy. */ if (remote_build_list(fd, &filelist, rpath, lpath)) { return -1; } #if 0 if (checktimestamps) { for (ci = filelist; ci != 0; ci = ci->next) { if (sync_start_readtime(fd, ci->dst)) { return 1; } } for (ci = filelist; ci != 0; ci = ci->next) { unsigned int timestamp, mode, size; if (sync_finish_readtime(fd, ×tamp, &mode, &size)) return 1; if (size == ci->size) { /* for links, we cannot update the atime/mtime */ if ((S_ISREG(ci->mode & mode) && timestamp == ci->time) || (S_ISLNK(ci->mode & mode) && timestamp >= ci->time)) ci->flag = 1; } } } #endif for (ci = filelist; ci != 0; ci = next) { next = ci->next; if (ci->flag == 0) { fprintf(stderr, "pull: %s -> %s\n", ci->src, ci->dst); if (sync_recv(fd, ci->src, ci->dst)) { return 1; } pulled++; } else { skipped++; } free(ci); } fprintf(stderr, "%d file%s pulled. %d file%s skipped.\n", pulled, (pulled == 1) ? "" : "s", skipped, (skipped == 1) ? "" : "s"); return 0; }
static int copy_remote_dir_local(int fd, const char *rpath, const char *lpath, int copy_attrs) { copyinfo *filelist = 0; copyinfo *ci, *next; int pulled = 0; int skipped = 0; char *rpath_clean = NULL; char *lpath_clean = NULL; int ret = 0; if (rpath[0] == '\0' || lpath[0] == '\0') { ret = -1; goto finish; } /* Make sure that both directory paths end in a slash. */ rpath_clean = add_slash_to_path(rpath); if (!rpath_clean) { ret = -1; goto finish; } lpath_clean = add_slash_to_path(lpath); if (!lpath_clean) { ret = -1; goto finish; } /* Recursively build the list of files to copy. */ fprintf(stderr, "pull: building file list...\n"); if (remote_build_list(fd, &filelist, rpath_clean, lpath_clean)) { ret = -1; goto finish; } for (ci = filelist; ci != 0; ci = next) { next = ci->next; if (ci->flag == 0) { fprintf(stderr, "pull: %s -> %s\n", ci->src, ci->dst); if (sync_recv(fd, ci->src, ci->dst, 0 /* no show progress */)) { ret = -1; goto finish; } if (copy_attrs && set_time_and_mode(ci->dst, ci->time, ci->mode)) { ret = -1; goto finish; } pulled++; } else { skipped++; } free(ci); } fprintf(stderr, "%d file%s pulled. %d file%s skipped.\n", pulled, (pulled == 1) ? "" : "s", skipped, (skipped == 1) ? "" : "s"); finish: free(lpath_clean); free(rpath_clean); return ret; }