Esempio n. 1
0
int mln_ipc_master_send_prepare(mln_event_t *ev, \
                                mln_u32_t type, \
                                void *msg, \
                                mln_size_t len, \
                                mln_fork_t *f_child)
{
    mln_u32_t length = sizeof(type) + len;
    mln_u8ptr_t buf;
    mln_chain_t *c;
    mln_buf_t *b;
    mln_size_t buflen;
    mln_tcp_conn_t *conn = &(f_child->conn);
    mln_alloc_t *pool = mln_tcp_conn_get_pool(conn);

    buflen = length + sizeof(length);

    c = mln_chain_new(pool);
    if (c == NULL) return -1;

    b = mln_buf_new(pool);
    if (b == NULL) {
        mln_chain_pool_release(c);
        return -1;
    }
    c->buf = b;

    buf = (mln_u8ptr_t)mln_alloc_m(pool, buflen);
    if (buf == NULL) {
        mln_chain_pool_release(c);
        return -1;
    }

    b->left_pos = b->pos = b->start = buf;
    b->last = b->end = buf + buflen;
    b->in_memory = 1;
    b->last_buf = 1;
    b->last_in_chain = 1;

    memcpy(buf, &length, sizeof(length));
    memcpy(buf+sizeof(length), &type, sizeof(type));
    memcpy(buf+sizeof(length)+sizeof(type), msg, len);

    mln_tcp_conn_append(conn, c, M_C_SEND);

    mln_event_set_fd(ev, \
                     mln_tcp_conn_get_fd(conn), \
                     M_EV_SEND|M_EV_APPEND|M_EV_NONBLOCK|M_EV_ONESHOT, \
                     M_EV_UNLIMITED, \
                     f_child, \
                     mln_ipc_fd_handler_master_send);

    return 0;
}
Esempio n. 2
0
    /*mln_conf_t*/
static inline mln_conf_t *mln_conf_init(void)
{
    mln_conf_lex_lex_dup(NULL, NULL);/*nothing to do, just get rid of compiler's warnging*/
    mln_conf_t *cf;
    mln_rbtree_node_t *rn;
    cf = (mln_conf_t *)malloc(sizeof(mln_conf_t));
    if (cf == NULL) {
        fprintf(stderr, "No memory.\n");
        return NULL;
    }
    cf->search = mln_conf_search_domain;

    struct mln_rbtree_attr rbattr;
    rbattr.cmp = mln_conf_domain_cmp;
    rbattr.data_free = mln_conf_domain_destroy;
    if ((cf->domain = mln_rbtree_init(&rbattr)) == NULL) {
        fprintf(stderr, "No memory.\n");
        free(cf);
        return NULL;
    }

    mln_alloc_t *pool;
    mln_string_t path;
    char *conf_file_path;
    mln_size_t path_len = strlen(mln_path());
    mln_lex_hooks_t hooks;
    struct mln_lex_attr lattr;

    if ((pool = mln_alloc_init()) == NULL) {
        fprintf(stderr, "No memory.\n");
        mln_rbtree_destroy(cf->domain);
        free(cf);
        return NULL;
    }
    if ((conf_file_path = (char *)mln_alloc_m(pool, path_len + sizeof(conf_filename) + 1)) == NULL) {
        fprintf(stderr, "No memory.\n");
        mln_alloc_destroy(pool);
        mln_rbtree_destroy(cf->domain);
        free(cf);
        return NULL;
    }
    memcpy(conf_file_path, mln_path(), path_len);
    conf_file_path[path_len] = '/';
    memcpy(conf_file_path+path_len+1, conf_filename, sizeof(conf_filename)-1);
    mln_string_nSet(&path, conf_file_path, path_len + sizeof(conf_filename));

    lattr.pool = pool;
    lattr.keywords = conf_keywords;
    memset(&hooks, 0, sizeof(hooks));
    hooks.slash_handler = (lex_hook)mln_conf_lex_slash_handler;
    hooks.sglq_handler = (lex_hook)mln_conf_lex_sglq_handler;
    hooks.dblq_handler = (lex_hook)mln_conf_lex_dblq_handler;
    lattr.hooks = &hooks;
    lattr.preprocess = 1;
    lattr.type = M_INPUT_T_FILE;
    lattr.data = &path;
    mln_lex_initWithHooks(mln_conf_lex, cf->lex, &lattr);
    mln_alloc_free(conf_file_path);
    if (cf->lex == NULL) {
        fprintf(stderr, "No memory.\n");
        mln_alloc_destroy(pool);
        mln_rbtree_destroy(cf->domain);
        free(cf);
        return NULL;
    }
    mln_conf_domain_t *cd = mln_conf_domain_init(cf, &default_domain);
    if (cd == NULL) {
        fprintf(stderr, "No memory.\n");
        mln_conf_destroy(cf);
        return NULL;
    }
    if ((rn = mln_rbtree_new_node(cf->domain, cd)) == NULL) {
        fprintf(stderr, "No memory.\n");
        mln_conf_domain_destroy((void *)cd);
        mln_conf_destroy(cf);
        return NULL;
    }
    mln_rbtree_insert(cf->domain, rn);
    return cf;
}