1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71
| static int parse_cmd(int argc, char **argv) { int opt; // getopt_long() 每次的返回值,一般让长选项返回0,短选项返回各自的值 int long_opt; // getopt_long() 每次的返回实际选项中的 option->val int long_opt_idx; // getopt_long() 每次的返回的实际选项在 longopts 中的index // 这个enum方便标记option中的val enum { O_DEV, O_ALG, O_IMPORT, }; // 这里是实际选项 struct option long_opts[] = { {"dev", required_argument, &long_opt, O_DEV}, {"alg", required_argument, &long_opt, O_ALG}, {"import", no_argument, &long_opt, O_IMPORT}, {0, 0, 0, 0}, }; // 可以设置一部分短选项 char *optstr = "a:b:"; }
while ((opt = getopt_long(argc, argv, optstr, long_opts, &long_opt_idx)) != -1) { switch (opt) { case 0: // option->flag 不为NULL时,getopt_long() 返回0,同时会在long_opt中返回 option->val // option->flag 为NULL 时,getopt_long() 返回 option->val 的值,这时候需要跟短选项的值区分开 switch (long_opt) { case O_DEV: mc.dev = atoi(optarg); break;
case O_ALG: if (strcasecmp(optarg, "rsa") == 0) { mc.algo = XCRYPTO_ALGO_RSA; mc.opt = OPT_RSA; } else if (strcasecmp(optarg, "sm1") == 0) { mc.algo = XCRYPTO_ALGO_SM1; mc.opt = OPT_SM1; } else if (strcasecmp(optarg, "sm2") == 0) { mc.algo = XCRYPTO_ALGO_SM2; mc.opt = OPT_SM2; } else if (strcasecmp(optarg, "sm3") == 0) { mc.algo = XCRYPTO_ALGO_SM3; mc.opt = OPT_SM3; } else if (strcasecmp(optarg, "sm4") == 0) { mc.algo = XCRYPTO_ALGO_SM4; mc.opt = OPT_SM4; } else { xb_log_error("unsupport alg: %s", optarg); err = 1; } break;
case O_IMPORT: mc.inout = 1; break;
// 这里是短选项的值 case 'a': xb_log_debug("====>ind %d, %s, %s", optind, argv[optind], optarg); break; case 'b': xb_log_debug("====>ind %d, %s, %s", optind, argv[optind], optarg); break; default: err = 1; break; } }
|