( cvs diff -u -r 1.100.2.83 -r 1.100.2.84 AUTHORS; cvs diff -u -r 1.155.2.101 -r 1.155.2.102 src/Makefile.am; cvs diff -u -r 1.12.2.72 -r 1.12.2.73 src/action.c; cvs diff -u -r 1.27.2.63 -r 1.27.2.64 src/addr_compl.c; cvs diff -u -r 1.22.2.28 -r 1.22.2.29 src/addrbook.c; cvs diff -u -r 1.382.2.609 -r 1.382.2.610 src/compose.c; cvs diff -u -r 1.50.2.67 -r 1.50.2.68 src/compose.h; cvs diff -u -r 1.14.2.63 -r 1.14.2.64 src/editaddress.c; cvs diff -u -r 1.60.2.63 -r 1.60.2.64 src/filtering.c; cvs diff -u -r 1.213.2.209 -r 1.213.2.210 src/folder.c; cvs diff -u -r 1.87.2.66 -r 1.87.2.67 src/folder.h; cvs diff -u -r 1.20.2.29 -r 1.20.2.30 src/folderview.h; cvs diff -u -r 1.2.2.8 -r 1.2.2.9 src/headerview.h; cvs diff -u -r 1.1.2.71 -r 1.1.2.72 src/imap_gtk.c; cvs diff -u -r 1.3.4.9 -r 1.3.4.10 src/localfolder.c; cvs diff -u -r 1.115.2.253 -r 1.115.2.254 src/main.c; cvs diff -u -r 1.274.2.349 -r 1.274.2.350 src/mainwindow.c; cvs diff -u -r 1.39.2.64 -r 1.39.2.65 src/mainwindow.h; cvs diff -u -r 1.75.2.73 -r 1.75.2.74 src/matcher.c; cvs diff -u -r 1.25.2.35 -r 1.25.2.36 src/matcher_parser_parse.y; cvs diff -u -r 1.94.2.238 -r 1.94.2.239 src/messageview.c; cvs diff -u -r 1.19.2.32 -r 1.19.2.33 src/messageview.h; cvs diff -u -r 1.79.2.74 -r 1.79.2.75 src/mh.c; cvs diff -u -r 1.2.2.43 -r 1.2.2.44 src/mh_gtk.c; cvs diff -u -r 1.83.2.193 -r 1.83.2.194 src/mimeview.c; cvs diff -u -r 1.20.2.38 -r 1.20.2.39 src/mimeview.h; cvs diff -u -r 1.3.8.12 -r 1.3.8.13 src/noticeview.h; cvs diff -u -r 1.105.2.174 -r 1.105.2.175 src/prefs_account.c; cvs diff -u -r 1.49.2.49 -r 1.49.2.50 src/prefs_account.h; cvs diff -u -r 1.59.2.91 -r 1.59.2.92 src/prefs_filtering.c; cvs diff -u -r 1.1.4.77 -r 1.1.4.78 src/prefs_filtering_action.c; cvs diff -u -r 1.5.2.21 -r 1.5.2.22 src/prefs_gtk.h; cvs diff -u -r 1.43.2.95 -r 1.43.2.96 src/prefs_matcher.c; cvs diff -u -r 1.12.2.81 -r 1.12.2.82 src/prefs_template.c; cvs diff -u -r 1.30.2.72 -r 1.30.2.73 src/prefs_toolbar.c; cvs diff -u -r 1.10.2.27 -r 1.10.2.28 src/privacy.c; cvs diff -u -r 1.11.2.14 -r 1.11.2.15 src/procheader.h; cvs diff -u -r 1.49.2.148 -r 1.49.2.149 src/procmime.c; cvs diff -u -r 1.17.2.29 -r 1.17.2.30 src/procmime.h; cvs diff -u -r 1.150.2.125 -r 1.150.2.126 src/procmsg.c; cvs diff -u -r 1.60.2.63 -r 1.60.2.64 src/procmsg.h; diff -u /dev/null src/proctypes.h; cvs diff -u -r 1.1.4.10 -r 1.1.4.11 src/remotefolder.c; cvs diff -u -r 1.395.2.451 -r 1.395.2.452 src/summaryview.c; cvs diff -u -r 1.68.2.60 -r 1.68.2.61 src/summaryview.h; cvs diff -u -r 1.96.2.246 -r 1.96.2.247 src/textview.c; cvs diff -u -r 1.12.2.34 -r 1.12.2.35 src/textview.h; cvs diff -u -r 1.43.2.129 -r 1.43.2.130 src/toolbar.c; cvs diff -u -r 1.1.2.17 -r 1.1.2.18 src/uri_opener.c; diff -u /dev/null src/viewtypes.h; cvs diff -u -r 1.9.2.58 -r 1.9.2.59 src/common/defs.h; cvs diff -u -r 1.1.2.79 -r 1.1.2.80 src/gtk/authors.h; cvs diff -u -r 1.5.2.35 -r 1.5.2.36 src/gtk/description_window.c; cvs diff -u -r 1.14.2.82 -r 1.14.2.83 src/plugins/trayicon/trayicon.c; ) > 3.8.1cvs46.patchset
( cvs diff -u -r 1.1.2.43 -r 1.1.2.44 src/plugins/bogofilter/bogofilter.c; ) > 3.8.1cvs47.patchset
( cvs diff -u -r 1.115.2.254 -r 1.115.2.255 src/main.c; ) > 3.8.1cvs48.patchset
+( cvs diff -u -r 1.115.2.255 -r 1.115.2.256 src/main.c; ) > 3.8.1cvs49.patchset
#include <X11/SM/SMlib.h>
#endif
+#if HAVE_FLOCK
+#include <sys/file.h>
+#endif
+
#include "wizard.h"
#ifdef HAVE_STARTUP_NOTIFICATION
# define SN_API_NOT_YET_FROZEN
gchar *path;
path = claws_get_socket_name();
+ /* Try to connect to the control socket */
uxsock = fd_connect_unix(path);
if (x_display == NULL)
x_display = g_strdup(g_getenv("DISPLAY"));
if (uxsock < 0) {
+#if HAVE_FLOCK
+ gchar *socket_lock;
+ gint lock_fd;
+ gint ret;
+ /* If connect failed, no other process is running.
+ * Unlink the potentially existing socket, then
+ * open it. This has to be done locking a temporary
+ * file to avoid the race condition where another
+ * process could have created the socket just in
+ * between.
+ */
+ socket_lock = g_strconcat(path, ".lock",
+ NULL);
+ lock_fd = g_open(socket_lock, O_RDWR|O_CREAT, 0);
+ if (lock_fd < 0) {
+ debug_print("Couldn't open %s: %s (%d)\n", socket_lock,
+ strerror(errno), errno);
+ g_free(socket_lock);
+ return -1;
+ }
+ if (flock(lock_fd, LOCK_EX) < 0) {
+ debug_print("Couldn't lock %s: %s (%d)\n", socket_lock,
+ strerror(errno), errno);
+ close(lock_fd);
+ g_free(socket_lock);
+ return -1;
+ }
+#endif
+
claws_unlink(path);
- return fd_open_unix(path);
+ debug_print("Opening socket %s\n", path);
+ ret = fd_open_unix(path);
+#if HAVE_FLOCK
+ flock(lock_fd, LOCK_UN);
+ claws_unlink(socket_lock);
+ g_free(socket_lock);
+#endif
+ return ret;
}
#else
HANDLE hmutex;