See ChangeLog: Sat Jan 16 09:27:30 CET 1999 Werner Koch
[gnupg.git] / util / dotlock.c
index 794a362..71e6178 100644 (file)
@@ -30,6 +30,7 @@
 #include <sys/time.h>
 #include <sys/stat.h>
 #include <fcntl.h>
+#include <signal.h>
 #include "types.h"
 #include "util.h"
 #include "memory.h"
@@ -59,18 +60,20 @@ make_dotlock( const char *file_to_lock, long timeout )
     char *tname = NULL;
     int have_tfile = 0;
     struct utsname uts;
+    const char *nodename;
     const char *dirpart;
     int dirpartlen;
+    const char *maybe_dead="";
+    int backoff=0;
 
     sprintf( pidstr, "%10d\n", getpid() );
     /* fixme: add the hostname to the second line (FQDN or IP addr?) */
 
     /* create a temporary file */
-  #if SYS_NMLN < 8
-    #error Aiiih
-  #endif
     if( uname( &uts ) )
-       strcpy( uts.nodename, "unknown" );
+       nodename = "unknown";
+    else
+       nodename = uts.nodename;
 
     if( !(dirpart = strrchr( file_to_lock, '/' )) ) {
        dirpart = ".";
@@ -82,13 +85,13 @@ make_dotlock( const char *file_to_lock, long timeout )
     }
 
   #ifdef _THREAD_SAFE
-    tname = m_alloc( dirpartlen + 6 + strlen(uts.nodename) + 11+ 20 );
+    tname = m_alloc( dirpartlen + 6 + strlen(nodename) + 11+ 20 );
     sprintf( tname, "%.*s/.#lk.%s.%d.%p",
-                   dirpartlen, dirpart, uts.nodename, getpid(), &pid );
+                   dirpartlen, dirpart, nodename, getpid(), &pid );
   #else
-    tname = m_alloc( dirpartlen + 6 + strlen(uts.nodename) + 11 );
+    tname = m_alloc( dirpartlen + 6 + strlen(nodename) + 11 );
     sprintf( tname, "%.*s/.#lk.%s.%d",
-                   dirpartlen, dirpart, uts.nodename, getpid() );
+                   dirpartlen, dirpart, nodename, getpid() );
   #endif
     do {
        errno = 0;
@@ -96,17 +99,17 @@ make_dotlock( const char *file_to_lock, long timeout )
                          S_IRUSR|S_IRGRP|S_IROTH|S_IWUSR );
     } while( fd == -1 && errno == EINTR );
     if( fd == -1 ) {
-       log_error( "failed to create temporary file '%s': %s\n",
+       log_error( "failed to create temporary file `%s': %s\n",
                                              tname, strerror(errno));
        goto leave;
     }
     have_tfile = 1;
     if( write(fd, pidstr, 11 ) != 11 ) {
-       log_fatal( "error writing to '%s': %s\n", tname, strerror(errno) );
+       log_fatal( "error writing to `%s': %s\n", tname, strerror(errno) );
        goto leave;
     }
     if( close(fd) ) {
-       log_error( "error closing '%s': %s\n", tname, strerror(errno));
+       log_error( "error closing `%s': %s\n", tname, strerror(errno));
        goto leave;
     }
     fd = -1;
@@ -132,21 +135,24 @@ make_dotlock( const char *file_to_lock, long timeout )
            handle = lockname;
            lockname = NULL;
        }
-      #if 0 /* we should not do this without checking the permissions */
-           /* and the hostname */
        else if( kill(pid, 0) && errno == ESRCH ) {
+           maybe_dead = " - probably dead";
+        #if 0 /* we should not do this without checking the permissions */
+              /* and the hostname */
            log_info( "removing stale lockfile (created by %d)", pid );
            remove( lockname );
            goto retry;
+        #endif
        }
-      #endif
        if( timeout == -1 ) {
            struct timeval tv;
-           log_info( "waiting for lock (hold by %d) ...\n", pid );
+           log_info( "waiting for lock (hold by %d%s) ...\n", pid, maybe_dead );
            /* can't use sleep, cause signals may be blocked */
-           tv.tv_sec = 1;
+           tv.tv_sec = 1 + backoff;
            tv.tv_usec = 0;
            select(0, NULL, NULL, NULL, &tv);
+           if( backoff < 10 )
+               backoff++ ;
            goto retry;
        }
        /* fixme: implement timeouts */
@@ -197,7 +203,7 @@ release_dotlock( const char *lockfile )
        return -1;
     }
     if( remove( lockfile ) ) {
-       log_error( "release_dotlock: error removing lockfile '%s'",
+       log_error( "release_dotlock: error removing lockfile `%s'",
                                                            lockfile);
        return -1;
     }
@@ -217,12 +223,12 @@ read_lockfile( const char *name )
 
     if( (fd = open(name, O_RDONLY)) == -1 ) {
        int e = errno;
-       log_debug("error opening lockfile '%s': %s\n", name, strerror(errno) );
+       log_debug("error opening lockfile `%s': %s\n", name, strerror(errno) );
        errno = e;
        return -1;
     }
     if( read(fd, pidstr, 10 ) != 10 ) {
-       log_debug("error reading lockfile '%s'", name );
+       log_debug("error reading lockfile `%s'", name );
        close(fd);
        errno = 0;
        return -1;
@@ -230,7 +236,7 @@ read_lockfile( const char *name )
     close(fd);
     pid = atoi(pidstr);
     if( !pid || pid == -1 ) {
-       log_error("invalid pid %d in lockfile '%s'", pid, name );
+       log_error("invalid pid %d in lockfile `%s'", pid, name );
        errno = 0;
        return -1;
     }