]> code.delx.au - pulseaudio/blob - src/daemon/main.c
Merge commit 'origin/master-tx'
[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 pa_dbus_connection *register_dbus(pa_core *c) {
338 DBusError error;
339 pa_dbus_connection *conn;
340
341 dbus_error_init(&error);
342
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 D-Bus: %s: %s", error.name, error.message);
345 goto fail;
346 }
347
348 if (dbus_bus_request_name(pa_dbus_connection_get(conn), "org.pulseaudio.Server", DBUS_NAME_FLAG_DO_NOT_QUEUE, &error) == DBUS_REQUEST_NAME_REPLY_PRIMARY_OWNER) {
349 pa_log_debug("Got org.pulseaudio.Server!");
350 return conn;
351 }
352
353 if (dbus_error_is_set(&error))
354 pa_log_warn("Failed to acquire org.pulseaudio.Server: %s: %s", error.name, error.message);
355 else
356 pa_log_warn("D-Bus name org.pulseaudio.Server already taken. Weird shit!");
357
358 /* PA cannot be started twice by the same user and hence we can
359 * ignore mostly the case that org.pulseaudio.Server is already
360 * taken. */
361
362 fail:
363
364 if (conn)
365 pa_dbus_connection_unref(conn);
366
367 dbus_error_free(&error);
368 return NULL;
369 }
370 #endif
371
372 int main(int argc, char *argv[]) {
373 pa_core *c = NULL;
374 pa_strbuf *buf = NULL;
375 pa_daemon_conf *conf = NULL;
376 pa_mainloop *mainloop = NULL;
377 char *s;
378 int r = 0, retval = 1, d = 0;
379 pa_bool_t suid_root, real_root;
380 pa_bool_t valid_pid_file = FALSE;
381 gid_t gid = (gid_t) -1;
382 pa_bool_t ltdl_init = FALSE;
383 int passed_fd = -1;
384 const char *e;
385 #ifdef HAVE_FORK
386 int daemon_pipe[2] = { -1, -1 };
387 #endif
388 #ifdef OS_IS_WIN32
389 pa_time_event *win32_timer;
390 struct timeval win32_tv;
391 #endif
392 int autospawn_fd = -1;
393 pa_bool_t autospawn_locked = FALSE;
394 #ifdef HAVE_DBUS
395 pa_dbus_connection *dbus = NULL;
396 #endif
397
398 pa_log_set_ident("pulseaudio");
399 pa_log_set_level(PA_LOG_INFO);
400 pa_log_set_flags(PA_LOG_COLORS|PA_LOG_PRINT_FILE|PA_LOG_PRINT_LEVEL, PA_LOG_RESET);
401
402 #if defined(__linux__) && defined(__OPTIMIZE__)
403 /*
404 Disable lazy relocations to make usage of external libraries
405 more deterministic for our RT threads. We abuse __OPTIMIZE__ as
406 a check whether we are a debug build or not.
407 */
408
409 if (!getenv("LD_BIND_NOW")) {
410 char *rp;
411
412 /* We have to execute ourselves, because the libc caches the
413 * value of $LD_BIND_NOW on initialization. */
414
415 pa_set_env("LD_BIND_NOW", "1");
416
417 if ((rp = pa_readlink("/proc/self/exe")))
418 pa_assert_se(execv(rp, argv) == 0);
419 else
420 pa_log_warn("Couldn't read /proc/self/exe, cannot self execute. Running in a chroot()?");
421 }
422 #endif
423
424 #ifdef HAVE_GETUID
425 real_root = getuid() == 0;
426 suid_root = !real_root && geteuid() == 0;
427 #else
428 real_root = FALSE;
429 suid_root = FALSE;
430 #endif
431
432 if (!real_root) {
433 /* Drop all capabilities except CAP_SYS_NICE */
434 pa_limit_caps();
435
436 /* Drop privileges, but keep CAP_SYS_NICE */
437 pa_drop_root();
438
439 /* After dropping root, the effective set is reset, hence,
440 * let's raise it again */
441 pa_limit_caps();
442
443 /* When capabilities are not supported we will not be able to
444 * acquire RT sched anymore. But yes, that's the way it is. It
445 * is just too risky tun let PA run as root all the time. */
446 }
447
448 if ((e = getenv("PULSE_PASSED_FD"))) {
449 passed_fd = atoi(e);
450
451 if (passed_fd <= 2)
452 passed_fd = -1;
453 }
454
455 pa_close_all(passed_fd, -1);
456
457 pa_reset_sigs(-1);
458 pa_unblock_sigs(-1);
459
460 /* At this point, we are a normal user, possibly with CAP_NICE if
461 * we were started SUID. If we are started as normal root, than we
462 * still are normal root. */
463
464 setlocale(LC_ALL, "");
465 pa_init_i18n();
466
467 conf = pa_daemon_conf_new();
468
469 if (pa_daemon_conf_load(conf, NULL) < 0)
470 goto finish;
471
472 if (pa_daemon_conf_env(conf) < 0)
473 goto finish;
474
475 if (pa_cmdline_parse(conf, argc, argv, &d) < 0) {
476 pa_log(_("Failed to parse command line."));
477 goto finish;
478 }
479
480 pa_log_set_level(conf->log_level);
481 pa_log_set_target(conf->auto_log_target ? PA_LOG_STDERR : conf->log_target);
482 if (conf->log_meta)
483 pa_log_set_flags(PA_LOG_PRINT_META, PA_LOG_SET);
484 if (conf->log_time)
485 pa_log_set_flags(PA_LOG_PRINT_TIME, PA_LOG_SET);
486 pa_log_set_show_backtrace(conf->log_backtrace);
487
488 pa_log_debug("Started as real root: %s, suid root: %s", pa_yes_no(real_root), pa_yes_no(suid_root));
489
490 if (!real_root && pa_have_caps()) {
491 #ifdef HAVE_SYS_RESOURCE_H
492 struct rlimit rl;
493 #endif
494 pa_bool_t allow_high_priority = FALSE, allow_realtime = FALSE;
495
496 /* Let's better not enable high prio or RT by default */
497
498 if (conf->high_priority && !allow_high_priority) {
499 if (pa_own_uid_in_group(PA_REALTIME_GROUP, &gid) > 0) {
500 pa_log_info(_("We're in the group '%s', allowing high-priority scheduling."), PA_REALTIME_GROUP);
501 allow_high_priority = TRUE;
502 }
503 }
504
505 if (conf->realtime_scheduling && !allow_realtime) {
506 if (pa_own_uid_in_group(PA_REALTIME_GROUP, &gid) > 0) {
507 pa_log_info(_("We're in the group '%s', allowing real-time scheduling."), PA_REALTIME_GROUP);
508 allow_realtime = TRUE;
509 }
510 }
511
512 #ifdef HAVE_POLKIT
513 if (conf->high_priority && !allow_high_priority) {
514 if (pa_polkit_check("org.pulseaudio.acquire-high-priority") > 0) {
515 pa_log_info(_("PolicyKit grants us acquire-high-priority privilege."));
516 allow_high_priority = TRUE;
517 } else
518 pa_log_info(_("PolicyKit refuses acquire-high-priority privilege."));
519 }
520
521 if (conf->realtime_scheduling && !allow_realtime) {
522 if (pa_polkit_check("org.pulseaudio.acquire-real-time") > 0) {
523 pa_log_info(_("PolicyKit grants us acquire-real-time privilege."));
524 allow_realtime = TRUE;
525 } else
526 pa_log_info(_("PolicyKit refuses acquire-real-time privilege."));
527 }
528 #endif
529
530 if (!allow_high_priority && !allow_realtime) {
531
532 /* OK, there's no further need to keep CAP_NICE. Hence
533 * let's give it up early */
534
535 pa_drop_caps();
536 }
537
538 #ifdef RLIMIT_RTPRIO
539 if (getrlimit(RLIMIT_RTPRIO, &rl) >= 0)
540 if (rl.rlim_cur > 0) {
541 pa_log_info("RLIMIT_RTPRIO is set to %u, allowing real-time scheduling.", (unsigned) rl.rlim_cur);
542 allow_realtime = TRUE;
543 }
544 #endif
545 #ifdef RLIMIT_NICE
546 if (getrlimit(RLIMIT_NICE, &rl) >= 0)
547 if (rl.rlim_cur > 20 ) {
548 pa_log_info("RLIMIT_NICE is set to %u, allowing high-priority scheduling.", (unsigned) rl.rlim_cur);
549 allow_high_priority = TRUE;
550 }
551 #endif
552
553 if ((conf->high_priority && !allow_high_priority) ||
554 (conf->realtime_scheduling && !allow_realtime))
555 pa_log_info(_("Called SUID root and real-time and/or high-priority scheduling was requested in the configuration. However, we lack the necessary privileges:\n"
556 "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"
557 "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."),
558 PA_REALTIME_GROUP, PA_REALTIME_GROUP);
559
560
561 if (!allow_realtime)
562 conf->realtime_scheduling = FALSE;
563
564 if (!allow_high_priority)
565 conf->high_priority = FALSE;
566 }
567
568 #ifdef HAVE_SYS_RESOURCE_H
569 /* Reset resource limits. If we are run as root (for system mode)
570 * this might end up increasing the limits, which is intended
571 * behaviour. For all other cases, i.e. started as normal user, or
572 * SUID root at this point we should have no CAP_SYS_RESOURCE and
573 * increasing the limits thus should fail. Which is, too, intended
574 * behaviour */
575
576 set_all_rlimits(conf);
577 #endif
578
579 if (conf->high_priority && !pa_can_high_priority()) {
580 pa_log_info(_("High-priority scheduling enabled in configuration but not allowed by policy."));
581 conf->high_priority = FALSE;
582 }
583
584 if (conf->high_priority && (conf->cmd == PA_CMD_DAEMON || conf->cmd == PA_CMD_START))
585 pa_raise_priority(conf->nice_level);
586
587 pa_log_debug("Can realtime: %s, can high-priority: %s", pa_yes_no(pa_can_realtime()), pa_yes_no(pa_can_high_priority()));
588
589 if (!real_root && pa_have_caps()) {
590 pa_bool_t drop;
591
592 drop = (conf->cmd != PA_CMD_DAEMON && conf->cmd != PA_CMD_START) || !conf->realtime_scheduling;
593
594 #ifdef RLIMIT_RTPRIO
595 if (!drop) {
596 struct rlimit rl;
597 /* At this point we still have CAP_NICE if we were loaded
598 * SUID root. If possible let's acquire RLIMIT_RTPRIO
599 * instead and give CAP_NICE up. */
600
601 if (getrlimit(RLIMIT_RTPRIO, &rl) >= 0) {
602
603 if (rl.rlim_cur >= 9)
604 drop = TRUE;
605 else {
606 rl.rlim_max = rl.rlim_cur = 9;
607
608 if (setrlimit(RLIMIT_RTPRIO, &rl) >= 0) {
609 pa_log_info(_("Successfully increased RLIMIT_RTPRIO"));
610 drop = TRUE;
611 } else
612 pa_log_warn(_("RLIMIT_RTPRIO failed: %s"), pa_cstrerror(errno));
613 }
614 }
615 }
616 #endif
617
618 if (drop) {
619 pa_log_info(_("Giving up CAP_NICE"));
620 pa_drop_caps();
621 suid_root = FALSE;
622 }
623 }
624
625 if (conf->realtime_scheduling && !pa_can_realtime()) {
626 pa_log_info(_("Real-time scheduling enabled in configuration but not allowed by policy."));
627 conf->realtime_scheduling = FALSE;
628 }
629
630 pa_log_debug("Can realtime: %s, can high-priority: %s", pa_yes_no(pa_can_realtime()), pa_yes_no(pa_can_high_priority()));
631
632 LTDL_SET_PRELOADED_SYMBOLS();
633 pa_ltdl_init();
634 ltdl_init = TRUE;
635
636 if (conf->dl_search_path)
637 lt_dlsetsearchpath(conf->dl_search_path);
638
639 #ifdef OS_IS_WIN32
640 {
641 WSADATA data;
642 WSAStartup(MAKEWORD(2, 0), &data);
643 }
644 #endif
645
646 pa_random_seed();
647
648 switch (conf->cmd) {
649 case PA_CMD_DUMP_MODULES:
650 pa_dump_modules(conf, argc-d, argv+d);
651 retval = 0;
652 goto finish;
653
654 case PA_CMD_DUMP_CONF: {
655 s = pa_daemon_conf_dump(conf);
656 fputs(s, stdout);
657 pa_xfree(s);
658 retval = 0;
659 goto finish;
660 }
661
662 case PA_CMD_DUMP_RESAMPLE_METHODS: {
663 int i;
664
665 for (i = 0; i < PA_RESAMPLER_MAX; i++)
666 if (pa_resample_method_supported(i))
667 printf("%s\n", pa_resample_method_to_string(i));
668
669 retval = 0;
670 goto finish;
671 }
672
673 case PA_CMD_HELP :
674 pa_cmdline_help(argv[0]);
675 retval = 0;
676 goto finish;
677
678 case PA_CMD_VERSION :
679 printf(PACKAGE_NAME" "PACKAGE_VERSION"\n");
680 retval = 0;
681 goto finish;
682
683 case PA_CMD_CHECK: {
684 pid_t pid;
685
686 if (pa_pid_file_check_running(&pid, "pulseaudio") < 0)
687 pa_log_info(_("Daemon not running"));
688 else {
689 pa_log_info(_("Daemon running as PID %u"), pid);
690 retval = 0;
691 }
692
693 goto finish;
694
695 }
696 case PA_CMD_KILL:
697
698 if (pa_pid_file_kill(SIGINT, NULL, "pulseaudio") < 0)
699 pa_log(_("Failed to kill daemon: %s"), pa_cstrerror(errno));
700 else
701 retval = 0;
702
703 goto finish;
704
705 case PA_CMD_CLEANUP_SHM:
706
707 if (pa_shm_cleanup() >= 0)
708 retval = 0;
709
710 goto finish;
711
712 default:
713 pa_assert(conf->cmd == PA_CMD_DAEMON || conf->cmd == PA_CMD_START);
714 }
715
716 if (real_root && !conf->system_instance)
717 pa_log_warn(_("This program is not intended to be run as root (unless --system is specified)."));
718 else if (!real_root && conf->system_instance) {
719 pa_log(_("Root privileges required."));
720 goto finish;
721 }
722
723 if (conf->cmd == PA_CMD_START && conf->system_instance) {
724 pa_log(_("--start not supported for system instances."));
725 goto finish;
726 }
727
728 if (conf->system_instance && !conf->disallow_exit)
729 pa_log_warn(_("Running in system mode, but --disallow-exit not set!"));
730
731 if (conf->system_instance && !conf->disallow_module_loading)
732 pa_log_warn(_("Running in system mode, but --disallow-module-loading not set!"));
733
734 if (conf->system_instance && !conf->disable_shm) {
735 pa_log_notice(_("Running in system mode, forcibly disabling SHM mode!"));
736 conf->disable_shm = TRUE;
737 }
738
739 if (conf->system_instance && conf->exit_idle_time >= 0) {
740 pa_log_notice(_("Running in system mode, forcibly disabling exit idle time!"));
741 conf->exit_idle_time = -1;
742 }
743
744 if (conf->cmd == PA_CMD_START) {
745 /* If we shall start PA only when it is not running yet, we
746 * first take the autospawn lock to make things
747 * synchronous. */
748
749 if ((autospawn_fd = pa_autospawn_lock_init()) < 0) {
750 pa_log("Failed to initialize autospawn lock");
751 goto finish;
752 }
753
754 if ((pa_autospawn_lock_acquire(TRUE) < 0)) {
755 pa_log("Failed to acquire autospawn lock");
756 goto finish;
757 }
758
759 autospawn_locked = TRUE;
760 }
761
762 if (conf->daemonize) {
763 pid_t child;
764 int tty_fd;
765
766 if (pa_stdio_acquire() < 0) {
767 pa_log(_("Failed to acquire stdio."));
768 goto finish;
769 }
770
771 #ifdef HAVE_FORK
772 if (pipe(daemon_pipe) < 0) {
773 pa_log(_("pipe failed: %s"), pa_cstrerror(errno));
774 goto finish;
775 }
776
777 if ((child = fork()) < 0) {
778 pa_log(_("fork() failed: %s"), pa_cstrerror(errno));
779 goto finish;
780 }
781
782 if (child != 0) {
783 ssize_t n;
784 /* Father */
785
786 pa_assert_se(pa_close(daemon_pipe[1]) == 0);
787 daemon_pipe[1] = -1;
788
789 if ((n = pa_loop_read(daemon_pipe[0], &retval, sizeof(retval), NULL)) != sizeof(retval)) {
790
791 if (n < 0)
792 pa_log(_("read() failed: %s"), pa_cstrerror(errno));
793
794 retval = 1;
795 }
796
797 if (retval)
798 pa_log(_("Daemon startup failed."));
799 else
800 pa_log_info(_("Daemon startup successful."));
801
802 goto finish;
803 }
804
805 if (autospawn_fd >= 0) {
806 /* The lock file is unlocked from the parent, so we need
807 * to close it in the child */
808
809 pa_autospawn_lock_release();
810 pa_autospawn_lock_done(TRUE);
811
812 autospawn_locked = FALSE;
813 autospawn_fd = -1;
814 }
815
816 pa_assert_se(pa_close(daemon_pipe[0]) == 0);
817 daemon_pipe[0] = -1;
818 #endif
819
820 if (conf->auto_log_target)
821 pa_log_set_target(PA_LOG_SYSLOG);
822
823 #ifdef HAVE_SETSID
824 setsid();
825 #endif
826 #ifdef HAVE_SETPGID
827 setpgid(0,0);
828 #endif
829
830 #ifndef OS_IS_WIN32
831 pa_close(0);
832 pa_close(1);
833 pa_close(2);
834
835 pa_assert_se(open("/dev/null", O_RDONLY) == 0);
836 pa_assert_se(open("/dev/null", O_WRONLY) == 1);
837 pa_assert_se(open("/dev/null", O_WRONLY) == 2);
838 #else
839 FreeConsole();
840 #endif
841
842 #ifdef SIGTTOU
843 signal(SIGTTOU, SIG_IGN);
844 #endif
845 #ifdef SIGTTIN
846 signal(SIGTTIN, SIG_IGN);
847 #endif
848 #ifdef SIGTSTP
849 signal(SIGTSTP, SIG_IGN);
850 #endif
851
852 #ifdef TIOCNOTTY
853 if ((tty_fd = open("/dev/tty", O_RDWR)) >= 0) {
854 ioctl(tty_fd, TIOCNOTTY, (char*) 0);
855 pa_assert_se(pa_close(tty_fd) == 0);
856 }
857 #endif
858 }
859
860 pa_set_env("PULSE_INTERNAL", "1");
861 pa_assert_se(chdir("/") == 0);
862 umask(0022);
863
864 if (conf->system_instance)
865 if (change_user() < 0)
866 goto finish;
867
868 pa_set_env("PULSE_SYSTEM", conf->system_instance ? "1" : "0");
869
870 pa_log_info(_("This is PulseAudio %s"), PACKAGE_VERSION);
871 pa_log_debug(_("Compilation host: %s"), CANONICAL_HOST);
872 pa_log_debug(_("Compilation CFLAGS: %s"), PA_CFLAGS);
873
874 s = pa_uname_string();
875 pa_log_debug(_("Running on host: %s"), s);
876 pa_xfree(s);
877
878 pa_log_debug(_("Found %u CPUs."), pa_ncpus());
879
880 pa_log_info(_("Page size is %lu bytes"), (unsigned long) PA_PAGE_SIZE);
881
882 #ifdef HAVE_VALGRIND_MEMCHECK_H
883 pa_log_debug(_("Compiled with Valgrind support: yes"));
884 #else
885 pa_log_debug(_("Compiled with Valgrind support: no"));
886 #endif
887
888 pa_log_debug(_("Running in valgrind mode: %s"), pa_yes_no(pa_in_valgrind()));
889
890 #ifdef __OPTIMIZE__
891 pa_log_debug(_("Optimized build: yes"));
892 #else
893 pa_log_debug(_("Optimized build: no"));
894 #endif
895
896 #ifdef NDEBUG
897 pa_log_debug(_("NDEBUG defined, all asserts disabled."));
898 #elif defined(FASTPATH)
899 pa_log_debug(_("FASTPATH defined, only fast path asserts disabled."));
900 #else
901 pa_log_debug(_("All asserts enabled."));
902 #endif
903
904 if (!(s = pa_machine_id())) {
905 pa_log(_("Failed to get machine ID"));
906 goto finish;
907 }
908 pa_log_info(_("Machine ID is %s."), s);
909 pa_xfree(s);
910
911 if (!(s = pa_get_runtime_dir()))
912 goto finish;
913 pa_log_info(_("Using runtime directory %s."), s);
914 pa_xfree(s);
915
916 if (!(s = pa_get_state_dir()))
917 goto finish;
918 pa_log_info(_("Using state directory %s."), s);
919 pa_xfree(s);
920
921 pa_log_info(_("Running in system mode: %s"), pa_yes_no(pa_in_system_mode()));
922
923 if (conf->use_pid_file) {
924 int z;
925
926 if ((z = pa_pid_file_create("pulseaudio")) != 0) {
927
928 if (conf->cmd == PA_CMD_START && z > 0) {
929 /* If we are already running and with are run in
930 * --start mode, then let's return this as success. */
931
932 retval = 0;
933 goto finish;
934 }
935
936 pa_log(_("pa_pid_file_create() failed."));
937 goto finish;
938 }
939
940 valid_pid_file = TRUE;
941 }
942
943 #ifdef SIGPIPE
944 signal(SIGPIPE, SIG_IGN);
945 #endif
946
947 if (pa_rtclock_hrtimer())
948 pa_log_info(_("Fresh high-resolution timers available! Bon appetit!"));
949 else
950 pa_log_info(_("Dude, your kernel stinks! The chef's recommendation today is Linux with high-resolution timers enabled!"));
951
952 pa_rtclock_hrtimer_enable();
953
954 #ifdef SIGRTMIN
955 /* Valgrind uses SIGRTMAX. To easy debugging we don't use it here */
956 pa_rtsig_configure(SIGRTMIN, SIGRTMAX-1);
957 #endif
958
959 pa_assert_se(mainloop = pa_mainloop_new());
960
961 if (!(c = pa_core_new(pa_mainloop_get_api(mainloop), !conf->disable_shm, conf->shm_size))) {
962 pa_log(_("pa_core_new() failed."));
963 goto finish;
964 }
965
966 c->default_sample_spec = conf->default_sample_spec;
967 c->default_channel_map = conf->default_channel_map;
968 c->default_n_fragments = conf->default_n_fragments;
969 c->default_fragment_size_msec = conf->default_fragment_size_msec;
970 c->exit_idle_time = conf->exit_idle_time;
971 c->scache_idle_time = conf->scache_idle_time;
972 c->resample_method = conf->resample_method;
973 c->realtime_priority = conf->realtime_priority;
974 c->realtime_scheduling = !!conf->realtime_scheduling;
975 c->disable_remixing = !!conf->disable_remixing;
976 c->disable_lfe_remixing = !!conf->disable_lfe_remixing;
977 c->running_as_daemon = !!conf->daemonize;
978 c->disallow_exit = conf->disallow_exit;
979 c->flat_volumes = conf->flat_volumes;
980
981 pa_assert_se(pa_signal_init(pa_mainloop_get_api(mainloop)) == 0);
982 pa_signal_new(SIGINT, signal_callback, c);
983 pa_signal_new(SIGTERM, signal_callback, c);
984 #ifdef SIGUSR1
985 pa_signal_new(SIGUSR1, signal_callback, c);
986 #endif
987 #ifdef SIGUSR2
988 pa_signal_new(SIGUSR2, signal_callback, c);
989 #endif
990 #ifdef SIGHUP
991 pa_signal_new(SIGHUP, signal_callback, c);
992 #endif
993
994 #ifdef OS_IS_WIN32
995 win32_timer = pa_mainloop_get_api(mainloop)->time_new(pa_mainloop_get_api(mainloop), pa_gettimeofday(&win32_tv), message_cb, NULL);
996 #endif
997
998 oil_init();
999
1000 if (!conf->no_cpu_limit)
1001 pa_assert_se(pa_cpu_limit_init(pa_mainloop_get_api(mainloop)) == 0);
1002
1003 buf = pa_strbuf_new();
1004 if (conf->load_default_script_file) {
1005 FILE *f;
1006
1007 if ((f = pa_daemon_conf_open_default_script_file(conf))) {
1008 r = pa_cli_command_execute_file_stream(c, f, buf, &conf->fail);
1009 fclose(f);
1010 }
1011 }
1012
1013 if (r >= 0)
1014 r = pa_cli_command_execute(c, conf->script_commands, buf, &conf->fail);
1015
1016 pa_log_error("%s", s = pa_strbuf_tostring_free(buf));
1017 pa_xfree(s);
1018
1019 /* We completed the initial module loading, so let's disable it
1020 * from now on, if requested */
1021 c->disallow_module_loading = !!conf->disallow_module_loading;
1022
1023 if (r < 0 && conf->fail) {
1024 pa_log(_("Failed to initialize daemon."));
1025 goto finish;
1026 }
1027
1028 if (!c->modules || pa_idxset_size(c->modules) == 0) {
1029 pa_log(_("Daemon startup without any loaded modules, refusing to work."));
1030 goto finish;
1031 }
1032
1033 #ifdef HAVE_FORK
1034 if (daemon_pipe[1] >= 0) {
1035 int ok = 0;
1036 pa_loop_write(daemon_pipe[1], &ok, sizeof(ok), NULL);
1037 pa_close(daemon_pipe[1]);
1038 daemon_pipe[1] = -1;
1039 }
1040 #endif
1041
1042 #ifdef HAVE_DBUS
1043 dbus = register_dbus(c);
1044 #endif
1045
1046 pa_log_info(_("Daemon startup complete."));
1047
1048 retval = 0;
1049 if (pa_mainloop_run(mainloop, &retval) < 0)
1050 goto finish;
1051
1052 pa_log_info(_("Daemon shutdown initiated."));
1053
1054 finish:
1055 #ifdef HAVE_DBUS
1056 if (dbus)
1057 pa_dbus_connection_unref(dbus);
1058 #endif
1059
1060 if (autospawn_fd >= 0) {
1061 if (autospawn_locked)
1062 pa_autospawn_lock_release();
1063
1064 pa_autospawn_lock_done(FALSE);
1065 }
1066
1067 #ifdef OS_IS_WIN32
1068 if (win32_timer)
1069 pa_mainloop_get_api(mainloop)->time_free(win32_timer);
1070 #endif
1071
1072 if (c) {
1073 pa_core_unref(c);
1074 pa_log_info(_("Daemon terminated."));
1075 }
1076
1077 if (!conf->no_cpu_limit)
1078 pa_cpu_limit_done();
1079
1080 pa_signal_done();
1081
1082 #ifdef HAVE_FORK
1083 if (daemon_pipe[1] >= 0)
1084 pa_loop_write(daemon_pipe[1], &retval, sizeof(retval), NULL);
1085
1086 pa_close_pipe(daemon_pipe);
1087 #endif
1088
1089 if (mainloop)
1090 pa_mainloop_free(mainloop);
1091
1092 if (conf)
1093 pa_daemon_conf_free(conf);
1094
1095 if (valid_pid_file)
1096 pa_pid_file_remove();
1097
1098 #ifdef OS_IS_WIN32
1099 WSACleanup();
1100 #endif
1101
1102 if (ltdl_init)
1103 pa_ltdl_done();
1104
1105 #ifdef HAVE_DBUS
1106 dbus_shutdown();
1107 #endif
1108
1109 return retval;
1110 }