| 2030 | } |
| 2031 | |
| 2032 | static void *ipc_roundtrip_server(void *opaque) { |
| 2033 | static const uint8_t expected_request[] = {0x00, 'r', 'e', 'q', 0xff}; |
| 2034 | static const uint8_t response[] = {'o', 'k', 0x00, 0x7f}; |
| 2035 | ipc_roundtrip_server_t *server = (ipc_roundtrip_server_t *)opaque; |
| 2036 | cbm_daemon_ipc_connection_t *connection = NULL; |
| 2037 | cbm_daemon_frame_t frame = {0}; |
| 2038 | uint8_t *payload = NULL; |
| 2039 | |
| 2040 | server->result = 1; |
| 2041 | if (cbm_daemon_ipc_accept(server->listener, 2000, &connection) != 1 || !connection) { |
| 2042 | goto done; |
| 2043 | } |
| 2044 | server->peer_pid = cbm_daemon_ipc_connection_peer_pid(connection); |
| 2045 | if (server->peer_pid == 0) { |
| 2046 | goto done; |
| 2047 | } |
| 2048 | if (cbm_daemon_ipc_receive_frame(connection, 2000, &frame, &payload) != 1) { |
| 2049 | goto done; |
| 2050 | } |
| 2051 | if (frame.type != CBM_DAEMON_FRAME_REQUEST || frame.flags != 0x1234 || |
| 2052 | frame.length != sizeof(expected_request) || !payload || |
| 2053 | memcmp(payload, expected_request, sizeof(expected_request)) != 0) { |
| 2054 | goto done; |
| 2055 | } |
| 2056 | if (!cbm_daemon_ipc_send_frame(connection, CBM_DAEMON_FRAME_RESPONSE, 0x00a5, response, |
| 2057 | (uint32_t)sizeof(response))) { |
| 2058 | goto done; |
| 2059 | } |
| 2060 | server->result = 0; |
| 2061 | |
| 2062 | done: |
| 2063 | free(payload); /* receive_frame returns a malloc-owned payload */ |
| 2064 | cbm_daemon_ipc_connection_close(connection); |
| 2065 | return NULL; |
| 2066 | } |
| 2067 | |
| 2068 | TEST(daemon_ipc_local_frame_roundtrip) { |
| 2069 | static const char key[] = "1111222233334444"; |
nothing calls this directly
no test coverage detected