From 66e479d47fec65b9bab8be5869f88b3d48275300 Mon Sep 17 00:00:00 2001 From: Luiz Augusto Von Dentz Date: Mon, 14 Dec 2009 16:49:40 +0200 Subject: [PATCH] obexd: Fix .read of folder-listing driver This should enable reading folder-listing string in chunks similar to capabilty driver. --- obexd/plugins/filesystem.c | 122 ++++++++++++++++--------------------- obexd/src/main.c | 4 +- 2 files changed, 54 insertions(+), 72 deletions(-) diff --git a/obexd/plugins/filesystem.c b/obexd/plugins/filesystem.c index 46fbd8e59..1ca1b2763 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 09d697c2e..9903c19b8 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); -- 2.47.3