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
38 #include <sys/types.h>
43 #ifdef HAVE_SYS_MMAN_H
60 #include <dbus/dbus.h>
63 #include <pulse/client-conf.h>
65 #include <pulse/client-conf-x11.h>
67 #include <pulse/mainloop.h>
68 #include <pulse/mainloop-signal.h>
69 #include <pulse/timeval.h>
70 #include <pulse/xmalloc.h>
72 #include <pulsecore/i18n.h>
73 #include <pulsecore/lock-autospawn.h>
74 #include <pulsecore/socket.h>
75 #include <pulsecore/core-error.h>
76 #include <pulsecore/core-rtclock.h>
77 #include <pulsecore/core-scache.h>
78 #include <pulsecore/core.h>
79 #include <pulsecore/module.h>
80 #include <pulsecore/cli-command.h>
81 #include <pulsecore/log.h>
82 #include <pulsecore/core-util.h>
83 #include <pulsecore/sioman.h>
84 #include <pulsecore/cli-text.h>
85 #include <pulsecore/pid.h>
86 #include <pulsecore/random.h>
87 #include <pulsecore/macro.h>
88 #include <pulsecore/shm.h>
89 #include <pulsecore/memtrap.h>
90 #include <pulsecore/strlist.h>
92 #include <pulsecore/dbus-shared.h>
94 #include <pulsecore/cpu-arm.h>
95 #include <pulsecore/cpu-x86.h>
96 #include <pulsecore/cpu-orc.h>
100 #include "daemon-conf.h"
101 #include "dumpmodules.h"
103 #include "ltdl-bind-now.h"
104 #include "server-lookup.h"
106 #define PA_READY "/tmp/.pa_ready"
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->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 (!pa_streq(pw->pw_dir, PA_SYSTEM_RUNTIME_PATH))
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, true) < 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, true) < 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));
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 changed user to \"" PA_SYSTEM_USER "\"."));
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.", 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 bool valid_pid_file = false;
409 bool 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 bool 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. */
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 if (conf->log_target)
506 pa_log_set_target(conf->log_target);
508 pa_log_target target = { .type = PA_LOG_STDERR, .file = NULL };
509 pa_log_set_target(&target);
512 pa_log_set_level(conf->log_level);
514 pa_log_set_flags(PA_LOG_PRINT_META, PA_LOG_SET);
516 pa_log_set_flags(PA_LOG_PRINT_TIME, PA_LOG_SET);
517 pa_log_set_show_backtrace(conf->log_backtrace);
520 /* conf->system_instance and conf->local_server_type control almost the
521 * same thing; make them agree about what is requested. */
522 switch (conf->local_server_type) {
523 case PA_SERVER_TYPE_UNSET:
524 conf->local_server_type = conf->system_instance ? PA_SERVER_TYPE_SYSTEM : PA_SERVER_TYPE_USER;
526 case PA_SERVER_TYPE_USER:
527 case PA_SERVER_TYPE_NONE:
528 conf->system_instance = false;
530 case PA_SERVER_TYPE_SYSTEM:
531 conf->system_instance = true;
534 pa_assert_not_reached();
537 start_server = conf->local_server_type == PA_SERVER_TYPE_USER || (getuid() == 0 && conf->local_server_type == PA_SERVER_TYPE_SYSTEM);
539 if (!start_server && conf->local_server_type == PA_SERVER_TYPE_SYSTEM) {
540 pa_log_notice(_("System mode refused for non-root user. Only starting the D-Bus server lookup service."));
541 conf->system_instance = false;
545 LTDL_SET_PRELOADED_SYMBOLS();
549 if (conf->dl_search_path)
550 lt_dlsetsearchpath(conf->dl_search_path);
555 WSAStartup(MAKEWORD(2, 0), &data);
562 case PA_CMD_DUMP_MODULES:
563 pa_dump_modules(conf, argc-d, argv+d);
567 case PA_CMD_DUMP_CONF: {
570 pa_log("Too many arguments.\n");
574 s = pa_daemon_conf_dump(conf);
581 case PA_CMD_DUMP_RESAMPLE_METHODS: {
585 pa_log("Too many arguments.\n");
589 for (i = 0; i < PA_RESAMPLER_MAX; i++)
590 if (pa_resample_method_supported(i))
591 printf("%s\n", pa_resample_method_to_string(i));
598 pa_cmdline_help(argv[0]);
602 case PA_CMD_VERSION :
605 pa_log("Too many arguments.\n");
609 printf(PACKAGE_NAME" "PACKAGE_VERSION"\n");
617 pa_log("Too many arguments.\n");
621 if (pa_pid_file_check_running(&pid, "pulseaudio") < 0)
622 pa_log_info(_("Daemon not running"));
624 pa_log_info(_("Daemon running as PID %u"), pid);
634 pa_log("Too many arguments.\n");
638 if (pa_pid_file_kill(SIGINT, NULL, "pulseaudio") < 0)
639 pa_log(_("Failed to kill daemon: %s"), pa_cstrerror(errno));
645 case PA_CMD_CLEANUP_SHM:
648 pa_log("Too many arguments.\n");
652 if (pa_shm_cleanup() >= 0)
658 pa_assert(conf->cmd == PA_CMD_DAEMON || conf->cmd == PA_CMD_START);
662 pa_log("Too many arguments.\n");
667 if (getuid() == 0 && !conf->system_instance)
668 pa_log_warn(_("This program is not intended to be run as root (unless --system is specified)."));
669 #ifndef HAVE_DBUS /* A similar, only a notice worthy check was done earlier, if D-Bus is enabled. */
670 else if (getuid() != 0 && conf->system_instance) {
671 pa_log(_("Root privileges required."));
675 #endif /* HAVE_GETUID */
677 if (conf->cmd == PA_CMD_START && conf->system_instance) {
678 pa_log(_("--start not supported for system instances."));
682 if (conf->cmd == PA_CMD_START && (configured_address = check_configured_address())) {
683 /* There is an server address in our config, but where did it come from?
684 * By default a standard X11 login will load module-x11-publish which will
685 * inject PULSE_SERVER X11 property. If the PA daemon crashes, we will end
686 * up hitting this code path. So we have to check to see if our configured_address
687 * is the same as the value that would go into this property so that we can
688 * recover (i.e. autospawn) from a crash.
691 bool start_anyway = false;
693 if ((ufn = pa_runtime_path(PA_NATIVE_DEFAULT_UNIX_SOCKET))) {
696 if ((id = pa_machine_id())) {
697 pa_strlist *server_list;
698 char formatted_ufn[256];
700 pa_snprintf(formatted_ufn, sizeof(formatted_ufn), "{%s}unix:%s", id, ufn);
703 if ((server_list = pa_strlist_parse(configured_address))) {
706 /* We only need to check the first server */
707 server_list = pa_strlist_pop(server_list, &u);
708 pa_strlist_free(server_list);
710 start_anyway = (u && pa_streq(formatted_ufn, u));
718 pa_log_notice(_("User-configured server at %s, refusing to start/autospawn."), configured_address);
719 pa_xfree(configured_address);
724 pa_log_notice(_("User-configured server at %s, which appears to be local. Probing deeper."), configured_address);
725 pa_xfree(configured_address);
728 if (conf->system_instance && !conf->disallow_exit)
729 pa_log_warn(_("Running in system mode, but --disallow-exit not set!"));
731 if (conf->system_instance && !conf->disallow_module_loading)
732 pa_log_warn(_("Running in system mode, but --disallow-module-loading not set!"));
734 if (conf->system_instance && !conf->disable_shm) {
735 pa_log_notice(_("Running in system mode, forcibly disabling SHM mode!"));
736 conf->disable_shm = true;
739 if (conf->system_instance && conf->exit_idle_time >= 0) {
740 pa_log_notice(_("Running in system mode, forcibly disabling exit idle time!"));
741 conf->exit_idle_time = -1;
744 if (conf->cmd == PA_CMD_START) {
745 /* If we shall start PA only when it is not running yet, we
746 * first take the autospawn lock to make things
749 if ((autospawn_fd = pa_autospawn_lock_init()) < 0) {
750 pa_log("Failed to initialize autospawn lock");
754 if ((pa_autospawn_lock_acquire(true) < 0)) {
755 pa_log("Failed to acquire autospawn lock");
759 autospawn_locked = true;
762 if (conf->daemonize) {
767 if (pa_stdio_acquire() < 0) {
768 pa_log(_("Failed to acquire stdio."));
773 if (pipe(daemon_pipe) < 0) {
774 pa_log(_("pipe() failed: %s"), pa_cstrerror(errno));
778 if ((child = fork()) < 0) {
779 pa_log(_("fork() failed: %s"), pa_cstrerror(errno));
780 pa_close_pipe(daemon_pipe);
788 pa_assert_se(pa_close(daemon_pipe[1]) == 0);
791 if ((n = pa_loop_read(daemon_pipe[0], &retval, sizeof(retval), NULL)) != sizeof(retval)) {
794 pa_log(_("read() failed: %s"), pa_cstrerror(errno));
800 pa_log(_("Daemon startup failed."));
802 pa_log_info(_("Daemon startup successful."));
807 if (autospawn_fd >= 0) {
808 /* The lock file is unlocked from the parent, so we need
809 * to close it in the child */
811 pa_autospawn_lock_release();
812 pa_autospawn_lock_done(true);
814 autospawn_locked = false;
818 pa_assert_se(pa_close(daemon_pipe[0]) == 0);
822 if (!conf->log_target) {
823 pa_log_target target = { .type = PA_LOG_SYSLOG, .file = NULL };
824 pa_log_set_target(&target);
829 pa_log(_("setsid() failed: %s"), pa_cstrerror(errno));
835 /* We now are a session and process group leader. Let's fork
836 * again and let the father die, so that we'll become a
837 * process that can never acquire a TTY again, in a session and
838 * process group without leader */
840 if (pipe(daemon_pipe2) < 0) {
841 pa_log(_("pipe() failed: %s"), pa_cstrerror(errno));
845 if ((child = fork()) < 0) {
846 pa_log(_("fork() failed: %s"), pa_cstrerror(errno));
847 pa_close_pipe(daemon_pipe2);
855 pa_assert_se(pa_close(daemon_pipe2[1]) == 0);
856 daemon_pipe2[1] = -1;
858 if ((n = pa_loop_read(daemon_pipe2[0], &retval, sizeof(retval), NULL)) != sizeof(retval)) {
861 pa_log(_("read() failed: %s"), pa_cstrerror(errno));
866 /* We now have to take care of signalling the first fork with
867 * the return value we've received from this fork... */
868 pa_assert(daemon_pipe[1] >= 0);
870 pa_loop_write(daemon_pipe[1], &retval, sizeof(retval), NULL);
871 pa_close(daemon_pipe[1]);
877 pa_assert_se(pa_close(daemon_pipe2[0]) == 0);
878 daemon_pipe2[0] = -1;
880 /* We no longer need the (first) daemon_pipe as it's handled in our child above */
881 pa_close_pipe(daemon_pipe);
885 signal(SIGTTOU, SIG_IGN);
888 signal(SIGTTIN, SIG_IGN);
891 signal(SIGTSTP, SIG_IGN);
897 pa_set_env_and_record("PULSE_INTERNAL", "1");
898 pa_assert_se(chdir("/") == 0);
901 #ifdef HAVE_SYS_RESOURCE_H
902 set_all_rlimits(conf);
904 pa_rtclock_hrtimer_enable();
906 pa_raise_priority(conf->nice_level);
908 if (conf->system_instance)
909 if (change_user() < 0)
912 pa_set_env_and_record("PULSE_SYSTEM", conf->system_instance ? "1" : "0");
914 pa_log_info(_("This is PulseAudio %s"), PACKAGE_VERSION);
915 pa_log_debug(_("Compilation host: %s"), CANONICAL_HOST);
916 pa_log_debug(_("Compilation CFLAGS: %s"), PA_CFLAGS);
918 s = pa_uname_string();
919 pa_log_debug(_("Running on host: %s"), s);
922 pa_log_debug(_("Found %u CPUs."), pa_ncpus());
924 pa_log_info(_("Page size is %lu bytes"), (unsigned long) PA_PAGE_SIZE);
926 #ifdef HAVE_VALGRIND_MEMCHECK_H
927 pa_log_debug(_("Compiled with Valgrind support: yes"));
929 pa_log_debug(_("Compiled with Valgrind support: no"));
932 pa_log_debug(_("Running in valgrind mode: %s"), pa_yes_no(pa_in_valgrind()));
934 pa_log_debug(_("Running in VM: %s"), pa_yes_no(pa_running_in_vm()));
937 pa_log_debug(_("Optimized build: yes"));
939 pa_log_debug(_("Optimized build: no"));
943 pa_log_debug(_("NDEBUG defined, all asserts disabled."));
944 #elif defined(FASTPATH)
945 pa_log_debug(_("FASTPATH defined, only fast path asserts disabled."));
947 pa_log_debug(_("All asserts enabled."));
950 if (!(s = pa_machine_id())) {
951 pa_log(_("Failed to get machine ID"));
954 pa_log_info(_("Machine ID is %s."), s);
957 if ((s = pa_session_id())) {
958 pa_log_info(_("Session ID is %s."), s);
962 if (!(s = pa_get_runtime_dir()))
964 pa_log_info(_("Using runtime directory %s."), s);
967 if (!(s = pa_get_state_dir()))
969 pa_log_info(_("Using state directory %s."), s);
972 pa_log_info(_("Using modules directory %s."), conf->dl_search_path);
974 pa_log_info(_("Running in system mode: %s"), pa_yes_no(pa_in_system_mode()));
976 if (pa_in_system_mode())
977 pa_log_warn(_("OK, so you are running PA in system mode. Please note that you most likely shouldn't be doing that.\n"
978 "If you do it nonetheless then it's your own fault if things don't work as expected.\n"
979 "Please read http://pulseaudio.org/wiki/WhatIsWrongWithSystemMode for an explanation why system mode is usually a bad idea."));
981 if (conf->use_pid_file) {
984 if ((z = pa_pid_file_create("pulseaudio")) != 0) {
986 if (conf->cmd == PA_CMD_START && z > 0) {
987 /* If we are already running and with are run in
988 * --start mode, then let's return this as success. */
994 pa_log(_("pa_pid_file_create() failed."));
998 valid_pid_file = true;
1001 pa_disable_sigpipe();
1003 if (pa_rtclock_hrtimer())
1004 pa_log_info(_("Fresh high-resolution timers available! Bon appetit!"));
1006 pa_log_info(_("Dude, your kernel stinks! The chef's recommendation today is Linux with high-resolution timers enabled!"));
1008 if (conf->lock_memory) {
1009 #if defined(HAVE_SYS_MMAN_H) && !defined(__ANDROID__)
1010 if (mlockall(MCL_FUTURE) < 0)
1011 pa_log_warn("mlockall() failed: %s", pa_cstrerror(errno));
1013 pa_log_info("Successfully locked process into memory.");
1015 pa_log_warn("Memory locking requested but not supported on platform.");
1019 pa_memtrap_install();
1021 pa_assert_se(mainloop = pa_mainloop_new());
1023 if (!(c = pa_core_new(pa_mainloop_get_api(mainloop), !conf->disable_shm, conf->shm_size))) {
1024 pa_log(_("pa_core_new() failed."));
1028 c->default_sample_spec = conf->default_sample_spec;
1029 c->alternate_sample_rate = conf->alternate_sample_rate;
1030 c->default_channel_map = conf->default_channel_map;
1031 c->default_n_fragments = conf->default_n_fragments;
1032 c->default_fragment_size_msec = conf->default_fragment_size_msec;
1033 c->deferred_volume_safety_margin_usec = conf->deferred_volume_safety_margin_usec;
1034 c->deferred_volume_extra_delay_usec = conf->deferred_volume_extra_delay_usec;
1035 c->exit_idle_time = conf->exit_idle_time;
1036 c->scache_idle_time = conf->scache_idle_time;
1037 c->resample_method = conf->resample_method;
1038 c->realtime_priority = conf->realtime_priority;
1039 c->realtime_scheduling = !!conf->realtime_scheduling;
1040 c->disable_remixing = !!conf->disable_remixing;
1041 c->disable_lfe_remixing = !!conf->disable_lfe_remixing;
1042 c->deferred_volume = !!conf->deferred_volume;
1043 c->running_as_daemon = !!conf->daemonize;
1044 c->disallow_exit = conf->disallow_exit;
1045 c->flat_volumes = conf->flat_volumes;
1047 c->server_type = conf->local_server_type;
1050 c->cpu_info.cpu_type = PA_CPU_UNDEFINED;
1051 if (!getenv("PULSE_NO_SIMD")) {
1052 if (pa_cpu_init_x86(&(c->cpu_info.flags.x86)))
1053 c->cpu_info.cpu_type = PA_CPU_X86;
1054 if (pa_cpu_init_arm(&(c->cpu_info.flags.arm)))
1055 c->cpu_info.cpu_type = PA_CPU_ARM;
1056 pa_cpu_init_orc(c->cpu_info);
1059 pa_assert_se(pa_signal_init(pa_mainloop_get_api(mainloop)) == 0);
1060 pa_signal_new(SIGINT, signal_callback, c);
1061 pa_signal_new(SIGTERM, signal_callback, c);
1063 pa_signal_new(SIGUSR1, signal_callback, c);
1066 pa_signal_new(SIGUSR2, signal_callback, c);
1069 pa_signal_new(SIGHUP, signal_callback, c);
1073 win32_timer = pa_mainloop_get_api(mainloop)->time_new(pa_mainloop_get_api(mainloop), pa_gettimeofday(&win32_tv), message_cb, NULL);
1076 if (!conf->no_cpu_limit)
1077 pa_assert_se(pa_cpu_limit_init(pa_mainloop_get_api(mainloop)) == 0);
1079 buf = pa_strbuf_new();
1082 pa_assert_se(dbus_threads_init_default());
1086 if (conf->load_default_script_file) {
1089 if ((f = pa_daemon_conf_open_default_script_file(conf))) {
1090 r = pa_cli_command_execute_file_stream(c, f, buf, &conf->fail);
1096 r = pa_cli_command_execute(c, conf->script_commands, buf, &conf->fail);
1098 pa_log_error("%s", s = pa_strbuf_tostring_free(buf));
1101 if (r < 0 && conf->fail) {
1102 pa_log(_("Failed to initialize daemon."));
1106 if (!c->modules || pa_idxset_size(c->modules) == 0) {
1107 pa_log(_("Daemon startup without any loaded modules, refusing to work."));
1112 /* When we just provide the D-Bus server lookup service, we don't want
1113 * any modules to be loaded. We haven't loaded any so far, so one might
1114 * think there's no way to contact the server, but receiving certain
1115 * signals could still cause modules to load. */
1116 conf->disallow_module_loading = true;
1120 /* We completed the initial module loading, so let's disable it
1121 * from now on, if requested */
1122 c->disallow_module_loading = !!conf->disallow_module_loading;
1125 if (!conf->system_instance) {
1126 if ((server_lookup = pa_dbusobj_server_lookup_new(c))) {
1127 if (!(lookup_service_bus = register_dbus_name(c, DBUS_BUS_SESSION, "org.PulseAudio1")))
1133 server_bus = register_dbus_name(c, conf->system_instance ? DBUS_BUS_SYSTEM : DBUS_BUS_SESSION, "org.pulseaudio.Server");
1137 if (daemon_pipe2[1] >= 0) {
1139 pa_loop_write(daemon_pipe2[1], &ok, sizeof(ok), NULL);
1140 pa_close(daemon_pipe2[1]);
1141 daemon_pipe2[1] = -1;
1145 pa_log_info(_("Daemon startup complete."));
1146 /* broadcast if we're ready */
1147 creat(PA_READY, 0644);
1150 if (pa_mainloop_run(mainloop, &retval) < 0)
1153 pa_log_info(_("Daemon shutdown initiated."));
1158 pa_dbus_connection_unref(server_bus);
1159 if (lookup_service_bus)
1160 pa_dbus_connection_unref(lookup_service_bus);
1162 pa_dbusobj_server_lookup_free(server_lookup);
1165 if (autospawn_fd >= 0) {
1166 if (autospawn_locked)
1167 pa_autospawn_lock_release();
1169 pa_autospawn_lock_done(false);
1173 if (mainloop && win32_timer)
1174 pa_mainloop_get_api(mainloop)->time_free(win32_timer);
1178 /* Ensure all the modules/samples are unloaded when the core is still ref'ed,
1179 * as unlink callback hooks in modules may need the core to be ref'ed */
1180 pa_module_unload_all(c);
1181 pa_scache_free_all(c);
1184 pa_log_info(_("Daemon terminated."));
1187 if (!conf->no_cpu_limit)
1188 pa_cpu_limit_done();
1193 /* If we have daemon_pipe[1] still open, this means we've failed after
1194 * the first fork, but before the second. Therefore just write to it. */
1195 if (daemon_pipe[1] >= 0)
1196 pa_loop_write(daemon_pipe[1], &retval, sizeof(retval), NULL);
1197 else if (daemon_pipe2[1] >= 0)
1198 pa_loop_write(daemon_pipe2[1], &retval, sizeof(retval), NULL);
1200 pa_close_pipe(daemon_pipe2);
1201 pa_close_pipe(daemon_pipe);
1205 pa_mainloop_free(mainloop);
1208 pa_daemon_conf_free(conf);
1211 pa_pid_file_remove();
1213 /* This has no real purpose except making things valgrind-clean */
1214 pa_unset_env_recorded();