]> code.delx.au - pulseaudio/blobdiff - polyp/cmdline.c
Make the whole stuff LGPL only
[pulseaudio] / polyp / cmdline.c
index 6538b93016005790520e066fd91b2d6eeb99c247..0c381f8c476955f0ceba84dee5ecb0b1d95fc54c 100644 (file)
@@ -4,7 +4,7 @@
   This file is part of polypaudio.
  
   polypaudio is free software; you can redistribute it and/or modify
-  it under the terms of the GNU General Public License as published
+  it under the terms of the GNU Lesser General Public License as published
   by the Free Software Foundation; either version 2 of the License,
   or (at your option) any later version.
  
@@ -13,7 +13,7 @@
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
   General Public License for more details.
  
-  You should have received a copy of the GNU General Public License
+  You should have received a copy of the GNU Lesser General Public License
   along with polypaudio; if not, write to the Free Software
   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
   USA.
 #include <stdlib.h>
 #include <stdio.h>
 #include <getopt.h>
+#include <sys/stat.h>
 
 #include "cmdline.h"
 #include "util.h"
 #include "strbuf.h"
 #include "xmalloc.h"
 
+enum {
+    ARG_HELP = 256,
+    ARG_VERSION,
+    ARG_DUMP_CONF,
+    ARG_DUMP_MODULES,
+    ARG_DAEMONIZE,
+    ARG_FAIL,
+    ARG_VERBOSE,
+    ARG_HIGH_PRIORITY,
+    ARG_DISALLOW_MODULE_LOADING,
+    ARG_EXIT_IDLE_TIME,
+    ARG_MODULE_IDLE_TIME,
+    ARG_SCACHE_IDLE_TIME,
+    ARG_LOG_TARGET,
+    ARG_LOAD,
+    ARG_FILE,
+    ARG_DL_SEARCH_PATH,
+    ARG_RESAMPLE_METHOD
+};
+
+static struct option long_options[] = {
+    {"help",                        0, 0, ARG_HELP},
+    {"version",                     0, 0, ARG_VERSION},
+    {"dump-conf",                   0, 0, ARG_DUMP_CONF},
+    {"dump-modules",                0, 0, ARG_DUMP_MODULES},
+    {"daemonize",                   2, 0, ARG_DAEMONIZE},
+    {"fail",                        2, 0, ARG_FAIL},
+    {"verbose",                     2, 0, ARG_VERBOSE},
+    {"high-priority",               2, 0, ARG_HIGH_PRIORITY},
+    {"disallow-module-loading",     2, 0, ARG_DISALLOW_MODULE_LOADING},
+    {"exit-idle-time",              2, 0, ARG_EXIT_IDLE_TIME},
+    {"module-idle-time",            2, 0, ARG_MODULE_IDLE_TIME},
+    {"scache-idle-time",            2, 0, ARG_SCACHE_IDLE_TIME},
+    {"log-target",                  1, 0, ARG_LOG_TARGET},
+    {"load",                        1, 0, ARG_LOAD},
+    {"file",                        1, 0, ARG_FILE},
+    {"dl-search-path",              1, 0, ARG_DL_SEARCH_PATH},
+    {"resample-method",             1, 0, ARG_RESAMPLE_METHOD},
+    {NULL, 0, 0, 0}
+};
+
 void pa_cmdline_help(const char *argv0) {
     const char *e;
 
@@ -42,68 +84,145 @@ void pa_cmdline_help(const char *argv0) {
     else
         e = argv0;
     
-    printf("%s [options]\n"
-           "  -r         Try to set high process priority (only available as root)\n"
-           "  -R         Don't drop root if SETUID root\n"
-           "  -L MODULE  Load the specified plugin module with the specified argument\n"
-           "  -F FILE    Run the specified script\n"
-           "  -C         Open a command line on the running TTY\n"
-           "  -n         Don't load configuration file ("PA_DEFAULT_CONFIG_FILE")\n"
-           "  -D         Daemonize after loading the modules\n"
-           "  -f         Dont quit when the startup fails\n"
-           "  -v         Verbose startup\n"
-           "  -h         Show this help\n"
-           "  -V         Show version\n", e);
+    printf("%s [options]\n\n"
+           "  -h, --help                            Show this help\n"
+           "      --version                         Show version\n"
+           "      --dump-conf                       Dump default configuration\n"
+           "      --dump-modules                    Dump list of available modules\n\n"
+
+           "  -D, --daemonize[=BOOL]                Daemonize after startup\n"
+           "      --fail[=BOOL]                     Quit when startup fails\n"
+           "      --verbose[=BOOL]                  Be slightly more verbose\n"
+           "      --high-priority[=BOOL]            Try to set high process priority (only available as root)\n"
+           "      --disallow-module-loading[=BOOL]  Disallow module loading after startup\n"
+           "      --exit-idle-time=SECS             Terminate the daemon when idle and this time passed\n"
+           "      --module-idle-time=SECS           Unload autoloaded modules when idle and this time passed\n"
+           "      --scache-idle-time=SECS           Unload autoloaded samples when idle and this time passed\n"
+           "      --log-target={auto,syslog,stderr} Specify the log target\n"
+           "  -p, --dl-search-path=PATH             Set the search path for dynamic shared objects (plugins)\n"
+           "      --resample-method=[METHOD]        Use the specified resampling method\n\n"
+           
+           "  -L, --load=\"MODULE ARGUMENTS\"         Load the specified plugin module with the specified argument\n"
+           "  -F, --file=FILENAME                   Run the specified script\n"
+           "  -C                                    Open a command line on the running TTY after startup\n\n"
+           
+           "  -n                                    Don't load default script file\n", e);
 }
 
-struct pa_cmdline* pa_cmdline_parse(int argc, char * const argv []) {
-    char c;
-    struct pa_cmdline *cmdline = NULL;
+int pa_cmdline_parse(struct pa_daemon_conf *conf, int argc, char *const argv [], int *d) {
     struct pa_strbuf *buf = NULL;
-    int no_default_config_file = 0;
-    assert(argc && argv);
-
-    cmdline = pa_xmalloc(sizeof(struct pa_cmdline));
-    cmdline->daemonize = cmdline->help = cmdline->verbose = cmdline->high_priority = cmdline->stay_root = cmdline->version = 0;
-    cmdline->fail = 1;
+    int c;
+    assert(conf && argc && argv);
 
     buf = pa_strbuf_new();
-    assert(buf);
+
+    if (conf->script_commands)
+        pa_strbuf_puts(buf, conf->script_commands);
     
-    while ((c = getopt(argc, argv, "L:F:CDhfvrRVn")) != -1) {
+    while ((c = getopt_long(argc, argv, "L:F:ChDnp:", long_options, NULL)) != -1) {
         switch (c) {
+            case ARG_HELP:
+            case 'h':
+                conf->cmd = PA_CMD_HELP;
+                break;
+
+            case ARG_VERSION:
+                conf->cmd = PA_CMD_VERSION;
+                break;
+
+            case ARG_DUMP_CONF:
+                conf->cmd = PA_CMD_DUMP_CONF;
+                break;
+
+            case ARG_DUMP_MODULES:
+                conf->cmd = PA_CMD_DUMP_MODULES;
+                break;
+                
+            case ARG_LOAD:
             case 'L':
-                pa_strbuf_printf(buf, "load %s\n", optarg);
+                pa_strbuf_printf(buf, "load-module %s\n", optarg);
                 break;
+                
+            case ARG_FILE:
             case 'F':
                 pa_strbuf_printf(buf, ".include %s\n", optarg);
                 break;
+                
             case 'C':
-                pa_strbuf_puts(buf, "load module-cli\n");
+                pa_strbuf_puts(buf, "load-module module-cli\n");
                 break;
+                
+            case ARG_DAEMONIZE:
             case 'D':
-                cmdline->daemonize = 1;
-                break;
-            case 'h':
-                cmdline->help = 1;
+                if ((conf->daemonize = optarg ? pa_parse_boolean(optarg) : 1) < 0) {
+                    pa_log(__FILE__": --daemonize expects boolean argument\n");
+                    goto fail;
+                }
                 break;
-            case 'f':
-                cmdline->fail = 0;
+
+            case ARG_FAIL:
+                if ((conf->fail = optarg ? pa_parse_boolean(optarg) : 1) < 0) {
+                    pa_log(__FILE__": --fail expects boolean argument\n");
+                    goto fail;
+                }
                 break;
-            case 'v':
-                cmdline->verbose = 1;
+
+            case ARG_VERBOSE:
+                if ((conf->verbose = optarg ? pa_parse_boolean(optarg) : 1) < 0) {
+                    pa_log(__FILE__": --verbose expects boolean argument\n");
+                    goto fail;
+                }
                 break;
-            case 'r':
-                cmdline->high_priority = 1;
+
+            case ARG_HIGH_PRIORITY:
+                if ((conf->high_priority = optarg ? pa_parse_boolean(optarg) : 1) < 0) {
+                    pa_log(__FILE__": --high-priority expects boolean argument\n");
+                    goto fail;
+                }
                 break;
-            case 'R':
-                cmdline->stay_root = 1;
+
+            case ARG_DISALLOW_MODULE_LOADING:
+                if ((conf->disallow_module_loading = optarg ? pa_parse_boolean(optarg) : 1) < 0) {
+                    pa_log(__FILE__": --disallow-module-loading expects boolean argument\n");
+                    goto fail;
+                }
                 break;
-            case 'V':
-                cmdline->version = 1;
+
+            case 'p':
+            case ARG_DL_SEARCH_PATH:
+                pa_xfree(conf->dl_search_path);
+                conf->dl_search_path = *optarg ? pa_xstrdup(optarg) : NULL;
                 break;
+                
             case 'n':
-                no_default_config_file =1;
+                pa_xfree(conf->default_script_file);
+                conf->default_script_file = NULL;
+                break;
+
+            case ARG_LOG_TARGET:
+                if (pa_daemon_conf_set_log_target(conf, optarg) < 0) {
+                    pa_log(__FILE__": Invalid log target: use either 'syslog', 'stderr' or 'auto'.\n");
+                    goto fail;
+                }
+                break;
+
+            case ARG_EXIT_IDLE_TIME:
+                conf->exit_idle_time = atoi(optarg);
+                break;
+
+            case ARG_MODULE_IDLE_TIME:
+                conf->module_idle_time = atoi(optarg);
+                break;
+
+            case ARG_SCACHE_IDLE_TIME:
+                conf->scache_idle_time = atoi(optarg);
+                break;
+
+            case ARG_RESAMPLE_METHOD:
+                if (pa_daemon_conf_set_resample_method(conf, optarg) < 0) {
+                    pa_log(__FILE__": Invalid resample method '%s'.\n", optarg);
+                    goto fail;
+                }
                 break;
                 
             default:
@@ -111,23 +230,21 @@ struct pa_cmdline* pa_cmdline_parse(int argc, char * const argv []) {
         }
     }
 
-    if (!no_default_config_file)
-        pa_strbuf_puts(buf, ".include "PA_DEFAULT_CONFIG_FILE"\n");
-    
+    pa_xfree(conf->script_commands);
+    conf->script_commands = pa_strbuf_tostring_free(buf);
+
+    if (!conf->script_commands) {
+        pa_xfree(conf->script_commands);
+        conf->script_commands = NULL;
+    }
 
-    cmdline->cli_commands = pa_strbuf_tostring_free(buf);
-    return cmdline;
+    *d = optind;
+    
+    return 0;
     
 fail:
-    if (cmdline)
-        pa_cmdline_free(cmdline);
     if (buf)
         pa_strbuf_free(buf);
-    return NULL;
-}
-
-void pa_cmdline_free(struct pa_cmdline *cmd) {
-    assert(cmd);
-    pa_xfree(cmd->cli_commands);
-    pa_xfree(cmd);
+    
+    return -1;
 }