diff --git a/NT/init_nt b/NT/init_nt
index c247bd85cfc9bcd7a241160ced4b667b94de81e8..eeb3e110471ef24d7d7d88e78c2eb3da306e48f0 100755
--- a/NT/init_nt
+++ b/NT/init_nt
@@ -35,7 +35,7 @@ fi
 IFS=' 	
 
'
 
-export NTHOST NTDRIVE NTCC CC PATH NTTOOLS MNTREPLACE MNTREPLACE NTPORT USE_SPRSH
+export NTHOST NTDRIVE NTCC CC PATH NTTOOLS MNTREPLACE MNTREPLACE NTPORT USE_SPRSH NTMOUNT IFS
 
 case /$SHELL-$TERM in
    */bash-xterm)
diff --git a/src/main.c b/src/main.c
index eaa105ac3ffb865beb794c8fec1f6194a471ef2b..38877aaf4b273f537d8acb0c46c62d5393e35bb4 100644
--- a/src/main.c
+++ b/src/main.c
@@ -4,7 +4,7 @@
 ||| See the files COPYING and DISCLAIMER for more information.
 \*/
 #include "global.h"
-RCSID("$Id: main.c,v 1.58 1998/09/02 01:05:45 grubba Exp $");
+RCSID("$Id: main.c,v 1.59 1998/10/22 00:33:31 hubbe Exp $");
 #include "fdlib.h"
 #include "backend.h"
 #include "module.h"
@@ -360,7 +360,7 @@ int dbm_main(int argc, char **argv)
   }
 #else /* !HAVE_GETRLIMIT || !RLIMIT_STACK */
   /* 128 MB seems a bit extreme, most OS's seem to have their limit at ~8MB */
-  stack_top += STACK_DIRECTION * (1024*1024 * 128 - 8192 * sizeof(char *));
+  stack_top += STACK_DIRECTION * (1024*1024 * 8 - 8192 * sizeof(char *));
 #ifdef STACK_DEBUG
   fprintf(stderr, "2: C-stack: 0x%08p - 0x%08p, direction:%d\n",
 	  &argv, stack_top, STACK_DIRECTION);
diff --git a/src/modules/system/nt.c b/src/modules/system/nt.c
index 6337ef252f51d9bfac0bbf34391f4fddfd9d0f1a..96e892370534774854d0659575bcf85330faeac7 100644
--- a/src/modules/system/nt.c
+++ b/src/modules/system/nt.c
@@ -1,5 +1,5 @@
 /*
- * $Id: nt.c,v 1.5 1998/10/21 23:46:56 marcus Exp $
+ * $Id: nt.c,v 1.6 1998/10/22 00:33:55 hubbe Exp $
  *
  * NT system calls for Pike
  *
@@ -183,7 +183,7 @@ static void low_encode_user_info_0(USER_INFO_0 *tmp)
 {
 #define SAFE_PUSH_WSTR(X) \ 
   if(X) \
-    push_string(make_shared_string1((INT16 *) X)); \
+    push_string(make_shared_string1((p_wchar1 *) X)); \
   else \
     push_int(0)
 
@@ -332,16 +332,10 @@ static netuserenumtype netuserenum;
 static netapibufferfreetype netapibufferfree;
 HINSTANCE netapilib;
 
-LPWSTR make_wstr(struct pike_string *s)
-{
-  LPWSTR ret=(LPWSTR)xalloc(sizeof(WCHAR)*(s->len+1));
-  INT32 e;
-  for(e=0;e<=s->len;e++) ret[e]=s->str[e];
-  return ret;
-}
 
 void f_NetUserGetInfo(INT32 args)
 {
+  char *to_free1,*to_free2;
   BYTE *tmp=0;
   DWORD level;
   LPWSTR server, user;
@@ -364,21 +358,28 @@ void f_NetUserGetInfo(INT32 args)
 
   if(sp[-args].type==T_STRING)
   {
-    server=make_wstr(sp[-args].u.string);
+    server=(LPWSTR)require_wstring1(sp[-args].u.string,&to_free1);
+    if(!server)
+      error("NetUserGetInfo, server name string is too wide.\n");
   }else{
     server=NULL;
   }
   
-  user=make_wstr(sp[1-args].u.string);
+  user=(LPWSTR)require_wstring1(sp[1-args].u.string,&to_free2);
+  if(!user)
+  {
+    if(to_free1) free(to_free1);
+    error("NetUserGetInfo, user name string is too wide.\n");
+  }
 
   THREADS_ALLOW();
   ret=netusergetinfo(server,user,level,&tmp);
   THREADS_DISALLOW();
 
   pop_n_elems(args);
-  if(server) free(server);
-  free(user);
-  
+  if(to_free1) free(to_free1);
+  if(to_free2) free(to_free2);
+
   switch(ret)
   {
     case ERROR_ACCESS_DENIED:
@@ -405,6 +406,7 @@ void f_NetUserGetInfo(INT32 args)
 
 void f_NetUserEnum(INT32 args)
 {
+  char *to_free1;
   DWORD level=0;
   DWORD filter=0;
   LPWSTR server=NULL;
@@ -429,7 +431,7 @@ void f_NetUserEnum(INT32 args)
 
     case 1:
       if(sp[-args].type==T_STRING)
-	server=make_wstr(sp[-args].u.string);
+	server=(LPWSTR)require_wstring1(sp[-args].u.string,&to_free1);
 
     case 0: break;
   }
@@ -464,10 +466,12 @@ void f_NetUserEnum(INT32 args)
     switch(ret)
     {
       case ERROR_ACCESS_DENIED:
+	if(to_free1) free(to_free1);
 	error("NetGetUserInfo: Access denied.\n");
 	break;
 	
       case NERR_InvalidComputer:
+	if(to_free1) free(to_free1);
 	error("NetGetUserInfo: Invalid computer.\n");
 	break;
 
@@ -490,6 +494,7 @@ void f_NetUserEnum(INT32 args)
     }
     break;
   }
+  if(to_free1) free(to_free1);
 }
 
 void init_nt_system_calls(void)
diff --git a/src/signal_handler.c b/src/signal_handler.c
index 550fd0d9fa9dc1fed2f9571aa7166348a53e1f84..2023cb08d07eb04d74d4706c9d796fcdc7d1c0e3 100644
--- a/src/signal_handler.c
+++ b/src/signal_handler.c
@@ -22,7 +22,7 @@
 #include "builtin_functions.h"
 #include <signal.h>
 
-RCSID("$Id: signal_handler.c,v 1.87 1998/10/02 15:02:47 grubba Exp $");
+RCSID("$Id: signal_handler.c,v 1.88 1998/10/22 00:33:32 hubbe Exp $");
 
 #ifdef HAVE_PASSWD_H
 # include <passwd.h>
@@ -624,14 +624,6 @@ static void f_pid_status_pid(INT32 args)
 }
 
 #ifdef __NT__
-static TCHAR *convert_string(char *str, int len)
-{
-  int e;
-  TCHAR *ret=(TCHAR *)xalloc((len+1) * sizeof(TCHAR));
-  for(e=0;e<len;e++) ret[e]=EXTRACT_UCHAR(str+e);
-  ret[e]=0;
-  return ret;
-}
 
 static HANDLE get_inheritable_handle(struct mapping *optional,
 				     char *name,
@@ -873,7 +865,7 @@ void f_create_process(INT32 args)
     {
       if(tmp=simple_mapping_string_lookup(optional, "cwd"))
 	if(tmp->type == T_STRING)
-	  dir=convert_string(tmp->u.string->str, tmp->u.string->len);
+	  dir=(TCHAR *)STR0(tmp->u.string);
 
       t1=get_inheritable_handle(optional, "stdin",1);
       if(t1!=INVALID_HANDLE_VALUE) info.hStdInput=t1;
@@ -932,9 +924,6 @@ void f_create_process(INT32 args)
 		      &proc);
     THREADS_DISALLOW_UID();
     
-    if(dir) free((char *)dir);
-    if(command_line) free((char *)command_line);
-    if(filename) free((char *)filename);
     if(env) pop_stack();
 
 #if 1
diff --git a/src/stralloc.c b/src/stralloc.c
index f329e2c65e5829f26e132accfc0c2ad092c05aff..0ee4de7b79f0ed6868276148943bc8d900eb6cc2 100644
--- a/src/stralloc.c
+++ b/src/stralloc.c
@@ -15,7 +15,7 @@
 
 #include <ctype.h>
 
-RCSID("$Id: stralloc.c,v 1.46 1998/10/15 02:38:49 grubba Exp $");
+RCSID("$Id: stralloc.c,v 1.47 1998/10/22 00:33:33 hubbe Exp $");
 
 #define BEGIN_HASH_SIZE 997
 #define MAX_AVG_LINK_LENGTH 3
@@ -83,9 +83,9 @@ static INLINE unsigned INT32 generic_extract (const void *str, int size, int pos
     case 0: return ((unsigned char *)str)[pos];
     case 1: return ((unsigned INT16 *)str)[pos];
     case 2: return ((unsigned INT32 *)str)[pos];
-    default:
-      fatal("Illegal shift size!\n");
   }
+  fatal("Illegal shift size!\n");
+  return 0;
 }
 
 INLINE unsigned INT32 index_shared_string(struct pike_string *s, int pos)
@@ -509,7 +509,7 @@ struct pike_string * debug_make_shared_binary_string(const char *str,int len)
   return s;
 }
 
-struct pike_string * debug_make_shared_binary_string1(const INT16 *str,int len)
+struct pike_string * debug_make_shared_binary_string1(const p_wchar1 *str,int len)
 {
   struct pike_string *s;
   int h;
@@ -518,7 +518,7 @@ struct pike_string * debug_make_shared_binary_string1(const INT16 *str,int len)
   {
     /* Wrong size, convert */
     s=begin_shared_string(len);
-    convert_1_to_0(s->str,str,len);
+    convert_1_to_0(STR0(s),str,len);
     return end_shared_string(s);
   }
 
@@ -537,7 +537,7 @@ struct pike_string * debug_make_shared_binary_string1(const INT16 *str,int len)
   return s;
 }
 
-struct pike_string * debug_make_shared_binary_string2(const INT32 *str,int len)
+struct pike_string * debug_make_shared_binary_string2(const p_wchar2 *str,int len)
 {
   struct pike_string *s;
   int h;
@@ -547,7 +547,7 @@ struct pike_string * debug_make_shared_binary_string2(const INT32 *str,int len)
     case 0:
       /* Wrong size, convert */
       s=begin_shared_string(len);
-      convert_2_to_0(s->str,str,len);
+      convert_2_to_0(STR0(s),str,len);
       return end_shared_string(s);
 
     case 1:
@@ -577,14 +577,14 @@ struct pike_string *debug_make_shared_string(const char *str)
   return make_shared_binary_string(str, strlen(str));
 }
 
-struct pike_string *debug_make_shared_string1(const INT16 *str)
+struct pike_string *debug_make_shared_string1(const p_wchar1 *str)
 {
   INT32 len;
   for(len=0;str[len];len++);
   return debug_make_shared_binary_string1(str,len);
 }
 
-struct pike_string *debug_make_shared_string2(const INT32 *str)
+struct pike_string *debug_make_shared_string2(const p_wchar2 *str)
 {
   INT32 len;
   for(len=0;str[len];len++);
@@ -1271,10 +1271,9 @@ struct pike_string *string_slice(struct pike_string *s,
 
     case 2:
       return make_shared_binary_string2(STR2(s)+start,len);
-
-    default:
-      fatal("Illegal shift size!\n");
   }
+  fatal("Illegal shift size!\n");
+  return 0;
 }
 
 /*** replace function ***/
@@ -1632,11 +1631,11 @@ PCHARP MEMCHR_PCHARP(PCHARP ptr, int chr, int len)
   switch(ptr.shift)
   {
     case 0: return MKPCHARP(MEMCHR0(ptr.ptr,chr,len),0);
-    case 1: return MKPCHARP(MEMCHR1(ptr.ptr,chr,len),1);
-    case 2: return MKPCHARP(MEMCHR2(ptr.ptr,chr,len),2);
-    default:
-      fatal("Illegal shift in MEMCHR_PCHARP.\n");
+    case 1: return MKPCHARP(MEMCHR1((p_wchar1 *)ptr.ptr,chr,len),1);
+    case 2: return MKPCHARP(MEMCHR2((p_wchar2 *)ptr.ptr,chr,len),2);
   }
+  fatal("Illegal shift in MEMCHR_PCHARP.\n");
+  return MKPCHARP(0,0); /* make wcc happy */
 }
 
 #define DIGIT(x)	(isdigit(x) ? (x) - '0' : \
@@ -1697,3 +1696,71 @@ long STRTOL_PCHARP(PCHARP str, PCHARP *ptr, int base)
   if (ptr) *ptr = str;
   return (neg ? val : -val);
 }
+
+p_wchar0 *require_wstring0(struct pike_string *s,
+			   char **to_free)
+{
+  switch(s->size_shift)
+  {
+    case 0:
+      *to_free=0;
+      return STR0(s);
+    case 1:
+    case 2:
+      return 0;
+
+    default:
+      fatal("Illegal shift size in string.\n");
+  }
+  return 0;
+}
+
+p_wchar1 *require_wstring1(struct pike_string *s,
+			   char **to_free)
+{
+  switch(s->size_shift)
+  {
+    case 0:
+      *to_free=xalloc((s->len+1)*2);
+      convert_0_to_1((p_wchar1 *)*to_free, STR0(s),s->len+1);
+      return (p_wchar1 *)*to_free;
+
+    case 1:
+      *to_free=0;
+      return STR1(s);
+
+    case 2:
+      return 0;
+
+    default:
+      fatal("Illegal shift size in string.\n");
+  }
+  return 0;
+}
+
+
+p_wchar2 *require_wstring2(struct pike_string *s,
+			   char **to_free)
+{
+  switch(s->size_shift)
+  {
+    case 0:
+      *to_free=xalloc((s->len+1)*4);
+      convert_0_to_2((p_wchar2 *)*to_free, STR0(s),s->len+1);
+      return (p_wchar2 *)*to_free;
+
+    case 1:
+      *to_free=xalloc((s->len+1)*4);
+      convert_1_to_2((p_wchar2 *)*to_free, STR1(s),s->len+1);
+      return (p_wchar2 *)*to_free;
+
+    case 2:
+      *to_free=0;
+      return STR2(s);
+
+    default:
+      fatal("Illegal shift size in string.\n");
+  }
+  return 0;
+}
+
diff --git a/src/stralloc.h b/src/stralloc.h
index 17d99f282fe6e36c337ecd95ad16c06704168882..478a570dc9a5738c75642638e3f8c1b6000e8e7d 100644
--- a/src/stralloc.h
+++ b/src/stralloc.h
@@ -5,7 +5,7 @@
 \*/
 
 /*
- * $Id: stralloc.h,v 1.23 1998/10/21 19:47:41 hubbe Exp $
+ * $Id: stralloc.h,v 1.24 1998/10/22 00:33:34 hubbe Exp $
  */
 #ifndef STRALLOC_H
 #define STRALLOC_H
@@ -65,14 +65,14 @@ struct pike_string *debug_findstring(const struct pike_string *foo);
 
 typedef struct p_wchar_p
 {
-  void *ptr;
+  char *ptr;
   int shift;
 } PCHARP;
 
 #define INDEX_PCHARP(X,Y) INDEX_CHARP((X).ptr,(Y),(X).shift)
 #define SET_INDEX_PCHARP(X,Y,Z) INDEX_CHARP((X).ptr,(Y),(X).shift,(Z))
 #define EXTRACT_PCHARP(X) INDEX_CHARP((X).ptr,(0),(X).shift)
-#define INC_PCHARP(X,Y) (((char *)(X).ptr)+=(Y) << (X).shift)
+#define INC_PCHARP(X,Y) (((X).ptr)+=(Y) << (X).shift)
 
 #define LOW_COMPARE_PCHARP(X,CMP,Y) (((char *)((X).ptr)) CMP ((char *)((Y).ptr)))
 #define LOW_SUBTRACT_PCHARP(X,Y) LOW_COMPARE_PCHARP((X),-,(Y))
@@ -151,19 +151,13 @@ INLINE INT32 PIKE_CONCAT4(compare_,FROM,_to_,TO)(const PIKE_CONCAT(p_wchar,TO) *
 /* Prototypes begin here */
 INLINE unsigned INT32 index_shared_string(struct pike_string *s, int pos);
 INLINE void low_set_index(struct pike_string *s, int pos, int value);
-INLINE struct pike_string *debug_check_size_shift(struct pike_string *a,int shift);
+struct INLINE pike_string *debug_check_size_shift(struct pike_string *a,int shift);
 CONVERT(0,1)
 CONVERT(0,2)
 CONVERT(1,0)
 CONVERT(1,2)
 CONVERT(2,0)
 CONVERT(2,1)
-
-
-
-
-
-
 int generic_compare_strings(const void *a,int alen, int asize,
 			    const void *b,int blen, int bsize);
 void generic_memcpy(PCHARP to,
@@ -178,11 +172,11 @@ struct pike_string *debug_begin_wide_shared_string(int len, int shift);
 struct pike_string *low_end_shared_string(struct pike_string *s);
 struct pike_string *end_shared_string(struct pike_string *s);
 struct pike_string * debug_make_shared_binary_string(const char *str,int len);
-struct pike_string * debug_make_shared_binary_string1(const INT16 *str,int len);
-struct pike_string * debug_make_shared_binary_string2(const INT32 *str,int len);
+struct pike_string * debug_make_shared_binary_string1(const p_wchar1 *str,int len);
+struct pike_string * debug_make_shared_binary_string2(const p_wchar2 *str,int len);
 struct pike_string *debug_make_shared_string(const char *str);
-struct pike_string *debug_make_shared_string1(const INT16 *str);
-struct pike_string *debug_make_shared_string2(const INT32 *str);
+struct pike_string *debug_make_shared_string1(const p_wchar1 *str);
+struct pike_string *debug_make_shared_string2(const p_wchar2 *str);
 void unlink_pike_string(struct pike_string *s);
 void really_free_string(struct pike_string *s);
 void debug_free_string(struct pike_string *s);
@@ -240,6 +234,12 @@ void free_string_builder(struct string_builder *s);
 struct pike_string *finish_string_builder(struct string_builder *s);
 PCHARP MEMCHR_PCHARP(PCHARP ptr, int chr, int len);
 long STRTOL_PCHARP(PCHARP str, PCHARP *ptr, int base);
+p_wchar0 *require_wstring0(struct pike_string *s,
+			   char **to_free);
+p_wchar1 *require_wstring1(struct pike_string *s,
+			   char **to_free);
+p_wchar2 *require_wstring2(struct pike_string *s,
+			   char **to_free);
 /* Prototypes end here */
 
 #ifdef DEBUG_MALLOC