Diff between 2330d1a1edd2b4901c3f84a2f589cd5baa34bae5 and 66e479d47fec65b9bab8be5869f88b3d48275300

Changed Files

File Additions Deletions Status
obexd/plugins/filesystem.c +52 -70 modified
obexd/src/main.c +2 -2 modified

Full Patch

diff --git a/obexd/plugins/filesystem.c b/obexd/plugins/filesystem.c
index 46fbd8e..1ca1b27 100644
--- a/obexd/plugins/filesystem.c
+++ b/obexd/plugins/filesystem.c
@@ -223,82 +223,42 @@ fail:
 	return NULL;
 }
 
-static int capability_close(gpointer object)
-{
-	GString *capability = object;
-
-	g_string_free(capability, TRUE);
-	return 0;
-}
-
-static ssize_t capability_read(gpointer object, void *buf, size_t count)
-{
-	GString *capability = object;
-	ssize_t len;
-
-	if (capability->len == 0)
-		return 0;
-
-	strncpy(buf, capability->str, count);
-	len = strlen(buf);
-	capability = g_string_erase(capability, 0, len);
-
-	return len;
-}
-
 static gpointer folder_open(const char *name, int oflag, mode_t mode,
 				size_t *size)
 {
-	DIR *dir = opendir(name);
-
-	if (dir == NULL)
-		return NULL;
-
-	if (size)
-		*size = 1;
-
-	return dir;
-}
-
-static int folder_close(gpointer object)
-{
-	DIR *dir = (DIR *) object;
-
-	return closedir(dir);
-}
-
-static ssize_t folder_read(gpointer object, void *buf, size_t count)
-{
 	struct obex_session *os;
 	struct stat fstat, dstat;
 	struct dirent *ep;
-	DIR *dp = (DIR *) object;
-	GString *listing;
+	DIR *dp;
+	GString *object;
 	gboolean root, pcsuite;
-	gint err, len;
+	gint err;
 
-	os = obex_get_session(object);
-	if (os->finished)
-		return 0;
+	os = obex_get_session(NULL);
 
 	pcsuite = os->service->service & OBEX_PCSUITE ? TRUE : FALSE;
 
-	listing = g_string_new(FL_VERSION);
-	listing = g_string_append(listing, pcsuite ? FL_TYPE_PCSUITE : FL_TYPE);
+	object = g_string_new(FL_VERSION);
+	object = g_string_append(object, pcsuite ? FL_TYPE_PCSUITE : FL_TYPE);
 
-	listing = g_string_append(listing, FL_BODY_BEGIN);
+	object = g_string_append(object, FL_BODY_BEGIN);
 
-	root = g_str_equal(os->current_folder, os->server->folder);
+	root = g_str_equal(name, os->server->folder);
+
+	dp = opendir(name);
+	if (dp == NULL) {
+		errno = ENOENT;
+		goto failed;
+	}
 
 	if (root && os->server->symlinks)
-		err = stat(os->current_folder, &dstat);
+		err = stat(name, &dstat);
 	else {
-		listing = g_string_append(listing, FL_PARENT_FOLDER_ELEMENT);
-		err = lstat(os->current_folder, &dstat);
+		object = g_string_append(object, FL_PARENT_FOLDER_ELEMENT);
+		err = lstat(name, &dstat);
 	}
 
 	if (err < 0) {
-		err = -errno;
 		error("%s: %s(%d)", root ? "stat" : "lstat",
 				strerror(errno), errno);
 		goto failed;
@@ -343,21 +303,43 @@ static ssize_t folder_read(gpointer object, void *buf, size_t count)
 
 		g_free(name);
 
-		listing = g_string_append(listing, line);
+		object = g_string_append(object, line);
 		g_free(line);
 	}
 
-	listing = g_string_append(listing, FL_BODY_END);
-	len = listing->len;
-	memcpy(buf, listing->str, len);
-	g_string_free(listing, TRUE);
-	os->finished = TRUE;
+	object = g_string_append(object, FL_BODY_END);
+	if (size)
+		*size = object->len;
 
-	return len;
+	return object;
 
 failed:
-	g_string_free(listing, TRUE);
-	return err;
+	g_string_free(object, TRUE);
+	return NULL;
+}
+
+static int string_free(gpointer object)
+{
+	GString *string = object;
+
+	g_string_free(string, TRUE);
+
+	return 0;
+}
+
+static ssize_t string_read(gpointer object, void *buf, size_t count)
+{
+	GString *string = object;
+	ssize_t len;
+
+	if (string->len == 0)
+		return 0;
+
+	strncpy(buf, string->str, count);
+	len = strlen(buf);
+	string = g_string_erase(string, 0, len);
+
+	return len;
 }
 
 struct obex_mime_type_driver file = {
@@ -372,16 +354,16 @@ struct obex_mime_type_driver capability = {
 	.target = FTP_TARGET,
 	.mimetype = "x-obex/capability",
 	.open = capability_open,
-	.close = capability_close,
-	.read = capability_read,
+	.close = string_free,
+	.read = string_read,
 };
 
 struct obex_mime_type_driver folder = {
 	.target = FTP_TARGET,
 	.mimetype = "x-obex/folder-listing",
 	.open = folder_open,
-	.close = folder_close,
-	.read = folder_read,
+	.close = string_free,
+	.read = string_read,
 };
 
 static int filesystem_init(void)
diff --git a/obexd/src/main.c b/obexd/src/main.c
index 09d697c..9903c19 100644
--- a/obexd/src/main.c
+++ b/obexd/src/main.c
@@ -364,8 +364,6 @@ int main(int argc, char *argv[])
 		exit(EXIT_FAILURE);
 	}
 
-	plugin_init();
-
 	if (option_root == NULL)
 		option_root = g_strdup(DEFAULT_ROOT_PATH);
 
@@ -377,6 +375,8 @@ int main(int argc, char *argv[])
 		}
 	}
 
+	plugin_init();
+
 	if (option_capability == NULL)
 		option_capability = g_strdup(DEFAULT_CAP_FILE);