diff --git a/obexd/plugins/ftp.c b/obexd/plugins/ftp.c
index 0bd5a5e..21c369d 100644
--- a/obexd/plugins/ftp.c
+++ b/obexd/plugins/ftp.c
return obex_stream_start(os, file);
}
-static obex_rsp_t ftp_connect(struct OBEX_session *os)
+static int ftp_connect(struct OBEX_session *os)
{
manager_register_session(os);
- return OBEX_RSP_SUCCESS;
+ return 0;
}
-static obex_rsp_t ftp_get(struct OBEX_session *os, obex_object_t *obj)
+static int ftp_get(struct OBEX_session *os, obex_object_t *obj)
{
const char *folder = obex_get_folder(os);
const char *type = obex_get_type(os);
goto fail;
}
- return OBEX_RSP_SUCCESS;
+ return 0;
fail:
- switch (err) {
- case -ENOENT:
- return OBEX_RSP_NOT_FOUND;
-
- default:
- return OBEX_RSP_FORBIDDEN;
- }
+ return err;
}
static gint ftp_delete(struct OBEX_session *os)
return obex_prepare_put(os);
}
-static obex_rsp_t ftp_put(struct OBEX_session *os)
+static int ftp_put(struct OBEX_session *os)
{
const char *folder = obex_get_folder(os);
const char *name = obex_get_name(os);
ssize_t size = obex_get_size(os);
- int ret = 0;
if (folder == NULL)
- return OBEX_RSP_FORBIDDEN;
+ return -EPERM;
if (name == NULL)
- return OBEX_RSP_BAD_REQUEST;
+ return -EBADR;
if (size == OBJECT_SIZE_DELETE)
- ret = ftp_delete(os);
-
- switch (ret) {
- case 0:
- return OBEX_RSP_SUCCESS;
- case -ENOENT:
- return OBEX_RSP_NOT_FOUND;
- case -ENOTEMPTY:
- return OBEX_RSP_PRECONDITION_FAILED;
- default:
- return OBEX_RSP_FORBIDDEN;
- }
+ return ftp_delete(os);
+
+ return 0;
}
-static obex_rsp_t ftp_setpath(struct OBEX_session *os, obex_object_t *obj)
+static int ftp_setpath(struct OBEX_session *os, obex_object_t *obj)
{
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;
if (OBEX_ObjectGetNonHdrData(obj, &nonhdr) != 2) {
error("Set path failed: flag and constants not found!");
- return OBEX_RSP_PRECONDITION_FAILED;
+ return -EBADMSG;
}
name = obex_get_name(os);
debug("Set to parent path");
if (root)
- return OBEX_RSP_FORBIDDEN;
+ return -EPERM;
fullname = g_path_get_dirname(current_folder);
obex_set_folder(os, fullname);
debug("Set to parent path: %s", current_folder);
- return OBEX_RSP_SUCCESS;
+ return 0;
}
if (!name) {
debug("Set path failed: name missing!");
- return OBEX_RSP_BAD_REQUEST;
+ return -EINVAL;
}
if (strlen(name) == 0) {
debug("Set to root");
obex_set_folder(os, root_folder);
- return OBEX_RSP_SUCCESS;
+ return 0;
}
/* Check and set to name path */
if (strstr(name, "/") || strcmp(name, "..") == 0) {
error("Set path failed: name incorrect!");
- return OBEX_RSP_FORBIDDEN;
+ return -EPERM;
}
fullname = g_build_filename(current_folder, name, NULL);
if (err == ENOENT)
goto not_found;
- rsp = OBEX_RSP_FORBIDDEN;
goto done;
}
goto done;
}
- rsp = OBEX_RSP_FORBIDDEN;
+ err = -EPERM;
goto done;
not_found:
if (nonhdr[0] != 0) {
- rsp = OBEX_RSP_NOT_FOUND;
+ err = -ENOENT;
goto done;
}
if (mkdir(fullname, 0755) < 0) {
- rsp = OBEX_RSP_FORBIDDEN;
+ err = -EPERM;
goto done;
}
done:
g_free(fullname);
- return rsp;
+ return err;
}
static void ftp_disconnect(struct OBEX_session *os)
diff --git a/obexd/plugins/opp.c b/obexd/plugins/opp.c
index 3325d08..c7ddf80 100644
--- a/obexd/plugins/opp.c
+++ b/obexd/plugins/opp.c
</attribute> \
</record>"
-static obex_rsp_t opp_connect(struct OBEX_session *os)
+static int opp_connect(struct OBEX_session *os)
{
manager_register_transfer(os);
- return OBEX_RSP_SUCCESS;
+ return 0;
}
static void opp_progress(struct OBEX_session *os)
return obex_prepare_put(os);
}
-static obex_rsp_t opp_put(struct OBEX_session *os)
+static int opp_put(struct OBEX_session *os)
{
const char *name = obex_get_name(os);
const char *folder = obex_get_folder(os);
if (folder == NULL)
- return OBEX_RSP_FORBIDDEN;
+ return -EPERM;
if (name == NULL)
- return OBEX_RSP_BAD_REQUEST;
+ return -EBADR;
- return OBEX_RSP_SUCCESS;
+ return 0;
}
-static obex_rsp_t opp_get(struct OBEX_session *os, obex_object_t *obj)
+static int opp_get(struct OBEX_session *os, obex_object_t *obj)
{
const char *type;
if (obex_get_name(os) == NULL)
- return OBEX_RSP_FORBIDDEN;
+ return -EPERM;
type = obex_get_type(os);
if (type == NULL)
- return OBEX_RSP_FORBIDDEN;
+ return -EPERM;
if (g_str_equal(type, VCARD_TYPE)) {
if (obex_stream_start(os, VCARD_FILE) < 0)
- return OBEX_RSP_NOT_FOUND;
+ return -ENOENT;
} else
- return OBEX_RSP_FORBIDDEN;
+ return -EPERM;
- return OBEX_RSP_SUCCESS;
+ return 0;
}
static void opp_disconnect(struct OBEX_session *os)
diff --git a/obexd/plugins/pbap.c b/obexd/plugins/pbap.c
index 9a8d8f5..91c1712 100644
--- a/obexd/plugins/pbap.c
+++ b/obexd/plugins/pbap.c
0x79, 0x61, 0x35, 0xF0, 0xF0, 0xC5, 0x11, 0xD8,
0x09, 0x66, 0x08, 0x00, 0x20, 0x0C, 0x9A, 0x66 };
-static obex_rsp_t pbap_connect(struct OBEX_session *os)
+static int pbap_connect(struct OBEX_session *os)
{
manager_register_session(os);
- return OBEX_RSP_SUCCESS;
+ return 0;
}
-static obex_rsp_t pbap_get(struct OBEX_session *os, obex_object_t *obj)
+static int pbap_get(struct OBEX_session *os, obex_object_t *obj)
{
const gchar *type = obex_get_type(os);
const gchar *folder = obex_get_folder(os);
gint ret;
if (type == NULL)
- return OBEX_RSP_BAD_REQUEST;
+ return -EBADR;
if (strcmp(type, PHONEBOOK_TYPE) == 0)
/* Always contains the absolute path */
/* Always relative */
path = g_build_filename(folder, name, NULL);
else
- return OBEX_RSP_BAD_REQUEST;
+ return -EBADR;
ret = obex_stream_start(os, path);
g_free(path);
- switch (ret) {
- case 0:
- return OBEX_RSP_SUCCESS;
- case -ENOENT:
- return OBEX_RSP_NOT_FOUND;
- default:
- return OBEX_RSP_FORBIDDEN;
-
- }
+ return ret;
}
static gboolean pbap_is_valid_folder(struct obex_session *session)
return FALSE;
}
-static obex_rsp_t pbap_setpath(struct OBEX_session *os, obex_object_t *obj)
+static int pbap_setpath(struct OBEX_session *os, obex_object_t *obj)
{
const gchar *current_folder, *name;
guint8 *nonhdr;
if (OBEX_ObjectGetNonHdrData(obj, &nonhdr) != 2) {
error("Set path failed: flag and constants not found!");
- return OBEX_RSP_PRECONDITION_FAILED;
+ return -EBADMSG;
}
current_folder = obex_get_folder(os);
if (current_folder == NULL) {
/* we are already in top level folder */
- return OBEX_RSP_FORBIDDEN;
+ return -EPERM;
}
fullname = g_path_get_dirname(current_folder);
debug("Set to parent path: %s", current_folder);
- return OBEX_RSP_SUCCESS;
+ return 0;
}
if (!name) {
error("Set path failed: name missing!");
- return OBEX_RSP_BAD_REQUEST;
+ return -EBADR;
}
if (strlen(name) == 0) {
obex_set_folder(os, NULL);
- return OBEX_RSP_SUCCESS;
+ return 0;
}
/* Check and set to name path */
if (strstr(name, "/")) {
error("Set path failed: name incorrect!");
- return OBEX_RSP_FORBIDDEN;
+ return -EPERM;
}
if (pbap_is_valid_folder(os) == FALSE)
- return OBEX_RSP_NOT_FOUND;
+ return -ENOENT;
if (current_folder == NULL)
fullname = g_build_filename("", name, NULL);
obex_set_folder(os, fullname);
- return OBEX_RSP_SUCCESS;
+ return 0;
}
static void pbap_disconnect(struct OBEX_session *os)
diff --git a/obexd/plugins/syncevolution.c b/obexd/plugins/syncevolution.c
index 60cd15d..8abd287 100644
--- a/obexd/plugins/syncevolution.c
+++ b/obexd/plugins/syncevolution.c
#include <string.h>
#include <stdio.h>
+#include <errno.h>
#include <glib.h>
#include <dbus/dbus.h>
dbus_message_unref(reply);
}
-static obex_rsp_t synce_connect(struct OBEX_session *os)
+static int synce_connect(struct OBEX_session *os)
{
DBusConnection *conn;
GError *err = NULL;
/* FIXME: broken */
OBEX_SuspendRequest(obex, obj);
#endif
- return OBEX_RSP_SUCCESS;
+ return 0;
failed:
- return OBEX_RSP_FORBIDDEN;
+ return -EPERM;
}
-static obex_rsp_t synce_put(struct OBEX_session *os)
+static int synce_put(struct OBEX_session *os)
{
struct synce_context *context;
DBusMessage *msg;
context = find_context(os);
if (!context)
- return OBEX_RSP_SERVICE_UNAVAILABLE;
+ return -EFAULT;
if (!context->conn_obj)
- return OBEX_RSP_SERVICE_UNAVAILABLE;
+ return -EFAULT;
msg = dbus_message_new_method_call(SYNCE_BUS_NAME, context->conn_obj,
SYNCE_CONN_INTERFACE, "Process");
if (!msg)
- return OBEX_RSP_SERVICE_UNAVAILABLE;
+ return -EFAULT;
dbus_message_iter_init_append(msg, &iter);
dbus_message_iter_open_container(&iter, DBUS_TYPE_ARRAY,
&call, -1)) {
error("D-Bus call to %s failed.", SYNCE_CONN_INTERFACE);
dbus_message_unref(msg);
- return OBEX_RSP_FORBIDDEN;
+ return -EPERM;
}
dbus_pending_call_set_notify(call, process_cb, os, NULL);
dbus_message_unref(msg);
dbus_pending_call_unref(call);
- return OBEX_RSP_SUCCESS;
+ return 0;
}
-static obex_rsp_t synce_get(struct OBEX_session *os, obex_object_t *obj)
+static int synce_get(struct OBEX_session *os, obex_object_t *obj)
{
struct synce_context *context;
context = find_context(os);
if (!context)
- return OBEX_RSP_FORBIDDEN;
+ return -EPERM;
- return OBEX_RSP_SUCCESS;
+ return 0;
}
static void close_cb(DBusPendingCall *call, void *user_data)
diff --git a/obexd/src/obex.c b/obexd/src/obex.c
index 3e4dea3..54ae5af 100644
--- a/obexd/src/obex.c
+++ b/obexd/src/obex.c
guint16 mtu;
} __attribute__ ((packed)) obex_connect_hdr_t;
-static void os_set_response(obex_object_t *obj, obex_rsp_t lastrsp)
+static void os_set_response(obex_object_t *obj, int err)
{
guint8 rsp;
+ guint8 lastrsp;
- switch (lastrsp) {
- case OBEX_RSP_SUCCESS:
+ switch (err) {
+ case 0:
rsp = OBEX_RSP_CONTINUE;
+ lastrsp = OBEX_RSP_SUCCESS;
+ break;
+ case -EPERM:
+ rsp = OBEX_RSP_FORBIDDEN;
+ lastrsp = OBEX_RSP_FORBIDDEN;
+ break;
+ case -ENOENT:
+ rsp = OBEX_RSP_NOT_FOUND;
+ lastrsp = OBEX_RSP_NOT_FOUND;
+ break;
+ case -EBADR:
+ rsp = OBEX_RSP_BAD_REQUEST;
+ lastrsp = OBEX_RSP_BAD_REQUEST;
+ break;
+ case -EFAULT:
+ rsp = OBEX_RSP_SERVICE_UNAVAILABLE;
+ lastrsp = OBEX_RSP_SERVICE_UNAVAILABLE;
+ break;
+ case -EINVAL:
+ rsp = OBEX_RSP_NOT_IMPLEMENTED;
+ lastrsp = OBEX_RSP_NOT_IMPLEMENTED;
break;
default:
- rsp = lastrsp;
+ rsp = OBEX_RSP_INTERNAL_SERVER_ERROR;
+ lastrsp = OBEX_RSP_INTERNAL_SERVER_ERROR;
}
OBEX_ObjectSetRsp(obj, rsp, lastrsp);
guint8 hi;
const guint8 *target = NULL, *who = NULL;
guint target_size = 0, who_size = 0;
- obex_rsp_t rsp;
+ int err;
if (OBEX_ObjectGetNonHdrData(obj, &buffer) != sizeof(*nonhdr)) {
OBEX_ObjectSetRsp(obj, OBEX_RSP_FORBIDDEN, OBEX_RSP_FORBIDDEN);
return;
}
- rsp = os->service->connect(os);
- if (rsp == OBEX_RSP_SUCCESS && os->service->target) {
+ err = os->service->connect(os);
+ if (err == 0 && os->service->target) {
hd.bs = os->service->target;
OBEX_ObjectAddHeader(obex, obj,
OBEX_HDR_WHO, hd, 16,
OBEX_FL_FIT_ONE_PACKET);
}
- os_set_response(obj, rsp);
+ os_set_response(obj, err);
}
static gboolean chk_cid(obex_t *obex, obex_object_t *obj, guint32 cid)
obex_headerdata_t hd;
guint hlen;
guint8 hi;
- guint rsp;
+ int err;
if (!os->service) {
OBEX_ObjectSetRsp(obj, OBEX_RSP_FORBIDDEN, OBEX_RSP_FORBIDDEN);
}
}
- rsp = os->service->get(os, obj);
- if (rsp == OBEX_RSP_SUCCESS) {
+ err = os->service->get(os, obj);
+ if (err == 0) {
if (os->size != OBJECT_SIZE_UNKNOWN) {
hd.bq4 = os->size;
OBEX_ObjectAddHeader(obex, obj,
hd, 0, OBEX_FL_STREAM_START);
}
- os_set_response(obj, rsp);
+ os_set_response(obj, err);
}
static void cmd_setpath(struct obex_session *os,
{
obex_headerdata_t hd;
guint32 hlen;
- obex_rsp_t rsp;
+ int err;
guint8 hi;
if (!os->service) {
break;
}
- rsp = os->service->setpath(os, obj);
- os_set_response(obj, rsp);
+ err = os->service->setpath(os, obj);
+ os_set_response(obj, err);
}
int obex_stream_start(struct OBEX_session *os, const gchar *filename)
diff --git a/obexd/src/service.h b/obexd/src/service.h
index b6fc289..6080d1c 100644
--- a/obexd/src/service.h
+++ b/obexd/src/service.h
*
*/
-typedef guint8 obex_rsp_t;
-
struct obex_service_driver {
const char *name;
guint16 service;
const guint8 *who;
guint who_size;
const gchar *record;
- obex_rsp_t (*connect) (struct OBEX_session *os);
+ int (*connect) (struct OBEX_session *os);
void (*progress) (struct OBEX_session *os);
- obex_rsp_t (*get) (struct OBEX_session *os, obex_object_t *obj);
- obex_rsp_t (*put) (struct OBEX_session *os);
+ int (*get) (struct OBEX_session *os, obex_object_t *obj);
+ int (*put) (struct OBEX_session *os);
gint (*chkput) (struct OBEX_session *os);
- obex_rsp_t (*setpath) (struct OBEX_session *os, obex_object_t *obj);
+ int (*setpath) (struct OBEX_session *os, obex_object_t *obj);
void (*disconnect) (struct OBEX_session *os);
void (*reset) (struct OBEX_session *os);
};