]> code.delx.au - pulseaudio/blob - src/daemon/main.c
Merge remote branch 'coling/history'
[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 #include <sys/stat.h>
41
42 #ifdef HAVE_SYS_MMAN_H
43 #include <sys/mman.h>
44 #endif
45
46 #ifdef HAVE_SYS_IOCTL_H
47 #include <sys/ioctl.h>
48 #endif
49
50 #ifdef HAVE_PWD_H
51 #include <pwd.h>
52 #endif
53 #ifdef HAVE_GRP_H
54 #include <grp.h>
55 #endif
56
57 #ifdef HAVE_LIBWRAP
58 #include <syslog.h>
59 #include <tcpd.h>
60 #endif
61
62 #ifdef HAVE_DBUS
63 #include <dbus/dbus.h>
64 #endif
65
66 #include <pulse/mainloop.h>
67 #include <pulse/mainloop-signal.h>
68 #include <pulse/timeval.h>
69 #include <pulse/xmalloc.h>
70 #include <pulse/i18n.h>
71
72 #include <pulsecore/lock-autospawn.h>
73 #include <pulsecore/winsock.h>
74 #include <pulsecore/core-error.h>
75 #include <pulsecore/core-rtclock.h>
76 #include <pulsecore/core.h>
77 #include <pulsecore/memblock.h>
78 #include <pulsecore/module.h>
79 #include <pulsecore/cli-command.h>
80 #include <pulsecore/log.h>
81 #include <pulsecore/core-util.h>
82 #include <pulsecore/sioman.h>
83 #include <pulsecore/cli-text.h>
84 #include <pulsecore/pid.h>
85 #include <pulsecore/namereg.h>
86 #include <pulsecore/random.h>
87 #include <pulsecore/macro.h>
88 #include <pulsecore/mutex.h>
89 #include <pulsecore/thread.h>
90 #include <pulsecore/once.h>
91 #include <pulsecore/shm.h>
92 #include <pulsecore/memtrap.h>
93 #ifdef HAVE_DBUS
94 #include <pulsecore/dbus-shared.h>
95 #endif
96 #include <pulsecore/cpu-arm.h>
97 #include <pulsecore/cpu-x86.h>
98
99 #include "cmdline.h"
100 #include "cpulimit.h"
101 #include "daemon-conf.h"
102 #include "dumpmodules.h"
103 #include "caps.h"
104 #include "ltdl-bind-now.h"
105 #include "server-lookup.h"
106
107 #ifdef HAVE_LIBWRAP
108 /* Only one instance of these variables */
109 int allow_severity = LOG_INFO;
110 int deny_severity = LOG_WARNING;
111 #endif
112
113 #ifdef HAVE_OSS_WRAPPER
114 /* padsp looks for this symbol in the running process and disables
115 * itself if it finds it and it is set to 7 (which is actually a bit
116 * mask). For details see padsp. */
117 int __padsp_disabled__ = 7;
118 #endif
119
120 #ifdef OS_IS_WIN32
121
122 static void message_cb(pa_mainloop_api*a, pa_time_event*e, const struct timeval *tv, void *userdata) {
123 MSG msg;
124 struct timeval tvnext;
125
126 while (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE)) {
127 if (msg.message == WM_QUIT)
128 raise(SIGTERM);
129 else {
130 TranslateMessage(&msg);
131 DispatchMessage(&msg);
132 }
133 }
134
135 pa_timeval_add(pa_gettimeofday(&tvnext), 100000);
136 a->rtclock_time_restart(e, &tvnext);
137 }
138
139 #endif
140
141 static void signal_callback(pa_mainloop_api*m, pa_signal_event *e, int sig, void *userdata) {
142 pa_log_info(_("Got signal %s."), pa_sig2str(sig));
143
144 switch (sig) {
145 #ifdef SIGUSR1
146 case SIGUSR1:
147 pa_module_load(userdata, "module-cli", NULL);
148 break;
149 #endif
150
151 #ifdef SIGUSR2
152 case SIGUSR2:
153 pa_module_load(userdata, "module-cli-protocol-unix", NULL);
154 break;
155 #endif
156
157 #ifdef SIGHUP
158 case SIGHUP: {
159 char *c = pa_full_status_string(userdata);
160 pa_log_notice("%s", c);
161 pa_xfree(c);
162 return;
163 }
164 #endif
165
166 case SIGINT:
167 case SIGTERM:
168 default:
169 pa_log_info(_("Exiting."));
170 m->quit(m, 1);
171 break;
172 }
173 }
174
175 #if defined(HAVE_PWD_H) && defined(HAVE_GRP_H)
176
177 static int change_user(void) {
178 struct passwd *pw;
179 struct group * gr;
180 int r;
181
182 /* This function is called only in system-wide mode. It creates a
183 * runtime dir in /var/run/ with proper UID/GID and drops privs
184 * afterwards. */
185
186 if (!(pw = getpwnam(PA_SYSTEM_USER))) {
187 pa_log(_("Failed to find user '%s'."), PA_SYSTEM_USER);
188 return -1;
189 }
190
191 if (!(gr = getgrnam(PA_SYSTEM_GROUP))) {
192 pa_log(_("Failed to find group '%s'."), PA_SYSTEM_GROUP);
193 return -1;
194 }
195
196 pa_log_info(_("Found user '%s' (UID %lu) and group '%s' (GID %lu)."),
197 PA_SYSTEM_USER, (unsigned long) pw->pw_uid,
198 PA_SYSTEM_GROUP, (unsigned long) gr->gr_gid);
199
200 if (pw->pw_gid != gr->gr_gid) {
201 pa_log(_("GID of user '%s' and of group '%s' don't match."), PA_SYSTEM_USER, PA_SYSTEM_GROUP);
202 return -1;
203 }
204
205 if (strcmp(pw->pw_dir, PA_SYSTEM_RUNTIME_PATH) != 0)
206 pa_log_warn(_("Home directory of user '%s' is not '%s', ignoring."), PA_SYSTEM_USER, PA_SYSTEM_RUNTIME_PATH);
207
208 if (pa_make_secure_dir(PA_SYSTEM_RUNTIME_PATH, 0755, pw->pw_uid, gr->gr_gid) < 0) {
209 pa_log(_("Failed to create '%s': %s"), PA_SYSTEM_RUNTIME_PATH, pa_cstrerror(errno));
210 return -1;
211 }
212
213 if (pa_make_secure_dir(PA_SYSTEM_STATE_PATH, 0700, pw->pw_uid, gr->gr_gid) < 0) {
214 pa_log(_("Failed to create '%s': %s"), PA_SYSTEM_STATE_PATH, pa_cstrerror(errno));
215 return -1;
216 }
217
218 /* We don't create the config dir here, because we don't need to write to it */
219
220 if (initgroups(PA_SYSTEM_USER, gr->gr_gid) != 0) {
221 pa_log(_("Failed to change group list: %s"), pa_cstrerror(errno));
222 return -1;
223 }
224
225 #if defined(HAVE_SETRESGID)
226 r = setresgid(gr->gr_gid, gr->gr_gid, gr->gr_gid);
227 #elif defined(HAVE_SETEGID)
228 if ((r = setgid(gr->gr_gid)) >= 0)
229 r = setegid(gr->gr_gid);
230 #elif defined(HAVE_SETREGID)
231 r = setregid(gr->gr_gid, gr->gr_gid);
232 #else
233 #error "No API to drop privileges"
234 #endif
235
236 if (r < 0) {
237 pa_log(_("Failed to change GID: %s"), pa_cstrerror(errno));
238 return -1;
239 }
240
241 #if defined(HAVE_SETRESUID)
242 r = setresuid(pw->pw_uid, pw->pw_uid, pw->pw_uid);
243 #elif defined(HAVE_SETEUID)
244 if ((r = setuid(pw->pw_uid)) >= 0)
245 r = seteuid(pw->pw_uid);
246 #elif defined(HAVE_SETREUID)
247 r = setreuid(pw->pw_uid, pw->pw_uid);
248 #else
249 #error "No API to drop privileges"
250 #endif
251
252 if (r < 0) {
253 pa_log(_("Failed to change UID: %s"), pa_cstrerror(errno));
254 return -1;
255 }
256
257 pa_set_env("USER", PA_SYSTEM_USER);
258 pa_set_env("USERNAME", PA_SYSTEM_USER);
259 pa_set_env("LOGNAME", PA_SYSTEM_USER);
260 pa_set_env("HOME", PA_SYSTEM_RUNTIME_PATH);
261
262 /* Relevant for pa_runtime_path() */
263 if (!getenv("PULSE_RUNTIME_PATH"))
264 pa_set_env("PULSE_RUNTIME_PATH", PA_SYSTEM_RUNTIME_PATH);
265
266 if (!getenv("PULSE_CONFIG_PATH"))
267 pa_set_env("PULSE_CONFIG_PATH", PA_SYSTEM_CONFIG_PATH);
268
269 if (!getenv("PULSE_STATE_PATH"))
270 pa_set_env("PULSE_STATE_PATH", PA_SYSTEM_STATE_PATH);
271
272 pa_log_info(_("Successfully dropped root privileges."));
273
274 return 0;
275 }
276
277 #else /* HAVE_PWD_H && HAVE_GRP_H */
278
279 static int change_user(void) {
280 pa_log(_("System wide mode unsupported on this platform."));
281 return -1;
282 }
283
284 #endif /* HAVE_PWD_H && HAVE_GRP_H */
285
286 #ifdef HAVE_SYS_RESOURCE_H
287
288 static int set_one_rlimit(const pa_rlimit *r, int resource, const char *name) {
289 struct rlimit rl;
290 pa_assert(r);
291
292 if (!r->is_set)
293 return 0;
294
295 rl.rlim_cur = rl.rlim_max = r->value;
296
297 if (setrlimit(resource, &rl) < 0) {
298 pa_log_info(_("setrlimit(%s, (%u, %u)) failed: %s"), name, (unsigned) r->value, (unsigned) r->value, pa_cstrerror(errno));
299 return -1;
300 }
301
302 return 0;
303 }
304
305 static void set_all_rlimits(const pa_daemon_conf *conf) {
306 set_one_rlimit(&conf->rlimit_fsize, RLIMIT_FSIZE, "RLIMIT_FSIZE");
307 set_one_rlimit(&conf->rlimit_data, RLIMIT_DATA, "RLIMIT_DATA");
308 set_one_rlimit(&conf->rlimit_stack, RLIMIT_STACK, "RLIMIT_STACK");
309 set_one_rlimit(&conf->rlimit_core, RLIMIT_CORE, "RLIMIT_CORE");
310 #ifdef RLIMIT_RSS
311 set_one_rlimit(&conf->rlimit_rss, RLIMIT_RSS, "RLIMIT_RSS");
312 #endif
313 #ifdef RLIMIT_NPROC
314 set_one_rlimit(&conf->rlimit_nproc, RLIMIT_NPROC, "RLIMIT_NPROC");
315 #endif
316 #ifdef RLIMIT_NOFILE
317 set_one_rlimit(&conf->rlimit_nofile, RLIMIT_NOFILE, "RLIMIT_NOFILE");
318 #endif
319 #ifdef RLIMIT_MEMLOCK
320 set_one_rlimit(&conf->rlimit_memlock, RLIMIT_MEMLOCK, "RLIMIT_MEMLOCK");
321 #endif
322 #ifdef RLIMIT_AS
323 set_one_rlimit(&conf->rlimit_as, RLIMIT_AS, "RLIMIT_AS");
324 #endif
325 #ifdef RLIMIT_LOCKS
326 set_one_rlimit(&conf->rlimit_locks, RLIMIT_LOCKS, "RLIMIT_LOCKS");
327 #endif
328 #ifdef RLIMIT_SIGPENDING
329 set_one_rlimit(&conf->rlimit_sigpending, RLIMIT_SIGPENDING, "RLIMIT_SIGPENDING");
330 #endif
331 #ifdef RLIMIT_MSGQUEUE
332 set_one_rlimit(&conf->rlimit_msgqueue, RLIMIT_MSGQUEUE, "RLIMIT_MSGQUEUE");
333 #endif
334 #ifdef RLIMIT_NICE
335 set_one_rlimit(&conf->rlimit_nice, RLIMIT_NICE, "RLIMIT_NICE");
336 #endif
337 #ifdef RLIMIT_RTPRIO
338 set_one_rlimit(&conf->rlimit_rtprio, RLIMIT_RTPRIO, "RLIMIT_RTPRIO");
339 #endif
340 #ifdef RLIMIT_RTTIME
341 set_one_rlimit(&conf->rlimit_rttime, RLIMIT_RTTIME, "RLIMIT_RTTIME");
342 #endif
343 }
344 #endif
345
346 #ifdef HAVE_DBUS
347 static pa_dbus_connection *register_dbus_name(pa_core *c, DBusBusType bus, const char* name) {
348 DBusError error;
349 pa_dbus_connection *conn;
350
351 dbus_error_init(&error);
352
353 if (!(conn = pa_dbus_bus_get(c, bus, &error)) || dbus_error_is_set(&error)) {
354 pa_log_warn("Unable to contact D-Bus: %s: %s", error.name, error.message);
355 goto fail;
356 }
357
358 if (dbus_bus_request_name(pa_dbus_connection_get(conn), name, DBUS_NAME_FLAG_DO_NOT_QUEUE, &error) == DBUS_REQUEST_NAME_REPLY_PRIMARY_OWNER) {
359 pa_log_debug("Got %s!", name);
360 return conn;
361 }
362
363 if (dbus_error_is_set(&error))
364 pa_log_error("Failed to acquire %s: %s: %s", name, error.name, error.message);
365 else
366 pa_log_error("D-Bus name %s already taken. Weird shit!", name);
367
368 /* PA cannot be started twice by the same user and hence we can
369 * ignore mostly the case that a name is already taken. */
370
371 fail:
372 if (conn)
373 pa_dbus_connection_unref(conn);
374
375 dbus_error_free(&error);
376 return NULL;
377 }
378 #endif
379
380 int main(int argc, char *argv[]) {
381 pa_core *c = NULL;
382 pa_strbuf *buf = NULL;
383 pa_daemon_conf *conf = NULL;
384 pa_mainloop *mainloop = NULL;
385 char *s;
386 int r = 0, retval = 1, d = 0;
387 pa_bool_t valid_pid_file = FALSE;
388 pa_bool_t ltdl_init = FALSE;
389 int passed_fd = -1;
390 const char *e;
391 #ifdef HAVE_FORK
392 int daemon_pipe[2] = { -1, -1 };
393 #endif
394 #ifdef OS_IS_WIN32
395 pa_time_event *win32_timer;
396 struct timeval win32_tv;
397 #endif
398 int autospawn_fd = -1;
399 pa_bool_t autospawn_locked = FALSE;
400 #ifdef HAVE_DBUS
401 pa_dbusobj_server_lookup *server_lookup = NULL; /* /org/pulseaudio/server_lookup */
402 pa_dbus_connection *lookup_service_bus = NULL; /* Always the user bus. */
403 pa_dbus_connection *server_bus = NULL; /* The bus where we reserve org.pulseaudio.Server, either the user or the system bus. */
404 pa_bool_t start_server;
405 #endif
406
407 pa_log_set_ident("pulseaudio");
408 pa_log_set_level(PA_LOG_NOTICE);
409 pa_log_set_flags(PA_LOG_COLORS|PA_LOG_PRINT_FILE|PA_LOG_PRINT_LEVEL, PA_LOG_RESET);
410
411 #if defined(__linux__) && defined(__OPTIMIZE__)
412 /*
413 Disable lazy relocations to make usage of external libraries
414 more deterministic for our RT threads. We abuse __OPTIMIZE__ as
415 a check whether we are a debug build or not. This all is
416 admittedly a bit snake-oilish.
417 */
418
419 if (!getenv("LD_BIND_NOW")) {
420 char *rp;
421 char *canonical_rp;
422
423 /* We have to execute ourselves, because the libc caches the
424 * value of $LD_BIND_NOW on initialization. */
425
426 pa_set_env("LD_BIND_NOW", "1");
427
428 canonical_rp = pa_realpath(PA_BINARY);
429
430 if ((rp = pa_readlink("/proc/self/exe"))) {
431
432 if (pa_streq(rp, canonical_rp))
433 pa_assert_se(execv(rp, argv) == 0);
434 else
435 pa_log_warn("/proc/self/exe does not point to %s, cannot self execute. Are you playing games?", canonical_rp);
436
437 pa_xfree(rp);
438
439 } else
440 pa_log_warn("Couldn't read /proc/self/exe, cannot self execute. Running in a chroot()?");
441
442 pa_xfree(canonical_rp);
443 }
444 #endif
445
446 if ((e = getenv("PULSE_PASSED_FD"))) {
447 passed_fd = atoi(e);
448
449 if (passed_fd <= 2)
450 passed_fd = -1;
451 }
452
453 /* We might be autospawned, in which case have no idea in which
454 * context we have been started. Let's cleanup our execution
455 * context as good as possible */
456
457 pa_reset_personality();
458 pa_drop_root();
459 pa_close_all(passed_fd, -1);
460 pa_reset_sigs(-1);
461 pa_unblock_sigs(-1);
462 pa_reset_priority();
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 #ifdef HAVE_DBUS
489 /* conf->system_instance and conf->local_server_type control almost the
490 * same thing; make them agree about what is requested. */
491 switch (conf->local_server_type) {
492 case PA_SERVER_TYPE_UNSET:
493 conf->local_server_type = conf->system_instance ? PA_SERVER_TYPE_SYSTEM : PA_SERVER_TYPE_USER;
494 break;
495 case PA_SERVER_TYPE_USER:
496 case PA_SERVER_TYPE_NONE:
497 conf->system_instance = FALSE;
498 break;
499 case PA_SERVER_TYPE_SYSTEM:
500 conf->system_instance = TRUE;
501 break;
502 default:
503 pa_assert_not_reached();
504 }
505
506 start_server = conf->local_server_type == PA_SERVER_TYPE_USER || (getuid() == 0 && conf->local_server_type == PA_SERVER_TYPE_SYSTEM);
507
508 if (!start_server && conf->local_server_type == PA_SERVER_TYPE_SYSTEM) {
509 pa_log_notice(_("System mode refused for non-root user. Only starting the D-Bus server lookup service."));
510 conf->system_instance = FALSE;
511 }
512 #endif
513
514 LTDL_SET_PRELOADED_SYMBOLS();
515 pa_ltdl_init();
516 ltdl_init = TRUE;
517
518 if (conf->dl_search_path)
519 lt_dlsetsearchpath(conf->dl_search_path);
520
521 #ifdef OS_IS_WIN32
522 {
523 WSADATA data;
524 WSAStartup(MAKEWORD(2, 0), &data);
525 }
526 #endif
527
528 pa_random_seed();
529
530 switch (conf->cmd) {
531 case PA_CMD_DUMP_MODULES:
532 pa_dump_modules(conf, argc-d, argv+d);
533 retval = 0;
534 goto finish;
535
536 case PA_CMD_DUMP_CONF: {
537 s = pa_daemon_conf_dump(conf);
538 fputs(s, stdout);
539 pa_xfree(s);
540 retval = 0;
541 goto finish;
542 }
543
544 case PA_CMD_DUMP_RESAMPLE_METHODS: {
545 int i;
546
547 for (i = 0; i < PA_RESAMPLER_MAX; i++)
548 if (pa_resample_method_supported(i))
549 printf("%s\n", pa_resample_method_to_string(i));
550
551 retval = 0;
552 goto finish;
553 }
554
555 case PA_CMD_HELP :
556 pa_cmdline_help(argv[0]);
557 retval = 0;
558 goto finish;
559
560 case PA_CMD_VERSION :
561 printf(PACKAGE_NAME" "PACKAGE_VERSION"\n");
562 retval = 0;
563 goto finish;
564
565 case PA_CMD_CHECK: {
566 pid_t pid;
567
568 if (pa_pid_file_check_running(&pid, "pulseaudio") < 0)
569 pa_log_info(_("Daemon not running"));
570 else {
571 pa_log_info(_("Daemon running as PID %u"), pid);
572 retval = 0;
573 }
574
575 goto finish;
576
577 }
578 case PA_CMD_KILL:
579
580 if (pa_pid_file_kill(SIGINT, NULL, "pulseaudio") < 0)
581 pa_log(_("Failed to kill daemon: %s"), pa_cstrerror(errno));
582 else
583 retval = 0;
584
585 goto finish;
586
587 case PA_CMD_CLEANUP_SHM:
588
589 if (pa_shm_cleanup() >= 0)
590 retval = 0;
591
592 goto finish;
593
594 default:
595 pa_assert(conf->cmd == PA_CMD_DAEMON || conf->cmd == PA_CMD_START);
596 }
597
598 if (getuid() == 0 && !conf->system_instance)
599 pa_log_warn(_("This program is not intended to be run as root (unless --system is specified)."));
600 #ifndef HAVE_DBUS /* A similar, only a notice worthy check was done earlier, if D-Bus is enabled. */
601 else if (getuid() != 0 && conf->system_instance) {
602 pa_log(_("Root privileges required."));
603 goto finish;
604 }
605 #endif
606
607 if (conf->cmd == PA_CMD_START && conf->system_instance) {
608 pa_log(_("--start not supported for system instances."));
609 goto finish;
610 }
611
612 if (conf->system_instance && !conf->disallow_exit)
613 pa_log_warn(_("Running in system mode, but --disallow-exit not set!"));
614
615 if (conf->system_instance && !conf->disallow_module_loading)
616 pa_log_warn(_("Running in system mode, but --disallow-module-loading not set!"));
617
618 if (conf->system_instance && !conf->disable_shm) {
619 pa_log_notice(_("Running in system mode, forcibly disabling SHM mode!"));
620 conf->disable_shm = TRUE;
621 }
622
623 if (conf->system_instance && conf->exit_idle_time >= 0) {
624 pa_log_notice(_("Running in system mode, forcibly disabling exit idle time!"));
625 conf->exit_idle_time = -1;
626 }
627
628 if (conf->cmd == PA_CMD_START) {
629 /* If we shall start PA only when it is not running yet, we
630 * first take the autospawn lock to make things
631 * synchronous. */
632
633 if ((autospawn_fd = pa_autospawn_lock_init()) < 0) {
634 pa_log("Failed to initialize autospawn lock");
635 goto finish;
636 }
637
638 if ((pa_autospawn_lock_acquire(TRUE) < 0)) {
639 pa_log("Failed to acquire autospawn lock");
640 goto finish;
641 }
642
643 autospawn_locked = TRUE;
644 }
645
646 if (conf->daemonize) {
647 pid_t child;
648 int tty_fd;
649
650 if (pa_stdio_acquire() < 0) {
651 pa_log(_("Failed to acquire stdio."));
652 goto finish;
653 }
654
655 #ifdef HAVE_FORK
656 if (pipe(daemon_pipe) < 0) {
657 pa_log(_("pipe failed: %s"), pa_cstrerror(errno));
658 goto finish;
659 }
660
661 if ((child = fork()) < 0) {
662 pa_log(_("fork() failed: %s"), pa_cstrerror(errno));
663 goto finish;
664 }
665
666 if (child != 0) {
667 ssize_t n;
668 /* Father */
669
670 pa_assert_se(pa_close(daemon_pipe[1]) == 0);
671 daemon_pipe[1] = -1;
672
673 if ((n = pa_loop_read(daemon_pipe[0], &retval, sizeof(retval), NULL)) != sizeof(retval)) {
674
675 if (n < 0)
676 pa_log(_("read() failed: %s"), pa_cstrerror(errno));
677
678 retval = 1;
679 }
680
681 if (retval)
682 pa_log(_("Daemon startup failed."));
683 else
684 pa_log_info(_("Daemon startup successful."));
685
686 goto finish;
687 }
688
689 if (autospawn_fd >= 0) {
690 /* The lock file is unlocked from the parent, so we need
691 * to close it in the child */
692
693 pa_autospawn_lock_release();
694 pa_autospawn_lock_done(TRUE);
695
696 autospawn_locked = FALSE;
697 autospawn_fd = -1;
698 }
699
700 pa_assert_se(pa_close(daemon_pipe[0]) == 0);
701 daemon_pipe[0] = -1;
702 #endif
703
704 if (conf->auto_log_target)
705 pa_log_set_target(PA_LOG_SYSLOG);
706
707 #ifdef HAVE_SETSID
708 setsid();
709 #endif
710 #ifdef HAVE_SETPGID
711 setpgid(0,0);
712 #endif
713
714 #ifndef OS_IS_WIN32
715 pa_close(0);
716 pa_close(1);
717 pa_close(2);
718
719 pa_assert_se(open("/dev/null", O_RDONLY) == 0);
720 pa_assert_se(open("/dev/null", O_WRONLY) == 1);
721 pa_assert_se(open("/dev/null", O_WRONLY) == 2);
722 #else
723 FreeConsole();
724 #endif
725
726 #ifdef SIGTTOU
727 signal(SIGTTOU, SIG_IGN);
728 #endif
729 #ifdef SIGTTIN
730 signal(SIGTTIN, SIG_IGN);
731 #endif
732 #ifdef SIGTSTP
733 signal(SIGTSTP, SIG_IGN);
734 #endif
735
736 #ifdef TIOCNOTTY
737 if ((tty_fd = open("/dev/tty", O_RDWR)) >= 0) {
738 ioctl(tty_fd, TIOCNOTTY, (char*) 0);
739 pa_assert_se(pa_close(tty_fd) == 0);
740 }
741 #endif
742 }
743
744 pa_set_env_and_record("PULSE_INTERNAL", "1");
745 pa_assert_se(chdir("/") == 0);
746 umask(0022);
747
748 #ifdef HAVE_SYS_RESOURCE_H
749 set_all_rlimits(conf);
750 #endif
751 pa_rtclock_hrtimer_enable();
752
753 pa_raise_priority(conf->nice_level);
754
755 if (conf->system_instance)
756 if (change_user() < 0)
757 goto finish;
758
759 pa_set_env_and_record("PULSE_SYSTEM", conf->system_instance ? "1" : "0");
760
761 pa_log_info(_("This is PulseAudio %s"), PACKAGE_VERSION);
762 pa_log_debug(_("Compilation host: %s"), CANONICAL_HOST);
763 pa_log_debug(_("Compilation CFLAGS: %s"), PA_CFLAGS);
764
765 s = pa_uname_string();
766 pa_log_debug(_("Running on host: %s"), s);
767 pa_xfree(s);
768
769 pa_log_debug(_("Found %u CPUs."), pa_ncpus());
770
771 pa_log_info(_("Page size is %lu bytes"), (unsigned long) PA_PAGE_SIZE);
772
773 #ifdef HAVE_VALGRIND_MEMCHECK_H
774 pa_log_debug(_("Compiled with Valgrind support: yes"));
775 #else
776 pa_log_debug(_("Compiled with Valgrind support: no"));
777 #endif
778
779 pa_log_debug(_("Running in valgrind mode: %s"), pa_yes_no(pa_in_valgrind()));
780
781 #ifdef __OPTIMIZE__
782 pa_log_debug(_("Optimized build: yes"));
783 #else
784 pa_log_debug(_("Optimized build: no"));
785 #endif
786
787 #ifdef NDEBUG
788 pa_log_debug(_("NDEBUG defined, all asserts disabled."));
789 #elif defined(FASTPATH)
790 pa_log_debug(_("FASTPATH defined, only fast path asserts disabled."));
791 #else
792 pa_log_debug(_("All asserts enabled."));
793 #endif
794
795 if (!(s = pa_machine_id())) {
796 pa_log(_("Failed to get machine ID"));
797 goto finish;
798 }
799 pa_log_info(_("Machine ID is %s."), s);
800 pa_xfree(s);
801
802 if ((s = pa_session_id())) {
803 pa_log_info(_("Session ID is %s."), s);
804 pa_xfree(s);
805 }
806
807 if (!(s = pa_get_runtime_dir()))
808 goto finish;
809 pa_log_info(_("Using runtime directory %s."), s);
810 pa_xfree(s);
811
812 if (!(s = pa_get_state_dir()))
813 goto finish;
814 pa_log_info(_("Using state directory %s."), s);
815 pa_xfree(s);
816
817 pa_log_info(_("Using modules directory %s."), conf->dl_search_path);
818
819 pa_log_info(_("Running in system mode: %s"), pa_yes_no(pa_in_system_mode()));
820
821 if (pa_in_system_mode())
822 pa_log_warn(_("OK, so you are running PA in system mode. Please note that you most likely shouldn't be doing that.\n"
823 "If you do it nonetheless then it's your own fault if things don't work as expected.\n"
824 "Please read http://pulseaudio.org/wiki/WhatIsWrongWithSystemMode for an explanation why system mode is usually a bad idea."));
825
826 if (conf->use_pid_file) {
827 int z;
828
829 if ((z = pa_pid_file_create("pulseaudio")) != 0) {
830
831 if (conf->cmd == PA_CMD_START && z > 0) {
832 /* If we are already running and with are run in
833 * --start mode, then let's return this as success. */
834
835 retval = 0;
836 goto finish;
837 }
838
839 pa_log(_("pa_pid_file_create() failed."));
840 goto finish;
841 }
842
843 valid_pid_file = TRUE;
844 }
845
846 pa_disable_sigpipe();
847
848 if (pa_rtclock_hrtimer())
849 pa_log_info(_("Fresh high-resolution timers available! Bon appetit!"));
850 else
851 pa_log_info(_("Dude, your kernel stinks! The chef's recommendation today is Linux with high-resolution timers enabled!"));
852
853 if (conf->lock_memory) {
854 #ifdef HAVE_SYS_MMAN_H
855 if (mlockall(MCL_FUTURE) < 0)
856 pa_log_warn("mlockall() failed: %s", pa_cstrerror(errno));
857 else
858 pa_log_info("Sucessfully locked process into memory.");
859 #else
860 pa_log_warn("Memory locking requested but not supported on platform.");
861 #endif
862 }
863
864 pa_memtrap_install();
865
866 if (!getenv("PULSE_NO_SIMD")) {
867 pa_cpu_init_x86();
868 pa_cpu_init_arm();
869 }
870
871 pa_assert_se(mainloop = pa_mainloop_new());
872
873 if (!(c = pa_core_new(pa_mainloop_get_api(mainloop), !conf->disable_shm, conf->shm_size))) {
874 pa_log(_("pa_core_new() failed."));
875 goto finish;
876 }
877
878 c->default_sample_spec = conf->default_sample_spec;
879 c->default_channel_map = conf->default_channel_map;
880 c->default_n_fragments = conf->default_n_fragments;
881 c->default_fragment_size_msec = conf->default_fragment_size_msec;
882 c->exit_idle_time = conf->exit_idle_time;
883 c->scache_idle_time = conf->scache_idle_time;
884 c->resample_method = conf->resample_method;
885 c->realtime_priority = conf->realtime_priority;
886 c->realtime_scheduling = !!conf->realtime_scheduling;
887 c->disable_remixing = !!conf->disable_remixing;
888 c->disable_lfe_remixing = !!conf->disable_lfe_remixing;
889 c->running_as_daemon = !!conf->daemonize;
890 c->disallow_exit = conf->disallow_exit;
891 c->flat_volumes = conf->flat_volumes;
892 #ifdef HAVE_DBUS
893 c->server_type = conf->local_server_type;
894 #endif
895
896 pa_assert_se(pa_signal_init(pa_mainloop_get_api(mainloop)) == 0);
897 pa_signal_new(SIGINT, signal_callback, c);
898 pa_signal_new(SIGTERM, signal_callback, c);
899 #ifdef SIGUSR1
900 pa_signal_new(SIGUSR1, signal_callback, c);
901 #endif
902 #ifdef SIGUSR2
903 pa_signal_new(SIGUSR2, signal_callback, c);
904 #endif
905 #ifdef SIGHUP
906 pa_signal_new(SIGHUP, signal_callback, c);
907 #endif
908
909 #ifdef OS_IS_WIN32
910 win32_timer = pa_mainloop_get_api(mainloop)->rtclock_time_new(pa_mainloop_get_api(mainloop), pa_gettimeofday(&win32_tv), message_cb, NULL);
911 #endif
912
913 if (!conf->no_cpu_limit)
914 pa_assert_se(pa_cpu_limit_init(pa_mainloop_get_api(mainloop)) == 0);
915
916 buf = pa_strbuf_new();
917
918 #ifdef HAVE_DBUS
919 if (start_server) {
920 #endif
921 if (conf->load_default_script_file) {
922 FILE *f;
923
924 if ((f = pa_daemon_conf_open_default_script_file(conf))) {
925 r = pa_cli_command_execute_file_stream(c, f, buf, &conf->fail);
926 fclose(f);
927 }
928 }
929
930 if (r >= 0)
931 r = pa_cli_command_execute(c, conf->script_commands, buf, &conf->fail);
932
933 pa_log_error("%s", s = pa_strbuf_tostring_free(buf));
934 pa_xfree(s);
935
936 if (r < 0 && conf->fail) {
937 pa_log(_("Failed to initialize daemon."));
938 goto finish;
939 }
940
941 if (!c->modules || pa_idxset_size(c->modules) == 0) {
942 pa_log(_("Daemon startup without any loaded modules, refusing to work."));
943 goto finish;
944 }
945 #ifdef HAVE_DBUS
946 } else {
947 /* When we just provide the D-Bus server lookup service, we don't want
948 * any modules to be loaded. We haven't loaded any so far, so one might
949 * think there's no way to contact the server, but receiving certain
950 * signals could still cause modules to load. */
951 conf->disallow_module_loading = TRUE;
952 }
953 #endif
954
955 /* We completed the initial module loading, so let's disable it
956 * from now on, if requested */
957 c->disallow_module_loading = !!conf->disallow_module_loading;
958
959 #ifdef HAVE_FORK
960 if (daemon_pipe[1] >= 0) {
961 int ok = 0;
962 pa_loop_write(daemon_pipe[1], &ok, sizeof(ok), NULL);
963 pa_close(daemon_pipe[1]);
964 daemon_pipe[1] = -1;
965 }
966 #endif
967
968 #ifdef HAVE_DBUS
969 if (!conf->system_instance) {
970 if (!(server_lookup = pa_dbusobj_server_lookup_new(c)))
971 goto finish;
972 if (!(lookup_service_bus = register_dbus_name(c, DBUS_BUS_SESSION, "org.PulseAudio1")))
973 goto finish;
974 }
975
976 if (start_server && !(server_bus = register_dbus_name(c, conf->system_instance ? DBUS_BUS_SYSTEM : DBUS_BUS_SESSION, "org.pulseaudio.Server")))
977 goto finish;
978 #endif
979
980 pa_log_info(_("Daemon startup complete."));
981
982 retval = 0;
983 if (pa_mainloop_run(mainloop, &retval) < 0)
984 goto finish;
985
986 pa_log_info(_("Daemon shutdown initiated."));
987
988 finish:
989 #ifdef HAVE_DBUS
990 if (server_bus)
991 pa_dbus_connection_unref(server_bus);
992 if (lookup_service_bus)
993 pa_dbus_connection_unref(lookup_service_bus);
994 if (server_lookup)
995 pa_dbusobj_server_lookup_free(server_lookup);
996 #endif
997
998 if (autospawn_fd >= 0) {
999 if (autospawn_locked)
1000 pa_autospawn_lock_release();
1001
1002 pa_autospawn_lock_done(FALSE);
1003 }
1004
1005 #ifdef OS_IS_WIN32
1006 if (win32_timer)
1007 pa_mainloop_get_api(mainloop)->time_free(win32_timer);
1008 #endif
1009
1010 if (c) {
1011 pa_core_unref(c);
1012 pa_log_info(_("Daemon terminated."));
1013 }
1014
1015 if (!conf->no_cpu_limit)
1016 pa_cpu_limit_done();
1017
1018 pa_signal_done();
1019
1020 #ifdef HAVE_FORK
1021 if (daemon_pipe[1] >= 0)
1022 pa_loop_write(daemon_pipe[1], &retval, sizeof(retval), NULL);
1023
1024 pa_close_pipe(daemon_pipe);
1025 #endif
1026
1027 if (mainloop)
1028 pa_mainloop_free(mainloop);
1029
1030 if (conf)
1031 pa_daemon_conf_free(conf);
1032
1033 if (valid_pid_file)
1034 pa_pid_file_remove();
1035
1036 /* This has no real purpose except making things valgrind-clean */
1037 pa_unset_env_recorded();
1038
1039 #ifdef OS_IS_WIN32
1040 WSACleanup();
1041 #endif
1042
1043 if (ltdl_init)
1044 pa_ltdl_done();
1045
1046 #ifdef HAVE_DBUS
1047 dbus_shutdown();
1048 #endif
1049
1050 return retval;
1051 }