# HG changeset patch # User Eric Blake # Date 1254358622 21600 # Node ID e3b5ec5715b7ba374185c1b96f5cb01b894b5b09 # Parent 4884000a2d0c73477348c0cbd060384a31750bc5 rename-dest-slash: fix NetBSD bug rename("hard1","hard2") mistakenly removed the hard link "hard1". * lib/rename-dest-slash.c (rpl_rename_dest_slash): Detect hard links. * modules/rename-dest-slash (Depends-on): Add same-inode. Signed-off-by: Eric Blake diff --git a/ChangeLog b/ChangeLog --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,10 @@ 2009-10-02 Eric Blake + rename-dest-slash: fix NetBSD bug + * lib/rename-dest-slash.c (rpl_rename_dest_slash): Detect hard + links. + * modules/rename-dest-slash (Depends-on): Add same-inode. + rename-tests: new test, exposes several platform bugs * modules/rename-tests: New file. * tests/test-rename.h: Likewise. diff --git a/lib/rename-dest-slash.c b/lib/rename-dest-slash.c --- a/lib/rename-dest-slash.c +++ b/lib/rename-dest-slash.c @@ -6,7 +6,7 @@ (namely mv) relying on the rename syscall have more consistent semantics. - Copyright (C) 2006 Free Software Foundation, Inc. + Copyright (C) 2006, 2009 Free Software Foundation, Inc. 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 @@ -35,6 +35,7 @@ #include #include "dirname.h" +#include "same-inode.h" #include "xalloc.h" static bool @@ -63,14 +64,22 @@ int rpl_rename_dest_slash (char const *src, char const *dst) { - int ret_val = rename (src, dst); + struct stat sb; + struct stat db; + int ret_val; + + if (lstat (src, &sb)) + return -1; + if (lstat (dst, &db) == 0 && SAME_INODE (sb, db)) + return 0; + + ret_val = rename (src, dst); if (ret_val != 0 && errno == ENOENT && has_trailing_slash (dst)) { int rename_errno = ENOENT; /* Fail now, unless SRC is a directory. */ - struct stat sb; if (lstat (src, &sb) == 0 && S_ISDIR (sb.st_mode)) { char *dst_temp = xstrdup (dst); diff --git a/modules/rename-dest-slash b/modules/rename-dest-slash --- a/modules/rename-dest-slash +++ b/modules/rename-dest-slash @@ -6,8 +6,9 @@ m4/rename-dest-slash.m4 Depends-on: +dirname +same-inode xalloc -dirname configure.ac: gl_FUNC_RENAME_TRAILING_DEST_SLASH