/[tar]/tar/src/list.c
ViewVC logotype

Diff of /tar/src/list.c

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 1.55 by eggert, Wed Sep 3 06:15:32 2003 UTC revision 1.56 by gray, Thu Sep 4 13:59:03 2003 UTC
# Line 320  read_header (bool raw_extended_headers) Line 320  read_header (bool raw_extended_headers)
320    
321        /* Good block.  Decode file size and return.  */        /* Good block.  Decode file size and return.  */
322    
       if (header->header.typeflag == XHDTYPE  
           || header->header.typeflag == XGLTYPE)  
         {  
           xheader_read (header, OFF_FROM_HEADER (header->header.size));  
           continue;  
         }  
         
323        if (header->header.typeflag == LNKTYPE)        if (header->header.typeflag == LNKTYPE)
324          current_stat_info.stat.st_size = 0;     /* links 0 size on tape */          current_stat_info.stat.st_size = 0;     /* links 0 size on tape */
325        else        else
326          current_stat_info.stat.st_size = OFF_FROM_HEADER (header->header.size);          current_stat_info.stat.st_size = OFF_FROM_HEADER (header->header.size);
327    
328        if (header->header.typeflag == GNUTYPE_LONGNAME        if (header->header.typeflag == GNUTYPE_LONGNAME
329            || header->header.typeflag == GNUTYPE_LONGLINK)            || header->header.typeflag == GNUTYPE_LONGLINK
330              || header->header.typeflag == XHDTYPE
331              || header->header.typeflag == XGLTYPE)
332          {          {
333            if (raw_extended_headers)            if (raw_extended_headers)
334              return HEADER_SUCCESS_EXTENDED;              return HEADER_SUCCESS_EXTENDED;
335            else            else if (header->header.typeflag == GNUTYPE_LONGNAME
336                       || header->header.typeflag == GNUTYPE_LONGLINK)
337              {              {
338                size_t name_size = current_stat_info.stat.st_size;                size_t name_size = current_stat_info.stat.st_size;
339                size = name_size - name_size % BLOCKSIZE + 2 * BLOCKSIZE;                size = name_size - name_size % BLOCKSIZE + 2 * BLOCKSIZE;
340                if (name_size != current_stat_info.stat.st_size || size < name_size)                if (name_size != current_stat_info.stat.st_size
341                      || size < name_size)
342                  xalloc_die ();                  xalloc_die ();
             }  
343    
344            header_copy = xmalloc (size + 1);                header_copy = xmalloc (size + 1);
345                  
346            if (header->header.typeflag == GNUTYPE_LONGNAME)                if (header->header.typeflag == GNUTYPE_LONGNAME)
             {  
               if (next_long_name)  
                 free (next_long_name);  
               next_long_name = header_copy;  
               next_long_name_blocks = size / BLOCKSIZE;  
             }  
           else  
             {  
               if (next_long_link)  
                 free (next_long_link);  
               next_long_link = header_copy;  
               next_long_link_blocks = size / BLOCKSIZE;  
             }  
   
           set_next_block_after (header);  
           *header_copy = *header;  
           bp = header_copy->buffer + BLOCKSIZE;  
   
           for (size -= BLOCKSIZE; size > 0; size -= written)  
             {  
               data_block = find_next_block ();  
               if (! data_block)  
347                  {                  {
348                    ERROR ((0, 0, _("Unexpected EOF in archive")));                    if (next_long_name)
349                    break;                      free (next_long_name);
350                      next_long_name = header_copy;
351                      next_long_name_blocks = size / BLOCKSIZE;
352                  }                  }
353                written = available_space_after (data_block);                else
354                if (written > size)                  {
355                  written = size;                    if (next_long_link)
356                        free (next_long_link);
357                memcpy (bp, data_block->buffer, written);                    next_long_link = header_copy;
358                bp += written;                    next_long_link_blocks = size / BLOCKSIZE;
359                set_next_block_after ((union block *)                  }
360                                      (data_block->buffer + written - 1));                
361              }                set_next_block_after (header);
362                  *header_copy = *header;
363                  bp = header_copy->buffer + BLOCKSIZE;
364    
365            *bp = '\0';                for (size -= BLOCKSIZE; size > 0; size -= written)
366                    {
367                      data_block = find_next_block ();
368                      if (! data_block)
369                        {
370                          ERROR ((0, 0, _("Unexpected EOF in archive")));
371                          break;
372                        }
373                      written = available_space_after (data_block);
374                      if (written > size)
375                        written = size;
376                      
377                      memcpy (bp, data_block->buffer, written);
378                      bp += written;
379                      set_next_block_after ((union block *)
380                                            (data_block->buffer + written - 1));
381                    }
382    
383                  *bp = '\0';
384                }
385              else if (header->header.typeflag == XHDTYPE
386                       || header->header.typeflag == XGLTYPE)
387                xheader_read (header, OFF_FROM_HEADER (header->header.size));
388          
389            /* Loop!  */            /* Loop!  */
390    
391          }          }

Legend:
Removed from v.1.55  
changed lines
  Added in v.1.56

savannah-hackers-public@gnu.org
ViewVC Help
Powered by ViewVC 1.1.26