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>
100 #include "cpulimit.h"
101 #include "daemon-conf.h"
102 #include "dumpmodules.h"
104 #include "ltdl-bind-now.h"
107 /* Only one instance of these variables */
108 int allow_severity
= LOG_INFO
;
109 int deny_severity
= LOG_WARNING
;
113 /* padsp looks for this symbol in the running process and disables
114 * itself if it finds it and it is set to 7 (which is actually a bit
115 * mask). For details see padsp. */
116 int __padsp_disabled__
= 7;
121 static void message_cb(pa_mainloop_api
*a
, pa_time_event
*e
, const struct timeval
*tv
, void *userdata
) {
123 struct timeval tvnext
;
125 while (PeekMessage(&msg
, NULL
, 0, 0, PM_REMOVE
)) {
126 if (msg
.message
== WM_QUIT
)
129 TranslateMessage(&msg
);
130 DispatchMessage(&msg
);
134 pa_timeval_add(pa_gettimeofday(&tvnext
), 100000);
135 a
->rtclock_time_restart(e
, &tvnext
);
140 static void signal_callback(pa_mainloop_api
*m
, pa_signal_event
*e
, int sig
, void *userdata
) {
141 pa_log_info(_("Got signal %s."), pa_sig2str(sig
));
146 pa_module_load(userdata
, "module-cli", NULL
);
152 pa_module_load(userdata
, "module-cli-protocol-unix", NULL
);
158 char *c
= pa_full_status_string(userdata
);
159 pa_log_notice("%s", c
);
168 pa_log_info(_("Exiting."));
174 #if defined(HAVE_PWD_H) && defined(HAVE_GRP_H)
176 static int change_user(void) {
181 /* This function is called only in system-wide mode. It creates a
182 * runtime dir in /var/run/ with proper UID/GID and drops privs
185 if (!(pw
= getpwnam(PA_SYSTEM_USER
))) {
186 pa_log(_("Failed to find user '%s'."), PA_SYSTEM_USER
);
190 if (!(gr
= getgrnam(PA_SYSTEM_GROUP
))) {
191 pa_log(_("Failed to find group '%s'."), PA_SYSTEM_GROUP
);
195 pa_log_info(_("Found user '%s' (UID %lu) and group '%s' (GID %lu)."),
196 PA_SYSTEM_USER
, (unsigned long) pw
->pw_uid
,
197 PA_SYSTEM_GROUP
, (unsigned long) gr
->gr_gid
);
199 if (pw
->pw_gid
!= gr
->gr_gid
) {
200 pa_log(_("GID of user '%s' and of group '%s' don't match."), PA_SYSTEM_USER
, PA_SYSTEM_GROUP
);
204 if (strcmp(pw
->pw_dir
, PA_SYSTEM_RUNTIME_PATH
) != 0)
205 pa_log_warn(_("Home directory of user '%s' is not '%s', ignoring."), PA_SYSTEM_USER
, PA_SYSTEM_RUNTIME_PATH
);
207 if (pa_make_secure_dir(PA_SYSTEM_RUNTIME_PATH
, 0755, pw
->pw_uid
, gr
->gr_gid
) < 0) {
208 pa_log(_("Failed to create '%s': %s"), PA_SYSTEM_RUNTIME_PATH
, pa_cstrerror(errno
));
212 if (pa_make_secure_dir(PA_SYSTEM_STATE_PATH
, 0700, pw
->pw_uid
, gr
->gr_gid
) < 0) {
213 pa_log(_("Failed to create '%s': %s"), PA_SYSTEM_STATE_PATH
, pa_cstrerror(errno
));
217 /* We don't create the config dir here, because we don't need to write to it */
219 if (initgroups(PA_SYSTEM_USER
, gr
->gr_gid
) != 0) {
220 pa_log(_("Failed to change group list: %s"), pa_cstrerror(errno
));
224 #if defined(HAVE_SETRESGID)
225 r
= setresgid(gr
->gr_gid
, gr
->gr_gid
, gr
->gr_gid
);
226 #elif defined(HAVE_SETEGID)
227 if ((r
= setgid(gr
->gr_gid
)) >= 0)
228 r
= setegid(gr
->gr_gid
);
229 #elif defined(HAVE_SETREGID)
230 r
= setregid(gr
->gr_gid
, gr
->gr_gid
);
232 #error "No API to drop privileges"
236 pa_log(_("Failed to change GID: %s"), pa_cstrerror(errno
));
240 #if defined(HAVE_SETRESUID)
241 r
= setresuid(pw
->pw_uid
, pw
->pw_uid
, pw
->pw_uid
);
242 #elif defined(HAVE_SETEUID)
243 if ((r
= setuid(pw
->pw_uid
)) >= 0)
244 r
= seteuid(pw
->pw_uid
);
245 #elif defined(HAVE_SETREUID)
246 r
= setreuid(pw
->pw_uid
, pw
->pw_uid
);
248 #error "No API to drop privileges"
252 pa_log(_("Failed to change UID: %s"), pa_cstrerror(errno
));
256 pa_set_env("USER", PA_SYSTEM_USER
);
257 pa_set_env("USERNAME", PA_SYSTEM_USER
);
258 pa_set_env("LOGNAME", PA_SYSTEM_USER
);
259 pa_set_env("HOME", PA_SYSTEM_RUNTIME_PATH
);
261 /* Relevant for pa_runtime_path() */
262 pa_set_env("PULSE_RUNTIME_PATH", PA_SYSTEM_RUNTIME_PATH
);
263 pa_set_env("PULSE_CONFIG_PATH", PA_SYSTEM_CONFIG_PATH
);
264 pa_set_env("PULSE_STATE_PATH", PA_SYSTEM_STATE_PATH
);
266 pa_log_info(_("Successfully dropped root privileges."));
271 #else /* HAVE_PWD_H && HAVE_GRP_H */
273 static int change_user(void) {
274 pa_log(_("System wide mode unsupported on this platform."));
278 #endif /* HAVE_PWD_H && HAVE_GRP_H */
280 #ifdef HAVE_SYS_RESOURCE_H
282 static int set_one_rlimit(const pa_rlimit
*r
, int resource
, const char *name
) {
289 rl
.rlim_cur
= rl
.rlim_max
= r
->value
;
291 if (setrlimit(resource
, &rl
) < 0) {
292 pa_log_info(_("setrlimit(%s, (%u, %u)) failed: %s"), name
, (unsigned) r
->value
, (unsigned) r
->value
, pa_cstrerror(errno
));
299 static void set_all_rlimits(const pa_daemon_conf
*conf
) {
300 set_one_rlimit(&conf
->rlimit_fsize
, RLIMIT_FSIZE
, "RLIMIT_FSIZE");
301 set_one_rlimit(&conf
->rlimit_data
, RLIMIT_DATA
, "RLIMIT_DATA");
302 set_one_rlimit(&conf
->rlimit_stack
, RLIMIT_STACK
, "RLIMIT_STACK");
303 set_one_rlimit(&conf
->rlimit_core
, RLIMIT_CORE
, "RLIMIT_CORE");
305 set_one_rlimit(&conf
->rlimit_rss
, RLIMIT_RSS
, "RLIMIT_RSS");
308 set_one_rlimit(&conf
->rlimit_nproc
, RLIMIT_NPROC
, "RLIMIT_NPROC");
311 set_one_rlimit(&conf
->rlimit_nofile
, RLIMIT_NOFILE
, "RLIMIT_NOFILE");
313 #ifdef RLIMIT_MEMLOCK
314 set_one_rlimit(&conf
->rlimit_memlock
, RLIMIT_MEMLOCK
, "RLIMIT_MEMLOCK");
317 set_one_rlimit(&conf
->rlimit_as
, RLIMIT_AS
, "RLIMIT_AS");
320 set_one_rlimit(&conf
->rlimit_locks
, RLIMIT_LOCKS
, "RLIMIT_LOCKS");
322 #ifdef RLIMIT_SIGPENDING
323 set_one_rlimit(&conf
->rlimit_sigpending
, RLIMIT_SIGPENDING
, "RLIMIT_SIGPENDING");
325 #ifdef RLIMIT_MSGQUEUE
326 set_one_rlimit(&conf
->rlimit_msgqueue
, RLIMIT_MSGQUEUE
, "RLIMIT_MSGQUEUE");
329 set_one_rlimit(&conf
->rlimit_nice
, RLIMIT_NICE
, "RLIMIT_NICE");
332 set_one_rlimit(&conf
->rlimit_rtprio
, RLIMIT_RTPRIO
, "RLIMIT_RTPRIO");
335 set_one_rlimit(&conf
->rlimit_rttime
, RLIMIT_RTTIME
, "RLIMIT_RTTIME");
341 static pa_dbus_connection
*register_dbus(pa_core
*c
) {
343 pa_dbus_connection
*conn
;
345 dbus_error_init(&error
);
347 if (!(conn
= pa_dbus_bus_get(c
, pa_in_system_mode() ? DBUS_BUS_SYSTEM
: DBUS_BUS_SESSION
, &error
)) || dbus_error_is_set(&error
)) {
348 pa_log_warn("Unable to contact D-Bus: %s: %s", error
.name
, error
.message
);
352 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
) {
353 pa_log_debug("Got org.pulseaudio.Server!");
357 if (dbus_error_is_set(&error
))
358 pa_log_warn("Failed to acquire org.pulseaudio.Server: %s: %s", error
.name
, error
.message
);
360 pa_log_warn("D-Bus name org.pulseaudio.Server already taken. Weird shit!");
362 /* PA cannot be started twice by the same user and hence we can
363 * ignore mostly the case that org.pulseaudio.Server is already
369 pa_dbus_connection_unref(conn
);
371 dbus_error_free(&error
);
376 int main(int argc
, char *argv
[]) {
378 pa_strbuf
*buf
= NULL
;
379 pa_daemon_conf
*conf
= NULL
;
380 pa_mainloop
*mainloop
= NULL
;
382 int r
= 0, retval
= 1, d
= 0;
383 pa_bool_t valid_pid_file
= FALSE
;
384 pa_bool_t ltdl_init
= FALSE
;
388 int daemon_pipe
[2] = { -1, -1 };
391 pa_time_event
*win32_timer
;
392 struct timeval win32_tv
;
394 int autospawn_fd
= -1;
395 pa_bool_t autospawn_locked
= FALSE
;
397 pa_dbus_connection
*dbus
= NULL
;
400 pa_log_set_ident("pulseaudio");
401 pa_log_set_level(PA_LOG_NOTICE
);
402 pa_log_set_flags(PA_LOG_COLORS
|PA_LOG_PRINT_FILE
|PA_LOG_PRINT_LEVEL
, PA_LOG_RESET
);
404 if ((e
= getenv("PULSE_PASSED_FD"))) {
411 /* We might be autospawned, in which case have no idea in which
412 * context we have been started. Let's cleanup our execution
413 * context as good as possible */
415 pa_close_all(passed_fd
, -1);
419 setlocale(LC_ALL
, "");
422 conf
= pa_daemon_conf_new();
424 if (pa_daemon_conf_load(conf
, NULL
) < 0)
427 if (pa_daemon_conf_env(conf
) < 0)
430 if (pa_cmdline_parse(conf
, argc
, argv
, &d
) < 0) {
431 pa_log(_("Failed to parse command line."));
435 pa_log_set_level(conf
->log_level
);
436 pa_log_set_target(conf
->auto_log_target
? PA_LOG_STDERR
: conf
->log_target
);
438 pa_log_set_flags(PA_LOG_PRINT_META
, PA_LOG_SET
);
440 pa_log_set_flags(PA_LOG_PRINT_TIME
, PA_LOG_SET
);
441 pa_log_set_show_backtrace(conf
->log_backtrace
);
443 LTDL_SET_PRELOADED_SYMBOLS();
447 if (conf
->dl_search_path
)
448 lt_dlsetsearchpath(conf
->dl_search_path
);
453 WSAStartup(MAKEWORD(2, 0), &data
);
460 case PA_CMD_DUMP_MODULES
:
461 pa_dump_modules(conf
, argc
-d
, argv
+d
);
465 case PA_CMD_DUMP_CONF
: {
466 s
= pa_daemon_conf_dump(conf
);
473 case PA_CMD_DUMP_RESAMPLE_METHODS
: {
476 for (i
= 0; i
< PA_RESAMPLER_MAX
; i
++)
477 if (pa_resample_method_supported(i
))
478 printf("%s\n", pa_resample_method_to_string(i
));
485 pa_cmdline_help(argv
[0]);
489 case PA_CMD_VERSION
:
490 printf(PACKAGE_NAME
" "PACKAGE_VERSION
"\n");
497 if (pa_pid_file_check_running(&pid
, "pulseaudio") < 0)
498 pa_log_info(_("Daemon not running"));
500 pa_log_info(_("Daemon running as PID %u"), pid
);
509 if (pa_pid_file_kill(SIGINT
, NULL
, "pulseaudio") < 0)
510 pa_log(_("Failed to kill daemon: %s"), pa_cstrerror(errno
));
516 case PA_CMD_CLEANUP_SHM
:
518 if (pa_shm_cleanup() >= 0)
524 pa_assert(conf
->cmd
== PA_CMD_DAEMON
|| conf
->cmd
== PA_CMD_START
);
527 if (getuid() == 0 && !conf
->system_instance
)
528 pa_log_warn(_("This program is not intended to be run as root (unless --system is specified)."));
529 else if (getuid() != 0 && conf
->system_instance
) {
530 pa_log(_("Root privileges required."));
534 if (conf
->cmd
== PA_CMD_START
&& conf
->system_instance
) {
535 pa_log(_("--start not supported for system instances."));
539 if (conf
->system_instance
&& !conf
->disallow_exit
)
540 pa_log_warn(_("Running in system mode, but --disallow-exit not set!"));
542 if (conf
->system_instance
&& !conf
->disallow_module_loading
)
543 pa_log_warn(_("Running in system mode, but --disallow-module-loading not set!"));
545 if (conf
->system_instance
&& !conf
->disable_shm
) {
546 pa_log_notice(_("Running in system mode, forcibly disabling SHM mode!"));
547 conf
->disable_shm
= TRUE
;
550 if (conf
->system_instance
&& conf
->exit_idle_time
>= 0) {
551 pa_log_notice(_("Running in system mode, forcibly disabling exit idle time!"));
552 conf
->exit_idle_time
= -1;
555 if (conf
->cmd
== PA_CMD_START
) {
556 /* If we shall start PA only when it is not running yet, we
557 * first take the autospawn lock to make things
560 if ((autospawn_fd
= pa_autospawn_lock_init()) < 0) {
561 pa_log("Failed to initialize autospawn lock");
565 if ((pa_autospawn_lock_acquire(TRUE
) < 0)) {
566 pa_log("Failed to acquire autospawn lock");
570 autospawn_locked
= TRUE
;
573 if (conf
->daemonize
) {
577 if (pa_stdio_acquire() < 0) {
578 pa_log(_("Failed to acquire stdio."));
583 if (pipe(daemon_pipe
) < 0) {
584 pa_log(_("pipe failed: %s"), pa_cstrerror(errno
));
588 if ((child
= fork()) < 0) {
589 pa_log(_("fork() failed: %s"), pa_cstrerror(errno
));
597 pa_assert_se(pa_close(daemon_pipe
[1]) == 0);
600 if ((n
= pa_loop_read(daemon_pipe
[0], &retval
, sizeof(retval
), NULL
)) != sizeof(retval
)) {
603 pa_log(_("read() failed: %s"), pa_cstrerror(errno
));
609 pa_log(_("Daemon startup failed."));
611 pa_log_info(_("Daemon startup successful."));
616 if (autospawn_fd
>= 0) {
617 /* The lock file is unlocked from the parent, so we need
618 * to close it in the child */
620 pa_autospawn_lock_release();
621 pa_autospawn_lock_done(TRUE
);
623 autospawn_locked
= FALSE
;
627 pa_assert_se(pa_close(daemon_pipe
[0]) == 0);
631 if (conf
->auto_log_target
)
632 pa_log_set_target(PA_LOG_SYSLOG
);
646 pa_assert_se(open("/dev/null", O_RDONLY
) == 0);
647 pa_assert_se(open("/dev/null", O_WRONLY
) == 1);
648 pa_assert_se(open("/dev/null", O_WRONLY
) == 2);
654 signal(SIGTTOU
, SIG_IGN
);
657 signal(SIGTTIN
, SIG_IGN
);
660 signal(SIGTSTP
, SIG_IGN
);
664 if ((tty_fd
= open("/dev/tty", O_RDWR
)) >= 0) {
665 ioctl(tty_fd
, TIOCNOTTY
, (char*) 0);
666 pa_assert_se(pa_close(tty_fd
) == 0);
671 pa_set_env("PULSE_INTERNAL", "1");
672 pa_assert_se(chdir("/") == 0);
675 #ifdef HAVE_SYS_RESOURCE_H
676 set_all_rlimits(conf
);
678 pa_rtclock_hrtimer_enable();
680 pa_raise_priority(conf
->nice_level
);
682 if (conf
->system_instance
)
683 if (change_user() < 0)
686 pa_set_env("PULSE_SYSTEM", conf
->system_instance
? "1" : "0");
688 pa_log_info(_("This is PulseAudio %s"), PACKAGE_VERSION
);
689 pa_log_debug(_("Compilation host: %s"), CANONICAL_HOST
);
690 pa_log_debug(_("Compilation CFLAGS: %s"), PA_CFLAGS
);
692 s
= pa_uname_string();
693 pa_log_debug(_("Running on host: %s"), s
);
696 pa_log_debug(_("Found %u CPUs."), pa_ncpus());
698 pa_log_info(_("Page size is %lu bytes"), (unsigned long) PA_PAGE_SIZE
);
700 #ifdef HAVE_VALGRIND_MEMCHECK_H
701 pa_log_debug(_("Compiled with Valgrind support: yes"));
703 pa_log_debug(_("Compiled with Valgrind support: no"));
706 pa_log_debug(_("Running in valgrind mode: %s"), pa_yes_no(pa_in_valgrind()));
709 pa_log_debug(_("Optimized build: yes"));
711 pa_log_debug(_("Optimized build: no"));
715 pa_log_debug(_("NDEBUG defined, all asserts disabled."));
716 #elif defined(FASTPATH)
717 pa_log_debug(_("FASTPATH defined, only fast path asserts disabled."));
719 pa_log_debug(_("All asserts enabled."));
722 if (!(s
= pa_machine_id())) {
723 pa_log(_("Failed to get machine ID"));
726 pa_log_info(_("Machine ID is %s."), s
);
729 if ((s
= pa_session_id())) {
730 pa_log_info(_("Session ID is %s."), s
);
734 if (!(s
= pa_get_runtime_dir()))
736 pa_log_info(_("Using runtime directory %s."), s
);
739 if (!(s
= pa_get_state_dir()))
741 pa_log_info(_("Using state directory %s."), s
);
744 pa_log_info(_("Running in system mode: %s"), pa_yes_no(pa_in_system_mode()));
746 if (pa_in_system_mode())
747 pa_log_warn(_("OK, so you are running PA in system mode. Please note that you most likely shouldn't be doing that.\n"
748 "If you do it nonetheless then it's your own fault if things don't work as expected.\n"
749 "Please read http://pulseaudio.org/wiki/WhatIsWrongWithSystemMode for an explanation why system mode is usually a bad idea."));
751 if (conf
->use_pid_file
) {
754 if ((z
= pa_pid_file_create("pulseaudio")) != 0) {
756 if (conf
->cmd
== PA_CMD_START
&& z
> 0) {
757 /* If we are already running and with are run in
758 * --start mode, then let's return this as success. */
764 pa_log(_("pa_pid_file_create() failed."));
768 valid_pid_file
= TRUE
;
771 pa_disable_sigpipe();
773 if (pa_rtclock_hrtimer())
774 pa_log_info(_("Fresh high-resolution timers available! Bon appetit!"));
776 pa_log_info(_("Dude, your kernel stinks! The chef's recommendation today is Linux with high-resolution timers enabled!"));
778 if (conf
->lock_memory
) {
779 #ifdef HAVE_SYS_MMAN_H
780 if (mlockall(MCL_FUTURE
) < 0)
781 pa_log_warn("mlockall() failed: %s", pa_cstrerror(errno
));
783 pa_log_info("Sucessfully locked process into memory.");
785 pa_log_warn("Memory locking requested but not supported on platform.");
789 pa_memtrap_install();
791 pa_assert_se(mainloop
= pa_mainloop_new());
793 if (!(c
= pa_core_new(pa_mainloop_get_api(mainloop
), !conf
->disable_shm
, conf
->shm_size
))) {
794 pa_log(_("pa_core_new() failed."));
798 c
->default_sample_spec
= conf
->default_sample_spec
;
799 c
->default_channel_map
= conf
->default_channel_map
;
800 c
->default_n_fragments
= conf
->default_n_fragments
;
801 c
->default_fragment_size_msec
= conf
->default_fragment_size_msec
;
802 c
->exit_idle_time
= conf
->exit_idle_time
;
803 c
->scache_idle_time
= conf
->scache_idle_time
;
804 c
->resample_method
= conf
->resample_method
;
805 c
->realtime_priority
= conf
->realtime_priority
;
806 c
->realtime_scheduling
= !!conf
->realtime_scheduling
;
807 c
->disable_remixing
= !!conf
->disable_remixing
;
808 c
->disable_lfe_remixing
= !!conf
->disable_lfe_remixing
;
809 c
->running_as_daemon
= !!conf
->daemonize
;
810 c
->disallow_exit
= conf
->disallow_exit
;
811 c
->flat_volumes
= conf
->flat_volumes
;
813 pa_assert_se(pa_signal_init(pa_mainloop_get_api(mainloop
)) == 0);
814 pa_signal_new(SIGINT
, signal_callback
, c
);
815 pa_signal_new(SIGTERM
, signal_callback
, c
);
817 pa_signal_new(SIGUSR1
, signal_callback
, c
);
820 pa_signal_new(SIGUSR2
, signal_callback
, c
);
823 pa_signal_new(SIGHUP
, signal_callback
, c
);
827 win32_timer
= pa_mainloop_get_api(mainloop
)->rtclock_time_new(pa_mainloop_get_api(mainloop
), pa_gettimeofday(&win32_tv
), message_cb
, NULL
);
832 if (!conf
->no_cpu_limit
)
833 pa_assert_se(pa_cpu_limit_init(pa_mainloop_get_api(mainloop
)) == 0);
835 buf
= pa_strbuf_new();
836 if (conf
->load_default_script_file
) {
839 if ((f
= pa_daemon_conf_open_default_script_file(conf
))) {
840 r
= pa_cli_command_execute_file_stream(c
, f
, buf
, &conf
->fail
);
846 r
= pa_cli_command_execute(c
, conf
->script_commands
, buf
, &conf
->fail
);
848 pa_log_error("%s", s
= pa_strbuf_tostring_free(buf
));
851 /* We completed the initial module loading, so let's disable it
852 * from now on, if requested */
853 c
->disallow_module_loading
= !!conf
->disallow_module_loading
;
855 if (r
< 0 && conf
->fail
) {
856 pa_log(_("Failed to initialize daemon."));
860 if (!c
->modules
|| pa_idxset_size(c
->modules
) == 0) {
861 pa_log(_("Daemon startup without any loaded modules, refusing to work."));
866 if (daemon_pipe
[1] >= 0) {
868 pa_loop_write(daemon_pipe
[1], &ok
, sizeof(ok
), NULL
);
869 pa_close(daemon_pipe
[1]);
875 dbus
= register_dbus(c
);
878 pa_log_info(_("Daemon startup complete."));
881 if (pa_mainloop_run(mainloop
, &retval
) < 0)
884 pa_log_info(_("Daemon shutdown initiated."));
889 pa_dbus_connection_unref(dbus
);
892 if (autospawn_fd
>= 0) {
893 if (autospawn_locked
)
894 pa_autospawn_lock_release();
896 pa_autospawn_lock_done(FALSE
);
901 pa_mainloop_get_api(mainloop
)->time_free(win32_timer
);
906 pa_log_info(_("Daemon terminated."));
909 if (!conf
->no_cpu_limit
)
915 if (daemon_pipe
[1] >= 0)
916 pa_loop_write(daemon_pipe
[1], &retval
, sizeof(retval
), NULL
);
918 pa_close_pipe(daemon_pipe
);
922 pa_mainloop_free(mainloop
);
925 pa_daemon_conf_free(conf
);
928 pa_pid_file_remove();