static errcode_t parse_hashalg(struct super_set_info *info, char *arg) { int hashv; unsigned char *p = (unsigned char *) info->ptr; hashv = e2p_string2hash(arg); if (hashv < 0) { fprintf(stderr, "Invalid hash algorithm: %s\n", arg); return EINVAL; } *p = hashv; return 0; }
void do_dx_hash(int argc, char *argv[]) { ext2_dirhash_t hash, minor_hash; errcode_t err; int c; int hash_version = 0; __u32 hash_seed[4]; hash_seed[0] = hash_seed[1] = hash_seed[2] = hash_seed[3] = 0; reset_getopt(); while ((c = getopt (argc, argv, "h:s:")) != EOF) { switch (c) { case 'h': hash_version = e2p_string2hash(optarg); if (hash_version < 0) hash_version = atoi(optarg); break; case 's': if (uuid_parse(optarg, (unsigned char *) hash_seed)) { fprintf(stderr, "Invalid UUID format: %s\n", optarg); return; } break; default: goto print_usage; } } if (optind != argc-1) { print_usage: com_err(argv[0], 0, "usage: dx_hash [-h hash_alg] " "[-s hash_seed] filename"); return; } err = ext2fs_dirhash(hash_version, argv[optind], strlen(argv[optind]), hash_seed, &hash, &minor_hash); if (err) { com_err(argv[0], err, "while caclulating hash"); return; } printf("Hash of %s is 0x%0x (minor 0x%0x)\n", argv[optind], hash, minor_hash); }