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

Diff of /tar/src/create.c

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

revision 1.59 by gray, Sun Aug 31 22:41:32 2003 UTC revision 1.60 by gray, Mon Sep 1 17:00:26 2003 UTC
# Line 330  uintmax_to_chars (uintmax_t v, char *p, Line 330  uintmax_to_chars (uintmax_t v, char *p,
330  {  {
331    to_chars (0, v, sizeof v, 0, p, s, "uintmax_t");    to_chars (0, v, sizeof v, 0, p, s, "uintmax_t");
332  }  }
333    
334    void
335    string_to_chars (char *str, char *p, size_t s)
336    {
337      strncpy (p, str, s);
338      p[s-1] = 0;
339    }
340    
341    
342  /* Writing routines.  */  /* Writing routines.  */
343    
# Line 393  write_long (const char *p, char type) Line 401  write_long (const char *p, char type)
401    memset (header->buffer + size, 0, bufsize - size);    memset (header->buffer + size, 0, bufsize - size);
402    set_next_block_after (header + (size - 1) / BLOCKSIZE);    set_next_block_after (header + (size - 1) / BLOCKSIZE);
403  }  }
404    
405    /* NOTE: Cross recursion between start_header and write_extended  */
406    
407    static union block *
408    write_extended (union block *old_header, char type)
409    {
410      union block *header, hp;
411      struct tar_stat_info foo;
412      size_t size;
413      size_t bufsize;
414      char *p;
415    
416      if (extended_header.buffer || extended_header.stk == NULL)
417        return old_header; /* Prevent recursion */
418      
419      xheader_finish (&extended_header);
420      size = extended_header.size;
421      memset (&foo, 0, sizeof foo);
422      foo.stat.st_mode = S_IFREG|S_IRUSR|S_IWUSR|S_IRGRP|S_IROTH;
423      time (&foo.stat.st_ctime);
424      foo.stat.st_atime = foo.stat.st_ctime;
425      foo.stat.st_mtime = foo.stat.st_ctime;
426      foo.stat.st_size = size;
427    
428      memcpy (hp.buffer, old_header, sizeof (hp));
429      
430      header = start_header ("././@PaxHeader", &foo);
431      header->header.typeflag = type;
432    
433      finish_header (header, -1);
434    
435      p = extended_header.buffer;
436    
437      do
438        {
439          size_t len;
440          
441          header = find_next_block ();
442          len = BLOCKSIZE;
443          if (len > size)
444            len = size;
445          memcpy (header->buffer, p, len);
446          if (len < BLOCKSIZE)
447            memset (header->buffer + len, 0, BLOCKSIZE - len);
448          p += len;
449          size -= len;
450          set_next_block_after (header);
451        }
452      while (size > 0);
453    
454      xheader_destroy (&extended_header);
455      header = find_next_block ();
456      memcpy (header, &hp.buffer, sizeof (hp.buffer));
457      return header;
458    }
459    
460    
461  /* Header handling.  */  /* Header handling.  */
462    
# Line 408  start_header (const char *name, struct t Line 472  start_header (const char *name, struct t
472    
473    if (sizeof header->header.name <= strlen (name))    if (sizeof header->header.name <= strlen (name))
474      write_long (name, GNUTYPE_LONGNAME);      write_long (name, GNUTYPE_LONGNAME);
475    
476    header = find_next_block ();    header = find_next_block ();
477    memset (header->buffer, 0, sizeof (union block));    memset (header->buffer, 0, sizeof (union block));
478    
# Line 415  start_header (const char *name, struct t Line 480  start_header (const char *name, struct t
480    
481    strncpy (header->header.name, name, NAME_FIELD_SIZE);    strncpy (header->header.name, name, NAME_FIELD_SIZE);
482    header->header.name[NAME_FIELD_SIZE - 1] = '\0';    header->header.name[NAME_FIELD_SIZE - 1] = '\0';
483      
484    /* Override some stat fields, if requested to do so.  */    /* Override some stat fields, if requested to do so.  */
485    
486    if (owner_option != (uid_t) -1)    if (owner_option != (uid_t) -1)
# Line 454  start_header (const char *name, struct t Line 519  start_header (const char *name, struct t
519    else    else
520      MODE_TO_CHARS (st->stat.st_mode, header->header.mode);      MODE_TO_CHARS (st->stat.st_mode, header->header.mode);
521    
522    UID_TO_CHARS (st->stat.st_uid, header->header.uid);    if (st->stat.st_uid > MAXOCTAL7 && archive_format == POSIX_FORMAT)
523    GID_TO_CHARS (st->stat.st_gid, header->header.gid);      xheader_store ("uid", st);
524    OFF_TO_CHARS (st->stat.st_size, header->header.size);    else
525        UID_TO_CHARS (st->stat.st_uid, header->header.uid);
526      
527      if (st->stat.st_gid > MAXOCTAL7 && archive_format == POSIX_FORMAT)
528        xheader_store ("gid", st);
529      else
530        GID_TO_CHARS (st->stat.st_gid, header->header.gid);
531    
532      if (st->stat.st_size > MAXOCTAL11 && archive_format == POSIX_FORMAT)
533        xheader_store ("size", st);
534      else
535        OFF_TO_CHARS (st->stat.st_size, header->header.size);
536    
537    TIME_TO_CHARS (st->stat.st_mtime, header->header.mtime);    TIME_TO_CHARS (st->stat.st_mtime, header->header.mtime);
   MAJOR_TO_CHARS (0, header->header.devmajor);  
   MINOR_TO_CHARS (0, header->header.devminor);  
538    
539    if (incremental_option)    /* FIXME */
540      if (S_ISCHR (st->stat.st_mode)
541          || S_ISBLK (st->stat.st_mode))
542        {
543          st->devmajor = major (st->stat.st_rdev);
544          st->devminor = minor (st->stat.st_rdev);
545    
546          if (st->devmajor > MAXOCTAL7 && archive_format == POSIX_FORMAT)
547            xheader_store ("devmajor", st);
548          else
549            MAJOR_TO_CHARS (st->devmajor, header->header.devmajor);
550    
551          if (st->devminor > MAXOCTAL7 && archive_format == POSIX_FORMAT)
552            xheader_store ("devminor", st);
553          else
554            MAJOR_TO_CHARS (st->devminor, header->header.devminor);
555        }
556      else
557        {
558          MAJOR_TO_CHARS (0, header->header.devmajor);
559          MINOR_TO_CHARS (0, header->header.devminor);
560        }
561      
562      if (archive_format == POSIX_FORMAT)
563        {
564          xheader_store ("atime", st);
565          xheader_store ("ctime", st);
566        }
567      else if (incremental_option)
568      if (archive_format == OLDGNU_FORMAT)      if (archive_format == OLDGNU_FORMAT)
569        {        {
570          TIME_TO_CHARS (st->stat.st_atime, header->oldgnu_header.atime);          TIME_TO_CHARS (st->stat.st_atime, header->oldgnu_header.atime);
# Line 496  start_header (const char *name, struct t Line 599  start_header (const char *name, struct t
599      }      }
600    else    else
601      {      {
602        uid_to_uname (st->stat.st_uid, header->header.uname);        uid_to_uname (st->stat.st_uid, &st->uname);
603        gid_to_gname (st->stat.st_gid, header->header.gname);        gid_to_gname (st->stat.st_gid, &st->gname);
604          
605          if (archive_format == POSIX_FORMAT
606              && strlen (st->uname) > UNAME_FIELD_SIZE)
607            xheader_store ("uname", st);
608          else
609            UNAME_TO_CHARS (st->uname, header->header.uname);
610    
611          if (archive_format == POSIX_FORMAT
612              && strlen (st->gname) > GNAME_FIELD_SIZE)
613            xheader_store ("gname", st);
614          else
615            GNAME_TO_CHARS (st->gname, header->header.gname);
616      }      }
617    
618    return header;    return header;
# Line 514  finish_header (union block *header, off_ Line 629  finish_header (union block *header, off_
629    int sum;    int sum;
630    char *p;    char *p;
631    
632      header = write_extended (header, XHDTYPE);
633      
634    memcpy (header->header.chksum, CHKBLANKS, sizeof header->header.chksum);    memcpy (header->header.chksum, CHKBLANKS, sizeof header->header.chksum);
635    
636    sum = 0;    sum = 0;

Legend:
Removed from v.1.59  
changed lines
  Added in v.1.60

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