From a7100576de83c5edeb9883861e5185c2e02398bb Mon Sep 17 00:00:00 2001 From: Vinicius Costa Gomes Date: Wed, 31 Mar 2010 17:22:12 -0300 Subject: [PATCH] obexd: Add support to the WHO header in mimetype drivers --- obexd/src/mimetype.c | 27 ++++++++++++++++++++++----- obexd/src/mimetype.h | 4 +++- obexd/src/obex.c | 11 +++++++---- 3 files changed, 32 insertions(+), 10 deletions(-) diff --git a/obexd/src/mimetype.c b/obexd/src/mimetype.c index 02a787925..27acf5ff7 100644 --- a/obexd/src/mimetype.c +++ b/obexd/src/mimetype.c @@ -46,6 +46,18 @@ struct io_watch { gpointer user_data; }; +/* Just thin wrapper around memcmp to deal with NULL values */ +static int memcmp0(const void *a, const void *b, size_t n) +{ + if (a == NULL) + return -(a != b); + + if (b == NULL) + return a != b; + + return memcmp(a, b, n); +} + void obex_object_set_io_flags(gpointer object, int flags, int err) { GSList *l; @@ -117,15 +129,18 @@ static int set_io_watch(gpointer object, obex_object_io_func func, return 0; } -struct obex_mime_type_driver *obex_mime_type_driver_find(const guint8 *target, const char *mimetype) +struct obex_mime_type_driver *obex_mime_type_driver_find(const guint8 *target, + const char *mimetype, const guint8 *who, guint who_size) { GSList *l; for (l = drivers; l; l = l->next) { struct obex_mime_type_driver *driver = l->data; - if (driver->target && target && - memcmp(target, driver->target, TARGET_SIZE)) + if (memcmp0(target, driver->target, TARGET_SIZE)) + continue; + + if (memcmp0(who, driver->who, who_size)) continue; if (g_strcmp0(mimetype, driver->mimetype) == 0) @@ -142,8 +157,10 @@ int obex_mime_type_driver_register(struct obex_mime_type_driver *driver) return -EINVAL; } - if (obex_mime_type_driver_find(driver->target, driver->mimetype)) { - error("Permission denied: %s could not be registered", driver->mimetype); + if (obex_mime_type_driver_find(driver->target, driver->mimetype, + driver->who, driver->who_size)) { + error("Permission denied: %s could not be registered", + driver->mimetype); return -EPERM; } diff --git a/obexd/src/mimetype.h b/obexd/src/mimetype.h index fc1fcb87b..dc1624046 100644 --- a/obexd/src/mimetype.h +++ b/obexd/src/mimetype.h @@ -27,6 +27,8 @@ typedef gboolean (*obex_object_io_func) (gpointer object, int flags, int err, struct obex_mime_type_driver { const guint8 *target; const char *mimetype; + const guint8 *who; + guint who_size; gpointer driver_data; gpointer (*open) (const char *name, int oflag, mode_t mode, gpointer driver_data, size_t *size, int *err); @@ -41,6 +43,6 @@ struct obex_mime_type_driver { int obex_mime_type_driver_register(struct obex_mime_type_driver *driver); void obex_mime_type_driver_unregister(struct obex_mime_type_driver *driver); struct obex_mime_type_driver *obex_mime_type_driver_find(const guint8 *target, - const char *mimetype); + const char *mimetype, const guint8 *who, guint who_size); void obex_object_set_io_flags(gpointer object, int flags, int err); diff --git a/obexd/src/obex.c b/obexd/src/obex.c index aafcb4423..9fc7d3791 100644 --- a/obexd/src/obex.c +++ b/obexd/src/obex.c @@ -366,13 +366,14 @@ static void cmd_get(struct obex_session *os, obex_t *obex, obex_object_t *obj) os->type = g_strndup((const gchar *) hd.bs, hlen); debug("OBEX_HDR_TYPE: %s", os->type); - os->driver = obex_mime_type_driver_find(os->service->target, os->type); + os->driver = obex_mime_type_driver_find(os->service->target, + os->type, os->service->who, os->service->who_size); break; } } if (!os->driver) { - os->driver = obex_mime_type_driver_find(os->service->target, NULL); + os->driver = obex_mime_type_driver_find(os->service->target, NULL, NULL, 0); if (!os->driver) { error("No driver found"); OBEX_ObjectSetRsp(obj, OBEX_RSP_NOT_IMPLEMENTED, @@ -730,7 +731,8 @@ static gboolean check_put(obex_t *obex, obex_object_t *obj) os->type = g_strndup((const gchar *) hd.bs, hlen); debug("OBEX_HDR_TYPE: %s", os->type); - os->driver = obex_mime_type_driver_find(os->service->target, os->type); + os->driver = obex_mime_type_driver_find(os->service->target, + os->type, os->service->who, os->service->who_size); break; case OBEX_HDR_BODY: @@ -751,7 +753,8 @@ static gboolean check_put(obex_t *obex, obex_object_t *obj) OBEX_ObjectReParseHeaders(obex, obj); if (!os->driver) { - os->driver = obex_mime_type_driver_find(os->service->target, NULL); + os->driver = obex_mime_type_driver_find(os->service->target, + NULL, NULL, 0); if (!os->driver) { error("No driver found"); OBEX_ObjectSetRsp(obj, OBEX_RSP_NOT_IMPLEMENTED, -- 2.47.3