Diff between f3aa8edebff9ad719dfb5db3b99a5a3ef647bfa3 and eaa0966ae0a319945211732958d7c929a3552103

Changed Files

File Additions Deletions Status
obexd/plugins/ftp.c +30 -42 modified
obexd/plugins/pbap.c +28 -37 modified
obexd/src/obex.c +27 -3 modified
obexd/src/obex.h +5 -2 modified
obexd/src/service.h +1 -1 modified

Full Patch

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
@@ -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 bb518fa..4efdf23 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 e493c14..086ca5e 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 4d4f60a..527d42d 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 5146204..2955afe 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);
 };