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
39 #include <sys/types.h>
42 #include <liboil/liboil.h>
44 #ifdef HAVE_SYS_MMAN_H
48 #ifdef HAVE_SYS_IOCTL_H
49 #include <sys/ioctl.h>
65 #include <dbus/dbus.h>
68 #include <pulse/mainloop.h>
69 #include <pulse/mainloop-signal.h>
70 #include <pulse/timeval.h>
71 #include <pulse/xmalloc.h>
72 #include <pulse/i18n.h>
74 #include <pulsecore/lock-autospawn.h>
75 #include <pulsecore/winsock.h>
76 #include <pulsecore/core-error.h>
77 #include <pulsecore/core-rtclock.h>
78 #include <pulsecore/core.h>
79 #include <pulsecore/memblock.h>
80 #include <pulsecore/module.h>
81 #include <pulsecore/cli-command.h>
82 #include <pulsecore/log.h>
83 #include <pulsecore/core-util.h>
84 #include <pulsecore/sioman.h>
85 #include <pulsecore/cli-text.h>
86 #include <pulsecore/pid.h>
87 #include <pulsecore/namereg.h>
88 #include <pulsecore/random.h>
89 #include <pulsecore/macro.h>
90 #include <pulsecore/mutex.h>
91 #include <pulsecore/thread.h>
92 #include <pulsecore/once.h>
93 #include <pulsecore/shm.h>
94 #include <pulsecore/memtrap.h>
96 #include <pulsecore/dbus-shared.h>
98 #include <pulsecore/cpu-x86.h>
101 #include "cpulimit.h"
102 #include "daemon-conf.h"
103 #include "dumpmodules.h"
105 #include "ltdl-bind-now.h"
108 /* Only one instance of these variables */
109 int allow_severity
= LOG_INFO
;
110 int deny_severity
= LOG_WARNING
;
113 #ifdef HAVE_OSS_WRAPPER
114 /* padsp looks for this symbol in the running process and disables
115 * itself if it finds it and it is set to 7 (which is actually a bit
116 * mask). For details see padsp. */
117 int __padsp_disabled__
= 7;
122 static void message_cb(pa_mainloop_api
*a
, pa_time_event
*e
, const struct timeval
*tv
, void *userdata
) {
124 struct timeval tvnext
;
126 while (PeekMessage(&msg
, NULL
, 0, 0, PM_REMOVE
)) {
127 if (msg
.message
== WM_QUIT
)
130 TranslateMessage(&msg
);
131 DispatchMessage(&msg
);
135 pa_timeval_add(pa_gettimeofday(&tvnext
), 100000);
136 a
->rtclock_time_restart(e
, &tvnext
);
141 static void signal_callback(pa_mainloop_api
*m
, pa_signal_event
*e
, int sig
, void *userdata
) {
142 pa_log_info(_("Got signal %s."), pa_sig2str(sig
));
147 pa_module_load(userdata
, "module-cli", NULL
);
153 pa_module_load(userdata
, "module-cli-protocol-unix", NULL
);
159 char *c
= pa_full_status_string(userdata
);
160 pa_log_notice("%s", c
);
169 pa_log_info(_("Exiting."));
175 #if defined(HAVE_PWD_H) && defined(HAVE_GRP_H)
177 static int change_user(void) {
182 /* This function is called only in system-wide mode. It creates a
183 * runtime dir in /var/run/ with proper UID/GID and drops privs
186 if (!(pw
= getpwnam(PA_SYSTEM_USER
))) {
187 pa_log(_("Failed to find user '%s'."), PA_SYSTEM_USER
);
191 if (!(gr
= getgrnam(PA_SYSTEM_GROUP
))) {
192 pa_log(_("Failed to find group '%s'."), PA_SYSTEM_GROUP
);
196 pa_log_info(_("Found user '%s' (UID %lu) and group '%s' (GID %lu)."),
197 PA_SYSTEM_USER
, (unsigned long) pw
->pw_uid
,
198 PA_SYSTEM_GROUP
, (unsigned long) gr
->gr_gid
);
200 if (pw
->pw_gid
!= gr
->gr_gid
) {
201 pa_log(_("GID of user '%s' and of group '%s' don't match."), PA_SYSTEM_USER
, PA_SYSTEM_GROUP
);
205 if (strcmp(pw
->pw_dir
, PA_SYSTEM_RUNTIME_PATH
) != 0)
206 pa_log_warn(_("Home directory of user '%s' is not '%s', ignoring."), PA_SYSTEM_USER
, PA_SYSTEM_RUNTIME_PATH
);
208 if (pa_make_secure_dir(PA_SYSTEM_RUNTIME_PATH
, 0755, pw
->pw_uid
, gr
->gr_gid
) < 0) {
209 pa_log(_("Failed to create '%s': %s"), PA_SYSTEM_RUNTIME_PATH
, pa_cstrerror(errno
));
213 if (pa_make_secure_dir(PA_SYSTEM_STATE_PATH
, 0700, pw
->pw_uid
, gr
->gr_gid
) < 0) {
214 pa_log(_("Failed to create '%s': %s"), PA_SYSTEM_STATE_PATH
, pa_cstrerror(errno
));
218 /* We don't create the config dir here, because we don't need to write to it */
220 if (initgroups(PA_SYSTEM_USER
, gr
->gr_gid
) != 0) {
221 pa_log(_("Failed to change group list: %s"), pa_cstrerror(errno
));
225 #if defined(HAVE_SETRESGID)
226 r
= setresgid(gr
->gr_gid
, gr
->gr_gid
, gr
->gr_gid
);
227 #elif defined(HAVE_SETEGID)
228 if ((r
= setgid(gr
->gr_gid
)) >= 0)
229 r
= setegid(gr
->gr_gid
);
230 #elif defined(HAVE_SETREGID)
231 r
= setregid(gr
->gr_gid
, gr
->gr_gid
);
233 #error "No API to drop privileges"
237 pa_log(_("Failed to change GID: %s"), pa_cstrerror(errno
));
241 #if defined(HAVE_SETRESUID)
242 r
= setresuid(pw
->pw_uid
, pw
->pw_uid
, pw
->pw_uid
);
243 #elif defined(HAVE_SETEUID)
244 if ((r
= setuid(pw
->pw_uid
)) >= 0)
245 r
= seteuid(pw
->pw_uid
);
246 #elif defined(HAVE_SETREUID)
247 r
= setreuid(pw
->pw_uid
, pw
->pw_uid
);
249 #error "No API to drop privileges"
253 pa_log(_("Failed to change UID: %s"), pa_cstrerror(errno
));
257 pa_set_env("USER", PA_SYSTEM_USER
);
258 pa_set_env("USERNAME", PA_SYSTEM_USER
);
259 pa_set_env("LOGNAME", PA_SYSTEM_USER
);
260 pa_set_env("HOME", PA_SYSTEM_RUNTIME_PATH
);
262 /* Relevant for pa_runtime_path() */
263 pa_set_env("PULSE_RUNTIME_PATH", PA_SYSTEM_RUNTIME_PATH
);
264 pa_set_env("PULSE_CONFIG_PATH", PA_SYSTEM_CONFIG_PATH
);
265 pa_set_env("PULSE_STATE_PATH", PA_SYSTEM_STATE_PATH
);
267 pa_log_info(_("Successfully dropped root privileges."));
272 #else /* HAVE_PWD_H && HAVE_GRP_H */
274 static int change_user(void) {
275 pa_log(_("System wide mode unsupported on this platform."));
279 #endif /* HAVE_PWD_H && HAVE_GRP_H */
281 #ifdef HAVE_SYS_RESOURCE_H
283 static int set_one_rlimit(const pa_rlimit
*r
, int resource
, const char *name
) {
290 rl
.rlim_cur
= rl
.rlim_max
= r
->value
;
292 if (setrlimit(resource
, &rl
) < 0) {
293 pa_log_info(_("setrlimit(%s, (%u, %u)) failed: %s"), name
, (unsigned) r
->value
, (unsigned) r
->value
, pa_cstrerror(errno
));
300 static void set_all_rlimits(const pa_daemon_conf
*conf
) {
301 set_one_rlimit(&conf
->rlimit_fsize
, RLIMIT_FSIZE
, "RLIMIT_FSIZE");
302 set_one_rlimit(&conf
->rlimit_data
, RLIMIT_DATA
, "RLIMIT_DATA");
303 set_one_rlimit(&conf
->rlimit_stack
, RLIMIT_STACK
, "RLIMIT_STACK");
304 set_one_rlimit(&conf
->rlimit_core
, RLIMIT_CORE
, "RLIMIT_CORE");
306 set_one_rlimit(&conf
->rlimit_rss
, RLIMIT_RSS
, "RLIMIT_RSS");
309 set_one_rlimit(&conf
->rlimit_nproc
, RLIMIT_NPROC
, "RLIMIT_NPROC");
312 set_one_rlimit(&conf
->rlimit_nofile
, RLIMIT_NOFILE
, "RLIMIT_NOFILE");
314 #ifdef RLIMIT_MEMLOCK
315 set_one_rlimit(&conf
->rlimit_memlock
, RLIMIT_MEMLOCK
, "RLIMIT_MEMLOCK");
318 set_one_rlimit(&conf
->rlimit_as
, RLIMIT_AS
, "RLIMIT_AS");
321 set_one_rlimit(&conf
->rlimit_locks
, RLIMIT_LOCKS
, "RLIMIT_LOCKS");
323 #ifdef RLIMIT_SIGPENDING
324 set_one_rlimit(&conf
->rlimit_sigpending
, RLIMIT_SIGPENDING
, "RLIMIT_SIGPENDING");
326 #ifdef RLIMIT_MSGQUEUE
327 set_one_rlimit(&conf
->rlimit_msgqueue
, RLIMIT_MSGQUEUE
, "RLIMIT_MSGQUEUE");
330 set_one_rlimit(&conf
->rlimit_nice
, RLIMIT_NICE
, "RLIMIT_NICE");
333 set_one_rlimit(&conf
->rlimit_rtprio
, RLIMIT_RTPRIO
, "RLIMIT_RTPRIO");
336 set_one_rlimit(&conf
->rlimit_rttime
, RLIMIT_RTTIME
, "RLIMIT_RTTIME");
342 static pa_dbus_connection
*register_dbus(pa_core
*c
) {
344 pa_dbus_connection
*conn
;
346 dbus_error_init(&error
);
348 if (!(conn
= pa_dbus_bus_get(c
, pa_in_system_mode() ? DBUS_BUS_SYSTEM
: DBUS_BUS_SESSION
, &error
)) || dbus_error_is_set(&error
)) {
349 pa_log_warn("Unable to contact D-Bus: %s: %s", error
.name
, error
.message
);
353 if (dbus_bus_request_name(pa_dbus_connection_get(conn
), "org.pulseaudio.Server", DBUS_NAME_FLAG_DO_NOT_QUEUE
, &error
) == DBUS_REQUEST_NAME_REPLY_PRIMARY_OWNER
) {
354 pa_log_debug("Got org.pulseaudio.Server!");
358 if (dbus_error_is_set(&error
))
359 pa_log_warn("Failed to acquire org.pulseaudio.Server: %s: %s", error
.name
, error
.message
);
361 pa_log_warn("D-Bus name org.pulseaudio.Server already taken. Weird shit!");
363 /* PA cannot be started twice by the same user and hence we can
364 * ignore mostly the case that org.pulseaudio.Server is already
370 pa_dbus_connection_unref(conn
);
372 dbus_error_free(&error
);
377 int main(int argc
, char *argv
[]) {
379 pa_strbuf
*buf
= NULL
;
380 pa_daemon_conf
*conf
= NULL
;
381 pa_mainloop
*mainloop
= NULL
;
383 int r
= 0, retval
= 1, d
= 0;
384 pa_bool_t valid_pid_file
= FALSE
;
385 pa_bool_t ltdl_init
= FALSE
;
389 int daemon_pipe
[2] = { -1, -1 };
392 pa_time_event
*win32_timer
;
393 struct timeval win32_tv
;
395 int autospawn_fd
= -1;
396 pa_bool_t autospawn_locked
= FALSE
;
398 pa_dbus_connection
*dbus
= NULL
;
401 pa_log_set_ident("pulseaudio");
402 pa_log_set_level(PA_LOG_NOTICE
);
403 pa_log_set_flags(PA_LOG_COLORS
|PA_LOG_PRINT_FILE
|PA_LOG_PRINT_LEVEL
, PA_LOG_RESET
);
405 #if defined(__linux__) && defined(__OPTIMIZE__)
407 Disable lazy relocations to make usage of external libraries
408 more deterministic for our RT threads. We abuse __OPTIMIZE__ as
409 a check whether we are a debug build or not. This all is
410 admittedly a bit snake-oilish.
413 if (!getenv("LD_BIND_NOW")) {
416 /* We have to execute ourselves, because the libc caches the
417 * value of $LD_BIND_NOW on initialization. */
419 pa_set_env("LD_BIND_NOW", "1");
421 if ((rp
= pa_readlink("/proc/self/exe"))) {
423 if (pa_streq(rp
, PA_BINARY
))
424 pa_assert_se(execv(rp
, argv
) == 0);
426 pa_log_warn("/proc/self/exe does not point to " PA_BINARY
", cannot self execute. Are you playing games?");
431 pa_log_warn("Couldn't read /proc/self/exe, cannot self execute. Running in a chroot()?");
435 if ((e
= getenv("PULSE_PASSED_FD"))) {
442 /* We might be autospawned, in which case have no idea in which
443 * context we have been started. Let's cleanup our execution
444 * context as good as possible */
446 pa_reset_personality();
448 pa_close_all(passed_fd
, -1);
453 setlocale(LC_ALL
, "");
456 conf
= pa_daemon_conf_new();
458 if (pa_daemon_conf_load(conf
, NULL
) < 0)
461 if (pa_daemon_conf_env(conf
) < 0)
464 if (pa_cmdline_parse(conf
, argc
, argv
, &d
) < 0) {
465 pa_log(_("Failed to parse command line."));
469 pa_log_set_level(conf
->log_level
);
470 pa_log_set_target(conf
->auto_log_target
? PA_LOG_STDERR
: conf
->log_target
);
472 pa_log_set_flags(PA_LOG_PRINT_META
, PA_LOG_SET
);
474 pa_log_set_flags(PA_LOG_PRINT_TIME
, PA_LOG_SET
);
475 pa_log_set_show_backtrace(conf
->log_backtrace
);
477 LTDL_SET_PRELOADED_SYMBOLS();
481 if (conf
->dl_search_path
)
482 lt_dlsetsearchpath(conf
->dl_search_path
);
487 WSAStartup(MAKEWORD(2, 0), &data
);
494 case PA_CMD_DUMP_MODULES
:
495 pa_dump_modules(conf
, argc
-d
, argv
+d
);
499 case PA_CMD_DUMP_CONF
: {
500 s
= pa_daemon_conf_dump(conf
);
507 case PA_CMD_DUMP_RESAMPLE_METHODS
: {
510 for (i
= 0; i
< PA_RESAMPLER_MAX
; i
++)
511 if (pa_resample_method_supported(i
))
512 printf("%s\n", pa_resample_method_to_string(i
));
519 pa_cmdline_help(argv
[0]);
523 case PA_CMD_VERSION
:
524 printf(PACKAGE_NAME
" "PACKAGE_VERSION
"\n");
531 if (pa_pid_file_check_running(&pid
, "pulseaudio") < 0)
532 pa_log_info(_("Daemon not running"));
534 pa_log_info(_("Daemon running as PID %u"), pid
);
543 if (pa_pid_file_kill(SIGINT
, NULL
, "pulseaudio") < 0)
544 pa_log(_("Failed to kill daemon: %s"), pa_cstrerror(errno
));
550 case PA_CMD_CLEANUP_SHM
:
552 if (pa_shm_cleanup() >= 0)
558 pa_assert(conf
->cmd
== PA_CMD_DAEMON
|| conf
->cmd
== PA_CMD_START
);
561 if (getuid() == 0 && !conf
->system_instance
)
562 pa_log_warn(_("This program is not intended to be run as root (unless --system is specified)."));
563 else if (getuid() != 0 && conf
->system_instance
) {
564 pa_log(_("Root privileges required."));
568 if (conf
->cmd
== PA_CMD_START
&& conf
->system_instance
) {
569 pa_log(_("--start not supported for system instances."));
573 if (conf
->system_instance
&& !conf
->disallow_exit
)
574 pa_log_warn(_("Running in system mode, but --disallow-exit not set!"));
576 if (conf
->system_instance
&& !conf
->disallow_module_loading
)
577 pa_log_warn(_("Running in system mode, but --disallow-module-loading not set!"));
579 if (conf
->system_instance
&& !conf
->disable_shm
) {
580 pa_log_notice(_("Running in system mode, forcibly disabling SHM mode!"));
581 conf
->disable_shm
= TRUE
;
584 if (conf
->system_instance
&& conf
->exit_idle_time
>= 0) {
585 pa_log_notice(_("Running in system mode, forcibly disabling exit idle time!"));
586 conf
->exit_idle_time
= -1;
589 if (conf
->cmd
== PA_CMD_START
) {
590 /* If we shall start PA only when it is not running yet, we
591 * first take the autospawn lock to make things
594 if ((autospawn_fd
= pa_autospawn_lock_init()) < 0) {
595 pa_log("Failed to initialize autospawn lock");
599 if ((pa_autospawn_lock_acquire(TRUE
) < 0)) {
600 pa_log("Failed to acquire autospawn lock");
604 autospawn_locked
= TRUE
;
607 if (conf
->daemonize
) {
611 if (pa_stdio_acquire() < 0) {
612 pa_log(_("Failed to acquire stdio."));
617 if (pipe(daemon_pipe
) < 0) {
618 pa_log(_("pipe failed: %s"), pa_cstrerror(errno
));
622 if ((child
= fork()) < 0) {
623 pa_log(_("fork() failed: %s"), pa_cstrerror(errno
));
631 pa_assert_se(pa_close(daemon_pipe
[1]) == 0);
634 if ((n
= pa_loop_read(daemon_pipe
[0], &retval
, sizeof(retval
), NULL
)) != sizeof(retval
)) {
637 pa_log(_("read() failed: %s"), pa_cstrerror(errno
));
643 pa_log(_("Daemon startup failed."));
645 pa_log_info(_("Daemon startup successful."));
650 if (autospawn_fd
>= 0) {
651 /* The lock file is unlocked from the parent, so we need
652 * to close it in the child */
654 pa_autospawn_lock_release();
655 pa_autospawn_lock_done(TRUE
);
657 autospawn_locked
= FALSE
;
661 pa_assert_se(pa_close(daemon_pipe
[0]) == 0);
665 if (conf
->auto_log_target
)
666 pa_log_set_target(PA_LOG_SYSLOG
);
680 pa_assert_se(open("/dev/null", O_RDONLY
) == 0);
681 pa_assert_se(open("/dev/null", O_WRONLY
) == 1);
682 pa_assert_se(open("/dev/null", O_WRONLY
) == 2);
688 signal(SIGTTOU
, SIG_IGN
);
691 signal(SIGTTIN
, SIG_IGN
);
694 signal(SIGTSTP
, SIG_IGN
);
698 if ((tty_fd
= open("/dev/tty", O_RDWR
)) >= 0) {
699 ioctl(tty_fd
, TIOCNOTTY
, (char*) 0);
700 pa_assert_se(pa_close(tty_fd
) == 0);
705 pa_set_env("PULSE_INTERNAL", "1");
706 pa_assert_se(chdir("/") == 0);
709 #ifdef HAVE_SYS_RESOURCE_H
710 set_all_rlimits(conf
);
712 pa_rtclock_hrtimer_enable();
714 pa_raise_priority(conf
->nice_level
);
716 if (conf
->system_instance
)
717 if (change_user() < 0)
720 pa_set_env("PULSE_SYSTEM", conf
->system_instance
? "1" : "0");
722 pa_log_info(_("This is PulseAudio %s"), PACKAGE_VERSION
);
723 pa_log_debug(_("Compilation host: %s"), CANONICAL_HOST
);
724 pa_log_debug(_("Compilation CFLAGS: %s"), PA_CFLAGS
);
726 s
= pa_uname_string();
727 pa_log_debug(_("Running on host: %s"), s
);
730 pa_log_debug(_("Found %u CPUs."), pa_ncpus());
732 pa_log_info(_("Page size is %lu bytes"), (unsigned long) PA_PAGE_SIZE
);
734 #ifdef HAVE_VALGRIND_MEMCHECK_H
735 pa_log_debug(_("Compiled with Valgrind support: yes"));
737 pa_log_debug(_("Compiled with Valgrind support: no"));
740 pa_log_debug(_("Running in valgrind mode: %s"), pa_yes_no(pa_in_valgrind()));
743 pa_log_debug(_("Optimized build: yes"));
745 pa_log_debug(_("Optimized build: no"));
749 pa_log_debug(_("NDEBUG defined, all asserts disabled."));
750 #elif defined(FASTPATH)
751 pa_log_debug(_("FASTPATH defined, only fast path asserts disabled."));
753 pa_log_debug(_("All asserts enabled."));
756 if (!(s
= pa_machine_id())) {
757 pa_log(_("Failed to get machine ID"));
760 pa_log_info(_("Machine ID is %s."), s
);
763 if ((s
= pa_session_id())) {
764 pa_log_info(_("Session ID is %s."), s
);
768 if (!(s
= pa_get_runtime_dir()))
770 pa_log_info(_("Using runtime directory %s."), s
);
773 if (!(s
= pa_get_state_dir()))
775 pa_log_info(_("Using state directory %s."), s
);
778 pa_log_info(_("Running in system mode: %s"), pa_yes_no(pa_in_system_mode()));
780 if (pa_in_system_mode())
781 pa_log_warn(_("OK, so you are running PA in system mode. Please note that you most likely shouldn't be doing that.\n"
782 "If you do it nonetheless then it's your own fault if things don't work as expected.\n"
783 "Please read http://pulseaudio.org/wiki/WhatIsWrongWithSystemMode for an explanation why system mode is usually a bad idea."));
785 if (conf
->use_pid_file
) {
788 if ((z
= pa_pid_file_create("pulseaudio")) != 0) {
790 if (conf
->cmd
== PA_CMD_START
&& z
> 0) {
791 /* If we are already running and with are run in
792 * --start mode, then let's return this as success. */
798 pa_log(_("pa_pid_file_create() failed."));
802 valid_pid_file
= TRUE
;
805 pa_disable_sigpipe();
807 if (pa_rtclock_hrtimer())
808 pa_log_info(_("Fresh high-resolution timers available! Bon appetit!"));
810 pa_log_info(_("Dude, your kernel stinks! The chef's recommendation today is Linux with high-resolution timers enabled!"));
812 if (conf
->lock_memory
) {
813 #ifdef HAVE_SYS_MMAN_H
814 if (mlockall(MCL_FUTURE
) < 0)
815 pa_log_warn("mlockall() failed: %s", pa_cstrerror(errno
));
817 pa_log_info("Sucessfully locked process into memory.");
819 pa_log_warn("Memory locking requested but not supported on platform.");
823 pa_memtrap_install();
827 pa_assert_se(mainloop
= pa_mainloop_new());
829 if (!(c
= pa_core_new(pa_mainloop_get_api(mainloop
), !conf
->disable_shm
, conf
->shm_size
))) {
830 pa_log(_("pa_core_new() failed."));
834 c
->default_sample_spec
= conf
->default_sample_spec
;
835 c
->default_channel_map
= conf
->default_channel_map
;
836 c
->default_n_fragments
= conf
->default_n_fragments
;
837 c
->default_fragment_size_msec
= conf
->default_fragment_size_msec
;
838 c
->exit_idle_time
= conf
->exit_idle_time
;
839 c
->scache_idle_time
= conf
->scache_idle_time
;
840 c
->resample_method
= conf
->resample_method
;
841 c
->realtime_priority
= conf
->realtime_priority
;
842 c
->realtime_scheduling
= !!conf
->realtime_scheduling
;
843 c
->disable_remixing
= !!conf
->disable_remixing
;
844 c
->disable_lfe_remixing
= !!conf
->disable_lfe_remixing
;
845 c
->running_as_daemon
= !!conf
->daemonize
;
846 c
->disallow_exit
= conf
->disallow_exit
;
847 c
->flat_volumes
= conf
->flat_volumes
;
849 pa_assert_se(pa_signal_init(pa_mainloop_get_api(mainloop
)) == 0);
850 pa_signal_new(SIGINT
, signal_callback
, c
);
851 pa_signal_new(SIGTERM
, signal_callback
, c
);
853 pa_signal_new(SIGUSR1
, signal_callback
, c
);
856 pa_signal_new(SIGUSR2
, signal_callback
, c
);
859 pa_signal_new(SIGHUP
, signal_callback
, c
);
863 win32_timer
= pa_mainloop_get_api(mainloop
)->rtclock_time_new(pa_mainloop_get_api(mainloop
), pa_gettimeofday(&win32_tv
), message_cb
, NULL
);
868 if (!conf
->no_cpu_limit
)
869 pa_assert_se(pa_cpu_limit_init(pa_mainloop_get_api(mainloop
)) == 0);
871 buf
= pa_strbuf_new();
872 if (conf
->load_default_script_file
) {
875 if ((f
= pa_daemon_conf_open_default_script_file(conf
))) {
876 r
= pa_cli_command_execute_file_stream(c
, f
, buf
, &conf
->fail
);
882 r
= pa_cli_command_execute(c
, conf
->script_commands
, buf
, &conf
->fail
);
884 pa_log_error("%s", s
= pa_strbuf_tostring_free(buf
));
887 /* We completed the initial module loading, so let's disable it
888 * from now on, if requested */
889 c
->disallow_module_loading
= !!conf
->disallow_module_loading
;
891 if (r
< 0 && conf
->fail
) {
892 pa_log(_("Failed to initialize daemon."));
896 if (!c
->modules
|| pa_idxset_size(c
->modules
) == 0) {
897 pa_log(_("Daemon startup without any loaded modules, refusing to work."));
902 if (daemon_pipe
[1] >= 0) {
904 pa_loop_write(daemon_pipe
[1], &ok
, sizeof(ok
), NULL
);
905 pa_close(daemon_pipe
[1]);
911 dbus
= register_dbus(c
);
914 pa_log_info(_("Daemon startup complete."));
917 if (pa_mainloop_run(mainloop
, &retval
) < 0)
920 pa_log_info(_("Daemon shutdown initiated."));
925 pa_dbus_connection_unref(dbus
);
928 if (autospawn_fd
>= 0) {
929 if (autospawn_locked
)
930 pa_autospawn_lock_release();
932 pa_autospawn_lock_done(FALSE
);
937 pa_mainloop_get_api(mainloop
)->time_free(win32_timer
);
942 pa_log_info(_("Daemon terminated."));
945 if (!conf
->no_cpu_limit
)
951 if (daemon_pipe
[1] >= 0)
952 pa_loop_write(daemon_pipe
[1], &retval
, sizeof(retval
), NULL
);
954 pa_close_pipe(daemon_pipe
);
958 pa_mainloop_free(mainloop
);
961 pa_daemon_conf_free(conf
);
964 pa_pid_file_remove();