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 12d1154eb460efe588eaed3d439c1caaca149fa362Theodore Ts'o#include "config.h" 13f61fc0b5d98ef2455252d596e7b20131526d6762Theodore Ts'o#include <stdio.h> 14f61fc0b5d98ef2455252d596e7b20131526d6762Theodore Ts'o#include <stdlib.h> 15f61fc0b5d98ef2455252d596e7b20131526d6762Theodore Ts'o#include <string.h> 16f61fc0b5d98ef2455252d596e7b20131526d6762Theodore Ts'o#include <ctype.h> 17f61fc0b5d98ef2455252d596e7b20131526d6762Theodore Ts'o#include <errno.h> 18f61fc0b5d98ef2455252d596e7b20131526d6762Theodore Ts'o 19f61fc0b5d98ef2455252d596e7b20131526d6762Theodore Ts'o#include "e2p.h" 20f61fc0b5d98ef2455252d596e7b20131526d6762Theodore Ts'o 21f61fc0b5d98ef2455252d596e7b20131526d6762Theodore Ts'ostruct hash { 22f61fc0b5d98ef2455252d596e7b20131526d6762Theodore Ts'o int num; 23f61fc0b5d98ef2455252d596e7b20131526d6762Theodore Ts'o const char *string; 24f61fc0b5d98ef2455252d596e7b20131526d6762Theodore Ts'o}; 25f61fc0b5d98ef2455252d596e7b20131526d6762Theodore Ts'o 26f61fc0b5d98ef2455252d596e7b20131526d6762Theodore Ts'ostatic struct hash hash_list[] = { 27f61fc0b5d98ef2455252d596e7b20131526d6762Theodore Ts'o { EXT2_HASH_LEGACY, "legacy" }, 28f61fc0b5d98ef2455252d596e7b20131526d6762Theodore Ts'o { EXT2_HASH_HALF_MD4, "half_md4" }, 29f61fc0b5d98ef2455252d596e7b20131526d6762Theodore Ts'o { EXT2_HASH_TEA, "tea" }, 30f61fc0b5d98ef2455252d596e7b20131526d6762Theodore Ts'o { 0, 0 }, 31f61fc0b5d98ef2455252d596e7b20131526d6762Theodore Ts'o}; 32f61fc0b5d98ef2455252d596e7b20131526d6762Theodore Ts'o 33f61fc0b5d98ef2455252d596e7b20131526d6762Theodore Ts'oconst char *e2p_hash2string(int num) 34f61fc0b5d98ef2455252d596e7b20131526d6762Theodore Ts'o{ 35f61fc0b5d98ef2455252d596e7b20131526d6762Theodore Ts'o struct hash *p; 36f61fc0b5d98ef2455252d596e7b20131526d6762Theodore Ts'o static char buf[20]; 37f61fc0b5d98ef2455252d596e7b20131526d6762Theodore Ts'o 38f61fc0b5d98ef2455252d596e7b20131526d6762Theodore Ts'o for (p = hash_list; p->string; p++) { 39f61fc0b5d98ef2455252d596e7b20131526d6762Theodore Ts'o if (num == p->num) 40f61fc0b5d98ef2455252d596e7b20131526d6762Theodore Ts'o return p->string; 41f61fc0b5d98ef2455252d596e7b20131526d6762Theodore Ts'o } 42f61fc0b5d98ef2455252d596e7b20131526d6762Theodore Ts'o sprintf(buf, "HASHALG_%d", num); 43f61fc0b5d98ef2455252d596e7b20131526d6762Theodore Ts'o return buf; 44f61fc0b5d98ef2455252d596e7b20131526d6762Theodore Ts'o} 45f61fc0b5d98ef2455252d596e7b20131526d6762Theodore Ts'o 46f61fc0b5d98ef2455252d596e7b20131526d6762Theodore Ts'o/* 47f61fc0b5d98ef2455252d596e7b20131526d6762Theodore Ts'o * Returns the hash algorithm, or -1 on error 48f61fc0b5d98ef2455252d596e7b20131526d6762Theodore Ts'o */ 49f61fc0b5d98ef2455252d596e7b20131526d6762Theodore Ts'oint e2p_string2hash(char *string) 50f61fc0b5d98ef2455252d596e7b20131526d6762Theodore Ts'o{ 51f61fc0b5d98ef2455252d596e7b20131526d6762Theodore Ts'o struct hash *p; 52f61fc0b5d98ef2455252d596e7b20131526d6762Theodore Ts'o char *eptr; 53f61fc0b5d98ef2455252d596e7b20131526d6762Theodore Ts'o int num; 54f61fc0b5d98ef2455252d596e7b20131526d6762Theodore Ts'o 55f61fc0b5d98ef2455252d596e7b20131526d6762Theodore Ts'o for (p = hash_list; p->string; p++) { 56f61fc0b5d98ef2455252d596e7b20131526d6762Theodore Ts'o if (!strcasecmp(string, p->string)) { 57f61fc0b5d98ef2455252d596e7b20131526d6762Theodore Ts'o return p->num; 58f61fc0b5d98ef2455252d596e7b20131526d6762Theodore Ts'o } 59f61fc0b5d98ef2455252d596e7b20131526d6762Theodore Ts'o } 60f61fc0b5d98ef2455252d596e7b20131526d6762Theodore Ts'o if (strncasecmp(string, "HASHALG_", 8)) 61f61fc0b5d98ef2455252d596e7b20131526d6762Theodore Ts'o return -1; 62f61fc0b5d98ef2455252d596e7b20131526d6762Theodore Ts'o 63f61fc0b5d98ef2455252d596e7b20131526d6762Theodore Ts'o if (string[8] == 0) 64f61fc0b5d98ef2455252d596e7b20131526d6762Theodore Ts'o return -1; 65f61fc0b5d98ef2455252d596e7b20131526d6762Theodore Ts'o num = strtol(string+8, &eptr, 10); 66f61fc0b5d98ef2455252d596e7b20131526d6762Theodore Ts'o if (num > 255 || num < 0) 67f61fc0b5d98ef2455252d596e7b20131526d6762Theodore Ts'o return -1; 68f61fc0b5d98ef2455252d596e7b20131526d6762Theodore Ts'o if (*eptr) 69f61fc0b5d98ef2455252d596e7b20131526d6762Theodore Ts'o return -1; 70f61fc0b5d98ef2455252d596e7b20131526d6762Theodore Ts'o return num; 71f61fc0b5d98ef2455252d596e7b20131526d6762Theodore Ts'o} 72f61fc0b5d98ef2455252d596e7b20131526d6762Theodore Ts'o 73