153a5a1b3Sopenharmony_ci/*** 253a5a1b3Sopenharmony_ci This file is part of PulseAudio. 353a5a1b3Sopenharmony_ci 453a5a1b3Sopenharmony_ci Copyright 2004-2006 Lennart Poettering 553a5a1b3Sopenharmony_ci 653a5a1b3Sopenharmony_ci PulseAudio is free software; you can redistribute it and/or modify 753a5a1b3Sopenharmony_ci it under the terms of the GNU Lesser General Public License as published 853a5a1b3Sopenharmony_ci by the Free Software Foundation; either version 2.1 of the License, 953a5a1b3Sopenharmony_ci or (at your option) any later version. 1053a5a1b3Sopenharmony_ci 1153a5a1b3Sopenharmony_ci PulseAudio is distributed in the hope that it will be useful, but 1253a5a1b3Sopenharmony_ci WITHOUT ANY WARRANTY; without even the implied warranty of 1353a5a1b3Sopenharmony_ci MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 1453a5a1b3Sopenharmony_ci General Public License for more details. 1553a5a1b3Sopenharmony_ci 1653a5a1b3Sopenharmony_ci You should have received a copy of the GNU Lesser General Public License 1753a5a1b3Sopenharmony_ci along with PulseAudio; if not, see <http://www.gnu.org/licenses/>. 1853a5a1b3Sopenharmony_ci***/ 1953a5a1b3Sopenharmony_ci 2053a5a1b3Sopenharmony_ci#ifdef HAVE_CONFIG_H 2153a5a1b3Sopenharmony_ci#include <config.h> 2253a5a1b3Sopenharmony_ci#endif 2353a5a1b3Sopenharmony_ci 2453a5a1b3Sopenharmony_ci#include <stdlib.h> 2553a5a1b3Sopenharmony_ci#include <stdio.h> 2653a5a1b3Sopenharmony_ci#include <getopt.h> 2753a5a1b3Sopenharmony_ci 2853a5a1b3Sopenharmony_ci#include <pulse/xmalloc.h> 2953a5a1b3Sopenharmony_ci#include <pulse/util.h> 3053a5a1b3Sopenharmony_ci 3153a5a1b3Sopenharmony_ci#include <pulsecore/core-util.h> 3253a5a1b3Sopenharmony_ci#include <pulsecore/i18n.h> 3353a5a1b3Sopenharmony_ci#include <pulsecore/strbuf.h> 3453a5a1b3Sopenharmony_ci#include <pulsecore/macro.h> 3553a5a1b3Sopenharmony_ci 3653a5a1b3Sopenharmony_ci#include "cmdline.h" 3753a5a1b3Sopenharmony_ci 3853a5a1b3Sopenharmony_ci/* Argument codes for getopt_long() */ 3953a5a1b3Sopenharmony_cienum { 4053a5a1b3Sopenharmony_ci ARG_HELP = 256, 4153a5a1b3Sopenharmony_ci ARG_VERSION, 4253a5a1b3Sopenharmony_ci ARG_DUMP_CONF, 4353a5a1b3Sopenharmony_ci ARG_DUMP_MODULES, 4453a5a1b3Sopenharmony_ci ARG_DAEMONIZE, 4553a5a1b3Sopenharmony_ci ARG_FAIL, 4653a5a1b3Sopenharmony_ci ARG_LOG_LEVEL, 4753a5a1b3Sopenharmony_ci ARG_HIGH_PRIORITY, 4853a5a1b3Sopenharmony_ci ARG_REALTIME, 4953a5a1b3Sopenharmony_ci ARG_DISALLOW_MODULE_LOADING, 5053a5a1b3Sopenharmony_ci ARG_DISALLOW_EXIT, 5153a5a1b3Sopenharmony_ci ARG_EXIT_IDLE_TIME, 5253a5a1b3Sopenharmony_ci ARG_SCACHE_IDLE_TIME, 5353a5a1b3Sopenharmony_ci ARG_LOG_TARGET, 5453a5a1b3Sopenharmony_ci ARG_LOG_META, 5553a5a1b3Sopenharmony_ci ARG_LOG_TIME, 5653a5a1b3Sopenharmony_ci ARG_LOG_BACKTRACE, 5753a5a1b3Sopenharmony_ci ARG_LOAD, 5853a5a1b3Sopenharmony_ci ARG_FILE, 5953a5a1b3Sopenharmony_ci ARG_DL_SEARCH_PATH, 6053a5a1b3Sopenharmony_ci ARG_RESAMPLE_METHOD, 6153a5a1b3Sopenharmony_ci ARG_KILL, 6253a5a1b3Sopenharmony_ci ARG_USE_PID_FILE, 6353a5a1b3Sopenharmony_ci ARG_CHECK, 6453a5a1b3Sopenharmony_ci ARG_NO_CPU_LIMIT, 6553a5a1b3Sopenharmony_ci ARG_DISABLE_SHM, 6653a5a1b3Sopenharmony_ci ARG_ENABLE_MEMFD, 6753a5a1b3Sopenharmony_ci ARG_DUMP_RESAMPLE_METHODS, 6853a5a1b3Sopenharmony_ci ARG_SYSTEM, 6953a5a1b3Sopenharmony_ci ARG_CLEANUP_SHM, 7053a5a1b3Sopenharmony_ci ARG_START 7153a5a1b3Sopenharmony_ci}; 7253a5a1b3Sopenharmony_ci 7353a5a1b3Sopenharmony_ci/* Table for getopt_long() */ 7453a5a1b3Sopenharmony_cistatic const struct option long_options[] = { 7553a5a1b3Sopenharmony_ci {"help", 0, 0, ARG_HELP}, 7653a5a1b3Sopenharmony_ci {"version", 0, 0, ARG_VERSION}, 7753a5a1b3Sopenharmony_ci {"dump-conf", 0, 0, ARG_DUMP_CONF}, 7853a5a1b3Sopenharmony_ci {"dump-modules", 0, 0, ARG_DUMP_MODULES}, 7953a5a1b3Sopenharmony_ci {"daemonize", 2, 0, ARG_DAEMONIZE}, 8053a5a1b3Sopenharmony_ci {"fail", 2, 0, ARG_FAIL}, 8153a5a1b3Sopenharmony_ci {"verbose", 2, 0, ARG_LOG_LEVEL}, 8253a5a1b3Sopenharmony_ci {"log-level", 2, 0, ARG_LOG_LEVEL}, 8353a5a1b3Sopenharmony_ci {"high-priority", 2, 0, ARG_HIGH_PRIORITY}, 8453a5a1b3Sopenharmony_ci {"realtime", 2, 0, ARG_REALTIME}, 8553a5a1b3Sopenharmony_ci {"disallow-module-loading", 2, 0, ARG_DISALLOW_MODULE_LOADING}, 8653a5a1b3Sopenharmony_ci {"disallow-exit", 2, 0, ARG_DISALLOW_EXIT}, 8753a5a1b3Sopenharmony_ci {"exit-idle-time", 1, 0, ARG_EXIT_IDLE_TIME}, 8853a5a1b3Sopenharmony_ci {"scache-idle-time", 1, 0, ARG_SCACHE_IDLE_TIME}, 8953a5a1b3Sopenharmony_ci {"log-target", 1, 0, ARG_LOG_TARGET}, 9053a5a1b3Sopenharmony_ci {"log-meta", 2, 0, ARG_LOG_META}, 9153a5a1b3Sopenharmony_ci {"log-time", 2, 0, ARG_LOG_TIME}, 9253a5a1b3Sopenharmony_ci {"log-backtrace", 1, 0, ARG_LOG_BACKTRACE}, 9353a5a1b3Sopenharmony_ci {"load", 1, 0, ARG_LOAD}, 9453a5a1b3Sopenharmony_ci {"file", 1, 0, ARG_FILE}, 9553a5a1b3Sopenharmony_ci {"dl-search-path", 1, 0, ARG_DL_SEARCH_PATH}, 9653a5a1b3Sopenharmony_ci {"resample-method", 1, 0, ARG_RESAMPLE_METHOD}, 9753a5a1b3Sopenharmony_ci {"kill", 0, 0, ARG_KILL}, 9853a5a1b3Sopenharmony_ci {"start", 0, 0, ARG_START}, 9953a5a1b3Sopenharmony_ci {"use-pid-file", 2, 0, ARG_USE_PID_FILE}, 10053a5a1b3Sopenharmony_ci {"check", 0, 0, ARG_CHECK}, 10153a5a1b3Sopenharmony_ci {"system", 2, 0, ARG_SYSTEM}, 10253a5a1b3Sopenharmony_ci {"no-cpu-limit", 2, 0, ARG_NO_CPU_LIMIT}, 10353a5a1b3Sopenharmony_ci {"disable-shm", 2, 0, ARG_DISABLE_SHM}, 10453a5a1b3Sopenharmony_ci {"enable-memfd", 2, 0, ARG_ENABLE_MEMFD}, 10553a5a1b3Sopenharmony_ci {"dump-resample-methods", 2, 0, ARG_DUMP_RESAMPLE_METHODS}, 10653a5a1b3Sopenharmony_ci {"cleanup-shm", 2, 0, ARG_CLEANUP_SHM}, 10753a5a1b3Sopenharmony_ci {NULL, 0, 0, 0} 10853a5a1b3Sopenharmony_ci}; 10953a5a1b3Sopenharmony_ci 11053a5a1b3Sopenharmony_civoid pa_cmdline_help(const char *argv0) { 11153a5a1b3Sopenharmony_ci pa_assert(argv0); 11253a5a1b3Sopenharmony_ci 11353a5a1b3Sopenharmony_ci printf(_("%s [options]\n\n" 11453a5a1b3Sopenharmony_ci "COMMANDS:\n" 11553a5a1b3Sopenharmony_ci " -h, --help Show this help\n" 11653a5a1b3Sopenharmony_ci " --version Show version\n" 11753a5a1b3Sopenharmony_ci " --dump-conf Dump default configuration\n" 11853a5a1b3Sopenharmony_ci " --dump-modules Dump list of available modules\n" 11953a5a1b3Sopenharmony_ci " --dump-resample-methods Dump available resample methods\n" 12053a5a1b3Sopenharmony_ci " --cleanup-shm Cleanup stale shared memory segments\n" 12153a5a1b3Sopenharmony_ci " --start Start the daemon if it is not running\n" 12253a5a1b3Sopenharmony_ci " -k --kill Kill a running daemon\n" 12353a5a1b3Sopenharmony_ci " --check Check for a running daemon (only returns exit code)\n\n" 12453a5a1b3Sopenharmony_ci 12553a5a1b3Sopenharmony_ci "OPTIONS:\n" 12653a5a1b3Sopenharmony_ci " --system[=BOOL] Run as system-wide instance\n" 12753a5a1b3Sopenharmony_ci " -D, --daemonize[=BOOL] Daemonize after startup\n" 12853a5a1b3Sopenharmony_ci " --fail[=BOOL] Quit when startup fails\n" 12953a5a1b3Sopenharmony_ci " --high-priority[=BOOL] Try to set high nice level\n" 13053a5a1b3Sopenharmony_ci " (only available as root, when SUID or\n" 13153a5a1b3Sopenharmony_ci " with elevated RLIMIT_NICE)\n" 13253a5a1b3Sopenharmony_ci " --realtime[=BOOL] Try to enable realtime scheduling\n" 13353a5a1b3Sopenharmony_ci " (only available as root, when SUID or\n" 13453a5a1b3Sopenharmony_ci " with elevated RLIMIT_RTPRIO)\n" 13553a5a1b3Sopenharmony_ci " --disallow-module-loading[=BOOL] Disallow user requested module\n" 13653a5a1b3Sopenharmony_ci " loading/unloading after startup\n" 13753a5a1b3Sopenharmony_ci " --disallow-exit[=BOOL] Disallow user requested exit\n" 13853a5a1b3Sopenharmony_ci " --exit-idle-time=SECS Terminate the daemon when idle and this\n" 13953a5a1b3Sopenharmony_ci " time passed\n" 14053a5a1b3Sopenharmony_ci " --scache-idle-time=SECS Unload autoloaded samples when idle and\n" 14153a5a1b3Sopenharmony_ci " this time passed\n" 14253a5a1b3Sopenharmony_ci " --log-level[=LEVEL] Increase or set verbosity level\n" 14353a5a1b3Sopenharmony_ci " -v --verbose Increase the verbosity level\n" 14453a5a1b3Sopenharmony_ci " --log-target={auto,syslog,stderr,file:PATH,newfile:PATH}\n" 14553a5a1b3Sopenharmony_ci " Specify the log target\n" 14653a5a1b3Sopenharmony_ci " --log-meta[=BOOL] Include code location in log messages\n" 14753a5a1b3Sopenharmony_ci " --log-time[=BOOL] Include timestamps in log messages\n" 14853a5a1b3Sopenharmony_ci " --log-backtrace=FRAMES Include a backtrace in log messages\n" 14953a5a1b3Sopenharmony_ci " -p, --dl-search-path=PATH Set the search path for dynamic shared\n" 15053a5a1b3Sopenharmony_ci " objects (plugins)\n" 15153a5a1b3Sopenharmony_ci " --resample-method=METHOD Use the specified resampling method\n" 15253a5a1b3Sopenharmony_ci " (See --dump-resample-methods for\n" 15353a5a1b3Sopenharmony_ci " possible values)\n" 15453a5a1b3Sopenharmony_ci " --use-pid-file[=BOOL] Create a PID file\n" 15553a5a1b3Sopenharmony_ci " --no-cpu-limit[=BOOL] Do not install CPU load limiter on\n" 15653a5a1b3Sopenharmony_ci " platforms that support it.\n" 15753a5a1b3Sopenharmony_ci " --disable-shm[=BOOL] Disable shared memory support.\n" 15853a5a1b3Sopenharmony_ci " --enable-memfd[=BOOL] Enable memfd shared memory support.\n\n" 15953a5a1b3Sopenharmony_ci 16053a5a1b3Sopenharmony_ci "STARTUP SCRIPT:\n" 16153a5a1b3Sopenharmony_ci " -L, --load=\"MODULE ARGUMENTS\" Load the specified plugin module with\n" 16253a5a1b3Sopenharmony_ci " the specified argument\n" 16353a5a1b3Sopenharmony_ci " -F, --file=FILENAME Run the specified script\n" 16453a5a1b3Sopenharmony_ci " -C Open a command line on the running TTY\n" 16553a5a1b3Sopenharmony_ci " after startup\n\n" 16653a5a1b3Sopenharmony_ci 16753a5a1b3Sopenharmony_ci " -n Don't load default script file\n"), 16853a5a1b3Sopenharmony_ci pa_path_get_filename(argv0)); 16953a5a1b3Sopenharmony_ci} 17053a5a1b3Sopenharmony_ci 17153a5a1b3Sopenharmony_ciint pa_cmdline_parse(pa_daemon_conf *conf, int argc, char *const argv [], int *d) { 17253a5a1b3Sopenharmony_ci pa_strbuf *buf = NULL; 17353a5a1b3Sopenharmony_ci int c; 17453a5a1b3Sopenharmony_ci int b; 17553a5a1b3Sopenharmony_ci 17653a5a1b3Sopenharmony_ci pa_assert(conf); 17753a5a1b3Sopenharmony_ci pa_assert(argc > 0); 17853a5a1b3Sopenharmony_ci pa_assert(argv); 17953a5a1b3Sopenharmony_ci 18053a5a1b3Sopenharmony_ci buf = pa_strbuf_new(); 18153a5a1b3Sopenharmony_ci 18253a5a1b3Sopenharmony_ci if (conf->script_commands) 18353a5a1b3Sopenharmony_ci pa_strbuf_puts(buf, conf->script_commands); 18453a5a1b3Sopenharmony_ci 18553a5a1b3Sopenharmony_ci while ((c = getopt_long(argc, argv, "L:F:ChDnp:kv", long_options, NULL)) != -1) { 18653a5a1b3Sopenharmony_ci switch (c) { 18753a5a1b3Sopenharmony_ci case ARG_HELP: 18853a5a1b3Sopenharmony_ci case 'h': 18953a5a1b3Sopenharmony_ci conf->cmd = PA_CMD_HELP; 19053a5a1b3Sopenharmony_ci break; 19153a5a1b3Sopenharmony_ci 19253a5a1b3Sopenharmony_ci case ARG_VERSION: 19353a5a1b3Sopenharmony_ci conf->cmd = PA_CMD_VERSION; 19453a5a1b3Sopenharmony_ci break; 19553a5a1b3Sopenharmony_ci 19653a5a1b3Sopenharmony_ci case ARG_DUMP_CONF: 19753a5a1b3Sopenharmony_ci conf->cmd = PA_CMD_DUMP_CONF; 19853a5a1b3Sopenharmony_ci break; 19953a5a1b3Sopenharmony_ci 20053a5a1b3Sopenharmony_ci case ARG_DUMP_MODULES: 20153a5a1b3Sopenharmony_ci conf->cmd = PA_CMD_DUMP_MODULES; 20253a5a1b3Sopenharmony_ci break; 20353a5a1b3Sopenharmony_ci 20453a5a1b3Sopenharmony_ci case ARG_DUMP_RESAMPLE_METHODS: 20553a5a1b3Sopenharmony_ci conf->cmd = PA_CMD_DUMP_RESAMPLE_METHODS; 20653a5a1b3Sopenharmony_ci break; 20753a5a1b3Sopenharmony_ci 20853a5a1b3Sopenharmony_ci case ARG_CLEANUP_SHM: 20953a5a1b3Sopenharmony_ci conf->cmd = PA_CMD_CLEANUP_SHM; 21053a5a1b3Sopenharmony_ci break; 21153a5a1b3Sopenharmony_ci 21253a5a1b3Sopenharmony_ci case 'k': 21353a5a1b3Sopenharmony_ci case ARG_KILL: 21453a5a1b3Sopenharmony_ci conf->cmd = PA_CMD_KILL; 21553a5a1b3Sopenharmony_ci break; 21653a5a1b3Sopenharmony_ci 21753a5a1b3Sopenharmony_ci case ARG_START: 21853a5a1b3Sopenharmony_ci conf->cmd = PA_CMD_START; 21953a5a1b3Sopenharmony_ci conf->daemonize = true; 22053a5a1b3Sopenharmony_ci break; 22153a5a1b3Sopenharmony_ci 22253a5a1b3Sopenharmony_ci case ARG_CHECK: 22353a5a1b3Sopenharmony_ci conf->cmd = PA_CMD_CHECK; 22453a5a1b3Sopenharmony_ci break; 22553a5a1b3Sopenharmony_ci 22653a5a1b3Sopenharmony_ci case ARG_LOAD: 22753a5a1b3Sopenharmony_ci case 'L': 22853a5a1b3Sopenharmony_ci pa_strbuf_printf(buf, "load-module %s\n", optarg); 22953a5a1b3Sopenharmony_ci break; 23053a5a1b3Sopenharmony_ci 23153a5a1b3Sopenharmony_ci case ARG_FILE: 23253a5a1b3Sopenharmony_ci case 'F': { 23353a5a1b3Sopenharmony_ci char *p; 23453a5a1b3Sopenharmony_ci pa_strbuf_printf(buf, ".include %s\n", p = pa_make_path_absolute(optarg)); 23553a5a1b3Sopenharmony_ci pa_xfree(p); 23653a5a1b3Sopenharmony_ci break; 23753a5a1b3Sopenharmony_ci } 23853a5a1b3Sopenharmony_ci 23953a5a1b3Sopenharmony_ci case 'C': 24053a5a1b3Sopenharmony_ci pa_strbuf_puts(buf, "load-module module-cli exit_on_eof=1\n"); 24153a5a1b3Sopenharmony_ci break; 24253a5a1b3Sopenharmony_ci 24353a5a1b3Sopenharmony_ci case ARG_DAEMONIZE: 24453a5a1b3Sopenharmony_ci case 'D': 24553a5a1b3Sopenharmony_ci if ((b = optarg ? pa_parse_boolean(optarg) : 1) < 0) { 24653a5a1b3Sopenharmony_ci pa_log(_("--daemonize expects boolean argument")); 24753a5a1b3Sopenharmony_ci goto fail; 24853a5a1b3Sopenharmony_ci } 24953a5a1b3Sopenharmony_ci conf->daemonize = !!b; 25053a5a1b3Sopenharmony_ci break; 25153a5a1b3Sopenharmony_ci 25253a5a1b3Sopenharmony_ci case ARG_FAIL: 25353a5a1b3Sopenharmony_ci if ((b = optarg ? pa_parse_boolean(optarg) : 1) < 0) { 25453a5a1b3Sopenharmony_ci pa_log(_("--fail expects boolean argument")); 25553a5a1b3Sopenharmony_ci goto fail; 25653a5a1b3Sopenharmony_ci } 25753a5a1b3Sopenharmony_ci conf->fail = !!b; 25853a5a1b3Sopenharmony_ci break; 25953a5a1b3Sopenharmony_ci 26053a5a1b3Sopenharmony_ci case 'v': 26153a5a1b3Sopenharmony_ci case ARG_LOG_LEVEL: 26253a5a1b3Sopenharmony_ci 26353a5a1b3Sopenharmony_ci if (optarg) { 26453a5a1b3Sopenharmony_ci if (pa_daemon_conf_set_log_level(conf, optarg) < 0) { 26553a5a1b3Sopenharmony_ci pa_log(_("--log-level expects log level argument (either numeric in range 0..4 or one of error, warn, notice, info, debug).")); 26653a5a1b3Sopenharmony_ci goto fail; 26753a5a1b3Sopenharmony_ci } 26853a5a1b3Sopenharmony_ci } else { 26953a5a1b3Sopenharmony_ci if (conf->log_level < PA_LOG_LEVEL_MAX-1) 27053a5a1b3Sopenharmony_ci conf->log_level++; 27153a5a1b3Sopenharmony_ci } 27253a5a1b3Sopenharmony_ci 27353a5a1b3Sopenharmony_ci break; 27453a5a1b3Sopenharmony_ci 27553a5a1b3Sopenharmony_ci case ARG_HIGH_PRIORITY: 27653a5a1b3Sopenharmony_ci if ((b = optarg ? pa_parse_boolean(optarg) : 1) < 0) { 27753a5a1b3Sopenharmony_ci pa_log(_("--high-priority expects boolean argument")); 27853a5a1b3Sopenharmony_ci goto fail; 27953a5a1b3Sopenharmony_ci } 28053a5a1b3Sopenharmony_ci conf->high_priority = !!b; 28153a5a1b3Sopenharmony_ci break; 28253a5a1b3Sopenharmony_ci 28353a5a1b3Sopenharmony_ci case ARG_REALTIME: 28453a5a1b3Sopenharmony_ci if ((b = optarg ? pa_parse_boolean(optarg) : 1) < 0) { 28553a5a1b3Sopenharmony_ci pa_log(_("--realtime expects boolean argument")); 28653a5a1b3Sopenharmony_ci goto fail; 28753a5a1b3Sopenharmony_ci } 28853a5a1b3Sopenharmony_ci conf->realtime_scheduling = !!b; 28953a5a1b3Sopenharmony_ci break; 29053a5a1b3Sopenharmony_ci 29153a5a1b3Sopenharmony_ci case ARG_DISALLOW_MODULE_LOADING: 29253a5a1b3Sopenharmony_ci if ((b = optarg ? pa_parse_boolean(optarg) : 1) < 0) { 29353a5a1b3Sopenharmony_ci pa_log(_("--disallow-module-loading expects boolean argument")); 29453a5a1b3Sopenharmony_ci goto fail; 29553a5a1b3Sopenharmony_ci } 29653a5a1b3Sopenharmony_ci conf->disallow_module_loading = !!b; 29753a5a1b3Sopenharmony_ci break; 29853a5a1b3Sopenharmony_ci 29953a5a1b3Sopenharmony_ci case ARG_DISALLOW_EXIT: 30053a5a1b3Sopenharmony_ci if ((b = optarg ? pa_parse_boolean(optarg) : 1) < 0) { 30153a5a1b3Sopenharmony_ci pa_log(_("--disallow-exit expects boolean argument")); 30253a5a1b3Sopenharmony_ci goto fail; 30353a5a1b3Sopenharmony_ci } 30453a5a1b3Sopenharmony_ci conf->disallow_exit = !!b; 30553a5a1b3Sopenharmony_ci break; 30653a5a1b3Sopenharmony_ci 30753a5a1b3Sopenharmony_ci case ARG_USE_PID_FILE: 30853a5a1b3Sopenharmony_ci if ((b = optarg ? pa_parse_boolean(optarg) : 1) < 0) { 30953a5a1b3Sopenharmony_ci pa_log(_("--use-pid-file expects boolean argument")); 31053a5a1b3Sopenharmony_ci goto fail; 31153a5a1b3Sopenharmony_ci } 31253a5a1b3Sopenharmony_ci conf->use_pid_file = !!b; 31353a5a1b3Sopenharmony_ci break; 31453a5a1b3Sopenharmony_ci 31553a5a1b3Sopenharmony_ci case 'p': 31653a5a1b3Sopenharmony_ci case ARG_DL_SEARCH_PATH: 31753a5a1b3Sopenharmony_ci pa_xfree(conf->dl_search_path); 31853a5a1b3Sopenharmony_ci conf->dl_search_path = pa_xstrdup(optarg); 31953a5a1b3Sopenharmony_ci break; 32053a5a1b3Sopenharmony_ci 32153a5a1b3Sopenharmony_ci case 'n': 32253a5a1b3Sopenharmony_ci conf->load_default_script_file = false; 32353a5a1b3Sopenharmony_ci break; 32453a5a1b3Sopenharmony_ci 32553a5a1b3Sopenharmony_ci case ARG_LOG_TARGET: 32653a5a1b3Sopenharmony_ci if (pa_daemon_conf_set_log_target(conf, optarg) < 0) { 32753a5a1b3Sopenharmony_ci#ifdef HAVE_SYSTEMD_JOURNAL 32853a5a1b3Sopenharmony_ci pa_log(_("Invalid log target: use either 'syslog', 'journal', 'stderr' or 'auto' or a valid file name 'file:<path>', 'newfile:<path>'.")); 32953a5a1b3Sopenharmony_ci#else 33053a5a1b3Sopenharmony_ci pa_log(_("Invalid log target: use either 'syslog', 'stderr' or 'auto' or a valid file name 'file:<path>', 'newfile:<path>'.")); 33153a5a1b3Sopenharmony_ci#endif 33253a5a1b3Sopenharmony_ci goto fail; 33353a5a1b3Sopenharmony_ci } 33453a5a1b3Sopenharmony_ci break; 33553a5a1b3Sopenharmony_ci 33653a5a1b3Sopenharmony_ci case ARG_LOG_TIME: 33753a5a1b3Sopenharmony_ci if ((b = optarg ? pa_parse_boolean(optarg) : 1) < 0) { 33853a5a1b3Sopenharmony_ci pa_log(_("--log-time expects boolean argument")); 33953a5a1b3Sopenharmony_ci goto fail; 34053a5a1b3Sopenharmony_ci } 34153a5a1b3Sopenharmony_ci conf->log_time = !!b; 34253a5a1b3Sopenharmony_ci break; 34353a5a1b3Sopenharmony_ci 34453a5a1b3Sopenharmony_ci case ARG_LOG_META: 34553a5a1b3Sopenharmony_ci if ((b = optarg ? pa_parse_boolean(optarg) : 1) < 0) { 34653a5a1b3Sopenharmony_ci pa_log(_("--log-meta expects boolean argument")); 34753a5a1b3Sopenharmony_ci goto fail; 34853a5a1b3Sopenharmony_ci } 34953a5a1b3Sopenharmony_ci conf->log_meta = !!b; 35053a5a1b3Sopenharmony_ci break; 35153a5a1b3Sopenharmony_ci 35253a5a1b3Sopenharmony_ci case ARG_LOG_BACKTRACE: 35353a5a1b3Sopenharmony_ci conf->log_backtrace = (unsigned) atoi(optarg); 35453a5a1b3Sopenharmony_ci break; 35553a5a1b3Sopenharmony_ci 35653a5a1b3Sopenharmony_ci case ARG_EXIT_IDLE_TIME: 35753a5a1b3Sopenharmony_ci conf->exit_idle_time = atoi(optarg); 35853a5a1b3Sopenharmony_ci break; 35953a5a1b3Sopenharmony_ci 36053a5a1b3Sopenharmony_ci case ARG_SCACHE_IDLE_TIME: 36153a5a1b3Sopenharmony_ci conf->scache_idle_time = atoi(optarg); 36253a5a1b3Sopenharmony_ci break; 36353a5a1b3Sopenharmony_ci 36453a5a1b3Sopenharmony_ci case ARG_RESAMPLE_METHOD: 36553a5a1b3Sopenharmony_ci if (pa_daemon_conf_set_resample_method(conf, optarg) < 0) { 36653a5a1b3Sopenharmony_ci pa_log(_("Invalid resample method '%s'."), optarg); 36753a5a1b3Sopenharmony_ci goto fail; 36853a5a1b3Sopenharmony_ci } 36953a5a1b3Sopenharmony_ci break; 37053a5a1b3Sopenharmony_ci 37153a5a1b3Sopenharmony_ci case ARG_SYSTEM: 37253a5a1b3Sopenharmony_ci if ((b = optarg ? pa_parse_boolean(optarg) : 1) < 0) { 37353a5a1b3Sopenharmony_ci pa_log(_("--system expects boolean argument")); 37453a5a1b3Sopenharmony_ci goto fail; 37553a5a1b3Sopenharmony_ci } 37653a5a1b3Sopenharmony_ci conf->system_instance = !!b; 37753a5a1b3Sopenharmony_ci break; 37853a5a1b3Sopenharmony_ci 37953a5a1b3Sopenharmony_ci case ARG_NO_CPU_LIMIT: 38053a5a1b3Sopenharmony_ci if ((b = optarg ? pa_parse_boolean(optarg) : 1) < 0) { 38153a5a1b3Sopenharmony_ci pa_log(_("--no-cpu-limit expects boolean argument")); 38253a5a1b3Sopenharmony_ci goto fail; 38353a5a1b3Sopenharmony_ci } 38453a5a1b3Sopenharmony_ci conf->no_cpu_limit = !!b; 38553a5a1b3Sopenharmony_ci break; 38653a5a1b3Sopenharmony_ci 38753a5a1b3Sopenharmony_ci case ARG_DISABLE_SHM: 38853a5a1b3Sopenharmony_ci if ((b = optarg ? pa_parse_boolean(optarg) : 1) < 0) { 38953a5a1b3Sopenharmony_ci pa_log(_("--disable-shm expects boolean argument")); 39053a5a1b3Sopenharmony_ci goto fail; 39153a5a1b3Sopenharmony_ci } 39253a5a1b3Sopenharmony_ci conf->disable_shm = !!b; 39353a5a1b3Sopenharmony_ci break; 39453a5a1b3Sopenharmony_ci 39553a5a1b3Sopenharmony_ci case ARG_ENABLE_MEMFD: 39653a5a1b3Sopenharmony_ci if ((b = optarg ? pa_parse_boolean(optarg) : 1) < 0) { 39753a5a1b3Sopenharmony_ci pa_log(_("--enable-memfd expects boolean argument")); 39853a5a1b3Sopenharmony_ci goto fail; 39953a5a1b3Sopenharmony_ci } 40053a5a1b3Sopenharmony_ci conf->disable_memfd = !b; 40153a5a1b3Sopenharmony_ci break; 40253a5a1b3Sopenharmony_ci 40353a5a1b3Sopenharmony_ci default: 40453a5a1b3Sopenharmony_ci goto fail; 40553a5a1b3Sopenharmony_ci } 40653a5a1b3Sopenharmony_ci } 40753a5a1b3Sopenharmony_ci 40853a5a1b3Sopenharmony_ci pa_xfree(conf->script_commands); 40953a5a1b3Sopenharmony_ci conf->script_commands = pa_strbuf_to_string_free(buf); 41053a5a1b3Sopenharmony_ci 41153a5a1b3Sopenharmony_ci *d = optind; 41253a5a1b3Sopenharmony_ci 41353a5a1b3Sopenharmony_ci return 0; 41453a5a1b3Sopenharmony_ci 41553a5a1b3Sopenharmony_cifail: 41653a5a1b3Sopenharmony_ci if (buf) 41753a5a1b3Sopenharmony_ci pa_strbuf_free(buf); 41853a5a1b3Sopenharmony_ci 41953a5a1b3Sopenharmony_ci return -1; 42053a5a1b3Sopenharmony_ci} 421