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; }
/*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; }