- if (ret_val == 0 || errno != ENOENT)
- return ret_val;
-
- /* Don't call rename again if there are no trailing slashes. */
- d_len = strlen (dst);
- if ( ! has_trailing_slash (dst, d_len))
- return ret_val;
-
- {
- /* Fail now, unless SRC is a directory. */
- struct stat sb;
- if (lstat (src, &sb) != 0 || ! S_ISDIR (sb.st_mode))
- return ret_val;
- }
-
- {
- char *dst_temp;
- dst_temp = xmemdup (dst, d_len + 1);
- strip_trailing_slashes (dst_temp);
-
- ret_val = rename (src, dst_temp);
- free (dst_temp);
- }
+
+ 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);
+ strip_trailing_slashes (dst_temp);
+ ret_val = rename (src, dst_temp);
+ rename_errno = errno;
+ free (dst_temp);
+ }
+
+ errno = rename_errno;
+ }