|
|
1.1 root 1: /*
2: * dial.c
3: *
4: * Implement the dial(3) function calls.
5: *
6: * Copyright 1987 (c) John F. Haugh II
7: * Changes Copyright 1989-91 (c) Mark Williams Company
8: */
9:
10: #include <stdio.h>
11: #include <signal.h>
12: #include <fcntl.h>
13: #include "modemcap.h"
14: #include "dial.h"
15: #include "dcp.h"
16: #include "ldev.h"
17:
18:
19: char *devname = NULL; /* Communications Device Name Connected */
20: char *rdevname = NULL; /* Remote device name */
21:
22: static char login_lock[15];
23: static char enableme[16];
24: static int modemfd = -1;
25: extern char *strtok();
26: extern int hupcatch();
27:
28: /*
29: * dial(cp) CALL cp;
30: *
31: * Dial and initiate the call specified via the given CALL data structure.
32: * Returns the opened file descriptor to be used for reads and writes to
33: * the determined device line. If there is an error, then the return value
34: * is less than zero, and the variable "merror" is set appropriately.
35: */
36:
37: dial(cp)
38: CALL *cp;
39: {
40: char modemline[64]; /* device name */
41: char *modemname = "\0";
42: char *strcpy (),
43: *strcat ();
44: int fd, err;
45:
46: fd = -1; /* channel illegal until line is opened */
47: if ( (err=findline(cp, &modemname)) <= 0 )
48: goto error;
49: strcat(strcpy(modemline, DEVDIR), cp->line);
50: if ((fd = open (modemline, O_RDWR)) < 0) { /* can't open modem line */
51: err = M_L_PROB;
52: goto error;
53: }
54: if ( (err=ttyinit(fd, cp->baud)) != 0 )
55: goto error;
56:
57: initmodem(modemname, fd); /* setup modemcap variables */
58: if (cp->telno == NULL) /* no phone number, connection complete */
59: goto okay;
60: if (! DI) { /* modem has no ACU!!! */
61: /* plog("Says no acu to attatch to???"); */
62: err = M_A_PROB; /* no ACU to attach to */
63: goto error;
64: }
65: if (BD != cp->baud) { /* is connection desired at high speed? */
66: if (BL != cp->baud) {/* is connection desired at low speed? */
67: err = M_ILL_BD; /* modem can't handle this speed */
68: goto error;
69: }
70: BD = BL; /* set baud to low baud rate */
71: CO = CL; /* set connect reply to low baud reply */
72: }
73: if (err = mdial (cp->telno, fd)) /* some error trying to dial */
74: goto error;
75:
76: okay:
77: return (modemfd = fd);
78: error:
79: hangup(fd);
80: return (merrno = err);
81: }
82:
83: /* undial()
84: * removes the lock on the remote device if it exists and reenables
85: * the port. Undial() is called by hangup(), which was called by
86: * sysend(). Bob H. 11/22/91.
87: */
88: undial (fd)
89: int fd;
90: {
91: close (fd); /* close the port */
92:
93: /* If lock removal fails, print message. */
94:
95: /* unlock the port. If it fails, note this in the logfiles, but don't
96: * abort, we will want to continue through uucico so that uuxqt
97: * gets invoked as uucico exits.
98: */
99:
100: if (lockttyexist(devname) && (unlocktty(devname) == -1) ){
101: printmsg(M_DEBUG,"Undial(): %s lock file removal failed.",devname);
102: plog(M_CALL,"%s lock file removal failed.",devname);
103: }
104:
105: /* If lock removal failed, then do not re enable the port because we
106: * no longer know who did what to the remote port. Re enabling the
107: * port could result in a race condition we don't want.
108: */
109:
110: if ((enableme[0] != '\0') && (lockttyexist(devname) == 0)){
111: plog(M_CALL, "Enabling tty line %s", enableme);
112: exec_stat("enable", enableme);
113: strcpy(enableme, "");
114: }else{
115: if((enableme[0] != '\0') && (rdevname[0] != '\0') && (rdevname[0] != '-')){
116: printmsg(M_DEBUG,"Undial: Can not re-enable port due to tty lock file.");
117: plog(M_CALL,"Could not re-enable port due to tty lock file.");
118: }
119: }
120: rdevname = NULL;
121: }
122:
123: static
124: findline(callp, brand)
125: CALL *callp;
126: char **brand;
127: {
128: int exists = 0; /* device exists at some baud rate */
129: int tried = 0; /* found a device but it was locked */
130: int devflag, telflag;
131: char *l_lline; /* tty device local name */
132: char *l_rline; /* tty device remote name */
133: char *l_type; /* ACU, DIR, etc. */
134: char *l_brand; /* modemcap brand name */
135: int l_baud; /* tty baud rate */
136: int retval; /* Place to stash return of exec_stat */
137:
138: ldev_open();
139: if ( ((devflag=(callp->line != NULL)) &&
140: (telflag=(callp->telno != NULL))) || (!devflag && !telflag) )
141: return(M_DEV_TEL);
142:
143: while ( ldev_next() ) {
144: l_type = ldev_value(type_e);
145: l_lline = ldev_value(lline_e);
146: l_rline = ldev_value(rline_e);
147: l_baud = atoi(ldev_value(baud_e));
148: l_brand = ldev_value(brand_e);
149:
150: if ( strcmp(l_type, "ACU") == 0 ) {
151: if ( devflag )
152: continue;
153: exists++;
154: if (l_baud != callp->baud)
155: continue;
156: } else if ( strcmp(l_type, "DIR") == 0 ) {
157: if ( telflag )
158: continue;
159: if ( strcmp(l_lline, callp->line) )
160: continue;
161: callp->baud = l_baud;
162: } else {
163: continue;
164: }
165: ++tried; /* found device at desired baud rate */
166:
167: /* July 29, 1992: I have removed the previous locking code. This code
168: * looked for a remote device to enable and disable and would build a
169: * lockfile if a remote device was specified. However, the advent of
170: * locking kermit has changed our needs. Now we will always have to
171: * check for and lock the LOCAL device we are dialing out with. This
172: * will, if anything, make things a bit more stable with regards to
173: * locking. Bob H.
174: */
175:
176: if (lockttyexist(l_lline)){
177: plog(M_CALL,"Device %s already locked by another process", l_lline);
178: exit(1);
179: }
180:
181:
182: #ifndef _I386
183: if (locktty(l_lline) != 0){
184: plog(M_CALL,"Attempt to create lock file failed.");
185: if(lockexist(rmtname)){
186: lockrm(rmtname);
187: }
188: exit(1);
189: }
190: #else
191: if (!locktty(l_lline)){
192: plog(M_CALL,"Attempt to create lock file failed.");
193: if(lockexist(rmtname)){
194: lockrm(rmtname);
195: }
196: exit(1);
197: }
198: #endif
199: enableme[0] = '\0';
200: if(strcmp(l_rline,"-") !=0){
201: /* Disable the remote device.
202: * Note that we will then sleep for 5 seconds to make sure that
203: * the port gets closed after the disable.
204: */
205:
206: /* Note that disable could be terminated by
207: * a SIGHUP when the port is disabled.
208: */
209: if (0!=(retval=exec_stat("disable", l_rline)) &&
210: SIGHUP<<8 != retval) {
211: plog(M_CALL,"Disable of tty line %s failed",
212: l_rline);
213: continue;
214: }else{
215: plog(M_CALL,"Disabling tty line %s", l_rline);
216: sleep(5);
217: strcpy(enableme,l_rline);
218: }
219: }
220: devname = l_lline;
221: rdevname = l_rline;
222: *brand = l_brand;
223: ldev_close();
224: callp->line = l_lline;
225: return (1);
226: }
227: if (tried)
228: return (merrno = M_DV_NT_A);
229: else if (exists) {
230: return (merrno = M_ILL_BD);
231: } else {
232: /* plog("Device not known: %s", brand); */
233: return (merrno = M_DV_NT_K);
234: }
235: }
236:
237: exec_stat(command, line)
238: char *command;
239: char *line;
240: {
241: int pid;
242: int waitstat;
243: static char etccommand[32];
244:
245: strcpy(etccommand, "/etc/");
246: strcat(etccommand, command);
247: /* plog("%s (%s) on line %s", command, etccommand, line);
248: */
249: pid = fork();
250: if (pid == 0) {
251: execl(etccommand, command, line, NULL);
252: exit(1);
253: } else
254: wait(&waitstat);
255:
256: return waitstat;
257: }
258:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.