home *** CD-ROM | disk | FTP | other *** search
/ The UNIX CD Bookshelf / OREILLY_TUCB_UNIX_CD.iso / upt / examples / SOURCES / TAR / SPARSE. < prev    next >
Text File  |  1998-07-24  |  6KB  |  219 lines

  1. --- create.c.orig    Thu Mar 25 13:32:31 1993
  2. +++ create.c    Sat Apr 10 07:32:15 1993
  3. @@ -380,7 +380,6 @@
  4.  
  5.        header_moved = 0;
  6.  
  7. -#ifdef BSD42
  8.        if (f_sparse_files)
  9.      {
  10.        /*
  11. @@ -392,10 +391,15 @@
  12.           * at least one of those records in the file is just
  13.           * a useless hole.
  14.           */
  15. +#ifdef BSD42
  16.  #ifdef hpux            /* Nice of HPUX to gratuitiously change it, huh?  - mib */
  17. -      if (hstat.st_size - (hstat.st_blocks * 1024) > 1024)
  18. +      if (hstat.st_size - (hstat.st_blocks * 1024) > 1024
  19. +#else
  20. +      if (hstat.st_size - (hstat.st_blocks * RECORDSIZE) > RECORDSIZE
  21. +#endif
  22. +             || check_sparse(p))
  23.  #else
  24. -      if (hstat.st_size - (hstat.st_blocks * RECORDSIZE) > RECORDSIZE)
  25. +          if (check_sparse(p))
  26.  #endif
  27.          {
  28.            int filesize = hstat.st_size;
  29. @@ -464,9 +468,11 @@
  30.  
  31.          }
  32.      }
  33. +/* 
  34.  #else
  35.        upperbound = SPARSE_IN_HDR - 1;
  36.  #endif
  37. +*/
  38.  
  39.        sizeleft = hstat.st_size;
  40.        /* Don't bother opening empty, world readable files. */
  41. --- tar.c.orig    Wed Mar 17 10:30:46 1993
  42. +++ tar.c    Sat Apr 10 07:30:59 1993
  43. @@ -72,6 +72,9 @@
  44.  
  45.  extern FILE *msg_file;
  46.  
  47. +int   check_sparse();
  48. +void  add_sparse();
  49. +void  add_sparse_file();
  50.  int check_exclude ();
  51.  void add_exclude ();
  52.  void add_exclude_file ();
  53. @@ -171,6 +174,9 @@
  54.      
  55.  
  56.    {"same-permissions", 0, &f_use_protection, 1},
  57. +  {"sparse-list", 1, 0, 19},
  58. +  {"sparse-file", 1, 0, 20},
  59. +
  60.    {"sparse", 0, &f_sparse_files, 1},
  61.    {"tape-length", 1, 0, 'L'},
  62.    {"remove-files", 0, &f_remove_files, 1},
  63. @@ -360,6 +366,15 @@
  64.          }
  65.        f_compressprog = optarg;
  66.        break;
  67. +        case 19:
  68. +          f_sparse_files++;
  69. +          add_sparse_file(optarg);
  70. +          break;
  71. +                
  72. +        case 20:
  73. +          f_sparse_files++;
  74. +          add_sparse(optarg);
  75. +          break;
  76.  
  77.      case 'g':        /* We are making a GNU dump; save
  78.                     directories at the beginning of
  79. @@ -736,6 +751,8 @@
  80.      --preserve-order    list of names to extract is sorted to match archive\n\
  81.  --same-owner        create extracted files with the same ownership \n\
  82.  -S, --sparse        handle sparse files efficiently\n\
  83. +--sparse-file FILE    treat FILE as sparse (implicit -S as well)\n\
  84. +--sparse-list FILE    treat files listed in FILE as sparse (implicit -S)\n\
  85.  -T, --files-from F    get names to extract or create from file F\n\
  86.  --null            -T reads null-terminated names, disable -C\n\
  87.  --totals        print total bytes written with --create\n\
  88. @@ -1502,3 +1519,125 @@
  89.      }
  90.    return 0;
  91.  }
  92. +
  93. +char *s_buffer = 0;
  94. +int size_s_buffer;
  95. +int free_s_buffer;
  96. +
  97. +char **sparse = 0;
  98. +int size_sparse = 0;
  99. +int free_sparse = 0;
  100. +
  101. +char **re_sparse = 0;
  102. +int size_re_sparse = 0;
  103. +int free_re_sparse = 0;
  104. +
  105. +void
  106. +add_sparse(name)
  107. +char *name;
  108. +{
  109. +/*    char *rname;*/
  110. +/*    char **tmp_ptr;*/
  111. +      int size_buf;
  112. +
  113. +      un_quote_string(name);
  114. +      size_buf = strlen(name);
  115. +
  116. +      if(s_buffer==0) {
  117. +              s_buffer = (char *)ck_malloc(size_buf+1024);
  118. +              free_s_buffer=1024;
  119. +      } else if(free_s_buffer<=size_buf) {
  120. +              char *old_s_buffer;
  121. +              char **tmp_ptr;
  122. +
  123. +              old_s_buffer = s_buffer;
  124. +              s_buffer = (char *)ck_realloc(s_buffer,size_s_buffer+1024);
  125. +              free_s_buffer = 1024;
  126. +              for(tmp_ptr=sparse;tmp_ptr<sparse+size_sparse;tmp_ptr++)
  127. +                      *tmp_ptr= s_buffer + ((*tmp_ptr) - old_s_buffer);
  128. +              for(tmp_ptr=re_sparse;tmp_ptr<re_sparse+size_re_sparse;tmp_ptr++)
  129. +                      *tmp_ptr= s_buffer + ((*tmp_ptr) - old_s_buffer);
  130. +      }
  131. +
  132. +      if(is_regex(name)) {
  133. +              if(free_re_sparse==0) {
  134. +                      re_sparse= (char **)(re_sparse ? 
  135. +                                 ck_realloc(re_sparse,(size_re_sparse+32)*sizeof(char *)) : 
  136. +                                 ck_malloc(sizeof(char *)*32));
  137. +                      free_re_sparse+=32;
  138. +              }
  139. +              re_sparse[size_re_sparse]=s_buffer+size_s_buffer;
  140. +              size_re_sparse++;
  141. +              free_re_sparse--;
  142. +      } else {
  143. +              if(free_sparse==0) {
  144. +                      sparse=(char **)(sparse ? 
  145. +                        ck_realloc(sparse,(size_sparse+32)*sizeof(char *)) : 
  146. +                                    ck_malloc(sizeof(char *)*32));
  147. +                      free_sparse+=32;
  148. +              }
  149. +              sparse[size_sparse]=s_buffer+size_s_buffer;
  150. +              size_sparse++;
  151. +              free_sparse--;
  152. +      }
  153. +      strcpy(s_buffer+size_s_buffer,name);
  154. +      size_s_buffer+=size_buf+1;
  155. +      free_s_buffer-=size_buf+1;
  156. +}
  157. +
  158. +void
  159. +add_sparse_file(file)
  160. +char *file;
  161. +{
  162. +      FILE *fp;
  163. +      char buf[1024];
  164. +
  165. +      if(strcmp(file, "-"))
  166. +              fp=fopen(file,"r");
  167. +      else
  168. +              /* Let's hope the person knows what they're doing. */
  169. +              /* Using -X - -T - -f - will get you *REALLY* strange
  170. +                 results. . . */
  171. +              fp=stdin;
  172. +
  173. +      if(!fp) {
  174. +              msg_perror("can't open %s",file);
  175. +              exit(2);
  176. +      }
  177. +      while(fgets(buf,1024,fp)) {
  178. +/*            int size_buf;*/
  179. +              char *end_str;
  180. +
  181. +              end_str=rindex(buf,'\n');
  182. +              if(end_str)
  183. +                      *end_str='\0';
  184. +              add_sparse(buf);
  185. +
  186. +      }
  187. +      fclose(fp);
  188. +}
  189. +
  190. +/* Returns non-zero if the file 'name' should be treated as sparse */
  191. +int
  192. +check_sparse(name)
  193. +char *name;
  194. +{
  195. +      int n;
  196. +      char *str;
  197. +      extern char *strstr();
  198. +
  199. +      for(n=0;n<size_re_sparse;n++) {
  200. +              if(fnmatch(re_sparse[n], name, FNM_LEADING_DIR) == 0)
  201. +                      return 1;
  202. +      }
  203. +      for(n=0;n<size_sparse;n++) {
  204. +              /* Accept the output from strstr only if it is the last
  205. +                 part of the string.  There is certainly a faster way to
  206. +                 do this. . . */
  207. +              if(   (str=strstr(name,sparse[n]))
  208. +                 && (str==name || str[-1]=='/')
  209. +                 && str[strlen(sparse[n])]=='\0')
  210. +                      return 1;
  211. +      }
  212. +      return 0;
  213. +}
  214. --- version.c.orig    Thu Mar 25 13:35:25 1993
  215. +++ version.c    Sat Apr 10 16:07:54 1993
  216. @@ -1 +1 @@
  217. -char version_string[] = "GNU tar version 1.11.2";
  218. +char version_string[] = "GNU tar version 1.11.2RTR";
  219.