#define SAME_TIME (1<<7)
/* update this if you make incompatible changes */
-#define PROTOCOL_VERSION 14
-#define MIN_PROTOCOL_VERSION 10
+#define PROTOCOL_VERSION 15
+#define MIN_PROTOCOL_VERSION 11
#define MAX_PROTOCOL_VERSION 20
#define SPARSE_WRITE_SIZE (4*1024)
#include "lib/getopt.h"
#endif
+/* these are needed for the uid/gid mapping code */
+#include <pwd.h>
+#include <grp.h>
+
+#ifndef S_IFLNK
+#define S_IFLNK 0120000
+#endif
#ifndef S_ISLNK
#define S_ISLNK(mode) (((mode) & S_IFLNK) == S_IFLNK)
#endif
struct file_struct {
- time_t modtime;
- off_t length;
- mode_t mode;
- ino_t inode;
- dev_t dev;
- dev_t rdev;
- uid_t uid;
- gid_t gid;
- char *name;
- char *dir;
- char *link;
- char sum[MD4_SUM_LENGTH];
+ time_t modtime;
+ off_t length;
+ mode_t mode;
+ ino_t inode;
+ dev_t dev;
+ dev_t rdev;
+ uid_t uid;
+ gid_t gid;
+ char *basename;
+ char *dirname;
+ char *basedir;
+ char *link;
+ char sum[MD4_SUM_LENGTH];
};
struct file_list {
int count;
int malloced;
- struct file_struct *files;
+ struct file_struct **files;
};
struct sum_buf {
int fd,size,p_size,p_offset,p_len;
};
+/* we need this function because of the silly way in which duplicate
+ entries are handled in the file lists - we can't change this
+ without breaking existing versions */
+static int flist_up(struct file_list *flist, int i)
+{
+ while (!flist->files[i]->basename) i++;
+ return i;
+}
+
+
#include "byteorder.h"
#include "version.h"
#include "proto.h"
#define bzero(buf,n) memset(buf,0,n)
#endif
-#define SUPPORT_LINKS (HAVE_READLINK && defined(S_ISLNK))
+#define SUPPORT_LINKS HAVE_READLINK
#define SUPPORT_HARD_LINKS HAVE_LINK
-#ifndef S_ISLNK
-#define S_ISLNK(x) 0
-#endif
-
-#if !SUPPORT_LINKS
-#define lstat stat
-#endif
-
#ifndef HAVE_LCHOWN
#define lchown chown
#endif
#define S_IWUSR 0200
#endif
+#ifndef S_ISBLK
+#define S_ISBLK(mode) (((mode) & (_S_IFMT)) == (_S_IFBLK))
+#endif
+
+#ifndef S_ISCHR
+#define S_ISCHR(mode) (((mode) & (_S_IFMT)) == (_S_IFCHR))
+#endif
+
+#ifndef S_ISDIR
+#define S_ISDIR(mode) (((mode) & (_S_IFMT)) == (_S_IFDIR))
+#endif
+
+#ifndef S_ISREG
+#define S_ISREG(mode) (((mode) & (_S_IFMT)) == (_S_IFREG))
+#endif
+
#define IS_DEVICE(mode) (S_ISCHR(mode) || S_ISBLK(mode))