Browse Source

portability: don't rely on struct flock layout

Oswald Buddenhagen 21 years ago
parent
commit
5bbe51ee46
1 changed files with 16 additions and 2 deletions
  1. 16 2
      src/dotlock.c

+ 16 - 2
src/dotlock.c

@@ -28,20 +28,27 @@
 #include "dotlock.h"
 #include "dotlock.h"
 
 
 #include <unistd.h>
 #include <unistd.h>
+#include <string.h>
 #include <fcntl.h>
 #include <fcntl.h>
 #include <sys/stat.h>
 #include <sys/stat.h>
 #if TESTING
 #if TESTING
 #include <stdio.h>
 #include <stdio.h>
 #endif
 #endif
 
 
-static struct flock lck = { 0, SEEK_SET, 0, 0, 0 };
-
 int dotlock_lock (const char *path, int *fd)
 int dotlock_lock (const char *path, int *fd)
 {
 {
+  struct flock lck;
+
   *fd = open (path, O_RDWR | O_CREAT, S_IRUSR | S_IWUSR);
   *fd = open (path, O_RDWR | O_CREAT, S_IRUSR | S_IWUSR);
   if (*fd == -1)
   if (*fd == -1)
     return -1;
     return -1;
+  memset (&lck, 0, sizeof(lck));
+#if SEEK_SET != 0
+  lck.l_whence = SEEK_SET;
+#endif
+#if F_WRLCK != 0
   lck.l_type = F_WRLCK;
   lck.l_type = F_WRLCK;
+#endif
   if (fcntl (*fd, F_SETLK, &lck))
   if (fcntl (*fd, F_SETLK, &lck))
   {
   {
     close (*fd);
     close (*fd);
@@ -54,10 +61,17 @@ int dotlock_lock (const char *path, int *fd)
 int dotlock_unlock (int *fd)
 int dotlock_unlock (int *fd)
 {
 {
   int r = 0;
   int r = 0;
+  struct flock lck;
 
 
   if (*fd != -1)
   if (*fd != -1)
   {
   {
+    memset (&lck, 0, sizeof(lck));
+#if SEEK_SET != 0
+    lck.l_whence = SEEK_SET;
+#endif
+#if F_UNLCK != 0
     lck.l_type = F_UNLCK;
     lck.l_type = F_UNLCK;
+#endif
     if (fcntl (*fd, F_SETLK, &lck))
     if (fcntl (*fd, F_SETLK, &lck))
       r = -1;
       r = -1;
     close (*fd);
     close (*fd);