Mercurial > repos > dawe > srf2fastq
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 } |