FreeCalypso > hg > fc-sim-tools
diff libcommon/dumpdirfunc.c @ 9:c9ef9e91dd8e
new libcommon, initial version
author | Mychaela Falconia <falcon@freecalypso.org> |
---|---|
date | Sun, 14 Mar 2021 06:55:38 +0000 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/libcommon/dumpdirfunc.c Sun Mar 14 06:55:38 2021 +0000 @@ -0,0 +1,107 @@ +/* + * This module implements the common function for dumping EF_DIR. + */ + +#include <sys/types.h> +#include <stdio.h> +#include "simresp.h" + +static void +dump_aid(tlv, outf) + u_char *tlv; + FILE *outf; +{ + unsigned reclen, n; + + reclen = tlv[1]; + fputs(" AID:", outf); + for (n = 0; n < reclen; n++) + fprintf(outf, " %02X", tlv[n+2]); + putc('\n', outf); +} + +static void +dump_label(tlv, outf) + u_char *tlv; + FILE *outf; +{ + int rc; + unsigned textlen; + + fputs(" Label: ", outf); + rc = validate_alpha_field(tlv + 2, tlv[1], &textlen); + if (rc < 0) { + fputs("malformed\n", outf); + return; + } + print_alpha_field(tlv + 2, textlen, outf); + putc('\n', outf); +} + +static void +dump_unknown_tlv(tlv, outf) + u_char *tlv; + FILE *outf; +{ + unsigned reclen, n; + + reclen = tlv[1] + 2; + fputs(" TLV:", outf); + for (n = 0; n < reclen; n++) + fprintf(outf, " %02X", tlv[n]); + putc('\n', outf); +} + +void +dump_efdir_record(outf) + FILE *outf; +{ + unsigned totlen, reclen; + u_char *dp, *endp; + + if (sim_resp_data[0] != 0x61) { + fprintf(outf, " bad: first byte != 0x61\n"); + return; + } + totlen = sim_resp_data[1]; + if (totlen < 3 || totlen > 0x7F) { + fprintf(outf, " bad: global length byte 0x%02X is invalid\n", + totlen); + return; + } + if (totlen + 2 > sim_resp_data_len) { + fprintf(outf, + " bad: TLV global length exceeds EF record length\n"); + return; + } + dp = sim_resp_data + 2; + endp = sim_resp_data + 2 + totlen; + while (dp < endp) { + if (endp - dp < 2) { +trunc_error: fprintf(outf, " bad: truncated TLV record\n"); + return; + } + if ((dp[0] & 0x1F) == 0x1F) { + fprintf(outf, " bad: extended tag not supported\n"); + return; + } + if (dp[1] & 0x80) { + fprintf(outf, " bad: extended length not supported\n"); + return; + } + reclen = dp[1] + 2; + if (endp - dp < reclen) + goto trunc_error; + switch (dp[0]) { + case 0x4F: + dump_aid(dp, outf); + break; + case 0x50: + dump_label(dp, outf); + break; + default: + dump_unknown_tlv(dp, outf); + } + dp += reclen; + } +}