]> code.delx.au - pulseaudio/blob - src/daemon/main.c
daemon: take org.pulseaudio
[pulseaudio] / src / daemon / main.c
1 /***
2 This file is part of PulseAudio.
3
4 Copyright 2004-2006 Lennart Poettering
5 Copyright 2006 Pierre Ossman <ossman@cendio.se> for Cendio AB
6
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.
11
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.
16
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
20 USA.
21 ***/
22
23 #ifdef HAVE_CONFIG_H
24 #include <config.h>
25 #endif
26
27 #include <unistd.h>
28 #include <errno.h>
29 #include <string.h>
30 #include <stdlib.h>
31 #include <stdio.h>
32 #include <signal.h>
33 #include <stddef.h>
34 #include <ltdl.h>
35 #include <limits.h>
36 #include <fcntl.h>
37 #include <unistd.h>
38 #include <locale.h>
39 #include <sys/types.h>
40
41 #include <liboil/liboil.h>
42
43 #ifdef HAVE_SYS_IOCTL_H
44 #include <sys/ioctl.h>
45 #endif
46
47 #ifdef HAVE_PWD_H
48 #include <pwd.h>
49 #endif
50 #ifdef HAVE_GRP_H
51 #include <grp.h>
52 #endif
53
54 #ifdef HAVE_LIBWRAP
55 #include <syslog.h>
56 #include <tcpd.h>
57 #endif
58
59 #ifdef HAVE_DBUS
60 #include <dbus/dbus.h>
61 #endif
62
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>
68
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>
90 #ifdef HAVE_DBUS
91 #include <pulsecore/dbus-shared.h>
92 #endif
93
94 #include "cmdline.h"
95 #include "cpulimit.h"
96 #include "daemon-conf.h"
97 #include "dumpmodules.h"
98 #include "caps.h"
99 #include "ltdl-bind-now.h"
100 #include "polkit.h"
101
102 #ifdef HAVE_LIBWRAP
103 /* Only one instance of these variables */
104 int allow_severity = LOG_INFO;
105 int deny_severity = LOG_WARNING;
106 #endif
107
108 #ifdef HAVE_OSS
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;
113 #endif
114
115 #ifdef OS_IS_WIN32
116
117 static void message_cb(pa_mainloop_api*a, pa_time_event*e, const struct timeval *tv, void *userdata) {
118 MSG msg;
119 struct timeval tvnext;
120
121 while (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)) {
122 if (msg.message == WM_QUIT)
123 raise(SIGTERM);
124 else {
125 TranslateMessage(&msg);
126 DispatchMessage(&msg);
127 }
128 }
129
130 pa_timeval_add(pa_gettimeofday(&tvnext), 100000);
131 a->time_restart(e, &tvnext);
132 }
133
134 #endif
135
136 static void signal_callback(pa_mainloop_api*m, pa_signal_event *e, int sig, void *userdata) {
137 pa_log_info(_("Got signal %s."), pa_sig2str(sig));
138
139 switch (sig) {
140 #ifdef SIGUSR1
141 case SIGUSR1:
142 pa_module_load(userdata, "module-cli", NULL);
143 break;
144 #endif
145
146 #ifdef SIGUSR2
147 case SIGUSR2:
148 pa_module_load(userdata, "module-cli-protocol-unix", NULL);
149 break;
150 #endif
151
152 #ifdef SIGHUP
153 case SIGHUP: {
154 char *c = pa_full_status_string(userdata);
155 pa_log_notice("%s", c);
156 pa_xfree(c);
157 return;
158 }
159 #endif
160
161 case SIGINT:
162 case SIGTERM:
163 default:
164 pa_log_info(_("Exiting."));
165 m->quit(m, 1);
166 break;
167 }
168 }
169
170 #if defined(HAVE_PWD_H) && defined(HAVE_GRP_H)
171
172 static int change_user(void) {
173 struct passwd *pw;
174 struct group * gr;
175 int r;
176
177 /* This function is called only in system-wide mode. It creates a
178 * runtime dir in /var/run/ with proper UID/GID and drops privs
179 * afterwards. */
180
181 if (!(pw = getpwnam(PA_SYSTEM_USER))) {
182 pa_log(_("Failed to find user '%s'."), PA_SYSTEM_USER);
183 return -1;
184 }
185
186 if (!(gr = getgrnam(PA_SYSTEM_GROUP))) {
187 pa_log(_("Failed to find group '%s'."), PA_SYSTEM_GROUP);
188 return -1;
189 }
190
191 pa_log_info(_("Found user '%s' (UID %lu) and group '%s' (GID %lu)."),
192 PA_SYSTEM_USER, (unsigned long) pw->pw_uid,
193 PA_SYSTEM_GROUP, (unsigned long) gr->gr_gid);
194
195 if (pw->pw_gid != gr->gr_gid) {
196 pa_log(_("GID of user '%s' and of group '%s' don't match."), PA_SYSTEM_USER, PA_SYSTEM_GROUP);
197 return -1;
198 }
199
200 if (strcmp(pw->pw_dir, PA_SYSTEM_RUNTIME_PATH) != 0)
201 pa_log_warn(_("Home directory of user '%s' is not '%s', ignoring."), PA_SYSTEM_USER, PA_SYSTEM_RUNTIME_PATH);
202
203 if (pa_make_secure_dir(PA_SYSTEM_RUNTIME_PATH, 0755, pw->pw_uid, gr->gr_gid) < 0) {
204 pa_log(_("Failed to create '%s': %s"), PA_SYSTEM_RUNTIME_PATH, pa_cstrerror(errno));
205 return -1;
206 }
207
208 if (pa_make_secure_dir(PA_SYSTEM_STATE_PATH, 0700, pw->pw_uid, gr->gr_gid) < 0) {
209 pa_log(_("Failed to create '%s': %s"), PA_SYSTEM_STATE_PATH, pa_cstrerror(errno));
210 return -1;
211 }
212
213 /* We don't create the config dir here, because we don't need to write to it */
214
215 if (initgroups(PA_SYSTEM_USER, gr->gr_gid) != 0) {
216 pa_log(_("Failed to change group list: %s"), pa_cstrerror(errno));
217 return -1;
218 }
219
220 #if defined(HAVE_SETRESGID)
221 r = setresgid(gr->gr_gid, gr->gr_gid, gr->gr_gid);
222 #elif defined(HAVE_SETEGID)
223 if ((r = setgid(gr->gr_gid)) >= 0)
224 r = setegid(gr->gr_gid);
225 #elif defined(HAVE_SETREGID)
226 r = setregid(gr->gr_gid, gr->gr_gid);
227 #else
228 #error "No API to drop privileges"
229 #endif
230
231 if (r < 0) {
232 pa_log(_("Failed to change GID: %s"), pa_cstrerror(errno));
233 return -1;
234 }
235
236 #if defined(HAVE_SETRESUID)
237 r = setresuid(pw->pw_uid, pw->pw_uid, pw->pw_uid);
238 #elif defined(HAVE_SETEUID)
239 if ((r = setuid(pw->pw_uid)) >= 0)
240 r = seteuid(pw->pw_uid);
241 #elif defined(HAVE_SETREUID)
242 r = setreuid(pw->pw_uid, pw->pw_uid);
243 #else
244 #error "No API to drop privileges"
245 #endif
246
247 if (r < 0) {
248 pa_log(_("Failed to change UID: %s"), pa_cstrerror(errno));
249 return -1;
250 }
251
252 pa_set_env("USER", PA_SYSTEM_USER);
253 pa_set_env("USERNAME", PA_SYSTEM_USER);
254 pa_set_env("LOGNAME", PA_SYSTEM_USER);
255 pa_set_env("HOME", PA_SYSTEM_RUNTIME_PATH);
256
257 /* Relevant for pa_runtime_path() */
258 pa_set_env("PULSE_RUNTIME_PATH", PA_SYSTEM_RUNTIME_PATH);
259 pa_set_env("PULSE_CONFIG_PATH", PA_SYSTEM_CONFIG_PATH);
260 pa_set_env("PULSE_STATE_PATH", PA_SYSTEM_STATE_PATH);
261
262 pa_log_info(_("Successfully dropped root privileges."));
263
264 return 0;
265 }
266
267 #else /* HAVE_PWD_H && HAVE_GRP_H */
268
269 static int change_user(void) {
270 pa_log(_("System wide mode unsupported on this platform."));
271 return -1;
272 }
273
274 #endif /* HAVE_PWD_H && HAVE_GRP_H */
275
276 #ifdef HAVE_SYS_RESOURCE_H
277
278 static int set_one_rlimit(const pa_rlimit *r, int resource, const char *name) {
279 struct rlimit rl;
280 pa_assert(r);
281
282 if (!r->is_set)
283 return 0;
284
285 rl.rlim_cur = rl.rlim_max = r->value;
286
287 if (setrlimit(resource, &rl) < 0) {
288 pa_log_info(_("setrlimit(%s, (%u, %u)) failed: %s"), name, (unsigned) r->value, (unsigned) r->value, pa_cstrerror(errno));
289 return -1;
290 }
291
292 return 0;
293 }
294
295 static void set_all_rlimits(const pa_daemon_conf *conf) {
296 set_one_rlimit(&conf->rlimit_fsize, RLIMIT_FSIZE, "RLIMIT_FSIZE");
297 set_one_rlimit(&conf->rlimit_data, RLIMIT_DATA, "RLIMIT_DATA");
298 set_one_rlimit(&conf->rlimit_stack, RLIMIT_STACK, "RLIMIT_STACK");
299 set_one_rlimit(&conf->rlimit_core, RLIMIT_CORE, "RLIMIT_CORE");
300 #ifdef RLIMIT_RSS
301 set_one_rlimit(&conf->rlimit_rss, RLIMIT_RSS, "RLIMIT_RSS");
302 #endif
303 #ifdef RLIMIT_NPROC
304 set_one_rlimit(&conf->rlimit_nproc, RLIMIT_NPROC, "RLIMIT_NPROC");
305 #endif
306 #ifdef RLIMIT_NOFILE
307 set_one_rlimit(&conf->rlimit_nofile, RLIMIT_NOFILE, "RLIMIT_NOFILE");
308 #endif
309 #ifdef RLIMIT_MEMLOCK
310 set_one_rlimit(&conf->rlimit_memlock, RLIMIT_MEMLOCK, "RLIMIT_MEMLOCK");
311 #endif
312 #ifdef RLIMIT_AS
313 set_one_rlimit(&conf->rlimit_as, RLIMIT_AS, "RLIMIT_AS");
314 #endif
315 #ifdef RLIMIT_LOCKS
316 set_one_rlimit(&conf->rlimit_locks, RLIMIT_LOCKS, "RLIMIT_LOCKS");
317 #endif
318 #ifdef RLIMIT_SIGPENDING
319 set_one_rlimit(&conf->rlimit_sigpending, RLIMIT_SIGPENDING, "RLIMIT_SIGPENDING");
320 #endif
321 #ifdef RLIMIT_MSGQUEUE
322 set_one_rlimit(&conf->rlimit_msgqueue, RLIMIT_MSGQUEUE, "RLIMIT_MSGQUEUE");
323 #endif
324 #ifdef RLIMIT_NICE
325 set_one_rlimit(&conf->rlimit_nice, RLIMIT_NICE, "RLIMIT_NICE");
326 #endif
327 #ifdef RLIMIT_RTPRIO
328 set_one_rlimit(&conf->rlimit_rtprio, RLIMIT_RTPRIO, "RLIMIT_RTPRIO");
329 #endif
330 #ifdef RLIMIT_RTTIME
331 set_one_rlimit(&conf->rlimit_rttime, RLIMIT_RTTIME, "RLIMIT_RTTIME");
332 #endif
333 }
334 #endif
335
336 #ifdef HAVE_DBUS
337 static void register_org_pulseaudio(pa_core *c)
338 {
339 DBusError error;
340 pa_dbus_connection *conn;
341
342 dbus_error_init(&error);
343 if (!(conn = pa_dbus_bus_get(c, pa_in_system_mode() ? DBUS_BUS_SYSTEM : DBUS_BUS_SESSION, &error)) || dbus_error_is_set(&error)) {
344 pa_log_warn("Unable to contact DBUS: %s: %s", error.name, error.message);
345 goto finish_dbus;
346 }
347
348 if (dbus_bus_request_name (pa_dbus_connection_get(conn), "org.pulseaudio", 0, &error) == DBUS_REQUEST_NAME_REPLY_PRIMARY_OWNER)
349 pa_log_debug("Got org.pulseaudio!");
350 else if (dbus_error_is_set(&error))
351 pa_log_warn("Unable to get org.pulseaudio: %s: %s", error.name, error.message);
352
353 finish_dbus:
354 if (conn)
355 pa_dbus_connection_unref(conn);
356
357 dbus_error_free(&error);
358 }
359 #endif
360
361 int main(int argc, char *argv[]) {
362 pa_core *c = NULL;
363 pa_strbuf *buf = NULL;
364 pa_daemon_conf *conf = NULL;
365 pa_mainloop *mainloop = NULL;
366 char *s;
367 int r = 0, retval = 1, d = 0;
368 pa_bool_t suid_root, real_root;
369 pa_bool_t valid_pid_file = FALSE;
370 gid_t gid = (gid_t) -1;
371 pa_bool_t ltdl_init = FALSE;
372 int passed_fd = -1;
373 const char *e;
374 #ifdef HAVE_FORK
375 int daemon_pipe[2] = { -1, -1 };
376 #endif
377 #ifdef OS_IS_WIN32
378 pa_time_event *win32_timer;
379 struct timeval win32_tv;
380 #endif
381 int autospawn_fd = -1;
382 pa_bool_t autospawn_locked = FALSE;
383
384 pa_log_set_ident("pulseaudio");
385 pa_log_set_level(PA_LOG_INFO);
386 pa_log_set_flags(PA_LOG_COLORS|PA_LOG_PRINT_FILE|PA_LOG_PRINT_LEVEL, PA_LOG_RESET);
387
388 #if defined(__linux__) && defined(__OPTIMIZE__)
389 /*
390 Disable lazy relocations to make usage of external libraries
391 more deterministic for our RT threads. We abuse __OPTIMIZE__ as
392 a check whether we are a debug build or not.
393 */
394
395 if (!getenv("LD_BIND_NOW")) {
396 char *rp;
397
398 /* We have to execute ourselves, because the libc caches the
399 * value of $LD_BIND_NOW on initialization. */
400
401 pa_set_env("LD_BIND_NOW", "1");
402
403 if ((rp = pa_readlink("/proc/self/exe")))
404 pa_assert_se(execv(rp, argv) == 0);
405 else
406 pa_log_warn("Couldn't read /proc/self/exe, cannot self execute. Running in a chroot()?");
407 }
408 #endif
409
410 #ifdef HAVE_GETUID
411 real_root = getuid() == 0;
412 suid_root = !real_root && geteuid() == 0;
413 #else
414 real_root = FALSE;
415 suid_root = FALSE;
416 #endif
417
418 if (!real_root) {
419 /* Drop all capabilities except CAP_SYS_NICE */
420 pa_limit_caps();
421
422 /* Drop privileges, but keep CAP_SYS_NICE */
423 pa_drop_root();
424
425 /* After dropping root, the effective set is reset, hence,
426 * let's raise it again */
427 pa_limit_caps();
428
429 /* When capabilities are not supported we will not be able to
430 * aquire RT sched anymore. But yes, that's the way it is. It
431 * is just too risky tun let PA run as root all the time. */
432 }
433
434 if ((e = getenv("PULSE_PASSED_FD"))) {
435 passed_fd = atoi(e);
436
437 if (passed_fd <= 2)
438 passed_fd = -1;
439 }
440
441 pa_close_all(passed_fd, -1);
442
443 pa_reset_sigs(-1);
444 pa_unblock_sigs(-1);
445
446 /* At this point, we are a normal user, possibly with CAP_NICE if
447 * we were started SUID. If we are started as normal root, than we
448 * still are normal root. */
449
450 setlocale(LC_ALL, "");
451 pa_init_i18n();
452
453 conf = pa_daemon_conf_new();
454
455 if (pa_daemon_conf_load(conf, NULL) < 0)
456 goto finish;
457
458 if (pa_daemon_conf_env(conf) < 0)
459 goto finish;
460
461 if (pa_cmdline_parse(conf, argc, argv, &d) < 0) {
462 pa_log(_("Failed to parse command line."));
463 goto finish;
464 }
465
466 pa_log_set_level(conf->log_level);
467 pa_log_set_target(conf->auto_log_target ? PA_LOG_STDERR : conf->log_target);
468 if (conf->log_meta)
469 pa_log_set_flags(PA_LOG_PRINT_META, PA_LOG_SET);
470 if (conf->log_time)
471 pa_log_set_flags(PA_LOG_PRINT_TIME, PA_LOG_SET);
472 pa_log_set_show_backtrace(conf->log_backtrace);
473
474 pa_log_debug("Started as real root: %s, suid root: %s", pa_yes_no(real_root), pa_yes_no(suid_root));
475
476 if (!real_root && pa_have_caps()) {
477 #ifdef HAVE_SYS_RESOURCE_H
478 struct rlimit rl;
479 #endif
480 pa_bool_t allow_high_priority = FALSE, allow_realtime = FALSE;
481
482 /* Let's better not enable high prio or RT by default */
483
484 if (conf->high_priority && !allow_high_priority) {
485 if (pa_own_uid_in_group(PA_REALTIME_GROUP, &gid) > 0) {
486 pa_log_info(_("We're in the group '%s', allowing high-priority scheduling."), PA_REALTIME_GROUP);
487 allow_high_priority = TRUE;
488 }
489 }
490
491 if (conf->realtime_scheduling && !allow_realtime) {
492 if (pa_own_uid_in_group(PA_REALTIME_GROUP, &gid) > 0) {
493 pa_log_info(_("We're in the group '%s', allowing real-time scheduling."), PA_REALTIME_GROUP);
494 allow_realtime = TRUE;
495 }
496 }
497
498 #ifdef HAVE_POLKIT
499 if (conf->high_priority && !allow_high_priority) {
500 if (pa_polkit_check("org.pulseaudio.acquire-high-priority") > 0) {
501 pa_log_info(_("PolicyKit grants us acquire-high-priority privilege."));
502 allow_high_priority = TRUE;
503 } else
504 pa_log_info(_("PolicyKit refuses acquire-high-priority privilege."));
505 }
506
507 if (conf->realtime_scheduling && !allow_realtime) {
508 if (pa_polkit_check("org.pulseaudio.acquire-real-time") > 0) {
509 pa_log_info(_("PolicyKit grants us acquire-real-time privilege."));
510 allow_realtime = TRUE;
511 } else
512 pa_log_info(_("PolicyKit refuses acquire-real-time privilege."));
513 }
514 #endif
515
516 if (!allow_high_priority && !allow_realtime) {
517
518 /* OK, there's no further need to keep CAP_NICE. Hence
519 * let's give it up early */
520
521 pa_drop_caps();
522 }
523
524 #ifdef RLIMIT_RTPRIO
525 if (getrlimit(RLIMIT_RTPRIO, &rl) >= 0)
526 if (rl.rlim_cur > 0) {
527 pa_log_info("RLIMIT_RTPRIO is set to %u, allowing real-time scheduling.", (unsigned) rl.rlim_cur);
528 allow_realtime = TRUE;
529 }
530 #endif
531 #ifdef RLIMIT_NICE
532 if (getrlimit(RLIMIT_NICE, &rl) >= 0)
533 if (rl.rlim_cur > 20 ) {
534 pa_log_info("RLIMIT_NICE is set to %u, allowing high-priority scheduling.", (unsigned) rl.rlim_cur);
535 allow_high_priority = TRUE;
536 }
537 #endif
538
539 if ((conf->high_priority && !allow_high_priority) ||
540 (conf->realtime_scheduling && !allow_realtime))
541 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"
542 "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"
543 "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."),
544 PA_REALTIME_GROUP, PA_REALTIME_GROUP);
545
546
547 if (!allow_realtime)
548 conf->realtime_scheduling = FALSE;
549
550 if (!allow_high_priority)
551 conf->high_priority = FALSE;
552 }
553
554 #ifdef HAVE_SYS_RESOURCE_H
555 /* Reset resource limits. If we are run as root (for system mode)
556 * this might end up increasing the limits, which is intended
557 * behaviour. For all other cases, i.e. started as normal user, or
558 * SUID root at this point we should have no CAP_SYS_RESOURCE and
559 * increasing the limits thus should fail. Which is, too, intended
560 * behaviour */
561
562 set_all_rlimits(conf);
563 #endif
564
565 if (conf->high_priority && !pa_can_high_priority()) {
566 pa_log_warn(_("High-priority scheduling enabled in configuration but not allowed by policy."));
567 conf->high_priority = FALSE;
568 }
569
570 if (conf->high_priority && (conf->cmd == PA_CMD_DAEMON || conf->cmd == PA_CMD_START))
571 pa_raise_priority(conf->nice_level);
572
573 pa_log_debug("Can realtime: %s, can high-priority: %s", pa_yes_no(pa_can_realtime()), pa_yes_no(pa_can_high_priority()));
574
575 if (!real_root && pa_have_caps()) {
576 pa_bool_t drop;
577
578 drop = (conf->cmd != PA_CMD_DAEMON && conf->cmd != PA_CMD_START) || !conf->realtime_scheduling;
579
580 #ifdef RLIMIT_RTPRIO
581 if (!drop) {
582 struct rlimit rl;
583 /* At this point we still have CAP_NICE if we were loaded
584 * SUID root. If possible let's acquire RLIMIT_RTPRIO
585 * instead and give CAP_NICE up. */
586
587 if (getrlimit(RLIMIT_RTPRIO, &rl) >= 0) {
588
589 if (rl.rlim_cur >= 9)
590 drop = TRUE;
591 else {
592 rl.rlim_max = rl.rlim_cur = 9;
593
594 if (setrlimit(RLIMIT_RTPRIO, &rl) >= 0) {
595 pa_log_info(_("Successfully increased RLIMIT_RTPRIO"));
596 drop = TRUE;
597 } else
598 pa_log_warn(_("RLIMIT_RTPRIO failed: %s"), pa_cstrerror(errno));
599 }
600 }
601 }
602 #endif
603
604 if (drop) {
605 pa_log_info(_("Giving up CAP_NICE"));
606 pa_drop_caps();
607 suid_root = FALSE;
608 }
609 }
610
611 if (conf->realtime_scheduling && !pa_can_realtime()) {
612 pa_log_warn(_("Real-time scheduling enabled in configuration but not allowed by policy."));
613 conf->realtime_scheduling = FALSE;
614 }
615
616 pa_log_debug("Can realtime: %s, can high-priority: %s", pa_yes_no(pa_can_realtime()), pa_yes_no(pa_can_high_priority()));
617
618 LTDL_SET_PRELOADED_SYMBOLS();
619 pa_ltdl_init();
620 ltdl_init = TRUE;
621
622 if (conf->dl_search_path)
623 lt_dlsetsearchpath(conf->dl_search_path);
624
625 #ifdef OS_IS_WIN32
626 {
627 WSADATA data;
628 WSAStartup(MAKEWORD(2, 0), &data);
629 }
630 #endif
631
632 pa_random_seed();
633
634 switch (conf->cmd) {
635 case PA_CMD_DUMP_MODULES:
636 pa_dump_modules(conf, argc-d, argv+d);
637 retval = 0;
638 goto finish;
639
640 case PA_CMD_DUMP_CONF: {
641 s = pa_daemon_conf_dump(conf);
642 fputs(s, stdout);
643 pa_xfree(s);
644 retval = 0;
645 goto finish;
646 }
647
648 case PA_CMD_DUMP_RESAMPLE_METHODS: {
649 int i;
650
651 for (i = 0; i < PA_RESAMPLER_MAX; i++)
652 if (pa_resample_method_supported(i))
653 printf("%s\n", pa_resample_method_to_string(i));
654
655 retval = 0;
656 goto finish;
657 }
658
659 case PA_CMD_HELP :
660 pa_cmdline_help(argv[0]);
661 retval = 0;
662 goto finish;
663
664 case PA_CMD_VERSION :
665 printf(PACKAGE_NAME" "PACKAGE_VERSION"\n");
666 retval = 0;
667 goto finish;
668
669 case PA_CMD_CHECK: {
670 pid_t pid;
671
672 if (pa_pid_file_check_running(&pid, "pulseaudio") < 0)
673 pa_log_info(_("Daemon not running"));
674 else {
675 pa_log_info(_("Daemon running as PID %u"), pid);
676 retval = 0;
677 }
678
679 goto finish;
680
681 }
682 case PA_CMD_KILL:
683
684 if (pa_pid_file_kill(SIGINT, NULL, "pulseaudio") < 0)
685 pa_log(_("Failed to kill daemon: %s"), pa_cstrerror(errno));
686 else
687 retval = 0;
688
689 goto finish;
690
691 case PA_CMD_CLEANUP_SHM:
692
693 if (pa_shm_cleanup() >= 0)
694 retval = 0;
695
696 goto finish;
697
698 default:
699 pa_assert(conf->cmd == PA_CMD_DAEMON || conf->cmd == PA_CMD_START);
700 }
701
702 if (real_root && !conf->system_instance)
703 pa_log_warn(_("This program is not intended to be run as root (unless --system is specified)."));
704 else if (!real_root && conf->system_instance) {
705 pa_log(_("Root privileges required."));
706 goto finish;
707 }
708
709 if (conf->cmd == PA_CMD_START && conf->system_instance) {
710 pa_log(_("--start not supported for system instances."));
711 goto finish;
712 }
713
714 if (conf->system_instance && !conf->disallow_exit)
715 pa_log_warn(_("Running in system mode, but --disallow-exit not set!"));
716
717 if (conf->system_instance && !conf->disallow_module_loading)
718 pa_log_warn(_("Running in system mode, but --disallow-module-loading not set!"));
719
720 if (conf->system_instance && !conf->disable_shm) {
721 pa_log_notice(_("Running in system mode, forcibly disabling SHM mode!"));
722 conf->disable_shm = TRUE;
723 }
724
725 if (conf->system_instance && conf->exit_idle_time >= 0) {
726 pa_log_notice(_("Running in system mode, forcibly disabling exit idle time!"));
727 conf->exit_idle_time = -1;
728 }
729
730 if (conf->cmd == PA_CMD_START) {
731 /* If we shall start PA only when it is not running yet, we
732 * first take the autospawn lock to make things
733 * synchronous. */
734
735 if ((autospawn_fd = pa_autospawn_lock_init()) < 0) {
736 pa_log("Failed to initialize autospawn lock");
737 goto finish;
738 }
739
740 if ((pa_autospawn_lock_acquire(TRUE) < 0)) {
741 pa_log("Failed to acquire autospawn lock");
742 goto finish;
743 }
744
745 autospawn_locked = TRUE;
746 }
747
748 if (conf->daemonize) {
749 pid_t child;
750 int tty_fd;
751
752 if (pa_stdio_acquire() < 0) {
753 pa_log(_("Failed to acquire stdio."));
754 goto finish;
755 }
756
757 #ifdef HAVE_FORK
758 if (pipe(daemon_pipe) < 0) {
759 pa_log(_("pipe failed: %s"), pa_cstrerror(errno));
760 goto finish;
761 }
762
763 if ((child = fork()) < 0) {
764 pa_log(_("fork() failed: %s"), pa_cstrerror(errno));
765 goto finish;
766 }
767
768 if (child != 0) {
769 ssize_t n;
770 /* Father */
771
772 pa_assert_se(pa_close(daemon_pipe[1]) == 0);
773 daemon_pipe[1] = -1;
774
775 if ((n = pa_loop_read(daemon_pipe[0], &retval, sizeof(retval), NULL)) != sizeof(retval)) {
776
777 if (n < 0)
778 pa_log(_("read() failed: %s"), pa_cstrerror(errno));
779
780 retval = 1;
781 }
782
783 if (retval)
784 pa_log(_("Daemon startup failed."));
785 else
786 pa_log_info(_("Daemon startup successful."));
787
788 goto finish;
789 }
790
791 if (autospawn_fd >= 0) {
792 /* The lock file is unlocked from the parent, so we need
793 * to close it in the child */
794
795 pa_autospawn_lock_release();
796 pa_autospawn_lock_done(TRUE);
797
798 autospawn_locked = FALSE;
799 autospawn_fd = -1;
800 }
801
802 pa_assert_se(pa_close(daemon_pipe[0]) == 0);
803 daemon_pipe[0] = -1;
804 #endif
805
806 if (conf->auto_log_target)
807 pa_log_set_target(PA_LOG_SYSLOG);
808
809 #ifdef HAVE_SETSID
810 setsid();
811 #endif
812 #ifdef HAVE_SETPGID
813 setpgid(0,0);
814 #endif
815
816 #ifndef OS_IS_WIN32
817 pa_close(0);
818 pa_close(1);
819 pa_close(2);
820
821 pa_assert_se(open("/dev/null", O_RDONLY) == 0);
822 pa_assert_se(open("/dev/null", O_WRONLY) == 1);
823 pa_assert_se(open("/dev/null", O_WRONLY) == 2);
824 #else
825 FreeConsole();
826 #endif
827
828 #ifdef SIGTTOU
829 signal(SIGTTOU, SIG_IGN);
830 #endif
831 #ifdef SIGTTIN
832 signal(SIGTTIN, SIG_IGN);
833 #endif
834 #ifdef SIGTSTP
835 signal(SIGTSTP, SIG_IGN);
836 #endif
837
838 #ifdef TIOCNOTTY
839 if ((tty_fd = open("/dev/tty", O_RDWR)) >= 0) {
840 ioctl(tty_fd, TIOCNOTTY, (char*) 0);
841 pa_assert_se(pa_close(tty_fd) == 0);
842 }
843 #endif
844 }
845
846 pa_set_env("PULSE_INTERNAL", "1");
847 pa_assert_se(chdir("/") == 0);
848 umask(0022);
849
850 if (conf->system_instance)
851 if (change_user() < 0)
852 goto finish;
853
854 pa_set_env("PULSE_SYSTEM", conf->system_instance ? "1" : "0");
855
856 pa_log_info(_("This is PulseAudio %s"), PACKAGE_VERSION);
857 pa_log_debug(_("Compilation host: %s"), CANONICAL_HOST);
858 pa_log_debug(_("Compilation CFLAGS: %s"), PA_CFLAGS);
859
860 s = pa_uname_string();
861 pa_log_debug(_("Running on host: %s"), s);
862 pa_xfree(s);
863
864 pa_log_debug(_("Found %u CPUs."), pa_ncpus());
865
866 pa_log_info(_("Page size is %lu bytes"), (unsigned long) PA_PAGE_SIZE);
867
868 #ifdef HAVE_VALGRIND_MEMCHECK_H
869 pa_log_debug(_("Compiled with Valgrind support: yes"));
870 #else
871 pa_log_debug(_("Compiled with Valgrind support: no"));
872 #endif
873
874 pa_log_debug(_("Running in valgrind mode: %s"), pa_yes_no(pa_in_valgrind()));
875
876 #ifdef __OPTIMIZE__
877 pa_log_debug(_("Optimized build: yes"));
878 #else
879 pa_log_debug(_("Optimized build: no"));
880 #endif
881
882 #ifdef NDEBUG
883 pa_log_debug(_("NDEBUG defined, all asserts disabled."));
884 #elif defined(FASTPATH)
885 pa_log_debug(_("FASTPATH defined, only fast path asserts disabled."));
886 #else
887 pa_log_debug(_("All asserts enabled."));
888 #endif
889
890 if (!(s = pa_machine_id())) {
891 pa_log(_("Failed to get machine ID"));
892 goto finish;
893 }
894 pa_log_info(_("Machine ID is %s."), s);
895 pa_xfree(s);
896
897 if (!(s = pa_get_runtime_dir()))
898 goto finish;
899 pa_log_info(_("Using runtime directory %s."), s);
900 pa_xfree(s);
901
902 if (!(s = pa_get_state_dir()))
903 goto finish;
904 pa_log_info(_("Using state directory %s."), s);
905 pa_xfree(s);
906
907 pa_log_info(_("Running in system mode: %s"), pa_yes_no(pa_in_system_mode()));
908
909 if (conf->use_pid_file) {
910 int z;
911
912 if ((z = pa_pid_file_create("pulseaudio")) != 0) {
913
914 if (conf->cmd == PA_CMD_START && z > 0) {
915 /* If we are already running and with are run in
916 * --start mode, then let's return this as success. */
917
918 retval = 0;
919 goto finish;
920 }
921
922 pa_log(_("pa_pid_file_create() failed."));
923 goto finish;
924 }
925
926 valid_pid_file = TRUE;
927 }
928
929 #ifdef SIGPIPE
930 signal(SIGPIPE, SIG_IGN);
931 #endif
932
933 if (pa_rtclock_hrtimer())
934 pa_log_info(_("Fresh high-resolution timers available! Bon appetit!"));
935 else
936 pa_log_info(_("Dude, your kernel stinks! The chef's recommendation today is Linux with high-resolution timers enabled!"));
937
938 pa_rtclock_hrtimer_enable();
939
940 #ifdef SIGRTMIN
941 /* Valgrind uses SIGRTMAX. To easy debugging we don't use it here */
942 pa_rtsig_configure(SIGRTMIN, SIGRTMAX-1);
943 #endif
944
945 pa_assert_se(mainloop = pa_mainloop_new());
946
947 if (!(c = pa_core_new(pa_mainloop_get_api(mainloop), !conf->disable_shm, conf->shm_size))) {
948 pa_log(_("pa_core_new() failed."));
949 goto finish;
950 }
951
952 c->default_sample_spec = conf->default_sample_spec;
953 c->default_channel_map = conf->default_channel_map;
954 c->default_n_fragments = conf->default_n_fragments;
955 c->default_fragment_size_msec = conf->default_fragment_size_msec;
956 c->exit_idle_time = conf->exit_idle_time;
957 c->scache_idle_time = conf->scache_idle_time;
958 c->resample_method = conf->resample_method;
959 c->realtime_priority = conf->realtime_priority;
960 c->realtime_scheduling = !!conf->realtime_scheduling;
961 c->disable_remixing = !!conf->disable_remixing;
962 c->disable_lfe_remixing = !!conf->disable_lfe_remixing;
963 c->running_as_daemon = !!conf->daemonize;
964 c->disallow_exit = conf->disallow_exit;
965 c->flat_volumes = conf->flat_volumes;
966
967 pa_assert_se(pa_signal_init(pa_mainloop_get_api(mainloop)) == 0);
968 pa_signal_new(SIGINT, signal_callback, c);
969 pa_signal_new(SIGTERM, signal_callback, c);
970 #ifdef SIGUSR1
971 pa_signal_new(SIGUSR1, signal_callback, c);
972 #endif
973 #ifdef SIGUSR2
974 pa_signal_new(SIGUSR2, signal_callback, c);
975 #endif
976 #ifdef SIGHUP
977 pa_signal_new(SIGHUP, signal_callback, c);
978 #endif
979
980 #ifdef OS_IS_WIN32
981 win32_timer = pa_mainloop_get_api(mainloop)->time_new(pa_mainloop_get_api(mainloop), pa_gettimeofday(&win32_tv), message_cb, NULL);
982 #endif
983
984 oil_init();
985
986 if (!conf->no_cpu_limit)
987 pa_assert_se(pa_cpu_limit_init(pa_mainloop_get_api(mainloop)) == 0);
988
989 buf = pa_strbuf_new();
990 if (conf->load_default_script_file) {
991 FILE *f;
992
993 if ((f = pa_daemon_conf_open_default_script_file(conf))) {
994 r = pa_cli_command_execute_file_stream(c, f, buf, &conf->fail);
995 fclose(f);
996 }
997 }
998
999 if (r >= 0)
1000 r = pa_cli_command_execute(c, conf->script_commands, buf, &conf->fail);
1001
1002 pa_log_error("%s", s = pa_strbuf_tostring_free(buf));
1003 pa_xfree(s);
1004
1005 /* We completed the initial module loading, so let's disable it
1006 * from now on, if requested */
1007 c->disallow_module_loading = !!conf->disallow_module_loading;
1008
1009 if (r < 0 && conf->fail) {
1010 pa_log(_("Failed to initialize daemon."));
1011 goto finish;
1012 }
1013
1014 if (!c->modules || pa_idxset_size(c->modules) == 0) {
1015 pa_log(_("Daemon startup without any loaded modules, refusing to work."));
1016 goto finish;
1017 }
1018
1019 #ifdef HAVE_FORK
1020 if (daemon_pipe[1] >= 0) {
1021 int ok = 0;
1022 pa_loop_write(daemon_pipe[1], &ok, sizeof(ok), NULL);
1023 pa_close(daemon_pipe[1]);
1024 daemon_pipe[1] = -1;
1025 }
1026 #endif
1027
1028 #ifdef HAVE_DBUS
1029 register_org_pulseaudio(c);
1030 #endif
1031
1032 pa_log_info(_("Daemon startup complete."));
1033
1034 retval = 0;
1035 if (pa_mainloop_run(mainloop, &retval) < 0)
1036 goto finish;
1037
1038 pa_log_info(_("Daemon shutdown initiated."));
1039
1040 finish:
1041
1042 if (autospawn_fd >= 0) {
1043 if (autospawn_locked)
1044 pa_autospawn_lock_release();
1045
1046 pa_autospawn_lock_done(FALSE);
1047 }
1048
1049 #ifdef OS_IS_WIN32
1050 if (win32_timer)
1051 pa_mainloop_get_api(mainloop)->time_free(win32_timer);
1052 #endif
1053
1054 if (c) {
1055 pa_core_unref(c);
1056 pa_log_info(_("Daemon terminated."));
1057 }
1058
1059 if (!conf->no_cpu_limit)
1060 pa_cpu_limit_done();
1061
1062 pa_signal_done();
1063
1064 #ifdef HAVE_FORK
1065 if (daemon_pipe[1] >= 0)
1066 pa_loop_write(daemon_pipe[1], &retval, sizeof(retval), NULL);
1067
1068 pa_close_pipe(daemon_pipe);
1069 #endif
1070
1071 if (mainloop)
1072 pa_mainloop_free(mainloop);
1073
1074 if (conf)
1075 pa_daemon_conf_free(conf);
1076
1077 if (valid_pid_file)
1078 pa_pid_file_remove();
1079
1080 #ifdef OS_IS_WIN32
1081 WSACleanup();
1082 #endif
1083
1084 if (ltdl_init)
1085 pa_ltdl_done();
1086
1087 #ifdef HAVE_DBUS
1088 dbus_shutdown();
1089 #endif
1090
1091 return retval;
1092 }