-/* 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);
}