diff --git a/src/modules/files/file.c b/src/modules/files/file.c
index c4a7cb58ae89dcbc0fc3f2ce585dbea1be6980ea..01515c40713a6e44d02d67dcf1b3074f45a7d79b 100644
--- a/src/modules/files/file.c
+++ b/src/modules/files/file.c
@@ -5,7 +5,7 @@
 \*/
 /**/
 #include "global.h"
-RCSID("$Id: file.c,v 1.165 2000/01/30 20:58:17 per Exp $");
+RCSID("$Id: file.c,v 1.166 2000/03/13 16:46:50 grubba Exp $");
 #include "fdlib.h"
 #include "interpret.h"
 #include "svalue.h"
@@ -920,6 +920,7 @@ static void file_write(INT32 args)
       push_constant_text("");
       o_multiply();
       sp--;
+      dmalloc_touch_svalue(sp);
       assign_svalue(sp-args, sp);
 
 #ifdef PIKE_DEBUG
@@ -2185,27 +2186,36 @@ static void file_set_keepalive(INT32 args)
 static void file_connect(INT32 args)
 {
   struct sockaddr_in addr;
-  int tmp;
-  if(args < 2)
-    error("Too few arguments to file->connect()\n");
+  struct pike_string *dest_addr = NULL;
+  struct pike_string *src_addr = NULL;
+  INT_TYPE dest_port = 0;
+  INT_TYPE src_port = 0;
 
-  if(sp[-args].type != T_STRING)
-    error("Bad argument 1 to file->connect()\n");
+  int tmp;
 
-  if(sp[1-args].type != T_INT)
-    error("Bad argument 2 to file->connect()\n");
+  if (args < 4) {
+    get_all_args("file->connect", args, "%S%i", &dest_addr, &dest_port);
+  } else {
+    get_all_args("file->connect", args, "%S%i%S%i",
+		 &dest_addr, &dest_port, &src_addr, &src_port);
+  }
 
   if(FD < 0)
   {
-    file_open_socket(0);
+    if (args < 4) {
+      file_open_socket(0);
+    } else {
+      push_int(src_port);
+      ref_push_string(src_addr);
+      file_open_socket(2);
+    }
     if(IS_ZERO(sp-1) || FD < 0)
       error("file->connect(): Failed to open socket.\n");
     pop_stack();
   }
 
-
-  get_inet_addr(&addr, sp[-args].u.string->str);
-  addr.sin_port = htons(((u_short)sp[1-args].u.integer));
+  get_inet_addr(&addr, dest_addr->str);
+  addr.sin_port = htons(((u_short)dest_port));
 
   tmp=FD;
   THREADS_ALLOW();