Archive-Unzip-Burst
view release on metacpan or search on metacpan
unzip-6.0/vms/vms.c view on Meta::CPAN
#endif
(ef_scan_for_izux(G.extra_field, G.lrec.extra_field_length, 0,
G.lrec.last_mod_dos_datetime, &z_utime, NULL)
& EB_UT_FL_MTIME))
t = localtime(&(z_utime.mtime));
else
t = (struct tm *)NULL;
if (t != (struct tm *)NULL)
{
yr = t->tm_year + 1900;
mo = t->tm_mon;
dy = t->tm_mday;
hh = t->tm_hour;
mm = t->tm_min;
ss = t->tm_sec;
}
else
{
yr = ((G.lrec.last_mod_dos_datetime >> 25) & 0x7f) + 1980;
mo = ((G.lrec.last_mod_dos_datetime >> 21) & 0x0f) - 1;
dy = (G.lrec.last_mod_dos_datetime >> 16) & 0x1f;
hh = (G.lrec.last_mod_dos_datetime >> 11) & 0x1f;
mm = (G.lrec.last_mod_dos_datetime >> 5) & 0x3f;
ss = (G.lrec.last_mod_dos_datetime << 1) & 0x3e;
}
#else /* !USE_EF_UT_TIME */
yr = ((G.lrec.last_mod_dos_datetime >> 25) & 0x7f) + 1980;
mo = ((G.lrec.last_mod_dos_datetime >> 21) & 0x0f) - 1;
dy = (G.lrec.last_mod_dos_datetime >> 16) & 0x1f;
hh = (G.lrec.last_mod_dos_datetime >> 11) & 0x1f;
mm = (G.lrec.last_mod_dos_datetime >> 5) & 0x3f;
ss = (G.lrec.last_mod_dos_datetime << 1) & 0x1f;
#endif /* ?USE_EF_UT_TIME */
dattim = cc$rms_xabdat; /* fill XABs with default values */
rdt = cc$rms_xabrdt;
sprintf(timbuf, "%02u-%3s-%04u %02u:%02u:%02u.00",
dy, month[mo], yr, hh, mm, ss);
sys$bintim(&date_str, &dattim.xab$q_cdt);
memcpy(&rdt.xab$q_rdt, &dattim.xab$q_cdt, sizeof(rdt.xab$q_rdt));
}
/* The following return codes are supported:
* OPENOUT_OK a file has been opened normally
* OPENOUT_FAILED the file open process failed
* OPENOUT_SKIPOK file open skipped at user request, err level OK
* OPENOUT_SKIPWARN file open skipped at user request, err level WARN
*/
static int create_default_output(__GPRO)
{
int ierr;
int text_output, bin_fixed;
/* Extract the file in text format (Variable_length by default,
* Stream_LF with "-S" (/TEXT = STMLF), when
* a) explicitly requested by the user (through the -a option),
* and it is not a symbolic link,
* or
* b) piping to SYS$OUTPUT, unless "binary" piping was requested
* by the user (through the -b option).
*/
text_output = (G.pInfo->textmode
#ifdef SYMLINKS
&& !G.symlnk
#endif
) ||
(uO.cflag &&
(!uO.bflag || (!(uO.bflag - 1) && G.pInfo->textfile)));
/* Use fixed length 512 byte record format for disk file when
* a) explicitly requested by the user (-b option),
* and
* b) it is not a symbolic link,
* and
* c) it is not extracted in text mode.
*/
bin_fixed = !text_output &&
#ifdef SYMLINKS
!G.symlnk &&
#endif
(uO.bflag != 0) && ((uO.bflag != 1) || !G.pInfo->textfile);
rfm = FAB$C_STMLF; /* Default, stream-LF format from VMS or UNIX */
if (!uO.cflag) /* Redirect output */
{
rab = cc$rms_rab; /* Initialize RAB. */
fileblk = cc$rms_fab; /* Initialize FAB. */
fileblk.fab$l_xab = NULL; /* No XABs. */
rab.rab$l_fab = &fileblk; /* Point RAB to FAB. */
outfab = &fileblk; /* Set pointers used elsewhere. */
outrab = &rab;
if (text_output && (!uO.S_flag))
{ /* Default format for output `real' text file */
fileblk.fab$b_rfm = FAB$C_VAR; /* variable length records */
fileblk.fab$b_rat = FAB$M_CR; /* implied (CR) carriage ctrl */
}
else if (bin_fixed)
{ /* Default format for output `real' binary file */
fileblk.fab$b_rfm = FAB$C_FIX; /* fixed length records */
fileblk.fab$w_mrs = 512; /* record size 512 bytes */
fileblk.fab$b_rat = 0; /* no carriage ctrl */
}
else
{ /* Default format for output misc (bin or text) file */
fileblk.fab$b_rfm = FAB$C_STMLF; /* stream-LF record format */
fileblk.fab$b_rat = FAB$M_CR; /* implied (CR) carriage ctrl */
}
#ifdef NAML$C_MAXRSS
nam = CC_RMS_NAM; /* Initialize NAML. */
fileblk.FAB_NAM = &nam; /* Point FAB to NAML. */
fileblk.fab$l_dna = (char *) -1; /* Using NAML for default name. */
fileblk.fab$l_fna = (char *) -1; /* Using NAML for file name. */
#endif /* NAML$C_MAXRSS */
FAB_OR_NAML(fileblk, nam).FAB_OR_NAML_FNA = G.filename;
FAB_OR_NAML(fileblk, nam).FAB_OR_NAML_FNS = strlen(G.filename);
/* Prepare date-time XABs, unless user requests not to. */
if (uO.D_flag <= 1) {
set_default_datetime_XABs(__G);
dattim.xab$l_nxt = fileblk.fab$l_xab;
fileblk.fab$l_xab = (void *) &dattim;
}
/* 2005-02-14 SMS. What does this mean? ----vvvvvvvvvvvvvvvvvvvvvvvvvvv */
fileblk.fab$w_ifi = 0; /* Clear IFI. It may be nonzero after ZIP */
fileblk.fab$b_fac = FAB$M_BRO | FAB$M_PUT; /* {block|record} output */
#ifdef SYMLINKS
if (G.symlnk)
/* Symlink file is read back to retrieve the link text. */
fileblk.fab$b_fac |= FAB$M_GET;
#endif
/* 2004-11-23 SMS.
* If RMS_DEFAULT values have been determined, and have not been
* set by the user, then set some FAB/RAB parameters for faster
* output. User-specified RMS_DEFAULT values override the
* built-in default values, so if the RMS_DEFAULT values could
* not be determined, then these (possibly unwise) values could
* not be overridden, and hence will not be set. Honestly,
* this seems to be excessively cautious, but only old VMS
* versions will be affected.
*/
/* If RMS_DEFAULT (and adjusted active) values are available,
* then set the FAB/RAB parameters. If RMS_DEFAULT values are
* not available, then suffer with the default behavior.
*/
if (rms_defaults_known > 0)
{
/* Set the FAB/RAB parameters accordingly. */
fileblk.fab$w_deq = rms_ext_active;
rab.rab$b_mbc = rms_mbc_active;
rab.rab$b_mbf = rms_mbf_active;
#ifdef OLD_FABDEF
/* Truncate at EOF on close, as we may over-extend. */
fileblk.fab$l_fop |= FAB$M_TEF ;
/* If using multiple buffers, enable write-behind. */
if (rms_mbf_active > 1)
{
rab.rab$l_rop |= RAB$M_WBH;
}
}
/* Set the initial file allocation according to the file
* size. Also set the "sequential access only" flag, as
* otherwise, on a file system with highwater marking
* enabled, allocating space for a large file may lock the
* disk for a long time (minutes).
*/
fileblk.fab$l_alq = (unsigned) (G.lrec.ucsize+ 511)/ 512;
fileblk.fab$l_fop |= FAB$M_SQO;
#else /* !OLD_FABDEF */
/* Truncate at EOF on close, as we may over-extend. */
fileblk.fab$v_tef = 1;
/* If using multiple buffers, enable write-behind. */
if (rms_mbf_active > 1)
{
rab.rab$v_wbh = 1;
}
}
unzip-6.0/vms/vms.c view on Meta::CPAN
if (ERR(ierr))
{
char buf[NAM_MAXRSS + 128]; /* Name length + message length. */
sprintf(buf, "[ Cannot create ($create) output file %s ]\n",
G.filename);
vms_msg(__G__ buf, ierr);
if (fileblk.fab$l_stv != 0)
{
vms_msg(__G__ "", fileblk.fab$l_stv);
}
free_up();
return OPENOUT_FAILED;
}
if (!text_output)
{
rab.rab$l_rop |= (RAB$M_BIO | RAB$M_ASY);
}
rab.rab$b_rac = RAB$C_SEQ;
if ((ierr = sys$connect(&rab)) != RMS$_NORMAL)
{
#ifdef DEBUG
vms_msg(__G__ "create_default_output: sys$connect failed.\n", ierr);
if (fileblk.fab$l_stv != 0)
{
vms_msg(__G__ "", fileblk.fab$l_stv);
}
#endif
Info(slide, 1, ((char *)slide,
"Cannot create ($connect) output file: %s\n",
FnFilter1(G.filename)));
free_up();
return OPENOUT_FAILED;
}
} /* end if (!uO.cflag) */
init_buf_ring();
_flush_routine = text_output ? got_eol=0,_flush_stream : _flush_blocks;
_close_routine = _close_rms;
return OPENOUT_OK;
}
/* The following return codes are supported:
* OPENOUT_OK a file has been opened normally
* OPENOUT_FAILED the file open process failed
* OPENOUT_SKIPOK file open skipped at user request, err level OK
* OPENOUT_SKIPWARN file open skipped at user request, err level WARN
*/
static int create_rms_output(__GPRO)
{
int ierr;
int text_output;
/* extract the file in text (variable-length) format, when
* piping to SYS$OUTPUT, unless "binary" piping was requested
* by the user (through the -b option); the "-a" option is
* ignored when extracting zip entries with VMS attributes saved
*/
text_output = uO.cflag &&
(!uO.bflag || (!(uO.bflag - 1) && G.pInfo->textfile));
rfm = outfab->fab$b_rfm; /* Use record format from VMS extra field */
if (uO.cflag) /* SYS$OUTPUT */
{
if (text_output && !PRINTABLE_FORMAT(rfm))
{
Info(slide, 1, ((char *)slide,
"[ File %s has illegal record format to put to screen ]\n",
FnFilter1(G.filename)));
free_up();
return OPENOUT_FAILED;
}
}
else /* File output */
{
rab = cc$rms_rab; /* Initialize RAB. */
/* The output FAB has already been initialized with the values
* found in the Zip file's "VMS attributes" extra field.
*/
#ifdef NAML$C_MAXRSS
nam = CC_RMS_NAM; /* Initialize NAML. */
outfab->FAB_NAM = &nam; /* Point FAB to NAML. */
outfab->fab$l_dna = (char *) -1; /* Using NAML for default name. */
outfab->fab$l_fna = (char *) -1; /* Using NAML for file name. */
#endif /* NAML$C_MAXRSS */
FAB_OR_NAML(*outfab, nam).FAB_OR_NAML_FNA = G.filename;
FAB_OR_NAML(*outfab, nam).FAB_OR_NAML_FNS = strlen(G.filename);
/* Prepare date-time XABs, unless user requests not to. */
if (uO.D_flag <= 1) {
/* If no XAB date/time, use attributes from non-VMS fields. */
if (!(xabdat && xabrdt))
{
set_default_datetime_XABs(__G);
if (xabdat == NULL)
{
dattim.xab$l_nxt = outfab->fab$l_xab;
outfab->fab$l_xab = (void *) &dattim;
}
}
}
/* 2005-02-14 SMS. What does this mean? ----vvvvvvvvvvvvvvvvvvvvvvvvvvv */
outfab->fab$w_ifi = 0; /* Clear IFI. It may be nonzero after ZIP */
outfab->fab$b_fac = FAB$M_BIO | FAB$M_PUT; /* block-mode output */
#ifdef SYMLINKS
/* 2007-02-28 SMS.
* VMS/RMS symlink properties will be restored naturally when
* the link file is recreated this way, so there's no need to do
* the deferred symlink post-processing step for this file.
* Therefore, clear the pInfo->symlink flag here, and the symlink
* "close file" processor will only display the link text.
*/
if (G.symlnk) {
G.pInfo->symlink = 0;
if (QCOND2) {
/* Symlink file is read back to display the link text. */
outfab->fab$b_fac |= FAB$M_GET;
}
}
#endif /* SYMLINKS */
/* 2004-11-23 SMS.
* Set the "sequential access only" flag, as otherwise, on a
* file system with highwater marking enabled, allocating space
* for a large file may lock the disk for a long time (minutes).
*/
#ifdef OLD_FABDEF
outfab-> fab$l_fop |= FAB$M_SQO;
#else /* !OLD_FABDEF */
outfab-> fab$v_sqo = 1;
#endif /* ?OLD_FABDEF */
ierr = sys$create(outfab);
if (ierr == RMS$_FEX)
{
/* File exists.
* Consider command-line options, or ask the user what to do.
*/
ierr = replace(__G);
switch (ierr & REPL_TASKMASK)
{
case REPL_NO_EXTRACT: /* No extract. */
free_up();
return ((ierr & REPL_ERRLV_WARN)
? OPENOUT_SKIPWARN : OPENOUT_SKIPOK);
case REPL_NEW_VERSION: /* Create a new version. */
ierr = replace_rms_newversion(__G);
break;
case REPL_OVERWRITE: /* Overwrite the existing file. */
ierr = replace_rms_overwrite(__G);
break;
}
}
if (ERR(ierr))
{
char buf[NAM_MAXRSS + 128]; /* Name length + message length. */
sprintf(buf, "[ Cannot create ($create) output file %s ]\n",
G.filename);
vms_msg(__G__ buf, ierr);
if (outfab->fab$l_stv != 0)
{
vms_msg(__G__ "", outfab->fab$l_stv);
unzip-6.0/vms/vms.c view on Meta::CPAN
#pragma __member_alignment __restore
#endif /* __DECC || __DECCXX */
/* IOSB for QIO[W] miscellaneous ACP operations. */
static struct
{
unsigned short status;
unsigned short dummy;
unsigned int count;
} pka_acp_iosb;
static struct fibdef pka_fib;
static struct atrdef pka_atr[VMS_MAX_ATRCNT];
static int pka_idx;
static ulg pka_uchar;
static struct fatdef pka_rattr;
/* Directory attribute storage, descriptor (list). */
static struct atrdef pka_recattr[2] =
{ { sizeof(pka_rattr), ATR$C_RECATTR, GVTC &pka_rattr}, /* RECATTR. */
{ 0, 0, 0 } /* List terminator. */
};
static struct dsc$descriptor pka_fibdsc =
{ sizeof(pka_fib), DSC$K_DTYPE_Z, DSC$K_CLASS_S, (void *) &pka_fib };
static struct dsc$descriptor_s pka_devdsc =
{ 0, DSC$K_DTYPE_T, DSC$K_CLASS_S, &nam.NAM_DVI[1] };
static struct dsc$descriptor_s pka_fnam =
{ 0, DSC$K_DTYPE_T, DSC$K_CLASS_S, NULL };
/* Expanded and resultant name storage. */
static char exp_nam[NAM_MAXRSS];
static char res_nam[NAM_MAXRSS];
/* Special ODS5-QIO-compatible name storage. */
#ifdef NAML$C_MAXRSS
static char sys_nam[NAML$C_MAXRSS]; /* Probably need less here. */
#endif /* NAML$C_MAXRSS */
#define PK_PRINTABLE_RECTYP(x) ( (x) == FAT$C_VARIABLE \
|| (x) == FAT$C_STREAMLF \
|| (x) == FAT$C_STREAMCR \
|| (x) == FAT$C_STREAM )
/* The following return codes are supported:
* OPENOUT_OK a file has been opened normally
* OPENOUT_FAILED the file open process failed
* OPENOUT_SKIPOK file open skipped at user request, err level OK
* OPENOUT_SKIPWARN file open skipped at user request, err level WARN
*/
static int create_qio_output(__GPRO)
{
int status;
int i;
int text_output;
/* extract the file in text (variable-length) format, when
* piping to SYS$OUTPUT, unless "binary" piping was requested
* by the user (through the -b option); the "-a" option is
* ignored when extracting zip entries with VMS attributes saved
*/
text_output = uO.cflag &&
(!uO.bflag || (!(uO.bflag - 1) && G.pInfo->textfile));
if ( uO.cflag )
{
int rtype;
if (text_output)
{
rtype = pka_rattr.fat$v_rtype;
if (!PK_PRINTABLE_RECTYP(rtype))
{
Info(slide, 1, ((char *)slide,
"[ File %s has illegal record format to put to screen ]\n",
FnFilter1(G.filename)));
return OPENOUT_FAILED;
}
}
else
/* force "block I/O" for binary piping mode */
rtype = FAT$C_UNDEFINED;
init_buf_ring();
switch (rtype)
{
case FAT$C_VARIABLE:
_flush_routine = _flush_varlen;
break;
case FAT$C_STREAM:
case FAT$C_STREAMCR:
case FAT$C_STREAMLF:
_flush_routine = _flush_stream;
got_eol = 0;
break;
default:
_flush_routine = _flush_blocks;
break;
}
_close_routine = _close_rms;
}
else /* !(uO.cflag) : redirect output */
{
fileblk = cc$rms_fab; /* Initialize FAB. */
nam = CC_RMS_NAM; /* Initialize NAM[L]. */
fileblk.FAB_NAM = &nam; /* Point FAB to NAM[L]. */
#ifdef NAML$C_MAXRSS
fileblk.fab$l_dna = (char *) -1; /* Using NAML for default name. */
fileblk.fab$l_fna = (char *) -1; /* Using NAML for file name. */
/* Special ODS5-QIO-compatible name storage. */
nam.naml$l_filesys_name = sys_nam;
nam.naml$l_filesys_name_alloc = sizeof(sys_nam);
#endif /* NAML$C_MAXRSS */
unzip-6.0/vms/vms.c view on Meta::CPAN
* Facility Name Facility Code
* IZ_UNZIP 1954 = 0x7A2
* IZ_ZIP 1955 = 0x7A3
*
* Now, unless the CTL_FAC_IZ_UZP macro is defined at build-time, we
* will use the official Facility code.
*
---------------------------------------------------------------------------*/
/* Official HP-assigned Info-ZIP UnZip Facility code. */
#define FAC_IZ_UZP 1954 /* 0x7A2 */
#ifndef CTL_FAC_IZ_UZP
/*
* Default is inhibit-printing with the official Facility code.
*/
# define CTL_FAC_IZ_UZP ((0x1 << 12) | FAC_IZ_UZP)
# define MSG_FAC_SPEC 0x8000 /* Facility-specific code. */
#else /* CTL_FAC_IZ_UZP */
/* Use the user-supplied Control+Facility code for err or warn. */
# ifndef MSG_FAC_SPEC /* Old default is not Facility-specific. */
# define MSG_FAC_SPEC 0x0 /* Facility-specific code. Or 0x8000. */
# endif /* !MSG_FAC_SPEC */
#endif /* ?CTL_FAC_IZ_ZIP */
#define VMS_UZ_FAC_BITS ((CTL_FAC_IZ_UZP << 16) | MSG_FAC_SPEC)
severity = (err == PK_WARN) ? 0 : /* warn */
(err == PK_ERR || /* error */
(err >= PK_NOZIP && err <= PK_FIND) || /* ... */
(err >= IZ_CTRLC && err <= IZ_BADPWD)) ? 2 : /* ... */
4; /* fatal */
exit( /* $SEVERITY: */
(err == PK_COOL) ? SS$_NORMAL : /* success */
(VMS_UZ_FAC_BITS | (err << 4) | severity) /* warning, error, fatal */
);
} /* end function return_VMS() */
#ifdef MORE
static int scrnlines = -1;
static int scrncolumns = -1;
static int scrnwrap = -1;
static int getscreeninfo(int *tt_rows, int *tt_cols, int *tt_wrap)
{
/*
* For VMS v5.x:
* IO$_SENSEMODE/SETMODE info: Programming, Vol. 7A, System Programming,
* I/O User's: Part I, sec. 8.4.1.1, 8.4.3, 8.4.5, 8.6
* sys$assign(), sys$qio() info: Programming, Vol. 4B, System Services,
* System Services Reference Manual, pp. sys-23, sys-379
* fixed-length descriptor info: Programming, Vol. 3, System Services,
* Intro to System Routines, sec. 2.9.2
* GRR, 15 Aug 91 / SPC, 07 Aug 1995, 14 Nov 1999
*/
#ifndef OUTDEVICE_NAME
#define OUTDEVICE_NAME "SYS$OUTPUT"
#endif
static ZCONST struct dsc$descriptor_s OutDevDesc =
{(sizeof(OUTDEVICE_NAME) - 1), DSC$K_DTYPE_T, DSC$K_CLASS_S,
OUTDEVICE_NAME};
/* {dsc$w_length, dsc$b_dtype, dsc$b_class, dsc$a_pointer}; */
short OutDevChan, iosb[4];
long status;
struct tt_characts
{
uch class, type;
ush pagewidth;
union {
struct {
uch ttcharsbits[3];
uch pagelength;
} ttdef_bits;
unsigned ttcharflags;
} ttdef_area;
} ttmode; /* total length = 8 bytes */
/* assign a channel to standard output */
status = sys$assign(&OutDevDesc, &OutDevChan, 0, 0);
if (OK(status))
{
/* use sys$qiow and the IO$_SENSEMODE function to determine
* the current tty status.
*/
status = sys$qiow(0, OutDevChan, IO$_SENSEMODE, &iosb, 0, 0,
&ttmode, sizeof(ttmode), 0, 0, 0, 0);
/* deassign the output channel by way of clean-up */
(void) sys$dassgn(OutDevChan);
}
if ( OK(status) && OK(status = iosb[0]) ) {
if (tt_rows != NULL)
*tt_rows = ( (ttmode.ttdef_area.ttdef_bits.pagelength >= 5)
? (int) (ttmode.ttdef_area.ttdef_bits.pagelength)
/* TT device value */
: (24) ); /* VT 100 default */
if (tt_cols != NULL)
*tt_cols = ( (ttmode.pagewidth >= 10)
? (int) (ttmode.pagewidth) /* TT device value */
: (80) ); /* VT 100 default */
if (tt_wrap != NULL)
*tt_wrap = ((ttmode.ttdef_area.ttcharflags & TT$M_WRAP) != 0);
} else {
/* VT 100 defaults */
if (tt_rows != NULL)
*tt_rows = 24;
if (tt_cols != NULL)
*tt_cols = 80;
if (tt_wrap != NULL)
*tt_wrap = FALSE;
}
return (OK(status));
}
( run in 0.850 second using v1.01-cache-2.11-cpan-97f6503c9c8 )