]> git.ipfire.org Git - thirdparty/e2fsprogs.git/commitdiff
libe2p: helpers for configuring the encoding superblock fields
authorGabriel Krisman Bertazi <krisman@collabora.co.uk>
Sat, 1 Dec 2018 00:39:02 +0000 (19:39 -0500)
committerTheodore Ts'o <tytso@mit.edu>
Mon, 3 Dec 2018 04:31:22 +0000 (23:31 -0500)
Implement helper functions to convert the encoding name and specific
parameters requested by the user on the command line into the format
that is written to disk.

Signed-off-by: Gabriel Krisman Bertazi <krisman@collabora.co.uk>
Signed-off-by: Theodore Ts'o <tytso@mit.edu>
lib/e2p/Makefile.in
lib/e2p/e2p.h
lib/e2p/encoding.c [new file with mode: 0644]
lib/ext2fs/ext2_fs.h

index 2b0aa1915130d670afdd99b34ee9b9ef53cf03ec..68d534cdaf11ed788d130c282457cb27e6d4c401 100644 (file)
@@ -19,7 +19,8 @@ all:: e2p.pc
 OBJS=          feature.o fgetflags.o fsetflags.o fgetversion.o fsetversion.o \
                getflags.o getversion.o hashstr.o iod.o ls.o ljs.o mntopts.o \
                parse_num.o pe.o pf.o ps.o setflags.o setversion.o uuid.o \
-               ostype.o percent.o crypto_mode.o fgetproject.o fsetproject.o
+               ostype.o percent.o crypto_mode.o fgetproject.o fsetproject.o \
+               encoding.o
 
 SRCS=          $(srcdir)/feature.c $(srcdir)/fgetflags.c \
                $(srcdir)/fsetflags.c $(srcdir)/fgetversion.c \
@@ -29,7 +30,7 @@ SRCS=         $(srcdir)/feature.c $(srcdir)/fgetflags.c \
                $(srcdir)/pe.c $(srcdir)/pf.c $(srcdir)/ps.c \
                $(srcdir)/setflags.c $(srcdir)/setversion.c $(srcdir)/uuid.c \
                $(srcdir)/ostype.c $(srcdir)/percent.c $(srcdir)/crypto_mode.c \
-               $(srcdir)/fgetproject.c $(srcdir)/fsetproject.c
+               $(srcdir)/fgetproject.c $(srcdir)/fsetproject.c $(srcdir)/encoding.c
 HFILES= e2p.h
 
 LIBRARY= libe2p
@@ -147,6 +148,9 @@ getversion.o: $(srcdir)/getversion.c $(top_builddir)/lib/config.h \
 hashstr.o: $(srcdir)/hashstr.c $(top_builddir)/lib/config.h \
  $(top_builddir)/lib/dirpaths.h $(srcdir)/e2p.h \
  $(top_srcdir)/lib/ext2fs/ext2_fs.h $(top_builddir)/lib/ext2fs/ext2_types.h
+encoding.o: $(srcdir)/encoding.c $(top_builddir)/lib/config.h \
+ $(top_builddir)/lib/dirpaths.h $(srcdir)/e2p.h \
+ $(top_srcdir)/lib/ext2fs/ext2_fs.h $(top_builddir)/lib/ext2fs/ext2_types.h
 iod.o: $(srcdir)/iod.c $(top_builddir)/lib/config.h \
  $(top_builddir)/lib/dirpaths.h $(srcdir)/e2p.h \
  $(top_srcdir)/lib/ext2fs/ext2_fs.h $(top_builddir)/lib/ext2fs/ext2_types.h
index d70b59a5d358de49c6510ee54b2ba998ad8ec051..cc2dbf39bfeb7dba09956e085a4949927b929a80 100644 (file)
@@ -80,3 +80,7 @@ unsigned int e2p_percent(int percent, unsigned int base);
 
 const char *e2p_encmode2string(int num);
 int e2p_string2encmode(char *string);
+
+int e2p_str2encoding(const char *string);
+int e2p_get_encoding_flags(int encoding);
+int e2p_str2encoding_flags(int encoding, char *param, __u16 *flags);
diff --git a/lib/e2p/encoding.c b/lib/e2p/encoding.c
new file mode 100644 (file)
index 0000000..8843331
--- /dev/null
@@ -0,0 +1,104 @@
+/*
+ * encoding.c --- convert between encoding magic numbers and strings
+ *
+ * Copyright (C) 2018  Collabora Ltd.
+ *
+ * %Begin-Header%
+ * This file may be redistributed under the terms of the GNU Library
+ * General Public License, version 2.
+ * %End-Header%
+ */
+
+#include "config.h"
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <ctype.h>
+#include <errno.h>
+#include <stdio.h>
+
+#include "e2p.h"
+
+#define ARRAY_SIZE(array)                      \
+        (sizeof(array) / sizeof(array[0]))
+
+static const struct {
+       char *name;
+       __u16 encoding_magic;
+       __u16 default_flags;
+
+} ext4_encoding_map[] = {
+       {
+               .encoding_magic = EXT4_ENC_ASCII,
+               .name = "ascii",
+               .default_flags = 0
+       },
+       {
+               .encoding_magic = EXT4_ENC_UTF8_11_0,
+               .name = "utf8",
+               .default_flags = (EXT4_UTF8_NORMALIZATION_TYPE_NFKD |
+                                 EXT4_UTF8_CASEFOLD_TYPE_NFKDCF)
+       },
+};
+
+static const struct enc_flags {
+       __u16 flag;
+       char *param;
+} encoding_flags[] = {
+       { EXT4_ENC_STRICT_MODE_FL, "strict" },
+};
+
+/* Return a positive number < 0xff indicating the encoding magic number
+ * or a negative value indicating error. */
+int e2p_str2encoding(const char *string)
+{
+       int i;
+
+       for (i = 0 ; i < ARRAY_SIZE(ext4_encoding_map); i++)
+               if (!strcmp(string, ext4_encoding_map[i].name))
+                       return ext4_encoding_map[i].encoding_magic;
+
+       return -EINVAL;
+}
+
+int e2p_get_encoding_flags(int encoding)
+{
+       int i;
+
+       for (i = 0 ; i < ARRAY_SIZE(ext4_encoding_map); i++)
+               if (ext4_encoding_map[i].encoding_magic == encoding)
+                       return ext4_encoding_map[encoding].default_flags;
+
+       return 0;
+}
+
+int e2p_str2encoding_flags(int encoding, char *param, __u16 *flags)
+{
+       char *f = strtok(param, "-");
+       const struct enc_flags *fl;
+       int i, neg = 0;
+
+       while (f) {
+               neg = 0;
+               if (!strncmp("no", f, 2)) {
+                       neg = 1;
+                       f += 2;
+               }
+
+               for (i = 0; i < ARRAY_SIZE(encoding_flags); i++) {
+                       fl = &encoding_flags[i];
+                       if (!strcmp(fl->param, f)) {
+                               if (neg)
+                                       *flags &= ~fl->flag;
+                               else
+                                       *flags |= fl->flag;
+
+                               goto next_flag;
+                       }
+               }
+               return -EINVAL;
+       next_flag:
+               f = strtok(NULL, "-");
+       }
+       return 0;
+}
index f1c405b76339e1d26710af330273808da78c7794..c7d62b8d40b219e72e3616c82a25fafe08f8455d 100644 (file)
@@ -1127,4 +1127,11 @@ struct mmp_struct {
  */
 #define EXT4_INLINE_DATA_DOTDOT_SIZE   (4)
 
+#define EXT4_ENC_ASCII         0
+#define EXT4_ENC_UTF8_11_0     1
+
+#define EXT4_ENC_STRICT_MODE_FL                        (1 << 0) /* Reject invalid sequences */
+#define EXT4_UTF8_NORMALIZATION_TYPE_NFKD      (1 << 1)
+#define EXT4_UTF8_CASEFOLD_TYPE_NFKDCF         (1 << 4)
+
 #endif /* _LINUX_EXT2_FS_H */