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>
41 #ifdef HAVE_SYS_MMAN_H
58 #include <dbus/dbus.h>
61 #ifdef HAVE_SYSTEMD_DAEMON
62 #include <systemd/sd-daemon.h>
65 #include <pulse/client-conf.h>
66 #include <pulse/mainloop.h>
67 #include <pulse/mainloop-signal.h>
68 #include <pulse/timeval.h>
69 #include <pulse/xmalloc.h>
71 #include <pulsecore/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-scache.h>
77 #include <pulsecore/core.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/random.h>
86 #include <pulsecore/macro.h>
87 #include <pulsecore/shm.h>
88 #include <pulsecore/memtrap.h>
89 #include <pulsecore/strlist.h>
91 #include <pulsecore/dbus-shared.h>
93 #include <pulsecore/cpu.h>
97 #include "daemon-conf.h"
98 #include "dumpmodules.h"
100 #include "ltdl-bind-now.h"
101 #include "server-lookup.h"
104 /* Only one instance of these variables */
105 int allow_severity = LOG_INFO;
106 int deny_severity = LOG_WARNING;
109 #ifdef HAVE_OSS_WRAPPER
110 /* padsp looks for this symbol in the running process and disables
111 * itself if it finds it and it is set to 7 (which is actually a bit
112 * mask). For details see padsp. */
113 int __padsp_disabled__ = 7;
116 static void signal_callback(pa_mainloop_api*m, pa_signal_event *e, int sig, void *userdata) {
117 pa_log_info("Got signal %s.", pa_sig2str(sig));
122 pa_module_load(userdata, "module-cli", NULL);
128 pa_module_load(userdata, "module-cli-protocol-unix", NULL);
134 char *c = pa_full_status_string(userdata);
135 pa_log_notice("%s", c);
144 pa_log_info("Exiting.");
150 #if defined(HAVE_PWD_H) && defined(HAVE_GRP_H)
152 static int change_user(void) {
157 /* This function is called only in system-wide mode. It creates a
158 * runtime dir in /var/run/ with proper UID/GID and drops privs
161 if (!(pw = getpwnam(PA_SYSTEM_USER))) {
162 pa_log(_("Failed to find user '%s'."), PA_SYSTEM_USER);
166 if (!(gr = getgrnam(PA_SYSTEM_GROUP))) {
167 pa_log(_("Failed to find group '%s'."), PA_SYSTEM_GROUP);
171 pa_log_info("Found user '%s' (UID %lu) and group '%s' (GID %lu).",
172 PA_SYSTEM_USER, (unsigned long) pw->pw_uid,
173 PA_SYSTEM_GROUP, (unsigned long) gr->gr_gid);
175 if (pw->pw_gid != gr->gr_gid) {
176 pa_log(_("GID of user '%s' and of group '%s' don't match."), PA_SYSTEM_USER, PA_SYSTEM_GROUP);
180 if (!pa_streq(pw->pw_dir, PA_SYSTEM_RUNTIME_PATH))
181 pa_log_warn(_("Home directory of user '%s' is not '%s', ignoring."), PA_SYSTEM_USER, PA_SYSTEM_RUNTIME_PATH);
183 if (pa_make_secure_dir(PA_SYSTEM_RUNTIME_PATH, 0755, pw->pw_uid, gr->gr_gid, true) < 0) {
184 pa_log(_("Failed to create '%s': %s"), PA_SYSTEM_RUNTIME_PATH, pa_cstrerror(errno));
188 if (pa_make_secure_dir(PA_SYSTEM_STATE_PATH, 0700, pw->pw_uid, gr->gr_gid, true) < 0) {
189 pa_log(_("Failed to create '%s': %s"), PA_SYSTEM_STATE_PATH, pa_cstrerror(errno));
193 /* We don't create the config dir here, because we don't need to write to it */
195 if (initgroups(PA_SYSTEM_USER, gr->gr_gid) != 0) {
196 pa_log(_("Failed to change group list: %s"), pa_cstrerror(errno));
200 #if defined(HAVE_SETRESGID)
201 r = setresgid(gr->gr_gid, gr->gr_gid, gr->gr_gid);
202 #elif defined(HAVE_SETEGID)
203 if ((r = setgid(gr->gr_gid)) >= 0)
204 r = setegid(gr->gr_gid);
205 #elif defined(HAVE_SETREGID)
206 r = setregid(gr->gr_gid, gr->gr_gid);
208 #error "No API to drop privileges"
212 pa_log(_("Failed to change GID: %s"), pa_cstrerror(errno));
216 #if defined(HAVE_SETRESUID)
217 r = setresuid(pw->pw_uid, pw->pw_uid, pw->pw_uid);
218 #elif defined(HAVE_SETEUID)
219 if ((r = setuid(pw->pw_uid)) >= 0)
220 r = seteuid(pw->pw_uid);
221 #elif defined(HAVE_SETREUID)
222 r = setreuid(pw->pw_uid, pw->pw_uid);
224 #error "No API to drop privileges"
228 pa_log(_("Failed to change UID: %s"), pa_cstrerror(errno));
234 pa_set_env("USER", PA_SYSTEM_USER);
235 pa_set_env("USERNAME", PA_SYSTEM_USER);
236 pa_set_env("LOGNAME", PA_SYSTEM_USER);
237 pa_set_env("HOME", PA_SYSTEM_RUNTIME_PATH);
239 /* Relevant for pa_runtime_path() */
240 if (!getenv("PULSE_RUNTIME_PATH"))
241 pa_set_env("PULSE_RUNTIME_PATH", PA_SYSTEM_RUNTIME_PATH);
243 if (!getenv("PULSE_CONFIG_PATH"))
244 pa_set_env("PULSE_CONFIG_PATH", PA_SYSTEM_CONFIG_PATH);
246 if (!getenv("PULSE_STATE_PATH"))
247 pa_set_env("PULSE_STATE_PATH", PA_SYSTEM_STATE_PATH);
249 pa_log_info("Successfully changed user to \"" PA_SYSTEM_USER "\".");
254 #else /* HAVE_PWD_H && HAVE_GRP_H */
256 static int change_user(void) {
257 pa_log(_("System wide mode unsupported on this platform."));
261 #endif /* HAVE_PWD_H && HAVE_GRP_H */
263 #ifdef HAVE_SYS_RESOURCE_H
265 static int set_one_rlimit(const pa_rlimit *r, int resource, const char *name) {
272 rl.rlim_cur = rl.rlim_max = r->value;
274 if (setrlimit(resource, &rl) < 0) {
275 pa_log_info("setrlimit(%s, (%u, %u)) failed: %s", name, (unsigned) r->value, (unsigned) r->value, pa_cstrerror(errno));
282 static void set_all_rlimits(const pa_daemon_conf *conf) {
283 set_one_rlimit(&conf->rlimit_fsize, RLIMIT_FSIZE, "RLIMIT_FSIZE");
284 set_one_rlimit(&conf->rlimit_data, RLIMIT_DATA, "RLIMIT_DATA");
285 set_one_rlimit(&conf->rlimit_stack, RLIMIT_STACK, "RLIMIT_STACK");
286 set_one_rlimit(&conf->rlimit_core, RLIMIT_CORE, "RLIMIT_CORE");
288 set_one_rlimit(&conf->rlimit_rss, RLIMIT_RSS, "RLIMIT_RSS");
291 set_one_rlimit(&conf->rlimit_nproc, RLIMIT_NPROC, "RLIMIT_NPROC");
294 set_one_rlimit(&conf->rlimit_nofile, RLIMIT_NOFILE, "RLIMIT_NOFILE");
296 #ifdef RLIMIT_MEMLOCK
297 set_one_rlimit(&conf->rlimit_memlock, RLIMIT_MEMLOCK, "RLIMIT_MEMLOCK");
300 set_one_rlimit(&conf->rlimit_as, RLIMIT_AS, "RLIMIT_AS");
303 set_one_rlimit(&conf->rlimit_locks, RLIMIT_LOCKS, "RLIMIT_LOCKS");
305 #ifdef RLIMIT_SIGPENDING
306 set_one_rlimit(&conf->rlimit_sigpending, RLIMIT_SIGPENDING, "RLIMIT_SIGPENDING");
308 #ifdef RLIMIT_MSGQUEUE
309 set_one_rlimit(&conf->rlimit_msgqueue, RLIMIT_MSGQUEUE, "RLIMIT_MSGQUEUE");
312 set_one_rlimit(&conf->rlimit_nice, RLIMIT_NICE, "RLIMIT_NICE");
315 set_one_rlimit(&conf->rlimit_rtprio, RLIMIT_RTPRIO, "RLIMIT_RTPRIO");
318 set_one_rlimit(&conf->rlimit_rttime, RLIMIT_RTTIME, "RLIMIT_RTTIME");
323 static char *check_configured_address(void) {
324 char *default_server = NULL;
325 pa_client_conf *c = pa_client_conf_new();
327 pa_client_conf_load(c, true, true);
329 if (c->default_server && *c->default_server)
330 default_server = pa_xstrdup(c->default_server);
332 pa_client_conf_free(c);
334 return default_server;
338 static pa_dbus_connection *register_dbus_name(pa_core *c, DBusBusType bus, const char* name) {
340 pa_dbus_connection *conn;
342 dbus_error_init(&error);
344 if (!(conn = pa_dbus_bus_get(c, bus, &error)) || dbus_error_is_set(&error)) {
345 pa_log_warn("Unable to contact D-Bus: %s: %s", error.name, error.message);
349 if (dbus_bus_request_name(pa_dbus_connection_get(conn), name, DBUS_NAME_FLAG_DO_NOT_QUEUE, &error) == DBUS_REQUEST_NAME_REPLY_PRIMARY_OWNER) {
350 pa_log_debug("Got %s!", name);
354 if (dbus_error_is_set(&error))
355 pa_log_error("Failed to acquire %s: %s: %s", name, error.name, error.message);
357 pa_log_error("D-Bus name %s already taken.", name);
359 /* PA cannot be started twice by the same user and hence we can
360 * ignore mostly the case that a name is already taken. */
364 pa_dbus_connection_unref(conn);
366 dbus_error_free(&error);
371 int main(int argc, char *argv[]) {
373 pa_strbuf *buf = NULL;
374 pa_daemon_conf *conf = NULL;
375 pa_mainloop *mainloop = NULL;
377 char *configured_address;
378 int r = 0, retval = 1, d = 0;
379 bool valid_pid_file = false;
380 bool ltdl_init = false;
381 int n_fds = 0, *passed_fds = NULL;
384 int daemon_pipe[2] = { -1, -1 };
385 int daemon_pipe2[2] = { -1, -1 };
387 int autospawn_fd = -1;
388 bool autospawn_locked = false;
390 pa_dbusobj_server_lookup *server_lookup = NULL; /* /org/pulseaudio/server_lookup */
391 pa_dbus_connection *lookup_service_bus = NULL; /* Always the user bus. */
392 pa_dbus_connection *server_bus = NULL; /* The bus where we reserve org.pulseaudio.Server, either the user or the system bus. */
396 pa_log_set_ident("pulseaudio");
397 pa_log_set_level(PA_LOG_NOTICE);
398 pa_log_set_flags(PA_LOG_COLORS|PA_LOG_PRINT_FILE|PA_LOG_PRINT_LEVEL, PA_LOG_RESET);
400 #if defined(__linux__) && defined(__OPTIMIZE__)
402 Disable lazy relocations to make usage of external libraries
403 more deterministic for our RT threads. We abuse __OPTIMIZE__ as
404 a check whether we are a debug build or not. This all is
405 admittedly a bit snake-oilish.
408 if (!getenv("LD_BIND_NOW")) {
412 /* We have to execute ourselves, because the libc caches the
413 * value of $LD_BIND_NOW on initialization. */
415 pa_set_env("LD_BIND_NOW", "1");
417 if ((canonical_rp = pa_realpath(PA_BINARY))) {
419 if ((rp = pa_readlink("/proc/self/exe"))) {
421 if (pa_streq(rp, canonical_rp))
422 pa_assert_se(execv(rp, argv) == 0);
424 pa_log_warn("/proc/self/exe does not point to %s, cannot self execute. Are you playing games?", canonical_rp);
429 pa_log_warn("Couldn't read /proc/self/exe, cannot self execute. Running in a chroot()?");
431 pa_xfree(canonical_rp);
434 pa_log_warn("Couldn't canonicalize binary path, cannot self execute.");
438 #ifdef HAVE_SYSTEMD_DAEMON
439 n_fds = sd_listen_fds(0);
443 passed_fds = pa_xnew(int, n_fds+2);
444 passed_fds[n_fds] = passed_fds[n_fds+1] = -1;
446 passed_fds[i] = SD_LISTEN_FDS_START + i;
452 passed_fds = pa_xnew(int, 2);
453 passed_fds[0] = passed_fds[1] = -1;
456 if ((e = getenv("PULSE_PASSED_FD"))) {
457 int passed_fd = atoi(e);
459 passed_fds[n_fds] = passed_fd;
462 /* We might be autospawned, in which case have no idea in which
463 * context we have been started. Let's cleanup our execution
464 * context as good as possible */
466 pa_reset_personality();
468 pa_close_allv(passed_fds);
469 pa_xfree(passed_fds);
474 setlocale(LC_ALL, "");
477 conf = pa_daemon_conf_new();
479 if (pa_daemon_conf_load(conf, NULL) < 0)
482 if (pa_daemon_conf_env(conf) < 0)
485 if (pa_cmdline_parse(conf, argc, argv, &d) < 0) {
486 pa_log(_("Failed to parse command line."));
490 if (conf->log_target)
491 pa_log_set_target(conf->log_target);
493 pa_log_target target = { .type = PA_LOG_STDERR, .file = NULL };
494 pa_log_set_target(&target);
497 pa_log_set_level(conf->log_level);
499 pa_log_set_flags(PA_LOG_PRINT_META, PA_LOG_SET);
501 pa_log_set_flags(PA_LOG_PRINT_TIME, PA_LOG_SET);
502 pa_log_set_show_backtrace(conf->log_backtrace);
505 /* conf->system_instance and conf->local_server_type control almost the
506 * same thing; make them agree about what is requested. */
507 switch (conf->local_server_type) {
508 case PA_SERVER_TYPE_UNSET:
509 conf->local_server_type = conf->system_instance ? PA_SERVER_TYPE_SYSTEM : PA_SERVER_TYPE_USER;
511 case PA_SERVER_TYPE_USER:
512 case PA_SERVER_TYPE_NONE:
513 conf->system_instance = false;
515 case PA_SERVER_TYPE_SYSTEM:
516 conf->system_instance = true;
519 pa_assert_not_reached();
522 start_server = conf->local_server_type == PA_SERVER_TYPE_USER || (getuid() == 0 && conf->local_server_type == PA_SERVER_TYPE_SYSTEM);
524 if (!start_server && conf->local_server_type == PA_SERVER_TYPE_SYSTEM) {
525 pa_log_notice(_("System mode refused for non-root user. Only starting the D-Bus server lookup service."));
526 conf->system_instance = false;
530 LTDL_SET_PRELOADED_SYMBOLS();
534 if (conf->dl_search_path)
535 lt_dlsetsearchpath(conf->dl_search_path);
540 WSAStartup(MAKEWORD(2, 0), &data);
547 case PA_CMD_DUMP_MODULES:
548 pa_dump_modules(conf, argc-d, argv+d);
552 case PA_CMD_DUMP_CONF: {
555 pa_log("Too many arguments.\n");
559 s = pa_daemon_conf_dump(conf);
566 case PA_CMD_DUMP_RESAMPLE_METHODS: {
570 pa_log("Too many arguments.\n");
574 for (i = 0; i < PA_RESAMPLER_MAX; i++)
575 if (pa_resample_method_supported(i))
576 printf("%s\n", pa_resample_method_to_string(i));
583 pa_cmdline_help(argv[0]);
587 case PA_CMD_VERSION :
590 pa_log("Too many arguments.\n");
594 printf(PACKAGE_NAME" "PACKAGE_VERSION"\n");
602 pa_log("Too many arguments.\n");
606 if (pa_pid_file_check_running(&pid, "pulseaudio") < 0)
607 pa_log_info("Daemon not running");
609 pa_log_info("Daemon running as PID %u", pid);
619 pa_log("Too many arguments.\n");
623 if (pa_pid_file_kill(SIGINT, NULL, "pulseaudio") < 0)
624 pa_log(_("Failed to kill daemon: %s"), pa_cstrerror(errno));
630 case PA_CMD_CLEANUP_SHM:
633 pa_log("Too many arguments.\n");
637 if (pa_shm_cleanup() >= 0)
643 pa_assert(conf->cmd == PA_CMD_DAEMON || conf->cmd == PA_CMD_START);
647 pa_log("Too many arguments.\n");
652 if (getuid() == 0 && !conf->system_instance)
653 pa_log_warn(_("This program is not intended to be run as root (unless --system is specified)."));
654 #ifndef HAVE_DBUS /* A similar, only a notice worthy check was done earlier, if D-Bus is enabled. */
655 else if (getuid() != 0 && conf->system_instance) {
656 pa_log(_("Root privileges required."));
660 #endif /* HAVE_GETUID */
662 if (conf->cmd == PA_CMD_START && conf->system_instance) {
663 pa_log(_("--start not supported for system instances."));
667 if (conf->cmd == PA_CMD_START && (configured_address = check_configured_address())) {
668 /* There is an server address in our config, but where did it come from?
669 * By default a standard X11 login will load module-x11-publish which will
670 * inject PULSE_SERVER X11 property. If the PA daemon crashes, we will end
671 * up hitting this code path. So we have to check to see if our configured_address
672 * is the same as the value that would go into this property so that we can
673 * recover (i.e. autospawn) from a crash.
676 bool start_anyway = false;
678 if ((ufn = pa_runtime_path(PA_NATIVE_DEFAULT_UNIX_SOCKET))) {
681 if ((id = pa_machine_id())) {
682 pa_strlist *server_list;
683 char formatted_ufn[256];
685 pa_snprintf(formatted_ufn, sizeof(formatted_ufn), "{%s}unix:%s", id, ufn);
688 if ((server_list = pa_strlist_parse(configured_address))) {
691 /* We only need to check the first server */
692 server_list = pa_strlist_pop(server_list, &u);
693 pa_strlist_free(server_list);
695 start_anyway = (u && pa_streq(formatted_ufn, u));
703 pa_log_notice(_("User-configured server at %s, refusing to start/autospawn."), configured_address);
704 pa_xfree(configured_address);
709 pa_log_notice(_("User-configured server at %s, which appears to be local. Probing deeper."), configured_address);
710 pa_xfree(configured_address);
713 if (conf->system_instance && !conf->disallow_exit)
714 pa_log_warn(_("Running in system mode, but --disallow-exit not set!"));
716 if (conf->system_instance && !conf->disallow_module_loading)
717 pa_log_warn(_("Running in system mode, but --disallow-module-loading not set!"));
719 if (conf->system_instance && !conf->disable_shm) {
720 pa_log_notice(_("Running in system mode, forcibly disabling SHM mode!"));
721 conf->disable_shm = true;
724 if (conf->system_instance && conf->exit_idle_time >= 0) {
725 pa_log_notice(_("Running in system mode, forcibly disabling exit idle time!"));
726 conf->exit_idle_time = -1;
729 if (conf->cmd == PA_CMD_START) {
730 /* If we shall start PA only when it is not running yet, we
731 * first take the autospawn lock to make things
734 /* This locking and thread synchronisation code doesn't work reliably
735 * on kFreeBSD (Debian bug #705435), or in upstream FreeBSD ports
736 * (bug reference: ports/128947, patched in SVN r231972). */
737 #if !defined(__FreeBSD__) && !defined(__FreeBSD_kernel__)
738 if ((autospawn_fd = pa_autospawn_lock_init()) < 0) {
739 pa_log("Failed to initialize autospawn lock");
743 if ((pa_autospawn_lock_acquire(true) < 0)) {
744 pa_log("Failed to acquire autospawn lock");
748 autospawn_locked = true;
752 if (conf->daemonize) {
757 if (pa_stdio_acquire() < 0) {
758 pa_log(_("Failed to acquire stdio."));
763 if (pipe(daemon_pipe) < 0) {
764 pa_log(_("pipe() failed: %s"), pa_cstrerror(errno));
768 if ((child = fork()) < 0) {
769 pa_log(_("fork() failed: %s"), pa_cstrerror(errno));
770 pa_close_pipe(daemon_pipe);
778 pa_assert_se(pa_close(daemon_pipe[1]) == 0);
781 if ((n = pa_loop_read(daemon_pipe[0], &retval, sizeof(retval), NULL)) != sizeof(retval)) {
784 pa_log(_("read() failed: %s"), pa_cstrerror(errno));
790 pa_log(_("Daemon startup failed."));
792 pa_log_info("Daemon startup successful.");
797 if (autospawn_fd >= 0) {
798 /* The lock file is unlocked from the parent, so we need
799 * to close it in the child */
801 pa_autospawn_lock_release();
802 pa_autospawn_lock_done(true);
804 autospawn_locked = false;
808 pa_assert_se(pa_close(daemon_pipe[0]) == 0);
812 if (!conf->log_target) {
813 #ifdef HAVE_SYSTEMD_JOURNAL
814 pa_log_target target = { .type = PA_LOG_JOURNAL, .file = NULL };
816 pa_log_target target = { .type = PA_LOG_SYSLOG, .file = NULL };
818 pa_log_set_target(&target);
823 pa_log(_("setsid() failed: %s"), pa_cstrerror(errno));
829 /* We now are a session and process group leader. Let's fork
830 * again and let the father die, so that we'll become a
831 * process that can never acquire a TTY again, in a session and
832 * process group without leader */
834 if (pipe(daemon_pipe2) < 0) {
835 pa_log(_("pipe() failed: %s"), pa_cstrerror(errno));
839 if ((child = fork()) < 0) {
840 pa_log(_("fork() failed: %s"), pa_cstrerror(errno));
841 pa_close_pipe(daemon_pipe2);
849 pa_assert_se(pa_close(daemon_pipe2[1]) == 0);
850 daemon_pipe2[1] = -1;
852 if ((n = pa_loop_read(daemon_pipe2[0], &retval, sizeof(retval), NULL)) != sizeof(retval)) {
855 pa_log(_("read() failed: %s"), pa_cstrerror(errno));
860 /* We now have to take care of signalling the first fork with
861 * the return value we've received from this fork... */
862 pa_assert(daemon_pipe[1] >= 0);
864 pa_loop_write(daemon_pipe[1], &retval, sizeof(retval), NULL);
865 pa_close(daemon_pipe[1]);
871 pa_assert_se(pa_close(daemon_pipe2[0]) == 0);
872 daemon_pipe2[0] = -1;
874 /* We no longer need the (first) daemon_pipe as it's handled in our child above */
875 pa_close_pipe(daemon_pipe);
879 signal(SIGTTOU, SIG_IGN);
882 signal(SIGTTIN, SIG_IGN);
885 signal(SIGTSTP, SIG_IGN);
891 pa_set_env_and_record("PULSE_INTERNAL", "1");
892 pa_assert_se(chdir("/") == 0);
895 #ifdef HAVE_SYS_RESOURCE_H
896 set_all_rlimits(conf);
898 pa_rtclock_hrtimer_enable();
900 if (conf->high_priority)
901 pa_raise_priority(conf->nice_level);
903 if (conf->system_instance)
904 if (change_user() < 0)
907 pa_set_env_and_record("PULSE_SYSTEM", conf->system_instance ? "1" : "0");
909 pa_log_info("This is PulseAudio %s", PACKAGE_VERSION);
910 pa_log_debug("Compilation host: %s", CANONICAL_HOST);
911 pa_log_debug("Compilation CFLAGS: %s", PA_CFLAGS);
913 #ifdef HAVE_LIBSAMPLERATE
914 pa_log_warn("Compiled with DEPRECATED libsamplerate support!");
917 s = pa_uname_string();
918 pa_log_debug("Running on host: %s", s);
921 pa_log_debug("Found %u CPUs.", pa_ncpus());
923 pa_log_info("Page size is %lu bytes", (unsigned long) PA_PAGE_SIZE);
925 #ifdef HAVE_VALGRIND_MEMCHECK_H
926 pa_log_debug("Compiled with Valgrind support: yes");
928 pa_log_debug("Compiled with Valgrind support: no");
931 pa_log_debug("Running in valgrind mode: %s", pa_yes_no(pa_in_valgrind()));
933 pa_log_debug("Running in VM: %s", pa_yes_no(pa_running_in_vm()));
936 pa_log_debug("Optimized build: yes");
938 pa_log_debug("Optimized build: no");
942 pa_log_debug("NDEBUG defined, all asserts disabled.");
943 #elif defined(FASTPATH)
944 pa_log_debug("FASTPATH defined, only fast path asserts disabled.");
946 pa_log_debug("All asserts enabled.");
949 if (!(s = pa_machine_id())) {
950 pa_log(_("Failed to get machine ID"));
953 pa_log_info("Machine ID is %s.", s);
956 if ((s = pa_session_id())) {
957 pa_log_info("Session ID is %s.", s);
961 if (!(s = pa_get_runtime_dir()))
963 pa_log_info("Using runtime directory %s.", s);
966 if (!(s = pa_get_state_dir()))
968 pa_log_info("Using state directory %s.", s);
971 pa_log_info("Using modules directory %s.", conf->dl_search_path);
973 pa_log_info("Running in system mode: %s", pa_yes_no(pa_in_system_mode()));
975 if (pa_in_system_mode())
976 pa_log_warn(_("OK, so you are running PA in system mode. Please note that you most likely shouldn't be doing that.\n"
977 "If you do it nonetheless then it's your own fault if things don't work as expected.\n"
978 "Please read http://pulseaudio.org/wiki/WhatIsWrongWithSystemMode for an explanation why system mode is usually a bad idea."));
980 if (conf->use_pid_file) {
983 if ((z = pa_pid_file_create("pulseaudio")) != 0) {
985 if (conf->cmd == PA_CMD_START && z > 0) {
986 /* If we are already running and with are run in
987 * --start mode, then let's return this as success. */
993 pa_log(_("pa_pid_file_create() failed."));
997 valid_pid_file = true;
1000 pa_disable_sigpipe();
1002 if (pa_rtclock_hrtimer())
1003 pa_log_info("Fresh high-resolution timers available! Bon appetit!");
1005 pa_log_info("Dude, your kernel stinks! The chef's recommendation today is Linux with high-resolution timers enabled!");
1007 if (conf->lock_memory) {
1008 #if defined(HAVE_SYS_MMAN_H) && !defined(__ANDROID__)
1009 if (mlockall(MCL_FUTURE) < 0)
1010 pa_log_warn("mlockall() failed: %s", pa_cstrerror(errno));
1012 pa_log_info("Successfully locked process into memory.");
1014 pa_log_warn("Memory locking requested but not supported on platform.");
1018 pa_memtrap_install();
1020 pa_assert_se(mainloop = pa_mainloop_new());
1022 if (!(c = pa_core_new(pa_mainloop_get_api(mainloop), !conf->disable_shm, conf->shm_size))) {
1023 pa_log(_("pa_core_new() failed."));
1027 c->default_sample_spec = conf->default_sample_spec;
1028 c->alternate_sample_rate = conf->alternate_sample_rate;
1029 c->default_channel_map = conf->default_channel_map;
1030 c->default_n_fragments = conf->default_n_fragments;
1031 c->default_fragment_size_msec = conf->default_fragment_size_msec;
1032 c->deferred_volume_safety_margin_usec = conf->deferred_volume_safety_margin_usec;
1033 c->deferred_volume_extra_delay_usec = conf->deferred_volume_extra_delay_usec;
1034 c->exit_idle_time = conf->exit_idle_time;
1035 c->scache_idle_time = conf->scache_idle_time;
1036 c->resample_method = conf->resample_method;
1037 c->realtime_priority = conf->realtime_priority;
1038 c->realtime_scheduling = conf->realtime_scheduling;
1039 c->disable_remixing = conf->disable_remixing;
1040 c->disable_lfe_remixing = conf->disable_lfe_remixing;
1041 c->deferred_volume = conf->deferred_volume;
1042 c->running_as_daemon = conf->daemonize;
1043 c->disallow_exit = conf->disallow_exit;
1044 c->flat_volumes = conf->flat_volumes;
1046 c->server_type = conf->local_server_type;
1049 pa_cpu_init(&c->cpu_info);
1051 pa_assert_se(pa_signal_init(pa_mainloop_get_api(mainloop)) == 0);
1052 pa_signal_new(SIGINT, signal_callback, c);
1053 pa_signal_new(SIGTERM, signal_callback, c);
1055 pa_signal_new(SIGUSR1, signal_callback, c);
1058 pa_signal_new(SIGUSR2, signal_callback, c);
1061 pa_signal_new(SIGHUP, signal_callback, c);
1064 if (!conf->no_cpu_limit)
1065 pa_assert_se(pa_cpu_limit_init(pa_mainloop_get_api(mainloop)) == 0);
1067 buf = pa_strbuf_new();
1070 pa_assert_se(dbus_threads_init_default());
1074 if (conf->load_default_script_file) {
1077 if ((f = pa_daemon_conf_open_default_script_file(conf))) {
1078 r = pa_cli_command_execute_file_stream(c, f, buf, &conf->fail);
1084 r = pa_cli_command_execute(c, conf->script_commands, buf, &conf->fail);
1086 pa_log_error("%s", s = pa_strbuf_tostring_free(buf));
1089 if (r < 0 && conf->fail) {
1090 pa_log(_("Failed to initialize daemon."));
1094 if (!c->modules || pa_idxset_size(c->modules) == 0) {
1095 pa_log(_("Daemon startup without any loaded modules, refusing to work."));
1100 /* When we just provide the D-Bus server lookup service, we don't want
1101 * any modules to be loaded. We haven't loaded any so far, so one might
1102 * think there's no way to contact the server, but receiving certain
1103 * signals could still cause modules to load. */
1104 conf->disallow_module_loading = true;
1108 /* We completed the initial module loading, so let's disable it
1109 * from now on, if requested */
1110 c->disallow_module_loading = conf->disallow_module_loading;
1113 if (!conf->system_instance) {
1114 if ((server_lookup = pa_dbusobj_server_lookup_new(c))) {
1115 if (!(lookup_service_bus = register_dbus_name(c, DBUS_BUS_SESSION, "org.PulseAudio1")))
1121 server_bus = register_dbus_name(c, conf->system_instance ? DBUS_BUS_SYSTEM : DBUS_BUS_SESSION, "org.pulseaudio.Server");
1125 if (daemon_pipe2[1] >= 0) {
1127 pa_loop_write(daemon_pipe2[1], &ok, sizeof(ok), NULL);
1128 pa_close(daemon_pipe2[1]);
1129 daemon_pipe2[1] = -1;
1133 pa_log_info("Daemon startup complete.");
1136 if (pa_mainloop_run(mainloop, &retval) < 0)
1139 pa_log_info("Daemon shutdown initiated.");
1144 pa_dbus_connection_unref(server_bus);
1145 if (lookup_service_bus)
1146 pa_dbus_connection_unref(lookup_service_bus);
1148 pa_dbusobj_server_lookup_free(server_lookup);
1151 if (autospawn_fd >= 0) {
1152 if (autospawn_locked)
1153 pa_autospawn_lock_release();
1155 pa_autospawn_lock_done(false);
1159 /* Ensure all the modules/samples are unloaded when the core is still ref'ed,
1160 * as unlink callback hooks in modules may need the core to be ref'ed */
1161 pa_module_unload_all(c);
1162 pa_scache_free_all(c);
1165 pa_log_info("Daemon terminated.");
1168 if (!conf->no_cpu_limit)
1169 pa_cpu_limit_done();
1174 /* If we have daemon_pipe[1] still open, this means we've failed after
1175 * the first fork, but before the second. Therefore just write to it. */
1176 if (daemon_pipe[1] >= 0)
1177 pa_loop_write(daemon_pipe[1], &retval, sizeof(retval), NULL);
1178 else if (daemon_pipe2[1] >= 0)
1179 pa_loop_write(daemon_pipe2[1], &retval, sizeof(retval), NULL);
1181 pa_close_pipe(daemon_pipe2);
1182 pa_close_pipe(daemon_pipe);
1186 pa_mainloop_free(mainloop);
1189 pa_daemon_conf_free(conf);
1192 pa_pid_file_remove();
1194 /* This has no real purpose except making things valgrind-clean */
1195 pa_unset_env_recorded();