xref: /csrg-svn/usr.bin/tip/aculib/dn11.c (revision 3909)
1*3909Ssam /*	dn11.c	4.5	81/06/21	*/
23897Ssam 
33897Ssam #if DN11
43691Sroot /*
53691Sroot  * Routines for dialing up on DN-11
63691Sroot  */
73691Sroot #include "tip.h"
83897Ssam #include <setjmp.h>
93897Ssam #include <errno.h>
103691Sroot 
113691Sroot int dn_abort();
123691Sroot 
133897Ssam int alarmtr();
143897Ssam 
153897Ssam static jmp_buf jmpbuf;
16*3909Ssam static int child = -1, dn;
173897Ssam 
183691Sroot dn_dialer(num, acu)
193691Sroot char *num, *acu;
203691Sroot {
213691Sroot 	extern errno;
223897Ssam 	char *p, *q, phone[40];
23*3909Ssam 	int lt, nw, connected = 1;
243897Ssam 	register int timelim;
253691Sroot 
263901Ssam 	if (boolean(value(VERBOSE)))
273901Ssam 		printf("\nstarting call...");
283691Sroot 	if ((dn = open(acu, 1)) < 0) {
293897Ssam 		if (errno == ENXIO)
303901Ssam 			printf("line busy...");
313897Ssam 		else
323901Ssam 			printf("acu open error...");
333691Sroot 		return(0);
343691Sroot 	}
353897Ssam 	if (setjmp(jmpbuf)) {
363897Ssam 		kill(child, SIGKILL);
373897Ssam 		close(dn);
383691Sroot 		return(0);
393691Sroot 	}
403897Ssam 	signal(SIGALRM, alarmtr);
413897Ssam 	timelim = 5 * strlen(num);
423897Ssam 	alarm(timelim < 30 ? 30 : timelim);
433897Ssam 	if ((child = fork()) == 0) {
443901Ssam 		/*
453901Ssam 		 * ignore this stuff for aborts
463901Ssam 		 */
473691Sroot 		signal(SIGALRM, SIG_IGN);
483901Ssam 		signal(SIGINT, SIG_IGN);
493901Ssam 		signal(SIGQUIT, SIG_IGN);
503897Ssam 		sleep(2);
513897Ssam 		nw = write(dn, num, lt = strlen(num));
523897Ssam 		if (nw != lt) {
533897Ssam 			printf("dn11 write failed...");
543897Ssam 			exit(1);
553897Ssam 		}
563897Ssam 		exit(0);
573691Sroot 	}
583901Ssam 	/*
593901Ssam 	 * open line - will return on carrier
603901Ssam 	 */
613691Sroot 	FD = open(DV, 2);
623691Sroot 	if (FD < 0) {
633897Ssam 		if (errno == EIO)
643897Ssam 			printf("lost carrier...");
653897Ssam 		else
663897Ssam 			printf("dialup line open failed...");
673897Ssam 		alarm(0);
683897Ssam 		kill(child, SIGKILL);
693897Ssam 		close(dn);
703897Ssam 		return(0);
713691Sroot 	}
723897Ssam 	ioctl(dn, TIOCHPCL, 0);
733897Ssam 	signal(SIGALRM, SIG_DFL);
743897Ssam 	while ((nw = wait(&lt)) != child && nw != -1)
753691Sroot 		;
763691Sroot 	alarm(0);
773897Ssam 	fflush(stdout);
783897Ssam 	if (lt != 0) {
793897Ssam 		close(FD);
803897Ssam 		close(dn);
813897Ssam 		return(0);
823897Ssam 	}
833897Ssam 	return(1);
843691Sroot }
853691Sroot 
863897Ssam alarmtr()
873897Ssam {
883897Ssam 	alarm(0);
893897Ssam 	signal(SIGINT, SIG_IGN);
903897Ssam 	signal(SIGQUIT, SIG_IGN);
913897Ssam 	longjmp(jmpbuf, 1);
923897Ssam }
933691Sroot 
943897Ssam /*
953897Ssam  * Insurance, for some reason we don't seem to be
963897Ssam  *  hanging up...
973897Ssam  */
983897Ssam dn_disconnect()
993897Ssam {
1003901Ssam 	sleep(2);
1013897Ssam #ifdef VMUNIX
1023897Ssam 	if (FD > 0)
1033897Ssam 		ioctl(FD, TIOCCDTR, 0);
1043691Sroot #endif
1053897Ssam 	close(FD);
1063897Ssam }
1073897Ssam 
1083897Ssam dn_abort()
1093897Ssam {
1103901Ssam 	sleep(2);
111*3909Ssam 	if (child > 0)
112*3909Ssam 		kill(child, SIGKILL);
113*3909Ssam 	if (dn > 0)
114*3909Ssam 		close(dn);
1153897Ssam #ifdef VMUNIX
1163897Ssam 	if (FD > 0)
1173897Ssam 		ioctl(FD, TIOCCDTR, 0);
1183897Ssam #endif
1193897Ssam 	close(FD);
1203897Ssam }
1213897Ssam #endif
122