home *** CD-ROM | disk | FTP | other *** search
/ ftp.eri.u-tokyo.ac.jp / 2014.03.ftp.eri.u-tokyo.ac.jp.zip / ftp.eri.u-tokyo.ac.jp / pub / DOS / tools / kmtar.lzh / TARDIR.C < prev    next >
C/C++ Source or Header  |  1991-02-17  |  2KB  |  110 lines

  1. /*
  2.  *    tardir.c - handle tar directory
  3.  */
  4.  
  5. static char rcsid[] = "$Header: RCS/tardir.c 2.5 91/02/17 18:03:49 kmori Exp $";
  6.  
  7. #include <stdio.h>
  8. #include <stdlib.h>
  9. #include <string.h>
  10. #include <ctype.h>
  11. #include <sys/types.h>
  12. #include <sys/stat.h>
  13.  
  14. #include "defs.h"
  15.  
  16. #include "tar.h"
  17. #include "tardir.h"
  18. #include "main.h"
  19. #include "misc.h"
  20.  
  21.  
  22.  
  23. unsigned compsum(HEADER *block)
  24. {
  25.     int    i;
  26.     unsigned sum;
  27.  
  28.     sum = 0;
  29.     for (i = 0; i < NAMSIZ + 8 + 8 + 8 + 12 + 12; i++)
  30.         sum += block->dummy[i];
  31.     sum += ' ' * 8;
  32.     for (i += 8; i < TBLOCK; i++)
  33.         sum += block->dummy[i];
  34.     return (sum);
  35. }
  36.  
  37.  
  38.  
  39. global char decode_dir_e(char *name, struct stat *p, HEADER *block)
  40. {
  41.     unsigned sum;
  42.  
  43.     p->st_mode = strtol(block->dbuf.mode, NULL, 8);
  44.     p->st_size = strtol(block->dbuf.size, NULL, 8);
  45.     p->st_mtime = strtol(block->dbuf.mtime, NULL, 8);
  46.     p->st_uid = strtol(block->dbuf.uid, NULL, 8);
  47.     p->st_gid = strtol(block->dbuf.gid, NULL, 8);
  48.     sum = strtol(block->dbuf.chksum, NULL, 8);
  49.     strncpy(name, block->dbuf.name, 100);
  50.     name[99] = '\0';
  51.     if (sum != compsum(block))
  52.         return ('e');
  53.     return (block->dbuf.typeflag);
  54. }
  55.  
  56.  
  57.  
  58. global char decode_dir(char *name, struct stat *p, HEADER *block)
  59. {
  60.     char type;
  61.  
  62.     type = decode_dir_e(name, p, block);
  63.     if (type == 'e')
  64.         fatal(name, "Check sum error\n");
  65.     return (type);
  66. }
  67.  
  68.  
  69.  
  70.  
  71. global void encode_dir(HEADER *block, char *name, struct stat *p, char flag)
  72. {
  73.     char *user;
  74.  
  75.     strcpy(block->dbuf.name, name);
  76.     if ((p->st_mode & S_IFMT) == S_IFDIR)
  77.         addsl(block->dbuf.name);
  78.     sprintf(block->dbuf.mode, "%6o ", p->st_mode);
  79.     strcpy(block->dbuf.uid, "000000 ");
  80.     strcpy(block->dbuf.gid, "000000 ");
  81.     sprintf(block->dbuf.size, "%11lo ", p->st_size);
  82.     sprintf(block->dbuf.mtime, "%11lo ", p->st_mtime);
  83.     block->dbuf.typeflag = flag;
  84.     memset(block->dbuf.linkname, 0, NAMSIZ);
  85.     if (Gflag) {
  86.         memcpy(block->dbuf.magic, TOMAGIC, TOMAGLEN);
  87.     } else {
  88.         memcpy(block->dbuf.magic, TMAGIC, TMAGLEN);
  89.         memcpy(block->dbuf.version, TVERSION, TVERSLEN);
  90.     }
  91.     if ((user = getenv("USER")) != NULL)
  92.         strncpy(block->dbuf.uname, user, sizeof block->dbuf.uname);
  93.     else
  94.         strcpy(block->dbuf.uname, "root");
  95.     sprintf(block->dbuf.chksum, "%6o ", compsum(block));
  96. }
  97.  
  98.  
  99.  
  100. global int eofblock(char *block)
  101. {
  102.     int n;
  103.  
  104.     for (n = TBLOCK; n; n--) {
  105.         if (*block++)
  106.             return (0);
  107.     }
  108.     return (1);
  109. }
  110.