diff src/lock.c @ 43:2842f50feb55 noffle

[svn] * client.c, client.h, common.h, config.c, config.h, content.c, content.h, control.c, control.h, database.c, database.h, dynamicstring.c, dynamicstring.h, fetch.c, fetch.h, fetchlist.c, fetchlist.h, group.c, group.h, itemlist.c, itemlist.h, lock.c, lock.h, log.c, log.h, noffle.c, online.c, online.h, outgoing.c, outgoing.h, over.c, over.h, post.c, post.h, protocol.c, protocol.h, pseudo.c, pseudo.h, request.c, request.h, server.c, server.h, util.c, util.h, wildmat.c, wildmat.h: Moved files to the subdirectory src/ * Makefile.am, acconfig.h, configure.in, docs/Makefile.am, src/Makefile.am, Makefile.in, aclocal.m4, config.h.in, configure, install-sh, missing, mkinstalldirs, stamp-h.in, docs/Makefile.in, src/Makefile.in: Added files. They are used by aclocal, autoheader, autoconf and automake. * src/config.c, src/config.h: Renamed to configfile.c and configfile.h, because configure will generate a config.h file itself. * src/client.c, src/content.c, src/database.c, src/fetch.c, src/fetchlist.c, src/group.c, src/lock.c, src/noffle.c, src/online.c, src/outgoing.c, src/over.c, src/pseudo.c, src/request.c, src/server.c, src/util.c: Changed '#include "config.h"' to '#include "configfile.h"'. * src/client.c, src/content.c, src/database.c, src/fetch.c, src/fetchlist.c, src/group.c, src/lock.c, src/online.c, src/outgoing.c, src/post.c, src/protocol.c, src/request.c, src/server.c: Files now #include <config.h>. Added missing <stdio.h>. This removes the warnings about snprintf() not being declared. * Makefile: Removed. This is now generated by configure.
author uh1763
date Fri, 05 May 2000 22:45:56 +0100
parents
children 125d79c9e586
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/lock.c	Fri May 05 22:45:56 2000 +0100
@@ -0,0 +1,131 @@
+/*
+  lock.c
+
+  $Id: lock.c 49 2000-05-05 21:45:56Z uh1763 $
+*/
+
+#if HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include <stdio.h>
+#include "lock.h"
+#include <errno.h>
+#include <ctype.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <fcntl.h>
+#include <time.h>
+#include <unistd.h>
+#include "configfile.h"
+#include "log.h"
+#include "database.h"
+#include "group.h"
+#include "request.h"
+
+struct Lock
+{
+    int lockFd;
+    Str lockFile;
+} lock = { -1, "" };
+
+
+#ifdef DEBUG
+static Bool
+testLock( void )
+{
+    return ( lock.lockFd != -1 );    
+}
+#endif
+
+static Bool
+waitLock( void )
+{
+    int fd;
+    struct flock l;
+
+    ASSERT( ! testLock() );
+    Log_dbg( "Waiting for lock ..." );
+    snprintf( lock.lockFile, MAXCHAR, "%s/lock/global", Cfg_spoolDir() );
+    if ( ( fd = open( lock.lockFile, O_WRONLY | O_CREAT, 0644 ) ) < 0 )
+    {
+        Log_err( "Cannot open %s (%s)", lock.lockFile, strerror( errno ) );
+        return FALSE;
+    }
+    l.l_type = F_WRLCK;
+    l.l_start = 0;
+    l.l_whence = SEEK_SET;
+    l.l_len = 0;
+    if ( fcntl( fd, F_SETLKW, &l ) < 0 )
+    {
+        Log_err( "Cannot lock %s: %s", lock.lockFile, strerror( errno ) );
+        return FALSE;
+    }
+    lock.lockFd = fd;
+    Log_dbg( "Lock successful" );
+    return TRUE;
+}
+
+static void
+releaseLock( void )
+{
+    struct flock l;
+
+    ASSERT( testLock() );    
+    l.l_type = F_UNLCK;
+    l.l_start = 0;
+    l.l_whence = SEEK_SET;
+    l.l_len = 0;
+    if ( fcntl( lock.lockFd, F_SETLK, &l ) < 0 )
+        Log_err( "Cannot release %s: %s", lock.lockFile,
+                 strerror( errno ) );
+    close( lock.lockFd );
+    lock.lockFd = -1;
+    Log_dbg( "Releasing lock" );
+}
+
+
+/* Open all databases and set global lock. */
+Bool
+Lock_openDatabases( void )
+{
+  if ( ! waitLock() )
+    {
+      Log_err( "Could not get write lock" );
+      return FALSE;
+    }
+  if ( ! Db_open() )
+    {
+      Log_err( "Could not open database" );
+      releaseLock();
+      return FALSE;
+    }
+  if ( ! Grp_open() )
+    {
+      Log_err( "Could not open groupinfo" );
+      Db_close();
+      releaseLock();
+      return FALSE;
+    }
+  if ( ! Req_open() )
+    {
+      Log_err( "Could not initialize request database" );
+      Grp_close();
+      Db_close();
+      releaseLock();
+      return FALSE;
+    }
+
+  return TRUE;
+}
+
+
+/* Close all databases and release global lock. */
+void
+Lock_closeDatabases( void )
+{
+  Grp_close();
+  Db_close();
+  Req_close();
+  releaseLock();
+}