#include <pulse/mainloop-signal.h>
#include <pulse/timeval.h>
#include <pulse/xmalloc.h>
-#include <pulse/i18n.h>
+#include <pulsecore/i18n.h>
#include <pulsecore/lock-autospawn.h>
#include <pulsecore/socket.h>
#include <pulsecore/core-error.h>
#include <pulsecore/core-rtclock.h>
+#include <pulsecore/core-scache.h>
#include <pulsecore/core.h>
#include <pulsecore/module.h>
#include <pulsecore/cli-command.h>
return -1;
}
- if (strcmp(pw->pw_dir, PA_SYSTEM_RUNTIME_PATH) != 0)
+ if (!pa_streq(pw->pw_dir, PA_SYSTEM_RUNTIME_PATH))
pa_log_warn(_("Home directory of user '%s' is not '%s', ignoring."), PA_SYSTEM_USER, PA_SYSTEM_RUNTIME_PATH);
- if (pa_make_secure_dir(PA_SYSTEM_RUNTIME_PATH, 0755, pw->pw_uid, gr->gr_gid) < 0) {
+ if (pa_make_secure_dir(PA_SYSTEM_RUNTIME_PATH, 0755, pw->pw_uid, gr->gr_gid, TRUE) < 0) {
pa_log(_("Failed to create '%s': %s"), PA_SYSTEM_RUNTIME_PATH, pa_cstrerror(errno));
return -1;
}
- if (pa_make_secure_dir(PA_SYSTEM_STATE_PATH, 0700, pw->pw_uid, gr->gr_gid) < 0) {
+ if (pa_make_secure_dir(PA_SYSTEM_STATE_PATH, 0700, pw->pw_uid, gr->gr_gid, TRUE) < 0) {
pa_log(_("Failed to create '%s': %s"), PA_SYSTEM_STATE_PATH, pa_cstrerror(errno));
return -1;
}
return -1;
}
+ pa_drop_caps();
+
pa_set_env("USER", PA_SYSTEM_USER);
pa_set_env("USERNAME", PA_SYSTEM_USER);
pa_set_env("LOGNAME", PA_SYSTEM_USER);
if (!getenv("PULSE_STATE_PATH"))
pa_set_env("PULSE_STATE_PATH", PA_SYSTEM_STATE_PATH);
- pa_log_info(_("Successfully dropped root privileges."));
+ pa_log_info(_("Successfully changed user to \"" PA_SYSTEM_USER "\"."));
return 0;
}
if (dbus_error_is_set(&error))
pa_log_error("Failed to acquire %s: %s: %s", name, error.name, error.message);
else
- pa_log_error("D-Bus name %s already taken. Weird shit!", name);
+ pa_log_error("D-Bus name %s already taken.", name);
/* PA cannot be started twice by the same user and hence we can
* ignore mostly the case that a name is already taken. */
goto finish;
}
+ if (conf->log_target)
+ pa_log_set_target(conf->log_target);
+ else {
+ pa_log_target target = { .type = PA_LOG_STDERR, .file = NULL };
+ pa_log_set_target(&target);
+ }
+
pa_log_set_level(conf->log_level);
- pa_log_set_target(conf->auto_log_target ? PA_LOG_STDERR : conf->log_target);
if (conf->log_meta)
pa_log_set_flags(PA_LOG_PRINT_META, PA_LOG_SET);
if (conf->log_time)
}
if (conf->daemonize) {
+#ifdef HAVE_FORK
pid_t child;
+#endif
if (pa_stdio_acquire() < 0) {
pa_log(_("Failed to acquire stdio."));
daemon_pipe[0] = -1;
#endif
- if (conf->auto_log_target)
- pa_log_set_target(PA_LOG_SYSLOG);
+ if (!conf->log_target) {
+ pa_log_target target = { .type = PA_LOG_SYSLOG, .file = NULL };
+ pa_log_set_target(&target);
+ }
#ifdef HAVE_SETSID
if (setsid() < 0) {
}
c->default_sample_spec = conf->default_sample_spec;
+ c->alternate_sample_rate = conf->alternate_sample_rate;
c->default_channel_map = conf->default_channel_map;
c->default_n_fragments = conf->default_n_fragments;
c->default_fragment_size_msec = conf->default_fragment_size_msec;
- c->sync_volume_safety_margin_usec = conf->sync_volume_safety_margin_usec;
- c->sync_volume_extra_delay_usec = conf->sync_volume_extra_delay_usec;
+ c->deferred_volume_safety_margin_usec = conf->deferred_volume_safety_margin_usec;
+ c->deferred_volume_extra_delay_usec = conf->deferred_volume_extra_delay_usec;
c->exit_idle_time = conf->exit_idle_time;
c->scache_idle_time = conf->scache_idle_time;
c->resample_method = conf->resample_method;
c->realtime_scheduling = !!conf->realtime_scheduling;
c->disable_remixing = !!conf->disable_remixing;
c->disable_lfe_remixing = !!conf->disable_lfe_remixing;
- c->sync_volume = !!conf->sync_volume;
+ c->deferred_volume = !!conf->deferred_volume;
c->running_as_daemon = !!conf->daemonize;
c->disallow_exit = conf->disallow_exit;
c->flat_volumes = conf->flat_volumes;
c->cpu_info.cpu_type = PA_CPU_X86;
if (pa_cpu_init_arm(&(c->cpu_info.flags.arm)))
c->cpu_info.cpu_type = PA_CPU_ARM;
- pa_cpu_init_orc(c->cpu_info);
+ pa_cpu_init_orc(c->cpu_info);
}
pa_assert_se(pa_signal_init(pa_mainloop_get_api(mainloop)) == 0);
buf = pa_strbuf_new();
#ifdef HAVE_DBUS
+ pa_assert_se(dbus_threads_init_default());
+
if (start_server) {
#endif
if (conf->load_default_script_file) {
#ifdef HAVE_DBUS
if (!conf->system_instance) {
- if (!(server_lookup = pa_dbusobj_server_lookup_new(c)))
- goto finish;
- if (!(lookup_service_bus = register_dbus_name(c, DBUS_BUS_SESSION, "org.PulseAudio1")))
- goto finish;
+ if ((server_lookup = pa_dbusobj_server_lookup_new(c))) {
+ if (!(lookup_service_bus = register_dbus_name(c, DBUS_BUS_SESSION, "org.PulseAudio1")))
+ goto finish;
+ }
}
- if (start_server && !(server_bus = register_dbus_name(c, conf->system_instance ? DBUS_BUS_SYSTEM : DBUS_BUS_SESSION, "org.pulseaudio.Server")))
- goto finish;
+ if (start_server)
+ server_bus = register_dbus_name(c, conf->system_instance ? DBUS_BUS_SYSTEM : DBUS_BUS_SESSION, "org.pulseaudio.Server");
#endif
#ifdef HAVE_FORK
#endif
if (c) {
+ /* Ensure all the modules/samples are unloaded when the core is still ref'ed,
+ * as unlink callback hooks in modules may need the core to be ref'ed */
+ pa_module_unload_all(c);
+ pa_scache_free_all(c);
+
pa_core_unref(c);
pa_log_info(_("Daemon terminated."));
}