static void table_msg_dispatch(void) { struct table_open_params op; struct dict params; char res[4096]; int type, r; memset(res, 0, sizeof res); switch (imsg.hdr.type) { case PROC_TABLE_OPEN: table_msg_get(&op, sizeof op); table_msg_end(); if (op.version != PROC_TABLE_API_VERSION) { log_warnx("warn: table-api: bad API version"); fatalx("table-api: terminating"); } if ((name = strdup(op.name)) == NULL) { log_warn("warn: table-api"); fatalx("table-api: terminating"); } imsg_compose(&ibuf, PROC_TABLE_OK, 0, 0, -1, NULL, 0); break; case PROC_TABLE_UPDATE: table_msg_end(); if (handler_update) r = handler_update(); else r = 1; imsg_compose(&ibuf, PROC_TABLE_OK, 0, 0, -1, &r, sizeof(r)); break; case PROC_TABLE_CLOSE: quit = 1; break; case PROC_TABLE_CHECK: table_msg_get(&type, sizeof(type)); table_read_params(¶ms); if (rlen == 0) { log_warnx("warn: table-api: no key"); fatalx("table-api: exiting"); } if (rdata[rlen - 1] != '\0') { log_warnx("warn: table-api: key not NUL-terminated"); fatalx("table-api: exiting"); } if (handler_check) r = handler_check(type, ¶ms, rdata); else r = -1; table_clear_params(¶ms); table_msg_get(NULL, rlen); table_msg_end(); table_msg_add(&r, sizeof(r)); table_msg_close(); break; case PROC_TABLE_LOOKUP: table_msg_get(&type, sizeof(type)); table_read_params(¶ms); if (rlen == 0) { log_warnx("warn: table-api: no key"); fatalx("table-api: exiting"); } if (rdata[rlen - 1] != '\0') { log_warnx("warn: table-api: key not NUL-terminated"); fatalx("table-api: exiting"); } if (handler_lookup) r = handler_lookup(type, ¶ms, rdata, res, sizeof(res)); else r = -1; table_clear_params(¶ms); table_msg_get(NULL, rlen); table_msg_end(); table_msg_add(&r, sizeof(r)); if (r == 1) table_msg_add(res, strlen(res) + 1); table_msg_close(); break; case PROC_TABLE_FETCH: table_msg_get(&type, sizeof(type)); table_read_params(¶ms); if (handler_fetch) r = handler_fetch(type, ¶ms, res, sizeof(res)); else r = -1; table_clear_params(¶ms); table_msg_end(); table_msg_add(&r, sizeof(r)); if (r == 1) table_msg_add(res, strlen(res) + 1); table_msg_close(); break; default: log_warnx("warn: table-api: bad message %d", imsg.hdr.type); fatalx("table-api: exiting"); } }
static void scheduler_msg_dispatch(void) { size_t n, sz, count; struct evpstate evpstates[MAX_BATCH_SIZE]; uint64_t evpid, evpids[MAX_BATCH_SIZE], u64; uint32_t msgids[MAX_BATCH_SIZE], version, msgid; struct scheduler_info info; int typemask, r, type, types[MAX_BATCH_SIZE]; int delay; switch (imsg.hdr.type) { case PROC_SCHEDULER_INIT: log_debug("scheduler-api: PROC_SCHEDULER_INIT"); scheduler_msg_get(&version, sizeof(version)); scheduler_msg_end(); if (version != PROC_SCHEDULER_API_VERSION) { log_warnx("warn: scheduler-api: bad API version"); fatalx("scheduler-api: exiting"); } r = handler_init(); imsg_compose(&ibuf, PROC_SCHEDULER_OK, 0, 0, -1, &r, sizeof(r)); break; case PROC_SCHEDULER_INSERT: log_debug("scheduler-api: PROC_SCHEDULER_INSERT"); scheduler_msg_get(&info, sizeof(info)); scheduler_msg_end(); r = handler_insert(&info); imsg_compose(&ibuf, PROC_SCHEDULER_OK, 0, 0, -1, &r, sizeof(r)); break; case PROC_SCHEDULER_COMMIT: log_debug("scheduler-api: PROC_SCHEDULER_COMMIT"); scheduler_msg_get(&msgid, sizeof(msgid)); scheduler_msg_end(); n = handler_commit(msgid); imsg_compose(&ibuf, PROC_SCHEDULER_OK, 0, 0, -1, &n, sizeof(n)); break; case PROC_SCHEDULER_ROLLBACK: log_debug("scheduler-api: PROC_SCHEDULER_ROLLBACK"); scheduler_msg_get(&msgid, sizeof(msgid)); scheduler_msg_end(); n = handler_rollback(msgid); imsg_compose(&ibuf, PROC_SCHEDULER_OK, 0, 0, -1, &n, sizeof(n)); break; case PROC_SCHEDULER_UPDATE: log_debug("scheduler-api: PROC_SCHEDULER_UPDATE"); scheduler_msg_get(&info, sizeof(info)); scheduler_msg_end(); r = handler_update(&info); scheduler_msg_add(&r, sizeof(r)); if (r == 1) scheduler_msg_add(&info, sizeof(info)); scheduler_msg_close(); break; case PROC_SCHEDULER_DELETE: log_debug("scheduler-api: PROC_SCHEDULER_DELETE"); scheduler_msg_get(&evpid, sizeof(evpid)); scheduler_msg_end(); r = handler_delete(evpid); imsg_compose(&ibuf, PROC_SCHEDULER_OK, 0, 0, -1, &r, sizeof(r)); break; case PROC_SCHEDULER_HOLD: log_debug("scheduler-api: PROC_SCHEDULER_HOLD"); scheduler_msg_get(&evpid, sizeof(evpid)); scheduler_msg_get(&u64, sizeof(u64)); scheduler_msg_end(); r = handler_hold(evpid, u64); imsg_compose(&ibuf, PROC_SCHEDULER_OK, 0, 0, -1, &r, sizeof(r)); break; case PROC_SCHEDULER_RELEASE: log_debug("scheduler-api: PROC_SCHEDULER_RELEASE"); scheduler_msg_get(&type, sizeof(type)); scheduler_msg_get(&u64, sizeof(u64)); scheduler_msg_get(&r, sizeof(r)); scheduler_msg_end(); r = handler_release(type, u64, r); imsg_compose(&ibuf, PROC_SCHEDULER_OK, 0, 0, -1, &r, sizeof(r)); break; case PROC_SCHEDULER_BATCH: log_debug("scheduler-api: PROC_SCHEDULER_BATCH"); scheduler_msg_get(&typemask, sizeof(typemask)); scheduler_msg_get(&count, sizeof(count)); scheduler_msg_end(); if (count > MAX_BATCH_SIZE) count = MAX_BATCH_SIZE; r = handler_batch(typemask, &delay, &count, evpids, types); scheduler_msg_add(&r, sizeof(r)); scheduler_msg_add(&delay, sizeof(delay)); scheduler_msg_add(&count, sizeof(count)); if (r > 0) { scheduler_msg_add(evpids, sizeof(*evpids) * count); scheduler_msg_add(types, sizeof(*types) * count); } scheduler_msg_close(); break; case PROC_SCHEDULER_MESSAGES: log_debug("scheduler-api: PROC_SCHEDULER_MESSAGES"); scheduler_msg_get(&msgid, sizeof(msgid)); scheduler_msg_get(&sz, sizeof(sz)); scheduler_msg_end(); if (sz > MAX_BATCH_SIZE) sz = MAX_BATCH_SIZE; n = handler_messages(msgid, msgids, sz); imsg_compose(&ibuf, PROC_SCHEDULER_OK, 0, 0, -1, msgids, n * sizeof(*msgids)); break; case PROC_SCHEDULER_ENVELOPES: log_debug("scheduler-api: PROC_SCHEDULER_ENVELOPES"); scheduler_msg_get(&evpid, sizeof(evpid)); scheduler_msg_get(&sz, sizeof(sz)); scheduler_msg_end(); if (sz > MAX_BATCH_SIZE) sz = MAX_BATCH_SIZE; n = handler_envelopes(evpid, evpstates, sz); imsg_compose(&ibuf, PROC_SCHEDULER_OK, 0, 0, -1, evpstates, n * sizeof(*evpstates)); break; case PROC_SCHEDULER_SCHEDULE: log_debug("scheduler-api: PROC_SCHEDULER_SCHEDULE"); scheduler_msg_get(&evpid, sizeof(evpid)); scheduler_msg_end(); r = handler_schedule(evpid); imsg_compose(&ibuf, PROC_SCHEDULER_OK, 0, 0, -1, &r, sizeof(r)); break; case PROC_SCHEDULER_REMOVE: log_debug("scheduler-api: PROC_SCHEDULER_REMOVE"); scheduler_msg_get(&evpid, sizeof(evpid)); scheduler_msg_end(); r = handler_remove(evpid); imsg_compose(&ibuf, PROC_SCHEDULER_OK, 0, 0, -1, &r, sizeof(r)); break; case PROC_SCHEDULER_SUSPEND: log_debug("scheduler-api: PROC_SCHEDULER_SUSPEND"); scheduler_msg_get(&evpid, sizeof(evpid)); scheduler_msg_end(); r = handler_suspend(evpid); imsg_compose(&ibuf, PROC_SCHEDULER_OK, 0, 0, -1, &r, sizeof(r)); break; case PROC_SCHEDULER_RESUME: log_debug("scheduler-api: PROC_SCHEDULER_RESUME"); scheduler_msg_get(&evpid, sizeof(evpid)); scheduler_msg_end(); r = handler_resume(evpid); imsg_compose(&ibuf, PROC_SCHEDULER_OK, 0, 0, -1, &r, sizeof(r)); break; default: log_warnx("warn: scheduler-api: bad message %d", imsg.hdr.type); fatalx("scheduler-api: exiting"); } }
static void table_msg_dispatch(void) { uint32_t version; char res[4096]; int type, r; switch (imsg.hdr.type) { case PROC_TABLE_OPEN: table_msg_get(&version, sizeof(version)); table_msg_end(); if (version != PROC_TABLE_API_VERSION) { log_warnx("warn: table-api: bad API version"); fatalx("table-api: terminating"); } imsg_compose(&ibuf, PROC_TABLE_OK, 0, 0, -1, NULL, 0); break; case PROC_TABLE_UPDATE: table_msg_end(); if (handler_update) r = handler_update(); else r = 1; imsg_compose(&ibuf, PROC_TABLE_OK, 0, 0, -1, &r, sizeof(r)); break; case PROC_TABLE_CLOSE: quit = 1; break; case PROC_TABLE_CHECK: table_msg_get(&type, sizeof(type)); if (rlen == 0) { log_warnx("warn: table-api: no key"); fatalx("table-api: exiting"); } if (rdata[rlen - 1] != '\0') { log_warnx("warn: table-api: key not NUL-terminated"); fatalx("table-api: exiting"); } if (handler_check) r = handler_check(type, rdata); else r = -1; table_msg_get(NULL, rlen); table_msg_end(); table_msg_add(&r, sizeof(r)); table_msg_close(); break; case PROC_TABLE_LOOKUP: table_msg_get(&type, sizeof(type)); if (rlen == 0) { log_warnx("warn: table-api: no key"); fatalx("table-api: exiting"); } if (rdata[rlen - 1] != '\0') { log_warnx("warn: table-api: key not NUL-terminated"); fatalx("table-api: exiting"); } if (handler_lookup) r = handler_lookup(type, rdata, res, sizeof(res)); else r = -1; table_msg_get(NULL, rlen); table_msg_end(); table_msg_add(&r, sizeof(r)); if (r == 1) table_msg_add(res, strlen(res) + 1); table_msg_close(); break; case PROC_TABLE_FETCH: table_msg_get(&type, sizeof(type)); table_msg_end(); if (handler_fetch) r = handler_fetch(type, res, sizeof(res)); else r = -1; table_msg_add(&r, sizeof(r)); if (r == 1) table_msg_add(res, strlen(res) + 1); table_msg_close(); break; default: log_warnx("warn: table-api: bad message %i", imsg.hdr.type); fatalx("table-api: exiting"); } }