diff options
Diffstat (limited to 'src/pulsecore/auth-cookie.c')
-rw-r--r-- | src/pulsecore/auth-cookie.c | 139 |
1 files changed, 139 insertions, 0 deletions
diff --git a/src/pulsecore/auth-cookie.c b/src/pulsecore/auth-cookie.c new file mode 100644 index 0000000..248d9bf --- /dev/null +++ b/src/pulsecore/auth-cookie.c @@ -0,0 +1,139 @@ +/*** + This file is part of PulseAudio. + + Copyright 2008 Lennart Poettering + + PulseAudio is free software; you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published + by the Free Software Foundation; either version 2.1 of the License, + or (at your option) any later version. + + PulseAudio 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 Lesser General Public License + along with PulseAudio; if not, see <http://www.gnu.org/licenses/>. +***/ + +#ifdef HAVE_CONFIG_H +#include <config.h> +#endif + +#include <sys/types.h> + +#include <pulse/xmalloc.h> + +#include <pulsecore/refcnt.h> +#include <pulsecore/macro.h> +#include <pulsecore/core-util.h> +#include <pulsecore/shared.h> +#include <pulsecore/authkey.h> + +#include "auth-cookie.h" + +struct pa_auth_cookie { + PA_REFCNT_DECLARE; + pa_core *core; + char *name; + size_t size; +}; + +pa_auth_cookie* pa_auth_cookie_get(pa_core *core, const char *cn, bool create, size_t size) { + pa_auth_cookie *c; + char *t; + + pa_assert(core); + pa_assert(size > 0); + + t = pa_sprintf_malloc("auth-cookie%s%s", cn ? "@" : "", cn ? cn : ""); + + if ((c = pa_shared_get(core, t))) { + + pa_xfree(t); + + if (c->size != size) + return NULL; + + return pa_auth_cookie_ref(c); + } + + c = pa_xmalloc(PA_ALIGN(sizeof(pa_auth_cookie)) + size); + PA_REFCNT_INIT(c); + c->core = core; + c->name = t; + c->size = size; + + pa_assert_se(pa_shared_set(core, t, c) >= 0); + + if (pa_authkey_load(cn, create, (uint8_t*) c + PA_ALIGN(sizeof(pa_auth_cookie)), size) < 0) { + pa_auth_cookie_unref(c); + return NULL; + } + + return c; +} + +pa_auth_cookie *pa_auth_cookie_create(pa_core *core, const void *data, size_t size) { + pa_auth_cookie *c; + char *t; + + pa_assert(core); + pa_assert(data); + pa_assert(size > 0); + + t = pa_xstrdup("auth-cookie"); + + if ((c = pa_shared_get(core, t))) { + + pa_xfree(t); + + if (c->size != size) + return NULL; + + return pa_auth_cookie_ref(c); + } + + c = pa_xmalloc(PA_ALIGN(sizeof(pa_auth_cookie)) + size); + PA_REFCNT_INIT(c); + c->core = core; + c->name = t; + c->size = size; + + pa_assert_se(pa_shared_set(core, t, c) >= 0); + + memcpy((uint8_t *) c + PA_ALIGN(sizeof(pa_auth_cookie)), data, size); + + return c; +} + +pa_auth_cookie* pa_auth_cookie_ref(pa_auth_cookie *c) { + pa_assert(c); + pa_assert(PA_REFCNT_VALUE(c) >= 1); + + PA_REFCNT_INC(c); + + return c; +} + +void pa_auth_cookie_unref(pa_auth_cookie *c) { + pa_assert(c); + pa_assert(PA_REFCNT_VALUE(c) >= 1); + + if (PA_REFCNT_DEC(c) > 0) + return; + + pa_assert_se(pa_shared_remove(c->core, c->name) >= 0); + + pa_xfree(c->name); + pa_xfree(c); +} + +const uint8_t* pa_auth_cookie_read(pa_auth_cookie *c, size_t size) { + pa_assert(c); + pa_assert(PA_REFCNT_VALUE(c) >= 1); + pa_assert(c->size == size); + + return (const uint8_t*) c + PA_ALIGN(sizeof(pa_auth_cookie)); +} |