diff options
author | Werner Koch <[email protected]> | 1999-01-03 14:33:35 +0000 |
---|---|---|
committer | Werner Koch <[email protected]> | 1999-01-03 14:33:35 +0000 |
commit | e3e8d9b92f8b6fd0427fd5d99c66fda4596840cb (patch) | |
tree | 7788d39f49af5da5d6257ecbee119bc38529bdde /util/dotlock.c | |
parent | See ChangeLog: Tue Dec 29 19:55:38 CET 1998 Werner Koch (diff) | |
download | gnupg-e3e8d9b92f8b6fd0427fd5d99c66fda4596840cb.tar.gz gnupg-e3e8d9b92f8b6fd0427fd5d99c66fda4596840cb.zip |
See ChangeLog: Sun Jan 3 15:28:44 CET 1999 Werner Koch
Diffstat (limited to 'util/dotlock.c')
-rw-r--r-- | util/dotlock.c | 34 |
1 files changed, 18 insertions, 16 deletions
diff --git a/util/dotlock.c b/util/dotlock.c index 69a38d696..620d8cdeb 100644 --- a/util/dotlock.c +++ b/util/dotlock.c @@ -59,21 +59,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 defined(SYS_NMLN) && SYS_NMLN < 8 - #error Aiiih - #elif !defined(SYS_NMLN) && MAXHOSTNAMELEN < 8 - /* (SunOS uses a structure of size MAXHOSTNAMELEN) */ - #error Aiiih - #endif if( uname( &uts ) ) - strcpy( uts.nodename, "unknown" ); + nodename = "unknown"; + else + nodename = uts.nodename; if( !(dirpart = strrchr( file_to_lock, '/' )) ) { dirpart = "."; @@ -85,13 +84,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; @@ -135,21 +134,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 */ |