Archive-Unzip-Burst
view release on metacpan or search on metacpan
unzip-6.0/fileio.c view on Meta::CPAN
below, together seem to solve the problem.
According to the C RTL manual, "The write and decc$record_write
functions always generate at least one record." Also, "[T]he fwrite
function always generates at least <number_items> records." So,
"fwrite(buf, len, 1, strm)" is much better ("1" record) than
"fwrite(buf, 1, len, strm)" ("len" (1-character) records, _really_
ugly), but neither is better than write(). Similarly, "The fflush
function always generates a record if there is unwritten data in the
buffer." Apparently fprintf() buffers the stuff somewhere, and puts
out a record (only) when it sees a newline.
*/
#ifdef VMS
# define WriteTxtErr(buf,len,strm) \
((extent)fprintf(strm, "%.*s", len, buf) != (extent)(len))
#else
# define WriteTxtErr(buf,len,strm) WriteError(buf,len,strm)
#endif
#if (defined(USE_DEFLATE64) && defined(__16BIT__))
static int partflush OF((__GPRO__ uch *rawbuf, ulg size, int unshrink));
#endif
#ifdef VMS_TEXT_CONV
static int is_vms_varlen_txt OF((__GPRO__ uch *ef_buf, unsigned ef_len));
#endif
static int disk_error OF((__GPRO));
/****************************/
/* Strings used in fileio.c */
/****************************/
static ZCONST char Far CannotOpenZipfile[] =
"error: cannot open zipfile [ %s ]\n %s\n";
#if (!defined(VMS) && !defined(AOS_VS) && !defined(CMS_MVS) && !defined(MACOS))
#if (!defined(TANDEM))
#if (defined(ATH_BEO_THS_UNX) || defined(DOS_FLX_NLM_OS2_W32))
static ZCONST char Far CannotDeleteOldFile[] =
"error: cannot delete old %s\n %s\n";
#ifdef UNIXBACKUP
static ZCONST char Far CannotRenameOldFile[] =
"error: cannot rename old %s\n %s\n";
static ZCONST char Far BackupSuffix[] = "~";
#endif
#endif /* ATH_BEO_THS_UNX || DOS_FLX_NLM_OS2_W32 */
#ifdef NOVELL_BUG_FAILSAFE
static ZCONST char Far NovellBug[] =
"error: %s: stat() says does not exist, but fopen() found anyway\n";
#endif
static ZCONST char Far CannotCreateFile[] =
"error: cannot create %s\n %s\n";
#endif /* !TANDEM */
#endif /* !VMS && !AOS_VS && !CMS_MVS && !MACOS */
static ZCONST char Far ReadError[] = "error: zipfile read error\n";
static ZCONST char Far FilenameTooLongTrunc[] =
"warning: filename too long--truncating.\n";
#ifdef UNICODE_SUPPORT
static ZCONST char Far UFilenameTooLongTrunc[] =
"warning: Converted unicode filename too long--truncating.\n";
#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 */
unzip-6.0/fileio.c view on Meta::CPAN
* through to the SKIP routine.
*/
Info(slide, 0x401, ((char *)slide, "[ %s ]\n", FnFilter1(G.filename)));
length = block_len; /* SKIP the excess bytes... */
/* FALL THROUGH... */
/*
* Third case: skip string, adjusting readbuf's internal variables
* as necessary (and possibly skipping to and reading a new block of
* data).
*/
case SKIP:
/* cur_zipfile_bufstart already takes account of extra_bytes, so don't
* correct for it twice: */
seek_zipf(__G__ G.cur_zipfile_bufstart - G.extra_bytes +
(G.inptr-G.inbuf) + length);
break;
/*
* Fourth case: assume we're at the start of an "extra field"; malloc
* storage for it and read data into the allocated space.
*/
case EXTRA_FIELD:
if (G.extra_field != (uch *)NULL)
free(G.extra_field);
if ((G.extra_field = (uch *)malloc(length)) == (uch *)NULL) {
Info(slide, 0x401, ((char *)slide, LoadFarString(ExtraFieldTooLong),
length));
/* cur_zipfile_bufstart already takes account of extra_bytes,
* so don't correct for it twice: */
seek_zipf(__G__ G.cur_zipfile_bufstart - G.extra_bytes +
(G.inptr-G.inbuf) + length);
} else {
if (readbuf(__G__ (char *)G.extra_field, length) == 0)
return PK_EOF;
/* Looks like here is where extra fields are read */
getZip64Data(__G__ G.extra_field, length);
#ifdef UNICODE_SUPPORT
G.unipath_filename = NULL;
if (G.UzO.U_flag < 2) {
/* check if GPB11 (General Purpuse Bit 11) is set indicating
the standard path and comment are UTF-8 */
if (G.pInfo->GPFIsUTF8) {
/* if GPB11 set then filename_full is untruncated UTF-8 */
G.unipath_filename = G.filename_full;
} else {
/* Get the Unicode fields if exist */
getUnicodeData(__G__ G.extra_field, length);
if (G.unipath_filename && strlen(G.unipath_filename) == 0) {
/* the standard filename field is UTF-8 */
free(G.unipath_filename);
G.unipath_filename = G.filename_full;
}
}
if (G.unipath_filename) {
# ifdef UTF8_MAYBE_NATIVE
if (G.native_is_utf8
# ifdef UNICODE_WCHAR
&& (!G.unicode_escape_all)
# endif
) {
strncpy(G.filename, G.unipath_filename, FILNAMSIZ - 1);
/* make sure filename is short enough */
if (strlen(G.unipath_filename) >= FILNAMSIZ) {
G.filename[FILNAMSIZ - 1] = '\0';
Info(slide, 0x401, ((char *)slide,
LoadFarString(UFilenameTooLongTrunc)));
error = PK_WARN;
}
}
# ifdef UNICODE_WCHAR
else
# endif
# endif /* UTF8_MAYBE_NATIVE */
# ifdef UNICODE_WCHAR
{
char *fn;
/* convert UTF-8 to local character set */
fn = utf8_to_local_string(G.unipath_filename,
G.unicode_escape_all);
/* make sure filename is short enough */
if (strlen(fn) >= FILNAMSIZ) {
fn[FILNAMSIZ - 1] = '\0';
Info(slide, 0x401, ((char *)slide,
LoadFarString(UFilenameTooLongTrunc)));
error = PK_WARN;
}
/* replace filename with converted UTF-8 */
strcpy(G.filename, fn);
free(fn);
}
# endif /* UNICODE_WCHAR */
if (G.unipath_filename != G.filename_full)
free(G.unipath_filename);
G.unipath_filename = NULL;
}
}
#endif /* UNICODE_SUPPORT */
}
break;
#ifdef AMIGA
/*
* Fifth case, for the Amiga only: take the comment that would ordinarily
* be skipped over, and turn it into a 79 character string that will be
* attached to the file as a "filenote" after it is extracted.
*/
case FILENOTE:
if ((block_len = readbuf(__G__ tmp_fnote, (unsigned)
MIN(length, 2 * AMIGA_FILENOTELEN - 1))) == 0)
return PK_EOF;
if ((length -= block_len) > 0) /* treat remainder as in case SKIP: */
seek_zipf(__G__ G.cur_zipfile_bufstart - G.extra_bytes
+ (G.inptr - G.inbuf) + length);
/* convert multi-line text into single line with no ctl-chars: */
tmp_fnote[block_len] = '\0';
while ((short int) --block_len >= 0)
if ((unsigned) tmp_fnote[block_len] < ' ')
if (tmp_fnote[block_len+1] == ' ') /* no excess */
strcpy(tmp_fnote+block_len, tmp_fnote+block_len+1);
else
tmp_fnote[block_len] = ' ';
tmp_fnote[AMIGA_FILENOTELEN - 1] = '\0';
if (G.filenotes[G.filenote_slot])
free(G.filenotes[G.filenote_slot]); /* should not happen */
G.filenotes[G.filenote_slot] = NULL;
if (tmp_fnote[0]) {
if (!(G.filenotes[G.filenote_slot] = malloc(strlen(tmp_fnote)+1)))
return PK_MEM;
strcpy(G.filenotes[G.filenote_slot], tmp_fnote);
}
break;
#endif /* AMIGA */
} /* end switch (option) */
return error;
} /* end function do_string() */
( run in 0.944 second using v1.01-cache-2.11-cpan-5a3173703d6 )