mirror of
https://gitlab.freedesktop.org/pulseaudio/pulseaudio.git
synced 2025-10-29 05:40:23 -04:00
split out x11prop.[ch]
add client support for auth daemon info in X display git-svn-id: file:///home/lennart/svn/public/pulseaudio/trunk@279 fefdeb5f-60dc-0310-8127-8f9354f1896f
This commit is contained in:
parent
3fcd7a433c
commit
dbaa83c607
15 changed files with 337 additions and 119 deletions
|
|
@ -54,6 +54,7 @@ HAVE_X11=0
|
|||
test "x$no_x" != "xyes" && HAVE_X11=1
|
||||
AC_SUBST(HAVE_X11)
|
||||
AM_CONDITIONAL(HAVE_X11, test "x$no_x" != "xyes")
|
||||
AC_DEFINE([HAVE_X11], [], [Have X11])
|
||||
|
||||
# Checks for typedefs, structures, and compiler characteristics.
|
||||
AC_C_CONST
|
||||
|
|
|
|||
1
doc/todo
1
doc/todo
|
|
@ -20,6 +20,7 @@
|
|||
- add LGPL blurb to all concerning files
|
||||
- non-fp mixing
|
||||
- non-fp resampling
|
||||
- esound backend
|
||||
|
||||
** later ***
|
||||
- xmlrpc/http
|
||||
|
|
|
|||
|
|
@ -27,8 +27,8 @@ AM_CFLAGS+=-DDLSEARCHPATH=\"$(modlibdir)\"
|
|||
AM_CFLAGS+=-DDEFAULT_CONFIG_DIR=\"$(polypconfdir)\"
|
||||
AM_CFLAGS+=-DPOLYPAUDIO_BINARY=\"$(bindir)/polypaudio\"
|
||||
|
||||
AM_LDADD=$(PTHREAD_LIBS) -lm
|
||||
AM_LIBADD=$(PTHREAD_LIBS) -lm
|
||||
AM_LDADD=$(PTHREAD_LIBS) -lm
|
||||
|
||||
EXTRA_DIST = default.pa.in daemon.conf.in client.conf.in depmod.py esdcompat.sh.in module-defs.h.m4
|
||||
bin_PROGRAMS = polypaudio pacat pactl paplay
|
||||
|
|
@ -462,6 +462,7 @@ cpulimit_test2_LDADD = $(AM_LDADD) libpolyp-mainloop-@PA_MAJORMINOR@.la
|
|||
if HAVE_X11
|
||||
modlib_LTLIBRARIES+= \
|
||||
libx11wrap.la \
|
||||
libx11prop.la \
|
||||
module-x11-bell.la \
|
||||
module-x11-publish.la
|
||||
SYMDEF_FILES += \
|
||||
|
|
@ -471,24 +472,33 @@ SYMDEF_FILES += \
|
|||
libx11wrap_la_SOURCES = x11wrap.c x11wrap.h
|
||||
libx11wrap_la_LDFLAGS = -avoid-version
|
||||
libx11wrap_la_CFLAGS = $(AM_CFLAGS) $(X_CFLAGS)
|
||||
libx11wrap_la_LIBADD = $(AM_LIBADD) $(X_PRE_LIBS) -lX11 $(X_LIBS) $(X_EXTRA_LIB)
|
||||
libx11wrap_la_LIBADD = $(AM_LIBADD) $(X_PRE_LIBS) -lX11 $(X_LIBS) $(X_EXTRA_LIBS)
|
||||
|
||||
libx11prop_la_SOURCES = x11prop.c x11prop.h
|
||||
libx11prop_la_LDFLAGS = -avoid-version
|
||||
libx11prop_la_CFLAGS = $(AM_CFLAGS) $(X_CFLAGS)
|
||||
libx11prop_la_LIBADD = $(AM_LIBADD) $(X_PRE_LIBS) -lX11 $(X_LIBS) $(X_EXTRA_LIBS)
|
||||
|
||||
module_x11_bell_la_SOURCES = module-x11-bell.c
|
||||
module_x11_bell_la_CFLAGS = $(AM_CFLAGS) $(X_CFLAGS)
|
||||
module_x11_bell_la_LDFLAGS = -module -avoid-version
|
||||
module_x11_bell_la_LIBADD = $(AM_LIBADD) $(X_PRE_LIBS) -lX11 $(X_LIBS) $(X_EXTRA_LIB) libx11wrap.la
|
||||
module_x11_bell_la_LIBADD = $(AM_LIBADD) $(X_PRE_LIBS) -lX11 $(X_LIBS) $(X_EXTRA_LIBS) libx11wrap.la
|
||||
|
||||
module_x11_publish_la_SOURCES = module-x11-publish.c
|
||||
module_x11_publish_la_CFLAGS = $(AM_CFLAGS) $(X_CFLAGS)
|
||||
module_x11_publish_la_LDFLAGS = -module -avoid-version
|
||||
module_x11_publish_la_LIBADD = $(AM_LIBADD) $(X_PRE_LIBS) -lX11 $(X_LIBS) $(X_EXTRA_LIB) libx11wrap.la libauthkey.la libauthkey-prop.la
|
||||
module_x11_publish_la_LIBADD = $(AM_LIBADD) $(X_PRE_LIBS) -lX11 $(X_LIBS) $(X_EXTRA_LIBS) libx11wrap.la libauthkey.la libauthkey-prop.la libx11prop.la
|
||||
|
||||
bin_PROGRAMS+= \
|
||||
pax11publish
|
||||
|
||||
pax11publish_SOURCES = pax11publish.c util.c xmalloc.c log.c authkey.c client-conf.c conf-parser.c
|
||||
pax11publish_SOURCES = pax11publish.c util.c xmalloc.c log.c authkey.c client-conf.c conf-parser.c x11prop.c
|
||||
pax11publish_CFLAGS = $(AM_CFLAGS) $(X_CFLAGS)
|
||||
pax11publish_LDADD = $(AM_LDADD) $(X_PRE_LIBS) -lX11 $(X_LIBS) $(X_EXTRA_LIB)
|
||||
pax11publish_LDADD = $(AM_LDADD) $(X_PRE_LIBS) -lX11 $(X_LIBS) $(X_EXTRA_LIBS)
|
||||
|
||||
libpolyp_@PA_MAJORMINOR@_la_CFLAGS += $(X_CFLAGS)
|
||||
libpolyp_@PA_MAJORMINOR@_la_LDFLAGS += $(X_PRE_LIBS) -lX11 $(X_LIBS) $(X_EXTRA_LIBS)
|
||||
libpolyp_@PA_MAJORMINOR@_la_SOURCES += x11prop.c client-conf-x11.c
|
||||
|
||||
endif
|
||||
|
||||
|
|
|
|||
89
polyp/client-conf-x11.c
Normal file
89
polyp/client-conf-x11.c
Normal file
|
|
@ -0,0 +1,89 @@
|
|||
/* $Id$ */
|
||||
|
||||
/***
|
||||
This file is part of polypaudio.
|
||||
|
||||
polypaudio is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published
|
||||
by the Free Software Foundation; either version 2 of the License,
|
||||
or (at your option) any later version.
|
||||
|
||||
polypaudio is distributed in the hope that it will be useful, but
|
||||
WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with polypaudio; if not, write to the Free Software
|
||||
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
|
||||
USA.
|
||||
***/
|
||||
|
||||
#ifdef HAVE_CONFIG_H
|
||||
#include <config.h>
|
||||
#endif
|
||||
|
||||
#include <string.h>
|
||||
#include <assert.h>
|
||||
|
||||
#include <X11/Xlib.h>
|
||||
#include <X11/Xatom.h>
|
||||
|
||||
#include "client-conf-x11.h"
|
||||
#include "x11prop.h"
|
||||
#include "log.h"
|
||||
#include "xmalloc.h"
|
||||
#include "util.h"
|
||||
|
||||
int pa_client_conf_from_x11(struct pa_client_conf *c, const char *dname) {
|
||||
Display *d = NULL;
|
||||
int ret = -1;
|
||||
char t[1024];
|
||||
|
||||
if (!(d = XOpenDisplay(dname))) {
|
||||
pa_log(__FILE__": XOpenDisplay() failed\n");
|
||||
goto finish;
|
||||
}
|
||||
|
||||
if (!pa_x11_get_prop(d, "POLYP_SERVER", t, sizeof(t)))
|
||||
goto finish;
|
||||
|
||||
pa_xfree(c->default_server);
|
||||
c->default_server = pa_xstrdup(t);
|
||||
|
||||
if (pa_x11_get_prop(d, "POLYP_SINK", t, sizeof(t))) {
|
||||
pa_xfree(c->default_sink);
|
||||
c->default_sink = pa_xstrdup(t);
|
||||
}
|
||||
|
||||
if (pa_x11_get_prop(d, "POLYP_SOURCE", t, sizeof(t))) {
|
||||
pa_xfree(c->default_source);
|
||||
c->default_source = pa_xstrdup(t);
|
||||
}
|
||||
|
||||
if (pa_x11_get_prop(d, "POLYP_COOKIE", t, sizeof(t))) {
|
||||
uint8_t cookie[PA_NATIVE_COOKIE_LENGTH];
|
||||
|
||||
if (pa_parsehex(t, cookie, sizeof(cookie)) != sizeof(cookie)) {
|
||||
pa_log(__FILE__": failed to parse cookie data\n");
|
||||
goto finish;
|
||||
}
|
||||
|
||||
assert(sizeof(cookie) == sizeof(c->cookie));
|
||||
memcpy(c->cookie, cookie, sizeof(cookie));
|
||||
|
||||
c->cookie_valid = 1;
|
||||
|
||||
pa_xfree(c->cookie_file);
|
||||
c->cookie_file = NULL;
|
||||
}
|
||||
|
||||
ret = 0;
|
||||
|
||||
finish:
|
||||
if (d)
|
||||
XCloseDisplay(d);
|
||||
|
||||
return ret;
|
||||
|
||||
}
|
||||
29
polyp/client-conf-x11.h
Normal file
29
polyp/client-conf-x11.h
Normal file
|
|
@ -0,0 +1,29 @@
|
|||
#ifndef fooclientconfx11hfoo
|
||||
#define fooclientconfx11hfoo
|
||||
|
||||
/* $Id$ */
|
||||
|
||||
/***
|
||||
This file is part of polypaudio.
|
||||
|
||||
polypaudio is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published
|
||||
by the Free Software Foundation; either version 2 of the License,
|
||||
or (at your option) any later version.
|
||||
|
||||
polypaudio is distributed in the hope that it will be useful, but
|
||||
WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with polypaudio; if not, write to the Free Software
|
||||
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
|
||||
USA.
|
||||
***/
|
||||
|
||||
#include "client-conf.h"
|
||||
|
||||
int pa_client_conf_from_x11(struct pa_client_conf *c, const char *display);
|
||||
|
||||
#endif
|
||||
|
|
@ -30,6 +30,7 @@
|
|||
#include "log.h"
|
||||
#include "conf-parser.h"
|
||||
#include "util.h"
|
||||
#include "authkey.h"
|
||||
|
||||
#ifndef DEFAULT_CONFIG_DIR
|
||||
#define DEFAULT_CONFIG_DIR "/etc/polypaudio"
|
||||
|
|
@ -43,6 +44,7 @@
|
|||
#define ENV_DEFAULT_SOURCE "POLYP_SOURCE"
|
||||
#define ENV_DEFAULT_SERVER "POLYP_SERVER"
|
||||
#define ENV_DAEMON_BINARY "POLYP_BINARY"
|
||||
#define ENV_COOKIE_FILE "POLYP_COOKIE"
|
||||
|
||||
static const struct pa_client_conf default_conf = {
|
||||
.daemon_binary = NULL,
|
||||
|
|
@ -50,14 +52,20 @@ static const struct pa_client_conf default_conf = {
|
|||
.default_sink = NULL,
|
||||
.default_source = NULL,
|
||||
.default_server = NULL,
|
||||
.autospawn = 0
|
||||
.autospawn = 0,
|
||||
.cookie_file = NULL,
|
||||
.cookie_valid = 0
|
||||
};
|
||||
|
||||
struct pa_client_conf *pa_client_conf_new(void) {
|
||||
struct 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);
|
||||
|
||||
return c;
|
||||
}
|
||||
|
|
@ -69,6 +77,7 @@ void pa_client_conf_free(struct pa_client_conf *c) {
|
|||
pa_xfree(c->default_sink);
|
||||
pa_xfree(c->default_source);
|
||||
pa_xfree(c->default_server);
|
||||
pa_xfree(c->cookie_file);
|
||||
pa_xfree(c);
|
||||
}
|
||||
int pa_client_conf_load(struct pa_client_conf *c, const char *filename) {
|
||||
|
|
@ -83,6 +92,7 @@ int pa_client_conf_load(struct pa_client_conf *c, const char *filename) {
|
|||
{ "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 },
|
||||
};
|
||||
|
||||
|
|
@ -92,6 +102,7 @@ int pa_client_conf_load(struct pa_client_conf *c, const char *filename) {
|
|||
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") :
|
||||
|
|
@ -104,6 +115,10 @@ int pa_client_conf_load(struct pa_client_conf *c, const char *filename) {
|
|||
|
||||
r = f ? pa_config_parse(fn, f, table, NULL) : 0;
|
||||
|
||||
if (!r)
|
||||
r = pa_client_conf_load_cookie(c);
|
||||
|
||||
|
||||
finish:
|
||||
pa_xfree(fn);
|
||||
|
||||
|
|
@ -136,5 +151,28 @@ int pa_client_conf_env(struct pa_client_conf *c) {
|
|||
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 0;
|
||||
}
|
||||
|
||||
int pa_client_conf_load_cookie(struct pa_client_conf* c) {
|
||||
assert(c);
|
||||
|
||||
c->cookie_valid = 0;
|
||||
|
||||
if (!c->cookie_file)
|
||||
return -1;
|
||||
|
||||
if (pa_authkey_load_auto(c->cookie_file, c->cookie, sizeof(c->cookie)) < 0)
|
||||
return -1;
|
||||
|
||||
c->cookie_valid = 1;
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -22,9 +22,13 @@
|
|||
USA.
|
||||
***/
|
||||
|
||||
#include "native-common.h"
|
||||
|
||||
struct pa_client_conf {
|
||||
char *daemon_binary, *extra_arguments, *default_sink, *default_source, *default_server;
|
||||
char *daemon_binary, *extra_arguments, *default_sink, *default_source, *default_server, *cookie_file;
|
||||
int autospawn;
|
||||
uint8_t cookie[PA_NATIVE_COOKIE_LENGTH];
|
||||
int cookie_valid;
|
||||
};
|
||||
|
||||
struct pa_client_conf *pa_client_conf_new(void);
|
||||
|
|
@ -33,4 +37,6 @@ void pa_client_conf_free(struct pa_client_conf *c);
|
|||
int pa_client_conf_load(struct pa_client_conf *c, const char *filename);
|
||||
int pa_client_conf_env(struct pa_client_conf *c);
|
||||
|
||||
int pa_client_conf_load_cookie(struct pa_client_conf* c);
|
||||
|
||||
#endif
|
||||
|
|
|
|||
|
|
@ -83,7 +83,7 @@
|
|||
#define protocol_free pa_protocol_native_free
|
||||
#define TCPWRAP_SERVICE "polypaudio-native"
|
||||
#define IPV4_PORT PA_NATIVE_DEFAULT_PORT
|
||||
#define UNIX_SOCKET "/tmp/polypaudio/native"
|
||||
#define UNIX_SOCKET PA_NATIVE_DEFAULT_SERVER_UNIX
|
||||
#define MODULE_ARGUMENTS "public", "cookie",
|
||||
#ifdef USE_TCP_SOCKETS
|
||||
#include "module-native-protocol-tcp-symdef.h"
|
||||
|
|
|
|||
|
|
@ -45,6 +45,7 @@
|
|||
#include "module-x11-publish-symdef.h"
|
||||
#include "authkey-prop.h"
|
||||
#include "authkey.h"
|
||||
#include "x11prop.h"
|
||||
|
||||
PA_MODULE_AUTHOR("Lennart Poettering")
|
||||
PA_MODULE_DESCRIPTION("X11 Credential Publisher")
|
||||
|
|
@ -68,34 +69,6 @@ struct userdata {
|
|||
int auth_cookie_in_property;
|
||||
};
|
||||
|
||||
static void set_x11_prop(Display *d, const char *name, const char *data) {
|
||||
Atom a = XInternAtom(d, name, False);
|
||||
XChangeProperty(d, RootWindow(d, 0), a, XA_STRING, 8, PropModeReplace, (unsigned char*) data, strlen(data)+1);
|
||||
}
|
||||
|
||||
static void del_x11_prop(Display *d, const char *name) {
|
||||
Atom a = XInternAtom(d, name, False);
|
||||
XDeleteProperty(d, RootWindow(d, 0), a);
|
||||
}
|
||||
|
||||
static char* get_x11_prop(Display *d, const char *name, char *p, size_t l) {
|
||||
Atom actual_type;
|
||||
int actual_format;
|
||||
unsigned long nitems;
|
||||
unsigned long nbytes_after;
|
||||
unsigned char *prop;
|
||||
|
||||
Atom a = XInternAtom(d, name, False);
|
||||
if (XGetWindowProperty(d, RootWindow(d, 0), a, 0, (l+2)/4, False, XA_STRING, &actual_type, &actual_format, &nitems, &nbytes_after, &prop) != Success)
|
||||
return NULL;
|
||||
|
||||
memcpy(p, prop, nitems);
|
||||
p[nitems] = 0;
|
||||
|
||||
XFree(prop);
|
||||
return p;
|
||||
}
|
||||
|
||||
static int load_key(struct userdata *u, const char*fn) {
|
||||
assert(u);
|
||||
|
||||
|
|
@ -155,16 +128,16 @@ int pa__init(struct pa_core *c, struct pa_module*m) {
|
|||
|
||||
u->id = pa_sprintf_malloc("%s@%s/%u", un, hn, (unsigned) getpid());
|
||||
|
||||
set_x11_prop(u->display, "POLYP_SERVER", hn);
|
||||
set_x11_prop(u->display, "POLYP_ID", u->id);
|
||||
pa_x11_set_prop(u->display, "POLYP_SERVER", hn);
|
||||
pa_x11_set_prop(u->display, "POLYP_ID", u->id);
|
||||
|
||||
if ((t = pa_modargs_get_value(ma, "source", NULL)))
|
||||
set_x11_prop(u->display, "POLYP_SOURCE", t);
|
||||
pa_x11_set_prop(u->display, "POLYP_SOURCE", t);
|
||||
|
||||
if ((t = pa_modargs_get_value(ma, "sink", NULL)))
|
||||
set_x11_prop(u->display, "POLYP_SINK", t);
|
||||
pa_x11_set_prop(u->display, "POLYP_SINK", t);
|
||||
|
||||
set_x11_prop(u->display, "POLYP_COOKIE", pa_hexstr(u->auth_cookie, sizeof(u->auth_cookie), hx, sizeof(hx)));
|
||||
pa_x11_set_prop(u->display, "POLYP_COOKIE", pa_hexstr(u->auth_cookie, sizeof(u->auth_cookie), hx, sizeof(hx)));
|
||||
|
||||
pa_modargs_free(ma);
|
||||
return 0;
|
||||
|
|
@ -188,14 +161,14 @@ void pa__done(struct pa_core *c, struct pa_module*m) {
|
|||
char t[256];
|
||||
|
||||
/* Yes, here is a race condition */
|
||||
if (!get_x11_prop(u->display, "POLYP_ID", t, sizeof(t)) || strcmp(t, u->id))
|
||||
if (!pa_x11_get_prop(u->display, "POLYP_ID", t, sizeof(t)) || strcmp(t, u->id))
|
||||
pa_log("WARNING: Polypaudio information vanished from X11!\n");
|
||||
else {
|
||||
del_x11_prop(u->display, "POLYP_ID");
|
||||
del_x11_prop(u->display, "POLYP_SERVER");
|
||||
del_x11_prop(u->display, "POLYP_SINK");
|
||||
del_x11_prop(u->display, "POLYP_SOURCE");
|
||||
del_x11_prop(u->display, "POLYP_COOKIE");
|
||||
pa_x11_del_prop(u->display, "POLYP_ID");
|
||||
pa_x11_del_prop(u->display, "POLYP_SERVER");
|
||||
pa_x11_del_prop(u->display, "POLYP_SINK");
|
||||
pa_x11_del_prop(u->display, "POLYP_SOURCE");
|
||||
pa_x11_del_prop(u->display, "POLYP_COOKIE");
|
||||
XSync(u->display, False);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -100,6 +100,9 @@ enum {
|
|||
|
||||
#define PA_NATIVE_COOKIE_PROPERTY_NAME "protocol-native-cookie"
|
||||
|
||||
#define PA_NATIVE_DEFAULT_SERVER_UNIX "/tmp/polypaudio/native"
|
||||
|
||||
|
||||
PA_C_DECL_END
|
||||
|
||||
#endif
|
||||
|
|
|
|||
|
|
@ -36,44 +36,7 @@
|
|||
#include "authkey.h"
|
||||
#include "native-common.h"
|
||||
#include "client-conf.h"
|
||||
|
||||
static void set_x11_prop(Display *d, const char *name, const char *data) {
|
||||
Atom a = XInternAtom(d, name, False);
|
||||
XChangeProperty(d, RootWindow(d, 0), a, XA_STRING, 8, PropModeReplace, (unsigned char*) data, strlen(data)+1);
|
||||
}
|
||||
|
||||
static void del_x11_prop(Display *d, const char *name) {
|
||||
Atom a = XInternAtom(d, name, False);
|
||||
XDeleteProperty(d, RootWindow(d, 0), a);
|
||||
}
|
||||
|
||||
static char* get_x11_prop(Display *d, const char *name, char *p, size_t l) {
|
||||
Atom actual_type;
|
||||
int actual_format;
|
||||
unsigned long nitems;
|
||||
unsigned long nbytes_after;
|
||||
unsigned char *prop = NULL;
|
||||
char *ret = NULL;
|
||||
|
||||
Atom a = XInternAtom(d, name, False);
|
||||
if (XGetWindowProperty(d, RootWindow(d, 0), a, 0, (l+2)/4, False, XA_STRING, &actual_type, &actual_format, &nitems, &nbytes_after, &prop) != Success)
|
||||
goto finish;
|
||||
|
||||
if (actual_type != XA_STRING)
|
||||
goto finish;
|
||||
|
||||
memcpy(p, prop, nitems);
|
||||
p[nitems] = 0;
|
||||
|
||||
ret = p;
|
||||
|
||||
finish:
|
||||
|
||||
if (prop)
|
||||
XFree(prop);
|
||||
|
||||
return ret;
|
||||
}
|
||||
#include "x11prop.h"
|
||||
|
||||
int main(int argc, char *argv[]) {
|
||||
const char *dname = NULL, *sink = NULL, *source = NULL, *server = NULL, *cookie_file = PA_NATIVE_COOKIE_FILE;
|
||||
|
|
@ -133,15 +96,15 @@ int main(int argc, char *argv[]) {
|
|||
switch (mode) {
|
||||
case DUMP: {
|
||||
char t[1024];
|
||||
if (!get_x11_prop(d, "POLYP_SERVER", t, sizeof(t)))
|
||||
if (!pa_x11_get_prop(d, "POLYP_SERVER", t, sizeof(t)))
|
||||
goto finish;
|
||||
|
||||
printf("Server: %s\n", t);
|
||||
if (get_x11_prop(d, "POLYP_SOURCE", t, sizeof(t)))
|
||||
if (pa_x11_get_prop(d, "POLYP_SOURCE", t, sizeof(t)))
|
||||
printf("Source: %s\n", t);
|
||||
if (get_x11_prop(d, "POLYP_SINK", t, sizeof(t)))
|
||||
if (pa_x11_get_prop(d, "POLYP_SINK", t, sizeof(t)))
|
||||
printf("Sink: %s\n", t);
|
||||
if (get_x11_prop(d, "POLYP_COOKIE", t, sizeof(t)))
|
||||
if (pa_x11_get_prop(d, "POLYP_COOKIE", t, sizeof(t)))
|
||||
printf("Cookie: %s\n", t);
|
||||
|
||||
break;
|
||||
|
|
@ -149,20 +112,20 @@ int main(int argc, char *argv[]) {
|
|||
|
||||
case IMPORT: {
|
||||
char t[1024];
|
||||
if (!get_x11_prop(d, "POLYP_SERVER", t, sizeof(t)))
|
||||
if (!pa_x11_get_prop(d, "POLYP_SERVER", t, sizeof(t)))
|
||||
goto finish;
|
||||
|
||||
printf("POLYP_SERVER='%s'\nexport POLYP_SERVER\n", t);
|
||||
|
||||
if (get_x11_prop(d, "POLYP_SOURCE", t, sizeof(t)))
|
||||
if (pa_x11_get_prop(d, "POLYP_SOURCE", t, sizeof(t)))
|
||||
printf("POLYP_SOURCE='%s'\nexport POLYP_SOURCE\n", t);
|
||||
if (get_x11_prop(d, "POLYP_SINK", t, sizeof(t)))
|
||||
if (pa_x11_get_prop(d, "POLYP_SINK", t, sizeof(t)))
|
||||
printf("POLYP_SINK='%s'\nexport POLYP_SINK\n", t);
|
||||
|
||||
if (get_x11_prop(d, "POLYP_COOKIE", t, sizeof(t))) {
|
||||
if (pa_x11_get_prop(d, "POLYP_COOKIE", t, sizeof(t))) {
|
||||
uint8_t cookie[PA_NATIVE_COOKIE_LENGTH];
|
||||
size_t l;
|
||||
if ((l = pa_parsehex(t, cookie, sizeof(cookie))) == (size_t) -1) {
|
||||
if ((l = pa_parsehex(t, cookie, sizeof(cookie))) != sizeof(cookie)) {
|
||||
fprintf(stderr, "Failed to parse cookie data\n");
|
||||
goto finish;
|
||||
}
|
||||
|
|
@ -192,12 +155,12 @@ int main(int argc, char *argv[]) {
|
|||
goto finish;
|
||||
}
|
||||
|
||||
del_x11_prop(d, "POLYP_ID");
|
||||
pa_x11_del_prop(d, "POLYP_ID");
|
||||
|
||||
if (server)
|
||||
set_x11_prop(d, "POLYP_SERVER", c->default_server);
|
||||
pa_x11_set_prop(d, "POLYP_SERVER", c->default_server);
|
||||
else if (c->default_server)
|
||||
set_x11_prop(d, "POLYP_SERVER", c->default_server);
|
||||
pa_x11_set_prop(d, "POLYP_SERVER", c->default_server);
|
||||
else {
|
||||
char hn[256];
|
||||
if (!pa_get_fqdn(hn, sizeof(hn))) {
|
||||
|
|
@ -205,18 +168,18 @@ int main(int argc, char *argv[]) {
|
|||
goto finish;
|
||||
}
|
||||
|
||||
set_x11_prop(d, "POLYP_SERVER", hn);
|
||||
pa_x11_set_prop(d, "POLYP_SERVER", hn);
|
||||
}
|
||||
|
||||
if (sink)
|
||||
set_x11_prop(d, "POLYP_SINK", sink);
|
||||
pa_x11_set_prop(d, "POLYP_SINK", sink);
|
||||
else if (c->default_sink)
|
||||
set_x11_prop(d, "POLYP_SINK", c->default_sink);
|
||||
pa_x11_set_prop(d, "POLYP_SINK", c->default_sink);
|
||||
|
||||
if (source)
|
||||
set_x11_prop(d, "POLYP_SOURCE", source);
|
||||
pa_x11_set_prop(d, "POLYP_SOURCE", source);
|
||||
if (c->default_source)
|
||||
set_x11_prop(d, "POLYP_SOURCE", c->default_source);
|
||||
pa_x11_set_prop(d, "POLYP_SOURCE", c->default_source);
|
||||
|
||||
pa_client_conf_free(c);
|
||||
|
||||
|
|
@ -225,16 +188,16 @@ int main(int argc, char *argv[]) {
|
|||
goto finish;
|
||||
}
|
||||
|
||||
set_x11_prop(d, "POLYP_COOKIE", pa_hexstr(cookie, sizeof(cookie), hx, sizeof(hx)));
|
||||
pa_x11_set_prop(d, "POLYP_COOKIE", pa_hexstr(cookie, sizeof(cookie), hx, sizeof(hx)));
|
||||
break;
|
||||
}
|
||||
|
||||
case REMOVE:
|
||||
del_x11_prop(d, "POLYP_SERVER");
|
||||
del_x11_prop(d, "POLYP_SINK");
|
||||
del_x11_prop(d, "POLYP_SOURCE");
|
||||
del_x11_prop(d, "POLYP_ID");
|
||||
del_x11_prop(d, "POLYP_COOKIE");
|
||||
pa_x11_del_prop(d, "POLYP_SERVER");
|
||||
pa_x11_del_prop(d, "POLYP_SINK");
|
||||
pa_x11_del_prop(d, "POLYP_SOURCE");
|
||||
pa_x11_del_prop(d, "POLYP_ID");
|
||||
pa_x11_del_prop(d, "POLYP_COOKIE");
|
||||
break;
|
||||
|
||||
default:
|
||||
|
|
|
|||
|
|
@ -44,14 +44,16 @@
|
|||
#include "dynarray.h"
|
||||
#include "socket-client.h"
|
||||
#include "pstream-util.h"
|
||||
#include "authkey.h"
|
||||
#include "util.h"
|
||||
#include "xmalloc.h"
|
||||
#include "log.h"
|
||||
#include "client-conf.h"
|
||||
#include "socket-util.h"
|
||||
|
||||
#define DEFAULT_SERVER "/tmp/polypaudio/native"
|
||||
#ifdef HAVE_X11
|
||||
#include "client-conf-x11.h"
|
||||
#endif
|
||||
|
||||
#define AUTOSPAWN_LOCK "/tmp/polypaudio/autospawn.lock"
|
||||
|
||||
static const struct pa_pdispatch_command command_table[PA_COMMAND_MAX] = {
|
||||
|
|
@ -96,6 +98,9 @@ struct pa_context *pa_context_new(struct pa_mainloop_api *mainloop, const char *
|
|||
|
||||
c->conf = pa_client_conf_new();
|
||||
pa_client_conf_load(c->conf, NULL);
|
||||
#ifdef HAVE_X11
|
||||
pa_client_conf_from_x11(c->conf, NULL);
|
||||
#endif
|
||||
pa_client_conf_env(c->conf);
|
||||
|
||||
return c;
|
||||
|
|
@ -312,7 +317,7 @@ static void setup_context(struct pa_context *c, struct pa_iochannel *io) {
|
|||
c->pdispatch = pa_pdispatch_new(c->mainloop, command_table, PA_COMMAND_MAX);
|
||||
assert(c->pdispatch);
|
||||
|
||||
if (pa_authkey_load_from_home(PA_NATIVE_COOKIE_FILE, c->auth_cookie, sizeof(c->auth_cookie)) < 0) {
|
||||
if (!c->conf->cookie_valid) {
|
||||
pa_context_fail(c, PA_ERROR_AUTHKEY);
|
||||
goto finish;
|
||||
}
|
||||
|
|
@ -321,7 +326,7 @@ static void setup_context(struct pa_context *c, struct pa_iochannel *io) {
|
|||
assert(t);
|
||||
pa_tagstruct_putu32(t, PA_COMMAND_AUTH);
|
||||
pa_tagstruct_putu32(t, tag = c->ctag++);
|
||||
pa_tagstruct_put_arbitrary(t, c->auth_cookie, sizeof(c->auth_cookie));
|
||||
pa_tagstruct_put_arbitrary(t, c->conf->cookie, sizeof(c->conf->cookie));
|
||||
pa_pstream_send_tagstruct(c->pstream, t);
|
||||
pa_pdispatch_register_reply(c->pdispatch, tag, DEFAULT_TIMEOUT, setup_complete_callback, c);
|
||||
|
||||
|
|
@ -355,10 +360,10 @@ finish:
|
|||
static int default_server_is_running(void) {
|
||||
struct stat st;
|
||||
|
||||
if (DEFAULT_SERVER[0] != '/')
|
||||
if (PA_NATIVE_DEFAULT_SERVER_UNIX[0] != '/')
|
||||
return 1;
|
||||
|
||||
if (stat(DEFAULT_SERVER, &st) < 0)
|
||||
if (stat(PA_NATIVE_DEFAULT_SERVER_UNIX, &st) < 0)
|
||||
return 0;
|
||||
|
||||
return 1;
|
||||
|
|
@ -488,7 +493,7 @@ int pa_context_connect(struct pa_context *c, const char *server, int spawn, cons
|
|||
}
|
||||
|
||||
if (!server)
|
||||
server = DEFAULT_SERVER;
|
||||
server = PA_NATIVE_DEFAULT_SERVER_UNIX;
|
||||
|
||||
pa_context_ref(c);
|
||||
|
||||
|
|
|
|||
|
|
@ -61,8 +61,6 @@ struct pa_context {
|
|||
uint32_t error;
|
||||
enum pa_context_state state;
|
||||
|
||||
uint8_t auth_cookie[PA_NATIVE_COOKIE_LENGTH];
|
||||
|
||||
void (*state_callback)(struct pa_context*c, void *userdata);
|
||||
void *state_userdata;
|
||||
|
||||
|
|
@ -109,7 +107,6 @@ struct pa_stream {
|
|||
|
||||
void (*write_callback)(struct pa_stream *p, size_t length, void *userdata);
|
||||
void *write_userdata;
|
||||
|
||||
};
|
||||
|
||||
struct pa_operation {
|
||||
|
|
|
|||
70
polyp/x11prop.c
Normal file
70
polyp/x11prop.c
Normal file
|
|
@ -0,0 +1,70 @@
|
|||
/* $Id$ */
|
||||
|
||||
/***
|
||||
This file is part of polypaudio.
|
||||
|
||||
polypaudio is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published
|
||||
by the Free Software Foundation; either version 2 of the License,
|
||||
or (at your option) any later version.
|
||||
|
||||
polypaudio is distributed in the hope that it will be useful, but
|
||||
WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with polypaudio; if not, write to the Free Software
|
||||
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
|
||||
USA.
|
||||
***/
|
||||
|
||||
#ifdef HAVE_CONFIG_H
|
||||
#include <config.h>
|
||||
#endif
|
||||
|
||||
#include <string.h>
|
||||
|
||||
#include <X11/Xlib.h>
|
||||
#include <X11/Xatom.h>
|
||||
|
||||
#include "x11prop.h"
|
||||
|
||||
|
||||
void pa_x11_set_prop(Display *d, const char *name, const char *data) {
|
||||
Atom a = XInternAtom(d, name, False);
|
||||
XChangeProperty(d, RootWindow(d, 0), a, XA_STRING, 8, PropModeReplace, (unsigned char*) data, strlen(data)+1);
|
||||
}
|
||||
|
||||
void pa_x11_del_prop(Display *d, const char *name) {
|
||||
Atom a = XInternAtom(d, name, False);
|
||||
XDeleteProperty(d, RootWindow(d, 0), a);
|
||||
}
|
||||
|
||||
char* pa_x11_get_prop(Display *d, const char *name, char *p, size_t l) {
|
||||
Atom actual_type;
|
||||
int actual_format;
|
||||
unsigned long nitems;
|
||||
unsigned long nbytes_after;
|
||||
unsigned char *prop = NULL;
|
||||
char *ret = NULL;
|
||||
|
||||
Atom a = XInternAtom(d, name, False);
|
||||
if (XGetWindowProperty(d, RootWindow(d, 0), a, 0, (l+2)/4, False, XA_STRING, &actual_type, &actual_format, &nitems, &nbytes_after, &prop) != Success)
|
||||
goto finish;
|
||||
|
||||
if (actual_type != XA_STRING)
|
||||
goto finish;
|
||||
|
||||
memcpy(p, prop, nitems);
|
||||
p[nitems] = 0;
|
||||
|
||||
ret = p;
|
||||
|
||||
finish:
|
||||
|
||||
if (prop)
|
||||
XFree(prop);
|
||||
|
||||
return ret;
|
||||
}
|
||||
33
polyp/x11prop.h
Normal file
33
polyp/x11prop.h
Normal file
|
|
@ -0,0 +1,33 @@
|
|||
#ifndef foox11prophfoo
|
||||
#define foox11prophfoo
|
||||
|
||||
/* $Id$ */
|
||||
|
||||
/***
|
||||
This file is part of polypaudio.
|
||||
|
||||
polypaudio is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published
|
||||
by the Free Software Foundation; either version 2 of the License,
|
||||
or (at your option) any later version.
|
||||
|
||||
polypaudio is distributed in the hope that it will be useful, but
|
||||
WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with polypaudio; if not, write to the Free Software
|
||||
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
|
||||
USA.
|
||||
***/
|
||||
|
||||
#include <sys/types.h>
|
||||
|
||||
#include <X11/Xlib.h>
|
||||
|
||||
void pa_x11_set_prop(Display *d, const char *name, const char *data);
|
||||
void pa_x11_del_prop(Display *d, const char *name);
|
||||
char* pa_x11_get_prop(Display *d, const char *name, char *p, size_t l);
|
||||
|
||||
#endif
|
||||
Loading…
Add table
Add a link
Reference in a new issue