2 * Copyright (C) 1994-1997, Index Data I/S
4 * Sebastian Hammer, Adam Dickmeiss
7 * Revision 1.9 1997-09-25 14:54:43 adam
8 * WIN32 files lock support.
10 * Revision 1.8 1997/09/17 12:19:15 adam
11 * Zebra version corresponds to YAZ version 1.4.
12 * Changed Zebra server so that it doesn't depend on global common_resource.
14 * Revision 1.7 1997/09/09 13:38:08 adam
15 * Partial port to WIN95/NT.
17 * Revision 1.6 1996/10/29 14:08:14 adam
18 * Uses resource lockDir instead of lockPath.
20 * Revision 1.5 1996/03/26 16:01:13 adam
21 * New setting lockPath: directory of various lock files.
23 * Revision 1.4 1995/12/13 08:46:10 adam
24 * Locking uses F_WRLCK and F_RDLCK again!
26 * Revision 1.3 1995/12/12 16:00:57 adam
27 * System call sync(2) used after update/commit.
28 * Locking (based on fcntl) uses F_EXLCK and F_SHLCK instead of F_WRLCK
31 * Revision 1.2 1995/12/11 11:43:29 adam
32 * Locking based on fcntl instead of flock.
33 * Setting commitEnable removed. Command line option -n can be used to
34 * prevent commit if commit setting is defined in the configuration file.
36 * Revision 1.1 1995/12/07 17:38:47 adam
37 * Work locking mechanisms for concurrent updates/commit.
45 #include <sys/types.h>
48 #include <sys/locking.h>
55 static char *lockDir = NULL;
57 struct zebra_lock_info {
62 ZebraLockHandle zebra_lock_create (const char *name, int excl_flag)
64 ZebraLockHandle h = xmalloc (sizeof(*h));
65 h->excl_flag = excl_flag;
69 h->fd = open (name, O_BINARY|O_RDONLY);
71 h->fd = open (name, ((h->excl_flag > 1) ? O_EXCL : 0)|
72 (O_BINARY|O_CREAT|O_RDWR), 0666);
74 h->fd= open (name, ((h->excl_flag > 1) ? O_EXCL : 0)|
75 (O_BINARY|O_CREAT|O_RDWR|O_SYNC), 0666);
79 if (h->excl_flag <= 1)
80 logf (LOG_WARN|LOG_ERRNO, "open %s", name);
87 void zebra_lock_destroy (ZebraLockHandle h)
96 void zebraLockPrefix (Res res, char *pathPrefix)
99 lockDir = res_get_def (res, "lockDir", "");
102 strcpy (pathPrefix, lockDir);
103 if (*pathPrefix && pathPrefix[strlen(pathPrefix)-1] != '/')
104 strcat (pathPrefix, "/");
110 static int unixLock (int fd, int type, int cmd)
114 area.l_whence = SEEK_SET;
115 area.l_len = area.l_start = 0L;
116 return fcntl (fd, cmd, &area);
120 int zebra_lock (ZebraLockHandle h)
123 return _locking (h->fd, _LK_LOCK, 1);
125 return unixLock (h->fd, h->excl_flag ? F_WRLCK : F_RDLCK, F_SETLKW);
129 int zebra_lock_nb (ZebraLockHandle h)
132 return _locking (h->fd, _LK_NBLCK, 1);
134 return unixLock (h->fd, h->excl_flag ? F_WRLCK : F_RDLCK, F_SETLK);
138 int zebra_unlock (ZebraLockHandle h)
141 return _locking (h->fd, _LK_UNLCK, 1);
143 return unixLock (h->fd, F_UNLCK, F_SETLKW);
147 int zebra_lock_fd (ZebraLockHandle h)