From c7d7dd91f89ac3fe7992d1d053b8e20c78266723 Mon Sep 17 00:00:00 2001 From: Wim Taymans Date: Thu, 30 Jul 2020 16:35:14 +0200 Subject: [PATCH] permission: add M permission The M permission is needed to set metadata on an object. --- pipewire-pulseaudio/src/context.c | 2 +- pipewire-pulseaudio/src/introspect.c | 2 +- src/pipewire/permission.h | 10 +++++++--- 3 files changed, 9 insertions(+), 5 deletions(-) diff --git a/pipewire-pulseaudio/src/context.c b/pipewire-pulseaudio/src/context.c index 75d386083..12d7d2795 100644 --- a/pipewire-pulseaudio/src/context.c +++ b/pipewire-pulseaudio/src/context.c @@ -1623,7 +1623,7 @@ static void do_default_node(pa_operation *o, void *userdata) g = pa_context_find_global_by_name(c, d->mask, d->name); if (g == NULL) { error = PA_ERR_NOENTITY; - } else if (!SPA_FLAG_IS_SET(g->permissions, PW_PERM_R) || + } else if (!SPA_FLAG_IS_SET(g->permissions, PW_PERM_M) || (c->metadata && !SPA_FLAG_IS_SET(c->metadata->permissions, PW_PERM_W|PW_PERM_X))) { error = PA_ERR_ACCESS; } else if (c->metadata) { diff --git a/pipewire-pulseaudio/src/introspect.c b/pipewire-pulseaudio/src/introspect.c index 1a6c5e94f..5d2dafdc0 100644 --- a/pipewire-pulseaudio/src/introspect.c +++ b/pipewire-pulseaudio/src/introspect.c @@ -2076,7 +2076,7 @@ static void do_target_node(pa_operation *o, void *userdata) } if (t == NULL) { error = PA_ERR_NOENTITY; - } else if (!SPA_FLAG_IS_SET(g->permissions, PW_PERM_R) || + } else if (!SPA_FLAG_IS_SET(g->permissions, PW_PERM_M) || (c->metadata && !SPA_FLAG_IS_SET(c->metadata->permissions, PW_PERM_W|PW_PERM_X))) { error = PA_ERR_ACCESS; } else if (c->metadata) { diff --git a/src/pipewire/permission.h b/src/pipewire/permission.h index eaff24efc..fffc18727 100644 --- a/src/pipewire/permission.h +++ b/src/pipewire/permission.h @@ -45,14 +45,17 @@ extern "C" { #define PW_PERM_W 0200 /**< methods can be called that modify the object */ #define PW_PERM_X 0100 /**< methods can be called on the object. The W flag must be * present in order to call methods that modify the object. */ +#define PW_PERM_M 0010 /**< metadata can be set on object, Since 0.3.9 */ #define PW_PERM_RWX (PW_PERM_R|PW_PERM_W|PW_PERM_X) +#define PW_PERM_RWXM (PW_PERM_RWX|PW_PERM_M) #define PW_PERM_IS_R(p) (((p)&PW_PERM_R) == PW_PERM_R) #define PW_PERM_IS_W(p) (((p)&PW_PERM_W) == PW_PERM_W) #define PW_PERM_IS_X(p) (((p)&PW_PERM_X) == PW_PERM_X) +#define PW_PERM_IS_M(p) (((p)&PW_PERM_M) == PW_PERM_M) -#define PW_PERM_ALL PW_PERM_RWX +#define PW_PERM_ALL PW_PERM_RWXM #define PW_PERM_INVALID (uint32_t)(0xffffffff) struct pw_permission { @@ -62,11 +65,12 @@ struct pw_permission { #define PW_PERMISSION_INIT(id,p) (struct pw_permission){ (id), (p) } -#define PW_PERMISSION_FORMAT "%c%c%c" +#define PW_PERMISSION_FORMAT "%c%c%c%c" #define PW_PERMISSION_ARGS(permission) \ (permission) & PW_PERM_R ? 'r' : '-', \ (permission) & PW_PERM_W ? 'w' : '-', \ - (permission) & PW_PERM_X ? 'x' : '-' + (permission) & PW_PERM_X ? 'x' : '-', \ + (permission) & PW_PERM_M ? 'm' : '-' #ifdef __cplusplus }