allow symbolic links to replace existing file.
authorRalph Campbell <ralph@ucbvax.Berkeley.EDU>
Sat, 8 Dec 1984 03:54:08 +0000 (19:54 -0800)
committerRalph Campbell <ralph@ucbvax.Berkeley.EDU>
Sat, 8 Dec 1984 03:54:08 +0000 (19:54 -0800)
SCCS-vsn: usr.bin/rdist/server.c 4.22

usr/src/usr.bin/rdist/server.c

index 1f8195f..b727ab2 100644 (file)
@@ -1,5 +1,5 @@
 #ifndef lint
 #ifndef lint
-static char *sccsid = "@(#)server.c    4.21 (Berkeley) 84/12/06";
+static char *sccsid = "@(#)server.c    4.22 (Berkeley) 84/12/07";
 #endif
 
 #include "defs.h"
 #endif
 
 #include "defs.h"
@@ -718,15 +718,17 @@ recvf(cmd, type)
                        err();
                        return;
                }
                        err();
                        return;
                }
-               if (symlink(buf, new) < 0)
-                       goto badn;
+               if (symlink(buf, new) < 0) {
+                       if (errno != ENOENT || chkparent(new) < 0 ||
+                           symlink(buf, new) < 0)
+                               goto badn;
+               }
                mode &= 0777;
                if (opts & COMPARE) {
                        char tbuf[BUFSIZ];
 
                mode &= 0777;
                if (opts & COMPARE) {
                        char tbuf[BUFSIZ];
 
-                       if ((i = readlink(target, tbuf, BUFSIZ)) < 0)
-                               goto badt;
-                       if (i == size && strncmp(buf, tbuf, size) == 0) {
+                       if ((i = readlink(target, tbuf, BUFSIZ)) >= 0 &&
+                           i == size && strncmp(buf, tbuf, size) == 0) {
                                (void) unlink(new);
                                ack();
                                return;
                                (void) unlink(new);
                                ack();
                                return;
@@ -740,7 +742,7 @@ recvf(cmd, type)
        if ((f = creat(new, mode)) < 0) {
                if (errno != ENOENT || chkparent(new) < 0 ||
                    (f = creat(new, mode)) < 0)
        if ((f = creat(new, mode)) < 0) {
                if (errno != ENOENT || chkparent(new) < 0 ||
                    (f = creat(new, mode)) < 0)
-                       goto badt;
+                       goto badn;
        }
 
        ack();
        }
 
        ack();
@@ -822,12 +824,11 @@ badn:
                (void) unlink(new);
                return;
        }
                (void) unlink(new);
                return;
        }
-fixup:
        if (chog(new, owner, group, mode) < 0) {
                (void) unlink(new);
                return;
        }
        if (chog(new, owner, group, mode) < 0) {
                (void) unlink(new);
                return;
        }
-       
+fixup:
        if (rename(new, target) < 0) {
 badt:
                error("%s:%s: %s\n", host, target, sys_errlist[errno]);
        if (rename(new, target) < 0) {
 badt:
                error("%s:%s: %s\n", host, target, sys_errlist[errno]);