comparison simtool/dispatch.c @ 124:6c4567dd8946

fc-simtool: add non-interactive one-shot command (or script) mode
author Mychaela Falconia <falcon@freecalypso.org>
date Thu, 28 Jan 2021 18:56:34 +0000
parents b391204d3cd5
children 141489d31667
comparison
equal deleted inserted replaced
123:b391204d3cd5 124:6c4567dd8946
1 /* 1 /*
2 * This module implements the command dispatch for fc-simtool 2 * This module implements the command dispatch for fc-simtool
3 */ 3 */
4 4
5 #include <sys/types.h>
6 #include <ctype.h> 5 #include <ctype.h>
7 #include <stdio.h> 6 #include <stdio.h>
8 #include <string.h> 7 #include <string.h>
9 #include <strings.h> 8 #include <strings.h>
10 #include <stdlib.h> 9 #include <stdlib.h>
11 #include <pcsclite.h>
12 #include <winscard.h>
13 #include "globals.h"
14 10
15 extern int cmd_change_chv(); 11 extern int cmd_change_chv();
16 extern int cmd_disable_chv(); 12 extern int cmd_disable_chv();
17 extern int cmd_enable_chv(); 13 extern int cmd_enable_chv();
18 extern int cmd_exec(); 14 extern int cmd_exec();
41 extern int cmd_update_bin_imm(); 37 extern int cmd_update_bin_imm();
42 extern int cmd_update_rec(); 38 extern int cmd_update_rec();
43 extern int cmd_verify_chv(); 39 extern int cmd_verify_chv();
44 40
45 extern int display_sim_resp_in_hex(); 41 extern int display_sim_resp_in_hex();
46 42 extern int good_exit();
47 cmd_exit()
48 {
49 SCardDisconnect(hCard, SCARD_UNPOWER_CARD);
50 SCardReleaseContext(hContext);
51 exit(0);
52 }
53 43
54 static struct cmdtab { 44 static struct cmdtab {
55 char *cmd; 45 char *cmd;
56 int minargs; 46 int minargs;
57 int maxargs; 47 int maxargs;
64 {"disable-chv", 1, 1, cmd_disable_chv}, 54 {"disable-chv", 1, 1, cmd_disable_chv},
65 {"disable-pin", 1, 1, cmd_disable_chv}, 55 {"disable-pin", 1, 1, cmd_disable_chv},
66 {"enable-chv", 1, 1, cmd_enable_chv}, 56 {"enable-chv", 1, 1, cmd_enable_chv},
67 {"enable-pin", 1, 1, cmd_enable_chv}, 57 {"enable-pin", 1, 1, cmd_enable_chv},
68 {"exec", 1, 1, cmd_exec}, 58 {"exec", 1, 1, cmd_exec},
69 {"exit", 0, 0, cmd_exit}, 59 {"exit", 0, 0, good_exit},
70 {"fix-sysmo-msisdn", 0, 0, cmd_fix_sysmo_msisdn}, 60 {"fix-sysmo-msisdn", 0, 0, cmd_fix_sysmo_msisdn},
71 {"iccid", 0, 0, cmd_iccid}, 61 {"iccid", 0, 0, cmd_iccid},
72 {"imsi", 0, 0, cmd_imsi}, 62 {"imsi", 0, 0, cmd_imsi},
73 {"pb-dump", 1, 2, cmd_pb_dump}, 63 {"pb-dump", 1, 2, cmd_pb_dump},
74 {"pb-dump-rec", 2, 3, cmd_pb_dump_rec}, 64 {"pb-dump-rec", 2, 3, cmd_pb_dump_rec},
76 {"pb-erase-one", 2, 2, cmd_pb_erase_one}, 66 {"pb-erase-one", 2, 2, cmd_pb_erase_one},
77 {"pb-erase-range", 3, 3, cmd_pb_erase_range}, 67 {"pb-erase-range", 3, 3, cmd_pb_erase_range},
78 {"pb-update", 2, 2, cmd_pb_update}, 68 {"pb-update", 2, 2, cmd_pb_update},
79 {"pb-update-imm", 3, 4, cmd_pb_update_imm}, 69 {"pb-update-imm", 3, 4, cmd_pb_update_imm},
80 {"pb-update-imm-hex", 4, 4, cmd_pb_update_imm_hex}, 70 {"pb-update-imm-hex", 4, 4, cmd_pb_update_imm_hex},
81 {"quit", 0, 0, cmd_exit}, 71 {"quit", 0, 0, good_exit},
82 {"readbin", 2, 2, cmd_readbin}, 72 {"readbin", 2, 2, cmd_readbin},
83 {"readef", 1, 1, cmd_readef}, 73 {"readef", 1, 1, cmd_readef},
84 {"readrec", 1, 2, cmd_readrec}, 74 {"readrec", 1, 2, cmd_readrec},
85 {"restore-file", 2, 2, cmd_restore_file}, 75 {"restore-file", 2, 2, cmd_restore_file},
86 {"savebin", 2, 2, cmd_savebin}, 76 {"savebin", 2, 2, cmd_savebin},
167 return(-1); 157 return(-1);
168 } 158 }
169 *ap = 0; 159 *ap = 0;
170 return tp->func(ap - argv, argv); 160 return tp->func(ap - argv, argv);
171 } 161 }
162
163 dispatch_ready_argv(argc, argv)
164 char **argv;
165 {
166 struct cmdtab *tp;
167
168 for (tp = cmdtab; tp->cmd; tp++)
169 if (!strcmp(tp->cmd, argv[0]))
170 break;
171 if (!tp->func) {
172 fprintf(stderr, "error: no such command\n");
173 return(-1);
174 }
175 if (argc - 1 > tp->maxargs) {
176 fprintf(stderr, "error: too many arguments\n");
177 return(-1);
178 }
179 if (argc - 1 < tp->minargs) {
180 fprintf(stderr, "error: too few arguments\n");
181 return(-1);
182 }
183 return tp->func(argc, argv);
184 }