X-Git-Url: https://git.subgeniuskitty.com/unix-history/.git/blobdiff_plain/d8feebc2af6d893304b40de06ea2e9820044f2f9..d0719240aed7a84599ac73c71f78718b28341448:/usr/src/usr.bin/tip/hunt.c diff --git a/usr/src/usr.bin/tip/hunt.c b/usr/src/usr.bin/tip/hunt.c index 4030f7840f..d4c3ce6327 100644 --- a/usr/src/usr.bin/tip/hunt.c +++ b/usr/src/usr.bin/tip/hunt.c @@ -1,55 +1,67 @@ -/* hunt.c 4.4 81/11/20 */ -#include "tip.h" +/* + * Copyright (c) 1983 The Regents of the University of California. + * All rights reserved. + * + * %sccs.include.redist.c% + */ + +#ifndef lint +static char sccsid[] = "@(#)hunt.c 5.6 (Berkeley) %G%"; +#endif /* not lint */ -#define RD 04 +#include "tip.h" extern char *getremote(); extern char *rindex(); -int deadfl; +static jmp_buf deadline; +static int deadfl; +void dead() { deadfl = 1; + longjmp(deadline, 1); } hunt(name) char *name; { register char *cp; + sig_t f; - deadfl = 0; - signal(SIGALRM, dead); - while(cp = getremote(name)){ - if (access(cp, RD)) - continue; + f = signal(SIGALRM, dead); + while (cp = getremote(name)) { + deadfl = 0; uucplock = rindex(cp, '/')+1; - if (mlock(uucplock) < 0) { - delock(uucplock); + if (uu_lock(uucplock) < 0) continue; - } /* - * Straight through call units, such as the BIZCOMP - * and the DF, must indicate they're hardwired in + * Straight through call units, such as the BIZCOMP, + * VADIC and the DF, must indicate they're hardwired in * order to get an open file descriptor placed in FD. * Otherwise, as for a DN-11, the open will have to * be done in the "open" routine. */ if (!HW) break; - alarm(10); - if((FD = open(cp, 2)) >= 0){ - alarm(0); - if(!deadfl) { - ioctl(FD, TIOCEXCL, 0); - signal(SIGALRM, SIG_DFL); - return((int)cp); - } + if (setjmp(deadline) == 0) { + alarm(10); + FD = open(cp, O_RDWR); } alarm(0); - signal(SIGALRM, dead); - delock(uucplock); + if (FD < 0) { + perror(cp); + deadfl = 1; + } + if (!deadfl) { + ioctl(FD, TIOCEXCL, 0); + ioctl(FD, TIOCHPCL, 0); + signal(SIGALRM, SIG_DFL); + return ((int)cp); + } + (void)uu_unlock(uucplock); } - signal(SIGALRM, SIG_DFL); - return(deadfl ? -1 : (int)cp); + signal(SIGALRM, f); + return (deadfl ? -1 : (int)cp); }