int modem_close(void) { time_t start; conn_api.terminate=1; if((comGetModemStatus(com)&COM_DCD)==0) /* DCD already low */ goto CLOSEIT; /* TODO: We need a drain function */ SLEEP(500); if(!comLowerDTR(com)) goto CLOSEIT; start=time(NULL); while(time(NULL)-start <= 10) { if((comGetModemStatus(com)&COM_DCD) == 0) goto CLOSEIT; SLEEP(1000); } CLOSEIT: while(conn_api.input_thread_running || conn_api.output_thread_running) SLEEP(1); comClose(com); destroy_conn_buf(&conn_inbuf); destroy_conn_buf(&conn_outbuf); FREE_AND_NULL(conn_api.rd_buf); FREE_AND_NULL(conn_api.wr_buf); return(0); }
void modem_input_thread(void *args) { int rd; int buffered; size_t buffer; BOOL monitor_dsr=TRUE; SetThreadName("Modem Input"); conn_api.input_thread_running=1; if(args != NULL) { if((comGetModemStatus(com)&COM_DSR) == 0) monitor_dsr=FALSE; } while(com != COM_HANDLE_INVALID && !conn_api.terminate) { rd=comReadBuf(com, conn_api.rd_buf, conn_api.rd_buf_size, NULL, 100); buffered=0; while(buffered < rd) { pthread_mutex_lock(&(conn_inbuf.mutex)); buffer=conn_buf_wait_free(&conn_inbuf, rd-buffered, 100); buffered+=conn_buf_put(&conn_inbuf, conn_api.rd_buf+buffered, buffer); pthread_mutex_unlock(&(conn_inbuf.mutex)); } if(args==NULL) { if((comGetModemStatus(com)&COM_DCD) == 0) break; } else if(monitor_dsr) { if((comGetModemStatus(com)&COM_DSR) == 0) break; } } if(args != NULL) comLowerDTR(com); conn_api.input_thread_running=0; }
void modem_output_thread(void *args) { int wr; int ret; int sent; BOOL monitor_dsr=TRUE; SetThreadName("Modem Output"); conn_api.output_thread_running=1; if(args != NULL) { if((comGetModemStatus(com)&COM_DSR) == 0) monitor_dsr=FALSE; } while(com != COM_HANDLE_INVALID && !conn_api.terminate) { pthread_mutex_lock(&(conn_outbuf.mutex)); wr=conn_buf_wait_bytes(&conn_outbuf, 1, 100); if(wr) { wr=conn_buf_get(&conn_outbuf, conn_api.wr_buf, conn_api.wr_buf_size); pthread_mutex_unlock(&(conn_outbuf.mutex)); sent=0; while(sent < wr) { ret=comWriteBuf(com, conn_api.wr_buf+sent, wr-sent); sent+=ret; if(ret==COM_ERROR) break; } if(ret==COM_ERROR) { } } else pthread_mutex_unlock(&(conn_outbuf.mutex)); if(args==NULL) { if((comGetModemStatus(com)&COM_DCD) == 0) break; } else if(monitor_dsr) { if((comGetModemStatus(com)&COM_DSR) == 0) break; } } conn_api.output_thread_running=0; }
/* Returns 0 on error, Modem status bit-map value otherwise */ int modem_status(COM_HANDLE com_handle) { int mdm_status; if((mdm_status=comGetModemStatus(com_handle)) == COM_ERROR) { lprintf(LOG_ERR,"ERROR %u getting modem status" ,COM_ERROR_VALUE); return 0; } return mdm_status; }