static pa_strlist *prepend_per_user(pa_strlist *l) { char *ufn; #ifdef ENABLE_LEGACY_RUNTIME_DIR char *legacy_dir; /* The very old per-user instance path (< 0.9.11). This is supported only to ease upgrades */ if ((legacy_dir = get_very_old_legacy_runtime_dir())) { char *p = pa_sprintf_malloc("%s" PA_PATH_SEP PA_NATIVE_DEFAULT_UNIX_SOCKET, legacy_dir); l = pa_strlist_prepend(l, p); pa_xfree(p); pa_xfree(legacy_dir); } /* The old per-user instance path (< 0.9.12). This is supported only to ease upgrades */ if ((legacy_dir = get_old_legacy_runtime_dir())) { char *p = pa_sprintf_malloc("%s" PA_PATH_SEP PA_NATIVE_DEFAULT_UNIX_SOCKET, legacy_dir); l = pa_strlist_prepend(l, p); pa_xfree(p); pa_xfree(legacy_dir); } #endif /* The per-user instance */ if ((ufn = pa_runtime_path(PA_NATIVE_DEFAULT_UNIX_SOCKET))) { l = pa_strlist_prepend(l, ufn); pa_xfree(ufn); } return l; }
static DBusHandlerResult filter_cb(DBusConnection *bus, DBusMessage *message, void *userdata) { pa_context *c = userdata; pa_bool_t is_session; pa_assert(bus); pa_assert(message); pa_assert(c); if (c->state != PA_CONTEXT_CONNECTING) goto finish; if (!c->no_fail) goto finish; /* FIXME: We probably should check if this is actually the NameOwnerChanged we were looking for */ is_session = c->session_bus && bus == pa_dbus_wrap_connection_get(c->session_bus); pa_log_debug("Rock!! PulseAudio might be back on %s bus", is_session ? "session" : "system"); if (is_session) /* The user instance via PF_LOCAL */ c->server_list = prepend_per_user(c->server_list); else /* The system wide instance via PF_LOCAL */ c->server_list = pa_strlist_prepend(c->server_list, PA_SYSTEM_RUNTIME_PATH PA_PATH_SEP PA_NATIVE_DEFAULT_UNIX_SOCKET); if (!c->client) try_next_connection(c); finish: return DBUS_HANDLER_RESULT_NOT_YET_HANDLED; }
static pa_strlist *prepend_per_user(pa_strlist *l) { char *ufn; /* The per-user instance */ if ((ufn = pa_runtime_path(PA_NATIVE_DEFAULT_UNIX_SOCKET))) { l = pa_strlist_prepend(l, ufn); pa_xfree(ufn); } return l; }
int main(PA_GCC_UNUSED int argc, PA_GCC_UNUSED char* argv[]) { char *t, *u; pa_strlist *l = NULL; l = pa_strlist_prepend(l, "e"); l = pa_strlist_prepend(l, "d"); l = pa_strlist_prepend(l, "c"); l = pa_strlist_prepend(l, "b"); l = pa_strlist_prepend(l, "a"); t = pa_strlist_tostring(l); pa_strlist_free(l); fprintf(stderr, "1: %s\n", t); l = pa_strlist_parse(t); pa_xfree(t); t = pa_strlist_tostring(l); fprintf(stderr, "2: %s\n", t); pa_xfree(t); l = pa_strlist_pop(l, &u); fprintf(stderr, "3: %s\n", u); pa_xfree(u); l = pa_strlist_remove(l, "c"); t = pa_strlist_tostring(l); fprintf(stderr, "4: %s\n", t); pa_xfree(t); pa_strlist_free(l); return 0; }
int pa_context_connect( pa_context *c, const char *server, pa_context_flags_t flags, const pa_spawn_api *api) { int r = -1; pa_assert(c); pa_assert(PA_REFCNT_VALUE(c) >= 1); PA_CHECK_VALIDITY(c, !pa_detect_fork(), PA_ERR_FORKED); PA_CHECK_VALIDITY(c, c->state == PA_CONTEXT_UNCONNECTED, PA_ERR_BADSTATE); PA_CHECK_VALIDITY(c, !(flags & ~(PA_CONTEXT_NOAUTOSPAWN|PA_CONTEXT_NOFAIL)), PA_ERR_INVALID); PA_CHECK_VALIDITY(c, !server || *server, PA_ERR_INVALID); if (server) c->conf->autospawn = FALSE; else server = c->conf->default_server; pa_context_ref(c); c->no_fail = !!(flags & PA_CONTEXT_NOFAIL); c->server_specified = !!server; pa_assert(!c->server_list); if (server) { if (!(c->server_list = pa_strlist_parse(server))) { pa_context_fail(c, PA_ERR_INVALIDSERVER); goto finish; } } else { char *d; /* Prepend in reverse order */ /* Follow the X display */ if (c->conf->auto_connect_display) { if ((d = getenv("DISPLAY"))) { d = pa_xstrndup(d, strcspn(d, ":")); if (*d) c->server_list = pa_strlist_prepend(c->server_list, d); pa_xfree(d); } } /* Add TCP/IP on the localhost */ if (c->conf->auto_connect_localhost) { c->server_list = pa_strlist_prepend(c->server_list, "tcp6:[::1]"); c->server_list = pa_strlist_prepend(c->server_list, "tcp4:127.0.0.1"); } /* The system wide instance via PF_LOCAL */ c->server_list = pa_strlist_prepend(c->server_list, PA_SYSTEM_RUNTIME_PATH PA_PATH_SEP PA_NATIVE_DEFAULT_UNIX_SOCKET); /* The user instance via PF_LOCAL */ c->server_list = prepend_per_user(c->server_list); } /* Set up autospawning */ if (!(flags & PA_CONTEXT_NOAUTOSPAWN) && c->conf->autospawn) { #ifdef HAVE_GETUID if (getuid() == 0) pa_log_debug("Not doing autospawn since we are root."); else { c->do_autospawn = TRUE; if (api) c->spawn_api = *api; } #endif } pa_context_set_state(c, PA_CONTEXT_CONNECTING); r = try_next_connection(c); finish: pa_context_unref(c); return r; }