diff --git a/glnx-fdio.c b/glnx-fdio.c index ad43e61d727d7d8219382a84aa2e9197823f8c15..c8da35e87f6472042f55d531c2e1f4aca7f0b59a 100644 --- a/glnx-fdio.c +++ b/glnx-fdio.c @@ -244,6 +244,27 @@ glnx_open_tmpfile_linkable_at (int dfd, return FALSE; } +/* 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. + */ +gboolean +glnx_open_anonymous_tmpfile (int flags, + GLnxTmpfile *out_tmpf, + GError **error) +{ + if (!glnx_open_tmpfile_linkable_at (AT_FDCWD, "/var/tmp", flags, out_tmpf, error)) + return FALSE; + if (out_tmpf->path) + { + (void) unlinkat (out_tmpf->src_dfd, out_tmpf->path, 0); + g_clear_pointer (&out_tmpf->path, g_free); + } + out_tmpf->anonymous = TRUE; + out_tmpf->src_dfd = -1; + return TRUE; +} + /* Use this after calling glnx_open_tmpfile_linkable_at() to give * the file its final name (link into place). */ @@ -257,7 +278,9 @@ glnx_link_tmpfile_at (GLnxTmpfile *tmpf, const gboolean replace = (mode == GLNX_LINK_TMPFILE_REPLACE); const gboolean ignore_eexist = (mode == GLNX_LINK_TMPFILE_NOREPLACE_IGNORE_EXIST); + g_return_val_if_fail (!tmpf->anonymous, FALSE); g_return_val_if_fail (tmpf->fd >= 0, FALSE); + g_return_val_if_fail (tmpf->src_dfd == AT_FDCWD || tmpf->src_dfd >= 0, FALSE); /* Unlike the original systemd code, this function also supports * replacing existing files. diff --git a/glnx-fdio.h b/glnx-fdio.h index bdccbe55f8b5408acc3ee39fbc6af0bc095da8a4..14ae57e55e9b2d989a111c88eae5548b0aa9f966 100644 --- a/glnx-fdio.h +++ b/glnx-fdio.h @@ -52,6 +52,7 @@ const char *glnx_basename (const char *path) typedef struct { gboolean initialized; + gboolean anonymous; int src_dfd; int fd; char *path; @@ -59,6 +60,11 @@ typedef struct { void glnx_tmpfile_clear (GLnxTmpfile *tmpf); G_DEFINE_AUTO_CLEANUP_CLEAR_FUNC(GLnxTmpfile, glnx_tmpfile_clear); +gboolean +glnx_open_anonymous_tmpfile (int flags, + GLnxTmpfile *out_tmpf, + GError **error); + gboolean glnx_open_tmpfile_linkable_at (int dfd, const char *subpath,