diff options
author | Vinicius Costa Gomes <vinicius.gomes@openbossa.org> | 2010-03-31 17:22:12 -0300 |
---|---|---|
committer | Vinicius Costa Gomes <vinicius.gomes@openbossa.org> | 2010-04-28 14:03:52 -0300 |
commit | 5f62fd626b43bd962a3e6b61758bbd55edb065a4 (patch) | |
tree | 37a1694d9ca368d2d1b646048847c5bead26d005 /src | |
parent | b69bd0027e5f4ba1378fb2eee7aef82ffa845d57 (diff) | |
download | obexd-5f62fd626b43bd962a3e6b61758bbd55edb065a4.tar.gz |
Add support to the WHO header in mimetype drivers
Diffstat (limited to 'src')
-rw-r--r-- | src/mimetype.c | 27 | ||||
-rw-r--r-- | src/mimetype.h | 4 | ||||
-rw-r--r-- | src/obex.c | 11 |
3 files changed, 32 insertions, 10 deletions
diff --git a/src/mimetype.c b/src/mimetype.c index 02a7879..27acf5f 100644 --- a/src/mimetype.c +++ b/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/src/mimetype.h b/src/mimetype.h index fc1fcb8..dc16240 100644 --- a/src/mimetype.h +++ b/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); @@ -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, |