From b280a1f47ef8d22b40db3d2737d4cb10de988ad6 Mon Sep 17 00:00:00 2001 From: Andrew Tridgell Date: Tue, 27 Oct 1998 14:09:28 +0000 Subject: [PATCH] handle OSes (such as Unicos) which use a different value for S_IFLNK --- flist.c | 21 +++++++++++++++++++-- rsync.h | 20 ++++++++++++-------- 2 files changed, 31 insertions(+), 10 deletions(-) diff --git a/flist.c b/flist.c index 8813da7f..86bf4aa0 100644 --- a/flist.c +++ b/flist.c @@ -89,6 +89,23 @@ static void set_filesystem(char *fname) } +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; @@ -147,7 +164,7 @@ static void send_file_entry(struct file_struct *file,int f,unsigned base_flags) 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); @@ -248,7 +265,7 @@ static void receive_file_entry(struct file_struct **fptr, 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) diff --git a/rsync.h b/rsync.h index ef7ea888..982eb225 100644 --- a/rsync.h +++ b/rsync.h @@ -204,14 +204,6 @@ #endif -#ifndef S_IFLNK -#define S_IFLNK 0120000 -#endif - -#ifndef S_ISLNK -#define S_ISLNK(mode) (((mode) & S_IFLNK) == S_IFLNK) -#endif - #define BOOL int #ifndef uchar @@ -409,6 +401,18 @@ extern int errno; #define S_IWUSR 0200 #endif +#ifndef _S_IFMT +#define _S_IFMT 0170000 +#endif + +#ifndef _S_IFLNK +#define _S_IFLNK 0120000 +#endif + +#ifndef S_ISLNK +#define S_ISLNK(mode) (((mode) & (_S_IFMT)) == (_S_IFLNK)) +#endif + #ifndef S_ISBLK #define S_ISBLK(mode) (((mode) & (_S_IFMT)) == (_S_IFBLK)) #endif -- 2.34.1