From 320dc79f0f0dec30fd08c68ca71737bab87b85ef Mon Sep 17 00:00:00 2001 From: Jaganath Kanakkassery Date: Fri, 2 Dec 2011 17:27:02 +0530 Subject: [PATCH] obexd: Fix file size issue in GetProperties In SendFiles, If application calls GetProperties before Request method returns then the file size is zero. --- obexd/client/session.c | 4 ++++ obexd/client/transfer.c | 39 +++++++++++++++++++++++---------------- obexd/client/transfer.h | 1 + 3 files changed, 28 insertions(+), 16 deletions(-) diff --git a/obexd/client/session.c b/obexd/client/session.c index f288ecd95..9f025129e 100644 --- a/obexd/client/session.c +++ b/obexd/client/session.c @@ -1277,6 +1277,10 @@ int obc_session_send(struct obc_session *session, const char *filename, if (transfer == NULL) return -EINVAL; + err = obc_transfer_set_file(transfer); + if (err < 0) + goto fail; + /* Transfer should start if it is the first in the pending list */ if (transfer != session->pending->data) return 0; diff --git a/obexd/client/transfer.c b/obexd/client/transfer.c index ef0912fe5..c48137831 100644 --- a/obexd/client/transfer.c +++ b/obexd/client/transfer.c @@ -569,8 +569,6 @@ int obc_transfer_put(struct obc_transfer *transfer, transfer_callback_t func, GObex *obex; GObexPacket *req; GObexDataProducer data_cb; - struct stat st; - int fd; if (transfer->xfer != 0) return -EALREADY; @@ -580,20 +578,6 @@ int obc_transfer_put(struct obc_transfer *transfer, transfer_callback_t func, goto done; } - fd = open(transfer->filename, O_RDONLY); - if (fd < 0) { - error("open(): %s(%d)", strerror(errno), errno); - return -errno; - } - - if (fstat(fd, &st) < 0) { - close(fd); - error("fstat(): %s(%d)", strerror(errno), errno); - return -errno; - } - - transfer->fd = fd; - transfer->size = st.st_size; data_cb = put_xfer_progress; done: @@ -673,3 +657,26 @@ gint64 obc_transfer_get_size(struct obc_transfer *transfer) { return transfer->size; } + +int obc_transfer_set_file(struct obc_transfer *transfer) +{ + int fd; + struct stat st; + + fd = open(transfer->filename, O_RDONLY); + if (fd < 0) { + error("open(): %s(%d)", strerror(errno), errno); + return -errno; + } + + if (fstat(fd, &st) < 0) { + error("fstat(): %s(%d)", strerror(errno), errno); + close(fd); + return -errno; + } + + transfer->fd = fd; + transfer->size = st.st_size; + + return 0; +} diff --git a/obexd/client/transfer.h b/obexd/client/transfer.h index ba53fd161..c051cbdec 100644 --- a/obexd/client/transfer.h +++ b/obexd/client/transfer.h @@ -55,3 +55,4 @@ void obc_transfer_clear_buffer(struct obc_transfer *transfer); void obc_transfer_set_name(struct obc_transfer *transfer, const char *name); const char *obc_transfer_get_path(struct obc_transfer *transfer); gint64 obc_transfer_get_size(struct obc_transfer *transfer); +int obc_transfer_set_file(struct obc_transfer *transfer); -- 2.47.3