xref: /original-bsd/usr.bin/tip/hunt.c (revision c374ae69)
1 /*
2  * Copyright (c) 1983 Regents of the University of California.
3  * All rights reserved.  The Berkeley software License Agreement
4  * specifies the terms and conditions for redistribution.
5  */
6 
7 #ifndef lint
8 static char sccsid[] = "@(#)hunt.c	5.1 (Berkeley) 04/30/85";
9 #endif not lint
10 
11 #include "tip.h"
12 
13 extern char *getremote();
14 extern char *rindex();
15 
16 static	jmp_buf deadline;
17 static	int deadfl;
18 
19 dead()
20 {
21 
22 	deadfl = 1;
23 	longjmp(deadline, 1);
24 }
25 
26 hunt(name)
27 	char *name;
28 {
29 	register char *cp;
30 	int (*f)();
31 
32 	f = signal(SIGALRM, dead);
33 	deadfl = 0;
34 	while (cp = getremote(name)) {
35 		uucplock = rindex(cp, '/')+1;
36 		if (mlock(uucplock) < 0) {
37 			delock(uucplock);
38 			continue;
39 		}
40 		/*
41 		 * Straight through call units, such as the BIZCOMP,
42 		 * VADIC and the DF, must indicate they're hardwired in
43 		 *  order to get an open file descriptor placed in FD.
44 		 * Otherwise, as for a DN-11, the open will have to
45 		 *  be done in the "open" routine.
46 		 */
47 		if (!HW)
48 			break;
49 		if (setjmp(deadline) == 0) {
50 			alarm(10);
51 			FD = open(cp, O_RDWR);
52 		}
53 		alarm(0);
54 		if (FD < 0) {
55 			perror(cp);
56 			deadfl = 1;
57 		}
58 		if (!deadfl) {
59 			ioctl(FD, TIOCEXCL, 0);
60 			ioctl(FD, TIOCHPCL, 0);
61 			signal(SIGALRM, SIG_DFL);
62 			return ((int)cp);
63 		}
64 		delock(uucplock);
65 	}
66 	signal(SIGALRM, f);
67 	return (deadfl ? -1 : (int)cp);
68 }
69