Home | History | Annotate | Line # | Download | only in aculib
dn11.c revision 1.1
      1 /*
      2  * Copyright (c) 1983 The Regents of the University of California.
      3  * All rights reserved.
      4  *
      5  * Redistribution and use in source and binary forms, with or without
      6  * modification, are permitted provided that the following conditions
      7  * are met:
      8  * 1. Redistributions of source code must retain the above copyright
      9  *    notice, this list of conditions and the following disclaimer.
     10  * 2. Redistributions in binary form must reproduce the above copyright
     11  *    notice, this list of conditions and the following disclaimer in the
     12  *    documentation and/or other materials provided with the distribution.
     13  * 3. All advertising materials mentioning features or use of this software
     14  *    must display the following acknowledgement:
     15  *	This product includes software developed by the University of
     16  *	California, Berkeley and its contributors.
     17  * 4. Neither the name of the University nor the names of its contributors
     18  *    may be used to endorse or promote products derived from this software
     19  *    without specific prior written permission.
     20  *
     21  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
     22  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
     23  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
     24  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
     25  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
     26  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
     27  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
     28  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
     29  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
     30  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
     31  * SUCH DAMAGE.
     32  */
     33 
     34 #ifndef lint
     35 static char sccsid[] = "@(#)dn11.c	5.4 (Berkeley) 3/2/91";
     36 #endif /* not lint */
     37 
     38 /*
     39  * Routines for dialing up on DN-11
     40  */
     41 #include "tip.h"
     42 
     43 int dn_abort();
     44 void alarmtr();
     45 static jmp_buf jmpbuf;
     46 static int child = -1, dn;
     47 
     48 dn_dialer(num, acu)
     49 	char *num, *acu;
     50 {
     51 	extern errno;
     52 	char *p, *q, phone[40];
     53 	int lt, nw, connected = 1;
     54 	register int timelim;
     55 
     56 	if (boolean(value(VERBOSE)))
     57 		printf("\nstarting call...");
     58 	if ((dn = open(acu, 1)) < 0) {
     59 		if (errno == EBUSY)
     60 			printf("line busy...");
     61 		else
     62 			printf("acu open error...");
     63 		return (0);
     64 	}
     65 	if (setjmp(jmpbuf)) {
     66 		kill(child, SIGKILL);
     67 		close(dn);
     68 		return (0);
     69 	}
     70 	signal(SIGALRM, alarmtr);
     71 	timelim = 5 * strlen(num);
     72 	alarm(timelim < 30 ? 30 : timelim);
     73 	if ((child = fork()) == 0) {
     74 		/*
     75 		 * ignore this stuff for aborts
     76 		 */
     77 		signal(SIGALRM, SIG_IGN);
     78 		signal(SIGINT, SIG_IGN);
     79 		signal(SIGQUIT, SIG_IGN);
     80 		sleep(2);
     81 		nw = write(dn, num, lt = strlen(num));
     82 		exit(nw != lt);
     83 	}
     84 	/*
     85 	 * open line - will return on carrier
     86 	 */
     87 	if ((FD = open(DV, 2)) < 0) {
     88 		if (errno == EIO)
     89 			printf("lost carrier...");
     90 		else
     91 			printf("dialup line open failed...");
     92 		alarm(0);
     93 		kill(child, SIGKILL);
     94 		close(dn);
     95 		return (0);
     96 	}
     97 	alarm(0);
     98 	ioctl(dn, TIOCHPCL, 0);
     99 	signal(SIGALRM, SIG_DFL);
    100 	while ((nw = wait(&lt)) != child && nw != -1)
    101 		;
    102 	fflush(stdout);
    103 	close(dn);
    104 	if (lt != 0) {
    105 		close(FD);
    106 		return (0);
    107 	}
    108 	return (1);
    109 }
    110 
    111 void
    112 alarmtr()
    113 {
    114 	alarm(0);
    115 	longjmp(jmpbuf, 1);
    116 }
    117 
    118 /*
    119  * Insurance, for some reason we don't seem to be
    120  *  hanging up...
    121  */
    122 dn_disconnect()
    123 {
    124 
    125 	sleep(2);
    126 	if (FD > 0)
    127 		ioctl(FD, TIOCCDTR, 0);
    128 	close(FD);
    129 }
    130 
    131 dn_abort()
    132 {
    133 
    134 	sleep(2);
    135 	if (child > 0)
    136 		kill(child, SIGKILL);
    137 	if (dn > 0)
    138 		close(dn);
    139 	if (FD > 0)
    140 		ioctl(FD, TIOCCDTR, 0);
    141 	close(FD);
    142 }
    143