153a5a1b3Sopenharmony_ci/*** 253a5a1b3Sopenharmony_ci This file is part of PulseAudio. 353a5a1b3Sopenharmony_ci 453a5a1b3Sopenharmony_ci Copyright 2004-2006 Lennart Poettering 553a5a1b3Sopenharmony_ci Copyright 2006 Pierre Ossman <ossman@cendio.se> for Cendio AB 653a5a1b3Sopenharmony_ci 753a5a1b3Sopenharmony_ci PulseAudio is free software; you can redistribute it and/or modify 853a5a1b3Sopenharmony_ci it under the terms of the GNU Lesser General Public License as published 953a5a1b3Sopenharmony_ci by the Free Software Foundation; either version 2.1 of the License, 1053a5a1b3Sopenharmony_ci or (at your option) any later version. 1153a5a1b3Sopenharmony_ci 1253a5a1b3Sopenharmony_ci PulseAudio is distributed in the hope that it will be useful, but 1353a5a1b3Sopenharmony_ci WITHOUT ANY WARRANTY; without even the implied warranty of 1453a5a1b3Sopenharmony_ci MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 1553a5a1b3Sopenharmony_ci General Public License for more details. 1653a5a1b3Sopenharmony_ci 1753a5a1b3Sopenharmony_ci You should have received a copy of the GNU Lesser General Public License 1853a5a1b3Sopenharmony_ci along with PulseAudio; if not, see <http://www.gnu.org/licenses/>. 1953a5a1b3Sopenharmony_ci***/ 2053a5a1b3Sopenharmony_ci 2153a5a1b3Sopenharmony_ci#ifdef HAVE_CONFIG_H 2253a5a1b3Sopenharmony_ci#include <config.h> 2353a5a1b3Sopenharmony_ci#endif 2453a5a1b3Sopenharmony_ci 2553a5a1b3Sopenharmony_ci#include <errno.h> 2653a5a1b3Sopenharmony_ci#include <stdio.h> 2753a5a1b3Sopenharmony_ci#include <string.h> 2853a5a1b3Sopenharmony_ci#include <unistd.h> 2953a5a1b3Sopenharmony_ci#include <fcntl.h> 3053a5a1b3Sopenharmony_ci#include <sys/stat.h> 3153a5a1b3Sopenharmony_ci 3253a5a1b3Sopenharmony_ci#ifdef HAVE_SCHED_H 3353a5a1b3Sopenharmony_ci#include <sched.h> 3453a5a1b3Sopenharmony_ci#endif 3553a5a1b3Sopenharmony_ci 3653a5a1b3Sopenharmony_ci#include <pulse/xmalloc.h> 3753a5a1b3Sopenharmony_ci#include <pulse/timeval.h> 3853a5a1b3Sopenharmony_ci#include <pulse/version.h> 3953a5a1b3Sopenharmony_ci 4053a5a1b3Sopenharmony_ci#include <pulsecore/core-error.h> 4153a5a1b3Sopenharmony_ci#include <pulsecore/core-util.h> 4253a5a1b3Sopenharmony_ci#include <pulsecore/i18n.h> 4353a5a1b3Sopenharmony_ci#include <pulsecore/strbuf.h> 4453a5a1b3Sopenharmony_ci#include <pulsecore/conf-parser.h> 4553a5a1b3Sopenharmony_ci#include <pulsecore/resampler.h> 4653a5a1b3Sopenharmony_ci#include <pulsecore/macro.h> 4753a5a1b3Sopenharmony_ci 4853a5a1b3Sopenharmony_ci#include "daemon-conf.h" 4953a5a1b3Sopenharmony_ci 5053a5a1b3Sopenharmony_ci#define DEFAULT_SCRIPT_FILE PA_DEFAULT_CONFIG_DIR PA_PATH_SEP "default.pa" 5153a5a1b3Sopenharmony_ci#define DEFAULT_SCRIPT_FILE_USER PA_PATH_SEP "default.pa" 5253a5a1b3Sopenharmony_ci#define DEFAULT_SYSTEM_SCRIPT_FILE PA_DEFAULT_CONFIG_DIR PA_PATH_SEP "system.pa" 5353a5a1b3Sopenharmony_ci 5453a5a1b3Sopenharmony_ci#define DEFAULT_CONFIG_FILE PA_DEFAULT_CONFIG_DIR PA_PATH_SEP "daemon.conf" 5553a5a1b3Sopenharmony_ci#define DEFAULT_CONFIG_FILE_USER PA_PATH_SEP "daemon.conf" 5653a5a1b3Sopenharmony_ci 5753a5a1b3Sopenharmony_ci#define ENV_SCRIPT_FILE "PULSE_SCRIPT" 5853a5a1b3Sopenharmony_ci#define ENV_CONFIG_FILE "PULSE_CONFIG" 5953a5a1b3Sopenharmony_ci#define ENV_DL_SEARCH_PATH "PULSE_DLPATH" 6053a5a1b3Sopenharmony_ci 6153a5a1b3Sopenharmony_cistatic const pa_daemon_conf default_conf = { 6253a5a1b3Sopenharmony_ci .cmd = PA_CMD_DAEMON, 6353a5a1b3Sopenharmony_ci .daemonize = false, 6453a5a1b3Sopenharmony_ci .fail = true, 6553a5a1b3Sopenharmony_ci .high_priority = true, 6653a5a1b3Sopenharmony_ci .nice_level = -11, 6753a5a1b3Sopenharmony_ci .realtime_scheduling = true, 6853a5a1b3Sopenharmony_ci .realtime_priority = 5, /* Half of JACK's default rtprio */ 6953a5a1b3Sopenharmony_ci .disallow_module_loading = false, 7053a5a1b3Sopenharmony_ci .disallow_exit = false, 7153a5a1b3Sopenharmony_ci .flat_volumes = false, 7253a5a1b3Sopenharmony_ci .rescue_streams = true, 7353a5a1b3Sopenharmony_ci .exit_idle_time = -1, 7453a5a1b3Sopenharmony_ci .scache_idle_time = 20, 7553a5a1b3Sopenharmony_ci .script_commands = NULL, 7653a5a1b3Sopenharmony_ci .dl_search_path = NULL, 7753a5a1b3Sopenharmony_ci .load_default_script_file = true, 7853a5a1b3Sopenharmony_ci .default_script_file = NULL, 7953a5a1b3Sopenharmony_ci .log_target = NULL, 8053a5a1b3Sopenharmony_ci .log_level = PA_LOG_NOTICE, 8153a5a1b3Sopenharmony_ci .log_backtrace = 0, 8253a5a1b3Sopenharmony_ci .log_meta = false, 8353a5a1b3Sopenharmony_ci .log_time = false, 8453a5a1b3Sopenharmony_ci .resample_method = PA_RESAMPLER_AUTO, 8553a5a1b3Sopenharmony_ci .avoid_resampling = false, 8653a5a1b3Sopenharmony_ci .disable_remixing = false, 8753a5a1b3Sopenharmony_ci .remixing_use_all_sink_channels = true, 8853a5a1b3Sopenharmony_ci .remixing_produce_lfe = false, 8953a5a1b3Sopenharmony_ci .remixing_consume_lfe = false, 9053a5a1b3Sopenharmony_ci .lfe_crossover_freq = 0, 9153a5a1b3Sopenharmony_ci .config_file = NULL, 9253a5a1b3Sopenharmony_ci .use_pid_file = true, 9353a5a1b3Sopenharmony_ci .system_instance = false, 9453a5a1b3Sopenharmony_ci#ifdef HAVE_DBUS 9553a5a1b3Sopenharmony_ci .local_server_type = PA_SERVER_TYPE_UNSET, /* The actual default is _USER, but we have to detect when the user doesn't specify this option. */ 9653a5a1b3Sopenharmony_ci#endif 9753a5a1b3Sopenharmony_ci .no_cpu_limit = true, 9853a5a1b3Sopenharmony_ci .disable_shm = false, 9953a5a1b3Sopenharmony_ci .disable_memfd = false, 10053a5a1b3Sopenharmony_ci .lock_memory = false, 10153a5a1b3Sopenharmony_ci .deferred_volume = true, 10253a5a1b3Sopenharmony_ci .default_n_fragments = 4, 10353a5a1b3Sopenharmony_ci .default_fragment_size_msec = 25, 10453a5a1b3Sopenharmony_ci .deferred_volume_safety_margin_usec = 8000, 10553a5a1b3Sopenharmony_ci .deferred_volume_extra_delay_usec = 0, 10653a5a1b3Sopenharmony_ci .default_sample_spec = { .format = PA_SAMPLE_S16NE, .rate = 44100, .channels = 2 }, 10753a5a1b3Sopenharmony_ci .alternate_sample_rate = 48000, 10853a5a1b3Sopenharmony_ci .default_channel_map = { .channels = 2, .map = { PA_CHANNEL_POSITION_LEFT, PA_CHANNEL_POSITION_RIGHT } }, 10953a5a1b3Sopenharmony_ci .shm_size = 0 11053a5a1b3Sopenharmony_ci#ifdef HAVE_SYS_RESOURCE_H 11153a5a1b3Sopenharmony_ci ,.rlimit_fsize = { .value = 0, .is_set = false }, 11253a5a1b3Sopenharmony_ci .rlimit_data = { .value = 0, .is_set = false }, 11353a5a1b3Sopenharmony_ci .rlimit_stack = { .value = 0, .is_set = false }, 11453a5a1b3Sopenharmony_ci .rlimit_core = { .value = 0, .is_set = false } 11553a5a1b3Sopenharmony_ci#ifdef RLIMIT_RSS 11653a5a1b3Sopenharmony_ci ,.rlimit_rss = { .value = 0, .is_set = false } 11753a5a1b3Sopenharmony_ci#endif 11853a5a1b3Sopenharmony_ci#ifdef RLIMIT_NPROC 11953a5a1b3Sopenharmony_ci ,.rlimit_nproc = { .value = 0, .is_set = false } 12053a5a1b3Sopenharmony_ci#endif 12153a5a1b3Sopenharmony_ci#ifdef RLIMIT_NOFILE 12253a5a1b3Sopenharmony_ci ,.rlimit_nofile = { .value = 256, .is_set = true } 12353a5a1b3Sopenharmony_ci#endif 12453a5a1b3Sopenharmony_ci#ifdef RLIMIT_MEMLOCK 12553a5a1b3Sopenharmony_ci ,.rlimit_memlock = { .value = 0, .is_set = false } 12653a5a1b3Sopenharmony_ci#endif 12753a5a1b3Sopenharmony_ci#ifdef RLIMIT_AS 12853a5a1b3Sopenharmony_ci ,.rlimit_as = { .value = 0, .is_set = false } 12953a5a1b3Sopenharmony_ci#endif 13053a5a1b3Sopenharmony_ci#ifdef RLIMIT_LOCKS 13153a5a1b3Sopenharmony_ci ,.rlimit_locks = { .value = 0, .is_set = false } 13253a5a1b3Sopenharmony_ci#endif 13353a5a1b3Sopenharmony_ci#ifdef RLIMIT_SIGPENDING 13453a5a1b3Sopenharmony_ci ,.rlimit_sigpending = { .value = 0, .is_set = false } 13553a5a1b3Sopenharmony_ci#endif 13653a5a1b3Sopenharmony_ci#ifdef RLIMIT_MSGQUEUE 13753a5a1b3Sopenharmony_ci ,.rlimit_msgqueue = { .value = 0, .is_set = false } 13853a5a1b3Sopenharmony_ci#endif 13953a5a1b3Sopenharmony_ci#ifdef RLIMIT_NICE 14053a5a1b3Sopenharmony_ci ,.rlimit_nice = { .value = 31, .is_set = true } /* nice level of -11 */ 14153a5a1b3Sopenharmony_ci#endif 14253a5a1b3Sopenharmony_ci#ifdef RLIMIT_RTPRIO 14353a5a1b3Sopenharmony_ci ,.rlimit_rtprio = { .value = 9, .is_set = true } /* One below JACK's default for the server */ 14453a5a1b3Sopenharmony_ci#endif 14553a5a1b3Sopenharmony_ci#ifdef RLIMIT_RTTIME 14653a5a1b3Sopenharmony_ci ,.rlimit_rttime = { .value = 200*PA_USEC_PER_MSEC, .is_set = true } /* rtkit's limit is 200 ms */ 14753a5a1b3Sopenharmony_ci#endif 14853a5a1b3Sopenharmony_ci#endif 14953a5a1b3Sopenharmony_ci}; 15053a5a1b3Sopenharmony_ci 15153a5a1b3Sopenharmony_cipa_daemon_conf *pa_daemon_conf_new(void) { 15253a5a1b3Sopenharmony_ci pa_daemon_conf *c; 15353a5a1b3Sopenharmony_ci 15453a5a1b3Sopenharmony_ci c = pa_xnewdup(pa_daemon_conf, &default_conf, 1); 15553a5a1b3Sopenharmony_ci 15653a5a1b3Sopenharmony_ci#ifdef OS_IS_WIN32 15753a5a1b3Sopenharmony_ci c->dl_search_path = pa_sprintf_malloc("%s" PA_PATH_SEP "lib" PA_PATH_SEP "pulse-%d.%d" PA_PATH_SEP "modules", 15853a5a1b3Sopenharmony_ci pa_win32_get_toplevel(NULL), PA_MAJOR, PA_MINOR); 15953a5a1b3Sopenharmony_ci#else 16053a5a1b3Sopenharmony_ci#ifdef HAVE_RUNNING_FROM_BUILD_TREE 16153a5a1b3Sopenharmony_ci if (pa_run_from_build_tree()) { 16253a5a1b3Sopenharmony_ci pa_log_notice("Detected that we are run from the build tree, fixing search path."); 16353a5a1b3Sopenharmony_ci#ifdef MESON_BUILD 16453a5a1b3Sopenharmony_ci c->dl_search_path = pa_xstrdup(PA_BUILDDIR PA_PATH_SEP "src" PA_PATH_SEP "modules"); 16553a5a1b3Sopenharmony_ci#else 16653a5a1b3Sopenharmony_ci c->dl_search_path = pa_xstrdup(PA_BUILDDIR); 16753a5a1b3Sopenharmony_ci#endif // Endof #ifdef MESON_BUILD 16853a5a1b3Sopenharmony_ci } else 16953a5a1b3Sopenharmony_ci#endif // Endof #ifdef HAVE_RUNNING_FROM_BUILD_TREE 17053a5a1b3Sopenharmony_ci c->dl_search_path = pa_xstrdup(PA_DLSEARCHPATH); 17153a5a1b3Sopenharmony_ci#endif // Endof #ifdef OS_IS_WIN32 17253a5a1b3Sopenharmony_ci 17353a5a1b3Sopenharmony_ci return c; 17453a5a1b3Sopenharmony_ci} 17553a5a1b3Sopenharmony_ci 17653a5a1b3Sopenharmony_civoid pa_daemon_conf_free(pa_daemon_conf *c) { 17753a5a1b3Sopenharmony_ci pa_assert(c); 17853a5a1b3Sopenharmony_ci 17953a5a1b3Sopenharmony_ci pa_xfree(c->script_commands); 18053a5a1b3Sopenharmony_ci pa_xfree(c->dl_search_path); 18153a5a1b3Sopenharmony_ci pa_xfree(c->default_script_file); 18253a5a1b3Sopenharmony_ci 18353a5a1b3Sopenharmony_ci if (c->log_target) 18453a5a1b3Sopenharmony_ci pa_log_target_free(c->log_target); 18553a5a1b3Sopenharmony_ci 18653a5a1b3Sopenharmony_ci pa_xfree(c->config_file); 18753a5a1b3Sopenharmony_ci pa_xfree(c); 18853a5a1b3Sopenharmony_ci} 18953a5a1b3Sopenharmony_ci 19053a5a1b3Sopenharmony_ciint pa_daemon_conf_set_log_target(pa_daemon_conf *c, const char *string) { 19153a5a1b3Sopenharmony_ci pa_log_target *log_target = NULL; 19253a5a1b3Sopenharmony_ci 19353a5a1b3Sopenharmony_ci pa_assert(c); 19453a5a1b3Sopenharmony_ci pa_assert(string); 19553a5a1b3Sopenharmony_ci 19653a5a1b3Sopenharmony_ci if (!pa_streq(string, "auto")) { 19753a5a1b3Sopenharmony_ci log_target = pa_log_parse_target(string); 19853a5a1b3Sopenharmony_ci 19953a5a1b3Sopenharmony_ci if (!log_target) 20053a5a1b3Sopenharmony_ci return -1; 20153a5a1b3Sopenharmony_ci } 20253a5a1b3Sopenharmony_ci 20353a5a1b3Sopenharmony_ci c->log_target = log_target; 20453a5a1b3Sopenharmony_ci 20553a5a1b3Sopenharmony_ci return 0; 20653a5a1b3Sopenharmony_ci} 20753a5a1b3Sopenharmony_ci 20853a5a1b3Sopenharmony_ciint pa_daemon_conf_set_log_level(pa_daemon_conf *c, const char *string) { 20953a5a1b3Sopenharmony_ci uint32_t u; 21053a5a1b3Sopenharmony_ci pa_assert(c); 21153a5a1b3Sopenharmony_ci pa_assert(string); 21253a5a1b3Sopenharmony_ci 21353a5a1b3Sopenharmony_ci if (pa_atou(string, &u) >= 0) { 21453a5a1b3Sopenharmony_ci if (u >= PA_LOG_LEVEL_MAX) 21553a5a1b3Sopenharmony_ci return -1; 21653a5a1b3Sopenharmony_ci 21753a5a1b3Sopenharmony_ci c->log_level = (pa_log_level_t) u; 21853a5a1b3Sopenharmony_ci } else if (pa_startswith(string, "debug")) 21953a5a1b3Sopenharmony_ci c->log_level = PA_LOG_DEBUG; 22053a5a1b3Sopenharmony_ci else if (pa_startswith(string, "info")) 22153a5a1b3Sopenharmony_ci c->log_level = PA_LOG_INFO; 22253a5a1b3Sopenharmony_ci else if (pa_startswith(string, "notice")) 22353a5a1b3Sopenharmony_ci c->log_level = PA_LOG_NOTICE; 22453a5a1b3Sopenharmony_ci else if (pa_startswith(string, "warn")) 22553a5a1b3Sopenharmony_ci c->log_level = PA_LOG_WARN; 22653a5a1b3Sopenharmony_ci else if (pa_startswith(string, "err")) 22753a5a1b3Sopenharmony_ci c->log_level = PA_LOG_ERROR; 22853a5a1b3Sopenharmony_ci else 22953a5a1b3Sopenharmony_ci return -1; 23053a5a1b3Sopenharmony_ci 23153a5a1b3Sopenharmony_ci return 0; 23253a5a1b3Sopenharmony_ci} 23353a5a1b3Sopenharmony_ci 23453a5a1b3Sopenharmony_ciint pa_daemon_conf_set_resample_method(pa_daemon_conf *c, const char *string) { 23553a5a1b3Sopenharmony_ci int m; 23653a5a1b3Sopenharmony_ci pa_assert(c); 23753a5a1b3Sopenharmony_ci pa_assert(string); 23853a5a1b3Sopenharmony_ci 23953a5a1b3Sopenharmony_ci if ((m = pa_parse_resample_method(string)) < 0) 24053a5a1b3Sopenharmony_ci return -1; 24153a5a1b3Sopenharmony_ci 24253a5a1b3Sopenharmony_ci c->resample_method = m; 24353a5a1b3Sopenharmony_ci return 0; 24453a5a1b3Sopenharmony_ci} 24553a5a1b3Sopenharmony_ci 24653a5a1b3Sopenharmony_ciint pa_daemon_conf_set_local_server_type(pa_daemon_conf *c, const char *string) { 24753a5a1b3Sopenharmony_ci pa_assert(c); 24853a5a1b3Sopenharmony_ci pa_assert(string); 24953a5a1b3Sopenharmony_ci 25053a5a1b3Sopenharmony_ci if (pa_streq(string, "user")) 25153a5a1b3Sopenharmony_ci c->local_server_type = PA_SERVER_TYPE_USER; 25253a5a1b3Sopenharmony_ci else if (pa_streq(string, "system")) { 25353a5a1b3Sopenharmony_ci c->local_server_type = PA_SERVER_TYPE_SYSTEM; 25453a5a1b3Sopenharmony_ci } else if (pa_streq(string, "none")) { 25553a5a1b3Sopenharmony_ci c->local_server_type = PA_SERVER_TYPE_NONE; 25653a5a1b3Sopenharmony_ci } else 25753a5a1b3Sopenharmony_ci return -1; 25853a5a1b3Sopenharmony_ci 25953a5a1b3Sopenharmony_ci return 0; 26053a5a1b3Sopenharmony_ci} 26153a5a1b3Sopenharmony_ci 26253a5a1b3Sopenharmony_cistatic int parse_log_target(pa_config_parser_state *state) { 26353a5a1b3Sopenharmony_ci pa_daemon_conf *c; 26453a5a1b3Sopenharmony_ci 26553a5a1b3Sopenharmony_ci pa_assert(state); 26653a5a1b3Sopenharmony_ci 26753a5a1b3Sopenharmony_ci c = state->data; 26853a5a1b3Sopenharmony_ci 26953a5a1b3Sopenharmony_ci if (pa_daemon_conf_set_log_target(c, state->rvalue) < 0) { 27053a5a1b3Sopenharmony_ci pa_log(_("[%s:%u] Invalid log target '%s'."), state->filename, state->lineno, state->rvalue); 27153a5a1b3Sopenharmony_ci return -1; 27253a5a1b3Sopenharmony_ci } 27353a5a1b3Sopenharmony_ci 27453a5a1b3Sopenharmony_ci return 0; 27553a5a1b3Sopenharmony_ci} 27653a5a1b3Sopenharmony_ci 27753a5a1b3Sopenharmony_cistatic int parse_log_level(pa_config_parser_state *state) { 27853a5a1b3Sopenharmony_ci pa_daemon_conf *c; 27953a5a1b3Sopenharmony_ci 28053a5a1b3Sopenharmony_ci pa_assert(state); 28153a5a1b3Sopenharmony_ci 28253a5a1b3Sopenharmony_ci c = state->data; 28353a5a1b3Sopenharmony_ci 28453a5a1b3Sopenharmony_ci if (pa_daemon_conf_set_log_level(c, state->rvalue) < 0) { 28553a5a1b3Sopenharmony_ci pa_log(_("[%s:%u] Invalid log level '%s'."), state->filename, state->lineno, state->rvalue); 28653a5a1b3Sopenharmony_ci return -1; 28753a5a1b3Sopenharmony_ci } 28853a5a1b3Sopenharmony_ci 28953a5a1b3Sopenharmony_ci return 0; 29053a5a1b3Sopenharmony_ci} 29153a5a1b3Sopenharmony_ci 29253a5a1b3Sopenharmony_cistatic int parse_resample_method(pa_config_parser_state *state) { 29353a5a1b3Sopenharmony_ci pa_daemon_conf *c; 29453a5a1b3Sopenharmony_ci 29553a5a1b3Sopenharmony_ci pa_assert(state); 29653a5a1b3Sopenharmony_ci 29753a5a1b3Sopenharmony_ci c = state->data; 29853a5a1b3Sopenharmony_ci 29953a5a1b3Sopenharmony_ci if (pa_daemon_conf_set_resample_method(c, state->rvalue) < 0) { 30053a5a1b3Sopenharmony_ci pa_log(_("[%s:%u] Invalid resample method '%s'."), state->filename, state->lineno, state->rvalue); 30153a5a1b3Sopenharmony_ci return -1; 30253a5a1b3Sopenharmony_ci } 30353a5a1b3Sopenharmony_ci 30453a5a1b3Sopenharmony_ci return 0; 30553a5a1b3Sopenharmony_ci} 30653a5a1b3Sopenharmony_ci 30753a5a1b3Sopenharmony_ci#ifdef HAVE_SYS_RESOURCE_H 30853a5a1b3Sopenharmony_cistatic int parse_rlimit(pa_config_parser_state *state) { 30953a5a1b3Sopenharmony_ci struct pa_rlimit *r; 31053a5a1b3Sopenharmony_ci 31153a5a1b3Sopenharmony_ci pa_assert(state); 31253a5a1b3Sopenharmony_ci 31353a5a1b3Sopenharmony_ci r = state->data; 31453a5a1b3Sopenharmony_ci 31553a5a1b3Sopenharmony_ci if (state->rvalue[strspn(state->rvalue, "\t ")] == 0) { 31653a5a1b3Sopenharmony_ci /* Empty string */ 31753a5a1b3Sopenharmony_ci r->is_set = 0; 31853a5a1b3Sopenharmony_ci r->value = 0; 31953a5a1b3Sopenharmony_ci } else { 32053a5a1b3Sopenharmony_ci int32_t k; 32153a5a1b3Sopenharmony_ci if (pa_atoi(state->rvalue, &k) < 0) { 32253a5a1b3Sopenharmony_ci pa_log(_("[%s:%u] Invalid rlimit '%s'."), state->filename, state->lineno, state->rvalue); 32353a5a1b3Sopenharmony_ci return -1; 32453a5a1b3Sopenharmony_ci } 32553a5a1b3Sopenharmony_ci r->is_set = k >= 0; 32653a5a1b3Sopenharmony_ci r->value = k >= 0 ? (rlim_t) k : 0; 32753a5a1b3Sopenharmony_ci } 32853a5a1b3Sopenharmony_ci 32953a5a1b3Sopenharmony_ci return 0; 33053a5a1b3Sopenharmony_ci} 33153a5a1b3Sopenharmony_ci#endif 33253a5a1b3Sopenharmony_ci 33353a5a1b3Sopenharmony_cistatic int parse_sample_format(pa_config_parser_state *state) { 33453a5a1b3Sopenharmony_ci pa_daemon_conf *c; 33553a5a1b3Sopenharmony_ci pa_sample_format_t f; 33653a5a1b3Sopenharmony_ci 33753a5a1b3Sopenharmony_ci pa_assert(state); 33853a5a1b3Sopenharmony_ci 33953a5a1b3Sopenharmony_ci c = state->data; 34053a5a1b3Sopenharmony_ci 34153a5a1b3Sopenharmony_ci if ((f = pa_parse_sample_format(state->rvalue)) < 0) { 34253a5a1b3Sopenharmony_ci pa_log(_("[%s:%u] Invalid sample format '%s'."), state->filename, state->lineno, state->rvalue); 34353a5a1b3Sopenharmony_ci return -1; 34453a5a1b3Sopenharmony_ci } 34553a5a1b3Sopenharmony_ci 34653a5a1b3Sopenharmony_ci c->default_sample_spec.format = f; 34753a5a1b3Sopenharmony_ci return 0; 34853a5a1b3Sopenharmony_ci} 34953a5a1b3Sopenharmony_ci 35053a5a1b3Sopenharmony_cistatic int parse_sample_rate(pa_config_parser_state *state) { 35153a5a1b3Sopenharmony_ci pa_daemon_conf *c; 35253a5a1b3Sopenharmony_ci uint32_t r; 35353a5a1b3Sopenharmony_ci 35453a5a1b3Sopenharmony_ci pa_assert(state); 35553a5a1b3Sopenharmony_ci 35653a5a1b3Sopenharmony_ci c = state->data; 35753a5a1b3Sopenharmony_ci 35853a5a1b3Sopenharmony_ci if (pa_atou(state->rvalue, &r) < 0 || !pa_sample_rate_valid(r)) { 35953a5a1b3Sopenharmony_ci pa_log(_("[%s:%u] Invalid sample rate '%s'."), state->filename, state->lineno, state->rvalue); 36053a5a1b3Sopenharmony_ci return -1; 36153a5a1b3Sopenharmony_ci } 36253a5a1b3Sopenharmony_ci 36353a5a1b3Sopenharmony_ci c->default_sample_spec.rate = r; 36453a5a1b3Sopenharmony_ci return 0; 36553a5a1b3Sopenharmony_ci} 36653a5a1b3Sopenharmony_ci 36753a5a1b3Sopenharmony_cistatic int parse_alternate_sample_rate(pa_config_parser_state *state) { 36853a5a1b3Sopenharmony_ci pa_daemon_conf *c; 36953a5a1b3Sopenharmony_ci uint32_t r; 37053a5a1b3Sopenharmony_ci 37153a5a1b3Sopenharmony_ci pa_assert(state); 37253a5a1b3Sopenharmony_ci 37353a5a1b3Sopenharmony_ci c = state->data; 37453a5a1b3Sopenharmony_ci 37553a5a1b3Sopenharmony_ci if (pa_atou(state->rvalue, &r) < 0 || !pa_sample_rate_valid(r)) { 37653a5a1b3Sopenharmony_ci pa_log(_("[%s:%u] Invalid sample rate '%s'."), state->filename, state->lineno, state->rvalue); 37753a5a1b3Sopenharmony_ci return -1; 37853a5a1b3Sopenharmony_ci } 37953a5a1b3Sopenharmony_ci 38053a5a1b3Sopenharmony_ci c->alternate_sample_rate = r; 38153a5a1b3Sopenharmony_ci return 0; 38253a5a1b3Sopenharmony_ci} 38353a5a1b3Sopenharmony_ci 38453a5a1b3Sopenharmony_cistruct channel_conf_info { 38553a5a1b3Sopenharmony_ci pa_daemon_conf *conf; 38653a5a1b3Sopenharmony_ci bool default_sample_spec_set; 38753a5a1b3Sopenharmony_ci bool default_channel_map_set; 38853a5a1b3Sopenharmony_ci}; 38953a5a1b3Sopenharmony_ci 39053a5a1b3Sopenharmony_cistatic int parse_sample_channels(pa_config_parser_state *state) { 39153a5a1b3Sopenharmony_ci struct channel_conf_info *i; 39253a5a1b3Sopenharmony_ci int32_t n; 39353a5a1b3Sopenharmony_ci 39453a5a1b3Sopenharmony_ci pa_assert(state); 39553a5a1b3Sopenharmony_ci 39653a5a1b3Sopenharmony_ci i = state->data; 39753a5a1b3Sopenharmony_ci 39853a5a1b3Sopenharmony_ci if (pa_atoi(state->rvalue, &n) < 0 || !pa_channels_valid(n)) { 39953a5a1b3Sopenharmony_ci pa_log(_("[%s:%u] Invalid sample channels '%s'."), state->filename, state->lineno, state->rvalue); 40053a5a1b3Sopenharmony_ci return -1; 40153a5a1b3Sopenharmony_ci } 40253a5a1b3Sopenharmony_ci 40353a5a1b3Sopenharmony_ci i->conf->default_sample_spec.channels = (uint8_t) n; 40453a5a1b3Sopenharmony_ci i->default_sample_spec_set = true; 40553a5a1b3Sopenharmony_ci return 0; 40653a5a1b3Sopenharmony_ci} 40753a5a1b3Sopenharmony_ci 40853a5a1b3Sopenharmony_cistatic int parse_channel_map(pa_config_parser_state *state) { 40953a5a1b3Sopenharmony_ci struct channel_conf_info *i; 41053a5a1b3Sopenharmony_ci 41153a5a1b3Sopenharmony_ci pa_assert(state); 41253a5a1b3Sopenharmony_ci 41353a5a1b3Sopenharmony_ci i = state->data; 41453a5a1b3Sopenharmony_ci 41553a5a1b3Sopenharmony_ci if (!pa_channel_map_parse(&i->conf->default_channel_map, state->rvalue)) { 41653a5a1b3Sopenharmony_ci pa_log(_("[%s:%u] Invalid channel map '%s'."), state->filename, state->lineno, state->rvalue); 41753a5a1b3Sopenharmony_ci return -1; 41853a5a1b3Sopenharmony_ci } 41953a5a1b3Sopenharmony_ci 42053a5a1b3Sopenharmony_ci i->default_channel_map_set = true; 42153a5a1b3Sopenharmony_ci return 0; 42253a5a1b3Sopenharmony_ci} 42353a5a1b3Sopenharmony_ci 42453a5a1b3Sopenharmony_cistatic int parse_fragments(pa_config_parser_state *state) { 42553a5a1b3Sopenharmony_ci pa_daemon_conf *c; 42653a5a1b3Sopenharmony_ci int32_t n; 42753a5a1b3Sopenharmony_ci 42853a5a1b3Sopenharmony_ci pa_assert(state); 42953a5a1b3Sopenharmony_ci 43053a5a1b3Sopenharmony_ci c = state->data; 43153a5a1b3Sopenharmony_ci 43253a5a1b3Sopenharmony_ci if (pa_atoi(state->rvalue, &n) < 0 || n < 2) { 43353a5a1b3Sopenharmony_ci pa_log(_("[%s:%u] Invalid number of fragments '%s'."), state->filename, state->lineno, state->rvalue); 43453a5a1b3Sopenharmony_ci return -1; 43553a5a1b3Sopenharmony_ci } 43653a5a1b3Sopenharmony_ci 43753a5a1b3Sopenharmony_ci c->default_n_fragments = (unsigned) n; 43853a5a1b3Sopenharmony_ci return 0; 43953a5a1b3Sopenharmony_ci} 44053a5a1b3Sopenharmony_ci 44153a5a1b3Sopenharmony_cistatic int parse_fragment_size_msec(pa_config_parser_state *state) { 44253a5a1b3Sopenharmony_ci pa_daemon_conf *c; 44353a5a1b3Sopenharmony_ci int32_t n; 44453a5a1b3Sopenharmony_ci 44553a5a1b3Sopenharmony_ci pa_assert(state); 44653a5a1b3Sopenharmony_ci 44753a5a1b3Sopenharmony_ci c = state->data; 44853a5a1b3Sopenharmony_ci 44953a5a1b3Sopenharmony_ci if (pa_atoi(state->rvalue, &n) < 0 || n < 1) { 45053a5a1b3Sopenharmony_ci pa_log(_("[%s:%u] Invalid fragment size '%s'."), state->filename, state->lineno, state->rvalue); 45153a5a1b3Sopenharmony_ci return -1; 45253a5a1b3Sopenharmony_ci } 45353a5a1b3Sopenharmony_ci 45453a5a1b3Sopenharmony_ci c->default_fragment_size_msec = (unsigned) n; 45553a5a1b3Sopenharmony_ci return 0; 45653a5a1b3Sopenharmony_ci} 45753a5a1b3Sopenharmony_ci 45853a5a1b3Sopenharmony_cistatic int parse_nice_level(pa_config_parser_state *state) { 45953a5a1b3Sopenharmony_ci pa_daemon_conf *c; 46053a5a1b3Sopenharmony_ci int32_t level; 46153a5a1b3Sopenharmony_ci 46253a5a1b3Sopenharmony_ci pa_assert(state); 46353a5a1b3Sopenharmony_ci 46453a5a1b3Sopenharmony_ci c = state->data; 46553a5a1b3Sopenharmony_ci 46653a5a1b3Sopenharmony_ci if (pa_atoi(state->rvalue, &level) < 0 || level < -20 || level > 19) { 46753a5a1b3Sopenharmony_ci pa_log(_("[%s:%u] Invalid nice level '%s'."), state->filename, state->lineno, state->rvalue); 46853a5a1b3Sopenharmony_ci return -1; 46953a5a1b3Sopenharmony_ci } 47053a5a1b3Sopenharmony_ci 47153a5a1b3Sopenharmony_ci c->nice_level = (int) level; 47253a5a1b3Sopenharmony_ci return 0; 47353a5a1b3Sopenharmony_ci} 47453a5a1b3Sopenharmony_ci 47553a5a1b3Sopenharmony_cistatic int parse_rtprio(pa_config_parser_state *state) { 47653a5a1b3Sopenharmony_ci#if !defined(OS_IS_WIN32) && defined(HAVE_SCHED_H) 47753a5a1b3Sopenharmony_ci pa_daemon_conf *c; 47853a5a1b3Sopenharmony_ci int32_t rtprio; 47953a5a1b3Sopenharmony_ci#endif 48053a5a1b3Sopenharmony_ci 48153a5a1b3Sopenharmony_ci pa_assert(state); 48253a5a1b3Sopenharmony_ci 48353a5a1b3Sopenharmony_ci#ifdef OS_IS_WIN32 48453a5a1b3Sopenharmony_ci pa_log("[%s:%u] Realtime priority not available on win32.", state->filename, state->lineno); 48553a5a1b3Sopenharmony_ci#else 48653a5a1b3Sopenharmony_ci# ifdef HAVE_SCHED_H 48753a5a1b3Sopenharmony_ci c = state->data; 48853a5a1b3Sopenharmony_ci 48953a5a1b3Sopenharmony_ci if (pa_atoi(state->rvalue, &rtprio) < 0 || rtprio < sched_get_priority_min(SCHED_FIFO) || rtprio > sched_get_priority_max(SCHED_FIFO)) { 49053a5a1b3Sopenharmony_ci pa_log("[%s:%u] Invalid realtime priority '%s'.", state->filename, state->lineno, state->rvalue); 49153a5a1b3Sopenharmony_ci return -1; 49253a5a1b3Sopenharmony_ci } 49353a5a1b3Sopenharmony_ci 49453a5a1b3Sopenharmony_ci c->realtime_priority = (int) rtprio; 49553a5a1b3Sopenharmony_ci# endif 49653a5a1b3Sopenharmony_ci#endif /* OS_IS_WIN32 */ 49753a5a1b3Sopenharmony_ci 49853a5a1b3Sopenharmony_ci return 0; 49953a5a1b3Sopenharmony_ci} 50053a5a1b3Sopenharmony_ci 50153a5a1b3Sopenharmony_cistatic int parse_disable_lfe_remix(pa_config_parser_state *state) { 50253a5a1b3Sopenharmony_ci pa_daemon_conf *c; 50353a5a1b3Sopenharmony_ci int k; 50453a5a1b3Sopenharmony_ci 50553a5a1b3Sopenharmony_ci pa_assert(state); 50653a5a1b3Sopenharmony_ci c = state->data; 50753a5a1b3Sopenharmony_ci 50853a5a1b3Sopenharmony_ci if ((k = pa_parse_boolean(state->rvalue)) < 0) { 50953a5a1b3Sopenharmony_ci pa_log("[%s:%u] Failed to parse boolean value: %s", state->filename, state->lineno, state->rvalue); 51053a5a1b3Sopenharmony_ci return -1; 51153a5a1b3Sopenharmony_ci } 51253a5a1b3Sopenharmony_ci 51353a5a1b3Sopenharmony_ci c->remixing_produce_lfe = c->remixing_consume_lfe = !k; 51453a5a1b3Sopenharmony_ci 51553a5a1b3Sopenharmony_ci pa_log("[%s:%u] Deprecated option 'disable-lfe-remixing' found.", state->filename, state->lineno); 51653a5a1b3Sopenharmony_ci pa_log("[%s:%u] Please migrate to 'remixing-produce-lfe' and 'remixing-consume-lfe', set both to '%s'.", 51753a5a1b3Sopenharmony_ci state->filename, state->lineno, pa_yes_no(c->remixing_produce_lfe)); 51853a5a1b3Sopenharmony_ci 51953a5a1b3Sopenharmony_ci return 0; 52053a5a1b3Sopenharmony_ci} 52153a5a1b3Sopenharmony_ci 52253a5a1b3Sopenharmony_cistatic int parse_enable_lfe_remix(pa_config_parser_state *state) { 52353a5a1b3Sopenharmony_ci pa_daemon_conf *c; 52453a5a1b3Sopenharmony_ci int k; 52553a5a1b3Sopenharmony_ci 52653a5a1b3Sopenharmony_ci pa_assert(state); 52753a5a1b3Sopenharmony_ci c = state->data; 52853a5a1b3Sopenharmony_ci 52953a5a1b3Sopenharmony_ci if ((k = pa_parse_boolean(state->rvalue)) < 0) { 53053a5a1b3Sopenharmony_ci pa_log("[%s:%u] Failed to parse boolean value: %s", state->filename, state->lineno, state->rvalue); 53153a5a1b3Sopenharmony_ci return -1; 53253a5a1b3Sopenharmony_ci } 53353a5a1b3Sopenharmony_ci 53453a5a1b3Sopenharmony_ci c->remixing_produce_lfe = c->remixing_consume_lfe = k; 53553a5a1b3Sopenharmony_ci 53653a5a1b3Sopenharmony_ci pa_log("[%s:%u] Deprecated option 'enable-lfe-remixing' found.", state->filename, state->lineno); 53753a5a1b3Sopenharmony_ci pa_log("[%s:%u] Please migrate to 'remixing-produce-lfe' and 'remixing-consume-lfe', set both to '%s'.", 53853a5a1b3Sopenharmony_ci state->filename, state->lineno, pa_yes_no(c->remixing_produce_lfe)); 53953a5a1b3Sopenharmony_ci 54053a5a1b3Sopenharmony_ci return 0; 54153a5a1b3Sopenharmony_ci} 54253a5a1b3Sopenharmony_ci 54353a5a1b3Sopenharmony_ci#ifdef HAVE_DBUS 54453a5a1b3Sopenharmony_cistatic int parse_server_type(pa_config_parser_state *state) { 54553a5a1b3Sopenharmony_ci pa_daemon_conf *c; 54653a5a1b3Sopenharmony_ci 54753a5a1b3Sopenharmony_ci pa_assert(state); 54853a5a1b3Sopenharmony_ci 54953a5a1b3Sopenharmony_ci c = state->data; 55053a5a1b3Sopenharmony_ci 55153a5a1b3Sopenharmony_ci if (pa_daemon_conf_set_local_server_type(c, state->rvalue) < 0) { 55253a5a1b3Sopenharmony_ci pa_log(_("[%s:%u] Invalid server type '%s'."), state->filename, state->lineno, state->rvalue); 55353a5a1b3Sopenharmony_ci return -1; 55453a5a1b3Sopenharmony_ci } 55553a5a1b3Sopenharmony_ci 55653a5a1b3Sopenharmony_ci return 0; 55753a5a1b3Sopenharmony_ci} 55853a5a1b3Sopenharmony_ci#endif 55953a5a1b3Sopenharmony_ci 56053a5a1b3Sopenharmony_ciint pa_daemon_conf_load(pa_daemon_conf *c, const char *filename) { 56153a5a1b3Sopenharmony_ci int r = -1; 56253a5a1b3Sopenharmony_ci FILE *f = NULL; 56353a5a1b3Sopenharmony_ci struct channel_conf_info ci; 56453a5a1b3Sopenharmony_ci pa_config_item table[] = { 56553a5a1b3Sopenharmony_ci { "daemonize", pa_config_parse_bool, &c->daemonize, NULL }, 56653a5a1b3Sopenharmony_ci { "fail", pa_config_parse_bool, &c->fail, NULL }, 56753a5a1b3Sopenharmony_ci { "high-priority", pa_config_parse_bool, &c->high_priority, NULL }, 56853a5a1b3Sopenharmony_ci { "realtime-scheduling", pa_config_parse_bool, &c->realtime_scheduling, NULL }, 56953a5a1b3Sopenharmony_ci { "disallow-module-loading", pa_config_parse_bool, &c->disallow_module_loading, NULL }, 57053a5a1b3Sopenharmony_ci { "allow-module-loading", pa_config_parse_not_bool, &c->disallow_module_loading, NULL }, 57153a5a1b3Sopenharmony_ci { "disallow-exit", pa_config_parse_bool, &c->disallow_exit, NULL }, 57253a5a1b3Sopenharmony_ci { "allow-exit", pa_config_parse_not_bool, &c->disallow_exit, NULL }, 57353a5a1b3Sopenharmony_ci { "use-pid-file", pa_config_parse_bool, &c->use_pid_file, NULL }, 57453a5a1b3Sopenharmony_ci { "system-instance", pa_config_parse_bool, &c->system_instance, NULL }, 57553a5a1b3Sopenharmony_ci#ifdef HAVE_DBUS 57653a5a1b3Sopenharmony_ci { "local-server-type", parse_server_type, c, NULL }, 57753a5a1b3Sopenharmony_ci#endif 57853a5a1b3Sopenharmony_ci { "no-cpu-limit", pa_config_parse_bool, &c->no_cpu_limit, NULL }, 57953a5a1b3Sopenharmony_ci { "cpu-limit", pa_config_parse_not_bool, &c->no_cpu_limit, NULL }, 58053a5a1b3Sopenharmony_ci { "disable-shm", pa_config_parse_bool, &c->disable_shm, NULL }, 58153a5a1b3Sopenharmony_ci { "enable-shm", pa_config_parse_not_bool, &c->disable_shm, NULL }, 58253a5a1b3Sopenharmony_ci { "enable-memfd", pa_config_parse_not_bool, &c->disable_memfd, NULL }, 58353a5a1b3Sopenharmony_ci { "flat-volumes", pa_config_parse_bool, &c->flat_volumes, NULL }, 58453a5a1b3Sopenharmony_ci { "rescue-streams", pa_config_parse_bool, &c->rescue_streams, NULL }, 58553a5a1b3Sopenharmony_ci { "lock-memory", pa_config_parse_bool, &c->lock_memory, NULL }, 58653a5a1b3Sopenharmony_ci { "enable-deferred-volume", pa_config_parse_bool, &c->deferred_volume, NULL }, 58753a5a1b3Sopenharmony_ci { "exit-idle-time", pa_config_parse_int, &c->exit_idle_time, NULL }, 58853a5a1b3Sopenharmony_ci { "scache-idle-time", pa_config_parse_int, &c->scache_idle_time, NULL }, 58953a5a1b3Sopenharmony_ci { "realtime-priority", parse_rtprio, c, NULL }, 59053a5a1b3Sopenharmony_ci { "dl-search-path", pa_config_parse_string, &c->dl_search_path, NULL }, 59153a5a1b3Sopenharmony_ci { "default-script-file", pa_config_parse_string, &c->default_script_file, NULL }, 59253a5a1b3Sopenharmony_ci { "log-target", parse_log_target, c, NULL }, 59353a5a1b3Sopenharmony_ci { "log-level", parse_log_level, c, NULL }, 59453a5a1b3Sopenharmony_ci { "verbose", parse_log_level, c, NULL }, 59553a5a1b3Sopenharmony_ci { "resample-method", parse_resample_method, c, NULL }, 59653a5a1b3Sopenharmony_ci { "default-sample-format", parse_sample_format, c, NULL }, 59753a5a1b3Sopenharmony_ci { "default-sample-rate", parse_sample_rate, c, NULL }, 59853a5a1b3Sopenharmony_ci { "alternate-sample-rate", parse_alternate_sample_rate, c, NULL }, 59953a5a1b3Sopenharmony_ci { "default-sample-channels", parse_sample_channels, &ci, NULL }, 60053a5a1b3Sopenharmony_ci { "default-channel-map", parse_channel_map, &ci, NULL }, 60153a5a1b3Sopenharmony_ci { "default-fragments", parse_fragments, c, NULL }, 60253a5a1b3Sopenharmony_ci { "default-fragment-size-msec", parse_fragment_size_msec, c, NULL }, 60353a5a1b3Sopenharmony_ci { "deferred-volume-safety-margin-usec", 60453a5a1b3Sopenharmony_ci pa_config_parse_unsigned, &c->deferred_volume_safety_margin_usec, NULL }, 60553a5a1b3Sopenharmony_ci { "deferred-volume-extra-delay-usec", 60653a5a1b3Sopenharmony_ci pa_config_parse_int, &c->deferred_volume_extra_delay_usec, NULL }, 60753a5a1b3Sopenharmony_ci { "nice-level", parse_nice_level, c, NULL }, 60853a5a1b3Sopenharmony_ci { "avoid-resampling", pa_config_parse_bool, &c->avoid_resampling, NULL }, 60953a5a1b3Sopenharmony_ci { "disable-remixing", pa_config_parse_bool, &c->disable_remixing, NULL }, 61053a5a1b3Sopenharmony_ci { "enable-remixing", pa_config_parse_not_bool, &c->disable_remixing, NULL }, 61153a5a1b3Sopenharmony_ci { "remixing-use-all-sink-channels", 61253a5a1b3Sopenharmony_ci pa_config_parse_bool, &c->remixing_use_all_sink_channels, NULL }, 61353a5a1b3Sopenharmony_ci { "disable-lfe-remixing", parse_disable_lfe_remix, c, NULL }, 61453a5a1b3Sopenharmony_ci { "enable-lfe-remixing", parse_enable_lfe_remix, c, NULL }, 61553a5a1b3Sopenharmony_ci { "remixing-produce-lfe", pa_config_parse_bool, &c->remixing_produce_lfe, NULL }, 61653a5a1b3Sopenharmony_ci { "remixing-consume-lfe", pa_config_parse_bool, &c->remixing_consume_lfe, NULL }, 61753a5a1b3Sopenharmony_ci { "lfe-crossover-freq", pa_config_parse_unsigned, &c->lfe_crossover_freq, NULL }, 61853a5a1b3Sopenharmony_ci { "load-default-script-file", pa_config_parse_bool, &c->load_default_script_file, NULL }, 61953a5a1b3Sopenharmony_ci { "shm-size-bytes", pa_config_parse_size, &c->shm_size, NULL }, 62053a5a1b3Sopenharmony_ci { "log-meta", pa_config_parse_bool, &c->log_meta, NULL }, 62153a5a1b3Sopenharmony_ci { "log-time", pa_config_parse_bool, &c->log_time, NULL }, 62253a5a1b3Sopenharmony_ci { "log-backtrace", pa_config_parse_unsigned, &c->log_backtrace, NULL }, 62353a5a1b3Sopenharmony_ci#ifdef HAVE_SYS_RESOURCE_H 62453a5a1b3Sopenharmony_ci { "rlimit-fsize", parse_rlimit, &c->rlimit_fsize, NULL }, 62553a5a1b3Sopenharmony_ci { "rlimit-data", parse_rlimit, &c->rlimit_data, NULL }, 62653a5a1b3Sopenharmony_ci { "rlimit-stack", parse_rlimit, &c->rlimit_stack, NULL }, 62753a5a1b3Sopenharmony_ci { "rlimit-core", parse_rlimit, &c->rlimit_core, NULL }, 62853a5a1b3Sopenharmony_ci#ifdef RLIMIT_RSS 62953a5a1b3Sopenharmony_ci { "rlimit-rss", parse_rlimit, &c->rlimit_rss, NULL }, 63053a5a1b3Sopenharmony_ci#endif 63153a5a1b3Sopenharmony_ci#ifdef RLIMIT_NOFILE 63253a5a1b3Sopenharmony_ci { "rlimit-nofile", parse_rlimit, &c->rlimit_nofile, NULL }, 63353a5a1b3Sopenharmony_ci#endif 63453a5a1b3Sopenharmony_ci#ifdef RLIMIT_AS 63553a5a1b3Sopenharmony_ci { "rlimit-as", parse_rlimit, &c->rlimit_as, NULL }, 63653a5a1b3Sopenharmony_ci#endif 63753a5a1b3Sopenharmony_ci#ifdef RLIMIT_NPROC 63853a5a1b3Sopenharmony_ci { "rlimit-nproc", parse_rlimit, &c->rlimit_nproc, NULL }, 63953a5a1b3Sopenharmony_ci#endif 64053a5a1b3Sopenharmony_ci#ifdef RLIMIT_MEMLOCK 64153a5a1b3Sopenharmony_ci { "rlimit-memlock", parse_rlimit, &c->rlimit_memlock, NULL }, 64253a5a1b3Sopenharmony_ci#endif 64353a5a1b3Sopenharmony_ci#ifdef RLIMIT_LOCKS 64453a5a1b3Sopenharmony_ci { "rlimit-locks", parse_rlimit, &c->rlimit_locks, NULL }, 64553a5a1b3Sopenharmony_ci#endif 64653a5a1b3Sopenharmony_ci#ifdef RLIMIT_SIGPENDING 64753a5a1b3Sopenharmony_ci { "rlimit-sigpending", parse_rlimit, &c->rlimit_sigpending, NULL }, 64853a5a1b3Sopenharmony_ci#endif 64953a5a1b3Sopenharmony_ci#ifdef RLIMIT_MSGQUEUE 65053a5a1b3Sopenharmony_ci { "rlimit-msgqueue", parse_rlimit, &c->rlimit_msgqueue, NULL }, 65153a5a1b3Sopenharmony_ci#endif 65253a5a1b3Sopenharmony_ci#ifdef RLIMIT_NICE 65353a5a1b3Sopenharmony_ci { "rlimit-nice", parse_rlimit, &c->rlimit_nice, NULL }, 65453a5a1b3Sopenharmony_ci#endif 65553a5a1b3Sopenharmony_ci#ifdef RLIMIT_RTPRIO 65653a5a1b3Sopenharmony_ci { "rlimit-rtprio", parse_rlimit, &c->rlimit_rtprio, NULL }, 65753a5a1b3Sopenharmony_ci#endif 65853a5a1b3Sopenharmony_ci#ifdef RLIMIT_RTTIME 65953a5a1b3Sopenharmony_ci { "rlimit-rttime", parse_rlimit, &c->rlimit_rttime, NULL }, 66053a5a1b3Sopenharmony_ci#endif 66153a5a1b3Sopenharmony_ci#endif 66253a5a1b3Sopenharmony_ci { NULL, NULL, NULL, NULL }, 66353a5a1b3Sopenharmony_ci }; 66453a5a1b3Sopenharmony_ci 66553a5a1b3Sopenharmony_ci pa_xfree(c->config_file); 66653a5a1b3Sopenharmony_ci c->config_file = NULL; 66753a5a1b3Sopenharmony_ci 66853a5a1b3Sopenharmony_ci const char *default_config_file = DEFAULT_CONFIG_FILE; 66953a5a1b3Sopenharmony_ci#ifdef HAVE_RUNNING_FROM_BUILD_TREE 67053a5a1b3Sopenharmony_ci if (pa_run_from_build_tree()) { 67153a5a1b3Sopenharmony_ci pa_log_notice("Detected that we are run from the build tree, fixing default daemon.conf file path."); 67253a5a1b3Sopenharmony_ci#ifdef MESON_BUILD 67353a5a1b3Sopenharmony_ci default_config_file = PA_BUILDDIR PA_PATH_SEP "src" PA_PATH_SEP "daemon" PA_PATH_SEP "daemon.conf"; 67453a5a1b3Sopenharmony_ci#else 67553a5a1b3Sopenharmony_ci default_config_file = PA_BUILDDIR PA_PATH_SEP "daemon.conf"; 67653a5a1b3Sopenharmony_ci#endif // Endof #ifdef MESON_BUILD 67753a5a1b3Sopenharmony_ci } 67853a5a1b3Sopenharmony_ci#endif // Endof #ifdef HAVE_RUNNING_FROM_BUILD_TREE 67953a5a1b3Sopenharmony_ci 68053a5a1b3Sopenharmony_ci f = filename ? 68153a5a1b3Sopenharmony_ci pa_fopen_cloexec(c->config_file = pa_xstrdup(filename), "r") : 68253a5a1b3Sopenharmony_ci pa_open_config_file(default_config_file, DEFAULT_CONFIG_FILE_USER, ENV_CONFIG_FILE, &c->config_file); 68353a5a1b3Sopenharmony_ci 68453a5a1b3Sopenharmony_ci if (!f && errno != ENOENT) { 68553a5a1b3Sopenharmony_ci pa_log_warn(_("Failed to open configuration file: %s"), pa_cstrerror(errno)); 68653a5a1b3Sopenharmony_ci goto finish; 68753a5a1b3Sopenharmony_ci } 68853a5a1b3Sopenharmony_ci 68953a5a1b3Sopenharmony_ci ci.default_channel_map_set = ci.default_sample_spec_set = false; 69053a5a1b3Sopenharmony_ci ci.conf = c; 69153a5a1b3Sopenharmony_ci 69253a5a1b3Sopenharmony_ci r = f ? pa_config_parse(c->config_file, f, table, NULL, true, NULL) : 0; 69353a5a1b3Sopenharmony_ci 69453a5a1b3Sopenharmony_ci if (r >= 0) { 69553a5a1b3Sopenharmony_ci 69653a5a1b3Sopenharmony_ci /* Make sure that channel map and sample spec fit together */ 69753a5a1b3Sopenharmony_ci 69853a5a1b3Sopenharmony_ci if (ci.default_sample_spec_set && 69953a5a1b3Sopenharmony_ci ci.default_channel_map_set && 70053a5a1b3Sopenharmony_ci c->default_channel_map.channels != c->default_sample_spec.channels) { 70153a5a1b3Sopenharmony_ci pa_log_error(_("The specified default channel map has a different number of channels than the specified default number of channels.")); 70253a5a1b3Sopenharmony_ci r = -1; 70353a5a1b3Sopenharmony_ci goto finish; 70453a5a1b3Sopenharmony_ci } else if (ci.default_sample_spec_set) 70553a5a1b3Sopenharmony_ci pa_channel_map_init_extend(&c->default_channel_map, c->default_sample_spec.channels, PA_CHANNEL_MAP_DEFAULT); 70653a5a1b3Sopenharmony_ci else if (ci.default_channel_map_set) 70753a5a1b3Sopenharmony_ci c->default_sample_spec.channels = c->default_channel_map.channels; 70853a5a1b3Sopenharmony_ci } 70953a5a1b3Sopenharmony_ci 71053a5a1b3Sopenharmony_cifinish: 71153a5a1b3Sopenharmony_ci if (f) 71253a5a1b3Sopenharmony_ci fclose(f); 71353a5a1b3Sopenharmony_ci 71453a5a1b3Sopenharmony_ci return r; 71553a5a1b3Sopenharmony_ci} 71653a5a1b3Sopenharmony_ci 71753a5a1b3Sopenharmony_ciint pa_daemon_conf_env(pa_daemon_conf *c) { 71853a5a1b3Sopenharmony_ci char *e; 71953a5a1b3Sopenharmony_ci pa_assert(c); 72053a5a1b3Sopenharmony_ci 72153a5a1b3Sopenharmony_ci if ((e = getenv(ENV_DL_SEARCH_PATH))) { 72253a5a1b3Sopenharmony_ci pa_xfree(c->dl_search_path); 72353a5a1b3Sopenharmony_ci c->dl_search_path = pa_xstrdup(e); 72453a5a1b3Sopenharmony_ci } 72553a5a1b3Sopenharmony_ci if ((e = getenv(ENV_SCRIPT_FILE))) { 72653a5a1b3Sopenharmony_ci pa_xfree(c->default_script_file); 72753a5a1b3Sopenharmony_ci c->default_script_file = pa_xstrdup(e); 72853a5a1b3Sopenharmony_ci } 72953a5a1b3Sopenharmony_ci 73053a5a1b3Sopenharmony_ci return 0; 73153a5a1b3Sopenharmony_ci} 73253a5a1b3Sopenharmony_ci 73353a5a1b3Sopenharmony_ciconst char *pa_daemon_conf_get_default_script_file(pa_daemon_conf *c) { 73453a5a1b3Sopenharmony_ci pa_assert(c); 73553a5a1b3Sopenharmony_ci 73653a5a1b3Sopenharmony_ci if (!c->default_script_file) { 73753a5a1b3Sopenharmony_ci if (c->system_instance) 73853a5a1b3Sopenharmony_ci c->default_script_file = pa_find_config_file(DEFAULT_SYSTEM_SCRIPT_FILE, NULL, ENV_SCRIPT_FILE); 73953a5a1b3Sopenharmony_ci else 74053a5a1b3Sopenharmony_ci c->default_script_file = pa_find_config_file(DEFAULT_SCRIPT_FILE, DEFAULT_SCRIPT_FILE_USER, ENV_SCRIPT_FILE); 74153a5a1b3Sopenharmony_ci } 74253a5a1b3Sopenharmony_ci 74353a5a1b3Sopenharmony_ci return c->default_script_file; 74453a5a1b3Sopenharmony_ci} 74553a5a1b3Sopenharmony_ci 74653a5a1b3Sopenharmony_ciFILE *pa_daemon_conf_open_default_script_file(pa_daemon_conf *c) { 74753a5a1b3Sopenharmony_ci FILE *f; 74853a5a1b3Sopenharmony_ci pa_assert(c); 74953a5a1b3Sopenharmony_ci 75053a5a1b3Sopenharmony_ci if (!c->default_script_file) { 75153a5a1b3Sopenharmony_ci if (c->system_instance) 75253a5a1b3Sopenharmony_ci f = pa_open_config_file(DEFAULT_SYSTEM_SCRIPT_FILE, NULL, ENV_SCRIPT_FILE, &c->default_script_file); 75353a5a1b3Sopenharmony_ci else 75453a5a1b3Sopenharmony_ci f = pa_open_config_file(DEFAULT_SCRIPT_FILE, DEFAULT_SCRIPT_FILE_USER, ENV_SCRIPT_FILE, &c->default_script_file); 75553a5a1b3Sopenharmony_ci } else 75653a5a1b3Sopenharmony_ci f = pa_fopen_cloexec(c->default_script_file, "r"); 75753a5a1b3Sopenharmony_ci 75853a5a1b3Sopenharmony_ci return f; 75953a5a1b3Sopenharmony_ci} 76053a5a1b3Sopenharmony_ci 76153a5a1b3Sopenharmony_cichar *pa_daemon_conf_dump(pa_daemon_conf *c) { 76253a5a1b3Sopenharmony_ci static const char* const log_level_to_string[] = { 76353a5a1b3Sopenharmony_ci [PA_LOG_DEBUG] = "debug", 76453a5a1b3Sopenharmony_ci [PA_LOG_INFO] = "info", 76553a5a1b3Sopenharmony_ci [PA_LOG_NOTICE] = "notice", 76653a5a1b3Sopenharmony_ci [PA_LOG_WARN] = "warning", 76753a5a1b3Sopenharmony_ci [PA_LOG_ERROR] = "error" 76853a5a1b3Sopenharmony_ci }; 76953a5a1b3Sopenharmony_ci 77053a5a1b3Sopenharmony_ci#ifdef HAVE_DBUS 77153a5a1b3Sopenharmony_ci static const char* const server_type_to_string[] = { 77253a5a1b3Sopenharmony_ci [PA_SERVER_TYPE_UNSET] = "!!UNSET!!", 77353a5a1b3Sopenharmony_ci [PA_SERVER_TYPE_USER] = "user", 77453a5a1b3Sopenharmony_ci [PA_SERVER_TYPE_SYSTEM] = "system", 77553a5a1b3Sopenharmony_ci [PA_SERVER_TYPE_NONE] = "none" 77653a5a1b3Sopenharmony_ci }; 77753a5a1b3Sopenharmony_ci#endif 77853a5a1b3Sopenharmony_ci 77953a5a1b3Sopenharmony_ci pa_strbuf *s; 78053a5a1b3Sopenharmony_ci char cm[PA_CHANNEL_MAP_SNPRINT_MAX]; 78153a5a1b3Sopenharmony_ci char *log_target = NULL; 78253a5a1b3Sopenharmony_ci 78353a5a1b3Sopenharmony_ci pa_assert(c); 78453a5a1b3Sopenharmony_ci 78553a5a1b3Sopenharmony_ci s = pa_strbuf_new(); 78653a5a1b3Sopenharmony_ci 78753a5a1b3Sopenharmony_ci if (c->config_file) 78853a5a1b3Sopenharmony_ci pa_strbuf_printf(s, _("### Read from configuration file: %s ###\n"), c->config_file); 78953a5a1b3Sopenharmony_ci 79053a5a1b3Sopenharmony_ci pa_assert(c->log_level < PA_LOG_LEVEL_MAX); 79153a5a1b3Sopenharmony_ci 79253a5a1b3Sopenharmony_ci if (c->log_target) 79353a5a1b3Sopenharmony_ci log_target = pa_log_target_to_string(c->log_target); 79453a5a1b3Sopenharmony_ci 79553a5a1b3Sopenharmony_ci pa_strbuf_printf(s, "daemonize = %s\n", pa_yes_no(c->daemonize)); 79653a5a1b3Sopenharmony_ci pa_strbuf_printf(s, "fail = %s\n", pa_yes_no(c->fail)); 79753a5a1b3Sopenharmony_ci pa_strbuf_printf(s, "high-priority = %s\n", pa_yes_no(c->high_priority)); 79853a5a1b3Sopenharmony_ci pa_strbuf_printf(s, "nice-level = %i\n", c->nice_level); 79953a5a1b3Sopenharmony_ci pa_strbuf_printf(s, "realtime-scheduling = %s\n", pa_yes_no(c->realtime_scheduling)); 80053a5a1b3Sopenharmony_ci pa_strbuf_printf(s, "realtime-priority = %i\n", c->realtime_priority); 80153a5a1b3Sopenharmony_ci pa_strbuf_printf(s, "allow-module-loading = %s\n", pa_yes_no(!c->disallow_module_loading)); 80253a5a1b3Sopenharmony_ci pa_strbuf_printf(s, "allow-exit = %s\n", pa_yes_no(!c->disallow_exit)); 80353a5a1b3Sopenharmony_ci pa_strbuf_printf(s, "use-pid-file = %s\n", pa_yes_no(c->use_pid_file)); 80453a5a1b3Sopenharmony_ci pa_strbuf_printf(s, "system-instance = %s\n", pa_yes_no(c->system_instance)); 80553a5a1b3Sopenharmony_ci#ifdef HAVE_DBUS 80653a5a1b3Sopenharmony_ci pa_strbuf_printf(s, "local-server-type = %s\n", server_type_to_string[c->local_server_type]); 80753a5a1b3Sopenharmony_ci#endif 80853a5a1b3Sopenharmony_ci pa_strbuf_printf(s, "cpu-limit = %s\n", pa_yes_no(!c->no_cpu_limit)); 80953a5a1b3Sopenharmony_ci pa_strbuf_printf(s, "enable-shm = %s\n", pa_yes_no(!c->disable_shm)); 81053a5a1b3Sopenharmony_ci pa_strbuf_printf(s, "flat-volumes = %s\n", pa_yes_no(c->flat_volumes)); 81153a5a1b3Sopenharmony_ci pa_strbuf_printf(s, "rescue-streams = %s\n", pa_yes_no(c->rescue_streams)); 81253a5a1b3Sopenharmony_ci pa_strbuf_printf(s, "lock-memory = %s\n", pa_yes_no(c->lock_memory)); 81353a5a1b3Sopenharmony_ci pa_strbuf_printf(s, "exit-idle-time = %i\n", c->exit_idle_time); 81453a5a1b3Sopenharmony_ci pa_strbuf_printf(s, "scache-idle-time = %i\n", c->scache_idle_time); 81553a5a1b3Sopenharmony_ci pa_strbuf_printf(s, "dl-search-path = %s\n", pa_strempty(c->dl_search_path)); 81653a5a1b3Sopenharmony_ci pa_strbuf_printf(s, "default-script-file = %s\n", pa_strempty(pa_daemon_conf_get_default_script_file(c))); 81753a5a1b3Sopenharmony_ci pa_strbuf_printf(s, "load-default-script-file = %s\n", pa_yes_no(c->load_default_script_file)); 81853a5a1b3Sopenharmony_ci pa_strbuf_printf(s, "log-target = %s\n", pa_strempty(log_target)); 81953a5a1b3Sopenharmony_ci pa_strbuf_printf(s, "log-level = %s\n", log_level_to_string[c->log_level]); 82053a5a1b3Sopenharmony_ci pa_strbuf_printf(s, "resample-method = %s\n", pa_resample_method_to_string(c->resample_method)); 82153a5a1b3Sopenharmony_ci pa_strbuf_printf(s, "avoid-resampling = %s\n", pa_yes_no(c->avoid_resampling)); 82253a5a1b3Sopenharmony_ci pa_strbuf_printf(s, "enable-remixing = %s\n", pa_yes_no(!c->disable_remixing)); 82353a5a1b3Sopenharmony_ci pa_strbuf_printf(s, "remixing-use-all-sink-channels = %s\n", pa_yes_no(c->remixing_use_all_sink_channels)); 82453a5a1b3Sopenharmony_ci pa_strbuf_printf(s, "remixing-produce-lfe = %s\n", pa_yes_no(c->remixing_produce_lfe)); 82553a5a1b3Sopenharmony_ci pa_strbuf_printf(s, "remixing-consume-lfe = %s\n", pa_yes_no(c->remixing_consume_lfe)); 82653a5a1b3Sopenharmony_ci pa_strbuf_printf(s, "lfe-crossover-freq = %u\n", c->lfe_crossover_freq); 82753a5a1b3Sopenharmony_ci pa_strbuf_printf(s, "default-sample-format = %s\n", pa_sample_format_to_string(c->default_sample_spec.format)); 82853a5a1b3Sopenharmony_ci pa_strbuf_printf(s, "default-sample-rate = %u\n", c->default_sample_spec.rate); 82953a5a1b3Sopenharmony_ci pa_strbuf_printf(s, "alternate-sample-rate = %u\n", c->alternate_sample_rate); 83053a5a1b3Sopenharmony_ci pa_strbuf_printf(s, "default-sample-channels = %u\n", c->default_sample_spec.channels); 83153a5a1b3Sopenharmony_ci pa_strbuf_printf(s, "default-channel-map = %s\n", pa_channel_map_snprint(cm, sizeof(cm), &c->default_channel_map)); 83253a5a1b3Sopenharmony_ci pa_strbuf_printf(s, "default-fragments = %u\n", c->default_n_fragments); 83353a5a1b3Sopenharmony_ci pa_strbuf_printf(s, "default-fragment-size-msec = %u\n", c->default_fragment_size_msec); 83453a5a1b3Sopenharmony_ci pa_strbuf_printf(s, "enable-deferred-volume = %s\n", pa_yes_no(c->deferred_volume)); 83553a5a1b3Sopenharmony_ci pa_strbuf_printf(s, "deferred-volume-safety-margin-usec = %u\n", c->deferred_volume_safety_margin_usec); 83653a5a1b3Sopenharmony_ci pa_strbuf_printf(s, "deferred-volume-extra-delay-usec = %d\n", c->deferred_volume_extra_delay_usec); 83753a5a1b3Sopenharmony_ci pa_strbuf_printf(s, "shm-size-bytes = %lu\n", (unsigned long) c->shm_size); 83853a5a1b3Sopenharmony_ci pa_strbuf_printf(s, "log-meta = %s\n", pa_yes_no(c->log_meta)); 83953a5a1b3Sopenharmony_ci pa_strbuf_printf(s, "log-time = %s\n", pa_yes_no(c->log_time)); 84053a5a1b3Sopenharmony_ci pa_strbuf_printf(s, "log-backtrace = %u\n", c->log_backtrace); 84153a5a1b3Sopenharmony_ci#ifdef HAVE_SYS_RESOURCE_H 84253a5a1b3Sopenharmony_ci pa_strbuf_printf(s, "rlimit-fsize = %li\n", c->rlimit_fsize.is_set ? (long int) c->rlimit_fsize.value : -1); 84353a5a1b3Sopenharmony_ci pa_strbuf_printf(s, "rlimit-data = %li\n", c->rlimit_data.is_set ? (long int) c->rlimit_data.value : -1); 84453a5a1b3Sopenharmony_ci pa_strbuf_printf(s, "rlimit-stack = %li\n", c->rlimit_stack.is_set ? (long int) c->rlimit_stack.value : -1); 84553a5a1b3Sopenharmony_ci pa_strbuf_printf(s, "rlimit-core = %li\n", c->rlimit_core.is_set ? (long int) c->rlimit_core.value : -1); 84653a5a1b3Sopenharmony_ci#ifdef RLIMIT_RSS 84753a5a1b3Sopenharmony_ci pa_strbuf_printf(s, "rlimit-rss = %li\n", c->rlimit_rss.is_set ? (long int) c->rlimit_rss.value : -1); 84853a5a1b3Sopenharmony_ci#endif 84953a5a1b3Sopenharmony_ci#ifdef RLIMIT_AS 85053a5a1b3Sopenharmony_ci pa_strbuf_printf(s, "rlimit-as = %li\n", c->rlimit_as.is_set ? (long int) c->rlimit_as.value : -1); 85153a5a1b3Sopenharmony_ci#endif 85253a5a1b3Sopenharmony_ci#ifdef RLIMIT_NPROC 85353a5a1b3Sopenharmony_ci pa_strbuf_printf(s, "rlimit-nproc = %li\n", c->rlimit_nproc.is_set ? (long int) c->rlimit_nproc.value : -1); 85453a5a1b3Sopenharmony_ci#endif 85553a5a1b3Sopenharmony_ci#ifdef RLIMIT_NOFILE 85653a5a1b3Sopenharmony_ci pa_strbuf_printf(s, "rlimit-nofile = %li\n", c->rlimit_nofile.is_set ? (long int) c->rlimit_nofile.value : -1); 85753a5a1b3Sopenharmony_ci#endif 85853a5a1b3Sopenharmony_ci#ifdef RLIMIT_MEMLOCK 85953a5a1b3Sopenharmony_ci pa_strbuf_printf(s, "rlimit-memlock = %li\n", c->rlimit_memlock.is_set ? (long int) c->rlimit_memlock.value : -1); 86053a5a1b3Sopenharmony_ci#endif 86153a5a1b3Sopenharmony_ci#ifdef RLIMIT_LOCKS 86253a5a1b3Sopenharmony_ci pa_strbuf_printf(s, "rlimit-locks = %li\n", c->rlimit_locks.is_set ? (long int) c->rlimit_locks.value : -1); 86353a5a1b3Sopenharmony_ci#endif 86453a5a1b3Sopenharmony_ci#ifdef RLIMIT_SIGPENDING 86553a5a1b3Sopenharmony_ci pa_strbuf_printf(s, "rlimit-sigpending = %li\n", c->rlimit_sigpending.is_set ? (long int) c->rlimit_sigpending.value : -1); 86653a5a1b3Sopenharmony_ci#endif 86753a5a1b3Sopenharmony_ci#ifdef RLIMIT_MSGQUEUE 86853a5a1b3Sopenharmony_ci pa_strbuf_printf(s, "rlimit-msgqueue = %li\n", c->rlimit_msgqueue.is_set ? (long int) c->rlimit_msgqueue.value : -1); 86953a5a1b3Sopenharmony_ci#endif 87053a5a1b3Sopenharmony_ci#ifdef RLIMIT_NICE 87153a5a1b3Sopenharmony_ci pa_strbuf_printf(s, "rlimit-nice = %li\n", c->rlimit_nice.is_set ? (long int) c->rlimit_nice.value : -1); 87253a5a1b3Sopenharmony_ci#endif 87353a5a1b3Sopenharmony_ci#ifdef RLIMIT_RTPRIO 87453a5a1b3Sopenharmony_ci pa_strbuf_printf(s, "rlimit-rtprio = %li\n", c->rlimit_rtprio.is_set ? (long int) c->rlimit_rtprio.value : -1); 87553a5a1b3Sopenharmony_ci#endif 87653a5a1b3Sopenharmony_ci#ifdef RLIMIT_RTTIME 87753a5a1b3Sopenharmony_ci pa_strbuf_printf(s, "rlimit-rttime = %li\n", c->rlimit_rttime.is_set ? (long int) c->rlimit_rttime.value : -1); 87853a5a1b3Sopenharmony_ci#endif 87953a5a1b3Sopenharmony_ci#endif 88053a5a1b3Sopenharmony_ci 88153a5a1b3Sopenharmony_ci pa_xfree(log_target); 88253a5a1b3Sopenharmony_ci 88353a5a1b3Sopenharmony_ci return pa_strbuf_to_string_free(s); 88453a5a1b3Sopenharmony_ci} 885