⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 rsync.c

📁 Rsync 3.0.5 source code
💻 C
📖 第 1 页 / 共 2 页
字号:
	if (iflags & ITEM_TRANSFER) {		int i = ndx - cur_flist->ndx_start;		if (i < 0 || !S_ISREG(cur_flist->files[i]->mode)) {			rprintf(FERROR,				"received request to transfer non-regular file: %d [%s]\n",				ndx, who_am_i());			exit_cleanup(RERR_PROTOCOL);		}	}	*iflag_ptr = iflags;	return ndx;}/*  free a sums struct  */void free_sums(struct sum_struct *s){	if (s->sums) free(s->sums);	free(s);}/* This is only called when we aren't preserving permissions.  Figure out what * the permissions should be and return them merged back into the mode. */mode_t dest_mode(mode_t flist_mode, mode_t stat_mode, int dflt_perms,		 int exists){	int new_mode;	/* If the file already exists, we'll return the local permissions,	 * possibly tweaked by the --executability option. */	if (exists) {		new_mode = (flist_mode & ~CHMOD_BITS) | (stat_mode & CHMOD_BITS);		if (preserve_executability && S_ISREG(flist_mode)) {			/* If the source file is executable, grant execute			 * rights to everyone who can read, but ONLY if the			 * file isn't already executable. */			if (!(flist_mode & 0111))				new_mode &= ~0111;			else if (!(stat_mode & 0111))				new_mode |= (new_mode & 0444) >> 2;		}	} else {		/* Apply destination default permissions and turn		 * off special permissions. */		new_mode = flist_mode & (~CHMOD_BITS | dflt_perms);	}	return new_mode;}int set_file_attrs(const char *fname, struct file_struct *file, stat_x *sxp,		   const char *fnamecmp, int flags){	int updated = 0;	stat_x sx2;	int change_uid, change_gid;	mode_t new_mode = file->mode;	int inherit;	if (!sxp) {		if (dry_run)			return 1;		if (link_stat(fname, &sx2.st, 0) < 0) {			rsyserr(FERROR_XFER, errno, "stat %s failed",				full_fname(fname));			return 0;		}#ifdef SUPPORT_ACLS		sx2.acc_acl = sx2.def_acl = NULL;#endif#ifdef SUPPORT_XATTRS		sx2.xattr = NULL;#endif		sxp = &sx2;		inherit = !preserve_perms;	} else		inherit = !preserve_perms && file->flags & FLAG_DIR_CREATED;	if (inherit && S_ISDIR(new_mode) && sxp->st.st_mode & S_ISGID) {		/* We just created this directory and its setgid		 * bit is on, so make sure it stays on. */		new_mode |= S_ISGID;	}	if (daemon_chmod_modes && !S_ISLNK(new_mode))		new_mode = tweak_mode(new_mode, daemon_chmod_modes);#ifdef SUPPORT_ACLS	if (preserve_acls && !S_ISLNK(file->mode) && !ACL_READY(*sxp))		get_acl(fname, sxp);#endif#ifdef SUPPORT_XATTRS	if (am_root < 0)		set_stat_xattr(fname, file, new_mode);	if (preserve_xattrs && fnamecmp)		set_xattr(fname, file, fnamecmp, sxp);#endif	if (!preserve_times || (S_ISDIR(sxp->st.st_mode) && preserve_times == 1))		flags |= ATTRS_SKIP_MTIME;	if (!(flags & ATTRS_SKIP_MTIME)	    && cmp_time(sxp->st.st_mtime, file->modtime) != 0) {		int ret = set_modtime(fname, file->modtime, sxp->st.st_mode);		if (ret < 0) {			rsyserr(FERROR_XFER, errno, "failed to set times on %s",				full_fname(fname));			goto cleanup;		}		if (ret == 0) /* ret == 1 if symlink could not be set */			updated = 1;		else			file->flags |= FLAG_TIME_FAILED;	}	change_uid = am_root && uid_ndx && sxp->st.st_uid != (uid_t)F_OWNER(file);	change_gid = gid_ndx && !(file->flags & FLAG_SKIP_GROUP)		  && sxp->st.st_gid != (gid_t)F_GROUP(file);#if !defined HAVE_LCHOWN && !defined CHOWN_MODIFIES_SYMLINK	if (S_ISLNK(sxp->st.st_mode)) {		;	} else#endif	if (change_uid || change_gid) {		if (verbose > 2) {			if (change_uid) {				rprintf(FINFO,					"set uid of %s from %u to %u\n",					fname, (unsigned)sxp->st.st_uid, F_OWNER(file));			}			if (change_gid) {				rprintf(FINFO,					"set gid of %s from %u to %u\n",					fname, (unsigned)sxp->st.st_gid, F_GROUP(file));			}		}		if (am_root >= 0) {			if (do_lchown(fname,			    change_uid ? (uid_t)F_OWNER(file) : sxp->st.st_uid,			    change_gid ? (gid_t)F_GROUP(file) : sxp->st.st_gid) != 0) {				/* We shouldn't have attempted to change uid				 * or gid unless have the privilege. */				rsyserr(FERROR_XFER, errno, "%s %s failed",				    change_uid ? "chown" : "chgrp",				    full_fname(fname));				goto cleanup;			}			/* A lchown had been done, so we need to re-stat if			 * the destination had the setuid or setgid bits set			 * (due to the side effect of the chown call). */			if (sxp->st.st_mode & (S_ISUID | S_ISGID)) {				link_stat(fname, &sxp->st,					  keep_dirlinks && S_ISDIR(sxp->st.st_mode));			}		}		updated = 1;	}#ifdef SUPPORT_ACLS	/* It's OK to call set_acl() now, even for a dir, as the generator	 * will enable owner-writability using chmod, if necessary.	 * 	 * If set_acl() changes permission bits in the process of setting	 * an access ACL, it changes sxp->st.st_mode so we know whether we	 * need to chmod(). */	if (preserve_acls && !S_ISLNK(new_mode) && set_acl(fname, file, sxp) == 0)		updated = 1;#endif#ifdef HAVE_CHMOD	if (!BITS_EQUAL(sxp->st.st_mode, new_mode, CHMOD_BITS)) {		int ret = am_root < 0 ? 0 : do_chmod(fname, new_mode);		if (ret < 0) {			rsyserr(FERROR_XFER, errno,				"failed to set permissions on %s",				full_fname(fname));			goto cleanup;		}		if (ret == 0) /* ret == 1 if symlink could not be set */			updated = 1;	}#endif	if (verbose > 1 && flags & ATTRS_REPORT) {		if (updated)			rprintf(FCLIENT, "%s\n", fname);		else			rprintf(FCLIENT, "%s is uptodate\n", fname);	}  cleanup:	if (sxp == &sx2) {#ifdef SUPPORT_ACLS		if (preserve_acls)			free_acl(&sx2);#endif#ifdef SUPPORT_XATTRS		if (preserve_xattrs)			free_xattr(&sx2);#endif	}	return updated;}RETSIGTYPE sig_int(UNUSED(int val)){	/* KLUGE: if the user hits Ctrl-C while ssh is prompting	 * for a password, then our cleanup's sending of a SIGUSR1	 * signal to all our children may kill ssh before it has a	 * chance to restore the tty settings (i.e. turn echo back	 * on).  By sleeping for a short time, ssh gets a bigger	 * chance to do the right thing.  If child processes are	 * not ssh waiting for a password, then this tiny delay	 * shouldn't hurt anything. */	msleep(400);	exit_cleanup(RERR_SIGNAL);}/* Finish off a file transfer: renaming the file and setting the file's * attributes (e.g. permissions, ownership, etc.).  If the robust_rename() * call is forced to copy the temp file and partialptr is both non-NULL and * not an absolute path, we stage the file into the partial-dir and then * rename it into place.  This returns 1 on succcess or 0 on failure. */int finish_transfer(const char *fname, const char *fnametmp,		    const char *fnamecmp, const char *partialptr,		    struct file_struct *file, int ok_to_set_time,		    int overwriting_basis){	int ret;	const char *temp_copy_name = partialptr && *partialptr != '/' ? partialptr : NULL;	if (inplace) {		if (verbose > 2)			rprintf(FINFO, "finishing %s\n", fname);		fnametmp = fname;		goto do_set_file_attrs;	}	if (make_backups > 0 && overwriting_basis) {		if (!make_backup(fname))			return 1;		if (fnamecmp == fname)			fnamecmp = get_backup_name(fname);	}	/* Change permissions before putting the file into place. */	set_file_attrs(fnametmp, file, NULL, fnamecmp,		       ok_to_set_time ? 0 : ATTRS_SKIP_MTIME);	/* move tmp file over real file */	if (verbose > 2)		rprintf(FINFO, "renaming %s to %s\n", fnametmp, fname);	ret = robust_rename(fnametmp, fname, temp_copy_name,			    file->mode & INITACCESSPERMS);	if (ret < 0) {		rsyserr(FERROR_XFER, errno, "%s %s -> \"%s\"",			ret == -2 ? "copy" : "rename",			full_fname(fnametmp), fname);		if (!partialptr || (ret == -2 && temp_copy_name)		 || robust_rename(fnametmp, partialptr, NULL,				  file->mode & INITACCESSPERMS) < 0)			do_unlink(fnametmp);		return 0;	}	if (ret == 0) {		/* The file was moved into place (not copied), so it's done. */		return 1;	}	/* The file was copied, so tweak the perms of the copied file.  If it	 * was copied to partialptr, move it into its final destination. */	fnametmp = temp_copy_name ? temp_copy_name : fname;  do_set_file_attrs:	set_file_attrs(fnametmp, file, NULL, fnamecmp,		       ok_to_set_time ? 0 : ATTRS_SKIP_MTIME);	if (temp_copy_name) {		if (do_rename(fnametmp, fname) < 0) {			rsyserr(FERROR_XFER, errno, "rename %s -> \"%s\"",				full_fname(fnametmp), fname);			return 0;		}		handle_partial_dir(temp_copy_name, PDIR_DELETE);	}	return 1;}struct file_list *flist_for_ndx(int ndx, const char *fatal_error_loc){	struct file_list *flist = cur_flist;	if (!flist && !(flist = first_flist))		goto not_found;	while (ndx < flist->ndx_start-1) {		if (flist == first_flist)			goto not_found;		flist = flist->prev;	}	while (ndx >= flist->ndx_start + flist->used) {		if (!(flist = flist->next))			goto not_found;	}	return flist;  not_found:	if (fatal_error_loc) {		int first, last;		if (first_flist) {			first = first_flist->ndx_start - 1;			last = first_flist->prev->ndx_start + first_flist->prev->used - 1;		} else {			first = 0;			last = -1;		}		rprintf(FERROR,			"File-list index %d not in %d - %d (%s) [%s]\n",			ndx, first, last, fatal_error_loc, who_am_i());		exit_cleanup(RERR_PROTOCOL);	}	return NULL;}const char *who_am_i(void){	if (am_starting_up)		return am_server ? "server" : "client";	return am_sender ? "sender" : am_generator ? "generator" : "receiver";}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -