Exemple #1
0
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();
        }
    }
}
Exemple #2
0
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();
        }
    }
}
Exemple #3
0
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);
}
Exemple #4
0
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);
}
Exemple #5
0
/*mln_set_worker_ipc_handler*/
void mln_set_worker_ipc_handler(mln_ipc_handler_t *ih)
{
    mln_rbtree_node_t *rn = mln_rbtree_search(worker_ipc_tree, \
                                              worker_ipc_tree->root, \
                                              ih);
    if (rn->data != NULL) {
        mln_log(error, "IPC type '%d' already existed.\n", ih->type);
        abort();
    }
    rn = mln_rbtree_new_node(worker_ipc_tree, ih);
    if (rn == NULL) {
        mln_log(error, "No memory.\n");
        abort();
    }
    mln_rbtree_insert(worker_ipc_tree, rn);
}
Exemple #6
0
int mln_conf_load(void)
{
    gConf = mln_conf_init();
    if (gConf == NULL) return -1;
    mln_rbtree_node_t *rn;
    mln_conf_domain_t *cd, tmp;
    tmp.domain_name = &default_domain;
    rn = mln_rbtree_search(gConf->domain, gConf->domain->root, &tmp);
    cd = (mln_conf_domain_t *)(rn->data);
    mln_s32_t ret = _mln_conf_load(gConf, cd);
    mln_conf_destroy_lex(gConf);
    if (ret < 0) {
        mln_conf_destroy(gConf);
        gConf = NULL;
        return -1;
    }
    return 0;
}