]> git.ipfire.org Git - thirdparty/man-pages.git/blobdiff - man2/rename.2
prctl.2: Add health warning
[thirdparty/man-pages.git] / man2 / rename.2
index 4c8d542a85c660d4cd0bb5987d73540c860ff68d..9faa92260eabf10bf76495565f0e227b4f65dbae 100644 (file)
 .\" Modified Thu Mar  3 09:49:35 2005 by Michael Haardt <michael@moria.de>
 .\" 2007-03-25, mtk, added various text to DESCRIPTION.
 .\"
-.TH RENAME 2 2014-02-21 "Linux" "Linux Programmer's Manual"
+.TH RENAME 2 2019-03-06 "Linux" "Linux Programmer's Manual"
 .SH NAME
-rename, renameat \- change the name or location of a file
+rename, renameat, renameat2 \- change the name or location of a file
 .SH SYNOPSIS
 .nf
 .B #include <stdio.h>
-.sp
+.PP
 .BI "int rename(const char *" oldpath ", const char *" newpath );
-.sp
+
 .BR "#include <fcntl.h>           " "/* Definition of AT_* constants */"
 .B #include <stdio.h>
-.sp
+.PP
 .BI "int renameat(int " olddirfd ", const char *" oldpath ,
 .BI "             int " newdirfd ", const char *" newpath );
+.PP
+.BI "int renameat2(int " olddirfd ", const char *" oldpath ,
+.BI "              int " newdirfd ", const char *" newpath \
+", unsigned int " flags );
 .fi
-.sp
+.PP
 .in -4n
 Feature Test Macro Requirements for glibc (see
 .BR feature_test_macros (7)):
 .in
-.sp
+.PP
 .BR renameat ():
 .PD 0
 .ad l
 .RS 4
 .TP 4
 Since glibc 2.10:
-_XOPEN_SOURCE\ >=\ 700 || _POSIX_C_SOURCE\ >=\ 200809L
+_POSIX_C_SOURCE\ >=\ 200809L
 .TP
 Before glibc 2.10:
 _ATFILE_SOURCE
 .RE
+.PP
+.BR renameat2 ():
+.RS 4
+.TP
+_GNU_SOURCE
+.RE
 .ad
 .PD
 .SH DESCRIPTION
@@ -73,15 +83,22 @@ are unaffected.
 Open file descriptors for
 .I oldpath
 are also unaffected.
-
+.PP
+Various restrictions determine whether or not the rename operation succeeds:
+see ERRORS below.
+.PP
 If
 .I newpath
-already exists, it will be atomically replaced (subject to
-a few conditions; see ERRORS below), so that there is
+already exists, it will be atomically replaced, so that there is
 no point at which another process attempting to access
 .I newpath
 will find it missing.
-
+However, there will probably be a window in which both
+.I oldpath
+and
+.I newpath
+refer to the file being renamed.
+.PP
 If
 .I oldpath
 and
@@ -89,7 +106,7 @@ and
 are existing hard links referring to the same file, then
 .BR rename ()
 does nothing, and returns a success status.
-
+.PP
 If
 .I newpath
 exists but the operation fails for some reason,
@@ -97,32 +114,25 @@ exists but the operation fails for some reason,
 guarantees to leave an instance of
 .I newpath
 in place.
-
+.PP
 .I oldpath
 can specify a directory.
 In this case,
 .I newpath
 must either not exist, or it must specify an empty directory.
-
-However, when overwriting there will probably be a window in which
-both
-.I oldpath
-and
-.I newpath
-refer to the file being renamed.
-
+.PP
 If
 .I oldpath
 refers to a symbolic link, the link is renamed; if
 .I newpath
 refers to a symbolic link, the link will be overwritten.
-.SS renameat ()
+.SS renameat()
 The
 .BR renameat ()
 system call operates in exactly the same way as
-.BR rename (2),
+.BR rename (),
 except for the differences described here.
-
+.PP
 If the pathname given in
 .I oldpath
 is relative, then it is interpreted relative to the directory
@@ -130,9 +140,9 @@ referred to by the file descriptor
 .I olddirfd
 (rather than relative to the current working directory of
 the calling process, as is done by
-.BR rename (2)
+.BR rename ()
 for a relative pathname).
-
+.PP
 If
 .I oldpath
 is relative and
@@ -143,14 +153,14 @@ then
 .I oldpath
 is interpreted relative to the current working
 directory of the calling process (like
-.BR rename (2)).
-
+.BR rename ()).
+.PP
 If
 .I oldpath
 is absolute, then
 .I olddirfd
 is ignored.
-
+.PP
 The interpretation of
 .I newpath
 is as for
@@ -158,11 +168,138 @@ is as for
 except that a relative pathname is interpreted relative
 to the directory referred to by the file descriptor
 .IR newdirfd .
-
+.PP
 See
 .BR openat (2)
 for an explanation of the need for
 .BR renameat ().
+.SS renameat2()
+.BR renameat2 ()
+has an additional
+.I flags
+argument.
+A
+.BR renameat2 ()
+call with a zero
+.I flags
+argument is equivalent to
+.BR renameat ().
+.PP
+The
+.I flags
+argument is a bit mask consisting of zero or more of the following flags:
+.TP
+.B RENAME_EXCHANGE
+Atomically exchange
+.IR oldpath
+and
+.IR newpath .
+Both pathnames must exist
+but may be of different types (e.g., one could be a non-empty directory
+and the other a symbolic link).
+.TP
+.B RENAME_NOREPLACE
+Don't overwrite
+.IR newpath
+of the rename.
+Return an error if
+.IR newpath
+already exists.
+.IP
+.B RENAME_NOREPLACE
+can't be employed together with
+.BR RENAME_EXCHANGE .
+.IP
+.B RENAME_NOREPLACE
+requires support from the underlying filesystem.
+Support for various filesystems was added as follows:
+.RS
+.IP * 3
+ext4 (Linux 3.15);
+.\" ext4: commit 0a7c3937a1f23f8cb5fc77ae01661e9968a51d0c
+.IP *
+btrfs, shmem, and cifs (Linux 3.17);
+.IP *
+xfs (Linux 4.0);
+.\" btrfs: commit 80ace85c915d0f41016f82917218997b72431258
+.\" shmem: commit 3b69ff51d087d265aa4af3a532fc4f20bf33e718
+.\" cifs: commit 7c33d5972ce382bcc506d16235f1e9b7d22cbef8
+.\"
+.\" gfs2 in 4.2?
+.IP *
+Support for many other filesystems was added in Linux 4.9, including
+ext2, minix, reiserfs, jfs, vfat, and bpf.
+.\" Also affs, bfs, exofs, hfs, hfsplus, jffs2, logfs, msdos,
+.\" nilfs2, omfs, sysvfs, ubifs, udf, ufs
+.\" hugetlbfs, ramfs
+.\" local filesystems: commit f03b8ad8d38634d13e802165cc15917481b47835
+.\" libfs: commit e0e0be8a835520e2f7c89f214dfda570922a1b90
+.RE
+.TP
+.BR RENAME_WHITEOUT " (since Linux 3.18)"
+.\" commit 0d7a855526dd672e114aff2ac22b60fc6f155b08
+.\" commit 787fb6bc9682ec7c05fb5d9561b57100fbc1cc41
+This operation makes sense only for overlay/union
+filesystem implementations.
+.IP
+Specifying
+.B RENAME_WHITEOUT
+creates a "whiteout" object at the source of
+the rename at the same time as performing the rename.
+The whole operation is atomic,
+so that if the rename succeeds then the whiteout will also have been created.
+.IP
+A "whiteout" is an object that has special meaning in union/overlay
+filesystem constructs.
+In these constructs,
+multiple layers exist and only the top one is ever modified.
+A whiteout on an upper layer will effectively hide a
+matching file in the lower layer,
+making it appear as if the file didn't exist.
+.IP
+When a file that exists on the lower layer is renamed,
+the file is first copied up (if not already on the upper layer)
+and then renamed on the upper, read-write layer.
+At the same time, the source file needs to be "whiteouted"
+(so that the version of the source file in the lower layer
+is rendered invisible).
+The whole operation needs to be done atomically.
+.IP
+When not part of a union/overlay,
+the whiteout appears as a character device with a {0,0} device number.
+.\" https://www.freebsd.org/cgi/man.cgi?query=mount_unionfs&manpath=FreeBSD+11.0-RELEASE
+(Note that other union/overlay implementations may employ different methods
+for storing whiteout entries; specifically, BSD union mount employs
+a separate inode type,
+.BR DT_WHT ,
+which, while supported by some filesystems available in Linux,
+such as CODA and XFS, is ignored by the kernel's whiteout support code,
+as of Linux 4.19, at least.)
+.IP
+.B RENAME_WHITEOUT
+requires the same privileges as creating a device node (i.e., the
+.BR CAP_MKNOD
+capability).
+.IP
+.B RENAME_WHITEOUT
+can't be employed together with
+.BR RENAME_EXCHANGE .
+.IP
+.B RENAME_WHITEOUT
+requires support from the underlying filesystem.
+Among the filesystems that provide that support are
+tmpfs (since Linux 3.18),
+.\" tmpfs: commit 46fdb794e3f52ef18b859ebc92f0a9d7db21c5df
+ext4 (since Linux 3.18),
+.\" ext4: commit cd808deced431b66b5fa4e5c193cb7ec0059eaff
+XFS (since Linux 4.1),
+.\" XFS: commit 7dcf5c3e4527cfa2807567b00387cf2ed5e07f00
+f2fs (since Linux 4.2),
+.\" f2fs: commit 7e01e7ad746bc8198a8b46163ddc73a1c7d22339
+btrfs (since Linux 4.7),
+.\" btrfs: commit cdd1fedf8261cd7a73c0596298902ff4f0f04492
+and ubifs (since Linux 4.9).
+.\" ubifs: commit 9e0a1fff8db56eaaebb74b4a3ef65f86811c4798
 .SH RETURN VALUE
 On success, zero is returned.
 On error, \-1 is returned, and
@@ -306,7 +443,9 @@ does not work across different mount points,
 even if the same filesystem is mounted on both.)
 .PP
 The following additional errors can occur for
-.BR renameat ():
+.BR renameat ()
+and
+.BR renameat2 ():
 .TP
 .B EBADF
 .I olddirfd
@@ -323,16 +462,92 @@ or similar for
 .I newpath
 and
 .I newdirfd
+.PP
+The following additional errors can occur for
+.BR renameat2 ():
+.TP
+.B EEXIST
+.I flags
+contains
+.B RENAME_NOREPLACE
+and
+.I newpath
+already exists.
+.TP
+.B EINVAL
+An invalid flag was specified in
+.IR flags .
+.TP
+.B EINVAL
+Both
+.B RENAME_NOREPLACE
+and
+.B RENAME_EXCHANGE
+were specified in
+.IR flags .
+.TP
+.B EINVAL
+Both
+.B RENAME_WHITEOUT
+and
+.B RENAME_EXCHANGE
+were specified in
+.IR flags .
+.TP
+.B EINVAL
+The filesystem does not support one of the flags in
+.IR flags .
+.TP
+.B ENOENT
+.I flags
+contains
+.B RENAME_EXCHANGE
+and
+.IR newpath
+does not exist.
+.TP
+.B EPERM
+.B RENAME_WHITEOUT
+was specified in
+.IR flags ,
+but the caller does not have the
+.B CAP_MKNOD
+capability.
 .SH VERSIONS
 .BR renameat ()
 was added to Linux in kernel 2.6.16;
 library support was added to glibc in version 2.4.
+.PP
+.BR renameat2 ()
+was added to Linux in kernel 3.15; library support was added in glibc 2.28.
 .SH CONFORMING TO
 .BR rename ():
 4.3BSD, C89, C99, POSIX.1-2001, POSIX.1-2008.
-
+.PP
 .BR renameat ():
 POSIX.1-2008.
+.PP
+.BR renameat2 ()
+is Linux-specific.
+.SH NOTES
+.\"
+.SS Glibc notes
+On older kernels where
+.BR renameat ()
+is unavailable, the glibc wrapper function falls back to the use of
+.BR rename ().
+When
+.I oldpath
+and
+.I newpath
+are relative pathnames,
+glibc constructs pathnames based on the symbolic links in
+.IR /proc/self/fd
+that correspond to the
+.I olddirfd
+and
+.IR newdirfd
+arguments.
 .SH BUGS
 On NFS filesystems, you can not assume that if the operation
 failed, the file was not renamed.