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
59 #include <dbus/dbus.h>
62 #include <pulse/client-conf.h>
64 #include <pulse/client-conf-x11.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/socket.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>
93 #include <pulsecore/strlist.h>
95 #include <pulsecore/dbus-shared.h>
97 #include <pulsecore/cpu-arm.h>
98 #include <pulsecore/cpu-x86.h>
99 #include <pulsecore/cpu-orc.h>
102 #include "cpulimit.h"
103 #include "daemon-conf.h"
104 #include "dumpmodules.h"
106 #include "ltdl-bind-now.h"
107 #include "server-lookup.h"
110 /* Only one instance of these variables */
111 int allow_severity
= LOG_INFO
;
112 int deny_severity
= LOG_WARNING
;
115 #ifdef HAVE_OSS_WRAPPER
116 /* padsp looks for this symbol in the running process and disables
117 * itself if it finds it and it is set to 7 (which is actually a bit
118 * mask). For details see padsp. */
119 int __padsp_disabled__
= 7;
124 static void message_cb(pa_mainloop_api
*a
, pa_time_event
*e
, const struct timeval
*tv
, void *userdata
) {
126 struct timeval tvnext
;
128 while (PeekMessage(&msg
, NULL
, 0, 0, PM_REMOVE
)) {
129 if (msg
.message
== WM_QUIT
)
132 TranslateMessage(&msg
);
133 DispatchMessage(&msg
);
137 pa_timeval_add(pa_gettimeofday(&tvnext
), 100000);
138 a
->time_restart(e
, &tvnext
);
143 static void signal_callback(pa_mainloop_api
*m
, pa_signal_event
*e
, int sig
, void *userdata
) {
144 pa_log_info(_("Got signal %s."), pa_sig2str(sig
));
149 pa_module_load(userdata
, "module-cli", NULL
);
155 pa_module_load(userdata
, "module-cli-protocol-unix", NULL
);
161 char *c
= pa_full_status_string(userdata
);
162 pa_log_notice("%s", c
);
171 pa_log_info(_("Exiting."));
177 #if defined(HAVE_PWD_H) && defined(HAVE_GRP_H)
179 static int change_user(void) {
184 /* This function is called only in system-wide mode. It creates a
185 * runtime dir in /var/run/ with proper UID/GID and drops privs
188 if (!(pw
= getpwnam(PA_SYSTEM_USER
))) {
189 pa_log(_("Failed to find user '%s'."), PA_SYSTEM_USER
);
193 if (!(gr
= getgrnam(PA_SYSTEM_GROUP
))) {
194 pa_log(_("Failed to find group '%s'."), PA_SYSTEM_GROUP
);
198 pa_log_info(_("Found user '%s' (UID %lu) and group '%s' (GID %lu)."),
199 PA_SYSTEM_USER
, (unsigned long) pw
->pw_uid
,
200 PA_SYSTEM_GROUP
, (unsigned long) gr
->gr_gid
);
202 if (pw
->pw_gid
!= gr
->gr_gid
) {
203 pa_log(_("GID of user '%s' and of group '%s' don't match."), PA_SYSTEM_USER
, PA_SYSTEM_GROUP
);
207 if (strcmp(pw
->pw_dir
, PA_SYSTEM_RUNTIME_PATH
) != 0)
208 pa_log_warn(_("Home directory of user '%s' is not '%s', ignoring."), PA_SYSTEM_USER
, PA_SYSTEM_RUNTIME_PATH
);
210 if (pa_make_secure_dir(PA_SYSTEM_RUNTIME_PATH
, 0755, pw
->pw_uid
, gr
->gr_gid
) < 0) {
211 pa_log(_("Failed to create '%s': %s"), PA_SYSTEM_RUNTIME_PATH
, pa_cstrerror(errno
));
215 if (pa_make_secure_dir(PA_SYSTEM_STATE_PATH
, 0700, pw
->pw_uid
, gr
->gr_gid
) < 0) {
216 pa_log(_("Failed to create '%s': %s"), PA_SYSTEM_STATE_PATH
, pa_cstrerror(errno
));
220 /* We don't create the config dir here, because we don't need to write to it */
222 if (initgroups(PA_SYSTEM_USER
, gr
->gr_gid
) != 0) {
223 pa_log(_("Failed to change group list: %s"), pa_cstrerror(errno
));
227 #if defined(HAVE_SETRESGID)
228 r
= setresgid(gr
->gr_gid
, gr
->gr_gid
, gr
->gr_gid
);
229 #elif defined(HAVE_SETEGID)
230 if ((r
= setgid(gr
->gr_gid
)) >= 0)
231 r
= setegid(gr
->gr_gid
);
232 #elif defined(HAVE_SETREGID)
233 r
= setregid(gr
->gr_gid
, gr
->gr_gid
);
235 #error "No API to drop privileges"
239 pa_log(_("Failed to change GID: %s"), pa_cstrerror(errno
));
243 #if defined(HAVE_SETRESUID)
244 r
= setresuid(pw
->pw_uid
, pw
->pw_uid
, pw
->pw_uid
);
245 #elif defined(HAVE_SETEUID)
246 if ((r
= setuid(pw
->pw_uid
)) >= 0)
247 r
= seteuid(pw
->pw_uid
);
248 #elif defined(HAVE_SETREUID)
249 r
= setreuid(pw
->pw_uid
, pw
->pw_uid
);
251 #error "No API to drop privileges"
255 pa_log(_("Failed to change UID: %s"), pa_cstrerror(errno
));
259 pa_set_env("USER", PA_SYSTEM_USER
);
260 pa_set_env("USERNAME", PA_SYSTEM_USER
);
261 pa_set_env("LOGNAME", PA_SYSTEM_USER
);
262 pa_set_env("HOME", PA_SYSTEM_RUNTIME_PATH
);
264 /* Relevant for pa_runtime_path() */
265 if (!getenv("PULSE_RUNTIME_PATH"))
266 pa_set_env("PULSE_RUNTIME_PATH", PA_SYSTEM_RUNTIME_PATH
);
268 if (!getenv("PULSE_CONFIG_PATH"))
269 pa_set_env("PULSE_CONFIG_PATH", PA_SYSTEM_CONFIG_PATH
);
271 if (!getenv("PULSE_STATE_PATH"))
272 pa_set_env("PULSE_STATE_PATH", PA_SYSTEM_STATE_PATH
);
274 pa_log_info(_("Successfully dropped root privileges."));
279 #else /* HAVE_PWD_H && HAVE_GRP_H */
281 static int change_user(void) {
282 pa_log(_("System wide mode unsupported on this platform."));
286 #endif /* HAVE_PWD_H && HAVE_GRP_H */
288 #ifdef HAVE_SYS_RESOURCE_H
290 static int set_one_rlimit(const pa_rlimit
*r
, int resource
, const char *name
) {
297 rl
.rlim_cur
= rl
.rlim_max
= r
->value
;
299 if (setrlimit(resource
, &rl
) < 0) {
300 pa_log_info(_("setrlimit(%s, (%u, %u)) failed: %s"), name
, (unsigned) r
->value
, (unsigned) r
->value
, pa_cstrerror(errno
));
307 static void set_all_rlimits(const pa_daemon_conf
*conf
) {
308 set_one_rlimit(&conf
->rlimit_fsize
, RLIMIT_FSIZE
, "RLIMIT_FSIZE");
309 set_one_rlimit(&conf
->rlimit_data
, RLIMIT_DATA
, "RLIMIT_DATA");
310 set_one_rlimit(&conf
->rlimit_stack
, RLIMIT_STACK
, "RLIMIT_STACK");
311 set_one_rlimit(&conf
->rlimit_core
, RLIMIT_CORE
, "RLIMIT_CORE");
313 set_one_rlimit(&conf
->rlimit_rss
, RLIMIT_RSS
, "RLIMIT_RSS");
316 set_one_rlimit(&conf
->rlimit_nproc
, RLIMIT_NPROC
, "RLIMIT_NPROC");
319 set_one_rlimit(&conf
->rlimit_nofile
, RLIMIT_NOFILE
, "RLIMIT_NOFILE");
321 #ifdef RLIMIT_MEMLOCK
322 set_one_rlimit(&conf
->rlimit_memlock
, RLIMIT_MEMLOCK
, "RLIMIT_MEMLOCK");
325 set_one_rlimit(&conf
->rlimit_as
, RLIMIT_AS
, "RLIMIT_AS");
328 set_one_rlimit(&conf
->rlimit_locks
, RLIMIT_LOCKS
, "RLIMIT_LOCKS");
330 #ifdef RLIMIT_SIGPENDING
331 set_one_rlimit(&conf
->rlimit_sigpending
, RLIMIT_SIGPENDING
, "RLIMIT_SIGPENDING");
333 #ifdef RLIMIT_MSGQUEUE
334 set_one_rlimit(&conf
->rlimit_msgqueue
, RLIMIT_MSGQUEUE
, "RLIMIT_MSGQUEUE");
337 set_one_rlimit(&conf
->rlimit_nice
, RLIMIT_NICE
, "RLIMIT_NICE");
340 set_one_rlimit(&conf
->rlimit_rtprio
, RLIMIT_RTPRIO
, "RLIMIT_RTPRIO");
343 set_one_rlimit(&conf
->rlimit_rttime
, RLIMIT_RTTIME
, "RLIMIT_RTTIME");
348 static char *check_configured_address(void) {
349 char *default_server
= NULL
;
350 pa_client_conf
*c
= pa_client_conf_new();
352 pa_client_conf_load(c
, NULL
);
354 pa_client_conf_from_x11(c
, NULL
);
356 pa_client_conf_env(c
);
358 if (c
->default_server
&& *c
->default_server
)
359 default_server
= pa_xstrdup(c
->default_server
);
361 pa_client_conf_free(c
);
363 return default_server
;
367 static pa_dbus_connection
*register_dbus_name(pa_core
*c
, DBusBusType bus
, const char* name
) {
369 pa_dbus_connection
*conn
;
371 dbus_error_init(&error
);
373 if (!(conn
= pa_dbus_bus_get(c
, bus
, &error
)) || dbus_error_is_set(&error
)) {
374 pa_log_warn("Unable to contact D-Bus: %s: %s", error
.name
, error
.message
);
378 if (dbus_bus_request_name(pa_dbus_connection_get(conn
), name
, DBUS_NAME_FLAG_DO_NOT_QUEUE
, &error
) == DBUS_REQUEST_NAME_REPLY_PRIMARY_OWNER
) {
379 pa_log_debug("Got %s!", name
);
383 if (dbus_error_is_set(&error
))
384 pa_log_error("Failed to acquire %s: %s: %s", name
, error
.name
, error
.message
);
386 pa_log_error("D-Bus name %s already taken. Weird shit!", name
);
388 /* PA cannot be started twice by the same user and hence we can
389 * ignore mostly the case that a name is already taken. */
393 pa_dbus_connection_unref(conn
);
395 dbus_error_free(&error
);
400 int main(int argc
, char *argv
[]) {
402 pa_strbuf
*buf
= NULL
;
403 pa_daemon_conf
*conf
= NULL
;
404 pa_mainloop
*mainloop
= NULL
;
406 char *configured_address
;
407 int r
= 0, retval
= 1, d
= 0;
408 pa_bool_t valid_pid_file
= FALSE
;
409 pa_bool_t ltdl_init
= FALSE
;
413 int daemon_pipe
[2] = { -1, -1 };
414 int daemon_pipe2
[2] = { -1, -1 };
417 pa_time_event
*win32_timer
;
418 struct timeval win32_tv
;
420 int autospawn_fd
= -1;
421 pa_bool_t autospawn_locked
= FALSE
;
423 pa_dbusobj_server_lookup
*server_lookup
= NULL
; /* /org/pulseaudio/server_lookup */
424 pa_dbus_connection
*lookup_service_bus
= NULL
; /* Always the user bus. */
425 pa_dbus_connection
*server_bus
= NULL
; /* The bus where we reserve org.pulseaudio.Server, either the user or the system bus. */
426 pa_bool_t start_server
;
429 pa_log_set_ident("pulseaudio");
430 pa_log_set_level(PA_LOG_NOTICE
);
431 pa_log_set_flags(PA_LOG_COLORS
|PA_LOG_PRINT_FILE
|PA_LOG_PRINT_LEVEL
, PA_LOG_RESET
);
433 #if defined(__linux__) && defined(__OPTIMIZE__)
435 Disable lazy relocations to make usage of external libraries
436 more deterministic for our RT threads. We abuse __OPTIMIZE__ as
437 a check whether we are a debug build or not. This all is
438 admittedly a bit snake-oilish.
441 if (!getenv("LD_BIND_NOW")) {
445 /* We have to execute ourselves, because the libc caches the
446 * value of $LD_BIND_NOW on initialization. */
448 pa_set_env("LD_BIND_NOW", "1");
450 if ((canonical_rp
= pa_realpath(PA_BINARY
))) {
452 if ((rp
= pa_readlink("/proc/self/exe"))) {
454 if (pa_streq(rp
, canonical_rp
))
455 pa_assert_se(execv(rp
, argv
) == 0);
457 pa_log_warn("/proc/self/exe does not point to %s, cannot self execute. Are you playing games?", canonical_rp
);
462 pa_log_warn("Couldn't read /proc/self/exe, cannot self execute. Running in a chroot()?");
464 pa_xfree(canonical_rp
);
467 pa_log_warn("Couldn't canonicalize binary path, cannot self execute.");
471 if ((e
= getenv("PULSE_PASSED_FD"))) {
478 /* We might be autospawned, in which case have no idea in which
479 * context we have been started. Let's cleanup our execution
480 * context as good as possible */
482 pa_reset_personality();
484 pa_close_all(passed_fd
, -1);
489 setlocale(LC_ALL
, "");
492 conf
= pa_daemon_conf_new();
494 if (pa_daemon_conf_load(conf
, NULL
) < 0)
497 if (pa_daemon_conf_env(conf
) < 0)
500 if (pa_cmdline_parse(conf
, argc
, argv
, &d
) < 0) {
501 pa_log(_("Failed to parse command line."));
505 pa_log_set_level(conf
->log_level
);
506 pa_log_set_target(conf
->auto_log_target
? PA_LOG_STDERR
: conf
->log_target
);
508 pa_log_set_flags(PA_LOG_PRINT_META
, PA_LOG_SET
);
510 pa_log_set_flags(PA_LOG_PRINT_TIME
, PA_LOG_SET
);
511 pa_log_set_show_backtrace(conf
->log_backtrace
);
514 /* conf->system_instance and conf->local_server_type control almost the
515 * same thing; make them agree about what is requested. */
516 switch (conf
->local_server_type
) {
517 case PA_SERVER_TYPE_UNSET
:
518 conf
->local_server_type
= conf
->system_instance
? PA_SERVER_TYPE_SYSTEM
: PA_SERVER_TYPE_USER
;
520 case PA_SERVER_TYPE_USER
:
521 case PA_SERVER_TYPE_NONE
:
522 conf
->system_instance
= FALSE
;
524 case PA_SERVER_TYPE_SYSTEM
:
525 conf
->system_instance
= TRUE
;
528 pa_assert_not_reached();
531 start_server
= conf
->local_server_type
== PA_SERVER_TYPE_USER
|| (getuid() == 0 && conf
->local_server_type
== PA_SERVER_TYPE_SYSTEM
);
533 if (!start_server
&& conf
->local_server_type
== PA_SERVER_TYPE_SYSTEM
) {
534 pa_log_notice(_("System mode refused for non-root user. Only starting the D-Bus server lookup service."));
535 conf
->system_instance
= FALSE
;
539 LTDL_SET_PRELOADED_SYMBOLS();
543 if (conf
->dl_search_path
)
544 lt_dlsetsearchpath(conf
->dl_search_path
);
549 WSAStartup(MAKEWORD(2, 0), &data
);
556 case PA_CMD_DUMP_MODULES
:
557 pa_dump_modules(conf
, argc
-d
, argv
+d
);
561 case PA_CMD_DUMP_CONF
: {
564 pa_log("Too many arguments.\n");
568 s
= pa_daemon_conf_dump(conf
);
575 case PA_CMD_DUMP_RESAMPLE_METHODS
: {
579 pa_log("Too many arguments.\n");
583 for (i
= 0; i
< PA_RESAMPLER_MAX
; i
++)
584 if (pa_resample_method_supported(i
))
585 printf("%s\n", pa_resample_method_to_string(i
));
592 pa_cmdline_help(argv
[0]);
596 case PA_CMD_VERSION
:
599 pa_log("Too many arguments.\n");
603 printf(PACKAGE_NAME
" "PACKAGE_VERSION
"\n");
611 pa_log("Too many arguments.\n");
615 if (pa_pid_file_check_running(&pid
, "pulseaudio") < 0)
616 pa_log_info(_("Daemon not running"));
618 pa_log_info(_("Daemon running as PID %u"), pid
);
628 pa_log("Too many arguments.\n");
632 if (pa_pid_file_kill(SIGINT
, NULL
, "pulseaudio") < 0)
633 pa_log(_("Failed to kill daemon: %s"), pa_cstrerror(errno
));
639 case PA_CMD_CLEANUP_SHM
:
642 pa_log("Too many arguments.\n");
646 if (pa_shm_cleanup() >= 0)
652 pa_assert(conf
->cmd
== PA_CMD_DAEMON
|| conf
->cmd
== PA_CMD_START
);
656 pa_log("Too many arguments.\n");
661 if (getuid() == 0 && !conf
->system_instance
)
662 pa_log_warn(_("This program is not intended to be run as root (unless --system is specified)."));
663 #ifndef HAVE_DBUS /* A similar, only a notice worthy check was done earlier, if D-Bus is enabled. */
664 else if (getuid() != 0 && conf
->system_instance
) {
665 pa_log(_("Root privileges required."));
669 #endif /* HAVE_GETUID */
671 if (conf
->cmd
== PA_CMD_START
&& conf
->system_instance
) {
672 pa_log(_("--start not supported for system instances."));
676 if (conf
->cmd
== PA_CMD_START
&& (configured_address
= check_configured_address())) {
677 /* There is an server address in our config, but where did it come from?
678 * By default a standard X11 login will load module-x11-publish which will
679 * inject PULSE_SERVER X11 property. If the PA daemon crashes, we will end
680 * up hitting this code path. So we have to check to see if our configured_address
681 * is the same as the value that would go into this property so that we can
682 * recover (i.e. autospawn) from a crash.
685 pa_bool_t start_anyway
= FALSE
;
687 if ((ufn
= pa_runtime_path(PA_NATIVE_DEFAULT_UNIX_SOCKET
))) {
690 if ((id
= pa_machine_id())) {
691 pa_strlist
*server_list
;
692 char formatted_ufn
[256];
694 pa_snprintf(formatted_ufn
, sizeof(formatted_ufn
), "{%s}unix:%s", id
, ufn
);
697 if ((server_list
= pa_strlist_parse(configured_address
))) {
700 /* We only need to check the first server */
701 server_list
= pa_strlist_pop(server_list
, &u
);
702 pa_strlist_free(server_list
);
704 start_anyway
= (u
&& pa_streq(formatted_ufn
, u
));
712 pa_log_notice(_("User-configured server at %s, refusing to start/autospawn."), configured_address
);
713 pa_xfree(configured_address
);
718 pa_log_notice(_("User-configured server at %s, which appears to be local. Probing deeper."), configured_address
);
719 pa_xfree(configured_address
);
722 if (conf
->system_instance
&& !conf
->disallow_exit
)
723 pa_log_warn(_("Running in system mode, but --disallow-exit not set!"));
725 if (conf
->system_instance
&& !conf
->disallow_module_loading
)
726 pa_log_warn(_("Running in system mode, but --disallow-module-loading not set!"));
728 if (conf
->system_instance
&& !conf
->disable_shm
) {
729 pa_log_notice(_("Running in system mode, forcibly disabling SHM mode!"));
730 conf
->disable_shm
= TRUE
;
733 if (conf
->system_instance
&& conf
->exit_idle_time
>= 0) {
734 pa_log_notice(_("Running in system mode, forcibly disabling exit idle time!"));
735 conf
->exit_idle_time
= -1;
738 if (conf
->cmd
== PA_CMD_START
) {
739 /* If we shall start PA only when it is not running yet, we
740 * first take the autospawn lock to make things
743 if ((autospawn_fd
= pa_autospawn_lock_init()) < 0) {
744 pa_log("Failed to initialize autospawn lock");
748 if ((pa_autospawn_lock_acquire(TRUE
) < 0)) {
749 pa_log("Failed to acquire autospawn lock");
753 autospawn_locked
= TRUE
;
756 if (conf
->daemonize
) {
759 if (pa_stdio_acquire() < 0) {
760 pa_log(_("Failed to acquire stdio."));
765 if (pipe(daemon_pipe
) < 0) {
766 pa_log(_("pipe() failed: %s"), pa_cstrerror(errno
));
770 if ((child
= fork()) < 0) {
771 pa_log(_("fork() failed: %s"), pa_cstrerror(errno
));
772 pa_close_pipe(daemon_pipe
);
780 pa_assert_se(pa_close(daemon_pipe
[1]) == 0);
783 if ((n
= pa_loop_read(daemon_pipe
[0], &retval
, sizeof(retval
), NULL
)) != sizeof(retval
)) {
786 pa_log(_("read() failed: %s"), pa_cstrerror(errno
));
792 pa_log(_("Daemon startup failed."));
794 pa_log_info(_("Daemon startup successful."));
799 if (autospawn_fd
>= 0) {
800 /* The lock file is unlocked from the parent, so we need
801 * to close it in the child */
803 pa_autospawn_lock_release();
804 pa_autospawn_lock_done(TRUE
);
806 autospawn_locked
= FALSE
;
810 pa_assert_se(pa_close(daemon_pipe
[0]) == 0);
814 if (conf
->auto_log_target
)
815 pa_log_set_target(PA_LOG_SYSLOG
);
819 pa_log(_("setsid() failed: %s"), pa_cstrerror(errno
));
825 /* We now are a session and process group leader. Let's fork
826 * again and let the father die, so that we'll become a
827 * process that can never acquire a TTY again, in a session and
828 * process group without leader */
830 if (pipe(daemon_pipe2
) < 0) {
831 pa_log(_("pipe() failed: %s"), pa_cstrerror(errno
));
835 if ((child
= fork()) < 0) {
836 pa_log(_("fork() failed: %s"), pa_cstrerror(errno
));
837 pa_close_pipe(daemon_pipe2
);
845 pa_assert_se(pa_close(daemon_pipe2
[1]) == 0);
846 daemon_pipe2
[1] = -1;
848 if ((n
= pa_loop_read(daemon_pipe2
[0], &retval
, sizeof(retval
), NULL
)) != sizeof(retval
)) {
851 pa_log(_("read() failed: %s"), pa_cstrerror(errno
));
856 /* We now have to take care of signalling the first fork with
857 * the return value we've received from this fork... */
858 pa_assert(daemon_pipe
[1] >= 0);
860 pa_loop_write(daemon_pipe
[1], &retval
, sizeof(retval
), NULL
);
861 pa_close(daemon_pipe
[1]);
867 pa_assert_se(pa_close(daemon_pipe2
[0]) == 0);
868 daemon_pipe2
[0] = -1;
870 /* We no longer need the (first) daemon_pipe as it's handled in our child above */
871 pa_close_pipe(daemon_pipe
);
875 signal(SIGTTOU
, SIG_IGN
);
878 signal(SIGTTIN
, SIG_IGN
);
881 signal(SIGTSTP
, SIG_IGN
);
887 pa_set_env_and_record("PULSE_INTERNAL", "1");
888 pa_assert_se(chdir("/") == 0);
891 #ifdef HAVE_SYS_RESOURCE_H
892 set_all_rlimits(conf
);
894 pa_rtclock_hrtimer_enable();
896 pa_raise_priority(conf
->nice_level
);
898 if (conf
->system_instance
)
899 if (change_user() < 0)
902 pa_set_env_and_record("PULSE_SYSTEM", conf
->system_instance
? "1" : "0");
904 pa_log_info(_("This is PulseAudio %s"), PACKAGE_VERSION
);
905 pa_log_debug(_("Compilation host: %s"), CANONICAL_HOST
);
906 pa_log_debug(_("Compilation CFLAGS: %s"), PA_CFLAGS
);
908 s
= pa_uname_string();
909 pa_log_debug(_("Running on host: %s"), s
);
912 pa_log_debug(_("Found %u CPUs."), pa_ncpus());
914 pa_log_info(_("Page size is %lu bytes"), (unsigned long) PA_PAGE_SIZE
);
916 #ifdef HAVE_VALGRIND_MEMCHECK_H
917 pa_log_debug(_("Compiled with Valgrind support: yes"));
919 pa_log_debug(_("Compiled with Valgrind support: no"));
922 pa_log_debug(_("Running in valgrind mode: %s"), pa_yes_no(pa_in_valgrind()));
924 pa_log_debug(_("Running in VM: %s"), pa_yes_no(pa_running_in_vm()));
927 pa_log_debug(_("Optimized build: yes"));
929 pa_log_debug(_("Optimized build: no"));
933 pa_log_debug(_("NDEBUG defined, all asserts disabled."));
934 #elif defined(FASTPATH)
935 pa_log_debug(_("FASTPATH defined, only fast path asserts disabled."));
937 pa_log_debug(_("All asserts enabled."));
940 if (!(s
= pa_machine_id())) {
941 pa_log(_("Failed to get machine ID"));
944 pa_log_info(_("Machine ID is %s."), s
);
947 if ((s
= pa_session_id())) {
948 pa_log_info(_("Session ID is %s."), s
);
952 if (!(s
= pa_get_runtime_dir()))
954 pa_log_info(_("Using runtime directory %s."), s
);
957 if (!(s
= pa_get_state_dir()))
959 pa_log_info(_("Using state directory %s."), s
);
962 pa_log_info(_("Using modules directory %s."), conf
->dl_search_path
);
964 pa_log_info(_("Running in system mode: %s"), pa_yes_no(pa_in_system_mode()));
966 if (pa_in_system_mode())
967 pa_log_warn(_("OK, so you are running PA in system mode. Please note that you most likely shouldn't be doing that.\n"
968 "If you do it nonetheless then it's your own fault if things don't work as expected.\n"
969 "Please read http://pulseaudio.org/wiki/WhatIsWrongWithSystemMode for an explanation why system mode is usually a bad idea."));
971 if (conf
->use_pid_file
) {
974 if ((z
= pa_pid_file_create("pulseaudio")) != 0) {
976 if (conf
->cmd
== PA_CMD_START
&& z
> 0) {
977 /* If we are already running and with are run in
978 * --start mode, then let's return this as success. */
984 pa_log(_("pa_pid_file_create() failed."));
988 valid_pid_file
= TRUE
;
991 pa_disable_sigpipe();
993 if (pa_rtclock_hrtimer())
994 pa_log_info(_("Fresh high-resolution timers available! Bon appetit!"));
996 pa_log_info(_("Dude, your kernel stinks! The chef's recommendation today is Linux with high-resolution timers enabled!"));
998 if (conf
->lock_memory
) {
999 #ifdef HAVE_SYS_MMAN_H
1000 if (mlockall(MCL_FUTURE
) < 0)
1001 pa_log_warn("mlockall() failed: %s", pa_cstrerror(errno
));
1003 pa_log_info("Successfully locked process into memory.");
1005 pa_log_warn("Memory locking requested but not supported on platform.");
1009 pa_memtrap_install();
1011 pa_assert_se(mainloop
= pa_mainloop_new());
1013 if (!(c
= pa_core_new(pa_mainloop_get_api(mainloop
), !conf
->disable_shm
, conf
->shm_size
))) {
1014 pa_log(_("pa_core_new() failed."));
1018 c
->default_sample_spec
= conf
->default_sample_spec
;
1019 c
->default_channel_map
= conf
->default_channel_map
;
1020 c
->default_n_fragments
= conf
->default_n_fragments
;
1021 c
->default_fragment_size_msec
= conf
->default_fragment_size_msec
;
1022 c
->sync_volume_safety_margin_usec
= conf
->sync_volume_safety_margin_usec
;
1023 c
->sync_volume_extra_delay_usec
= conf
->sync_volume_extra_delay_usec
;
1024 c
->exit_idle_time
= conf
->exit_idle_time
;
1025 c
->scache_idle_time
= conf
->scache_idle_time
;
1026 c
->resample_method
= conf
->resample_method
;
1027 c
->realtime_priority
= conf
->realtime_priority
;
1028 c
->realtime_scheduling
= !!conf
->realtime_scheduling
;
1029 c
->disable_remixing
= !!conf
->disable_remixing
;
1030 c
->disable_lfe_remixing
= !!conf
->disable_lfe_remixing
;
1031 c
->sync_volume
= !!conf
->sync_volume
;
1032 c
->running_as_daemon
= !!conf
->daemonize
;
1033 c
->disallow_exit
= conf
->disallow_exit
;
1034 c
->flat_volumes
= conf
->flat_volumes
;
1036 c
->server_type
= conf
->local_server_type
;
1039 c
->cpu_info
.cpu_type
= PA_CPU_UNDEFINED
;
1040 if (!getenv("PULSE_NO_SIMD")) {
1041 if (pa_cpu_init_x86(&(c
->cpu_info
.flags
.x86
)))
1042 c
->cpu_info
.cpu_type
= PA_CPU_X86
;
1043 if (pa_cpu_init_arm(&(c
->cpu_info
.flags
.arm
)))
1044 c
->cpu_info
.cpu_type
= PA_CPU_ARM
;
1045 pa_cpu_init_orc(c
->cpu_info
);
1048 pa_assert_se(pa_signal_init(pa_mainloop_get_api(mainloop
)) == 0);
1049 pa_signal_new(SIGINT
, signal_callback
, c
);
1050 pa_signal_new(SIGTERM
, signal_callback
, c
);
1052 pa_signal_new(SIGUSR1
, signal_callback
, c
);
1055 pa_signal_new(SIGUSR2
, signal_callback
, c
);
1058 pa_signal_new(SIGHUP
, signal_callback
, c
);
1062 win32_timer
= pa_mainloop_get_api(mainloop
)->time_new(pa_mainloop_get_api(mainloop
), pa_gettimeofday(&win32_tv
), message_cb
, NULL
);
1065 if (!conf
->no_cpu_limit
)
1066 pa_assert_se(pa_cpu_limit_init(pa_mainloop_get_api(mainloop
)) == 0);
1068 buf
= pa_strbuf_new();
1073 if (conf
->load_default_script_file
) {
1076 if ((f
= pa_daemon_conf_open_default_script_file(conf
))) {
1077 r
= pa_cli_command_execute_file_stream(c
, f
, buf
, &conf
->fail
);
1083 r
= pa_cli_command_execute(c
, conf
->script_commands
, buf
, &conf
->fail
);
1085 pa_log_error("%s", s
= pa_strbuf_tostring_free(buf
));
1088 if (r
< 0 && conf
->fail
) {
1089 pa_log(_("Failed to initialize daemon."));
1093 if (!c
->modules
|| pa_idxset_size(c
->modules
) == 0) {
1094 pa_log(_("Daemon startup without any loaded modules, refusing to work."));
1099 /* When we just provide the D-Bus server lookup service, we don't want
1100 * any modules to be loaded. We haven't loaded any so far, so one might
1101 * think there's no way to contact the server, but receiving certain
1102 * signals could still cause modules to load. */
1103 conf
->disallow_module_loading
= TRUE
;
1107 /* We completed the initial module loading, so let's disable it
1108 * from now on, if requested */
1109 c
->disallow_module_loading
= !!conf
->disallow_module_loading
;
1112 if (!conf
->system_instance
) {
1113 if (!(server_lookup
= pa_dbusobj_server_lookup_new(c
)))
1115 if (!(lookup_service_bus
= register_dbus_name(c
, DBUS_BUS_SESSION
, "org.PulseAudio1")))
1119 if (start_server
&& !(server_bus
= register_dbus_name(c
, conf
->system_instance
? DBUS_BUS_SYSTEM
: DBUS_BUS_SESSION
, "org.pulseaudio.Server")))
1124 if (daemon_pipe2
[1] >= 0) {
1126 pa_loop_write(daemon_pipe2
[1], &ok
, sizeof(ok
), NULL
);
1127 pa_close(daemon_pipe2
[1]);
1128 daemon_pipe2
[1] = -1;
1132 pa_log_info(_("Daemon startup complete."));
1135 if (pa_mainloop_run(mainloop
, &retval
) < 0)
1138 pa_log_info(_("Daemon shutdown initiated."));
1143 pa_dbus_connection_unref(server_bus
);
1144 if (lookup_service_bus
)
1145 pa_dbus_connection_unref(lookup_service_bus
);
1147 pa_dbusobj_server_lookup_free(server_lookup
);
1150 if (autospawn_fd
>= 0) {
1151 if (autospawn_locked
)
1152 pa_autospawn_lock_release();
1154 pa_autospawn_lock_done(FALSE
);
1158 if (mainloop
&& win32_timer
)
1159 pa_mainloop_get_api(mainloop
)->time_free(win32_timer
);
1164 pa_log_info(_("Daemon terminated."));
1167 if (!conf
->no_cpu_limit
)
1168 pa_cpu_limit_done();
1173 /* If we have daemon_pipe[1] still open, this means we've failed after
1174 * the first fork, but before the second. Therefore just write to it. */
1175 if (daemon_pipe
[1] >= 0)
1176 pa_loop_write(daemon_pipe
[1], &retval
, sizeof(retval
), NULL
);
1177 else if (daemon_pipe2
[1] >= 0)
1178 pa_loop_write(daemon_pipe2
[1], &retval
, sizeof(retval
), NULL
);
1180 pa_close_pipe(daemon_pipe2
);
1181 pa_close_pipe(daemon_pipe
);
1185 pa_mainloop_free(mainloop
);
1188 pa_daemon_conf_free(conf
);
1191 pa_pid_file_remove();
1193 /* This has no real purpose except making things valgrind-clean */
1194 pa_unset_env_recorded();