diff --git a/daemon/call_interfaces.c b/daemon/call_interfaces.c index ea05c07f4..b86bcde88 100644 --- a/daemon/call_interfaces.c +++ b/daemon/call_interfaces.c @@ -1198,18 +1198,18 @@ static void ng_list_calls(ng_command_ctx_t *ctx, parser_arg output, long long in const char *call_query_ng(ng_command_ctx_t *ctx) { - str callid, fromtag, totag; call_t *call; parser_arg input = ctx->req; const ng_parser_t *parser = ctx->parser_ctx.parser; - if (!parser->dict_get_str(input, "call-id", &callid)) + str callid = parser->dict_get_str(input, "call-id"); + if (!callid.len) return "No call-id in message"; call = call_get(&callid); if (!call) return "Unknown call-id"; - parser->dict_get_str(input, "from-tag", &fromtag); - parser->dict_get_str(input, "to-tag", &totag); + str fromtag = parser->dict_get_str(input, "from-tag"); + str totag = parser->dict_get_str(input, "to-tag"); ng_call_stats(ctx, call, &fromtag, &totag, NULL); rwlock_unlock_w(&call->master_lock); @@ -1301,12 +1301,10 @@ static void stop_recording_fn(ng_command_ctx_t *ctx, call_t *call) { // support alternative usage for "pause" call: either `pause=yes` ... parser_arg input = ctx->req; const ng_parser_t *parser = ctx->parser_ctx.parser; - str pause; - if (parser->dict_get_str(input, "pause", &pause)) { - if (!str_cmp(&pause, "yes") || !str_cmp(&pause, "on") || !str_cmp(&pause, "true")) { - pause_recording_fn(ctx, call); - return; - } + str pause = parser->dict_get_str(input, "pause"); + if (!str_cmp(&pause, "yes") || !str_cmp(&pause, "on") || !str_cmp(&pause, "true")) { + pause_recording_fn(ctx, call); + return; } // ... or `flags=[pause]` parser_arg item = parser->dict_get_expect(input, "flags", BENCODE_LIST); diff --git a/daemon/cli.c b/daemon/cli.c index d261e871a..1f1363c0c 100644 --- a/daemon/cli.c +++ b/daemon/cli.c @@ -2133,8 +2133,8 @@ static size_t ng_printf(struct cli_writer *cw, const char *fmt, ...) { const char *cli_ng(ng_command_ctx_t *ctx) { __auto_type parser = ctx->parser_ctx.parser; - str body; - if (!parser->dict_get_str(ctx->req, "body", &body)) + str body = parser->dict_get_str(ctx->req, "body"); + if (!body.len) return "No 'body' in message"; g_autoptr(GString) response = g_string_new(""); diff --git a/daemon/codec.c b/daemon/codec.c index 41043d7be..e600c53cd 100644 --- a/daemon/codec.c +++ b/daemon/codec.c @@ -430,7 +430,7 @@ static void __transform_handler_destroy(struct transform_handler *tfh) { str result; __auto_type ret = ng_client_request(&tcc->transform, &STR_LEN(req->str, req->len), memory_arena); - if (!ret || !bencode_dictionary_get_str(ret, "result", &result) || str_cmp(&result, "ok")) + if (!ret || !(result = bencode_dictionary_get_str(ret, "result")).len || str_cmp(&result, "ok")) ilog(LOG_WARN, "Failed to delete remote 'transform' session"); } } @@ -708,19 +708,17 @@ static const char *__make_transform_handler(struct codec_handler *handler) { return "'transform' request to remote peer failed"; // process response - str result; - if (!bencode_dictionary_get_str(ret, "result", &result)) - return "'transform' response didn't contain 'result'"; + str result = bencode_dictionary_get_str(ret, "result"); if (str_cmp(&result, "ok")) return "'transform' response didn't indicate success"; - str s; - - if (!bencode_dictionary_get_str(ret, "call-id", &s)) + str s = bencode_dictionary_get_str(ret, "call-id"); + if (!s.len) return "'transform' response didn't contain 'call-id'"; tfh->call_id = call_str_cpy(&s); - if (!bencode_dictionary_get_str(ret, "from-tag", &s)) + s = bencode_dictionary_get_str(ret, "from-tag"); + if (!s.len) return "'transform' response didn't contain 'from-tag'"; tfh->tag = call_str_cpy(&s); @@ -734,13 +732,14 @@ static const char *__make_transform_handler(struct codec_handler *handler) { if (rm->type != BENCODE_DICTIONARY) return "incorrect type contained in 'media'"; - str family, address; int port = bencode_dictionary_get_integer(rm, "port", 0); if (port <= 0 || port > 65535) return "invalid port"; - if (!bencode_dictionary_get_str(rm, "family", &family)) + str family = bencode_dictionary_get_str(rm, "family"); + if (!family.len) return "'transform' response media didn't contain 'family'"; - if (!bencode_dictionary_get_str(rm, "address", &address)) + str address = bencode_dictionary_get_str(rm, "address"); + if (!address.len) return "'transform' response media didn't contain 'address'"; __auto_type fam = get_socket_family_rfc(&family); if (!fam) diff --git a/daemon/control_ng.c b/daemon/control_ng.c index eb466d852..917cbd362 100644 --- a/daemon/control_ng.c +++ b/daemon/control_ng.c @@ -220,7 +220,7 @@ static bool json_is_int(JsonNode *n) { } return false; } -static char *json_dict_get_str(JsonNode *dict, const char *entry, str *out) { +static str json_dict_get_str(JsonNode *dict, const char *entry) { JsonObject *o = json_node_get_object(dict); if (!o) goto out; @@ -230,11 +230,9 @@ static char *json_dict_get_str(JsonNode *dict, const char *entry, str *out) { const char *s = json_node_get_string(n); if (!s) goto out; - *out = STR(s); - return out->s; + return STR(s); out: - *out = STR_NULL; - return NULL; + return STR_NULL; } static void json_pretty_print(JsonNode *a, GString *out) { JsonGenerator *g = json_generator_new(); @@ -675,7 +673,7 @@ ng_buffer *ng_buffer_new(struct obj *ref) { static void control_ng_process_payload(ng_ctx *hctx, str *reply, str *data, const endpoint_t *sin, char *addr, struct obj *ref, struct ng_buffer **ngbufp) { - str cmd = STR_NULL, callid; + str cmd = STR_NULL; const char *errstr, *resultstr; GString *log_str; int64_t cmd_start, cmd_stop, cmd_process_time = {0}; @@ -723,12 +721,12 @@ static void control_ng_process_payload(ng_ctx *hctx, str *reply, str *data, cons command_ctx.resp = parser->dict(&command_ctx.parser_ctx); assert(command_ctx.resp.gen != NULL); - parser->dict_get_str(command_ctx.req, "command", &cmd); + cmd = parser->dict_get_str(command_ctx.req, "command"); errstr = "Dictionary contains no key \"command\""; if (!cmd.s) goto err_send; - parser->dict_get_str(command_ctx.req, "call-id", &callid); + str callid = parser->dict_get_str(command_ctx.req, "call-id"); log_info_str(&callid); ilogs(control, LOG_INFO, "Received command '"STR_FORMAT"' from %s", STR_FMT(&cmd), addr); diff --git a/include/control_ng.h b/include/control_ng.h index 90db3c057..3069b43a1 100644 --- a/include/control_ng.h +++ b/include/control_ng.h @@ -116,7 +116,7 @@ struct ng_parser { long long (*get_int)(parser_arg); bool (*is_dict)(parser_arg); parser_arg (*dict)(ng_parser_ctx_t *); - char *(*dict_get_str)(parser_arg, const char *, str *); + str (*dict_get_str)(parser_arg, const char *); long long (*dict_get_int_str)(parser_arg, const char *, long long def); parser_arg (*dict_get_expect)(parser_arg, const char *, bencode_type_t); bool (*dict_contains)(parser_arg, const char *); diff --git a/lib/bencode.h b/lib/bencode.h index b975b6a80..9bee7a1dd 100644 --- a/lib/bencode.h +++ b/lib/bencode.h @@ -309,9 +309,9 @@ bencode_item_t *bencode_dictionary_get_len(bencode_item_t *dict, const char *key * valid pointer. The returned string will be valid until dict's bencode_buffer_t object is destroyed. */ INLINE char *bencode_dictionary_get_string(bencode_item_t *dict, const char *key, size_t *len); -/* Identical to bencode_dictionary_get_string() but fills in a "str" struct. Returns str->s, which - * may be NULL. */ -INLINE char *bencode_dictionary_get_str(bencode_item_t *dict, const char *key, str *str); +/* Identical to bencode_dictionary_get_string() but returns in a "str" struct. + * Returns NULL str on error. */ +INLINE str bencode_dictionary_get_str(bencode_item_t *dict, const char *key); /* Looks up the given key in the dictionary and compares the corresponding value to the given * null-terminated string. Returns 2 if the key isn't found or if the value isn't a string, otherwise @@ -482,12 +482,12 @@ INLINE char *bencode_dictionary_get_string(bencode_item_t *dict, const char *key return val->iov[1].iov_base; } -INLINE char *bencode_dictionary_get_str(bencode_item_t *dict, const char *key, str *s) { - *s = STR_NULL; - s->s = bencode_dictionary_get_string(dict, key, &s->len); - if (!s->s) - s->len = 0; - return s->s; +INLINE str bencode_dictionary_get_str(bencode_item_t *dict, const char *key) { + str s = STR_NULL; + s.s = bencode_dictionary_get_string(dict, key, &s.len); + if (!s.s) + s.len = 0; + return s; } INLINE char *bencode_dictionary_get_string_dup(bencode_item_t *dict, const char *key, size_t *len) {