FreeCalypso > hg > fc-pcsc-tools
annotate simtool/smsp_restore.c @ 74:8562d8508cf2
grcard2-set-{adm,super}-hex commands implemented
It appears that GrcardSIM2 cards allow arbitrary 64-bit keys
for ADM and SUPER ADM, not necessarily consisting of ASCII digits
like the specs require for standard PIN and PUK, and pySim-prog.py
in fact sets the ADM key to 4444444444444444 in hex by default,
which is not an ASCII digit string. If the cards allow such keys,
we need to support them too.
author | Mychaela Falconia <falcon@freecalypso.org> |
---|---|
date | Tue, 16 Feb 2021 04:10:36 +0000 |
parents | 8cb269f5a902 |
children | 9c10afbb745a |
rev | line source |
---|---|
1
2071b28cd0c7
simtool: first refactored version
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
1 /* |
39
2467b7acad1f
fc-simtool smsp-restore implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
18
diff
changeset
|
2 * This module implements the smsp-restore command. |
1
2071b28cd0c7
simtool: first refactored version
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
3 */ |
2071b28cd0c7
simtool: first refactored version
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
4 |
2071b28cd0c7
simtool: first refactored version
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
5 #include <sys/types.h> |
2071b28cd0c7
simtool: first refactored version
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
6 #include <ctype.h> |
2071b28cd0c7
simtool: first refactored version
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
7 #include <string.h> |
2071b28cd0c7
simtool: first refactored version
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
8 #include <strings.h> |
2071b28cd0c7
simtool: first refactored version
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
9 #include <stdio.h> |
2071b28cd0c7
simtool: first refactored version
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
10 #include <stdlib.h> |
2071b28cd0c7
simtool: first refactored version
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
11 #include "curfile.h" |
2071b28cd0c7
simtool: first refactored version
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
12 |
18
2ef261371347
alpha tag from file parsing functions factored out of pb-update
Mychaela Falconia <falcon@freecalypso.org>
parents:
13
diff
changeset
|
13 extern char *alpha_from_file_qstring(); |
2ef261371347
alpha tag from file parsing functions factored out of pb-update
Mychaela Falconia <falcon@freecalypso.org>
parents:
13
diff
changeset
|
14 extern char *alpha_from_file_hex(); |
1
2071b28cd0c7
simtool: first refactored version
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
15 |
39
2467b7acad1f
fc-simtool smsp-restore implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
18
diff
changeset
|
16 static char * |
2467b7acad1f
fc-simtool smsp-restore implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
18
diff
changeset
|
17 parse_da(cp, bina, filename_for_errs, lineno_for_errs) |
2467b7acad1f
fc-simtool smsp-restore implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
18
diff
changeset
|
18 char *cp, *filename_for_errs; |
2467b7acad1f
fc-simtool smsp-restore implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
18
diff
changeset
|
19 u_char *bina; |
2467b7acad1f
fc-simtool smsp-restore implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
18
diff
changeset
|
20 { |
2467b7acad1f
fc-simtool smsp-restore implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
18
diff
changeset
|
21 u_char digits[20]; |
2467b7acad1f
fc-simtool smsp-restore implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
18
diff
changeset
|
22 unsigned ndigits, num_digit_bytes; |
2467b7acad1f
fc-simtool smsp-restore implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
18
diff
changeset
|
23 int c; |
2467b7acad1f
fc-simtool smsp-restore implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
18
diff
changeset
|
24 |
2467b7acad1f
fc-simtool smsp-restore implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
18
diff
changeset
|
25 if (digit_char_to_gsm(*cp) < 0) { |
2467b7acad1f
fc-simtool smsp-restore implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
18
diff
changeset
|
26 inv_syntax: fprintf(stderr, "%s line %d: DA= parameter invalid syntax\n", |
2467b7acad1f
fc-simtool smsp-restore implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
18
diff
changeset
|
27 filename_for_errs, lineno_for_errs); |
2467b7acad1f
fc-simtool smsp-restore implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
18
diff
changeset
|
28 return(0); |
2467b7acad1f
fc-simtool smsp-restore implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
18
diff
changeset
|
29 } |
2467b7acad1f
fc-simtool smsp-restore implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
18
diff
changeset
|
30 for (ndigits = 0; ; ndigits++) { |
2467b7acad1f
fc-simtool smsp-restore implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
18
diff
changeset
|
31 c = digit_char_to_gsm(*cp); |
2467b7acad1f
fc-simtool smsp-restore implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
18
diff
changeset
|
32 if (c < 0) |
2467b7acad1f
fc-simtool smsp-restore implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
18
diff
changeset
|
33 break; |
2467b7acad1f
fc-simtool smsp-restore implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
18
diff
changeset
|
34 cp++; |
2467b7acad1f
fc-simtool smsp-restore implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
18
diff
changeset
|
35 if (ndigits >= 20) { |
2467b7acad1f
fc-simtool smsp-restore implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
18
diff
changeset
|
36 fprintf(stderr, "%s line %d: too many number digits\n", |
2467b7acad1f
fc-simtool smsp-restore implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
18
diff
changeset
|
37 filename_for_errs, lineno_for_errs); |
2467b7acad1f
fc-simtool smsp-restore implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
18
diff
changeset
|
38 return(0); |
2467b7acad1f
fc-simtool smsp-restore implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
18
diff
changeset
|
39 } |
2467b7acad1f
fc-simtool smsp-restore implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
18
diff
changeset
|
40 digits[ndigits] = c; |
2467b7acad1f
fc-simtool smsp-restore implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
18
diff
changeset
|
41 } |
2467b7acad1f
fc-simtool smsp-restore implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
18
diff
changeset
|
42 bina[0] = ndigits; |
2467b7acad1f
fc-simtool smsp-restore implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
18
diff
changeset
|
43 if (ndigits & 1) |
2467b7acad1f
fc-simtool smsp-restore implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
18
diff
changeset
|
44 digits[ndigits++] = 0xF; |
2467b7acad1f
fc-simtool smsp-restore implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
18
diff
changeset
|
45 num_digit_bytes = ndigits >> 1; |
2467b7acad1f
fc-simtool smsp-restore implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
18
diff
changeset
|
46 pack_digit_bytes(digits, bina + 2, num_digit_bytes); |
2467b7acad1f
fc-simtool smsp-restore implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
18
diff
changeset
|
47 if (*cp++ != ',') |
2467b7acad1f
fc-simtool smsp-restore implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
18
diff
changeset
|
48 goto inv_syntax; |
2467b7acad1f
fc-simtool smsp-restore implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
18
diff
changeset
|
49 if (cp[0] != '0' || cp[1] != 'x' && cp[1] != 'X' || !isxdigit(cp[2]) || |
2467b7acad1f
fc-simtool smsp-restore implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
18
diff
changeset
|
50 !isxdigit(cp[3]) || !isspace(cp[4])) |
2467b7acad1f
fc-simtool smsp-restore implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
18
diff
changeset
|
51 goto inv_syntax; |
2467b7acad1f
fc-simtool smsp-restore implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
18
diff
changeset
|
52 bina[1] = strtoul(cp, 0, 16); |
2467b7acad1f
fc-simtool smsp-restore implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
18
diff
changeset
|
53 cp += 5; |
2467b7acad1f
fc-simtool smsp-restore implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
18
diff
changeset
|
54 while (isspace(*cp)) |
2467b7acad1f
fc-simtool smsp-restore implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
18
diff
changeset
|
55 cp++; |
2467b7acad1f
fc-simtool smsp-restore implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
18
diff
changeset
|
56 return(cp); |
2467b7acad1f
fc-simtool smsp-restore implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
18
diff
changeset
|
57 } |
2467b7acad1f
fc-simtool smsp-restore implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
18
diff
changeset
|
58 |
2467b7acad1f
fc-simtool smsp-restore implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
18
diff
changeset
|
59 static char * |
2467b7acad1f
fc-simtool smsp-restore implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
18
diff
changeset
|
60 parse_sc(cp, bina, filename_for_errs, lineno_for_errs) |
2467b7acad1f
fc-simtool smsp-restore implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
18
diff
changeset
|
61 char *cp, *filename_for_errs; |
2467b7acad1f
fc-simtool smsp-restore implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
18
diff
changeset
|
62 u_char *bina; |
2467b7acad1f
fc-simtool smsp-restore implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
18
diff
changeset
|
63 { |
2467b7acad1f
fc-simtool smsp-restore implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
18
diff
changeset
|
64 u_char digits[20]; |
2467b7acad1f
fc-simtool smsp-restore implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
18
diff
changeset
|
65 unsigned ndigits, num_digit_bytes; |
2467b7acad1f
fc-simtool smsp-restore implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
18
diff
changeset
|
66 int c; |
2467b7acad1f
fc-simtool smsp-restore implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
18
diff
changeset
|
67 |
2467b7acad1f
fc-simtool smsp-restore implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
18
diff
changeset
|
68 if (digit_char_to_gsm(*cp) < 0) { |
2467b7acad1f
fc-simtool smsp-restore implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
18
diff
changeset
|
69 inv_syntax: fprintf(stderr, "%s line %d: SC= parameter invalid syntax\n", |
2467b7acad1f
fc-simtool smsp-restore implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
18
diff
changeset
|
70 filename_for_errs, lineno_for_errs); |
2467b7acad1f
fc-simtool smsp-restore implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
18
diff
changeset
|
71 return(0); |
2467b7acad1f
fc-simtool smsp-restore implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
18
diff
changeset
|
72 } |
2467b7acad1f
fc-simtool smsp-restore implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
18
diff
changeset
|
73 for (ndigits = 0; ; ndigits++) { |
2467b7acad1f
fc-simtool smsp-restore implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
18
diff
changeset
|
74 c = digit_char_to_gsm(*cp); |
2467b7acad1f
fc-simtool smsp-restore implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
18
diff
changeset
|
75 if (c < 0) |
2467b7acad1f
fc-simtool smsp-restore implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
18
diff
changeset
|
76 break; |
2467b7acad1f
fc-simtool smsp-restore implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
18
diff
changeset
|
77 cp++; |
2467b7acad1f
fc-simtool smsp-restore implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
18
diff
changeset
|
78 if (ndigits >= 20) { |
2467b7acad1f
fc-simtool smsp-restore implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
18
diff
changeset
|
79 fprintf(stderr, "%s line %d: too many number digits\n", |
2467b7acad1f
fc-simtool smsp-restore implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
18
diff
changeset
|
80 filename_for_errs, lineno_for_errs); |
2467b7acad1f
fc-simtool smsp-restore implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
18
diff
changeset
|
81 return(0); |
2467b7acad1f
fc-simtool smsp-restore implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
18
diff
changeset
|
82 } |
2467b7acad1f
fc-simtool smsp-restore implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
18
diff
changeset
|
83 digits[ndigits] = c; |
2467b7acad1f
fc-simtool smsp-restore implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
18
diff
changeset
|
84 } |
2467b7acad1f
fc-simtool smsp-restore implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
18
diff
changeset
|
85 if (ndigits & 1) |
2467b7acad1f
fc-simtool smsp-restore implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
18
diff
changeset
|
86 digits[ndigits++] = 0xF; |
2467b7acad1f
fc-simtool smsp-restore implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
18
diff
changeset
|
87 num_digit_bytes = ndigits >> 1; |
2467b7acad1f
fc-simtool smsp-restore implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
18
diff
changeset
|
88 bina[0] = num_digit_bytes + 1; |
2467b7acad1f
fc-simtool smsp-restore implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
18
diff
changeset
|
89 pack_digit_bytes(digits, bina + 2, num_digit_bytes); |
2467b7acad1f
fc-simtool smsp-restore implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
18
diff
changeset
|
90 if (*cp++ != ',') |
2467b7acad1f
fc-simtool smsp-restore implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
18
diff
changeset
|
91 goto inv_syntax; |
2467b7acad1f
fc-simtool smsp-restore implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
18
diff
changeset
|
92 if (cp[0] != '0' || cp[1] != 'x' && cp[1] != 'X' || !isxdigit(cp[2]) || |
2467b7acad1f
fc-simtool smsp-restore implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
18
diff
changeset
|
93 !isxdigit(cp[3]) || !isspace(cp[4])) |
2467b7acad1f
fc-simtool smsp-restore implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
18
diff
changeset
|
94 goto inv_syntax; |
2467b7acad1f
fc-simtool smsp-restore implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
18
diff
changeset
|
95 bina[1] = strtoul(cp, 0, 16); |
2467b7acad1f
fc-simtool smsp-restore implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
18
diff
changeset
|
96 cp += 5; |
2467b7acad1f
fc-simtool smsp-restore implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
18
diff
changeset
|
97 while (isspace(*cp)) |
2467b7acad1f
fc-simtool smsp-restore implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
18
diff
changeset
|
98 cp++; |
2467b7acad1f
fc-simtool smsp-restore implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
18
diff
changeset
|
99 return(cp); |
2467b7acad1f
fc-simtool smsp-restore implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
18
diff
changeset
|
100 } |
2467b7acad1f
fc-simtool smsp-restore implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
18
diff
changeset
|
101 |
1
2071b28cd0c7
simtool: first refactored version
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
102 static |
39
2467b7acad1f
fc-simtool smsp-restore implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
18
diff
changeset
|
103 process_record(line, filename_for_errs, lineno_for_errs) |
1
2071b28cd0c7
simtool: first refactored version
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
104 char *line, *filename_for_errs; |
2071b28cd0c7
simtool: first refactored version
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
105 { |
2071b28cd0c7
simtool: first refactored version
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
106 unsigned recno; |
2071b28cd0c7
simtool: first refactored version
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
107 u_char record[255], *fixp; |
2071b28cd0c7
simtool: first refactored version
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
108 char *cp; |
2071b28cd0c7
simtool: first refactored version
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
109 |
2071b28cd0c7
simtool: first refactored version
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
110 recno = strtoul(line+1, 0, 10); |
39
2467b7acad1f
fc-simtool smsp-restore implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
18
diff
changeset
|
111 if (recno < 1 || recno > curfile_record_count) { |
1
2071b28cd0c7
simtool: first refactored version
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
112 fprintf(stderr, "%s line %d: record number is out of range\n", |
2071b28cd0c7
simtool: first refactored version
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
113 filename_for_errs, lineno_for_errs); |
2071b28cd0c7
simtool: first refactored version
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
114 return(-1); |
2071b28cd0c7
simtool: first refactored version
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
115 } |
2071b28cd0c7
simtool: first refactored version
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
116 cp = line + 1; |
2071b28cd0c7
simtool: first refactored version
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
117 while (isdigit(*cp)) |
2071b28cd0c7
simtool: first refactored version
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
118 cp++; |
2071b28cd0c7
simtool: first refactored version
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
119 if (*cp++ != ':') { |
2071b28cd0c7
simtool: first refactored version
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
120 inv_syntax: fprintf(stderr, "%s line %d: invalid syntax\n", |
2071b28cd0c7
simtool: first refactored version
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
121 filename_for_errs, lineno_for_errs); |
2071b28cd0c7
simtool: first refactored version
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
122 return(-1); |
2071b28cd0c7
simtool: first refactored version
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
123 } |
2071b28cd0c7
simtool: first refactored version
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
124 while (isspace(*cp)) |
2071b28cd0c7
simtool: first refactored version
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
125 cp++; |
39
2467b7acad1f
fc-simtool smsp-restore implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
18
diff
changeset
|
126 memset(record, 0xFF, curfile_record_len); |
2467b7acad1f
fc-simtool smsp-restore implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
18
diff
changeset
|
127 fixp = record + curfile_record_len - 28; |
2467b7acad1f
fc-simtool smsp-restore implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
18
diff
changeset
|
128 if (!strncasecmp(cp, "DA=", 3)) { |
2467b7acad1f
fc-simtool smsp-restore implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
18
diff
changeset
|
129 cp += 3; |
2467b7acad1f
fc-simtool smsp-restore implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
18
diff
changeset
|
130 cp = parse_da(cp, fixp + 1, filename_for_errs, lineno_for_errs); |
2467b7acad1f
fc-simtool smsp-restore implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
18
diff
changeset
|
131 if (!cp) |
2467b7acad1f
fc-simtool smsp-restore implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
18
diff
changeset
|
132 return(-1); |
2467b7acad1f
fc-simtool smsp-restore implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
18
diff
changeset
|
133 fixp[0] &= 0xFE; |
2467b7acad1f
fc-simtool smsp-restore implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
18
diff
changeset
|
134 } |
2467b7acad1f
fc-simtool smsp-restore implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
18
diff
changeset
|
135 if (!strncasecmp(cp, "SC=", 3)) { |
2467b7acad1f
fc-simtool smsp-restore implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
18
diff
changeset
|
136 cp += 3; |
2467b7acad1f
fc-simtool smsp-restore implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
18
diff
changeset
|
137 cp = parse_sc(cp, fixp+13, filename_for_errs, lineno_for_errs); |
2467b7acad1f
fc-simtool smsp-restore implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
18
diff
changeset
|
138 if (!cp) |
2467b7acad1f
fc-simtool smsp-restore implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
18
diff
changeset
|
139 return(-1); |
2467b7acad1f
fc-simtool smsp-restore implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
18
diff
changeset
|
140 fixp[0] &= 0xFD; |
2467b7acad1f
fc-simtool smsp-restore implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
18
diff
changeset
|
141 } |
2467b7acad1f
fc-simtool smsp-restore implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
18
diff
changeset
|
142 if (!strncasecmp(cp, "PID=", 4)) { |
2467b7acad1f
fc-simtool smsp-restore implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
18
diff
changeset
|
143 cp += 4; |
2467b7acad1f
fc-simtool smsp-restore implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
18
diff
changeset
|
144 if (!isdigit(*cp)) { |
2467b7acad1f
fc-simtool smsp-restore implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
18
diff
changeset
|
145 fprintf(stderr, |
2467b7acad1f
fc-simtool smsp-restore implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
18
diff
changeset
|
146 "%s line %d: PID= parameter invalid syntax\n", |
1
2071b28cd0c7
simtool: first refactored version
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
147 filename_for_errs, lineno_for_errs); |
2071b28cd0c7
simtool: first refactored version
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
148 return(-1); |
2071b28cd0c7
simtool: first refactored version
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
149 } |
39
2467b7acad1f
fc-simtool smsp-restore implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
18
diff
changeset
|
150 fixp[25] = strtoul(cp, 0, 0); |
41
8cb269f5a902
fc-simtool smsp-restore: forgot to set parameter indicator bits
Mychaela Falconia <falcon@freecalypso.org>
parents:
39
diff
changeset
|
151 fixp[0] &= 0xFB; |
1
2071b28cd0c7
simtool: first refactored version
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
152 while (*cp && !isspace(*cp)) |
2071b28cd0c7
simtool: first refactored version
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
153 cp++; |
2071b28cd0c7
simtool: first refactored version
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
154 while (isspace(*cp)) |
2071b28cd0c7
simtool: first refactored version
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
155 cp++; |
2071b28cd0c7
simtool: first refactored version
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
156 } |
39
2467b7acad1f
fc-simtool smsp-restore implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
18
diff
changeset
|
157 if (!strncasecmp(cp, "DCS=", 4)) { |
1
2071b28cd0c7
simtool: first refactored version
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
158 cp += 4; |
39
2467b7acad1f
fc-simtool smsp-restore implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
18
diff
changeset
|
159 if (!isdigit(*cp)) { |
2467b7acad1f
fc-simtool smsp-restore implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
18
diff
changeset
|
160 fprintf(stderr, |
2467b7acad1f
fc-simtool smsp-restore implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
18
diff
changeset
|
161 "%s line %d: DCS= parameter invalid syntax\n", |
2467b7acad1f
fc-simtool smsp-restore implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
18
diff
changeset
|
162 filename_for_errs, lineno_for_errs); |
2467b7acad1f
fc-simtool smsp-restore implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
18
diff
changeset
|
163 return(-1); |
2467b7acad1f
fc-simtool smsp-restore implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
18
diff
changeset
|
164 } |
2467b7acad1f
fc-simtool smsp-restore implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
18
diff
changeset
|
165 fixp[26] = strtoul(cp, 0, 0); |
41
8cb269f5a902
fc-simtool smsp-restore: forgot to set parameter indicator bits
Mychaela Falconia <falcon@freecalypso.org>
parents:
39
diff
changeset
|
166 fixp[0] &= 0xF7; |
39
2467b7acad1f
fc-simtool smsp-restore implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
18
diff
changeset
|
167 while (*cp && !isspace(*cp)) |
2467b7acad1f
fc-simtool smsp-restore implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
18
diff
changeset
|
168 cp++; |
2467b7acad1f
fc-simtool smsp-restore implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
18
diff
changeset
|
169 while (isspace(*cp)) |
2467b7acad1f
fc-simtool smsp-restore implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
18
diff
changeset
|
170 cp++; |
2467b7acad1f
fc-simtool smsp-restore implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
18
diff
changeset
|
171 } |
2467b7acad1f
fc-simtool smsp-restore implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
18
diff
changeset
|
172 if (!strncasecmp(cp, "VP=", 3)) { |
2467b7acad1f
fc-simtool smsp-restore implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
18
diff
changeset
|
173 cp += 3; |
2467b7acad1f
fc-simtool smsp-restore implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
18
diff
changeset
|
174 if (!isdigit(*cp)) { |
2467b7acad1f
fc-simtool smsp-restore implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
18
diff
changeset
|
175 fprintf(stderr, |
2467b7acad1f
fc-simtool smsp-restore implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
18
diff
changeset
|
176 "%s line %d: VP= parameter invalid syntax\n", |
2467b7acad1f
fc-simtool smsp-restore implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
18
diff
changeset
|
177 filename_for_errs, lineno_for_errs); |
2467b7acad1f
fc-simtool smsp-restore implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
18
diff
changeset
|
178 return(-1); |
2467b7acad1f
fc-simtool smsp-restore implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
18
diff
changeset
|
179 } |
2467b7acad1f
fc-simtool smsp-restore implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
18
diff
changeset
|
180 fixp[27] = strtoul(cp, 0, 0); |
41
8cb269f5a902
fc-simtool smsp-restore: forgot to set parameter indicator bits
Mychaela Falconia <falcon@freecalypso.org>
parents:
39
diff
changeset
|
181 fixp[0] &= 0xEF; |
1
2071b28cd0c7
simtool: first refactored version
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
182 while (*cp && !isspace(*cp)) |
2071b28cd0c7
simtool: first refactored version
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
183 cp++; |
2071b28cd0c7
simtool: first refactored version
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
184 while (isspace(*cp)) |
2071b28cd0c7
simtool: first refactored version
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
185 cp++; |
2071b28cd0c7
simtool: first refactored version
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
186 } |
2071b28cd0c7
simtool: first refactored version
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
187 if (*cp == '"') { |
2071b28cd0c7
simtool: first refactored version
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
188 cp++; |
39
2467b7acad1f
fc-simtool smsp-restore implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
18
diff
changeset
|
189 cp = alpha_from_file_qstring(cp, record, |
2467b7acad1f
fc-simtool smsp-restore implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
18
diff
changeset
|
190 curfile_record_len - 28, |
18
2ef261371347
alpha tag from file parsing functions factored out of pb-update
Mychaela Falconia <falcon@freecalypso.org>
parents:
13
diff
changeset
|
191 filename_for_errs, |
2ef261371347
alpha tag from file parsing functions factored out of pb-update
Mychaela Falconia <falcon@freecalypso.org>
parents:
13
diff
changeset
|
192 lineno_for_errs); |
1
2071b28cd0c7
simtool: first refactored version
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
193 if (!cp) |
2071b28cd0c7
simtool: first refactored version
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
194 return(-1); |
2071b28cd0c7
simtool: first refactored version
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
195 } else if (!strncasecmp(cp, "HEX", 3)) { |
2071b28cd0c7
simtool: first refactored version
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
196 cp += 3; |
2071b28cd0c7
simtool: first refactored version
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
197 while (isspace(*cp)) |
2071b28cd0c7
simtool: first refactored version
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
198 cp++; |
39
2467b7acad1f
fc-simtool smsp-restore implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
18
diff
changeset
|
199 cp = alpha_from_file_hex(cp, record, curfile_record_len - 28, |
18
2ef261371347
alpha tag from file parsing functions factored out of pb-update
Mychaela Falconia <falcon@freecalypso.org>
parents:
13
diff
changeset
|
200 filename_for_errs, lineno_for_errs); |
1
2071b28cd0c7
simtool: first refactored version
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
201 if (!cp) |
2071b28cd0c7
simtool: first refactored version
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
202 return(-1); |
2071b28cd0c7
simtool: first refactored version
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
203 } else |
2071b28cd0c7
simtool: first refactored version
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
204 goto inv_syntax; |
2071b28cd0c7
simtool: first refactored version
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
205 while (isspace(*cp)) |
2071b28cd0c7
simtool: first refactored version
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
206 cp++; |
2071b28cd0c7
simtool: first refactored version
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
207 if (*cp) |
2071b28cd0c7
simtool: first refactored version
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
208 goto inv_syntax; |
39
2467b7acad1f
fc-simtool smsp-restore implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
18
diff
changeset
|
209 return update_rec_op(recno, 0x04, record, curfile_record_len); |
1
2071b28cd0c7
simtool: first refactored version
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
210 } |
2071b28cd0c7
simtool: first refactored version
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
211 |
39
2467b7acad1f
fc-simtool smsp-restore implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
18
diff
changeset
|
212 cmd_smsp_restore(argc, argv) |
1
2071b28cd0c7
simtool: first refactored version
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
213 char **argv; |
2071b28cd0c7
simtool: first refactored version
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
214 { |
2071b28cd0c7
simtool: first refactored version
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
215 int rc; |
2071b28cd0c7
simtool: first refactored version
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
216 FILE *inf; |
2071b28cd0c7
simtool: first refactored version
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
217 int lineno; |
2071b28cd0c7
simtool: first refactored version
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
218 char linebuf[1024]; |
2071b28cd0c7
simtool: first refactored version
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
219 |
39
2467b7acad1f
fc-simtool smsp-restore implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
18
diff
changeset
|
220 rc = select_ef_smsp(); |
1
2071b28cd0c7
simtool: first refactored version
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
221 if (rc < 0) |
2071b28cd0c7
simtool: first refactored version
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
222 return(rc); |
39
2467b7acad1f
fc-simtool smsp-restore implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
18
diff
changeset
|
223 inf = fopen(argv[1], "r"); |
1
2071b28cd0c7
simtool: first refactored version
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
224 if (!inf) { |
39
2467b7acad1f
fc-simtool smsp-restore implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
18
diff
changeset
|
225 perror(argv[1]); |
1
2071b28cd0c7
simtool: first refactored version
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
226 return(-1); |
2071b28cd0c7
simtool: first refactored version
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
227 } |
2071b28cd0c7
simtool: first refactored version
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
228 for (lineno = 1; fgets(linebuf, sizeof linebuf, inf); lineno++) { |
2071b28cd0c7
simtool: first refactored version
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
229 if (!index(linebuf, '\n')) { |
2071b28cd0c7
simtool: first refactored version
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
230 fprintf(stderr, |
2071b28cd0c7
simtool: first refactored version
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
231 "%s line %d: too long or missing newline\n", |
39
2467b7acad1f
fc-simtool smsp-restore implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
18
diff
changeset
|
232 argv[1], lineno); |
1
2071b28cd0c7
simtool: first refactored version
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
233 fclose(inf); |
2071b28cd0c7
simtool: first refactored version
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
234 return(-1); |
2071b28cd0c7
simtool: first refactored version
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
235 } |
2071b28cd0c7
simtool: first refactored version
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
236 if (linebuf[0] != '#' || !isdigit(linebuf[1])) |
2071b28cd0c7
simtool: first refactored version
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
237 continue; |
39
2467b7acad1f
fc-simtool smsp-restore implemented
Mychaela Falconia <falcon@freecalypso.org>
parents:
18
diff
changeset
|
238 rc = process_record(linebuf, argv[1], lineno); |
1
2071b28cd0c7
simtool: first refactored version
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
239 if (rc < 0) { |
2071b28cd0c7
simtool: first refactored version
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
240 fclose(inf); |
2071b28cd0c7
simtool: first refactored version
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
241 return(rc); |
2071b28cd0c7
simtool: first refactored version
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
242 } |
2071b28cd0c7
simtool: first refactored version
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
243 } |
2071b28cd0c7
simtool: first refactored version
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
244 fclose(inf); |
2071b28cd0c7
simtool: first refactored version
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
245 return(0); |
2071b28cd0c7
simtool: first refactored version
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff
changeset
|
246 } |