[FFmpeg-devel] [PATCH 2/8] ffserver: Implement lua config file reader

Michael Niedermayer michael at niedermayer.cc
Sun May 20 23:07:09 EEST 2018


On Sun, May 20, 2018 at 08:53:58PM +0200, Stephan Holljes wrote:
> Signed-off-by: Stephan Holljes <klaxa1337 at googlemail.com>
> ---
>  configreader.c | 211 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++
>  configreader.h |  46 +++++++++++++
>  2 files changed, 257 insertions(+)
>  create mode 100644 configreader.c
>  create mode 100644 configreader.h
> 
> diff --git a/configreader.c b/configreader.c
> new file mode 100644
> index 0000000..84b27fa
> --- /dev/null
> +++ b/configreader.c
> @@ -0,0 +1,211 @@
[...]
> +int configs_read(struct HTTPDConfig **configs, const char *filename)
> +{
> +    int ret = 0;
> +    int nb_configs = 0;
> +    int nb_streams = 0;
> +    int nb_formats = 0;
> +    int i;
> +    int index = 0;
> +    const char *key, *error;
> +    struct HTTPDConfig *parsed_configs = NULL;
> +    struct HTTPDConfig *config;
> +    struct StreamConfig *stream;
> +    lua_State *L = luaL_newstate();
> +    ret = luaL_loadfile(L, filename);
> +    if (ret != 0) {
> +        fprintf(stderr, "Unable to open config file: %s\n", lua_tostring(L, -1));
> +        lua_close(L);
> +        return -1;
> +    }
> +    
> +    ret = lua_pcall(L, 0, 0, 0);
> +    
> +    if (ret != 0) {
> +        fprintf(stderr, "Unable to read config file: %s\n", lua_tostring(L, -1));
> +        lua_close(L);
> +        return -1;
> +    }
> +    lua_getglobal(L, "settings");
> +    if (lua_type(L, -1) != LUA_TTABLE) {
> +        lua_pushstring(L, "Error \"settings\" is not a table");
> +        goto fail;
> +    }
> +    lua_pushnil(L);
> +    
> +    // iterate servers
> +    while (lua_next(L, -2) != 0) {
> +        nb_configs++;

> +        parsed_configs = av_realloc(parsed_configs, nb_configs * sizeof(struct HTTPDConfig));
> +        config = &parsed_configs[nb_configs - 1];

Missing realloc failure handling


> +        config->server_name = NULL;
> +        config->bind_address = NULL;
> +        config->port = 0;
> +        config->accept_timeout = 1000;
> +        config->streams = NULL;
> +        config->nb_streams = 0;
> +        if (lua_type(L, -2) != LUA_TSTRING) {
> +            lua_pushstring(L, "Error server name is not a string.");
> +            goto fail;
> +        }
> +        if (lua_type(L, -1) != LUA_TTABLE) {
> +            lua_pushstring(L, "Error server settings is not a table.");
> +            goto fail;
> +        }

> +        config->server_name = av_strdup(lua_tostring(L, -2));

Missing alloc failure check, same with other similar allocation

[...]
> +fail:
> +    error = lua_tostring(L, -1);
> +    fprintf(stderr, "%s\n", error);
> +    lua_close(L);
> +    for (i = 0; i < nb_configs; i++)
> +        config_free(&parsed_configs[i]);
> +    av_free(parsed_configs);

> +    return -1;
> +}

We probably should use error codes (AVERROR*) from the begin.
Otherwise it would need a "2nd" pass one day to cleanup


> +
> diff --git a/configreader.h b/configreader.h
> new file mode 100644
> index 0000000..788ff60
> --- /dev/null
> +++ b/configreader.h
> @@ -0,0 +1,46 @@
> +/*
> + * This file is part of FFmpeg.
> + *
> + * FFmpeg is free software; you can redistribute it and/or
> + * modify it under the terms of the GNU Lesser General Public
> + * License as published by the Free Software Foundation; either
> + * version 2.1 of the License, or (at your option) any later version.
> + *
> + * FFmpeg is distributed in the hope that it will be useful,
> + * but WITHOUT ANY WARRANTY; without even the implied warranty of
> + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
> + * Lesser General Public License for more details.
> + *
> + * You should have received a copy of the GNU Lesser General Public
> + * License along with FFmpeg; if not, write to the Free Software
> + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
> + */
> +
> +#ifndef CONFIGREADER_H
> +#define CONFIGREADER_H
> +
> +#include "httpd.h"
> +
> +/**
> + * Read configurations from a file using the json format. The configurations
> + * are allocated as an array at *configs. This has to be freed by the user.
> + *
> + * @param configs pointer to a pointer where configurations will be allocated.
> + * @param filename filename of the configuration to use.
> + * @return number of configurations read, -1 on error.
> + */
> +int configs_read(struct HTTPDConfig **configs, const char *filename);
> +
> +/**
> + * Dump a configuration to stdout.
> + * @param config pointer to a configuration
> + */
> +void config_dump(struct HTTPDConfig *config);

it may be more flexible to add a argument that can point to stdout/stderr/file

[...]

-- 
Michael     GnuPG fingerprint: 9FF2128B147EF6730BADF133611EC787040B0FAB

If you drop bombs on a foreign country and kill a hundred thousand
innocent people, expect your government to call the consequence
"unprovoked inhuman terrorist attacks" and use it to justify dropping
more bombs and killing more people. The technology changed, the idea is old.
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 181 bytes
Desc: not available
URL: <http://ffmpeg.org/pipermail/ffmpeg-devel/attachments/20180520/a268a58a/attachment.sig>


More information about the ffmpeg-devel mailing list