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>
102 #if defined (USE_PA_READY) && defined (USE_LWIPC)
106 #include "cpulimit.h"
107 #include "daemon-conf.h"
108 #include "dumpmodules.h"
110 #include "ltdl-bind-now.h"
111 #include "server-lookup.h"
116 #define PA_READY "pulseaudio_ready"
118 #define PA_READY "/tmp/.pa_ready"
121 #endif /* __TIZEN__ */
123 /* Only one instance of these variables */
124 int allow_severity = LOG_INFO;
125 int deny_severity = LOG_WARNING;
128 #ifdef HAVE_OSS_WRAPPER
129 /* padsp looks for this symbol in the running process and disables
130 * itself if it finds it and it is set to 7 (which is actually a bit
131 * mask). For details see padsp. */
132 int __padsp_disabled__ = 7;
137 static void message_cb(pa_mainloop_api*a, pa_time_event*e, const struct timeval *tv, void *userdata) {
139 struct timeval tvnext;
141 while (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)) {
142 if (msg.message == WM_QUIT)
145 TranslateMessage(&msg);
146 DispatchMessage(&msg);
150 pa_timeval_add(pa_gettimeofday(&tvnext), 100000);
151 a->time_restart(e, &tvnext);
156 static void signal_callback(pa_mainloop_api*m, pa_signal_event *e, int sig, void *userdata) {
157 pa_log_info(_("Got signal %s."), pa_sig2str(sig));
162 pa_module_load(userdata, "module-cli", NULL);
168 pa_module_load(userdata, "module-cli-protocol-unix", NULL);
174 char *c = pa_full_status_string(userdata);
175 pa_log_notice("%s", c);
184 pa_log_info(_("Exiting."));
190 #if defined(HAVE_PWD_H) && defined(HAVE_GRP_H)
192 static int change_user(void) {
197 /* This function is called only in system-wide mode. It creates a
198 * runtime dir in /var/run/ with proper UID/GID and drops privs
201 if (!(pw = getpwnam(PA_SYSTEM_USER))) {
202 pa_log(_("Failed to find user '%s'."), PA_SYSTEM_USER);
206 if (!(gr = getgrnam(PA_SYSTEM_GROUP))) {
207 pa_log(_("Failed to find group '%s'."), PA_SYSTEM_GROUP);
211 pa_log_info(_("Found user '%s' (UID %lu) and group '%s' (GID %lu)."),
212 PA_SYSTEM_USER, (unsigned long) pw->pw_uid,
213 PA_SYSTEM_GROUP, (unsigned long) gr->gr_gid);
215 if (pw->pw_gid != gr->gr_gid) {
216 pa_log(_("GID of user '%s' and of group '%s' don't match."), PA_SYSTEM_USER, PA_SYSTEM_GROUP);
220 if (!pa_streq(pw->pw_dir, PA_SYSTEM_RUNTIME_PATH))
221 pa_log_warn(_("Home directory of user '%s' is not '%s', ignoring."), PA_SYSTEM_USER, PA_SYSTEM_RUNTIME_PATH);
223 if (pa_make_secure_dir(PA_SYSTEM_RUNTIME_PATH, 0755, pw->pw_uid, gr->gr_gid, true) < 0) {
224 pa_log(_("Failed to create '%s': %s"), PA_SYSTEM_RUNTIME_PATH, pa_cstrerror(errno));
228 if (pa_make_secure_dir(PA_SYSTEM_STATE_PATH, 0700, pw->pw_uid, gr->gr_gid, true) < 0) {
229 pa_log(_("Failed to create '%s': %s"), PA_SYSTEM_STATE_PATH, pa_cstrerror(errno));
233 /* We don't create the config dir here, because we don't need to write to it */
235 if (initgroups(PA_SYSTEM_USER, gr->gr_gid) != 0) {
236 pa_log(_("Failed to change group list: %s"), pa_cstrerror(errno));
240 #if defined(HAVE_SETRESGID)
241 r = setresgid(gr->gr_gid, gr->gr_gid, gr->gr_gid);
242 #elif defined(HAVE_SETEGID)
243 if ((r = setgid(gr->gr_gid)) >= 0)
244 r = setegid(gr->gr_gid);
245 #elif defined(HAVE_SETREGID)
246 r = setregid(gr->gr_gid, gr->gr_gid);
248 #error "No API to drop privileges"
252 pa_log(_("Failed to change GID: %s"), pa_cstrerror(errno));
256 #if defined(HAVE_SETRESUID)
257 r = setresuid(pw->pw_uid, pw->pw_uid, pw->pw_uid);
258 #elif defined(HAVE_SETEUID)
259 if ((r = setuid(pw->pw_uid)) >= 0)
260 r = seteuid(pw->pw_uid);
261 #elif defined(HAVE_SETREUID)
262 r = setreuid(pw->pw_uid, pw->pw_uid);
264 #error "No API to drop privileges"
268 pa_log(_("Failed to change UID: %s"), pa_cstrerror(errno));
274 pa_set_env("USER", PA_SYSTEM_USER);
275 pa_set_env("USERNAME", PA_SYSTEM_USER);
276 pa_set_env("LOGNAME", PA_SYSTEM_USER);
277 pa_set_env("HOME", PA_SYSTEM_RUNTIME_PATH);
279 /* Relevant for pa_runtime_path() */
280 if (!getenv("PULSE_RUNTIME_PATH"))
281 pa_set_env("PULSE_RUNTIME_PATH", PA_SYSTEM_RUNTIME_PATH);
283 if (!getenv("PULSE_CONFIG_PATH"))
284 pa_set_env("PULSE_CONFIG_PATH", PA_SYSTEM_CONFIG_PATH);
286 if (!getenv("PULSE_STATE_PATH"))
287 pa_set_env("PULSE_STATE_PATH", PA_SYSTEM_STATE_PATH);
289 pa_log_info(_("Successfully changed user to \"" PA_SYSTEM_USER "\"."));
294 #else /* HAVE_PWD_H && HAVE_GRP_H */
296 static int change_user(void) {
297 pa_log(_("System wide mode unsupported on this platform."));
301 #endif /* HAVE_PWD_H && HAVE_GRP_H */
303 #ifdef HAVE_SYS_RESOURCE_H
305 static int set_one_rlimit(const pa_rlimit *r, int resource, const char *name) {
312 rl.rlim_cur = rl.rlim_max = r->value;
314 if (setrlimit(resource, &rl) < 0) {
315 pa_log_info(_("setrlimit(%s, (%u, %u)) failed: %s"), name, (unsigned) r->value, (unsigned) r->value, pa_cstrerror(errno));
322 static void set_all_rlimits(const pa_daemon_conf *conf) {
323 set_one_rlimit(&conf->rlimit_fsize, RLIMIT_FSIZE, "RLIMIT_FSIZE");
324 set_one_rlimit(&conf->rlimit_data, RLIMIT_DATA, "RLIMIT_DATA");
325 set_one_rlimit(&conf->rlimit_stack, RLIMIT_STACK, "RLIMIT_STACK");
326 set_one_rlimit(&conf->rlimit_core, RLIMIT_CORE, "RLIMIT_CORE");
328 set_one_rlimit(&conf->rlimit_rss, RLIMIT_RSS, "RLIMIT_RSS");
331 set_one_rlimit(&conf->rlimit_nproc, RLIMIT_NPROC, "RLIMIT_NPROC");
334 set_one_rlimit(&conf->rlimit_nofile, RLIMIT_NOFILE, "RLIMIT_NOFILE");
336 #ifdef RLIMIT_MEMLOCK
337 set_one_rlimit(&conf->rlimit_memlock, RLIMIT_MEMLOCK, "RLIMIT_MEMLOCK");
340 set_one_rlimit(&conf->rlimit_as, RLIMIT_AS, "RLIMIT_AS");
343 set_one_rlimit(&conf->rlimit_locks, RLIMIT_LOCKS, "RLIMIT_LOCKS");
345 #ifdef RLIMIT_SIGPENDING
346 set_one_rlimit(&conf->rlimit_sigpending, RLIMIT_SIGPENDING, "RLIMIT_SIGPENDING");
348 #ifdef RLIMIT_MSGQUEUE
349 set_one_rlimit(&conf->rlimit_msgqueue, RLIMIT_MSGQUEUE, "RLIMIT_MSGQUEUE");
352 set_one_rlimit(&conf->rlimit_nice, RLIMIT_NICE, "RLIMIT_NICE");
355 set_one_rlimit(&conf->rlimit_rtprio, RLIMIT_RTPRIO, "RLIMIT_RTPRIO");
358 set_one_rlimit(&conf->rlimit_rttime, RLIMIT_RTTIME, "RLIMIT_RTTIME");
363 static char *check_configured_address(void) {
364 char *default_server = NULL;
365 pa_client_conf *c = pa_client_conf_new();
367 pa_client_conf_load(c, NULL);
369 pa_client_conf_from_x11(c, NULL);
371 pa_client_conf_env(c);
373 if (c->default_server && *c->default_server)
374 default_server = pa_xstrdup(c->default_server);
376 pa_client_conf_free(c);
378 return default_server;
382 static pa_dbus_connection *register_dbus_name(pa_core *c, DBusBusType bus, const char* name) {
384 pa_dbus_connection *conn;
386 dbus_error_init(&error);
388 if (!(conn = pa_dbus_bus_get(c, bus, &error)) || dbus_error_is_set(&error)) {
389 pa_log_warn("Unable to contact D-Bus: %s: %s", error.name, error.message);
393 if (dbus_bus_request_name(pa_dbus_connection_get(conn), name, DBUS_NAME_FLAG_DO_NOT_QUEUE, &error) == DBUS_REQUEST_NAME_REPLY_PRIMARY_OWNER) {
394 pa_log_debug("Got %s!", name);
398 if (dbus_error_is_set(&error))
399 pa_log_error("Failed to acquire %s: %s: %s", name, error.name, error.message);
401 pa_log_error("D-Bus name %s already taken.", name);
403 /* PA cannot be started twice by the same user and hence we can
404 * ignore mostly the case that a name is already taken. */
408 pa_dbus_connection_unref(conn);
410 dbus_error_free(&error);
415 int main(int argc, char *argv[]) {
417 pa_strbuf *buf = NULL;
418 pa_daemon_conf *conf = NULL;
419 pa_mainloop *mainloop = NULL;
421 char *configured_address;
422 int r = 0, retval = 1, d = 0;
423 bool valid_pid_file = false;
424 bool ltdl_init = false;
425 int n_fds = 0, *passed_fds = NULL;
428 int daemon_pipe[2] = { -1, -1 };
429 int daemon_pipe2[2] = { -1, -1 };
432 pa_time_event *win32_timer;
433 struct timeval win32_tv;
435 int autospawn_fd = -1;
436 bool autospawn_locked = false;
438 pa_dbusobj_server_lookup *server_lookup = NULL; /* /org/pulseaudio/server_lookup */
439 pa_dbus_connection *lookup_service_bus = NULL; /* Always the user bus. */
440 pa_dbus_connection *server_bus = NULL; /* The bus where we reserve org.pulseaudio.Server, either the user or the system bus. */
445 #if defined(USE_PA_READY) && !defined(USE_LWIPC)
446 int fd_pa_ready = -1;
448 #endif /* __TIZEN__ */
450 pa_log_set_ident("pulseaudio");
451 pa_log_set_level(PA_LOG_NOTICE);
452 pa_log_set_flags(PA_LOG_COLORS|PA_LOG_PRINT_FILE|PA_LOG_PRINT_LEVEL, PA_LOG_RESET);
454 #if defined(__linux__) && defined(__OPTIMIZE__)
456 Disable lazy relocations to make usage of external libraries
457 more deterministic for our RT threads. We abuse __OPTIMIZE__ as
458 a check whether we are a debug build or not. This all is
459 admittedly a bit snake-oilish.
462 if (!getenv("LD_BIND_NOW")) {
466 /* We have to execute ourselves, because the libc caches the
467 * value of $LD_BIND_NOW on initialization. */
469 pa_set_env("LD_BIND_NOW", "1");
471 if ((canonical_rp = pa_realpath(PA_BINARY))) {
473 if ((rp = pa_readlink("/proc/self/exe"))) {
475 if (pa_streq(rp, canonical_rp))
476 pa_assert_se(execv(rp, argv) == 0);
478 pa_log_warn("/proc/self/exe does not point to %s, cannot self execute. Are you playing games?", canonical_rp);
483 pa_log_warn("Couldn't read /proc/self/exe, cannot self execute. Running in a chroot()?");
485 pa_xfree(canonical_rp);
488 pa_log_warn("Couldn't canonicalize binary path, cannot self execute.");
492 #ifdef HAVE_SYSTEMD_DAEMON
493 n_fds = sd_listen_fds(0);
497 passed_fds = pa_xnew(int, n_fds+2);
498 passed_fds[n_fds] = passed_fds[n_fds+1] = -1;
500 passed_fds[i] = SD_LISTEN_FDS_START + i;
506 passed_fds = pa_xnew(int, 2);
507 passed_fds[0] = passed_fds[1] = -1;
510 if ((e = getenv("PULSE_PASSED_FD"))) {
511 int passed_fd = atoi(e);
513 passed_fds[n_fds] = passed_fd;
516 /* We might be autospawned, in which case have no idea in which
517 * context we have been started. Let's cleanup our execution
518 * context as good as possible */
520 pa_reset_personality();
522 pa_close_allv(passed_fds);
523 pa_xfree(passed_fds);
528 setlocale(LC_ALL, "");
531 conf = pa_daemon_conf_new();
533 if (pa_daemon_conf_load(conf, NULL) < 0)
536 if (pa_daemon_conf_env(conf) < 0)
539 if (pa_cmdline_parse(conf, argc, argv, &d) < 0) {
540 pa_log(_("Failed to parse command line."));
544 if (conf->log_target)
545 pa_log_set_target(conf->log_target);
547 pa_log_target target = { .type = PA_LOG_STDERR, .file = NULL };
548 pa_log_set_target(&target);
551 pa_log_set_level(conf->log_level);
553 pa_log_set_flags(PA_LOG_PRINT_META, PA_LOG_SET);
555 pa_log_set_flags(PA_LOG_PRINT_TIME, PA_LOG_SET);
556 pa_log_set_show_backtrace(conf->log_backtrace);
559 /* conf->system_instance and conf->local_server_type control almost the
560 * same thing; make them agree about what is requested. */
561 switch (conf->local_server_type) {
562 case PA_SERVER_TYPE_UNSET:
563 conf->local_server_type = conf->system_instance ? PA_SERVER_TYPE_SYSTEM : PA_SERVER_TYPE_USER;
565 case PA_SERVER_TYPE_USER:
566 case PA_SERVER_TYPE_NONE:
567 conf->system_instance = false;
569 case PA_SERVER_TYPE_SYSTEM:
570 conf->system_instance = true;
573 pa_assert_not_reached();
576 start_server = conf->local_server_type == PA_SERVER_TYPE_USER || (getuid() == 0 && conf->local_server_type == PA_SERVER_TYPE_SYSTEM);
578 if (!start_server && conf->local_server_type == PA_SERVER_TYPE_SYSTEM) {
579 pa_log_notice(_("System mode refused for non-root user. Only starting the D-Bus server lookup service."));
580 conf->system_instance = false;
584 LTDL_SET_PRELOADED_SYMBOLS();
588 if (conf->dl_search_path)
589 lt_dlsetsearchpath(conf->dl_search_path);
594 WSAStartup(MAKEWORD(2, 0), &data);
601 case PA_CMD_DUMP_MODULES:
602 pa_dump_modules(conf, argc-d, argv+d);
606 case PA_CMD_DUMP_CONF: {
609 pa_log("Too many arguments.\n");
613 s = pa_daemon_conf_dump(conf);
620 case PA_CMD_DUMP_RESAMPLE_METHODS: {
624 pa_log("Too many arguments.\n");
628 for (i = 0; i < PA_RESAMPLER_MAX; i++)
629 if (pa_resample_method_supported(i))
630 printf("%s\n", pa_resample_method_to_string(i));
637 pa_cmdline_help(argv[0]);
641 case PA_CMD_VERSION :
644 pa_log("Too many arguments.\n");
648 printf(PACKAGE_NAME" "PACKAGE_VERSION"\n");
656 pa_log("Too many arguments.\n");
660 if (pa_pid_file_check_running(&pid, "pulseaudio") < 0)
661 pa_log_info(_("Daemon not running"));
663 pa_log_info(_("Daemon running as PID %u"), pid);
673 pa_log("Too many arguments.\n");
677 if (pa_pid_file_kill(SIGINT, NULL, "pulseaudio") < 0)
678 pa_log(_("Failed to kill daemon: %s"), pa_cstrerror(errno));
684 case PA_CMD_CLEANUP_SHM:
687 pa_log("Too many arguments.\n");
691 if (pa_shm_cleanup() >= 0)
697 pa_assert(conf->cmd == PA_CMD_DAEMON || conf->cmd == PA_CMD_START);
701 pa_log("Too many arguments.\n");
706 if (getuid() == 0 && !conf->system_instance)
707 pa_log_warn(_("This program is not intended to be run as root (unless --system is specified)."));
708 #ifndef HAVE_DBUS /* A similar, only a notice worthy check was done earlier, if D-Bus is enabled. */
709 else if (getuid() != 0 && conf->system_instance) {
710 pa_log(_("Root privileges required."));
714 #endif /* HAVE_GETUID */
716 if (conf->cmd == PA_CMD_START && conf->system_instance) {
717 pa_log(_("--start not supported for system instances."));
721 if (conf->cmd == PA_CMD_START && (configured_address = check_configured_address())) {
722 /* There is an server address in our config, but where did it come from?
723 * By default a standard X11 login will load module-x11-publish which will
724 * inject PULSE_SERVER X11 property. If the PA daemon crashes, we will end
725 * up hitting this code path. So we have to check to see if our configured_address
726 * is the same as the value that would go into this property so that we can
727 * recover (i.e. autospawn) from a crash.
730 bool start_anyway = false;
732 if ((ufn = pa_runtime_path(PA_NATIVE_DEFAULT_UNIX_SOCKET))) {
735 if ((id = pa_machine_id())) {
736 pa_strlist *server_list;
737 char formatted_ufn[256];
739 pa_snprintf(formatted_ufn, sizeof(formatted_ufn), "{%s}unix:%s", id, ufn);
742 if ((server_list = pa_strlist_parse(configured_address))) {
745 /* We only need to check the first server */
746 server_list = pa_strlist_pop(server_list, &u);
747 pa_strlist_free(server_list);
749 start_anyway = (u && pa_streq(formatted_ufn, u));
757 pa_log_notice(_("User-configured server at %s, refusing to start/autospawn."), configured_address);
758 pa_xfree(configured_address);
763 pa_log_notice(_("User-configured server at %s, which appears to be local. Probing deeper."), configured_address);
764 pa_xfree(configured_address);
767 if (conf->system_instance && !conf->disallow_exit)
768 pa_log_warn(_("Running in system mode, but --disallow-exit not set!"));
770 if (conf->system_instance && !conf->disallow_module_loading)
771 pa_log_warn(_("Running in system mode, but --disallow-module-loading not set!"));
773 if (conf->system_instance && !conf->disable_shm) {
774 pa_log_notice(_("Running in system mode, forcibly disabling SHM mode!"));
775 conf->disable_shm = true;
778 if (conf->system_instance && conf->exit_idle_time >= 0) {
779 pa_log_notice(_("Running in system mode, forcibly disabling exit idle time!"));
780 conf->exit_idle_time = -1;
783 if (conf->cmd == PA_CMD_START) {
784 /* If we shall start PA only when it is not running yet, we
785 * first take the autospawn lock to make things
788 if ((autospawn_fd = pa_autospawn_lock_init()) < 0) {
789 pa_log("Failed to initialize autospawn lock");
793 if ((pa_autospawn_lock_acquire(true) < 0)) {
794 pa_log("Failed to acquire autospawn lock");
798 autospawn_locked = true;
801 if (conf->daemonize) {
806 if (pa_stdio_acquire() < 0) {
807 pa_log(_("Failed to acquire stdio."));
812 if (pipe(daemon_pipe) < 0) {
813 pa_log(_("pipe() failed: %s"), pa_cstrerror(errno));
817 if ((child = fork()) < 0) {
818 pa_log(_("fork() failed: %s"), pa_cstrerror(errno));
819 pa_close_pipe(daemon_pipe);
827 pa_assert_se(pa_close(daemon_pipe[1]) == 0);
830 if ((n = pa_loop_read(daemon_pipe[0], &retval, sizeof(retval), NULL)) != sizeof(retval)) {
833 pa_log(_("read() failed: %s"), pa_cstrerror(errno));
839 pa_log(_("Daemon startup failed."));
841 pa_log_info(_("Daemon startup successful."));
846 if (autospawn_fd >= 0) {
847 /* The lock file is unlocked from the parent, so we need
848 * to close it in the child */
850 pa_autospawn_lock_release();
851 pa_autospawn_lock_done(true);
853 autospawn_locked = false;
857 pa_assert_se(pa_close(daemon_pipe[0]) == 0);
861 if (!conf->log_target) {
862 #ifdef HAVE_SYSTEMD_JOURNAL
863 pa_log_target target = { .type = PA_LOG_JOURNAL, .file = NULL };
865 pa_log_target target = { .type = PA_LOG_SYSLOG, .file = NULL };
867 pa_log_set_target(&target);
872 pa_log(_("setsid() failed: %s"), pa_cstrerror(errno));
878 /* We now are a session and process group leader. Let's fork
879 * again and let the father die, so that we'll become a
880 * process that can never acquire a TTY again, in a session and
881 * process group without leader */
883 if (pipe(daemon_pipe2) < 0) {
884 pa_log(_("pipe() failed: %s"), pa_cstrerror(errno));
888 if ((child = fork()) < 0) {
889 pa_log(_("fork() failed: %s"), pa_cstrerror(errno));
890 pa_close_pipe(daemon_pipe2);
898 pa_assert_se(pa_close(daemon_pipe2[1]) == 0);
899 daemon_pipe2[1] = -1;
901 if ((n = pa_loop_read(daemon_pipe2[0], &retval, sizeof(retval), NULL)) != sizeof(retval)) {
904 pa_log(_("read() failed: %s"), pa_cstrerror(errno));
909 /* We now have to take care of signalling the first fork with
910 * the return value we've received from this fork... */
911 pa_assert(daemon_pipe[1] >= 0);
913 pa_loop_write(daemon_pipe[1], &retval, sizeof(retval), NULL);
914 pa_close(daemon_pipe[1]);
920 pa_assert_se(pa_close(daemon_pipe2[0]) == 0);
921 daemon_pipe2[0] = -1;
923 /* We no longer need the (first) daemon_pipe as it's handled in our child above */
924 pa_close_pipe(daemon_pipe);
928 signal(SIGTTOU, SIG_IGN);
931 signal(SIGTTIN, SIG_IGN);
934 signal(SIGTSTP, SIG_IGN);
940 pa_set_env_and_record("PULSE_INTERNAL", "1");
941 pa_assert_se(chdir("/") == 0);
944 #ifdef HAVE_SYS_RESOURCE_H
945 set_all_rlimits(conf);
947 pa_rtclock_hrtimer_enable();
949 if (conf->high_priority)
950 pa_raise_priority(conf->nice_level);
952 if (conf->system_instance)
953 if (change_user() < 0)
956 pa_set_env_and_record("PULSE_SYSTEM", conf->system_instance ? "1" : "0");
958 pa_log_info(_("This is PulseAudio %s"), PACKAGE_VERSION);
959 pa_log_debug(_("Compilation host: %s"), CANONICAL_HOST);
960 pa_log_debug(_("Compilation CFLAGS: %s"), PA_CFLAGS);
962 s = pa_uname_string();
963 pa_log_debug(_("Running on host: %s"), s);
966 pa_log_debug(_("Found %u CPUs."), pa_ncpus());
968 pa_log_info(_("Page size is %lu bytes"), (unsigned long) PA_PAGE_SIZE);
970 #ifdef HAVE_VALGRIND_MEMCHECK_H
971 pa_log_debug(_("Compiled with Valgrind support: yes"));
973 pa_log_debug(_("Compiled with Valgrind support: no"));
976 pa_log_debug(_("Running in valgrind mode: %s"), pa_yes_no(pa_in_valgrind()));
978 pa_log_debug(_("Running in VM: %s"), pa_yes_no(pa_running_in_vm()));
981 pa_log_debug(_("Optimized build: yes"));
983 pa_log_debug(_("Optimized build: no"));
987 pa_log_debug(_("NDEBUG defined, all asserts disabled."));
988 #elif defined(FASTPATH)
989 pa_log_debug(_("FASTPATH defined, only fast path asserts disabled."));
991 pa_log_debug(_("All asserts enabled."));
994 if (!(s = pa_machine_id())) {
995 pa_log(_("Failed to get machine ID"));
998 pa_log_info(_("Machine ID is %s."), s);
1001 if ((s = pa_session_id())) {
1002 pa_log_info(_("Session ID is %s."), s);
1006 if (!(s = pa_get_runtime_dir()))
1008 pa_log_info(_("Using runtime directory %s."), s);
1011 if (!(s = pa_get_state_dir()))
1013 pa_log_info(_("Using state directory %s."), s);
1016 pa_log_info(_("Using modules directory %s."), conf->dl_search_path);
1018 pa_log_info(_("Running in system mode: %s"), pa_yes_no(pa_in_system_mode()));
1020 if (pa_in_system_mode())
1021 pa_log_warn(_("OK, so you are running PA in system mode. Please note that you most likely shouldn't be doing that.\n"
1022 "If you do it nonetheless then it's your own fault if things don't work as expected.\n"
1023 "Please read http://pulseaudio.org/wiki/WhatIsWrongWithSystemMode for an explanation why system mode is usually a bad idea."));
1025 if (conf->use_pid_file) {
1028 if ((z = pa_pid_file_create("pulseaudio")) != 0) {
1030 if (conf->cmd == PA_CMD_START && z > 0) {
1031 /* If we are already running and with are run in
1032 * --start mode, then let's return this as success. */
1038 pa_log(_("pa_pid_file_create() failed."));
1042 valid_pid_file = true;
1045 pa_disable_sigpipe();
1047 if (pa_rtclock_hrtimer())
1048 pa_log_info(_("Fresh high-resolution timers available! Bon appetit!"));
1050 pa_log_info(_("Dude, your kernel stinks! The chef's recommendation today is Linux with high-resolution timers enabled!"));
1052 if (conf->lock_memory) {
1053 #if defined(HAVE_SYS_MMAN_H) && !defined(__ANDROID__)
1054 if (mlockall(MCL_FUTURE) < 0)
1055 pa_log_warn("mlockall() failed: %s", pa_cstrerror(errno));
1057 pa_log_info("Successfully locked process into memory.");
1059 pa_log_warn("Memory locking requested but not supported on platform.");
1063 pa_memtrap_install();
1065 pa_assert_se(mainloop = pa_mainloop_new());
1067 if (!(c = pa_core_new(pa_mainloop_get_api(mainloop), !conf->disable_shm, conf->shm_size))) {
1068 pa_log(_("pa_core_new() failed."));
1072 c->default_sample_spec = conf->default_sample_spec;
1073 c->alternate_sample_rate = conf->alternate_sample_rate;
1074 c->default_channel_map = conf->default_channel_map;
1075 c->default_n_fragments = conf->default_n_fragments;
1076 c->default_fragment_size_msec = conf->default_fragment_size_msec;
1077 c->deferred_volume_safety_margin_usec = conf->deferred_volume_safety_margin_usec;
1078 c->deferred_volume_extra_delay_usec = conf->deferred_volume_extra_delay_usec;
1079 c->exit_idle_time = conf->exit_idle_time;
1080 c->scache_idle_time = conf->scache_idle_time;
1081 c->resample_method = conf->resample_method;
1082 c->realtime_priority = conf->realtime_priority;
1083 c->realtime_scheduling = !!conf->realtime_scheduling;
1084 c->disable_remixing = !!conf->disable_remixing;
1085 c->disable_lfe_remixing = !!conf->disable_lfe_remixing;
1086 c->deferred_volume = !!conf->deferred_volume;
1087 c->running_as_daemon = !!conf->daemonize;
1088 c->disallow_exit = conf->disallow_exit;
1089 c->flat_volumes = conf->flat_volumes;
1091 c->server_type = conf->local_server_type;
1095 c->zero_pop_threshold = conf->zero_pop_threshold;
1098 c->cpu_info.cpu_type = PA_CPU_UNDEFINED;
1099 if (!getenv("PULSE_NO_SIMD")) {
1100 if (pa_cpu_init_x86(&(c->cpu_info.flags.x86)))
1101 c->cpu_info.cpu_type = PA_CPU_X86;
1102 if (pa_cpu_init_arm(&(c->cpu_info.flags.arm)))
1103 c->cpu_info.cpu_type = PA_CPU_ARM;
1104 pa_cpu_init_orc(c->cpu_info);
1107 pa_assert_se(pa_signal_init(pa_mainloop_get_api(mainloop)) == 0);
1108 pa_signal_new(SIGINT, signal_callback, c);
1109 pa_signal_new(SIGTERM, signal_callback, c);
1111 pa_signal_new(SIGUSR1, signal_callback, c);
1114 pa_signal_new(SIGUSR2, signal_callback, c);
1117 pa_signal_new(SIGHUP, signal_callback, c);
1121 win32_timer = pa_mainloop_get_api(mainloop)->time_new(pa_mainloop_get_api(mainloop), pa_gettimeofday(&win32_tv), message_cb, NULL);
1124 if (!conf->no_cpu_limit)
1125 pa_assert_se(pa_cpu_limit_init(pa_mainloop_get_api(mainloop)) == 0);
1127 buf = pa_strbuf_new();
1130 pa_assert_se(dbus_threads_init_default());
1134 if (conf->load_default_script_file) {
1137 if ((f = pa_daemon_conf_open_default_script_file(conf))) {
1138 r = pa_cli_command_execute_file_stream(c, f, buf, &conf->fail);
1144 r = pa_cli_command_execute(c, conf->script_commands, buf, &conf->fail);
1146 pa_log_error("%s", s = pa_strbuf_tostring_free(buf));
1149 if (r < 0 && conf->fail) {
1150 pa_log(_("Failed to initialize daemon."));
1154 if (!c->modules || pa_idxset_size(c->modules) == 0) {
1155 pa_log(_("Daemon startup without any loaded modules, refusing to work."));
1160 /* When we just provide the D-Bus server lookup service, we don't want
1161 * any modules to be loaded. We haven't loaded any so far, so one might
1162 * think there's no way to contact the server, but receiving certain
1163 * signals could still cause modules to load. */
1164 conf->disallow_module_loading = true;
1168 /* We completed the initial module loading, so let's disable it
1169 * from now on, if requested */
1170 c->disallow_module_loading = !!conf->disallow_module_loading;
1173 #if defined(__TIZEN__) && defined(SYSTEM_SERVER_LOOKUP)
1174 /* TIZEN pulseaudio is running as system mode currently, thus use SYSTEM BUS */
1175 if ((server_lookup = pa_dbusobj_server_lookup_new(c))) {
1176 if (!(lookup_service_bus = register_dbus_name(c, DBUS_BUS_SYSTEM, "org.PulseAudio1")))
1180 if (!conf->system_instance) {
1181 if ((server_lookup = pa_dbusobj_server_lookup_new(c))) {
1182 if (!(lookup_service_bus = register_dbus_name(c, DBUS_BUS_SESSION, "org.PulseAudio1")))
1189 server_bus = register_dbus_name(c, conf->system_instance ? DBUS_BUS_SYSTEM : DBUS_BUS_SESSION, "org.pulseaudio.Server");
1193 if (daemon_pipe2[1] >= 0) {
1195 pa_loop_write(daemon_pipe2[1], &ok, sizeof(ok), NULL);
1196 pa_close(daemon_pipe2[1]);
1197 daemon_pipe2[1] = -1;
1201 pa_log_info(_("Daemon startup complete."));
1203 /* broadcast if we're ready */
1206 if (LwipcEventDone(PA_READY) < 0)
1207 pa_log_error("cannot create PULSEAUDIO_READY(pulseaudio_ready)");
1209 pa_log_warn("PULSEAUDIO_READY(%s) event was created", PA_READY);
1211 if ((fd_pa_ready = creat(PA_READY, 0644)) != -1)
1215 #endif /* __TIZEN__ */
1217 if (pa_mainloop_run(mainloop, &retval) < 0)
1220 pa_log_info(_("Daemon shutdown initiated."));
1225 pa_dbus_connection_unref(server_bus);
1226 if (lookup_service_bus)
1227 pa_dbus_connection_unref(lookup_service_bus);
1229 pa_dbusobj_server_lookup_free(server_lookup);
1232 if (autospawn_fd >= 0) {
1233 if (autospawn_locked)
1234 pa_autospawn_lock_release();
1236 pa_autospawn_lock_done(false);
1240 if (mainloop && win32_timer)
1241 pa_mainloop_get_api(mainloop)->time_free(win32_timer);
1245 /* Ensure all the modules/samples are unloaded when the core is still ref'ed,
1246 * as unlink callback hooks in modules may need the core to be ref'ed */
1247 pa_module_unload_all(c);
1248 pa_scache_free_all(c);
1251 pa_log_info(_("Daemon terminated."));
1254 if (!conf->no_cpu_limit)
1255 pa_cpu_limit_done();
1260 /* If we have daemon_pipe[1] still open, this means we've failed after
1261 * the first fork, but before the second. Therefore just write to it. */
1262 if (daemon_pipe[1] >= 0)
1263 pa_loop_write(daemon_pipe[1], &retval, sizeof(retval), NULL);
1264 else if (daemon_pipe2[1] >= 0)
1265 pa_loop_write(daemon_pipe2[1], &retval, sizeof(retval), NULL);
1267 pa_close_pipe(daemon_pipe2);
1268 pa_close_pipe(daemon_pipe);
1272 pa_mainloop_free(mainloop);
1275 pa_daemon_conf_free(conf);
1278 pa_pid_file_remove();
1280 /* This has no real purpose except making things valgrind-clean */
1281 pa_unset_env_recorded();