Need to make sure that the destination file doesn't exist before we
[rsync/rsync-patches.git] / mkfifo.diff
CommitLineData
9cfe8375
WD
1--- orig/syscall.c 2004-08-02 21:56:59
2+++ syscall.c 2004-09-23 05:46:46
3@@ -26,6 +26,10 @@
4
5 #include "rsync.h"
5d24532c 6
9cfe8375 7+#if HAVE_SYS_UN_H
5d24532c
WD
8+#include <sys/un.h>
9+#endif
10+
9cfe8375
WD
11 extern int dry_run;
12 extern int read_only;
13 extern int list_only;
14@@ -76,6 +80,29 @@ int do_mknod(char *pathname, mode_t mode
5d24532c
WD
15 {
16 if (dry_run) return 0;
17 RETURN_ERROR_IF_RO_OR_LO;
18+# if HAVE_MKFIFO
19+ if (S_ISFIFO(mode))
20+ return mkfifo(pathname, mode);
21+# endif
22+# if HAVE_SYS_UN_H
23+ if (S_ISSOCK(mode)) {
24+ int sock;
25+ struct sockaddr_un saddr;
9cfe8375 26+ unsigned int len;
5d24532c
WD
27+
28+ saddr.sun_family = AF_UNIX;
9cfe8375
WD
29+ len = strlcpy(saddr.sun_path, pathname, sizeof saddr.sun_path);
30+ saddr.sun_len = len >= sizeof saddr.sun_path
31+ ? sizeof saddr.sun_path : len + 1;
5d24532c 32+
f5a01b19
WD
33+ if ((sock = socket(PF_UNIX, SOCK_STREAM, 0)) < 0
34+ || (unlink(pathname) < 0 && errno != ENOENT)
35+ || (bind(sock, (struct sockaddr*)&saddr, sizeof saddr)) < 0)
5d24532c
WD
36+ return -1;
37+ close(sock);
38+ return do_chmod(pathname, mode);
39+ }
40+# endif
41 return mknod(pathname, mode, dev);
42 }
43 #endif