#include "rsync.h"
+extern int csum_length;
+
extern int verbose;
extern int am_server;
extern int always_checksum;
if (s)
for (i=0;i<s->count;i++) {
write_int(f_out,s->sums[i].sum1);
- write_buf(f_out,s->sums[i].sum2,SUM_LENGTH);
+ write_buf(f_out,s->sums[i].sum2,csum_length);
}
write_flush(f_out);
}
for (i=0;i<s->count;i++) {
s->sums[i].sum1 = read_int(f);
- read_buf(f,s->sums[i].sum2,SUM_LENGTH);
+ read_buf(f,s->sums[i].sum2,csum_length);
s->sums[i].offset = offset;
s->sums[i].i = i;
st = &st2;
}
- if (preserve_times && st->st_mtime != file->modtime) {
+ if (preserve_times && !S_ISLNK(st->st_mode) &&
+ st->st_mtime != file->modtime) {
updated = 1;
if (set_modtime(fname,file->modtime) != 0) {
fprintf(stderr,"failed to set times on %s : %s\n",
}
#ifdef HAVE_CHMOD
- if (preserve_perms && st->st_mode != file->mode) {
+ if (preserve_perms && !S_ISLNK(st->st_mode) &&
+ st->st_mode != file->mode) {
updated = 1;
if (chmod(fname,file->mode) != 0) {
fprintf(stderr,"failed to set permissions on %s : %s\n",
if (l > 0) {
lnk[l] = 0;
if (strcmp(lnk,flist->files[i].link) == 0) {
- if (verbose > 1)
- fprintf(am_server?stderr:stdout,"%s is uptodate\n",fname);
+ set_perms(fname,&flist->files[i],&st,1);
return;
}
}
fprintf(stderr,"link %s -> %s : %s\n",
fname,flist->files[i].link,strerror(errno));
} else {
+ set_perms(fname,&flist->files[i],NULL,0);
if (verbose)
- fprintf(am_server?stderr:stdout,"%s -> %s\n",fname,flist->files[i].link);
+ fprintf(am_server?stderr:stdout,"%s -> %s\n",
+ fname,flist->files[i].link);
}
return;
}
if (st.st_size == flist->files[i].length &&
((!ignore_times && st.st_mtime == flist->files[i].modtime) ||
(always_checksum && S_ISREG(st.st_mode) &&
- memcmp(sum,flist->files[i].sum,SUM_LENGTH) == 0))) {
+ memcmp(sum,flist->files[i].sum,csum_length) == 0))) {
set_perms(fname,&flist->files[i],&st,1);
return;
}
if (read_write(f_in,fd,i) != i) {
fprintf(stderr,"write failed on %s : %s\n",fname,strerror(errno));
- exit(1);
+ exit_cleanup(1);
}
offset += i;
} else {
fprintf(stderr,"chunk[%d] of size %d at %d offset=%d\n",
i,len,(int)offset2,(int)offset);
- if (write(fd,map_ptr(buf,offset2,len),len) != len) {
+ if (write_sparse(fd,map_ptr(buf,offset2,len),len) != len) {
fprintf(stderr,"write failed on %s : %s\n",fname,strerror(errno));
- exit(1);
+ exit_cleanup(1);
}
offset += len;
}
}
+
+ if (offset > 0 && sparse_end(fd) != 0) {
+ fprintf(stderr,"write failed on %s : %s\n",fname,strerror(errno));
+ exit_cleanup(1);
+ }
}
static char *cleanup_fname = NULL;
-void sig_int(void)
+void exit_cleanup(int code)
{
if (cleanup_fname)
unlink(cleanup_fname);
- exit(1);
+ exit(code);
+}
+
+void sig_int(void)
+{
+ exit_cleanup(1);
}
sprintf(fnamebak,"%s%s",fname,backup_suffix);
if (rename(fname,fnamebak) != 0 && errno != ENOENT) {
fprintf(stderr,"rename %s %s : %s\n",fname,fnamebak,strerror(errno));
- exit(1);
+ exit_cleanup(1);
}
}