bool msgpack_unpacker_init(msgpack_unpacker* mpac, size_t initial_buffer_size) { char* buffer; void* ctx; msgpack_zone* z; if(initial_buffer_size < COUNTER_SIZE) { initial_buffer_size = COUNTER_SIZE; } buffer = (char*)malloc(initial_buffer_size); if(buffer == NULL) { return false; } ctx = malloc(sizeof(template_context)); if(ctx == NULL) { free(buffer); return false; } z = msgpack_zone_new(MSGPACK_ZONE_CHUNK_SIZE); if(z == NULL) { free(ctx); free(buffer); return false; } mpac->buffer = buffer; mpac->used = COUNTER_SIZE; mpac->free = initial_buffer_size - mpac->used; mpac->off = COUNTER_SIZE; mpac->parsed = 0; mpac->last_parsed = 0; mpac->initial_buffer_size = initial_buffer_size; mpac->z = z; mpac->ctx = ctx; init_count(mpac->buffer); template_init(CTX_CAST(mpac->ctx)); CTX_CAST(mpac->ctx)->user.z = mpac->z; CTX_CAST(mpac->ctx)->user.referenced = false; return true; }
void mod_destroy(void *ctx){ CTX_CAST(syshc, ctx); if ( ctx ){ if ( syshc->initd_dir ) free(syshc->initd_dir); free(syshc); } return; }
int msgpack_unpacker_execute(msgpack_unpacker* mpac) { size_t off = mpac->off; int ret = template_execute(CTX_CAST(mpac->ctx), mpac->buffer, mpac->used, &mpac->off); if(mpac->off > off) { mpac->parsed += mpac->off - off; } return ret; }
void msgpack_unpacker_reset(msgpack_unpacker* mpac) { template_init(CTX_CAST(mpac->ctx)); /* Fluent Bit: refer to unpack.h for more details about this field */ mpac->last_parsed = mpac->parsed; // don't reset referenced flag mpac->parsed = 0; }
msgpack_zone* msgpack_unpacker_release_zone(msgpack_unpacker* mpac) { if(!msgpack_unpacker_flush_zone(mpac)) { return NULL; } msgpack_zone* r = msgpack_zone_new(MSGPACK_ZONE_CHUNK_SIZE); if(r == NULL) { return NULL; } msgpack_zone* old = mpac->z; mpac->z = r; CTX_CAST(mpac->ctx)->user.z = mpac->z; return old; }
int mod_handler(void *ctx, net_cmd_t cmd, packet_t *outp){ int rc = MOD_OK; CTX_CAST(syshc, ctx); uint16_t out_rc; char *out_str = NULL; info("sys-cmds_handler in: cmd=%u, args='%s'\n", cmd->id, cmd->value ? cmd->value : "(null)"); switch ( cmd->id ){ case SYS_CMD_INITD: rc = sys_cmd_initd(syshc, cmd->value, &out_rc, &out_str); break; case SYS_CMD_ROUTE_INFO: rc = sys_cmd_route_info(syshc, cmd->value, &out_rc, &out_str); break; case SYS_CMD_IP_INFO: rc = sys_cmd_ip_info(syshc, cmd->value, &out_rc, &out_str); break; case SYS_CMD_DNS_INFO: rc = sys_cmd_dns_info(syshc, cmd->value, &out_rc, &out_str); break; default: err("sys-cmds_handler: Unknown command '%u'\n", cmd->id); out_rc = NET_ERR_INVAL; if ( asprintf(&out_str, "Unknown command") == -1 ){ err("asprintf: %s\n", strerror(errno)); out_str = NULL; } break; } rc = create_net_cmd_packet(outp, out_rc, SYS_CMDS_MAGIC, out_str); if ( out_rc != NET_OK ) err("sys-cmds_handler returned %u, %s\n", out_rc, out_str ? out_str : "-" ); if ( out_str ) free(out_str); return rc; }
void msgpack_unpacker_reset(msgpack_unpacker* mpac) { template_init(CTX_CAST(mpac->ctx)); // don't reset referenced flag mpac->parsed = 0; }
msgpack_object msgpack_unpacker_data(msgpack_unpacker* mpac) { return template_data(CTX_CAST(mpac->ctx)); }