Advertisement
Guest User

Untitled

a guest
Nov 4th, 2011
258
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.28 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4.  
  5. #pragma pack(1)
  6.  
  7. typedef unsigned short word;
  8. typedef unsigned int   uint;
  9. typedef unsigned char  byte;
  10. typedef unsigned long long qword;
  11.  
  12. enum {
  13. TAR_TYPE_FILE         = '0',
  14. TAR_TYPE_LINK         = '1',
  15. TAR_TYPE_SYMLINK      = '2',
  16. TAR_TYPE_CHARDEV      = '3',
  17. TAR_TYPE_BLOCKDEV     = '4',
  18. TAR_TYPE_DIR          = '5',
  19. TAR_TYPE_FIFO         = '6',
  20. TAR_TYPE_SHAREDFILE   = '7',
  21. TAR_TYPE_GNU_LONGLINK = 'K',
  22. TAR_TYPE_GNU_LONGNAME = 'L'
  23. };
  24.  
  25. uint oct2bin( char* s, uint l ) {
  26.   uint c, i, x = 0;
  27.   for( i=0; i<l; i++ ) {
  28.     c = s[i]; if( (c>='0') && (c<='7') ); else break;
  29.     (x<<=3) += c - '0';
  30.   }
  31.   return x;
  32. }
  33.  
  34. template< int N > uint oct2bin( char (&s)[N] ) { return oct2bin( s, N ); }
  35.  
  36. struct vmtar {
  37.  
  38.   char name[100];
  39.   char mode[8];
  40.   char uid[8];
  41.  
  42.   char gid[8];
  43.   char size[12];
  44.   char mtime[12];
  45.   char chksum[8];
  46.   char type;
  47.   char linkname[100];
  48.  
  49.   char magic[6];
  50.   char version[2];
  51.  
  52.   char uname[32];
  53.   char gname[32];
  54.  
  55.   char devmajor[8];
  56.   char devminor[8];
  57.  
  58.   char prefix[151];
  59.  
  60.   uint offset;
  61.   uint textoffset;
  62.   uint textsize;
  63.   uint numfixuppgs;
  64.  
  65. };
  66.  
  67.  
  68. vmtar hdr;
  69.  
  70. enum{ bufsize=1<<16 };
  71. byte buf[bufsize];
  72.  
  73. int main( int argc, char** argv ) {
  74.  
  75.   FILE* f = fopen( argv[1], "rb" ); if( f==0 ) return 1;
  76.   FILE* g = fopen( argv[2], "wb" ); if( g==0 ) g=fopen("nul","wb");
  77.  
  78.   while(1) {
  79.     (byte&)hdr=0;
  80.     fread( &hdr, 1,sizeof(hdr), f );
  81.     if( (byte&)hdr==0 ) break;
  82.  
  83.     printf( "<%c> %08X %08X [%s]\n", hdr.type, hdr.offset, oct2bin(hdr.size), hdr.name );
  84.  
  85.     if( (hdr.type==TAR_TYPE_DIR) || (hdr.type==TAR_TYPE_FILE) ) {
  86.       putc( (hdr.type==TAR_TYPE_DIR)?'D':'F', g );
  87.       uint i,n,l = strlen(hdr.name);
  88.       fwrite( &l, 1,2, g );
  89.       for( i=0; i<l; i++ ) if( hdr.name[i]=='/' ) hdr.name[i]='\\';
  90.       fwrite( hdr.name, 1,l, g );
  91.       if( hdr.type==TAR_TYPE_FILE ) {
  92.         n = oct2bin(hdr.size);
  93.         uint pos = ftell(f);
  94.         fseek(f,hdr.offset,SEEK_SET);
  95.         fwrite( &n, 1,4, g ); i=0; fwrite( &i, 1,4, g );
  96.         for( i=0; i<n; i+=l ) {
  97.           l = n-i; if( l>bufsize ) l=bufsize;
  98.           fread( buf, 1,l, f );
  99.           fwrite( buf,1,l, g );
  100.         }
  101.         fseek( f, pos, SEEK_SET );
  102.       }
  103.     }
  104.   }
  105.  
  106. }
  107.  
  108.  
  109.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement