@@ -1631,57 +1631,54 @@ char *boyer_moore_search( char *in_text, long in_text_len ) {
1631
1631
1632
1632
1633
1633
int extract_file ( int in_xiso , dir_node * in_file , modes in_mode , char * path ) {
1634
- char c ;
1635
1634
int err = 0 ;
1636
1635
bool warn = false;
1637
- uint32_t i , size , totalsize = 0 , totalpercent = 0 ;
1636
+ uint32_t i , size , read_size , totalsize = 0 , totalpercent = 0 ;
1638
1637
int out ;
1639
1638
1640
- if ( s_remove_systemupdate && strstr ( path , s_systemupdate ) )
1641
- {
1639
+ if ( s_remove_systemupdate && strstr ( path , s_systemupdate ) ){
1642
1640
if ( ! err && lseek ( in_xiso , (xoff_t ) in_file -> start_sector * XISO_SECTOR_SIZE + s_xbox_disc_lseek , SEEK_SET ) == -1 ) seek_err ();
1643
- }
1644
- else
1645
- {
1646
-
1647
- if ( in_mode == k_extract ) {
1648
- if ( ( out = open ( in_file -> filename , WRITEFLAGS , 0644 ) ) == -1 ) open_err ( in_file -> filename );
1649
- } else err = 1 ;
1641
+ }
1642
+ else {
1643
+ if ( in_mode == k_extract ) {
1644
+ if ( ( out = open ( in_file -> filename , WRITEFLAGS , 0644 ) ) == -1 ) open_err ( in_file -> filename );
1645
+ } else err = 1 ;
1650
1646
1651
1647
if ( ! err && lseek ( in_xiso , (xoff_t ) in_file -> start_sector * XISO_SECTOR_SIZE + s_xbox_disc_lseek , SEEK_SET ) == -1 ) seek_err ();
1652
1648
1653
- if ( ! err ) {
1654
- if ( in_file -> file_size == 0 )
1655
- exiso_log ( "%s%s%s (0 bytes) [100%%]%s\r" , in_mode == k_extract ? "extracting " : "" , path , in_file -> filename , "" );
1656
- if ( in_mode == k_extract ) {
1657
- for ( i = 0 , size = min ( in_file -> file_size , READWRITE_BUFFER_SIZE );
1658
- i < in_file -> file_size && read ( in_xiso , s_copy_buffer , size ) == (int ) size ;
1659
- i += size , size = min ( in_file -> file_size - i , READWRITE_BUFFER_SIZE ) )
1660
- {
1661
- if ( write ( out , s_copy_buffer , size ) != (int ) size ) {
1662
- write_err ();
1663
- break ;
1664
- }
1665
- totalsize += size ;
1666
- totalpercent = ( totalsize * 100.0 ) / in_file -> file_size ;
1667
- exiso_log ( "%s%s%s (%u bytes) [%u%%]%s\r" , in_mode == k_extract ? "extracting " : "" , path , in_file -> filename , in_file -> file_size , totalpercent , "" );
1649
+ if ( ! err ) {
1650
+ if (in_file -> file_size == 0 ) {
1651
+ exiso_log ("%s%s%s (0 bytes) [100%%]%s\r" , in_mode == k_extract ? "extracting " : "" , path , in_file -> filename , "" );
1668
1652
}
1669
-
1670
- close ( out );
1671
- } else {
1672
- for ( i = 0 , size = min ( in_file -> file_size , READWRITE_BUFFER_SIZE );
1673
- i < in_file -> file_size && read ( in_xiso , s_copy_buffer , size ) == (int ) size ;
1674
- i += size , size = min ( in_file -> file_size - i , READWRITE_BUFFER_SIZE ) )
1675
- {
1676
- totalsize += size ;
1677
- totalpercent = ( totalsize * 100.0 ) / in_file -> file_size ;
1678
- exiso_log ( "%s%s%s (%u bytes) [%u%%]%s\r" , in_mode == k_extract ? "extracting " : "" , path , in_file -> filename , in_file -> file_size , totalpercent , "" );
1653
+ else {
1654
+ i = 0 ;
1655
+ size = min (in_file -> file_size , READWRITE_BUFFER_SIZE );
1656
+ do {
1657
+ if ((int )(read_size = read (in_xiso , s_copy_buffer , size )) < 0 ) {
1658
+ read_err ();
1659
+ break ;
1660
+ }
1661
+ if (in_mode == k_extract && read_size != 0 ) {
1662
+ if (write (out , s_copy_buffer , read_size ) != (int )read_size ) {
1663
+ write_err ();
1664
+ break ;
1665
+ }
1666
+ }
1667
+ totalsize += read_size ;
1668
+ totalpercent = (totalsize * 100.0 ) / in_file -> file_size ;
1669
+ exiso_log ("%s%s%s (%u bytes) [%u%%]%s\r" , in_mode == k_extract ? "extracting " : "" , path , in_file -> filename , in_file -> file_size , totalpercent , "" );
1670
+
1671
+ i += read_size ;
1672
+ size = min (in_file -> file_size - i , READWRITE_BUFFER_SIZE );
1673
+ } while (i < in_file -> file_size && read_size > 0 );
1674
+ if (!err && i < in_file -> file_size ) {
1675
+ exiso_log ("\nWARNING: File %s is truncated. Reported size: %u bytes, read size: %u bytes!" , in_file -> filename , in_file -> file_size , i );
1676
+ }
1679
1677
}
1678
+ if (in_mode == k_extract ) close (out );
1680
1679
}
1681
1680
}
1682
1681
1683
- }
1684
-
1685
1682
if ( ! err ) exiso_log ( "\n" );
1686
1683
1687
1684
return err ;
@@ -1752,6 +1749,7 @@ int write_file( dir_node_avl *in_avl, write_tree_context *in_context, int in_dep
1752
1749
char * buf , * p ;
1753
1750
uint32_t bytes , n , size ;
1754
1751
int err = 0 , fd = -1 , i ;
1752
+ size_t len ;
1755
1753
1756
1754
if ( ! in_avl -> subdirectory ) {
1757
1755
if ( lseek ( in_context -> xiso , (xoff_t ) in_avl -> start_sector * XISO_SECTOR_SIZE , SEEK_SET ) == -1 ) seek_err ();
@@ -1768,45 +1766,63 @@ int write_file( dir_node_avl *in_avl, write_tree_context *in_context, int in_dep
1768
1766
if ( ! err ) {
1769
1767
exiso_log ( "adding %s%s (%u bytes) " , in_context -> path , in_avl -> filename , in_avl -> file_size ); flush ();
1770
1768
1771
- if ( s_media_enable && ( i = (int ) strlen ( in_avl -> filename ) ) >= 4 && in_avl -> filename [ i - 4 ] == '.' && ( in_avl -> filename [ i - 3 ] | 0x20 ) == 'x' && ( in_avl -> filename [ i - 2 ] | 0x20 ) == 'b' && ( in_avl -> filename [ i - 1 ] | 0x20 ) == 'e' ) {
1772
- for ( bytes = in_avl -> file_size , i = 0 ; ! err && bytes ; ) {
1773
- if ( ( n = read ( fd , buf + i , min ( bytes , size - i ) ) ) == -1 ) read_err ();
1774
-
1775
- bytes -= n ;
1776
-
1777
- if ( ! err ) {
1778
- for ( buf [ n += i ] = 0 , p = buf ; ( p = boyer_moore_search ( p , n - ( p - buf ) ) ) != nil ; p += XISO_MEDIA_ENABLE_LENGTH ) p [ XISO_MEDIA_ENABLE_BYTE_POS ] = XISO_MEDIA_ENABLE_BYTE ;
1779
-
1780
- if ( bytes ) {
1781
- if ( write ( in_context -> xiso , buf , n - ( i = XISO_MEDIA_ENABLE_LENGTH - 1 ) ) != (int ) n - i ) write_err ();
1782
-
1783
- if ( ! err ) memcpy ( buf , & buf [ n - ( XISO_MEDIA_ENABLE_LENGTH - 1 ) ], XISO_MEDIA_ENABLE_LENGTH - 1 );
1784
- } else {
1785
- if ( write ( in_context -> xiso , buf , n + i ) != (int ) n + i ) write_err ();
1769
+ i = 0 ;
1770
+ bytes = in_avl -> file_size ;
1771
+ do {
1772
+ if ((int )(n = read (fd , buf + i , min (bytes , size - i ))) < 0 ) {
1773
+ read_err ();
1774
+ break ;
1775
+ }
1776
+ if (n == 0 ) {
1777
+ if (i ) {
1778
+ if (write (in_context -> xiso , buf , i ) != i ) {
1779
+ write_err ();
1780
+ break ;
1786
1781
}
1787
1782
}
1783
+ break ;
1788
1784
}
1789
- } else {
1790
- for ( bytes = in_avl -> file_size ; ! err && bytes ; bytes -= n ) {
1791
- if ( ( n = read ( fd , buf , min ( bytes , size ) ) ) == -1 ) read_err ();
1792
-
1793
- if ( ! err && write ( in_context -> xiso , buf , n ) != (int ) n ) write_err ();
1785
+ bytes -= n ;
1786
+ if (s_media_enable && (len = strlen (in_avl -> filename )) >= 4 && in_avl -> filename [len - 4 ] == '.' && (in_avl -> filename [len - 3 ] | 0x20 ) == 'x' && (in_avl -> filename [len - 2 ] | 0x20 ) == 'b' && (in_avl -> filename [len - 1 ] | 0x20 ) == 'e' ) {
1787
+ for (buf [n += i ] = 0 , p = buf ; (p = boyer_moore_search (p , n - (p - buf ))) != nil ; p += XISO_MEDIA_ENABLE_LENGTH ) p [XISO_MEDIA_ENABLE_BYTE_POS ] = XISO_MEDIA_ENABLE_BYTE ;
1788
+ if (bytes ) {
1789
+ i = XISO_MEDIA_ENABLE_LENGTH - 1 ;
1790
+ if (write (in_context -> xiso , buf , n - i ) != (int )n - i ) {
1791
+ write_err ();
1792
+ break ;
1793
+ }
1794
+ memcpy (buf , & buf [n - i ], i );
1795
+ }
1796
+ else {
1797
+ if (write (in_context -> xiso , buf , n + i ) != (int )n + i ) {
1798
+ write_err ();
1799
+ break ;
1800
+ }
1801
+ }
1794
1802
}
1803
+ else {
1804
+ if (write (in_context -> xiso , buf , n + i ) != (int )n + i ) {
1805
+ write_err ();
1806
+ break ;
1807
+ }
1808
+ }
1809
+ } while (bytes );
1810
+ i = in_avl -> file_size - bytes ;
1811
+
1812
+ if (!err && (bytes = (XISO_SECTOR_SIZE - (in_avl -> file_size % XISO_SECTOR_SIZE )) % XISO_SECTOR_SIZE )) {
1813
+ memset (buf , XISO_PAD_BYTE , bytes );
1814
+ if (write (in_context -> xiso , buf , bytes ) != (int )bytes ) write_err ();
1795
1815
}
1796
-
1797
- if ( ! err && ( bytes = ( XISO_SECTOR_SIZE - ( in_avl -> file_size % XISO_SECTOR_SIZE ) ) % XISO_SECTOR_SIZE ) ) {
1798
- memset ( buf , XISO_PAD_BYTE , bytes );
1799
- if ( write ( in_context -> xiso , buf , bytes ) != ( int ) bytes ) write_err ( );
1816
+ exiso_log ( err ? "failed\n" : "[OK]\n" );
1817
+
1818
+ if (! err && i != in_avl -> file_size ) {
1819
+ exiso_log ( "WARNING: File %s is truncated. Reported size: %u bytes, wrote size: %u bytes!\n" , in_avl -> filename , in_avl -> file_size , i );
1800
1820
}
1801
-
1802
- if ( err ) { exiso_log ( "failed\n" ); }
1803
- else {
1804
- exiso_log ( "[OK]\n" );
1805
1821
1822
+ if (!err ) {
1806
1823
++ s_total_files ;
1807
1824
s_total_bytes += in_avl -> file_size ;
1808
-
1809
- if ( in_context -> progress ) (* in_context -> progress )( s_total_bytes , in_context -> final_bytes );
1825
+ if (in_context -> progress ) (* in_context -> progress )(s_total_bytes , in_context -> final_bytes );
1810
1826
}
1811
1827
}
1812
1828
0 commit comments