diff --git a/obexd/plugins/ftp.c b/obexd/plugins/ftp.c
index 354eaad..dd9fde7 100644
--- a/obexd/plugins/ftp.c
+++ b/obexd/plugins/ftp.c
}
}
-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);
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 bb518fa..4efdf23 100644
--- a/obexd/plugins/pbap.c
+++ b/obexd/plugins/pbap.c
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 e493c14..086ca5e 100644
--- a/obexd/src/obex.c
+++ b/obexd/src/obex.c
{
obex_headerdata_t hd;
guint32 hlen;
+ obex_rsp_t rsp;
guint8 hi;
if (!os->service) {
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)
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 4d4f60a..527d42d 100644
--- a/obexd/src/obex.h
+++ b/obexd/src/obex.h
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 5146204..2955afe 100644
--- a/obexd/src/service.h
+++ b/obexd/src/service.h
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);
};