Commit b280a1f4 authored by Andrew Tridgell's avatar Andrew Tridgell

handle OSes (such as Unicos) which use a different value for S_IFLNK

parent f8be5ef4
...@@ -89,6 +89,23 @@ static void set_filesystem(char *fname) ...@@ -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 void send_directory(int f,struct file_list *flist,char *dir);
static char *flist_dir; static char *flist_dir;
...@@ -147,7 +164,7 @@ static void send_file_entry(struct file_struct *file,int f,unsigned base_flags) ...@@ -147,7 +164,7 @@ static void send_file_entry(struct file_struct *file,int f,unsigned base_flags)
if (!(flags & SAME_TIME)) if (!(flags & SAME_TIME))
write_int(f,(int)file->modtime); write_int(f,(int)file->modtime);
if (!(flags & SAME_MODE)) if (!(flags & SAME_MODE))
write_int(f,(int)file->mode); write_int(f,to_wire_mode(file->mode));
if (preserve_uid && !(flags & SAME_UID)) { if (preserve_uid && !(flags & SAME_UID)) {
add_uid(file->uid); add_uid(file->uid);
write_int(f,(int)file->uid); write_int(f,(int)file->uid);
...@@ -248,7 +265,7 @@ static void receive_file_entry(struct file_struct **fptr, ...@@ -248,7 +265,7 @@ static void receive_file_entry(struct file_struct **fptr,
file->flags = flags; file->flags = flags;
file->length = read_longint(f); file->length = read_longint(f);
file->modtime = (flags & SAME_TIME) ? last_time : (time_t)read_int(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) if (preserve_uid)
file->uid = (flags & SAME_UID) ? last_uid : (uid_t)read_int(f); file->uid = (flags & SAME_UID) ? last_uid : (uid_t)read_int(f);
if (preserve_gid) if (preserve_gid)
......
...@@ -204,14 +204,6 @@ ...@@ -204,14 +204,6 @@
#endif #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 #define BOOL int
#ifndef uchar #ifndef uchar
...@@ -409,6 +401,18 @@ extern int errno; ...@@ -409,6 +401,18 @@ extern int errno;
#define S_IWUSR 0200 #define S_IWUSR 0200
#endif #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 #ifndef S_ISBLK
#define S_ISBLK(mode) (((mode) & (_S_IFMT)) == (_S_IFBLK)) #define S_ISBLK(mode) (((mode) & (_S_IFMT)) == (_S_IFBLK))
#endif #endif
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment