diff options
author | Lennart Poettering <lennart@poettering.net> | 2004-07-12 21:28:11 +0000 |
---|---|---|
committer | Lennart Poettering <lennart@poettering.net> | 2004-07-12 21:28:11 +0000 |
commit | b69178b067d4151de08bdcdaa9922d2838134c3c (patch) | |
tree | e588ed124761545f3b88bc1b3e52abf36f49a9d7 /src/cmdline.c | |
parent | d4e0d51c157dea740d35089f077451b6ec7b11a5 (diff) |
add preliminary command line parsing
git-svn-id: file:///home/lennart/svn/public/pulseaudio/trunk@64 fefdeb5f-60dc-0310-8127-8f9354f1896f
Diffstat (limited to 'src/cmdline.c')
-rw-r--r-- | src/cmdline.c | 102 |
1 files changed, 102 insertions, 0 deletions
diff --git a/src/cmdline.c b/src/cmdline.c new file mode 100644 index 00000000..36fe3e61 --- /dev/null +++ b/src/cmdline.c @@ -0,0 +1,102 @@ +#include <string.h> +#include <assert.h> +#include <stdlib.h> +#include <stdio.h> +#include <getopt.h> + +#include "cmdline.h" +#include "util.h" + +void pa_cmdline_help(const char *argv0) { + const char *e; + + if ((e = strrchr(argv0, '/'))) + e++; + else + e = argv0; + + printf("%s [options]\n" + " -L MODULE Load the specified plugin module with the specified argument\n" + " -F FILE A shortcut for '-L module-cli file=FILE', i.e. run the specified script after startup\n" + " -C A shortcut for '-L module-cli', i.e. open a command line on the running TTY\n" + " -D Daemonize after loading the modules\n" + " -h Show this help\n", e); +} + +static void add_module(struct pa_cmdline *cmdline, char *name, char *arguments) { + struct pa_cmdline_module *m; + assert(cmdline && name); + + m = malloc(sizeof(struct pa_cmdline_module)); + assert(m); + m->name = name; + m->arguments = name; + m->next = NULL; + + if (cmdline->last_module) + cmdline->last_module->next = m; + else { + assert(!cmdline->first_module); + cmdline->first_module = m; + } + cmdline->last_module = m; +} + +struct pa_cmdline* pa_cmdline_parse(int argc, char * const argv []) { + char c; + struct pa_cmdline *cmdline = NULL; + assert(argc && argv); + + cmdline = malloc(sizeof(struct pa_cmdline)); + assert(cmdline); + cmdline->daemonize = cmdline->help = 0; + cmdline->first_module = cmdline->last_module = NULL; + + while ((c = getopt(argc, argv, "L:F:CDh")) != -1) { + switch (c) { + case 'L': { + char *space; + if ((space = strchr(optarg, ' '))) + add_module(cmdline, strndup(optarg, space-optarg), space+1); + else + add_module(cmdline, strdup(optarg), NULL); + break; + } + case 'F': + add_module(cmdline, strdup("module-cli"), pa_sprintf_malloc("file='%s'", optarg)); + break; + case 'C': + add_module(cmdline, strdup("module-cli"), NULL); + break; + case 'D': + cmdline->daemonize = 1; + break; + case 'h': + cmdline->help = 1; + break; + default: + goto fail; + } + } + + return cmdline; + +fail: + if (cmdline) + pa_cmdline_free(cmdline); + return NULL; +} + +void pa_cmdline_free(struct pa_cmdline *cmd) { + struct pa_cmdline_module *m; + assert(cmd); + + while ((m = cmd->first_module)) { + cmd->first_module = m->next; + free(m->name); + free(m->arguments); + free(m); + } + + free(cmd); +} |