static void mln_ipc_fd_handler_master_process(mln_event_t *ev, mln_fork_t *f) { mln_tcp_conn_t *tc = &(f->conn); while (1) { while (f->error_bytes) { f->error_bytes = mln_ipc_discard_bytes(tc, f->error_bytes); } switch (f->state) { case STATE_IDLE: { if (mln_ipc_get_buf_with_len(tc, &(f->msg_len), M_F_LENLEN) < 0) { return; } f->state = STATE_LENGTH; } case STATE_LENGTH: { if (f->msg_content == NULL) { f->msg_content = malloc(f->msg_len); if (f->msg_content == NULL) { f->error_bytes = f->msg_len; f->state = STATE_IDLE; break; } } if (mln_ipc_get_buf_with_len(tc, f->msg_content, f->msg_len) < 0) { return; } memcpy(&(f->msg_type), f->msg_content, M_F_TYPELEN); f->state = STATE_IDLE; mln_ipc_handler_t ih; ih.type = f->msg_type; mln_rbtree_node_t *rn = mln_rbtree_search(master_ipc_tree, \ master_ipc_tree->root, \ &ih); if (!mln_rbtree_null(rn, master_ipc_tree)) { mln_ipc_handler_t *ihp = (mln_ipc_handler_t *)(rn->data); if (ihp->handler != NULL) ihp->handler(ev, \ f, \ f->msg_content+M_F_TYPELEN, \ f->msg_len-M_F_TYPELEN, \ &(ihp->data)); } free(f->msg_content); f->msg_content = NULL; break; } default: mln_log(error, "No such state!\n"); abort(); } } }
static void mln_ipc_fd_handler_worker_process(mln_event_t *ev, mln_tcp_conn_t *tc) { while (1) { while (child_error_bytes) { child_error_bytes = mln_ipc_discard_bytes(tc, child_error_bytes); } switch (child_state) { case STATE_IDLE: { if (mln_ipc_get_buf_with_len(tc, &(cur_msg_len), M_F_LENLEN) < 0) { return; } child_state = STATE_LENGTH; } case STATE_LENGTH: { if (child_msg_content == NULL) { child_msg_content = (mln_u8ptr_t)malloc(cur_msg_len); if (child_msg_content == NULL) { child_error_bytes = cur_msg_len; child_state = STATE_IDLE; break; } } if (mln_ipc_get_buf_with_len(tc, child_msg_content, cur_msg_len) < 0) { return; } memcpy(&cur_msg_type, child_msg_content, M_F_TYPELEN); child_state = STATE_IDLE; mln_ipc_handler_t ih; ih.type = cur_msg_type; mln_rbtree_node_t *rn = mln_rbtree_search(worker_ipc_tree, \ worker_ipc_tree->root, \ &ih); if (!mln_rbtree_null(rn, worker_ipc_tree)) { mln_ipc_handler_t *ihp = (mln_ipc_handler_t *)(rn->data); if (ihp->handler != NULL) ihp->handler(ev, \ tc, \ child_msg_content+M_F_TYPELEN, \ cur_msg_len-M_F_TYPELEN, \ &(ihp->data)); } free(child_msg_content); child_msg_content = NULL; break; } default: mln_log(error, "No such state!\n"); abort(); } } }
static mln_conf_domain_t * mln_conf_search_domain(mln_conf_t *cf, char *domain_name) { mln_string_t str; mln_rbtree_node_t *rn; mln_conf_domain_t tmp; mln_string_set(&str, domain_name); tmp.domain_name = &str; rn = mln_rbtree_search(cf->domain, cf->domain->root, &tmp); if (mln_rbtree_null(rn, cf->domain)) return NULL; return (mln_conf_domain_t *)(rn->data); }
static mln_conf_cmd_t * mln_conf_search_cmd(mln_conf_domain_t *cd, char *cmd_name) { mln_string_t str; mln_conf_cmd_t cmd; mln_rbtree_node_t *rn; cmd.cmd_name = &str; mln_string_set(&str, cmd_name); rn = mln_rbtree_search(cd->cmd, cd->cmd->root, &cmd); if (mln_rbtree_null(rn, cd->cmd)) return NULL; return (mln_conf_cmd_t *)(rn->data); }