diff --git a/obexd/src/ftp.c b/obexd/src/ftp.c
index 3fb2528..fea782c 100644
--- a/obexd/src/ftp.c
+++ b/obexd/src/ftp.c
struct obex_session *os;
guint8 *nonhdr;
gchar *fullname;
+ struct stat dstat;
os = OBEX_GetUserData(obex);
debug("Fullname: %s", fullname);
- if (g_file_test(fullname, G_FILE_TEST_IS_DIR)) {
- g_free(os->current_folder);
- os->current_folder = g_strdup(fullname);
+ if (lstat(fullname, &dstat) < 0) {
+ int err = errno;
+ debug("lstat: %s(%d)", strerror(err), err);
+ if (err == ENOENT)
+ goto not_found;
- OBEX_ObjectSetRsp(obj, OBEX_RSP_SUCCESS, OBEX_RSP_SUCCESS);
+ OBEX_ObjectSetRsp(obj, OBEX_RSP_FORBIDDEN, OBEX_RSP_FORBIDDEN);
goto done;
}
- if (!g_file_test(fullname, G_FILE_TEST_EXISTS) && nonhdr[0] == 0 &&
- mkdir(fullname, 0755) >= 0) {
+ if (S_ISDIR(dstat.st_mode) && (dstat.st_mode & S_IRUSR)) {
g_free(os->current_folder);
os->current_folder = g_strdup(fullname);
OBEX_ObjectSetRsp(obj, OBEX_RSP_SUCCESS, OBEX_RSP_SUCCESS);
goto done;
-
}
OBEX_ObjectSetRsp(obj, OBEX_RSP_FORBIDDEN, OBEX_RSP_FORBIDDEN);
+ goto done;
+
+not_found:
+ if (nonhdr[0] == 0 && mkdir(fullname, 0755) >= 0) {
+ g_free(os->current_folder);
+ os->current_folder = g_strdup(fullname);
+ OBEX_ObjectSetRsp(obj, OBEX_RSP_SUCCESS, OBEX_RSP_SUCCESS);
+ } else
+ OBEX_ObjectSetRsp(obj, OBEX_RSP_NOT_FOUND, OBEX_RSP_NOT_FOUND);
+
done:
g_free(fullname);
}