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 #include <pulse/client-conf.h>
63 #include <pulse/client-conf-x11.h>
65 #include <pulse/mainloop.h>
66 #include <pulse/mainloop-signal.h>
67 #include <pulse/timeval.h>
68 #include <pulse/xmalloc.h>
70 #include <pulsecore/i18n.h>
71 #include <pulsecore/lock-autospawn.h>
72 #include <pulsecore/socket.h>
73 #include <pulsecore/core-error.h>
74 #include <pulsecore/core-rtclock.h>
75 #include <pulsecore/core-scache.h>
76 #include <pulsecore/core.h>
77 #include <pulsecore/module.h>
78 #include <pulsecore/cli-command.h>
79 #include <pulsecore/log.h>
80 #include <pulsecore/core-util.h>
81 #include <pulsecore/sioman.h>
82 #include <pulsecore/cli-text.h>
83 #include <pulsecore/pid.h>
84 #include <pulsecore/random.h>
85 #include <pulsecore/macro.h>
86 #include <pulsecore/shm.h>
87 #include <pulsecore/memtrap.h>
88 #include <pulsecore/strlist.h>
90 #include <pulsecore/dbus-shared.h>
92 #include <pulsecore/cpu-arm.h>
93 #include <pulsecore/cpu-x86.h>
94 #include <pulsecore/cpu-orc.h>
98 #include "daemon-conf.h"
99 #include "dumpmodules.h"
101 #include "ltdl-bind-now.h"
102 #include "server-lookup.h"
105 /* Only one instance of these variables */
106 int allow_severity = LOG_INFO;
107 int deny_severity = LOG_WARNING;
110 #ifdef HAVE_OSS_WRAPPER
111 /* padsp looks for this symbol in the running process and disables
112 * itself if it finds it and it is set to 7 (which is actually a bit
113 * mask). For details see padsp. */
114 int __padsp_disabled__ = 7;
119 static void message_cb(pa_mainloop_api*a, pa_time_event*e, const struct timeval *tv, void *userdata) {
121 struct timeval tvnext;
123 while (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)) {
124 if (msg.message == WM_QUIT)
127 TranslateMessage(&msg);
128 DispatchMessage(&msg);
132 pa_timeval_add(pa_gettimeofday(&tvnext), 100000);
133 a->time_restart(e, &tvnext);
138 static void signal_callback(pa_mainloop_api*m, pa_signal_event *e, int sig, void *userdata) {
139 pa_log_info(_("Got signal %s."), pa_sig2str(sig));
144 pa_module_load(userdata, "module-cli", NULL);
150 pa_module_load(userdata, "module-cli-protocol-unix", NULL);
156 char *c = pa_full_status_string(userdata);
157 pa_log_notice("%s", c);
166 pa_log_info(_("Exiting."));
172 #if defined(HAVE_PWD_H) && defined(HAVE_GRP_H)
174 static int change_user(void) {
179 /* This function is called only in system-wide mode. It creates a
180 * runtime dir in /var/run/ with proper UID/GID and drops privs
183 if (!(pw = getpwnam(PA_SYSTEM_USER))) {
184 pa_log(_("Failed to find user '%s'."), PA_SYSTEM_USER);
188 if (!(gr = getgrnam(PA_SYSTEM_GROUP))) {
189 pa_log(_("Failed to find group '%s'."), PA_SYSTEM_GROUP);
193 pa_log_info(_("Found user '%s' (UID %lu) and group '%s' (GID %lu)."),
194 PA_SYSTEM_USER, (unsigned long) pw->pw_uid,
195 PA_SYSTEM_GROUP, (unsigned long) gr->gr_gid);
197 if (pw->pw_gid != gr->gr_gid) {
198 pa_log(_("GID of user '%s' and of group '%s' don't match."), PA_SYSTEM_USER, PA_SYSTEM_GROUP);
202 if (strcmp(pw->pw_dir, PA_SYSTEM_RUNTIME_PATH) != 0)
203 pa_log_warn(_("Home directory of user '%s' is not '%s', ignoring."), PA_SYSTEM_USER, PA_SYSTEM_RUNTIME_PATH);
205 if (pa_make_secure_dir(PA_SYSTEM_RUNTIME_PATH, 0755, pw->pw_uid, gr->gr_gid) < 0) {
206 pa_log(_("Failed to create '%s': %s"), PA_SYSTEM_RUNTIME_PATH, pa_cstrerror(errno));
210 if (pa_make_secure_dir(PA_SYSTEM_STATE_PATH, 0700, pw->pw_uid, gr->gr_gid) < 0) {
211 pa_log(_("Failed to create '%s': %s"), PA_SYSTEM_STATE_PATH, pa_cstrerror(errno));
215 /* We don't create the config dir here, because we don't need to write to it */
217 if (initgroups(PA_SYSTEM_USER, gr->gr_gid) != 0) {
218 pa_log(_("Failed to change group list: %s"), pa_cstrerror(errno));
222 #if defined(HAVE_SETRESGID)
223 r = setresgid(gr->gr_gid, gr->gr_gid, gr->gr_gid);
224 #elif defined(HAVE_SETEGID)
225 if ((r = setgid(gr->gr_gid)) >= 0)
226 r = setegid(gr->gr_gid);
227 #elif defined(HAVE_SETREGID)
228 r = setregid(gr->gr_gid, gr->gr_gid);
230 #error "No API to drop privileges"
234 pa_log(_("Failed to change GID: %s"), pa_cstrerror(errno));
238 #if defined(HAVE_SETRESUID)
239 r = setresuid(pw->pw_uid, pw->pw_uid, pw->pw_uid);
240 #elif defined(HAVE_SETEUID)
241 if ((r = setuid(pw->pw_uid)) >= 0)
242 r = seteuid(pw->pw_uid);
243 #elif defined(HAVE_SETREUID)
244 r = setreuid(pw->pw_uid, pw->pw_uid);
246 #error "No API to drop privileges"
250 pa_log(_("Failed to change UID: %s"), pa_cstrerror(errno));
254 pa_set_env("USER", PA_SYSTEM_USER);
255 pa_set_env("USERNAME", PA_SYSTEM_USER);
256 pa_set_env("LOGNAME", PA_SYSTEM_USER);
257 pa_set_env("HOME", PA_SYSTEM_RUNTIME_PATH);
259 /* Relevant for pa_runtime_path() */
260 if (!getenv("PULSE_RUNTIME_PATH"))
261 pa_set_env("PULSE_RUNTIME_PATH", PA_SYSTEM_RUNTIME_PATH);
263 if (!getenv("PULSE_CONFIG_PATH"))
264 pa_set_env("PULSE_CONFIG_PATH", PA_SYSTEM_CONFIG_PATH);
266 if (!getenv("PULSE_STATE_PATH"))
267 pa_set_env("PULSE_STATE_PATH", PA_SYSTEM_STATE_PATH);
269 pa_log_info(_("Successfully dropped root privileges."));
274 #else /* HAVE_PWD_H && HAVE_GRP_H */
276 static int change_user(void) {
277 pa_log(_("System wide mode unsupported on this platform."));
281 #endif /* HAVE_PWD_H && HAVE_GRP_H */
283 #ifdef HAVE_SYS_RESOURCE_H
285 static int set_one_rlimit(const pa_rlimit *r, int resource, const char *name) {
292 rl.rlim_cur = rl.rlim_max = r->value;
294 if (setrlimit(resource, &rl) < 0) {
295 pa_log_info(_("setrlimit(%s, (%u, %u)) failed: %s"), name, (unsigned) r->value, (unsigned) r->value, pa_cstrerror(errno));
302 static void set_all_rlimits(const pa_daemon_conf *conf) {
303 set_one_rlimit(&conf->rlimit_fsize, RLIMIT_FSIZE, "RLIMIT_FSIZE");
304 set_one_rlimit(&conf->rlimit_data, RLIMIT_DATA, "RLIMIT_DATA");
305 set_one_rlimit(&conf->rlimit_stack, RLIMIT_STACK, "RLIMIT_STACK");
306 set_one_rlimit(&conf->rlimit_core, RLIMIT_CORE, "RLIMIT_CORE");
308 set_one_rlimit(&conf->rlimit_rss, RLIMIT_RSS, "RLIMIT_RSS");
311 set_one_rlimit(&conf->rlimit_nproc, RLIMIT_NPROC, "RLIMIT_NPROC");
314 set_one_rlimit(&conf->rlimit_nofile, RLIMIT_NOFILE, "RLIMIT_NOFILE");
316 #ifdef RLIMIT_MEMLOCK
317 set_one_rlimit(&conf->rlimit_memlock, RLIMIT_MEMLOCK, "RLIMIT_MEMLOCK");
320 set_one_rlimit(&conf->rlimit_as, RLIMIT_AS, "RLIMIT_AS");
323 set_one_rlimit(&conf->rlimit_locks, RLIMIT_LOCKS, "RLIMIT_LOCKS");
325 #ifdef RLIMIT_SIGPENDING
326 set_one_rlimit(&conf->rlimit_sigpending, RLIMIT_SIGPENDING, "RLIMIT_SIGPENDING");
328 #ifdef RLIMIT_MSGQUEUE
329 set_one_rlimit(&conf->rlimit_msgqueue, RLIMIT_MSGQUEUE, "RLIMIT_MSGQUEUE");
332 set_one_rlimit(&conf->rlimit_nice, RLIMIT_NICE, "RLIMIT_NICE");
335 set_one_rlimit(&conf->rlimit_rtprio, RLIMIT_RTPRIO, "RLIMIT_RTPRIO");
338 set_one_rlimit(&conf->rlimit_rttime, RLIMIT_RTTIME, "RLIMIT_RTTIME");
343 static char *check_configured_address(void) {
344 char *default_server = NULL;
345 pa_client_conf *c = pa_client_conf_new();
347 pa_client_conf_load(c, NULL);
349 pa_client_conf_from_x11(c, NULL);
351 pa_client_conf_env(c);
353 if (c->default_server && *c->default_server)
354 default_server = pa_xstrdup(c->default_server);
356 pa_client_conf_free(c);
358 return default_server;
362 static pa_dbus_connection *register_dbus_name(pa_core *c, DBusBusType bus, const char* name) {
364 pa_dbus_connection *conn;
366 dbus_error_init(&error);
368 if (!(conn = pa_dbus_bus_get(c, bus, &error)) || dbus_error_is_set(&error)) {
369 pa_log_warn("Unable to contact D-Bus: %s: %s", error.name, error.message);
373 if (dbus_bus_request_name(pa_dbus_connection_get(conn), name, DBUS_NAME_FLAG_DO_NOT_QUEUE, &error) == DBUS_REQUEST_NAME_REPLY_PRIMARY_OWNER) {
374 pa_log_debug("Got %s!", name);
378 if (dbus_error_is_set(&error))
379 pa_log_error("Failed to acquire %s: %s: %s", name, error.name, error.message);
381 pa_log_error("D-Bus name %s already taken.", name);
383 /* PA cannot be started twice by the same user and hence we can
384 * ignore mostly the case that a name is already taken. */
388 pa_dbus_connection_unref(conn);
390 dbus_error_free(&error);
395 int main(int argc, char *argv[]) {
397 pa_strbuf *buf = NULL;
398 pa_daemon_conf *conf = NULL;
399 pa_mainloop *mainloop = NULL;
401 char *configured_address;
402 int r = 0, retval = 1, d = 0;
403 pa_bool_t valid_pid_file = FALSE;
404 pa_bool_t ltdl_init = FALSE;
408 int daemon_pipe[2] = { -1, -1 };
409 int daemon_pipe2[2] = { -1, -1 };
412 pa_time_event *win32_timer;
413 struct timeval win32_tv;
415 int autospawn_fd = -1;
416 pa_bool_t autospawn_locked = FALSE;
418 pa_dbusobj_server_lookup *server_lookup = NULL; /* /org/pulseaudio/server_lookup */
419 pa_dbus_connection *lookup_service_bus = NULL; /* Always the user bus. */
420 pa_dbus_connection *server_bus = NULL; /* The bus where we reserve org.pulseaudio.Server, either the user or the system bus. */
421 pa_bool_t start_server;
424 pa_log_set_ident("pulseaudio");
425 pa_log_set_level(PA_LOG_NOTICE);
426 pa_log_set_flags(PA_LOG_COLORS|PA_LOG_PRINT_FILE|PA_LOG_PRINT_LEVEL, PA_LOG_RESET);
428 #if defined(__linux__) && defined(__OPTIMIZE__)
430 Disable lazy relocations to make usage of external libraries
431 more deterministic for our RT threads. We abuse __OPTIMIZE__ as
432 a check whether we are a debug build or not. This all is
433 admittedly a bit snake-oilish.
436 if (!getenv("LD_BIND_NOW")) {
440 /* We have to execute ourselves, because the libc caches the
441 * value of $LD_BIND_NOW on initialization. */
443 pa_set_env("LD_BIND_NOW", "1");
445 if ((canonical_rp = pa_realpath(PA_BINARY))) {
447 if ((rp = pa_readlink("/proc/self/exe"))) {
449 if (pa_streq(rp, canonical_rp))
450 pa_assert_se(execv(rp, argv) == 0);
452 pa_log_warn("/proc/self/exe does not point to %s, cannot self execute. Are you playing games?", canonical_rp);
457 pa_log_warn("Couldn't read /proc/self/exe, cannot self execute. Running in a chroot()?");
459 pa_xfree(canonical_rp);
462 pa_log_warn("Couldn't canonicalize binary path, cannot self execute.");
466 if ((e = getenv("PULSE_PASSED_FD"))) {
473 /* We might be autospawned, in which case have no idea in which
474 * context we have been started. Let's cleanup our execution
475 * context as good as possible */
477 pa_reset_personality();
479 pa_close_all(passed_fd, -1);
484 setlocale(LC_ALL, "");
487 conf = pa_daemon_conf_new();
489 if (pa_daemon_conf_load(conf, NULL) < 0)
492 if (pa_daemon_conf_env(conf) < 0)
495 if (pa_cmdline_parse(conf, argc, argv, &d) < 0) {
496 pa_log(_("Failed to parse command line."));
500 pa_log_set_level(conf->log_level);
501 pa_log_set_target(conf->auto_log_target ? PA_LOG_STDERR : conf->log_target);
503 pa_log_set_flags(PA_LOG_PRINT_META, PA_LOG_SET);
505 pa_log_set_flags(PA_LOG_PRINT_TIME, PA_LOG_SET);
506 pa_log_set_show_backtrace(conf->log_backtrace);
509 /* conf->system_instance and conf->local_server_type control almost the
510 * same thing; make them agree about what is requested. */
511 switch (conf->local_server_type) {
512 case PA_SERVER_TYPE_UNSET:
513 conf->local_server_type = conf->system_instance ? PA_SERVER_TYPE_SYSTEM : PA_SERVER_TYPE_USER;
515 case PA_SERVER_TYPE_USER:
516 case PA_SERVER_TYPE_NONE:
517 conf->system_instance = FALSE;
519 case PA_SERVER_TYPE_SYSTEM:
520 conf->system_instance = TRUE;
523 pa_assert_not_reached();
526 start_server = conf->local_server_type == PA_SERVER_TYPE_USER || (getuid() == 0 && conf->local_server_type == PA_SERVER_TYPE_SYSTEM);
528 if (!start_server && conf->local_server_type == PA_SERVER_TYPE_SYSTEM) {
529 pa_log_notice(_("System mode refused for non-root user. Only starting the D-Bus server lookup service."));
530 conf->system_instance = FALSE;
534 LTDL_SET_PRELOADED_SYMBOLS();
538 if (conf->dl_search_path)
539 lt_dlsetsearchpath(conf->dl_search_path);
544 WSAStartup(MAKEWORD(2, 0), &data);
551 case PA_CMD_DUMP_MODULES:
552 pa_dump_modules(conf, argc-d, argv+d);
556 case PA_CMD_DUMP_CONF: {
559 pa_log("Too many arguments.\n");
563 s = pa_daemon_conf_dump(conf);
570 case PA_CMD_DUMP_RESAMPLE_METHODS: {
574 pa_log("Too many arguments.\n");
578 for (i = 0; i < PA_RESAMPLER_MAX; i++)
579 if (pa_resample_method_supported(i))
580 printf("%s\n", pa_resample_method_to_string(i));
587 pa_cmdline_help(argv[0]);
591 case PA_CMD_VERSION :
594 pa_log("Too many arguments.\n");
598 printf(PACKAGE_NAME" "PACKAGE_VERSION"\n");
606 pa_log("Too many arguments.\n");
610 if (pa_pid_file_check_running(&pid, "pulseaudio") < 0)
611 pa_log_info(_("Daemon not running"));
613 pa_log_info(_("Daemon running as PID %u"), pid);
623 pa_log("Too many arguments.\n");
627 if (pa_pid_file_kill(SIGINT, NULL, "pulseaudio") < 0)
628 pa_log(_("Failed to kill daemon: %s"), pa_cstrerror(errno));
634 case PA_CMD_CLEANUP_SHM:
637 pa_log("Too many arguments.\n");
641 if (pa_shm_cleanup() >= 0)
647 pa_assert(conf->cmd == PA_CMD_DAEMON || conf->cmd == PA_CMD_START);
651 pa_log("Too many arguments.\n");
656 if (getuid() == 0 && !conf->system_instance)
657 pa_log_warn(_("This program is not intended to be run as root (unless --system is specified)."));
658 #ifndef HAVE_DBUS /* A similar, only a notice worthy check was done earlier, if D-Bus is enabled. */
659 else if (getuid() != 0 && conf->system_instance) {
660 pa_log(_("Root privileges required."));
664 #endif /* HAVE_GETUID */
666 if (conf->cmd == PA_CMD_START && conf->system_instance) {
667 pa_log(_("--start not supported for system instances."));
671 if (conf->cmd == PA_CMD_START && (configured_address = check_configured_address())) {
672 /* There is an server address in our config, but where did it come from?
673 * By default a standard X11 login will load module-x11-publish which will
674 * inject PULSE_SERVER X11 property. If the PA daemon crashes, we will end
675 * up hitting this code path. So we have to check to see if our configured_address
676 * is the same as the value that would go into this property so that we can
677 * recover (i.e. autospawn) from a crash.
680 pa_bool_t start_anyway = FALSE;
682 if ((ufn = pa_runtime_path(PA_NATIVE_DEFAULT_UNIX_SOCKET))) {
685 if ((id = pa_machine_id())) {
686 pa_strlist *server_list;
687 char formatted_ufn[256];
689 pa_snprintf(formatted_ufn, sizeof(formatted_ufn), "{%s}unix:%s", id, ufn);
692 if ((server_list = pa_strlist_parse(configured_address))) {
695 /* We only need to check the first server */
696 server_list = pa_strlist_pop(server_list, &u);
697 pa_strlist_free(server_list);
699 start_anyway = (u && pa_streq(formatted_ufn, u));
707 pa_log_notice(_("User-configured server at %s, refusing to start/autospawn."), configured_address);
708 pa_xfree(configured_address);
713 pa_log_notice(_("User-configured server at %s, which appears to be local. Probing deeper."), configured_address);
714 pa_xfree(configured_address);
717 if (conf->system_instance && !conf->disallow_exit)
718 pa_log_warn(_("Running in system mode, but --disallow-exit not set!"));
720 if (conf->system_instance && !conf->disallow_module_loading)
721 pa_log_warn(_("Running in system mode, but --disallow-module-loading not set!"));
723 if (conf->system_instance && !conf->disable_shm) {
724 pa_log_notice(_("Running in system mode, forcibly disabling SHM mode!"));
725 conf->disable_shm = TRUE;
728 if (conf->system_instance && conf->exit_idle_time >= 0) {
729 pa_log_notice(_("Running in system mode, forcibly disabling exit idle time!"));
730 conf->exit_idle_time = -1;
733 if (conf->cmd == PA_CMD_START) {
734 /* If we shall start PA only when it is not running yet, we
735 * first take the autospawn lock to make things
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;
751 if (conf->daemonize) {
756 if (pa_stdio_acquire() < 0) {
757 pa_log(_("Failed to acquire stdio."));
762 if (pipe(daemon_pipe) < 0) {
763 pa_log(_("pipe() failed: %s"), pa_cstrerror(errno));
767 if ((child = fork()) < 0) {
768 pa_log(_("fork() failed: %s"), pa_cstrerror(errno));
769 pa_close_pipe(daemon_pipe);
777 pa_assert_se(pa_close(daemon_pipe[1]) == 0);
780 if ((n = pa_loop_read(daemon_pipe[0], &retval, sizeof(retval), NULL)) != sizeof(retval)) {
783 pa_log(_("read() failed: %s"), pa_cstrerror(errno));
789 pa_log(_("Daemon startup failed."));
791 pa_log_info(_("Daemon startup successful."));
796 if (autospawn_fd >= 0) {
797 /* The lock file is unlocked from the parent, so we need
798 * to close it in the child */
800 pa_autospawn_lock_release();
801 pa_autospawn_lock_done(TRUE);
803 autospawn_locked = FALSE;
807 pa_assert_se(pa_close(daemon_pipe[0]) == 0);
811 if (conf->auto_log_target)
812 pa_log_set_target(PA_LOG_SYSLOG);
816 pa_log(_("setsid() failed: %s"), pa_cstrerror(errno));
822 /* We now are a session and process group leader. Let's fork
823 * again and let the father die, so that we'll become a
824 * process that can never acquire a TTY again, in a session and
825 * process group without leader */
827 if (pipe(daemon_pipe2) < 0) {
828 pa_log(_("pipe() failed: %s"), pa_cstrerror(errno));
832 if ((child = fork()) < 0) {
833 pa_log(_("fork() failed: %s"), pa_cstrerror(errno));
834 pa_close_pipe(daemon_pipe2);
842 pa_assert_se(pa_close(daemon_pipe2[1]) == 0);
843 daemon_pipe2[1] = -1;
845 if ((n = pa_loop_read(daemon_pipe2[0], &retval, sizeof(retval), NULL)) != sizeof(retval)) {
848 pa_log(_("read() failed: %s"), pa_cstrerror(errno));
853 /* We now have to take care of signalling the first fork with
854 * the return value we've received from this fork... */
855 pa_assert(daemon_pipe[1] >= 0);
857 pa_loop_write(daemon_pipe[1], &retval, sizeof(retval), NULL);
858 pa_close(daemon_pipe[1]);
864 pa_assert_se(pa_close(daemon_pipe2[0]) == 0);
865 daemon_pipe2[0] = -1;
867 /* We no longer need the (first) daemon_pipe as it's handled in our child above */
868 pa_close_pipe(daemon_pipe);
872 signal(SIGTTOU, SIG_IGN);
875 signal(SIGTTIN, SIG_IGN);
878 signal(SIGTSTP, SIG_IGN);
884 pa_set_env_and_record("PULSE_INTERNAL", "1");
885 pa_assert_se(chdir("/") == 0);
888 #ifdef HAVE_SYS_RESOURCE_H
889 set_all_rlimits(conf);
891 pa_rtclock_hrtimer_enable();
893 pa_raise_priority(conf->nice_level);
895 if (conf->system_instance)
896 if (change_user() < 0)
899 pa_set_env_and_record("PULSE_SYSTEM", conf->system_instance ? "1" : "0");
901 pa_log_info(_("This is PulseAudio %s"), PACKAGE_VERSION);
902 pa_log_debug(_("Compilation host: %s"), CANONICAL_HOST);
903 pa_log_debug(_("Compilation CFLAGS: %s"), PA_CFLAGS);
905 s = pa_uname_string();
906 pa_log_debug(_("Running on host: %s"), s);
909 pa_log_debug(_("Found %u CPUs."), pa_ncpus());
911 pa_log_info(_("Page size is %lu bytes"), (unsigned long) PA_PAGE_SIZE);
913 #ifdef HAVE_VALGRIND_MEMCHECK_H
914 pa_log_debug(_("Compiled with Valgrind support: yes"));
916 pa_log_debug(_("Compiled with Valgrind support: no"));
919 pa_log_debug(_("Running in valgrind mode: %s"), pa_yes_no(pa_in_valgrind()));
921 pa_log_debug(_("Running in VM: %s"), pa_yes_no(pa_running_in_vm()));
924 pa_log_debug(_("Optimized build: yes"));
926 pa_log_debug(_("Optimized build: no"));
930 pa_log_debug(_("NDEBUG defined, all asserts disabled."));
931 #elif defined(FASTPATH)
932 pa_log_debug(_("FASTPATH defined, only fast path asserts disabled."));
934 pa_log_debug(_("All asserts enabled."));
937 if (!(s = pa_machine_id())) {
938 pa_log(_("Failed to get machine ID"));
941 pa_log_info(_("Machine ID is %s."), s);
944 if ((s = pa_session_id())) {
945 pa_log_info(_("Session ID is %s."), s);
949 if (!(s = pa_get_runtime_dir()))
951 pa_log_info(_("Using runtime directory %s."), s);
954 if (!(s = pa_get_state_dir()))
956 pa_log_info(_("Using state directory %s."), s);
959 pa_log_info(_("Using modules directory %s."), conf->dl_search_path);
961 pa_log_info(_("Running in system mode: %s"), pa_yes_no(pa_in_system_mode()));
963 if (pa_in_system_mode())
964 pa_log_warn(_("OK, so you are running PA in system mode. Please note that you most likely shouldn't be doing that.\n"
965 "If you do it nonetheless then it's your own fault if things don't work as expected.\n"
966 "Please read http://pulseaudio.org/wiki/WhatIsWrongWithSystemMode for an explanation why system mode is usually a bad idea."));
968 if (conf->use_pid_file) {
971 if ((z = pa_pid_file_create("pulseaudio")) != 0) {
973 if (conf->cmd == PA_CMD_START && z > 0) {
974 /* If we are already running and with are run in
975 * --start mode, then let's return this as success. */
981 pa_log(_("pa_pid_file_create() failed."));
985 valid_pid_file = TRUE;
988 pa_disable_sigpipe();
990 if (pa_rtclock_hrtimer())
991 pa_log_info(_("Fresh high-resolution timers available! Bon appetit!"));
993 pa_log_info(_("Dude, your kernel stinks! The chef's recommendation today is Linux with high-resolution timers enabled!"));
995 if (conf->lock_memory) {
996 #ifdef HAVE_SYS_MMAN_H
997 if (mlockall(MCL_FUTURE) < 0)
998 pa_log_warn("mlockall() failed: %s", pa_cstrerror(errno));
1000 pa_log_info("Successfully locked process into memory.");
1002 pa_log_warn("Memory locking requested but not supported on platform.");
1006 pa_memtrap_install();
1008 pa_assert_se(mainloop = pa_mainloop_new());
1010 if (!(c = pa_core_new(pa_mainloop_get_api(mainloop), !conf->disable_shm, conf->shm_size))) {
1011 pa_log(_("pa_core_new() failed."));
1015 c->default_sample_spec = conf->default_sample_spec;
1016 c->alternate_sample_rate = conf->alternate_sample_rate;
1017 c->default_channel_map = conf->default_channel_map;
1018 c->default_n_fragments = conf->default_n_fragments;
1019 c->default_fragment_size_msec = conf->default_fragment_size_msec;
1020 c->deferred_volume_safety_margin_usec = conf->deferred_volume_safety_margin_usec;
1021 c->deferred_volume_extra_delay_usec = conf->deferred_volume_extra_delay_usec;
1022 c->exit_idle_time = conf->exit_idle_time;
1023 c->scache_idle_time = conf->scache_idle_time;
1024 c->resample_method = conf->resample_method;
1025 c->realtime_priority = conf->realtime_priority;
1026 c->realtime_scheduling = !!conf->realtime_scheduling;
1027 c->disable_remixing = !!conf->disable_remixing;
1028 c->disable_lfe_remixing = !!conf->disable_lfe_remixing;
1029 c->deferred_volume = !!conf->deferred_volume;
1030 c->running_as_daemon = !!conf->daemonize;
1031 c->disallow_exit = conf->disallow_exit;
1032 c->flat_volumes = conf->flat_volumes;
1034 c->server_type = conf->local_server_type;
1037 c->cpu_info.cpu_type = PA_CPU_UNDEFINED;
1038 if (!getenv("PULSE_NO_SIMD")) {
1039 if (pa_cpu_init_x86(&(c->cpu_info.flags.x86)))
1040 c->cpu_info.cpu_type = PA_CPU_X86;
1041 if (pa_cpu_init_arm(&(c->cpu_info.flags.arm)))
1042 c->cpu_info.cpu_type = PA_CPU_ARM;
1043 pa_cpu_init_orc(c->cpu_info);
1046 pa_assert_se(pa_signal_init(pa_mainloop_get_api(mainloop)) == 0);
1047 pa_signal_new(SIGINT, signal_callback, c);
1048 pa_signal_new(SIGTERM, signal_callback, c);
1050 pa_signal_new(SIGUSR1, signal_callback, c);
1053 pa_signal_new(SIGUSR2, signal_callback, c);
1056 pa_signal_new(SIGHUP, signal_callback, c);
1060 win32_timer = pa_mainloop_get_api(mainloop)->time_new(pa_mainloop_get_api(mainloop), pa_gettimeofday(&win32_tv), message_cb, NULL);
1063 if (!conf->no_cpu_limit)
1064 pa_assert_se(pa_cpu_limit_init(pa_mainloop_get_api(mainloop)) == 0);
1066 buf = pa_strbuf_new();
1069 pa_assert_se(dbus_threads_init_default());
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))) {
1114 if (!(lookup_service_bus = register_dbus_name(c, DBUS_BUS_SESSION, "org.PulseAudio1")))
1120 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);
1163 /* Ensure all the modules/samples are unloaded when the core is still ref'ed,
1164 * as unlink callback hooks in modules may need the core to be ref'ed */
1165 pa_module_unload_all(c);
1166 pa_scache_free_all(c);
1169 pa_log_info(_("Daemon terminated."));
1172 if (!conf->no_cpu_limit)
1173 pa_cpu_limit_done();
1178 /* If we have daemon_pipe[1] still open, this means we've failed after
1179 * the first fork, but before the second. Therefore just write to it. */
1180 if (daemon_pipe[1] >= 0)
1181 pa_loop_write(daemon_pipe[1], &retval, sizeof(retval), NULL);
1182 else if (daemon_pipe2[1] >= 0)
1183 pa_loop_write(daemon_pipe2[1], &retval, sizeof(retval), NULL);
1185 pa_close_pipe(daemon_pipe2);
1186 pa_close_pipe(daemon_pipe);
1190 pa_mainloop_free(mainloop);
1193 pa_daemon_conf_free(conf);
1196 pa_pid_file_remove();
1198 /* This has no real purpose except making things valgrind-clean */
1199 pa_unset_env_recorded();