From 8a40dc0011828f57661a6bd9e2df09c138f4a1a9 Mon Sep 17 00:00:00 2001 From: Sardem FF7 Date: Tue, 19 Apr 2011 00:22:32 +0200 Subject: [PATCH] Use XDG_RUNTIME_DIR when available XDG_RUNTIME_DIR is the volatile runtime data dir provided by modern session manager such as systemd --- src/main.c | 14 ++++++++------ src/util.c | 32 ++++++++++++++++++++++++++------ 2 files changed, 34 insertions(+), 12 deletions(-) diff --git a/src/main.c b/src/main.c index a5a492e7..91bd5d68 100644 --- a/src/main.c +++ b/src/main.c @@ -260,12 +260,13 @@ int main(int argc, char *argv[]) { exit(0); } - if (config.ipc_socket_path == NULL) - config.ipc_socket_path = getenv("I3SOCK"); - - /* Fall back to a file name in /tmp/ based on the PID */ - if (config.ipc_socket_path == NULL) - config.ipc_socket_path = get_process_filename("i3-ipc-socket"); + if (config.ipc_socket_path == NULL) { + /* Fall back to a file name in /tmp/ based on the PID */ + if ((config.ipc_socket_path = getenv("I3SOCK")) == NULL) + config.ipc_socket_path = get_process_filename("ipc-socket"); + else + config.ipc_socket_path = sstrdup(config.ipc_socket_path); + } uint32_t mask = XCB_CW_EVENT_MASK; uint32_t values[] = { XCB_EVENT_MASK_SUBSTRUCTURE_REDIRECT | @@ -389,6 +390,7 @@ int main(int argc, char *argv[]) { if (ipc_socket == -1) { ELOG("Could not create the IPC socket, IPC disabled\n"); } else { + free(config.ipc_socket_path); struct ev_io *ipc_io = scalloc(sizeof(struct ev_io)); ev_io_init(ipc_io, ipc_new_client, ipc_socket, EV_READ); ev_io_start(loop, ipc_io); diff --git a/src/util.c b/src/util.c index 2e4d9c23..a72b52d5 100644 --- a/src/util.c +++ b/src/util.c @@ -244,15 +244,35 @@ static char **append_argument(char **original, char *argument) { * */ char *get_process_filename(const char *prefix) { - struct passwd *pw = getpwuid(getuid()); - const char *username = pw ? pw->pw_name : "unknown"; + char *dir = getenv("XDG_RUNTIME_DIR"); + if (dir == NULL) { + struct passwd *pw = getpwuid(getuid()); + const char *username = pw ? pw->pw_name : "unknown"; + if (asprintf(&dir, "/tmp/i3-%s", username) == -1) { + perror("asprintf()"); + return NULL; + } + } else { + char *tmp; + if (asprintf(&tmp, "%s/i3", dir) == -1) { + perror("asprintf()"); + return NULL; + } + dir = tmp; + } + if (!path_exists(dir)) { + if (mkdir(dir, 0700) == -1) { + perror("mkdir()"); + return NULL; + } + } char *filename; - int res = asprintf(&filename, "/tmp/%s-%s.%d", prefix, username, getpid()); - if (res == -1) { + if (asprintf(&filename, "%s/%s.%d", dir, prefix, getpid()) == -1) { perror("asprintf()"); - return NULL; + filename = NULL; } + free(dir); return filename; } @@ -275,7 +295,7 @@ char *store_restart_layout() { * resolve the tildes in the specified path */ char *filename; if (config.restart_state_path == NULL) { - filename = get_process_filename("i3-restart-state"); + filename = get_process_filename("restart-state"); if (!filename) return NULL; } else {