diff options
| author | Michael Kerrisk <mtk.manpages@gmail.com> | 2014-01-20 14:42:18 +0100 |
|---|---|---|
| committer | Michael Kerrisk <mtk.manpages@gmail.com> | 2014-01-24 11:44:56 +0100 |
| commit | 8e3353915cbb339206d2e96a07151052f122fb0d (patch) | |
| tree | c44e41990c0af10a7a387d5fd55285b249a22cdd | |
| parent | e6f89ed2217933309100c8e9f763c296e8881c9e (diff) | |
| download | man-pages-8e3353915cbb339206d2e96a07151052f122fb0d.tar.gz | |
open.2: Significant enhancements to O_TMPFILE discussion
Describe use of linkat() with O_TMPFILE.
Note main use cases for O_TMPFILE.
Signed-off-by: Michael Kerrisk <mtk.manpages@gmail.com>
| -rw-r--r-- | man2/open.2 | 79 |
1 files changed, 73 insertions, 6 deletions
diff --git a/man2/open.2 b/man2/open.2 index c6f34d41e2..8959686d4a 100644 --- a/man2/open.2 +++ b/man2/open.2 @@ -290,6 +290,9 @@ The following symbolic constants are provided for .RE .TP .BR O_TMPFILE " (Since Linux 3.11)" +.\" commit 60545d0d4610b02e55f65d141c95b18ccf855b6e +.\" commit f4e0c30c191f87851c4a53454abb55ee276f4a7e +.\" commit bb458c644a59dbba3a1fe59b27106c5e68e1c4bd Create an unnamed temporary file. The .I pathname @@ -297,8 +300,7 @@ argument specifies a directory; an unnamed inode will be created in that directory's filesystem. Anything written to the resulting file will be lost when the last file descriptor is closed, unless the file is given a name. -.RS -.PP + .B O_TMPFILE must be specified with one of .B O_RDWR @@ -311,12 +313,50 @@ If is not specified, then .BR linkat (2) can be used to link the temporary file into the filesystem, making it -permanent. -.PP -The +permanent, using code like the following: + +.in +4n +.nf +char path[PATH_MAX]; +fd = open("/path/to/dir", O_TMPFILE | O_RDWR, + S_IRUSR | S_IWUSR); +/* File I/O on 'fd'... */ +snprintf(path, PATH_MAX, "/proc/self/fd/%d", fd); +linkat(AT_FDCWD, path, AT_FDCWD, argv[2], + AT_SYMLINK_FOLLOW); +.fi +.in + +In this case, +the +.BR open () .I mode -argument determines the inode's mode, as with +argument determines the file permission mode, as with .BR O_CREAT . + +There are two main use cases for +.\" Inspired by http://lwn.net/Articles/559147/ +.BR O_TMPFILE : +.RS +.IP * 3 +Improved +.BR tmpfile (3) +functionality: race-free creation of temporary files that +(1) are automatically deleted when closed; +(2) can never be reached via any pathname; +(3) are not subject to symlink attacks; and +(4) do not require the caller to devise unique names. +.IP * +Creating a file that is initially invisible, which is then populated +with data and adjusted to have approriate filesystem attributes +.RB ( chown (2), +.BR chmod (2), +.BR fsetxattr (2), +etc.) +before being atomically linked into the filesystem +in a fully formed state (using +.BR linkat (2) +as described above). .RE .TP .BR O_DIRECT " (Since Linux 2.4.10)" @@ -654,6 +694,21 @@ See .BR NOTES for more information. .TP +.B EINVAL +Invalid value in +.\" In particular, __O_TMPFILE instead of O_TMPFILE +.IR flags . +.TP +.B EINVAL +.B O_TMPFILE +was specified in +.IR flags , +but neither +.B O_WRONLY +nor +.B O_RDWR +was specified. +.TP .B EISDIR .I pathname refers to a directory and the access requested involved writing @@ -663,6 +718,18 @@ or .B O_RDWR is set). .TP +.B EISDIR +.B O_TMPFILE +and one of +.B O_WRONLY +or +.B O_RDWR +were specified in +.IR flags , +but this kernel version does not provide the +.B O_TMPFILE +functionality. +.TP .B ELOOP Too many symbolic links were encountered in resolving .IR pathname , |
