From e8233c6356ea5c27cf376c157344a1ff47843a57 Mon Sep 17 00:00:00 2001
From: Alexander Larsson <alexl@redhat.com>
Date: Wed, 9 Oct 2019 14:56:11 +0200
Subject: [PATCH] Add glnx_open_anonymous_tmpfile_full() allowing you to
 specify the directory

This is useful if you need the file to be on a particular filesystem.
In particular, flatpak wants this to make tempfiles on /tmp for things
we need to write during flatpak run, such as the libseccomp output fd.

We've had "flatpak run" stop working in low disk situations without this,
so its nice to be able to fix it.
---
 glnx-fdio.c | 29 +++++++++++++++++++++++------
 glnx-fdio.h |  7 +++++++
 2 files changed, 30 insertions(+), 6 deletions(-)

diff --git a/glnx-fdio.c b/glnx-fdio.c
index 7b734ff6f..1dc5ffd17 100644
--- a/glnx-fdio.c
+++ b/glnx-fdio.c
@@ -277,17 +277,19 @@ glnx_open_tmpfile_linkable_at (int dfd,
   return open_tmpfile_core (dfd, subpath, flags, out_tmpf, error);
 }
 
+
 /* A variant of `glnx_open_tmpfile_linkable_at()` which doesn't support linking.
- * Useful for true temporary storage. The fd will be allocated in /var/tmp to
- * ensure maximum storage space.
+ * Useful for true temporary storage. The fd will be allocated in the specified
+ * directory.
  */
 gboolean
-glnx_open_anonymous_tmpfile (int          flags,
-                             GLnxTmpfile *out_tmpf,
-                             GError     **error)
+glnx_open_anonymous_tmpfile_full (int          flags,
+                                  const char  *dir,
+                                  GLnxTmpfile *out_tmpf,
+                                  GError     **error)
 {
   /* Add in O_EXCL */
-  if (!open_tmpfile_core (AT_FDCWD, "/var/tmp", flags | O_EXCL, out_tmpf, error))
+  if (!open_tmpfile_core (AT_FDCWD, dir, flags | O_EXCL, out_tmpf, error))
     return FALSE;
   if (out_tmpf->path)
     {
@@ -299,6 +301,21 @@ glnx_open_anonymous_tmpfile (int          flags,
   return TRUE;
 }
 
+/* A variant of `glnx_open_tmpfile_linkable_at()` which doesn't support linking.
+ * Useful for true temporary storage. The fd will be allocated in /var/tmp to
+ * ensure maximum storage space.
+ *
+ * If you need the file on a specific filesystem use glnx_open_anonymous_tmpfile_full()
+ * which lets you pass a directory.
+ */
+gboolean
+glnx_open_anonymous_tmpfile (int          flags,
+                             GLnxTmpfile *out_tmpf,
+                             GError     **error)
+{
+  return glnx_open_anonymous_tmpfile_full (flags, "/var/tmp", out_tmpf, error);
+}
+
 /* Use this after calling glnx_open_tmpfile_linkable_at() to give
  * the file its final name (link into place).
  */
diff --git a/glnx-fdio.h b/glnx-fdio.h
index c0a7cc1de..d97ea3668 100644
--- a/glnx-fdio.h
+++ b/glnx-fdio.h
@@ -83,6 +83,13 @@ glnx_open_anonymous_tmpfile (int flags,
                              GLnxTmpfile *out_tmpf,
                              GError **error);
 
+gboolean
+glnx_open_anonymous_tmpfile_full (int flags,
+                                  const char *dir,
+                                  GLnxTmpfile *out_tmpf,
+                                  GError **error);
+
+
 gboolean
 glnx_open_tmpfile_linkable_at (int dfd,
                                const char *subpath,
-- 
GitLab