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