| 2545 | } |
| 2546 | |
| 2547 | bool cbm_daemon_runtime_request_status(const cbm_daemon_ipc_endpoint_t *endpoint, |
| 2548 | const cbm_daemon_build_identity_t *identity, |
| 2549 | uint32_t timeout_ms, |
| 2550 | cbm_daemon_runtime_status_t *status_out) { |
| 2551 | if (!status_out) { |
| 2552 | return false; |
| 2553 | } |
| 2554 | memset(status_out, 0, sizeof(*status_out)); |
| 2555 | uint8_t *payload = NULL; |
| 2556 | if (!runtime_control_request_send(endpoint, identity, CBM_DAEMON_RUNTIME_OP_STATUS, timeout_ms, |
| 2557 | CBM_DAEMON_STATUS_RESPONSE_SIZE, &payload)) { |
| 2558 | return false; |
| 2559 | } |
| 2560 | status_out->permanent = (payload[1] & 0x01U) != 0U; |
| 2561 | status_out->stopping = (payload[1] & 0x02U) != 0U; |
| 2562 | status_out->committed_clients = (uint16_t)(((uint16_t)payload[2] << 8) | payload[3]); |
| 2563 | status_out->daemon_pid = runtime_control_read_u32(payload + 4); |
| 2564 | status_out->client_count = payload[8] > CBM_DAEMON_CONTROL_CLIENT_CAP |
| 2565 | ? (uint8_t)CBM_DAEMON_CONTROL_CLIENT_CAP |
| 2566 | : payload[8]; |
| 2567 | for (size_t index = 0; index < CBM_DAEMON_CONTROL_CLIENT_CAP; index++) { |
| 2568 | status_out->client_pids[index] = runtime_control_read_u32(payload + 12U + index * 4U); |
| 2569 | } |
| 2570 | memcpy(status_out->build_fingerprint, payload + 44U, CBM_DAEMON_BUILD_FINGERPRINT_SIZE); |
| 2571 | status_out->build_fingerprint[CBM_DAEMON_BUILD_FINGERPRINT_SIZE - 1U] = '\0'; |
| 2572 | memcpy(status_out->semantic_version, payload + 109U, sizeof(status_out->semantic_version)); |
| 2573 | status_out->semantic_version[sizeof(status_out->semantic_version) - 1U] = '\0'; |
| 2574 | free(payload); |
| 2575 | return true; |
| 2576 | } |
| 2577 | |
| 2578 | bool cbm_daemon_runtime_request_stop(const cbm_daemon_ipc_endpoint_t *endpoint, |
| 2579 | const cbm_daemon_build_identity_t *identity, |
no test coverage detected