2 * feature.c --- convert between features and strings
4 * Copyright (C) 1999 Theodore Ts'o <tytso@mit.edu>
6 * This file can be redistributed under the terms of the GNU Library General
25 static struct feature feature_list[] = {
26 { E2P_FEATURE_COMPAT, EXT2_FEATURE_COMPAT_DIR_PREALLOC,
28 { E2P_FEATURE_COMPAT, EXT3_FEATURE_COMPAT_HAS_JOURNAL,
30 { E2P_FEATURE_COMPAT, EXT2_FEATURE_COMPAT_IMAGIC_INODES,
32 { E2P_FEATURE_COMPAT, EXT2_FEATURE_COMPAT_EXT_ATTR,
34 { E2P_FEATURE_COMPAT, EXT2_FEATURE_COMPAT_DIR_INDEX,
36 { E2P_FEATURE_COMPAT, EXT2_FEATURE_COMPAT_RESIZE_INODE,
38 { E2P_FEATURE_COMPAT, EXT2_FEATURE_COMPAT_LAZY_BG,
41 { E2P_FEATURE_RO_INCOMPAT, EXT2_FEATURE_RO_COMPAT_SPARSE_SUPER,
43 { E2P_FEATURE_RO_INCOMPAT, EXT2_FEATURE_RO_COMPAT_LARGE_FILE,
45 { E2P_FEATURE_RO_INCOMPAT, EXT4_FEATURE_RO_COMPAT_HUGE_FILE,
47 { E2P_FEATURE_RO_INCOMPAT, EXT4_FEATURE_RO_COMPAT_GDT_CSUM,
49 { E2P_FEATURE_RO_INCOMPAT, EXT4_FEATURE_RO_COMPAT_DIR_NLINK,
51 { E2P_FEATURE_RO_INCOMPAT, EXT4_FEATURE_RO_COMPAT_EXTRA_ISIZE,
54 { E2P_FEATURE_INCOMPAT, EXT2_FEATURE_INCOMPAT_COMPRESSION,
56 { E2P_FEATURE_INCOMPAT, EXT2_FEATURE_INCOMPAT_FILETYPE,
58 { E2P_FEATURE_INCOMPAT, EXT3_FEATURE_INCOMPAT_RECOVER,
60 { E2P_FEATURE_INCOMPAT, EXT3_FEATURE_INCOMPAT_JOURNAL_DEV,
62 { E2P_FEATURE_INCOMPAT, EXT3_FEATURE_INCOMPAT_EXTENTS,
64 { E2P_FEATURE_INCOMPAT, EXT2_FEATURE_INCOMPAT_META_BG,
66 { E2P_FEATURE_INCOMPAT, EXT3_FEATURE_INCOMPAT_EXTENTS,
68 { E2P_FEATURE_INCOMPAT, EXT4_FEATURE_INCOMPAT_64BIT,
70 { E2P_FEATURE_INCOMPAT, EXT4_FEATURE_INCOMPAT_FLEX_BG,
75 const char *e2p_feature2string(int compat, unsigned int mask)
82 for (f = feature_list; f->string; f++) {
83 if ((compat == f->compat) &&
88 case E2P_FEATURE_COMPAT:
91 case E2P_FEATURE_INCOMPAT:
94 case E2P_FEATURE_RO_INCOMPAT:
101 for (fnum = 0; mask >>= 1; fnum++);
102 sprintf(buf, "FEATURE_%c%d", fchar, fnum);
106 int e2p_string2feature(char *string, int *compat_type, unsigned int *mask)
112 for (f = feature_list; f->string; f++) {
113 if (!strcasecmp(string, f->string)) {
114 *compat_type = f->compat;
119 if (strncasecmp(string, "FEATURE_", 8))
125 *compat_type = E2P_FEATURE_COMPAT;
129 *compat_type = E2P_FEATURE_INCOMPAT;
133 *compat_type = E2P_FEATURE_RO_INCOMPAT;
140 num = strtol(string+9, &eptr, 10);
141 if (num > 32 || num < 0)
149 static char *skip_over_blanks(char *cp)
151 while (*cp && isspace(*cp))
156 static char *skip_over_word(char *cp)
158 while (*cp && !isspace(*cp) && *cp != ',')
164 * Edit a feature set array as requested by the user. The ok_array,
165 * if set, allows the application to limit what features the user is
166 * allowed to set or clear using this function. If clear_ok_array is set,
167 * then use it tell whether or not it is OK to clear a filesystem feature.
169 int e2p_edit_feature2(const char *str, __u32 *compat_array, __u32 *ok_array,
170 __u32 *clear_ok_array, int *type_err,
171 unsigned int *mask_err)
173 char *cp, *buf, *next;
180 clear_ok_array = ok_array;
187 buf = malloc(strlen(str)+1);
191 for (cp = buf; cp && *cp; cp = next ? next+1 : 0) {
193 cp = skip_over_blanks(cp);
194 next = skip_over_word(cp);
201 if ((strcasecmp(cp, "none") == 0) ||
202 (strcasecmp(cp, "clear") == 0)) {
217 if (e2p_string2feature(cp, &compat_type, &mask)) {
222 if (clear_ok_array &&
223 !(clear_ok_array[compat_type] & mask)) {
226 *type_err = (compat_type |
227 E2P_FEATURE_NEGATE_FLAG);
232 compat_array[compat_type] &= ~mask;
234 if (ok_array && !(ok_array[compat_type] & mask)) {
237 *type_err = compat_type;
242 compat_array[compat_type] |= mask;
249 int e2p_edit_feature(const char *str, __u32 *compat_array, __u32 *ok_array)
251 return e2p_edit_feature2(str, compat_array, ok_array, 0, 0, 0);