diff options
Diffstat (limited to 'src/daemon/main.c')
| -rw-r--r-- | src/daemon/main.c | 93 | 
1 files changed, 67 insertions, 26 deletions
diff --git a/src/daemon/main.c b/src/daemon/main.c index ab438320..f6d2512c 100644 --- a/src/daemon/main.c +++ b/src/daemon/main.c @@ -66,6 +66,7 @@  #include <pulse/xmalloc.h>  #include <pulse/i18n.h> +#include <pulsecore/lock-autospawn.h>  #include <pulsecore/winsock.h>  #include <pulsecore/core-error.h>  #include <pulsecore/core.h> @@ -95,8 +96,6 @@  #include "ltdl-bind-now.h"  #include "polkit.h" -#define AUTOSPAWN_LOCK "autospawn.lock" -  #ifdef HAVE_LIBWRAP  /* Only one instance of these variables */  int allow_severity = LOG_INFO; @@ -112,7 +111,7 @@ int __padsp_disabled__ = 7;  #ifdef OS_IS_WIN32 -static void message_cb(pa_mainloop_api*a, pa_time_event*e, PA_GCC_UNUSED const struct timeval *tv, void *userdata) { +static void message_cb(pa_mainloop_api*a, pa_time_event*e, const struct timeval *tv, void *userdata) {      MSG msg;      struct timeval tvnext; @@ -131,7 +130,7 @@ static void message_cb(pa_mainloop_api*a, pa_time_event*e, PA_GCC_UNUSED const s  #endif -static void signal_callback(pa_mainloop_api*m, PA_GCC_UNUSED pa_signal_event *e, int sig, void *userdata) { +static void signal_callback(pa_mainloop_api*m, pa_signal_event *e, int sig, void *userdata) {      pa_log_info(_("Got signal %s."), pa_sig2str(sig));      switch (sig) { @@ -223,7 +222,7 @@ static int change_user(void) {  #elif defined(HAVE_SETREGID)      r = setregid(gr->gr_gid, gr->gr_gid);  #else -#error "No API to drop priviliges" +#error "No API to drop privileges"  #endif      if (r < 0) { @@ -239,7 +238,7 @@ static int change_user(void) {  #elif defined(HAVE_SETREUID)      r = setreuid(pw->pw_uid, pw->pw_uid);  #else -#error "No API to drop priviliges" +#error "No API to drop privileges"  #endif      if (r < 0) { @@ -346,7 +345,11 @@ int main(int argc, char *argv[]) {      struct timeval win32_tv;  #endif      char *lf = NULL; -    int autospawn_lock_fd = -1; +    int autospawn_fd = -1; +    pa_bool_t autospawn_locked = FALSE; + +    pa_log_set_maximal_level(PA_LOG_INFO); +    pa_log_set_ident("pulseaudio");  #if defined(__linux__) && defined(__OPTIMIZE__)      /* @@ -379,7 +382,7 @@ int main(int argc, char *argv[]) {          /* Drop all capabilities except CAP_SYS_NICE  */          pa_limit_caps(); -        /* Drop priviliges, but keep CAP_SYS_NICE */ +        /* Drop privileges, but keep CAP_SYS_NICE */          pa_drop_root();          /* After dropping root, the effective set is reset, hence, @@ -410,9 +413,6 @@ int main(int argc, char *argv[]) {      setlocale(LC_ALL, "");      pa_init_i18n(); -    pa_log_set_maximal_level(PA_LOG_INFO); -    pa_log_set_ident("pulseaudio"); -      conf = pa_daemon_conf_new();      if (pa_daemon_conf_load(conf, NULL) < 0) @@ -428,6 +428,9 @@ int main(int argc, char *argv[]) {      pa_log_set_maximal_level(conf->log_level);      pa_log_set_target(conf->auto_log_target ? PA_LOG_STDERR : conf->log_target, NULL); +    pa_log_set_show_meta(conf->log_meta); +    pa_log_set_show_backtrace(conf->log_backtrace); +    pa_log_set_show_time(conf->log_time);      pa_log_debug("Started as real root: %s, suid root: %s", pa_yes_no(real_root), pa_yes_no(suid_root)); @@ -476,9 +479,9 @@ int main(int argc, char *argv[]) {              pa_drop_caps();              if (conf->high_priority || conf->realtime_scheduling) -                pa_log_notice(_("Called SUID root and real-time/high-priority scheduling was requested in the configuration. However, we lack the necessary priviliges:\n" -                                "We are not in group '"PA_REALTIME_GROUP"' and PolicyKit refuse to grant us priviliges. Dropping SUID again.\n" -                                "For enabling real-time scheduling please acquire the appropriate PolicyKit priviliges, or become a member of '"PA_REALTIME_GROUP"', or increase the RLIMIT_NICE/RLIMIT_RTPRIO resource limits for this user.")); +                pa_log_notice(_("Called SUID root and real-time/high-priority scheduling was requested in the configuration. However, we lack the necessary privileges:\n" +                                "We are not in group '"PA_REALTIME_GROUP"' and PolicyKit refuse to grant us privileges. Dropping SUID again.\n" +                                "For enabling real-time scheduling please acquire the appropriate PolicyKit privileges, or become a member of '"PA_REALTIME_GROUP"', or increase the RLIMIT_NICE/RLIMIT_RTPRIO resource limits for this user."));          }      } @@ -606,7 +609,7 @@ int main(int argc, char *argv[]) {          case PA_CMD_KILL:              if (pa_pid_file_kill(SIGINT, NULL, "pulseaudio") < 0) -                pa_log(_("Failed to kill daemon.")); +                pa_log(_("Failed to kill daemon: %s"), pa_cstrerror(errno));              else                  retval = 0; @@ -626,7 +629,7 @@ int main(int argc, char *argv[]) {      if (real_root && !conf->system_instance)          pa_log_warn(_("This program is not intended to be run as root (unless --system is specified)."));      else if (!real_root && conf->system_instance) { -        pa_log(_("Root priviliges required.")); +        pa_log(_("Root privileges required."));          goto finish;      } @@ -646,9 +649,9 @@ int main(int argc, char *argv[]) {          conf->disable_shm = TRUE;      } -    if (conf->system_instance && conf->exit_idle_time > 0) { +    if (conf->system_instance && conf->exit_idle_time >= 0) {          pa_log_notice(_("Running in system mode, forcibly disabling exit idle time!")); -        conf->exit_idle_time = 0; +        conf->exit_idle_time = -1;      }      if (conf->cmd == PA_CMD_START) { @@ -656,8 +659,17 @@ int main(int argc, char *argv[]) {           * first take the autospawn lock to make things           * synchronous. */ -        lf = pa_runtime_path(AUTOSPAWN_LOCK); -        autospawn_lock_fd = pa_lock_lockfile(lf); +        if ((autospawn_fd = pa_autospawn_lock_init()) < 0) { +            pa_log("Failed to initialize autospawn lock"); +            goto finish; +        } + +        if ((pa_autospawn_lock_acquire(TRUE) < 0)) { +            pa_log("Failed to acquire autospawn lock"); +            goto finish; +        } + +        autospawn_locked = TRUE;      }      if (conf->daemonize) { @@ -703,12 +715,15 @@ int main(int argc, char *argv[]) {              goto finish;          } -        if (autospawn_lock_fd >= 0) { +        if (autospawn_fd >= 0) {              /* The lock file is unlocked from the parent, so we need               * to close it in the child */ -            pa_close(autospawn_lock_fd); -            autospawn_lock_fd = -1; +            pa_autospawn_lock_release(); +            pa_autospawn_lock_done(TRUE); + +            autospawn_locked = FALSE; +            autospawn_fd = -1;          }          pa_assert_se(pa_close(daemon_pipe[0]) == 0); @@ -766,8 +781,29 @@ int main(int argc, char *argv[]) {      pa_set_env("PULSE_SYSTEM", conf->system_instance ? "1" : "0");      pa_log_info(_("This is PulseAudio %s"), PACKAGE_VERSION); +    pa_log_debug(_("Compilation host: %s"), CANONICAL_HOST); +    pa_log_debug(_("Compilation CFLAGS: %s"), PA_CFLAGS); + +    s = pa_uname_string(); +    pa_log_debug(_("Running on host: %s"), s); +    pa_xfree(s); +      pa_log_info(_("Page size is %lu bytes"), (unsigned long) PA_PAGE_SIZE); +#ifdef HAVE_VALGRIND_MEMCHECK_H +    pa_log_debug(_("Compiled with Valgrind support: yes")); +#else +    pa_log_debug(_("Compiled with Valgrind support: no")); +#endif + +    pa_log_debug(_("Running in valgrind mode: %s"), pa_yes_no(pa_in_valgrind())); + +#ifdef __OPTIMIZE__ +    pa_log_debug(_("Optimized build: yes")); +#else +    pa_log_debug(_("Optimized build: no")); +#endif +      if (!(s = pa_machine_id())) {          pa_log(_("Failed to get machine ID"));          goto finish; @@ -823,7 +859,7 @@ int main(int argc, char *argv[]) {      pa_assert_se(mainloop = pa_mainloop_new()); -    if (!(c = pa_core_new(pa_mainloop_get_api(mainloop), !conf->disable_shm))) { +    if (!(c = pa_core_new(pa_mainloop_get_api(mainloop), !conf->disable_shm, conf->shm_size))) {          pa_log(_("pa_core_new() failed."));          goto finish;      } @@ -838,6 +874,7 @@ int main(int argc, char *argv[]) {      c->realtime_priority = conf->realtime_priority;      c->realtime_scheduling = !!conf->realtime_scheduling;      c->disable_remixing = !!conf->disable_remixing; +    c->disable_lfe_remixing = !!conf->disable_lfe_remixing;      c->running_as_daemon = !!conf->daemonize;      c->disallow_exit = conf->disallow_exit; @@ -917,8 +954,12 @@ int main(int argc, char *argv[]) {  finish: -    if (autospawn_lock_fd >= 0) -        pa_unlock_lockfile(lf, autospawn_lock_fd); +    if (autospawn_fd >= 0) { +        if (autospawn_locked) +            pa_autospawn_lock_release(); + +        pa_autospawn_lock_done(FALSE); +    }      if (lf)          pa_xfree(lf);  | 
