소스 검색

portability: don't rely on struct flock layout

Oswald Buddenhagen 21 년 전
부모
커밋
5bbe51ee46
1개의 변경된 파일16개의 추가작업 그리고 2개의 파일을 삭제
  1. 16 2
      src/dotlock.c

+ 16 - 2
src/dotlock.c

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