Switching to GPL 3.
[rsync/rsync.git] / syscall.c
index 2d72434..58daad1 100644 (file)
--- a/syscall.c
+++ b/syscall.c
@@ -4,21 +4,19 @@
  *
  * Copyright (C) 1998 Andrew Tridgell
  * Copyright (C) 2002 Martin Pool
- * Copyright (C) 2003, 2004, 2005, 2006 Wayne Davison
+ * Copyright (C) 2003-2007 Wayne Davison
  *
  * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
+ * it under the terms of the GNU General Public License version 3 as
+ * published by the Free Software Foundation.
  *
  * This program is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  * GNU General Public License for more details.
  *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, visit the http://fsf.org website.
  */
 
 #include "rsync.h"
@@ -28,6 +26,7 @@
 #endif
 
 extern int dry_run;
+extern int am_root;
 extern int read_only;
 extern int list_only;
 extern int preserve_perms;
@@ -75,10 +74,19 @@ int do_lchown(const char *path, uid_t owner, gid_t group)
        return lchown(path, owner, group);
 }
 
-int do_mknod(char *pathname, mode_t mode, dev_t dev)
+int do_mknod(const char *pathname, mode_t mode, dev_t dev)
 {
        if (dry_run) return 0;
        RETURN_ERROR_IF_RO_OR_LO;
+
+       /* For --fake-super, we create a normal file with mode 0600. */
+       if (am_root < 0) {
+               int fd = open(pathname, O_WRONLY|O_CREAT|O_TRUNC, S_IWUSR|S_IRUSR);
+               if (fd < 0 || close(fd) < 0)
+                       return -1;
+               return 0;
+       }
+
 #if !defined MKNOD_CREATES_FIFOS && defined HAVE_MKFIFO
        if (S_ISFIFO(mode))
                return mkfifo(pathname, mode);
@@ -87,14 +95,15 @@ int do_mknod(char *pathname, mode_t mode, dev_t dev)
        if (S_ISSOCK(mode)) {
                int sock;
                struct sockaddr_un saddr;
-               unsigned int len;
-
-               saddr.sun_family = AF_UNIX;
-               len = strlcpy(saddr.sun_path, pathname, sizeof saddr.sun_path);
+#ifdef HAVE_SOCKADDR_UN_LEN
+               unsigned int len =
+#endif
+                   strlcpy(saddr.sun_path, pathname, sizeof saddr.sun_path);
 #ifdef HAVE_SOCKADDR_UN_LEN
                saddr.sun_len = len >= sizeof saddr.sun_path
                              ? sizeof saddr.sun_path : len + 1;
 #endif
+               saddr.sun_family = AF_UNIX;
 
                if ((sock = socket(PF_UNIX, SOCK_STREAM, 0)) < 0
                    || (unlink(pathname) < 0 && errno != ENOENT)