Fix for #150.
authorAlexander Bokovoy <ab@samba.org>
Tue, 26 Aug 2003 19:48:16 +0000 (19:48 +0000)
committerAlexander Bokovoy <ab@samba.org>
Tue, 26 Aug 2003 19:48:16 +0000 (19:48 +0000)
We now fallback to Samba-provided CP850 charset module if CP850 or IBM850 does not exist on target system at runtime.
1. Introduce CP850 charset module based on charmaps table from GNU libc 2.2.5
2. Make CP850 charset module shared and build it by default

Should fix Solaris run-time

source/Makefile.in
source/configure.in
source/modules/CP850.c [new file with mode: 0644]
source/torture/smbiconv.c

index 49c27a453762e46e1ce9ff7595a363c86f2eff10..6286d7d087f0a9b8d5aa3777306c470190251e66 100644 (file)
@@ -186,6 +186,8 @@ LIB_SMBD_OBJ = lib/system_smbd.o lib/util_smbd.o
 
 READLINE_OBJ = lib/readline.o
 
+# Also depends on  $(SECRETS_OBJ) $(LIBSAMBA_OBJ)
+# Be sure to include them into your application
 POPT_LIB_OBJ = lib/popt_common.o 
 
 UBIQX_OBJ = ubiqx/ubi_BinTree.o ubiqx/ubi_Cache.o ubiqx/ubi_SplayTree.o \
@@ -284,7 +286,8 @@ PASSDB_OBJ = $(PASSDB_GET_SET_OBJ) passdb/passdb.o passdb/pdb_interface.o \
 
 XML_OBJ = passdb/pdb_xml.o
 MYSQL_OBJ = passdb/pdb_mysql.o
-DEVEL_HELP_OBJ = modules/weird.o
+DEVEL_HELP_WEIRD_OBJ = modules/weird.o
+DEVEL_HELP_CP850_OBJ = modules/CP850.o
 
 GROUPDB_OBJ = groupdb/mapping.o
 
@@ -521,7 +524,7 @@ NSSTEST_OBJ = torture/nsstest.o $(PARAM_OBJ) $(LIBSMB_OBJ) $(KRBCLIENT_OBJ) \
 
 VFSTEST_OBJ = torture/cmd_vfs.o torture/vfstest.o $(SMBD_OBJ_BASE) $(READLINE_OBJ)
 
-SMBICONV_OBJ = $(PARAM_OBJ) torture/smbiconv.o $(LIB_OBJ) $(UBIQX_OBJ) $(POPT_LIB_OBJ)
+SMBICONV_OBJ = $(PARAM_OBJ) torture/smbiconv.o $(LIB_OBJ) $(UBIQX_OBJ) $(POPT_LIB_OBJ) $(SECRETS_OBJ) $(LIBSAMBA_OBJ)
 
 LOG2PCAP_OBJ = utils/log2pcaphex.o
 
@@ -1058,9 +1061,14 @@ bin/smbpasswd.@SHLIBEXT@: passdb/pdb_smbpasswd.po
        @$(SHLD) $(LDSHFLAGS) -o $@ passdb/pdb_smbpasswd.po \
                @SONAMEFLAG@`basename $@`
 
-bin/weird.@SHLIBEXT@: $(DEVEL_HELP_OBJ:.o=.po)
+bin/weird.@SHLIBEXT@: $(DEVEL_HELP_WEIRD_OBJ:.o=.po)
        @echo "Building plugin $@"
-       @$(SHLD) $(LDSHFLAGS) -o $@ $(DEVEL_HELP_OBJ:.o=.po) \
+       @$(SHLD) $(LDSHFLAGS) -o $@ $(DEVEL_HELP_WEIRD_OBJ:.o=.po) \
+               @SONAMEFLAG@`basename $@`
+
+bin/CP850.@SHLIBEXT@: $(DEVEL_HELP_CP850_OBJ:.o=.po)
+       @echo "Building plugin $@"
+       @$(SHLD) $(LDSHFLAGS) -o $@ $(DEVEL_HELP_CP850_OBJ:.o=.po) \
                @SONAMEFLAG@`basename $@`
 
 bin/xml.@SHLIBEXT@: $(XML_OBJ:.o=.po)
index 241c6ec76fa09c5972f4f11215797bfb2f3d851d..e23dc77638156ed351d2ef176248d72bda5ed8a1 100644 (file)
@@ -288,7 +288,7 @@ dnl These have to be built static:
 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"
+default_shared_modules="vfs_recycle vfs_audit vfs_extd_audit vfs_netatalk vfs_fake_perms vfs_default_quota vfs_readonly charset_CP850"
 
 if test "x$developer" = xyes; then
    default_static_modules="$default_static_modules rpc_echo"
@@ -4004,6 +4004,7 @@ SMB_MODULE(idmap_tdb, sam/idmap_tdb.o, "bin/idmap_tdb.$SHLIBEXT", IDMAP)
 SMB_SUBSYSTEM(IDMAP,sam/idmap.c)
 
 SMB_MODULE(charset_weird, modules/weird.o, "bin/weird.$SHLIBEXT", CHARSET)
+SMB_MODULE(charset_CP850, modules/CP850.o, "bin/CP850.$SHLIBEXT", CHARSET)
 SMB_SUBSYSTEM(CHARSET,lib/iconv.c)
 
 SMB_MODULE(auth_rhosts, \$(AUTH_RHOSTS_OBJ), "bin/rhosts.$SHLIBEXT", AUTH)
diff --git a/source/modules/CP850.c b/source/modules/CP850.c
new file mode 100644 (file)
index 0000000..a17015f
--- /dev/null
@@ -0,0 +1,414 @@
+/* 
+ * Conversion table for CP850 charset also known as IBM850.
+ *
+ * Copyright (C) Alexander Bokovoy             2003
+ * Conversion tables are generated using GNU libc 2.2.5's 
+ * localedata/charmaps/IBM850 table and iconvdata/gen-8bit-gap.sh script
+ *
+ * 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., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+
+#include "includes.h"
+
+struct gap
+{
+  uint16 start;
+  uint16 end;
+  int32 idx;
+};
+
+static const uint16 to_ucs2[256] = {
+  [0x01] = 0x0001,
+  [0x02] = 0x0002,
+  [0x03] = 0x0003,
+  [0x04] = 0x0004,
+  [0x05] = 0x0005,
+  [0x06] = 0x0006,
+  [0x07] = 0x0007,
+  [0x08] = 0x0008,
+  [0x09] = 0x0009,
+  [0x0a] = 0x000A,
+  [0x0b] = 0x000B,
+  [0x0c] = 0x000C,
+  [0x0d] = 0x000D,
+  [0x0e] = 0x000E,
+  [0x0f] = 0x000F,
+  [0x10] = 0x0010,
+  [0x11] = 0x0011,
+  [0x12] = 0x0012,
+  [0x13] = 0x0013,
+  [0x14] = 0x0014,
+  [0x15] = 0x0015,
+  [0x16] = 0x0016,
+  [0x17] = 0x0017,
+  [0x18] = 0x0018,
+  [0x19] = 0x0019,
+  [0x1a] = 0x001A,
+  [0x1b] = 0x001B,
+  [0x1c] = 0x001C,
+  [0x1d] = 0x001D,
+  [0x1e] = 0x001E,
+  [0x1f] = 0x001F,
+  [0x20] = 0x0020,
+  [0x21] = 0x0021,
+  [0x22] = 0x0022,
+  [0x23] = 0x0023,
+  [0x24] = 0x0024,
+  [0x25] = 0x0025,
+  [0x26] = 0x0026,
+  [0x27] = 0x0027,
+  [0x28] = 0x0028,
+  [0x29] = 0x0029,
+  [0x2a] = 0x002A,
+  [0x2b] = 0x002B,
+  [0x2c] = 0x002C,
+  [0x2d] = 0x002D,
+  [0x2e] = 0x002E,
+  [0x2f] = 0x002F,
+  [0x30] = 0x0030,
+  [0x31] = 0x0031,
+  [0x32] = 0x0032,
+  [0x33] = 0x0033,
+  [0x34] = 0x0034,
+  [0x35] = 0x0035,
+  [0x36] = 0x0036,
+  [0x37] = 0x0037,
+  [0x38] = 0x0038,
+  [0x39] = 0x0039,
+  [0x3a] = 0x003A,
+  [0x3b] = 0x003B,
+  [0x3c] = 0x003C,
+  [0x3d] = 0x003D,
+  [0x3e] = 0x003E,
+  [0x3f] = 0x003F,
+  [0x40] = 0x0040,
+  [0x41] = 0x0041,
+  [0x42] = 0x0042,
+  [0x43] = 0x0043,
+  [0x44] = 0x0044,
+  [0x45] = 0x0045,
+  [0x46] = 0x0046,
+  [0x47] = 0x0047,
+  [0x48] = 0x0048,
+  [0x49] = 0x0049,
+  [0x4a] = 0x004A,
+  [0x4b] = 0x004B,
+  [0x4c] = 0x004C,
+  [0x4d] = 0x004D,
+  [0x4e] = 0x004E,
+  [0x4f] = 0x004F,
+  [0x50] = 0x0050,
+  [0x51] = 0x0051,
+  [0x52] = 0x0052,
+  [0x53] = 0x0053,
+  [0x54] = 0x0054,
+  [0x55] = 0x0055,
+  [0x56] = 0x0056,
+  [0x57] = 0x0057,
+  [0x58] = 0x0058,
+  [0x59] = 0x0059,
+  [0x5a] = 0x005A,
+  [0x5b] = 0x005B,
+  [0x5c] = 0x005C,
+  [0x5d] = 0x005D,
+  [0x5e] = 0x005E,
+  [0x5f] = 0x005F,
+  [0x60] = 0x0060,
+  [0x61] = 0x0061,
+  [0x62] = 0x0062,
+  [0x63] = 0x0063,
+  [0x64] = 0x0064,
+  [0x65] = 0x0065,
+  [0x66] = 0x0066,
+  [0x67] = 0x0067,
+  [0x68] = 0x0068,
+  [0x69] = 0x0069,
+  [0x6a] = 0x006A,
+  [0x6b] = 0x006B,
+  [0x6c] = 0x006C,
+  [0x6d] = 0x006D,
+  [0x6e] = 0x006E,
+  [0x6f] = 0x006F,
+  [0x70] = 0x0070,
+  [0x71] = 0x0071,
+  [0x72] = 0x0072,
+  [0x73] = 0x0073,
+  [0x74] = 0x0074,
+  [0x75] = 0x0075,
+  [0x76] = 0x0076,
+  [0x77] = 0x0077,
+  [0x78] = 0x0078,
+  [0x79] = 0x0079,
+  [0x7a] = 0x007A,
+  [0x7b] = 0x007B,
+  [0x7c] = 0x007C,
+  [0x7d] = 0x007D,
+  [0x7e] = 0x007E,
+  [0x7f] = 0x007F,
+  [0x80] = 0x00C7,
+  [0x81] = 0x00FC,
+  [0x82] = 0x00E9,
+  [0x83] = 0x00E2,
+  [0x84] = 0x00E4,
+  [0x85] = 0x00E0,
+  [0x86] = 0x00E5,
+  [0x87] = 0x00E7,
+  [0x88] = 0x00EA,
+  [0x89] = 0x00EB,
+  [0x8a] = 0x00E8,
+  [0x8b] = 0x00EF,
+  [0x8c] = 0x00EE,
+  [0x8d] = 0x00EC,
+  [0x8e] = 0x00C4,
+  [0x8f] = 0x00C5,
+  [0x90] = 0x00C9,
+  [0x91] = 0x00E6,
+  [0x92] = 0x00C6,
+  [0x93] = 0x00F4,
+  [0x94] = 0x00F6,
+  [0x95] = 0x00F2,
+  [0x96] = 0x00FB,
+  [0x97] = 0x00F9,
+  [0x98] = 0x00FF,
+  [0x99] = 0x00D6,
+  [0x9a] = 0x00DC,
+  [0x9b] = 0x00F8,
+  [0x9c] = 0x00A3,
+  [0x9d] = 0x00D8,
+  [0x9e] = 0x00D7,
+  [0x9f] = 0x0192,
+  [0xa0] = 0x00E1,
+  [0xa1] = 0x00ED,
+  [0xa2] = 0x00F3,
+  [0xa3] = 0x00FA,
+  [0xa4] = 0x00F1,
+  [0xa5] = 0x00D1,
+  [0xa6] = 0x00AA,
+  [0xa7] = 0x00BA,
+  [0xa8] = 0x00BF,
+  [0xa9] = 0x00AE,
+  [0xaa] = 0x00AC,
+  [0xab] = 0x00BD,
+  [0xac] = 0x00BC,
+  [0xad] = 0x00A1,
+  [0xae] = 0x00AB,
+  [0xaf] = 0x00BB,
+  [0xb0] = 0x2591,
+  [0xb1] = 0x2592,
+  [0xb2] = 0x2593,
+  [0xb3] = 0x2502,
+  [0xb4] = 0x2524,
+  [0xb5] = 0x00C1,
+  [0xb6] = 0x00C2,
+  [0xb7] = 0x00C0,
+  [0xb8] = 0x00A9,
+  [0xb9] = 0x2563,
+  [0xba] = 0x2551,
+  [0xbb] = 0x2557,
+  [0xbc] = 0x255D,
+  [0xbd] = 0x00A2,
+  [0xbe] = 0x00A5,
+  [0xbf] = 0x2510,
+  [0xc0] = 0x2514,
+  [0xc1] = 0x2534,
+  [0xc2] = 0x252C,
+  [0xc3] = 0x251C,
+  [0xc4] = 0x2500,
+  [0xc5] = 0x253C,
+  [0xc6] = 0x00E3,
+  [0xc7] = 0x00C3,
+  [0xc8] = 0x255A,
+  [0xc9] = 0x2554,
+  [0xca] = 0x2569,
+  [0xcb] = 0x2566,
+  [0xcc] = 0x2560,
+  [0xcd] = 0x2550,
+  [0xce] = 0x256C,
+  [0xcf] = 0x00A4,
+  [0xd0] = 0x00F0,
+  [0xd1] = 0x00D0,
+  [0xd2] = 0x00CA,
+  [0xd3] = 0x00CB,
+  [0xd4] = 0x00C8,
+  [0xd5] = 0x0131,
+  [0xd6] = 0x00CD,
+  [0xd7] = 0x00CE,
+  [0xd8] = 0x00CF,
+  [0xd9] = 0x2518,
+  [0xda] = 0x250C,
+  [0xdb] = 0x2588,
+  [0xdc] = 0x2584,
+  [0xdd] = 0x00A6,
+  [0xde] = 0x00CC,
+  [0xdf] = 0x2580,
+  [0xe0] = 0x00D3,
+  [0xe1] = 0x00DF,
+  [0xe2] = 0x00D4,
+  [0xe3] = 0x00D2,
+  [0xe4] = 0x00F5,
+  [0xe5] = 0x00D5,
+  [0xe6] = 0x00B5,
+  [0xe7] = 0x00FE,
+  [0xe8] = 0x00DE,
+  [0xe9] = 0x00DA,
+  [0xea] = 0x00DB,
+  [0xeb] = 0x00D9,
+  [0xec] = 0x00FD,
+  [0xed] = 0x00DD,
+  [0xee] = 0x00AF,
+  [0xef] = 0x00B4,
+  [0xf0] = 0x00AD,
+  [0xf1] = 0x00B1,
+  [0xf2] = 0x2017,
+  [0xf3] = 0x00BE,
+  [0xf4] = 0x00B6,
+  [0xf5] = 0x00A7,
+  [0xf6] = 0x00F7,
+  [0xf7] = 0x00B8,
+  [0xf8] = 0x00B0,
+  [0xf9] = 0x00A8,
+  [0xfa] = 0x00B7,
+  [0xfb] = 0x00B9,
+  [0xfc] = 0x00B3,
+  [0xfd] = 0x00B2,
+  [0xfe] = 0x25A0,
+  [0xff] = 0x00A0,
+};
+
+static const struct gap from_idx[] = {
+  { start: 0x0000, end: 0x007f, idx:     0 },
+  { start: 0x00a0, end: 0x00ff, idx:   -32 },
+  { start: 0x0131, end: 0x0131, idx:   -81 },
+  { start: 0x0192, end: 0x0192, idx:  -177 },
+  { start: 0x2017, end: 0x2017, idx: -7989 },
+  { start: 0x2500, end: 0x2502, idx: -9245 },
+  { start: 0x250c, end: 0x251c, idx: -9254 },
+  { start: 0x2524, end: 0x2524, idx: -9261 },
+  { start: 0x252c, end: 0x252c, idx: -9268 },
+  { start: 0x2534, end: 0x2534, idx: -9275 },
+  { start: 0x253c, end: 0x253c, idx: -9282 },
+  { start: 0x2550, end: 0x256c, idx: -9301 },
+  { start: 0x2580, end: 0x2588, idx: -9320 },
+  { start: 0x2591, end: 0x2593, idx: -9328 },
+  { start: 0x25a0, end: 0x25a0, idx: -9340 },
+  { start: 0xffff, end: 0xffff, idx:     0 }
+};
+static const unsigned char from_ucs2[] = {
+
+  '\x00', '\x01', '\x02', '\x03', '\x04', '\x05', '\x06', '\x07',
+  '\x08', '\x09', '\x0a', '\x0b', '\x0c', '\x0d', '\x0e', '\x0f',
+  '\x10', '\x11', '\x12', '\x13', '\x14', '\x15', '\x16', '\x17',
+  '\x18', '\x19', '\x1a', '\x1b', '\x1c', '\x1d', '\x1e', '\x1f',
+  '\x20', '\x21', '\x22', '\x23', '\x24', '\x25', '\x26', '\x27',
+  '\x28', '\x29', '\x2a', '\x2b', '\x2c', '\x2d', '\x2e', '\x2f',
+  '\x30', '\x31', '\x32', '\x33', '\x34', '\x35', '\x36', '\x37',
+  '\x38', '\x39', '\x3a', '\x3b', '\x3c', '\x3d', '\x3e', '\x3f',
+  '\x40', '\x41', '\x42', '\x43', '\x44', '\x45', '\x46', '\x47',
+  '\x48', '\x49', '\x4a', '\x4b', '\x4c', '\x4d', '\x4e', '\x4f',
+  '\x50', '\x51', '\x52', '\x53', '\x54', '\x55', '\x56', '\x57',
+  '\x58', '\x59', '\x5a', '\x5b', '\x5c', '\x5d', '\x5e', '\x5f',
+  '\x60', '\x61', '\x62', '\x63', '\x64', '\x65', '\x66', '\x67',
+  '\x68', '\x69', '\x6a', '\x6b', '\x6c', '\x6d', '\x6e', '\x6f',
+  '\x70', '\x71', '\x72', '\x73', '\x74', '\x75', '\x76', '\x77',
+  '\x78', '\x79', '\x7a', '\x7b', '\x7c', '\x7d', '\x7e', '\x7f',
+  '\xff', '\xad', '\xbd', '\x9c', '\xcf', '\xbe', '\xdd', '\xf5',
+  '\xf9', '\xb8', '\xa6', '\xae', '\xaa', '\xf0', '\xa9', '\xee',
+  '\xf8', '\xf1', '\xfd', '\xfc', '\xef', '\xe6', '\xf4', '\xfa',
+  '\xf7', '\xfb', '\xa7', '\xaf', '\xac', '\xab', '\xf3', '\xa8',
+  '\xb7', '\xb5', '\xb6', '\xc7', '\x8e', '\x8f', '\x92', '\x80',
+  '\xd4', '\x90', '\xd2', '\xd3', '\xde', '\xd6', '\xd7', '\xd8',
+  '\xd1', '\xa5', '\xe3', '\xe0', '\xe2', '\xe5', '\x99', '\x9e',
+  '\x9d', '\xeb', '\xe9', '\xea', '\x9a', '\xed', '\xe8', '\xe1',
+  '\x85', '\xa0', '\x83', '\xc6', '\x84', '\x86', '\x91', '\x87',
+  '\x8a', '\x82', '\x88', '\x89', '\x8d', '\xa1', '\x8c', '\x8b',
+  '\xd0', '\xa4', '\x95', '\xa2', '\x93', '\xe4', '\x94', '\xf6',
+  '\x9b', '\x97', '\xa3', '\x96', '\x81', '\xec', '\xe7', '\x98',
+  '\xd5', '\x9f', '\xf2', '\xc4', '\x00', '\xb3', '\xda', '\x00',
+  '\x00', '\x00', '\xbf', '\x00', '\x00', '\x00', '\xc0', '\x00',
+  '\x00', '\x00', '\xd9', '\x00', '\x00', '\x00', '\xc3', '\xb4',
+  '\xc2', '\xc1', '\xc5', '\xcd', '\xba', '\x00', '\x00', '\xc9',
+  '\x00', '\x00', '\xbb', '\x00', '\x00', '\xc8', '\x00', '\x00',
+  '\xbc', '\x00', '\x00', '\xcc', '\x00', '\x00', '\xb9', '\x00',
+  '\x00', '\xcb', '\x00', '\x00', '\xca', '\x00', '\x00', '\xce',
+  '\xdf', '\x00', '\x00', '\x00', '\xdc', '\x00', '\x00', '\x00',
+  '\xdb', '\xb0', '\xb1', '\xb2', '\xfe',
+};
+
+
+static size_t cp850_push(void *cd, char **inbuf, size_t *inbytesleft,
+                        char **outbuf, size_t *outbytesleft)
+{
+       while (*inbytesleft >= 2 && *outbytesleft >= 1) {
+               int i;
+               int done = 0;
+               
+               uint16 ch = SVAL(*inbuf,0);
+               
+               for (i=0; from_idx[i].start != 0xffff; i++) {
+                       if ((from_idx[i].start <= ch) && (from_idx[i].end >= ch)) {
+                               ((unsigned char*)(*outbuf))[0] = from_ucs2[from_idx[i].idx+ch];
+                               (*inbytesleft) -= 2;
+                               (*outbytesleft) -= 1;
+                               (*inbuf)  += 2;
+                               (*outbuf) += 1;
+                               done = 1;
+                               break;
+                       }
+               }
+               if (!done) {
+                       errno = EINVAL;
+                       return -1;
+               }
+               
+       }
+
+       if (*inbytesleft == 1) {
+               errno = EINVAL;
+               return -1;
+       }
+
+       if (*inbytesleft > 1) {
+               errno = E2BIG;
+               return -1;
+       }
+       
+       return 0;
+}
+
+static size_t cp850_pull(void *cd, char **inbuf, size_t *inbytesleft,
+                        char **outbuf, size_t *outbytesleft)
+{
+       while (*inbytesleft >= 1 && *outbytesleft >= 2) {
+               *(uint16*)(*outbuf) = to_ucs2[((unsigned char*)(*inbuf))[0]];
+               (*inbytesleft)  -= 1;
+               (*outbytesleft) -= 2;
+               (*inbuf)  += 1;
+               (*outbuf) += 2;
+       }
+
+       if (*inbytesleft > 0) {
+               errno = E2BIG;
+               return -1;
+       }
+       
+       return 0;
+}
+
+struct charset_functions cp850_functions = {"CP850", cp850_pull, cp850_push};
+
+NTSTATUS charset_cp850_init(void)
+{
+       return smb_register_charset(&cp850_functions);
+}
index 3524136fb1e786c99f9732f70e88ed133d13e100..1dd168b0bb0047f002b4af50fa92fa9db971dca3 100644 (file)
@@ -24,7 +24,7 @@
 #include "includes.h"
 
 static int
-process_block (smb_iconv_t cd, char *addr, size_t len, FILE *output)
+process_block (smb_iconv_t cd, const char *addr, size_t len, FILE *output)
 {
 #define OUTBUF_SIZE    32768
   const char *start = addr;
@@ -37,7 +37,7 @@ process_block (smb_iconv_t cd, char *addr, size_t len, FILE *output)
     {
       outptr = outbuf;
       outlen = OUTBUF_SIZE;
-      n = smb_iconv (cd, &addr, &len, &outptr, &outlen);
+      n = smb_iconv (cd,  &addr, &len, &outptr, &outlen);
 
       if (outptr != outbuf)
        {
@@ -171,7 +171,7 @@ int main(int argc, char *argv[])
        char *from = "";
        char *to = "";
        char *output = NULL;
-       char *preload = NULL;
+       const char *preload_modules[] = {NULL, NULL};
        FILE *out = stdout;
        int fd;
        smb_iconv_t cd;
@@ -184,7 +184,7 @@ int main(int argc, char *argv[])
                { "from-code", 'f', POPT_ARG_STRING, &from, 0, "Encoding of original text" },
                { "to-code", 't', POPT_ARG_STRING, &to, 0, "Encoding for output" },
                { "output", 'o', POPT_ARG_STRING, &output, 0, "Write output to this file" },
-               { "preload-modules", 'p', POPT_ARG_STRING, &preload, 0, "Modules to load" },
+               { "preload-modules", 'p', POPT_ARG_STRING, &preload_modules[0], 0, "Modules to load" },
                POPT_COMMON_SAMBA
                POPT_TABLEEND
        };
@@ -202,12 +202,12 @@ int main(int argc, char *argv[])
           facilities.  See lib/debug.c */
        setup_logging("smbiconv", True);
 
-       if(preload)smb_load_modules(str_list_make(preload, NULL));
+       if (preload_modules[0]) smb_load_modules(preload_modules);
 
        if(output) {
-               output = fopen(output, "w");
+               out = fopen(output, "w");
 
-               if(!output) {
+               if(!out) {
                        DEBUG(0, ("Can't open output file '%s': %s, exiting...\n", output, strerror(errno)));
                        return 1;
                }
@@ -231,7 +231,7 @@ int main(int argc, char *argv[])
                }
 
                /* Loop thru all arguments */
-               process_fd(cd, fd, stdout);
+               process_fd(cd, fd, out);
 
                close(fd);
        }