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 #ifdef HAVE_SYSTEMD_DAEMON
64 #include <systemd/sd-daemon.h>
67 #include <pulse/client-conf.h>
69 #include <pulse/client-conf-x11.h>
71 #include <pulse/mainloop.h>
72 #include <pulse/mainloop-signal.h>
73 #include <pulse/timeval.h>
74 #include <pulse/xmalloc.h>
76 #include <pulsecore/i18n.h>
77 #include <pulsecore/lock-autospawn.h>
78 #include <pulsecore/socket.h>
79 #include <pulsecore/core-error.h>
80 #include <pulsecore/core-rtclock.h>
81 #include <pulsecore/core-scache.h>
82 #include <pulsecore/core.h>
83 #include <pulsecore/module.h>
84 #include <pulsecore/cli-command.h>
85 #include <pulsecore/log.h>
86 #include <pulsecore/core-util.h>
87 #include <pulsecore/sioman.h>
88 #include <pulsecore/cli-text.h>
89 #include <pulsecore/pid.h>
90 #include <pulsecore/random.h>
91 #include <pulsecore/macro.h>
92 #include <pulsecore/shm.h>
93 #include <pulsecore/memtrap.h>
94 #include <pulsecore/strlist.h>
96 #include <pulsecore/dbus-shared.h>
98 #include <pulsecore/cpu-arm.h>
99 #include <pulsecore/cpu-x86.h>
100 #include <pulsecore/cpu-orc.h>
103 #include "cpulimit.h"
104 #include "daemon-conf.h"
105 #include "dumpmodules.h"
107 #include "ltdl-bind-now.h"
108 #include "server-lookup.h"
110 #define PA_READY "/tmp/.pa_ready"
112 #define PULSEAUDIO_READY "/tmp/.pulseaudio_ready"
115 /* Only one instance of these variables */
116 int allow_severity = LOG_INFO;
117 int deny_severity = LOG_WARNING;
120 #ifdef HAVE_OSS_WRAPPER
121 /* padsp looks for this symbol in the running process and disables
122 * itself if it finds it and it is set to 7 (which is actually a bit
123 * mask). For details see padsp. */
124 int __padsp_disabled__ = 7;
129 static void message_cb(pa_mainloop_api*a, pa_time_event*e, const struct timeval *tv, void *userdata) {
131 struct timeval tvnext;
133 while (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)) {
134 if (msg.message == WM_QUIT)
137 TranslateMessage(&msg);
138 DispatchMessage(&msg);
142 pa_timeval_add(pa_gettimeofday(&tvnext), 100000);
143 a->time_restart(e, &tvnext);
148 static void signal_callback(pa_mainloop_api*m, pa_signal_event *e, int sig, void *userdata) {
149 pa_log_info(_("Got signal %s."), pa_sig2str(sig));
154 pa_module_load(userdata, "module-cli", NULL);
160 pa_module_load(userdata, "module-cli-protocol-unix", NULL);
166 char *c = pa_full_status_string(userdata);
167 pa_log_notice("%s", c);
176 pa_log_info(_("Exiting."));
182 #if defined(HAVE_PWD_H) && defined(HAVE_GRP_H)
184 static int change_user(void) {
189 /* This function is called only in system-wide mode. It creates a
190 * runtime dir in /var/run/ with proper UID/GID and drops privs
193 if (!(pw = getpwnam(PA_SYSTEM_USER))) {
194 pa_log(_("Failed to find user '%s'."), PA_SYSTEM_USER);
198 if (!(gr = getgrnam(PA_SYSTEM_GROUP))) {
199 pa_log(_("Failed to find group '%s'."), PA_SYSTEM_GROUP);
203 pa_log_info(_("Found user '%s' (UID %lu) and group '%s' (GID %lu)."),
204 PA_SYSTEM_USER, (unsigned long) pw->pw_uid,
205 PA_SYSTEM_GROUP, (unsigned long) gr->gr_gid);
207 if (pw->pw_gid != gr->gr_gid) {
208 pa_log(_("GID of user '%s' and of group '%s' don't match."), PA_SYSTEM_USER, PA_SYSTEM_GROUP);
212 if (!pa_streq(pw->pw_dir, PA_SYSTEM_RUNTIME_PATH))
213 pa_log_warn(_("Home directory of user '%s' is not '%s', ignoring."), PA_SYSTEM_USER, PA_SYSTEM_RUNTIME_PATH);
215 if (pa_make_secure_dir(PA_SYSTEM_RUNTIME_PATH, 0755, pw->pw_uid, gr->gr_gid, true) < 0) {
216 pa_log(_("Failed to create '%s': %s"), PA_SYSTEM_RUNTIME_PATH, pa_cstrerror(errno));
220 if (pa_make_secure_dir(PA_SYSTEM_STATE_PATH, 0700, pw->pw_uid, gr->gr_gid, true) < 0) {
221 pa_log(_("Failed to create '%s': %s"), PA_SYSTEM_STATE_PATH, pa_cstrerror(errno));
225 /* We don't create the config dir here, because we don't need to write to it */
227 if (initgroups(PA_SYSTEM_USER, gr->gr_gid) != 0) {
228 pa_log(_("Failed to change group list: %s"), pa_cstrerror(errno));
232 #if defined(HAVE_SETRESGID)
233 r = setresgid(gr->gr_gid, gr->gr_gid, gr->gr_gid);
234 #elif defined(HAVE_SETEGID)
235 if ((r = setgid(gr->gr_gid)) >= 0)
236 r = setegid(gr->gr_gid);
237 #elif defined(HAVE_SETREGID)
238 r = setregid(gr->gr_gid, gr->gr_gid);
240 #error "No API to drop privileges"
244 pa_log(_("Failed to change GID: %s"), pa_cstrerror(errno));
248 #if defined(HAVE_SETRESUID)
249 r = setresuid(pw->pw_uid, pw->pw_uid, pw->pw_uid);
250 #elif defined(HAVE_SETEUID)
251 if ((r = setuid(pw->pw_uid)) >= 0)
252 r = seteuid(pw->pw_uid);
253 #elif defined(HAVE_SETREUID)
254 r = setreuid(pw->pw_uid, pw->pw_uid);
256 #error "No API to drop privileges"
260 pa_log(_("Failed to change UID: %s"), pa_cstrerror(errno));
266 pa_set_env("USER", PA_SYSTEM_USER);
267 pa_set_env("USERNAME", PA_SYSTEM_USER);
268 pa_set_env("LOGNAME", PA_SYSTEM_USER);
269 pa_set_env("HOME", PA_SYSTEM_RUNTIME_PATH);
271 /* Relevant for pa_runtime_path() */
272 if (!getenv("PULSE_RUNTIME_PATH"))
273 pa_set_env("PULSE_RUNTIME_PATH", PA_SYSTEM_RUNTIME_PATH);
275 if (!getenv("PULSE_CONFIG_PATH"))
276 pa_set_env("PULSE_CONFIG_PATH", PA_SYSTEM_CONFIG_PATH);
278 if (!getenv("PULSE_STATE_PATH"))
279 pa_set_env("PULSE_STATE_PATH", PA_SYSTEM_STATE_PATH);
281 pa_log_info(_("Successfully changed user to \"" PA_SYSTEM_USER "\"."));
286 #else /* HAVE_PWD_H && HAVE_GRP_H */
288 static int change_user(void) {
289 pa_log(_("System wide mode unsupported on this platform."));
293 #endif /* HAVE_PWD_H && HAVE_GRP_H */
295 #ifdef HAVE_SYS_RESOURCE_H
297 static int set_one_rlimit(const pa_rlimit *r, int resource, const char *name) {
304 rl.rlim_cur = rl.rlim_max = r->value;
306 if (setrlimit(resource, &rl) < 0) {
307 pa_log_info(_("setrlimit(%s, (%u, %u)) failed: %s"), name, (unsigned) r->value, (unsigned) r->value, pa_cstrerror(errno));
314 static void set_all_rlimits(const pa_daemon_conf *conf) {
315 set_one_rlimit(&conf->rlimit_fsize, RLIMIT_FSIZE, "RLIMIT_FSIZE");
316 set_one_rlimit(&conf->rlimit_data, RLIMIT_DATA, "RLIMIT_DATA");
317 set_one_rlimit(&conf->rlimit_stack, RLIMIT_STACK, "RLIMIT_STACK");
318 set_one_rlimit(&conf->rlimit_core, RLIMIT_CORE, "RLIMIT_CORE");
320 set_one_rlimit(&conf->rlimit_rss, RLIMIT_RSS, "RLIMIT_RSS");
323 set_one_rlimit(&conf->rlimit_nproc, RLIMIT_NPROC, "RLIMIT_NPROC");
326 set_one_rlimit(&conf->rlimit_nofile, RLIMIT_NOFILE, "RLIMIT_NOFILE");
328 #ifdef RLIMIT_MEMLOCK
329 set_one_rlimit(&conf->rlimit_memlock, RLIMIT_MEMLOCK, "RLIMIT_MEMLOCK");
332 set_one_rlimit(&conf->rlimit_as, RLIMIT_AS, "RLIMIT_AS");
335 set_one_rlimit(&conf->rlimit_locks, RLIMIT_LOCKS, "RLIMIT_LOCKS");
337 #ifdef RLIMIT_SIGPENDING
338 set_one_rlimit(&conf->rlimit_sigpending, RLIMIT_SIGPENDING, "RLIMIT_SIGPENDING");
340 #ifdef RLIMIT_MSGQUEUE
341 set_one_rlimit(&conf->rlimit_msgqueue, RLIMIT_MSGQUEUE, "RLIMIT_MSGQUEUE");
344 set_one_rlimit(&conf->rlimit_nice, RLIMIT_NICE, "RLIMIT_NICE");
347 set_one_rlimit(&conf->rlimit_rtprio, RLIMIT_RTPRIO, "RLIMIT_RTPRIO");
350 set_one_rlimit(&conf->rlimit_rttime, RLIMIT_RTTIME, "RLIMIT_RTTIME");
355 static char *check_configured_address(void) {
356 char *default_server = NULL;
357 pa_client_conf *c = pa_client_conf_new();
359 pa_client_conf_load(c, NULL);
361 pa_client_conf_from_x11(c, NULL);
363 pa_client_conf_env(c);
365 if (c->default_server && *c->default_server)
366 default_server = pa_xstrdup(c->default_server);
368 pa_client_conf_free(c);
370 return default_server;
374 static pa_dbus_connection *register_dbus_name(pa_core *c, DBusBusType bus, const char* name) {
376 pa_dbus_connection *conn;
378 dbus_error_init(&error);
380 if (!(conn = pa_dbus_bus_get(c, bus, &error)) || dbus_error_is_set(&error)) {
381 pa_log_warn("Unable to contact D-Bus: %s: %s", error.name, error.message);
385 if (dbus_bus_request_name(pa_dbus_connection_get(conn), name, DBUS_NAME_FLAG_DO_NOT_QUEUE, &error) == DBUS_REQUEST_NAME_REPLY_PRIMARY_OWNER) {
386 pa_log_debug("Got %s!", name);
390 if (dbus_error_is_set(&error))
391 pa_log_error("Failed to acquire %s: %s: %s", name, error.name, error.message);
393 pa_log_error("D-Bus name %s already taken.", name);
395 /* PA cannot be started twice by the same user and hence we can
396 * ignore mostly the case that a name is already taken. */
400 pa_dbus_connection_unref(conn);
402 dbus_error_free(&error);
407 int main(int argc, char *argv[]) {
409 pa_strbuf *buf = NULL;
410 pa_daemon_conf *conf = NULL;
411 pa_mainloop *mainloop = NULL;
413 char *configured_address;
414 int r = 0, retval = 1, d = 0;
415 bool valid_pid_file = false;
416 bool ltdl_init = false;
417 int n_fds = 0, *passed_fds = NULL;
420 int daemon_pipe[2] = { -1, -1 };
421 int daemon_pipe2[2] = { -1, -1 };
424 pa_time_event *win32_timer;
425 struct timeval win32_tv;
427 int autospawn_fd = -1;
428 bool autospawn_locked = false;
430 pa_dbusobj_server_lookup *server_lookup = NULL; /* /org/pulseaudio/server_lookup */
431 pa_dbus_connection *lookup_service_bus = NULL; /* Always the user bus. */
432 pa_dbus_connection *server_bus = NULL; /* The bus where we reserve org.pulseaudio.Server, either the user or the system bus. */
436 pa_log_set_ident("pulseaudio");
437 pa_log_set_level(PA_LOG_NOTICE);
438 pa_log_set_flags(PA_LOG_COLORS|PA_LOG_PRINT_FILE|PA_LOG_PRINT_LEVEL, PA_LOG_RESET);
440 #if defined(__linux__) && defined(__OPTIMIZE__)
442 Disable lazy relocations to make usage of external libraries
443 more deterministic for our RT threads. We abuse __OPTIMIZE__ as
444 a check whether we are a debug build or not. This all is
445 admittedly a bit snake-oilish.
448 if (!getenv("LD_BIND_NOW")) {
452 /* We have to execute ourselves, because the libc caches the
453 * value of $LD_BIND_NOW on initialization. */
455 pa_set_env("LD_BIND_NOW", "1");
457 if ((canonical_rp = pa_realpath(PA_BINARY))) {
459 if ((rp = pa_readlink("/proc/self/exe"))) {
461 if (pa_streq(rp, canonical_rp))
462 pa_assert_se(execv(rp, argv) == 0);
464 pa_log_warn("/proc/self/exe does not point to %s, cannot self execute. Are you playing games?", canonical_rp);
469 pa_log_warn("Couldn't read /proc/self/exe, cannot self execute. Running in a chroot()?");
471 pa_xfree(canonical_rp);
474 pa_log_warn("Couldn't canonicalize binary path, cannot self execute.");
478 #ifdef HAVE_SYSTEMD_DAEMON
479 n_fds = sd_listen_fds(0);
483 passed_fds = pa_xnew(int, n_fds+2);
484 passed_fds[n_fds] = passed_fds[n_fds+1] = -1;
486 passed_fds[i] = SD_LISTEN_FDS_START + i;
492 passed_fds = pa_xnew(int, 2);
493 passed_fds[0] = passed_fds[1] = -1;
496 if ((e = getenv("PULSE_PASSED_FD"))) {
497 int passed_fd = atoi(e);
499 passed_fds[n_fds] = passed_fd;
502 /* We might be autospawned, in which case have no idea in which
503 * context we have been started. Let's cleanup our execution
504 * context as good as possible */
506 pa_reset_personality();
508 pa_close_allv(passed_fds);
509 pa_xfree(passed_fds);
514 setlocale(LC_ALL, "");
517 conf = pa_daemon_conf_new();
519 if (pa_daemon_conf_load(conf, NULL) < 0)
522 if (pa_daemon_conf_env(conf) < 0)
525 if (pa_cmdline_parse(conf, argc, argv, &d) < 0) {
526 pa_log(_("Failed to parse command line."));
530 if (conf->log_target)
531 pa_log_set_target(conf->log_target);
533 pa_log_target target = { .type = PA_LOG_STDERR, .file = NULL };
534 pa_log_set_target(&target);
537 pa_log_set_level(conf->log_level);
539 pa_log_set_flags(PA_LOG_PRINT_META, PA_LOG_SET);
541 pa_log_set_flags(PA_LOG_PRINT_TIME, PA_LOG_SET);
542 pa_log_set_show_backtrace(conf->log_backtrace);
545 /* conf->system_instance and conf->local_server_type control almost the
546 * same thing; make them agree about what is requested. */
547 switch (conf->local_server_type) {
548 case PA_SERVER_TYPE_UNSET:
549 conf->local_server_type = conf->system_instance ? PA_SERVER_TYPE_SYSTEM : PA_SERVER_TYPE_USER;
551 case PA_SERVER_TYPE_USER:
552 case PA_SERVER_TYPE_NONE:
553 conf->system_instance = false;
555 case PA_SERVER_TYPE_SYSTEM:
556 conf->system_instance = true;
559 pa_assert_not_reached();
562 start_server = conf->local_server_type == PA_SERVER_TYPE_USER || (getuid() == 0 && conf->local_server_type == PA_SERVER_TYPE_SYSTEM);
564 if (!start_server && conf->local_server_type == PA_SERVER_TYPE_SYSTEM) {
565 pa_log_notice(_("System mode refused for non-root user. Only starting the D-Bus server lookup service."));
566 conf->system_instance = false;
570 LTDL_SET_PRELOADED_SYMBOLS();
574 if (conf->dl_search_path)
575 lt_dlsetsearchpath(conf->dl_search_path);
580 WSAStartup(MAKEWORD(2, 0), &data);
587 case PA_CMD_DUMP_MODULES:
588 pa_dump_modules(conf, argc-d, argv+d);
592 case PA_CMD_DUMP_CONF: {
595 pa_log("Too many arguments.\n");
599 s = pa_daemon_conf_dump(conf);
606 case PA_CMD_DUMP_RESAMPLE_METHODS: {
610 pa_log("Too many arguments.\n");
614 for (i = 0; i < PA_RESAMPLER_MAX; i++)
615 if (pa_resample_method_supported(i))
616 printf("%s\n", pa_resample_method_to_string(i));
623 pa_cmdline_help(argv[0]);
627 case PA_CMD_VERSION :
630 pa_log("Too many arguments.\n");
634 printf(PACKAGE_NAME" "PACKAGE_VERSION"\n");
642 pa_log("Too many arguments.\n");
646 if (pa_pid_file_check_running(&pid, "pulseaudio") < 0)
647 pa_log_info(_("Daemon not running"));
649 pa_log_info(_("Daemon running as PID %u"), pid);
659 pa_log("Too many arguments.\n");
663 if (pa_pid_file_kill(SIGINT, NULL, "pulseaudio") < 0)
664 pa_log(_("Failed to kill daemon: %s"), pa_cstrerror(errno));
670 case PA_CMD_CLEANUP_SHM:
673 pa_log("Too many arguments.\n");
677 if (pa_shm_cleanup() >= 0)
683 pa_assert(conf->cmd == PA_CMD_DAEMON || conf->cmd == PA_CMD_START);
687 pa_log("Too many arguments.\n");
692 if (getuid() == 0 && !conf->system_instance)
693 pa_log_warn(_("This program is not intended to be run as root (unless --system is specified)."));
694 #ifndef HAVE_DBUS /* A similar, only a notice worthy check was done earlier, if D-Bus is enabled. */
695 else if (getuid() != 0 && conf->system_instance) {
696 pa_log(_("Root privileges required."));
700 #endif /* HAVE_GETUID */
702 if (conf->cmd == PA_CMD_START && conf->system_instance) {
703 pa_log(_("--start not supported for system instances."));
707 if (conf->cmd == PA_CMD_START && (configured_address = check_configured_address())) {
708 /* There is an server address in our config, but where did it come from?
709 * By default a standard X11 login will load module-x11-publish which will
710 * inject PULSE_SERVER X11 property. If the PA daemon crashes, we will end
711 * up hitting this code path. So we have to check to see if our configured_address
712 * is the same as the value that would go into this property so that we can
713 * recover (i.e. autospawn) from a crash.
716 bool start_anyway = false;
718 if ((ufn = pa_runtime_path(PA_NATIVE_DEFAULT_UNIX_SOCKET))) {
721 if ((id = pa_machine_id())) {
722 pa_strlist *server_list;
723 char formatted_ufn[256];
725 pa_snprintf(formatted_ufn, sizeof(formatted_ufn), "{%s}unix:%s", id, ufn);
728 if ((server_list = pa_strlist_parse(configured_address))) {
731 /* We only need to check the first server */
732 server_list = pa_strlist_pop(server_list, &u);
733 pa_strlist_free(server_list);
735 start_anyway = (u && pa_streq(formatted_ufn, u));
743 pa_log_notice(_("User-configured server at %s, refusing to start/autospawn."), configured_address);
744 pa_xfree(configured_address);
749 pa_log_notice(_("User-configured server at %s, which appears to be local. Probing deeper."), configured_address);
750 pa_xfree(configured_address);
753 if (conf->system_instance && !conf->disallow_exit)
754 pa_log_warn(_("Running in system mode, but --disallow-exit not set!"));
756 if (conf->system_instance && !conf->disallow_module_loading)
757 pa_log_warn(_("Running in system mode, but --disallow-module-loading not set!"));
759 if (conf->system_instance && !conf->disable_shm) {
760 pa_log_notice(_("Running in system mode, forcibly disabling SHM mode!"));
761 conf->disable_shm = true;
764 if (conf->system_instance && conf->exit_idle_time >= 0) {
765 pa_log_notice(_("Running in system mode, forcibly disabling exit idle time!"));
766 conf->exit_idle_time = -1;
769 if (conf->cmd == PA_CMD_START) {
770 /* If we shall start PA only when it is not running yet, we
771 * first take the autospawn lock to make things
774 if ((autospawn_fd = pa_autospawn_lock_init()) < 0) {
775 pa_log("Failed to initialize autospawn lock");
779 if ((pa_autospawn_lock_acquire(true) < 0)) {
780 pa_log("Failed to acquire autospawn lock");
784 autospawn_locked = true;
787 if (conf->daemonize) {
792 if (pa_stdio_acquire() < 0) {
793 pa_log(_("Failed to acquire stdio."));
798 if (pipe(daemon_pipe) < 0) {
799 pa_log(_("pipe() failed: %s"), pa_cstrerror(errno));
803 if ((child = fork()) < 0) {
804 pa_log(_("fork() failed: %s"), pa_cstrerror(errno));
805 pa_close_pipe(daemon_pipe);
813 pa_assert_se(pa_close(daemon_pipe[1]) == 0);
816 if ((n = pa_loop_read(daemon_pipe[0], &retval, sizeof(retval), NULL)) != sizeof(retval)) {
819 pa_log(_("read() failed: %s"), pa_cstrerror(errno));
825 pa_log(_("Daemon startup failed."));
827 pa_log_info(_("Daemon startup successful."));
832 if (autospawn_fd >= 0) {
833 /* The lock file is unlocked from the parent, so we need
834 * to close it in the child */
836 pa_autospawn_lock_release();
837 pa_autospawn_lock_done(true);
839 autospawn_locked = false;
843 pa_assert_se(pa_close(daemon_pipe[0]) == 0);
847 if (!conf->log_target) {
848 #ifdef HAVE_SYSTEMD_JOURNAL
849 pa_log_target target = { .type = PA_LOG_JOURNAL, .file = NULL };
851 pa_log_target target = { .type = PA_LOG_SYSLOG, .file = NULL };
853 pa_log_set_target(&target);
858 pa_log(_("setsid() failed: %s"), pa_cstrerror(errno));
864 /* We now are a session and process group leader. Let's fork
865 * again and let the father die, so that we'll become a
866 * process that can never acquire a TTY again, in a session and
867 * process group without leader */
869 if (pipe(daemon_pipe2) < 0) {
870 pa_log(_("pipe() failed: %s"), pa_cstrerror(errno));
874 if ((child = fork()) < 0) {
875 pa_log(_("fork() failed: %s"), pa_cstrerror(errno));
876 pa_close_pipe(daemon_pipe2);
884 pa_assert_se(pa_close(daemon_pipe2[1]) == 0);
885 daemon_pipe2[1] = -1;
887 if ((n = pa_loop_read(daemon_pipe2[0], &retval, sizeof(retval), NULL)) != sizeof(retval)) {
890 pa_log(_("read() failed: %s"), pa_cstrerror(errno));
895 /* We now have to take care of signalling the first fork with
896 * the return value we've received from this fork... */
897 pa_assert(daemon_pipe[1] >= 0);
899 pa_loop_write(daemon_pipe[1], &retval, sizeof(retval), NULL);
900 pa_close(daemon_pipe[1]);
906 pa_assert_se(pa_close(daemon_pipe2[0]) == 0);
907 daemon_pipe2[0] = -1;
909 /* We no longer need the (first) daemon_pipe as it's handled in our child above */
910 pa_close_pipe(daemon_pipe);
914 signal(SIGTTOU, SIG_IGN);
917 signal(SIGTTIN, SIG_IGN);
920 signal(SIGTSTP, SIG_IGN);
926 pa_set_env_and_record("PULSE_INTERNAL", "1");
927 pa_assert_se(chdir("/") == 0);
930 #ifdef HAVE_SYS_RESOURCE_H
931 set_all_rlimits(conf);
933 pa_rtclock_hrtimer_enable();
935 if (conf->high_priority)
936 pa_raise_priority(conf->nice_level);
938 if (conf->system_instance)
939 if (change_user() < 0)
942 pa_set_env_and_record("PULSE_SYSTEM", conf->system_instance ? "1" : "0");
944 pa_log_info(_("This is PulseAudio %s"), PACKAGE_VERSION);
945 pa_log_debug(_("Compilation host: %s"), CANONICAL_HOST);
946 pa_log_debug(_("Compilation CFLAGS: %s"), PA_CFLAGS);
948 s = pa_uname_string();
949 pa_log_debug(_("Running on host: %s"), s);
952 pa_log_debug(_("Found %u CPUs."), pa_ncpus());
954 pa_log_info(_("Page size is %lu bytes"), (unsigned long) PA_PAGE_SIZE);
956 #ifdef HAVE_VALGRIND_MEMCHECK_H
957 pa_log_debug(_("Compiled with Valgrind support: yes"));
959 pa_log_debug(_("Compiled with Valgrind support: no"));
962 pa_log_debug(_("Running in valgrind mode: %s"), pa_yes_no(pa_in_valgrind()));
964 pa_log_debug(_("Running in VM: %s"), pa_yes_no(pa_running_in_vm()));
967 pa_log_debug(_("Optimized build: yes"));
969 pa_log_debug(_("Optimized build: no"));
973 pa_log_debug(_("NDEBUG defined, all asserts disabled."));
974 #elif defined(FASTPATH)
975 pa_log_debug(_("FASTPATH defined, only fast path asserts disabled."));
977 pa_log_debug(_("All asserts enabled."));
980 if (!(s = pa_machine_id())) {
981 pa_log(_("Failed to get machine ID"));
984 pa_log_info(_("Machine ID is %s."), s);
987 if ((s = pa_session_id())) {
988 pa_log_info(_("Session ID is %s."), s);
992 if (!(s = pa_get_runtime_dir()))
994 pa_log_info(_("Using runtime directory %s."), s);
997 if (!(s = pa_get_state_dir()))
999 pa_log_info(_("Using state directory %s."), s);
1002 pa_log_info(_("Using modules directory %s."), conf->dl_search_path);
1004 pa_log_info(_("Running in system mode: %s"), pa_yes_no(pa_in_system_mode()));
1006 if (pa_in_system_mode())
1007 pa_log_warn(_("OK, so you are running PA in system mode. Please note that you most likely shouldn't be doing that.\n"
1008 "If you do it nonetheless then it's your own fault if things don't work as expected.\n"
1009 "Please read http://pulseaudio.org/wiki/WhatIsWrongWithSystemMode for an explanation why system mode is usually a bad idea."));
1011 if (conf->use_pid_file) {
1014 if ((z = pa_pid_file_create("pulseaudio")) != 0) {
1016 if (conf->cmd == PA_CMD_START && z > 0) {
1017 /* If we are already running and with are run in
1018 * --start mode, then let's return this as success. */
1024 pa_log(_("pa_pid_file_create() failed."));
1028 valid_pid_file = true;
1031 pa_disable_sigpipe();
1033 if (pa_rtclock_hrtimer())
1034 pa_log_info(_("Fresh high-resolution timers available! Bon appetit!"));
1036 pa_log_info(_("Dude, your kernel stinks! The chef's recommendation today is Linux with high-resolution timers enabled!"));
1038 if (conf->lock_memory) {
1039 #if defined(HAVE_SYS_MMAN_H) && !defined(__ANDROID__)
1040 if (mlockall(MCL_FUTURE) < 0)
1041 pa_log_warn("mlockall() failed: %s", pa_cstrerror(errno));
1043 pa_log_info("Successfully locked process into memory.");
1045 pa_log_warn("Memory locking requested but not supported on platform.");
1049 pa_memtrap_install();
1051 pa_assert_se(mainloop = pa_mainloop_new());
1053 if (!(c = pa_core_new(pa_mainloop_get_api(mainloop), !conf->disable_shm, conf->shm_size))) {
1054 pa_log(_("pa_core_new() failed."));
1058 c->default_sample_spec = conf->default_sample_spec;
1059 c->alternate_sample_rate = conf->alternate_sample_rate;
1060 c->default_channel_map = conf->default_channel_map;
1061 c->default_n_fragments = conf->default_n_fragments;
1062 c->default_fragment_size_msec = conf->default_fragment_size_msec;
1063 c->deferred_volume_safety_margin_usec = conf->deferred_volume_safety_margin_usec;
1064 c->deferred_volume_extra_delay_usec = conf->deferred_volume_extra_delay_usec;
1065 c->exit_idle_time = conf->exit_idle_time;
1066 c->scache_idle_time = conf->scache_idle_time;
1067 c->resample_method = conf->resample_method;
1068 c->realtime_priority = conf->realtime_priority;
1069 c->realtime_scheduling = !!conf->realtime_scheduling;
1070 c->disable_remixing = !!conf->disable_remixing;
1071 c->disable_lfe_remixing = !!conf->disable_lfe_remixing;
1072 c->deferred_volume = !!conf->deferred_volume;
1073 c->running_as_daemon = !!conf->daemonize;
1074 c->disallow_exit = conf->disallow_exit;
1075 c->flat_volumes = conf->flat_volumes;
1077 c->server_type = conf->local_server_type;
1080 c->cpu_info.cpu_type = PA_CPU_UNDEFINED;
1081 if (!getenv("PULSE_NO_SIMD")) {
1082 if (pa_cpu_init_x86(&(c->cpu_info.flags.x86)))
1083 c->cpu_info.cpu_type = PA_CPU_X86;
1084 if (pa_cpu_init_arm(&(c->cpu_info.flags.arm)))
1085 c->cpu_info.cpu_type = PA_CPU_ARM;
1086 pa_cpu_init_orc(c->cpu_info);
1089 pa_assert_se(pa_signal_init(pa_mainloop_get_api(mainloop)) == 0);
1090 pa_signal_new(SIGINT, signal_callback, c);
1091 pa_signal_new(SIGTERM, signal_callback, c);
1093 pa_signal_new(SIGUSR1, signal_callback, c);
1096 pa_signal_new(SIGUSR2, signal_callback, c);
1099 pa_signal_new(SIGHUP, signal_callback, c);
1103 win32_timer = pa_mainloop_get_api(mainloop)->time_new(pa_mainloop_get_api(mainloop), pa_gettimeofday(&win32_tv), message_cb, NULL);
1106 if (!conf->no_cpu_limit)
1107 pa_assert_se(pa_cpu_limit_init(pa_mainloop_get_api(mainloop)) == 0);
1109 buf = pa_strbuf_new();
1112 pa_assert_se(dbus_threads_init_default());
1116 if (conf->load_default_script_file) {
1119 if ((f = pa_daemon_conf_open_default_script_file(conf))) {
1120 r = pa_cli_command_execute_file_stream(c, f, buf, &conf->fail);
1126 r = pa_cli_command_execute(c, conf->script_commands, buf, &conf->fail);
1128 pa_log_error("%s", s = pa_strbuf_tostring_free(buf));
1131 if (r < 0 && conf->fail) {
1132 pa_log(_("Failed to initialize daemon."));
1136 if (!c->modules || pa_idxset_size(c->modules) == 0) {
1137 pa_log(_("Daemon startup without any loaded modules, refusing to work."));
1142 /* When we just provide the D-Bus server lookup service, we don't want
1143 * any modules to be loaded. We haven't loaded any so far, so one might
1144 * think there's no way to contact the server, but receiving certain
1145 * signals could still cause modules to load. */
1146 conf->disallow_module_loading = true;
1150 /* We completed the initial module loading, so let's disable it
1151 * from now on, if requested */
1152 c->disallow_module_loading = !!conf->disallow_module_loading;
1155 #if defined(__TIZEN__) && defined(SYSTEM_SERVER_LOOKUP)
1156 /* TIZEN pulseaudio is running as system mode currently, thus use SYSTEM BUS */
1157 if ((server_lookup = pa_dbusobj_server_lookup_new(c))) {
1158 if (!(lookup_service_bus = register_dbus_name(c, DBUS_BUS_SYSTEM, "org.PulseAudio1")))
1162 if (!conf->system_instance) {
1163 if ((server_lookup = pa_dbusobj_server_lookup_new(c))) {
1164 if (!(lookup_service_bus = register_dbus_name(c, DBUS_BUS_SESSION, "org.PulseAudio1")))
1171 server_bus = register_dbus_name(c, conf->system_instance ? DBUS_BUS_SYSTEM : DBUS_BUS_SESSION, "org.pulseaudio.Server");
1175 if (daemon_pipe2[1] >= 0) {
1177 pa_loop_write(daemon_pipe2[1], &ok, sizeof(ok), NULL);
1178 pa_close(daemon_pipe2[1]);
1179 daemon_pipe2[1] = -1;
1183 pa_log_info(_("Daemon startup complete."));
1184 /* broadcast if we're ready */
1185 creat(PA_READY, 0644);
1187 if (creat(PULSEAUDIO_READY, 0644) != -1)
1188 pa_log_warn("PULSEAUDIO_READY(%s) file was created", PULSEAUDIO_READY);
1190 pa_log_error("cannot create PULSEAUDIO_READY(/tmp/.pulseaudio_ready)");
1193 if (pa_mainloop_run(mainloop, &retval) < 0)
1196 pa_log_info(_("Daemon shutdown initiated."));
1201 pa_dbus_connection_unref(server_bus);
1202 if (lookup_service_bus)
1203 pa_dbus_connection_unref(lookup_service_bus);
1205 pa_dbusobj_server_lookup_free(server_lookup);
1208 if (autospawn_fd >= 0) {
1209 if (autospawn_locked)
1210 pa_autospawn_lock_release();
1212 pa_autospawn_lock_done(false);
1216 if (mainloop && win32_timer)
1217 pa_mainloop_get_api(mainloop)->time_free(win32_timer);
1221 /* Ensure all the modules/samples are unloaded when the core is still ref'ed,
1222 * as unlink callback hooks in modules may need the core to be ref'ed */
1223 pa_module_unload_all(c);
1224 pa_scache_free_all(c);
1227 pa_log_info(_("Daemon terminated."));
1230 if (!conf->no_cpu_limit)
1231 pa_cpu_limit_done();
1236 /* If we have daemon_pipe[1] still open, this means we've failed after
1237 * the first fork, but before the second. Therefore just write to it. */
1238 if (daemon_pipe[1] >= 0)
1239 pa_loop_write(daemon_pipe[1], &retval, sizeof(retval), NULL);
1240 else if (daemon_pipe2[1] >= 0)
1241 pa_loop_write(daemon_pipe2[1], &retval, sizeof(retval), NULL);
1243 pa_close_pipe(daemon_pipe2);
1244 pa_close_pipe(daemon_pipe);
1248 pa_mainloop_free(mainloop);
1251 pa_daemon_conf_free(conf);
1254 pa_pid_file_remove();
1256 /* This has no real purpose except making things valgrind-clean */
1257 pa_unset_env_recorded();