summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorVinicius Costa Gomes <vinicius.gomes@openbossa.org>2010-03-31 17:22:12 -0300
committerVinicius Costa Gomes <vinicius.gomes@openbossa.org>2010-04-28 14:03:52 -0300
commit5f62fd626b43bd962a3e6b61758bbd55edb065a4 (patch)
tree37a1694d9ca368d2d1b646048847c5bead26d005 /src
parentb69bd0027e5f4ba1378fb2eee7aef82ffa845d57 (diff)
downloadobexd-5f62fd626b43bd962a3e6b61758bbd55edb065a4.tar.gz
Add support to the WHO header in mimetype drivers
Diffstat (limited to 'src')
-rw-r--r--src/mimetype.c27
-rw-r--r--src/mimetype.h4
-rw-r--r--src/obex.c11
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);
diff --git a/src/obex.c b/src/obex.c
index aafcb44..9fc7d37 100644
--- a/src/obex.c
+++ b/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,