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