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 #ifdef HAVE_SYS_MMAN_H
46 #ifdef HAVE_SYS_IOCTL_H
47 #include <sys/ioctl.h>
63 #include <dbus/dbus.h>
66 #include <pulse/mainloop.h>
67 #include <pulse/mainloop-signal.h>
68 #include <pulse/timeval.h>
69 #include <pulse/xmalloc.h>
70 #include <pulse/i18n.h>
72 #include <pulsecore/lock-autospawn.h>
73 #include <pulsecore/winsock.h>
74 #include <pulsecore/core-error.h>
75 #include <pulsecore/core-rtclock.h>
76 #include <pulsecore/core.h>
77 #include <pulsecore/memblock.h>
78 #include <pulsecore/module.h>
79 #include <pulsecore/cli-command.h>
80 #include <pulsecore/log.h>
81 #include <pulsecore/core-util.h>
82 #include <pulsecore/sioman.h>
83 #include <pulsecore/cli-text.h>
84 #include <pulsecore/pid.h>
85 #include <pulsecore/namereg.h>
86 #include <pulsecore/random.h>
87 #include <pulsecore/macro.h>
88 #include <pulsecore/mutex.h>
89 #include <pulsecore/thread.h>
90 #include <pulsecore/once.h>
91 #include <pulsecore/shm.h>
92 #include <pulsecore/memtrap.h>
94 #include <pulsecore/dbus-shared.h>
96 #include <pulsecore/cpu-arm.h>
97 #include <pulsecore/cpu-x86.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 if (!getenv("PULSE_RUNTIME_PATH"))
264 pa_set_env("PULSE_RUNTIME_PATH", PA_SYSTEM_RUNTIME_PATH
);
266 if (!getenv("PULSE_CONFIG_PATH"))
267 pa_set_env("PULSE_CONFIG_PATH", PA_SYSTEM_CONFIG_PATH
);
269 if (!getenv("PULSE_STATE_PATH"))
270 pa_set_env("PULSE_STATE_PATH", PA_SYSTEM_STATE_PATH
);
272 pa_log_info(_("Successfully dropped root privileges."));
277 #else /* HAVE_PWD_H && HAVE_GRP_H */
279 static int change_user(void) {
280 pa_log(_("System wide mode unsupported on this platform."));
284 #endif /* HAVE_PWD_H && HAVE_GRP_H */
286 #ifdef HAVE_SYS_RESOURCE_H
288 static int set_one_rlimit(const pa_rlimit
*r
, int resource
, const char *name
) {
295 rl
.rlim_cur
= rl
.rlim_max
= r
->value
;
297 if (setrlimit(resource
, &rl
) < 0) {
298 pa_log_info(_("setrlimit(%s, (%u, %u)) failed: %s"), name
, (unsigned) r
->value
, (unsigned) r
->value
, pa_cstrerror(errno
));
305 static void set_all_rlimits(const pa_daemon_conf
*conf
) {
306 set_one_rlimit(&conf
->rlimit_fsize
, RLIMIT_FSIZE
, "RLIMIT_FSIZE");
307 set_one_rlimit(&conf
->rlimit_data
, RLIMIT_DATA
, "RLIMIT_DATA");
308 set_one_rlimit(&conf
->rlimit_stack
, RLIMIT_STACK
, "RLIMIT_STACK");
309 set_one_rlimit(&conf
->rlimit_core
, RLIMIT_CORE
, "RLIMIT_CORE");
311 set_one_rlimit(&conf
->rlimit_rss
, RLIMIT_RSS
, "RLIMIT_RSS");
314 set_one_rlimit(&conf
->rlimit_nproc
, RLIMIT_NPROC
, "RLIMIT_NPROC");
317 set_one_rlimit(&conf
->rlimit_nofile
, RLIMIT_NOFILE
, "RLIMIT_NOFILE");
319 #ifdef RLIMIT_MEMLOCK
320 set_one_rlimit(&conf
->rlimit_memlock
, RLIMIT_MEMLOCK
, "RLIMIT_MEMLOCK");
323 set_one_rlimit(&conf
->rlimit_as
, RLIMIT_AS
, "RLIMIT_AS");
326 set_one_rlimit(&conf
->rlimit_locks
, RLIMIT_LOCKS
, "RLIMIT_LOCKS");
328 #ifdef RLIMIT_SIGPENDING
329 set_one_rlimit(&conf
->rlimit_sigpending
, RLIMIT_SIGPENDING
, "RLIMIT_SIGPENDING");
331 #ifdef RLIMIT_MSGQUEUE
332 set_one_rlimit(&conf
->rlimit_msgqueue
, RLIMIT_MSGQUEUE
, "RLIMIT_MSGQUEUE");
335 set_one_rlimit(&conf
->rlimit_nice
, RLIMIT_NICE
, "RLIMIT_NICE");
338 set_one_rlimit(&conf
->rlimit_rtprio
, RLIMIT_RTPRIO
, "RLIMIT_RTPRIO");
341 set_one_rlimit(&conf
->rlimit_rttime
, RLIMIT_RTTIME
, "RLIMIT_RTTIME");
347 static pa_dbus_connection
*register_dbus_name(pa_core
*c
, DBusBusType bus
, const char* name
) {
349 pa_dbus_connection
*conn
;
351 dbus_error_init(&error
);
353 if (!(conn
= pa_dbus_bus_get(c
, bus
, &error
)) || dbus_error_is_set(&error
)) {
354 pa_log_warn("Unable to contact D-Bus: %s: %s", error
.name
, error
.message
);
358 if (dbus_bus_request_name(pa_dbus_connection_get(conn
), name
, DBUS_NAME_FLAG_DO_NOT_QUEUE
, &error
) == DBUS_REQUEST_NAME_REPLY_PRIMARY_OWNER
) {
359 pa_log_debug("Got %s!", name
);
363 if (dbus_error_is_set(&error
))
364 pa_log_error("Failed to acquire %s: %s: %s", name
, error
.name
, error
.message
);
366 pa_log_error("D-Bus name %s already taken. Weird shit!", name
);
368 /* PA cannot be started twice by the same user and hence we can
369 * ignore mostly the case that a name is already taken. */
373 pa_dbus_connection_unref(conn
);
375 dbus_error_free(&error
);
380 int main(int argc
, char *argv
[]) {
382 pa_strbuf
*buf
= NULL
;
383 pa_daemon_conf
*conf
= NULL
;
384 pa_mainloop
*mainloop
= NULL
;
386 int r
= 0, retval
= 1, d
= 0;
387 pa_bool_t valid_pid_file
= FALSE
;
388 pa_bool_t ltdl_init
= FALSE
;
392 int daemon_pipe
[2] = { -1, -1 };
395 pa_time_event
*win32_timer
;
396 struct timeval win32_tv
;
398 int autospawn_fd
= -1;
399 pa_bool_t autospawn_locked
= FALSE
;
401 pa_dbusobj_server_lookup
*server_lookup
= NULL
; /* /org/pulseaudio/server_lookup */
402 pa_dbus_connection
*lookup_service_bus
= NULL
; /* Always the user bus. */
403 pa_dbus_connection
*server_bus
= NULL
; /* The bus where we reserve org.pulseaudio.Server, either the user or the system bus. */
404 pa_bool_t start_server
;
407 pa_log_set_ident("pulseaudio");
408 pa_log_set_level(PA_LOG_NOTICE
);
409 pa_log_set_flags(PA_LOG_COLORS
|PA_LOG_PRINT_FILE
|PA_LOG_PRINT_LEVEL
, PA_LOG_RESET
);
411 #if defined(__linux__) && defined(__OPTIMIZE__)
413 Disable lazy relocations to make usage of external libraries
414 more deterministic for our RT threads. We abuse __OPTIMIZE__ as
415 a check whether we are a debug build or not. This all is
416 admittedly a bit snake-oilish.
419 if (!getenv("LD_BIND_NOW")) {
423 /* We have to execute ourselves, because the libc caches the
424 * value of $LD_BIND_NOW on initialization. */
426 pa_set_env("LD_BIND_NOW", "1");
428 if ((canonical_rp
= pa_realpath(PA_BINARY
))) {
430 if ((rp
= pa_readlink("/proc/self/exe"))) {
432 if (pa_streq(rp
, canonical_rp
))
433 pa_assert_se(execv(rp
, argv
) == 0);
435 pa_log_warn("/proc/self/exe does not point to %s, cannot self execute. Are you playing games?", canonical_rp
);
440 pa_log_warn("Couldn't read /proc/self/exe, cannot self execute. Running in a chroot()?");
442 pa_xfree(canonical_rp
);
445 pa_log_warn("Couldn't canonicalize binary path, cannot self execute.");
449 if ((e
= getenv("PULSE_PASSED_FD"))) {
456 /* We might be autospawned, in which case have no idea in which
457 * context we have been started. Let's cleanup our execution
458 * context as good as possible */
460 pa_reset_personality();
462 pa_close_all(passed_fd
, -1);
467 setlocale(LC_ALL
, "");
470 conf
= pa_daemon_conf_new();
472 if (pa_daemon_conf_load(conf
, NULL
) < 0)
475 if (pa_daemon_conf_env(conf
) < 0)
478 if (pa_cmdline_parse(conf
, argc
, argv
, &d
) < 0) {
479 pa_log(_("Failed to parse command line."));
483 pa_log_set_level(conf
->log_level
);
484 pa_log_set_target(conf
->auto_log_target
? PA_LOG_STDERR
: conf
->log_target
);
486 pa_log_set_flags(PA_LOG_PRINT_META
, PA_LOG_SET
);
488 pa_log_set_flags(PA_LOG_PRINT_TIME
, PA_LOG_SET
);
489 pa_log_set_show_backtrace(conf
->log_backtrace
);
492 /* conf->system_instance and conf->local_server_type control almost the
493 * same thing; make them agree about what is requested. */
494 switch (conf
->local_server_type
) {
495 case PA_SERVER_TYPE_UNSET
:
496 conf
->local_server_type
= conf
->system_instance
? PA_SERVER_TYPE_SYSTEM
: PA_SERVER_TYPE_USER
;
498 case PA_SERVER_TYPE_USER
:
499 case PA_SERVER_TYPE_NONE
:
500 conf
->system_instance
= FALSE
;
502 case PA_SERVER_TYPE_SYSTEM
:
503 conf
->system_instance
= TRUE
;
506 pa_assert_not_reached();
509 start_server
= conf
->local_server_type
== PA_SERVER_TYPE_USER
|| (getuid() == 0 && conf
->local_server_type
== PA_SERVER_TYPE_SYSTEM
);
511 if (!start_server
&& conf
->local_server_type
== PA_SERVER_TYPE_SYSTEM
) {
512 pa_log_notice(_("System mode refused for non-root user. Only starting the D-Bus server lookup service."));
513 conf
->system_instance
= FALSE
;
517 LTDL_SET_PRELOADED_SYMBOLS();
521 if (conf
->dl_search_path
)
522 lt_dlsetsearchpath(conf
->dl_search_path
);
527 WSAStartup(MAKEWORD(2, 0), &data
);
534 case PA_CMD_DUMP_MODULES
:
535 pa_dump_modules(conf
, argc
-d
, argv
+d
);
539 case PA_CMD_DUMP_CONF
: {
540 s
= pa_daemon_conf_dump(conf
);
547 case PA_CMD_DUMP_RESAMPLE_METHODS
: {
550 for (i
= 0; i
< PA_RESAMPLER_MAX
; i
++)
551 if (pa_resample_method_supported(i
))
552 printf("%s\n", pa_resample_method_to_string(i
));
559 pa_cmdline_help(argv
[0]);
563 case PA_CMD_VERSION
:
564 printf(PACKAGE_NAME
" "PACKAGE_VERSION
"\n");
571 if (pa_pid_file_check_running(&pid
, "pulseaudio") < 0)
572 pa_log_info(_("Daemon not running"));
574 pa_log_info(_("Daemon running as PID %u"), pid
);
583 if (pa_pid_file_kill(SIGINT
, NULL
, "pulseaudio") < 0)
584 pa_log(_("Failed to kill daemon: %s"), pa_cstrerror(errno
));
590 case PA_CMD_CLEANUP_SHM
:
592 if (pa_shm_cleanup() >= 0)
598 pa_assert(conf
->cmd
== PA_CMD_DAEMON
|| conf
->cmd
== PA_CMD_START
);
601 if (getuid() == 0 && !conf
->system_instance
)
602 pa_log_warn(_("This program is not intended to be run as root (unless --system is specified)."));
603 #ifndef HAVE_DBUS /* A similar, only a notice worthy check was done earlier, if D-Bus is enabled. */
604 else if (getuid() != 0 && conf
->system_instance
) {
605 pa_log(_("Root privileges required."));
610 if (conf
->cmd
== PA_CMD_START
&& conf
->system_instance
) {
611 pa_log(_("--start not supported for system instances."));
615 if (conf
->system_instance
&& !conf
->disallow_exit
)
616 pa_log_warn(_("Running in system mode, but --disallow-exit not set!"));
618 if (conf
->system_instance
&& !conf
->disallow_module_loading
)
619 pa_log_warn(_("Running in system mode, but --disallow-module-loading not set!"));
621 if (conf
->system_instance
&& !conf
->disable_shm
) {
622 pa_log_notice(_("Running in system mode, forcibly disabling SHM mode!"));
623 conf
->disable_shm
= TRUE
;
626 if (conf
->system_instance
&& conf
->exit_idle_time
>= 0) {
627 pa_log_notice(_("Running in system mode, forcibly disabling exit idle time!"));
628 conf
->exit_idle_time
= -1;
631 if (conf
->cmd
== PA_CMD_START
) {
632 /* If we shall start PA only when it is not running yet, we
633 * first take the autospawn lock to make things
636 if ((autospawn_fd
= pa_autospawn_lock_init()) < 0) {
637 pa_log("Failed to initialize autospawn lock");
641 if ((pa_autospawn_lock_acquire(TRUE
) < 0)) {
642 pa_log("Failed to acquire autospawn lock");
646 autospawn_locked
= TRUE
;
649 if (conf
->daemonize
) {
652 if (pa_stdio_acquire() < 0) {
653 pa_log(_("Failed to acquire stdio."));
658 if (pipe(daemon_pipe
) < 0) {
659 pa_log(_("pipe() failed: %s"), pa_cstrerror(errno
));
663 if ((child
= fork()) < 0) {
664 pa_log(_("fork() failed: %s"), pa_cstrerror(errno
));
672 pa_assert_se(pa_close(daemon_pipe
[1]) == 0);
675 if ((n
= pa_loop_read(daemon_pipe
[0], &retval
, sizeof(retval
), NULL
)) != sizeof(retval
)) {
678 pa_log(_("read() failed: %s"), pa_cstrerror(errno
));
684 pa_log(_("Daemon startup failed."));
686 pa_log_info(_("Daemon startup successful."));
691 if (autospawn_fd
>= 0) {
692 /* The lock file is unlocked from the parent, so we need
693 * to close it in the child */
695 pa_autospawn_lock_release();
696 pa_autospawn_lock_done(TRUE
);
698 autospawn_locked
= FALSE
;
702 pa_assert_se(pa_close(daemon_pipe
[0]) == 0);
706 if (conf
->auto_log_target
)
707 pa_log_set_target(PA_LOG_SYSLOG
);
711 pa_log(_("setsid() failed: %s"), pa_cstrerror(errno
));
716 /* We now are a session and process group leader. Let's fork
717 * again and let the father die, so that we'll become a
718 * process that can never acquire a TTY again, in a session and
719 * process group without leader */
722 if ((child
= fork()) < 0) {
723 pa_log(_("fork() failed: %s"), pa_cstrerror(errno
));
734 signal(SIGTTOU
, SIG_IGN
);
737 signal(SIGTTIN
, SIG_IGN
);
740 signal(SIGTSTP
, SIG_IGN
);
746 pa_set_env_and_record("PULSE_INTERNAL", "1");
747 pa_assert_se(chdir("/") == 0);
750 #ifdef HAVE_SYS_RESOURCE_H
751 set_all_rlimits(conf
);
753 pa_rtclock_hrtimer_enable();
755 pa_raise_priority(conf
->nice_level
);
757 if (conf
->system_instance
)
758 if (change_user() < 0)
761 pa_set_env_and_record("PULSE_SYSTEM", conf
->system_instance
? "1" : "0");
763 pa_log_info(_("This is PulseAudio %s"), PACKAGE_VERSION
);
764 pa_log_debug(_("Compilation host: %s"), CANONICAL_HOST
);
765 pa_log_debug(_("Compilation CFLAGS: %s"), PA_CFLAGS
);
767 s
= pa_uname_string();
768 pa_log_debug(_("Running on host: %s"), s
);
771 pa_log_debug(_("Found %u CPUs."), pa_ncpus());
773 pa_log_info(_("Page size is %lu bytes"), (unsigned long) PA_PAGE_SIZE
);
775 #ifdef HAVE_VALGRIND_MEMCHECK_H
776 pa_log_debug(_("Compiled with Valgrind support: yes"));
778 pa_log_debug(_("Compiled with Valgrind support: no"));
781 pa_log_debug(_("Running in valgrind mode: %s"), pa_yes_no(pa_in_valgrind()));
783 pa_log_debug(_("Running in VM: %s"), pa_yes_no(pa_running_in_vm()));
786 pa_log_debug(_("Optimized build: yes"));
788 pa_log_debug(_("Optimized build: no"));
792 pa_log_debug(_("NDEBUG defined, all asserts disabled."));
793 #elif defined(FASTPATH)
794 pa_log_debug(_("FASTPATH defined, only fast path asserts disabled."));
796 pa_log_debug(_("All asserts enabled."));
799 if (!(s
= pa_machine_id())) {
800 pa_log(_("Failed to get machine ID"));
803 pa_log_info(_("Machine ID is %s."), s
);
806 if ((s
= pa_session_id())) {
807 pa_log_info(_("Session ID is %s."), s
);
811 if (!(s
= pa_get_runtime_dir()))
813 pa_log_info(_("Using runtime directory %s."), s
);
816 if (!(s
= pa_get_state_dir()))
818 pa_log_info(_("Using state directory %s."), s
);
821 pa_log_info(_("Using modules directory %s."), conf
->dl_search_path
);
823 pa_log_info(_("Running in system mode: %s"), pa_yes_no(pa_in_system_mode()));
825 if (pa_in_system_mode())
826 pa_log_warn(_("OK, so you are running PA in system mode. Please note that you most likely shouldn't be doing that.\n"
827 "If you do it nonetheless then it's your own fault if things don't work as expected.\n"
828 "Please read http://pulseaudio.org/wiki/WhatIsWrongWithSystemMode for an explanation why system mode is usually a bad idea."));
830 if (conf
->use_pid_file
) {
833 if ((z
= pa_pid_file_create("pulseaudio")) != 0) {
835 if (conf
->cmd
== PA_CMD_START
&& z
> 0) {
836 /* If we are already running and with are run in
837 * --start mode, then let's return this as success. */
843 pa_log(_("pa_pid_file_create() failed."));
847 valid_pid_file
= TRUE
;
850 pa_disable_sigpipe();
852 if (pa_rtclock_hrtimer())
853 pa_log_info(_("Fresh high-resolution timers available! Bon appetit!"));
855 pa_log_info(_("Dude, your kernel stinks! The chef's recommendation today is Linux with high-resolution timers enabled!"));
857 if (conf
->lock_memory
) {
858 #ifdef HAVE_SYS_MMAN_H
859 if (mlockall(MCL_FUTURE
) < 0)
860 pa_log_warn("mlockall() failed: %s", pa_cstrerror(errno
));
862 pa_log_info("Sucessfully locked process into memory.");
864 pa_log_warn("Memory locking requested but not supported on platform.");
868 pa_memtrap_install();
870 if (!getenv("PULSE_NO_SIMD")) {
875 pa_assert_se(mainloop
= pa_mainloop_new());
877 if (!(c
= pa_core_new(pa_mainloop_get_api(mainloop
), !conf
->disable_shm
, conf
->shm_size
))) {
878 pa_log(_("pa_core_new() failed."));
882 c
->default_sample_spec
= conf
->default_sample_spec
;
883 c
->default_channel_map
= conf
->default_channel_map
;
884 c
->default_n_fragments
= conf
->default_n_fragments
;
885 c
->default_fragment_size_msec
= conf
->default_fragment_size_msec
;
886 c
->exit_idle_time
= conf
->exit_idle_time
;
887 c
->scache_idle_time
= conf
->scache_idle_time
;
888 c
->resample_method
= conf
->resample_method
;
889 c
->realtime_priority
= conf
->realtime_priority
;
890 c
->realtime_scheduling
= !!conf
->realtime_scheduling
;
891 c
->disable_remixing
= !!conf
->disable_remixing
;
892 c
->disable_lfe_remixing
= !!conf
->disable_lfe_remixing
;
893 c
->running_as_daemon
= !!conf
->daemonize
;
894 c
->disallow_exit
= conf
->disallow_exit
;
895 c
->flat_volumes
= conf
->flat_volumes
;
897 c
->server_type
= conf
->local_server_type
;
900 pa_assert_se(pa_signal_init(pa_mainloop_get_api(mainloop
)) == 0);
901 pa_signal_new(SIGINT
, signal_callback
, c
);
902 pa_signal_new(SIGTERM
, signal_callback
, c
);
904 pa_signal_new(SIGUSR1
, signal_callback
, c
);
907 pa_signal_new(SIGUSR2
, signal_callback
, c
);
910 pa_signal_new(SIGHUP
, signal_callback
, c
);
914 win32_timer
= pa_mainloop_get_api(mainloop
)->rtclock_time_new(pa_mainloop_get_api(mainloop
), pa_gettimeofday(&win32_tv
), message_cb
, NULL
);
917 if (!conf
->no_cpu_limit
)
918 pa_assert_se(pa_cpu_limit_init(pa_mainloop_get_api(mainloop
)) == 0);
920 buf
= pa_strbuf_new();
925 if (conf
->load_default_script_file
) {
928 if ((f
= pa_daemon_conf_open_default_script_file(conf
))) {
929 r
= pa_cli_command_execute_file_stream(c
, f
, buf
, &conf
->fail
);
935 r
= pa_cli_command_execute(c
, conf
->script_commands
, buf
, &conf
->fail
);
937 pa_log_error("%s", s
= pa_strbuf_tostring_free(buf
));
940 if (r
< 0 && conf
->fail
) {
941 pa_log(_("Failed to initialize daemon."));
945 if (!c
->modules
|| pa_idxset_size(c
->modules
) == 0) {
946 pa_log(_("Daemon startup without any loaded modules, refusing to work."));
951 /* When we just provide the D-Bus server lookup service, we don't want
952 * any modules to be loaded. We haven't loaded any so far, so one might
953 * think there's no way to contact the server, but receiving certain
954 * signals could still cause modules to load. */
955 conf
->disallow_module_loading
= TRUE
;
959 /* We completed the initial module loading, so let's disable it
960 * from now on, if requested */
961 c
->disallow_module_loading
= !!conf
->disallow_module_loading
;
964 if (daemon_pipe
[1] >= 0) {
966 pa_loop_write(daemon_pipe
[1], &ok
, sizeof(ok
), NULL
);
967 pa_close(daemon_pipe
[1]);
973 if (!conf
->system_instance
) {
974 if (!(server_lookup
= pa_dbusobj_server_lookup_new(c
)))
976 if (!(lookup_service_bus
= register_dbus_name(c
, DBUS_BUS_SESSION
, "org.PulseAudio1")))
980 if (start_server
&& !(server_bus
= register_dbus_name(c
, conf
->system_instance
? DBUS_BUS_SYSTEM
: DBUS_BUS_SESSION
, "org.pulseaudio.Server")))
984 pa_log_info(_("Daemon startup complete."));
987 if (pa_mainloop_run(mainloop
, &retval
) < 0)
990 pa_log_info(_("Daemon shutdown initiated."));
995 pa_dbus_connection_unref(server_bus
);
996 if (lookup_service_bus
)
997 pa_dbus_connection_unref(lookup_service_bus
);
999 pa_dbusobj_server_lookup_free(server_lookup
);
1002 if (autospawn_fd
>= 0) {
1003 if (autospawn_locked
)
1004 pa_autospawn_lock_release();
1006 pa_autospawn_lock_done(FALSE
);
1011 pa_mainloop_get_api(mainloop
)->time_free(win32_timer
);
1016 pa_log_info(_("Daemon terminated."));
1019 if (!conf
->no_cpu_limit
)
1020 pa_cpu_limit_done();
1025 if (daemon_pipe
[1] >= 0)
1026 pa_loop_write(daemon_pipe
[1], &retval
, sizeof(retval
), NULL
);
1028 pa_close_pipe(daemon_pipe
);
1032 pa_mainloop_free(mainloop
);
1035 pa_daemon_conf_free(conf
);
1038 pa_pid_file_remove();
1040 /* This has no real purpose except making things valgrind-clean */
1041 pa_unset_env_recorded();