[PATCH] New VFS module for HEX encoding

Yasuma Takeda yasuma at miraclelinux.com
Thu Feb 5 01:21:32 GMT 2004


Hi, Jeremy

I got a agreement about the copyright from my company.
I append a fixed patch. 

Thanks,

On Wed, 4 Feb 2004 10:00:09 -0800
Jeremy Allison <jra at samba.org> wrote:
>
> This looks good - I have no problems putting this into the tree.
> The only possible issue is with the corporate copyright on the code.
> 
> +   * Copyright (C) 2003-2004 MIRACLE LINUX Corporation
> +
> +   Written By: TAKEDA Yasuma <yasuma at miraclelinux.com>, 
> +               MIRACLE LINUX Corporation 
> 
> Is it possible you can get this put under your own personal copyright
> (Copyright (C) TAKEDA Yasuma <yasuma at miraclelinux.com>) instead, as
> we usually don't allow corporate copyright statements in the main tree.
> 


-- 
TAKEDA yasuma (yasuma at miraclelinux.com)
http://www.miraclelinux.com
-------------- next part --------------
diff -uNr samba-3.0.2rc2.org/source/Makefile.in samba-3.0.2rc2/source/Makefile.in
--- samba-3.0.2rc2.org/source/Makefile.in	Sat Jan 17 02:47:52 2004
+++ samba-3.0.2rc2/source/Makefile.in	Tue Feb  3 11:49:16 2004
@@ -316,6 +316,7 @@
 VFS_DEFAULT_QUOTA_OBJ = modules/vfs_default_quota.o
 VFS_READONLY_OBJ = modules/vfs_readonly.o modules/getdate.o
 VFS_CAP_OBJ = modules/vfs_cap.o
+VFS_HEX_OBJ = modules/vfs_hex.o
 
 PLAINTEXT_AUTH_OBJ = auth/pampass.o auth/pass_check.o
 
@@ -1164,6 +1165,11 @@
 bin/cap. at SHLIBEXT@: $(VFS_CAP_OBJ:.o=. at PICSUFFIX@)
 	@echo "Building plugin $@"
 	@$(SHLD) $(LDSHFLAGS) -o $@ $(VFS_CAP_OBJ:.o=. at PICSUFFIX@) \
+		@SONAMEFLAG@`basename $@`
+
+bin/hex. at SHLIBEXT@: $(VFS_HEX_OBJ:.o=. at PICSUFFIX@)
+	@echo "Building plugin $@"
+	@$(SHLD) $(LDSHFLAGS) -o $@ $(VFS_HEX_OBJ:.o=. at PICSUFFIX@) \
 		@SONAMEFLAG@`basename $@`
 
 bin/wbinfo at EXEEXT@: $(WBINFO_OBJ) @BUILD_POPT@ bin/.dummy
diff -uNr samba-3.0.2rc2.org/source/configure.in samba-3.0.2rc2/source/configure.in
--- samba-3.0.2rc2.org/source/configure.in	Sun Feb  1 00:45:56 2004
+++ samba-3.0.2rc2/source/configure.in	Tue Feb  3 11:49:16 2004
@@ -321,7 +321,7 @@
 default_static_modules="pdb_smbpasswd pdb_tdbsam rpc_lsa rpc_samr rpc_reg rpc_lsa_ds rpc_wks rpc_net rpc_dfs rpc_srv rpc_spoolss auth_rhosts auth_sam auth_unix auth_winbind auth_server auth_domain auth_builtin"
 
 dnl These are preferably build shared, and static if dlopen() is not available
-default_shared_modules="vfs_recycle vfs_audit vfs_extd_audit vfs_netatalk vfs_fake_perms vfs_default_quota vfs_readonly vfs_cap charset_CP850 charset_CP437"
+default_shared_modules="vfs_recycle vfs_audit vfs_extd_audit vfs_netatalk vfs_fake_perms vfs_default_quota vfs_readonly vfs_cap vfs_hex charset_CP850 charset_CP437"
 
 if test "x$developer" = xyes; then
    default_static_modules="$default_static_modules rpc_echo"
@@ -4292,6 +4292,7 @@
 SMB_MODULE(vfs_default_quota, \$(VFS_DEFAULT_QUOTA_OBJ), "bin/default_quota.$SHLIBEXT", VFS)
 SMB_MODULE(vfs_readonly, \$(VFS_READONLY_OBJ), "bin/readonly.$SHLIBEXT", VFS)
 SMB_MODULE(vfs_cap, \$(VFS_CAP_OBJ), "bin/cap.$SHLIBEXT", VFS)
+SMB_MODULE(vfs_hex, \$(VFS_HEX_OBJ), "bin/hex.$SHLIBEXT", VFS)
 SMB_SUBSYSTEM(VFS,smbd/vfs.o)
 
 AC_DEFINE_UNQUOTED(STRING_STATIC_MODULES, "$string_static_modules", [String list of builtin modules])
diff -uNr samba-3.0.2rc2.org/source/modules/vfs_hex.c samba-3.0.2rc2/source/modules/vfs_hex.c
--- samba-3.0.2rc2.org/source/modules/vfs_hex.c	Thu Jan  1 09:00:00 1970
+++ samba-3.0.2rc2/source/modules/vfs_hex.c	Tue Feb  3 11:52:01 2004
@@ -0,0 +1,624 @@
+/* 
+
+   HEX VFS module for Samba 3.x Version 0.1
+   Original Code from CAP VFS module
+
+   * Copyright (C) Tim Potter, 1999-2000
+   * Copyright (C) Alexander Bokovoy, 2002-2003
+   * Copyright (C) Stefan (metze) Metzmacher, 2003
+   * Copyright (C) TAKAHASHI Motonobu (monyo), 2003
+   * Copyright (C) TAKEDA Yasuma <yasuma at miraclelinux.com>, 2004
+
+   This program is free software; you can redistribute it and/or
+   modify it under the terms of the GNU General Public License
+   as published by the Free Software Foundation; either version 2
+   of the License, or (at your option) any later version.
+
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with this program; if not, write to the Free Software
+   Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
+
+*/
+
+#include "includes.h"
+
+/* 
+ * If you want to use this module, set the following setting to smb.conf.
+ * [share]
+ *    path = /xxxx/xxxx
+ *    vfs object = hex
+ *    ...
+ */ 
+
+static char *cp932_hex_encode(char *to, const char *from);
+static char *cp932_hex_decode(char *to, const char *from);
+
+struct unix_to_hex_fn
+{
+	const char *name;    /* unix charset name */
+	char *(*hex_encode_fn)(char *, const char *);
+	char *(*hex_decode_fn)(char *, const char *);
+};
+
+static struct unix_to_hex_fn *hex_fn;
+static struct unix_to_hex_fn *select_charset(void);
+
+/* 
+ * This modules depends on unix charset.
+ * If you want to use this module, you must set a appropriate encoding.
+ * You can set following encodings.
+ */
+
+static struct unix_to_hex_fn hex_encode_fn[] = {
+	{"CP932", cp932_hex_encode, cp932_hex_decode},
+	{NULL,NULL,NULL}
+};
+
+static char *hexencode(char *to, const char *from)
+{
+	if (hex_fn){
+		return hex_fn->hex_encode_fn(to, from);
+	}
+	return pstrcpy(to, from);
+}
+
+static char *hexdecode(char *to, const char *from)
+{
+	if (hex_fn){
+		return hex_fn->hex_decode_fn(to, from);
+	}
+	return pstrcpy(to, from);
+}
+
+/* vfs operation function */
+
+static SMB_BIG_UINT hex_disk_free(vfs_handle_struct *handle, connection_struct *conn, const char *path,
+	BOOL small_query, SMB_BIG_UINT *bsize,
+	SMB_BIG_UINT *dfree, SMB_BIG_UINT *dsize)
+{
+	pstring hexpath;
+	DEBUG(5,("hex: hex_disk_free\n"));
+	hexencode(hexpath, path);
+	return SMB_VFS_NEXT_DISK_FREE(handle, conn, hexpath, small_query, bsize, dfree, dsize);
+}
+
+static DIR *hex_opendir(vfs_handle_struct *handle, connection_struct *conn, const char *fname)
+{
+	pstring hexname;
+	hexencode(hexname, fname);
+	DEBUG(5,("hex: hex_opendir %s[%s]\n", fname, hexname));
+	return SMB_VFS_NEXT_OPENDIR(handle, conn, hexname);
+}
+
+static struct dirent *hex_readdir(vfs_handle_struct *handle, connection_struct *conn, DIR *dirp)
+{
+	struct dirent *result;
+
+	result = SMB_VFS_NEXT_READDIR(handle, conn, dirp);
+	if (result) {
+		DEBUG(5,("hex: hex_readdir: %s\n", result->d_name));
+		hexdecode(result->d_name, result->d_name);
+        }
+        return result;
+}
+
+static int hex_mkdir(vfs_handle_struct *handle, connection_struct *conn, const char *path, mode_t mode)
+{
+	pstring hexpath;
+	hexencode(hexpath, path);
+	return SMB_VFS_NEXT_MKDIR(handle, conn, hexpath, mode);
+}
+
+static int hex_rmdir(vfs_handle_struct *handle, connection_struct *conn, const char *path)
+{
+	pstring hexpath;
+	hexencode(hexpath, path);
+	return SMB_VFS_NEXT_RMDIR(handle, conn, hexpath);
+}
+
+static int hex_open(vfs_handle_struct *handle, connection_struct *conn, const char *fname, int flags, mode_t mode)
+{
+	pstring hexname;
+	DEBUG(5,("hex: hex_open for %s\n", fname));
+	hexencode(hexname, fname);
+	return SMB_VFS_NEXT_OPEN(handle, conn, hexname, flags, mode);
+}
+
+static int hex_rename(vfs_handle_struct *handle, connection_struct *conn, const char *old, const char *new)
+{
+	pstring hexold, hexnew;
+	hexencode(hexold, old);
+	hexencode(hexnew, new);
+
+	return SMB_VFS_NEXT_RENAME(handle, conn, hexold, hexnew);
+}
+
+static int hex_stat(vfs_handle_struct *handle, connection_struct *conn, const char *fname, SMB_STRUCT_STAT *sbuf)
+{
+	pstring hexname;
+	hexencode(hexname, fname);
+	return SMB_VFS_NEXT_STAT(handle, conn, hexname, sbuf);
+}
+
+static int hex_lstat(vfs_handle_struct *handle, connection_struct *conn, const char *path, SMB_STRUCT_STAT *sbuf)
+{
+	pstring hexpath;
+	hexencode(hexpath, path);
+	return SMB_VFS_NEXT_LSTAT(handle, conn, hexpath, sbuf);
+}
+
+static int hex_unlink(vfs_handle_struct *handle, connection_struct *conn, const char *path)
+{
+	pstring hexpath;
+	hexencode(hexpath, path);
+	return SMB_VFS_NEXT_UNLINK(handle, conn, hexpath);
+}
+
+static int hex_chmod(vfs_handle_struct *handle, connection_struct *conn, const char *path, mode_t mode)
+{
+	pstring hexpath;
+	hexencode(hexpath, path);
+	return SMB_VFS_NEXT_CHMOD(handle, conn, hexpath, mode);
+}
+
+static int hex_chown(vfs_handle_struct *handle, connection_struct *conn, const char *path, uid_t uid, gid_t gid)
+{
+	pstring hexpath;
+	hexencode(hexpath, path);
+	return SMB_VFS_NEXT_CHOWN(handle, conn, hexpath, uid, gid);
+}
+
+static int hex_chdir(vfs_handle_struct *handle, connection_struct *conn, const char *path)
+{
+	pstring hexpath;
+	DEBUG(5,("hex: hex_chdir for %s\n", path));
+	hexencode(hexpath, path);
+	return SMB_VFS_NEXT_CHDIR(handle, conn, hexpath);
+}
+
+static char *hex_getwd(vfs_handle_struct *handle, connection_struct *conn, char *path)
+{
+	pstring hexpath;
+	hexencode(hexpath, path);
+	return SMB_VFS_NEXT_GETWD(handle, conn, hexpath);
+}
+
+
+static int hex_utime(vfs_handle_struct *handle, connection_struct *conn, const char *path, struct utimbuf *times)
+{
+	pstring hexpath;
+	hexencode(hexpath, path);
+	return SMB_VFS_NEXT_UTIME(handle, conn, hexpath, times);
+}
+
+
+static BOOL hex_symlink(vfs_handle_struct *handle, connection_struct *conn, const char *oldpath, const char *newpath)
+{
+	pstring hexoldpath, hexnewpath;
+	hexencode(hexoldpath, oldpath);
+	hexencode(hexnewpath, newpath);
+	return SMB_VFS_NEXT_SYMLINK(handle, conn, hexoldpath, hexnewpath);
+}
+
+static BOOL hex_readlink(vfs_handle_struct *handle, connection_struct *conn, const char *path, char *buf, size_t bufsiz)
+{
+	pstring hexpath;
+	hexencode(hexpath, path);
+	return SMB_VFS_NEXT_READLINK(handle, conn, hexpath, buf, bufsiz);
+}
+
+static int hex_link(vfs_handle_struct *handle, connection_struct *conn, const char *oldpath, const char *newpath)
+{
+	pstring hexoldpath, hexnewpath;
+	hexencode(hexoldpath, oldpath);
+	hexencode(hexnewpath, newpath);
+	return SMB_VFS_NEXT_LINK(handle, conn, hexoldpath, hexnewpath);
+}
+
+static int hex_mknod(vfs_handle_struct *handle, connection_struct *conn, const char *path, mode_t mode, SMB_DEV_T dev)
+{
+	pstring hexpath;
+	hexencode(hexpath, path);
+	return SMB_VFS_NEXT_MKNOD(handle, conn, hexpath, mode, dev);
+}
+
+static char *hex_realpath(vfs_handle_struct *handle, connection_struct *conn, const char *path, char *resolved_path)
+{
+	pstring hexpath;
+	hexencode(hexpath, path);
+	return SMB_VFS_NEXT_REALPATH(handle, conn, path, resolved_path);
+}
+
+static BOOL hex_get_nt_acl(vfs_handle_struct *handle, files_struct *fsp, const char *name, uint32 security_info, struct security_descriptor_info **ppdesc)
+{
+	pstring hexname;
+	hexencode(hexname, name);
+	return SMB_VFS_NEXT_GET_NT_ACL(handle, fsp, hexname, security_info, ppdesc);
+}
+
+static BOOL hex_set_nt_acl(vfs_handle_struct *handle, files_struct *fsp, const char *name, uint32 security_info_sent, struct security_descriptor_info *psd)
+{
+	pstring hexname;
+	hexencode(hexname, name);
+	return SMB_VFS_NEXT_SET_NT_ACL(handle, fsp, hexname, security_info_sent, psd);
+}
+
+static int hex_chmod_acl(vfs_handle_struct *handle, connection_struct *conn, const char *name, mode_t mode)
+{
+	pstring hexname;
+	hexencode(hexname, name);
+
+	/* If the underlying VFS doesn't have ACL support... */
+	if (!handle->vfs_next.ops.chmod_acl) {
+		errno = ENOSYS;
+		return -1;
+	}
+	return SMB_VFS_NEXT_CHMOD_ACL(handle, conn, hexname, mode);
+}
+
+static SMB_ACL_T hex_sys_acl_get_file(vfs_handle_struct *handle, connection_struct *conn, const char *path_p, SMB_ACL_TYPE_T type)
+{
+	pstring hexpath_p;
+	hexencode(hexpath_p, path_p);
+	return SMB_VFS_NEXT_SYS_ACL_GET_FILE(handle, conn, hexpath_p, type);
+}
+
+static int hex_sys_acl_set_file(vfs_handle_struct *handle, connection_struct *conn, const char *name, SMB_ACL_TYPE_T acltype, SMB_ACL_T theacl)
+{
+	pstring hexname;
+	hexencode(hexname, name);
+	return SMB_VFS_NEXT_SYS_ACL_SET_FILE(handle, conn, hexname, acltype, theacl);
+}
+
+static int hex_sys_acl_delete_def_file(vfs_handle_struct *handle, connection_struct *conn, const char *path)
+{
+	pstring hexpath;
+	hexencode(hexpath, path);
+	return SMB_VFS_NEXT_SYS_ACL_DELETE_DEF_FILE(handle, conn, hexpath);
+}
+
+static ssize_t hex_getxattr(vfs_handle_struct *handle, struct connection_struct *conn,const char *path, const char *name, void *value, size_t size)
+{
+	pstring hexpath, hexname;
+	hexencode(hexpath, path);
+	hexencode(hexname, name);
+	return SMB_VFS_NEXT_GETXATTR(handle, conn, hexpath, hexname, value, size);
+}
+
+static ssize_t hex_lgetxattr(vfs_handle_struct *handle, struct connection_struct *conn,const char *path, const char *name, void *value, size_t
+size)
+{
+	pstring hexpath, hexname;
+	hexencode(hexpath, path);
+	hexencode(hexname, name);
+	return SMB_VFS_NEXT_LGETXATTR(handle, conn, hexpath, hexname, value, size);
+}
+
+static ssize_t hex_fgetxattr(vfs_handle_struct *handle, struct files_struct *fsp,int fd, const char *name, void *value, size_t size)
+{
+	pstring hexname;
+	hexencode(hexname, name);
+	return SMB_VFS_NEXT_FGETXATTR(handle, fsp, fd, hexname, value, size);
+}
+
+static ssize_t hex_listxattr(vfs_handle_struct *handle, struct connection_struct *conn,const char *path, char *list, size_t size)
+{
+	pstring hexpath;
+	hexencode(hexpath, path);
+	return SMB_VFS_NEXT_LISTXATTR(handle, conn, hexpath, list, size);
+}
+
+static ssize_t hex_llistxattr(vfs_handle_struct *handle, struct connection_struct *conn,const char *path, char *list, size_t size)
+{
+	pstring hexpath;
+	hexencode(hexpath, path);
+	return SMB_VFS_NEXT_LLISTXATTR(handle, conn, hexpath, list, size);
+}
+
+static int hex_removexattr(vfs_handle_struct *handle, struct connection_struct *conn,const char *path, const char *name)
+{
+	pstring hexpath, hexname;
+	hexencode(hexpath, path);
+	hexencode(hexname, name);
+	return SMB_VFS_NEXT_REMOVEXATTR(handle, conn, hexpath, hexname);
+}
+
+static int hex_lremovexattr(vfs_handle_struct *handle, struct connection_struct *conn,const char *path, const char *name)
+{
+	pstring hexpath, hexname;
+	hexencode(hexpath, path);
+	hexencode(hexname, name);
+	return SMB_VFS_NEXT_LREMOVEXATTR(handle, conn, hexpath, hexname);
+}
+
+static int hex_fremovexattr(vfs_handle_struct *handle, struct files_struct *fsp,int fd, const char *name)
+{
+	pstring hexname;
+	hexencode(hexname, name);
+	return SMB_VFS_NEXT_FREMOVEXATTR(handle, fsp, fd, hexname);
+}
+
+static int hex_setxattr(vfs_handle_struct *handle, struct connection_struct *conn,const char *path, const char *name, const void *value, size_t size, int flags)
+{
+	pstring hexpath, hexname;
+	hexencode(hexpath, path);
+	hexencode(hexname, name);
+	return SMB_VFS_NEXT_SETXATTR(handle, conn, hexpath, hexname, value, size, flags);
+}
+
+static int hex_lsetxattr(vfs_handle_struct *handle, struct connection_struct *conn,const char *path, const char *name, const void *value, size_t size, int flags)
+{
+	pstring hexpath, hexname;
+	hexencode(hexpath, path);
+	hexencode(hexname, name);
+	return SMB_VFS_NEXT_LSETXATTR(handle, conn, hexpath, hexname, value, size, flags);
+}
+
+static int hex_fsetxattr(vfs_handle_struct *handle, struct files_struct *fsp,int fd, const char *name, const void *value, size_t size, int flags)
+{
+	pstring hexname;
+	hexencode(hexname, name);
+	return SMB_VFS_NEXT_FSETXATTR(handle, fsp, fd, hexname, value, size, flags);
+}
+
+
+
+/* VFS operations structure */
+
+static vfs_op_tuple hex_op_tuples[] = {
+        
+        /* Disk operations */
+
+	{SMB_VFS_OP(hex_disk_free), SMB_VFS_OP_DISK_FREE, SMB_VFS_LAYER_TRANSPARENT},
+
+        /* Directory operations */
+
+	{SMB_VFS_OP(hex_opendir), SMB_VFS_OP_OPENDIR, SMB_VFS_LAYER_TRANSPARENT},
+	{SMB_VFS_OP(hex_readdir), SMB_VFS_OP_READDIR, SMB_VFS_LAYER_TRANSPARENT},
+	{SMB_VFS_OP(hex_mkdir), SMB_VFS_OP_MKDIR, SMB_VFS_LAYER_TRANSPARENT},
+	{SMB_VFS_OP(hex_rmdir), SMB_VFS_OP_RMDIR, SMB_VFS_LAYER_TRANSPARENT},
+
+        /* File operations */
+
+	{SMB_VFS_OP(hex_open), SMB_VFS_OP_OPEN, SMB_VFS_LAYER_TRANSPARENT},
+	{SMB_VFS_OP(hex_rename), SMB_VFS_OP_RENAME, SMB_VFS_LAYER_TRANSPARENT},
+	{SMB_VFS_OP(hex_stat), SMB_VFS_OP_STAT, SMB_VFS_LAYER_TRANSPARENT},
+	{SMB_VFS_OP(hex_lstat), SMB_VFS_OP_LSTAT, SMB_VFS_LAYER_TRANSPARENT},
+	{SMB_VFS_OP(hex_unlink), SMB_VFS_OP_UNLINK, SMB_VFS_LAYER_TRANSPARENT},
+	{SMB_VFS_OP(hex_chmod), SMB_VFS_OP_CHMOD, SMB_VFS_LAYER_TRANSPARENT},
+	{SMB_VFS_OP(hex_chown), SMB_VFS_OP_CHOWN, SMB_VFS_LAYER_TRANSPARENT},
+	{SMB_VFS_OP(hex_chdir), SMB_VFS_OP_CHDIR, SMB_VFS_LAYER_TRANSPARENT},
+	{SMB_VFS_OP(hex_getwd), SMB_VFS_OP_GETWD, SMB_VFS_LAYER_TRANSPARENT},
+	{SMB_VFS_OP(hex_utime), SMB_VFS_OP_UTIME, SMB_VFS_LAYER_TRANSPARENT},
+	{SMB_VFS_OP(hex_symlink), SMB_VFS_OP_SYMLINK, SMB_VFS_LAYER_TRANSPARENT},
+	{SMB_VFS_OP(hex_readlink), SMB_VFS_OP_READLINK, SMB_VFS_LAYER_TRANSPARENT},
+	{SMB_VFS_OP(hex_link), SMB_VFS_OP_LINK, SMB_VFS_LAYER_TRANSPARENT},
+	{SMB_VFS_OP(hex_mknod), SMB_VFS_OP_MKNOD, SMB_VFS_LAYER_TRANSPARENT},
+	{SMB_VFS_OP(hex_realpath), SMB_VFS_OP_REALPATH, SMB_VFS_LAYER_TRANSPARENT},
+
+        /* NT ACL operations. */
+
+	{SMB_VFS_OP(hex_get_nt_acl), SMB_VFS_OP_GET_NT_ACL, SMB_VFS_LAYER_TRANSPARENT},
+	{SMB_VFS_OP(hex_set_nt_acl), SMB_VFS_OP_SET_NT_ACL, SMB_VFS_LAYER_TRANSPARENT},
+
+        /* POSIX ACL operations. */
+
+	{SMB_VFS_OP(hex_chmod_acl), SMB_VFS_OP_CHMOD_ACL, SMB_VFS_LAYER_TRANSPARENT},
+
+	{SMB_VFS_OP(hex_sys_acl_get_file), SMB_VFS_OP_SYS_ACL_GET_FILE, SMB_VFS_LAYER_TRANSPARENT},
+	{SMB_VFS_OP(hex_sys_acl_set_file), SMB_VFS_OP_SYS_ACL_SET_FILE, SMB_VFS_LAYER_TRANSPARENT},
+        {SMB_VFS_OP(hex_sys_acl_delete_def_file), SMB_VFS_OP_SYS_ACL_DELETE_DEF_FILE, SMB_VFS_LAYER_TRANSPARENT},
+        
+        /* EA operations. */
+	{SMB_VFS_OP(hex_getxattr), SMB_VFS_OP_GETXATTR, SMB_VFS_LAYER_TRANSPARENT},
+	{SMB_VFS_OP(hex_lgetxattr), SMB_VFS_OP_LGETXATTR, SMB_VFS_LAYER_TRANSPARENT},
+	{SMB_VFS_OP(hex_fgetxattr), SMB_VFS_OP_FGETXATTR, SMB_VFS_LAYER_TRANSPARENT},
+        {SMB_VFS_OP(hex_listxattr), SMB_VFS_OP_LISTXATTR, SMB_VFS_LAYER_TRANSPARENT},
+	{SMB_VFS_OP(hex_llistxattr), SMB_VFS_OP_LLISTXATTR, SMB_VFS_LAYER_TRANSPARENT},
+        {SMB_VFS_OP(hex_removexattr), SMB_VFS_OP_REMOVEXATTR, SMB_VFS_LAYER_TRANSPARENT}, 
+	{SMB_VFS_OP(hex_lremovexattr), SMB_VFS_OP_LREMOVEXATTR, SMB_VFS_LAYER_TRANSPARENT},
+	{SMB_VFS_OP(hex_fremovexattr), SMB_VFS_OP_FREMOVEXATTR, SMB_VFS_LAYER_TRANSPARENT},
+	{SMB_VFS_OP(hex_setxattr), SMB_VFS_OP_SETXATTR, SMB_VFS_LAYER_TRANSPARENT},
+	{SMB_VFS_OP(hex_lsetxattr), SMB_VFS_OP_LSETXATTR, SMB_VFS_LAYER_TRANSPARENT},
+	{SMB_VFS_OP(hex_fsetxattr), SMB_VFS_OP_FSETXATTR, SMB_VFS_LAYER_TRANSPARENT},
+	
+	/* last operation */
+	{SMB_VFS_OP(NULL), SMB_VFS_OP_NOOP, SMB_VFS_LAYER_NOOP}
+};
+
+static struct unix_to_hex_fn *select_charset(void)
+{
+	struct unix_to_hex_fn *fn_pnt;
+
+	for (fn_pnt=hex_encode_fn; fn_pnt->name; fn_pnt++)
+	{
+		DEBUG(5, ("hex: select unix_charset %s : %s\n", fn_pnt->name, lp_unix_charset()));
+		if (!StrCaseCmp(fn_pnt->name, lp_unix_charset())){
+			return fn_pnt;
+		}
+	}
+	DEBUG(1, ("hex: can't convert from %s to hex", lp_unix_charset())); 
+	return NULL;
+}
+
+
+NTSTATUS vfs_hex_init(void)
+{
+	hex_fn = NULL;
+	
+	hex_fn = select_charset();
+
+	return smb_register_vfs(SMB_VFS_INTERFACE_VERSION, "hex", hex_op_tuples);
+}
+
+/* For HEX functions */
+#define hex_tag ':'
+#define hex2bin(c)              hex2bin_table[(unsigned char)(c)]
+#define bin2hex(c)              bin2hex_table[(unsigned char)(c)]
+
+static unsigned char hex2bin_table[256] = {
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x00 */
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x10 */
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x20 */
+	0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 0, 0, 0, 0, 0, /* 0x30 */
+	0000, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0000, /* 0x40 */
+	0000, 0000, 0000, 0000, 0000, 0000, 0000, 0000,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x50 */
+	0000, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0000, /* 0x60 */
+	0000, 0000, 0000, 0000, 0000, 0000, 0000, 0000,
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x70 */
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 */
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x90 */
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0xa0 */
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0xb0 */
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0xc0 */
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0xd0 */
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0xe0 */
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0  /* 0xf0 */
+};
+
+static unsigned char bin2hex_table[256] = "0123456789abcdef";
+
+/*
+ * Following code is available only CP932
+ */
+
+/* CP932 first byte is 0x81-0x9F or 0xE0-0xFC */
+static unsigned char cp932_1st_table[256] = {
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x00 */
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x10 */
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x20 */
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x30 */
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x40 */
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x50 */
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x60 */
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x70 */
+	0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, /* 0x80 */
+	1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, /* 0x90 */
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0xa0 */
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0xb0 */
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0xc0 */
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0xd0 */
+	1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, /* 0xe0 */
+	1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0  /* 0xf0 */
+};
+
+/* CP932 second byte is 0x40-0x7E or 0x80-0xFC */
+static unsigned char cp932_2nd_table[256] = {
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x00 */
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x10 */
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x20 */
+	0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 0x30 */
+	1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, /* 0x40 */
+	1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, /* 0x50 */
+	1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, /* 0x60 */
+	1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, /* 0x70 */
+	1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, /* 0x80 */
+	1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, /* 0x90 */
+	1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, /* 0xa0 */
+	1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, /* 0xb0 */
+	1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, /* 0xc0 */
+	1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, /* 0xd0 */
+	1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, /* 0xe0 */
+	1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0  /* 0xf0 */
+};
+
+
+#define is_cp932_jisx0201RH(s)            ((unsigned char)*s >= 0xa1 \
+                                        && (unsigned char)*s <= 0xdf)
+
+static BOOL is_cp932_str(const unsigned char *s)
+{
+	if ((s[0] && (unsigned int) cp932_1st_table[s[0]]) && (s[1] && (unsigned int) cp932_2nd_table[s[1]]))
+	{
+		return True;
+	}
+	return False;
+}
+
+static BOOL is_cp932_hex(const char *s)
+{
+	if (s[0] == hex_tag){
+		if ((s[1] && strchr(bin2hex_table, s[1])) &&
+		    (s[2] && strchr(bin2hex_table, s[2])))
+			return True;
+	}
+	return False;
+}
+
+/*******************************************************************
+  original code -> ":xx"  - CP932 to HEX format
+********************************************************************/
+static char *cp932_hex_encode(char *to, const char *from)
+{
+	pstring cvtbuf;
+	char *out;
+
+	DEBUG(10, ("hex: encode %s\n", from));
+
+	if (to == from){
+		from = pstrcpy((char *)cvtbuf, from);
+	}
+
+	for (out = to; *from && (out - to < sizeof(pstring)-7);){
+		/* notice buffer shortage error */
+		if (is_cp932_jisx0201RH(from)){
+			/* JISX0201 1byte kana */
+			*out++ = hex_tag;
+			*out++ = bin2hex (((*from)>>4)&0x0f);
+			*out++ = bin2hex ((*from)&0x0f);
+			from++;
+		}else if(is_cp932_str(from)){
+			/* JISX0208 2byte kana and user defined char */
+			*out++ = hex_tag;
+			*out++ = bin2hex (((*from)>>4)&0x0f);
+			*out++ = bin2hex ((*from)&0x0f);
+			from++;
+			*out++ = hex_tag;
+			*out++ = bin2hex (((*from)>>4)&0x0f);
+			*out++ = bin2hex ((*from)&0x0f);
+			from++;
+		}else{
+			/* ASCII character */
+			*out++ = *from++;
+		}
+	}
+	*out = '\0';
+	return to;
+}
+
+
+/*******************************************************************
+  HEX -> original code       HEX to CP932 
+********************************************************************/
+static char *cp932_hex_decode(char *to, const char *from)
+{
+	pstring cvtbuf;
+	char *out;
+
+	DEBUG(10, ("hex: decode %s\n", from));
+
+	if (to == from){
+		from = pstrcpy ((char *) cvtbuf, from);
+	}
+	
+	for (out = to; *from && (out - to < sizeof(pstring)-3);) {
+		if (is_cp932_hex(from)){
+			/* converted HEX code */
+			*out++ = (hex2bin(from[1]) << 4) | (hex2bin(from[2]));
+			from += 3;
+		} else {
+			/* non converted HEX code */
+			*out++ = *from++;
+		}
+	}
+	*out = '\0';
+	DEBUG(10, ("hex: decoded %s\n", to));
+	return to;
+}
+


More information about the samba-technical mailing list