summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--hurd/lookup-at.c21
-rw-r--r--sysdeps/mach/hurd/bits/fcntl.h4
2 files changed, 25 insertions, 0 deletions
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.  */