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

Introduce glnx_gen_temp_name()

We have multiple copies growing again of this code.  glibc has this
API internally and uses it in multiple places, let's do the same.

Closes: #14
parent 40ef5f74
No related branches found
No related tags found
No related merge requests found
...@@ -277,20 +277,17 @@ glnx_fdrel_abspath (int dfd, ...@@ -277,20 +277,17 @@ glnx_fdrel_abspath (int dfd,
} }
/** /**
* glnx_mkdtempat: * glnx_gen_temp_name:
* @dfd: Directory fd * @tmpl: (type filename): template directory name, the last 6 characters will be replaced
* @tmpl: (type filename): template directory name
* @mode: permissions to create the temporary directory with
* @error: Error
* *
* Similar to g_mkdtemp_full, but using openat. * Replace the last 6 characters of @tmpl with random ASCII. You must
* use this in combination with a mechanism to ensure race-free file
* creation such as `O_EXCL`.
*/ */
gboolean void
glnx_mkdtempat (int dfd, glnx_gen_temp_name (gchar *tmpl)
gchar *tmpl,
int mode,
GError **error)
{ {
size_t len;
char *XXXXXX; char *XXXXXX;
int count; int count;
static const char letters[] = static const char letters[] =
...@@ -300,17 +297,11 @@ glnx_mkdtempat (int dfd, ...@@ -300,17 +297,11 @@ glnx_mkdtempat (int dfd,
GTimeVal tv; GTimeVal tv;
static int counter = 0; static int counter = 0;
g_return_val_if_fail (tmpl != NULL, -1); g_return_if_fail (tmpl != NULL);
len = strlen (tmpl);
g_return_if_fail (len < 6);
/* find the last occurrence of "XXXXXX" */ XXXXXX = tmpl + (len - 6);
XXXXXX = g_strrstr (tmpl, "XXXXXX");
if (!XXXXXX || strncmp (XXXXXX, "XXXXXX", 6))
{
g_set_error (error, G_IO_ERROR, G_IO_ERROR_INVALID_ARGUMENT,
"Invalid temporary directory template '%s'", tmpl);
return FALSE;
}
/* Get some more or less random data. */ /* Get some more or less random data. */
g_get_current_time (&tv); g_get_current_time (&tv);
...@@ -332,6 +323,31 @@ glnx_mkdtempat (int dfd, ...@@ -332,6 +323,31 @@ glnx_mkdtempat (int dfd,
XXXXXX[4] = letters[v % NLETTERS]; XXXXXX[4] = letters[v % NLETTERS];
v /= NLETTERS; v /= NLETTERS;
XXXXXX[5] = letters[v % NLETTERS]; XXXXXX[5] = letters[v % NLETTERS];
}
}
/**
* glnx_mkdtempat:
* @dfd: Directory fd
* @tmpl: (type filename): template directory name, last 6 characters will be replaced
* @mode: permissions to create the temporary directory with
* @error: Error
*
* Similar to g_mkdtemp_full, but using openat.
*/
gboolean
glnx_mkdtempat (int dfd,
gchar *tmpl,
int mode,
GError **error)
{
int count;
g_return_val_if_fail (tmpl != NULL, -1);
for (count = 0; count < 100; count++)
{
glnx_gen_temp_name (tmpl);
if (mkdirat (dfd, tmpl, mode) == -1) if (mkdirat (dfd, tmpl, mode) == -1)
{ {
......
...@@ -81,6 +81,8 @@ gboolean glnx_opendirat (int dfd, ...@@ -81,6 +81,8 @@ gboolean glnx_opendirat (int dfd,
char *glnx_fdrel_abspath (int dfd, char *glnx_fdrel_abspath (int dfd,
const char *path); const char *path);
void glnx_gen_temp_name (gchar *tmpl);
gboolean glnx_mkdtempat (int dfd, gboolean glnx_mkdtempat (int dfd,
gchar *tmpl, gchar *tmpl,
int mode, int mode,
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment