1f61fc0b5d98ef2455252d596e7b20131526d6762Theodore Ts'o/* 2f61fc0b5d98ef2455252d596e7b20131526d6762Theodore Ts'o * feature.c --- convert between features and strings 3efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o * 4f61fc0b5d98ef2455252d596e7b20131526d6762Theodore Ts'o * Copyright (C) 1999 Theodore Ts'o <tytso@mit.edu> 5efc6f628e15de95bcd13e4f0ee223cb42115d520Theodore Ts'o * 6543547a52a20cb7e69d74921b2f691078fd55d83Theodore Ts'o * %Begin-Header% 7543547a52a20cb7e69d74921b2f691078fd55d83Theodore Ts'o * This file may be redistributed under the terms of the GNU Library 8543547a52a20cb7e69d74921b2f691078fd55d83Theodore Ts'o * General Public License, version 2. 9543547a52a20cb7e69d74921b2f691078fd55d83Theodore Ts'o * %End-Header% 10f61fc0b5d98ef2455252d596e7b20131526d6762Theodore Ts'o */ 11f61fc0b5d98ef2455252d596e7b20131526d6762Theodore Ts'o 12f61fc0b5d98ef2455252d596e7b20131526d6762Theodore Ts'o#include <stdio.h> 13f61fc0b5d98ef2455252d596e7b20131526d6762Theodore Ts'o#include <stdlib.h> 14f61fc0b5d98ef2455252d596e7b20131526d6762Theodore Ts'o#include <string.h> 15f61fc0b5d98ef2455252d596e7b20131526d6762Theodore Ts'o#include <ctype.h> 16f61fc0b5d98ef2455252d596e7b20131526d6762Theodore Ts'o#include <errno.h> 17f61fc0b5d98ef2455252d596e7b20131526d6762Theodore Ts'o 18f61fc0b5d98ef2455252d596e7b20131526d6762Theodore Ts'o#include "e2p.h" 19f61fc0b5d98ef2455252d596e7b20131526d6762Theodore Ts'o 20f61fc0b5d98ef2455252d596e7b20131526d6762Theodore Ts'ostruct hash { 21f61fc0b5d98ef2455252d596e7b20131526d6762Theodore Ts'o int num; 22f61fc0b5d98ef2455252d596e7b20131526d6762Theodore Ts'o const char *string; 23f61fc0b5d98ef2455252d596e7b20131526d6762Theodore Ts'o}; 24f61fc0b5d98ef2455252d596e7b20131526d6762Theodore Ts'o 25f61fc0b5d98ef2455252d596e7b20131526d6762Theodore Ts'ostatic struct hash hash_list[] = { 26f61fc0b5d98ef2455252d596e7b20131526d6762Theodore Ts'o { EXT2_HASH_LEGACY, "legacy" }, 27f61fc0b5d98ef2455252d596e7b20131526d6762Theodore Ts'o { EXT2_HASH_HALF_MD4, "half_md4" }, 28f61fc0b5d98ef2455252d596e7b20131526d6762Theodore Ts'o { EXT2_HASH_TEA, "tea" }, 29f61fc0b5d98ef2455252d596e7b20131526d6762Theodore Ts'o { 0, 0 }, 30f61fc0b5d98ef2455252d596e7b20131526d6762Theodore Ts'o}; 31f61fc0b5d98ef2455252d596e7b20131526d6762Theodore Ts'o 32f61fc0b5d98ef2455252d596e7b20131526d6762Theodore Ts'oconst char *e2p_hash2string(int num) 33f61fc0b5d98ef2455252d596e7b20131526d6762Theodore Ts'o{ 34f61fc0b5d98ef2455252d596e7b20131526d6762Theodore Ts'o struct hash *p; 35f61fc0b5d98ef2455252d596e7b20131526d6762Theodore Ts'o static char buf[20]; 36f61fc0b5d98ef2455252d596e7b20131526d6762Theodore Ts'o 37f61fc0b5d98ef2455252d596e7b20131526d6762Theodore Ts'o for (p = hash_list; p->string; p++) { 38f61fc0b5d98ef2455252d596e7b20131526d6762Theodore Ts'o if (num == p->num) 39f61fc0b5d98ef2455252d596e7b20131526d6762Theodore Ts'o return p->string; 40f61fc0b5d98ef2455252d596e7b20131526d6762Theodore Ts'o } 41f61fc0b5d98ef2455252d596e7b20131526d6762Theodore Ts'o sprintf(buf, "HASHALG_%d", num); 42f61fc0b5d98ef2455252d596e7b20131526d6762Theodore Ts'o return buf; 43f61fc0b5d98ef2455252d596e7b20131526d6762Theodore Ts'o} 44f61fc0b5d98ef2455252d596e7b20131526d6762Theodore Ts'o 45f61fc0b5d98ef2455252d596e7b20131526d6762Theodore Ts'o/* 46f61fc0b5d98ef2455252d596e7b20131526d6762Theodore Ts'o * Returns the hash algorithm, or -1 on error 47f61fc0b5d98ef2455252d596e7b20131526d6762Theodore Ts'o */ 48f61fc0b5d98ef2455252d596e7b20131526d6762Theodore Ts'oint e2p_string2hash(char *string) 49f61fc0b5d98ef2455252d596e7b20131526d6762Theodore Ts'o{ 50f61fc0b5d98ef2455252d596e7b20131526d6762Theodore Ts'o struct hash *p; 51f61fc0b5d98ef2455252d596e7b20131526d6762Theodore Ts'o char *eptr; 52f61fc0b5d98ef2455252d596e7b20131526d6762Theodore Ts'o int num; 53f61fc0b5d98ef2455252d596e7b20131526d6762Theodore Ts'o 54f61fc0b5d98ef2455252d596e7b20131526d6762Theodore Ts'o for (p = hash_list; p->string; p++) { 55f61fc0b5d98ef2455252d596e7b20131526d6762Theodore Ts'o if (!strcasecmp(string, p->string)) { 56f61fc0b5d98ef2455252d596e7b20131526d6762Theodore Ts'o return p->num; 57f61fc0b5d98ef2455252d596e7b20131526d6762Theodore Ts'o } 58f61fc0b5d98ef2455252d596e7b20131526d6762Theodore Ts'o } 59f61fc0b5d98ef2455252d596e7b20131526d6762Theodore Ts'o if (strncasecmp(string, "HASHALG_", 8)) 60f61fc0b5d98ef2455252d596e7b20131526d6762Theodore Ts'o return -1; 61f61fc0b5d98ef2455252d596e7b20131526d6762Theodore Ts'o 62f61fc0b5d98ef2455252d596e7b20131526d6762Theodore Ts'o if (string[8] == 0) 63f61fc0b5d98ef2455252d596e7b20131526d6762Theodore Ts'o return -1; 64f61fc0b5d98ef2455252d596e7b20131526d6762Theodore Ts'o num = strtol(string+8, &eptr, 10); 65f61fc0b5d98ef2455252d596e7b20131526d6762Theodore Ts'o if (num > 255 || num < 0) 66f61fc0b5d98ef2455252d596e7b20131526d6762Theodore Ts'o return -1; 67f61fc0b5d98ef2455252d596e7b20131526d6762Theodore Ts'o if (*eptr) 68f61fc0b5d98ef2455252d596e7b20131526d6762Theodore Ts'o return -1; 69f61fc0b5d98ef2455252d596e7b20131526d6762Theodore Ts'o return num; 70f61fc0b5d98ef2455252d596e7b20131526d6762Theodore Ts'o} 71f61fc0b5d98ef2455252d596e7b20131526d6762Theodore Ts'o 72