int sf_proto_msglen(sf_instance_t *inst, sf_session_t *session, sf_pbuf_t *pbuf) { int len; sf_protocb_t *pcb = PCB(session); if ((len = sf_pbuf_data_len(pbuf)) <= 0) return -1; if ((pcb = PCB(session)) == NULL || pcb->pc_msg_length == NULL) return len; return pcb->pc_msg_length(&session->se_sf, sf_pbuf_head(pbuf), len, UDATA(session)); }
/* chunk data handler */ int conn_data_handler(CONN *conn) { int ret = -1; CONN_CHECK_RET(conn, ret); if(conn) { if(conn && conn->session.data_handler) { ret = conn->session.data_handler(conn, PCB(conn->packet), PCB(conn->cache), PCB(conn->chunk)); } } return ret; }
int sf_proto_end(sf_instance_t *inst, sf_session_t *session) { sf_protocb_t *pcb = PCB(session); if (pcb == NULL || pcb->pc_session_end == NULL) return 0; return pcb->pc_session_end(&session->se_sf, UDATA(session)); }
int sf_proto_input(sf_instance_t *inst, sf_session_t *session, sf_pbuf_t *pbuf, int msglen) { sf_protocb_t *pcb = PCB(session); if (pcb == NULL || pcb->pc_msg_input == NULL) return -1; return pcb->pc_msg_input(&session->se_sf, sf_pbuf_head(pbuf), msglen, UDATA(session)); }
/* packet handler */ int conn_packet_handler(CONN *conn) { int ret = -1; CONN_CHECK_RET(conn, ret); if(conn && conn->session.packet_handler) { ret = conn->session.packet_handler(conn, PCB(conn->packet)); } return ret; }
/* terminate connection */ int conn_terminate(CONN *conn) { int ret = -1; if(conn) { if(conn->c_state == C_STATE_USING && conn->session.error_handler) { DEBUG_LOGGER(conn->logger, "error handler session[%s:%d] via %d cid:%d", conn->ip, conn->port, conn->fd, conn->c_id); conn->session.error_handler(conn, PCB(conn->packet), PCB(conn->cache), PCB(conn->chunk)); } conn->event->destroy(conn->event); DEBUG_LOGGER(conn->logger, "terminateing session[%s:%d] via %d", conn->ip, conn->port, conn->fd); shutdown(conn->fd, SHUT_RDWR); close(conn->fd); conn->fd = -1; ret = 0; } return ret; }
/* oob data handler */ int conn_oob_handler(CONN *conn) { int ret = -1; CONN_CHECK_RET(conn, ret); if(conn) { if(conn && conn->session.oob_handler) { ret = conn->session.oob_handler(conn, PCB(conn->oob)); } } return ret; }
/* packet reader */ int conn_packet_reader(CONN *conn) { int len = -1, i = 0; CB_DATA *data = NULL; char *p = NULL, *e = NULL; int packet_type = 0; CONN_CHECK_RET(conn, -1); if(conn) { data = PCB(conn->buffer); packet_type = conn->session.packet_type; DEBUG_LOGGER(conn->logger, "Reading packet type[%d]", packet_type); /* Remove invalid packet type */ if(!(packet_type & PACKET_ALL)) { FATAL_LOGGER(conn->logger, "Unkown packet_type[%d] on %s:%d via %d", packet_type, conn->ip, conn->port, conn->fd); /* Terminate connection */ CONN_TERMINATE(conn); } /* Read packet with customized function from user */ if(packet_type == PACKET_CUSTOMIZED && conn->session.packet_reader) { len = conn->session.packet_reader(conn, data); DEBUG_LOGGER(conn->logger, "Reading packet with customized function[%08x] length[%d] on %s:%d via %d", conn->session.packet_reader, len, conn->ip, conn->port, conn->fd); goto end; } /* Read packet with certain length */ else if(packet_type == PACKET_CERTAIN_LENGTH && MB_NDATA(conn->buffer) >= conn->session.packet_length) { len = conn->session.packet_length; DEBUG_LOGGER(conn->logger, "Reading packet with certain length[%d] on %s:%d via %d", len, conn->ip, conn->port, conn->fd); goto end; } /* Read packet with delimiter */ else if(packet_type == PACKET_DELIMITER && conn->session.packet_delimiter && conn->session.packet_delimiter_length > 0) { p = MB_DATA(conn->buffer); e = MB_END(conn->buffer); i = 0; while(p < e && i < conn->session.packet_delimiter_length ) { if(((char *)conn->session.packet_delimiter)[i++] != *p++) i = 0; if(i == conn->session.packet_delimiter_length) { len = p - MB_DATA(conn->buffer); break; } } DEBUG_LOGGER(conn->logger, "Reading packet with delimiter[%d] " "length[%d] on %s:%d via %d", conn->session.packet_delimiter_length, len, conn->ip, conn->port, conn->fd); goto end; } return len; end: /* Copy data to packet from buffer */ if(len > 0) { MB_RESET(conn->packet); MB_PUSH(conn->packet, MB_DATA(conn->buffer), len); MB_DEL(conn->buffer, len); /* For packet handling */ conn->s_state = S_STATE_PACKET_HANDLING; conn->push_message(conn, MESSAGE_PACKET); } } return len; }