comparison simtool/pbupdate.c @ 10:a76ec3e7da09

simtool/pbupdate.c: a little refactoring from fc-uicc-tool
author Mychaela Falconia <falcon@freecalypso.org>
date Fri, 12 Feb 2021 00:47:04 +0000
parents 2071b28cd0c7
children 62cdfed70de7
comparison
equal deleted inserted replaced
9:dc565e91069d 10:a76ec3e7da09
1 /* 1 /*
2 * This module implements the pb-update command. 2 * This module implements the pb-update family of commands.
3 */ 3 */
4 4
5 #include <sys/types.h> 5 #include <sys/types.h>
6 #include <ctype.h> 6 #include <ctype.h>
7 #include <string.h> 7 #include <string.h>
8 #include <strings.h> 8 #include <strings.h>
9 #include <stdio.h> 9 #include <stdio.h>
10 #include <stdlib.h> 10 #include <stdlib.h>
11 #include "simresp.h"
12 #include "curfile.h" 11 #include "curfile.h"
13 12
14 static u_char gsm7_encode_table[256] = { 13 static u_char gsm7_encode_table[256] = {
15 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, /* 0x00 */ 14 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, /* 0x00 */
16 0xFF, 0xFF, '\n', 0xFF, 0xFF, '\r', 0xFF, 0xFF, 15 0xFF, 0xFF, '\n', 0xFF, 0xFF, '\r', 0xFF, 0xFF,
92 sp += 2; 91 sp += 2;
93 } 92 }
94 } 93 }
95 94
96 static char * 95 static char *
97 decode_qstring_alpha(cp, record, filename_for_errs, lineno_for_errs) 96 decode_qstring_alpha(cp, record, maxlen, filename_for_errs, lineno_for_errs)
98 char *cp, *filename_for_errs; 97 char *cp, *filename_for_errs;
99 u_char *record; 98 u_char *record;
100 { 99 unsigned maxlen;
101 unsigned maxlen, acclen, nadd; 100 {
101 unsigned acclen, nadd;
102 int c; 102 int c;
103 103
104 maxlen = curfile_record_len - 14;
105 for (acclen = 0; ; ) { 104 for (acclen = 0; ; ) {
106 if (*cp == '\0') { 105 if (*cp == '\0') {
107 unterm_qstring: fprintf(stderr, 106 unterm_qstring: fprintf(stderr,
108 "%s line %d: unterminated quoted string\n", 107 "%s line %d: unterminated quoted string\n",
109 filename_for_errs, lineno_for_errs); 108 filename_for_errs, lineno_for_errs);
156 } 155 }
157 return(cp + 1); 156 return(cp + 1);
158 } 157 }
159 158
160 static char * 159 static char *
161 decode_hex_alpha(cp, record, filename_for_errs, lineno_for_errs) 160 decode_hex_alpha(cp, record, maxlen, filename_for_errs, lineno_for_errs)
162 char *cp, *filename_for_errs; 161 char *cp, *filename_for_errs;
163 u_char *record; 162 u_char *record;
164 { 163 unsigned maxlen;
165 unsigned maxlen, acclen; 164 {
166 165 unsigned acclen;
167 maxlen = curfile_record_len - 14; 166
168 for (acclen = 0; ; ) { 167 for (acclen = 0; ; ) {
169 if (!isxdigit(cp[0]) || !isxdigit(cp[1])) 168 if (!isxdigit(cp[0]) || !isxdigit(cp[1]))
170 break; 169 break;
171 if (acclen >= maxlen) { 170 if (acclen >= maxlen) {
172 fprintf(stderr, 171 fprintf(stderr,
180 } 179 }
181 return(cp); 180 return(cp);
182 } 181 }
183 182
184 static 183 static
185 process_record(line, filename_for_errs, lineno_for_errs) 184 process_record(line, pb_record_len, pb_record_count, filename_for_errs,
185 lineno_for_errs)
186 char *line, *filename_for_errs; 186 char *line, *filename_for_errs;
187 unsigned pb_record_len, pb_record_count;
187 { 188 {
188 unsigned recno; 189 unsigned recno;
189 u_char record[255], *fixp; 190 u_char record[255], *fixp;
190 u_char digits[20]; 191 u_char digits[20];
191 unsigned ndigits, num_digit_bytes; 192 unsigned ndigits, num_digit_bytes;
192 char *cp; 193 char *cp;
193 int c; 194 int c;
194 195
195 recno = strtoul(line+1, 0, 10); 196 recno = strtoul(line+1, 0, 10);
196 if (recno < 1 || recno > curfile_record_count) { 197 if (recno < 1 || recno > pb_record_count) {
197 fprintf(stderr, "%s line %d: record number is out of range\n", 198 fprintf(stderr, "%s line %d: record number is out of range\n",
198 filename_for_errs, lineno_for_errs); 199 filename_for_errs, lineno_for_errs);
199 return(-1); 200 return(-1);
200 } 201 }
201 cp = line + 1; 202 cp = line + 1;
206 filename_for_errs, lineno_for_errs); 207 filename_for_errs, lineno_for_errs);
207 return(-1); 208 return(-1);
208 } 209 }
209 while (isspace(*cp)) 210 while (isspace(*cp))
210 cp++; 211 cp++;
211 memset(record, 0xFF, curfile_record_len); 212 memset(record, 0xFF, pb_record_len);
212 fixp = record + curfile_record_len - 14; 213 fixp = record + pb_record_len - 14;
213 if (digit_char_to_gsm(*cp) < 0) 214 if (digit_char_to_gsm(*cp) < 0)
214 goto inv_syntax; 215 goto inv_syntax;
215 for (ndigits = 0; ; ndigits++) { 216 for (ndigits = 0; ; ndigits++) {
216 c = digit_char_to_gsm(*cp); 217 c = digit_char_to_gsm(*cp);
217 if (c < 0) 218 if (c < 0)
254 while (isspace(*cp)) 255 while (isspace(*cp))
255 cp++; 256 cp++;
256 } 257 }
257 if (*cp == '"') { 258 if (*cp == '"') {
258 cp++; 259 cp++;
259 cp = decode_qstring_alpha(cp, record, filename_for_errs, 260 cp = decode_qstring_alpha(cp, record, pb_record_len - 14,
260 lineno_for_errs); 261 filename_for_errs, lineno_for_errs);
261 if (!cp) 262 if (!cp)
262 return(-1); 263 return(-1);
263 } else if (!strncasecmp(cp, "HEX", 3)) { 264 } else if (!strncasecmp(cp, "HEX", 3)) {
264 cp += 3; 265 cp += 3;
265 while (isspace(*cp)) 266 while (isspace(*cp))
266 cp++; 267 cp++;
267 cp = decode_hex_alpha(cp, record, filename_for_errs, 268 cp = decode_hex_alpha(cp, record, pb_record_len - 14,
268 lineno_for_errs); 269 filename_for_errs, lineno_for_errs);
269 if (!cp) 270 if (!cp)
270 return(-1); 271 return(-1);
271 } else 272 } else
272 goto inv_syntax; 273 goto inv_syntax;
273 while (isspace(*cp)) 274 while (isspace(*cp))
274 cp++; 275 cp++;
275 if (*cp) 276 if (*cp)
276 goto inv_syntax; 277 goto inv_syntax;
277 return update_rec_op(recno, 0x04, record, curfile_record_len); 278 return update_rec_op(recno, 0x04, record, pb_record_len);
278 } 279 }
279 280
280 cmd_pb_update(argc, argv) 281 cmd_pb_update(argc, argv)
281 char **argv; 282 char **argv;
282 { 283 {
301 fclose(inf); 302 fclose(inf);
302 return(-1); 303 return(-1);
303 } 304 }
304 if (linebuf[0] != '#' || !isdigit(linebuf[1])) 305 if (linebuf[0] != '#' || !isdigit(linebuf[1]))
305 continue; 306 continue;
306 rc = process_record(linebuf, argv[2], lineno); 307 rc = process_record(linebuf, curfile_record_len,
308 curfile_record_count, argv[2], lineno);
307 if (rc < 0) { 309 if (rc < 0) {
308 fclose(inf); 310 fclose(inf);
309 return(rc); 311 return(rc);
310 } 312 }
311 } 313 }
360 goto inv_arg; 362 goto inv_arg;
361 return(0); 363 return(0);
362 } 364 }
363 365
364 static 366 static
365 decode_alphatag_arg(arg, record) 367 decode_alphatag_arg(arg, record, maxlen)
366 char *arg; 368 char *arg;
367 u_char *record; 369 u_char *record;
368 { 370 unsigned maxlen;
369 unsigned maxlen, acclen, nadd; 371 {
372 unsigned acclen, nadd;
370 char *cp; 373 char *cp;
371 int c; 374 int c;
372 375
373 maxlen = curfile_record_len - 14;
374 cp = arg; 376 cp = arg;
375 for (acclen = 0; *cp; ) { 377 for (acclen = 0; *cp; ) {
376 c = *cp++; 378 c = *cp++;
377 if (c == '\\') { 379 if (c == '\\') {
378 if (*cp == '\0') { 380 if (*cp == '\0') {
438 fixp = record + curfile_record_len - 14; 440 fixp = record + curfile_record_len - 14;
439 rc = decode_number_arg(argv[3], fixp); 441 rc = decode_number_arg(argv[3], fixp);
440 if (rc < 0) 442 if (rc < 0)
441 return(rc); 443 return(rc);
442 if (argv[4]) { 444 if (argv[4]) {
443 rc = decode_alphatag_arg(argv[4], record); 445 rc = decode_alphatag_arg(argv[4], record,
446 curfile_record_len - 14);
444 if (rc < 0) 447 if (rc < 0)
445 return(rc); 448 return(rc);
446 } 449 }
447 return update_rec_op(recno, 0x04, record, curfile_record_len); 450 return update_rec_op(recno, 0x04, record, curfile_record_len);
448 } 451 }
449 452
450 static 453 static
451 decode_alphatag_arg_hex(arg, record) 454 decode_alphatag_arg_hex(arg, record, maxlen)
452 char *arg; 455 char *arg;
453 u_char *record; 456 u_char *record;
454 { 457 unsigned maxlen;
455 unsigned maxlen, acclen; 458 {
456 459 unsigned acclen;
457 maxlen = curfile_record_len - 14; 460
458 for (acclen = 0; ; acclen++) { 461 for (acclen = 0; ; acclen++) {
459 while (isspace(*arg)) 462 while (isspace(*arg))
460 arg++; 463 arg++;
461 if (!*arg) 464 if (!*arg)
462 break; 465 break;
494 memset(record, 0xFF, curfile_record_len); 497 memset(record, 0xFF, curfile_record_len);
495 fixp = record + curfile_record_len - 14; 498 fixp = record + curfile_record_len - 14;
496 rc = decode_number_arg(argv[3], fixp); 499 rc = decode_number_arg(argv[3], fixp);
497 if (rc < 0) 500 if (rc < 0)
498 return(rc); 501 return(rc);
499 rc = decode_alphatag_arg_hex(argv[4], record); 502 rc = decode_alphatag_arg_hex(argv[4], record, curfile_record_len - 14);
500 if (rc < 0) 503 if (rc < 0)
501 return(rc); 504 return(rc);
502 return update_rec_op(recno, 0x04, record, curfile_record_len); 505 return update_rec_op(recno, 0x04, record, curfile_record_len);
503 } 506 }