Diff between 688f5ee80fca9ff06cdc1b1e51d4989e18147f1d and 9a32b6144d8a9d7aedfa696e0aa8572c13c58480

Changed Files

File Additions Deletions Status
obexd/plugins/mas.c +3 -2 modified
obexd/plugins/messages-dummy.c +49 -1 modified

Full Patch

diff --git a/obexd/plugins/mas.c b/obexd/plugins/mas.c
index 10b972d..bf8d689 100644
--- a/obexd/plugins/mas.c
+++ b/obexd/plugins/mas.c
@@ -408,6 +408,7 @@ static void get_message_cb(void *session, int err, gboolean fmore,
 	}
 
 	g_string_append(mas->buffer, chunk);
+	mas->finished = TRUE;
 
 proceed:
 	if (err != -EAGAIN)
@@ -612,11 +613,11 @@ static void *message_open(const char *name, int oflag, mode_t mode,
 		return NULL;
 	}
 
+	mas->buffer = g_string_new("");
+
 	*err = messages_get_message(mas->backend_data, name, 0,
 			get_message_cb, mas);
 
-	mas->buffer = g_string_new("");
-
 	if (*err < 0)
 		return NULL;
 	else
diff --git a/obexd/plugins/messages-dummy.c b/obexd/plugins/messages-dummy.c
index e313c61..945f30c 100644
--- a/obexd/plugins/messages-dummy.c
+++ b/obexd/plugins/messages-dummy.c
@@ -18,6 +18,8 @@
 #include <errno.h>
 #include <stdlib.h>
 #include <string.h>
+#include <sys/stat.h>
+#include <sys/mman.h>
 
 #include "obexd/src/log.h"
 
@@ -516,7 +518,53 @@ int messages_get_message(void *session, const char *handle,
 					messages_get_message_cb callback,
 					void *user_data)
 {
-	return -ENOSYS;
+	struct session *s =  session;
+	FILE *fp;
+	char *path;
+	char *msg, *buffer;
+	int file_size, err = 0;
+	struct stat file_info;
+
+	DBG(" ");
+	path = g_build_filename(s->cwd_absolute, handle, NULL);
+	fp = fopen(path, "r");
+	if (!fp) {
+		DBG("fopen() failed");
+		err = -EBADR;
+		goto file_open_err;
+	}
+
+	if (fstat(fileno(fp), &file_info) < 0) {
+		DBG("Error getting file size");
+		err = -EBADR;
+		goto mmap_err;
+	}
+
+	file_size = file_info.st_size;
+
+	msg = mmap(0, file_size, PROT_READ, MAP_PRIVATE, fileno(fp), 0);
+	if (msg == MAP_FAILED) {
+		DBG("Error mapping file");
+		err = -EBADR;
+		goto mmap_err;
+	}
+
+	buffer = strndup(msg, file_size);
+
+	if (callback)
+		callback(session, 0, 0, buffer, user_data);
+
+	if (munmap(msg, file_size) == -1) {
+		DBG("Error unmapping");
+		err = -EBADR;
+	}
+
+	free(buffer);
+mmap_err:
+	fclose(fp);
+file_open_err:
+	g_free(path);
+	return err;
 }
 
 int messages_update_inbox(void *session, messages_status_cb callback,