public inbox for glibc-cvs@sourceware.org
help / color / mirror / Atom feed
* [glibc] hurd: Implement O_TMPFILE
@ 2023-02-01 22:33 Samuel Thibault
  0 siblings, 0 replies; only message in thread
From: Samuel Thibault @ 2023-02-01 22:33 UTC (permalink / raw)
  To: glibc-cvs

https://sourceware.org/git/gitweb.cgi?p=glibc.git;h=65392c84782a53b0d7705ca0207c95c3da41c7dc

commit 65392c84782a53b0d7705ca0207c95c3da41c7dc
Author: Sergey Bugaev <bugaevc@gmail.com>
Date:   Mon Jan 30 15:52:15 2023 +0300

    hurd: Implement O_TMPFILE
    
    This is a flag that causes open () to create a new, unnamed file in the
    same filesystem as the given directory. The file descriptor can be
    simply used in the creating process as a temporary file, or shared with
    children processes via fork (), or sent over a Unix socket. The file can
    be left anonymous, in which case it will be deleted from the backing
    file system once all copies of the file descriptor are closed, or given
    a permanent name with a linkat () call, such as the following:
    
    int fd = open ("/tmp", O_TMPFILE | O_RDWR, 0700);
    /* Do something with the file... */
    linkat (fd, "", AT_FDCWD, "/tmp/filename", AT_EMPTY_PATH);
    
    In between creating the file and linking it to the file system, it is
    possible to set the file content, mode, ownership, author, and other
    attributes, so that the file visibly appears in the file system (perhaps
    replacing another file) atomically, with all of its attributes already
    set up.
    
    The Hurd support for O_TMPFILE directly exposes the dir_mkfile RPC to
    user programs. Previously, dir_mkfile was used by glibc internally, in
    particular for implementing tmpfile (), but not exposed to user programs
    through a Unix-level API.
    
    O_TMPFILE was initially introduced by Linux. This implementation is
    intended to be compatible with the Linux implementation, except that the
    O_EXCL flag is not given the special meaning when used together with
    O_TMPFILE, unlike on Linux.
    
    Signed-off-by: Sergey Bugaev <bugaevc@gmail.com>
    Message-Id: <20230130125216.6254-3-bugaevc@gmail.com>

Diff:
---
 hurd/lookup-at.c               | 21 +++++++++++++++++++++
 sysdeps/mach/hurd/bits/fcntl.h |  4 ++++
 2 files changed, 25 insertions(+)

diff --git a/hurd/lookup-at.c b/hurd/lookup-at.c
index 25dab5a16b..88c8377941 100644
--- a/hurd/lookup-at.c
+++ b/hurd/lookup-at.c
@@ -29,6 +29,7 @@ __file_name_lookup_at (int fd, int at_flags,
   error_t err;
   file_t result;
   int empty = at_flags & AT_EMPTY_PATH;
+  int orig_flags;
 
   at_flags &= ~AT_EMPTY_PATH;
 
@@ -53,6 +54,10 @@ __file_name_lookup_at (int fd, int at_flags,
       return err ? (__hurd_dfail (fd, err), MACH_PORT_NULL) : result;
     }
 
+  orig_flags = flags;
+  if (flags & O_TMPFILE)
+    flags = O_DIRECTORY;
+
   if (fd == AT_FDCWD || file_name[0] == '/')
     {
       err = __hurd_file_name_lookup (&_hurd_ports_use, &__getdport, 0,
@@ -90,6 +95,22 @@ __file_name_lookup_at (int fd, int at_flags,
         }
     }
 
+  if (orig_flags & O_TMPFILE)
+    {
+      /* What we have looked up is not the file itself, but actually
+         the directory to create the file in.  Do that now.  */
+      file_t dir = result;
+
+      err = __dir_mkfile (dir, orig_flags & ~(O_TMPFILE | O_DIRECTORY),
+                          mode, &result);
+      __mach_port_deallocate (__mach_task_self (), dir);
+      if (err)
+        {
+          __hurd_fail (err);
+          return MACH_PORT_NULL;
+        }
+    }
+
   return result;
 }
 
diff --git a/sysdeps/mach/hurd/bits/fcntl.h b/sysdeps/mach/hurd/bits/fcntl.h
index 970f79b82d..c24a819e02 100644
--- a/sysdeps/mach/hurd/bits/fcntl.h
+++ b/sysdeps/mach/hurd/bits/fcntl.h
@@ -123,6 +123,10 @@
 # define O_CLOEXEC	0x00400000 /* Set FD_CLOEXEC.  */
 #endif
 
+#ifdef __USE_GNU
+# define O_TMPFILE	0x00800000 /* Make a new unnamed file.  */
+#endif
+
 
 /* Controlling terminal flags.  These are understood only by `open',
    and are not preserved once the file has been opened.  */

^ permalink raw reply	[flat|nested] only message in thread

only message in thread, other threads:[~2023-02-01 22:33 UTC | newest]

Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2023-02-01 22:33 [glibc] hurd: Implement O_TMPFILE Samuel Thibault

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).