]> git.sur5r.net Git - i3/i3/commitdiff
Use XDG_RUNTIME_DIR when available
authorSardem FF7 <sardemff7.pub@gmail.com>
Mon, 18 Apr 2011 22:22:32 +0000 (00:22 +0200)
committerMichael Stapelberg <michael@stapelberg.de>
Tue, 26 Apr 2011 16:39:11 +0000 (18:39 +0200)
XDG_RUNTIME_DIR is the volatile runtime data dir provided by modern
session manager such as systemd

src/main.c
src/util.c

index a5a492e7aa0465b498a7af4d9aedd853394f3a88..91bd5d688de66a3280ae14a61444931c3fe58eae 100644 (file)
@@ -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);
index 2e4d9c2330ab5a44d97f3aac539c0f7ca5da9f50..a72b52d5073d720c44ba3590bc7805baf48b0725 100644 (file)
@@ -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 {