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"
105 #include "server-lookup.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_name(pa_core
*c
, DBusBusType bus
, const char* name
) {
344 pa_dbus_connection
*conn
;
346 dbus_error_init(&error
);
348 if (!(conn
= pa_dbus_bus_get(c
, bus
, &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
), name
, DBUS_NAME_FLAG_DO_NOT_QUEUE
, &error
) == DBUS_REQUEST_NAME_REPLY_PRIMARY_OWNER
) {
354 pa_log_debug("Got %s!", name
);
358 if (dbus_error_is_set(&error
))
359 pa_log_error("Failed to acquire %s: %s: %s", name
, error
.name
, error
.message
);
361 pa_log_error("D-Bus name %s already taken. Weird shit!", name
);
363 /* PA cannot be started twice by the same user and hence we can
364 * ignore mostly the case that a name is already taken. */
368 pa_dbus_connection_unref(conn
);
370 dbus_error_free(&error
);
375 int main(int argc
, char *argv
[]) {
377 pa_strbuf
*buf
= NULL
;
378 pa_daemon_conf
*conf
= NULL
;
379 pa_mainloop
*mainloop
= NULL
;
381 int r
= 0, retval
= 1, d
= 0;
382 pa_bool_t valid_pid_file
= FALSE
;
383 pa_bool_t ltdl_init
= FALSE
;
387 int daemon_pipe
[2] = { -1, -1 };
390 pa_time_event
*win32_timer
;
391 struct timeval win32_tv
;
393 int autospawn_fd
= -1;
394 pa_bool_t autospawn_locked
= FALSE
;
396 pa_dbusobj_server_lookup
*server_lookup
= NULL
; /* /org/pulseaudio/server_lookup */
397 pa_dbus_connection
*lookup_service_bus
= NULL
; /* Always the user bus. */
398 pa_dbus_connection
*server_bus
= NULL
; /* The bus where we reserve org.pulseaudio.Server, either the user or the system bus. */
399 pa_bool_t start_server
;
402 pa_log_set_ident("pulseaudio");
403 pa_log_set_level(PA_LOG_NOTICE
);
404 pa_log_set_flags(PA_LOG_COLORS
|PA_LOG_PRINT_FILE
|PA_LOG_PRINT_LEVEL
, PA_LOG_RESET
);
406 #if defined(__linux__) && defined(__OPTIMIZE__)
408 Disable lazy relocations to make usage of external libraries
409 more deterministic for our RT threads. We abuse __OPTIMIZE__ as
410 a check whether we are a debug build or not. This all is
411 admittedly a bit snake-oilish.
414 if (!getenv("LD_BIND_NOW")) {
417 /* We have to execute ourselves, because the libc caches the
418 * value of $LD_BIND_NOW on initialization. */
420 pa_set_env("LD_BIND_NOW", "1");
422 if ((rp
= pa_readlink("/proc/self/exe"))) {
424 if (pa_streq(rp
, PA_BINARY
))
425 pa_assert_se(execv(rp
, argv
) == 0);
427 pa_log_warn("/proc/self/exe does not point to " PA_BINARY
", cannot self execute. Are you playing games?");
432 pa_log_warn("Couldn't read /proc/self/exe, cannot self execute. Running in a chroot()?");
436 if ((e
= getenv("PULSE_PASSED_FD"))) {
443 /* We might be autospawned, in which case have no idea in which
444 * context we have been started. Let's cleanup our execution
445 * context as good as possible */
447 pa_reset_personality();
449 pa_close_all(passed_fd
, -1);
454 setlocale(LC_ALL
, "");
457 conf
= pa_daemon_conf_new();
459 if (pa_daemon_conf_load(conf
, NULL
) < 0)
462 if (pa_daemon_conf_env(conf
) < 0)
465 if (pa_cmdline_parse(conf
, argc
, argv
, &d
) < 0) {
466 pa_log(_("Failed to parse command line."));
470 pa_log_set_level(conf
->log_level
);
471 pa_log_set_target(conf
->auto_log_target
? PA_LOG_STDERR
: conf
->log_target
);
473 pa_log_set_flags(PA_LOG_PRINT_META
, PA_LOG_SET
);
475 pa_log_set_flags(PA_LOG_PRINT_TIME
, PA_LOG_SET
);
476 pa_log_set_show_backtrace(conf
->log_backtrace
);
479 /* conf->system_instance and conf->local_server_type control almost the
480 * same thing; make them agree about what is requested. */
481 switch (conf
->local_server_type
) {
482 case PA_SERVER_TYPE_UNSET
:
483 conf
->local_server_type
= conf
->system_instance
? PA_SERVER_TYPE_SYSTEM
: PA_SERVER_TYPE_USER
;
485 case PA_SERVER_TYPE_USER
:
486 case PA_SERVER_TYPE_NONE
:
487 conf
->system_instance
= FALSE
;
489 case PA_SERVER_TYPE_SYSTEM
:
490 conf
->system_instance
= TRUE
;
493 pa_assert_not_reached();
496 start_server
= conf
->local_server_type
== PA_SERVER_TYPE_USER
|| (getuid() == 0 && conf
->local_server_type
== PA_SERVER_TYPE_SYSTEM
);
498 if (!start_server
&& conf
->local_server_type
== PA_SERVER_TYPE_SYSTEM
) {
499 pa_log_notice(_("System mode refused for non-root user. Only starting the D-Bus server lookup service."));
500 conf
->system_instance
= FALSE
;
504 LTDL_SET_PRELOADED_SYMBOLS();
508 if (conf
->dl_search_path
)
509 lt_dlsetsearchpath(conf
->dl_search_path
);
514 WSAStartup(MAKEWORD(2, 0), &data
);
521 case PA_CMD_DUMP_MODULES
:
522 pa_dump_modules(conf
, argc
-d
, argv
+d
);
526 case PA_CMD_DUMP_CONF
: {
527 s
= pa_daemon_conf_dump(conf
);
534 case PA_CMD_DUMP_RESAMPLE_METHODS
: {
537 for (i
= 0; i
< PA_RESAMPLER_MAX
; i
++)
538 if (pa_resample_method_supported(i
))
539 printf("%s\n", pa_resample_method_to_string(i
));
546 pa_cmdline_help(argv
[0]);
550 case PA_CMD_VERSION
:
551 printf(PACKAGE_NAME
" "PACKAGE_VERSION
"\n");
558 if (pa_pid_file_check_running(&pid
, "pulseaudio") < 0)
559 pa_log_info(_("Daemon not running"));
561 pa_log_info(_("Daemon running as PID %u"), pid
);
570 if (pa_pid_file_kill(SIGINT
, NULL
, "pulseaudio") < 0)
571 pa_log(_("Failed to kill daemon: %s"), pa_cstrerror(errno
));
577 case PA_CMD_CLEANUP_SHM
:
579 if (pa_shm_cleanup() >= 0)
585 pa_assert(conf
->cmd
== PA_CMD_DAEMON
|| conf
->cmd
== PA_CMD_START
);
588 if (getuid() == 0 && !conf
->system_instance
)
589 pa_log_warn(_("This program is not intended to be run as root (unless --system is specified)."));
590 #ifndef HAVE_DBUS /* A similar, only a notice worthy check was done earlier, if D-Bus is enabled. */
591 else if (getuid() != 0 && conf
->system_instance
) {
592 pa_log(_("Root privileges required."));
597 if (conf
->cmd
== PA_CMD_START
&& conf
->system_instance
) {
598 pa_log(_("--start not supported for system instances."));
602 if (conf
->system_instance
&& !conf
->disallow_exit
)
603 pa_log_warn(_("Running in system mode, but --disallow-exit not set!"));
605 if (conf
->system_instance
&& !conf
->disallow_module_loading
)
606 pa_log_warn(_("Running in system mode, but --disallow-module-loading not set!"));
608 if (conf
->system_instance
&& !conf
->disable_shm
) {
609 pa_log_notice(_("Running in system mode, forcibly disabling SHM mode!"));
610 conf
->disable_shm
= TRUE
;
613 if (conf
->system_instance
&& conf
->exit_idle_time
>= 0) {
614 pa_log_notice(_("Running in system mode, forcibly disabling exit idle time!"));
615 conf
->exit_idle_time
= -1;
618 if (conf
->cmd
== PA_CMD_START
) {
619 /* If we shall start PA only when it is not running yet, we
620 * first take the autospawn lock to make things
623 if ((autospawn_fd
= pa_autospawn_lock_init()) < 0) {
624 pa_log("Failed to initialize autospawn lock");
628 if ((pa_autospawn_lock_acquire(TRUE
) < 0)) {
629 pa_log("Failed to acquire autospawn lock");
633 autospawn_locked
= TRUE
;
636 if (conf
->daemonize
) {
640 if (pa_stdio_acquire() < 0) {
641 pa_log(_("Failed to acquire stdio."));
646 if (pipe(daemon_pipe
) < 0) {
647 pa_log(_("pipe failed: %s"), pa_cstrerror(errno
));
651 if ((child
= fork()) < 0) {
652 pa_log(_("fork() failed: %s"), pa_cstrerror(errno
));
660 pa_assert_se(pa_close(daemon_pipe
[1]) == 0);
663 if ((n
= pa_loop_read(daemon_pipe
[0], &retval
, sizeof(retval
), NULL
)) != sizeof(retval
)) {
666 pa_log(_("read() failed: %s"), pa_cstrerror(errno
));
672 pa_log(_("Daemon startup failed."));
674 pa_log_info(_("Daemon startup successful."));
679 if (autospawn_fd
>= 0) {
680 /* The lock file is unlocked from the parent, so we need
681 * to close it in the child */
683 pa_autospawn_lock_release();
684 pa_autospawn_lock_done(TRUE
);
686 autospawn_locked
= FALSE
;
690 pa_assert_se(pa_close(daemon_pipe
[0]) == 0);
694 if (conf
->auto_log_target
)
695 pa_log_set_target(PA_LOG_SYSLOG
);
709 pa_assert_se(open("/dev/null", O_RDONLY
) == 0);
710 pa_assert_se(open("/dev/null", O_WRONLY
) == 1);
711 pa_assert_se(open("/dev/null", O_WRONLY
) == 2);
717 signal(SIGTTOU
, SIG_IGN
);
720 signal(SIGTTIN
, SIG_IGN
);
723 signal(SIGTSTP
, SIG_IGN
);
727 if ((tty_fd
= open("/dev/tty", O_RDWR
)) >= 0) {
728 ioctl(tty_fd
, TIOCNOTTY
, (char*) 0);
729 pa_assert_se(pa_close(tty_fd
) == 0);
734 pa_set_env("PULSE_INTERNAL", "1");
735 pa_assert_se(chdir("/") == 0);
738 #ifdef HAVE_SYS_RESOURCE_H
739 set_all_rlimits(conf
);
741 pa_rtclock_hrtimer_enable();
743 pa_raise_priority(conf
->nice_level
);
745 if (conf
->system_instance
)
746 if (change_user() < 0)
749 pa_set_env("PULSE_SYSTEM", conf
->system_instance
? "1" : "0");
751 pa_log_info(_("This is PulseAudio %s"), PACKAGE_VERSION
);
752 pa_log_debug(_("Compilation host: %s"), CANONICAL_HOST
);
753 pa_log_debug(_("Compilation CFLAGS: %s"), PA_CFLAGS
);
755 s
= pa_uname_string();
756 pa_log_debug(_("Running on host: %s"), s
);
759 pa_log_debug(_("Found %u CPUs."), pa_ncpus());
761 pa_log_info(_("Page size is %lu bytes"), (unsigned long) PA_PAGE_SIZE
);
763 #ifdef HAVE_VALGRIND_MEMCHECK_H
764 pa_log_debug(_("Compiled with Valgrind support: yes"));
766 pa_log_debug(_("Compiled with Valgrind support: no"));
769 pa_log_debug(_("Running in valgrind mode: %s"), pa_yes_no(pa_in_valgrind()));
772 pa_log_debug(_("Optimized build: yes"));
774 pa_log_debug(_("Optimized build: no"));
778 pa_log_debug(_("NDEBUG defined, all asserts disabled."));
779 #elif defined(FASTPATH)
780 pa_log_debug(_("FASTPATH defined, only fast path asserts disabled."));
782 pa_log_debug(_("All asserts enabled."));
785 if (!(s
= pa_machine_id())) {
786 pa_log(_("Failed to get machine ID"));
789 pa_log_info(_("Machine ID is %s."), s
);
792 if ((s
= pa_session_id())) {
793 pa_log_info(_("Session ID is %s."), s
);
797 if (!(s
= pa_get_runtime_dir()))
799 pa_log_info(_("Using runtime directory %s."), s
);
802 if (!(s
= pa_get_state_dir()))
804 pa_log_info(_("Using state directory %s."), s
);
807 pa_log_info(_("Running in system mode: %s"), pa_yes_no(pa_in_system_mode()));
809 if (pa_in_system_mode())
810 pa_log_warn(_("OK, so you are running PA in system mode. Please note that you most likely shouldn't be doing that.\n"
811 "If you do it nonetheless then it's your own fault if things don't work as expected.\n"
812 "Please read http://pulseaudio.org/wiki/WhatIsWrongWithSystemMode for an explanation why system mode is usually a bad idea."));
814 if (conf
->use_pid_file
) {
817 if ((z
= pa_pid_file_create("pulseaudio")) != 0) {
819 if (conf
->cmd
== PA_CMD_START
&& z
> 0) {
820 /* If we are already running and with are run in
821 * --start mode, then let's return this as success. */
827 pa_log(_("pa_pid_file_create() failed."));
831 valid_pid_file
= TRUE
;
834 pa_disable_sigpipe();
836 if (pa_rtclock_hrtimer())
837 pa_log_info(_("Fresh high-resolution timers available! Bon appetit!"));
839 pa_log_info(_("Dude, your kernel stinks! The chef's recommendation today is Linux with high-resolution timers enabled!"));
841 if (conf
->lock_memory
) {
842 #ifdef HAVE_SYS_MMAN_H
843 if (mlockall(MCL_FUTURE
) < 0)
844 pa_log_warn("mlockall() failed: %s", pa_cstrerror(errno
));
846 pa_log_info("Sucessfully locked process into memory.");
848 pa_log_warn("Memory locking requested but not supported on platform.");
852 pa_memtrap_install();
854 pa_assert_se(mainloop
= pa_mainloop_new());
856 if (!(c
= pa_core_new(pa_mainloop_get_api(mainloop
), !conf
->disable_shm
, conf
->shm_size
))) {
857 pa_log(_("pa_core_new() failed."));
861 c
->default_sample_spec
= conf
->default_sample_spec
;
862 c
->default_channel_map
= conf
->default_channel_map
;
863 c
->default_n_fragments
= conf
->default_n_fragments
;
864 c
->default_fragment_size_msec
= conf
->default_fragment_size_msec
;
865 c
->exit_idle_time
= conf
->exit_idle_time
;
866 c
->scache_idle_time
= conf
->scache_idle_time
;
867 c
->resample_method
= conf
->resample_method
;
868 c
->realtime_priority
= conf
->realtime_priority
;
869 c
->realtime_scheduling
= !!conf
->realtime_scheduling
;
870 c
->disable_remixing
= !!conf
->disable_remixing
;
871 c
->disable_lfe_remixing
= !!conf
->disable_lfe_remixing
;
872 c
->running_as_daemon
= !!conf
->daemonize
;
873 c
->disallow_exit
= conf
->disallow_exit
;
874 c
->flat_volumes
= conf
->flat_volumes
;
876 c
->server_type
= conf
->local_server_type
;
879 pa_assert_se(pa_signal_init(pa_mainloop_get_api(mainloop
)) == 0);
880 pa_signal_new(SIGINT
, signal_callback
, c
);
881 pa_signal_new(SIGTERM
, signal_callback
, c
);
883 pa_signal_new(SIGUSR1
, signal_callback
, c
);
886 pa_signal_new(SIGUSR2
, signal_callback
, c
);
889 pa_signal_new(SIGHUP
, signal_callback
, c
);
893 win32_timer
= pa_mainloop_get_api(mainloop
)->rtclock_time_new(pa_mainloop_get_api(mainloop
), pa_gettimeofday(&win32_tv
), message_cb
, NULL
);
898 if (!conf
->no_cpu_limit
)
899 pa_assert_se(pa_cpu_limit_init(pa_mainloop_get_api(mainloop
)) == 0);
901 buf
= pa_strbuf_new();
906 if (conf
->load_default_script_file
) {
909 if ((f
= pa_daemon_conf_open_default_script_file(conf
))) {
910 r
= pa_cli_command_execute_file_stream(c
, f
, buf
, &conf
->fail
);
916 r
= pa_cli_command_execute(c
, conf
->script_commands
, buf
, &conf
->fail
);
918 pa_log_error("%s", s
= pa_strbuf_tostring_free(buf
));
921 if (r
< 0 && conf
->fail
) {
922 pa_log(_("Failed to initialize daemon."));
926 if (!c
->modules
|| pa_idxset_size(c
->modules
) == 0) {
927 pa_log(_("Daemon startup without any loaded modules, refusing to work."));
932 /* When we just provide the D-Bus server lookup service, we don't want
933 * any modules to be loaded. We haven't loaded any so far, so one might
934 * think there's no way to contact the server, but receiving certain
935 * signals could still cause modules to load. */
936 conf
->disallow_module_loading
= TRUE
;
940 /* We completed the initial module loading, so let's disable it
941 * from now on, if requested */
942 c
->disallow_module_loading
= !!conf
->disallow_module_loading
;
945 if (daemon_pipe
[1] >= 0) {
947 pa_loop_write(daemon_pipe
[1], &ok
, sizeof(ok
), NULL
);
948 pa_close(daemon_pipe
[1]);
954 if (!conf
->system_instance
) {
955 if (!(server_lookup
= pa_dbusobj_server_lookup_new(c
)))
957 if (!(lookup_service_bus
= register_dbus_name(c
, DBUS_BUS_SESSION
, "org.PulseAudio1")))
961 if (start_server
&& !(server_bus
= register_dbus_name(c
, conf
->system_instance
? DBUS_BUS_SYSTEM
: DBUS_BUS_SESSION
, "org.pulseaudio.Server")))
965 pa_log_info(_("Daemon startup complete."));
968 if (pa_mainloop_run(mainloop
, &retval
) < 0)
971 pa_log_info(_("Daemon shutdown initiated."));
976 pa_dbus_connection_unref(server_bus
);
977 if (lookup_service_bus
)
978 pa_dbus_connection_unref(lookup_service_bus
);
980 pa_dbusobj_server_lookup_free(server_lookup
);
983 if (autospawn_fd
>= 0) {
984 if (autospawn_locked
)
985 pa_autospawn_lock_release();
987 pa_autospawn_lock_done(FALSE
);
992 pa_mainloop_get_api(mainloop
)->time_free(win32_timer
);
997 pa_log_info(_("Daemon terminated."));
1000 if (!conf
->no_cpu_limit
)
1001 pa_cpu_limit_done();
1006 if (daemon_pipe
[1] >= 0)
1007 pa_loop_write(daemon_pipe
[1], &retval
, sizeof(retval
), NULL
);
1009 pa_close_pipe(daemon_pipe
);
1013 pa_mainloop_free(mainloop
);
1016 pa_daemon_conf_free(conf
);
1019 pa_pid_file_remove();