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
},
98 .rlimit_rss
= { .value
= 0, .is_set
= FALSE
}
100 ,.rlimit_nproc
= { .value
= 0, .is_set
= FALSE
}
103 ,.rlimit_nofile
= { .value
= 256, .is_set
= TRUE
}
105 #ifdef RLIMIT_MEMLOCK
106 ,.rlimit_memlock
= { .value
= 0, .is_set
= FALSE
}
109 ,.rlimit_as
= { .value
= 0, .is_set
= FALSE
}
112 ,.rlimit_locks
= { .value
= 0, .is_set
= FALSE
}
114 #ifdef RLIMIT_SIGPENDING
115 ,.rlimit_sigpending
= { .value
= 0, .is_set
= FALSE
}
117 #ifdef RLIMIT_MSGQUEUE
118 ,.rlimit_msgqueue
= { .value
= 0, .is_set
= FALSE
}
121 ,.rlimit_nice
= { .value
= 31, .is_set
= TRUE
} /* nice level of -11 */
124 ,.rlimit_rtprio
= { .value
= 9, .is_set
= TRUE
} /* One below JACK's default for the server */
127 ,.rlimit_rttime
= { .value
= PA_USEC_PER_SEC
, .is_set
= TRUE
}
132 pa_daemon_conf
* pa_daemon_conf_new(void) {
133 pa_daemon_conf
*c
= pa_xnewdup(pa_daemon_conf
, &default_conf
, 1);
135 c
->dl_search_path
= pa_xstrdup(PA_DLSEARCHPATH
);
139 void pa_daemon_conf_free(pa_daemon_conf
*c
) {
141 pa_xfree(c
->script_commands
);
142 pa_xfree(c
->dl_search_path
);
143 pa_xfree(c
->default_script_file
);
144 pa_xfree(c
->config_file
);
148 int pa_daemon_conf_set_log_target(pa_daemon_conf
*c
, const char *string
) {
152 if (!strcmp(string
, "auto"))
153 c
->auto_log_target
= 1;
154 else if (!strcmp(string
, "syslog")) {
155 c
->auto_log_target
= 0;
156 c
->log_target
= PA_LOG_SYSLOG
;
157 } else if (!strcmp(string
, "stderr")) {
158 c
->auto_log_target
= 0;
159 c
->log_target
= PA_LOG_STDERR
;
166 int pa_daemon_conf_set_log_level(pa_daemon_conf
*c
, const char *string
) {
171 if (pa_atou(string
, &u
) >= 0) {
172 if (u
>= PA_LOG_LEVEL_MAX
)
175 c
->log_level
= (pa_log_level_t
) u
;
176 } else if (pa_startswith(string
, "debug"))
177 c
->log_level
= PA_LOG_DEBUG
;
178 else if (pa_startswith(string
, "info"))
179 c
->log_level
= PA_LOG_INFO
;
180 else if (pa_startswith(string
, "notice"))
181 c
->log_level
= PA_LOG_NOTICE
;
182 else if (pa_startswith(string
, "warn"))
183 c
->log_level
= PA_LOG_WARN
;
184 else if (pa_startswith(string
, "err"))
185 c
->log_level
= PA_LOG_ERROR
;
192 int pa_daemon_conf_set_resample_method(pa_daemon_conf
*c
, const char *string
) {
197 if ((m
= pa_parse_resample_method(string
)) < 0)
200 c
->resample_method
= m
;
204 static int parse_log_target(const char *filename
, unsigned line
, const char *section
, const char *lvalue
, const char *rvalue
, void *data
, void *userdata
) {
205 pa_daemon_conf
*c
= data
;
212 if (pa_daemon_conf_set_log_target(c
, rvalue
) < 0) {
213 pa_log(_("[%s:%u] Invalid log target '%s'."), filename
, line
, rvalue
);
220 static int parse_log_level(const char *filename
, unsigned line
, const char *section
, const char *lvalue
, const char *rvalue
, void *data
, void *userdata
) {
221 pa_daemon_conf
*c
= data
;
228 if (pa_daemon_conf_set_log_level(c
, rvalue
) < 0) {
229 pa_log(_("[%s:%u] Invalid log level '%s'."), filename
, line
, rvalue
);
236 static int parse_resample_method(const char *filename
, unsigned line
, const char *section
, const char *lvalue
, const char *rvalue
, void *data
, void *userdata
) {
237 pa_daemon_conf
*c
= data
;
244 if (pa_daemon_conf_set_resample_method(c
, rvalue
) < 0) {
245 pa_log(_("[%s:%u] Invalid resample method '%s'."), filename
, line
, rvalue
);
252 static int parse_rlimit(const char *filename
, unsigned line
, const char *section
, const char *lvalue
, const char *rvalue
, void *data
, void *userdata
) {
253 #ifdef HAVE_SYS_RESOURCE_H
254 struct pa_rlimit
*r
= data
;
261 if (rvalue
[strspn(rvalue
, "\t ")] == 0) {
267 if (pa_atoi(rvalue
, &k
) < 0) {
268 pa_log(_("[%s:%u] Invalid rlimit '%s'."), filename
, line
, rvalue
);
272 r
->value
= k
>= 0 ? (rlim_t
) k
: 0;
275 pa_log_warn(_("[%s:%u] rlimit not supported on this platform."), filename
, line
);
281 static int parse_sample_format(const char *filename
, unsigned line
, const char *section
, const char *lvalue
, const char *rvalue
, void *data
, void *userdata
) {
282 pa_daemon_conf
*c
= data
;
283 pa_sample_format_t f
;
290 if ((f
= pa_parse_sample_format(rvalue
)) < 0) {
291 pa_log(_("[%s:%u] Invalid sample format '%s'."), filename
, line
, rvalue
);
295 c
->default_sample_spec
.format
= f
;
299 static int parse_sample_rate(const char *filename
, unsigned line
, const char *section
, const char *lvalue
, const char *rvalue
, void *data
, void *userdata
) {
300 pa_daemon_conf
*c
= data
;
308 if (pa_atou(rvalue
, &r
) < 0 || r
> (uint32_t) PA_RATE_MAX
|| r
<= 0) {
309 pa_log(_("[%s:%u] Invalid sample rate '%s'."), filename
, line
, rvalue
);
313 c
->default_sample_spec
.rate
= r
;
317 struct channel_conf_info
{
318 pa_daemon_conf
*conf
;
319 pa_bool_t default_sample_spec_set
;
320 pa_bool_t default_channel_map_set
;
323 static int parse_sample_channels(const char *filename
, unsigned line
, const char *section
, const char *lvalue
, const char *rvalue
, void *data
, void *userdata
) {
324 struct channel_conf_info
*i
= data
;
332 if (pa_atoi(rvalue
, &n
) < 0 || n
> (int32_t) PA_CHANNELS_MAX
|| n
<= 0) {
333 pa_log(_("[%s:%u] Invalid sample channels '%s'."), filename
, line
, rvalue
);
337 i
->conf
->default_sample_spec
.channels
= (uint8_t) n
;
338 i
->default_sample_spec_set
= TRUE
;
342 static int parse_channel_map(const char *filename
, unsigned line
, const char *section
, const char *lvalue
, const char *rvalue
, void *data
, void *userdata
) {
343 struct channel_conf_info
*i
= data
;
350 if (!pa_channel_map_parse(&i
->conf
->default_channel_map
, rvalue
)) {
351 pa_log(_("[%s:%u] Invalid channel map '%s'."), filename
, line
, rvalue
);
355 i
->default_channel_map_set
= TRUE
;
359 static int parse_fragments(const char *filename
, unsigned line
, const char *section
, const char *lvalue
, const char *rvalue
, void *data
, void *userdata
) {
360 pa_daemon_conf
*c
= data
;
368 if (pa_atoi(rvalue
, &n
) < 0 || n
< 2) {
369 pa_log(_("[%s:%u] Invalid number of fragments '%s'."), filename
, line
, rvalue
);
373 c
->default_n_fragments
= (unsigned) n
;
377 static int parse_fragment_size_msec(const char *filename
, unsigned line
, const char *section
, const char *lvalue
, const char *rvalue
, void *data
, void *userdata
) {
378 pa_daemon_conf
*c
= data
;
386 if (pa_atoi(rvalue
, &n
) < 0 || n
< 1) {
387 pa_log(_("[%s:%u] Invalid fragment size '%s'."), filename
, line
, rvalue
);
391 c
->default_fragment_size_msec
= (unsigned) n
;
395 static int parse_nice_level(const char *filename
, unsigned line
, const char *section
, const char *lvalue
, const char *rvalue
, void *data
, void *userdata
) {
396 pa_daemon_conf
*c
= data
;
404 if (pa_atoi(rvalue
, &level
) < 0 || level
< -20 || level
> 19) {
405 pa_log(_("[%s:%u] Invalid nice level '%s'."), filename
, line
, rvalue
);
409 c
->nice_level
= (int) level
;
413 static int parse_rtprio(const char *filename
, unsigned line
, const char *section
, const char *lvalue
, const char *rvalue
, void *data
, void *userdata
) {
414 pa_daemon_conf
*c
= data
;
422 if (pa_atoi(rvalue
, &rtprio
) < 0 || rtprio
< sched_get_priority_min(SCHED_FIFO
) || rtprio
> sched_get_priority_max(SCHED_FIFO
)) {
423 pa_log("[%s:%u] Invalid realtime priority '%s'.", filename
, line
, rvalue
);
427 c
->realtime_priority
= (int) rtprio
;
431 int pa_daemon_conf_load(pa_daemon_conf
*c
, const char *filename
) {
434 struct channel_conf_info ci
;
435 pa_config_item table
[] = {
436 { "daemonize", pa_config_parse_bool
, &c
->daemonize
, NULL
},
437 { "fail", pa_config_parse_bool
, &c
->fail
, NULL
},
438 { "high-priority", pa_config_parse_bool
, &c
->high_priority
, NULL
},
439 { "realtime-scheduling", pa_config_parse_bool
, &c
->realtime_scheduling
, NULL
},
440 { "disallow-module-loading", pa_config_parse_bool
, &c
->disallow_module_loading
, NULL
},
441 { "disallow-exit", pa_config_parse_bool
, &c
->disallow_exit
, NULL
},
442 { "use-pid-file", pa_config_parse_bool
, &c
->use_pid_file
, NULL
},
443 { "system-instance", pa_config_parse_bool
, &c
->system_instance
, NULL
},
444 { "no-cpu-limit", pa_config_parse_bool
, &c
->no_cpu_limit
, NULL
},
445 { "disable-shm", pa_config_parse_bool
, &c
->disable_shm
, NULL
},
446 { "flat-volumes", pa_config_parse_bool
, &c
->flat_volumes
, NULL
},
447 { "exit-idle-time", pa_config_parse_int
, &c
->exit_idle_time
, NULL
},
448 { "scache-idle-time", pa_config_parse_int
, &c
->scache_idle_time
, NULL
},
449 { "realtime-priority", parse_rtprio
, c
, NULL
},
450 { "dl-search-path", pa_config_parse_string
, &c
->dl_search_path
, NULL
},
451 { "default-script-file", pa_config_parse_string
, &c
->default_script_file
, NULL
},
452 { "log-target", parse_log_target
, c
, NULL
},
453 { "log-level", parse_log_level
, c
, NULL
},
454 { "verbose", parse_log_level
, c
, NULL
},
455 { "resample-method", parse_resample_method
, c
, NULL
},
456 { "default-sample-format", parse_sample_format
, c
, NULL
},
457 { "default-sample-rate", parse_sample_rate
, c
, NULL
},
458 { "default-sample-channels", parse_sample_channels
, &ci
, NULL
},
459 { "default-channel-map", parse_channel_map
, &ci
, NULL
},
460 { "default-fragments", parse_fragments
, c
, NULL
},
461 { "default-fragment-size-msec", parse_fragment_size_msec
, c
, NULL
},
462 { "nice-level", parse_nice_level
, c
, NULL
},
463 { "disable-remixing", pa_config_parse_bool
, &c
->disable_remixing
, NULL
},
464 { "disable-lfe-remixing", pa_config_parse_bool
, &c
->disable_lfe_remixing
, NULL
},
465 { "load-default-script-file", pa_config_parse_bool
, &c
->load_default_script_file
, NULL
},
466 { "shm-size-bytes", pa_config_parse_size
, &c
->shm_size
, NULL
},
467 { "log-meta", pa_config_parse_bool
, &c
->log_meta
, NULL
},
468 { "log-time", pa_config_parse_bool
, &c
->log_time
, NULL
},
469 { "log-backtrace", pa_config_parse_unsigned
, &c
->log_backtrace
, NULL
},
470 #ifdef HAVE_SYS_RESOURCE_H
471 { "rlimit-fsize", parse_rlimit
, &c
->rlimit_fsize
, NULL
},
472 { "rlimit-data", parse_rlimit
, &c
->rlimit_data
, NULL
},
473 { "rlimit-stack", parse_rlimit
, &c
->rlimit_stack
, NULL
},
474 { "rlimit-core", parse_rlimit
, &c
->rlimit_core
, NULL
},
475 { "rlimit-rss", parse_rlimit
, &c
->rlimit_rss
, NULL
},
477 { "rlimit-nofile", parse_rlimit
, &c
->rlimit_nofile
, NULL
},
480 { "rlimit-as", parse_rlimit
, &c
->rlimit_as
, NULL
},
483 { "rlimit-nproc", parse_rlimit
, &c
->rlimit_nproc
, NULL
},
485 #ifdef RLIMIT_MEMLOCK
486 { "rlimit-memlock", parse_rlimit
, &c
->rlimit_memlock
, NULL
},
489 { "rlimit-locks", parse_rlimit
, &c
->rlimit_locks
, NULL
},
491 #ifdef RLIMIT_SIGPENDING
492 { "rlimit-sigpending", parse_rlimit
, &c
->rlimit_sigpending
, NULL
},
494 #ifdef RLIMIT_MSGQUEUE
495 { "rlimit-msgqueue", parse_rlimit
, &c
->rlimit_msgqueue
, NULL
},
498 { "rlimit-nice", parse_rlimit
, &c
->rlimit_nice
, NULL
},
501 { "rlimit-rtprio", parse_rlimit
, &c
->rlimit_rtprio
, NULL
},
504 { "rlimit-rttime", parse_rlimit
, &c
->rlimit_rttime
, NULL
},
507 { NULL
, NULL
, NULL
, NULL
},
510 pa_xfree(c
->config_file
);
511 c
->config_file
= NULL
;
514 fopen(c
->config_file
= pa_xstrdup(filename
), "r") :
515 pa_open_config_file(DEFAULT_CONFIG_FILE
, DEFAULT_CONFIG_FILE_USER
, ENV_CONFIG_FILE
, &c
->config_file
);
517 if (!f
&& errno
!= ENOENT
) {
518 pa_log_warn(_("Failed to open configuration file: %s"), pa_cstrerror(errno
));
522 ci
.default_channel_map_set
= ci
.default_sample_spec_set
= FALSE
;
525 r
= f
? pa_config_parse(c
->config_file
, f
, table
, NULL
) : 0;
529 /* Make sure that channel map and sample spec fit together */
531 if (ci
.default_sample_spec_set
&&
532 ci
.default_channel_map_set
&&
533 c
->default_channel_map
.channels
!= c
->default_sample_spec
.channels
) {
534 pa_log_error(_("The specified default channel map has a different number of channels than the specified default number of channels."));
537 } else if (ci
.default_sample_spec_set
)
538 pa_channel_map_init_extend(&c
->default_channel_map
, c
->default_sample_spec
.channels
, PA_CHANNEL_MAP_DEFAULT
);
539 else if (ci
.default_channel_map_set
)
540 c
->default_sample_spec
.channels
= c
->default_channel_map
.channels
;
550 int pa_daemon_conf_env(pa_daemon_conf
*c
) {
554 if ((e
= getenv(ENV_DL_SEARCH_PATH
))) {
555 pa_xfree(c
->dl_search_path
);
556 c
->dl_search_path
= pa_xstrdup(e
);
558 if ((e
= getenv(ENV_SCRIPT_FILE
))) {
559 pa_xfree(c
->default_script_file
);
560 c
->default_script_file
= pa_xstrdup(e
);
566 const char *pa_daemon_conf_get_default_script_file(pa_daemon_conf
*c
) {
569 if (!c
->default_script_file
) {
570 if (c
->system_instance
)
571 c
->default_script_file
= pa_find_config_file(DEFAULT_SYSTEM_SCRIPT_FILE
, NULL
, ENV_SCRIPT_FILE
);
573 c
->default_script_file
= pa_find_config_file(DEFAULT_SCRIPT_FILE
, DEFAULT_SCRIPT_FILE_USER
, ENV_SCRIPT_FILE
);
576 return c
->default_script_file
;
579 FILE *pa_daemon_conf_open_default_script_file(pa_daemon_conf
*c
) {
583 if (!c
->default_script_file
) {
584 if (c
->system_instance
)
585 f
= pa_open_config_file(DEFAULT_SYSTEM_SCRIPT_FILE
, NULL
, ENV_SCRIPT_FILE
, &c
->default_script_file
);
587 f
= pa_open_config_file(DEFAULT_SCRIPT_FILE
, DEFAULT_SCRIPT_FILE_USER
, ENV_SCRIPT_FILE
, &c
->default_script_file
);
589 f
= fopen(c
->default_script_file
, "r");
595 static const char* const log_level_to_string
[] = {
596 [PA_LOG_DEBUG
] = "debug",
597 [PA_LOG_INFO
] = "info",
598 [PA_LOG_NOTICE
] = "notice",
599 [PA_LOG_WARN
] = "warning",
600 [PA_LOG_ERROR
] = "error"
603 char *pa_daemon_conf_dump(pa_daemon_conf
*c
) {
605 char cm
[PA_CHANNEL_MAP_SNPRINT_MAX
];
612 pa_strbuf_printf(s
, _("### Read from configuration file: %s ###\n"), c
->config_file
);
614 pa_assert(c
->log_level
< PA_LOG_LEVEL_MAX
);
616 pa_strbuf_printf(s
, "daemonize = %s\n", pa_yes_no(c
->daemonize
));
617 pa_strbuf_printf(s
, "fail = %s\n", pa_yes_no(c
->fail
));
618 pa_strbuf_printf(s
, "high-priority = %s\n", pa_yes_no(c
->high_priority
));
619 pa_strbuf_printf(s
, "nice-level = %i\n", c
->nice_level
);
620 pa_strbuf_printf(s
, "realtime-scheduling = %s\n", pa_yes_no(c
->realtime_scheduling
));
621 pa_strbuf_printf(s
, "realtime-priority = %i\n", c
->realtime_priority
);
622 pa_strbuf_printf(s
, "disallow-module-loading = %s\n", pa_yes_no(c
->disallow_module_loading
));
623 pa_strbuf_printf(s
, "disallow-exit = %s\n", pa_yes_no(c
->disallow_exit
));
624 pa_strbuf_printf(s
, "use-pid-file = %s\n", pa_yes_no(c
->use_pid_file
));
625 pa_strbuf_printf(s
, "system-instance = %s\n", pa_yes_no(c
->system_instance
));
626 pa_strbuf_printf(s
, "no-cpu-limit = %s\n", pa_yes_no(c
->no_cpu_limit
));
627 pa_strbuf_printf(s
, "disable-shm = %s\n", pa_yes_no(c
->disable_shm
));
628 pa_strbuf_printf(s
, "flat-volumes = %s\n", pa_yes_no(c
->flat_volumes
));
629 pa_strbuf_printf(s
, "exit-idle-time = %i\n", c
->exit_idle_time
);
630 pa_strbuf_printf(s
, "scache-idle-time = %i\n", c
->scache_idle_time
);
631 pa_strbuf_printf(s
, "dl-search-path = %s\n", pa_strempty(c
->dl_search_path
));
632 pa_strbuf_printf(s
, "default-script-file = %s\n", pa_strempty(pa_daemon_conf_get_default_script_file(c
)));
633 pa_strbuf_printf(s
, "load-default-script-file = %s\n", pa_yes_no(c
->load_default_script_file
));
634 pa_strbuf_printf(s
, "log-target = %s\n", c
->auto_log_target
? "auto" : (c
->log_target
== PA_LOG_SYSLOG
? "syslog" : "stderr"));
635 pa_strbuf_printf(s
, "log-level = %s\n", log_level_to_string
[c
->log_level
]);
636 pa_strbuf_printf(s
, "resample-method = %s\n", pa_resample_method_to_string(c
->resample_method
));
637 pa_strbuf_printf(s
, "disable-remixing = %s\n", pa_yes_no(c
->disable_remixing
));
638 pa_strbuf_printf(s
, "disable-lfe-remixing = %s\n", pa_yes_no(c
->disable_lfe_remixing
));
639 pa_strbuf_printf(s
, "default-sample-format = %s\n", pa_sample_format_to_string(c
->default_sample_spec
.format
));
640 pa_strbuf_printf(s
, "default-sample-rate = %u\n", c
->default_sample_spec
.rate
);
641 pa_strbuf_printf(s
, "default-sample-channels = %u\n", c
->default_sample_spec
.channels
);
642 pa_strbuf_printf(s
, "default-channel-map = %s\n", pa_channel_map_snprint(cm
, sizeof(cm
), &c
->default_channel_map
));
643 pa_strbuf_printf(s
, "default-fragments = %u\n", c
->default_n_fragments
);
644 pa_strbuf_printf(s
, "default-fragment-size-msec = %u\n", c
->default_fragment_size_msec
);
645 pa_strbuf_printf(s
, "shm-size-bytes = %lu\n", (unsigned long) c
->shm_size
);
646 pa_strbuf_printf(s
, "log-meta = %s\n", pa_yes_no(c
->log_meta
));
647 pa_strbuf_printf(s
, "log-time = %s\n", pa_yes_no(c
->log_time
));
648 pa_strbuf_printf(s
, "log-backtrace = %u\n", c
->log_backtrace
);
649 #ifdef HAVE_SYS_RESOURCE_H
650 pa_strbuf_printf(s
, "rlimit-fsize = %li\n", c
->rlimit_fsize
.is_set
? (long int) c
->rlimit_fsize
.value
: -1);
651 pa_strbuf_printf(s
, "rlimit-data = %li\n", c
->rlimit_data
.is_set
? (long int) c
->rlimit_data
.value
: -1);
652 pa_strbuf_printf(s
, "rlimit-stack = %li\n", c
->rlimit_stack
.is_set
? (long int) c
->rlimit_stack
.value
: -1);
653 pa_strbuf_printf(s
, "rlimit-core = %li\n", c
->rlimit_core
.is_set
? (long int) c
->rlimit_core
.value
: -1);
654 pa_strbuf_printf(s
, "rlimit-rss = %li\n", c
->rlimit_rss
.is_set
? (long int) c
->rlimit_rss
.value
: -1);
656 pa_strbuf_printf(s
, "rlimit-as = %li\n", c
->rlimit_as
.is_set
? (long int) c
->rlimit_as
.value
: -1);
659 pa_strbuf_printf(s
, "rlimit-nproc = %li\n", c
->rlimit_nproc
.is_set
? (long int) c
->rlimit_nproc
.value
: -1);
662 pa_strbuf_printf(s
, "rlimit-nofile = %li\n", c
->rlimit_nofile
.is_set
? (long int) c
->rlimit_nofile
.value
: -1);
664 #ifdef RLIMIT_MEMLOCK
665 pa_strbuf_printf(s
, "rlimit-memlock = %li\n", c
->rlimit_memlock
.is_set
? (long int) c
->rlimit_memlock
.value
: -1);
668 pa_strbuf_printf(s
, "rlimit-locks = %li\n", c
->rlimit_locks
.is_set
? (long int) c
->rlimit_locks
.value
: -1);
670 #ifdef RLIMIT_SIGPENDING
671 pa_strbuf_printf(s
, "rlimit-sigpending = %li\n", c
->rlimit_sigpending
.is_set
? (long int) c
->rlimit_sigpending
.value
: -1);
673 #ifdef RLIMIT_MSGQUEUE
674 pa_strbuf_printf(s
, "rlimit-msgqueue = %li\n", c
->rlimit_msgqueue
.is_set
? (long int) c
->rlimit_msgqueue
.value
: -1);
677 pa_strbuf_printf(s
, "rlimit-nice = %li\n", c
->rlimit_nice
.is_set
? (long int) c
->rlimit_nice
.value
: -1);
680 pa_strbuf_printf(s
, "rlimit-rtprio = %li\n", c
->rlimit_rtprio
.is_set
? (long int) c
->rlimit_rtprio
.value
: -1);
683 pa_strbuf_printf(s
, "rlimit-rttime = %li\n", c
->rlimit_rttime
.is_set
? (long int) c
->rlimit_rttime
.value
: -1);
687 return pa_strbuf_tostring_free(s
);