Need to make sure that the destination file doesn't exist before we
[rsync/rsync-patches.git] / mkfifo.diff
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"
6  
7 +#if HAVE_SYS_UN_H
8 +#include <sys/un.h>
9 +#endif
10 +
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
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;
26 +               unsigned int len;
27 +
28 +               saddr.sun_family = AF_UNIX;
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;
32 +
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)
36 +                       return -1;
37 +               close(sock);
38 +               return do_chmod(pathname, mode);
39 +       }
40 +# endif
41         return mknod(pathname, mode, dev);
42  }
43  #endif