Skip to content
Snippets Groups Projects
Commit 23f43fae authored by Colin Walters's avatar Colin Walters
Browse files

Merge branch 'reopen-rdonly' into 'master'

fdio: Add glnx_tmpfile_reopen_rdonly()

See merge request GNOME/libglnx!11
parents 41ecc544 0cf0955a
No related branches found
No related tags found
No related merge requests found
...@@ -363,8 +363,7 @@ glnx_link_tmpfile_at (GLnxTmpfile *tmpf, ...@@ -363,8 +363,7 @@ glnx_link_tmpfile_at (GLnxTmpfile *tmpf,
{ {
/* This case we have O_TMPFILE, so our reference to it is via /proc/self/fd */ /* This case we have O_TMPFILE, so our reference to it is via /proc/self/fd */
char proc_fd_path[strlen("/proc/self/fd/") + DECIMAL_STR_MAX(tmpf->fd) + 1]; char proc_fd_path[strlen("/proc/self/fd/") + DECIMAL_STR_MAX(tmpf->fd) + 1];
snprintf (proc_fd_path, sizeof (proc_fd_path), "/proc/self/fd/%i", tmpf->fd);
sprintf (proc_fd_path, "/proc/self/fd/%i", tmpf->fd);
if (replace) if (replace)
{ {
...@@ -424,6 +423,45 @@ glnx_link_tmpfile_at (GLnxTmpfile *tmpf, ...@@ -424,6 +423,45 @@ glnx_link_tmpfile_at (GLnxTmpfile *tmpf,
return TRUE; return TRUE;
} }
/* glnx_tmpfile_reopen_rdonly:
* @tmpf: tmpfile
* @error: Error
*
* Give up write access to the file descriptior. One use
* case for this is fs-verity, which requires a read-only fd.
* It could also be useful to allocate an anonymous tmpfile
* write some sort of caching/indexing data to it, then reopen it
* read-only thereafter.
**/
gboolean
glnx_tmpfile_reopen_rdonly (GLnxTmpfile *tmpf,
GError **error)
{
g_return_val_if_fail (tmpf->fd >= 0, FALSE);
g_return_val_if_fail (tmpf->src_dfd == AT_FDCWD || tmpf->src_dfd >= 0, FALSE);
glnx_fd_close int rdonly_fd = -1;
if (tmpf->path)
{
if (!glnx_openat_rdonly (tmpf->src_dfd, tmpf->path, FALSE, &rdonly_fd, error))
return FALSE;
}
else
{
/* This case we have O_TMPFILE, so our reference to it is via /proc/self/fd */
char proc_fd_path[strlen("/proc/self/fd/") + DECIMAL_STR_MAX(tmpf->fd) + 1];
snprintf (proc_fd_path, sizeof (proc_fd_path), "/proc/self/fd/%i", tmpf->fd);
if (!glnx_openat_rdonly (AT_FDCWD, proc_fd_path, TRUE, &rdonly_fd, error))
return FALSE;
}
glnx_close_fd (&tmpf->fd);
tmpf->fd = glnx_steal_fd (&rdonly_fd);
return TRUE;
}
/** /**
* glnx_openat_rdonly: * glnx_openat_rdonly:
* @dfd: File descriptor for origin directory * @dfd: File descriptor for origin directory
......
...@@ -110,6 +110,10 @@ glnx_link_tmpfile_at (GLnxTmpfile *tmpf, ...@@ -110,6 +110,10 @@ glnx_link_tmpfile_at (GLnxTmpfile *tmpf,
const char *target, const char *target,
GError **error); GError **error);
gboolean
glnx_tmpfile_reopen_rdonly (GLnxTmpfile *tmpf,
GError **error);
gboolean gboolean
glnx_openat_rdonly (int dfd, glnx_openat_rdonly (int dfd,
const char *path, const char *path,
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment