X-Git-Url: https://git.gag.com/?a=blobdiff_plain;f=dds_extract.c;h=1c1face7f8c8656ff5fc74c63b60930332c77a50;hb=HEAD;hp=45e7dafd12a57b784f3eacbac4aa4443fe990908;hpb=e4d5918466740011206c1e4dddc5da9ff69b1ebd;p=debian%2Fdds2tar diff --git a/dds_extract.c b/dds_extract.c index 45e7daf..1c1face 100644 --- a/dds_extract.c +++ b/dds_extract.c @@ -410,21 +410,37 @@ dds_cmp(char const *const *const pattern_list) */ dds_unquote(cur_line); - /* - * Set scanoffset - */ - so = (0 == strncmp(cur_line, "block", 5))? 2 : 0 ; - - recno = atoi(cur_line + 4 + so ); - /* - * tar-1.13 writes now the block number: - */ - if ( so == 0 ){ - int x ; - int n ; + if (0 == strncmp(cur_line, "block ", 6)) + { + int x; + int n; char c; + + so = 6; + if (2 == sscanf(cur_line + so, "%d%c%n", + &x, &c, &n)) { + so += n + 1; + recno = x; +#ifdef DDS_TRACE + fprintf(stderr,"Blocks found:%d\n",x); +#endif + } + else + { + recno = 0; + } + } + else + { + int x; + int n; + char c; + + recno = atoi(cur_line + 4); + + so = 16; if ( 2 == sscanf( - cur_line+16,"block %d%c%n",&x,&c,&n + cur_line+so,"block %d%c%n",&x,&c,&n ) && c == ':' ) { so += n + 1 ; recno = x ; @@ -433,6 +449,7 @@ dds_cmp(char const *const *const pattern_list) #endif } } + /* * Now we are fixing a bug of gnu tar ... * The first number should be zero, othewise we @@ -459,47 +476,40 @@ dds_cmp(char const *const *const pattern_list) #ifdef DDS_TRACE fprintf(stderr,"file-loc(%d:%d,%d)\n",tar_bs,blkno,recno); #endif - if (name == NULL) { /* calculate only once */ - if ( strlen(cur_line) >= (66) ) { - name = cur_line + (65); - while ( ( name[ 0] != '\0' ) - && (( ( name[-1] != ' ' ) - || ( name[-6] != ' ' ) - || ( name[-9] != ':' ) - )&&( ( name[-1] != ' ' ) - || ( name[-4] != ':' ) - || ( name[-7] != ' ' ) - || ( name[-10] != '-' ) - || ( name[-13] != '-' ) - )) - ) name++ ; - if ( name[0] == '\0' ) { - name = cur_line + (16+so); - } - } else { - if ( strlen(cur_line) <= (16+so) ) { - strcat(cur_line, - " "); - } - name = cur_line + (16+so); + + /* skip file permissions */ + name = strchr(cur_line + so, ' '); + if (name) { + /* skip owner/group */ + name = strchr(name + 1, ' '); + if (name) { + /* skip size */ + while (*++name == ' '); + name = strchr(name, ' '); + if (name) { + /* skip date */ + name = strchr(name + 1, ' '); + if (name) { + /* skip time */ + name = strchr(name + 1, ' '); + + if (name) { + ++name; } + } + } + } + } + + if (!name || (name[-4] != ':')) + { + name = cur_line + so; + } + #ifdef DDS_TRACE - fprintf(stderr,"%d\n",__LINE__); - fprintf(stderr,"filename=%s\n",name); + fprintf(stderr,"%d\n",__LINE__); + fprintf(stderr,"filename=%s\n",name); #endif - } - while ( ( name[ 0] != '\0' ) - && ( name != ( cur_line + (16+so) ) ) - && (( ( name[-1] != ' ' ) - || ( name[-6] != ' ' ) - || ( name[-9] != ':' ) - )&&( ( name[-1] != ' ' ) - || ( name[-4] != ':' ) - || ( name[-7] != ' ' ) - || ( name[-10] != '-' ) - || ( name[-13] != '-' ) - )) - ) name++ ; } #ifdef DDS_TRACE fprintf(stderr,"%d\n",__LINE__);