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
39 #include <sys/types.h>
41 #include <liboil/liboil.h>
43 #ifdef HAVE_SYS_IOCTL_H
44 #include <sys/ioctl.h>
60 #include <dbus/dbus.h>
63 #include <pulse/mainloop.h>
64 #include <pulse/mainloop-signal.h>
65 #include <pulse/timeval.h>
66 #include <pulse/xmalloc.h>
67 #include <pulse/i18n.h>
69 #include <pulsecore/lock-autospawn.h>
70 #include <pulsecore/winsock.h>
71 #include <pulsecore/core-error.h>
72 #include <pulsecore/core.h>
73 #include <pulsecore/memblock.h>
74 #include <pulsecore/module.h>
75 #include <pulsecore/cli-command.h>
76 #include <pulsecore/log.h>
77 #include <pulsecore/core-util.h>
78 #include <pulsecore/sioman.h>
79 #include <pulsecore/cli-text.h>
80 #include <pulsecore/pid.h>
81 #include <pulsecore/namereg.h>
82 #include <pulsecore/random.h>
83 #include <pulsecore/rtsig.h>
84 #include <pulsecore/rtclock.h>
85 #include <pulsecore/macro.h>
86 #include <pulsecore/mutex.h>
87 #include <pulsecore/thread.h>
88 #include <pulsecore/once.h>
89 #include <pulsecore/shm.h>
93 #include "daemon-conf.h"
94 #include "dumpmodules.h"
96 #include "ltdl-bind-now.h"
100 /* Only one instance of these variables */
101 int allow_severity
= LOG_INFO
;
102 int deny_severity
= LOG_WARNING
;
106 /* padsp looks for this symbol in the running process and disables
107 * itself if it finds it and it is set to 7 (which is actually a bit
108 * mask). For details see padsp. */
109 int __padsp_disabled__
= 7;
114 static void message_cb(pa_mainloop_api
*a
, pa_time_event
*e
, const struct timeval
*tv
, void *userdata
) {
116 struct timeval tvnext
;
118 while (PeekMessage(&msg
, NULL
, 0, 0, PM_REMOVE
)) {
119 if (msg
.message
== WM_QUIT
)
122 TranslateMessage(&msg
);
123 DispatchMessage(&msg
);
127 pa_timeval_add(pa_gettimeofday(&tvnext
), 100000);
128 a
->time_restart(e
, &tvnext
);
133 static void signal_callback(pa_mainloop_api
*m
, pa_signal_event
*e
, int sig
, void *userdata
) {
134 pa_log_info(_("Got signal %s."), pa_sig2str(sig
));
139 pa_module_load(userdata
, "module-cli", NULL
);
145 pa_module_load(userdata
, "module-cli-protocol-unix", NULL
);
151 char *c
= pa_full_status_string(userdata
);
152 pa_log_notice("%s", c
);
161 pa_log_info(_("Exiting."));
167 #if defined(HAVE_PWD_H) && defined(HAVE_GRP_H)
169 static int change_user(void) {
174 /* This function is called only in system-wide mode. It creates a
175 * runtime dir in /var/run/ with proper UID/GID and drops privs
178 if (!(pw
= getpwnam(PA_SYSTEM_USER
))) {
179 pa_log(_("Failed to find user '%s'."), PA_SYSTEM_USER
);
183 if (!(gr
= getgrnam(PA_SYSTEM_GROUP
))) {
184 pa_log(_("Failed to find group '%s'."), PA_SYSTEM_GROUP
);
188 pa_log_info(_("Found user '%s' (UID %lu) and group '%s' (GID %lu)."),
189 PA_SYSTEM_USER
, (unsigned long) pw
->pw_uid
,
190 PA_SYSTEM_GROUP
, (unsigned long) gr
->gr_gid
);
192 if (pw
->pw_gid
!= gr
->gr_gid
) {
193 pa_log(_("GID of user '%s' and of group '%s' don't match."), PA_SYSTEM_USER
, PA_SYSTEM_GROUP
);
197 if (strcmp(pw
->pw_dir
, PA_SYSTEM_RUNTIME_PATH
) != 0)
198 pa_log_warn(_("Home directory of user '%s' is not '%s', ignoring."), PA_SYSTEM_USER
, PA_SYSTEM_RUNTIME_PATH
);
200 if (pa_make_secure_dir(PA_SYSTEM_RUNTIME_PATH
, 0755, pw
->pw_uid
, gr
->gr_gid
) < 0) {
201 pa_log(_("Failed to create '%s': %s"), PA_SYSTEM_RUNTIME_PATH
, pa_cstrerror(errno
));
205 if (pa_make_secure_dir(PA_SYSTEM_STATE_PATH
, 0700, pw
->pw_uid
, gr
->gr_gid
) < 0) {
206 pa_log(_("Failed to create '%s': %s"), PA_SYSTEM_STATE_PATH
, pa_cstrerror(errno
));
210 /* We don't create the config dir here, because we don't need to write to it */
212 if (initgroups(PA_SYSTEM_USER
, gr
->gr_gid
) != 0) {
213 pa_log(_("Failed to change group list: %s"), pa_cstrerror(errno
));
217 #if defined(HAVE_SETRESGID)
218 r
= setresgid(gr
->gr_gid
, gr
->gr_gid
, gr
->gr_gid
);
219 #elif defined(HAVE_SETEGID)
220 if ((r
= setgid(gr
->gr_gid
)) >= 0)
221 r
= setegid(gr
->gr_gid
);
222 #elif defined(HAVE_SETREGID)
223 r
= setregid(gr
->gr_gid
, gr
->gr_gid
);
225 #error "No API to drop privileges"
229 pa_log(_("Failed to change GID: %s"), pa_cstrerror(errno
));
233 #if defined(HAVE_SETRESUID)
234 r
= setresuid(pw
->pw_uid
, pw
->pw_uid
, pw
->pw_uid
);
235 #elif defined(HAVE_SETEUID)
236 if ((r
= setuid(pw
->pw_uid
)) >= 0)
237 r
= seteuid(pw
->pw_uid
);
238 #elif defined(HAVE_SETREUID)
239 r
= setreuid(pw
->pw_uid
, pw
->pw_uid
);
241 #error "No API to drop privileges"
245 pa_log(_("Failed to change UID: %s"), pa_cstrerror(errno
));
249 pa_set_env("USER", PA_SYSTEM_USER
);
250 pa_set_env("USERNAME", PA_SYSTEM_USER
);
251 pa_set_env("LOGNAME", PA_SYSTEM_USER
);
252 pa_set_env("HOME", PA_SYSTEM_RUNTIME_PATH
);
254 /* Relevant for pa_runtime_path() */
255 pa_set_env("PULSE_RUNTIME_PATH", PA_SYSTEM_RUNTIME_PATH
);
256 pa_set_env("PULSE_CONFIG_PATH", PA_SYSTEM_CONFIG_PATH
);
257 pa_set_env("PULSE_STATE_PATH", PA_SYSTEM_STATE_PATH
);
259 pa_log_info(_("Successfully dropped root privileges."));
264 #else /* HAVE_PWD_H && HAVE_GRP_H */
266 static int change_user(void) {
267 pa_log(_("System wide mode unsupported on this platform."));
271 #endif /* HAVE_PWD_H && HAVE_GRP_H */
273 #ifdef HAVE_SYS_RESOURCE_H
275 static int set_one_rlimit(const pa_rlimit
*r
, int resource
, const char *name
) {
282 rl
.rlim_cur
= rl
.rlim_max
= r
->value
;
284 if (setrlimit(resource
, &rl
) < 0) {
285 pa_log_info(_("setrlimit(%s, (%u, %u)) failed: %s"), name
, (unsigned) r
->value
, (unsigned) r
->value
, pa_cstrerror(errno
));
292 static void set_all_rlimits(const pa_daemon_conf
*conf
) {
293 set_one_rlimit(&conf
->rlimit_fsize
, RLIMIT_FSIZE
, "RLIMIT_FSIZE");
294 set_one_rlimit(&conf
->rlimit_data
, RLIMIT_DATA
, "RLIMIT_DATA");
295 set_one_rlimit(&conf
->rlimit_stack
, RLIMIT_STACK
, "RLIMIT_STACK");
296 set_one_rlimit(&conf
->rlimit_core
, RLIMIT_CORE
, "RLIMIT_CORE");
298 set_one_rlimit(&conf
->rlimit_rss
, RLIMIT_RSS
, "RLIMIT_RSS");
301 set_one_rlimit(&conf
->rlimit_nproc
, RLIMIT_NPROC
, "RLIMIT_NPROC");
304 set_one_rlimit(&conf
->rlimit_nofile
, RLIMIT_NOFILE
, "RLIMIT_NOFILE");
306 #ifdef RLIMIT_MEMLOCK
307 set_one_rlimit(&conf
->rlimit_memlock
, RLIMIT_MEMLOCK
, "RLIMIT_MEMLOCK");
310 set_one_rlimit(&conf
->rlimit_as
, RLIMIT_AS
, "RLIMIT_AS");
313 set_one_rlimit(&conf
->rlimit_locks
, RLIMIT_LOCKS
, "RLIMIT_LOCKS");
315 #ifdef RLIMIT_SIGPENDING
316 set_one_rlimit(&conf
->rlimit_sigpending
, RLIMIT_SIGPENDING
, "RLIMIT_SIGPENDING");
318 #ifdef RLIMIT_MSGQUEUE
319 set_one_rlimit(&conf
->rlimit_msgqueue
, RLIMIT_MSGQUEUE
, "RLIMIT_MSGQUEUE");
322 set_one_rlimit(&conf
->rlimit_nice
, RLIMIT_NICE
, "RLIMIT_NICE");
325 set_one_rlimit(&conf
->rlimit_rtprio
, RLIMIT_RTPRIO
, "RLIMIT_RTPRIO");
328 set_one_rlimit(&conf
->rlimit_rttime
, RLIMIT_RTTIME
, "RLIMIT_RTTIME");
333 int main(int argc
, char *argv
[]) {
335 pa_strbuf
*buf
= NULL
;
336 pa_daemon_conf
*conf
= NULL
;
337 pa_mainloop
*mainloop
= NULL
;
339 int r
= 0, retval
= 1, d
= 0;
340 pa_bool_t suid_root
, real_root
;
341 pa_bool_t valid_pid_file
= FALSE
;
342 gid_t gid
= (gid_t
) -1;
343 pa_bool_t ltdl_init
= FALSE
;
347 int daemon_pipe
[2] = { -1, -1 };
350 pa_time_event
*win32_timer
;
351 struct timeval win32_tv
;
353 int autospawn_fd
= -1;
354 pa_bool_t autospawn_locked
= FALSE
;
356 pa_log_set_ident("pulseaudio");
357 pa_log_set_level(PA_LOG_INFO
);
358 pa_log_set_flags(PA_LOG_COLORS
|PA_LOG_PRINT_FILE
|PA_LOG_PRINT_LEVEL
, PA_LOG_RESET
);
360 #if defined(__linux__) && defined(__OPTIMIZE__)
362 Disable lazy relocations to make usage of external libraries
363 more deterministic for our RT threads. We abuse __OPTIMIZE__ as
364 a check whether we are a debug build or not.
367 if (!getenv("LD_BIND_NOW")) {
370 /* We have to execute ourselves, because the libc caches the
371 * value of $LD_BIND_NOW on initialization. */
373 pa_set_env("LD_BIND_NOW", "1");
375 if ((rp
= pa_readlink("/proc/self/exe")))
376 pa_assert_se(execv(rp
, argv
) == 0);
378 pa_log_warn("Couldn't read /proc/self/exe, cannot self execute. Running in a chroot()?");
383 real_root
= getuid() == 0;
384 suid_root
= !real_root
&& geteuid() == 0;
391 /* Drop all capabilities except CAP_SYS_NICE */
394 /* Drop privileges, but keep CAP_SYS_NICE */
397 /* After dropping root, the effective set is reset, hence,
398 * let's raise it again */
401 /* When capabilities are not supported we will not be able to
402 * aquire RT sched anymore. But yes, that's the way it is. It
403 * is just too risky tun let PA run as root all the time. */
406 if ((e
= getenv("PULSE_PASSED_FD"))) {
413 pa_close_all(passed_fd
, -1);
418 /* At this point, we are a normal user, possibly with CAP_NICE if
419 * we were started SUID. If we are started as normal root, than we
420 * still are normal root. */
422 setlocale(LC_ALL
, "");
425 conf
= pa_daemon_conf_new();
427 if (pa_daemon_conf_load(conf
, NULL
) < 0)
430 if (pa_daemon_conf_env(conf
) < 0)
433 if (pa_cmdline_parse(conf
, argc
, argv
, &d
) < 0) {
434 pa_log(_("Failed to parse command line."));
438 pa_log_set_level(conf
->log_level
);
439 pa_log_set_target(conf
->auto_log_target
? PA_LOG_STDERR
: conf
->log_target
);
441 pa_log_set_flags(PA_LOG_PRINT_META
, PA_LOG_SET
);
443 pa_log_set_flags(PA_LOG_PRINT_TIME
, PA_LOG_SET
);
444 pa_log_set_show_backtrace(conf
->log_backtrace
);
446 pa_log_debug("Started as real root: %s, suid root: %s", pa_yes_no(real_root
), pa_yes_no(suid_root
));
448 if (!real_root
&& pa_have_caps()) {
449 #ifdef HAVE_SYS_RESOURCE_H
452 pa_bool_t allow_high_priority
= FALSE
, allow_realtime
= FALSE
;
454 /* Let's better not enable high prio or RT by default */
456 if (conf
->high_priority
&& !allow_high_priority
) {
457 if (pa_own_uid_in_group(PA_REALTIME_GROUP
, &gid
) > 0) {
458 pa_log_info(_("We're in the group '%s', allowing high-priority scheduling."), PA_REALTIME_GROUP
);
459 allow_high_priority
= TRUE
;
463 if (conf
->realtime_scheduling
&& !allow_realtime
) {
464 if (pa_own_uid_in_group(PA_REALTIME_GROUP
, &gid
) > 0) {
465 pa_log_info(_("We're in the group '%s', allowing real-time scheduling."), PA_REALTIME_GROUP
);
466 allow_realtime
= TRUE
;
471 if (conf
->high_priority
&& !allow_high_priority
) {
472 if (pa_polkit_check("org.pulseaudio.acquire-high-priority") > 0) {
473 pa_log_info(_("PolicyKit grants us acquire-high-priority privilege."));
474 allow_high_priority
= TRUE
;
476 pa_log_info(_("PolicyKit refuses acquire-high-priority privilege."));
479 if (conf
->realtime_scheduling
&& !allow_realtime
) {
480 if (pa_polkit_check("org.pulseaudio.acquire-real-time") > 0) {
481 pa_log_info(_("PolicyKit grants us acquire-real-time privilege."));
482 allow_realtime
= TRUE
;
484 pa_log_info(_("PolicyKit refuses acquire-real-time privilege."));
488 if (!allow_high_priority
&& !allow_realtime
) {
490 /* OK, there's no further need to keep CAP_NICE. Hence
491 * let's give it up early */
497 if (getrlimit(RLIMIT_RTPRIO
, &rl
) >= 0)
498 if (rl
.rlim_cur
> 0) {
499 pa_log_info("RLIMIT_RTPRIO is set to %u, allowing real-time scheduling.", (unsigned) rl
.rlim_cur
);
500 allow_realtime
= TRUE
;
504 if (getrlimit(RLIMIT_NICE
, &rl
) >= 0)
505 if (rl
.rlim_cur
> 20 ) {
506 pa_log_info("RLIMIT_NICE is set to %u, allowing high-priority scheduling.", (unsigned) rl
.rlim_cur
);
507 allow_high_priority
= TRUE
;
511 if ((conf
->high_priority
&& !allow_high_priority
) ||
512 (conf
->realtime_scheduling
&& !allow_realtime
))
513 pa_log_notice(_("Called SUID root and real-time and/or high-priority scheduling was requested in the configuration. However, we lack the necessary privileges:\n"
514 "We are not in group '%s', PolicyKit refuse to grant us the requested privileges and we have no increase RLIMIT_NICE/RLIMIT_RTPRIO resource limits.\n"
515 "For enabling real-time/high-priority scheduling please acquire the appropriate PolicyKit privileges, or become a member of '%s', or increase the RLIMIT_NICE/RLIMIT_RTPRIO resource limits for this user."),
516 PA_REALTIME_GROUP
, PA_REALTIME_GROUP
);
520 conf
->realtime_scheduling
= FALSE
;
522 if (!allow_high_priority
)
523 conf
->high_priority
= FALSE
;
526 #ifdef HAVE_SYS_RESOURCE_H
527 /* Reset resource limits. If we are run as root (for system mode)
528 * this might end up increasing the limits, which is intended
529 * behaviour. For all other cases, i.e. started as normal user, or
530 * SUID root at this point we should have no CAP_SYS_RESOURCE and
531 * increasing the limits thus should fail. Which is, too, intended
534 set_all_rlimits(conf
);
537 if (conf
->high_priority
&& !pa_can_high_priority()) {
538 pa_log_warn(_("High-priority scheduling enabled in configuration but not allowed by policy."));
539 conf
->high_priority
= FALSE
;
542 if (conf
->high_priority
&& (conf
->cmd
== PA_CMD_DAEMON
|| conf
->cmd
== PA_CMD_START
))
543 pa_raise_priority(conf
->nice_level
);
545 pa_log_debug("Can realtime: %s, can high-priority: %s", pa_yes_no(pa_can_realtime()), pa_yes_no(pa_can_high_priority()));
547 if (!real_root
&& pa_have_caps()) {
550 drop
= (conf
->cmd
!= PA_CMD_DAEMON
&& conf
->cmd
!= PA_CMD_START
) || !conf
->realtime_scheduling
;
555 /* At this point we still have CAP_NICE if we were loaded
556 * SUID root. If possible let's acquire RLIMIT_RTPRIO
557 * instead and give CAP_NICE up. */
559 if (getrlimit(RLIMIT_RTPRIO
, &rl
) >= 0) {
561 if (rl
.rlim_cur
>= 9)
564 rl
.rlim_max
= rl
.rlim_cur
= 9;
566 if (setrlimit(RLIMIT_RTPRIO
, &rl
) >= 0) {
567 pa_log_info(_("Successfully increased RLIMIT_RTPRIO"));
570 pa_log_warn(_("RLIMIT_RTPRIO failed: %s"), pa_cstrerror(errno
));
577 pa_log_info(_("Giving up CAP_NICE"));
583 if (conf
->realtime_scheduling
&& !pa_can_realtime()) {
584 pa_log_warn(_("Real-time scheduling enabled in configuration but not allowed by policy."));
585 conf
->realtime_scheduling
= FALSE
;
588 pa_log_debug("Can realtime: %s, can high-priority: %s", pa_yes_no(pa_can_realtime()), pa_yes_no(pa_can_high_priority()));
590 LTDL_SET_PRELOADED_SYMBOLS();
594 if (conf
->dl_search_path
)
595 lt_dlsetsearchpath(conf
->dl_search_path
);
600 WSAStartup(MAKEWORD(2, 0), &data
);
607 case PA_CMD_DUMP_MODULES
:
608 pa_dump_modules(conf
, argc
-d
, argv
+d
);
612 case PA_CMD_DUMP_CONF
: {
613 s
= pa_daemon_conf_dump(conf
);
620 case PA_CMD_DUMP_RESAMPLE_METHODS
: {
623 for (i
= 0; i
< PA_RESAMPLER_MAX
; i
++)
624 if (pa_resample_method_supported(i
))
625 printf("%s\n", pa_resample_method_to_string(i
));
632 pa_cmdline_help(argv
[0]);
636 case PA_CMD_VERSION
:
637 printf(PACKAGE_NAME
" "PACKAGE_VERSION
"\n");
644 if (pa_pid_file_check_running(&pid
, "pulseaudio") < 0)
645 pa_log_info(_("Daemon not running"));
647 pa_log_info(_("Daemon running as PID %u"), pid
);
656 if (pa_pid_file_kill(SIGINT
, NULL
, "pulseaudio") < 0)
657 pa_log(_("Failed to kill daemon: %s"), pa_cstrerror(errno
));
663 case PA_CMD_CLEANUP_SHM
:
665 if (pa_shm_cleanup() >= 0)
671 pa_assert(conf
->cmd
== PA_CMD_DAEMON
|| conf
->cmd
== PA_CMD_START
);
674 if (real_root
&& !conf
->system_instance
)
675 pa_log_warn(_("This program is not intended to be run as root (unless --system is specified)."));
676 else if (!real_root
&& conf
->system_instance
) {
677 pa_log(_("Root privileges required."));
681 if (conf
->cmd
== PA_CMD_START
&& conf
->system_instance
) {
682 pa_log(_("--start not supported for system instances."));
686 if (conf
->system_instance
&& !conf
->disallow_exit
)
687 pa_log_warn(_("Running in system mode, but --disallow-exit not set!"));
689 if (conf
->system_instance
&& !conf
->disallow_module_loading
)
690 pa_log_warn(_("Running in system mode, but --disallow-module-loading not set!"));
692 if (conf
->system_instance
&& !conf
->disable_shm
) {
693 pa_log_notice(_("Running in system mode, forcibly disabling SHM mode!"));
694 conf
->disable_shm
= TRUE
;
697 if (conf
->system_instance
&& conf
->exit_idle_time
>= 0) {
698 pa_log_notice(_("Running in system mode, forcibly disabling exit idle time!"));
699 conf
->exit_idle_time
= -1;
702 if (conf
->cmd
== PA_CMD_START
) {
703 /* If we shall start PA only when it is not running yet, we
704 * first take the autospawn lock to make things
707 if ((autospawn_fd
= pa_autospawn_lock_init()) < 0) {
708 pa_log("Failed to initialize autospawn lock");
712 if ((pa_autospawn_lock_acquire(TRUE
) < 0)) {
713 pa_log("Failed to acquire autospawn lock");
717 autospawn_locked
= TRUE
;
720 if (conf
->daemonize
) {
724 if (pa_stdio_acquire() < 0) {
725 pa_log(_("Failed to acquire stdio."));
730 if (pipe(daemon_pipe
) < 0) {
731 pa_log(_("pipe failed: %s"), pa_cstrerror(errno
));
735 if ((child
= fork()) < 0) {
736 pa_log(_("fork() failed: %s"), pa_cstrerror(errno
));
744 pa_assert_se(pa_close(daemon_pipe
[1]) == 0);
747 if ((n
= pa_loop_read(daemon_pipe
[0], &retval
, sizeof(retval
), NULL
)) != sizeof(retval
)) {
750 pa_log(_("read() failed: %s"), pa_cstrerror(errno
));
756 pa_log(_("Daemon startup failed."));
758 pa_log_info(_("Daemon startup successful."));
763 if (autospawn_fd
>= 0) {
764 /* The lock file is unlocked from the parent, so we need
765 * to close it in the child */
767 pa_autospawn_lock_release();
768 pa_autospawn_lock_done(TRUE
);
770 autospawn_locked
= FALSE
;
774 pa_assert_se(pa_close(daemon_pipe
[0]) == 0);
778 if (conf
->auto_log_target
)
779 pa_log_set_target(PA_LOG_SYSLOG
);
793 pa_assert_se(open("/dev/null", O_RDONLY
) == 0);
794 pa_assert_se(open("/dev/null", O_WRONLY
) == 1);
795 pa_assert_se(open("/dev/null", O_WRONLY
) == 2);
801 signal(SIGTTOU
, SIG_IGN
);
804 signal(SIGTTIN
, SIG_IGN
);
807 signal(SIGTSTP
, SIG_IGN
);
811 if ((tty_fd
= open("/dev/tty", O_RDWR
)) >= 0) {
812 ioctl(tty_fd
, TIOCNOTTY
, (char*) 0);
813 pa_assert_se(pa_close(tty_fd
) == 0);
818 pa_set_env("PULSE_INTERNAL", "1");
819 pa_assert_se(chdir("/") == 0);
822 if (conf
->system_instance
)
823 if (change_user() < 0)
826 pa_set_env("PULSE_SYSTEM", conf
->system_instance
? "1" : "0");
828 pa_log_info(_("This is PulseAudio %s"), PACKAGE_VERSION
);
829 pa_log_debug(_("Compilation host: %s"), CANONICAL_HOST
);
830 pa_log_debug(_("Compilation CFLAGS: %s"), PA_CFLAGS
);
832 s
= pa_uname_string();
833 pa_log_debug(_("Running on host: %s"), s
);
836 pa_log_debug(_("Found %u CPUs."), pa_ncpus());
838 pa_log_info(_("Page size is %lu bytes"), (unsigned long) PA_PAGE_SIZE
);
840 #ifdef HAVE_VALGRIND_MEMCHECK_H
841 pa_log_debug(_("Compiled with Valgrind support: yes"));
843 pa_log_debug(_("Compiled with Valgrind support: no"));
846 pa_log_debug(_("Running in valgrind mode: %s"), pa_yes_no(pa_in_valgrind()));
849 pa_log_debug(_("Optimized build: yes"));
851 pa_log_debug(_("Optimized build: no"));
854 if (!(s
= pa_machine_id())) {
855 pa_log(_("Failed to get machine ID"));
858 pa_log_info(_("Machine ID is %s."), s
);
861 if (!(s
= pa_get_runtime_dir()))
863 pa_log_info(_("Using runtime directory %s."), s
);
866 if (!(s
= pa_get_state_dir()))
868 pa_log_info(_("Using state directory %s."), s
);
871 pa_log_info(_("Running in system mode: %s"), pa_yes_no(pa_in_system_mode()));
873 if (conf
->use_pid_file
) {
876 if ((z
= pa_pid_file_create("pulseaudio")) != 0) {
878 if (conf
->cmd
== PA_CMD_START
&& z
> 0) {
879 /* If we are already running and with are run in
880 * --start mode, then let's return this as success. */
886 pa_log(_("pa_pid_file_create() failed."));
890 valid_pid_file
= TRUE
;
894 signal(SIGPIPE
, SIG_IGN
);
897 if (pa_rtclock_hrtimer())
898 pa_log_info(_("Fresh high-resolution timers available! Bon appetit!"));
900 pa_log_info(_("Dude, your kernel stinks! The chef's recommendation today is Linux with high-resolution timers enabled!"));
902 pa_rtclock_hrtimer_enable();
905 /* Valgrind uses SIGRTMAX. To easy debugging we don't use it here */
906 pa_rtsig_configure(SIGRTMIN
, SIGRTMAX
-1);
909 pa_assert_se(mainloop
= pa_mainloop_new());
911 if (!(c
= pa_core_new(pa_mainloop_get_api(mainloop
), !conf
->disable_shm
, conf
->shm_size
))) {
912 pa_log(_("pa_core_new() failed."));
916 c
->default_sample_spec
= conf
->default_sample_spec
;
917 c
->default_channel_map
= conf
->default_channel_map
;
918 c
->default_n_fragments
= conf
->default_n_fragments
;
919 c
->default_fragment_size_msec
= conf
->default_fragment_size_msec
;
920 c
->exit_idle_time
= conf
->exit_idle_time
;
921 c
->scache_idle_time
= conf
->scache_idle_time
;
922 c
->resample_method
= conf
->resample_method
;
923 c
->realtime_priority
= conf
->realtime_priority
;
924 c
->realtime_scheduling
= !!conf
->realtime_scheduling
;
925 c
->disable_remixing
= !!conf
->disable_remixing
;
926 c
->disable_lfe_remixing
= !!conf
->disable_lfe_remixing
;
927 c
->running_as_daemon
= !!conf
->daemonize
;
928 c
->disallow_exit
= conf
->disallow_exit
;
929 c
->flat_volumes
= conf
->flat_volumes
;
931 pa_assert_se(pa_signal_init(pa_mainloop_get_api(mainloop
)) == 0);
932 pa_signal_new(SIGINT
, signal_callback
, c
);
933 pa_signal_new(SIGTERM
, signal_callback
, c
);
935 pa_signal_new(SIGUSR1
, signal_callback
, c
);
938 pa_signal_new(SIGUSR2
, signal_callback
, c
);
941 pa_signal_new(SIGHUP
, signal_callback
, c
);
945 win32_timer
= pa_mainloop_get_api(mainloop
)->time_new(pa_mainloop_get_api(mainloop
), pa_gettimeofday(&win32_tv
), message_cb
, NULL
);
950 if (!conf
->no_cpu_limit
)
951 pa_assert_se(pa_cpu_limit_init(pa_mainloop_get_api(mainloop
)) == 0);
953 buf
= pa_strbuf_new();
954 if (conf
->load_default_script_file
) {
957 if ((f
= pa_daemon_conf_open_default_script_file(conf
))) {
958 r
= pa_cli_command_execute_file_stream(c
, f
, buf
, &conf
->fail
);
964 r
= pa_cli_command_execute(c
, conf
->script_commands
, buf
, &conf
->fail
);
966 pa_log_error("%s", s
= pa_strbuf_tostring_free(buf
));
969 /* We completed the initial module loading, so let's disable it
970 * from now on, if requested */
971 c
->disallow_module_loading
= !!conf
->disallow_module_loading
;
973 if (r
< 0 && conf
->fail
) {
974 pa_log(_("Failed to initialize daemon."));
978 if (!c
->modules
|| pa_idxset_size(c
->modules
) == 0) {
979 pa_log(_("Daemon startup without any loaded modules, refusing to work."));
984 if (daemon_pipe
[1] >= 0) {
986 pa_loop_write(daemon_pipe
[1], &ok
, sizeof(ok
), NULL
);
987 pa_close(daemon_pipe
[1]);
992 pa_log_info(_("Daemon startup complete."));
995 if (pa_mainloop_run(mainloop
, &retval
) < 0)
998 pa_log_info(_("Daemon shutdown initiated."));
1002 if (autospawn_fd
>= 0) {
1003 if (autospawn_locked
)
1004 pa_autospawn_lock_release();
1006 pa_autospawn_lock_done(FALSE
);
1011 pa_mainloop_get_api(mainloop
)->time_free(win32_timer
);
1016 pa_log_info(_("Daemon terminated."));
1019 if (!conf
->no_cpu_limit
)
1020 pa_cpu_limit_done();
1025 if (daemon_pipe
[1] >= 0)
1026 pa_loop_write(daemon_pipe
[1], &retval
, sizeof(retval
), NULL
);
1028 pa_close_pipe(daemon_pipe
);
1032 pa_mainloop_free(mainloop
);
1035 pa_daemon_conf_free(conf
);
1038 pa_pid_file_remove();