diff --git a/lib/modules/Stdio.pmod/module.pmod b/lib/modules/Stdio.pmod/module.pmod
index 01fd2ccb561d7bead65d50becaeba2289dda23b7..bba4a0c5ead2250926dc4491fc15f89fd594e8bf 100644
--- a/lib/modules/Stdio.pmod/module.pmod
+++ b/lib/modules/Stdio.pmod/module.pmod
@@ -1,4 +1,4 @@
-// $Id: module.pmod,v 1.137 2002/03/05 14:17:23 mast Exp $
+// $Id: module.pmod,v 1.138 2002/03/05 15:09:15 per-bash Exp $
 #pike __REAL_VERSION__
 
 inherit files;
@@ -1776,7 +1776,23 @@ int file_equal (string file_1, string file_2)
 //! sort of I/O error.
 {
   File f1 = File(), f2 = File();
+
+  if( file_1 == file_2 )
+    return 1;
+
   if (!f1->open (file_1, "r") || !f2->open (file_2, "r")) return 0;
+
+
+  // Some optimizations.
+  Stat s1 = f1->stat(), s2 = f2->stat();
+
+  if( s1->size != s2->size )
+    return 0;
+
+  // Detect sym- or hardlinks to the same file.
+  if( (s1->dev == s2->dev) && (s1->ino == s2->ino) )
+    return 1;
+  
   function(int,int|void:string) f1_read = f1->read, f2_read = f2->read;
   string d1, d2;
   do {