PathInfo::hardlinkCopy: fix handling cross-device links
authorMichael Andres <ma@suse.de>
Tue, 18 Oct 2011 09:02:32 +0000 (11:02 +0200)
committerMichael Andres <ma@suse.de>
Tue, 18 Oct 2011 14:47:19 +0000 (16:47 +0200)
zypp/PathInfo.cc

index 5791f2ff3f39fde13c6cd430b5974738bf522c5f..486e0b18ddd5746412f7713fb82f28f696066911 100644 (file)
@@ -820,22 +820,26 @@ namespace zypp
     {
       MIL << "hardlinkCopy " << oldpath << " -> " << newpath;
 
-      PathInfo oldpi( oldpath, PathInfo::LSTAT );
-      if ( oldpi.isLink() )
+      PathInfo pi( oldpath, PathInfo::LSTAT );
+      if ( pi.isLink() )
       {
-       // dont hardlink symliknks!
+       // dont hardlink symlinks!
        return copy( oldpath, newpath );
       }
 
-      // Here: no symlink
+      pi.lstat( newpath );
+      if ( pi.isExist() )
+      {
+       int res = unlink( newpath );
+       if ( res != 0 )
+         return _Log_Result( res );
+      }
+
+      // Here: no symlink, no newpath
       if ( ::link( oldpath.asString().c_str(), newpath.asString().c_str() ) == -1 )
       {
         switch ( errno )
         {
-          case EEXIST: // newpath already exists
-            if ( unlink( newpath ) == 0 && ::link( oldpath.asString().c_str(), newpath.asString().c_str() ) != -1 )
-              return _Log_Result( 0 );
-            break;
           case EXDEV: // oldpath  and  newpath are not on the same mounted file system
             return copy( oldpath, newpath );
             break;