summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDorota Moskal <dorota.moskal@tieto.com>2012-09-27 13:22:22 +0200
committerSamuel Ortiz <sameo@linux.intel.com>2012-10-09 23:48:07 +0200
commitdc2bf6e8298ed528135717c8658ce6c92961b008 (patch)
tree930e6ae8e99ec6a6a1ae60f8e632f27fa1ad00a2
parent78dfcf7a3cb733051cbe6c19e24a1329adc9362e (diff)
downloadneard-dc2bf6e8298ed528135717c8658ce6c92961b008.tar.gz
neard-dc2bf6e8298ed528135717c8658ce6c92961b008.tar.bz2
neard-dc2bf6e8298ed528135717c8658ce6c92961b008.zip
nfctype3: Call write callback when writing failed
In some cases when writing was broken before allocating the cookie (e.g. when there was not enough space on tag) tag write callback wasn't called and writing was left 'in progress'.
-rw-r--r--plugins/nfctype3.c33
1 files changed, 26 insertions, 7 deletions
diff --git a/plugins/nfctype3.c b/plugins/nfctype3.c
index 5d88952..0fb444b 100644
--- a/plugins/nfctype3.c
+++ b/plugins/nfctype3.c
@@ -669,12 +669,20 @@ static int data_write(uint32_t adapter_idx, uint32_t target_idx,
uint16_t checksum, nmaxb;
uint8_t i, len = 0;
uint8_t *idm, *attr;
+ int err;
DBG("");
cookie = g_try_malloc0(sizeof(struct t3_cookie));
- if (cookie == NULL)
- return -ENOMEM;
+
+ if (cookie == NULL) {
+ err = -ENOMEM;
+
+ if (cb != NULL)
+ cb(adapter_idx, target_idx, err);
+
+ return err;
+ }
cookie->adapter_idx = adapter_idx;
cookie->target_idx = target_idx;
@@ -724,17 +732,28 @@ static int nfctype3_write(uint32_t adapter_idx, uint32_t target_idx,
near_tag_io_cb cb)
{
struct near_tag *tag;
+ int err;
DBG("");
- if (ndef == NULL || cb == NULL)
- return -EINVAL;
+ if (ndef == NULL || cb == NULL) {
+ err = -EINVAL;
+ goto out_err;
+ }
tag = near_tag_get_tag(adapter_idx, target_idx);
- if (tag == NULL)
- return -EINVAL;
+ if (tag == NULL) {
+ err = -EINVAL;
+ goto out_err;
+ }
+
+ err = data_write(adapter_idx, target_idx, ndef, tag, cb);
- return data_write(adapter_idx, target_idx, ndef, tag, cb);
+out_err:
+ if (cb != NULL)
+ cb(adapter_idx, target_idx, err);
+
+ return err;
}
static int check_presence(uint8_t *resp, int length, void *data)