/* Need to store the difference somewhere... */ struct xn_m_vec *mv_read(void * meta, struct xn_m_vec *mv, size_t n) { struct xn_m_vec *m, *p; int i; void * src, * dst; size_t nbytes; p = m = (struct xn_m_vec *)Arena_alloc(sys_arena, sizeof *m * n); assert(m); for(i = 0; i < n; i++, p++, mv++) { *p = *mv; assert(p->nbytes); p->addr = (void *)Arena_alloc(sys_arena, mv->nbytes); assert(p->addr); src = (char *)meta + mv->offset; dst = p->addr; nbytes = mv->nbytes; memcpy(dst, src, nbytes); } return m; }
void *Arena_calloc(T arena, long count, long nbytes, const char *file, int line) { void *ptr; assert(count > 0); ptr = Arena_alloc(arena, count*nbytes, file, line); memset(ptr, '\0', count*nbytes); return ptr; }
//todo: implement some throttle related to outstanding responses static void _save_context(T _this_, oe_id cid, ACContext *pc) { OE_DLOG(0, OEP_CLIENT_SAVE_C_W_CID, cid); assert(_this_); assert(_this_->pending); assert(cid); assert(pc); CID_KEY *key; key = Arena_alloc(pc->context->arena, sizeof *key, __FILE__, __LINE__); key->cid = cid; Table_put(_this_->pending, key, pc); }
int JsonNet_read_msg(OeSession client, OekMsg *msgp, Arena_T arena) { OeNetConn conn = OeSession_get_conn(client); if (!OeNetConn_available(conn)) return 0; int ret = 0; int pos = OeNetConn_get_pos(conn, MSG_END_BYTES, 2); if (pos < 0) { OE_DLOG(0, OEJSON_PARTIAL_READ); return ret; } size_t input_sz = pos + 2; u_char *input; input = Arena_alloc(arena, input_sz + 1, __FILE__, __LINE__); input[input_sz] = 0; //size_t amt = OeNetConn_read(conn, input, input_sz); #ifdef OE_TRACE OE_DLOG(0, OEP_JSON_READMSG, input); #endif OekMsg msg; int rc = json_msg_create(&msg, input, arena); if (rc) { OE_ERR(0, OEJSON_BAD_PARSE, rc, (char *) input); ret = -1; goto quit; } else { *msgp = msg; ret = 1; } quit: return ret; }