BOOL modem_command(COM_HANDLE com_handle, const char* cmd) { char resp[128]; int i; for(i=0;i<=mdm_cmdretry;i++) { if(i) { lprintf(LOG_WARNING,"Retry #%u: sending modem command (%s) on %s", i, cmd, com_dev); lprintf(LOG_DEBUG,"Dropping DTR on %s", com_dev); if(!comLowerDTR(com_handle)) lprintf(LOG_ERR,"ERROR %u lowering DTR on %s", COM_ERROR_VALUE, com_dev); SLEEP(dtr_delay); lprintf(LOG_DEBUG,"Raising DTR on %s", com_dev); if(!comRaiseDTR(com_handle)) lprintf(LOG_ERR,"ERROR %u raising DTR on %s", COM_ERROR_VALUE, com_dev); } if(!modem_send(com_handle, cmd)) { lprintf(LOG_ERR,"ERROR %u sending modem command (%s) on %s" ,COM_ERROR_VALUE, cmd, com_dev); continue; } if(modem_response(com_handle, resp, sizeof(resp))) break; } if(i<=mdm_cmdretry) { lprintf(LOG_INFO,"Modem Response: %s", resp); return TRUE; } lprintf(LOG_ERR,"Modem command (%s) failure on %s (%u attempts)", cmd, com_dev, i); return FALSE; }
BOOL wait_for_call(COM_HANDLE com_handle) { char str[128]; char* p; BOOL result=TRUE; DWORD events=0; time_t start=time(NULL); ZERO_VAR(cid_name); ZERO_VAR(cid_number); if(!comRaiseDTR(com_handle)) lprintf(LOG_ERR,"ERROR %u raising DTR", COM_ERROR_VALUE); if(com_alreadyconnected) return TRUE; if(!mdm_null) { if(mdm_init[0]) { lprintf(LOG_INFO,"Initializing modem:"); if(!modem_command(com_handle, mdm_init)) return FALSE; } if(!mdm_manswer && mdm_autoans[0]) { lprintf(LOG_INFO,"Setting modem to auto-answer:"); if(!modem_command(com_handle, mdm_autoans)) return FALSE; } if(mdm_cid[0]) { lprintf(LOG_INFO,"Enabling modem Caller-ID:"); if(!modem_command(com_handle, mdm_cid)) return FALSE; } } lprintf(LOG_INFO,"Waiting for incoming call (%s) ...", mdm_manswer ? "Ring Indication" : "Carrier Detect"); while(1) { if(terminated) return FALSE; if(comReadLine(com_handle, str, sizeof(str), /* timeout (ms): */250) > 0) { truncsp(str); if(str[0]==0) continue; lprintf(LOG_DEBUG,"Received from modem: '%s'", str); p=str; SKIP_WHITESPACE(p); if(*p) { lprintf(LOG_INFO, "Modem Message: %s", p); if(strncmp(p,"CONNECT ",8)==0) { long rate=atoi(p+8); if(rate) SAFEPRINTF2(termspeed,"%u,%u", rate, rate); } else if(strncmp(p,"NMBR",4)==0 || strncmp(p,"MESG",4)==0) { p+=4; FIND_CHAR(p,'='); SKIP_CHAR(p,'='); SKIP_WHITESPACE(p); if(cid_number[0]==0) /* Don't overwrite, if multiple messages received */ SAFECOPY(cid_number, p); } else if(strncmp(p,"NAME",4)==0) { p+=4; FIND_CHAR(p,'='); SKIP_CHAR(p,'='); SKIP_WHITESPACE(p); SAFECOPY(cid_name, p); } else if(strcmp(p,"NO CARRIER")==0) { ZERO_VAR(cid_name); ZERO_VAR(cid_number); } else if(mdm_ring[0] && strcmp(p,mdm_ring)==0 && mdm_manswer && mdm_answer[0]) { if(!modem_send(com_handle, mdm_answer)) { lprintf(LOG_ERR,"ERROR %u sending modem command (%s) on %s" ,COM_ERROR_VALUE, mdm_answer, com_dev); } } } continue; /* don't check DCD until we've received all the modem msgs */ } if(carrier_detect(com_handle)) break; if(mdm_reinit && (time(NULL)-start)/60 >= mdm_reinit) { lprintf(LOG_INFO,"Re-initialization timer elapsed: %u minutes", mdm_reinit); return TRUE; } } if(strcmp(cid_name,"P")==0) SAFECOPY(cid_name,"Private"); else if(strcmp(cid_name,"O")==0) SAFECOPY(cid_name,"Out-of-area"); if(strcmp(cid_number,"P")==0) SAFECOPY(cid_number,"Private"); else if(strcmp(cid_number,"O")==0) SAFECOPY(cid_number,"Out-of-area"); lprintf(LOG_INFO,"Carrier detected"); return TRUE; }
int modem_connect(struct bbslist *bbs) { int ret; char respbuf[1024]; init_uifc(TRUE, TRUE); if(bbs->conn_type == CONN_TYPE_SERIAL) { if((com=comOpen(bbs->addr)) == COM_HANDLE_INVALID) { uifcmsg("Cannot Open Port", "`Cannot Open Port`\n\n" "Cannot open the specified serial device.\n"); conn_api.terminate=-1; return(-1); } if(bbs->bpsrate) { if(!comSetBaudRate(com, bbs->bpsrate)) { uifcmsg("Cannot Set Baud Rate", "`Cannot Set Baud Rate`\n\n" "Cannot open the specified serial device.\n"); conn_api.terminate=-1; comClose(com); return(-1); } } if(!comRaiseDTR(com)) { uifcmsg("Cannot Raise DTR", "`Cannot Raise DTR`\n\n" "comRaiseDTR() returned an error.\n"); conn_api.terminate=-1; comClose(com); return(-1); } } else { if((com=comOpen(settings.mdm.device_name)) == COM_HANDLE_INVALID) { uifcmsg("Cannot Open Modem", "`Cannot Open Modem`\n\n" "Cannot open the specified modem device.\n"); conn_api.terminate=-1; return(-1); } if(settings.mdm.com_rate) { if(!comSetBaudRate(com, settings.mdm.com_rate)) { uifcmsg("Cannot Set Baud Rate", "`Cannot Set Baud Rate`\n\n" "Cannot open the specified modem device.\n"); conn_api.terminate=-1; comClose(com); return(-1); } } if(!comRaiseDTR(com)) { uifcmsg("Cannot Raise DTR", "`Cannot Raise DTR`\n\n" "comRaiseDTR() returned an error.\n"); conn_api.terminate=-1; comClose(com); return(-1); } /* drain keyboard input to avoid accidental cancel */ while(kbhit()) getch(); uifc.pop("Initializing..."); comWriteString(com, settings.mdm.init_string); comWriteString(com, "\r"); /* Wait for "OK" */ while(1) { if((ret=modem_response(respbuf, sizeof(respbuf), 5))!=0) { modem_close(); uifc.pop(NULL); if(ret<0) uifcmsg("Modem Not Responding", "`Modem Not Responding`\n\n" "The modem did not respond to the initializtion string\n" "Check your init string and phone number.\n"); conn_api.terminate=-1; return(-1); } if(strstr(respbuf, settings.mdm.init_string)) /* Echo is on */ continue; break; } if(!strstr(respbuf, "OK")) { modem_close(); uifc.pop(NULL); uifcmsg(respbuf, "`Initialization Error`\n\n" "The modem did not respond favorably to your initialization string.\n"); conn_api.terminate=-1; return(-1); } uifc.pop(NULL); uifc.pop("Dialing..."); comWriteString(com, settings.mdm.dial_string); comWriteString(com, bbs->addr); comWriteString(com, "\r"); /* Wait for "CONNECT" */ while(1) { if((ret=modem_response(respbuf, sizeof(respbuf), 60))!=0) { modem_close(); uifc.pop(NULL); if(ret<0) uifcmsg(respbuf, "`No Answer`\n\n" "The modem did not connect within 60 seconds.\n"); conn_api.terminate=-1; return(-1); } if(strstr(respbuf, bbs->addr)) /* Dial command echoed */ continue; break; } if(!strstr(respbuf, "CONNECT")) { modem_close(); uifc.pop(NULL); uifcmsg(respbuf, "`Connection Failed`\n\n" "SyncTERM was unable to establish a connection.\n"); conn_api.terminate=-1; return(-1); } uifc.pop(NULL); uifc.pop(respbuf); SLEEP(1000); uifc.pop(NULL); } if(!create_conn_buf(&conn_inbuf, BUFFER_SIZE)) { conn_api.close(); return(-1); } if(!create_conn_buf(&conn_outbuf, BUFFER_SIZE)) { conn_api.close(); destroy_conn_buf(&conn_inbuf); return(-1); } if(!(conn_api.rd_buf=(unsigned char *)malloc(BUFFER_SIZE))) { conn_api.close(); destroy_conn_buf(&conn_inbuf); destroy_conn_buf(&conn_outbuf); return(-1); } conn_api.rd_buf_size=BUFFER_SIZE; if(!(conn_api.wr_buf=(unsigned char *)malloc(BUFFER_SIZE))) { conn_api.close(); destroy_conn_buf(&conn_inbuf); destroy_conn_buf(&conn_outbuf); FREE_AND_NULL(conn_api.rd_buf); return(-1); } conn_api.wr_buf_size=BUFFER_SIZE; if(bbs->conn_type == CONN_TYPE_SERIAL) { _beginthread(modem_output_thread, 0, (void *)-1); _beginthread(modem_input_thread, 0, (void *)-1); } else { _beginthread(modem_output_thread, 0, NULL); _beginthread(modem_input_thread, 0, NULL); } uifc.pop(NULL); return(0); }