client: introduce auto-connect-localhost= option in client.conf
[profile/ivi/pulseaudio-panda.git] / src / pulse / client-conf.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 <stdlib.h>
28 #include <unistd.h>
29 #include <errno.h>
30 #include <string.h>
31
32 #include <pulse/xmalloc.h>
33 #include <pulse/i18n.h>
34
35 #include <pulsecore/macro.h>
36 #include <pulsecore/core-error.h>
37 #include <pulsecore/log.h>
38 #include <pulsecore/conf-parser.h>
39 #include <pulsecore/core-util.h>
40 #include <pulsecore/authkey.h>
41
42 #include "client-conf.h"
43
44 #define DEFAULT_CLIENT_CONFIG_FILE PA_DEFAULT_CONFIG_DIR PA_PATH_SEP "client.conf"
45 #define DEFAULT_CLIENT_CONFIG_FILE_USER "client.conf"
46
47 #define ENV_CLIENT_CONFIG_FILE "PULSE_CLIENTCONFIG"
48 #define ENV_DEFAULT_SINK "PULSE_SINK"
49 #define ENV_DEFAULT_SOURCE "PULSE_SOURCE"
50 #define ENV_DEFAULT_SERVER "PULSE_SERVER"
51 #define ENV_DAEMON_BINARY "PULSE_BINARY"
52 #define ENV_COOKIE_FILE "PULSE_COOKIE"
53
54 static const pa_client_conf default_conf = {
55     .daemon_binary = NULL,
56     .extra_arguments = NULL,
57     .default_sink = NULL,
58     .default_source = NULL,
59     .default_server = NULL,
60     .default_dbus_server = NULL,
61     .autospawn = TRUE,
62     .disable_shm = FALSE,
63     .cookie_file = NULL,
64     .cookie_valid = FALSE,
65     .shm_size = 0,
66     .auto_connect_localhost = FALSE
67 };
68
69 pa_client_conf *pa_client_conf_new(void) {
70     pa_client_conf *c = pa_xmemdup(&default_conf, sizeof(default_conf));
71
72     c->daemon_binary = pa_xstrdup(PA_BINARY);
73     c->extra_arguments = pa_xstrdup("--log-target=syslog");
74     c->cookie_file = pa_xstrdup(PA_NATIVE_COOKIE_FILE);
75
76     return c;
77 }
78
79 void pa_client_conf_free(pa_client_conf *c) {
80     pa_assert(c);
81     pa_xfree(c->daemon_binary);
82     pa_xfree(c->extra_arguments);
83     pa_xfree(c->default_sink);
84     pa_xfree(c->default_source);
85     pa_xfree(c->default_server);
86     pa_xfree(c->default_dbus_server);
87     pa_xfree(c->cookie_file);
88     pa_xfree(c);
89 }
90
91 int pa_client_conf_load(pa_client_conf *c, const char *filename) {
92     FILE *f = NULL;
93     char *fn = NULL;
94     int r = -1;
95
96     /* Prepare the configuration parse table */
97     pa_config_item table[] = {
98         { "daemon-binary",          pa_config_parse_string,   &c->daemon_binary, NULL },
99         { "extra-arguments",        pa_config_parse_string,   &c->extra_arguments, NULL },
100         { "default-sink",           pa_config_parse_string,   &c->default_sink, NULL },
101         { "default-source",         pa_config_parse_string,   &c->default_source, NULL },
102         { "default-server",         pa_config_parse_string,   &c->default_server, NULL },
103         { "default-dbus-server",    pa_config_parse_string,   &c->default_dbus_server, NULL },
104         { "autospawn",              pa_config_parse_bool,     &c->autospawn, NULL },
105         { "cookie-file",            pa_config_parse_string,   &c->cookie_file, NULL },
106         { "disable-shm",            pa_config_parse_bool,     &c->disable_shm, NULL },
107         { "enable-shm",             pa_config_parse_not_bool, &c->disable_shm, NULL },
108         { "shm-size-bytes",         pa_config_parse_size,     &c->shm_size, NULL },
109         { "auto-connect-localhost", pa_config_parse_bool,     &c->auto_connect_localhost, NULL },
110         { NULL,                     NULL,                     NULL, NULL },
111     };
112
113     if (filename) {
114
115         if (!(f = pa_fopen_cloexec(filename, "r"))) {
116             pa_log(_("Failed to open configuration file '%s': %s"), fn, pa_cstrerror(errno));
117             goto finish;
118         }
119
120         fn = pa_xstrdup(fn);
121
122     } else {
123
124         if (!(f = pa_open_config_file(DEFAULT_CLIENT_CONFIG_FILE, DEFAULT_CLIENT_CONFIG_FILE_USER, ENV_CLIENT_CONFIG_FILE, &fn)))
125             if (errno != ENOENT)
126                 goto finish;
127     }
128
129     r = f ? pa_config_parse(fn, f, table, NULL) : 0;
130
131     if (!r)
132         r = pa_client_conf_load_cookie(c);
133
134 finish:
135     pa_xfree(fn);
136
137     if (f)
138         fclose(f);
139
140     return r;
141 }
142
143 int pa_client_conf_env(pa_client_conf *c) {
144     char *e;
145
146     if ((e = getenv(ENV_DEFAULT_SINK))) {
147         pa_xfree(c->default_sink);
148         c->default_sink = pa_xstrdup(e);
149     }
150
151     if ((e = getenv(ENV_DEFAULT_SOURCE))) {
152         pa_xfree(c->default_source);
153         c->default_source = pa_xstrdup(e);
154     }
155
156     if ((e = getenv(ENV_DEFAULT_SERVER))) {
157         pa_xfree(c->default_server);
158         c->default_server = pa_xstrdup(e);
159
160         /* We disable autospawning automatically if a specific server was set */
161         c->autospawn = FALSE;
162     }
163
164     if ((e = getenv(ENV_DAEMON_BINARY))) {
165         pa_xfree(c->daemon_binary);
166         c->daemon_binary = pa_xstrdup(e);
167     }
168
169     if ((e = getenv(ENV_COOKIE_FILE))) {
170         pa_xfree(c->cookie_file);
171         c->cookie_file = pa_xstrdup(e);
172
173         return pa_client_conf_load_cookie(c);
174     }
175
176     return 0;
177 }
178
179 int pa_client_conf_load_cookie(pa_client_conf* c) {
180     pa_assert(c);
181
182     if (!c->cookie_file)
183         return -1;
184
185     c->cookie_valid = FALSE;
186
187     if (pa_authkey_load_auto(c->cookie_file, c->cookie, sizeof(c->cookie)) < 0)
188         return -1;
189
190     c->cookie_valid = TRUE;
191     return 0;
192 }