]> err.no Git - dak/commitdiff
Update for python's broken lockf()
authorJames Troup <james@nocrew.org>
Tue, 11 Feb 2003 18:10:37 +0000 (18:10 +0000)
committerJames Troup <james@nocrew.org>
Tue, 11 Feb 2003 18:10:37 +0000 (18:10 +0000)
contrib/python_1.5.2-fcntl_lockf.diff [deleted file]
jennifer
kelly

diff --git a/contrib/python_1.5.2-fcntl_lockf.diff b/contrib/python_1.5.2-fcntl_lockf.diff
deleted file mode 100644 (file)
index d8d0623..0000000
+++ /dev/null
@@ -1,82 +0,0 @@
---- python-1.5.2/Modules/fcntlmodule.c.orig    Wed Jan  6 13:44:23 1999
-+++ python-1.5.2/Modules/fcntlmodule.c Sun Apr  1 07:42:54 2001
-@@ -233,30 +233,12 @@
- {
-       int fd, code, ret, whence = 0;
-       PyObject *lenobj = NULL, *startobj = NULL;
-+       struct flock l;
-       if (!PyArg_ParseTuple(args, "ii|OOi", &fd, &code,
-                             &lenobj, &startobj, &whence))
-           return NULL;
--#ifndef LOCK_SH
--#define LOCK_SH               1       /* shared lock */
--#define LOCK_EX               2       /* exclusive lock */
--#define LOCK_NB               4       /* don't block when locking */
--#define LOCK_UN               8       /* unlock */
--#endif
--      {
--              struct flock l;
--              if (code == LOCK_UN)
--                      l.l_type = F_UNLCK;
--              else if (code & LOCK_SH)
--                      l.l_type = F_RDLCK;
--              else if (code & LOCK_EX)
--                      l.l_type = F_WRLCK;
--              else {
--                      PyErr_SetString(PyExc_ValueError,
--                                      "unrecognized flock argument");
--                      return NULL;
--              }
-               l.l_start = l.l_len = 0;
-               if (startobj != NULL) {
- #if !defined(HAVE_LARGEFILE_SUPPORT)
-@@ -281,10 +263,45 @@
-                               return NULL;
-               }
-               l.l_whence = whence;
-+       switch (code)
-+         {
-+         case F_TEST:
-+           /* Test the lock: return 0 if FD is unlocked or locked by this process;
-+              return -1, set errno to EACCES, if another process holds the lock.  */
-+           if (fcntl (fd, F_GETLK, &l) < 0) {
-+             PyErr_SetFromErrno(PyExc_IOError);
-+             return NULL;
-+           }
-+           if (l.l_type == F_UNLCK || l.l_pid == getpid ()) {
-+             Py_INCREF(Py_None);
-+             return Py_None;
-+           }
-+           errno = EACCES;
-+           PyErr_SetFromErrno(PyExc_IOError);
-+           return NULL;
-+
-+         case F_ULOCK:
-+           l.l_type = F_UNLCK;
-+           code = F_SETLK;
-+           break;
-+         case F_LOCK:
-+           l.l_type = F_WRLCK;
-+           code = F_SETLKW;
-+           break;
-+         case F_TLOCK:
-+           l.l_type = F_WRLCK;
-+           code = F_SETLK;
-+           break;
-+
-+         default:
-+           PyErr_SetString(PyExc_ValueError,
-+                           "unrecognized flock argument");
-+           return NULL;
-+         }
-               Py_BEGIN_ALLOW_THREADS
--              ret = fcntl(fd, (code & LOCK_NB) ? F_SETLK : F_SETLKW, &l);
-+         ret = fcntl(fd, code, &l);
-               Py_END_ALLOW_THREADS
--      }
-+
-       if (ret < 0) {
-               PyErr_SetFromErrno(PyExc_IOError);
-               return NULL;
index 721d85c84c53f7aaf5247f51afacedfbd0964fbb..d40d77c8698a7a9c3a658d136ff542b677c06828 100755 (executable)
--- a/jennifer
+++ b/jennifer
@@ -2,7 +2,7 @@
 
 # Checks Debian packages from Incoming
 # Copyright (C) 2000, 2001, 2002, 2003  James Troup <james@nocrew.org>
-# $Id: jennifer,v 1.31 2003-02-07 14:53:42 troup Exp $
+# $Id: jennifer,v 1.32 2003-02-11 18:10:37 troup Exp $
 
 # This program is free software; you can redistribute it and/or modify
 # it under the terms of the GNU General Public License as published by
@@ -29,7 +29,7 @@
 
 ################################################################################
 
-import FCNTL, errno, fcntl, gzip, os, re, shutil, stat, sys, time, traceback;
+import errno, fcntl, gzip, os, re, shutil, stat, sys, time, traceback;
 import apt_inst, apt_pkg;
 import db_access, katie, logging, utils;
 
@@ -45,7 +45,7 @@ re_valid_pkg_name = re.compile(r"^[\dA-Za-z][\dA-Za-z\+\-\.]+$");
 ################################################################################
 
 # Globals
-jennifer_version = "$Revision: 1.31 $";
+jennifer_version = "$Revision: 1.32 $";
 
 Cnf = None;
 Options = None;
@@ -1008,7 +1008,13 @@ def main():
 
     if not Options["No-Action"]:
         lock_fd = os.open(Cnf["Dinstall::LockFile"], os.O_RDWR | os.O_CREAT);
-        fcntl.lockf(lock_fd, FCNTL.F_TLOCK);
+        try:
+            fcntl.lockf(lock_fd, fcntl.LOCK_EX | fcntl.LOCK_NB);
+        except IOError, e:
+            if errno.errorcode[e.errno] == 'EACCES' or errno.errorcode[e.errno] == 'EAGAIN':
+                utils.fubar("Couldn't obtain lock; assuming another jennifer is already running.");
+            else:
+                raise;
         Logger = Katie.Logger = logging.Logger(Cnf, "jennifer");
 
     # debian-{devel-,}-changes@lists.debian.org toggles writes access based on this header
diff --git a/kelly b/kelly
index 3d226fb672018725376efe98d67a0f120a0d393c..d0b37cfaa6ec6140ed312440304e3326e20b1741 100755 (executable)
--- a/kelly
+++ b/kelly
@@ -1,8 +1,8 @@
 #!/usr/bin/env python
 
 # Installs Debian packages
-# Copyright (C) 2000, 2001, 2002  James Troup <james@nocrew.org>
-# $Id: kelly,v 1.4 2003-01-02 18:12:05 troup Exp $
+# Copyright (C) 2000, 2001, 2002, 2003  James Troup <james@nocrew.org>
+# $Id: kelly,v 1.5 2003-02-11 18:10:37 troup Exp $
 
 # This program is free software; you can redistribute it and/or modify
 # it under the terms of the GNU General Public License as published by
 
 ###############################################################################
 
-import FCNTL, fcntl, os, sys, time;
+import fcntl, os, sys, time;
 import apt_pkg;
 import db_access, katie, logging, utils;
 
 ###############################################################################
 
 # Globals
-kelly_version = "$Revision: 1.4 $";
+kelly_version = "$Revision: 1.5 $";
 
 Cnf = None;
 Options = None;
@@ -575,7 +575,13 @@ def main():
     # Obtain lock if not in no-action mode and initialize the log
     if not Options["No-Action"]:
         lock_fd = os.open(Cnf["Dinstall::LockFile"], os.O_RDWR | os.O_CREAT);
-        fcntl.lockf(lock_fd, FCNTL.F_TLOCK);
+        try:
+            fcntl.lockf(lock_fd, fcntl.LOCK_EX | fcntl.LOCK_NB);
+        except IOError, e:
+            if errno.errorcode[e.errno] == 'EACCES' or errno.errorcode[e.errno] == 'EAGAIN':
+                utils.fubar("Couldn't obtain lock; assuming another kelly is already running.");
+            else:
+                raise;
         Logger = Katie.Logger = logging.Logger(Cnf, "katie");
         if not installing_to_stable and Cnf.get("Dir::UrgencyLog"):
             Urgency_Logger = Urgency_Log(Cnf);