1 /* $OpenBSD: hunt.c,v 1.13 2006/03/17 19:39:46 deraadt Exp $ */ 2 /* $NetBSD: hunt.c,v 1.6 1997/04/20 00:02:10 mellon Exp $ */ 3 4 /*- 5 * SPDX-License-Identifier: BSD-3-Clause 6 * 7 * Copyright (c) 1983, 1993 8 * The Regents of the University of California. All rights reserved. 9 * 10 * Redistribution and use in source and binary forms, with or without 11 * modification, are permitted provided that the following conditions 12 * are met: 13 * 1. Redistributions of source code must retain the above copyright 14 * notice, this list of conditions and the following disclaimer. 15 * 2. Redistributions in binary form must reproduce the above copyright 16 * notice, this list of conditions and the following disclaimer in the 17 * documentation and/or other materials provided with the distribution. 18 * 3. Neither the name of the University nor the names of its contributors 19 * may be used to endorse or promote products derived from this software 20 * without specific prior written permission. 21 * 22 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 23 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 24 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 25 * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 26 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 27 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 28 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 29 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 30 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 31 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 32 * SUCH DAMAGE. 33 */ 34 35 #include <sys/cdefs.h> 36 __FBSDID("$FreeBSD$"); 37 38 #ifndef lint 39 #if 0 40 static char sccsid[] = "@(#)hunt.c 8.1 (Berkeley) 6/6/93"; 41 static const char rcsid[] = "$OpenBSD: hunt.c,v 1.13 2006/03/17 19:39:46 deraadt Exp $"; 42 #endif 43 #endif /* not lint */ 44 45 #include "tip.h" 46 47 static jmp_buf deadline; 48 static int deadfl; 49 50 static void dead(int); 51 52 /*ARGSUSED*/ 53 static void 54 dead(int signo) 55 { 56 deadfl = 1; 57 longjmp(deadline, 1); 58 } 59 60 long 61 hunt(char *name) 62 { 63 char *cp; 64 sig_t f; 65 66 f = signal(SIGALRM, dead); 67 while ((cp = getremote(name))) { 68 deadfl = 0; 69 uucplock = strrchr(cp, '/'); 70 if (uucplock == NULL) 71 uucplock = cp; 72 else 73 uucplock++; 74 75 if (uu_lock(uucplock) < 0) 76 continue; 77 /* 78 * Straight through call units, such as the BIZCOMP, 79 * VADIC and the DF, must indicate they're hardwired in 80 * order to get an open file descriptor placed in FD. 81 * Otherwise, as for a DN-11, the open will have to 82 * be done in the "open" routine. 83 */ 84 if (!HW) 85 break; 86 if (setjmp(deadline) == 0) { 87 alarm(10); 88 FD = open(cp, (O_RDWR | 89 (boolean(value(DC)) ? O_NONBLOCK : 0))); 90 } 91 alarm(0); 92 if (FD < 0) { 93 perror(cp); 94 deadfl = 1; 95 } 96 if (!deadfl) { 97 struct termios cntrl; 98 99 tcgetattr(FD, &cntrl); 100 if (!boolean(value(DC))) 101 cntrl.c_cflag |= HUPCL; 102 tcsetattr(FD, TCSAFLUSH, &cntrl); 103 ioctl(FD, TIOCEXCL, 0); 104 signal(SIGALRM, SIG_DFL); 105 return ((long)cp); 106 } 107 (void)uu_unlock(uucplock); 108 } 109 signal(SIGALRM, f); 110 return (deadfl ? -1 : (long)cp); 111 } 112