2 This file is part of PulseAudio.
4 Copyright 2004-2006 Lennart Poettering
5 Copyright 2006 Pierre Ossman <ossman@cendio.se> for Cendio AB
7 PulseAudio is free software; you can redistribute it and/or modify
8 it under the terms of the GNU Lesser General Public License as published
9 by the Free Software Foundation; either version 2.1 of the License,
10 or (at your option) any later version.
12 PulseAudio is distributed in the hope that it will be useful, but
13 WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 General Public License for more details.
17 You should have received a copy of the GNU Lesser General Public License
18 along with PulseAudio; if not, write to the Free Software
19 Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
33 #include <pulse/xmalloc.h>
34 #include <pulse/timeval.h>
35 #include <pulse/i18n.h>
37 #include <pulsecore/core-error.h>
38 #include <pulsecore/core-util.h>
39 #include <pulsecore/strbuf.h>
40 #include <pulsecore/conf-parser.h>
41 #include <pulsecore/resampler.h>
42 #include <pulsecore/macro.h>
44 #include "daemon-conf.h"
46 #define DEFAULT_SCRIPT_FILE PA_DEFAULT_CONFIG_DIR PA_PATH_SEP "default.pa"
47 #define DEFAULT_SCRIPT_FILE_USER PA_PATH_SEP "default.pa"
48 #define DEFAULT_SYSTEM_SCRIPT_FILE PA_DEFAULT_CONFIG_DIR PA_PATH_SEP "system.pa"
50 #define DEFAULT_CONFIG_FILE PA_DEFAULT_CONFIG_DIR PA_PATH_SEP "daemon.conf"
51 #define DEFAULT_CONFIG_FILE_USER PA_PATH_SEP "daemon.conf"
53 #define ENV_SCRIPT_FILE "PULSE_SCRIPT"
54 #define ENV_CONFIG_FILE "PULSE_CONFIG"
55 #define ENV_DL_SEARCH_PATH "PULSE_DLPATH"
57 static const pa_daemon_conf default_conf
= {
61 .high_priority
= TRUE
,
63 .realtime_scheduling
= FALSE
,
64 .realtime_priority
= 5, /* Half of JACK's default rtprio */
65 .disallow_module_loading
= FALSE
,
66 .disallow_exit
= FALSE
,
69 .scache_idle_time
= 20,
71 .script_commands
= NULL
,
72 .dl_search_path
= NULL
,
73 .load_default_script_file
= TRUE
,
74 .default_script_file
= NULL
,
75 .log_target
= PA_LOG_SYSLOG
,
76 .log_level
= PA_LOG_NOTICE
,
80 .resample_method
= PA_RESAMPLER_AUTO
,
81 .disable_remixing
= FALSE
,
82 .disable_lfe_remixing
= TRUE
,
85 .system_instance
= FALSE
,
86 .no_cpu_limit
= FALSE
,
88 .default_n_fragments
= 4,
89 .default_fragment_size_msec
= 25,
90 .default_sample_spec
= { .format
= PA_SAMPLE_S16NE
, .rate
= 44100, .channels
= 2 },
91 .default_channel_map
= { .channels
= 2, .map
= { PA_CHANNEL_POSITION_LEFT
, PA_CHANNEL_POSITION_RIGHT
} },
93 #ifdef HAVE_SYS_RESOURCE_H
94 ,.rlimit_fsize
= { .value
= 0, .is_set
= FALSE
},
95 .rlimit_data
= { .value
= 0, .is_set
= FALSE
},
96 .rlimit_stack
= { .value
= 0, .is_set
= FALSE
},
97 .rlimit_core
= { .value
= 0, .is_set
= FALSE
}
99 ,.rlimit_rss
= { .value
= 0, .is_set
= FALSE
}
102 ,.rlimit_nproc
= { .value
= 0, .is_set
= FALSE
}
105 ,.rlimit_nofile
= { .value
= 256, .is_set
= TRUE
}
107 #ifdef RLIMIT_MEMLOCK
108 ,.rlimit_memlock
= { .value
= 0, .is_set
= FALSE
}
111 ,.rlimit_as
= { .value
= 0, .is_set
= FALSE
}
114 ,.rlimit_locks
= { .value
= 0, .is_set
= FALSE
}
116 #ifdef RLIMIT_SIGPENDING
117 ,.rlimit_sigpending
= { .value
= 0, .is_set
= FALSE
}
119 #ifdef RLIMIT_MSGQUEUE
120 ,.rlimit_msgqueue
= { .value
= 0, .is_set
= FALSE
}
123 ,.rlimit_nice
= { .value
= 31, .is_set
= TRUE
} /* nice level of -11 */
126 ,.rlimit_rtprio
= { .value
= 9, .is_set
= TRUE
} /* One below JACK's default for the server */
129 ,.rlimit_rttime
= { .value
= PA_USEC_PER_SEC
, .is_set
= TRUE
}
134 pa_daemon_conf
* pa_daemon_conf_new(void) {
135 pa_daemon_conf
*c
= pa_xnewdup(pa_daemon_conf
, &default_conf
, 1);
137 c
->dl_search_path
= pa_xstrdup(PA_DLSEARCHPATH
);
141 void pa_daemon_conf_free(pa_daemon_conf
*c
) {
143 pa_xfree(c
->script_commands
);
144 pa_xfree(c
->dl_search_path
);
145 pa_xfree(c
->default_script_file
);
146 pa_xfree(c
->config_file
);
150 int pa_daemon_conf_set_log_target(pa_daemon_conf
*c
, const char *string
) {
154 if (!strcmp(string
, "auto"))
155 c
->auto_log_target
= 1;
156 else if (!strcmp(string
, "syslog")) {
157 c
->auto_log_target
= 0;
158 c
->log_target
= PA_LOG_SYSLOG
;
159 } else if (!strcmp(string
, "stderr")) {
160 c
->auto_log_target
= 0;
161 c
->log_target
= PA_LOG_STDERR
;
168 int pa_daemon_conf_set_log_level(pa_daemon_conf
*c
, const char *string
) {
173 if (pa_atou(string
, &u
) >= 0) {
174 if (u
>= PA_LOG_LEVEL_MAX
)
177 c
->log_level
= (pa_log_level_t
) u
;
178 } else if (pa_startswith(string
, "debug"))
179 c
->log_level
= PA_LOG_DEBUG
;
180 else if (pa_startswith(string
, "info"))
181 c
->log_level
= PA_LOG_INFO
;
182 else if (pa_startswith(string
, "notice"))
183 c
->log_level
= PA_LOG_NOTICE
;
184 else if (pa_startswith(string
, "warn"))
185 c
->log_level
= PA_LOG_WARN
;
186 else if (pa_startswith(string
, "err"))
187 c
->log_level
= PA_LOG_ERROR
;
194 int pa_daemon_conf_set_resample_method(pa_daemon_conf
*c
, const char *string
) {
199 if ((m
= pa_parse_resample_method(string
)) < 0)
202 c
->resample_method
= m
;
206 static int parse_log_target(const char *filename
, unsigned line
, const char *section
, const char *lvalue
, const char *rvalue
, void *data
, void *userdata
) {
207 pa_daemon_conf
*c
= data
;
214 if (pa_daemon_conf_set_log_target(c
, rvalue
) < 0) {
215 pa_log(_("[%s:%u] Invalid log target '%s'."), filename
, line
, rvalue
);
222 static int parse_log_level(const char *filename
, unsigned line
, const char *section
, const char *lvalue
, const char *rvalue
, void *data
, void *userdata
) {
223 pa_daemon_conf
*c
= data
;
230 if (pa_daemon_conf_set_log_level(c
, rvalue
) < 0) {
231 pa_log(_("[%s:%u] Invalid log level '%s'."), filename
, line
, rvalue
);
238 static int parse_resample_method(const char *filename
, unsigned line
, const char *section
, const char *lvalue
, const char *rvalue
, void *data
, void *userdata
) {
239 pa_daemon_conf
*c
= data
;
246 if (pa_daemon_conf_set_resample_method(c
, rvalue
) < 0) {
247 pa_log(_("[%s:%u] Invalid resample method '%s'."), filename
, line
, rvalue
);
254 static int parse_rlimit(const char *filename
, unsigned line
, const char *section
, const char *lvalue
, const char *rvalue
, void *data
, void *userdata
) {
255 #ifdef HAVE_SYS_RESOURCE_H
256 struct pa_rlimit
*r
= data
;
263 if (rvalue
[strspn(rvalue
, "\t ")] == 0) {
269 if (pa_atoi(rvalue
, &k
) < 0) {
270 pa_log(_("[%s:%u] Invalid rlimit '%s'."), filename
, line
, rvalue
);
274 r
->value
= k
>= 0 ? (rlim_t
) k
: 0;
277 pa_log_warn(_("[%s:%u] rlimit not supported on this platform."), filename
, line
);
283 static int parse_sample_format(const char *filename
, unsigned line
, const char *section
, const char *lvalue
, const char *rvalue
, void *data
, void *userdata
) {
284 pa_daemon_conf
*c
= data
;
285 pa_sample_format_t f
;
292 if ((f
= pa_parse_sample_format(rvalue
)) < 0) {
293 pa_log(_("[%s:%u] Invalid sample format '%s'."), filename
, line
, rvalue
);
297 c
->default_sample_spec
.format
= f
;
301 static int parse_sample_rate(const char *filename
, unsigned line
, const char *section
, const char *lvalue
, const char *rvalue
, void *data
, void *userdata
) {
302 pa_daemon_conf
*c
= data
;
310 if (pa_atou(rvalue
, &r
) < 0 || r
> (uint32_t) PA_RATE_MAX
|| r
<= 0) {
311 pa_log(_("[%s:%u] Invalid sample rate '%s'."), filename
, line
, rvalue
);
315 c
->default_sample_spec
.rate
= r
;
319 struct channel_conf_info
{
320 pa_daemon_conf
*conf
;
321 pa_bool_t default_sample_spec_set
;
322 pa_bool_t default_channel_map_set
;
325 static int parse_sample_channels(const char *filename
, unsigned line
, const char *section
, const char *lvalue
, const char *rvalue
, void *data
, void *userdata
) {
326 struct channel_conf_info
*i
= data
;
334 if (pa_atoi(rvalue
, &n
) < 0 || n
> (int32_t) PA_CHANNELS_MAX
|| n
<= 0) {
335 pa_log(_("[%s:%u] Invalid sample channels '%s'."), filename
, line
, rvalue
);
339 i
->conf
->default_sample_spec
.channels
= (uint8_t) n
;
340 i
->default_sample_spec_set
= TRUE
;
344 static int parse_channel_map(const char *filename
, unsigned line
, const char *section
, const char *lvalue
, const char *rvalue
, void *data
, void *userdata
) {
345 struct channel_conf_info
*i
= data
;
352 if (!pa_channel_map_parse(&i
->conf
->default_channel_map
, rvalue
)) {
353 pa_log(_("[%s:%u] Invalid channel map '%s'."), filename
, line
, rvalue
);
357 i
->default_channel_map_set
= TRUE
;
361 static int parse_fragments(const char *filename
, unsigned line
, const char *section
, const char *lvalue
, const char *rvalue
, void *data
, void *userdata
) {
362 pa_daemon_conf
*c
= data
;
370 if (pa_atoi(rvalue
, &n
) < 0 || n
< 2) {
371 pa_log(_("[%s:%u] Invalid number of fragments '%s'."), filename
, line
, rvalue
);
375 c
->default_n_fragments
= (unsigned) n
;
379 static int parse_fragment_size_msec(const char *filename
, unsigned line
, const char *section
, const char *lvalue
, const char *rvalue
, void *data
, void *userdata
) {
380 pa_daemon_conf
*c
= data
;
388 if (pa_atoi(rvalue
, &n
) < 0 || n
< 1) {
389 pa_log(_("[%s:%u] Invalid fragment size '%s'."), filename
, line
, rvalue
);
393 c
->default_fragment_size_msec
= (unsigned) n
;
397 static int parse_nice_level(const char *filename
, unsigned line
, const char *section
, const char *lvalue
, const char *rvalue
, void *data
, void *userdata
) {
398 pa_daemon_conf
*c
= data
;
406 if (pa_atoi(rvalue
, &level
) < 0 || level
< -20 || level
> 19) {
407 pa_log(_("[%s:%u] Invalid nice level '%s'."), filename
, line
, rvalue
);
411 c
->nice_level
= (int) level
;
415 static int parse_rtprio(const char *filename
, unsigned line
, const char *section
, const char *lvalue
, const char *rvalue
, void *data
, void *userdata
) {
416 pa_daemon_conf
*c
= data
;
424 if (pa_atoi(rvalue
, &rtprio
) < 0 || rtprio
< sched_get_priority_min(SCHED_FIFO
) || rtprio
> sched_get_priority_max(SCHED_FIFO
)) {
425 pa_log("[%s:%u] Invalid realtime priority '%s'.", filename
, line
, rvalue
);
429 c
->realtime_priority
= (int) rtprio
;
433 int pa_daemon_conf_load(pa_daemon_conf
*c
, const char *filename
) {
436 struct channel_conf_info ci
;
437 pa_config_item table
[] = {
438 { "daemonize", pa_config_parse_bool
, &c
->daemonize
, NULL
},
439 { "fail", pa_config_parse_bool
, &c
->fail
, NULL
},
440 { "high-priority", pa_config_parse_bool
, &c
->high_priority
, NULL
},
441 { "realtime-scheduling", pa_config_parse_bool
, &c
->realtime_scheduling
, NULL
},
442 { "disallow-module-loading", pa_config_parse_bool
, &c
->disallow_module_loading
, NULL
},
443 { "disallow-exit", pa_config_parse_bool
, &c
->disallow_exit
, NULL
},
444 { "use-pid-file", pa_config_parse_bool
, &c
->use_pid_file
, NULL
},
445 { "system-instance", pa_config_parse_bool
, &c
->system_instance
, NULL
},
446 { "no-cpu-limit", pa_config_parse_bool
, &c
->no_cpu_limit
, NULL
},
447 { "disable-shm", pa_config_parse_bool
, &c
->disable_shm
, NULL
},
448 { "flat-volumes", pa_config_parse_bool
, &c
->flat_volumes
, NULL
},
449 { "exit-idle-time", pa_config_parse_int
, &c
->exit_idle_time
, NULL
},
450 { "scache-idle-time", pa_config_parse_int
, &c
->scache_idle_time
, NULL
},
451 { "realtime-priority", parse_rtprio
, c
, NULL
},
452 { "dl-search-path", pa_config_parse_string
, &c
->dl_search_path
, NULL
},
453 { "default-script-file", pa_config_parse_string
, &c
->default_script_file
, NULL
},
454 { "log-target", parse_log_target
, c
, NULL
},
455 { "log-level", parse_log_level
, c
, NULL
},
456 { "verbose", parse_log_level
, c
, NULL
},
457 { "resample-method", parse_resample_method
, c
, NULL
},
458 { "default-sample-format", parse_sample_format
, c
, NULL
},
459 { "default-sample-rate", parse_sample_rate
, c
, NULL
},
460 { "default-sample-channels", parse_sample_channels
, &ci
, NULL
},
461 { "default-channel-map", parse_channel_map
, &ci
, NULL
},
462 { "default-fragments", parse_fragments
, c
, NULL
},
463 { "default-fragment-size-msec", parse_fragment_size_msec
, c
, NULL
},
464 { "nice-level", parse_nice_level
, c
, NULL
},
465 { "disable-remixing", pa_config_parse_bool
, &c
->disable_remixing
, NULL
},
466 { "disable-lfe-remixing", pa_config_parse_bool
, &c
->disable_lfe_remixing
, NULL
},
467 { "load-default-script-file", pa_config_parse_bool
, &c
->load_default_script_file
, NULL
},
468 { "shm-size-bytes", pa_config_parse_size
, &c
->shm_size
, NULL
},
469 { "log-meta", pa_config_parse_bool
, &c
->log_meta
, NULL
},
470 { "log-time", pa_config_parse_bool
, &c
->log_time
, NULL
},
471 { "log-backtrace", pa_config_parse_unsigned
, &c
->log_backtrace
, NULL
},
472 #ifdef HAVE_SYS_RESOURCE_H
473 { "rlimit-fsize", parse_rlimit
, &c
->rlimit_fsize
, NULL
},
474 { "rlimit-data", parse_rlimit
, &c
->rlimit_data
, NULL
},
475 { "rlimit-stack", parse_rlimit
, &c
->rlimit_stack
, NULL
},
476 { "rlimit-core", parse_rlimit
, &c
->rlimit_core
, NULL
},
478 { "rlimit-rss", parse_rlimit
, &c
->rlimit_rss
, NULL
},
481 { "rlimit-nofile", parse_rlimit
, &c
->rlimit_nofile
, NULL
},
484 { "rlimit-as", parse_rlimit
, &c
->rlimit_as
, NULL
},
487 { "rlimit-nproc", parse_rlimit
, &c
->rlimit_nproc
, NULL
},
489 #ifdef RLIMIT_MEMLOCK
490 { "rlimit-memlock", parse_rlimit
, &c
->rlimit_memlock
, NULL
},
493 { "rlimit-locks", parse_rlimit
, &c
->rlimit_locks
, NULL
},
495 #ifdef RLIMIT_SIGPENDING
496 { "rlimit-sigpending", parse_rlimit
, &c
->rlimit_sigpending
, NULL
},
498 #ifdef RLIMIT_MSGQUEUE
499 { "rlimit-msgqueue", parse_rlimit
, &c
->rlimit_msgqueue
, NULL
},
502 { "rlimit-nice", parse_rlimit
, &c
->rlimit_nice
, NULL
},
505 { "rlimit-rtprio", parse_rlimit
, &c
->rlimit_rtprio
, NULL
},
508 { "rlimit-rttime", parse_rlimit
, &c
->rlimit_rttime
, NULL
},
511 { NULL
, NULL
, NULL
, NULL
},
514 pa_xfree(c
->config_file
);
515 c
->config_file
= NULL
;
518 fopen(c
->config_file
= pa_xstrdup(filename
), "r") :
519 pa_open_config_file(DEFAULT_CONFIG_FILE
, DEFAULT_CONFIG_FILE_USER
, ENV_CONFIG_FILE
, &c
->config_file
);
521 if (!f
&& errno
!= ENOENT
) {
522 pa_log_warn(_("Failed to open configuration file: %s"), pa_cstrerror(errno
));
526 ci
.default_channel_map_set
= ci
.default_sample_spec_set
= FALSE
;
529 r
= f
? pa_config_parse(c
->config_file
, f
, table
, NULL
) : 0;
533 /* Make sure that channel map and sample spec fit together */
535 if (ci
.default_sample_spec_set
&&
536 ci
.default_channel_map_set
&&
537 c
->default_channel_map
.channels
!= c
->default_sample_spec
.channels
) {
538 pa_log_error(_("The specified default channel map has a different number of channels than the specified default number of channels."));
541 } else if (ci
.default_sample_spec_set
)
542 pa_channel_map_init_extend(&c
->default_channel_map
, c
->default_sample_spec
.channels
, PA_CHANNEL_MAP_DEFAULT
);
543 else if (ci
.default_channel_map_set
)
544 c
->default_sample_spec
.channels
= c
->default_channel_map
.channels
;
554 int pa_daemon_conf_env(pa_daemon_conf
*c
) {
558 if ((e
= getenv(ENV_DL_SEARCH_PATH
))) {
559 pa_xfree(c
->dl_search_path
);
560 c
->dl_search_path
= pa_xstrdup(e
);
562 if ((e
= getenv(ENV_SCRIPT_FILE
))) {
563 pa_xfree(c
->default_script_file
);
564 c
->default_script_file
= pa_xstrdup(e
);
570 const char *pa_daemon_conf_get_default_script_file(pa_daemon_conf
*c
) {
573 if (!c
->default_script_file
) {
574 if (c
->system_instance
)
575 c
->default_script_file
= pa_find_config_file(DEFAULT_SYSTEM_SCRIPT_FILE
, NULL
, ENV_SCRIPT_FILE
);
577 c
->default_script_file
= pa_find_config_file(DEFAULT_SCRIPT_FILE
, DEFAULT_SCRIPT_FILE_USER
, ENV_SCRIPT_FILE
);
580 return c
->default_script_file
;
583 FILE *pa_daemon_conf_open_default_script_file(pa_daemon_conf
*c
) {
587 if (!c
->default_script_file
) {
588 if (c
->system_instance
)
589 f
= pa_open_config_file(DEFAULT_SYSTEM_SCRIPT_FILE
, NULL
, ENV_SCRIPT_FILE
, &c
->default_script_file
);
591 f
= pa_open_config_file(DEFAULT_SCRIPT_FILE
, DEFAULT_SCRIPT_FILE_USER
, ENV_SCRIPT_FILE
, &c
->default_script_file
);
593 f
= fopen(c
->default_script_file
, "r");
599 static const char* const log_level_to_string
[] = {
600 [PA_LOG_DEBUG
] = "debug",
601 [PA_LOG_INFO
] = "info",
602 [PA_LOG_NOTICE
] = "notice",
603 [PA_LOG_WARN
] = "warning",
604 [PA_LOG_ERROR
] = "error"
607 char *pa_daemon_conf_dump(pa_daemon_conf
*c
) {
609 char cm
[PA_CHANNEL_MAP_SNPRINT_MAX
];
616 pa_strbuf_printf(s
, _("### Read from configuration file: %s ###\n"), c
->config_file
);
618 pa_assert(c
->log_level
< PA_LOG_LEVEL_MAX
);
620 pa_strbuf_printf(s
, "daemonize = %s\n", pa_yes_no(c
->daemonize
));
621 pa_strbuf_printf(s
, "fail = %s\n", pa_yes_no(c
->fail
));
622 pa_strbuf_printf(s
, "high-priority = %s\n", pa_yes_no(c
->high_priority
));
623 pa_strbuf_printf(s
, "nice-level = %i\n", c
->nice_level
);
624 pa_strbuf_printf(s
, "realtime-scheduling = %s\n", pa_yes_no(c
->realtime_scheduling
));
625 pa_strbuf_printf(s
, "realtime-priority = %i\n", c
->realtime_priority
);
626 pa_strbuf_printf(s
, "disallow-module-loading = %s\n", pa_yes_no(c
->disallow_module_loading
));
627 pa_strbuf_printf(s
, "disallow-exit = %s\n", pa_yes_no(c
->disallow_exit
));
628 pa_strbuf_printf(s
, "use-pid-file = %s\n", pa_yes_no(c
->use_pid_file
));
629 pa_strbuf_printf(s
, "system-instance = %s\n", pa_yes_no(c
->system_instance
));
630 pa_strbuf_printf(s
, "no-cpu-limit = %s\n", pa_yes_no(c
->no_cpu_limit
));
631 pa_strbuf_printf(s
, "disable-shm = %s\n", pa_yes_no(c
->disable_shm
));
632 pa_strbuf_printf(s
, "flat-volumes = %s\n", pa_yes_no(c
->flat_volumes
));
633 pa_strbuf_printf(s
, "exit-idle-time = %i\n", c
->exit_idle_time
);
634 pa_strbuf_printf(s
, "scache-idle-time = %i\n", c
->scache_idle_time
);
635 pa_strbuf_printf(s
, "dl-search-path = %s\n", pa_strempty(c
->dl_search_path
));
636 pa_strbuf_printf(s
, "default-script-file = %s\n", pa_strempty(pa_daemon_conf_get_default_script_file(c
)));
637 pa_strbuf_printf(s
, "load-default-script-file = %s\n", pa_yes_no(c
->load_default_script_file
));
638 pa_strbuf_printf(s
, "log-target = %s\n", c
->auto_log_target
? "auto" : (c
->log_target
== PA_LOG_SYSLOG
? "syslog" : "stderr"));
639 pa_strbuf_printf(s
, "log-level = %s\n", log_level_to_string
[c
->log_level
]);
640 pa_strbuf_printf(s
, "resample-method = %s\n", pa_resample_method_to_string(c
->resample_method
));
641 pa_strbuf_printf(s
, "disable-remixing = %s\n", pa_yes_no(c
->disable_remixing
));
642 pa_strbuf_printf(s
, "disable-lfe-remixing = %s\n", pa_yes_no(c
->disable_lfe_remixing
));
643 pa_strbuf_printf(s
, "default-sample-format = %s\n", pa_sample_format_to_string(c
->default_sample_spec
.format
));
644 pa_strbuf_printf(s
, "default-sample-rate = %u\n", c
->default_sample_spec
.rate
);
645 pa_strbuf_printf(s
, "default-sample-channels = %u\n", c
->default_sample_spec
.channels
);
646 pa_strbuf_printf(s
, "default-channel-map = %s\n", pa_channel_map_snprint(cm
, sizeof(cm
), &c
->default_channel_map
));
647 pa_strbuf_printf(s
, "default-fragments = %u\n", c
->default_n_fragments
);
648 pa_strbuf_printf(s
, "default-fragment-size-msec = %u\n", c
->default_fragment_size_msec
);
649 pa_strbuf_printf(s
, "shm-size-bytes = %lu\n", (unsigned long) c
->shm_size
);
650 pa_strbuf_printf(s
, "log-meta = %s\n", pa_yes_no(c
->log_meta
));
651 pa_strbuf_printf(s
, "log-time = %s\n", pa_yes_no(c
->log_time
));
652 pa_strbuf_printf(s
, "log-backtrace = %u\n", c
->log_backtrace
);
653 #ifdef HAVE_SYS_RESOURCE_H
654 pa_strbuf_printf(s
, "rlimit-fsize = %li\n", c
->rlimit_fsize
.is_set
? (long int) c
->rlimit_fsize
.value
: -1);
655 pa_strbuf_printf(s
, "rlimit-data = %li\n", c
->rlimit_data
.is_set
? (long int) c
->rlimit_data
.value
: -1);
656 pa_strbuf_printf(s
, "rlimit-stack = %li\n", c
->rlimit_stack
.is_set
? (long int) c
->rlimit_stack
.value
: -1);
657 pa_strbuf_printf(s
, "rlimit-core = %li\n", c
->rlimit_core
.is_set
? (long int) c
->rlimit_core
.value
: -1);
659 pa_strbuf_printf(s
, "rlimit-rss = %li\n", c
->rlimit_rss
.is_set
? (long int) c
->rlimit_rss
.value
: -1);
662 pa_strbuf_printf(s
, "rlimit-as = %li\n", c
->rlimit_as
.is_set
? (long int) c
->rlimit_as
.value
: -1);
665 pa_strbuf_printf(s
, "rlimit-nproc = %li\n", c
->rlimit_nproc
.is_set
? (long int) c
->rlimit_nproc
.value
: -1);
668 pa_strbuf_printf(s
, "rlimit-nofile = %li\n", c
->rlimit_nofile
.is_set
? (long int) c
->rlimit_nofile
.value
: -1);
670 #ifdef RLIMIT_MEMLOCK
671 pa_strbuf_printf(s
, "rlimit-memlock = %li\n", c
->rlimit_memlock
.is_set
? (long int) c
->rlimit_memlock
.value
: -1);
674 pa_strbuf_printf(s
, "rlimit-locks = %li\n", c
->rlimit_locks
.is_set
? (long int) c
->rlimit_locks
.value
: -1);
676 #ifdef RLIMIT_SIGPENDING
677 pa_strbuf_printf(s
, "rlimit-sigpending = %li\n", c
->rlimit_sigpending
.is_set
? (long int) c
->rlimit_sigpending
.value
: -1);
679 #ifdef RLIMIT_MSGQUEUE
680 pa_strbuf_printf(s
, "rlimit-msgqueue = %li\n", c
->rlimit_msgqueue
.is_set
? (long int) c
->rlimit_msgqueue
.value
: -1);
683 pa_strbuf_printf(s
, "rlimit-nice = %li\n", c
->rlimit_nice
.is_set
? (long int) c
->rlimit_nice
.value
: -1);
686 pa_strbuf_printf(s
, "rlimit-rtprio = %li\n", c
->rlimit_rtprio
.is_set
? (long int) c
->rlimit_rtprio
.value
: -1);
689 pa_strbuf_printf(s
, "rlimit-rttime = %li\n", c
->rlimit_rttime
.is_set
? (long int) c
->rlimit_rttime
.value
: -1);
693 return pa_strbuf_tostring_free(s
);