From: Gabriel Krisman Bertazi <krisman@collabora.com>
To: tytso@mit.edu
Cc: kernel@collabora.com, linux-ext4@vger.kernel.org,
Gabriel Krisman Bertazi <krisman@collabora.co.uk>
Subject: [PATCH v3 01/12] libe2p: Helpers for configuring the encoding superblock fields
Date: Mon, 26 Nov 2018 17:19:38 -0500 [thread overview]
Message-ID: <20181126221949.12172-2-krisman@collabora.com> (raw)
In-Reply-To: <20181126221949.12172-1-krisman@collabora.com>
From: Gabriel Krisman Bertazi <krisman@collabora.co.uk>
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.
Changes since v2:
- Rename defines to add EXT4_ prefix
- Use unicode X.Y versioning scheme
Changes since v1:
- Drop struct ext4_encoding_map name.
- remove question mark in comment.
- Reword 0x0 -> NULL
- Prevent out of bound array access if requested invalid encoding
Signed-off-by: Gabriel Krisman Bertazi <krisman@collabora.co.uk>
---
lib/e2p/Makefile.in | 8 +++-
lib/e2p/e2p.h | 5 +++
lib/e2p/encoding.c | 97 ++++++++++++++++++++++++++++++++++++++++++++
lib/ext2fs/ext2_fs.h | 5 +++
4 files changed, 113 insertions(+), 2 deletions(-)
create mode 100644 lib/e2p/encoding.c
diff --git a/lib/e2p/Makefile.in b/lib/e2p/Makefile.in
index 2b0aa1915130..68d534cdaf11 100644
--- a/lib/e2p/Makefile.in
+++ b/lib/e2p/Makefile.in
@@ -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
diff --git a/lib/e2p/e2p.h b/lib/e2p/e2p.h
index d70b59a5d358..c3a6b2587bf6 100644
--- a/lib/e2p/e2p.h
+++ b/lib/e2p/e2p.h
@@ -80,3 +80,8 @@ 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);
+const char *e2p_encoding2str(int encoding);
+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
index 000000000000..a441647aaea3
--- /dev/null
+++ b/lib/e2p/encoding.c
@@ -0,0 +1,97 @@
+/*
+ * 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 default_flags;
+} ext4_encoding_map[] = {
+ /* 0x0 */ { "ascii", 0},
+ /* 0x1 */ {"utf8-10.0", (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 i;
+
+ return -EINVAL;
+}
+
+const char *e2p_encoding2str(int encoding)
+{
+ if (encoding < ARRAY_SIZE(ext4_encoding_map))
+ return ext4_encoding_map[encoding].name;
+ return NULL;
+}
+
+int e2p_get_encoding_flags(int encoding)
+{
+ if (encoding < ARRAY_SIZE(ext4_encoding_map))
+ 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;
+}
diff --git a/lib/ext2fs/ext2_fs.h b/lib/ext2fs/ext2_fs.h
index f1c405b76339..36ae7ae41c47 100644
--- a/lib/ext2fs/ext2_fs.h
+++ b/lib/ext2fs/ext2_fs.h
@@ -16,6 +16,7 @@
#ifndef _LINUX_EXT2_FS_H
#define _LINUX_EXT2_FS_H
+#include <stddef.h>
#include <ext2fs/ext2_types.h> /* Changed from linux/types.h */
#ifndef __GNUC_PREREQ
@@ -1127,4 +1128,8 @@ struct mmp_struct {
*/
#define EXT4_INLINE_DATA_DOTDOT_SIZE (4)
+#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 */
--
2.19.2
next prev parent reply other threads:[~2018-11-27 9:15 UTC|newest]
Thread overview: 19+ messages / expand[flat|nested] mbox.gz Atom feed top
2018-11-26 22:19 [PATCH e2fsprogs v3 00/12] Support encoding awareness and casefold Gabriel Krisman Bertazi
2018-11-26 22:19 ` Gabriel Krisman Bertazi [this message]
2018-11-30 15:42 ` [PATCH v3 01/12] libe2p: Helpers for configuring the encoding superblock fields Theodore Y. Ts'o
2018-11-30 20:46 ` Gabriel Krisman Bertazi
2018-11-26 22:19 ` [PATCH v3 02/12] mke2fs: Configure encoding during superblock initialization Gabriel Krisman Bertazi
2018-11-26 22:19 ` [PATCH v3 03/12] chattr/lsattr: Support casefold attribute Gabriel Krisman Bertazi
2018-11-26 22:19 ` [PATCH v3 04/12] lib/ext2fs: Implement NLS support Gabriel Krisman Bertazi
2018-11-30 15:54 ` Theodore Y. Ts'o
2018-11-26 22:19 ` [PATCH v3 05/12] lib/ext2fs: Support encoding when calculating dx hashes Gabriel Krisman Bertazi
2018-11-26 22:19 ` [PATCH v3 06/12] debugfs/htree: Support encoding when printing the file hash Gabriel Krisman Bertazi
2018-11-26 22:19 ` [PATCH v3 07/12] tune2fs: Prevent enabling encryption flag on encoding-aware fs Gabriel Krisman Bertazi
2018-11-26 22:19 ` [PATCH v3 09/12] ext4.5: Add fname_encoding feature to ext4 man page Gabriel Krisman Bertazi
2018-11-26 22:19 ` [PATCH v3 10/12] mke2fs.8: Document fname_encoding options Gabriel Krisman Bertazi
2018-11-30 15:59 ` Theodore Y. Ts'o
2018-11-26 22:19 ` [PATCH v3 11/12] mke2fs.conf.5: Document fname_encoding configuration option Gabriel Krisman Bertazi
2018-11-26 22:19 ` [PATCH v3 12/12] chattr.1: Document the casefold attribute Gabriel Krisman Bertazi
[not found] ` <20181126221949.12172-9-krisman@collabora.com>
2018-11-30 16:12 ` [PATCH v3 08/12] ext2fs: nls: Support UTF-8 11.0 with NFKD normalization Theodore Y. Ts'o
2018-11-30 16:53 ` Theodore Y. Ts'o
2018-11-30 18:48 ` Gabriel Krisman Bertazi
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20181126221949.12172-2-krisman@collabora.com \
--to=krisman@collabora.com \
--cc=kernel@collabora.com \
--cc=krisman@collabora.co.uk \
--cc=linux-ext4@vger.kernel.org \
--cc=tytso@mit.edu \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).