+#undef I3__FILE__
+#define I3__FILE__ "util.c"
/*
* vim:ts=4:sw=4:expandtab
*
char buffer[BUFSIZ];
if (readlink("/proc/self/exe", buffer, BUFSIZ) == -1) {
warn("could not read /proc/self/exe");
- exit(1);
+ _exit(1);
}
dir = dirname(buffer);
sasprintf(&migratepath, "%s/%s", dir, name);
#endif
warn("Could not start %s", name);
- exit(2);
+ _exit(2);
}
/*
*
*/
char *get_process_filename(const char *prefix) {
- char *dir = getenv("XDG_RUNTIME_DIR");
+ /* dir stores the directory path for this and all subsequent calls so that
+ * we only create a temporary directory once per i3 instance. */
+ static char *dir = NULL;
if (dir == NULL) {
- struct passwd *pw = getpwuid(getuid());
- const char *username = pw ? pw->pw_name : "unknown";
- sasprintf(&dir, "/tmp/i3-%s", username);
- } else {
- char *tmp;
- sasprintf(&tmp, "%s/i3", dir);
- dir = tmp;
- }
- if (!path_exists(dir)) {
- if (mkdir(dir, 0700) == -1) {
- perror("mkdir()");
- return NULL;
+ /* Check if XDG_RUNTIME_DIR is set. If so, we use XDG_RUNTIME_DIR/i3 */
+ if ((dir = getenv("XDG_RUNTIME_DIR"))) {
+ char *tmp;
+ sasprintf(&tmp, "%s/i3", dir);
+ dir = tmp;
+ if (!path_exists(dir)) {
+ if (mkdir(dir, 0700) == -1) {
+ perror("mkdir()");
+ return NULL;
+ }
+ }
+ } else {
+ /* If not, we create a (secure) temp directory using the template
+ * /tmp/i3-<user>.XXXXXX */
+ struct passwd *pw = getpwuid(getuid());
+ const char *username = pw ? pw->pw_name : "unknown";
+ sasprintf(&dir, "/tmp/i3-%s.XXXXXX", username);
+ /* mkdtemp modifies dir */
+ if (mkdtemp(dir) == NULL) {
+ perror("mkdtemp()");
+ return NULL;
+ }
}
}
char *filename;
sasprintf(&filename, "%s/%s.%d", dir, prefix, getpid());
- free(dir);
return filename;
}
#define y(x, ...) yajl_gen_ ## x (gen, ##__VA_ARGS__)
#define ystr(str) yajl_gen_string(gen, (unsigned char*)str, strlen(str))
-char *store_restart_layout() {
+char *store_restart_layout(void) {
setlocale(LC_NUMERIC, "C");
#if YAJL_MAJOR >= 2
yajl_gen gen = yajl_gen_alloc(NULL);
char *restart_filename = forget_layout ? NULL : store_restart_layout();
kill_configerror_nagbar(true);
+ kill_commanderror_nagbar(true);
restore_geometry();