nfc_initiator_select_passive_target() function returns now libnfc error code.

This commit is contained in:
Audrey Diacre 2011-12-19 16:27:50 +00:00
parent ba2a7cfe2e
commit 103485518c
11 changed files with 42 additions and 41 deletions

View file

@ -35,7 +35,7 @@ main (int argc, const char *argv[])
.nmt = NMT_ISO14443A, .nmt = NMT_ISO14443A,
.nbr = NBR_106, .nbr = NBR_106,
}; };
if (nfc_initiator_select_passive_target (pnd, nmMifare, NULL, 0, &nt)) { if (nfc_initiator_select_passive_target (pnd, nmMifare, NULL, 0, &nt) == 0) {
printf ("The following (NFC) ISO14443A tag was found:\n"); printf ("The following (NFC) ISO14443A tag was found:\n");
printf (" ATQA (SENS_RES): "); printf (" ATQA (SENS_RES): ");
print_hex (nt.nti.nai.abtAtqa, 2); print_hex (nt.nti.nai.abtAtqa, 2);

View file

@ -140,7 +140,7 @@ main (int argc, const char *argv[])
.nmt = NMT_ISO14443A, .nmt = NMT_ISO14443A,
.nbr = NBR_106, .nbr = NBR_106,
}; };
if (!nfc_initiator_select_passive_target (pnd, nmSAM, NULL, 0, &nt)) { if (nfc_initiator_select_passive_target (pnd, nmSAM, NULL, 0, &nt) < 0) {
nfc_perror (pnd, "nfc_initiator_select_passive_target"); nfc_perror (pnd, "nfc_initiator_select_passive_target");
ERR ("%s", "Reading of SAM info failed."); ERR ("%s", "Reading of SAM info failed.");
exit (EXIT_FAILURE); exit (EXIT_FAILURE);

View file

@ -72,7 +72,7 @@ extern "C" {
/* NFC initiator: act as "reader" */ /* NFC initiator: act as "reader" */
NFC_EXPORT int nfc_initiator_init (nfc_device *pnd); NFC_EXPORT int nfc_initiator_init (nfc_device *pnd);
NFC_EXPORT bool nfc_initiator_select_passive_target (nfc_device *pnd, const nfc_modulation nm, const uint8_t *pbtInitData, const size_t szInitData, nfc_target *pnt); NFC_EXPORT int nfc_initiator_select_passive_target (nfc_device *pnd, const nfc_modulation nm, const uint8_t *pbtInitData, const size_t szInitData, nfc_target *pnt);
NFC_EXPORT int nfc_initiator_list_passive_targets (nfc_device *pnd, const nfc_modulation nm, nfc_target ant[], const size_t szTargets); NFC_EXPORT int nfc_initiator_list_passive_targets (nfc_device *pnd, const nfc_modulation nm, nfc_target ant[], const size_t szTargets);
NFC_EXPORT bool nfc_initiator_poll_target (nfc_device *pnd, const nfc_modulation *pnmTargetTypes, const size_t szTargetTypes, const uint8_t uiPollNr, const uint8_t uiPeriod, nfc_target *pnt); NFC_EXPORT bool nfc_initiator_poll_target (nfc_device *pnd, const nfc_modulation *pnmTargetTypes, const size_t szTargetTypes, const uint8_t uiPollNr, const uint8_t uiPeriod, nfc_target *pnt);
NFC_EXPORT bool nfc_initiator_select_dep_target (nfc_device *pnd, const nfc_dep_mode ndm, const nfc_baud_rate nbr, const nfc_dep_info *pndiInitiator, nfc_target *pnt, const int timeout); NFC_EXPORT bool nfc_initiator_select_dep_target (nfc_device *pnd, const nfc_dep_mode ndm, const nfc_baud_rate nbr, const nfc_dep_info *pndiInitiator, nfc_target *pnt, const int timeout);

View file

@ -907,7 +907,7 @@ pn53x_initiator_init (struct nfc_device *pnd)
return NFC_SUCCESS; return NFC_SUCCESS;
} }
bool int
pn53x_initiator_select_passive_target_ext (struct nfc_device *pnd, pn53x_initiator_select_passive_target_ext (struct nfc_device *pnd,
const nfc_modulation nm, const nfc_modulation nm,
const uint8_t *pbtInitData, const size_t szInitData, const uint8_t *pbtInitData, const size_t szInitData,
@ -916,22 +916,23 @@ pn53x_initiator_select_passive_target_ext (struct nfc_device *pnd,
{ {
uint8_t abtTargetsData[PN53x_EXTENDED_FRAME__DATA_MAX_LEN]; uint8_t abtTargetsData[PN53x_EXTENDED_FRAME__DATA_MAX_LEN];
size_t szTargetsData = sizeof(abtTargetsData); size_t szTargetsData = sizeof(abtTargetsData);
int res = 0;
if (nm.nmt == NMT_ISO14443BI || nm.nmt == NMT_ISO14443B2SR || nm.nmt == NMT_ISO14443B2CT) { if (nm.nmt == NMT_ISO14443BI || nm.nmt == NMT_ISO14443B2SR || nm.nmt == NMT_ISO14443B2CT) {
if (CHIP_DATA(pnd)->type == RCS360) { if (CHIP_DATA(pnd)->type == RCS360) {
// TODO add support for RC-S360, at the moment it refuses to send raw frames without a first select // TODO add support for RC-S360, at the moment it refuses to send raw frames without a first select
pnd->last_error = NFC_ENOTIMPL; pnd->last_error = NFC_ENOTIMPL;
return false; return pnd->last_error;
} }
// No native support in InListPassiveTarget so we do discovery by hand // No native support in InListPassiveTarget so we do discovery by hand
if (nfc_device_set_property_bool (pnd, NP_FORCE_ISO14443_B, true) < 0) { if ((res = nfc_device_set_property_bool (pnd, NP_FORCE_ISO14443_B, true)) < 0) {
return false; return res;
} }
if (nfc_device_set_property_bool (pnd, NP_FORCE_SPEED_106, true) < 0) { if ((res = nfc_device_set_property_bool (pnd, NP_FORCE_SPEED_106, true)) < 0) {
return false; return res;
} }
if (nfc_device_set_property_bool (pnd, NP_HANDLE_CRC, true) < 0) { if ((res = nfc_device_set_property_bool (pnd, NP_HANDLE_CRC, true)) < 0) {
return false; return res;
} }
pnd->bEasyFraming = false; pnd->bEasyFraming = false;
if (nm.nmt == NMT_ISO14443B2SR) { if (nm.nmt == NMT_ISO14443B2SR) {
@ -943,12 +944,12 @@ pn53x_initiator_select_passive_target_ext (struct nfc_device *pnd,
uint8_t abtRx[1]; uint8_t abtRx[1];
size_t szRxLen = 1; size_t szRxLen = 1;
// Getting random Chip_ID // Getting random Chip_ID
if (pn53x_initiator_transceive_bytes (pnd, abtInitiate, szInitiateLen, abtRx, &szRxLen, timeout) < 0) { if ((res = pn53x_initiator_transceive_bytes (pnd, abtInitiate, szInitiateLen, abtRx, &szRxLen, timeout)) < 0) {
return false; return res;
} }
abtSelect[1] = abtRx[0]; abtSelect[1] = abtRx[0];
if (pn53x_initiator_transceive_bytes (pnd, abtSelect, szSelectLen, abtRx, &szRxLen, timeout) < 0) { if ((res = pn53x_initiator_transceive_bytes (pnd, abtSelect, szSelectLen, abtRx, &szRxLen, timeout)) < 0) {
return false; return res;
} }
} }
else if (nm.nmt == NMT_ISO14443B2CT) { else if (nm.nmt == NMT_ISO14443B2CT) {
@ -956,20 +957,20 @@ pn53x_initiator_select_passive_target_ext (struct nfc_device *pnd,
uint8_t abtReqt[]="\x10"; uint8_t abtReqt[]="\x10";
size_t szReqtLen = 1; size_t szReqtLen = 1;
// Getting product code / fab code & store it in output buffer after the serial nr we'll obtain later // Getting product code / fab code & store it in output buffer after the serial nr we'll obtain later
if ((pn53x_initiator_transceive_bytes (pnd, abtReqt, szReqtLen, abtTargetsData+2, &szTargetsData, timeout) < 0) || szTargetsData != 2) { if ((res = pn53x_initiator_transceive_bytes (pnd, abtReqt, szReqtLen, abtTargetsData+2, &szTargetsData, timeout)) < 0) {
return false; return res;
} }
} }
if (pn53x_initiator_transceive_bytes (pnd, pbtInitData, szInitData, abtTargetsData, &szTargetsData, timeout) < 0) { if ((res = pn53x_initiator_transceive_bytes (pnd, pbtInitData, szInitData, abtTargetsData, &szTargetsData, timeout)) < 0) {
return false; return res;
} }
if (nm.nmt == NMT_ISO14443B2CT) { if (nm.nmt == NMT_ISO14443B2CT) {
if (szTargetsData != 2) if (szTargetsData != 2)
return false; return NFC_ECHIP;
uint8_t abtRead[]="\xC4"; // Reading UID_MSB (Read address 4) uint8_t abtRead[]="\xC4"; // Reading UID_MSB (Read address 4)
size_t szReadLen = 1; size_t szReadLen = 1;
if ((pn53x_initiator_transceive_bytes (pnd, abtRead, szReadLen, abtTargetsData+4, &szTargetsData, timeout) < 0) || szTargetsData != 2) { if ((res = pn53x_initiator_transceive_bytes (pnd, abtRead, szReadLen, abtTargetsData+4, &szTargetsData, timeout) < 0)) {
return false; return res;
} }
szTargetsData = 6; // u16 UID_LSB, u8 prod code, u8 fab code, u16 UID_MSB szTargetsData = 6; // u16 UID_LSB, u8 prod code, u8 fab code, u16 UID_MSB
} }
@ -977,7 +978,7 @@ pn53x_initiator_select_passive_target_ext (struct nfc_device *pnd,
pnt->nm = nm; pnt->nm = nm;
// Fill the tag info struct with the values corresponding to this init modulation // Fill the tag info struct with the values corresponding to this init modulation
if (!pn53x_decode_target_data (abtTargetsData, szTargetsData, CHIP_DATA(pnd)->type, nm.nmt, &(pnt->nti))) { if (!pn53x_decode_target_data (abtTargetsData, szTargetsData, CHIP_DATA(pnd)->type, nm.nmt, &(pnt->nti))) {
return false; return NFC_ECHIP;
} }
} }
if (nm.nmt == NMT_ISO14443BI) { if (nm.nmt == NMT_ISO14443BI) {
@ -986,11 +987,11 @@ pn53x_initiator_select_passive_target_ext (struct nfc_device *pnd,
size_t szAttribLen = sizeof(abtAttrib); size_t szAttribLen = sizeof(abtAttrib);
memcpy(abtAttrib, abtTargetsData, szAttribLen); memcpy(abtAttrib, abtTargetsData, szAttribLen);
abtAttrib[1] = 0x0f; // ATTRIB abtAttrib[1] = 0x0f; // ATTRIB
if (pn53x_initiator_transceive_bytes (pnd, abtAttrib, szAttribLen, NULL, NULL, timeout) < 0) { if ((res = pn53x_initiator_transceive_bytes (pnd, abtAttrib, szAttribLen, NULL, NULL, timeout)) < 0) {
return false; return res;
} }
} }
return true; return NFC_SUCCESS;
} // else: } // else:
const pn53x_modulation pm = pn53x_nm_to_pm(nm); const pn53x_modulation pm = pn53x_nm_to_pm(nm);
@ -1017,7 +1018,7 @@ pn53x_initiator_select_passive_target_ext (struct nfc_device *pnd,
return true; return true;
} }
bool int
pn53x_initiator_select_passive_target (struct nfc_device *pnd, pn53x_initiator_select_passive_target (struct nfc_device *pnd,
const nfc_modulation nm, const nfc_modulation nm,
const uint8_t *pbtInitData, const size_t szInitData, const uint8_t *pbtInitData, const size_t szInitData,
@ -1077,7 +1078,7 @@ pn53x_initiator_poll_target (struct nfc_device *pnd,
prepare_initiator_data (pnmModulations[n], &pbtInitiatorData, &szInitiatorData); prepare_initiator_data (pnmModulations[n], &pbtInitiatorData, &szInitiatorData);
const int timeout_ms = uiPeriod * 150; const int timeout_ms = uiPeriod * 150;
if (!pn53x_initiator_select_passive_target_ext (pnd, pnmModulations[n], pbtInitiatorData, szInitiatorData, pnt, timeout_ms)) { if (pn53x_initiator_select_passive_target_ext (pnd, pnmModulations[n], pbtInitiatorData, szInitiatorData, pnt, timeout_ms) < 0) {
if (pnd->last_error != NFC_ETIMEOUT) if (pnd->last_error != NFC_ETIMEOUT)
return false; return false;
} else { } else {

View file

@ -286,7 +286,7 @@ bool pn53x_idle (struct nfc_device *pnd);
// NFC device as Initiator functions // NFC device as Initiator functions
int pn53x_initiator_init (struct nfc_device *pnd); int pn53x_initiator_init (struct nfc_device *pnd);
bool pn53x_initiator_select_passive_target (struct nfc_device *pnd, int pn53x_initiator_select_passive_target (struct nfc_device *pnd,
const nfc_modulation nm, const nfc_modulation nm,
const uint8_t *pbtInitData, const size_t szInitData, const uint8_t *pbtInitData, const size_t szInitData,
nfc_target *pnt); nfc_target *pnt);

View file

@ -133,7 +133,7 @@ struct nfc_driver_t {
const char *(*strerror) (const struct nfc_device *pnd); const char *(*strerror) (const struct nfc_device *pnd);
int (*initiator_init) (struct nfc_device *pnd); int (*initiator_init) (struct nfc_device *pnd);
bool (*initiator_select_passive_target) (struct nfc_device *pnd, const nfc_modulation nm, const uint8_t * pbtInitData, const size_t szInitData, nfc_target * pnt); int (*initiator_select_passive_target) (struct nfc_device *pnd, const nfc_modulation nm, const uint8_t * pbtInitData, const size_t szInitData, nfc_target * pnt);
bool (*initiator_poll_target) (struct nfc_device *pnd, const nfc_modulation * pnmModulations, const size_t szModulations, const uint8_t uiPollNr, const uint8_t btPeriod, nfc_target * pnt); bool (*initiator_poll_target) (struct nfc_device *pnd, const nfc_modulation * pnmModulations, const size_t szModulations, const uint8_t uiPollNr, const uint8_t btPeriod, nfc_target * pnt);
bool (*initiator_select_dep_target) (struct nfc_device *pnd, const nfc_dep_mode ndm, const nfc_baud_rate nbr, const nfc_dep_info * pndiInitiator, nfc_target * pnt, const int timeout); bool (*initiator_select_dep_target) (struct nfc_device *pnd, const nfc_dep_mode ndm, const nfc_baud_rate nbr, const nfc_dep_info * pndiInitiator, nfc_target * pnt, const int timeout);
bool (*initiator_deselect_target) (struct nfc_device *pnd); bool (*initiator_deselect_target) (struct nfc_device *pnd);

View file

@ -304,7 +304,7 @@ nfc_initiator_init (nfc_device *pnd)
/** /**
* @brief Select a passive or emulated tag * @brief Select a passive or emulated tag
* @return Returns \c true if action was successfully performed; otherwise returns \c false. * @return Returns 0 on success, otherwise returns libnfc's error code (negative value)
* *
* @param pnd \a nfc_device struct pointer that represent currently used device * @param pnd \a nfc_device struct pointer that represent currently used device
* @param nm desired modulation * @param nm desired modulation
@ -322,7 +322,7 @@ nfc_initiator_init (nfc_device *pnd)
* The chip needs to know with what kind of tag it is dealing with, therefore * The chip needs to know with what kind of tag it is dealing with, therefore
* the initial modulation and speed (106, 212 or 424 kbps) should be supplied. * the initial modulation and speed (106, 212 or 424 kbps) should be supplied.
*/ */
bool int
nfc_initiator_select_passive_target (nfc_device *pnd, nfc_initiator_select_passive_target (nfc_device *pnd,
const nfc_modulation nm, const nfc_modulation nm,
const uint8_t *pbtInitData, const size_t szInitData, const uint8_t *pbtInitData, const size_t szInitData,
@ -381,7 +381,7 @@ nfc_initiator_list_passive_targets (nfc_device *pnd,
prepare_initiator_data (nm, &pbtInitData, &szInitDataLen); prepare_initiator_data (nm, &pbtInitData, &szInitDataLen);
while (nfc_initiator_select_passive_target (pnd, nm, pbtInitData, szInitDataLen, &nt)) { while (nfc_initiator_select_passive_target (pnd, nm, pbtInitData, szInitDataLen, &nt) == 0) {
nfc_initiator_deselect_target (pnd); nfc_initiator_deselect_target (pnd);
if (szTargets == szTargetFound) { if (szTargets == szTargetFound) {
break; break;

View file

@ -280,7 +280,7 @@ read_card (int read_unlocked)
// Show if the readout went well // Show if the readout went well
if (bFailure) { if (bFailure) {
// When a failure occured we need to redo the anti-collision // When a failure occured we need to redo the anti-collision
if (!nfc_initiator_select_passive_target (pnd, nmMifare, NULL, 0, &nt)) { if (nfc_initiator_select_passive_target (pnd, nmMifare, NULL, 0, &nt) < 0) {
printf ("!\nError: tag was removed\n"); printf ("!\nError: tag was removed\n");
return false; return false;
} }
@ -353,7 +353,7 @@ write_card (int write_block_zero)
// Show if the readout went well // Show if the readout went well
if (bFailure) { if (bFailure) {
// When a failure occured we need to redo the anti-collision // When a failure occured we need to redo the anti-collision
if (!nfc_initiator_select_passive_target (pnd, nmMifare, NULL, 0, &nt)) { if (nfc_initiator_select_passive_target (pnd, nmMifare, NULL, 0, &nt) < 0) {
printf ("!\nError: tag was removed\n"); printf ("!\nError: tag was removed\n");
return false; return false;
} }
@ -557,7 +557,7 @@ main (int argc, const char *argv[])
printf ("Connected to NFC reader: %s\n", nfc_device_get_name (pnd)); printf ("Connected to NFC reader: %s\n", nfc_device_get_name (pnd));
// Try to find a MIFARE Classic tag // Try to find a MIFARE Classic tag
if (!nfc_initiator_select_passive_target (pnd, nmMifare, NULL, 0, &nt)) { if (nfc_initiator_select_passive_target (pnd, nmMifare, NULL, 0, &nt) < 0) {
printf ("Error: no tag was found\n"); printf ("Error: no tag was found\n");
nfc_disconnect (pnd); nfc_disconnect (pnd);
exit (EXIT_FAILURE); exit (EXIT_FAILURE);

View file

@ -142,7 +142,7 @@ write_card (void)
// Show if the readout went well // Show if the readout went well
if (bFailure) { if (bFailure) {
// When a failure occured we need to redo the anti-collision // When a failure occured we need to redo the anti-collision
if (!nfc_initiator_select_passive_target (pnd, nmMifare, NULL, 0, &nt)) { if (nfc_initiator_select_passive_target (pnd, nmMifare, NULL, 0, &nt) < 0) {
ERR ("tag was removed"); ERR ("tag was removed");
return false; return false;
} }
@ -222,7 +222,7 @@ main (int argc, const char *argv[])
printf ("Connected to NFC device: %s\n", nfc_device_get_name (pnd)); printf ("Connected to NFC device: %s\n", nfc_device_get_name (pnd));
// Try to find a MIFARE Ultralight tag // Try to find a MIFARE Ultralight tag
if (!nfc_initiator_select_passive_target (pnd, nmMifare, NULL, 0, &nt)) { if (nfc_initiator_select_passive_target (pnd, nmMifare, NULL, 0, &nt) < 0) {
ERR ("no tag was found\n"); ERR ("no tag was found\n");
nfc_disconnect (pnd); nfc_disconnect (pnd);
return 1; return 1;

View file

@ -219,7 +219,7 @@ main(int argc, char *argv[])
int error = EXIT_SUCCESS; int error = EXIT_SUCCESS;
// Polling payload (SENSF_REQ) must be present (see NFC Digital Protol) // Polling payload (SENSF_REQ) must be present (see NFC Digital Protol)
const uint8_t *pbtSensfReq = (uint8_t*)"\x00\xff\xff\x01\x00"; const uint8_t *pbtSensfReq = (uint8_t*)"\x00\xff\xff\x01\x00";
if (!nfc_initiator_select_passive_target(pnd, nm, pbtSensfReq, 5, &nt)) { if (nfc_initiator_select_passive_target(pnd, nm, pbtSensfReq, 5, &nt) < 0) {
nfc_perror (pnd, "nfc_initiator_select_passive_target"); nfc_perror (pnd, "nfc_initiator_select_passive_target");
error = EXIT_FAILURE; error = EXIT_FAILURE;
goto error; goto error;
@ -230,7 +230,7 @@ main(int argc, char *argv[])
if (0 != memcmp (nt.nti.nfi.abtSysCode, abtNfcForumSysCode, 2)) { if (0 != memcmp (nt.nti.nfi.abtSysCode, abtNfcForumSysCode, 2)) {
// Retry with special polling // Retry with special polling
const uint8_t *pbtSensfReqNfcForum = (uint8_t*)"\x00\x12\xfc\x01\x00"; const uint8_t *pbtSensfReqNfcForum = (uint8_t*)"\x00\x12\xfc\x01\x00";
if (!nfc_initiator_select_passive_target(pnd, nm, pbtSensfReqNfcForum, 5, &nt)) { if (nfc_initiator_select_passive_target(pnd, nm, pbtSensfReqNfcForum, 5, &nt) < 0) {
nfc_perror (pnd, "nfc_initiator_select_passive_target"); nfc_perror (pnd, "nfc_initiator_select_passive_target");
error = EXIT_FAILURE; error = EXIT_FAILURE;
goto error; goto error;

View file

@ -240,7 +240,7 @@ main (int argc, char *argv[])
.nmt = NMT_ISO14443A, .nmt = NMT_ISO14443A,
.nbr = NBR_106, .nbr = NBR_106,
}; };
if (!nfc_initiator_select_passive_target (pndInitiator, nm, NULL, 0, &ntRealTarget)) { if (nfc_initiator_select_passive_target (pndInitiator, nm, NULL, 0, &ntRealTarget) < 0) {
printf ("Error: no tag was found\n"); printf ("Error: no tag was found\n");
nfc_disconnect (pndInitiator); nfc_disconnect (pndInitiator);
exit (EXIT_FAILURE); exit (EXIT_FAILURE);