X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~mdw/git/mLib/blobdiff_plain/0f2a884637b405e8cdf04801a1e904edeaab1dd5..55ed379c6ca93abb3d43c514e038ccedf9fd84c8:/lock.c diff --git a/lock.c b/lock.c index 9dfabab..445e43d 100644 --- a/lock.c +++ b/lock.c @@ -1,6 +1,6 @@ /* -*-c-*- * - * $Id: lock.c,v 1.2 1999/05/26 20:53:40 mdw Exp $ + * $Id: lock.c,v 1.3 1999/06/06 01:23:00 mdw Exp $ * * Simplified POSIX locking interface * @@ -30,6 +30,9 @@ /*----- Revision history --------------------------------------------------* * * $Log: lock.c,v $ + * Revision 1.3 1999/06/06 01:23:00 mdw + * Fix signal handling. + * * Revision 1.2 1999/05/26 20:53:40 mdw * Fixes for stupid bugs. * @@ -88,7 +91,7 @@ static void lock_alarm(int sig) { ; } int lock_file(int fd, unsigned how) { struct flock fk; - void (*alrm)(int); + struct sigaction sa, oldsa; int e; /* --- Fill in the easy bits --- */ @@ -104,7 +107,7 @@ int lock_file(int fd, unsigned how) return (fcntl(fd, F_SETLK, &fk)); } - /* --- Set an alarm handler --- */ + /* --- Decide how to do the locking --- */ if (how == LOCK_EXCL) fk.l_type = F_WRLCK; @@ -115,14 +118,26 @@ int lock_file(int fd, unsigned how) return (-1); } - alrm = signal(SIGALRM, lock_alarm); + /* --- Set up the alarm --- */ + + sa.sa_handler = lock_alarm; + sa.sa_flags = 0; + sigemptyset(&sa.sa_mask); + if (sigaction(SIGALRM, &sa, &oldsa)) + return (-1); + + /* --- Do it --- */ + alarm(LOCK_TIMEOUT); if ((e = fcntl(fd, F_SETLKW, &fk)) != 0) { if (errno == EINTR) errno = EAGAIN; } + + /* --- Remove the alarm handling --- */ + alarm(0); - signal(SIGALRM, alrm); + sigaction(SIGALRM, &oldsa, 0); return (e); }