|
|
1.1 root 1: /* %W%
2: */
3: #include "uucp.h"
4: VERSION(%W%);
5:
6: #ifdef BSD4_2
7: #include <netdb.h>
8: #include <netinet/in.h>
9: #include <sys/socket.h>
10: #endif
11: #ifdef UNET
12: #include "UNET/unetio.h"
13: #include "UNET/tcp.h"
14: #endif
15: #if defined V8 && defined TCP
16: #include <sys/inet/in.h>
17: #include <sys/inet/tcp_user.h>
18: #endif
19:
20:
21: int alarmtr();
22: extern jmp_buf Sjbuf;
23: extern char *fdig();
24:
25: /*
26: * to add a new caller:
27: * declare the function that knows how to call on the device,
28: * add a line to the callers table giving the name of the device
29: * (from Devices file) and the name of the function
30: * add the function to the end of this file
31: */
32:
33: #ifdef DIAL801
34: int dial801();
35: #endif
36:
37: #ifdef DATAKIT
38: int dkcall();
39: #endif
40:
41: #ifdef CSERV
42: int cscall();
43: #endif
44:
45: #ifdef V8
46: int Dialout();
47: #endif
48:
49: #ifdef TCP
50: int unetcall();
51: int tcpcall();
52: #endif
53:
54: #ifdef SYTEK
55: int sytcall();
56: #endif
57:
58: struct caller Caller[] = {
59:
60: #ifdef DIAL801
61: {"801", dial801},
62: {"212", dial801},
63: #endif
64:
65: #ifdef V8
66: {"Dialout", Dialout}, /* ditto but using dialout(III) */
67: #endif
68:
69: #ifdef TCP
70: #if defined BSD4_2 || defined V8
71: {"TCP", tcpcall}, /* 4.2BSD sockets */
72: #else
73: #ifdef UNET
74: {"TCP", unetcall}, /* 3com implementation of tcp */
75: {"Unetserver", unetcall},
76: #endif
77: #endif
78: #endif
79:
80: #ifdef DATAKIT
81: {"DK", dkcall}, /* standard AT&T DATAKIT VCS caller */
82: #endif
83:
84: #ifdef CSERV
85: {"CS", cscall}, /* presotto connection server */
86: #endif
87:
88: #ifdef SYTEK
89: {"Sytek", sytcall}, /* untested but should work */
90: #endif
91:
92: {NULL, NULL} /* this line must be last */
93: };
94:
95: /***
96: * exphone - expand phone number for given prefix and number
97: *
98: * return code - none
99: */
100:
101: static void
102: exphone(in, out)
103: char *in, *out;
104: {
105: FILE *fn;
106: char pre[MAXPH], npart[MAXPH], tpre[MAXPH], p[MAXPH];
107: char buf[BUFSIZ];
108: char *s1;
109:
110: if (!isalpha(*in)) {
111: (void) strcpy(out, in);
112: return;
113: }
114:
115: s1=pre;
116: while (isalpha(*in))
117: *s1++ = *in++;
118: *s1 = NULLCHAR;
119: s1 = npart;
120: while (*in != NULLCHAR)
121: *s1++ = *in++;
122: *s1 = NULLCHAR;
123:
124: tpre[0] = NULLCHAR;
125: fn = fopen(DIALFILE, "r");
126: if (fn != NULL) {
127: while (fgets(buf, BUFSIZ, fn)) {
128: if ( sscanf(buf, "%s%s", p, tpre) < 1)
129: continue;
130: if (EQUALS(p, pre))
131: break;
132: tpre[0] = NULLCHAR;
133: }
134: fclose(fn);
135: }
136:
137: (void) strcpy(out, tpre);
138: (void) strcat(out, npart);
139: return;
140: }
141:
142: /*
143: * repphone - Replace \D and \T sequences in arg with phone
144: * expanding and translating as appropriate.
145: */
146: static char *
147: repphone(arg, phone, trstr)
148: register char *arg, *phone, *trstr;
149: {
150: extern void translate();
151: static char pbuf[2*(MAXPH+2)];
152: register char *fp, *tp;
153:
154: for (tp=pbuf; *arg; arg++) {
155: if (*arg != '\\') {
156: *tp++ = *arg;
157: continue;
158: } else {
159: switch (*(arg+1)) {
160: case 'T':
161: exphone(phone, tp);
162: translate(trstr, tp);
163: for(; *tp; tp++)
164: ;
165: arg++;
166: break;
167: case 'D':
168: for(fp=phone; *tp = *fp++; tp++)
169: ;
170: arg++;
171: break;
172: default:
173: *tp++ = *arg;
174: break;
175: }
176: }
177: }
178: *tp = '\0';
179: return(pbuf);
180: }
181:
182: /*
183: * processdev - Process a line from the Devices file
184: *
185: * return codes:
186: * file descriptor - succeeded
187: * FAIL - failed
188: */
189:
190: processdev(flds, dev)
191: register char *flds[], *dev[];
192: {
193: register int dcf = -1;
194: register struct caller *ca;
195: char *args[D_MAX+1], dcname[20];
196: register char **sdev;
197: extern void translate();
198: register nullfd;
199: char *phonecl; /* clear phone string */
200: char phoneex[2*(MAXPH+2)]; /* expanded phone string */
201:
202: sdev = dev;
203: for (ca = Caller; ca->CA_type != NULL; ca++) {
204: /* This will find built-in caller functions */
205: if (EQUALS(ca->CA_type, dev[D_CALLER])) {
206: DEBUG(5, "Internal caller type %s\n", dev[D_CALLER]);
207: if (dev[D_ARG] == NULL) {
208: /* if NULL - assume translate */
209: dev[D_ARG+1] = NULL; /* needed for for loop later to mark the end */
210: dev[D_ARG] = "\\T";
211: }
212: dev[D_ARG] = repphone(dev[D_ARG], flds[F_PHONE], "");
213: if ((dcf = (*(ca->CA_caller))(flds, dev)) < 0)
214: return(dcf) ;
215: dev += 2; /* Skip to next CALLER and ARG */
216: break;
217: }
218: }
219: if (dcf == -1) {
220: /* Here if not a built-in caller function */
221: if (mlock(dev[D_LINE]) == FAIL) { /* Lock the line */
222: DEBUG(5, "mlock %s failed\n", dev[D_LINE]);
223: Uerror = SS_LOCKED_DEVICE;
224: return(FAIL);
225: }
226: DEBUG(5, "mlock %s succeeded\n", dev[D_LINE]);
227: /*
228: * Open the line
229: */
230: (void) sprintf(dcname, "/dev/%s", dev[D_LINE]);
231: /* take care of the possible partial open fd */
232: (void) close(nullfd = open("/", 0));
233: if (setjmp(Sjbuf)) {
234: (void) close(nullfd);
235: DEBUG(1, "generic open timeout\n", "");
236: logent("generic open", "TIMEOUT");
237: Uerror = SS_CANT_ACCESS_DEVICE;
238: goto bad;
239: }
240: (void) signal(SIGALRM, alarmtr);
241: (void) alarm(10);
242: dcf = open(dcname, 2);
243: (void) alarm(0);
244: if (dcf < 0) {
245: (void) close(nullfd);
246: DEBUG(1, "generic open failed, errno = %d\n", errno);
247: logent("generic open", "FAILED");
248: Uerror = SS_CANT_ACCESS_DEVICE;
249: goto bad;
250: }
251: fixline(dcf, atoi(fdig(flds[F_CLASS])), D_DIRECT);
252: }
253: /*
254: * Now loop through the remaining callers and chat
255: * according to scripts in dialers file.
256: */
257: for (; dev[D_CALLER] != NULL; dev += 2) {
258: register int w;
259: /*
260: * Scan Dialers file to find an entry
261: */
262: if ((w = gdial(dev[D_CALLER], args, D_MAX)) < 1) {
263: DEBUG(1, "%s not found in Dialers file\n", dev[D_CALLER]);
264: logent("generic call to gdial", "FAILED");
265: Uerror = SS_CANT_ACCESS_DEVICE;
266: goto bad;
267: }
268: if (w <= 2) /* do nothing - no chat */
269: break;
270: /*
271: * Translate the phone number
272: */
273: if (dev[D_ARG] == NULL) {
274: /* if NULL - assume no translation */
275: dev[D_ARG+1] = NULL; /* needed for for loop to mark the end */
276: dev[D_ARG] = "\\D";
277: }
278:
279: phonecl = repphone(dev[D_ARG], flds[F_PHONE], args[1]);
280: exphone(phonecl, phoneex);
281: translate(args[1], phoneex);
282: /*
283: * Chat
284: */
285: if (chat(w-2, &args[2], dcf, phonecl, phoneex) != SUCCESS) {
286: Uerror = SS_CHAT_FAILED;
287: goto bad;
288: }
289: }
290: /*
291: * Success at last!
292: */
293: strcpy(Dc, sdev[D_LINE]);
294: return(dcf);
295: bad:
296: (void)close(dcf);
297: delock(sdev[D_LINE]);
298: return(FAIL);
299: }
300:
301: /*
302: * translate the pairs of characters present in the first
303: * string whenever the first of the pair appears in the second
304: * string.
305: */
306: static void
307: translate(ttab, str)
308: register char *ttab, *str;
309: {
310: register char *s;
311:
312: for(;*ttab && *(ttab+1); ttab += 2)
313: for(s=str;*s;s++)
314: if(*ttab == *s)
315: *s = *(ttab+1);
316: }
317:
318: #define MAXLINE 512
319: /*
320: * Get the information about the dialer.
321: * gdial(type, arps, narps)
322: * type -> type of dialer (e.g., penril)
323: * arps -> array of pointers returned by gdial
324: * narps -> number of elements in array returned by gdial
325: * Return value:
326: * -1 -> Can't open DIALERFILE
327: * 0 -> requested type not found
328: * >0 -> success - number of fields filled in
329: */
330: static
331: gdial(type, arps, narps)
332: register char *type, *arps[];
333: register int narps;
334: {
335: static char info[MAXLINE];
336: register FILE *ldial;
337: register na;
338:
339: DEBUG(2, "gdial(%s) called\n", type);
340: if ((ldial = fopen(DIALERFILE, "r")) == NULL)
341: return(-1);
342: while (fgets(info, sizeof(info), ldial) != NULL) {
343: if ((info[0] == '#') || (info[0] == ' ') ||
344: (info[0] == '\t') || (info[0] == '\n'))
345: continue;
346: if ((na = getargs(info, arps, narps)) == 0)
347: continue;
348: if (EQUALS(arps[0], type)) {
349: (void)fclose(ldial);
350: bsfix(arps);
351: return(na);
352: }
353: }
354: (void)fclose(ldial);
355: return(0);
356: }
357:
358:
359: #ifdef DATAKIT
360:
361: /***
362: * dkcall(flds, dev) make a DATAKIT VCS connection
363: * DATAKIT VCS is a trademark of AT&T
364: *
365: * return codes:
366: * >0 - file number - ok
367: * FAIL - failed
368: */
369:
370: #include "dk.h"
371:
372: dkcall(flds, dev)
373: char *flds[], *dev[];
374: {
375: register fd;
376: #ifdef V8
377: extern int dkp_ld;
378: #endif
379:
380: char dialstring[64];
381:
382: strcpy(dialstring, dev[D_ARG]);
383:
384: #ifndef STANDALONE
385: if(*flds[F_CLASS] < '0' || *flds[F_CLASS] > '9')
386: sprintf(dialstring, "%s.%s", dev[D_ARG], flds[F_CLASS]);
387: #endif
388:
389: DEBUG(4, "dkcall(%s)\n", dialstring);
390:
391:
392: #ifdef V8
393: if (setjmp(Sjbuf)) {
394: Uerror = SS_DIAL_FAILED;
395: return(FAIL);
396: }
397:
398: (void) signal(SIGALRM, alarmtr);
399: (void) alarm(70);
400: DEBUG(4, "tdkdial(%s", dialstring);
401: DEBUG(4, ", %d)\n", atoi(flds[F_CLASS]));
402: if ((fd = tdkdial(dialstring, atoi(flds[F_CLASS]))) >= 0)
403: if (dkproto(fd, dkp_ld) < 0)
404: {
405: close(fd);
406: fd = -1;
407: }
408: (void) alarm(0);
409: #else
410: fd = dkdial(dialstring);
411: #endif
412:
413: (void) strcpy(Dc, "DK");
414: if (fd < 0) {
415: Uerror = SS_DIAL_FAILED;
416: return(FAIL);
417: }
418: else
419: return(fd);
420: }
421:
422: #endif DATAKIT
423:
424: #ifdef TCP
425:
426: /***
427: * tcpcall(flds, dev) make ethernet/socket connection
428: *
429: * return codes:
430: * >0 - file number - ok
431: * FAIL - failed
432: *
433: * the internet address is the phone number
434: * the port is the call device
435: */
436:
437: #ifdef V8
438: tcpcall(flds, dev)
439: char *flds[], *dev[];
440: {
441: int ret;
442: int port;
443: extern int errno, sys_nerr;
444: extern char *sys_errlist[];
445: struct in_service *sp;
446: struct tcpuser poot;
447:
448: poot.fport = atoi(dev[D_CALLDEV]);
449: if (poot.fport == 0) {
450: sp = in_service("uucp", "tcp", 0);
451: ASSERT(sp != NULL, "No uucp server", 0, 0);
452: poot.fport = sp->port;
453: }
454: if ((poot.faddr = in_address(dev[D_ARG])) == 0) {
455: logent("tcpopen", "no such host");
456: Uerror = SS_BADSYSTEM;
457: return(FAIL);
458: }
459: DEBUG(4, "tcpdial host %s, ", dev[D_ARG]);
460: DEBUG(4, "port %d\n", poot.fport);
461:
462: ret = tcp_sock();
463: if (ret < 0) {
464: if (errno < sys_nerr) {
465: DEBUG(5, "no socket: %s\n", sys_errlist[errno]);
466: logent("no socket", sys_errlist[errno]);
467: }
468: else {
469: DEBUG(5, "no socket, errno %d\n", errno);
470: logent("tcpopen", "NO SOCKET");
471: }
472: Uerror = SS_NO_DEVICE;
473: return(FAIL);
474: }
475: if (setjmp(Sjbuf)) {
476: DEBUG(4, "timeout tcpopen\n", "");
477: logent("tcpopen", "TIMEOUT");
478: Uerror = SS_DIAL_FAILED;
479: return(FAIL);
480: }
481: (void) signal(SIGALRM, alarmtr);
482: (void) alarm(30);
483: DEBUG(7, "addr: %s\n", in_ntoa(poot.faddr));
484: poot.lport = 0;
485: poot.param = 0;
486: poot.laddr = 0;
487: if (tcp_connect(ret, &poot) < 0) {
488: (void) alarm(0);
489: (void) close(ret);
490: if (errno < sys_nerr) {
491: DEBUG(5, "connect failed: %s\n", sys_errlist[errno]);
492: logent("connect failed", sys_errlist[errno]);
493: }
494: else {
495: DEBUG(5, "connect failed, errno %d\n", errno);
496: logent("tcpopen", "CONNECT FAILED");
497: }
498: Uerror = SS_DIAL_FAILED;
499: return(FAIL);
500: }
501: (void) signal(SIGPIPE, SIG_IGN); /* watch out for broken ipc link...*/
502: (void) alarm(0);
503: (void) strcpy(Dc, "IPC");
504: return(ret);
505: }
506: #else
507: #ifdef BSD4_2
508: tcpcall(flds, dev)
509: char *flds[], *dev[];
510: {
511: int ret;
512: short port;
513: extern int errno, sys_nerr;
514: extern char *sys_errlist[];
515: struct servent *sp;
516: struct hostent *hp;
517: struct sockaddr_in sin;
518:
519: port = atoi(dev[D_CALLDEV]);
520: if (port == 0) {
521: sp = getservbyname("uucp", "tcp");
522: ASSERT(sp != NULL, "No uucp server", 0, 0);
523: port = sp->s_port;
524: }
525: else port = htons(port);
526: hp = gethostbyname(dev[D_ARG]);
527: if (hp == NULL) {
528: logent("tcpopen", "no such host");
529: Uerror = SS_BADSYSTEM;
530: return(FAIL);
531: }
532: DEBUG(4, "tcpdial host %s, ", dev[D_ARG]);
533: DEBUG(4, "port %d\n", ntohs(port));
534:
535: ret = socket(AF_INET, SOCK_STREAM, 0);
536: if (ret < 0) {
537: if (errno < sys_nerr) {
538: DEBUG(5, "no socket: %s\n", sys_errlist[errno]);
539: logent("no socket", sys_errlist[errno]);
540: }
541: else {
542: DEBUG(5, "no socket, errno %d\n", errno);
543: logent("tcpopen", "NO SOCKET");
544: }
545: Uerror = SS_NO_DEVICE;
546: return(FAIL);
547: }
548: sin.sin_family = hp->h_addrtype;
549: bcopy(hp->h_addr, (caddr_t)&sin.sin_addr, hp->h_length);
550: sin.sin_port = port;
551: if (setjmp(Sjbuf)) {
552: DEBUG(4, "timeout tcpopen\n", "");
553: logent("tcpopen", "TIMEOUT");
554: Uerror = SS_NO_DEVICE;
555: return(FAIL);
556: }
557: (void) signal(SIGALRM, alarmtr);
558: (void) alarm(30);
559: DEBUG(7, "family: %d\n", sin.sin_family);
560: DEBUG(7, "port: %d\n", sin.sin_port);
561: DEBUG(7, "addr: %08x\n",*((int *) &sin.sin_addr));
562: if (connect(ret, (caddr_t)&sin, sizeof (sin)) < 0) {
563: (void) alarm(0);
564: (void) close(ret);
565: if (errno < sys_nerr) {
566: DEBUG(5, "connect failed: %s\n", sys_errlist[errno]);
567: logent("connect failed", sys_errlist[errno]);
568: }
569: else {
570: DEBUG(5, "connect failed, errno %d\n", errno);
571: logent("tcpopen", "CONNECT FAILED");
572: }
573: Uerror = SS_NO_DEVICE;
574: return(FAIL);
575: }
576: (void) signal(SIGPIPE, SIG_IGN); /* watch out for broken ipc link...*/
577: (void) alarm(0);
578: (void) strcpy(Dc, "IPC");
579: return(ret);
580: }
581: #endif
582: #endif
583:
584:
585: /***
586: * unetcall(flds, dev) make ethernet connection
587: *
588: * return codes:
589: * >0 - file number - ok
590: * FAIL - failed
591: */
592:
593: #ifdef UNET
594: unetcall(flds, dev)
595: char *flds[], *dev[];
596: {
597: int ret;
598: int port;
599: extern int errno;
600:
601: port = atoi(dev[D_ARG]);
602: DEBUG(4, "unetdial host %s, ", flds[F_NAME]);
603: DEBUG(4, "port %d\n", port);
604: (void) alarm(30);
605: ret = tcpopen(flds[F_NAME], port, 0, TO_ACTIVE, "rw");
606: (void) alarm(0);
607: endhnent(); /* wave magic wand at 3com and incant "eat it, bruce" */
608: if (ret < 0) {
609: DEBUG(5, "tcpopen failed: errno %d\n", errno);
610: Uerror = SS_DIAL_FAILED;
611: return(FAIL);
612: }
613: (void) strcpy(Dc, "UNET");
614: return(ret);
615: }
616: #endif UNET
617:
618: #endif /* TCP */
619:
620: #ifdef CSERV
621:
622: #include <ipc.h>
623:
624: cscall(flds, dev)
625: char *flds[], *dev[];
626: {
627: int fd;
628: register char *p;
629: char *rem;
630: extern int errno;
631: extern char *errstr;
632:
633: rem = dev[D_ARG];
634: if (*dev[D_CALLDEV] == '.') {
635: for (p = rem; *p; p++)
636: if (*p == '.') {
637: *p = '!'; /* sad but true */
638: break;
639: }
640: }
641: rem = ipcpath(rem, (char *)NULL, (char *)NULL);
642: DEBUG(4, "ipcopen(%s, ", rem);
643: DEBUG(4, "%s)\n", dev[D_LINE]);
644: if ((fd = ipcopen(rem, dev[D_LINE])) >= 0)
645: return (fd);
646: DEBUG(4, "ipcopen failed, error %d ", errno);
647: DEBUG(4, "%s\n", errstr);
648: /* should think more about errors */
649: Uerror = SS_DIAL_FAILED;
650: return(FAIL);
651: }
652: #endif
653:
654: #ifdef SYTEK
655:
656: /****
657: * sytcall(flds, dev) make a sytek connection
658: *
659: * return codes:
660: * >0 - file number - ok
661: * FAIL - failed
662: */
663:
664: /*ARGSUSED*/
665: sytcall(flds, dev)
666: char *flds[], *dev[];
667: {
668: extern int errno;
669: int dcr, dcr2, nullfd, ret;
670: char dcname[20], command[BUFSIZ];
671:
672: (void) sprintf(dcname, "/dev/%s", dev[D_LINE]);
673: DEBUG(4, "dc - %s, ", dcname);
674: dcr = open(dcname, O_WRONLY|O_NDELAY);
675: if (dcr < 0) {
676: Uerror = SS_DIAL_FAILED;
677: DEBUG(4, "OPEN FAILED %s\n", dcname);
678: delock(dev[D_LINE]);
679: return(FAIL);
680: }
681:
682: sytfixline(dcr, atoi(fdig(dev[D_CLASS])), D_DIRECT);
683: (void) sleep(2);
684: (void) sprintf(command,"\r\rcall %s\r",flds[F_PHONE]);
685: ret = write(dcr, command, strlen(command));
686: (void) sleep(1);
687: DEBUG(4, "COM1 return = %d\n", ret);
688: sytfix2line(dcr);
689: (void) close(nullfd = open("/", 0));
690: (void) signal(SIGALRM, alarmtr);
691: if (setjmp(Sjbuf)) {
692: DEBUG(4, "timeout sytek open\n", "");
693: (void) close(nullfd);
694: (void) close(dcr2);
695: (void) close(dcr);
696: Uerror = SS_DIAL_FAILED;
697: delock(dev[D_LINE]);
698: return(FAIL);
699: }
700: (void) alarm(10);
701: dcr2 = open(dcname,O_RDWR);
702: (void) alarm(0);
703: (void) close(dcr);
704: if (dcr2 < 0) {
705: DEBUG(4, "OPEN 2 FAILED %s\n", dcname);
706: Uerror = SS_DIAL_FAILED;
707: (void) close(nullfd); /* kernel might think dc2 is open */
708: delock(dev[D_LINE]);
709: return(FAIL);
710: }
711: return(dcr2);
712: }
713:
714: #endif SYTEK
715:
716: #ifdef DIAL801
717:
718: /***
719: * dial801(flds, dev) dial remote machine on 801/801
720: * char *flds[], *dev[];
721: *
722: * return codes:
723: * file descriptor - succeeded
724: * FAIL - failed
725: *
726: * unfortunately, open801() is different for usg and non-usg
727: */
728:
729: /*ARGSUSED*/
730: dial801(flds, dev)
731: char *flds[], *dev[];
732: {
733: char dcname[20], dnname[20], phone[MAXPH+2], *fdig();
734: int dcf = -1, speed;
735:
736: if (mlock(dev[D_LINE]) == FAIL) {
737: DEBUG(5, "mlock %s failed\n", dev[D_LINE]);
738: Uerror = SS_LOCKED_DEVICE;
739: return(FAIL);
740: }
741: (void) sprintf(dnname, "/dev/%s", dev[D_CALLDEV]);
742: (void) sprintf(phone, "%s%s", dev[D_ARG] , ACULAST);
743: (void) sprintf(dcname, "/dev/%s", dev[D_LINE]);
744: CDEBUG(1, "Use Port %s, ", dcname);
745: DEBUG(4, "acu - %s, ", dnname);
746: CDEBUG(1, "Phone Number %s\n", phone);
747: VERBOSE("Trying modem - %s, ", dcname); /* for cu */
748: VERBOSE("acu - %s, ", dnname); /* for cu */
749: VERBOSE("calling %s: ", phone); /* for cu */
750: speed = atoi(fdig(dev[D_CLASS]));
751: dcf = open801(dcname, dnname, phone, speed);
752: if (dcf >= 0) {
753: fixline(dcf, speed, D_ACU);
754: (void) strcpy(Dc, dev[D_LINE]); /* for later unlock() */
755: VERBOSE("SUCCEEDED\n", 0);
756: } else {
757: delock(dev[D_LINE]);
758: VERBOSE("FAILED\n", 0);
759: }
760: return(dcf);
761: }
762:
763:
764: #ifndef ATTSV
765: /*ARGSUSED*/
766: open801(dcname, dnname, phone, speed)
767: char *dcname, *dnname, *phone;
768: {
769: int nw, lt, pid = -1, dcf = -1, nullfd, dnf = -1;
770: int rpid;
771: unsigned timelim;
772:
773: if ((dnf = open(dnname, 1)) < 0) {
774: DEBUG(5, "can't open %s\n", dnname);
775: Uerror = SS_CANT_ACCESS_DEVICE;
776: return(FAIL);
777: }
778: DEBUG(5, "%s is open\n", dnname);
779:
780: (void) close(nullfd = open("/dev/null", 0)); /* partial open hack */
781: if (setjmp(Sjbuf)) {
782: DEBUG(4, "timeout modem open\n", "");
783: logent("801 open", "TIMEOUT");
784: (void) close(nullfd);
785: (void) close(dcf);
786: (void) close(dnf);
787: if (pid > 0) {
788: kill(pid, 9);
789: while ((rpid = wait((int *) 0)) > 0 && rpid != pid)
790: ;
791: }
792: Uerror = SS_DIAL_FAILED;
793: return(FAIL);
794: }
795: (void) signal(SIGALRM, alarmtr);
796: timelim = 5 * strlen(phone);
797: (void) alarm(timelim < 30 ? 30 : timelim);
798: if ((pid = fork()) == 0) {
799: sleep(2);
800: nw = write(dnf, phone, lt = strlen(phone));
801: if (nw != lt) {
802: DEBUG(4, "ACU write error %d\n", errno);
803: logent("ACU write", "FAILED");
804: exit(1);
805: }
806: DEBUG(4, "ACU write ok%s\n", "");
807: exit(0);
808: }
809: /* open line - will return on carrier */
810: dcf = open(dcname, 2);
811:
812: DEBUG(4, "dcf is %d\n", dcf);
813: if (dcf < 0) { /* handle like a timeout */
814: (void) alarm(0);
815: longjmp(Sjbuf, 1);
816: }
817:
818: /* modem is open */
819: while ((nw = wait(<)) != pid && nw != -1)
820: ;
821: (void) alarm(0);
822:
823: (void) close(dnf); /* no reason to keep the 801 open */
824: if (lt != 0) {
825: DEBUG(4, "Fork Stat %o\n", lt);
826: (void) close(dcf);
827: Uerror = SS_DIAL_FAILED;
828: return(FAIL);
829: }
830: return(dcf);
831: }
832:
833: #else
834:
835: open801(dcname, dnname, phone, speed)
836: char *dcname, *dnname, *phone;
837: {
838: int nw, lt, dcf = -1, nullfd, dnf = -1, ret;
839: unsigned timelim;
840:
841: (void) close(nullfd = open("/", 0)); /* partial open hack */
842: if (setjmp(Sjbuf)) {
843: DEBUG(4, "DN write %s\n", "timeout");
844: (void) close(dnf);
845: (void) close(dcf);
846: (void) close(nullfd);
847: Uerror = SS_DIAL_FAILED;
848: return(FAIL);
849: }
850: (void) signal(SIGALRM, alarmtr);
851: timelim = 5 * strlen(phone);
852: (void) alarm(timelim < 30 ? 30 : timelim);
853:
854: if ((dnf = open(dnname, O_WRONLY)) < 0 ) {
855: DEBUG(5, "can't open %s\n", dnname);
856: Uerror = SS_CANT_ACCESS_DEVICE;
857: return(FAIL);
858: }
859: DEBUG(5, "%s is open\n", dnname);
860: if ( (dcf = open(dcname, O_RDWR | O_NDELAY)) < 0 ) {
861: DEBUG(5, "can't open %s\n", dcname);
862: Uerror = SS_CANT_ACCESS_DEVICE;
863: return(FAIL);
864: }
865:
866: DEBUG(4, "dcf is %d\n", dcf);
867: fixline(dcf, speed, D_ACU);
868: nw = write(dnf, phone, lt = strlen(phone));
869: if (nw != lt) {
870: (void) alarm(0);
871: DEBUG(4, "ACU write error %d\n", errno);
872: (void) close(dnf);
873: (void) close(dcf);
874: Uerror = SS_DIAL_FAILED;
875: return(FAIL);
876: } else
877: DEBUG(4, "ACU write ok%s\n", "");
878:
879: (void) close(dnf);
880: (void) close(nullfd = open("/", 0)); /* partial open hack */
881: ret = open(dcname, 2); /* wait for carrier */
882: (void) alarm(0);
883: (void) close(ret); /* close 2nd modem open() */
884: if (ret < 0) { /* open() interrupted by alarm */
885: DEBUG(4, "Line open %s\n", "failed");
886: Uerror = SS_DIAL_FAILED;
887: (void) close(nullfd); /* close partially opened modem */
888: return(FAIL);
889: }
890: (void) fcntl(dcf,F_SETFL, fcntl(dcf, F_GETFL, 0) & ~O_NDELAY);
891: return(dcf);
892: }
893: #endif
894:
895: #endif
896:
897: #ifdef V8
898: Dialout(flds)
899: char *flds[];
900: {
901: int fd;
902: char phone[MAXPH+2];
903:
904: exphone(flds[F_PHONE], phone);
905:
906: DEBUG(4, "call dialout(%s", phone);
907: DEBUG(4, ", %s)\n", flds[F_CLASS]);
908: fd = dialout(phone, flds[F_CLASS]);
909: if (fd >= 0)
910: fixline(fd, 0, D_ACU);
911: else if (fd == -1)
912: Uerror = SS_NO_DEVICE;
913: else if (fd == -3)
914: Uerror = SS_DIAL_FAILED;
915: else if (fd == -9)
916: Uerror = SS_DEVICE_FAILED;
917:
918: (void) strcpy(Dc, "Dialout");
919:
920: return(fd);
921: }
922: #endif DIAL801
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.