Enhance error reporting.

Now that the libnfc has error handling, report errors triggered in the libnfc
and add support for errors triggered in libfreefare.
This commit is contained in:
Romain Tartiere 2010-09-28 19:01:28 +00:00
parent 18982d360f
commit 9a2a07ea53
9 changed files with 73 additions and 28 deletions

3
NEWS
View file

@ -1,5 +1,8 @@
Changes between 0.2.0 and 0.2.1 [xx XXX xxxx]
*) The mifare_desfire_error_lookup() and mifare_desfire_get_last_error()
functions were removed and replaced by the freefare_strerror(),
freefare_strerror_r() and freefare_perror() functions.
*) Blok numbers in ISO14443-4 blocks are incremented according to the
specification.

View file

@ -76,7 +76,7 @@ main(int argc, char *argv[])
res = mifare_desfire_get_version (tags[i], &info);
if (res < 0) {
warnx ("Can't get Mifare DESFire version information.");
freefare_perror (tags[i], "mifare_desfire_get_version");
error = 1;
break;
}
@ -104,7 +104,7 @@ main(int argc, char *argv[])
uint8_t max_keys;
res = mifare_desfire_get_key_settings (tags[i], &settings, &max_keys);
if (res < 0) {
warnx ("Cant' get Mifare DESFire Master Key settings: %s", mifare_desfire_error_lookup (mifare_desfire_get_last_error (tags[i])));
freefare_perror (tags[i], "mifare_desfire_get_key_settings");
error = 1;
break;
}

View file

@ -32,12 +32,12 @@ libfreefare_la_HEADERS = freefare.h
libfreefare_ladir = $(includedir)
man_MANS = freefare.3 \
freefare_error.3 \
mad.3 \
mifare_application.3 \
mifare_classic.3 \
mifare_desfire.3 \
mifare_desfire_aid.3 \
mifare_desfire_error.3 \
mifare_desfire_key.3 \
mifare_ultralight.3 \
tlv.3
@ -48,6 +48,9 @@ linkedman = \
freefare.3 freefare_get_tag_type.3 \
freefare.3 freefare_get_tag_uid.3 \
freefare.3 freefare_get_tags.3 \
freefare_error.3 freefare_strerror.3 \
freefare_error.3 freefare_strerror_r.3 \
freefare_error.3 freefare_perror.3 \
mad.3 mad_free.3 \
mad.3 mad_get_aid.3 \
mad.3 mad_get_card_publisher_sector.3 \
@ -123,7 +126,6 @@ linkedman = \
mifare_desfire.3 mifare_desfire_write_record_ex.3 \
mifare_desfire_aid.3 mifare_desfire_aid_new.3 \
mifare_desfire_aid.3 mifare_desfire_aid_new_with_mad_aid.3 \
mifare_desfire_error.3 mifare_desfire_error_lookup.3 \
mifare_desfire_key.3 mifare_desfire_3des_key_new.3 \
mifare_desfire_key.3 mifare_desfire_3des_key_new_with_version.3 \
mifare_desfire_key.3 mifare_desfire_des_key_new.3 \

View file

@ -203,6 +203,30 @@ freefare_free_tag (MifareTag tag)
}
}
const char *
freefare_strerror (MifareTag tag)
{
const char *p = "Unkown error";
if (tag->device->iLastError > 0)
p = nfc_strerror (tag->device);
else if (tag->tag_info->type == DESFIRE)
p = mifare_desfire_error_lookup (MIFARE_DESFIRE (tag)->last_picc_error);
return p;
}
int
freefare_strerror_r (MifareTag tag, char *buffer, size_t len)
{
return (snprintf (buffer, len, "%s", freefare_strerror (tag)) < 0) ? -1 : 0;
}
void
freefare_perror (MifareTag tag, const char *string)
{
fprintf (stderr, "%s: %s\n", string, freefare_strerror (tag));
}
/*
* Free the provided tag list.
*/

View file

@ -56,6 +56,10 @@ char *freefare_get_tag_uid (MifareTag tag);
void freefare_free_tag (MifareTag tag);
void freefare_free_tags (MifareTag *tags);
const char *freefare_strerror (MifareTag tag);
int freefare_strerror_r (MifareTag tag, char *buffer, size_t len);
void freefare_perror (MifareTag tag, const char *string);
int mifare_ultralight_connect (MifareTag tag);
int mifare_ultralight_disconnect (MifareTag tag);
@ -295,7 +299,6 @@ struct mifare_desfire_file_settings {
int mifare_desfire_connect (MifareTag tag);
int mifare_desfire_disconnect (MifareTag tag);
uint8_t mifare_desfire_get_last_error (MifareTag tag);
int mifare_desfire_authenticate (MifareTag tag, uint8_t key_no, MifareDESFireKey key);
int mifare_desfire_change_key_settings (MifareTag tag, uint8_t settings);
@ -347,8 +350,6 @@ uint8_t mifare_desfire_key_get_version (MifareDESFireKey key);
void mifare_desfire_key_set_version (MifareDESFireKey key, uint8_t version);
void mifare_desfire_key_free (MifareDESFireKey key);
const char *mifare_desfire_error_lookup (uint8_t error);
uint8_t *tlv_encode (const uint8_t type, const uint8_t *istream, uint16_t isize, size_t *osize);
uint8_t *tlv_decode (const uint8_t *istream, uint8_t *type, uint16_t *size);
uint8_t *tlv_append (uint8_t *a, uint8_t *b);

View file

@ -15,8 +15,8 @@
.\"
.\" $Id: mifare_desfire.3 495 2010-07-26 21:48:18Z rtartiere@il4p.fr $
.\"
.Dd September 3, 2010
.Dt MIFARE_DESFIRE_ERROR 3
.Dd September 28, 2010
.Dt FREEFARE_ERROR 3
.Os
.\" _ _
.\" | \ | | __ _ _ __ ___ ___
@ -25,8 +25,10 @@
.\" |_| \_|\__,_|_| |_| |_|\___|
.\"
.Sh NAME
.Nm mifare_desfire_error_lookup
.Nd Mifare DESFire Error Management Functions.
.Nm freefare_strerror ,
.Nm freefare_strerror_r ,
.Nm freefare_perror
.Nd Error Reporting Functions.
.\" _ _ _
.\" | | (_) |__ _ __ __ _ _ __ _ _
.\" | | | | '_ \| '__/ _` | '__| | | |
@ -44,7 +46,11 @@ Mifare card manipulation library (libfreefare, \-lfreefare)
.Sh SYNOPSIS
.In freefare.h
.Ft "const char *"
.Fn mifare_desfire_error_lookup "uint8_t code"
.Fn freefare_strerror "MifareTag tag"
.Ft "int"
.Fn freefare_strerror_r "MifareTag tag" "char *buffer" "size_t len"
.Ft "void"
.Fn freefare_strerror "MifareTag tag" "char *string"
.\" ____ _ _ _
.\" | _ \ ___ ___ ___ _ __(_)_ __ | |_(_) ___ _ __
.\" | | | |/ _ \/ __|/ __| '__| | '_ \| __| |/ _ \| '_ \
@ -53,9 +59,26 @@ Mifare card manipulation library (libfreefare, \-lfreefare)
.\" |_|
.Sh DESCRIPTION
The
.Fn mifare_desfire_error_lookup
functions returns the error string corresponding to the provided error
.Vt code .
.Fn freefare_strerror
functions returns the error string corresponding to the last PCD or PICC error
encounred using
.Vt tag .
.Pp
The
.Fn freefare_strerror_r
functions does the same as
.Fn freefare_strerror
but the error message is copied into
.Vt buffer
for a maximum size of
.Vt len
chars.
.Pp
The
.Fn freefare_strerror
function displays the last PCD or PICC error encounred using
.Vt tag
to stderr.
.\" ____ _ _
.\" | _ \ ___| |_ _ _ _ __ _ __ __ ____ _| |_ _ ___ ___
.\" | |_) / _ \ __| | | | '__| '_ \ \ \ / / _` | | | | |/ _ \/ __|
@ -63,8 +86,10 @@ functions returns the error string corresponding to the provided error
.\" |_| \_\___|\__|\__,_|_| |_| |_| \_/ \__,_|_|\__,_|\___||___/
.\"
.Sh RETURN VALUES
The functions always succeeds. If an invalid error code is provided, a
corresponding message is returned.
.Fn freefare_strerror
returns the error message, while
.Fn freefare_strerror_r
returns 0 on success, -1 on failure.
.\" ____ _
.\" / ___| ___ ___ __ _| |___ ___
.\" \___ \ / _ \/ _ \ / _` | / __|/ _ \
@ -73,7 +98,6 @@ corresponding message is returned.
.\"
.Sh SEE ALSO
.Xr freefare 3 ,
.Xr mifare_desfire 3
.\" _ _ _
.\" / \ _ _| |_| |__ ___ _ __ ___
.\" / _ \| | | | __| '_ \ / _ \| '__/ __|

View file

@ -189,6 +189,7 @@ struct mifare_desfire_tag {
};
MifareDESFireKey mifare_desfire_session_key_new (uint8_t rnda[8], uint8_t rndb[8], MifareDESFireKey authentication_key);
const char *mifare_desfire_error_lookup (uint8_t error);
struct mifare_ultralight_tag {
struct mifare_tag __tag;

View file

@ -94,8 +94,6 @@ Mifare card manipulation library (libfreefare, \-lfreefare)
.Fn mifare_desfire_connect "MifareTag tag"
.Ft int
.Fn mifare_desfire_disconnect "MifareTag tag"
.\".Ft uint8_t
.\".Fn mifare_desfire_get_last_error "MifareTag tag"
.Ft int
.Fn mifare_desfire_authenticate "MifareTag tag" "uint8_t key_no" "MifareDESFireKey key"
.Ft int

View file

@ -338,14 +338,6 @@ mifare_desfire_disconnect (MifareTag tag)
uint8_t
mifare_desfire_get_last_error (MifareTag tag)
{
return MIFARE_DESFIRE (tag)->last_picc_error;
}
int
mifare_desfire_authenticate (MifareTag tag, uint8_t key_no, MifareDESFireKey key)
{