FreeCalypso > hg > freecalypso-hwlab
changeset 91:226b231d00f3
fc-simtool: readrec command implemented
author | Mychaela Falconia <falcon@freecalypso.org> |
---|---|
date | Sun, 24 Jan 2021 18:46:11 +0000 |
parents | 53e2c00566af |
children | 0ead9444a698 |
files | simtool/dispatch.c simtool/readcmd.c |
diffstat | 2 files changed, 54 insertions(+), 0 deletions(-) [+] |
line wrap: on
line diff
--- a/simtool/dispatch.c Sun Jan 24 18:18:04 2021 +0000 +++ b/simtool/dispatch.c Sun Jan 24 18:46:11 2021 +0000 @@ -13,6 +13,7 @@ #include "globals.h" extern int cmd_readbin(); +extern int cmd_readrec(); extern int cmd_select(); extern int display_sim_resp_in_hex(); @@ -33,6 +34,7 @@ {"exit", 0, 0, cmd_exit}, {"quit", 0, 0, cmd_exit}, {"readbin", 2, 2, cmd_readbin}, + {"readrec", 1, 2, cmd_readrec}, {"select", 1, 1, cmd_select}, {"sim-resp", 0, 0, display_sim_resp_in_hex}, {0, 0, 0, 0}
--- a/simtool/readcmd.c Sun Jan 24 18:18:04 2021 +0000 +++ b/simtool/readcmd.c Sun Jan 24 18:46:11 2021 +0000 @@ -45,3 +45,55 @@ display_sim_resp_in_hex(); return(0); } + +cmd_readrec(argc, argv) + char **argv; +{ + unsigned recno, len; + u_char cmd[5]; + int rc; + + recno = strtoul(argv[1], 0, 0); + if (recno < 1 || recno > 255) { + fprintf(stderr, + "error: record number argument is out of range\n"); + return(-1); + } + if (argv[2]) { + len = strtoul(argv[2], 0, 0); + if (len < 1 || len > 255) { + fprintf(stderr, + "error: length argument is out of range\n"); + return(-1); + } + } else { + if (!curfile_record_len) { + fprintf(stderr, + "error: no current file record length is available\n"); + return(-1); + } + len = curfile_record_len; + } + /* READ RECORD command APDU */ + cmd[0] = 0xA0; + cmd[1] = 0xB2; + cmd[2] = recno; + cmd[3] = 0x04; + cmd[4] = len; + rc = apdu_exchange(cmd, 5); + if (rc < 0) + return(rc); + if (sim_resp_sw != 0x9000) { + fprintf(stderr, "bad SW response to READ RECORD: %04X\n", + sim_resp_sw); + return(-1); + } + if (sim_resp_data_len != len) { + fprintf(stderr, + "error: READ RECORD returned %u bytes, expected %u\n", + sim_resp_data_len, len); + return(-1); + } + display_sim_resp_in_hex(); + return(0); +}