]> code.delx.au - pulseaudio/commitdiff
split out x11prop.[ch]
authorLennart Poettering <lennart@poettering.net>
Tue, 9 Nov 2004 23:19:42 +0000 (23:19 +0000)
committerLennart Poettering <lennart@poettering.net>
Tue, 9 Nov 2004 23:19:42 +0000 (23:19 +0000)
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

15 files changed:
configure.ac
doc/todo
polyp/Makefile.am
polyp/client-conf-x11.c [new file with mode: 0644]
polyp/client-conf-x11.h [new file with mode: 0644]
polyp/client-conf.c
polyp/client-conf.h
polyp/module-protocol-stub.c
polyp/module-x11-publish.c
polyp/native-common.h
polyp/pax11publish.c
polyp/polyplib-context.c
polyp/polyplib-internal.h
polyp/x11prop.c [new file with mode: 0644]
polyp/x11prop.h [new file with mode: 0644]

index 026d4d97bcefb294ba368ed1570f7925cdd25564..6eec2d8123b914ffa62e9a2b102de105cc6b2d97 100644 (file)
@@ -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
index cfc4b0441b9f8304e25f5b4564ddbd9485b4e22c..2ba697b8442726147e6360a2c7d650183daa0324 100644 (file)
--- a/doc/todo
+++ b/doc/todo
@@ -20,6 +20,7 @@
 - add LGPL blurb to all concerning files
 - non-fp mixing
 - non-fp resampling
+- esound backend
 
 ** later ***
 - xmlrpc/http
index 18aa51c18bbe4c2198e87d71cc97f6db2c6fd11b..cc9705c255410a6fe0dfc33e0da8b95bef02c9ae 100644 (file)
@@ -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
 
diff --git a/polyp/client-conf-x11.c b/polyp/client-conf-x11.c
new file mode 100644 (file)
index 0000000..54c3b06
--- /dev/null
@@ -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;
+    
+}
diff --git a/polyp/client-conf-x11.h b/polyp/client-conf-x11.h
new file mode 100644 (file)
index 0000000..626b4f3
--- /dev/null
@@ -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
index 0f442c9937a608723e03e5bbb46da809a563f934..4a0fc6298e4cfdba3a4504d1de66a5bde78a6a25 100644 (file)
@@ -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;
+}
+
index 6fd4a20d7d8233a309ddca80118578bd42a3a539..2ce056f4aefa2858192a68e7c9acbc26721e4be1 100644 (file)
   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
index 8cef3bdb3a1c343dec78b1b0c32b5f7cb458e173..6ff7d774396409f0e5db1e8941667a5f71b2c0ab 100644 (file)
@@ -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"
index c862fe3a24f5dd9bd85161b8562b01f67257c142..6e100153f4c0b1347cab26c28ff576d1a9d6a826 100644 (file)
@@ -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);
         }
     }
index fbee74c906b2171b6495a97b30ff09382b39e1ae..597bb56b0687d07bc005926839ab8b118507263b 100644 (file)
@@ -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
index fc1d6ab7bdc6700ca407cc090ec1eea99c8cab25..f151c1976339482b04ffc05a23f4c599675383f3 100644 (file)
 #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:
index 1a25523fd1d3e73c9a6311f561171de7dba0d120..36512a8a309fbfbf795684cc5ac41bc5156b2902 100644 (file)
 #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);
 
index 623a89b33c63893277240e6e4e59ba6c0ae9c345..4e6553a8f9af35304b2f84bbecba3b4f4f049a7e 100644 (file)
@@ -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 {
diff --git a/polyp/x11prop.c b/polyp/x11prop.c
new file mode 100644 (file)
index 0000000..6ff91ec
--- /dev/null
@@ -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;
+}
diff --git a/polyp/x11prop.h b/polyp/x11prop.h
new file mode 100644 (file)
index 0000000..2246185
--- /dev/null
@@ -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