X-Git-Url: https://code.delx.au/pulseaudio/blobdiff_plain/f44ba092651aa75055e109e04b4164ea92ae7fdc..0a583fe0c330d167f52784585afffdd8065a92cd:/src/pulse/client-conf.c diff --git a/src/pulse/client-conf.c b/src/pulse/client-conf.c index 752d0134..ea583a33 100644 --- a/src/pulse/client-conf.c +++ b/src/pulse/client-conf.c @@ -1,11 +1,12 @@ -/* $Id$ */ - /*** This file is part of PulseAudio. + Copyright 2004-2006 Lennart Poettering + Copyright 2006 Pierre Ossman for Cendio AB + PulseAudio is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published - by the Free Software Foundation; either version 2 of the License, + by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. PulseAudio is distributed in the hope that it will be useful, but @@ -24,14 +25,14 @@ #endif #include -#include #include #include -#include -#include #include +#include +#include +#include #include #include #include @@ -39,29 +40,15 @@ #include "client-conf.h" -#ifndef DEFAULT_CONFIG_DIR -# ifndef OS_IS_WIN32 -# define DEFAULT_CONFIG_DIR "/etc/pulseaudio" -# else -# define DEFAULT_CONFIG_DIR "%POLYP_ROOT%" -# endif -#endif - -#ifndef OS_IS_WIN32 -# define PATH_SEP "/" -#else -# define PATH_SEP "\\" -#endif - -#define DEFAULT_CLIENT_CONFIG_FILE DEFAULT_CONFIG_DIR PATH_SEP "client.conf" -#define DEFAULT_CLIENT_CONFIG_FILE_USER ".pulseaudio" PATH_SEP "client.conf" +#define DEFAULT_CLIENT_CONFIG_FILE PA_DEFAULT_CONFIG_DIR PA_PATH_SEP "client.conf" +#define DEFAULT_CLIENT_CONFIG_FILE_USER "client.conf" -#define ENV_CLIENT_CONFIG_FILE "POLYP_CLIENTCONFIG" -#define ENV_DEFAULT_SINK "POLYP_SINK" -#define ENV_DEFAULT_SOURCE "POLYP_SOURCE" -#define ENV_DEFAULT_SERVER "POLYP_SERVER" -#define ENV_DAEMON_BINARY "POLYP_BINARY" -#define ENV_COOKIE_FILE "POLYP_COOKIE" +#define ENV_CLIENT_CONFIG_FILE "PULSE_CLIENTCONFIG" +#define ENV_DEFAULT_SINK "PULSE_SINK" +#define ENV_DEFAULT_SOURCE "PULSE_SOURCE" +#define ENV_DEFAULT_SERVER "PULSE_SERVER" +#define ENV_DAEMON_BINARY "PULSE_BINARY" +#define ENV_COOKIE_FILE "PULSE_COOKIE" static const pa_client_conf default_conf = { .daemon_binary = NULL, @@ -69,83 +56,84 @@ static const pa_client_conf default_conf = { .default_sink = NULL, .default_source = NULL, .default_server = NULL, - .autospawn = 0, + .default_dbus_server = NULL, + .autospawn = true, + .disable_shm = false, .cookie_file = NULL, - .cookie_valid = 0 + .cookie_valid = false, + .shm_size = 0, + .auto_connect_localhost = false, + .auto_connect_display = false }; +static int parse_cookie_file(pa_client_conf* c); + pa_client_conf *pa_client_conf_new(void) { pa_client_conf *c = pa_xmemdup(&default_conf, sizeof(default_conf)); - - c->daemon_binary = pa_xstrdup(POLYPAUDIO_BINARY); - c->extra_arguments = pa_xstrdup("--log-target=syslog --exit-idle-time=5"); - c->cookie_file = pa_xstrdup(PA_NATIVE_COOKIE_FILE); - + + c->daemon_binary = pa_xstrdup(PA_BINARY); + c->extra_arguments = pa_xstrdup("--log-target=syslog"); + c->cookie_file = NULL; + return c; } void pa_client_conf_free(pa_client_conf *c) { - assert(c); + pa_assert(c); pa_xfree(c->daemon_binary); pa_xfree(c->extra_arguments); pa_xfree(c->default_sink); pa_xfree(c->default_source); pa_xfree(c->default_server); + pa_xfree(c->default_dbus_server); pa_xfree(c->cookie_file); pa_xfree(c); } -int pa_client_conf_load(pa_client_conf *c, const char *filename) { + +int pa_client_conf_load(pa_client_conf *c) { FILE *f = NULL; char *fn = NULL; int r = -1; /* Prepare the configuration parse table */ pa_config_item table[] = { - { "daemon-binary", pa_config_parse_string, NULL }, - { "extra-arguments", pa_config_parse_string, NULL }, - { "default-sink", pa_config_parse_string, NULL }, - { "default-source", pa_config_parse_string, NULL }, - { "default-server", pa_config_parse_string, NULL }, - { "autospawn", pa_config_parse_bool, NULL }, - { "cookie-file", pa_config_parse_string, NULL }, - { NULL, NULL, NULL }, + { "daemon-binary", pa_config_parse_string, &c->daemon_binary, NULL }, + { "extra-arguments", pa_config_parse_string, &c->extra_arguments, NULL }, + { "default-sink", pa_config_parse_string, &c->default_sink, NULL }, + { "default-source", pa_config_parse_string, &c->default_source, NULL }, + { "default-server", pa_config_parse_string, &c->default_server, NULL }, + { "default-dbus-server", pa_config_parse_string, &c->default_dbus_server, NULL }, + { "autospawn", pa_config_parse_bool, &c->autospawn, NULL }, + { "cookie-file", pa_config_parse_string, &c->cookie_file, NULL }, + { "disable-shm", pa_config_parse_bool, &c->disable_shm, NULL }, + { "enable-shm", pa_config_parse_not_bool, &c->disable_shm, NULL }, + { "shm-size-bytes", pa_config_parse_size, &c->shm_size, NULL }, + { "auto-connect-localhost", pa_config_parse_bool, &c->auto_connect_localhost, NULL }, + { "auto-connect-display", pa_config_parse_bool, &c->auto_connect_display, NULL }, + { NULL, NULL, NULL, NULL }, }; - table[0].data = &c->daemon_binary; - table[1].data = &c->extra_arguments; - table[2].data = &c->default_sink; - table[3].data = &c->default_source; - table[4].data = &c->default_server; - table[5].data = &c->autospawn; - table[6].data = &c->cookie_file; - - f = filename ? - fopen((fn = pa_xstrdup(filename)), "r") : - pa_open_config_file(DEFAULT_CLIENT_CONFIG_FILE, DEFAULT_CLIENT_CONFIG_FILE_USER, ENV_CLIENT_CONFIG_FILE, &fn, "r"); - - if (!f && errno != EINTR) { - pa_log(__FILE__": WARNING: failed to open configuration file '%s': %s", filename, pa_cstrerror(errno)); - goto finish; - } - - r = f ? pa_config_parse(fn, f, table, NULL) : 0; + if (!(f = pa_open_config_file(DEFAULT_CLIENT_CONFIG_FILE, DEFAULT_CLIENT_CONFIG_FILE_USER, ENV_CLIENT_CONFIG_FILE, &fn))) + if (errno != ENOENT) + goto finish; + + r = f ? pa_config_parse(fn, f, table, NULL, NULL) : 0; if (!r) - r = pa_client_conf_load_cookie(c); - + r = parse_cookie_file(c); finish: pa_xfree(fn); if (f) fclose(f); - + return r; } int pa_client_conf_env(pa_client_conf *c) { char *e; - + if ((e = getenv(ENV_DEFAULT_SINK))) { pa_xfree(c->default_sink); c->default_sink = pa_xstrdup(e); @@ -159,35 +147,83 @@ int pa_client_conf_env(pa_client_conf *c) { if ((e = getenv(ENV_DEFAULT_SERVER))) { pa_xfree(c->default_server); c->default_server = pa_xstrdup(e); + + /* We disable autospawning automatically if a specific server was set */ + c->autospawn = false; } - + if ((e = getenv(ENV_DAEMON_BINARY))) { pa_xfree(c->daemon_binary); c->daemon_binary = pa_xstrdup(e); } if ((e = getenv(ENV_COOKIE_FILE))) { - pa_xfree(c->cookie_file); - c->cookie_file = pa_xstrdup(e); - - return pa_client_conf_load_cookie(c); + return pa_client_conf_load_cookie_from_file(c, e); } - + return 0; } -int pa_client_conf_load_cookie(pa_client_conf* c) { - assert(c); +static int parse_cookie_file(pa_client_conf* c) { + int k; - c->cookie_valid = 0; + pa_assert(c); - if (!c->cookie_file) - return -1; + c->cookie_valid = false; - if (pa_authkey_load_auto(c->cookie_file, c->cookie, sizeof(c->cookie)) < 0) - return -1; + if (c->cookie_file) + k = pa_authkey_load_auto(c->cookie_file, true, c->cookie, sizeof(c->cookie)); + else { + k = pa_authkey_load_auto(PA_NATIVE_COOKIE_FILE, false, c->cookie, sizeof(c->cookie)); - c->cookie_valid = 1; + if (k < 0) { + k = pa_authkey_load_auto(PA_NATIVE_COOKIE_FILE_FALLBACK, false, c->cookie, sizeof(c->cookie)); + + if (k < 0) + k = pa_authkey_load_auto(PA_NATIVE_COOKIE_FILE, true, c->cookie, sizeof(c->cookie)); + } + } + + if (k < 0) + return k; + + c->cookie_valid = true; return 0; } +int pa_client_conf_load_cookie_from_hex(pa_client_conf* c, const char *cookie_in_hex) { + uint8_t cookie[PA_NATIVE_COOKIE_LENGTH]; + + pa_assert(c); + pa_assert(cookie_in_hex); + + if (pa_parsehex(cookie_in_hex, cookie, sizeof(cookie)) != sizeof(cookie)) { + pa_log(_("Failed to parse cookie data")); + return -PA_ERR_INVALID; + } + + pa_xfree(c->cookie_file); + c->cookie_file = NULL; + + return pa_client_conf_set_cookie(c, cookie, PA_NATIVE_COOKIE_LENGTH); +} + +int pa_client_conf_load_cookie_from_file(pa_client_conf *c, const char *cookie_file_path) { + pa_assert(c); + pa_assert(cookie_file_path); + + pa_xfree(c->cookie_file); + c->cookie_file = pa_xstrdup(cookie_file_path); + return parse_cookie_file(c); +} + +int pa_client_conf_set_cookie(pa_client_conf *c, uint8_t *cookie, size_t cookie_size) { + pa_assert(c); + pa_assert(cookie); + + if (cookie_size != PA_NATIVE_COOKIE_LENGTH) + return -PA_ERR_INVALID; + memcpy(c->cookie, cookie, cookie_size); + c->cookie_valid = true; + return 0; +}