extern int delete_mode;
extern int cvs_exclude;
extern int am_root;
+extern int relative_paths;
/*
free a sums struct
struct sum_struct *s;
int i;
off_t offset = 0;
- int block_len;
s = (struct sum_struct *)malloc(sizeof(*s));
if (!s) out_of_memory("receive_sums");
fprintf(FERROR,"count=%d n=%d rem=%d\n",
s->count,s->n,s->remainder);
- block_len = s->n;
-
if (s->count == 0)
return(s);
if ((am_root && preserve_uid && st->st_uid != file->uid) ||
(preserve_gid && st->st_gid != file->gid)) {
updated = 1;
- if (chown(fname,
- (am_root&&preserve_uid)?file->uid:-1,
- preserve_gid?file->gid:-1) != 0) {
+ 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;
}
statret = -1;
}
- if (statret != 0 && mkdir(fname,file->mode) != 0 && errno != EEXIST)
- fprintf(FERROR,"mkdir %s : %s\n",fname,strerror(errno));
+ 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 (!(local_file_list = send_file_list(-1,1,&dot)))
return;
- for (i=local_file_list->count;i>=0;i--) {
+ for (i=local_file_list->count-1;i>=0;i--) {
if (!local_file_list->files[i].name) continue;
if (-1 == flist_find(flist,&local_file_list->files[i])) {
delete_one(&local_file_list->files[i]);
continue;
}
fd2 = open(fnametmp,O_WRONLY|O_CREAT,file->mode);
+ if (relative_paths && errno == ENOENT &&
+ create_directory_path(fnametmp) == 0) {
+ fd2 = open(fnametmp,O_WRONLY|O_CREAT,file->mode);
+ }
if (fd2 == -1) {
fprintf(FERROR,"open %s : %s\n",fnametmp,strerror(errno));
receive_data(f_in,buf,-1,NULL);