comparison srf2fastq/io_lib-1.12.2/progs/index_tar.c @ 0:d901c9f41a6a default tip

Migrated tool version 1.0.1 from old tool shed archive to new tool shed repository
author dawe
date Tue, 07 Jun 2011 17:48:05 -0400
parents
children
comparison
equal deleted inserted replaced
-1:000000000000 0:d901c9f41a6a
1 #include <stdio.h>
2 #include <string.h>
3 #include <errno.h>
4 #include <stdlib.h>
5 #include <io_lib/tar_format.h>
6
7 int main(int argc, char **argv) {
8 int directories = 0;
9 FILE *fp;
10 tar_block blk;
11 char member[256];
12 size_t size, extra;
13 int LongLink = 0;
14 size_t offset = 0;
15
16 /* process command line arguments of the form -arg */
17 for (argc--, argv++; argc > 0; argc--, argv++) {
18 if (**argv != '-' || strcmp(*argv, "--") == 0)
19 break;
20
21 if (strcmp(*argv, "-d") == 0)
22 directories = 1;
23 }
24
25 if (argc != 1) {
26 fprintf(stderr, "Usage: index_tar [-d] tarfile > tarfile.index\n");
27 return 1;
28 }
29
30 /* open the tarfile */
31 if (NULL == (fp = fopen(argv[0], "rb"))) {
32 perror(argv[0]);
33 return 1;
34 }
35
36 while(fread(&blk, sizeof(blk), 1, fp) == 1) {
37 /*
38 * If a directory is too large to fit in the name (>100) but short
39 * enough to fit in the prefix the name field will be empty, this is
40 * not the case for ordinary files where the name field is always
41 * non-empty
42 */
43 if (!blk.header.name[0] && !blk.header.prefix[0])
44 break;
45
46 /* get size of member, rounded to a multiple of TBLOCK */
47 size = strtoul(blk.header.size, NULL, 8);
48 extra = TBLOCK*((size+TBLOCK-1)/TBLOCK) - size;
49
50 /* skip directories unless requested */
51 if (directories || blk.header.typeflag != DIRTYPE || LongLink) {
52
53 /*
54 * extract member name (prefix + name), unless last member
55 * was ././@LongLink
56 */
57 if (LongLink == 0) {
58 (void) strncpy(member, blk.header.prefix, 155);
59 if (strlen(blk.header.prefix) > 0 && blk.header.name[0])
60 (void) strcat(member, "/");
61 (void) strncat(member, blk.header.name, 100);
62 }
63
64 /* account for gtar ././@LongLink */
65 if (strcmp(member, "././@LongLink") == 0) {
66 /* still expect filenames to fit into 256 bytes */
67 if (size > 256) {
68 fread(member, 1, size > 256 ? 256 : size, fp);
69 fprintf(stderr,"././@LongLink too long size=%ld\n",
70 (long)size);
71 fprintf(stderr,"%s...\n", member);
72 exit(1);
73 }
74 /*
75 * extract full name of next member then rewind to start
76 * of header
77 */
78 fread(member, 1, size > 256 ? 256 : size, fp);
79 fseek(fp, -size, SEEK_CUR);
80 LongLink = 1;
81 } else {
82 /* output offset, member name */
83 printf("%lu %.256s\n", (long)offset, member);
84 LongLink = 0;
85 }
86 }
87
88 /* increment offset */
89 size += extra;
90 fseek(fp, size, SEEK_CUR);
91 offset += sizeof(blk) + size;
92 }
93
94 fclose(fp);
95 return 0;
96 }