c73e9afcf96f169a79709fe1f139714476daf8a0
[platform/upstream/pulseaudio.git] / 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         if ((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         } else
445             pa_log_warn("Couldn't canonicalize binary path, cannot self execute.");
446     }
447 #endif
448
449     if ((e = getenv("PULSE_PASSED_FD"))) {
450         passed_fd = atoi(e);
451
452         if (passed_fd <= 2)
453             passed_fd = -1;
454     }
455
456     /* We might be autospawned, in which case have no idea in which
457      * context we have been started. Let's cleanup our execution
458      * context as good as possible */
459
460     pa_reset_personality();
461     pa_drop_root();
462     pa_close_all(passed_fd, -1);
463     pa_reset_sigs(-1);
464     pa_unblock_sigs(-1);
465     pa_reset_priority();
466
467     setlocale(LC_ALL, "");
468     pa_init_i18n();
469
470     conf = pa_daemon_conf_new();
471
472     if (pa_daemon_conf_load(conf, NULL) < 0)
473         goto finish;
474
475     if (pa_daemon_conf_env(conf) < 0)
476         goto finish;
477
478     if (pa_cmdline_parse(conf, argc, argv, &d) < 0) {
479         pa_log(_("Failed to parse command line."));
480         goto finish;
481     }
482
483     pa_log_set_level(conf->log_level);
484     pa_log_set_target(conf->auto_log_target ? PA_LOG_STDERR : conf->log_target);
485     if (conf->log_meta)
486         pa_log_set_flags(PA_LOG_PRINT_META, PA_LOG_SET);
487     if (conf->log_time)
488         pa_log_set_flags(PA_LOG_PRINT_TIME, PA_LOG_SET);
489     pa_log_set_show_backtrace(conf->log_backtrace);
490
491 #ifdef HAVE_DBUS
492     /* conf->system_instance and conf->local_server_type control almost the
493      * same thing; make them agree about what is requested. */
494     switch (conf->local_server_type) {
495         case PA_SERVER_TYPE_UNSET:
496             conf->local_server_type = conf->system_instance ? PA_SERVER_TYPE_SYSTEM : PA_SERVER_TYPE_USER;
497             break;
498         case PA_SERVER_TYPE_USER:
499         case PA_SERVER_TYPE_NONE:
500             conf->system_instance = FALSE;
501             break;
502         case PA_SERVER_TYPE_SYSTEM:
503             conf->system_instance = TRUE;
504             break;
505         default:
506             pa_assert_not_reached();
507     }
508
509     start_server = conf->local_server_type == PA_SERVER_TYPE_USER || (getuid() == 0 && conf->local_server_type == PA_SERVER_TYPE_SYSTEM);
510
511     if (!start_server && conf->local_server_type == PA_SERVER_TYPE_SYSTEM) {
512         pa_log_notice(_("System mode refused for non-root user. Only starting the D-Bus server lookup service."));
513         conf->system_instance = FALSE;
514     }
515 #endif
516
517     LTDL_SET_PRELOADED_SYMBOLS();
518     pa_ltdl_init();
519     ltdl_init = TRUE;
520
521     if (conf->dl_search_path)
522         lt_dlsetsearchpath(conf->dl_search_path);
523
524 #ifdef OS_IS_WIN32
525     {
526         WSADATA data;
527         WSAStartup(MAKEWORD(2, 0), &data);
528     }
529 #endif
530
531     pa_random_seed();
532
533     switch (conf->cmd) {
534         case PA_CMD_DUMP_MODULES:
535             pa_dump_modules(conf, argc-d, argv+d);
536             retval = 0;
537             goto finish;
538
539         case PA_CMD_DUMP_CONF: {
540             s = pa_daemon_conf_dump(conf);
541             fputs(s, stdout);
542             pa_xfree(s);
543             retval = 0;
544             goto finish;
545         }
546
547         case PA_CMD_DUMP_RESAMPLE_METHODS: {
548             int i;
549
550             for (i = 0; i < PA_RESAMPLER_MAX; i++)
551                 if (pa_resample_method_supported(i))
552                     printf("%s\n", pa_resample_method_to_string(i));
553
554             retval = 0;
555             goto finish;
556         }
557
558         case PA_CMD_HELP :
559             pa_cmdline_help(argv[0]);
560             retval = 0;
561             goto finish;
562
563         case PA_CMD_VERSION :
564             printf(PACKAGE_NAME" "PACKAGE_VERSION"\n");
565             retval = 0;
566             goto finish;
567
568         case PA_CMD_CHECK: {
569             pid_t pid;
570
571             if (pa_pid_file_check_running(&pid, "pulseaudio") < 0)
572                 pa_log_info(_("Daemon not running"));
573             else {
574                 pa_log_info(_("Daemon running as PID %u"), pid);
575                 retval = 0;
576             }
577
578             goto finish;
579
580         }
581         case PA_CMD_KILL:
582
583             if (pa_pid_file_kill(SIGINT, NULL, "pulseaudio") < 0)
584                 pa_log(_("Failed to kill daemon: %s"), pa_cstrerror(errno));
585             else
586                 retval = 0;
587
588             goto finish;
589
590         case PA_CMD_CLEANUP_SHM:
591
592             if (pa_shm_cleanup() >= 0)
593                 retval = 0;
594
595             goto finish;
596
597         default:
598             pa_assert(conf->cmd == PA_CMD_DAEMON || conf->cmd == PA_CMD_START);
599     }
600
601     if (getuid() == 0 && !conf->system_instance)
602         pa_log_warn(_("This program is not intended to be run as root (unless --system is specified)."));
603 #ifndef HAVE_DBUS /* A similar, only a notice worthy check was done earlier, if D-Bus is enabled. */
604     else if (getuid() != 0 && conf->system_instance) {
605         pa_log(_("Root privileges required."));
606         goto finish;
607     }
608 #endif
609
610     if (conf->cmd == PA_CMD_START && conf->system_instance) {
611         pa_log(_("--start not supported for system instances."));
612         goto finish;
613     }
614
615     if (conf->system_instance && !conf->disallow_exit)
616         pa_log_warn(_("Running in system mode, but --disallow-exit not set!"));
617
618     if (conf->system_instance && !conf->disallow_module_loading)
619         pa_log_warn(_("Running in system mode, but --disallow-module-loading not set!"));
620
621     if (conf->system_instance && !conf->disable_shm) {
622         pa_log_notice(_("Running in system mode, forcibly disabling SHM mode!"));
623         conf->disable_shm = TRUE;
624     }
625
626     if (conf->system_instance && conf->exit_idle_time >= 0) {
627         pa_log_notice(_("Running in system mode, forcibly disabling exit idle time!"));
628         conf->exit_idle_time = -1;
629     }
630
631     if (conf->cmd == PA_CMD_START) {
632         /* If we shall start PA only when it is not running yet, we
633          * first take the autospawn lock to make things
634          * synchronous. */
635
636         if ((autospawn_fd = pa_autospawn_lock_init()) < 0) {
637             pa_log("Failed to initialize autospawn lock");
638             goto finish;
639         }
640
641         if ((pa_autospawn_lock_acquire(TRUE) < 0)) {
642             pa_log("Failed to acquire autospawn lock");
643             goto finish;
644         }
645
646         autospawn_locked = TRUE;
647     }
648
649     if (conf->daemonize) {
650         pid_t child;
651         int tty_fd;
652
653         if (pa_stdio_acquire() < 0) {
654             pa_log(_("Failed to acquire stdio."));
655             goto finish;
656         }
657
658 #ifdef HAVE_FORK
659         if (pipe(daemon_pipe) < 0) {
660             pa_log(_("pipe failed: %s"), pa_cstrerror(errno));
661             goto finish;
662         }
663
664         if ((child = fork()) < 0) {
665             pa_log(_("fork() failed: %s"), pa_cstrerror(errno));
666             goto finish;
667         }
668
669         if (child != 0) {
670             ssize_t n;
671             /* Father */
672
673             pa_assert_se(pa_close(daemon_pipe[1]) == 0);
674             daemon_pipe[1] = -1;
675
676             if ((n = pa_loop_read(daemon_pipe[0], &retval, sizeof(retval), NULL)) != sizeof(retval)) {
677
678                 if (n < 0)
679                     pa_log(_("read() failed: %s"), pa_cstrerror(errno));
680
681                 retval = 1;
682             }
683
684             if (retval)
685                 pa_log(_("Daemon startup failed."));
686             else
687                 pa_log_info(_("Daemon startup successful."));
688
689             goto finish;
690         }
691
692         if (autospawn_fd >= 0) {
693             /* The lock file is unlocked from the parent, so we need
694              * to close it in the child */
695
696             pa_autospawn_lock_release();
697             pa_autospawn_lock_done(TRUE);
698
699             autospawn_locked = FALSE;
700             autospawn_fd = -1;
701         }
702
703         pa_assert_se(pa_close(daemon_pipe[0]) == 0);
704         daemon_pipe[0] = -1;
705 #endif
706
707         if (conf->auto_log_target)
708             pa_log_set_target(PA_LOG_SYSLOG);
709
710 #ifdef HAVE_SETSID
711         setsid();
712 #endif
713 #ifdef HAVE_SETPGID
714         setpgid(0,0);
715 #endif
716
717 #ifndef OS_IS_WIN32
718         pa_close(0);
719         pa_close(1);
720         pa_close(2);
721
722         pa_assert_se(open("/dev/null", O_RDONLY) == 0);
723         pa_assert_se(open("/dev/null", O_WRONLY) == 1);
724         pa_assert_se(open("/dev/null", O_WRONLY) == 2);
725 #else
726         FreeConsole();
727 #endif
728
729 #ifdef SIGTTOU
730         signal(SIGTTOU, SIG_IGN);
731 #endif
732 #ifdef SIGTTIN
733         signal(SIGTTIN, SIG_IGN);
734 #endif
735 #ifdef SIGTSTP
736         signal(SIGTSTP, SIG_IGN);
737 #endif
738
739 #ifdef TIOCNOTTY
740         if ((tty_fd = open("/dev/tty", O_RDWR)) >= 0) {
741             ioctl(tty_fd, TIOCNOTTY, (char*) 0);
742             pa_assert_se(pa_close(tty_fd) == 0);
743         }
744 #endif
745     }
746
747     pa_set_env_and_record("PULSE_INTERNAL", "1");
748     pa_assert_se(chdir("/") == 0);
749     umask(0022);
750
751 #ifdef HAVE_SYS_RESOURCE_H
752     set_all_rlimits(conf);
753 #endif
754     pa_rtclock_hrtimer_enable();
755
756     pa_raise_priority(conf->nice_level);
757
758     if (conf->system_instance)
759         if (change_user() < 0)
760             goto finish;
761
762     pa_set_env_and_record("PULSE_SYSTEM", conf->system_instance ? "1" : "0");
763
764     pa_log_info(_("This is PulseAudio %s"), PACKAGE_VERSION);
765     pa_log_debug(_("Compilation host: %s"), CANONICAL_HOST);
766     pa_log_debug(_("Compilation CFLAGS: %s"), PA_CFLAGS);
767
768     s = pa_uname_string();
769     pa_log_debug(_("Running on host: %s"), s);
770     pa_xfree(s);
771
772     pa_log_debug(_("Found %u CPUs."), pa_ncpus());
773
774     pa_log_info(_("Page size is %lu bytes"), (unsigned long) PA_PAGE_SIZE);
775
776 #ifdef HAVE_VALGRIND_MEMCHECK_H
777     pa_log_debug(_("Compiled with Valgrind support: yes"));
778 #else
779     pa_log_debug(_("Compiled with Valgrind support: no"));
780 #endif
781
782     pa_log_debug(_("Running in valgrind mode: %s"), pa_yes_no(pa_in_valgrind()));
783
784 #ifdef __OPTIMIZE__
785     pa_log_debug(_("Optimized build: yes"));
786 #else
787     pa_log_debug(_("Optimized build: no"));
788 #endif
789
790 #ifdef NDEBUG
791     pa_log_debug(_("NDEBUG defined, all asserts disabled."));
792 #elif defined(FASTPATH)
793     pa_log_debug(_("FASTPATH defined, only fast path asserts disabled."));
794 #else
795     pa_log_debug(_("All asserts enabled."));
796 #endif
797
798     if (!(s = pa_machine_id())) {
799         pa_log(_("Failed to get machine ID"));
800         goto finish;
801     }
802     pa_log_info(_("Machine ID is %s."), s);
803     pa_xfree(s);
804
805     if ((s = pa_session_id())) {
806         pa_log_info(_("Session ID is %s."), s);
807         pa_xfree(s);
808     }
809
810     if (!(s = pa_get_runtime_dir()))
811         goto finish;
812     pa_log_info(_("Using runtime directory %s."), s);
813     pa_xfree(s);
814
815     if (!(s = pa_get_state_dir()))
816         goto finish;
817     pa_log_info(_("Using state directory %s."), s);
818     pa_xfree(s);
819
820     pa_log_info(_("Using modules directory %s."), conf->dl_search_path);
821
822     pa_log_info(_("Running in system mode: %s"), pa_yes_no(pa_in_system_mode()));
823
824     if (pa_in_system_mode())
825         pa_log_warn(_("OK, so you are running PA in system mode. Please note that you most likely shouldn't be doing that.\n"
826                       "If you do it nonetheless then it's your own fault if things don't work as expected.\n"
827                       "Please read http://pulseaudio.org/wiki/WhatIsWrongWithSystemMode for an explanation why system mode is usually a bad idea."));
828
829     if (conf->use_pid_file) {
830         int z;
831
832         if ((z = pa_pid_file_create("pulseaudio")) != 0) {
833
834             if (conf->cmd == PA_CMD_START && z > 0) {
835                 /* If we are already running and with are run in
836                  * --start mode, then let's return this as success. */
837
838                 retval = 0;
839                 goto finish;
840             }
841
842             pa_log(_("pa_pid_file_create() failed."));
843             goto finish;
844         }
845
846         valid_pid_file = TRUE;
847     }
848
849     pa_disable_sigpipe();
850
851     if (pa_rtclock_hrtimer())
852         pa_log_info(_("Fresh high-resolution timers available! Bon appetit!"));
853     else
854         pa_log_info(_("Dude, your kernel stinks! The chef's recommendation today is Linux with high-resolution timers enabled!"));
855
856     if (conf->lock_memory) {
857 #ifdef HAVE_SYS_MMAN_H
858         if (mlockall(MCL_FUTURE) < 0)
859             pa_log_warn("mlockall() failed: %s", pa_cstrerror(errno));
860         else
861             pa_log_info("Sucessfully locked process into memory.");
862 #else
863         pa_log_warn("Memory locking requested but not supported on platform.");
864 #endif
865     }
866
867     pa_memtrap_install();
868
869     if (!getenv("PULSE_NO_SIMD")) {
870         pa_cpu_init_x86();
871         pa_cpu_init_arm();
872     }
873
874     pa_assert_se(mainloop = pa_mainloop_new());
875
876     if (!(c = pa_core_new(pa_mainloop_get_api(mainloop), !conf->disable_shm, conf->shm_size))) {
877         pa_log(_("pa_core_new() failed."));
878         goto finish;
879     }
880
881     c->default_sample_spec = conf->default_sample_spec;
882     c->default_channel_map = conf->default_channel_map;
883     c->default_n_fragments = conf->default_n_fragments;
884     c->default_fragment_size_msec = conf->default_fragment_size_msec;
885     c->exit_idle_time = conf->exit_idle_time;
886     c->scache_idle_time = conf->scache_idle_time;
887     c->resample_method = conf->resample_method;
888     c->realtime_priority = conf->realtime_priority;
889     c->realtime_scheduling = !!conf->realtime_scheduling;
890     c->disable_remixing = !!conf->disable_remixing;
891     c->disable_lfe_remixing = !!conf->disable_lfe_remixing;
892     c->running_as_daemon = !!conf->daemonize;
893     c->disallow_exit = conf->disallow_exit;
894     c->flat_volumes = conf->flat_volumes;
895 #ifdef HAVE_DBUS
896     c->server_type = conf->local_server_type;
897 #endif
898
899     pa_assert_se(pa_signal_init(pa_mainloop_get_api(mainloop)) == 0);
900     pa_signal_new(SIGINT, signal_callback, c);
901     pa_signal_new(SIGTERM, signal_callback, c);
902 #ifdef SIGUSR1
903     pa_signal_new(SIGUSR1, signal_callback, c);
904 #endif
905 #ifdef SIGUSR2
906     pa_signal_new(SIGUSR2, signal_callback, c);
907 #endif
908 #ifdef SIGHUP
909     pa_signal_new(SIGHUP, signal_callback, c);
910 #endif
911
912 #ifdef OS_IS_WIN32
913     win32_timer = pa_mainloop_get_api(mainloop)->rtclock_time_new(pa_mainloop_get_api(mainloop), pa_gettimeofday(&win32_tv), message_cb, NULL);
914 #endif
915
916     if (!conf->no_cpu_limit)
917         pa_assert_se(pa_cpu_limit_init(pa_mainloop_get_api(mainloop)) == 0);
918
919     buf = pa_strbuf_new();
920
921 #ifdef HAVE_DBUS
922     if (start_server) {
923 #endif
924         if (conf->load_default_script_file) {
925             FILE *f;
926
927             if ((f = pa_daemon_conf_open_default_script_file(conf))) {
928                 r = pa_cli_command_execute_file_stream(c, f, buf, &conf->fail);
929                 fclose(f);
930             }
931         }
932
933         if (r >= 0)
934             r = pa_cli_command_execute(c, conf->script_commands, buf, &conf->fail);
935
936         pa_log_error("%s", s = pa_strbuf_tostring_free(buf));
937         pa_xfree(s);
938
939         if (r < 0 && conf->fail) {
940             pa_log(_("Failed to initialize daemon."));
941             goto finish;
942         }
943
944         if (!c->modules || pa_idxset_size(c->modules) == 0) {
945             pa_log(_("Daemon startup without any loaded modules, refusing to work."));
946             goto finish;
947         }
948 #ifdef HAVE_DBUS
949     } else {
950         /* When we just provide the D-Bus server lookup service, we don't want
951          * any modules to be loaded. We haven't loaded any so far, so one might
952          * think there's no way to contact the server, but receiving certain
953          * signals could still cause modules to load. */
954         conf->disallow_module_loading = TRUE;
955     }
956 #endif
957
958     /* We completed the initial module loading, so let's disable it
959      * from now on, if requested */
960     c->disallow_module_loading = !!conf->disallow_module_loading;
961
962 #ifdef HAVE_FORK
963     if (daemon_pipe[1] >= 0) {
964         int ok = 0;
965         pa_loop_write(daemon_pipe[1], &ok, sizeof(ok), NULL);
966         pa_close(daemon_pipe[1]);
967         daemon_pipe[1] = -1;
968     }
969 #endif
970
971 #ifdef HAVE_DBUS
972     if (!conf->system_instance) {
973         if (!(server_lookup = pa_dbusobj_server_lookup_new(c)))
974             goto finish;
975         if (!(lookup_service_bus = register_dbus_name(c, DBUS_BUS_SESSION, "org.PulseAudio1")))
976             goto finish;
977     }
978
979     if (start_server && !(server_bus = register_dbus_name(c, conf->system_instance ? DBUS_BUS_SYSTEM : DBUS_BUS_SESSION, "org.pulseaudio.Server")))
980         goto finish;
981 #endif
982
983     pa_log_info(_("Daemon startup complete."));
984
985     retval = 0;
986     if (pa_mainloop_run(mainloop, &retval) < 0)
987         goto finish;
988
989     pa_log_info(_("Daemon shutdown initiated."));
990
991 finish:
992 #ifdef HAVE_DBUS
993     if (server_bus)
994         pa_dbus_connection_unref(server_bus);
995     if (lookup_service_bus)
996         pa_dbus_connection_unref(lookup_service_bus);
997     if (server_lookup)
998         pa_dbusobj_server_lookup_free(server_lookup);
999 #endif
1000
1001     if (autospawn_fd >= 0) {
1002         if (autospawn_locked)
1003             pa_autospawn_lock_release();
1004
1005         pa_autospawn_lock_done(FALSE);
1006     }
1007
1008 #ifdef OS_IS_WIN32
1009     if (win32_timer)
1010         pa_mainloop_get_api(mainloop)->time_free(win32_timer);
1011 #endif
1012
1013     if (c) {
1014         pa_core_unref(c);
1015         pa_log_info(_("Daemon terminated."));
1016     }
1017
1018     if (!conf->no_cpu_limit)
1019         pa_cpu_limit_done();
1020
1021     pa_signal_done();
1022
1023 #ifdef HAVE_FORK
1024     if (daemon_pipe[1] >= 0)
1025         pa_loop_write(daemon_pipe[1], &retval, sizeof(retval), NULL);
1026
1027     pa_close_pipe(daemon_pipe);
1028 #endif
1029
1030     if (mainloop)
1031         pa_mainloop_free(mainloop);
1032
1033     if (conf)
1034         pa_daemon_conf_free(conf);
1035
1036     if (valid_pid_file)
1037         pa_pid_file_remove();
1038
1039     /* This has no real purpose except making things valgrind-clean */
1040     pa_unset_env_recorded();
1041
1042 #ifdef OS_IS_WIN32
1043     WSACleanup();
1044 #endif
1045
1046     if (ltdl_init)
1047         pa_ltdl_done();
1048
1049 #ifdef HAVE_DBUS
1050     dbus_shutdown();
1051 #endif
1052
1053     return retval;
1054 }