@@ -987,7 +987,44 @@ func Untar(file string, folder string) *Error {
987
987
case tar .TypeLink :
988
988
//fmt.Printf("-----hardlink---- %s, %s, %s\n", header.Linkname, folder, target)
989
989
//only works on linking to the file inside the same folder
990
- os .Symlink (header .Linkname , target )
990
+
991
+ //here we need to add a patch for specific bin/arch, for debian 10, all binaries are hardlinked to bin/arch
992
+ if strings .Compare (header .Linkname , "bin/arch" ) == 0 {
993
+ //if it is bin/arch, then we need to copy it to binaries
994
+ t_file_mode := os .FileMode (header .Mode )
995
+ //here we check file mode, if file does not have at least rw mode, we change it
996
+ //fixing "permission denied" error on cluster
997
+ permission := permbits .FileMode (t_file_mode )
998
+ if ! (permission .UserRead () && permission .UserWrite ()) {
999
+ permission .SetUserRead (true )
1000
+ permission .SetUserWrite (true )
1001
+ permbits .UpdateFileMode (& t_file_mode , permission )
1002
+ }
1003
+
1004
+ //write target
1005
+ f , err := os .OpenFile (target , os .O_CREATE | os .O_RDWR , t_file_mode )
1006
+ if err != nil {
1007
+ cerr := ErrNew (err , fmt .Sprintf ("untar create file %s error" , target ))
1008
+ return cerr
1009
+ }
1010
+
1011
+ // copy over contents
1012
+ source_file := fmt .Sprintf ("%s%s" , folder , header .Linkname )
1013
+ sf , err := os .Open (source_file )
1014
+ if err != nil {
1015
+ cerr := ErrNew (err , fmt .Sprintf ("untar read source file %s error" , source_file ))
1016
+ return cerr
1017
+ }
1018
+ if _ , err := io .Copy (f , sf ); err != nil {
1019
+ cerr := ErrNew (err , "untar copying file content error" )
1020
+ return cerr
1021
+ }
1022
+
1023
+ f .Close ()
1024
+ sf .Close ()
1025
+ } else {
1026
+ os .Symlink (header .Linkname , target )
1027
+ }
991
1028
}
992
1029
}
993
1030
}
0 commit comments