Archive-Unzip-Burst
view release on metacpan or search on metacpan
unzip-6.0/extract.c view on Meta::CPAN
if (fn_matched)
fn_matched[i] = TRUE;
break; /* found match, so stop looping */
}
}
if (do_this_file) { /* check if this is an excluded file */
for (i = 0; i < G.xfilespecs; i++)
if (match(G.filename, G.pxnames[i], uO.C_flag WISEP)) {
do_this_file = FALSE; /* ^-- ignore case or not? */
if (xn_matched)
xn_matched[i] = TRUE;
break;
}
}
if (do_this_file) {
if (store_info(__G))
++j; /* file is OK */
else
++num_skipped; /* unsupp. compression or encryption */
}
} /* end if (process_all_files) */
members_processed++;
} /* end while-loop (adding files to current block) */
/* save position in central directory so can come back later */
cd_bufstart = G.cur_zipfile_bufstart;
cd_inptr = G.inptr;
cd_incnt = G.incnt;
/*-----------------------------------------------------------------------
Second loop: process files in current block, extracting or testing
each one.
-----------------------------------------------------------------------*/
error = extract_or_test_entrylist(__G__ j,
&filnum, &num_bad_pwd, &old_extra_bytes,
#ifdef SET_DIR_ATTRIB
&num_dirs, &dirlist,
#endif
error_in_archive);
if (error != PK_COOL) {
if (error > error_in_archive)
error_in_archive = error;
/* ...and keep going (unless disk full or user break) */
if (G.disk_full > 1 || error_in_archive == IZ_CTRLC) {
/* clear reached_end to signal premature stop ... */
reached_end = FALSE;
/* ... and cancel scanning the central directory */
break;
}
}
/*
* Jump back to where we were in the central directory, then go and do
* the next batch of files.
*/
#ifdef USE_STRM_INPUT
zfseeko(G.zipfd, cd_bufstart, SEEK_SET);
G.cur_zipfile_bufstart = zftello(G.zipfd);
#else /* !USE_STRM_INPUT */
G.cur_zipfile_bufstart =
zlseek(G.zipfd, cd_bufstart, SEEK_SET);
#endif /* ?USE_STRM_INPUT */
read(G.zipfd, (char *)G.inbuf, INBUFSIZ); /* been here before... */
G.inptr = cd_inptr;
G.incnt = cd_incnt;
++blknum;
#ifdef TEST
printf("\ncd_bufstart = %ld (%.8lXh)\n", cd_bufstart, cd_bufstart);
printf("cur_zipfile_bufstart = %ld (%.8lXh)\n", cur_zipfile_bufstart,
cur_zipfile_bufstart);
printf("inptr-inbuf = %d\n", G.inptr-G.inbuf);
printf("incnt = %d\n\n", G.incnt);
#endif
} /* end while-loop (blocks of files in central directory) */
/*---------------------------------------------------------------------------
Process the list of deferred symlink extractions and finish up
the symbolic links.
---------------------------------------------------------------------------*/
#ifdef SYMLINKS
if (G.slink_last != NULL) {
if (QCOND2)
Info(slide, 0, ((char *)slide, LoadFarString(SymLnkDeferred)));
while (G.slink_head != NULL) {
set_deferred_symlink(__G__ G.slink_head);
/* remove the processed entry from the chain and free its memory */
G.slink_last = G.slink_head;
G.slink_head = G.slink_last->next;
free(G.slink_last);
}
G.slink_last = NULL;
}
#endif /* SYMLINKS */
/*---------------------------------------------------------------------------
Go back through saved list of directories, sort and set times/perms/UIDs
and GIDs from the deepest level on up.
---------------------------------------------------------------------------*/
#ifdef SET_DIR_ATTRIB
if (num_dirs > 0) {
sorted_dirlist = (direntry **)malloc(num_dirs*sizeof(direntry *));
if (sorted_dirlist == (direntry **)NULL) {
Info(slide, 0x401, ((char *)slide,
LoadFarString(DirlistSortNoMem)));
while (dirlist != (direntry *)NULL) {
direntry *d = dirlist;
dirlist = dirlist->next;
free(d);
}
} else {
ulg ndirs_fail = 0;
if (num_dirs == 1)
sorted_dirlist[0] = dirlist;
else {
for (i = 0; i < num_dirs; ++i) {
sorted_dirlist[i] = dirlist;
unzip-6.0/extract.c view on Meta::CPAN
Second loop: process files in current block, extracting or testing
each one.
-----------------------------------------------------------------------*/
for (i = 0; i < numchunk; ++i) {
(*pfilnum)++; /* *pfilnum = i + blknum*DIR_BLKSIZ + 1; */
G.pInfo = &G.info[i];
#ifdef NOVELL_BUG_FAILSAFE
G.dne = FALSE; /* assume file exists until stat() says otherwise */
#endif
/* if the target position is not within the current input buffer
* (either haven't yet read far enough, or (maybe) skipping back-
* ward), skip to the target position and reset readbuf(). */
/* seek_zipf(__G__ pInfo->offset); */
request = G.pInfo->offset + G.extra_bytes;
inbuf_offset = request % INBUFSIZ;
bufstart = request - inbuf_offset;
Trace((stderr, "\ndebug: request = %ld, inbuf_offset = %ld\n",
(long)request, (long)inbuf_offset));
Trace((stderr,
"debug: bufstart = %ld, cur_zipfile_bufstart = %ld\n",
(long)bufstart, (long)G.cur_zipfile_bufstart));
if (request < 0) {
Info(slide, 0x401, ((char *)slide, LoadFarStringSmall(SeekMsg),
G.zipfn, LoadFarString(ReportMsg)));
error_in_archive = PK_ERR;
if (*pfilnum == 1 && G.extra_bytes != 0L) {
Info(slide, 0x401, ((char *)slide,
LoadFarString(AttemptRecompensate)));
*pold_extra_bytes = G.extra_bytes;
G.extra_bytes = 0L;
request = G.pInfo->offset; /* could also check if != 0 */
inbuf_offset = request % INBUFSIZ;
bufstart = request - inbuf_offset;
Trace((stderr, "debug: request = %ld, inbuf_offset = %ld\n",
(long)request, (long)inbuf_offset));
Trace((stderr,
"debug: bufstart = %ld, cur_zipfile_bufstart = %ld\n",
(long)bufstart, (long)G.cur_zipfile_bufstart));
/* try again */
if (request < 0) {
Trace((stderr,
"debug: recompensated request still < 0\n"));
Info(slide, 0x401, ((char *)slide,
LoadFarStringSmall(SeekMsg),
G.zipfn, LoadFarString(ReportMsg)));
error_in_archive = PK_BADERR;
continue;
}
} else {
error_in_archive = PK_BADERR;
continue; /* this one hosed; try next */
}
}
if (bufstart != G.cur_zipfile_bufstart) {
Trace((stderr, "debug: bufstart != cur_zipfile_bufstart\n"));
#ifdef USE_STRM_INPUT
zfseeko(G.zipfd, bufstart, SEEK_SET);
G.cur_zipfile_bufstart = zftello(G.zipfd);
#else /* !USE_STRM_INPUT */
G.cur_zipfile_bufstart =
zlseek(G.zipfd, bufstart, SEEK_SET);
#endif /* ?USE_STRM_INPUT */
if ((G.incnt = read(G.zipfd, (char *)G.inbuf, INBUFSIZ)) <= 0)
{
Info(slide, 0x401, ((char *)slide, LoadFarString(OffsetMsg),
*pfilnum, "lseek", (long)bufstart));
error_in_archive = PK_BADERR;
continue; /* can still do next file */
}
G.inptr = G.inbuf + (int)inbuf_offset;
G.incnt -= (int)inbuf_offset;
} else {
G.incnt += (int)(G.inptr-G.inbuf) - (int)inbuf_offset;
G.inptr = G.inbuf + (int)inbuf_offset;
}
/* should be in proper position now, so check for sig */
if (readbuf(__G__ G.sig, 4) == 0) { /* bad offset */
Info(slide, 0x401, ((char *)slide, LoadFarString(OffsetMsg),
*pfilnum, "EOF", (long)request));
error_in_archive = PK_BADERR;
continue; /* but can still try next one */
}
if (memcmp(G.sig, local_hdr_sig, 4)) {
Info(slide, 0x401, ((char *)slide, LoadFarString(OffsetMsg),
*pfilnum, LoadFarStringSmall(LocalHdrSig), (long)request));
/*
GRRDUMP(G.sig, 4)
GRRDUMP(local_hdr_sig, 4)
*/
error_in_archive = PK_ERR;
if ((*pfilnum == 1 && G.extra_bytes != 0L) ||
(G.extra_bytes == 0L && *pold_extra_bytes != 0L)) {
Info(slide, 0x401, ((char *)slide,
LoadFarString(AttemptRecompensate)));
if (G.extra_bytes) {
*pold_extra_bytes = G.extra_bytes;
G.extra_bytes = 0L;
} else
G.extra_bytes = *pold_extra_bytes; /* third attempt */
if (((error = seek_zipf(__G__ G.pInfo->offset)) != PK_OK) ||
(readbuf(__G__ G.sig, 4) == 0)) { /* bad offset */
if (error != PK_BADERR)
Info(slide, 0x401, ((char *)slide,
LoadFarString(OffsetMsg), *pfilnum, "EOF",
(long)request));
error_in_archive = PK_BADERR;
continue; /* but can still try next one */
}
if (memcmp(G.sig, local_hdr_sig, 4)) {
Info(slide, 0x401, ((char *)slide,
LoadFarString(OffsetMsg), *pfilnum,
LoadFarStringSmall(LocalHdrSig), (long)request));
error_in_archive = PK_BADERR;
continue;
}
} else
continue; /* this one hosed; try next */
}
if ((error = process_local_file_hdr(__G)) != PK_COOL) {
Info(slide, 0x421, ((char *)slide, LoadFarString(BadLocalHdr),
*pfilnum));
( run in 0.454 second using v1.01-cache-2.11-cpan-5735350b133 )