On Tue, 12.05.09 01:35, Marc-Andr? Lureau (marc-andre.lureau at nokia.com) wrote: > +/** Check if "extension" is supported in server side. \since 0.9.16 */ > +int pa_context_extension_supported(pa_context *c, const char *extension); > + > PA_C_DECL_END This function should be private for now. We don't allow implementing extensions out-of-tree for now, so there is noch much need for it for external programs. This should move to internal.h. Later on we can make this public again. > +++ b/src/pulse/xmalloc.h > @@ -91,6 +91,19 @@ static inline void* _pa_xnewdup_internal(const void *p, size_t n, size_t k) { > /** Same as pa_xnew() but set the memory to zero */ > #define pa_xnewdup(type, p, n) ((type*) _pa_xnewdup_internal((p), (n), sizeof(type))) > > +/** Free a string array and its strings */ > +static inline void pa_strv_free(char *strv[]) { > + unsigned i; > + > + if (!strv) > + return; > + > + for (i = 0; strv[i]; ++i) > + pa_xfree(strv[i]); > + > + pa_xfree(strv); > +} > + > PA_C_DECL_END Grmbl. This is a public header. We already have enough cruft public, I'd rather see this is pulsecore/core-util.h. Also I doubt the compiler would inline this, so this should be normal function. > #endif > diff --git a/src/pulsecore/core-util.h b/src/pulsecore/core-util.h > index f96fa44..6f929e4 100644 > --- a/src/pulsecore/core-util.h > +++ b/src/pulsecore/core-util.h > @@ -201,6 +201,22 @@ pa_bool_t pa_in_system_mode(void); > > #define pa_streq(a,b) (!strcmp((a),(b))) > > +static inline int pa_strv_index(const char * const *strv, const char *needle, unsigned *idx) { > + unsigned i; > + > + if (!strv) > + return -1; > + > + for (i = 0; strv[i]; ++i) > + if (pa_streq(strv[i], needle)) { > + if (idx) > + *idx = i; > + return 0; > + } > + > + return -1; > +} > + Should be a normal function too. No inline. > @@ -2410,14 +2427,29 @@ static void command_set_client_name(pa_pdispatch *pd, uint32_t command, uint32_t > p = pa_proplist_new(); > > if ((c->version < 13 && pa_tagstruct_gets(t, &name) < 0) || > - (c->version >= 13 && pa_tagstruct_get_proplist(t, p) < 0) || > - !pa_tagstruct_eof(t)) { > + (c->version >= 13 && pa_tagstruct_get_proplist(t, p) < 0)) > + goto error; > > - protocol_error(c); > - pa_proplist_free(p); > - return; > + if (c->version >= 16) { > + uint32_t n; > + > + if (pa_tagstruct_getu32(t, &n) < 0) > + goto error; > + > + c->supported_extensions = pa_xnew(char *, n + 1); > + c->supported_extensions[n] = NULL; > + > + while (n) { > + --n; > + if (pa_tagstruct_gets(t, &ext) < 0) > + goto error; > + c->supported_extensions[n] = pa_xstrdup(ext); > + } I think we should only store information about extension we ourselves understand. i.e. Nego should happen at startup and then stay static. Otherwise I am happy! Lennart -- Lennart Poettering Red Hat, Inc. lennart [at] poettering [dot] net http://0pointer.net/lennart/ GnuPG 0x1A015CC4