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