Merge branch 'master' of git://0pointer.de/pulseaudio into dbus-work
[profile/ivi/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     pa_set_env("PULSE_RUNTIME_PATH", PA_SYSTEM_RUNTIME_PATH);
264     pa_set_env("PULSE_CONFIG_PATH", PA_SYSTEM_CONFIG_PATH);
265     pa_set_env("PULSE_STATE_PATH", PA_SYSTEM_STATE_PATH);
266
267     pa_log_info(_("Successfully dropped root privileges."));
268
269     return 0;
270 }
271
272 #else /* HAVE_PWD_H && HAVE_GRP_H */
273
274 static int change_user(void) {
275     pa_log(_("System wide mode unsupported on this platform."));
276     return -1;
277 }
278
279 #endif /* HAVE_PWD_H && HAVE_GRP_H */
280
281 #ifdef HAVE_SYS_RESOURCE_H
282
283 static int set_one_rlimit(const pa_rlimit *r, int resource, const char *name) {
284     struct rlimit rl;
285     pa_assert(r);
286
287     if (!r->is_set)
288         return 0;
289
290     rl.rlim_cur = rl.rlim_max = r->value;
291
292     if (setrlimit(resource, &rl) < 0) {
293         pa_log_info(_("setrlimit(%s, (%u, %u)) failed: %s"), name, (unsigned) r->value, (unsigned) r->value, pa_cstrerror(errno));
294         return -1;
295     }
296
297     return 0;
298 }
299
300 static void set_all_rlimits(const pa_daemon_conf *conf) {
301     set_one_rlimit(&conf->rlimit_fsize, RLIMIT_FSIZE, "RLIMIT_FSIZE");
302     set_one_rlimit(&conf->rlimit_data, RLIMIT_DATA, "RLIMIT_DATA");
303     set_one_rlimit(&conf->rlimit_stack, RLIMIT_STACK, "RLIMIT_STACK");
304     set_one_rlimit(&conf->rlimit_core, RLIMIT_CORE, "RLIMIT_CORE");
305 #ifdef RLIMIT_RSS
306     set_one_rlimit(&conf->rlimit_rss, RLIMIT_RSS, "RLIMIT_RSS");
307 #endif
308 #ifdef RLIMIT_NPROC
309     set_one_rlimit(&conf->rlimit_nproc, RLIMIT_NPROC, "RLIMIT_NPROC");
310 #endif
311 #ifdef RLIMIT_NOFILE
312     set_one_rlimit(&conf->rlimit_nofile, RLIMIT_NOFILE, "RLIMIT_NOFILE");
313 #endif
314 #ifdef RLIMIT_MEMLOCK
315     set_one_rlimit(&conf->rlimit_memlock, RLIMIT_MEMLOCK, "RLIMIT_MEMLOCK");
316 #endif
317 #ifdef RLIMIT_AS
318     set_one_rlimit(&conf->rlimit_as, RLIMIT_AS, "RLIMIT_AS");
319 #endif
320 #ifdef RLIMIT_LOCKS
321     set_one_rlimit(&conf->rlimit_locks, RLIMIT_LOCKS, "RLIMIT_LOCKS");
322 #endif
323 #ifdef RLIMIT_SIGPENDING
324     set_one_rlimit(&conf->rlimit_sigpending, RLIMIT_SIGPENDING, "RLIMIT_SIGPENDING");
325 #endif
326 #ifdef RLIMIT_MSGQUEUE
327     set_one_rlimit(&conf->rlimit_msgqueue, RLIMIT_MSGQUEUE, "RLIMIT_MSGQUEUE");
328 #endif
329 #ifdef RLIMIT_NICE
330     set_one_rlimit(&conf->rlimit_nice, RLIMIT_NICE, "RLIMIT_NICE");
331 #endif
332 #ifdef RLIMIT_RTPRIO
333     set_one_rlimit(&conf->rlimit_rtprio, RLIMIT_RTPRIO, "RLIMIT_RTPRIO");
334 #endif
335 #ifdef RLIMIT_RTTIME
336     set_one_rlimit(&conf->rlimit_rttime, RLIMIT_RTTIME, "RLIMIT_RTTIME");
337 #endif
338 }
339 #endif
340
341 #ifdef HAVE_DBUS
342 static pa_dbus_connection *register_dbus_name(pa_core *c, DBusBusType bus, const char* name) {
343     DBusError error;
344     pa_dbus_connection *conn;
345
346     dbus_error_init(&error);
347
348     if (!(conn = pa_dbus_bus_get(c, bus, &error)) || dbus_error_is_set(&error)) {
349         pa_log_warn("Unable to contact D-Bus: %s: %s", error.name, error.message);
350         goto fail;
351     }
352
353     if (dbus_bus_request_name(pa_dbus_connection_get(conn), name, DBUS_NAME_FLAG_DO_NOT_QUEUE, &error) == DBUS_REQUEST_NAME_REPLY_PRIMARY_OWNER) {
354         pa_log_debug("Got %s!", name);
355         return conn;
356     }
357
358     if (dbus_error_is_set(&error))
359         pa_log_error("Failed to acquire %s: %s: %s", name, error.name, error.message);
360     else
361         pa_log_error("D-Bus name %s already taken. Weird shit!", name);
362
363     /* PA cannot be started twice by the same user and hence we can
364      * ignore mostly the case that a name is already taken. */
365
366 fail:
367     if (conn)
368         pa_dbus_connection_unref(conn);
369
370     dbus_error_free(&error);
371     return NULL;
372 }
373 #endif
374
375 int main(int argc, char *argv[]) {
376     pa_core *c = NULL;
377     pa_strbuf *buf = NULL;
378     pa_daemon_conf *conf = NULL;
379     pa_mainloop *mainloop = NULL;
380     char *s;
381     int r = 0, retval = 1, d = 0;
382     pa_bool_t valid_pid_file = FALSE;
383     pa_bool_t ltdl_init = FALSE;
384     int passed_fd = -1;
385     const char *e;
386 #ifdef HAVE_FORK
387     int daemon_pipe[2] = { -1, -1 };
388 #endif
389 #ifdef OS_IS_WIN32
390     pa_time_event *win32_timer;
391     struct timeval win32_tv;
392 #endif
393     int autospawn_fd = -1;
394     pa_bool_t autospawn_locked = FALSE;
395 #ifdef HAVE_DBUS
396     pa_dbusobj_server_lookup *server_lookup = NULL; /* /org/pulseaudio/server_lookup */
397     pa_dbus_connection *lookup_service_bus = NULL; /* Always the user bus. */
398     pa_dbus_connection *server_bus = NULL; /* The bus where we reserve org.pulseaudio.Server, either the user or the system bus. */
399     pa_bool_t start_server;
400 #endif
401
402     pa_log_set_ident("pulseaudio");
403     pa_log_set_level(PA_LOG_NOTICE);
404     pa_log_set_flags(PA_LOG_COLORS|PA_LOG_PRINT_FILE|PA_LOG_PRINT_LEVEL, PA_LOG_RESET);
405
406 #if defined(__linux__) && defined(__OPTIMIZE__)
407     /*
408        Disable lazy relocations to make usage of external libraries
409        more deterministic for our RT threads. We abuse __OPTIMIZE__ as
410        a check whether we are a debug build or not. This all is
411        admittedly a bit snake-oilish.
412     */
413
414     if (!getenv("LD_BIND_NOW")) {
415         char *rp;
416
417         /* We have to execute ourselves, because the libc caches the
418          * value of $LD_BIND_NOW on initialization. */
419
420         pa_set_env("LD_BIND_NOW", "1");
421
422         if ((rp = pa_readlink("/proc/self/exe"))) {
423
424             if (pa_streq(rp, PA_BINARY))
425                 pa_assert_se(execv(rp, argv) == 0);
426             else
427                 pa_log_warn("/proc/self/exe does not point to " PA_BINARY ", cannot self execute. Are you playing games?");
428
429             pa_xfree(rp);
430
431         } else
432             pa_log_warn("Couldn't read /proc/self/exe, cannot self execute. Running in a chroot()?");
433     }
434 #endif
435
436     if ((e = getenv("PULSE_PASSED_FD"))) {
437         passed_fd = atoi(e);
438
439         if (passed_fd <= 2)
440             passed_fd = -1;
441     }
442
443     /* We might be autospawned, in which case have no idea in which
444      * context we have been started. Let's cleanup our execution
445      * context as good as possible */
446
447     pa_reset_personality();
448     pa_drop_root();
449     pa_close_all(passed_fd, -1);
450     pa_reset_sigs(-1);
451     pa_unblock_sigs(-1);
452     pa_reset_priority();
453
454     setlocale(LC_ALL, "");
455     pa_init_i18n();
456
457     conf = pa_daemon_conf_new();
458
459     if (pa_daemon_conf_load(conf, NULL) < 0)
460         goto finish;
461
462     if (pa_daemon_conf_env(conf) < 0)
463         goto finish;
464
465     if (pa_cmdline_parse(conf, argc, argv, &d) < 0) {
466         pa_log(_("Failed to parse command line."));
467         goto finish;
468     }
469
470     pa_log_set_level(conf->log_level);
471     pa_log_set_target(conf->auto_log_target ? PA_LOG_STDERR : conf->log_target);
472     if (conf->log_meta)
473         pa_log_set_flags(PA_LOG_PRINT_META, PA_LOG_SET);
474     if (conf->log_time)
475         pa_log_set_flags(PA_LOG_PRINT_TIME, PA_LOG_SET);
476     pa_log_set_show_backtrace(conf->log_backtrace);
477
478 #ifdef HAVE_DBUS
479     /* conf->system_instance and conf->local_server_type control almost the
480      * same thing; make them agree about what is requested. */
481     switch (conf->local_server_type) {
482         case PA_SERVER_TYPE_UNSET:
483             conf->local_server_type = conf->system_instance ? PA_SERVER_TYPE_SYSTEM : PA_SERVER_TYPE_USER;
484             break;
485         case PA_SERVER_TYPE_USER:
486         case PA_SERVER_TYPE_NONE:
487             conf->system_instance = FALSE;
488             break;
489         case PA_SERVER_TYPE_SYSTEM:
490             conf->system_instance = TRUE;
491             break;
492         default:
493             pa_assert_not_reached();
494     }
495
496     start_server = conf->local_server_type == PA_SERVER_TYPE_USER || (getuid() == 0 && conf->local_server_type == PA_SERVER_TYPE_SYSTEM);
497
498     if (!start_server && conf->local_server_type == PA_SERVER_TYPE_SYSTEM) {
499         pa_log_notice(_("System mode refused for non-root user. Only starting the D-Bus server lookup service."));
500         conf->system_instance = FALSE;
501     }
502 #endif
503
504     LTDL_SET_PRELOADED_SYMBOLS();
505     pa_ltdl_init();
506     ltdl_init = TRUE;
507
508     if (conf->dl_search_path)
509         lt_dlsetsearchpath(conf->dl_search_path);
510
511 #ifdef OS_IS_WIN32
512     {
513         WSADATA data;
514         WSAStartup(MAKEWORD(2, 0), &data);
515     }
516 #endif
517
518     pa_random_seed();
519
520     switch (conf->cmd) {
521         case PA_CMD_DUMP_MODULES:
522             pa_dump_modules(conf, argc-d, argv+d);
523             retval = 0;
524             goto finish;
525
526         case PA_CMD_DUMP_CONF: {
527             s = pa_daemon_conf_dump(conf);
528             fputs(s, stdout);
529             pa_xfree(s);
530             retval = 0;
531             goto finish;
532         }
533
534         case PA_CMD_DUMP_RESAMPLE_METHODS: {
535             int i;
536
537             for (i = 0; i < PA_RESAMPLER_MAX; i++)
538                 if (pa_resample_method_supported(i))
539                     printf("%s\n", pa_resample_method_to_string(i));
540
541             retval = 0;
542             goto finish;
543         }
544
545         case PA_CMD_HELP :
546             pa_cmdline_help(argv[0]);
547             retval = 0;
548             goto finish;
549
550         case PA_CMD_VERSION :
551             printf(PACKAGE_NAME" "PACKAGE_VERSION"\n");
552             retval = 0;
553             goto finish;
554
555         case PA_CMD_CHECK: {
556             pid_t pid;
557
558             if (pa_pid_file_check_running(&pid, "pulseaudio") < 0)
559                 pa_log_info(_("Daemon not running"));
560             else {
561                 pa_log_info(_("Daemon running as PID %u"), pid);
562                 retval = 0;
563             }
564
565             goto finish;
566
567         }
568         case PA_CMD_KILL:
569
570             if (pa_pid_file_kill(SIGINT, NULL, "pulseaudio") < 0)
571                 pa_log(_("Failed to kill daemon: %s"), pa_cstrerror(errno));
572             else
573                 retval = 0;
574
575             goto finish;
576
577         case PA_CMD_CLEANUP_SHM:
578
579             if (pa_shm_cleanup() >= 0)
580                 retval = 0;
581
582             goto finish;
583
584         default:
585             pa_assert(conf->cmd == PA_CMD_DAEMON || conf->cmd == PA_CMD_START);
586     }
587
588     if (getuid() == 0 && !conf->system_instance)
589         pa_log_warn(_("This program is not intended to be run as root (unless --system is specified)."));
590 #ifndef HAVE_DBUS /* A similar, only a notice worthy check was done earlier, if D-Bus is enabled. */
591     else if (getuid() != 0 && conf->system_instance) {
592         pa_log(_("Root privileges required."));
593         goto finish;
594     }
595 #endif
596
597     if (conf->cmd == PA_CMD_START && conf->system_instance) {
598         pa_log(_("--start not supported for system instances."));
599         goto finish;
600     }
601
602     if (conf->system_instance && !conf->disallow_exit)
603         pa_log_warn(_("Running in system mode, but --disallow-exit not set!"));
604
605     if (conf->system_instance && !conf->disallow_module_loading)
606         pa_log_warn(_("Running in system mode, but --disallow-module-loading not set!"));
607
608     if (conf->system_instance && !conf->disable_shm) {
609         pa_log_notice(_("Running in system mode, forcibly disabling SHM mode!"));
610         conf->disable_shm = TRUE;
611     }
612
613     if (conf->system_instance && conf->exit_idle_time >= 0) {
614         pa_log_notice(_("Running in system mode, forcibly disabling exit idle time!"));
615         conf->exit_idle_time = -1;
616     }
617
618     if (conf->cmd == PA_CMD_START) {
619         /* If we shall start PA only when it is not running yet, we
620          * first take the autospawn lock to make things
621          * synchronous. */
622
623         if ((autospawn_fd = pa_autospawn_lock_init()) < 0) {
624             pa_log("Failed to initialize autospawn lock");
625             goto finish;
626         }
627
628         if ((pa_autospawn_lock_acquire(TRUE) < 0)) {
629             pa_log("Failed to acquire autospawn lock");
630             goto finish;
631         }
632
633         autospawn_locked = TRUE;
634     }
635
636     if (conf->daemonize) {
637         pid_t child;
638         int tty_fd;
639
640         if (pa_stdio_acquire() < 0) {
641             pa_log(_("Failed to acquire stdio."));
642             goto finish;
643         }
644
645 #ifdef HAVE_FORK
646         if (pipe(daemon_pipe) < 0) {
647             pa_log(_("pipe failed: %s"), pa_cstrerror(errno));
648             goto finish;
649         }
650
651         if ((child = fork()) < 0) {
652             pa_log(_("fork() failed: %s"), pa_cstrerror(errno));
653             goto finish;
654         }
655
656         if (child != 0) {
657             ssize_t n;
658             /* Father */
659
660             pa_assert_se(pa_close(daemon_pipe[1]) == 0);
661             daemon_pipe[1] = -1;
662
663             if ((n = pa_loop_read(daemon_pipe[0], &retval, sizeof(retval), NULL)) != sizeof(retval)) {
664
665                 if (n < 0)
666                     pa_log(_("read() failed: %s"), pa_cstrerror(errno));
667
668                 retval = 1;
669             }
670
671             if (retval)
672                 pa_log(_("Daemon startup failed."));
673             else
674                 pa_log_info(_("Daemon startup successful."));
675
676             goto finish;
677         }
678
679         if (autospawn_fd >= 0) {
680             /* The lock file is unlocked from the parent, so we need
681              * to close it in the child */
682
683             pa_autospawn_lock_release();
684             pa_autospawn_lock_done(TRUE);
685
686             autospawn_locked = FALSE;
687             autospawn_fd = -1;
688         }
689
690         pa_assert_se(pa_close(daemon_pipe[0]) == 0);
691         daemon_pipe[0] = -1;
692 #endif
693
694         if (conf->auto_log_target)
695             pa_log_set_target(PA_LOG_SYSLOG);
696
697 #ifdef HAVE_SETSID
698         setsid();
699 #endif
700 #ifdef HAVE_SETPGID
701         setpgid(0,0);
702 #endif
703
704 #ifndef OS_IS_WIN32
705         pa_close(0);
706         pa_close(1);
707         pa_close(2);
708
709         pa_assert_se(open("/dev/null", O_RDONLY) == 0);
710         pa_assert_se(open("/dev/null", O_WRONLY) == 1);
711         pa_assert_se(open("/dev/null", O_WRONLY) == 2);
712 #else
713         FreeConsole();
714 #endif
715
716 #ifdef SIGTTOU
717         signal(SIGTTOU, SIG_IGN);
718 #endif
719 #ifdef SIGTTIN
720         signal(SIGTTIN, SIG_IGN);
721 #endif
722 #ifdef SIGTSTP
723         signal(SIGTSTP, SIG_IGN);
724 #endif
725
726 #ifdef TIOCNOTTY
727         if ((tty_fd = open("/dev/tty", O_RDWR)) >= 0) {
728             ioctl(tty_fd, TIOCNOTTY, (char*) 0);
729             pa_assert_se(pa_close(tty_fd) == 0);
730         }
731 #endif
732     }
733
734     pa_set_env("PULSE_INTERNAL", "1");
735     pa_assert_se(chdir("/") == 0);
736     umask(0022);
737
738 #ifdef HAVE_SYS_RESOURCE_H
739     set_all_rlimits(conf);
740 #endif
741     pa_rtclock_hrtimer_enable();
742
743     pa_raise_priority(conf->nice_level);
744
745     if (conf->system_instance)
746         if (change_user() < 0)
747             goto finish;
748
749     pa_set_env("PULSE_SYSTEM", conf->system_instance ? "1" : "0");
750
751     pa_log_info(_("This is PulseAudio %s"), PACKAGE_VERSION);
752     pa_log_debug(_("Compilation host: %s"), CANONICAL_HOST);
753     pa_log_debug(_("Compilation CFLAGS: %s"), PA_CFLAGS);
754
755     s = pa_uname_string();
756     pa_log_debug(_("Running on host: %s"), s);
757     pa_xfree(s);
758
759     pa_log_debug(_("Found %u CPUs."), pa_ncpus());
760
761     pa_log_info(_("Page size is %lu bytes"), (unsigned long) PA_PAGE_SIZE);
762
763 #ifdef HAVE_VALGRIND_MEMCHECK_H
764     pa_log_debug(_("Compiled with Valgrind support: yes"));
765 #else
766     pa_log_debug(_("Compiled with Valgrind support: no"));
767 #endif
768
769     pa_log_debug(_("Running in valgrind mode: %s"), pa_yes_no(pa_in_valgrind()));
770
771 #ifdef __OPTIMIZE__
772     pa_log_debug(_("Optimized build: yes"));
773 #else
774     pa_log_debug(_("Optimized build: no"));
775 #endif
776
777 #ifdef NDEBUG
778     pa_log_debug(_("NDEBUG defined, all asserts disabled."));
779 #elif defined(FASTPATH)
780     pa_log_debug(_("FASTPATH defined, only fast path asserts disabled."));
781 #else
782     pa_log_debug(_("All asserts enabled."));
783 #endif
784
785     if (!(s = pa_machine_id())) {
786         pa_log(_("Failed to get machine ID"));
787         goto finish;
788     }
789     pa_log_info(_("Machine ID is %s."), s);
790     pa_xfree(s);
791
792     if ((s = pa_session_id())) {
793         pa_log_info(_("Session ID is %s."), s);
794         pa_xfree(s);
795     }
796
797     if (!(s = pa_get_runtime_dir()))
798         goto finish;
799     pa_log_info(_("Using runtime directory %s."), s);
800     pa_xfree(s);
801
802     if (!(s = pa_get_state_dir()))
803         goto finish;
804     pa_log_info(_("Using state directory %s."), s);
805     pa_xfree(s);
806
807     pa_log_info(_("Using modules directory %s."), conf->dl_search_path);
808
809     pa_log_info(_("Running in system mode: %s"), pa_yes_no(pa_in_system_mode()));
810
811     if (pa_in_system_mode())
812         pa_log_warn(_("OK, so you are running PA in system mode. Please note that you most likely shouldn't be doing that.\n"
813                       "If you do it nonetheless then it's your own fault if things don't work as expected.\n"
814                       "Please read http://pulseaudio.org/wiki/WhatIsWrongWithSystemMode for an explanation why system mode is usually a bad idea."));
815
816     if (conf->use_pid_file) {
817         int z;
818
819         if ((z = pa_pid_file_create("pulseaudio")) != 0) {
820
821             if (conf->cmd == PA_CMD_START && z > 0) {
822                 /* If we are already running and with are run in
823                  * --start mode, then let's return this as success. */
824
825                 retval = 0;
826                 goto finish;
827             }
828
829             pa_log(_("pa_pid_file_create() failed."));
830             goto finish;
831         }
832
833         valid_pid_file = TRUE;
834     }
835
836     pa_disable_sigpipe();
837
838     if (pa_rtclock_hrtimer())
839         pa_log_info(_("Fresh high-resolution timers available! Bon appetit!"));
840     else
841         pa_log_info(_("Dude, your kernel stinks! The chef's recommendation today is Linux with high-resolution timers enabled!"));
842
843     if (conf->lock_memory) {
844 #ifdef HAVE_SYS_MMAN_H
845         if (mlockall(MCL_FUTURE) < 0)
846             pa_log_warn("mlockall() failed: %s", pa_cstrerror(errno));
847         else
848             pa_log_info("Sucessfully locked process into memory.");
849 #else
850         pa_log_warn("Memory locking requested but not supported on platform.");
851 #endif
852     }
853
854     pa_memtrap_install();
855
856     pa_cpu_init_x86();
857     pa_cpu_init_arm();
858
859     pa_assert_se(mainloop = pa_mainloop_new());
860
861     if (!(c = pa_core_new(pa_mainloop_get_api(mainloop), !conf->disable_shm, conf->shm_size))) {
862         pa_log(_("pa_core_new() failed."));
863         goto finish;
864     }
865
866     c->default_sample_spec = conf->default_sample_spec;
867     c->default_channel_map = conf->default_channel_map;
868     c->default_n_fragments = conf->default_n_fragments;
869     c->default_fragment_size_msec = conf->default_fragment_size_msec;
870     c->exit_idle_time = conf->exit_idle_time;
871     c->scache_idle_time = conf->scache_idle_time;
872     c->resample_method = conf->resample_method;
873     c->realtime_priority = conf->realtime_priority;
874     c->realtime_scheduling = !!conf->realtime_scheduling;
875     c->disable_remixing = !!conf->disable_remixing;
876     c->disable_lfe_remixing = !!conf->disable_lfe_remixing;
877     c->running_as_daemon = !!conf->daemonize;
878     c->disallow_exit = conf->disallow_exit;
879     c->flat_volumes = conf->flat_volumes;
880 #ifdef HAVE_DBUS
881     c->server_type = conf->local_server_type;
882 #endif
883
884     pa_assert_se(pa_signal_init(pa_mainloop_get_api(mainloop)) == 0);
885     pa_signal_new(SIGINT, signal_callback, c);
886     pa_signal_new(SIGTERM, signal_callback, c);
887 #ifdef SIGUSR1
888     pa_signal_new(SIGUSR1, signal_callback, c);
889 #endif
890 #ifdef SIGUSR2
891     pa_signal_new(SIGUSR2, signal_callback, c);
892 #endif
893 #ifdef SIGHUP
894     pa_signal_new(SIGHUP, signal_callback, c);
895 #endif
896
897 #ifdef OS_IS_WIN32
898     win32_timer = pa_mainloop_get_api(mainloop)->rtclock_time_new(pa_mainloop_get_api(mainloop), pa_gettimeofday(&win32_tv), message_cb, NULL);
899 #endif
900
901     if (!conf->no_cpu_limit)
902         pa_assert_se(pa_cpu_limit_init(pa_mainloop_get_api(mainloop)) == 0);
903
904     buf = pa_strbuf_new();
905
906 #ifdef HAVE_DBUS
907     if (start_server) {
908 #endif
909         if (conf->load_default_script_file) {
910             FILE *f;
911
912             if ((f = pa_daemon_conf_open_default_script_file(conf))) {
913                 r = pa_cli_command_execute_file_stream(c, f, buf, &conf->fail);
914                 fclose(f);
915             }
916         }
917
918         if (r >= 0)
919             r = pa_cli_command_execute(c, conf->script_commands, buf, &conf->fail);
920
921         pa_log_error("%s", s = pa_strbuf_tostring_free(buf));
922         pa_xfree(s);
923
924         if (r < 0 && conf->fail) {
925             pa_log(_("Failed to initialize daemon."));
926             goto finish;
927         }
928
929         if (!c->modules || pa_idxset_size(c->modules) == 0) {
930             pa_log(_("Daemon startup without any loaded modules, refusing to work."));
931             goto finish;
932         }
933 #ifdef HAVE_DBUS
934     } else {
935         /* When we just provide the D-Bus server lookup service, we don't want
936          * any modules to be loaded. We haven't loaded any so far, so one might
937          * think there's no way to contact the server, but receiving certain
938          * signals could still cause modules to load. */
939         conf->disallow_module_loading = TRUE;
940     }
941 #endif
942
943     /* We completed the initial module loading, so let's disable it
944      * from now on, if requested */
945     c->disallow_module_loading = !!conf->disallow_module_loading;
946
947 #ifdef HAVE_FORK
948     if (daemon_pipe[1] >= 0) {
949         int ok = 0;
950         pa_loop_write(daemon_pipe[1], &ok, sizeof(ok), NULL);
951         pa_close(daemon_pipe[1]);
952         daemon_pipe[1] = -1;
953     }
954 #endif
955
956 #ifdef HAVE_DBUS
957     if (!conf->system_instance) {
958         if (!(server_lookup = pa_dbusobj_server_lookup_new(c)))
959             goto finish;
960         if (!(lookup_service_bus = register_dbus_name(c, DBUS_BUS_SESSION, "org.PulseAudio1")))
961             goto finish;
962     }
963
964     if (start_server && !(server_bus = register_dbus_name(c, conf->system_instance ? DBUS_BUS_SYSTEM : DBUS_BUS_SESSION, "org.pulseaudio.Server")))
965         goto finish;
966 #endif
967
968     pa_log_info(_("Daemon startup complete."));
969
970     retval = 0;
971     if (pa_mainloop_run(mainloop, &retval) < 0)
972         goto finish;
973
974     pa_log_info(_("Daemon shutdown initiated."));
975
976 finish:
977 #ifdef HAVE_DBUS
978     if (server_bus)
979         pa_dbus_connection_unref(server_bus);
980     if (lookup_service_bus)
981         pa_dbus_connection_unref(lookup_service_bus);
982     if (server_lookup)
983         pa_dbusobj_server_lookup_free(server_lookup);
984 #endif
985
986     if (autospawn_fd >= 0) {
987         if (autospawn_locked)
988             pa_autospawn_lock_release();
989
990         pa_autospawn_lock_done(FALSE);
991     }
992
993 #ifdef OS_IS_WIN32
994     if (win32_timer)
995         pa_mainloop_get_api(mainloop)->time_free(win32_timer);
996 #endif
997
998     if (c) {
999         pa_core_unref(c);
1000         pa_log_info(_("Daemon terminated."));
1001     }
1002
1003     if (!conf->no_cpu_limit)
1004         pa_cpu_limit_done();
1005
1006     pa_signal_done();
1007
1008 #ifdef HAVE_FORK
1009     if (daemon_pipe[1] >= 0)
1010         pa_loop_write(daemon_pipe[1], &retval, sizeof(retval), NULL);
1011
1012     pa_close_pipe(daemon_pipe);
1013 #endif
1014
1015     if (mainloop)
1016         pa_mainloop_free(mainloop);
1017
1018     if (conf)
1019         pa_daemon_conf_free(conf);
1020
1021     if (valid_pid_file)
1022         pa_pid_file_remove();
1023
1024 #ifdef OS_IS_WIN32
1025     WSACleanup();
1026 #endif
1027
1028     if (ltdl_init)
1029         pa_ltdl_done();
1030
1031 #ifdef HAVE_DBUS
1032     dbus_shutdown();
1033 #endif
1034
1035     return retval;
1036 }