Add stub for new libglnx tmpfile API, port simpler callers to it
It's hard right now to do a full port to the new libglnx tmpfile API since there are complex cases in the commit path which deal with symlinks as well. Let's make things more gradual by introducing the important part (struct with autocleanup) here in libotutil, port what we can. This will make a future complete port easier. Closes: #871 Approved by: jlebon
This commit is contained in:
1 parent
db00c9591f
commit
e99777e8d2
5 files changed
+117
-60
No files matched your search
@@ -25,6 +25,61 @@
|
||||
#include <sys/xattr.h>
|
||||
#include <gio/gunixinputstream.h>
|
||||
|
||||
/* Before https://github.com/GNOME/libglnx/commit/9929adc, the libglnx
|
||||
* tmpfile API made it hard to clean up tmpfiles in failure cases.
|
||||
* it's API breaking. Carry the fix here until we're ready to fully port.
|
||||
*/
|
||||
void
|
||||
ot_tmpfile_clear (OtTmpfile *tmpf)
|
||||
{
|
||||
if (!tmpf->initialized)
|
||||
return;
|
||||
if (tmpf->fd == -1)
|
||||
return;
|
||||
(void) close (tmpf->fd);
|
||||
/* If ->path is set, we're likely aborting due to an error. Clean it up */
|
||||
if (tmpf->path)
|
||||
{
|
||||
(void) unlinkat (tmpf->src_dfd, tmpf->path, 0);
|
||||
g_free (tmpf->path);
|
||||
}
|
||||
}
|
||||
|
||||
gboolean
|
||||
ot_open_tmpfile_linkable_at (int dfd,
|
||||
const char *subpath,
|
||||
int flags,
|
||||
OtTmpfile *out_tmpf,
|
||||
GError **error)
|
||||
{
|
||||
if (!glnx_open_tmpfile_linkable_at (dfd, subpath, flags, &out_tmpf->fd, &out_tmpf->path, error))
|
||||
return FALSE;
|
||||
out_tmpf->initialized = TRUE;
|
||||
out_tmpf->src_dfd = dfd;
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
gboolean
|
||||
ot_link_tmpfile_at (OtTmpfile *tmpf,
|
||||
GLnxLinkTmpfileReplaceMode mode,
|
||||
int target_dfd,
|
||||
const char *target,
|
||||
GError **error)
|
||||
{
|
||||
g_return_val_if_fail (tmpf->initialized, FALSE);
|
||||
glnx_fd_close int fd = glnx_steal_fd (&tmpf->fd);
|
||||
if (!glnx_link_tmpfile_at (tmpf->src_dfd, mode, fd, tmpf->path,
|
||||
target_dfd, target, error))
|
||||
{
|
||||
if (tmpf->path)
|
||||
(void) unlinkat (tmpf->src_dfd, tmpf->path, 0);
|
||||
tmpf->initialized = FALSE;
|
||||
return FALSE;
|
||||
}
|
||||
tmpf->initialized = FALSE;
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
/* Convert a fd-relative path to a GFile* - use
|
||||
* for legacy code.
|
||||
*/
|
||||
|
||||
@@ -25,6 +25,30 @@
|
||||
|
||||
G_BEGIN_DECLS
|
||||
|
||||
/* This is a copy of https://github.com/GNOME/libglnx/pull/46 until we
|
||||
* can do a full port; see https://github.com/ostreedev/ostree/pull/861 */
|
||||
typedef struct {
|
||||
gboolean initialized;
|
||||
int src_dfd;
|
||||
int fd;
|
||||
char *path;
|
||||
} OtTmpfile;
|
||||
void ot_tmpfile_clear (OtTmpfile *tmpf);
|
||||
G_DEFINE_AUTO_CLEANUP_CLEAR_FUNC(OtTmpfile, ot_tmpfile_clear);
|
||||
|
||||
gboolean
|
||||
ot_open_tmpfile_linkable_at (int dfd,
|
||||
const char *subpath,
|
||||
int flags,
|
||||
OtTmpfile *out_tmpf,
|
||||
GError **error);
|
||||
gboolean
|
||||
ot_link_tmpfile_at (OtTmpfile *tmpf,
|
||||
GLnxLinkTmpfileReplaceMode flags,
|
||||
int target_dfd,
|
||||
const char *target,
|
||||
GError **error);
|
||||
|
||||
GFile * ot_fdrel_to_gfile (int dfd, const char *path);
|
||||
|
||||
gboolean ot_readlinkat_gfile_info (int dfd,
|
||||
|
||||
Reference in new issue
Block a user