Archive-Unzip-Burst
view release on metacpan or search on metacpan
unzip-6.0/fileio.c view on Meta::CPAN
#endif
static ZCONST char Far ExtraFieldTooLong[] =
"warning: extra field too long (%d). Ignoring...\n";
#ifdef WINDLL
static ZCONST char Far DiskFullQuery[] =
"%s: write error (disk full?).\n";
#else
static ZCONST char Far DiskFullQuery[] =
"%s: write error (disk full?). Continue? (y/n/^C) ";
static ZCONST char Far ZipfileCorrupt[] =
"error: zipfile probably corrupt (%s)\n";
# ifdef SYMLINKS
static ZCONST char Far FileIsSymLink[] =
"%s exists and is a symbolic link%s.\n";
# endif
# ifdef MORE
static ZCONST char Far MorePrompt[] = "--More--(%lu)";
# endif
static ZCONST char Far QuitPrompt[] =
"--- Press `Q' to quit, or any other key to continue ---";
static ZCONST char Far HidePrompt[] = /* "\r \r"; */
"\r \r";
# if CRYPT
# ifdef MACOS
/* SPC: are names on MacOS REALLY so much longer than elsewhere ??? */
static ZCONST char Far PasswPrompt[] = "[%s]\n %s password: ";
# else
static ZCONST char Far PasswPrompt[] = "[%s] %s password: ";
# endif
static ZCONST char Far PasswPrompt2[] = "Enter password: ";
static ZCONST char Far PasswRetry[] = "password incorrect--reenter: ";
# endif /* CRYPT */
#endif /* !WINDLL */
/******************************/
/* Function open_input_file() */
/******************************/
int open_input_file(__G) /* return 1 if open failed */
__GDEF
{
/*
* open the zipfile for reading and in BINARY mode to prevent cr/lf
* translation, which would corrupt the bitstreams
*/
#ifdef VMS
G.zipfd = open(G.zipfn, O_RDONLY, 0, OPNZIP_RMS_ARGS);
#else /* !VMS */
#ifdef MACOS
G.zipfd = open(G.zipfn, 0);
#else /* !MACOS */
#ifdef CMS_MVS
G.zipfd = vmmvs_open_infile(__G);
#else /* !CMS_MVS */
#ifdef USE_STRM_INPUT
G.zipfd = fopen(G.zipfn, FOPR);
#else /* !USE_STRM_INPUT */
G.zipfd = open(G.zipfn, O_RDONLY | O_BINARY);
#endif /* ?USE_STRM_INPUT */
#endif /* ?CMS_MVS */
#endif /* ?MACOS */
#endif /* ?VMS */
#ifdef USE_STRM_INPUT
if (G.zipfd == NULL)
#else
/* if (G.zipfd < 0) */ /* no good for Windows CE port */
if (G.zipfd == -1)
#endif
{
Info(slide, 0x401, ((char *)slide, LoadFarString(CannotOpenZipfile),
G.zipfn, strerror(errno)));
return 1;
}
return 0;
} /* end function open_input_file() */
#if (!defined(VMS) && !defined(AOS_VS) && !defined(CMS_MVS) && !defined(MACOS))
#if (!defined(TANDEM))
/***************************/
/* Function open_outfile() */
/***************************/
int open_outfile(__G) /* return 1 if fail */
__GDEF
{
#ifdef DLL
if (G.redirect_data)
return (redirect_outfile(__G) == FALSE);
#endif
#ifdef QDOS
QFilename(__G__ G.filename);
#endif
#if (defined(DOS_FLX_NLM_OS2_W32) || defined(ATH_BEO_THS_UNX))
#ifdef BORLAND_STAT_BUG
/* Borland 5.0's stat() barfs if the filename has no extension and the
* file doesn't exist. */
if (access(G.filename, 0) == -1) {
FILE *tmp = fopen(G.filename, "wb+");
/* file doesn't exist, so create a dummy file to keep stat() from
* failing (will be over-written anyway) */
fputc('0', tmp); /* just to have something in the file */
fclose(tmp);
}
#endif /* BORLAND_STAT_BUG */
#ifdef SYMLINKS
if (SSTAT(G.filename, &G.statbuf) == 0 ||
lstat(G.filename, &G.statbuf) == 0)
#else
if (SSTAT(G.filename, &G.statbuf) == 0)
#endif /* ?SYMLINKS */
{
Trace((stderr, "open_outfile: stat(%s) returns 0: file exists\n",
FnFilter1(G.filename)));
#ifdef UNIXBACKUP
if (uO.B_flag) { /* do backup */
char *tname;
z_stat tmpstat;
unzip-6.0/fileio.c view on Meta::CPAN
#if CRYPT
if (G.pInfo->encrypted) {
uch *p;
int n;
for (n = G.incnt, p = G.inptr; n--; p++)
zdecode(*p);
}
#endif /* CRYPT */
return G.incnt;
} /* end function fillinbuf() */
#endif /* USE_ZLIB || USE_BZIP2 */
/************************/
/* Function seek_zipf() */
/************************/
int seek_zipf(__G__ abs_offset)
__GDEF
zoff_t abs_offset;
{
/*
* Seek to the block boundary of the block which includes abs_offset,
* then read block into input buffer and set pointers appropriately.
* If block is already in the buffer, just set the pointers. This function
* is used by do_seekable (process.c), extract_or_test_entrylist (extract.c)
* and do_string (fileio.c). Also, a slightly modified version is embedded
* within extract_or_test_entrylist (extract.c). readbyte() and readbuf()
* (fileio.c) are compatible. NOTE THAT abs_offset is intended to be the
* "proper offset" (i.e., if there were no extra bytes prepended);
* cur_zipfile_bufstart contains the corrected offset.
*
* Since seek_zipf() is never used during decompression, it is safe to
* use the slide[] buffer for the error message.
*
* returns PK error codes:
* PK_BADERR if effective offset in zipfile is negative
* PK_EOF if seeking past end of zipfile
* PK_OK when seek was successful
*/
zoff_t request = abs_offset + G.extra_bytes;
zoff_t inbuf_offset = request % INBUFSIZ;
zoff_t bufstart = request - inbuf_offset;
if (request < 0) {
Info(slide, 1, ((char *)slide, LoadFarStringSmall(SeekMsg),
G.zipfn, LoadFarString(ReportMsg)));
return(PK_BADERR);
} else if (bufstart != G.cur_zipfile_bufstart) {
Trace((stderr,
"fpos_zip: abs_offset = %s, G.extra_bytes = %s\n",
FmZofft(abs_offset, NULL, NULL),
FmZofft(G.extra_bytes, NULL, NULL)));
#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 */
Trace((stderr,
" request = %s, (abs+extra) = %s, inbuf_offset = %s\n",
FmZofft(request, NULL, NULL),
FmZofft((abs_offset+G.extra_bytes), NULL, NULL),
FmZofft(inbuf_offset, NULL, NULL)));
Trace((stderr, " bufstart = %s, cur_zipfile_bufstart = %s\n",
FmZofft(bufstart, NULL, NULL),
FmZofft(G.cur_zipfile_bufstart, NULL, NULL)));
if ((G.incnt = read(G.zipfd, (char *)G.inbuf, INBUFSIZ)) <= 0)
return(PK_EOF);
G.incnt -= (int)inbuf_offset;
G.inptr = G.inbuf + (int)inbuf_offset;
} else {
G.incnt += (G.inptr-G.inbuf) - (int)inbuf_offset;
G.inptr = G.inbuf + (int)inbuf_offset;
}
return(PK_OK);
} /* end function seek_zipf() */
#ifndef VMS /* for VMS use code in vms.c */
/********************/
/* Function flush() */ /* returns PK error codes: */
/********************/ /* if tflag => always 0; PK_DISK if write error */
int flush(__G__ rawbuf, size, unshrink)
__GDEF
uch *rawbuf;
ulg size;
int unshrink;
#if (defined(USE_DEFLATE64) && defined(__16BIT__))
{
int ret;
/* On 16-bit systems (MSDOS, OS/2 1.x), the standard C library functions
* cannot handle writes of 64k blocks at once. For these systems, the
* blocks to flush are split into pieces of 32k or less.
*/
while (size > 0x8000L) {
ret = partflush(__G__ rawbuf, 0x8000L, unshrink);
if (ret != PK_OK)
return ret;
size -= 0x8000L;
rawbuf += (extent)0x8000;
}
return partflush(__G__ rawbuf, size, unshrink);
} /* end function flush() */
/************************/
/* Function partflush() */ /* returns PK error codes: */
/************************/ /* if tflag => always 0; PK_DISK if write error */
static int partflush(__G__ rawbuf, size, unshrink)
__GDEF
uch *rawbuf; /* cannot be ZCONST, gets passed to (*G.message)() */
( run in 0.574 second using v1.01-cache-2.11-cpan-5b529ec07f3 )