X-Git-Url: http://git.indexdata.com/?p=idzebra-moved-to-github.git;a=blobdiff_plain;f=index%2Flockutil.c;h=13e20ff4430a85088d2d53d8fa685f4a8c38d06b;hp=431cb9c748b5b11ab4b6a15d7a6d9505c5febb0f;hb=5437b50633032595afe6f87dc0f989bc92a5aea8;hpb=3c5f6226f97612c0d6ac40591f600587c5ffa858 diff --git a/index/lockutil.c b/index/lockutil.c index 431cb9c..13e20ff 100644 --- a/index/lockutil.c +++ b/index/lockutil.c @@ -1,48 +1,26 @@ -/* - * Copyright (C) 1994-1999, Index Data - * All rights reserved. - * Sebastian Hammer, Adam Dickmeiss - * - * $Log: lockutil.c,v $ - * Revision 1.11 1999-02-02 14:50:59 adam - * Updated WIN32 code specific sections. Changed header. - * - * Revision 1.10 1997/09/29 09:08:36 adam - * Revised locking system to be thread safe for the server. - * - * Revision 1.9 1997/09/25 14:54:43 adam - * WIN32 files lock support. - * - * Revision 1.8 1997/09/17 12:19:15 adam - * Zebra version corresponds to YAZ version 1.4. - * Changed Zebra server so that it doesn't depend on global common_resource. - * - * Revision 1.7 1997/09/09 13:38:08 adam - * Partial port to WIN95/NT. - * - * Revision 1.6 1996/10/29 14:08:14 adam - * Uses resource lockDir instead of lockPath. - * - * Revision 1.5 1996/03/26 16:01:13 adam - * New setting lockPath: directory of various lock files. - * - * Revision 1.4 1995/12/13 08:46:10 adam - * Locking uses F_WRLCK and F_RDLCK again! - * - * Revision 1.3 1995/12/12 16:00:57 adam - * System call sync(2) used after update/commit. - * Locking (based on fcntl) uses F_EXLCK and F_SHLCK instead of F_WRLCK - * and F_RDLCK. - * - * Revision 1.2 1995/12/11 11:43:29 adam - * Locking based on fcntl instead of flock. - * Setting commitEnable removed. Command line option -n can be used to - * prevent commit if commit setting is defined in the configuration file. - * - * Revision 1.1 1995/12/07 17:38:47 adam - * Work locking mechanisms for concurrent updates/commit. - * - */ +/* $Id: lockutil.c,v 1.19 2004-11-19 10:26:59 heikki Exp $ + Copyright (C) 1995,1996,1997,1998,1999,2000,2001,2002 + Index Data Aps + +This file is part of the Zebra server. + +Zebra is free software; you can redistribute it and/or modify it under +the terms of the GNU General Public License as published by the Free +Software Foundation; either version 2, or (at your option) any later +version. + +Zebra is distributed in the hope that it will be useful, but WITHOUT ANY +WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with Zebra; see the file LICENSE.zebra. If not, write to the +Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA +02111-1307, USA. +*/ + + #include #include #include @@ -63,28 +41,67 @@ struct zebra_lock_info { int excl_flag; }; -ZebraLockHandle zebra_lock_create (const char *name, int excl_flag) +char *zebra_mk_fname (const char *dir, const char *name) +{ + int dlen = dir ? strlen(dir) : 0; + char *fname = xmalloc (dlen + strlen(name) + 3); + +#ifdef WIN32 + if (dlen) + { + int last_one = dir[dlen-1]; + + if (!strchr ("/\\:", last_one)) + sprintf (fname, "%s\\%s", dir, name); + else + sprintf (fname, "%s%s", dir, name); + } + else + sprintf (fname, "%s", name); +#else + if (dlen) + { + int last_one = dir[dlen-1]; + + if (!strchr ("/", last_one)) + sprintf (fname, "%s/%s", dir, name); + else + sprintf (fname, "%s%s", dir, name); + } + else + sprintf (fname, "%s", name); +#endif + return fname; +} + +ZebraLockHandle zebra_lock_create (const char *dir, + const char *name, int excl_flag) { - ZebraLockHandle h = xmalloc (sizeof(*h)); + char *fname = zebra_mk_fname(dir, name); + ZebraLockHandle h = (ZebraLockHandle) xmalloc (sizeof(*h)); + h->excl_flag = excl_flag; h->fd = -1; + + #ifdef WIN32 if (!h->excl_flag) h->fd = open (name, O_BINARY|O_RDONLY); if (h->fd == -1) - h->fd = open (name, ((h->excl_flag > 1) ? O_EXCL : 0)| + h->fd = open (fname, ((h->excl_flag > 1) ? O_EXCL : 0)| (O_BINARY|O_CREAT|O_RDWR), 0666); #else - h->fd= open (name, ((h->excl_flag > 1) ? O_EXCL : 0)| - (O_BINARY|O_CREAT|O_RDWR|O_SYNC), 0666); + h->fd= open (fname, ((h->excl_flag > 1) ? O_EXCL : 0)| + (O_BINARY|O_CREAT|O_RDWR), 0666); #endif if (h->fd == -1) { if (h->excl_flag <= 1) - logf (LOG_WARN|LOG_ERRNO, "open %s", name); + yaz_log (YLOG_WARN|YLOG_ERRNO, "open %s", fname); xfree (h); - return NULL; + h = 0; } + xfree (fname); return h; } @@ -99,7 +116,7 @@ void zebra_lock_destroy (ZebraLockHandle h) void zebra_lock_prefix (Res res, char *path) { - char *lock_dir = res_get_def (res, "lockDir", ""); + const char *lock_dir = res_get_def (res, "lockDir", ""); strcpy (path, lock_dir); if (*path && path[strlen(path)-1] != '/') @@ -117,6 +134,24 @@ static int unixLock (int fd, int type, int cmd) } #endif +int zebra_lock_w (ZebraLockHandle h) +{ +#ifdef WIN32 + return _locking (h->fd, _LK_LOCK, 1); +#else + return unixLock (h->fd, F_WRLCK, F_SETLKW); +#endif +} + +int zebra_lock_r (ZebraLockHandle h) +{ +#ifdef WIN32 + return _locking (h->fd, _LK_LOCK, 1); +#else + return unixLock (h->fd, F_RDLCK, F_SETLKW); +#endif +} + int zebra_lock (ZebraLockHandle h) { #ifdef WIN32