Skip to content

Commit 0d0bdce

Browse files
committed
Share NetIPC C client SHM helpers
1 parent f5529bb commit 0d0bdce

5 files changed

Lines changed: 119 additions & 64 deletions

File tree

.agents/sow/current/SOW-0015-20260605-codacy-scope-and-maintainability.md

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -944,6 +944,36 @@ Validation for this increment:
944944
- `cmake --build build-msys --target test_win_service test_win_service_payload_limits test_win_service_extra`: passed.
945945
- `/usr/bin/ctest --output-on-failure -R '^(test_win_service|test_win_service_payload_limits|test_win_service_extra)$'`: 3/3 tests passed.
946946

947+
Fresh Netdata PR #22649 SonarCloud evidence after vendoring plugin-ipc commit `f5529bb`:
948+
949+
- SonarCloud analyzed Netdata PR head `882a44d1b6`.
950+
- SonarCloud new-code duplication improved from 666 lines / 3.768247142695485% to:
951+
- new duplicated line density: 3.1%.
952+
- The remaining Quality Gate failure is still `new_duplicated_lines_density > 3%`.
953+
- Top remaining low-risk production contributor pair:
954+
- `netipc_service_posix_client_call.c`: 32 duplicated lines.
955+
- `netipc_service_win_client_call.c`: 32 duplicated lines.
956+
957+
Implemented SDK follow-up:
958+
959+
- Added common C service helpers for:
960+
- preparing client SHM request frames from the reusable send buffer.
961+
- parsing client SHM response frames into header/payload views.
962+
- Updated POSIX and Windows client-call files to reuse those helpers while leaving UDS, Named Pipe, POSIX SHM send/receive, and Windows SHM send/receive calls platform-specific.
963+
- Preserved behavior:
964+
- overflow handling still grows learned request capacity through `nipc_service_common_client_note_request_capacity()`.
965+
- SHM message encoding still uses the same header fields and client send buffer.
966+
- platform-specific transport error mapping remains in platform files.
967+
968+
Validation for this increment:
969+
970+
- `git diff --check`: passed.
971+
- `cmake --build build`: passed.
972+
- `/usr/bin/ctest --test-dir build --output-on-failure`: 46/46 tests passed.
973+
- Win11 MSYS focused C service validation from a temporary copy:
974+
- `cmake --build build --target test_win_service test_win_service_payload_limits test_win_service_extra`: passed.
975+
- `/usr/bin/ctest --output-on-failure -R '^(test_win_service|test_win_service_payload_limits|test_win_service_extra)$'`: 3/3 tests passed.
976+
947977
## Validation
948978

949979
Acceptance criteria evidence:
@@ -984,6 +1014,9 @@ Tests or equivalent validation:
9841014
- `cmake --build build`: passed on 2026-06-08 after the C service duplication-reduction increment.
9851015
- `/usr/bin/ctest --test-dir build --output-on-failure`: 46/46 passed on 2026-06-08 after the C service duplication-reduction increment.
9861016
- Win11 MSYS focused C service validation: 3/3 passed on 2026-06-08 after the C service duplication-reduction increment.
1017+
- `cmake --build build`: passed on 2026-06-08 after the C client-call SHM helper increment.
1018+
- `/usr/bin/ctest --test-dir build --output-on-failure`: 46/46 passed on 2026-06-08 after the C client-call SHM helper increment.
1019+
- Win11 MSYS focused C service validation: 3/3 passed on 2026-06-08 after the C client-call SHM helper increment.
9871020

9881021
Real-use evidence:
9891022

src/libnetdata/netipc/src/service/netipc_service_common.c

Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -202,6 +202,65 @@ void nipc_service_common_client_note_response_capacity(nipc_client_ctx_t *ctx,
202202
ctx->transport_config.max_response_payload_bytes = grown;
203203
}
204204

205+
nipc_error_t nipc_service_common_client_prepare_shm_request(
206+
nipc_client_ctx_t *ctx,
207+
nipc_header_t *hdr,
208+
const void *payload,
209+
size_t payload_len,
210+
uint8_t **msg_out,
211+
size_t *msg_len_out)
212+
{
213+
if (payload_len > UINT32_MAX)
214+
return NIPC_ERR_OVERFLOW;
215+
216+
if (payload_len > ctx->session.max_request_payload_bytes) {
217+
nipc_service_common_client_note_request_capacity(
218+
ctx, (uint32_t)payload_len);
219+
return NIPC_ERR_OVERFLOW;
220+
}
221+
222+
size_t msg_len;
223+
if (!nipc_service_common_header_payload_len(payload_len, &msg_len))
224+
return NIPC_ERR_OVERFLOW;
225+
226+
uint8_t *msg = ctx->send_buf;
227+
if (!msg || msg_len > ctx->send_buf_size)
228+
return NIPC_ERR_OVERFLOW;
229+
230+
if (payload_len > 0)
231+
memmove(msg + NIPC_HEADER_LEN, payload, payload_len);
232+
233+
hdr->magic = NIPC_MAGIC_MSG;
234+
hdr->version = NIPC_VERSION;
235+
hdr->header_len = NIPC_HEADER_LEN;
236+
hdr->payload_len = (uint32_t)payload_len;
237+
238+
nipc_header_encode(hdr, msg, NIPC_HEADER_LEN);
239+
240+
*msg_out = msg;
241+
*msg_len_out = msg_len;
242+
return NIPC_OK;
243+
}
244+
245+
nipc_error_t nipc_service_common_client_parse_shm_response(
246+
void *buf,
247+
size_t msg_len,
248+
nipc_header_t *hdr_out,
249+
const void **payload_out,
250+
size_t *payload_len_out)
251+
{
252+
if (msg_len < NIPC_HEADER_LEN)
253+
return NIPC_ERR_TRUNCATED;
254+
255+
nipc_error_t perr = nipc_header_decode(buf, msg_len, hdr_out);
256+
if (perr != NIPC_OK)
257+
return perr;
258+
259+
*payload_out = (const uint8_t *)buf + NIPC_HEADER_LEN;
260+
*payload_len_out = msg_len - NIPC_HEADER_LEN;
261+
return NIPC_OK;
262+
}
263+
205264
nipc_error_t nipc_service_common_response_status_to_error(nipc_client_ctx_t *ctx,
206265
const nipc_header_t *resp_hdr)
207266
{

src/libnetdata/netipc/src/service/netipc_service_common.h

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -96,6 +96,19 @@ void nipc_service_common_client_note_request_capacity(nipc_client_ctx_t *ctx,
9696
uint32_t payload_len);
9797
void nipc_service_common_client_note_response_capacity(nipc_client_ctx_t *ctx,
9898
uint32_t payload_len);
99+
nipc_error_t nipc_service_common_client_prepare_shm_request(
100+
nipc_client_ctx_t *ctx,
101+
nipc_header_t *hdr,
102+
const void *payload,
103+
size_t payload_len,
104+
uint8_t **msg_out,
105+
size_t *msg_len_out);
106+
nipc_error_t nipc_service_common_client_parse_shm_response(
107+
void *buf,
108+
size_t msg_len,
109+
nipc_header_t *hdr_out,
110+
const void **payload_out,
111+
size_t *payload_len_out);
99112
nipc_error_t nipc_service_common_response_status_to_error(nipc_client_ctx_t *ctx,
100113
const nipc_header_t *resp_hdr);
101114
nipc_error_t nipc_service_common_do_raw_call(

src/libnetdata/netipc/src/service/netipc_service_posix_client_call.c

Lines changed: 7 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -31,29 +31,12 @@ static nipc_error_t transport_send(nipc_client_ctx_t *ctx,
3131
return NIPC_ERR_OVERFLOW;
3232

3333
if (ctx->shm) {
34-
if (payload_len > ctx->session.max_request_payload_bytes) {
35-
nipc_service_common_client_note_request_capacity(
36-
ctx, (uint32_t)payload_len);
37-
return NIPC_ERR_OVERFLOW;
38-
}
39-
34+
uint8_t *msg;
4035
size_t msg_len;
41-
if (!nipc_service_common_header_payload_len(payload_len, &msg_len))
42-
return NIPC_ERR_OVERFLOW;
43-
44-
uint8_t *msg = ctx->send_buf;
45-
if (!msg || msg_len > ctx->send_buf_size)
46-
return NIPC_ERR_OVERFLOW;
47-
48-
if (payload_len > 0)
49-
memmove(msg + NIPC_HEADER_LEN, payload, payload_len);
50-
51-
hdr->magic = NIPC_MAGIC_MSG;
52-
hdr->version = NIPC_VERSION;
53-
hdr->header_len = NIPC_HEADER_LEN;
54-
hdr->payload_len = (uint32_t)payload_len;
55-
56-
nipc_header_encode(hdr, msg, NIPC_HEADER_LEN);
36+
nipc_error_t perr = nipc_service_common_client_prepare_shm_request(
37+
ctx, hdr, payload, payload_len, &msg, &msg_len);
38+
if (perr != NIPC_OK)
39+
return perr;
5740

5841
nipc_shm_error_t serr = nipc_shm_send(ctx->shm, msg, msg_len);
5942
if (serr == NIPC_SHM_ERR_MSG_TOO_LARGE) {
@@ -95,16 +78,8 @@ static nipc_error_t transport_receive(nipc_client_ctx_t *ctx,
9578
if (serr != NIPC_SHM_OK)
9679
return NIPC_ERR_TRUNCATED;
9780

98-
if (msg_len < NIPC_HEADER_LEN)
99-
return NIPC_ERR_TRUNCATED;
100-
101-
nipc_error_t perr = nipc_header_decode(buf, msg_len, hdr_out);
102-
if (perr != NIPC_OK)
103-
return perr;
104-
105-
*payload_out = (const uint8_t *)buf + NIPC_HEADER_LEN;
106-
*payload_len_out = msg_len - NIPC_HEADER_LEN;
107-
return NIPC_OK;
81+
return nipc_service_common_client_parse_shm_response(
82+
buf, msg_len, hdr_out, payload_out, payload_len_out);
10883
}
10984

11085
/* UDS path */

src/libnetdata/netipc/src/service/netipc_service_win_client_call.c

Lines changed: 7 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -30,29 +30,12 @@ static nipc_error_t transport_send(nipc_client_ctx_t *ctx,
3030
return NIPC_ERR_OVERFLOW;
3131

3232
if (ctx->shm) {
33-
if (payload_len > ctx->session.max_request_payload_bytes) {
34-
nipc_service_common_client_note_request_capacity(
35-
ctx, (uint32_t)payload_len);
36-
return NIPC_ERR_OVERFLOW;
37-
}
38-
33+
uint8_t *msg;
3934
size_t msg_len;
40-
if (!nipc_service_common_header_payload_len(payload_len, &msg_len))
41-
return NIPC_ERR_OVERFLOW;
42-
43-
uint8_t *msg = ctx->send_buf;
44-
if (!msg || msg_len > ctx->send_buf_size)
45-
return NIPC_ERR_OVERFLOW;
46-
47-
if (payload_len > 0)
48-
memmove(msg + NIPC_HEADER_LEN, payload, payload_len);
49-
50-
hdr->magic = NIPC_MAGIC_MSG;
51-
hdr->version = NIPC_VERSION;
52-
hdr->header_len = NIPC_HEADER_LEN;
53-
hdr->payload_len = (uint32_t)payload_len;
54-
55-
nipc_header_encode(hdr, msg, NIPC_HEADER_LEN);
35+
nipc_error_t perr = nipc_service_common_client_prepare_shm_request(
36+
ctx, hdr, payload, payload_len, &msg, &msg_len);
37+
if (perr != NIPC_OK)
38+
return perr;
5639

5740
nipc_win_shm_error_t serr = nipc_win_shm_send(ctx->shm, msg, msg_len);
5841
if (serr == NIPC_WIN_SHM_ERR_MSG_TOO_LARGE) {
@@ -87,16 +70,8 @@ static nipc_error_t transport_receive(nipc_client_ctx_t *ctx,
8770
if (serr != NIPC_WIN_SHM_OK)
8871
return NIPC_ERR_TRUNCATED;
8972

90-
if (msg_len < NIPC_HEADER_LEN)
91-
return NIPC_ERR_TRUNCATED;
92-
93-
nipc_error_t perr = nipc_header_decode(buf, msg_len, hdr_out);
94-
if (perr != NIPC_OK)
95-
return perr;
96-
97-
*payload_out = (const uint8_t *)buf + NIPC_HEADER_LEN;
98-
*payload_len_out = msg_len - NIPC_HEADER_LEN;
99-
return NIPC_OK;
73+
return nipc_service_common_client_parse_shm_response(
74+
buf, msg_len, hdr_out, payload_out, payload_len_out);
10075
}
10176

10277
/* Named Pipe path */

0 commit comments

Comments
 (0)