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