Follow symlinks when saving registry.

diff --git a/misc/registry.c b/misc/registry.c
index 78dc094..6ec0a0d 100644
--- a/misc/registry.c
+++ b/misc/registry.c
@@ -25,6 +25,7 @@
 #include <string.h>
 #include <stdio.h>
 #include <unistd.h>
+#include <limits.h>
 #include <ctype.h>
 #include <errno.h>
 #ifdef HAVE_SYS_ERRNO_H
@@ -186,10 +187,23 @@
     DWORD ret;
     HANDLE handle;
     char *p;
-    char *name = HeapAlloc( GetProcessHeap(), 0, strlen(filename) + 20 );
+    char *rname = HeapAlloc( GetProcessHeap(), 0, PATH_MAX );
+    char *name;
+
+    /* use realpath to resolve any symlinks
+     * I assume that rname is filled in correctly if the error is ENOENT */
+    if ((realpath(filename, rname) == NULL) && (errno != ENOENT))
+    {
+        ERR( "Failed to find real path of %s: ", filename );
+        perror( "realpath" );
+        HeapFree( GetProcessHeap(), 0, rname );
+        return;
+    }
+
+    name = HeapAlloc( GetProcessHeap(), 0, strlen(rname) + 20 );
 
     if (!name) return;
-    strcpy( name, filename );
+    strcpy( name, rname );
     if ((p = strrchr( name, '/' ))) p++;
     else p = name;
 
@@ -209,15 +223,16 @@
         ret = server_call_noerr( REQ_SAVE_REGISTRY );
         CloseHandle( handle );
         if (ret) unlink( name );
-        else if (rename( name, filename ) == -1)
+        else if (rename( name, rname ) == -1)
         {
-            ERR( "Failed to move %s to %s: ", name, filename );
+            ERR( "Failed to move %s to %s: ", name, rname );
             perror( "rename" );
             unlink( name );
         }
     }
     else ERR( "Failed to save registry to %s, err %ld\n", name, GetLastError() );
 
+    HeapFree( GetProcessHeap(), 0, rname );
     HeapFree( GetProcessHeap(), 0, name );
 }