diff options
author | Jaroslav Kysela <perex@perex.cz> | 2010-10-08 22:23:05 +0200 |
---|---|---|
committer | Jaroslav Kysela <perex@perex.cz> | 2010-10-08 22:23:05 +0200 |
commit | e77983d3c55a7822e2151dfd60d9a20ec2023c9f (patch) | |
tree | 3c10aa663682c4883cd18dc4177a1ac4d13fd26c /alsaloop/alsaloop.c | |
parent | 147a1cc75cf6002eb5ea2983a374d2e84eee8e1d (diff) | |
download | alsa-utils-e77983d3c55a7822e2151dfd60d9a20ec2023c9f.tar.gz |
alsaloop: Fix command-line parsing and pollfd initialization
Signed-off-by: Jaroslav Kysela <perex@perex.cz>
Diffstat (limited to 'alsaloop/alsaloop.c')
-rw-r--r-- | alsaloop/alsaloop.c | 28 |
1 files changed, 20 insertions, 8 deletions
diff --git a/alsaloop/alsaloop.c b/alsaloop/alsaloop.c index effa073..97b00d5 100644 --- a/alsaloop/alsaloop.c +++ b/alsaloop/alsaloop.c @@ -47,6 +47,8 @@ int daemonize = 0; int use_syslog = 0; struct loopback **loopbacks = NULL; int loopbacks_count = 0; +char **my_argv = NULL; +int my_argc = 0; static void my_exit(struct loopback_thread *thread, int exitcode) { @@ -575,9 +577,6 @@ static int parse_config_file(const char *file, snd_output_t *output) int argc, c, err = 0; char **argv; - argv = malloc(sizeof(char *) * MAX_ARGS); - if (argv == NULL) - return -ENOMEM; fp = fopen(file, "r"); if (fp == NULL) { logit(LOG_CRIT, "Unable to open file '%s': %s\n", file, strerror(errno)); @@ -587,8 +586,13 @@ static int parse_config_file(const char *file, snd_output_t *output) if (fgets(line, sizeof(line)-1, fp) == NULL) break; line[sizeof(line)-1] = '\0'; + my_argv = realloc(my_argv, my_argc + MAX_ARGS * sizeof(char *)); + if (my_argv == NULL) + return -ENOMEM; + argv = my_argv + my_argc; argc = 0; argv[argc++] = strdup("<prog>"); + my_argc++; str = line; while (*str) { ptr = word; @@ -607,25 +611,30 @@ static int parse_config_file(const char *file, snd_output_t *output) *ptr++ = *str++; } if (ptr != word) { + if (*(ptr-1) == '\n') + ptr--; *ptr = '\0'; + if (argc >= MAX_ARGS) { + logit(LOG_CRIT, "Too many arguments."); + goto __error; + } argv[argc++] = strdup(word); + my_argc++; } } /* erase runtime variables for getopt */ optarg = NULL; optind = opterr = 1; - optopt = 63; + optopt = '?'; err = parse_config(argc, argv, output); __next: - while (argc > 0) - free(argv[--argc]); if (err < 0) break; err = 0; } + __error: fclose(fp); - free(argv); return err; } @@ -656,7 +665,7 @@ static void thread_job1(void *_data) pfds_count += thread->loopbacks[i]->pollfd_count; } pfds = calloc(pfds_count, sizeof(struct pollfd)); - if (pfds == NULL) { + if (pfds == NULL || pfds_count <= 0) { logit(LOG_CRIT, "Poll FDs allocation failed.\n"); my_exit(thread, EXIT_FAILURE); } @@ -723,6 +732,9 @@ int main(int argc, char *argv[]) logit(LOG_CRIT, "Unable to parse arguments or configuration...\n"); exit(EXIT_FAILURE); } + while (my_argc > 0) + free(my_argv[--my_argc]); + free(my_argv); if (loopbacks_count <= 0) { logit(LOG_CRIT, "No loopback defined...\n"); |