2006-06-15 [colin] 2.3.0cvs16
[claws.git] / src / mbox.c
index 21ed549508dfbe5ce8362859192a431aa2f291e6..26cea303dcc19a6d10092234b7b78098a33a6705 100644 (file)
@@ -32,6 +32,7 @@
 #include <sys/file.h>
 #include <ctype.h>
 #include <time.h>
+#include <errno.h>
 
 #include "mbox.h"
 #include "procmsg.h"
@@ -277,21 +278,39 @@ gint lock_mbox(const gchar *base, LockType type)
                g_free(lockfile);
        } else if (type == LOCK_FLOCK) {
                gint lockfd;
+               gboolean fcntled = FALSE;
+#if HAVE_FCNTL_H
+               struct flock fl;
+               fl.l_type = F_WRLCK;
+               fl.l_whence = SEEK_SET;
+               fl.l_start = 0;
+               fl.l_len = 0;
+#endif
 
 #if HAVE_FLOCK
-               if ((lockfd = open(base, O_RDONLY)) < 0) {
+               if ((lockfd = open(base, O_RDWR)) < 0) {
 #else
                if ((lockfd = open(base, O_RDWR)) < 0) {
 #endif
                        FILE_OP_ERROR(base, "open");
                        return -1;
                }
+               
+#if HAVE_FCNTL_H
+               if (fcntl(lockfd, F_SETLK, &fl) == -1) {
+                       g_warning("can't fnctl %s (%s)", base, strerror(errno));
+                       return -1;
+               } else {
+                       fcntled = TRUE;
+               }
+#endif
+
 #if HAVE_FLOCK
-               if (flock(lockfd, LOCK_EX|LOCK_NB) < 0) {
+               if (flock(lockfd, LOCK_EX|LOCK_NB) < 0 && !fcntled) {
                        perror("flock");
 #else
 #if HAVE_LOCKF
-               if (lockf(lockfd, F_TLOCK, 0) < 0) {
+               if (lockf(lockfd, F_TLOCK, 0) < 0 && !fcntled) {
                        perror("lockf");
 #else
                {
@@ -329,12 +348,27 @@ gint unlock_mbox(const gchar *base, gint fd, LockType type)
 
                return 0;
        } else if (type == LOCK_FLOCK) {
+               gboolean fcntled = FALSE;
+#if HAVE_FCNTL_H
+               struct flock fl;
+               fl.l_type = F_UNLCK;
+               fl.l_whence = SEEK_SET;
+               fl.l_start = 0;
+               fl.l_len = 0;
+
+               if (fcntl(fd, F_SETLK, &fl) == -1) {
+                       g_warning("can't fnctl %s", base);
+                       return -1;
+               } else {
+                       fcntled = TRUE;
+               }
+#endif
 #if HAVE_FLOCK
-               if (flock(fd, LOCK_UN) < 0) {
+               if (flock(fd, LOCK_UN) < 0 && !fcntled) {
                        perror("flock");
 #else
 #if HAVE_LOCKF
-               if (lockf(fd, F_ULOCK, 0) < 0) {
+               if (lockf(fd, F_ULOCK, 0) < 0 && !fcntled) {
                        perror("lockf");
 #else
                {