From eaa0966ae0a319945211732958d7c929a3552103 Mon Sep 17 00:00:00 2001 From: Claudio Takahasi Date: Fri, 26 Feb 2010 12:21:04 -0300 Subject: [PATCH] obexd: Cleanup of set path function of OBEX service driver --- obexd/plugins/ftp.c | 72 ++++++++++++++++++-------------------------- obexd/plugins/pbap.c | 65 +++++++++++++++++---------------------- obexd/src/obex.c | 30 ++++++++++++++++-- obexd/src/obex.h | 7 +++-- obexd/src/service.h | 2 +- 5 files changed, 91 insertions(+), 85 deletions(-) diff --git a/obexd/plugins/ftp.c b/obexd/plugins/ftp.c index 354eaad97..dd9fde7bb 100644 --- a/obexd/plugins/ftp.c +++ b/obexd/plugins/ftp.c @@ -299,73 +299,64 @@ static void ftp_put(obex_t *obex, obex_object_t *obj) } } -static void ftp_setpath(obex_t *obex, obex_object_t *obj) +static obex_rsp_t ftp_setpath(struct OBEX_session *os, obex_object_t *obj) { - struct obex_session *os; + const gchar *root_folder, *current_folder, *name; guint8 *nonhdr; gchar *fullname; struct stat dstat; gboolean root; + obex_rsp_t rsp = OBEX_RSP_SUCCESS; int err; - os = OBEX_GetUserData(obex); - if (OBEX_ObjectGetNonHdrData(obj, &nonhdr) != 2) { - OBEX_ObjectSetRsp(obj, OBEX_RSP_CONTINUE, - OBEX_RSP_PRECONDITION_FAILED); error("Set path failed: flag and constants not found!"); - return; + return OBEX_RSP_PRECONDITION_FAILED; } - root = g_str_equal(os->server->folder, os->current_folder); + name = obex_session_get_name(os); + root_folder = obex_get_root_folder(os); + current_folder = obex_get_folder(os); + root = g_str_equal(root_folder, current_folder); /* Check flag "Backup" */ if ((nonhdr[0] & 0x01) == 0x01) { debug("Set to parent path"); - if (root) { - OBEX_ObjectSetRsp(obj, OBEX_RSP_FORBIDDEN, OBEX_RSP_FORBIDDEN); - return; - } + if (root) + return OBEX_RSP_FORBIDDEN; - fullname = g_path_get_dirname(os->current_folder); - g_free(os->current_folder); - os->current_folder = g_strdup(fullname); + fullname = g_path_get_dirname(current_folder); + obex_set_folder(os, fullname); g_free(fullname); - debug("Set to parent path: %s", os->current_folder); + debug("Set to parent path: %s", current_folder); - OBEX_ObjectSetRsp(obj, OBEX_RSP_SUCCESS, OBEX_RSP_SUCCESS); - return; + return OBEX_RSP_SUCCESS; } - if (!os->name) { - OBEX_ObjectSetRsp(obj, OBEX_RSP_CONTINUE, OBEX_RSP_BAD_REQUEST); + if (!name) { debug("Set path failed: name missing!"); - return; + return OBEX_RSP_BAD_REQUEST; } - if (strlen(os->name) == 0) { + if (strlen(name) == 0) { debug("Set to root"); - g_free(os->current_folder); - os->current_folder = g_strdup(os->server->folder); - - OBEX_ObjectSetRsp(obj, OBEX_RSP_SUCCESS, OBEX_RSP_SUCCESS); - return; + obex_set_folder(os, root_folder); + return OBEX_RSP_SUCCESS; } /* Check and set to name path */ - if (strstr(os->name, "/") || strcmp(os->name, "..") == 0) { - OBEX_ObjectSetRsp(obj, OBEX_RSP_FORBIDDEN, OBEX_RSP_FORBIDDEN); + if (strstr(name, "/") || strcmp(name, "..") == 0) { error("Set path failed: name incorrect!"); - return; + return OBEX_RSP_FORBIDDEN; } - fullname = g_build_filename(os->current_folder, os->name, NULL); + fullname = g_build_filename(current_folder, name, NULL); debug("Fullname: %s", fullname); - if (root && os->server->symlinks) + if (root && obex_get_symlinks(os)) err = stat(fullname, &dstat); else err = lstat(fullname, &dstat); @@ -377,38 +368,35 @@ static void ftp_setpath(obex_t *obex, obex_object_t *obj) if (err == ENOENT) goto not_found; - OBEX_ObjectSetRsp(obj, OBEX_RSP_FORBIDDEN, OBEX_RSP_FORBIDDEN); + rsp = OBEX_RSP_FORBIDDEN; goto done; } if (S_ISDIR(dstat.st_mode) && (dstat.st_mode & S_IRUSR) && (dstat.st_mode & S_IXUSR)) { - g_free(os->current_folder); - os->current_folder = g_strdup(fullname); - OBEX_ObjectSetRsp(obj, OBEX_RSP_SUCCESS, OBEX_RSP_SUCCESS); + obex_set_folder(os, fullname); goto done; } - OBEX_ObjectSetRsp(obj, OBEX_RSP_FORBIDDEN, OBEX_RSP_FORBIDDEN); + rsp = OBEX_RSP_FORBIDDEN; goto done; not_found: if (nonhdr[0] != 0) { - OBEX_ObjectSetRsp(obj, OBEX_RSP_NOT_FOUND, OBEX_RSP_NOT_FOUND); + rsp = OBEX_RSP_NOT_FOUND; goto done; } if (mkdir(fullname, 0755) < 0) { - OBEX_ObjectSetRsp(obj, OBEX_RSP_FORBIDDEN, OBEX_RSP_FORBIDDEN); + rsp = OBEX_RSP_FORBIDDEN; goto done; } - g_free(os->current_folder); - os->current_folder = g_strdup(fullname); - OBEX_ObjectSetRsp(obj, OBEX_RSP_SUCCESS, OBEX_RSP_SUCCESS); + obex_set_folder(os, fullname); done: g_free(fullname); + return rsp; } static void ftp_disconnect(struct OBEX_session *os) diff --git a/obexd/plugins/pbap.c b/obexd/plugins/pbap.c index bb518fa23..4efdf23b8 100644 --- a/obexd/plugins/pbap.c +++ b/obexd/plugins/pbap.c @@ -459,84 +459,75 @@ static gboolean pbap_is_valid_folder(struct obex_session *session) return FALSE; } -static void pbap_setpath(obex_t *obex, obex_object_t *obj) +static obex_rsp_t pbap_setpath(struct OBEX_session *os, obex_object_t *obj) { - struct obex_session *session = OBEX_GetUserData(obex); + const gchar *current_folder, *name; guint8 *nonhdr; gchar *fullname; if (OBEX_ObjectGetNonHdrData(obj, &nonhdr) != 2) { - OBEX_ObjectSetRsp(obj, OBEX_RSP_CONTINUE, - OBEX_RSP_PRECONDITION_FAILED); error("Set path failed: flag and constants not found!"); - return; + return OBEX_RSP_PRECONDITION_FAILED; } + current_folder = obex_get_folder(os); + name = obex_session_get_name(os); + /* Check "Backup" flag */ if ((nonhdr[0] & 0x01) == 0x01) { debug("Set to parent path"); - if (session->current_folder == NULL) { + if (current_folder == NULL) { /* we are already in top level folder */ - OBEX_ObjectSetRsp(obj, OBEX_RSP_FORBIDDEN, - OBEX_RSP_FORBIDDEN); - return; + return OBEX_RSP_FORBIDDEN; } - fullname = g_path_get_dirname(session->current_folder); - g_free(session->current_folder); + fullname = g_path_get_dirname(current_folder); if (strlen(fullname) == 1 && *fullname == '.') - session->current_folder = NULL; + obex_set_folder(os, NULL); else - session->current_folder = g_strdup(fullname); + obex_set_folder(os, fullname); g_free(fullname); - debug("Set to parent path: %s", session->current_folder); + debug("Set to parent path: %s", current_folder); - OBEX_ObjectSetRsp(obj, OBEX_RSP_SUCCESS, OBEX_RSP_SUCCESS); - return; + return OBEX_RSP_SUCCESS; } - if (!session->name) { - OBEX_ObjectSetRsp(obj, OBEX_RSP_CONTINUE, OBEX_RSP_BAD_REQUEST); + if (!name) { error("Set path failed: name missing!"); - return; + return OBEX_RSP_BAD_REQUEST; } - if (strlen(session->name) == 0) { + if (strlen(name) == 0) { debug("Set to root"); - g_free(session->current_folder); - session->current_folder = NULL; + obex_set_folder(os, NULL); - OBEX_ObjectSetRsp(obj, OBEX_RSP_SUCCESS, OBEX_RSP_SUCCESS); - return; + return OBEX_RSP_SUCCESS; } /* Check and set to name path */ - if (strstr(session->name, "/")) { - OBEX_ObjectSetRsp(obj, OBEX_RSP_FORBIDDEN, OBEX_RSP_FORBIDDEN); + if (strstr(name, "/")) { error("Set path failed: name incorrect!"); - return; + return OBEX_RSP_FORBIDDEN; } - if (pbap_is_valid_folder(session) == FALSE) { - OBEX_ObjectSetRsp(obj, OBEX_RSP_NOT_FOUND, OBEX_RSP_NOT_FOUND); - return; - } + if (pbap_is_valid_folder(os) == FALSE) + return OBEX_RSP_NOT_FOUND; - if (session->current_folder == NULL) - fullname = g_build_filename("", session->name, NULL); + if (current_folder == NULL) + fullname = g_build_filename("", name, NULL); else - fullname = g_build_filename(session->current_folder, session->name, NULL); + fullname = g_build_filename(current_folder, name, NULL); debug("Fullname: %s", fullname); - g_free(session->current_folder); - session->current_folder = fullname; - OBEX_ObjectSetRsp(obj, OBEX_RSP_SUCCESS, OBEX_RSP_SUCCESS); + obex_set_folder(os, fullname); + + return OBEX_RSP_SUCCESS; } static void pbap_disconnect(struct OBEX_session *os) diff --git a/obexd/src/obex.c b/obexd/src/obex.c index e493c1425..086ca5ef7 100644 --- a/obexd/src/obex.c +++ b/obexd/src/obex.c @@ -387,6 +387,7 @@ static void cmd_setpath(struct obex_session *os, { obex_headerdata_t hd; guint32 hlen; + obex_rsp_t rsp; guint8 hi; if (!os->service) { @@ -428,7 +429,8 @@ static void cmd_setpath(struct obex_session *os, break; } - os->service->setpath(obex, obj); + rsp = os->service->setpath(os, obj); + os_set_response(obj, rsp); } int obex_stream_start(struct OBEX_session *os, gchar *filename) @@ -1101,12 +1103,34 @@ const char *obex_session_get_name(struct OBEX_session *os) return os->name; } +ssize_t obex_session_get_size(struct OBEX_session *os) +{ + return os->size; +} + const char *obex_session_get_type(struct OBEX_session *os) { return os->type; } -ssize_t obex_session_get_size(struct OBEX_session *os) +const char *obex_get_folder(struct OBEX_session *os) { - return os->size; + return os->current_folder; +} + +void obex_set_folder(struct OBEX_session *os, const gchar *folder) +{ + g_free(os->current_folder); + + os->current_folder = (folder ? g_strdup(folder) : NULL); +} + +const char *obex_get_root_folder(struct OBEX_session *os) +{ + return os->server->folder; +} + +gboolean obex_get_symlinks(struct OBEX_session *os) +{ + return os->server->symlinks; } diff --git a/obexd/src/obex.h b/obexd/src/obex.h index 4d4f60a18..527d42d6c 100644 --- a/obexd/src/obex.h +++ b/obexd/src/obex.h @@ -101,7 +101,10 @@ int tty_init(gint service, const gchar *folder, const gchar *capability, void tty_closed(void); const char *obex_session_get_name(struct OBEX_session *os); - ssize_t obex_session_get_size(struct OBEX_session *os); - const char *obex_session_get_type(struct OBEX_session *os); +const char *obex_get_folder(struct OBEX_session *os); +void obex_set_folder(struct OBEX_session *os, const char *folder); +const char *obex_get_root_folder(struct OBEX_session *os); +gboolean obex_get_symlinks(struct OBEX_session *os); + diff --git a/obexd/src/service.h b/obexd/src/service.h index 514620489..2955afe37 100644 --- a/obexd/src/service.h +++ b/obexd/src/service.h @@ -37,7 +37,7 @@ struct obex_service_driver { obex_rsp_t (*get) (struct OBEX_session *os); void (*put) (obex_t *obex, obex_object_t *obj); gint (*chkput) (obex_t *obex, obex_object_t *obj); - void (*setpath) (obex_t *obex, obex_object_t *obj); + obex_rsp_t (*setpath) (struct OBEX_session *os, obex_object_t *obj); void (*disconnect) (struct OBEX_session *os); void (*reset) (struct OBEX_session *os); }; -- 2.47.3