1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272
|
/*---------------------------------------------------------------------------
vms.h
Generic VMS header file for Info-ZIP's Zip and UnZip.
---------------------------------------------------------------------------*/
#ifndef __vms_h
#define __vms_h 1
#ifndef __DESCRIP_LOADED
#include <descrip.h>
#endif
#ifndef __STARLET_LOADED
#include <starlet.h>
#endif
#ifndef __SYIDEF_LOADED
#include <syidef.h>
#endif
#ifndef __ATRDEF_LOADED
#include <atrdef.h>
#endif
#ifndef __FIBDEF_LOADED
#include <fibdef.h>
#endif
#ifndef __IODEF_LOADED
#include <iodef.h>
#endif
#if !defined(_RMS_H) && !defined(__RMS_LOADED)
#include <rms.h>
#endif
#define ERR(s) !((s) & 1) /* VMS system error */
#ifndef SYI$_VERSION
#define SYI$_VERSION 4096 /* VMS 5.4 definition */
#endif
/*
* Under Alpha (DEC C in VAXC mode) and under `good old' VAXC, the FIB unions
* are declared as variant_unions. DEC C (Alpha) in ANSI modes and third
* party compilers which do not support `variant_union' define preprocessor
* symbols to `hide' the "intermediate union/struct" names from the
* programmer's API.
* We check the presence of these defines and for DEC's FIBDEF.H defining
* __union as variant_union to make sure we access the structure correctly.
*/
#define variant_union 1
#if defined(fib$w_did) || (defined(__union) && (__union == variant_union))
# define FIB$W_DID fib$w_did
# define FIB$W_FID fib$w_fid
# define FIB$L_ACCTL fib$l_acctl
# define FIB$W_EXCTL fib$w_exctl
#else
# define FIB$W_DID fib$r_did_overlay.fib$w_did
# define FIB$W_FID fib$r_fid_overlay.fib$w_fid
# define FIB$L_ACCTL fib$r_acctl_overlay.fib$l_acctl
# define FIB$W_EXCTL fib$r_exctl_overlay.fib$w_exctl
#endif
#undef variant_union
struct EB_header /* Common header of extra block */
{ ush tag;
ush size;
uch data[1];
};
#ifndef EB_HEADSIZE
# define EB_HEADSIZE 4
#endif
/*------ Old style Info-ZIP extra field definitions -----*/
#if (!defined(VAXC) && !defined(_RMS_H) && !defined(__RMS_LOADED))
struct XAB { /* This definition may be skipped */
unsigned char xab$b_cod;
unsigned char xab$b_bln;
short int xabdef$$_fill_1;
char *xab$l_nxt;
};
#endif /* !VAXC && !_RMS_H && !__RMS_LOADED */
#define BC_MASK 07 /* 3 bits for compression type */
#define BC_STORED 0 /* Stored */
#define BC_00 1 /* 0byte -> 0bit compression */
#define BC_DEFL 2 /* Deflated */
/*
* Extra record format
* ===================
* signature (2 bytes) = 'I','M'
* size (2 bytes)
* block signature (4 bytes)
* flags (2 bytes)
* uncomprssed size(2 bytes)
* reserved (4 bytes)
* data ((size-12) bytes)
* ....
*/
struct IZ_block /* Extra field block header structure */
{
ush sig;
ush size;
ulg bid;
ush flags;
ush length;
ulg reserved;
uch body[1]; /* The actual size is unknown */
};
/*
* Extra field signature and block signatures
*/
#define IZ_SIGNATURE "IM"
#define FABSIG "VFAB"
#define XALLSIG "VALL"
#define XFHCSIG "VFHC"
#define XDATSIG "VDAT"
#define XRDTSIG "VRDT"
#define XPROSIG "VPRO"
#define XKEYSIG "VKEY"
#define XNAMSIG "VNAM"
#define VERSIG "VMSV"
/*
* Block sizes
*/
#define FABL (cc$rms_fab.fab$b_bln)
#define RABL (cc$rms_rab.rab$b_bln)
#define XALLL (cc$rms_xaball.xab$b_bln)
#define XDATL (cc$rms_xabdat.xab$b_bln)
#define XFHCL (cc$rms_xabfhc.xab$b_bln)
#define XKEYL (cc$rms_xabkey.xab$b_bln)
#define XPROL (cc$rms_xabpro.xab$b_bln)
#define XRDTL (cc$rms_xabrdt.xab$b_bln)
#define XSUML (cc$rms_xabsum.xab$b_bln)
#define EXTBSL 4 /* Block signature length */
#define RESL 8 /* Reserved 8 bytes */
#define EXTHL (EB_HEADSIZE+EXTBSL+RESL)
typedef unsigned char byte;
struct iosb
{
ush status;
ush count;
ulg spec;
};
/*------------ PKWARE extra block definitions ----------*/
/* Structure of PKWARE extra header */
#ifdef VMS_ZIP
#if defined(__DECC) || defined(__DECCXX)
#pragma __nostandard
#endif /* __DECC || __DECCXX */
#if defined(__DECC) || defined(__DECCXX)
#pragma __member_alignment __save
#pragma __nomember_alignment
#endif /* __DECC || __DECCXX */
#ifdef VMS_ORIGINAL_PK_LAYOUT
/* The original order of ATR fields in the PKZIP VMS-extra field leads
* to unaligned fields in the PK_info structure representing the
* extra field layout. When compiled for Alpha AXP, this results in
* some performance (and code size) penalty. It is not allowed to
* apply structure padding, since this is explicitely forbidden in
* the specification (APPNOTE.TXT) for the PK VMS extra field.
*/
struct PK_info
{
ush tag_ra; ush len_ra; byte ra[ATR$S_RECATTR];
ush tag_uc; ush len_uc; byte uc[ATR$S_UCHAR];
ush tag_jr; ush len_jr; byte jr[ATR$S_JOURNAL];
ush tag_cd; ush len_cd; byte cd[ATR$S_CREDATE];
ush tag_rd; ush len_rd; byte rd[ATR$S_REVDATE];
ush tag_ed; ush len_ed; byte ed[ATR$S_EXPDATE];
ush tag_bd; ush len_bd; byte bd[ATR$S_BAKDATE];
ush tag_rn; ush len_rn; ush rn;
ush tag_ui; ush len_ui; byte ui[ATR$S_UIC];
ush tag_fp; ush len_fp; byte fp[ATR$S_FPRO];
ush tag_rp; ush len_rp; byte rp[ATR$S_RPRO];
};
#else /* !VMS_ORIGINAL_PK_LAYOUT */
/* The Info-ZIP support for the PK VMS extra field uses a reordered
* field layout to achieve ``natural alignment'' of the PK_info structure
* members whenever possible. This rearrangement does not violate the
* PK's VMS extra field specification and should not break any ``well
* behaving'' (PK)Unzip utility. (`Well behaving' means that (PK)Unzip
* should use the field tag to identify the ATR$ field rather than
* assuming a fixed order of ATR$ fields in the PK VMS extra field.)
*/
struct PK_info
{
ush tag_ra; ush len_ra; byte ra[ATR$S_RECATTR];
ush tag_uc; ush len_uc; byte uc[ATR$S_UCHAR];
ush tag_cd; ush len_cd; byte cd[ATR$S_CREDATE];
ush tag_rd; ush len_rd; byte rd[ATR$S_REVDATE];
ush tag_ed; ush len_ed; byte ed[ATR$S_EXPDATE];
ush tag_bd; ush len_bd; byte bd[ATR$S_BAKDATE];
ush tag_rn; ush len_rn; ush rn;
ush tag_ui; ush len_ui; byte ui[ATR$S_UIC];
ush tag_fp; ush len_fp; byte fp[ATR$S_FPRO];
ush tag_rp; ush len_rp; byte rp[ATR$S_RPRO];
ush tag_jr; ush len_jr; byte jr[ATR$S_JOURNAL];
};
#endif /* ?VMS_ORIGINAL_PK_LAYOUT */
#if defined(__DECC) || defined(__DECCXX)
#pragma __member_alignment __restore
#endif /* __DECC || __DECCXX */
#if defined(__DECC) || defined(__DECCXX)
#pragma __standard
#endif /* __DECC || __DECCXX */
#endif /* VMS_ZIP */
/* PKWARE "VMS" tag */
#define PK_SIGNATURE 0x000C
/* Total number of attributes to be saved */
#define VMS_ATTR_COUNT 11
#define VMS_MAX_ATRCNT 20
struct PK_field
{
ush tag;
ush size;
byte value[1];
};
#define PK_FLDHDR_SIZE 4
struct PK_header
{
ush tag;
ush size;
ulg crc32;
byte data[1];
};
#define PK_HEADER_SIZE 8
#ifdef VMS_ZIP
/* File description structure for Zip low level I/O */
struct ioctx
{
struct iosb iosb;
long vbn;
long size;
long rest;
int status;
ush chan;
ush chan_pad; /* alignment member */
long acllen;
uch aclbuf[ATR$S_READACL];
struct PK_info PKi;
};
#endif /* VMS_ZIP */
#endif /* !__vms_h */
|