Import xwrite(), cstr_set(), resolve_..._template()
From degesch and json-rpc-shell.
This commit is contained in:
parent
b9457c321f
commit
e029aae1d3
67
liberty.c
67
liberty.c
@ -731,6 +731,21 @@ set_blocking (int fd, bool blocking)
|
|||||||
return prev;
|
return prev;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static bool
|
||||||
|
xwrite (int fd, const char *data, size_t len, struct error **e)
|
||||||
|
{
|
||||||
|
size_t written = 0;
|
||||||
|
while (written < len)
|
||||||
|
{
|
||||||
|
ssize_t res = write (fd, data + written, len - written);
|
||||||
|
if (res >= 0)
|
||||||
|
written += res;
|
||||||
|
else if (errno != EINTR)
|
||||||
|
return error_set (e, "%s", strerror (errno));
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
xclose (int fd)
|
xclose (int fd)
|
||||||
{
|
{
|
||||||
@ -2924,6 +2939,13 @@ base64_encode (const void *data, size_t len, struct str *output)
|
|||||||
|
|
||||||
// --- Utilities ---------------------------------------------------------------
|
// --- Utilities ---------------------------------------------------------------
|
||||||
|
|
||||||
|
static void
|
||||||
|
cstr_set (char **s, char *new)
|
||||||
|
{
|
||||||
|
free (*s);
|
||||||
|
*s = new;
|
||||||
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
cstr_split (const char *s, const char *delimiters, bool ignore_empty,
|
cstr_split (const char *s, const char *delimiters, bool ignore_empty,
|
||||||
struct strv *out)
|
struct strv *out)
|
||||||
@ -3263,16 +3285,8 @@ resolve_relative_data_filename (const char *filename)
|
|||||||
}
|
}
|
||||||
|
|
||||||
static char *
|
static char *
|
||||||
resolve_relative_runtime_filename (const char *filename)
|
resolve_relative_runtime_filename_finish (struct str path)
|
||||||
{
|
{
|
||||||
struct str path = str_make ();
|
|
||||||
const char *runtime_dir = getenv ("XDG_RUNTIME_DIR");
|
|
||||||
if (runtime_dir && *runtime_dir == '/')
|
|
||||||
str_append (&path, runtime_dir);
|
|
||||||
else
|
|
||||||
get_xdg_home_dir (&path, "XDG_DATA_HOME", ".local/share");
|
|
||||||
str_append_printf (&path, "/%s/%s", PROGRAM_NAME, filename);
|
|
||||||
|
|
||||||
// Try to create the file's ancestors;
|
// Try to create the file's ancestors;
|
||||||
// typically the user will want to immediately create a file in there
|
// typically the user will want to immediately create a file in there
|
||||||
const char *last_slash = strrchr (path.str, '/');
|
const char *last_slash = strrchr (path.str, '/');
|
||||||
@ -3285,6 +3299,41 @@ resolve_relative_runtime_filename (const char *filename)
|
|||||||
return str_steal (&path);
|
return str_steal (&path);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static char *
|
||||||
|
resolve_relative_runtime_filename (const char *filename)
|
||||||
|
{
|
||||||
|
struct str path = str_make ();
|
||||||
|
const char *runtime_dir = getenv ("XDG_RUNTIME_DIR");
|
||||||
|
if (runtime_dir && *runtime_dir == '/')
|
||||||
|
str_append (&path, runtime_dir);
|
||||||
|
else
|
||||||
|
get_xdg_home_dir (&path, "XDG_DATA_HOME", ".local/share");
|
||||||
|
|
||||||
|
str_append_printf (&path, "/%s/%s", PROGRAM_NAME, filename);
|
||||||
|
return resolve_relative_runtime_filename_finish (path);
|
||||||
|
}
|
||||||
|
|
||||||
|
/// This differs from resolve_relative_runtime_filename() in that we expect
|
||||||
|
/// the filename to be something like a pattern for mkstemp(), so the resulting
|
||||||
|
/// path can reside in a system-wide directory with no risk of a conflict.
|
||||||
|
/// However, we have to take care about permissions. Do we even need this?
|
||||||
|
static char *
|
||||||
|
resolve_relative_runtime_template (const char *template)
|
||||||
|
{
|
||||||
|
struct str path = str_make ();
|
||||||
|
const char *runtime_dir = getenv ("XDG_RUNTIME_DIR");
|
||||||
|
const char *tmpdir = getenv ("TMPDIR");
|
||||||
|
if (runtime_dir && *runtime_dir == '/')
|
||||||
|
str_append_printf (&path, "%s/%s", runtime_dir, PROGRAM_NAME);
|
||||||
|
else if (tmpdir && *tmpdir == '/')
|
||||||
|
str_append_printf (&path, "%s/%s.%d", tmpdir, PROGRAM_NAME, geteuid ());
|
||||||
|
else
|
||||||
|
str_append_printf (&path, "/tmp/%s.%d", PROGRAM_NAME, geteuid ());
|
||||||
|
|
||||||
|
str_append_printf (&path, "/%s", template);
|
||||||
|
return resolve_relative_runtime_filename_finish (path);
|
||||||
|
}
|
||||||
|
|
||||||
static char *
|
static char *
|
||||||
try_expand_tilde (const char *filename)
|
try_expand_tilde (const char *filename)
|
||||||
{
|
{
|
||||||
|
Loading…
Reference in New Issue
Block a user