*/
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 ;
#endif
}
}
+
/*
* Now we are fixing a bug of gnu tar ...
* The first number should be zero, othewise we
#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__);