]> code.delx.au - pulseaudio/blob - src/daemon/daemon-conf.c
Make the shared memory segment size configurable
[pulseaudio] / src / daemon / daemon-conf.c
1 /***
2 This file is part of PulseAudio.
3
4 Copyright 2004-2006 Lennart Poettering
5 Copyright 2006 Pierre Ossman <ossman@cendio.se> for Cendio AB
6
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 of the License,
10 or (at your option) any later version.
11
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.
16
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
20 USA.
21 ***/
22
23 #ifdef HAVE_CONFIG_H
24 #include <config.h>
25 #endif
26
27 #include <errno.h>
28 #include <stdio.h>
29 #include <string.h>
30 #include <unistd.h>
31 #include <sched.h>
32
33 #include <pulse/xmalloc.h>
34 #include <pulse/timeval.h>
35 #include <pulse/i18n.h>
36
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>
43
44 #include "daemon-conf.h"
45
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"
49
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"
52
53 #define ENV_SCRIPT_FILE "PULSE_SCRIPT"
54 #define ENV_CONFIG_FILE "PULSE_CONFIG"
55 #define ENV_DL_SEARCH_PATH "PULSE_DLPATH"
56
57 static const pa_daemon_conf default_conf = {
58 .cmd = PA_CMD_DAEMON,
59 .daemonize = FALSE,
60 .fail = TRUE,
61 .high_priority = TRUE,
62 .nice_level = -11,
63 .realtime_scheduling = FALSE,
64 .realtime_priority = 5, /* Half of JACK's default rtprio */
65 .disallow_module_loading = FALSE,
66 .disallow_exit = FALSE,
67 .exit_idle_time = 20,
68 .module_idle_time = 20,
69 .scache_idle_time = 20,
70 .auto_log_target = 1,
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,
77 .resample_method = PA_RESAMPLER_AUTO,
78 .disable_remixing = FALSE,
79 .disable_lfe_remixing = TRUE,
80 .config_file = NULL,
81 .use_pid_file = TRUE,
82 .system_instance = FALSE,
83 .no_cpu_limit = FALSE,
84 .disable_shm = FALSE,
85 .default_n_fragments = 4,
86 .default_fragment_size_msec = 25,
87 .default_sample_spec = { .format = PA_SAMPLE_S16NE, .rate = 44100, .channels = 2 },
88 .shm_size = 0
89 #ifdef HAVE_SYS_RESOURCE_H
90 ,.rlimit_fsize = { .value = 0, .is_set = FALSE },
91 .rlimit_data = { .value = 0, .is_set = FALSE },
92 .rlimit_stack = { .value = 0, .is_set = FALSE },
93 .rlimit_core = { .value = 0, .is_set = FALSE },
94 .rlimit_rss = { .value = 0, .is_set = FALSE }
95 #ifdef RLIMIT_NPROC
96 ,.rlimit_nproc = { .value = 0, .is_set = FALSE }
97 #endif
98 ,.rlimit_nofile = { .value = 256, .is_set = TRUE }
99 #ifdef RLIMIT_MEMLOCK
100 ,.rlimit_memlock = { .value = 0, .is_set = FALSE }
101 #endif
102 ,.rlimit_as = { .value = 0, .is_set = FALSE }
103 #ifdef RLIMIT_LOCKS
104 ,.rlimit_locks = { .value = 0, .is_set = FALSE }
105 #endif
106 #ifdef RLIMIT_SIGPENDING
107 ,.rlimit_sigpending = { .value = 0, .is_set = FALSE }
108 #endif
109 #ifdef RLIMIT_MSGQUEUE
110 ,.rlimit_msgqueue = { .value = 0, .is_set = FALSE }
111 #endif
112 #ifdef RLIMIT_NICE
113 ,.rlimit_nice = { .value = 31, .is_set = TRUE } /* nice level of -11 */
114 #endif
115 #ifdef RLIMIT_RTPRIO
116 ,.rlimit_rtprio = { .value = 9, .is_set = TRUE } /* One below JACK's default for the server */
117 #endif
118 #ifdef RLIMIT_RTTIME
119 ,.rlimit_rttime = { .value = PA_USEC_PER_SEC, .is_set = TRUE }
120 #endif
121 #endif
122 };
123
124 pa_daemon_conf* pa_daemon_conf_new(void) {
125 pa_daemon_conf *c = pa_xnewdup(pa_daemon_conf, &default_conf, 1);
126
127 c->dl_search_path = pa_xstrdup(PA_DLSEARCHPATH);
128 return c;
129 }
130
131 void pa_daemon_conf_free(pa_daemon_conf *c) {
132 pa_assert(c);
133 pa_xfree(c->script_commands);
134 pa_xfree(c->dl_search_path);
135 pa_xfree(c->default_script_file);
136 pa_xfree(c->config_file);
137 pa_xfree(c);
138 }
139
140 int pa_daemon_conf_set_log_target(pa_daemon_conf *c, const char *string) {
141 pa_assert(c);
142 pa_assert(string);
143
144 if (!strcmp(string, "auto"))
145 c->auto_log_target = 1;
146 else if (!strcmp(string, "syslog")) {
147 c->auto_log_target = 0;
148 c->log_target = PA_LOG_SYSLOG;
149 } else if (!strcmp(string, "stderr")) {
150 c->auto_log_target = 0;
151 c->log_target = PA_LOG_STDERR;
152 } else
153 return -1;
154
155 return 0;
156 }
157
158 int pa_daemon_conf_set_log_level(pa_daemon_conf *c, const char *string) {
159 uint32_t u;
160 pa_assert(c);
161 pa_assert(string);
162
163 if (pa_atou(string, &u) >= 0) {
164 if (u >= PA_LOG_LEVEL_MAX)
165 return -1;
166
167 c->log_level = (pa_log_level_t) u;
168 } else if (pa_startswith(string, "debug"))
169 c->log_level = PA_LOG_DEBUG;
170 else if (pa_startswith(string, "info"))
171 c->log_level = PA_LOG_INFO;
172 else if (pa_startswith(string, "notice"))
173 c->log_level = PA_LOG_NOTICE;
174 else if (pa_startswith(string, "warn"))
175 c->log_level = PA_LOG_WARN;
176 else if (pa_startswith(string, "err"))
177 c->log_level = PA_LOG_ERROR;
178 else
179 return -1;
180
181 return 0;
182 }
183
184 int pa_daemon_conf_set_resample_method(pa_daemon_conf *c, const char *string) {
185 int m;
186 pa_assert(c);
187 pa_assert(string);
188
189 if ((m = pa_parse_resample_method(string)) < 0)
190 return -1;
191
192 c->resample_method = m;
193 return 0;
194 }
195
196 static int parse_log_target(const char *filename, unsigned line, const char *lvalue, const char *rvalue, void *data, void *userdata) {
197 pa_daemon_conf *c = data;
198
199 pa_assert(filename);
200 pa_assert(lvalue);
201 pa_assert(rvalue);
202 pa_assert(data);
203
204 if (pa_daemon_conf_set_log_target(c, rvalue) < 0) {
205 pa_log(_("[%s:%u] Invalid log target '%s'."), filename, line, rvalue);
206 return -1;
207 }
208
209 return 0;
210 }
211
212 static int parse_log_level(const char *filename, unsigned line, const char *lvalue, const char *rvalue, void *data, void *userdata) {
213 pa_daemon_conf *c = data;
214
215 pa_assert(filename);
216 pa_assert(lvalue);
217 pa_assert(rvalue);
218 pa_assert(data);
219
220 if (pa_daemon_conf_set_log_level(c, rvalue) < 0) {
221 pa_log(_("[%s:%u] Invalid log level '%s'."), filename, line, rvalue);
222 return -1;
223 }
224
225 return 0;
226 }
227
228 static int parse_resample_method(const char *filename, unsigned line, const char *lvalue, const char *rvalue, void *data, void *userdata) {
229 pa_daemon_conf *c = data;
230
231 pa_assert(filename);
232 pa_assert(lvalue);
233 pa_assert(rvalue);
234 pa_assert(data);
235
236 if (pa_daemon_conf_set_resample_method(c, rvalue) < 0) {
237 pa_log(_("[%s:%u] Invalid resample method '%s'."), filename, line, rvalue);
238 return -1;
239 }
240
241 return 0;
242 }
243
244 static int parse_rlimit(const char *filename, unsigned line, const char *lvalue, const char *rvalue, void *data, void *userdata) {
245 #ifdef HAVE_SYS_RESOURCE_H
246 struct pa_rlimit *r = data;
247
248 pa_assert(filename);
249 pa_assert(lvalue);
250 pa_assert(rvalue);
251 pa_assert(r);
252
253 if (rvalue[strspn(rvalue, "\t ")] == 0) {
254 /* Empty string */
255 r->is_set = 0;
256 r->value = 0;
257 } else {
258 int32_t k;
259 if (pa_atoi(rvalue, &k) < 0) {
260 pa_log(_("[%s:%u] Invalid rlimit '%s'."), filename, line, rvalue);
261 return -1;
262 }
263 r->is_set = k >= 0;
264 r->value = k >= 0 ? (rlim_t) k : 0;
265 }
266 #else
267 pa_log_warn(_("[%s:%u] rlimit not supported on this platform."), filename, line);
268 #endif
269
270 return 0;
271 }
272
273 static int parse_sample_format(const char *filename, unsigned line, const char *lvalue, const char *rvalue, void *data, void *userdata) {
274 pa_daemon_conf *c = data;
275 pa_sample_format_t f;
276
277 pa_assert(filename);
278 pa_assert(lvalue);
279 pa_assert(rvalue);
280 pa_assert(data);
281
282 if ((f = pa_parse_sample_format(rvalue)) < 0) {
283 pa_log(_("[%s:%u] Invalid sample format '%s'."), filename, line, rvalue);
284 return -1;
285 }
286
287 c->default_sample_spec.format = f;
288 return 0;
289 }
290
291 static int parse_sample_rate(const char *filename, unsigned line, const char *lvalue, const char *rvalue, void *data, void *userdata) {
292 pa_daemon_conf *c = data;
293 uint32_t r;
294
295 pa_assert(filename);
296 pa_assert(lvalue);
297 pa_assert(rvalue);
298 pa_assert(data);
299
300 if (pa_atou(rvalue, &r) < 0 || r > (uint32_t) PA_RATE_MAX || r <= 0) {
301 pa_log(_("[%s:%u] Invalid sample rate '%s'."), filename, line, rvalue);
302 return -1;
303 }
304
305 c->default_sample_spec.rate = r;
306 return 0;
307 }
308
309 static int parse_sample_channels(const char *filename, unsigned line, const char *lvalue, const char *rvalue, void *data, void *userdata) {
310 pa_daemon_conf *c = data;
311 int32_t n;
312
313 pa_assert(filename);
314 pa_assert(lvalue);
315 pa_assert(rvalue);
316 pa_assert(data);
317
318 if (pa_atoi(rvalue, &n) < 0 || n > (int32_t) PA_CHANNELS_MAX || n <= 0) {
319 pa_log(_("[%s:%u] Invalid sample channels '%s'."), filename, line, rvalue);
320 return -1;
321 }
322
323 c->default_sample_spec.channels = (uint8_t) n;
324 return 0;
325 }
326
327 static int parse_fragments(const char *filename, unsigned line, const char *lvalue, const char *rvalue, void *data, void *userdata) {
328 pa_daemon_conf *c = data;
329 int32_t n;
330
331 pa_assert(filename);
332 pa_assert(lvalue);
333 pa_assert(rvalue);
334 pa_assert(data);
335
336 if (pa_atoi(rvalue, &n) < 0 || n < 2) {
337 pa_log(_("[%s:%u] Invalid number of fragments '%s'."), filename, line, rvalue);
338 return -1;
339 }
340
341 c->default_n_fragments = (unsigned) n;
342 return 0;
343 }
344
345 static int parse_fragment_size_msec(const char *filename, unsigned line, const char *lvalue, const char *rvalue, void *data, void *userdata) {
346 pa_daemon_conf *c = data;
347 int32_t n;
348
349 pa_assert(filename);
350 pa_assert(lvalue);
351 pa_assert(rvalue);
352 pa_assert(data);
353
354 if (pa_atoi(rvalue, &n) < 0 || n < 1) {
355 pa_log(_("[%s:%u] Invalid fragment size '%s'."), filename, line, rvalue);
356 return -1;
357 }
358
359 c->default_fragment_size_msec = (unsigned) n;
360 return 0;
361 }
362
363 static int parse_nice_level(const char *filename, unsigned line, const char *lvalue, const char *rvalue, void *data, void *userdata) {
364 pa_daemon_conf *c = data;
365 int32_t level;
366
367 pa_assert(filename);
368 pa_assert(lvalue);
369 pa_assert(rvalue);
370 pa_assert(data);
371
372 if (pa_atoi(rvalue, &level) < 0 || level < -20 || level > 19) {
373 pa_log(_("[%s:%u] Invalid nice level '%s'."), filename, line, rvalue);
374 return -1;
375 }
376
377 c->nice_level = (int) level;
378 return 0;
379 }
380
381 static int parse_rtprio(const char *filename, unsigned line, const char *lvalue, const char *rvalue, void *data, void *userdata) {
382 pa_daemon_conf *c = data;
383 int32_t rtprio;
384
385 pa_assert(filename);
386 pa_assert(lvalue);
387 pa_assert(rvalue);
388 pa_assert(data);
389
390 if (pa_atoi(rvalue, &rtprio) < 0 || rtprio < sched_get_priority_min(SCHED_FIFO) || rtprio > sched_get_priority_max(SCHED_FIFO)) {
391 pa_log("[%s:%u] Invalid realtime priority '%s'.", filename, line, rvalue);
392 return -1;
393 }
394
395 c->realtime_priority = (int) rtprio;
396 return 0;
397 }
398
399 int pa_daemon_conf_load(pa_daemon_conf *c, const char *filename) {
400 int r = -1;
401 FILE *f = NULL;
402
403 pa_config_item table[] = {
404 { "daemonize", pa_config_parse_bool, NULL },
405 { "fail", pa_config_parse_bool, NULL },
406 { "high-priority", pa_config_parse_bool, NULL },
407 { "realtime-scheduling", pa_config_parse_bool, NULL },
408 { "disallow-module-loading", pa_config_parse_bool, NULL },
409 { "disallow-exit", pa_config_parse_bool, NULL },
410 { "use-pid-file", pa_config_parse_bool, NULL },
411 { "system-instance", pa_config_parse_bool, NULL },
412 { "no-cpu-limit", pa_config_parse_bool, NULL },
413 { "disable-shm", pa_config_parse_bool, NULL },
414 { "exit-idle-time", pa_config_parse_int, NULL },
415 { "module-idle-time", pa_config_parse_int, NULL },
416 { "scache-idle-time", pa_config_parse_int, NULL },
417 { "realtime-priority", parse_rtprio, NULL },
418 { "dl-search-path", pa_config_parse_string, NULL },
419 { "default-script-file", pa_config_parse_string, NULL },
420 { "log-target", parse_log_target, NULL },
421 { "log-level", parse_log_level, NULL },
422 { "verbose", parse_log_level, NULL },
423 { "resample-method", parse_resample_method, NULL },
424 { "default-sample-format", parse_sample_format, NULL },
425 { "default-sample-rate", parse_sample_rate, NULL },
426 { "default-sample-channels", parse_sample_channels, NULL },
427 { "default-fragments", parse_fragments, NULL },
428 { "default-fragment-size-msec", parse_fragment_size_msec, NULL },
429 { "nice-level", parse_nice_level, NULL },
430 { "disable-remixing", pa_config_parse_bool, NULL },
431 { "disable-lfe-remixing", pa_config_parse_bool, NULL },
432 { "load-default-script-file", pa_config_parse_bool, NULL },
433 { "shm-size-bytes", pa_config_parse_size, NULL },
434 #ifdef HAVE_SYS_RESOURCE_H
435 { "rlimit-fsize", parse_rlimit, NULL },
436 { "rlimit-data", parse_rlimit, NULL },
437 { "rlimit-stack", parse_rlimit, NULL },
438 { "rlimit-core", parse_rlimit, NULL },
439 { "rlimit-rss", parse_rlimit, NULL },
440 { "rlimit-nofile", parse_rlimit, NULL },
441 { "rlimit-as", parse_rlimit, NULL },
442 #ifdef RLIMIT_NPROC
443 { "rlimit-nproc", parse_rlimit, NULL },
444 #endif
445 #ifdef RLIMIT_MEMLOCK
446 { "rlimit-memlock", parse_rlimit, NULL },
447 #endif
448 #ifdef RLIMIT_LOCKS
449 { "rlimit-locks", parse_rlimit, NULL },
450 #endif
451 #ifdef RLIMIT_SIGPENDING
452 { "rlimit-sigpending", parse_rlimit, NULL },
453 #endif
454 #ifdef RLIMIT_MSGQUEUE
455 { "rlimit-msgqueue", parse_rlimit, NULL },
456 #endif
457 #ifdef RLIMIT_NICE
458 { "rlimit-nice", parse_rlimit, NULL },
459 #endif
460 #ifdef RLIMIT_RTPRIO
461 { "rlimit-rtprio", parse_rlimit, NULL },
462 #endif
463 #ifdef RLIMIT_RTTIME
464 { "rlimit-rttime", parse_rlimit, NULL },
465 #endif
466 #endif
467 { NULL, NULL, NULL },
468 };
469
470 table[0].data = &c->daemonize;
471 table[1].data = &c->fail;
472 table[2].data = &c->high_priority;
473 table[3].data = &c->realtime_scheduling;
474 table[4].data = &c->disallow_module_loading;
475 table[5].data = &c->disallow_exit;
476 table[6].data = &c->use_pid_file;
477 table[7].data = &c->system_instance;
478 table[8].data = &c->no_cpu_limit;
479 table[9].data = &c->disable_shm;
480 table[10].data = &c->exit_idle_time;
481 table[11].data = &c->module_idle_time;
482 table[12].data = &c->scache_idle_time;
483 table[13].data = c;
484 table[14].data = &c->dl_search_path;
485 table[15].data = &c->default_script_file;
486 table[16].data = c;
487 table[17].data = c;
488 table[18].data = c;
489 table[19].data = c;
490 table[20].data = c;
491 table[21].data = c;
492 table[22].data = c;
493 table[23].data = c;
494 table[24].data = c;
495 table[25].data = c;
496 table[26].data = &c->disable_remixing;
497 table[27].data = &c->disable_lfe_remixing;
498 table[28].data = &c->load_default_script_file;
499 table[29].data = &c->shm_size;
500 #ifdef HAVE_SYS_RESOURCE_H
501 table[30].data = &c->rlimit_fsize;
502 table[31].data = &c->rlimit_data;
503 table[32].data = &c->rlimit_stack;
504 table[33].data = &c->rlimit_as;
505 table[34].data = &c->rlimit_core;
506 table[35].data = &c->rlimit_nofile;
507 table[36].data = &c->rlimit_as;
508 #ifdef RLIMIT_NPROC
509 table[37].data = &c->rlimit_nproc;
510 #endif
511
512 #ifdef RLIMIT_MEMLOCK
513 #ifndef RLIMIT_NPROC
514 #error "Houston, we have a numbering problem!"
515 #endif
516 table[38].data = &c->rlimit_memlock;
517 #endif
518
519 #ifdef RLIMIT_LOCKS
520 #ifndef RLIMIT_MEMLOCK
521 #error "Houston, we have a numbering problem!"
522 #endif
523 table[39].data = &c->rlimit_locks;
524 #endif
525
526 #ifdef RLIMIT_SIGPENDING
527 #ifndef RLIMIT_LOCKS
528 #error "Houston, we have a numbering problem!"
529 #endif
530 table[40].data = &c->rlimit_sigpending;
531 #endif
532
533 #ifdef RLIMIT_MSGQUEUE
534 #ifndef RLIMIT_SIGPENDING
535 #error "Houston, we have a numbering problem!"
536 #endif
537 table[41].data = &c->rlimit_msgqueue;
538 #endif
539
540 #ifdef RLIMIT_NICE
541 #ifndef RLIMIT_MSGQUEUE
542 #error "Houston, we have a numbering problem!"
543 #endif
544 table[42].data = &c->rlimit_nice;
545 #endif
546
547 #ifdef RLIMIT_RTPRIO
548 #ifndef RLIMIT_NICE
549 #error "Houston, we have a numbering problem!"
550 #endif
551 table[43].data = &c->rlimit_rtprio;
552 #endif
553
554 #ifdef RLIMIT_RTTIME
555 #ifndef RLIMIT_RTTIME
556 #error "Houston, we have a numbering problem!"
557 #endif
558 table[44].data = &c->rlimit_rttime;
559 #endif
560 #endif
561
562 pa_xfree(c->config_file);
563 c->config_file = NULL;
564
565 f = filename ?
566 fopen(c->config_file = pa_xstrdup(filename), "r") :
567 pa_open_config_file(DEFAULT_CONFIG_FILE, DEFAULT_CONFIG_FILE_USER, ENV_CONFIG_FILE, &c->config_file);
568
569 if (!f && errno != ENOENT) {
570 pa_log_warn(_("Failed to open configuration file: %s"), pa_cstrerror(errno));
571 goto finish;
572 }
573
574 r = f ? pa_config_parse(c->config_file, f, table, NULL) : 0;
575
576 finish:
577 if (f)
578 fclose(f);
579
580 return r;
581 }
582
583 int pa_daemon_conf_env(pa_daemon_conf *c) {
584 char *e;
585 pa_assert(c);
586
587 if ((e = getenv(ENV_DL_SEARCH_PATH))) {
588 pa_xfree(c->dl_search_path);
589 c->dl_search_path = pa_xstrdup(e);
590 }
591 if ((e = getenv(ENV_SCRIPT_FILE))) {
592 pa_xfree(c->default_script_file);
593 c->default_script_file = pa_xstrdup(e);
594 }
595
596 return 0;
597 }
598
599 const char *pa_daemon_conf_get_default_script_file(pa_daemon_conf *c) {
600 pa_assert(c);
601
602 if (!c->default_script_file) {
603 if (c->system_instance)
604 c->default_script_file = pa_find_config_file(DEFAULT_SYSTEM_SCRIPT_FILE, NULL, ENV_SCRIPT_FILE);
605 else
606 c->default_script_file = pa_find_config_file(DEFAULT_SCRIPT_FILE, DEFAULT_SCRIPT_FILE_USER, ENV_SCRIPT_FILE);
607 }
608
609 return c->default_script_file;
610 }
611
612 FILE *pa_daemon_conf_open_default_script_file(pa_daemon_conf *c) {
613 FILE *f;
614 pa_assert(c);
615
616 if (!c->default_script_file) {
617 if (c->system_instance)
618 f = pa_open_config_file(DEFAULT_SYSTEM_SCRIPT_FILE, NULL, ENV_SCRIPT_FILE, &c->default_script_file);
619 else
620 f = pa_open_config_file(DEFAULT_SCRIPT_FILE, DEFAULT_SCRIPT_FILE_USER, ENV_SCRIPT_FILE, &c->default_script_file);
621 } else
622 f = fopen(c->default_script_file, "r");
623
624 return f;
625 }
626
627
628 static const char* const log_level_to_string[] = {
629 [PA_LOG_DEBUG] = "debug",
630 [PA_LOG_INFO] = "info",
631 [PA_LOG_NOTICE] = "notice",
632 [PA_LOG_WARN] = "warning",
633 [PA_LOG_ERROR] = "error"
634 };
635
636 char *pa_daemon_conf_dump(pa_daemon_conf *c) {
637 pa_strbuf *s;
638
639 pa_assert(c);
640
641 s = pa_strbuf_new();
642
643 if (c->config_file)
644 pa_strbuf_printf(s, _("### Read from configuration file: %s ###\n"), c->config_file);
645
646 pa_assert(c->log_level <= PA_LOG_LEVEL_MAX);
647
648 pa_strbuf_printf(s, "daemonize = %s\n", pa_yes_no(c->daemonize));
649 pa_strbuf_printf(s, "fail = %s\n", pa_yes_no(c->fail));
650 pa_strbuf_printf(s, "high-priority = %s\n", pa_yes_no(c->high_priority));
651 pa_strbuf_printf(s, "nice-level = %i\n", c->nice_level);
652 pa_strbuf_printf(s, "realtime-scheduling = %s\n", pa_yes_no(c->realtime_scheduling));
653 pa_strbuf_printf(s, "realtime-priority = %i\n", c->realtime_priority);
654 pa_strbuf_printf(s, "disallow-module-loading = %s\n", pa_yes_no(c->disallow_module_loading));
655 pa_strbuf_printf(s, "disallow-exit = %s\n", pa_yes_no(c->disallow_exit));
656 pa_strbuf_printf(s, "use-pid-file = %s\n", pa_yes_no(c->use_pid_file));
657 pa_strbuf_printf(s, "system-instance = %s\n", pa_yes_no(c->system_instance));
658 pa_strbuf_printf(s, "no-cpu-limit = %s\n", pa_yes_no(c->no_cpu_limit));
659 pa_strbuf_printf(s, "disable-shm = %s\n", pa_yes_no(c->disable_shm));
660 pa_strbuf_printf(s, "exit-idle-time = %i\n", c->exit_idle_time);
661 pa_strbuf_printf(s, "module-idle-time = %i\n", c->module_idle_time);
662 pa_strbuf_printf(s, "scache-idle-time = %i\n", c->scache_idle_time);
663 pa_strbuf_printf(s, "dl-search-path = %s\n", pa_strempty(c->dl_search_path));
664 pa_strbuf_printf(s, "default-script-file = %s\n", pa_strempty(pa_daemon_conf_get_default_script_file(c)));
665 pa_strbuf_printf(s, "load-default-script-file = %s\n", pa_yes_no(c->load_default_script_file));
666 pa_strbuf_printf(s, "log-target = %s\n", c->auto_log_target ? "auto" : (c->log_target == PA_LOG_SYSLOG ? "syslog" : "stderr"));
667 pa_strbuf_printf(s, "log-level = %s\n", log_level_to_string[c->log_level]);
668 pa_strbuf_printf(s, "resample-method = %s\n", pa_resample_method_to_string(c->resample_method));
669 pa_strbuf_printf(s, "disable-remixing = %s\n", pa_yes_no(c->disable_remixing));
670 pa_strbuf_printf(s, "disable-lfe-remixing = %s\n", pa_yes_no(c->disable_lfe_remixing));
671 pa_strbuf_printf(s, "default-sample-format = %s\n", pa_sample_format_to_string(c->default_sample_spec.format));
672 pa_strbuf_printf(s, "default-sample-rate = %u\n", c->default_sample_spec.rate);
673 pa_strbuf_printf(s, "default-sample-channels = %u\n", c->default_sample_spec.channels);
674 pa_strbuf_printf(s, "default-fragments = %u\n", c->default_n_fragments);
675 pa_strbuf_printf(s, "default-fragment-size-msec = %u\n", c->default_fragment_size_msec);
676 pa_strbuf_printf(s, "shm-size-bytes = %lu\n", (unsigned long) c->shm_size);
677 #ifdef HAVE_SYS_RESOURCE_H
678 pa_strbuf_printf(s, "rlimit-fsize = %li\n", c->rlimit_fsize.is_set ? (long int) c->rlimit_fsize.value : -1);
679 pa_strbuf_printf(s, "rlimit-data = %li\n", c->rlimit_data.is_set ? (long int) c->rlimit_data.value : -1);
680 pa_strbuf_printf(s, "rlimit-stack = %li\n", c->rlimit_stack.is_set ? (long int) c->rlimit_stack.value : -1);
681 pa_strbuf_printf(s, "rlimit-core = %li\n", c->rlimit_core.is_set ? (long int) c->rlimit_core.value : -1);
682 pa_strbuf_printf(s, "rlimit-as = %li\n", c->rlimit_as.is_set ? (long int) c->rlimit_as.value : -1);
683 pa_strbuf_printf(s, "rlimit-rss = %li\n", c->rlimit_rss.is_set ? (long int) c->rlimit_rss.value : -1);
684 #ifdef RLIMIT_NPROC
685 pa_strbuf_printf(s, "rlimit-nproc = %li\n", c->rlimit_nproc.is_set ? (long int) c->rlimit_nproc.value : -1);
686 #endif
687 pa_strbuf_printf(s, "rlimit-nofile = %li\n", c->rlimit_nofile.is_set ? (long int) c->rlimit_nofile.value : -1);
688 #ifdef RLIMIT_MEMLOCK
689 pa_strbuf_printf(s, "rlimit-memlock = %li\n", c->rlimit_memlock.is_set ? (long int) c->rlimit_memlock.value : -1);
690 #endif
691 #ifdef RLIMIT_LOCKS
692 pa_strbuf_printf(s, "rlimit-locks = %li\n", c->rlimit_locks.is_set ? (long int) c->rlimit_locks.value : -1);
693 #endif
694 #ifdef RLIMIT_SIGPENDING
695 pa_strbuf_printf(s, "rlimit-sigpending = %li\n", c->rlimit_sigpending.is_set ? (long int) c->rlimit_sigpending.value : -1);
696 #endif
697 #ifdef RLIMIT_MSGQUEUE
698 pa_strbuf_printf(s, "rlimit-msgqueue = %li\n", c->rlimit_msgqueue.is_set ? (long int) c->rlimit_msgqueue.value : -1);
699 #endif
700 #ifdef RLIMIT_NICE
701 pa_strbuf_printf(s, "rlimit-nice = %li\n", c->rlimit_nice.is_set ? (long int) c->rlimit_nice.value : -1);
702 #endif
703 #ifdef RLIMIT_RTPRIO
704 pa_strbuf_printf(s, "rlimit-rtprio = %li\n", c->rlimit_rtprio.is_set ? (long int) c->rlimit_rtprio.value : -1);
705 #endif
706 #ifdef RLIMIT_RTTIME
707 pa_strbuf_printf(s, "rlimit-rttime = %li\n", c->rlimit_rttime.is_set ? (long int) c->rlimit_rttime.value : -1);
708 #endif
709 #endif
710
711 return pa_strbuf_tostring_free(s);
712 }