obexd/opp: Fix OPP GET request path 30/49830/1
authorGowtham Anandha Babu <gowtham.ab@samsung.com>
Tue, 20 Oct 2015 12:29:31 +0000 (17:59 +0530)
committerGowtham Anandha Babu <gowtham.ab@samsung.com>
Tue, 20 Oct 2015 12:29:31 +0000 (17:59 +0530)
The default path is /etc/bluetooth/vcard.vcf which obexd
is not able to access.

obexd[11654]: obexd/src/obex.c:cmd_get() session 0x64edff0
obexd[11654]: GET(0x3), (null)(0xffffffff)
obexd[11654]: obexd/src/obex.c:parse_type() TYPE: text/x-vcard
obexd[11654]: open(/etc/bluetooth/vcard.vcf): Operation not permitted (1)
obexd[11654]: GET(0x3), NOT_FOUND(0x44)

After making this path as obex root folder,
it is able to succeed.

obexd[12246]: obexd/src/obex.c:cmd_get() session 0x64ed830
obexd[12246]: GET(0x3), (null)(0xffffffff)
obexd[12246]: obexd/src/obex.c:parse_type() TYPE: text/x-vcard
obexd[12246]: obexd/src/obex.c:driver_get_headers() name=(null) type=text/x-vcard object=0x8
obexd[12246]: GET(0x3), CONTINUE(0x10)
obexd[12246]: obexd/src/obex.c:send_data() name=(null) type=text/x-vcard file=0x8 size=3061
obexd[12246]: obexd/src/obex.c:driver_read() 73 read
obexd[12246]: obexd/src/obex.c:send_data() name=(null) type=text/x-vcard file=0x8 size=3066
obexd[12246]: obexd/src/obex.c:driver_read() 0 read
obexd[12246]: obexd/src/obex.c:transfer_complete()

Git repo link:
https://git.kernel.org/cgit/bluetooth/bluez.git/commit/?id=fd524d73a3a83b8e324b14c166670e0326bc3946

Change-Id: I3a3bfca7a879af3fa19ceff17d6b4b1372949438

obexd/plugins/opp.c

index 5228ba8..aa0722e 100644 (file)
@@ -42,7 +42,6 @@
 #include "filesystem.h"
 
 #define VCARD_TYPE "text/x-vcard"
-#define VCARD_FILE CONFIGDIR "/vcard.vcf"
 
 static void *opp_connect(struct obex_session *os, int *err)
 {
@@ -134,6 +133,8 @@ static int opp_put(struct obex_session *os, void *user_data)
 static int opp_get(struct obex_session *os, void *user_data)
 {
        const char *type;
+       char *folder, *path;
+       int err = 0;
 
        if (obex_get_name(os))
                return -EPERM;
@@ -143,14 +144,19 @@ static int opp_get(struct obex_session *os, void *user_data)
        if (type == NULL)
                return -EPERM;
 
+       folder = g_strdup(obex_option_root_folder());
+       path = g_build_filename(folder, "/vcard.vcf", NULL);
+
        if (g_ascii_strcasecmp(type, VCARD_TYPE) == 0) {
-               if (obex_get_stream_start(os, VCARD_FILE) < 0)
-                       return -ENOENT;
+               if (obex_get_stream_start(os, path) < 0)
+                       err = -ENOENT;
 
        } else
-               return -EPERM;
+               err = -EPERM;
 
-       return 0;
+       g_free(folder);
+       g_free(path);
+       return err;
 }
 
 static void opp_disconnect(struct obex_session *os, void *user_data)