rsync: always modify atime of all destination files

Justin Pryzby justinpryzby at users.sourceforge.net
Thu Mar 6 16:38:05 GMT 2008


Hi Everyone,

The following feature request was received by a Debian user; could you
comment on it?  I think this seems reasonable, but perhaps should be
enabled only conditionally (as if the argument parser isn't stressed
enough).

Thanks,
Justin

On Fri, Jul 23, 2004 at 05:09:09PM -0300, Pedro Zorzenon Neto wrote:
> Package: rsync
> Version: 2.6.2-2
> Severity: wishlist
> Tags: patch
> 
>   Hi,
> 
>   Please apply the following patch to rsync. This patch updates the
> atime (last access time) of all destination files to NOW when rsync
> runs.
> 
>   It is desirable to know if a file has been deleted in then source
> and exists in destination. Checking destination computer for atime,
> you can know how long this file has been removed from source, and
> remove it after some months to keep disk space in backups.
> 
>   In destination computer I execute something like this:
> 
>     find /backup/directory/ -atime +60 -print -exec rm '{}' ';'
> 
>   This way, files that exist in destination and do not exist anymore
> in source will be deleted after 60 days.
> 
>   The option --delete is not good for this, because it deletes all
> files in destination, even if they were removed yesterday acidentally
> in source.
> 
>   It could also be good to put this behaviour in rsync manpage.
> 
>   Thanks,
>     Pedro
> 
> -- System Information:
> Debian Release: testing/unstable
>   APT prefers testing
>   APT policy: (500, 'testing')
> Architecture: i386 (i686)
> Kernel: Linux 2.4.26-1-686
> Locale: LANG=C, LC_CTYPE=C (ignored: LC_ALL set to pt_BR)
> 
> Versions of packages rsync depends on:
> ii  libc6                       2.3.2.ds1-13 GNU C Library: Shared libraries an
> ii  libpopt0                    1.7-4        lib for parsing cmdline parameters
> 
> -- no debconf information

> diff -u rsync-2.6.2.orig/generator.c rsync-2.6.2/generator.c
> --- rsync-2.6.2.orig/generator.c	Thu Apr 15 13:55:23 2004
> +++ rsync-2.6.2/generator.c	Fri Jul 23 15:47:40 2004
> @@ -471,8 +471,10 @@
>  	}
>  
>  	if (skip_file(fname, file, &st)) {
> -		if (fnamecmp == fname)
> +		if (fnamecmp == fname) {
>  			set_perms(fname,file,&st,1);
> +			update_atime(fname);
> +		}
>  		return;
>  	}
>  
> diff -u rsync-2.6.2.orig/proto.h rsync-2.6.2/proto.h
> --- rsync-2.6.2.orig/proto.h	Thu Apr 22 06:58:09 2004
> +++ rsync-2.6.2/proto.h	Fri Jul 23 15:16:17 2004
> @@ -242,6 +242,7 @@
>  void print_child_argv(char **cmd);
>  void out_of_memory(char *str);
>  void overflow(char *str);
> +void update_atime(char *fname);
>  int set_modtime(char *fname, time_t modtime);
>  int create_directory_path(char *fname, int base_umask);
>  int copy_file(char *source, char *dest, mode_t mode);
> diff -u rsync-2.6.2.orig/util.c rsync-2.6.2/util.c
> --- rsync-2.6.2.orig/util.c	Tue Apr 27 16:59:37 2004
> +++ rsync-2.6.2/util.c	Fri Jul 23 16:53:06 2004
> @@ -1135,3 +1135,40 @@
>  		return malloc(size * num);
>  	return realloc(ptr, size * num);
>  }
> +
> +/**
> + * update time of last access (atime).
> + * does not modify mtime.
> +**/
> +void update_atime(char *fname) {
> +#if defined(HAVE_UTIME) || defined(HAVE_UTIMES)
> +       struct stat st;
> +# ifdef HAVE_UTIMBUF
> +       struct utimbuf utb;
> +# endif
> +       if (verbose > 3)
> +	       rprintf(FINFO, "%s updating atime\n",fname);
> +       if (stat(fname, &st) != 0) {
> +               rprintf(FERROR, "ERROR: updating atime: could read previous mtime, file '%s'\n",fname);
> +       } else {
> +# ifdef HAVE_UTIME
> +	       utb.modtime = st.st_mtime;
> +	       utb.actime = time(NULL);
> +	       if (utime(fname,&utb) != 0)
> +		       rprintf(FERROR, "ERROR: could not update atime of file '%s'",fname);
> +# else /* HAVE_UTIME */
> +	       struct timeval t[2];
> +	       t[0].tv_sec = time(NULL);
> +	       t[0].tv_usec = 0;
> +	       t[1].tv_sec = st.st_mtime;
> +	       t[1].tv_usec = 0;
> +	       if (utimes(fname,t) != 0)
> +		       rprintf(FERROR, "ERROR: could not update atime of file '%s'",fname);
> +# endif /* HAVE_UTIME */
> +       }
> +       
> +#else /* defined(HAVE_UTIME) || defined(HAVE_UTIMES) */
> +       if (verbose > 3)
> +	       rprintf(FERROR, "%s can not update atime. utime() or utimes() not found\n",fname);
> +#endif /* defined(HAVE_UTIME) || defined(HAVE_UTIMES) */
> +}



More information about the rsync mailing list