Fix an issue when single instance socket' directory did not exist.
authorAndriy Grytsenko <andrej@rep.kiev.ua>
Mon, 16 Apr 2018 15:36:44 +0000 (18:36 +0300)
committerAndriy Grytsenko <andrej@rep.kiev.ua>
Mon, 16 Apr 2018 15:37:38 +0000 (18:37 +0300)
NEWS
src/single-inst.c

diff --git a/NEWS b/NEWS
index e82cb95..f4e698a 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -5,6 +5,9 @@
 
 * Added a missing tooltip for 'New Window' toolbar button.
 
+* Fixed an issue when single instance socket' directory did not exist (see
+    https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=874753).
+
 
 Changes on 1.2.5 since 1.2.4:
 
index aaf84ab..b88d41e 100644 (file)
@@ -2,7 +2,7 @@
  *      single-inst.c: simple IPC mechanism for single instance app
  *
  *      Copyright 2010 Hong Jen Yee (PCMan) <pcman.tw@gmail.com>
- *      Copyright 2012-2017 Andriy Grytsenko (LStranger) <andrej@rep.kiev.ua>
+ *      Copyright 2012-2018 Andriy Grytsenko (LStranger) <andrej@rep.kiev.ua>
  *
  *      This program is free software; you can redistribute it and/or modify
  *      it under the terms of the GNU General Public License as published by
@@ -180,6 +180,7 @@ SingleInstResult single_inst_init(SingleInstData* data)
     int addr_len;
     int ret;
     int reuse;
+    char *dir_sep;
 
     data->io_channel = NULL;
     data->io_watch = 0;
@@ -206,6 +207,16 @@ SingleInstResult single_inst_init(SingleInstData* data)
     /* There is no existing server, and we are in the first instance. */
     unlink(addr.sun_path); /* delete old socket file if it exists. */
 
+    /* root-instance issue: /root/.cache might not exist, see
+       https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=874753 */
+    dir_sep = strrchr(addr.sun_path, '/');
+    if (dir_sep)
+    {
+        *dir_sep = '\0';
+        g_mkdir_with_parents(addr.sun_path, 0700);
+        *dir_sep = '/';
+    }
+
     reuse = 1;
     ret = setsockopt( data->sock, SOL_SOCKET, SO_REUSEADDR, &reuse, sizeof(reuse) );
     if(ret || bind(data->sock, (struct sockaddr*)&addr, addr_len) == -1)