xref: /original-bsd/usr.bin/uucp/libacu/mic.c (revision 5d8c4082)
1461ee7cfSbostic /*-
2*5d8c4082Sbostic  * Copyright (c) 1985, 1993
3*5d8c4082Sbostic  *	The Regents of the University of California.  All rights reserved.
4461ee7cfSbostic  *
5461ee7cfSbostic  * %sccs.include.proprietary.c%
6461ee7cfSbostic  */
7461ee7cfSbostic 
8f75d4380Sralph #ifndef lint
9*5d8c4082Sbostic static char sccsid[] = "@(#)mic.c	8.1 (Berkeley) 06/06/93";
10461ee7cfSbostic #endif /* not lint */
11f75d4380Sralph 
12d3f4d2b1Sbostic #include "condevs.h"
13f75d4380Sralph #ifdef MICOM
14f75d4380Sralph 
15f75d4380Sralph /*
16f75d4380Sralph  *	micopn: establish connection through a micom.
17f75d4380Sralph  *	Returns descriptor open to tty for reading and writing.
18f75d4380Sralph  *	Negative values (-1...-7) denote errors in connmsg.
19f75d4380Sralph  *	Be sure to disconnect tty when done, via HUPCL or stty 0.
20f75d4380Sralph  */
micopn(flds)21f75d4380Sralph micopn(flds)
22f75d4380Sralph register char *flds[];
23f75d4380Sralph {
24f75d4380Sralph 	extern errno;
25f75d4380Sralph 	char *rindex(), *fdig(), dcname[20];
26f75d4380Sralph 	int dh, ok = 0, speed;
27f75d4380Sralph 	register struct condev *cd;
28f75d4380Sralph 	register FILE *dfp;
29f75d4380Sralph 	struct Devices dev;
30f75d4380Sralph 
31f75d4380Sralph 	dfp = fopen(DEVFILE, "r");
32f75d4380Sralph 	ASSERT(dfp != NULL, "Can't open", DEVFILE, 0);
33f75d4380Sralph 
34f75d4380Sralph 	signal(SIGALRM, alarmtr);
35f75d4380Sralph 	dh = -1;
36f75d4380Sralph 	for(cd = condevs; ((cd->CU_meth != NULL)&&(dh < 0)); cd++) {
37f75d4380Sralph 		if (snccmp(flds[F_LINE], cd->CU_meth) == SAME) {
38f75d4380Sralph 			fseek(dfp, (off_t)0, 0);
39f75d4380Sralph 			while(rddev(dfp, &dev) != FAIL) {
40f75d4380Sralph 				if (strcmp(flds[F_CLASS], dev.D_class) != SAME)
41f75d4380Sralph 					continue;
42f75d4380Sralph 				if (snccmp(flds[F_LINE], dev.D_type) != SAME)
43f75d4380Sralph 					continue;
44f75d4380Sralph 				if (mlock(dev.D_line) == FAIL)
45f75d4380Sralph 					continue;
46f75d4380Sralph 
47f75d4380Sralph 				sprintf(dcname, "/dev/%s", dev.D_line);
48f75d4380Sralph 				getnextfd();
49f75d4380Sralph 				alarm(10);
50f75d4380Sralph 				if (setjmp(Sjbuf)) {
51f75d4380Sralph 					delock(dev.D_line);
52f75d4380Sralph 					logent(dev.D_line,"micom open TIMEOUT");
53f75d4380Sralph 					dh = -1;
54f75d4380Sralph 					break;
55f75d4380Sralph 				}
56f75d4380Sralph 				dh = open(dcname, 2);
57f75d4380Sralph 				alarm(0);
58f75d4380Sralph 				next_fd = -1;
59f75d4380Sralph 				if (dh > 0) {
60f75d4380Sralph 					break;
61f75d4380Sralph 				}
62f75d4380Sralph 				devSel[0] = '\0';
63f75d4380Sralph 				delock(dev.D_line);
64f75d4380Sralph 			}
65f75d4380Sralph 		}
66f75d4380Sralph 	}
67f75d4380Sralph 	fclose(dfp);
68f75d4380Sralph 	if (dh < 0)
69f75d4380Sralph 		return CF_NODEV;
70f75d4380Sralph 
71f75d4380Sralph 	speed = atoi(fdig(flds[F_CLASS]));
72f75d4380Sralph 	fixline(dh, speed);
73f75d4380Sralph 	sleep(1);
74f75d4380Sralph 
75f75d4380Sralph 	/* negotiate with micom */
76f75d4380Sralph 	if (speed != 4800)	/* damn their eyes! */
77f75d4380Sralph 		write(dh, "\r", 1);
78f75d4380Sralph 	else
79f75d4380Sralph 		write(dh, " ", 1);
80f75d4380Sralph 
81f75d4380Sralph 	DEBUG(4, "wanted %s ", "SELECTION");
82f75d4380Sralph 	ok = expect("SELECTION", dh);
83f75d4380Sralph 	DEBUG(4, "got %s\n", ok ? "?" : "that");
84f75d4380Sralph 	if (ok == 0) {
85f75d4380Sralph 		write(dh, flds[F_PHONE], strlen(flds[F_PHONE]));
86f75d4380Sralph 		sleep(1);
87f75d4380Sralph 		write(dh, "\r", 1);
88f75d4380Sralph 		DEBUG(4, "wanted %s ", "GO");
89f75d4380Sralph 		ok = expect("GO", dh);
90f75d4380Sralph 		DEBUG(4, "got %s\n", ok ? "?" : "that");
91f75d4380Sralph 	}
92f75d4380Sralph 
93f75d4380Sralph 	if (ok != 0) {
94f75d4380Sralph 		if (dh > 2)
95f75d4380Sralph 			close(dh);
96f75d4380Sralph 		DEBUG(4, "micom failed\n", "");
97f75d4380Sralph 		delock(dev.D_line);
98f75d4380Sralph 		return(CF_DIAL);
99f75d4380Sralph 	}
100f75d4380Sralph 	else
101f75d4380Sralph 		DEBUG(4, "micom ok\n", "");
102f75d4380Sralph 
103f75d4380Sralph 	CU_end = cd->CU_clos;
104f75d4380Sralph 	strcat(devSel, dev.D_line);	/* for later unlock */
105f75d4380Sralph 	return dh;
106f75d4380Sralph }
107f75d4380Sralph 
miccls(fd)108f75d4380Sralph miccls(fd)
109f75d4380Sralph register int fd;
110f75d4380Sralph {
111f75d4380Sralph 
112f75d4380Sralph 	if (fd > 0) {
113f75d4380Sralph 		close(fd);
114f75d4380Sralph 		delock(devSel);
115f75d4380Sralph 	}
116f75d4380Sralph }
117f75d4380Sralph #endif MICOM
118