32 |
#include <termios.h> |
#include <termios.h> |
33 |
#include <unistd.h> |
#include <unistd.h> |
34 |
|
|
35 |
|
#include "gettext.h" |
36 |
#include "log.h" |
#include "log.h" |
37 |
#include "modem/modem.h" |
#include "modem/modem.h" |
38 |
#include "modem/devlock.h" |
#include "modem/devlock.h" |
155 |
int |
int |
156 |
modem_connect () |
modem_connect () |
157 |
{ |
{ |
158 |
|
|
159 |
if (!modem_open |
if (!modem_open |
160 |
(PARAM_MODEM_DEVICE, PARAM_MODEM_LINE_SPEED, PARAM_MODEM_RTSCTS)) |
(PARAM_MODEM_DEVICE, PARAM_MODEM_LINE_SPEED, PARAM_MODEM_RTSCTS)) |
161 |
return 0; |
return 0; |
162 |
log (LOG_NOTICE, "Using %s device...\n", PARAM_MODEM_DEVICE); |
log (LOG_NOTICE, gettext ("Using %s device...\n"), PARAM_MODEM_DEVICE); |
163 |
debug (1, "Device %s opened\n", PARAM_MODEM_DEVICE); |
debug (1, "Device %s opened\n", PARAM_MODEM_DEVICE); |
164 |
|
|
165 |
if (!modem_init ()) |
if (!modem_init ()) |
168 |
if (!modem_dial ()) |
if (!modem_dial ()) |
169 |
return 0; |
return 0; |
170 |
|
|
171 |
log (LOG_NOTICE, "Executing chat script (%s)...\n", PARAM_MODEM_CHAT_SCRIPT); |
log (LOG_NOTICE, gettext ("Executing chat script (%s)...\n"), |
172 |
switch(chat_connect()) |
PARAM_MODEM_CHAT_SCRIPT); |
173 |
{ |
switch (chat_connect ()) |
174 |
|
{ |
175 |
case 1: |
case 1: |
176 |
log (LOG_NOTICE, "Chat success, connected...\n"); |
log (LOG_NOTICE, gettext ("Chat success, connected...\n")); |
177 |
tcflush (fd, TCIOFLUSH); |
tcflush (fd, TCIOFLUSH); |
178 |
return 1; |
return 1; |
179 |
case 0: |
case 0: |
180 |
log (LOG_WARNING, "Chat failure, you're not connected...\n"); |
log (LOG_WARNING, gettext ("Chat failure, you're not connected...\n")); |
181 |
tcflush (fd, TCIOFLUSH); |
tcflush (fd, TCIOFLUSH); |
182 |
break; |
break; |
183 |
default: |
default: |
184 |
log (LOG_ERR, "Chat return a non boolean value.\n"); |
log (LOG_ERR, gettext ("Chat return a non boolean value.\n")); |
185 |
log (LOG_ERR, "Please verify your chat script.\n"); |
log (LOG_ERR, gettext ("Please verify your chat script.\n")); |
186 |
tcflush (fd, TCIOFLUSH); |
tcflush (fd, TCIOFLUSH); |
187 |
return 0; |
return 0; |
188 |
} |
} |
202 |
!modem_send_init_string (PARAM_MODEM_INITSTR (8)) || |
!modem_send_init_string (PARAM_MODEM_INITSTR (8)) || |
203 |
!modem_send_init_string (PARAM_MODEM_INITSTR (9))) |
!modem_send_init_string (PARAM_MODEM_INITSTR (9))) |
204 |
{ |
{ |
205 |
log (LOG_ERR,"Unable to initialize the modem\n"); |
log (LOG_ERR, gettext ("Unable to initialize the modem\n")); |
206 |
return 0; |
return 0; |
207 |
} |
} |
208 |
|
|
240 |
{ |
{ |
241 |
int i; |
int i; |
242 |
|
|
243 |
log (LOG_NOTICE, "Dialing provider...\n"); |
log (LOG_NOTICE, gettext ("Dialing provider...\n")); |
244 |
for (i = 0; i < PARAM_MODEM_DIAL_RETRY; i++) |
for (i = 0; i < PARAM_MODEM_DIAL_RETRY; i++) |
245 |
if (modem_dial_to (PARAM_MODEM_PHONE (0)) || |
if (modem_dial_to (PARAM_MODEM_PHONE (0)) || |
246 |
modem_dial_to (PARAM_MODEM_PHONE (1)) || |
modem_dial_to (PARAM_MODEM_PHONE (1)) || |
251 |
break; |
break; |
252 |
if (i >= PARAM_MODEM_DIAL_RETRY) |
if (i >= PARAM_MODEM_DIAL_RETRY) |
253 |
{ |
{ |
254 |
log (LOG_ERR, "Too many failures, dialing process aborted.\n"); |
log (LOG_ERR, gettext ("Too many failures, dialing process aborted.\n")); |
255 |
return 0; |
return 0; |
256 |
} |
} |
257 |
return 1; |
return 1; |
267 |
if (!phone) |
if (!phone) |
268 |
return 0; |
return 0; |
269 |
|
|
270 |
log(LOG_INFO, "Dialing %s\n",phone); |
log (LOG_INFO, gettext ("Dialing %s\n"), phone); |
271 |
if (!PARAM_MODEM_DIAL_PREFIX) |
if (!PARAM_MODEM_DIAL_PREFIX) |
272 |
snprintf (dialcmd, sizeof (dialcmd), "%s%s", PARAM_MODEM_DIALSTR, phone); |
snprintf (dialcmd, sizeof (dialcmd), "%s%s", PARAM_MODEM_DIALSTR, phone); |
273 |
else |
else |
279 |
switch (modem_response_value (response)) |
switch (modem_response_value (response)) |
280 |
{ |
{ |
281 |
case RESPONSE_ERROR: /* ERROR */ |
case RESPONSE_ERROR: /* ERROR */ |
282 |
log (LOG_ERR, "Bad string\n" |
log (LOG_ERR, gettext ("Bad string\n" |
283 |
"Please verify the phone number, dial string and prefix\n"); |
"Please verify the phone number, dial string and prefix\n")); |
284 |
return 0; |
return 0; |
285 |
break; |
break; |
286 |
|
|
289 |
break; |
break; |
290 |
|
|
291 |
case RESPONSE_NO_CARRIER: /* NO CARRIER */ |
case RESPONSE_NO_CARRIER: /* NO CARRIER */ |
292 |
log (LOG_WARNING, "No carrier detected\n"); |
log (LOG_WARNING, gettext ("No carrier detected\n")); |
293 |
return 0; |
return 0; |
294 |
break; |
break; |
295 |
|
|
296 |
case RESPONSE_NO_DIALTONE: /* NO DIALTONE */ |
case RESPONSE_NO_DIALTONE: /* NO DIALTONE */ |
297 |
log (LOG_WARNING, "No dial tone detected\n"); |
log (LOG_WARNING, gettext ("No dial tone detected\n")); |
298 |
return 0; |
return 0; |
299 |
break; |
break; |
300 |
|
|
301 |
case RESPONSE_BUSY: /* BUSY */ |
case RESPONSE_BUSY: /* BUSY */ |
302 |
log (LOG_WARNING, "Provider is busy\n"); |
log (LOG_WARNING, gettext ("Provider is busy\n")); |
303 |
return 0; |
return 0; |
304 |
break; |
break; |
305 |
|
|
306 |
case RESPONSE_DELAYED: /* DELAYED */ |
case RESPONSE_DELAYED: /* DELAYED */ |
307 |
log (LOG_WARNING, "Response delayed\n"); |
log (LOG_WARNING, gettext ("Response delayed\n")); |
308 |
return 0; |
return 0; |
309 |
break; |
break; |
310 |
|
|
311 |
case RESPONSE_VOICE: /* VOICE */ |
case RESPONSE_VOICE: /* VOICE */ |
312 |
log (LOG_WARNING, "Response voice\n"); |
log (LOG_WARNING, gettext ("Response voice\n")); |
313 |
return 0; |
return 0; |
314 |
break; |
break; |
315 |
|
|
316 |
case RESPONSE_FAX: /* FCLASS */ |
case RESPONSE_FAX: /* FCLASS */ |
317 |
log (LOG_WARNING, "You have been connected to a fax\n" |
log (LOG_WARNING, gettext ("You have been connected to a fax\n" |
318 |
"Please verify the phone number\n"); |
"Please verify the phone number\n")); |
319 |
return 0; |
return 0; |
320 |
break; |
break; |
321 |
|
|
322 |
case RESPONSE_NO_ANSWER: /* NO ANSWER */ |
case RESPONSE_NO_ANSWER: /* NO ANSWER */ |
323 |
log (LOG_WARNING, "There was no answer\n"); |
log (LOG_WARNING, gettext ("There was no answer\n")); |
324 |
return 0; |
return 0; |
325 |
break; |
break; |
326 |
|
|
328 |
break; |
break; |
329 |
|
|
330 |
default: /* TIMEOUT */ |
default: /* TIMEOUT */ |
331 |
log (LOG_WARNING, "Modem timed out during dialing\n"); |
log (LOG_WARNING, gettext ("Modem timed out during dialing\n")); |
332 |
return 0; |
return 0; |
333 |
} |
} |
334 |
return 0; |
return 0; |
345 |
|
|
346 |
if (!device_lock (filename)) |
if (!device_lock (filename)) |
347 |
{ |
{ |
348 |
log (LOG_ERR, "Device %s is locked\n", filename); |
log (LOG_ERR, gettext ("Device %s is locked\n"), filename); |
349 |
return 0; |
return 0; |
350 |
} |
} |
351 |
|
|
390 |
{ |
{ |
391 |
for (i = 0; i < 5; i++) |
for (i = 0; i < 5; i++) |
392 |
{ |
{ |
393 |
modem_sync_write ( "\r", 1); |
modem_sync_write ("\r", 1); |
394 |
usleep (10 * 1000); |
usleep (10 * 1000); |
395 |
} |
} |
396 |
tcdrain (fd); |
tcdrain (fd); |
467 |
we should only do this if we have received any response from the modem |
we should only do this if we have received any response from the modem |
468 |
*/ |
*/ |
469 |
tcdrain (fd); |
tcdrain (fd); |
470 |
modem_sync_write ( "\r", 1); |
modem_sync_write ("\r", 1); |
471 |
for (i = 0; !modem_data_ready (200) && i < 10; i++) |
for (i = 0; !modem_data_ready (200) && i < 10; i++) |
472 |
modem_sync_write ( "\r", 1); |
modem_sync_write ("\r", 1); |
473 |
tcdrain (fd); |
tcdrain (fd); |
474 |
|
|
475 |
/* drop DTR for a while, if still online */ |
/* drop DTR for a while, if still online */ |
487 |
if (modem_carrier ()) |
if (modem_carrier ()) |
488 |
{ |
{ |
489 |
/* need to do +++ manual-disconnect stuff */ |
/* need to do +++ manual-disconnect stuff */ |
490 |
modem_sync_write ( "+++", 3); /* command line mode */ |
modem_sync_write ("+++", 3); /* command line mode */ |
491 |
usleep (1500 * 1000); |
usleep (1500 * 1000); |
492 |
modem_sync_write ( "ATH\r", 4); /* hang-up command */ |
modem_sync_write ("ATH\r", 4); /* hang-up command */ |
493 |
|
|
494 |
for (i = 0; modem_carrier () && i < 5; i++) |
for (i = 0; modem_carrier () && i < 5; i++) |
495 |
usleep (100 * 1000); |
usleep (100 * 1000); |
596 |
{ |
{ |
597 |
debug (2, "Sending: %s\n", command); |
debug (2, "Sending: %s\n", command); |
598 |
|
|
599 |
modem_sync_write ( command, strlen (command)); |
modem_sync_write (command, strlen (command)); |
600 |
modem_sync_write ( "\r", 1); |
modem_sync_write ("\r", 1); |
601 |
|
|
602 |
/* Get the response from the modem with/without echo enabled */ |
/* Get the response from the modem with/without echo enabled */ |
603 |
if (!modem_readline (response, timeout, size)) |
if (!modem_readline (response, timeout, size)) |
698 |
|
|
699 |
/* Simulate a synchronous write */ |
/* Simulate a synchronous write */ |
700 |
int |
int |
701 |
modem_sync_write ( string, size) |
modem_sync_write (string, size) |
702 |
char *string; |
char *string; |
703 |
size_t size; |
size_t size; |
704 |
{ |
{ |
734 |
} |
} |
735 |
|
|
736 |
int |
int |
737 |
modem_valid_speed(speed) |
modem_valid_speed (speed) |
738 |
int speed; |
int speed; |
739 |
{ |
{ |
740 |
int i; |
int i; |
741 |
for(i=0; i<sizeof(speeds); i++) |
for (i = 0; i < sizeof (speeds); i++) |
742 |
if(speed==speeds[i].baud) return 1; |
if (speed == speeds[i].baud) |
743 |
|
return 1; |
744 |
return 0; |
return 0; |
745 |
} |
} |
746 |
|
|
747 |
int |
int |
748 |
modem_readc ( c ) |
modem_readc (c) |
749 |
char *c; |
char *c; |
750 |
{ |
{ |
751 |
return read(fd , c, 1); |
return read (fd, c, 1); |
752 |
} |
} |