diff options
author | Přemysl Janouch <p.janouch@gmail.com> | 2015-12-25 04:21:18 +0100 |
---|---|---|
committer | Přemysl Janouch <p.janouch@gmail.com> | 2015-12-25 05:20:50 +0100 |
commit | e101afab380d3a2253dd726719c1057191bbd6d1 (patch) | |
tree | e275b5c875546f1ea427e3bf24e666e75ab98506 /common.c | |
parent | 37e91655484cfd533ea72bc11fe6aa0131363f11 (diff) | |
download | xK-e101afab380d3a2253dd726719c1057191bbd6d1.tar.gz xK-e101afab380d3a2253dd726719c1057191bbd6d1.tar.xz xK-e101afab380d3a2253dd726719c1057191bbd6d1.zip |
degesch: allow launching an editor for input
Useful for editing multiline text (such as making it single-line).
Some refactoring and cleanup.
Diffstat (limited to 'common.c')
-rw-r--r-- | common.c | 43 |
1 files changed, 43 insertions, 0 deletions
@@ -54,6 +54,49 @@ str_vector_find (const struct str_vector *v, const char *s) return -1; } +/// This differs from the non-unique version 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. +static char * +resolve_relative_runtime_unique_filename (const char *filename) +{ + struct str path; + str_init (&path); + + const char *runtime_dir = getenv ("XDG_RUNTIME_DIR"); + if (runtime_dir && *runtime_dir == '/') + str_append (&path, runtime_dir); + else + str_append (&path, "/tmp"); + str_append_printf (&path, "/%s/%s", PROGRAM_NAME, filename); + + // Try to create the file's ancestors; + // typically the user will want to immediately create a file in there + const char *last_slash = strrchr (path.str, '/'); + if (last_slash && last_slash != path.str) + { + char *copy = xstrndup (path.str, last_slash - path.str); + (void) mkdir_with_parents (copy, NULL); + free (copy); + } + return str_steal (&path); +} + +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) + FAIL ("%s", strerror (errno)); + } + return true; +} + // --- Logging ----------------------------------------------------------------- static void |