RENAME(2) | System Calls Manual | RENAME(2) |
rename
, renameat
,
renamex_np
, renameatx_np
— change the name of a file
#include
<stdio.h>
int
rename
(const char *old,
const char *new);
int
renameat
(int
fromfd, const char
*from, int tofd,
const char *to);
int
renamex_np
(const
char *from, const char
*to, unsigned int
flags);
int
renameatx_np
(int
fromfd, const char
*from, int tofd,
const char *to,
unsigned int flags);
The
rename
()
system call causes the link named old to be renamed as
new. If new exists, it is first
removed. Both old and new must
be of the same type (that is, both must be either directories or
non-directories) and must reside on the same file system.
The
rename
()
system call guarantees that an instance of new will
always exist, even if the system should crash in the middle of the
operation.
If the final component of old is a symbolic link, the symbolic link is renamed, not the file or directory to which it points.
The
renameat
()
system call is equivalent to rename
() except in the
case where either from or to
specifies a relative path. If from is a relative path,
the file to be renamed is located relative to the directory associated with
the file descriptor fromfd instead of the current
working directory. If the to is a relative path, the
same happens only relative to the directory associated with
tofd. If the renameat
() is
passed the special value AT_FDCWD
in the
fromfd or tofd parameter, the
current working directory is used in the determination of the file for the
respective path parameter.
The
renamex_np
()
and
renameatx_np
()
system calls are similar to their counterparts except that they take a
flags argument. Values for flags
are constructed with below bits set:
RENAME_SWAP
VOL_CAP_INT_RENAME_SWAP
), it will cause the source
and target to be atomically swapped. Source and target need not be of the
same type, i.e. it is possible to swap a file with a directory. EINVAL is
returned in case of bitwise-inclusive OR with
RENAME_EXCL
.RENAME_EXCL
VOL_CAP_INT_RENAME_EXCL
), it will cause
EEXIST
to be returned if the destination already
exists. EINVAL is returned in case of bitwise-inclusive OR with
RENAME_SWAP
.RENAME_NOFOLLOW_ANY
The system can deadlock if a loop is present in the file system
graph. This loop takes the form of an entry in directory
‘a
’, say
‘a/foo
’, being
a hard link to directory
‘b
’, and an
entry in directory
‘b
’, say
‘b/bar
’, being
a hard link to directory
‘a
’. When such
a loop exists and two separate processes attempt to perform
‘rename a/foo b/bar
’ and
‘rename b/bar a/foo
’, respectively,
the system may deadlock attempting to lock both directories for
modification.
Whether or not hard links to directories are supported is specific to the underlying filesystem implementation.
It is recommended that any hard links to directories in an underlying filesystem should be replaced by symbolic links by the system administrator to avoid the possibility of deadlocks.
Moving or renaming a file or directory into a directory with
inheritable ACLs does not result in ACLs being set on the file or directory.
Use acl(3) in conjunction with
rename
() to set ACLs on the file or directory.
A 0 value is returned if the operation succeeds, otherwise
rename
() returns -1 and the global variable
errno indicates the reason for the failure.
The rename
() system call will fail and
neither of the argument files will be affected if:
EACCES
]EACCES
]EACCES
]VOL_CAP_INT_RENAME_OPENFAIL
).EDQUOT
]EEXIST
]RENAME_EXCL
set
but new already exists.EFAULT
]EINVAL
].
’ or
‘..
’. If
RENAME_SWAP
is used, then
EINVAL
will also be returned if
new is a parent directory of
old. If both RENAME_SWAP and RENAME_EXCL bits are
set in flags, then EINVAL
will be returned.EINVAL
]EIO
]EISDIR
]ELOOP
]ELOOP
]ENAMETOOLONG
]{NAME_MAX}
characters, or an entire path name exceeds
{PATH_MAX}
characters.ENOENT
]ENOENT
]RENAME_SWAP
set
but new does not exist.ENOSPC
]ENOTDIR
]ENOTDIR
]ENOTEMPTY
]ENOTSUP
]EPERM
]EPERM
]EROFS
]EXDEV
]EDEADLK
]EDEADLK
]The renameat
() and
renameatx_np
() calls may also fail with:
EBADF
]AT_FDCWD
nor a valid file descriptor open for
searching, or the to argument does not specify an
absolute path and the tofd argument is neither
AT_FDCWD
nor a valid file descriptor open for
searching.ENOTDIR
]AT_FDCWD
nor a file descriptor associated with a directory, or the
to argument is not an absolute path and
tofd is neither AT_FDCWD
nor
a file descriptor associated with a directory.The restriction on renaming a directory whose permissions disallow writing is based on the fact that UFS directories contain a ".." entry. If renaming a directory would move it to another parent directory, this entry needs to be changed.
This restriction has been generalized to disallow renaming of any write-disabled directory, even when this would not require a change to the ".." entry. For consistency, HFS+ directories emulate this behavior.
The rename
() function conforms to
IEEE Std 1003.1-1988 (“POSIX.1”). The
renameat
() system call is expected to conform to
POSIX.1-2008 .
June 3, 2021 | BSD 4.2 |