From 6201554ba12cf445dd19e6a3353a59fe0853f215 Mon Sep 17 00:00:00 2001 From: Maxim Devaev Date: Wed, 12 Oct 2022 20:00:37 +0300 Subject: [PATCH] instance id --- src/ustreamer/http/server.c | 3 +++ src/ustreamer/http/server.h | 1 + src/ustreamer/options.c | 24 ++++++++++++++++++++++++ 3 files changed, 28 insertions(+) diff --git a/src/ustreamer/http/server.c b/src/ustreamer/http/server.c index c5e6cb8..31ba9f3 100644 --- a/src/ustreamer/http/server.c +++ b/src/ustreamer/http/server.c @@ -75,6 +75,7 @@ us_server_s *us_server_init(us_stream_s *stream) { server->passwd = ""; server->static_path = ""; server->allow_origin = ""; + server->instance_id = ""; server->timeout = 10; server->run = run; @@ -400,7 +401,9 @@ static void _http_callback_state(struct evhttp_request *request, void *v_server) _A_EVBUFFER_ADD_PRINTF(buf, "{\"ok\": true, \"result\": {" + " \"instance_id\": \"%s\"," " \"encoder\": {\"type\": \"%s\", \"quality\": %u},", + server->instance_id, us_encoder_type_to_string(enc_type), enc_quality ); diff --git a/src/ustreamer/http/server.h b/src/ustreamer/http/server.h index 2f5809f..f067154 100644 --- a/src/ustreamer/http/server.h +++ b/src/ustreamer/http/server.h @@ -149,6 +149,7 @@ typedef struct us_server_sx { char *passwd; char *static_path; char *allow_origin; + char *instance_id; unsigned drop_same_frames; unsigned fake_width; diff --git a/src/ustreamer/options.c b/src/ustreamer/options.c index 57c0aee..85b4225 100644 --- a/src/ustreamer/options.c +++ b/src/ustreamer/options.c @@ -82,6 +82,7 @@ enum _US_OPT_VALUES { _O_PASSWD, _O_STATIC, _O_ALLOW_ORIGIN, + _O_INSTANCE_ID, _O_TCP_NODELAY, _O_SERVER_TIMEOUT, @@ -177,6 +178,7 @@ static const struct option _LONG_OPTS[] = { {"static", required_argument, NULL, _O_STATIC}, {"drop-same-frames", required_argument, NULL, _O_DROP_SAME_FRAMES}, {"allow-origin", required_argument, NULL, _O_ALLOW_ORIGIN}, + {"instance-id", required_argument, NULL, _O_INSTANCE_ID}, {"fake-resolution", required_argument, NULL, _O_FAKE_RESOLUTION}, {"tcp-nodelay", no_argument, NULL, _O_TCP_NODELAY}, {"server-timeout", required_argument, NULL, _O_SERVER_TIMEOUT}, @@ -228,6 +230,7 @@ static const struct option _LONG_OPTS[] = { static int _parse_resolution(const char *str, unsigned *width, unsigned *height, bool limited); +static int _check_instance_id(const char *str); static void _features(void); static void _help(FILE *fp, us_device_s *dev, us_encoder_s *enc, us_stream_s *stream, us_server_s *server); @@ -419,6 +422,13 @@ int options_parse(us_options_s *options, us_device_s *dev, us_encoder_s *enc, us case _O_DROP_SAME_FRAMES: OPT_NUMBER("--drop-same-frames", server->drop_same_frames, 0, US_VIDEO_MAX_FPS, 0); case _O_FAKE_RESOLUTION: OPT_RESOLUTION("--fake-resolution", server->fake_width, server->fake_height, false); case _O_ALLOW_ORIGIN: OPT_SET(server->allow_origin, optarg); + case _O_INSTANCE_ID: + if (_check_instance_id(optarg) != 0) { + printf("Invalid instance ID, it should be like: ^[a-zA-Z0-9\\./+_-]*$\n"); + return -1; + } + server->instance_id = optarg; + break; case _O_TCP_NODELAY: OPT_SET(server->tcp_nodelay, true); case _O_SERVER_TIMEOUT: OPT_NUMBER("--server-timeout", server->timeout, 1, 60, 0); @@ -530,6 +540,18 @@ static int _parse_resolution(const char *str, unsigned *width, unsigned *height, return 0; } +static int _check_instance_id(const char *str) { + for (const char *ptr = str; *ptr; ++ptr) { + if (!(isascii(*ptr) && ( + isalpha(*ptr) || isdigit(*ptr) + || *ptr == '.' || *ptr == '/' || *ptr == '+' || *ptr == '_' || *ptr == '-' + ))) { + return -1; + } + } + return 0; +} + static void _features(void) { # ifdef WITH_GPIO puts("+ WITH_GPIO"); @@ -657,6 +679,8 @@ static void _help(FILE *fp, us_device_s *dev, us_encoder_s *enc, us_stream_s *st SAY(" --tcp-nodelay ────────────── Set TCP_NODELAY flag to the client /stream socket. Only for TCP socket."); SAY(" Default: disabled.\n"); SAY(" --allow-origin ─────── Set Access-Control-Allow-Origin header. Default: disabled.\n"); + SAY(" --instance-id ──────── A short string identifier to be displayed in the /state handle."); + SAY(" It must satisfy regexp ^[a-zA-Z0-9\\./+_-]*$. Default: an empty string.\n"); SAY(" --server-timeout ───── Timeout for client connections. Default: %u.\n", server->timeout); # define ADD_SINK(x_name, x_opt) \ SAY(x_name " sink options:"); \