From a319a419ba2ea0e99b5aa6fe3342cf15148f6b2a Mon Sep 17 00:00:00 2001 From: James Troup Date: Tue, 11 Feb 2003 18:10:37 +0000 Subject: [PATCH] Update for python's broken lockf() --- contrib/python_1.5.2-fcntl_lockf.diff | 82 --------------------------- jennifer | 14 +++-- kelly | 16 ++++-- 3 files changed, 21 insertions(+), 91 deletions(-) delete mode 100644 contrib/python_1.5.2-fcntl_lockf.diff diff --git a/contrib/python_1.5.2-fcntl_lockf.diff b/contrib/python_1.5.2-fcntl_lockf.diff deleted file mode 100644 index d8d06238..00000000 --- a/contrib/python_1.5.2-fcntl_lockf.diff +++ /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; diff --git a/jennifer b/jennifer index 721d85c8..d40d77c8 100755 --- a/jennifer +++ b/jennifer @@ -2,7 +2,7 @@ # Checks Debian packages from Incoming # Copyright (C) 2000, 2001, 2002, 2003 James Troup -# $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 3d226fb6..d0b37cfa 100755 --- a/kelly +++ b/kelly @@ -1,8 +1,8 @@ #!/usr/bin/env python # Installs Debian packages -# Copyright (C) 2000, 2001, 2002 James Troup -# $Id: kelly,v 1.4 2003-01-02 18:12:05 troup Exp $ +# Copyright (C) 2000, 2001, 2002, 2003 James Troup +# $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 @@ -32,14 +32,14 @@ ############################################################################### -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); -- 2.39.5