Merge branch 'master' of ssh://rootserver/home/lennart/git/public/pulseaudio
[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     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
541             if (d < argc) {
542                 pa_log("Too many arguments.\n");
543                 goto finish;
544             }
545
546             s = pa_daemon_conf_dump(conf);
547             fputs(s, stdout);
548             pa_xfree(s);
549             retval = 0;
550             goto finish;
551         }
552
553         case PA_CMD_DUMP_RESAMPLE_METHODS: {
554             int i;
555
556             if (d < argc) {
557                 pa_log("Too many arguments.\n");
558                 goto finish;
559             }
560
561             for (i = 0; i < PA_RESAMPLER_MAX; i++)
562                 if (pa_resample_method_supported(i))
563                     printf("%s\n", pa_resample_method_to_string(i));
564
565             retval = 0;
566             goto finish;
567         }
568
569         case PA_CMD_HELP :
570             pa_cmdline_help(argv[0]);
571             retval = 0;
572             goto finish;
573
574         case PA_CMD_VERSION :
575
576             if (d < argc) {
577                 pa_log("Too many arguments.\n");
578                 goto finish;
579             }
580
581             printf(PACKAGE_NAME" "PACKAGE_VERSION"\n");
582             retval = 0;
583             goto finish;
584
585         case PA_CMD_CHECK: {
586             pid_t pid;
587
588             if (d < argc) {
589                 pa_log("Too many arguments.\n");
590                 goto finish;
591             }
592
593             if (pa_pid_file_check_running(&pid, "pulseaudio") < 0)
594                 pa_log_info(_("Daemon not running"));
595             else {
596                 pa_log_info(_("Daemon running as PID %u"), pid);
597                 retval = 0;
598             }
599
600             goto finish;
601
602         }
603         case PA_CMD_KILL:
604
605             if (d < argc) {
606                 pa_log("Too many arguments.\n");
607                 goto finish;
608             }
609
610             if (pa_pid_file_kill(SIGINT, NULL, "pulseaudio") < 0)
611                 pa_log(_("Failed to kill daemon: %s"), pa_cstrerror(errno));
612             else
613                 retval = 0;
614
615             goto finish;
616
617         case PA_CMD_CLEANUP_SHM:
618
619             if (d < argc) {
620                 pa_log("Too many arguments.\n");
621                 goto finish;
622             }
623
624             if (pa_shm_cleanup() >= 0)
625                 retval = 0;
626
627             goto finish;
628
629         default:
630             pa_assert(conf->cmd == PA_CMD_DAEMON || conf->cmd == PA_CMD_START);
631     }
632
633     if (d < argc) {
634         pa_log("Too many arguments.\n");
635         goto finish;
636     }
637
638     if (getuid() == 0 && !conf->system_instance)
639         pa_log_warn(_("This program is not intended to be run as root (unless --system is specified)."));
640 #ifndef HAVE_DBUS /* A similar, only a notice worthy check was done earlier, if D-Bus is enabled. */
641     else if (getuid() != 0 && conf->system_instance) {
642         pa_log(_("Root privileges required."));
643         goto finish;
644     }
645 #endif
646
647     if (conf->cmd == PA_CMD_START && conf->system_instance) {
648         pa_log(_("--start not supported for system instances."));
649         goto finish;
650     }
651
652     if (conf->system_instance && !conf->disallow_exit)
653         pa_log_warn(_("Running in system mode, but --disallow-exit not set!"));
654
655     if (conf->system_instance && !conf->disallow_module_loading)
656         pa_log_warn(_("Running in system mode, but --disallow-module-loading not set!"));
657
658     if (conf->system_instance && !conf->disable_shm) {
659         pa_log_notice(_("Running in system mode, forcibly disabling SHM mode!"));
660         conf->disable_shm = TRUE;
661     }
662
663     if (conf->system_instance && conf->exit_idle_time >= 0) {
664         pa_log_notice(_("Running in system mode, forcibly disabling exit idle time!"));
665         conf->exit_idle_time = -1;
666     }
667
668     if (conf->cmd == PA_CMD_START) {
669         /* If we shall start PA only when it is not running yet, we
670          * first take the autospawn lock to make things
671          * synchronous. */
672
673         if ((autospawn_fd = pa_autospawn_lock_init()) < 0) {
674             pa_log("Failed to initialize autospawn lock");
675             goto finish;
676         }
677
678         if ((pa_autospawn_lock_acquire(TRUE) < 0)) {
679             pa_log("Failed to acquire autospawn lock");
680             goto finish;
681         }
682
683         autospawn_locked = TRUE;
684     }
685
686     if (conf->daemonize) {
687         pid_t child;
688
689         if (pa_stdio_acquire() < 0) {
690             pa_log(_("Failed to acquire stdio."));
691             goto finish;
692         }
693
694 #ifdef HAVE_FORK
695         if (pipe(daemon_pipe) < 0) {
696             pa_log(_("pipe() failed: %s"), pa_cstrerror(errno));
697             goto finish;
698         }
699
700         if ((child = fork()) < 0) {
701             pa_log(_("fork() failed: %s"), pa_cstrerror(errno));
702             goto finish;
703         }
704
705         if (child != 0) {
706             ssize_t n;
707             /* Father */
708
709             pa_assert_se(pa_close(daemon_pipe[1]) == 0);
710             daemon_pipe[1] = -1;
711
712             if ((n = pa_loop_read(daemon_pipe[0], &retval, sizeof(retval), NULL)) != sizeof(retval)) {
713
714                 if (n < 0)
715                     pa_log(_("read() failed: %s"), pa_cstrerror(errno));
716
717                 retval = 1;
718             }
719
720             if (retval)
721                 pa_log(_("Daemon startup failed."));
722             else
723                 pa_log_info(_("Daemon startup successful."));
724
725             goto finish;
726         }
727
728         if (autospawn_fd >= 0) {
729             /* The lock file is unlocked from the parent, so we need
730              * to close it in the child */
731
732             pa_autospawn_lock_release();
733             pa_autospawn_lock_done(TRUE);
734
735             autospawn_locked = FALSE;
736             autospawn_fd = -1;
737         }
738
739         pa_assert_se(pa_close(daemon_pipe[0]) == 0);
740         daemon_pipe[0] = -1;
741 #endif
742
743         if (conf->auto_log_target)
744             pa_log_set_target(PA_LOG_SYSLOG);
745
746 #ifdef HAVE_SETSID
747         if (setsid() < 0) {
748             pa_log(_("setsid() failed: %s"), pa_cstrerror(errno));
749             goto finish;
750         }
751 #endif
752
753         /* We now are a session and process group leader. Let's fork
754          * again and let the father die, so that we'll become a
755          * process that can never acquire a TTY again, in a session and
756          * process group without leader */
757
758 #ifdef HAVE_FORK
759         if ((child = fork()) < 0) {
760             pa_log(_("fork() failed: %s"), pa_cstrerror(errno));
761             goto finish;
762         }
763
764         if (child != 0) {
765             retval = 0;
766             goto finish;
767         }
768 #endif
769
770 #ifdef SIGTTOU
771         signal(SIGTTOU, SIG_IGN);
772 #endif
773 #ifdef SIGTTIN
774         signal(SIGTTIN, SIG_IGN);
775 #endif
776 #ifdef SIGTSTP
777         signal(SIGTSTP, SIG_IGN);
778 #endif
779
780         pa_nullify_stdfds();
781     }
782
783     pa_set_env_and_record("PULSE_INTERNAL", "1");
784     pa_assert_se(chdir("/") == 0);
785     umask(0022);
786
787 #ifdef HAVE_SYS_RESOURCE_H
788     set_all_rlimits(conf);
789 #endif
790     pa_rtclock_hrtimer_enable();
791
792     pa_raise_priority(conf->nice_level);
793
794     if (conf->system_instance)
795         if (change_user() < 0)
796             goto finish;
797
798     pa_set_env_and_record("PULSE_SYSTEM", conf->system_instance ? "1" : "0");
799
800     pa_log_info(_("This is PulseAudio %s"), PACKAGE_VERSION);
801     pa_log_debug(_("Compilation host: %s"), CANONICAL_HOST);
802     pa_log_debug(_("Compilation CFLAGS: %s"), PA_CFLAGS);
803
804     s = pa_uname_string();
805     pa_log_debug(_("Running on host: %s"), s);
806     pa_xfree(s);
807
808     pa_log_debug(_("Found %u CPUs."), pa_ncpus());
809
810     pa_log_info(_("Page size is %lu bytes"), (unsigned long) PA_PAGE_SIZE);
811
812 #ifdef HAVE_VALGRIND_MEMCHECK_H
813     pa_log_debug(_("Compiled with Valgrind support: yes"));
814 #else
815     pa_log_debug(_("Compiled with Valgrind support: no"));
816 #endif
817
818     pa_log_debug(_("Running in valgrind mode: %s"), pa_yes_no(pa_in_valgrind()));
819
820     pa_log_debug(_("Running in VM: %s"), pa_yes_no(pa_running_in_vm()));
821
822 #ifdef __OPTIMIZE__
823     pa_log_debug(_("Optimized build: yes"));
824 #else
825     pa_log_debug(_("Optimized build: no"));
826 #endif
827
828 #ifdef NDEBUG
829     pa_log_debug(_("NDEBUG defined, all asserts disabled."));
830 #elif defined(FASTPATH)
831     pa_log_debug(_("FASTPATH defined, only fast path asserts disabled."));
832 #else
833     pa_log_debug(_("All asserts enabled."));
834 #endif
835
836     if (!(s = pa_machine_id())) {
837         pa_log(_("Failed to get machine ID"));
838         goto finish;
839     }
840     pa_log_info(_("Machine ID is %s."), s);
841     pa_xfree(s);
842
843     if ((s = pa_session_id())) {
844         pa_log_info(_("Session ID is %s."), s);
845         pa_xfree(s);
846     }
847
848     if (!(s = pa_get_runtime_dir()))
849         goto finish;
850     pa_log_info(_("Using runtime directory %s."), s);
851     pa_xfree(s);
852
853     if (!(s = pa_get_state_dir()))
854         goto finish;
855     pa_log_info(_("Using state directory %s."), s);
856     pa_xfree(s);
857
858     pa_log_info(_("Using modules directory %s."), conf->dl_search_path);
859
860     pa_log_info(_("Running in system mode: %s"), pa_yes_no(pa_in_system_mode()));
861
862     if (pa_in_system_mode())
863         pa_log_warn(_("OK, so you are running PA in system mode. Please note that you most likely shouldn't be doing that.\n"
864                       "If you do it nonetheless then it's your own fault if things don't work as expected.\n"
865                       "Please read http://pulseaudio.org/wiki/WhatIsWrongWithSystemMode for an explanation why system mode is usually a bad idea."));
866
867     if (conf->use_pid_file) {
868         int z;
869
870         if ((z = pa_pid_file_create("pulseaudio")) != 0) {
871
872             if (conf->cmd == PA_CMD_START && z > 0) {
873                 /* If we are already running and with are run in
874                  * --start mode, then let's return this as success. */
875
876                 retval = 0;
877                 goto finish;
878             }
879
880             pa_log(_("pa_pid_file_create() failed."));
881             goto finish;
882         }
883
884         valid_pid_file = TRUE;
885     }
886
887     pa_disable_sigpipe();
888
889     if (pa_rtclock_hrtimer())
890         pa_log_info(_("Fresh high-resolution timers available! Bon appetit!"));
891     else
892         pa_log_info(_("Dude, your kernel stinks! The chef's recommendation today is Linux with high-resolution timers enabled!"));
893
894     if (conf->lock_memory) {
895 #ifdef HAVE_SYS_MMAN_H
896         if (mlockall(MCL_FUTURE) < 0)
897             pa_log_warn("mlockall() failed: %s", pa_cstrerror(errno));
898         else
899             pa_log_info("Sucessfully locked process into memory.");
900 #else
901         pa_log_warn("Memory locking requested but not supported on platform.");
902 #endif
903     }
904
905     pa_memtrap_install();
906
907     if (!getenv("PULSE_NO_SIMD")) {
908         pa_cpu_init_x86();
909         pa_cpu_init_arm();
910     }
911
912     pa_assert_se(mainloop = pa_mainloop_new());
913
914     if (!(c = pa_core_new(pa_mainloop_get_api(mainloop), !conf->disable_shm, conf->shm_size))) {
915         pa_log(_("pa_core_new() failed."));
916         goto finish;
917     }
918
919     c->default_sample_spec = conf->default_sample_spec;
920     c->default_channel_map = conf->default_channel_map;
921     c->default_n_fragments = conf->default_n_fragments;
922     c->default_fragment_size_msec = conf->default_fragment_size_msec;
923     c->exit_idle_time = conf->exit_idle_time;
924     c->scache_idle_time = conf->scache_idle_time;
925     c->resample_method = conf->resample_method;
926     c->realtime_priority = conf->realtime_priority;
927     c->realtime_scheduling = !!conf->realtime_scheduling;
928     c->disable_remixing = !!conf->disable_remixing;
929     c->disable_lfe_remixing = !!conf->disable_lfe_remixing;
930     c->running_as_daemon = !!conf->daemonize;
931     c->disallow_exit = conf->disallow_exit;
932     c->flat_volumes = conf->flat_volumes;
933 #ifdef HAVE_DBUS
934     c->server_type = conf->local_server_type;
935 #endif
936
937     pa_assert_se(pa_signal_init(pa_mainloop_get_api(mainloop)) == 0);
938     pa_signal_new(SIGINT, signal_callback, c);
939     pa_signal_new(SIGTERM, signal_callback, c);
940 #ifdef SIGUSR1
941     pa_signal_new(SIGUSR1, signal_callback, c);
942 #endif
943 #ifdef SIGUSR2
944     pa_signal_new(SIGUSR2, signal_callback, c);
945 #endif
946 #ifdef SIGHUP
947     pa_signal_new(SIGHUP, signal_callback, c);
948 #endif
949
950 #ifdef OS_IS_WIN32
951     win32_timer = pa_mainloop_get_api(mainloop)->rtclock_time_new(pa_mainloop_get_api(mainloop), pa_gettimeofday(&win32_tv), message_cb, NULL);
952 #endif
953
954     if (!conf->no_cpu_limit)
955         pa_assert_se(pa_cpu_limit_init(pa_mainloop_get_api(mainloop)) == 0);
956
957     buf = pa_strbuf_new();
958
959 #ifdef HAVE_DBUS
960     if (start_server) {
961 #endif
962         if (conf->load_default_script_file) {
963             FILE *f;
964
965             if ((f = pa_daemon_conf_open_default_script_file(conf))) {
966                 r = pa_cli_command_execute_file_stream(c, f, buf, &conf->fail);
967                 fclose(f);
968             }
969         }
970
971         if (r >= 0)
972             r = pa_cli_command_execute(c, conf->script_commands, buf, &conf->fail);
973
974         pa_log_error("%s", s = pa_strbuf_tostring_free(buf));
975         pa_xfree(s);
976
977         if (r < 0 && conf->fail) {
978             pa_log(_("Failed to initialize daemon."));
979             goto finish;
980         }
981
982         if (!c->modules || pa_idxset_size(c->modules) == 0) {
983             pa_log(_("Daemon startup without any loaded modules, refusing to work."));
984             goto finish;
985         }
986 #ifdef HAVE_DBUS
987     } else {
988         /* When we just provide the D-Bus server lookup service, we don't want
989          * any modules to be loaded. We haven't loaded any so far, so one might
990          * think there's no way to contact the server, but receiving certain
991          * signals could still cause modules to load. */
992         conf->disallow_module_loading = TRUE;
993     }
994 #endif
995
996     /* We completed the initial module loading, so let's disable it
997      * from now on, if requested */
998     c->disallow_module_loading = !!conf->disallow_module_loading;
999
1000 #ifdef HAVE_FORK
1001     if (daemon_pipe[1] >= 0) {
1002         int ok = 0;
1003         pa_loop_write(daemon_pipe[1], &ok, sizeof(ok), NULL);
1004         pa_close(daemon_pipe[1]);
1005         daemon_pipe[1] = -1;
1006     }
1007 #endif
1008
1009 #ifdef HAVE_DBUS
1010     if (!conf->system_instance) {
1011         if (!(server_lookup = pa_dbusobj_server_lookup_new(c)))
1012             goto finish;
1013         if (!(lookup_service_bus = register_dbus_name(c, DBUS_BUS_SESSION, "org.PulseAudio1")))
1014             goto finish;
1015     }
1016
1017     if (start_server && !(server_bus = register_dbus_name(c, conf->system_instance ? DBUS_BUS_SYSTEM : DBUS_BUS_SESSION, "org.pulseaudio.Server")))
1018         goto finish;
1019 #endif
1020
1021     pa_log_info(_("Daemon startup complete."));
1022
1023     retval = 0;
1024     if (pa_mainloop_run(mainloop, &retval) < 0)
1025         goto finish;
1026
1027     pa_log_info(_("Daemon shutdown initiated."));
1028
1029 finish:
1030 #ifdef HAVE_DBUS
1031     if (server_bus)
1032         pa_dbus_connection_unref(server_bus);
1033     if (lookup_service_bus)
1034         pa_dbus_connection_unref(lookup_service_bus);
1035     if (server_lookup)
1036         pa_dbusobj_server_lookup_free(server_lookup);
1037 #endif
1038
1039     if (autospawn_fd >= 0) {
1040         if (autospawn_locked)
1041             pa_autospawn_lock_release();
1042
1043         pa_autospawn_lock_done(FALSE);
1044     }
1045
1046 #ifdef OS_IS_WIN32
1047     if (win32_timer)
1048         pa_mainloop_get_api(mainloop)->time_free(win32_timer);
1049 #endif
1050
1051     if (c) {
1052         pa_core_unref(c);
1053         pa_log_info(_("Daemon terminated."));
1054     }
1055
1056     if (!conf->no_cpu_limit)
1057         pa_cpu_limit_done();
1058
1059     pa_signal_done();
1060
1061 #ifdef HAVE_FORK
1062     if (daemon_pipe[1] >= 0)
1063         pa_loop_write(daemon_pipe[1], &retval, sizeof(retval), NULL);
1064
1065     pa_close_pipe(daemon_pipe);
1066 #endif
1067
1068     if (mainloop)
1069         pa_mainloop_free(mainloop);
1070
1071     if (conf)
1072         pa_daemon_conf_free(conf);
1073
1074     if (valid_pid_file)
1075         pa_pid_file_remove();
1076
1077     /* This has no real purpose except making things valgrind-clean */
1078     pa_unset_env_recorded();
1079
1080 #ifdef OS_IS_WIN32
1081     WSACleanup();
1082 #endif
1083
1084     if (ltdl_init)
1085         pa_ltdl_done();
1086
1087 #ifdef HAVE_DBUS
1088     dbus_shutdown();
1089 #endif
1090
1091     return retval;
1092 }