about summary refs log tree commit diff
path: root/src/libstore/pathlocks.cc
diff options
context:
space:
mode:
authorEelco Dolstra <e.dolstra@tudelft.nl>2010-02-02T15·28+0000
committerEelco Dolstra <e.dolstra@tudelft.nl>2010-02-02T15·28+0000
commit4bbbe25802ee5d625d05b9566bcc488b93974692 (patch)
tree65db343c3e2733ff46695caeef50be86229fb934 /src/libstore/pathlocks.cc
parent2723d9b56e2ea15c0c753ae579849806102f4ce0 (diff)
* Remove most Cygwin-specific code. Cygwin 1.7 implements advisory
  POSIX locks, and simulates Unix-style file deletion semantics
  sufficiently.  Note that this means that Nix won't work on Cygwin
  1.5 anymore.

Diffstat (limited to 'src/libstore/pathlocks.cc')
-rw-r--r--src/libstore/pathlocks.cc61
1 files changed, 3 insertions, 58 deletions
diff --git a/src/libstore/pathlocks.cc b/src/libstore/pathlocks.cc
index a698609d3a64..d8290815c44c 100644
--- a/src/libstore/pathlocks.cc
+++ b/src/libstore/pathlocks.cc
@@ -8,11 +8,6 @@
 #include <sys/stat.h>
 #include <fcntl.h>
 
-#ifdef __CYGWIN__
-#include <windows.h>
-#include <sys/cygwin.h>
-#endif
-
 
 namespace nix {
 
@@ -21,72 +16,24 @@ int openLockFile(const Path & path, bool create)
 {
     AutoCloseFD fd;
 
-#ifdef __CYGWIN__
-    /* On Cygwin we have to open the lock file without "DELETE"
-       sharing mode; otherwise Windows will allow open lock files to
-       be deleted (which is almost but not quite what Unix does). */
-    char win32Path[MAX_PATH + 1];
-    cygwin_conv_to_full_win32_path(path.c_str(), win32Path);
-
-    SECURITY_ATTRIBUTES sa; /* required, otherwise inexplicably bad shit happens */
-    sa.nLength = sizeof sa;
-    sa.lpSecurityDescriptor = 0;
-    sa.bInheritHandle = TRUE;
-    HANDLE h = CreateFile(win32Path, GENERIC_READ | GENERIC_WRITE,
-        FILE_SHARE_READ | FILE_SHARE_WRITE, &sa, 
-        (create ? OPEN_ALWAYS : OPEN_EXISTING), 
-        FILE_ATTRIBUTE_NORMAL, 0);
-    if (h == INVALID_HANDLE_VALUE) {
-        if (create || GetLastError() != ERROR_FILE_NOT_FOUND)
-            throw Error(format("opening lock file `%1%'") % path);
-        fd = -1;
-    }
-    else
-        fd = cygwin_attach_handle_to_fd((char *) path.c_str(), -1, h, 1, O_RDWR);
-#else        
     fd = open(path.c_str(), O_RDWR | (create ? O_CREAT : 0), 0666);
     if (fd == -1 && (create || errno != ENOENT))
         throw SysError(format("opening lock file `%1%'") % path);
-#endif
 
     return fd.borrow();
 }
 
 
-void deleteLockFilePreClose(const Path & path, int fd)
+void deleteLockFile(const Path & path, int fd)
 {
-#ifndef __CYGWIN__
     /* Get rid of the lock file.  Have to be careful not to introduce
-       races. */
-    /* On Unix, write a (meaningless) token to the file to indicate to
+       races.  Write a (meaningless) token to the file to indicate to
        other processes waiting on this lock that the lock is stale
        (deleted). */
     unlink(path.c_str());
     writeFull(fd, (const unsigned char *) "d", 1);
     /* Note that the result of unlink() is ignored; removing the lock
        file is an optimisation, not a necessity. */
-#endif
-}
-
-
-void deleteLockFilePostClose(const Path & path)
-{
-#ifdef __CYGWIN__
-    /* On Windows, just try to delete the lock file.  This will fail
-       if anybody still has the file open.  We cannot use unlink()
-       here, because Cygwin emulates Unix semantics of allowing an
-       open file to be deleted (but fakes it - the file isn't actually
-       deleted until later, so a file with the same name cannot be
-       created in the meantime). */
-    char win32Path[MAX_PATH + 1];
-    cygwin_conv_to_full_win32_path(path.c_str(), win32Path);
-    if (DeleteFile(win32Path))
-        debug(format("delete of `%1%' succeeded") % path.c_str());
-    else
-        /* Not an error: probably means that the lock is still opened
-           by someone else. */
-        debug(format("delete of `%1%' failed: %2%") % path.c_str() % GetLastError());
-#endif
 }
 
 
@@ -220,15 +167,13 @@ PathLocks::~PathLocks()
 void PathLocks::unlock()
 {
     foreach (list<FDPair>::iterator, i, fds) {
-        if (deletePaths) deleteLockFilePreClose(i->second, i->first);
+        if (deletePaths) deleteLockFile(i->second, i->first);
 
         lockedPaths.erase(i->second);
         if (close(i->first) == -1)
             printMsg(lvlError,
                 format("error (ignored): cannot close lock file on `%1%'") % i->second);
 
-	if (deletePaths) deleteLockFilePostClose(i->second);
-
         debug(format("lock released on `%1%'") % i->second);
     }