From: Andre Noll Date: Sun, 30 Nov 2008 16:41:50 +0000 (+0100) Subject: Make filter config parsers return int. X-Git-Tag: v0.3.4~100 X-Git-Url: http://git.tuebingen.mpg.de/?p=paraslash.git;a=commitdiff_plain;h=b779fcfc62bca2e728348c70bab3c50df3fe63b8;hp=5c575441c5ac69d3107d8032c1c1d2d7f5c72ee1 Make filter config parsers return int. This way, we can distinguish between syntax errors and invalid config values (failed sanity checks). --- diff --git a/amp_filter.c b/amp_filter.c index 750205ba..22784955 100644 --- a/amp_filter.c +++ b/amp_filter.c @@ -50,20 +50,23 @@ static void amp_close(struct filter_node *fn) free(fn->buf); } -static void *amp_parse_config(int argc, char **argv) +static int amp_parse_config(int argc, char **argv, void **config) { - struct amp_filter_args_info *conf = para_calloc(sizeof(*conf)); + struct amp_filter_args_info *amp_conf = para_calloc(sizeof(*amp_conf)); + int ret = -E_AMP_SYNTAX; - if (amp_cmdline_parser(argc, argv, conf)) + if (amp_cmdline_parser(argc, argv, amp_conf)) goto err; - if (conf->amp_arg < 0) + ret = -ERRNO_TO_PARA_ERROR(EINVAL); + if (amp_conf->amp_arg < 0) goto err; - PARA_NOTICE_LOG("amplification: %u (scaling factor: %1.2f)\n", conf->amp_arg, - conf->amp_arg / 64.0 + 1.0); - return conf; + PARA_NOTICE_LOG("amplification: %u (scaling factor: %1.2f)\n", + amp_conf->amp_arg, amp_conf->amp_arg / 64.0 + 1.0); + *config = amp_conf; + return 1; err: - free(conf); - return NULL; + free(amp_conf); + return ret; } static void amp_open(struct filter_node *fn) diff --git a/compress.c b/compress.c index c30c998a..22dcfd33 100644 --- a/compress.c +++ b/compress.c @@ -16,6 +16,7 @@ #include "sched.h" #include "filter.h" #include "string.h" +#include "error.h" /** The size of the output data buffer. */ #define COMPRESS_CHUNK_SIZE 40960 @@ -83,13 +84,21 @@ static void close_compress(struct filter_node *fn) free(fn->buf); } -static void *compress_parse_config(int argc, char **argv) +/** TODO: Add sanity checks */ +static int compress_parse_config(int argc, char **argv, void **config) { - struct compress_filter_args_info *ret = para_calloc(sizeof(struct compress_filter_args_info)); - if (!compress_cmdline_parser(argc, argv, ret)) - return ret; - free(ret); - return NULL; + int ret; + struct compress_filter_args_info *compress_conf + = para_calloc(sizeof(*compress_conf)); + + ret = -E_COMPRESS_SYNTAX; + if (compress_cmdline_parser(argc, argv, compress_conf)) + goto err; + *config = compress_conf; + return 1; +err: + free(compress_conf); + return ret; } static void open_compress(struct filter_node *fn) diff --git a/error.h b/error.h index f0a2510d..cacc83e9 100644 --- a/error.h +++ b/error.h @@ -14,7 +14,6 @@ DEFINE_ERRLIST_OBJECT_ENUM; /* these do not need error handling (yet) */ #define SERVER_ERRORS #define WAV_ERRORS -#define COMPRESS_ERRORS #define TIME_ERRORS #define CLOSE_ON_FORK_ERRORS #define DAEMON_ERRORS @@ -27,13 +26,20 @@ DEFINE_ERRLIST_OBJECT_ENUM; #define RECV_ERRORS #define STDOUT_ERRORS #define IPC_ERRORS -#define AMP_FILTER_ERRORS #define DCCP_SEND_ERRORS #define HTTP_SEND_ERRORS extern const char **para_errlist[]; +#define COMPRESS_ERRORS \ + PARA_ERROR(COMPRESS_SYNTAX, "syntax error in compress filter config"), \ + + +#define AMP_FILTER_ERRORS \ + PARA_ERROR(AMP_SYNTAX, "syntax error in amp filter config"), \ + + #define SEND_COMMON_ERRORS \ PARA_ERROR(MAX_CLIENTS, "maximal number of clients exceeded"), \ @@ -252,6 +258,7 @@ extern const char **para_errlist[]; PARA_ERROR(OGGDEC_BADHEADER, "invalid vorbis bitstream header"), \ PARA_ERROR(OGGDEC_FAULT, "bug or heap/stack corruption"), \ PARA_ERROR(OGGDEC_BADLINK, "invalid stream section or requested link corrupt"), \ + PARA_ERROR(OGGDEC_SYNTAX, "syntax error in oggdec config"), \ #define GRAB_CLIENT_ERRORS \ diff --git a/filter.h b/filter.h index 8c1c9e0d..2d1c150a 100644 --- a/filter.h +++ b/filter.h @@ -191,14 +191,16 @@ struct filter { /** * A pointer to the filter's command line parser. * - * If this optional function pointer is not NULL, any filter options are passed - * from the main program to this command line parser once at application - * startup. The command line parser should check its command line options given - * by \a argc and \a argv and abort on errors. On success, it should return a - * pointer to the filter-specific configuration data determined by \a argc and - * \a argv. + * If this optional function pointer is not NULL, any filter options + * are passed from the main program to this command line parser once at + * application startup. The command line parser should check its + * command line options given by \a argc and \a argv and abort on + * errors. Success must be indicated by a non-negative return value. In + * this case the function should return a pointer to the + * filter-specific configuration data determined by \a argc and \a + * argv. On failure, a negative paraslash error code must be returned. */ - void *(*parse_config)(int argc, char **argv); + int (*parse_config)(int argc, char **argv, void **config); }; void close_filters(struct filter_chain *fc); diff --git a/filter_chain.c b/filter_chain.c index fa8637ef..def0a813 100644 --- a/filter_chain.c +++ b/filter_chain.c @@ -198,7 +198,7 @@ void close_filters(struct filter_chain *fc) static int parse_filter_args(int filter_num, char *options, void **conf) { struct filter *f = &filters[filter_num]; - int i, argc = 2; + int ret, i, argc = 2; char **argv; // PARA_DEBUG_LOG("%s, options: %s, parser: %p\n", f->name, @@ -212,10 +212,10 @@ static int parse_filter_args(int filter_num, char *options, void **conf) argv[i + 1] = argv[i]; argv[0] = para_strdup(f->name); argc += 1; - *conf = f->parse_config(argc, argv); + ret = f->parse_config(argc, argv, conf); free(argv[0]); free(argv); - return *conf? filter_num : -E_BAD_FILTER_OPTIONS; + return ret < 0? ret : filter_num; } /** diff --git a/oggdec.c b/oggdec.c index e22ea1e4..46fb17ed 100644 --- a/oggdec.c +++ b/oggdec.c @@ -163,15 +163,16 @@ static ssize_t ogg_convert(char *inbuffer, size_t len, struct filter_node *fn) return pod->converted; } -static void *oggdec_parse_config(int argc, char **argv) +static int oggdec_parse_config(int argc, char **argv, void **config) { int ret; struct oggdec_filter_args_info *ogg_conf; ogg_conf = para_calloc(sizeof(*ogg_conf)); - ret = oggdec_cmdline_parser(argc, argv, ogg_conf); - if (ret) + ret = -E_OGGDEC_SYNTAX; + if (oggdec_cmdline_parser(argc, argv, ogg_conf)) goto err; + ret = -ERRNO_TO_PARA_ERROR(EINVAL); if (ogg_conf->bufsize_arg < 0) goto err; if (ogg_conf->bufsize_arg >= INT_MAX / 1024) @@ -180,10 +181,11 @@ static void *oggdec_parse_config(int argc, char **argv) goto err; if (ogg_conf->initial_buffer_arg >= INT_MAX / 1024) goto err; - return ogg_conf; + *config = ogg_conf; + return 1; err: free(ogg_conf); - return NULL; + return ret; } /**