diff --git a/lib/master.pike.in b/lib/master.pike.in
index f2886e545f74b16ff24b41db7e95ba6024db8b1b..1da1e8a61e8d7126276791dcbdaf64b05e4cae67 100644
--- a/lib/master.pike.in
+++ b/lib/master.pike.in
@@ -1,6 +1,6 @@
 /* -*- Pike -*-
  *	
- * $Id: master.pike.in,v 1.123 2000/07/12 01:19:18 hubbe Exp $
+ * $Id: master.pike.in,v 1.124 2000/08/02 11:06:36 grubba Exp $
  * 
  * Master-file for Pike.
  *
@@ -24,6 +24,10 @@ constant bt_max_string_len = BT_MAX_STRING_LEN;
 #endif /* OUT_OF_DATE_WARNING */
 constant out_of_date_warning = OUT_OF_DATE_WARNING;
 
+#ifndef PIKE_WARNINGS
+#define PIKE_WARNINGS 0
+#endif /* PIKE_WARNINGS */
+
 /*
  * Functions begin here.
  */
@@ -96,7 +100,7 @@ object low_cast_to_object(string oname, string current_file);
 array(string) pike_include_path=({});
 array(string) pike_module_path=({});
 array(string) pike_program_path=({});
-int want_warnings = 0;
+int want_warnings = PIKE_WARNINGS;
 
 #ifdef PIKE_AUTORELOAD
 
@@ -214,9 +218,34 @@ mapping (string:string) environment=([]);
 
 string|mapping(string:string) getenv(string|void s)
 {
-  if(!s) return environment;
+  if(!s) return environment + ([]);
+  return environment[s];
+}
+
+#if 0
+variant mapping(string:string) getenv()
+{
+  return environment + ([]);
+}
+
+variant string getenv(string s)
+{
+  return environment[s];
+}
+
+function(:mapping(string:string))|function(string:string) getenv(s)
+{
+  if(!s) return environment + ([]);
+  return environment[s];
+}
+
+mapping(string:string) getenv() |
+string getenv(string s)
+{
+  if(!s) return environment + ([]);
   return environment[s];
 }
+#endif /* 0 */
 
 void putenv(string var, string val)
 {
@@ -1213,11 +1242,16 @@ string trim_file_name(string s)
 {
   if(getenv("LONG_PIKE_ERRORS")) return s;
   if(getenv("SHORT_PIKE_ERRORS")) return BASENAME(s);
-  string cwd=getcwd();
-  if (sizeof(cwd) && (cwd[-1] != '/')) {
-    cwd += "/";
-  }
-  if(s[..sizeof(cwd)-1]==cwd) return s[sizeof(cwd)..];
+  /* getcwd() can fail, but since this is called from handle_error(),
+   * we don't want to fail, so we don't care about that.
+   */
+  catch {
+    string cwd=getcwd();
+    if (sizeof(cwd) && (cwd[-1] != '/')) {
+      cwd += "/";
+    }
+    if(s[..sizeof(cwd)-1]==cwd) return s[sizeof(cwd)..];
+  };
   return s;
 }
 
@@ -1678,7 +1712,7 @@ string describe_backtrace(mixed trace, void|int linewidth)
 	  }
 	}
       }) {
-	row += sprintf("Error indexing backtrace line %d: %s (%O)!", e, err[0], err[1]);
+	row = sprintf("Error indexing backtrace line %d: %s (%O)!", e, err[0], err[1]);
       }
       ret += row + "\n";
     }