void conn_dispatch(int fd, short event, void *arg) { struct connection *c = arg; ssize_t n; if (!(event & EV_READ)) { log_debug("spurious read call"); return; } if ((n = pdu_read(c)) == -1) { if (errno == EAGAIN || errno == ENOBUFS || errno == EINTR) /* try later */ return; log_warn("pdu_read"); conn_fsm(c, CONN_EV_FAIL); return; } if (n == 0) { /* connection closed */ conn_fsm(c, CONN_EV_CLOSED); return; } pdu_parse(c); }
static const char* parse_cmgr_pdu(char** str, attribute_unused size_t len, char* oa, size_t oa_len, str_encoding_t* oa_enc, char** msg, str_encoding_t* msg_enc) { /* * parse cmgr info in the following PDU format * +CMGR: message_status,[address_text],TPDU_length<CR><LF> * SMSC_number_and_TPDU<CR><LF><CR><LF> * OK<CR><LF> * * sample * +CMGR: 1,,31 * 07911234567890F3040B911234556780F20008012150220040210C041F04400438043204350442<CR><LF><CR><LF> * OK<CR><LF> */ char delimiters[] = ",,\n"; char * marks[STRLEN(delimiters)]; char * end; size_t tpdu_length; if(mark_line(*str, delimiters, marks) == ITEMS_OF(marks)) { tpdu_length = strtol(marks[1] + 1, &end, 10); if(tpdu_length <= 0 || end[0] != '\r') return "Invalid TPDU length in CMGR PDU status line"; *str = marks[2] + 1; return pdu_parse(str, tpdu_length, oa, oa_len, oa_enc, msg, msg_enc); } return "Can't parse +CMGR response"; }