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