- if ((am_root && preserve_uid && st->st_uid != file->uid) ||
- (preserve_gid && st->st_gid != file->gid)) {
- updated = 1;
- if (lchown(fname,
- (am_root&&preserve_uid)?file->uid:-1,
- preserve_gid?file->gid:-1) != 0) {
- if (verbose>1 || preserve_uid)
- fprintf(FERROR,"chown %s : %s\n",fname,strerror(errno));
- return updated;
- }
- }
-
- if (verbose > 1 && report) {
- if (updated)
- fprintf(FINFO,"%s\n",fname);
- else
- fprintf(FINFO,"%s is uptodate\n",fname);
- }
- return updated;
-}
-
-
-void recv_generator(char *fname,struct file_list *flist,int i,int f_out)
-{
- int fd;
- struct stat st;
- struct map_struct *buf;
- struct sum_struct *s;
- char sum[MD4_SUM_LENGTH];
- int statret;
- struct file_struct *file = &flist->files[i];
-
- if (verbose > 2)
- fprintf(FERROR,"recv_generator(%s,%d)\n",fname,i);
-
- statret = lstat(fname,&st);
-
- if (S_ISDIR(file->mode)) {
- if (dry_run) return;
- if (statret == 0 && !S_ISDIR(st.st_mode)) {
- if (unlink(fname) != 0) {
- fprintf(FERROR,"unlink %s : %s\n",fname,strerror(errno));
- return;
- }
- statret = -1;
- }
- if (statret != 0 && mkdir(fname,file->mode) != 0 && errno != EEXIST) {
- if (!(relative_paths && errno==ENOENT &&
- create_directory_path(fname)==0 &&
- mkdir(fname,file->mode)==0)) {
- fprintf(FERROR,"mkdir %s : %s (2)\n",
- fname,strerror(errno));
- }
- }
- if (set_perms(fname,file,NULL,0) && verbose)
- fprintf(FINFO,"%s/\n",fname);
- return;
- }
-
- if (preserve_links && S_ISLNK(file->mode)) {
-#if SUPPORT_LINKS
- char lnk[MAXPATHLEN];
- int l;
- if (statret == 0) {
- l = readlink(fname,lnk,MAXPATHLEN-1);
- if (l > 0) {
- lnk[l] = 0;
- if (strcmp(lnk,file->link) == 0) {
- set_perms(fname,file,&st,1);
- return;
- }
- }
- }
- if (!dry_run) unlink(fname);
- if (!dry_run && symlink(file->link,fname) != 0) {
- fprintf(FERROR,"link %s -> %s : %s\n",
- fname,file->link,strerror(errno));
- } else {
- set_perms(fname,file,NULL,0);
- if (verbose)
- fprintf(FINFO,"%s -> %s\n",
- fname,file->link);
- }
-#endif
- return;
- }
-
-#ifdef HAVE_MKNOD
- if (am_root && preserve_devices && IS_DEVICE(file->mode)) {
- if (statret != 0 ||
- st.st_mode != file->mode ||
- st.st_rdev != file->rdev) {
- if (!dry_run) unlink(fname);
- if (verbose > 2)
- fprintf(FERROR,"mknod(%s,0%o,0x%x)\n",
- fname,(int)file->mode,(int)file->rdev);
- if (!dry_run &&
- mknod(fname,file->mode,file->rdev) != 0) {
- fprintf(FERROR,"mknod %s : %s\n",fname,strerror(errno));
- } else {
- set_perms(fname,file,NULL,0);
- if (verbose)
- fprintf(FINFO,"%s\n",fname);
- }
- } else {
- set_perms(fname,file,&st,1);
- }
- return;
- }