From fce1942401571af6ae1ca9e93081a8dee1fa306e Mon Sep 17 00:00:00 2001 From: Wiktor Lawski Date: Thu, 27 Sep 2012 10:31:26 +0200 Subject: [PATCH] adapter: Refactor function near_adapter_send Now this function will release allocated data using callback, so it will be unnecessary to check its returned error code (if callback was passed). Main reasons to prepare this change were improvement of code readability and removing error prone code paths. --- include/adapter.h | 4 +++- plugins/mifare.c | 25 +++++--------------- plugins/nfctype1.c | 69 ++++++++++++++++++++---------------------------------- plugins/nfctype2.c | 50 +++++++++++---------------------------- plugins/nfctype3.c | 62 +++++++++++++++++++----------------------------- plugins/nfctype4.c | 49 +++++++++++++++++++------------------- src/adapter.c | 23 ++++++++++++------ 7 files changed, 112 insertions(+), 170 deletions(-) diff --git a/include/adapter.h b/include/adapter.h index faf32ba..e547d3d 100644 --- a/include/adapter.h +++ b/include/adapter.h @@ -27,10 +27,12 @@ #include typedef int (*near_recv)(uint8_t *resp, int length, void *data); +typedef int (*near_release)(int err, void *data); int near_adapter_connect(uint32_t idx, uint32_t target_idx, uint8_t protocol); int near_adapter_disconnect(uint32_t idx); -int near_adapter_send(uint32_t idx, uint8_t *buf, size_t length, near_recv rx_cb, void *data); +int near_adapter_send(uint32_t idx, uint8_t *buf, size_t length, + near_recv rx_cb, void *data, near_release data_rel); int near_adapter_recv(uint32_t idx, uint8_t *buf, size_t length); #endif diff --git a/plugins/mifare.c b/plugins/mifare.c index 72120fe..0af07da 100644 --- a/plugins/mifare.c +++ b/plugins/mifare.c @@ -253,8 +253,7 @@ static int mifare_unlock_sector(int block_id, return near_adapter_send(cookie->adapter_idx, (uint8_t *)&cmd, sizeof(cmd) - NFC_NFCID1_MAXSIZE + cookie->nfcid1_len, - next_far_fct, - cookie); + next_far_fct, cookie, mifare_release); } /* @@ -276,9 +275,8 @@ static int mifare_read_block(uint8_t block_id, cmd.cmd = MF_CMD_READ; /* MIFARE READ */ cmd.block = block_id; - return near_adapter_send(mf_ck->adapter_idx, - (uint8_t *) &cmd, 2, - far_func, data); + return near_adapter_send(mf_ck->adapter_idx, (uint8_t *) &cmd, 2, + far_func, mf_ck, mifare_release); } static int mifare_read_sector_cb(uint8_t *resp, int length, void *data) @@ -731,7 +729,6 @@ int mifare_check_presence(uint32_t adapter_idx, uint32_t target_idx, struct mifare_cmd cmd; struct mifare_cookie *cookie; uint8_t *key_ref = MAD_public_key; - int err; DBG(""); @@ -772,21 +769,11 @@ int mifare_check_presence(uint32_t adapter_idx, uint32_t target_idx, /* add the UID */ memcpy(&cmd.nfcid, cookie->nfcid1, cookie->nfcid1_len); - err = near_adapter_send(cookie->adapter_idx, + return near_adapter_send(cookie->adapter_idx, (uint8_t *) &cmd, sizeof(cmd) - NFC_NFCID1_MAXSIZE + cookie->nfcid1_len, check_presence, - cookie); - - if (err < 0) - goto out_err; - - return err; - -out_err: - mifare_release(err, cookie); - - return err; + cookie, mifare_release); } /* @@ -817,7 +804,7 @@ static int mifare_write_block(uint8_t block_id, void *data, return near_adapter_send(mf_ck->adapter_idx, (uint8_t *) &cmd, sizeof(cmd), - far_func, data); + far_func, data, NULL); } static int mifare_correct_length_cb(uint8_t *resp, int length, void *data) diff --git a/plugins/nfctype1.c b/plugins/nfctype1.c index 4042429..b9de211 100644 --- a/plugins/nfctype1.c +++ b/plugins/nfctype1.c @@ -172,11 +172,9 @@ static int data_recv(uint8_t *resp, int length, void *data) t1_cmd.cmd = CMD_READ_SEGS; t1_cmd.addr = (t1_tag->current_seg << 4) & 0xFF; - err = near_adapter_send(t1_tag->adapter_idx, + return near_adapter_send(t1_tag->adapter_idx, (uint8_t *) &t1_cmd, sizeof(t1_cmd), - data_recv, t1_tag); - if (err < 0) - goto out_err; + data_recv, t1_tag, NULL); } else { /* This is the end */ GList *records; @@ -240,7 +238,7 @@ static int read_dynamic_tag(uint8_t *cc, int length, void *data) return near_adapter_send(t1_tag->adapter_idx, (uint8_t *)&t1_cmd, sizeof(t1_cmd), - data_recv, t1_tag); + data_recv, t1_tag, NULL); } static int meta_recv(uint8_t *resp, int length, void *data) @@ -391,7 +389,7 @@ static int rid_resp(uint8_t *resp, int length, void *data) return near_adapter_send(cookie->adapter_idx, (uint8_t *)&t1_cmd, sizeof(t1_cmd), - meta_recv, cookie); + meta_recv, cookie, t1_cookie_release); out_err: DBG("err %d", err); @@ -407,7 +405,6 @@ static int nfctype1_read_meta(uint32_t adapter_idx, uint32_t target_idx, { struct type1_cmd cmd; struct t1_cookie *cookie; - int err; DBG(""); @@ -426,19 +423,16 @@ static int nfctype1_read_meta(uint32_t adapter_idx, uint32_t target_idx, memcpy(cmd.uid, uid, UID_LENGTH); memcpy(cookie->uid, uid, UID_LENGTH); - err = near_adapter_send(adapter_idx, (uint8_t *) &cmd, - sizeof(cmd), meta_recv, cookie); + return near_adapter_send(adapter_idx, (uint8_t *) &cmd, + sizeof(cmd), meta_recv, cookie, + t1_cookie_release); } else { cmd.cmd = CMD_RID; - err = near_adapter_send(adapter_idx, (uint8_t *) &cmd, - sizeof(cmd), rid_resp, cookie); + return near_adapter_send(adapter_idx, (uint8_t *) &cmd, + sizeof(cmd), rid_resp, cookie, + t1_cookie_release); } - - if (err < 0) - t1_cookie_release(err, cookie); - - return err; } /* First step: RID to get the tag UID */ @@ -502,7 +496,8 @@ static int write_nmn_e1(struct t1_cookie *cookie) memcpy(cmd.uid, cookie->uid, UID_LENGTH); return near_adapter_send(cookie->adapter_idx, (uint8_t *) &cmd, - sizeof(cmd), write_nmn_e1_resp, cookie); + sizeof(cmd), write_nmn_e1_resp, cookie, + t1_cookie_release); } static int data_write_resp(uint8_t *resp, int length, void *data) @@ -541,7 +536,8 @@ static int data_write_resp(uint8_t *resp, int length, void *data) cookie->current_byte++; err = near_adapter_send(cookie->adapter_idx, (uint8_t *) &cmd, - sizeof(cmd), data_write_resp, cookie); + sizeof(cmd), data_write_resp, cookie, + NULL); if (err < 0) goto out_err; @@ -592,15 +588,9 @@ static int data_write(uint32_t adapter_idx, uint32_t target_idx, g_free(uid); - err = near_adapter_send(cookie->adapter_idx, (uint8_t *) &cmd, - sizeof(cmd), data_write_resp, cookie); - if (err < 0) - goto out_err; - - return 0; - -out_err: - return t1_cookie_release(err, cookie); + return near_adapter_send(cookie->adapter_idx, (uint8_t *) &cmd, + sizeof(cmd), data_write_resp, cookie, + t1_cookie_release); } /* @@ -664,7 +654,6 @@ static int nfctype1_check_presence(uint32_t adapter_idx, struct type1_cmd t1_cmd; struct t1_cookie *cookie; uint8_t *uid, uid_length; - int err; DBG(""); @@ -689,15 +678,9 @@ static int nfctype1_check_presence(uint32_t adapter_idx, cookie->target_idx = target_idx; cookie->cb = cb; - err = near_adapter_send(adapter_idx, (uint8_t *) &t1_cmd, - sizeof(t1_cmd), check_presence, cookie); - if (err < 0) - goto out_err; - - return 0; - -out_err: - return t1_cookie_release(err, cookie); + return near_adapter_send(adapter_idx, (uint8_t *) &t1_cmd, + sizeof(t1_cmd), check_presence, cookie, + t1_cookie_release); } static int format_resp(uint8_t *resp, int length, void *data) @@ -723,12 +706,9 @@ static int format_resp(uint8_t *resp, int length, void *data) cookie->current_byte++; memcpy(cmd.uid, cookie->uid, UID_LENGTH); - err = near_adapter_send(cookie->adapter_idx, (uint8_t *) &cmd, - sizeof(cmd), format_resp, cookie); - if (err < 0) - goto out_err; - - return 0; + return near_adapter_send(cookie->adapter_idx, (uint8_t *) &cmd, + sizeof(cmd), format_resp, cookie, + t1_cookie_release); } else { tag = near_tag_get_tag(cookie->adapter_idx, cookie->target_idx); if (tag == NULL) { @@ -798,7 +778,8 @@ static int nfctype1_format(uint32_t adapter_idx, uint32_t target_idx, g_free(uid); err = near_adapter_send(cookie->adapter_idx, (uint8_t *) &cmd, - sizeof(cmd), format_resp, cookie); + sizeof(cmd), format_resp, cookie, + t1_cookie_release); if (err < 0) goto out_err; diff --git a/plugins/nfctype2.c b/plugins/nfctype2.c index 62f6d0e..db359a8 100644 --- a/plugins/nfctype2.c +++ b/plugins/nfctype2.c @@ -176,7 +176,7 @@ static int data_recv(uint8_t *resp, int length, void *data) return near_adapter_send(adapter_idx, (uint8_t *) &cmd, CMD_READ_SIZE, - data_recv, tag); + data_recv, tag, NULL); } static int data_read(struct type2_tag *tag) @@ -194,8 +194,8 @@ static int data_read(struct type2_tag *tag) adapter_idx = near_tag_get_adapter_idx(tag->tag); return near_adapter_send(adapter_idx, - (uint8_t *) &cmd, CMD_READ_SIZE, - data_recv, tag); + (uint8_t *) &cmd, CMD_READ_SIZE, + data_recv, tag, NULL); } static int meta_recv(uint8_t *resp, int length, void *data) @@ -280,7 +280,6 @@ static int nfctype2_read_meta(uint32_t adapter_idx, uint32_t target_idx, { struct type2_cmd cmd; struct t2_cookie *cookie; - int err; DBG(""); @@ -295,12 +294,8 @@ static int nfctype2_read_meta(uint32_t adapter_idx, uint32_t target_idx, cookie->target_idx = target_idx; cookie->cb = cb; - err = near_adapter_send(adapter_idx, (uint8_t *) &cmd, CMD_READ_SIZE, - meta_recv, cookie); - if (err < 0) - g_free(cookie); - - return err; + return near_adapter_send(adapter_idx, (uint8_t *) &cmd, CMD_READ_SIZE, + meta_recv, cookie, t2_cookie_release); } static int nfctype2_read(uint32_t adapter_idx, @@ -371,13 +366,9 @@ static int data_write_resp(uint8_t *resp, int length, void *data) cookie->ndef->offset = cookie->ndef->length + 1; } - err = near_adapter_send(cookie->adapter_idx, (uint8_t *) &cmd, - sizeof(cmd), data_write_resp, cookie); - - if (err < 0) - goto out_err; - - return 0; + return near_adapter_send(cookie->adapter_idx, (uint8_t *) &cmd, + sizeof(cmd), data_write_resp, cookie, + t2_cookie_release); out_err: if (err < 0 && cookie->cb) @@ -392,7 +383,6 @@ static int data_write(uint32_t adapter_idx, uint32_t target_idx, { struct type2_cmd cmd; struct t2_cookie *cookie; - int err; DBG(""); @@ -412,16 +402,9 @@ static int data_write(uint32_t adapter_idx, uint32_t target_idx, cookie->ndef->offset += BLOCK_SIZE; cookie->current_block++; - err = near_adapter_send(cookie->adapter_idx, (uint8_t *) &cmd, - sizeof(cmd), data_write_resp, cookie); - - if (err < 0) - goto out_err; - - return 0; - -out_err: - return t2_cookie_release(err, cookie); + return near_adapter_send(cookie->adapter_idx, (uint8_t *) &cmd, + sizeof(cmd), data_write_resp, cookie, + t2_cookie_release); } static int nfctype2_write(uint32_t adapter_idx, uint32_t target_idx, @@ -517,10 +500,8 @@ static int nfctype2_check_presence(uint32_t adapter_idx, uint32_t target_idx, cookie->cb = cb; err = near_adapter_send(adapter_idx, (uint8_t *) &cmd, - CMD_READ_SIZE, check_presence, cookie); - if (err < 0) - goto out_err; - + CMD_READ_SIZE, check_presence, cookie, + t2_cookie_release); break; /* Specific Mifare check presence */ case NEAR_TAG_NFC_T2_MIFARE_CLASSIC_1K: @@ -536,9 +517,6 @@ static int nfctype2_check_presence(uint32_t adapter_idx, uint32_t target_idx, } return err; - -out_err: - return t2_cookie_release(err, cookie); } static int format_resp(uint8_t *resp, int length, void *data) @@ -621,7 +599,7 @@ static int nfctype2_format(uint32_t adapter_idx, uint32_t target_idx, memcpy(cmd.data, (uint8_t *) t2_cc, BLOCK_SIZE); err = near_adapter_send(cookie->adapter_idx, (uint8_t *) &cmd, - sizeof(cmd), format_resp, cookie); + sizeof(cmd), format_resp, cookie, NULL); out_err: if (err < 0) { diff --git a/plugins/nfctype3.c b/plugins/nfctype3.c index ffb401a..955bc70 100644 --- a/plugins/nfctype3.c +++ b/plugins/nfctype3.c @@ -261,7 +261,7 @@ static int data_recv(uint8_t *resp, int length, void *data) tag->IDm, &cmd); err = near_adapter_send(adapter_idx, (uint8_t *) &cmd, cmd.len, - data_recv, tag); + data_recv, tag, NULL); if (err < 0) goto out_err; @@ -293,7 +293,7 @@ static int data_read(struct type3_tag *tag) return near_adapter_send(adapter_idx, (uint8_t *) &cmd, cmd.len, - data_recv, tag); + data_recv, tag, NULL); } /* Read block 0 to retrieve the data length */ @@ -397,7 +397,7 @@ static int poll_ndef_system_code(uint8_t *resp, int length, void *data) prepare_read_block(META_BLOCK_START, cookie->IDm, &cmd); err = near_adapter_send(cookie->adapter_idx, (uint8_t *) &cmd, - cmd.len, nfctype3_recv_block_0, cookie); + cmd.len, nfctype3_recv_block_0, cookie, NULL); if (err < 0) goto out_err; @@ -465,7 +465,7 @@ static int check_sys_op_in_mc_block(uint8_t *resp, int length, void *data) cmd.len = LEN_CMD + LEN_CMD_LEN + 4 ; err = near_adapter_send(cookie->adapter_idx, (uint8_t *) &cmd, - cmd.len , poll_ndef_system_code, cookie); + cmd.len , poll_ndef_system_code, cookie, NULL); } if (err < 0) @@ -508,7 +508,7 @@ static int receive_system_code(uint8_t *resp, int length, void *data) prepare_read_block(FELICA_LITE_MC_BLOCK, cookie->IDm, &cmd); err = near_adapter_send(cookie->adapter_idx, (uint8_t *) &cmd, cmd.len, check_sys_op_in_mc_block, - cookie); + cookie, NULL); break; case FELICA_LITE_S_IC_TYPE: @@ -523,7 +523,8 @@ static int receive_system_code(uint8_t *resp, int length, void *data) cmd.len = LEN_CMD + LEN_CMD_LEN + 4 ; err = near_adapter_send(cookie->adapter_idx, (uint8_t *) &cmd, - cmd.len, poll_ndef_system_code, cookie); + cmd.len, poll_ndef_system_code, cookie, + NULL); } if (err < 0) @@ -543,7 +544,6 @@ static int nfctype3_read(uint32_t adapter_idx, { struct type3_cmd cmd; struct t3_cookie *cookie; - int err; DBG(""); @@ -565,12 +565,9 @@ static int nfctype3_read(uint32_t adapter_idx, cookie->target_idx = target_idx; cookie->cb = cb; - err = near_adapter_send(adapter_idx, (uint8_t *) &cmd, - cmd.len, receive_system_code, cookie); - if (err < 0) - g_free(cookie); - - return err; + return near_adapter_send(adapter_idx, (uint8_t *) &cmd, cmd.len, + receive_system_code, cookie, + t3_cookie_release); } static int update_attr_block_cb(uint8_t *resp, int length, void *data) @@ -621,7 +618,8 @@ static int update_attr_block(struct t3_cookie *cookie) prepare_write_block(cookie->IDm, &cmd, 0, cookie->attr); return near_adapter_send(cookie->adapter_idx, (uint8_t *) &cmd, cmd.len, - update_attr_block_cb, cookie); + update_attr_block_cb, cookie, + t3_cookie_release); } static int data_write_resp(uint8_t *resp, int length, void *data) @@ -665,7 +663,7 @@ static int data_write_resp(uint8_t *resp, int length, void *data) cookie->ndef->offset += BLOCK_SIZE; err = near_adapter_send(cookie->adapter_idx, (uint8_t *) &cmd, cmd.len, - data_write_resp, cookie); + data_write_resp, cookie, NULL); if (err < 0) goto out_err; @@ -740,12 +738,9 @@ static int data_write(uint32_t adapter_idx, uint32_t target_idx, cookie->attr); cookie->current_block++; - err = near_adapter_send(adapter_idx, (uint8_t *) &cmd, cmd.len, - data_write_resp, cookie); - if (err < 0) - goto out_err; - - return 0; + return near_adapter_send(adapter_idx, (uint8_t *) &cmd, cmd.len, + data_write_resp, cookie, + t3_cookie_release); out_err: return t3_cookie_release(err, cookie); @@ -791,7 +786,6 @@ static int nfctype3_check_presence(uint32_t adapter_idx, { struct type3_cmd cmd; struct t3_cookie *cookie; - int err; DBG(""); @@ -813,16 +807,10 @@ static int nfctype3_check_presence(uint32_t adapter_idx, cookie->target_idx = target_idx; cookie->cb = cb; - err = near_adapter_send(adapter_idx, (uint8_t *) &cmd, - cmd.len, check_presence, cookie); - - if (err < 0) - goto out_err; - - return 0; + return near_adapter_send(adapter_idx, (uint8_t *) &cmd, + cmd.len, check_presence, cookie, + t3_cookie_release); -out_err: - return t3_cookie_release(err, cookie); } static int format_resp(uint8_t *resp, int length, void *data) @@ -905,7 +893,7 @@ static int write_attr_block(uint8_t *resp, int length , void *data) cookie->attr); err = near_adapter_send(cookie->adapter_idx, (uint8_t *) &cmd, - cmd.len, format_resp, cookie); + cmd.len, format_resp, cookie, NULL); if (err < 0) goto out_err; @@ -950,7 +938,7 @@ static int write_mc_block(uint8_t *resp, int length, void *data) prepare_write_block(cookie->IDm, &cmd, FELICA_LITE_MC_BLOCK, cookie->mc_block); err = near_adapter_send(cookie->adapter_idx, (uint8_t *) &cmd, - cmd.len, write_attr_block, cookie); + cmd.len, write_attr_block, cookie, NULL); if (err < 0) goto out_err; @@ -1001,12 +989,10 @@ static int nfctype3_format(uint32_t adapter_idx, memcpy(cookie->IDm, idm, len); prepare_read_block(FELICA_LITE_MC_BLOCK, cookie->IDm, &cmd); - err = near_adapter_send(cookie->adapter_idx, (uint8_t *) &cmd, - cmd.len, write_mc_block, cookie); - if (err < 0) - goto out_err; - return 0; + return near_adapter_send(cookie->adapter_idx, (uint8_t *) &cmd, cmd.len, + write_mc_block, cookie, + t3_cookie_release); out_err: return t3_cookie_release(err, cookie); diff --git a/plugins/nfctype4.c b/plugins/nfctype4.c index 8a00e3d..85336e3 100644 --- a/plugins/nfctype4.c +++ b/plugins/nfctype4.c @@ -158,6 +158,27 @@ struct t4_cookie { uint16_t memory_size; }; +static int t4_cookie_release(int err, void *data) +{ + struct t4_cookie *cookie = data; + + DBG("%p", cookie); + + if (cookie == NULL) + return err; + + if (err < 0 && cookie->cb) + cookie->cb(cookie->adapter_idx, cookie->target_idx, err); + + if (cookie->ndef) + g_free(cookie->ndef->data); + + g_free(cookie->ndef); + g_free(cookie); + + return err; +} + /* ISO functions: This code prepares APDU */ static int ISO_send_cmd(uint8_t class, uint8_t instruction, @@ -207,10 +228,9 @@ static int ISO_send_cmd(uint8_t class, cmd->data[cmd_data_length] = 0; } - err = near_adapter_send(in_rcv->adapter_idx, (uint8_t *) cmd, - total_cmd_length, cb, in_rcv); - if (err < 0) - g_free(in_rcv); + return near_adapter_send(in_rcv->adapter_idx, (uint8_t *) cmd, + total_cmd_length, cb, in_rcv, + t4_cookie_release); out_err: /* On exit, clean memory */ @@ -274,27 +294,6 @@ static int ISO_Update(uint16_t offset, uint8_t nlen, cookie); } -static int t4_cookie_release(int err, void *data) -{ - struct t4_cookie *cookie = data; - - DBG("%p", cookie); - - if (cookie == NULL) - return err; - - if (err < 0 && cookie->cb) - cookie->cb(cookie->adapter_idx, cookie->target_idx, err); - - if (cookie->ndef) - g_free(cookie->ndef->data); - - g_free(cookie->ndef); - g_free(cookie); - - return err; -} - static int data_read_cb(uint8_t *resp, int length, void *data) { struct t4_cookie *cookie = data ; diff --git a/src/adapter.c b/src/adapter.c index ca80ed6..fc10d29 100644 --- a/src/adapter.c +++ b/src/adapter.c @@ -1044,7 +1044,7 @@ int near_adapter_disconnect(uint32_t idx) } int near_adapter_send(uint32_t idx, uint8_t *buf, size_t length, - near_recv cb, void *data) + near_recv cb, void *data, near_release data_rel) { struct near_adapter *adapter; struct near_adapter_ioreq *req = NULL; @@ -1053,16 +1053,22 @@ int near_adapter_send(uint32_t idx, uint8_t *buf, size_t length, DBG("idx %d", idx); adapter = g_hash_table_lookup(adapter_hash, GINT_TO_POINTER(idx)); - if (adapter == NULL) - return -ENODEV; + if (adapter == NULL) { + err = -ENODEV; + goto out_err; + } - if (adapter->tag_sock == -1 || adapter->tag_link == NULL) - return -ENOLINK; + if (adapter->tag_sock == -1 || adapter->tag_link == NULL) { + err = -ENOLINK; + goto out_err; + } if (cb != NULL && adapter->watch != 0) { req = g_try_malloc0(sizeof(*req)); - if (req == NULL) - return -ENOMEM; + if (req == NULL) { + err = -ENOMEM; + goto out_err; + } DBG("req %p cb %p data %p", req, cb, data); @@ -1089,6 +1095,9 @@ out_err: g_list_delete_link(adapter->ioreq_list, last); } + if (data_rel != NULL) + return (*data_rel)(err, data); + return err; } -- 2.7.4