xref: /csrg-svn/usr.bin/tip/aculib/dn11.c (revision 62317)
119817Sdist /*
2*62317Sbostic  * Copyright (c) 1983, 1993
3*62317Sbostic  *	The Regents of the University of California.  All rights reserved.
435492Sbostic  *
542770Sbostic  * %sccs.include.redist.c%
619817Sdist  */
719817Sdist 
813278Ssam #ifndef lint
9*62317Sbostic static char sccsid[] = "@(#)dn11.c	8.1 (Berkeley) 06/06/93";
1035492Sbostic #endif /* not lint */
113897Ssam 
123691Sroot /*
133691Sroot  * Routines for dialing up on DN-11
143691Sroot  */
153691Sroot #include "tip.h"
163691Sroot 
1746867Sbostic int dn_abort();
1846867Sbostic void alarmtr();
193897Ssam static jmp_buf jmpbuf;
203909Ssam static int child = -1, dn;
213897Ssam 
dn_dialer(num,acu)223691Sroot dn_dialer(num, acu)
234962Ssam 	char *num, *acu;
243691Sroot {
253691Sroot 	extern errno;
263897Ssam 	char *p, *q, phone[40];
273909Ssam 	int lt, nw, connected = 1;
283897Ssam 	register int timelim;
293691Sroot 
303901Ssam 	if (boolean(value(VERBOSE)))
313901Ssam 		printf("\nstarting call...");
323691Sroot 	if ((dn = open(acu, 1)) < 0) {
334003Ssam 		if (errno == EBUSY)
343901Ssam 			printf("line busy...");
353897Ssam 		else
363901Ssam 			printf("acu open error...");
375134Ssam 		return (0);
383691Sroot 	}
393897Ssam 	if (setjmp(jmpbuf)) {
403897Ssam 		kill(child, SIGKILL);
413897Ssam 		close(dn);
425134Ssam 		return (0);
433691Sroot 	}
443897Ssam 	signal(SIGALRM, alarmtr);
453897Ssam 	timelim = 5 * strlen(num);
463897Ssam 	alarm(timelim < 30 ? 30 : timelim);
473897Ssam 	if ((child = fork()) == 0) {
483901Ssam 		/*
493901Ssam 		 * ignore this stuff for aborts
503901Ssam 		 */
513691Sroot 		signal(SIGALRM, SIG_IGN);
523901Ssam 		signal(SIGINT, SIG_IGN);
533901Ssam 		signal(SIGQUIT, SIG_IGN);
543897Ssam 		sleep(2);
553897Ssam 		nw = write(dn, num, lt = strlen(num));
564003Ssam 		exit(nw != lt);
573691Sroot 	}
583901Ssam 	/*
593901Ssam 	 * open line - will return on carrier
603901Ssam 	 */
614003Ssam 	if ((FD = open(DV, 2)) < 0) {
623897Ssam 		if (errno == EIO)
633897Ssam 			printf("lost carrier...");
643897Ssam 		else
653897Ssam 			printf("dialup line open failed...");
663897Ssam 		alarm(0);
673897Ssam 		kill(child, SIGKILL);
683897Ssam 		close(dn);
695134Ssam 		return (0);
703691Sroot 	}
714418Ssam 	alarm(0);
723897Ssam 	ioctl(dn, TIOCHPCL, 0);
733897Ssam 	signal(SIGALRM, SIG_DFL);
743897Ssam 	while ((nw = wait(&lt)) != child && nw != -1)
753691Sroot 		;
763897Ssam 	fflush(stdout);
774219Ssam 	close(dn);
783897Ssam 	if (lt != 0) {
793897Ssam 		close(FD);
805134Ssam 		return (0);
813897Ssam 	}
825134Ssam 	return (1);
833691Sroot }
843691Sroot 
8546867Sbostic void
alarmtr()863897Ssam alarmtr()
873897Ssam {
883897Ssam 	alarm(0);
893897Ssam 	longjmp(jmpbuf, 1);
903897Ssam }
913691Sroot 
923897Ssam /*
933897Ssam  * Insurance, for some reason we don't seem to be
943897Ssam  *  hanging up...
953897Ssam  */
dn_disconnect()963897Ssam dn_disconnect()
973897Ssam {
9813278Ssam 
993901Ssam 	sleep(2);
1003897Ssam 	if (FD > 0)
1013897Ssam 		ioctl(FD, TIOCCDTR, 0);
1023897Ssam 	close(FD);
1033897Ssam }
1043897Ssam 
dn_abort()1053897Ssam dn_abort()
1063897Ssam {
10713278Ssam 
1083901Ssam 	sleep(2);
1093909Ssam 	if (child > 0)
1103909Ssam 		kill(child, SIGKILL);
1113909Ssam 	if (dn > 0)
1123909Ssam 		close(dn);
1133897Ssam 	if (FD > 0)
1143897Ssam 		ioctl(FD, TIOCCDTR, 0);
1153897Ssam 	close(FD);
1163897Ssam }
117