libutil: Add a helper for O_TMPFILE + mmap()
I added `glnx_open_anonymous_tmpfile()`, but then later noticed that the usage of this was really to be combined with `mmap()`, and we had two versions of that in the delta code. Add a helper. (Bigger picture...how is this different from glibc's "mmap() of /dev/zero" approach for large chunks? One advantage is the storage can be "swapped" to `/var/tmp`, but still deleted automatically, rather than requiring swap space) Closes: #973 Approved by: jlebon
This commit is contained in:
1 parent
9d10bdfd0d
commit
6f2ea23e8a
4 files changed
+38
-49
No files matched your search
@@ -24,6 +24,7 @@
|
||||
#include "libglnx.h"
|
||||
#include <sys/xattr.h>
|
||||
#include <gio/gunixinputstream.h>
|
||||
#include <gio/gunixoutputstream.h>
|
||||
|
||||
/* Convert a fd-relative path to a GFile* - use
|
||||
* for legacy code.
|
||||
@@ -181,3 +182,29 @@ ot_file_mapat_bytes (int dfd,
|
||||
|
||||
return g_mapped_file_get_bytes (mfile);
|
||||
}
|
||||
|
||||
/* Given an input stream, splice it to an anonymous file (O_TMPFILE).
|
||||
* Useful for potentially large but transient files.
|
||||
*/
|
||||
GBytes *
|
||||
ot_map_anonymous_tmpfile_from_content (GInputStream *instream,
|
||||
GCancellable *cancellable,
|
||||
GError **error)
|
||||
{
|
||||
g_auto(GLnxTmpfile) tmpf = { 0, };
|
||||
if (!glnx_open_anonymous_tmpfile (O_RDWR | O_CLOEXEC, &tmpf, error))
|
||||
return NULL;
|
||||
|
||||
g_autoptr(GOutputStream) out = g_unix_output_stream_new (tmpf.fd, FALSE);
|
||||
gssize n_bytes_written = g_output_stream_splice (out, instream,
|
||||
G_OUTPUT_STREAM_SPLICE_CLOSE_SOURCE |
|
||||
G_OUTPUT_STREAM_SPLICE_CLOSE_TARGET,
|
||||
cancellable, error);
|
||||
if (n_bytes_written < 0)
|
||||
return NULL;
|
||||
|
||||
g_autoptr(GMappedFile) mfile = g_mapped_file_new_from_fd (tmpf.fd, FALSE, error);
|
||||
if (!mfile)
|
||||
return NULL;
|
||||
return g_mapped_file_get_bytes (mfile);
|
||||
}
|
||||
@@ -86,6 +86,11 @@ gboolean ot_dfd_iter_init_allow_noent (int dfd,
|
||||
gboolean *out_exists,
|
||||
GError **error);
|
||||
|
||||
GBytes *
|
||||
ot_map_anonymous_tmpfile_from_content (GInputStream *instream,
|
||||
GCancellable *cancellable,
|
||||
GError **error);
|
||||
|
||||
GBytes *ot_file_mapat_bytes (int dfd,
|
||||
const char *path,
|
||||
GError **error);
|
||||
|
||||
Reference in new issue
Block a user