FreeCalypso > hg > freecalypso-hwlab
comparison simtool/select.c @ 93:d4150123ca45
fc-simtool: some refactoring of SELECT response parsing
author | Mychaela Falconia <falcon@freecalypso.org> |
---|---|
date | Sun, 24 Jan 2021 20:25:04 +0000 |
parents | fb75855a74a9 |
children | b84df973cd8b |
comparison
equal
deleted
inserted
replaced
92:0ead9444a698 | 93:d4150123ca45 |
---|---|
81 | 81 |
82 cmd_select(argc, argv) | 82 cmd_select(argc, argv) |
83 char **argv; | 83 char **argv; |
84 { | 84 { |
85 int file_id, rc; | 85 int file_id, rc; |
86 unsigned file_size; | |
87 | 86 |
88 if (isxdigit(argv[1][0]) && isxdigit(argv[1][1]) && | 87 if (isxdigit(argv[1][0]) && isxdigit(argv[1][1]) && |
89 isxdigit(argv[1][2]) && isxdigit(argv[1][3]) && !argv[1][4]) | 88 isxdigit(argv[1][2]) && isxdigit(argv[1][3]) && !argv[1][4]) |
90 file_id = strtoul(argv[1], 0, 16); | 89 file_id = strtoul(argv[1], 0, 16); |
91 else | 90 else |
126 show_secret_code_status("PIN2", sim_resp_data[20]); | 125 show_secret_code_status("PIN2", sim_resp_data[20]); |
127 show_secret_code_status("PUK2", sim_resp_data[21]); | 126 show_secret_code_status("PUK2", sim_resp_data[21]); |
128 break; | 127 break; |
129 case 0x04: | 128 case 0x04: |
130 printf("File type: EF\n"); | 129 printf("File type: EF\n"); |
131 file_size = (sim_resp_data[2] << 8) | sim_resp_data[3]; | 130 curfile_total_size = (sim_resp_data[2] << 8) | sim_resp_data[3]; |
132 printf("File size: %u\n", file_size); | 131 printf("File size: %u\n", curfile_total_size); |
133 switch (sim_resp_data[13]) { | 132 curfile_structure = sim_resp_data[13]; |
133 switch (curfile_structure) { | |
134 case 0x00: | 134 case 0x00: |
135 printf("Structure: transparent\n"); | 135 printf("Structure: transparent\n"); |
136 break; | 136 break; |
137 case 0x01: | 137 case 0x01: |
138 printf("Structure: linear fixed\n"); | 138 printf("Structure: linear fixed\n"); |
146 sim_resp_data_len); | 146 sim_resp_data_len); |
147 return(-1); | 147 return(-1); |
148 } | 148 } |
149 printf("Record length: %u\n", sim_resp_data[14]); | 149 printf("Record length: %u\n", sim_resp_data[14]); |
150 curfile_record_len = sim_resp_data[14]; | 150 curfile_record_len = sim_resp_data[14]; |
151 if (file_size % curfile_record_len == 0) | 151 if (curfile_record_len && |
152 curfile_total_size % curfile_record_len == 0) { | |
153 curfile_record_count = | |
154 curfile_total_size / curfile_record_len; | |
152 printf("Number of records: %u\n", | 155 printf("Number of records: %u\n", |
153 file_size / curfile_record_len); | 156 curfile_record_count); |
157 } else | |
158 curfile_record_count = 0; | |
154 break; | 159 break; |
155 default: | 160 default: |
156 printf("Structure: %02X (unknown)\n", | 161 printf("Structure: %02X (unknown)\n", |
157 sim_resp_data[13]); | 162 curfile_structure); |
158 } | 163 } |
159 printf("File status: %02X\n", sim_resp_data[11]); | 164 printf("File status: %02X\n", sim_resp_data[11]); |
160 show_access_conditions("UPDATE", sim_resp_data[8] & 0xF); | 165 show_access_conditions("UPDATE", sim_resp_data[8] & 0xF); |
161 show_access_conditions("READ & SEEK", sim_resp_data[8] >> 4); | 166 show_access_conditions("READ & SEEK", sim_resp_data[8] >> 4); |
162 show_access_conditions("INCREASE", sim_resp_data[9] >> 4); | 167 show_access_conditions("INCREASE", sim_resp_data[9] >> 4); |