}
+static int to_wire_mode(mode_t mode)
+{
+ if (S_ISLNK(mode) && (S_IFLNK != 0120000)) {
+ return (mode & ~(_S_IFMT)) | 0120000;
+ }
+ return (int)mode;
+}
+
+static mode_t from_wire_mode(int mode)
+{
+ if ((mode & (_S_IFMT)) == 0120000 && (S_IFLNK != 0120000)) {
+ return (mode & ~(_S_IFMT)) | S_IFLNK;
+ }
+ return (mode_t)mode;
+}
+
+
static void send_directory(int f,struct file_list *flist,char *dir);
static char *flist_dir;
if (!(flags & SAME_TIME))
write_int(f,(int)file->modtime);
if (!(flags & SAME_MODE))
- write_int(f,(int)file->mode);
+ write_int(f,to_wire_mode(file->mode));
if (preserve_uid && !(flags & SAME_UID)) {
add_uid(file->uid);
write_int(f,(int)file->uid);
file->flags = flags;
file->length = read_longint(f);
file->modtime = (flags & SAME_TIME) ? last_time : (time_t)read_int(f);
- file->mode = (flags & SAME_MODE) ? last_mode : (mode_t)read_int(f);
+ file->mode = (flags & SAME_MODE) ? last_mode : from_wire_mode(read_int(f));
if (preserve_uid)
file->uid = (flags & SAME_UID) ? last_uid : (uid_t)read_int(f);
if (preserve_gid)
for (i=0;i<flist->count;i++) {
rprintf(FINFO,"[%d] i=%d %s %s mode=0%o len=%d\n",
getpid(), i,
- flist->files[i]->dirname,
- flist->files[i]->basename,
+ NS(flist->files[i]->dirname),
+ NS(flist->files[i]->basename),
flist->files[i]->mode,
- flist->files[i]->length);
+ (int)flist->files[i]->length);
}
}
n = (n+1)%10;
if (f->dirname) {
- slprintf(p, MAXPATHLEN-1, "%s/%s", f->dirname, f->basename);
+ strlcpy(p, f->dirname, MAXPATHLEN-1);
+ strlcat(p, "/", MAXPATHLEN-1);
+ strlcat(p, f->basename, MAXPATHLEN-1);
} else {
strlcpy(p, f->basename, MAXPATHLEN-1);
}