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, see <http://www.gnu.org/licenses/>.
36
#include <sys/types.h>
39
#ifdef HAVE_SYS_MMAN_H
56
#include <dbus/dbus.h>
59
#ifdef HAVE_SYSTEMD_DAEMON
60
#include <systemd/sd-daemon.h>
63
#include <pulse/client-conf.h>
64
#include <pulse/mainloop.h>
65
#include <pulse/mainloop-signal.h>
66
#include <pulse/timeval.h>
67
#include <pulse/xmalloc.h>
69
#include <pulsecore/i18n.h>
70
#include <pulsecore/lock-autospawn.h>
71
#include <pulsecore/socket.h>
72
#include <pulsecore/core-error.h>
73
#include <pulsecore/core-rtclock.h>
74
#include <pulsecore/core-scache.h>
75
#include <pulsecore/core.h>
76
#include <pulsecore/inotify-wrapper.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.h>
96
#include "daemon-conf.h"
97
#include "dumpmodules.h"
99
#include "ltdl-bind-now.h"
100
#include "server-lookup.h"
103
/* Only one instance of these variables */
104
int allow_severity = LOG_INFO;
105
int deny_severity = LOG_WARNING;
108
#ifdef HAVE_OSS_WRAPPER
109
/* padsp looks for this symbol in the running process and disables
110
* itself if it finds it and it is set to 7 (which is actually a bit
111
* mask). For details see padsp. */
112
int __padsp_disabled__ = 7;
115
static void signal_callback(pa_mainloop_api*m, pa_signal_event *e, int sig, void *userdata) {
116
pa_log_info("Got signal %s.", pa_sig2str(sig));
121
pa_module_load(userdata, "module-cli", NULL);
127
pa_module_load(userdata, "module-cli-protocol-unix", NULL);
133
char *c = pa_full_status_string(userdata);
134
pa_log_notice("%s", c);
143
pa_log_info("Exiting.");
149
#if defined(HAVE_PWD_H) && defined(HAVE_GRP_H)
151
static int change_user(void) {
156
/* This function is called only in system-wide mode. It creates a
157
* runtime dir in /var/run/ with proper UID/GID and drops privs
160
if (!(pw = getpwnam(PA_SYSTEM_USER))) {
161
pa_log(_("Failed to find user '%s'."), PA_SYSTEM_USER);
165
if (!(gr = getgrnam(PA_SYSTEM_GROUP))) {
166
pa_log(_("Failed to find group '%s'."), PA_SYSTEM_GROUP);
170
pa_log_info("Found user '%s' (UID %lu) and group '%s' (GID %lu).",
171
PA_SYSTEM_USER, (unsigned long) pw->pw_uid,
172
PA_SYSTEM_GROUP, (unsigned long) gr->gr_gid);
174
if (pw->pw_gid != gr->gr_gid) {
175
pa_log(_("GID of user '%s' and of group '%s' don't match."), PA_SYSTEM_USER, PA_SYSTEM_GROUP);
179
if (!pa_streq(pw->pw_dir, PA_SYSTEM_RUNTIME_PATH))
180
pa_log_warn(_("Home directory of user '%s' is not '%s', ignoring."), PA_SYSTEM_USER, PA_SYSTEM_RUNTIME_PATH);
182
if (pa_make_secure_dir(PA_SYSTEM_RUNTIME_PATH, 0755, pw->pw_uid, gr->gr_gid, true) < 0) {
183
pa_log(_("Failed to create '%s': %s"), PA_SYSTEM_RUNTIME_PATH, pa_cstrerror(errno));
187
if (pa_make_secure_dir(PA_SYSTEM_STATE_PATH, 0700, pw->pw_uid, gr->gr_gid, true) < 0) {
188
pa_log(_("Failed to create '%s': %s"), PA_SYSTEM_STATE_PATH, pa_cstrerror(errno));
192
/* We don't create the config dir here, because we don't need to write to it */
194
if (initgroups(PA_SYSTEM_USER, gr->gr_gid) != 0) {
195
pa_log(_("Failed to change group list: %s"), pa_cstrerror(errno));
199
#if defined(HAVE_SETRESGID)
200
r = setresgid(gr->gr_gid, gr->gr_gid, gr->gr_gid);
201
#elif defined(HAVE_SETEGID)
202
if ((r = setgid(gr->gr_gid)) >= 0)
203
r = setegid(gr->gr_gid);
204
#elif defined(HAVE_SETREGID)
205
r = setregid(gr->gr_gid, gr->gr_gid);
207
#error "No API to drop privileges"
211
pa_log(_("Failed to change GID: %s"), pa_cstrerror(errno));
215
#if defined(HAVE_SETRESUID)
216
r = setresuid(pw->pw_uid, pw->pw_uid, pw->pw_uid);
217
#elif defined(HAVE_SETEUID)
218
if ((r = setuid(pw->pw_uid)) >= 0)
219
r = seteuid(pw->pw_uid);
220
#elif defined(HAVE_SETREUID)
221
r = setreuid(pw->pw_uid, pw->pw_uid);
223
#error "No API to drop privileges"
227
pa_log(_("Failed to change UID: %s"), pa_cstrerror(errno));
233
pa_set_env("USER", PA_SYSTEM_USER);
234
pa_set_env("USERNAME", PA_SYSTEM_USER);
235
pa_set_env("LOGNAME", PA_SYSTEM_USER);
236
pa_set_env("HOME", PA_SYSTEM_RUNTIME_PATH);
238
/* Relevant for pa_runtime_path() */
239
if (!getenv("PULSE_RUNTIME_PATH"))
240
pa_set_env("PULSE_RUNTIME_PATH", PA_SYSTEM_RUNTIME_PATH);
242
if (!getenv("PULSE_CONFIG_PATH"))
243
pa_set_env("PULSE_CONFIG_PATH", PA_SYSTEM_CONFIG_PATH);
245
if (!getenv("PULSE_STATE_PATH"))
246
pa_set_env("PULSE_STATE_PATH", PA_SYSTEM_STATE_PATH);
248
pa_log_info("Successfully changed user to \"" PA_SYSTEM_USER "\".");
253
#else /* HAVE_PWD_H && HAVE_GRP_H */
255
static int change_user(void) {
256
pa_log(_("System wide mode unsupported on this platform."));
260
#endif /* HAVE_PWD_H && HAVE_GRP_H */
262
#ifdef HAVE_SYS_RESOURCE_H
264
static int set_one_rlimit(const pa_rlimit *r, int resource, const char *name) {
271
rl.rlim_cur = rl.rlim_max = r->value;
273
if (setrlimit(resource, &rl) < 0) {
274
pa_log_info("setrlimit(%s, (%u, %u)) failed: %s", name, (unsigned) r->value, (unsigned) r->value, pa_cstrerror(errno));
281
static void set_all_rlimits(const pa_daemon_conf *conf) {
282
set_one_rlimit(&conf->rlimit_fsize, RLIMIT_FSIZE, "RLIMIT_FSIZE");
283
set_one_rlimit(&conf->rlimit_data, RLIMIT_DATA, "RLIMIT_DATA");
284
set_one_rlimit(&conf->rlimit_stack, RLIMIT_STACK, "RLIMIT_STACK");
285
set_one_rlimit(&conf->rlimit_core, RLIMIT_CORE, "RLIMIT_CORE");
287
set_one_rlimit(&conf->rlimit_rss, RLIMIT_RSS, "RLIMIT_RSS");
290
set_one_rlimit(&conf->rlimit_nproc, RLIMIT_NPROC, "RLIMIT_NPROC");
293
set_one_rlimit(&conf->rlimit_nofile, RLIMIT_NOFILE, "RLIMIT_NOFILE");
295
#ifdef RLIMIT_MEMLOCK
296
set_one_rlimit(&conf->rlimit_memlock, RLIMIT_MEMLOCK, "RLIMIT_MEMLOCK");
299
set_one_rlimit(&conf->rlimit_as, RLIMIT_AS, "RLIMIT_AS");
302
set_one_rlimit(&conf->rlimit_locks, RLIMIT_LOCKS, "RLIMIT_LOCKS");
304
#ifdef RLIMIT_SIGPENDING
305
set_one_rlimit(&conf->rlimit_sigpending, RLIMIT_SIGPENDING, "RLIMIT_SIGPENDING");
307
#ifdef RLIMIT_MSGQUEUE
308
set_one_rlimit(&conf->rlimit_msgqueue, RLIMIT_MSGQUEUE, "RLIMIT_MSGQUEUE");
311
set_one_rlimit(&conf->rlimit_nice, RLIMIT_NICE, "RLIMIT_NICE");
314
set_one_rlimit(&conf->rlimit_rtprio, RLIMIT_RTPRIO, "RLIMIT_RTPRIO");
317
set_one_rlimit(&conf->rlimit_rttime, RLIMIT_RTTIME, "RLIMIT_RTTIME");
322
static char *check_configured_address(void) {
323
char *default_server = NULL;
324
pa_client_conf *c = pa_client_conf_new();
326
pa_client_conf_load(c, true, true);
328
if (c->default_server && *c->default_server)
329
default_server = pa_xstrdup(c->default_server);
331
pa_client_conf_free(c);
333
return default_server;
336
static bool valid_pid_file = false;
337
static void pid_file_deleted(void *userdata)
339
pa_core *c = userdata;
340
pa_log_info("Our pid file has been deleted (probably due to session logout), quitting...");
341
valid_pid_file = false;
342
pa_core_exit(c, true, 0);
346
static pa_dbus_connection *register_dbus_name(pa_core *c, DBusBusType bus, const char* name) {
348
pa_dbus_connection *conn;
350
dbus_error_init(&error);
352
if (!(conn = pa_dbus_bus_get(c, bus, &error)) || dbus_error_is_set(&error)) {
353
pa_log_warn("Unable to contact D-Bus: %s: %s", error.name, error.message);
357
if (dbus_bus_request_name(pa_dbus_connection_get(conn), name, DBUS_NAME_FLAG_DO_NOT_QUEUE, &error) == DBUS_REQUEST_NAME_REPLY_PRIMARY_OWNER) {
358
pa_log_debug("Got %s!", name);
362
if (dbus_error_is_set(&error))
363
pa_log_error("Failed to acquire %s: %s: %s", name, error.name, error.message);
365
pa_log_error("D-Bus name %s already taken.", name);
367
/* PA cannot be started twice by the same user and hence we can
368
* ignore mostly the case that a name is already taken. */
372
pa_dbus_connection_unref(conn);
374
dbus_error_free(&error);
379
int main(int argc, char *argv[]) {
381
pa_strbuf *buf = NULL;
382
pa_daemon_conf *conf = NULL;
383
pa_mainloop *mainloop = NULL;
385
char *configured_address;
386
int r = 0, retval = 1, d = 0;
387
bool ltdl_init = false;
388
int n_fds = 0, *passed_fds = NULL;
391
int daemon_pipe[2] = { -1, -1 };
392
int daemon_pipe2[2] = { -1, -1 };
394
pa_inotify *pid_monitor = NULL;
395
int autospawn_fd = -1;
396
bool autospawn_locked = false;
398
pa_dbusobj_server_lookup *server_lookup = NULL; /* /org/pulseaudio/server_lookup */
399
pa_dbus_connection *lookup_service_bus = NULL; /* Always the user bus. */
400
pa_dbus_connection *server_bus = NULL; /* The bus where we reserve org.pulseaudio.Server, either the user or the system bus. */
404
pa_log_set_ident("pulseaudio");
405
pa_log_set_level(PA_LOG_NOTICE);
406
pa_log_set_flags(PA_LOG_COLORS|PA_LOG_PRINT_FILE|PA_LOG_PRINT_LEVEL, PA_LOG_RESET);
408
#if defined(__linux__) && defined(__OPTIMIZE__)
410
Disable lazy relocations to make usage of external libraries
411
more deterministic for our RT threads. We abuse __OPTIMIZE__ as
412
a check whether we are a debug build or not. This all is
413
admittedly a bit snake-oilish.
416
if (!getenv("LD_BIND_NOW")) {
420
/* We have to execute ourselves, because the libc caches the
421
* value of $LD_BIND_NOW on initialization. */
423
pa_set_env("LD_BIND_NOW", "1");
425
if ((canonical_rp = pa_realpath(PA_BINARY))) {
427
if ((rp = pa_readlink("/proc/self/exe"))) {
429
if (pa_streq(rp, canonical_rp))
430
pa_assert_se(execv(rp, argv) == 0);
432
pa_log_warn("/proc/self/exe does not point to %s, cannot self execute. Are you playing games?", canonical_rp);
437
pa_log_warn("Couldn't read /proc/self/exe, cannot self execute. Running in a chroot()?");
439
pa_xfree(canonical_rp);
442
pa_log_warn("Couldn't canonicalize binary path, cannot self execute.");
446
#ifdef HAVE_SYSTEMD_DAEMON
447
n_fds = sd_listen_fds(0);
451
passed_fds = pa_xnew(int, n_fds+2);
452
passed_fds[n_fds] = passed_fds[n_fds+1] = -1;
454
passed_fds[i] = SD_LISTEN_FDS_START + i;
460
passed_fds = pa_xnew(int, 2);
461
passed_fds[0] = passed_fds[1] = -1;
464
if ((e = getenv("PULSE_PASSED_FD"))) {
465
int passed_fd = atoi(e);
467
passed_fds[n_fds] = passed_fd;
470
/* We might be autospawned, in which case have no idea in which
471
* context we have been started. Let's cleanup our execution
472
* context as good as possible */
474
pa_reset_personality();
476
pa_close_allv(passed_fds);
477
pa_xfree(passed_fds);
482
setlocale(LC_ALL, "");
485
conf = pa_daemon_conf_new();
487
if (pa_daemon_conf_load(conf, NULL) < 0)
490
if (pa_daemon_conf_env(conf) < 0)
493
if (pa_cmdline_parse(conf, argc, argv, &d) < 0) {
494
pa_log(_("Failed to parse command line."));
498
if (conf->log_target)
499
pa_log_set_target(conf->log_target);
501
pa_log_target target = { .type = PA_LOG_STDERR, .file = NULL };
502
pa_log_set_target(&target);
505
pa_log_set_level(conf->log_level);
507
pa_log_set_flags(PA_LOG_PRINT_META, PA_LOG_SET);
509
pa_log_set_flags(PA_LOG_PRINT_TIME, PA_LOG_SET);
510
pa_log_set_show_backtrace(conf->log_backtrace);
513
/* conf->system_instance and conf->local_server_type control almost the
514
* same thing; make them agree about what is requested. */
515
switch (conf->local_server_type) {
516
case PA_SERVER_TYPE_UNSET:
517
conf->local_server_type = conf->system_instance ? PA_SERVER_TYPE_SYSTEM : PA_SERVER_TYPE_USER;
519
case PA_SERVER_TYPE_USER:
520
case PA_SERVER_TYPE_NONE:
521
conf->system_instance = false;
523
case PA_SERVER_TYPE_SYSTEM:
524
conf->system_instance = true;
527
pa_assert_not_reached();
530
start_server = conf->local_server_type == PA_SERVER_TYPE_USER || (getuid() == 0 && conf->local_server_type == PA_SERVER_TYPE_SYSTEM);
532
if (!start_server && conf->local_server_type == PA_SERVER_TYPE_SYSTEM) {
533
pa_log_notice(_("System mode refused for non-root user. Only starting the D-Bus server lookup service."));
534
conf->system_instance = false;
538
LTDL_SET_PRELOADED_SYMBOLS();
542
if (conf->dl_search_path)
543
lt_dlsetsearchpath(conf->dl_search_path);
548
WSAStartup(MAKEWORD(2, 0), &data);
555
case PA_CMD_DUMP_MODULES:
556
pa_dump_modules(conf, argc-d, argv+d);
560
case PA_CMD_DUMP_CONF: {
563
pa_log("Too many arguments.\n");
567
s = pa_daemon_conf_dump(conf);
574
case PA_CMD_DUMP_RESAMPLE_METHODS: {
578
pa_log("Too many arguments.\n");
582
for (i = 0; i < PA_RESAMPLER_MAX; i++)
583
if (pa_resample_method_supported(i))
584
printf("%s\n", pa_resample_method_to_string(i));
591
pa_cmdline_help(argv[0]);
595
case PA_CMD_VERSION :
598
pa_log("Too many arguments.\n");
602
printf(PACKAGE_NAME" "PACKAGE_VERSION"\n");
610
pa_log("Too many arguments.\n");
614
if (pa_pid_file_check_running(&pid, "pulseaudio") < 0)
615
pa_log_info("Daemon not running");
617
pa_log_info("Daemon running as PID %u", pid);
627
pa_log("Too many arguments.\n");
631
if (pa_pid_file_kill(SIGINT, NULL, "pulseaudio") < 0)
632
pa_log(_("Failed to kill daemon: %s"), pa_cstrerror(errno));
638
case PA_CMD_CLEANUP_SHM:
641
pa_log("Too many arguments.\n");
645
if (pa_shm_cleanup() >= 0)
651
pa_assert(conf->cmd == PA_CMD_DAEMON || conf->cmd == PA_CMD_START);
655
pa_log("Too many arguments.\n");
660
if (getuid() == 0 && !conf->system_instance)
661
pa_log_warn(_("This program is not intended to be run as root (unless --system is specified)."));
662
#ifndef HAVE_DBUS /* A similar, only a notice worthy check was done earlier, if D-Bus is enabled. */
663
else if (getuid() != 0 && conf->system_instance) {
664
pa_log(_("Root privileges required."));
668
#endif /* HAVE_GETUID */
670
if (conf->cmd == PA_CMD_START && conf->system_instance) {
671
pa_log(_("--start not supported for system instances."));
675
if (conf->cmd == PA_CMD_START && (configured_address = check_configured_address())) {
676
/* There is an server address in our config, but where did it come from?
677
* By default a standard X11 login will load module-x11-publish which will
678
* inject PULSE_SERVER X11 property. If the PA daemon crashes, we will end
679
* up hitting this code path. So we have to check to see if our configured_address
680
* is the same as the value that would go into this property so that we can
681
* recover (i.e. autospawn) from a crash.
684
bool start_anyway = false;
686
if ((ufn = pa_runtime_path(PA_NATIVE_DEFAULT_UNIX_SOCKET))) {
689
if ((id = pa_machine_id())) {
690
pa_strlist *server_list;
691
char formatted_ufn[256];
693
pa_snprintf(formatted_ufn, sizeof(formatted_ufn), "{%s}unix:%s", id, ufn);
696
if ((server_list = pa_strlist_parse(configured_address))) {
699
/* We only need to check the first server */
700
server_list = pa_strlist_pop(server_list, &u);
701
pa_strlist_free(server_list);
703
start_anyway = (u && pa_streq(formatted_ufn, u));
711
pa_log_notice(_("User-configured server at %s, refusing to start/autospawn."), configured_address);
712
pa_xfree(configured_address);
717
pa_log_notice(_("User-configured server at %s, which appears to be local. Probing deeper."), configured_address);
718
pa_xfree(configured_address);
721
if (conf->system_instance && !conf->disallow_exit)
722
pa_log_warn(_("Running in system mode, but --disallow-exit not set!"));
724
if (conf->system_instance && !conf->disallow_module_loading)
725
pa_log_warn(_("Running in system mode, but --disallow-module-loading not set!"));
727
if (conf->system_instance && !conf->disable_shm) {
728
pa_log_notice(_("Running in system mode, forcibly disabling SHM mode!"));
729
conf->disable_shm = true;
732
if (conf->system_instance && conf->exit_idle_time >= 0) {
733
pa_log_notice(_("Running in system mode, forcibly disabling exit idle time!"));
734
conf->exit_idle_time = -1;
737
if (conf->cmd == PA_CMD_START) {
738
/* If we shall start PA only when it is not running yet, we
739
* first take the autospawn lock to make things
742
/* This locking and thread synchronisation code doesn't work reliably
743
* on kFreeBSD (Debian bug #705435), or in upstream FreeBSD ports
744
* (bug reference: ports/128947, patched in SVN r231972). */
745
#if !defined(__FreeBSD__) && !defined(__FreeBSD_kernel__)
746
if ((autospawn_fd = pa_autospawn_lock_init()) < 0) {
747
pa_log("Failed to initialize autospawn lock");
751
if ((pa_autospawn_lock_acquire(true) < 0)) {
752
pa_log("Failed to acquire autospawn lock");
756
autospawn_locked = true;
760
if (conf->daemonize) {
765
if (pa_stdio_acquire() < 0) {
766
pa_log(_("Failed to acquire stdio."));
771
if (pipe(daemon_pipe) < 0) {
772
pa_log(_("pipe() failed: %s"), pa_cstrerror(errno));
776
if ((child = fork()) < 0) {
777
pa_log(_("fork() failed: %s"), pa_cstrerror(errno));
778
pa_close_pipe(daemon_pipe);
786
pa_assert_se(pa_close(daemon_pipe[1]) == 0);
789
if ((n = pa_loop_read(daemon_pipe[0], &retval, sizeof(retval), NULL)) != sizeof(retval)) {
792
pa_log(_("read() failed: %s"), pa_cstrerror(errno));
798
pa_log(_("Daemon startup failed."));
800
pa_log_info("Daemon startup successful.");
805
if (autospawn_fd >= 0) {
806
/* The lock file is unlocked from the parent, so we need
807
* to close it in the child */
809
pa_autospawn_lock_release();
810
pa_autospawn_lock_done(true);
812
autospawn_locked = false;
816
pa_assert_se(pa_close(daemon_pipe[0]) == 0);
820
if (!conf->log_target) {
821
#ifdef HAVE_SYSTEMD_JOURNAL
822
pa_log_target target = { .type = PA_LOG_JOURNAL, .file = NULL };
824
pa_log_target target = { .type = PA_LOG_SYSLOG, .file = NULL };
826
pa_log_set_target(&target);
831
pa_log(_("setsid() failed: %s"), pa_cstrerror(errno));
837
/* We now are a session and process group leader. Let's fork
838
* again and let the father die, so that we'll become a
839
* process that can never acquire a TTY again, in a session and
840
* process group without leader */
842
if (pipe(daemon_pipe2) < 0) {
843
pa_log(_("pipe() failed: %s"), pa_cstrerror(errno));
847
if ((child = fork()) < 0) {
848
pa_log(_("fork() failed: %s"), pa_cstrerror(errno));
849
pa_close_pipe(daemon_pipe2);
857
pa_assert_se(pa_close(daemon_pipe2[1]) == 0);
858
daemon_pipe2[1] = -1;
860
if ((n = pa_loop_read(daemon_pipe2[0], &retval, sizeof(retval), NULL)) != sizeof(retval)) {
863
pa_log(_("read() failed: %s"), pa_cstrerror(errno));
868
/* We now have to take care of signalling the first fork with
869
* the return value we've received from this fork... */
870
pa_assert(daemon_pipe[1] >= 0);
872
pa_loop_write(daemon_pipe[1], &retval, sizeof(retval), NULL);
873
pa_close(daemon_pipe[1]);
879
pa_assert_se(pa_close(daemon_pipe2[0]) == 0);
880
daemon_pipe2[0] = -1;
882
/* We no longer need the (first) daemon_pipe as it's handled in our child above */
883
pa_close_pipe(daemon_pipe);
887
signal(SIGTTOU, SIG_IGN);
890
signal(SIGTTIN, SIG_IGN);
893
signal(SIGTSTP, SIG_IGN);
899
pa_set_env_and_record("PULSE_INTERNAL", "1");
900
pa_assert_se(chdir("/") == 0);
903
#ifdef HAVE_SYS_RESOURCE_H
904
set_all_rlimits(conf);
906
pa_rtclock_hrtimer_enable();
908
if (conf->high_priority)
909
pa_raise_priority(conf->nice_level);
911
if (conf->system_instance)
912
if (change_user() < 0)
915
pa_set_env_and_record("PULSE_SYSTEM", conf->system_instance ? "1" : "0");
917
pa_log_info("This is PulseAudio %s", PACKAGE_VERSION);
918
pa_log_debug("Compilation host: %s", CANONICAL_HOST);
919
pa_log_debug("Compilation CFLAGS: %s", PA_CFLAGS);
921
#ifdef HAVE_LIBSAMPLERATE
922
pa_log_warn("Compiled with DEPRECATED libsamplerate support!");
925
s = pa_uname_string();
926
pa_log_debug("Running on host: %s", s);
929
pa_log_debug("Found %u CPUs.", pa_ncpus());
931
pa_log_info("Page size is %lu bytes", (unsigned long) PA_PAGE_SIZE);
933
#ifdef HAVE_VALGRIND_MEMCHECK_H
934
pa_log_debug("Compiled with Valgrind support: yes");
936
pa_log_debug("Compiled with Valgrind support: no");
939
pa_log_debug("Running in valgrind mode: %s", pa_yes_no(pa_in_valgrind()));
941
pa_log_debug("Running in VM: %s", pa_yes_no(pa_running_in_vm()));
944
pa_log_debug("Optimized build: yes");
946
pa_log_debug("Optimized build: no");
950
pa_log_debug("NDEBUG defined, all asserts disabled.");
951
#elif defined(FASTPATH)
952
pa_log_debug("FASTPATH defined, only fast path asserts disabled.");
954
pa_log_debug("All asserts enabled.");
957
if (!(s = pa_machine_id())) {
958
pa_log(_("Failed to get machine ID"));
961
pa_log_info("Machine ID is %s.", s);
964
if ((s = pa_session_id())) {
965
pa_log_info("Session ID is %s.", s);
969
if (!(s = pa_get_runtime_dir()))
971
pa_log_info("Using runtime directory %s.", s);
974
if (!(s = pa_get_state_dir()))
976
pa_log_info("Using state directory %s.", s);
979
pa_log_info("Using modules directory %s.", conf->dl_search_path);
981
pa_log_info("Running in system mode: %s", pa_yes_no(pa_in_system_mode()));
983
if (pa_in_system_mode())
984
pa_log_warn(_("OK, so you are running PA in system mode. Please note that you most likely shouldn't be doing that.\n"
985
"If you do it nonetheless then it's your own fault if things don't work as expected.\n"
986
"Please read http://www.freedesktop.org/wiki/Software/PulseAudio/Documentation/User/WhatIsWrongWithSystemWide/ for an explanation why system mode is usually a bad idea."));
988
if (conf->use_pid_file) {
991
if ((z = pa_pid_file_create("pulseaudio")) != 0) {
993
if (conf->cmd == PA_CMD_START && z > 0) {
994
/* If we are already running and with are run in
995
* --start mode, then let's return this as success. */
1001
pa_log(_("pa_pid_file_create() failed."));
1005
valid_pid_file = true;
1008
pa_disable_sigpipe();
1010
if (pa_rtclock_hrtimer())
1011
pa_log_info("Fresh high-resolution timers available! Bon appetit!");
1013
pa_log_info("Dude, your kernel stinks! The chef's recommendation today is Linux with high-resolution timers enabled!");
1015
if (conf->lock_memory) {
1016
#if defined(HAVE_SYS_MMAN_H) && !defined(__ANDROID__)
1017
if (mlockall(MCL_FUTURE) < 0)
1018
pa_log_warn("mlockall() failed: %s", pa_cstrerror(errno));
1020
pa_log_info("Successfully locked process into memory.");
1022
pa_log_warn("Memory locking requested but not supported on platform.");
1026
pa_memtrap_install();
1028
pa_assert_se(mainloop = pa_mainloop_new());
1030
if (!(c = pa_core_new(pa_mainloop_get_api(mainloop), !conf->disable_shm, conf->shm_size))) {
1031
pa_log(_("pa_core_new() failed."));
1036
pid_monitor = pa_inotify_start(pa_pid_file_name(), c, pid_file_deleted, c);
1038
c->default_sample_spec = conf->default_sample_spec;
1039
c->alternate_sample_rate = conf->alternate_sample_rate;
1040
c->default_channel_map = conf->default_channel_map;
1041
c->default_n_fragments = conf->default_n_fragments;
1042
c->default_fragment_size_msec = conf->default_fragment_size_msec;
1043
c->deferred_volume_safety_margin_usec = conf->deferred_volume_safety_margin_usec;
1044
c->deferred_volume_extra_delay_usec = conf->deferred_volume_extra_delay_usec;
1045
c->exit_idle_time = conf->exit_idle_time;
1046
c->scache_idle_time = conf->scache_idle_time;
1047
c->resample_method = conf->resample_method;
1048
c->realtime_priority = conf->realtime_priority;
1049
c->realtime_scheduling = conf->realtime_scheduling;
1050
c->disable_remixing = conf->disable_remixing;
1051
c->disable_lfe_remixing = conf->disable_lfe_remixing;
1052
c->deferred_volume = conf->deferred_volume;
1053
c->running_as_daemon = conf->daemonize;
1054
c->disallow_exit = conf->disallow_exit;
1055
c->flat_volumes = conf->flat_volumes;
1057
c->server_type = conf->local_server_type;
1060
pa_cpu_init(&c->cpu_info);
1062
pa_assert_se(pa_signal_init(pa_mainloop_get_api(mainloop)) == 0);
1063
pa_signal_new(SIGINT, signal_callback, c);
1064
pa_signal_new(SIGTERM, signal_callback, c);
1066
pa_signal_new(SIGUSR1, signal_callback, c);
1069
pa_signal_new(SIGUSR2, signal_callback, c);
1072
pa_signal_new(SIGHUP, signal_callback, c);
1075
if (!conf->no_cpu_limit)
1076
pa_assert_se(pa_cpu_limit_init(pa_mainloop_get_api(mainloop)) == 0);
1078
buf = pa_strbuf_new();
1081
pa_assert_se(dbus_threads_init_default());
1085
if (conf->load_default_script_file) {
1088
if ((f = pa_daemon_conf_open_default_script_file(conf))) {
1089
r = pa_cli_command_execute_file_stream(c, f, buf, &conf->fail);
1095
r = pa_cli_command_execute(c, conf->script_commands, buf, &conf->fail);
1097
pa_log_error("%s", s = pa_strbuf_tostring_free(buf));
1100
if (r < 0 && conf->fail) {
1101
pa_log(_("Failed to initialize daemon."));
1105
if (!c->modules || pa_idxset_size(c->modules) == 0) {
1106
pa_log(_("Daemon startup without any loaded modules, refusing to work."));
1111
/* When we just provide the D-Bus server lookup service, we don't want
1112
* any modules to be loaded. We haven't loaded any so far, so one might
1113
* think there's no way to contact the server, but receiving certain
1114
* signals could still cause modules to load. */
1115
conf->disallow_module_loading = true;
1119
/* We completed the initial module loading, so let's disable it
1120
* from now on, if requested */
1121
c->disallow_module_loading = conf->disallow_module_loading;
1124
if (!conf->system_instance) {
1125
if ((server_lookup = pa_dbusobj_server_lookup_new(c))) {
1126
if (!(lookup_service_bus = register_dbus_name(c, DBUS_BUS_SESSION, "org.PulseAudio1")))
1132
server_bus = register_dbus_name(c, conf->system_instance ? DBUS_BUS_SYSTEM : DBUS_BUS_SESSION, "org.pulseaudio.Server");
1136
if (daemon_pipe2[1] >= 0) {
1138
pa_loop_write(daemon_pipe2[1], &ok, sizeof(ok), NULL);
1139
pa_close(daemon_pipe2[1]);
1140
daemon_pipe2[1] = -1;
1144
pa_log_info("Daemon startup complete.");
1147
if (pa_mainloop_run(mainloop, &retval) < 0)
1150
pa_log_info("Daemon shutdown initiated.");
1155
pa_dbus_connection_unref(server_bus);
1156
if (lookup_service_bus)
1157
pa_dbus_connection_unref(lookup_service_bus);
1159
pa_dbusobj_server_lookup_free(server_lookup);
1162
if (autospawn_fd >= 0) {
1163
if (autospawn_locked)
1164
pa_autospawn_lock_release();
1166
pa_autospawn_lock_done(false);
1170
pa_inotify_stop(pid_monitor);
1173
/* Ensure all the modules/samples are unloaded when the core is still ref'ed,
1174
* as unlink callback hooks in modules may need the core to be ref'ed */
1175
pa_module_unload_all(c);
1176
pa_scache_free_all(c);
1179
pa_log_info("Daemon terminated.");
1182
if (!conf->no_cpu_limit)
1183
pa_cpu_limit_done();
1188
/* If we have daemon_pipe[1] still open, this means we've failed after
1189
* the first fork, but before the second. Therefore just write to it. */
1190
if (daemon_pipe[1] >= 0)
1191
pa_loop_write(daemon_pipe[1], &retval, sizeof(retval), NULL);
1192
else if (daemon_pipe2[1] >= 0)
1193
pa_loop_write(daemon_pipe2[1], &retval, sizeof(retval), NULL);
1195
pa_close_pipe(daemon_pipe2);
1196
pa_close_pipe(daemon_pipe);
1200
pa_mainloop_free(mainloop);
1203
pa_daemon_conf_free(conf);
1206
pa_pid_file_remove();
1208
/* This has no real purpose except making things valgrind-clean */
1209
pa_unset_env_recorded();