From 416f658088311bda3e98f833dcb87854710630b8 Mon Sep 17 00:00:00 2001 From: Richard Fuchs Date: Mon, 29 Jul 2024 10:55:41 -0400 Subject: [PATCH] MT#55283 introduce parser_arg union Generic "item" object to represent some entity within a signalling message Change-Id: Ie1a7f2acaf954b86597ac32af3f0546d68f9e687 --- daemon/call_interfaces.c | 18 ++++++++--------- daemon/control_ng.c | 22 ++++++++++----------- daemon/statistics.c | 12 ++++++------ include/control_ng.h | 42 ++++++++++++++++++++-------------------- include/recording.h | 2 +- include/types.h | 7 +++++++ 6 files changed, 55 insertions(+), 48 deletions(-) diff --git a/daemon/call_interfaces.c b/daemon/call_interfaces.c index 4da60ebfd..023ec464c 100644 --- a/daemon/call_interfaces.c +++ b/daemon/call_interfaces.c @@ -2121,7 +2121,7 @@ static const char *call_offer_answer_ng(ng_parser_ctx_t *ctx, enum call_opmode o struct call_monologue * monologues[2]; int ret; g_auto(sdp_ng_flags) flags; - bencode_item_t *output = ctx->resp; + parser_arg output = ctx->resp; call_ng_process_flags(&flags, ctx, opmode); @@ -2289,8 +2289,8 @@ const char *call_delete_ng(ng_parser_ctx_t *ctx) { bool fatal = false; bool discard = false; int delete_delay; - bencode_item_t *input = ctx->req; - bencode_item_t *output = ctx->resp; + parser_arg input = ctx->req; + parser_arg output = ctx->resp; if (!ctx->parser->dict_get_str(input, "call-id", &callid)) return "No call-id in message"; @@ -2761,7 +2761,7 @@ static void ng_list_calls(bencode_item_t *output, long long int limit) { const char *call_query_ng(ng_parser_ctx_t *ctx) { str callid, fromtag, totag; call_t *call; - bencode_item_t *input = ctx->req; + parser_arg input = ctx->req; if (!ctx->parser->dict_get_str(input, "call-id", &callid)) return "No call-id in message"; @@ -2782,8 +2782,8 @@ const char *call_query_ng(ng_parser_ctx_t *ctx) { const char *call_list_ng(ng_parser_ctx_t *ctx) { bencode_item_t *calls = NULL; long long int limit; - bencode_item_t *input = ctx->req; - bencode_item_t *output = ctx->resp; + parser_arg input = ctx->req; + parser_arg output = ctx->resp; limit = ctx->parser->dict_get_int_str(input, "limit", 32); @@ -2804,7 +2804,7 @@ static const char *call_recording_common_ng(ng_parser_ctx_t *ctx, { g_auto(sdp_ng_flags) flags; g_autoptr(call_t) call = NULL; - bencode_item_t *input = ctx->req; + parser_arg input = ctx->req; call_ng_process_flags(&flags, ctx, opmode); @@ -2854,7 +2854,7 @@ const char *call_pause_recording_ng(ng_parser_ctx_t *ctx) { static void stop_recording_fn(ng_parser_ctx_t *ctx, call_t *call) { // support alternative usage for "pause" call: either `pause=yes` ... - bencode_item_t *input = ctx->req; + parser_arg input = ctx->req; str pause; if (ctx->parser->dict_get_str(input, "pause", &pause)) { if (!str_cmp(&pause, "yes") || !str_cmp(&pause, "on") || !str_cmp(&pause, "true")) { @@ -3697,7 +3697,7 @@ const char *call_subscribe_request_ng(ng_parser_ctx_t *ctx) { g_autoptr(call_t) call = NULL; g_auto(subscription_q) srms = TYPED_GQUEUE_INIT; g_auto(str) sdp_out = STR_NULL; - bencode_item_t *output = ctx->resp; + parser_arg output = ctx->resp; /* get source monologue */ err = media_block_match_mult(&call, &srms, &flags, ctx, OP_REQUEST); diff --git a/daemon/control_ng.c b/daemon/control_ng.c index a0fdb12a9..c2e4040d9 100644 --- a/daemon/control_ng.c +++ b/daemon/control_ng.c @@ -130,11 +130,11 @@ static void bencode_list_iter(ng_parser_ctx_t *ctx, bencode_item_t *list, static long long bencode_get_int(bencode_item_t *arg) { return arg->value; } -static bencode_item_t *__bencode_dict(ng_parser_ctx_t *ctx) { - return bencode_dictionary(&ctx->ngbuf->buffer); +static parser_arg __bencode_dict(ng_parser_ctx_t *ctx) { + return (parser_arg) bencode_dictionary(&ctx->ngbuf->buffer); } -static bencode_item_t *__bencode_list(ng_parser_ctx_t *ctx) { - return bencode_list(&ctx->ngbuf->buffer); +static parser_arg __bencode_list(ng_parser_ctx_t *ctx) { + return (parser_arg) bencode_list(&ctx->ngbuf->buffer); } static void bencode_pretty_print(bencode_item_t *el, GString *s); @@ -359,9 +359,9 @@ static void control_ng_process_payload(ng_ctx *hctx, str *reply, str *data, cons /* Bencode dictionary */ if (data->s[0] == 'd') { - parser_ctx.req = bencode_decode_expect_str(&parser_ctx.ngbuf->buffer, data, BENCODE_DICTIONARY); + parser_ctx.req.benc = bencode_decode_expect_str(&parser_ctx.ngbuf->buffer, data, BENCODE_DICTIONARY); errstr = "Could not decode bencode dictionary"; - if (!parser_ctx.req) + if (!parser_ctx.req.benc) goto err_send; } @@ -372,9 +372,9 @@ static void control_ng_process_payload(ng_ctx *hctx, str *reply, str *data, cons errstr = "Failed to parse JSON document"; if (!json_parser_load_from_data(parser_ctx.ngbuf->json, data->s, data->len, NULL)) goto err_send; - parser_ctx.req = bencode_convert_json(&parser_ctx.ngbuf->buffer, parser_ctx.ngbuf->json); + parser_ctx.req.benc = bencode_convert_json(&parser_ctx.ngbuf->buffer, parser_ctx.ngbuf->json); errstr = "Could not decode bencode dictionary"; - if (!parser_ctx.req || parser_ctx.req->type != BENCODE_DICTIONARY) + if (!parser_ctx.req.benc || parser_ctx.req.benc->type != BENCODE_DICTIONARY) goto err_send; } @@ -384,7 +384,7 @@ static void control_ng_process_payload(ng_ctx *hctx, str *reply, str *data, cons } parser_ctx.resp = parser_ctx.parser->dict(&parser_ctx); - assert(parser_ctx.resp != NULL); + assert(parser_ctx.resp.gen != NULL); parser_ctx.parser->dict_get_str(parser_ctx.req, "command", &cmd); errstr = "Dictionary contains no key \"command\""; @@ -565,9 +565,9 @@ send_resp: ilogs(control, LOG_INFO, "Replying to '"STR_FORMAT"' from %s (elapsed time %llu.%06llu sec)", STR_FMT(&cmd), addr, (unsigned long long)cmd_process_time.tv_sec, (unsigned long long)cmd_process_time.tv_usec); if (get_log_level(control) >= LOG_DEBUG) { - parser_ctx.req = bencode_decode_expect_str(&parser_ctx.ngbuf->buffer, + parser_ctx.req.benc = bencode_decode_expect_str(&parser_ctx.ngbuf->buffer, reply, BENCODE_DICTIONARY); - if (parser_ctx.req) { + if (parser_ctx.req.benc) { log_str = g_string_sized_new(256); g_string_append_printf(log_str, "Response dump for '"STR_FORMAT"' to %s: %s", STR_FMT(&cmd), addr, diff --git a/daemon/statistics.c b/daemon/statistics.c index e3f9d61a9..045846c5c 100644 --- a/daemon/statistics.c +++ b/daemon/statistics.c @@ -956,7 +956,7 @@ const char *statistics_ng(ng_parser_ctx_t *ctx) { g_autoptr(stats_metric_q) metrics = statistics_gather_metrics(NULL); g_auto(GQueue) bstack = G_QUEUE_INIT; - bencode_item_t *dict = ctx->resp; + parser_arg dict = ctx->resp; const char *sub_label = "statistics"; // top level bencode_buffer_t *buf = &ctx->ngbuf->buffer; @@ -981,8 +981,8 @@ const char *statistics_ng(ng_parser_ctx_t *ctx) { // list or dict end? if (m->is_close_bracket) { - dict = g_queue_pop_tail(&bstack); - assert(dict != NULL); + dict.gen = g_queue_pop_tail(&bstack); + assert(dict.gen != NULL); continue; } @@ -994,13 +994,13 @@ const char *statistics_ng(ng_parser_ctx_t *ctx) { } // open bracket of some sort - new sub-entry follows - bencode_item_t *sub = NULL; + parser_arg sub = {0}; if (m->is_brace) sub = ctx->parser->dict(ctx); else sub = ctx->parser->list(ctx); - assert(sub != NULL); + assert(sub.gen != NULL); // is this a dictionary? if (ctx->parser->is_dict(dict)) { @@ -1013,7 +1013,7 @@ const char *statistics_ng(ng_parser_ctx_t *ctx) { abort(); sub_label = NULL; - g_queue_push_tail(&bstack, dict); + g_queue_push_tail(&bstack, dict.gen); dict = sub; } diff --git a/include/control_ng.h b/include/control_ng.h index aa7a35989..a4e47c1a0 100644 --- a/include/control_ng.h +++ b/include/control_ng.h @@ -112,11 +112,11 @@ typedef union { } helper_arg __attribute__ ((__transparent_union__)); struct ng_parser { - str *(*collapse)(bencode_item_t *root, str *out); - bool (*dict_iter)(ng_parser_ctx_t *, bencode_item_t *, - void (*callback)(ng_parser_ctx_t *, str *, bencode_item_t *, helper_arg), + str *(*collapse)(parser_arg, str *out); + bool (*dict_iter)(ng_parser_ctx_t *, parser_arg, + void (*callback)(ng_parser_ctx_t *, str *, parser_arg, helper_arg), helper_arg); - bool (*is_list)(bencode_item_t *); + bool (*is_list)(parser_arg); void (*list_iter)(ng_parser_ctx_t *, bencode_item_t *input, void (*str_callback)(ng_parser_ctx_t *, str *key, helper_arg), void (*item_callback)(ng_parser_ctx_t *, bencode_item_t *, helper_arg), @@ -126,29 +126,29 @@ struct ng_parser { long long (*get_int_str)(bencode_item_t *, long long def); bool (*is_int)(bencode_item_t *); long long (*get_int)(bencode_item_t *); - bool (*is_dict)(bencode_item_t *); - bencode_item_t *(*dict)(ng_parser_ctx_t *); - char *(*dict_get_str)(bencode_item_t *, const char *, str *); - long long (*dict_get_int_str)(bencode_item_t *, const char *, long long def); - bencode_item_t *(*dict_get_expect)(bencode_item_t *, const char *, bencode_type_t); - bencode_item_t *(*dict_add)(bencode_item_t *, const char *, bencode_item_t *); - void (*dict_add_string)(bencode_item_t *, const char *, const char *); - void (*dict_add_str)(bencode_item_t *, const char *, const str *); - void (*dict_add_str_dup)(bencode_item_t *, const char *, const str *); - void (*dict_add_int)(bencode_item_t *, const char *, long long); - bencode_item_t *(*dict_add_dict)(bencode_item_t *, const char *); - bencode_item_t *(*dict_add_list)(bencode_item_t *, const char *); - bencode_item_t *(*list)(ng_parser_ctx_t *); - bencode_item_t *(*list_add)(bencode_item_t *, bencode_item_t *); + bool (*is_dict)(parser_arg); + parser_arg (*dict)(ng_parser_ctx_t *); + char *(*dict_get_str)(parser_arg, const char *, str *); + long long (*dict_get_int_str)(parser_arg, const char *, long long def); + bencode_item_t *(*dict_get_expect)(parser_arg, const char *, bencode_type_t); + bencode_item_t *(*dict_add)(parser_arg, const char *, parser_arg); + void (*dict_add_string)(parser_arg, const char *, const char *); + void (*dict_add_str)(parser_arg, const char *, const str *); + void (*dict_add_str_dup)(parser_arg, const char *, const str *); + void (*dict_add_int)(parser_arg, const char *, long long); + bencode_item_t *(*dict_add_dict)(parser_arg, const char *); + bencode_item_t *(*dict_add_list)(parser_arg, const char *); + parser_arg (*list)(ng_parser_ctx_t *); + bencode_item_t *(*list_add)(parser_arg, parser_arg); bencode_item_t *(*list_add_dict)(bencode_item_t *); void (*list_add_string)(bencode_item_t *, const char *); - void (*pretty_print)(bencode_item_t *, GString *); + void (*pretty_print)(parser_arg, GString *); }; struct ng_parser_ctx { const ng_parser_t *parser; struct ng_buffer *ngbuf; - bencode_item_t *req; - bencode_item_t *resp; + parser_arg req; + parser_arg resp; sdp_ng_flags *flags; enum call_opmode opmode; }; diff --git a/include/recording.h b/include/recording.h index fa09d03ff..ad6a234e6 100644 --- a/include/recording.h +++ b/include/recording.h @@ -70,7 +70,7 @@ struct recording_method { void (*dump_packet)(struct media_packet *, const str *s); void (*finish)(call_t *, bool discard); - void (*response)(struct recording *, const ng_parser_t *, bencode_item_t *); + void (*response)(struct recording *, const ng_parser_t *, parser_arg); void (*init_stream_struct)(struct packet_stream *); void (*setup_stream)(struct packet_stream *); diff --git a/include/types.h b/include/types.h index c588c1356..fb262e2cc 100644 --- a/include/types.h +++ b/include/types.h @@ -39,6 +39,13 @@ typedef void sdp_attr_print_f(GString *, union sdp_attr_print_arg, const sdp_ng_ typedef struct ng_parser ng_parser_t; typedef struct ng_parser_ctx ng_parser_ctx_t; +typedef struct bencode_item bencode_item_t; + +typedef union { + bencode_item_t *benc; + void *gen; +} parser_arg __attribute__ ((__transparent_union__)); + #include "containers.h" struct sdp_session;