diff options
Diffstat (limited to 'cmsmvs')
-rw-r--r-- | cmsmvs/README.CMS | 434 | ||||
-rw-r--r-- | cmsmvs/README.MVS | 92 | ||||
-rw-r--r-- | cmsmvs/README.MVS.LE | 286 | ||||
-rw-r--r-- | cmsmvs/cczip.exec | 124 | ||||
-rw-r--r-- | cmsmvs/cms.c | 34 | ||||
-rw-r--r-- | cmsmvs/cmsmvs.c | 442 | ||||
-rw-r--r-- | cmsmvs/cmsmvs.h | 134 | ||||
-rw-r--r-- | cmsmvs/cstat.h | 53 | ||||
-rw-r--r-- | cmsmvs/mc.exec | 95 | ||||
-rw-r--r-- | cmsmvs/mvs.c | 221 | ||||
-rw-r--r-- | cmsmvs/mvs.h | 40 | ||||
-rw-r--r-- | cmsmvs/mvs.mki | 128 | ||||
-rw-r--r-- | cmsmvs/pipzip.rexx | 27 | ||||
-rw-r--r-- | cmsmvs/zip.exec | 66 | ||||
-rw-r--r-- | cmsmvs/zip.makefile | 22 | ||||
-rw-r--r-- | cmsmvs/zipcloak.exec | 66 | ||||
-rw-r--r-- | cmsmvs/zipmvsc.job | 95 | ||||
-rw-r--r-- | cmsmvs/zipname.conven | 200 | ||||
-rw-r--r-- | cmsmvs/zipnote.exec | 66 | ||||
-rw-r--r-- | cmsmvs/zipsplit.exec | 66 | ||||
-rw-r--r-- | cmsmvs/zipup.h | 18 | ||||
-rw-r--r-- | cmsmvs/zipvmc.exec | 50 |
22 files changed, 2759 insertions, 0 deletions
diff --git a/cmsmvs/README.CMS b/cmsmvs/README.CMS new file mode 100644 index 0000000..a4425da --- /dev/null +++ b/cmsmvs/README.CMS @@ -0,0 +1,434 @@ +Using ZIP and UNZIP on VM/CMS +============================= + + +Installing executables +---------------------- + +The following CMS MODULEs are available: + ZIP + ZIPNOTE + ZIPCLOAK + ZIPSPLIT + UNZIP + +In addition to these, each MODULE file also has an EXEC with the same +name. These EXECs are front-ends to the MODULES that will attempt to +set up the required runtime libraries before running the MODULE. +All the EXECs are identical. Only their names are different. +They are stored as plain text files. + +The CMS MODULE files have been packed using the COPYFILE command to +allow their file format to be properly restored, since variable length +binary files will not currently unzip properly (see below for details). +The MODULEs are shipped with a filetype or extension of CMO (for CMS +MODULE). Their names may vary on the distribution disk to indicate +their level, etc. + +To restore them to executable MODULEs on CMS, do the following: + 1. Upload them to CMS with a Fixed record length with LRECL 1024. + Example, from a DOS or OS/2 window, type this: + SEND unzip.cmo A:unzip module a (RECFM F LRECL 1024 + + Example, using FTP from CMS, type this: + BINARY FIXED 1024 + GET unzip.cmo unzip.module.a + + Note: Replace "unzip.cmo" with the actual name. + + 2. Use COPYFILE to unpack the file. + Example, in CMS type this: + COPYFILE UNZIP MODULE A (UNPACK REPLACE OLDDATE + + 3. Repeat steps 1-2 for each of the programs. + + 4. Build the ZIPINFO module by typing this: + COPYFILE UNZIP MODULE A ZIPINFO MODULE A (OLDDATE + + 5. Upload the EXECs to CMS as text files (with ASCII-to-EBCDIC + translation). + Example, from a DOS or OS/2 window, type this: + SEND unzip.exc A:unzip exec a (CRLF + + Example, using FTP from CMS, type this: + GET unzip.exc unzip.exec.a + + 6. Repeat steps 4 for each of the EXECs. + + +Preparing the environment +------------------------- + +The executables provided were compiled with IBM C 3.1.0 and +require the the Language Environment (LE) runtime libraries. + +To provide access to the runtime libraries: + 1. Link to the disk containing the Language Environment files, + if necessary. + + 2. Use the command "GLOBAL LOADLIB SCEERUN" + + These commands can be placed in your PROFILE EXEC. + + Note: EXECs have been provided called ZIP, UNZIP, etc. that + issue the GLOBAL LOADLIB statement. This was done to alleviate + frustration of users that don't have the GLOBAL LOADLIB statement + in their PROFILE EXEC. These EXECs may require changing for + your system. + + Unfortunately, there is no way, using IBM C, to produce a MODULE + that doesn't require a runtime library. + + +Testing +------- + +To test the MODULEs, just type ZIP or UNZIP. They should +show help information on using the commands. + +If you see something like this: + DMSLIO201W The following names are undefined: + CEEEV003 + DMSABE155T User abend 4093 called from 00DCD298 reason code 000003EB + +Then you don't have access to the proper runtime libraries, as +described above. + +Here is additional information on the ZIP and UNZIP programs that +may assist support personnel: + - Compiled with IBM C V3R1M0 on VM/ESA 2.2.0 with + CMS level 13 Service Level 702. + + - Require the SCEERUN LOADLIB runtime library. This is + part of the Language Environment (LE). + + - Linked with options RMODE ANY AMODE ANY RLDSAVE. + +If you continue to have trouble, report the problem to Zip-Bugs +(see the bottom of this document). + + + +Compiling the source on VM/CMS +------------------------------ + +The source has been successfully compiled previously using +C/370 2.1 and 2.2. The source has been recently compiled using +IBM C 3.1.0 on VM/ESA 2.2.0 with CMS level 13. I don't have +access to an MVS system so the code hasn't been tested there +in a while. + + 1. Unzip the source files required for CMS. The root-level files + inside the ZIP file and the files in the CMSMVS subdirectory are + needed. Example (use both commands): + unzip -aj zip23.zip -x */* -dc + unzip -aj zip23.zip cmsmvs/* -dc + + This example unzips the files to the C-disk, while translating + character data and ignoring paths. + + If you don't already have a working UNZIP MODULE on CMS you will + have to unzip the files on another system and transport them + to CMS. All the required files are plain text so they can + be transferred with ASCII-to-EBCDIC translations. + + 2. Repeat step 1 with the zip file containing the UNZIP code. + Unzip the files to a different disk than the disk used for the ZIP + code. + + 3. To compile the ZIP code, run the supplied CCZIP EXEC. + To compile the UNZIP code, run the supplied CCUNZIP EXEC. + +NOTE: +Some of the ZIP and UNZIP source files have the same name. It is +recommended that you keep the source from each on separate disks and +move the disk you are building from ahead of the other in the search +order. + +For example, you may have a 192 disk with the ZIP source code and +a 193 disk with the UNZIP source code. To compile ZIP, access +the 192 disk as B, then run CCZIP. This will create the following +modules: ZIP, ZIPNOTE, ZIPSPLIT, ZIPCLOAK. + +To compile UNZIP, access 193 as B, then run CCUNZIP. This will create +the following modules: UNZIP, ZIPINFO (a copy of UNZIP). + + +========================================================================= + + +Using ZIP/UNZIP +--------------- + +Documentation for the commands is in MANUAL NONAME (for ZIP) and in +UNZIP DOC UNZIP. INFOZIP DOC describes the use of the -Z option of +UNZIP. + +The rest of this section explains special notes concerning the VM/CMS +version of ZIP and UNZIP. + + +Filenames and directories +------------------------- + + 1. Specifying filenames + + a. When specifying CMS files, use filename.filetype.filemode format + (separate the three parts of the name with a period and use no + spaces). Example: profile.exec.a + + Unfortunately, this prevents you from using ZIP from + FILELIST. To unzip a zip file, however, you can type something + like this next to it in FILELIST: + unzip /n -d c + + This will unzip the contents of the current file to a C-disk. + + b. It is possible to use DD names with ZIP and UNZIP on CMS, though + it can be cumbersome. Example: + filedef out disk myzip zip a + zip dd:out file1.txt file2.txt + + While you can also use a DD name for the input files, ZIP + currently does not correctly resolve the filename and will + store something like "dd:in" inside the ZIP file. A file stored + in this manor cannot easily be unzipped, as "dd:in" is an invalid + filename. + + c. In places where a directory name would be used on a PC, such as + for the ZIP -b (work path) option or the UNZIP -d (destination + path) options, use a filemode letter for CMS. For example, + to unzip files onto a C-disk, you might type something like this: + unzip myzip.zip -d c + + Currently, ZIP uses the A-disk for work files. When zipping + large files, you may want to specify a larger disk for work files. + This example will use a C-disk for work files. + zip -b C myzip.zip.c test.dat.a + + + 2. Filename conversions + + a. Filemode letters are never stored into the zip file or take from + a zip file. Only the filename and filetype are used. + ZIP removes the filemode when storing the filename into the + zip file. UNZIP assumes "A" for the filemode unless the -d + option is used. + + b. When unzipping, any path names are removed from the fileid + and the last two period-separated words are used as the + filename and filetype. These are truncated to a maximum of + eight characters, if necessary. If the filetype (extension) + is missing, then UNZIP uses "NONAME" for the filetype. + Any '(' or ')' characters are removed from the fileid. + + c. All files are created in upper-case. Files in mixed-case + cannot currently be stored into a ZIP file. + + d. Shared File System (SFS) directories are not supported. + Files are always accessed by fn.ft.fm. To use an SFS disk, + Assign it a filemode, then it can be used. + + + 3. Wildcards in file names + + a. Wildcards are not supported in the zip filename. The full + filename of the zip file must be given (but the .zip is not + necessary). So, you can't do this: + unzip -t *.zip + + b. Wildcards CAN be used with UNZIP to select (or exclude) files + inside a zip file. Examples: + unzip myzip *.c - Unzip all .c files. + unzip myzip *.c -x z*.c - Unzip all .c files but those + starting with Z. + + c. Wildcards cannot currently be used to select files with ZIP. + So, you can't do this: + zip -a myzip *.exec + + I expect to fix this for CMS in the future. + + + 4. File timestamps + + a. The dates and times of files being zipped or unzipped are not + currently read or set. When a file is zipped, the timestamp + inside the zip file will always be the current system date and + time. Likewise, when unzipping, the date and time of files + being unzipped will always be the current system date/time. + + b. Existing files are assumed to be newer than files inside a zip + file when using the -f freshen option of UNZIP. This will prevent + overwriting files that may be newer than the files inside the + zip file, but also effectively prevents the -f option from working. + + + 5. ASCII, EBCDIC, and binary data + + Background + ---------- + Most systems create data files as just a stream of bytes. Record + breaks happen when certain characters (new line and/or carriage + return characters) are encountered in the data. How to interpret + the data in a file is up to the user. The system must be told + to either notice new line characters in the data or to assume + that the data in the file is binary data and should be read or + written as-is. + + CMS and MVS are record-based systems. All files are composed + of data records. These can be stored in fixed-length files or + in variable length files. With fixed-length files, each record + is the same length. The record breaks are implied by the + LRECL (logical record length) attribute associated with the file. + With variable-length files, each record contains the length of + that record. The separation of records are not part of the + data, but part of the file structure. + + This means you can store any type of data in either type of file + structure without having to worry about the data being interpreted + as a record break. Fixed-length files may have padding at the + end of the file to make up a full record. Variable-length files + have no padding, but require extra record length data be stored + with the file data. + + Storing fixed-length files into a zip file is simple, because all + the data can just be dumped into the zip file and the record + format (RECFM) and logical record length (LRECL) can be stored + in the extra data area of the zip file so they can be restored + when UNZIP is used. + + Storing variable-length data is harder. There is no place to put + the record length data needed for each record of the file. This + data could be written to the zip file as the first two bytes of + each record and interpreted that way by UNZIP. That would make + the data unusable on systems other than CMS and MVS, though. + + Currently, there isn't a solution to this problem. Each record is + written to the zip file and the record length information is + discarded. Binary data stored in variable-length files can't be put + into a zip file then later unzipped back into the proper records. + This is fine for binary data that will be read as a stream of bytes + but not OK where the records matter, such as with CMS MODULEs. + + If the data is text (character data), there is a solution. + This data can be converted into ASCII when it's stored into + a zip file. The end of each record is now marked in the file + by new line characters. Another advantage of this method is + that the data is now accessible to non-EBCDIC systems. When + the data is unzipped on CMS or MVS, it is converted back into + EBCDIC and the records are recreated into a variable-length file. + + + So, here's what we have... + + a. To store readable text data into a zip file that can be used + on other platforms, use the -a option with ZIP to convert the + data to ASCII. These files will unzip into variable-length + files on CMS and should not contain binary data or corruption + may occur. + + b. Files that were zipped on an ASCII-based system will be + automatically translated to EBCDIC when unzipped. To prevent + this (to unzip binary data on CMS that was sent from an + ASCII-based system), use the -B option with UNZIP to force Binary + mode. To zip binary files on CMS, use the -B option with ZIP to + force Binary mode. This will prevent any data conversions from + taking place. + + c. When using the ZIP program without specifying the "-a" or "-B" + option, ZIP defaults to "native" (EBCDIC) mode and tries to + preserve the file information (RECFM, LRECL, and BLKSIZE). So + when you unzip a file zipped with ZIP under CMS or MVS, UNZIP + restores the file info. The output will be fixed-length if the + original was fixed and variable-length if the original was + variable. + + If UNZIP gives a "write error (disk full?)" message, you may be + trying to unzip a binary file that was zipped as a text file + (without using the -B option) + + + Summary + ------- + Here's how to ZIP the different types of files. + + RECFM F text + Use the -a option with ZIP to convert to ASCII for use with other + platforms or no options for use on EBCDIC systems only. + + RECFM V text + Use the -a option with ZIP to convert to ASCII for use with other + platforms or no options for use on EBCDIC systems only. + + + RECFM F binary + Use the -B option with ZIP (upper-case "B"). + + RECFM V binary + Use the -B option with ZIP. Can be zipped OK but the record + structure is destroyed when unzipped. This is OK for data files + read as binary streams but not OK for files such as CMS MODULEs. + + + 6. Character Sets + + If you are used to running UNZIP on systems like UNIX, DOS, OS/2 or + Windows, you will may have some problems with differences in the + character set. + + There are a number of different EBCDIC code pages, like there are a + number of different ASCII code pages. For example, there is a US + EBCDIC, a German EBCDIC, and a Swedish EBCDIC. As long as you are + working with other people who use the same EBCDIC code page, you + will have no trouble. If you work with people who use ASCII, or who + use a different EBCDIC code page, you may need to do some + translation. + + UNZIP translates ASCII text files to and from Open Systems EBCDIC + (IBM-1047), which may not be the EBCDIC that you are using. For + example, US EBCDIC (IBM-037) uses different character codes for + square brackets. In such cases, you can use the ICONV utility + (supplied with IBM C) to translate between your EBCDIC character set + and IBM-1047. + + If your installation does not use IBM-1047 EBCDIC, messages from + UNZIP may look a little odd. For example, in a US EBCDIC + installation, an opening square bracket will become an i-acute and a + closing square bracket will become a u-grave. + + The supplied ZIP and UNZIP EXECs attempt to correct this by setting + CMS INPUT and OUTPUT translations to adjust the display of left and + right brackets. You may need to change this if brackets don't + display correctly on your system. + + + 7. You can unzip using VM/CMS PIPELINES so unzip can be used as + a pipeline filter. Example: + 'PIPE COMMAND UNZIP -p test.zip george.test | Count Lines | Cons' + + + + +Please report all bugs and problems to: + Zip-Bugs@lists.wku.edu + + +----------------------------------------------------------------------- +Original CMS/MVS port by George Petrov. +e-mail: c888090@nlevdpsb.snads.philips.nl +tel: +31-40-781155 + +Philips C&P +Eindhoven +The Netherlands + +----------------------------------------------------------------------- +Additional fixes and README re-write (4/98) by Greg Hartwig. +e-mail: ghartwig@ix.netcom.com + ghartwig@vnet.ibm.com + +----------------------------------------------------------------------- +Additional notes from Ian E. Gorman. +e-mail: ian@iosphere.net + diff --git a/cmsmvs/README.MVS b/cmsmvs/README.MVS new file mode 100644 index 0000000..4d451db --- /dev/null +++ b/cmsmvs/README.MVS @@ -0,0 +1,92 @@ +Thank you for trying this first port of ZIP for VM/CMS and MVS! + + + Using under MVS: + --------------------------- + +1. To use the Info-ZIP's ZIP under MVS you need: + + - C/370 ver 2.1 compiler or another compatible compiler supporting + long names for function/variable names. + +2. To compile the program under MVS do : + + - unzip all the files from zip22.zip file. They are stored as + ASCII format so you have to unzip them first on PC or other + system that already have UNZIP, and then upload them to the + mainframe with ASCII to EBCDIC conversion. + + - Copy all the .C files in the PDS called youruserid.ZIP.C + + - Copy all the .H files in the PDS called youruserid.ZIP.H + + - adjust the job ZIPMVSC.JOB to work on your size. Change my + userid - C888090 to yours + + - execute the job ZIPMVSC to compile and link all the sources. + + - maybe you have to preallocate PDS datasets named: + youruserid.ZIP.OBJ and youruserid.ZIP.LOAD + + - execute ZIPVMC to compile and link all the sources. + + - if everything is ok you will get an ZIP MODULE + + - the warnings about the duplicated ASCII and EBCDIC symbols + are OK :-) + +3. Using ZIP + + - Just read MANUAL + + - A few exceptions concerning MVS + + 3.1. if you want to make a portable zip file that is to be unzipped + on ASCII based systems use the -a option + + 3.2. If you want to zip the input files as binary ebcdic files + use the -B (capital letter) option + + 3.3. The date/end the time of the input files is set in the zip's + dir to the current system date/time + + 3.4. Without specifying the "-a" or "-B" option, the ZIP program + defaults to "native" (EBCDIC) mode and tries to preserve the + file information (LRECL,BLKSIZE..) + So when you UNZIP a file zipped with ZIP under VM/MVS it + restores the file info. + + There currently some problems with file with RECFM=V* + I don't save the length of each record yet :-) + + 3.5. No wildcards are supported as input file names: + + So you CAN'T use things like: zip myzip *.c + + 3.6. You can use DD names for zipfilename for example: + + under tso/rexx: + + "alloc fi(input) da('myzip.zip')" + "zip dd:input file1.txt file2.txt ..." + + under Batch: + + //MYZIP JOB (account) + //STEP1 EXEC PGM=ZIP,PARM='dd:input file1.txt file2.txt' + //STEPLIB DD DSN=userid.UNZIP.LOAD,DISP=SHR + //INPUT DD DSN=userid.MYZIP.ZIP,DISP=NEW, + // SPACE=(15000,(15000,10000),RLSE), + // DCB=(LRECL=80,RECFM=F) + //SYSPRINT DD SYSOUT=* + + +Please report all bugs and problems to : + zip-bugs@lists.wku.edu + +That's all for now. + +Have fun! + + +George Petrov diff --git a/cmsmvs/README.MVS.LE b/cmsmvs/README.MVS.LE new file mode 100644 index 0000000..f7dcb8a --- /dev/null +++ b/cmsmvs/README.MVS.LE @@ -0,0 +1,286 @@ +Notes on Zip under MVS Language Environment (LE). + +First see README.MVS. This note describes just one beta test on OS/390 +V2R5 using IBM's C compiler (5647A01), V2R4. The major difference is +the use of LE on the beta site, together with some MVS native mode +fixes. Changes have not been tested on CMS. + +Some of the notes are to clarify things that were not clear from the +MANUAL or README.MVS. + +1. By default, IBM C generates the same csect name for each input + source. The prelink stage does not rename them and the linkage + editor throws away all but the first occurrence of each duplicate. + Oops, my code just disappeared :(. + + To get around this "feature", compile with the CSECT option to + force sensible names on the code and data sections of each csect. + The name of the static data csect defaults to the source name in + lower case, the code csect defaults to the source name in upper + case. These csect names still have to be unique, they cannot be + the same as function names. Of course, several csects have a + function which is the same name as the source in lower case, not + exactly an unusual occurrence. Therefore to make the csect name + unique, some of the sources have + + #ifdef MVS + # pragma csect(STATIC,xxxx_s) + #endif + + Where xxxx is an abbreviation of the source name. There has to be + a better way! + +2. The prelink step always gets cond code 4. It complains about + unresolved references, ignore it unless the linker also complains. + Prelink also complains about duplicate @@PPA2 sections and so does + the linker, but it seems to do no harm. Compile and link steps + should get 0, just prelink gets 4. See JCL at the bottom. + +3. Under MVS native mode (not Open Edition), tmpnam() returns a quoted + name of 5 qualifiers. The first is a HLQ chosen according to the + MVS LE algorithm (see below), the other qualifiers are time stamps. + If running on MVS and tmpnam() returns a quoted name with at leat + one '.', it is only safe to let the user change the high level + qualifier. Therefore -b insists on a single qualifier without '.' + in the MVS native environment. + +4. In Open Edition (OE) mode, the manual says that tmpnam() returns a + fully qualified name in directory TMPDIR or /tmp if TMPDIR is not + set. There is no point in zip trying to override that name so -b + is ignored in MVS OE mode (untested). The user should specify + environment variable TMPDIR instead. + +5. The MVS LE algorithm for choosing the high level qualifier for + native filenames is interesting, as in "May you live in interesting + times". The HLQ varies according to the environment the program is + running in, sometimes it is userid, sometimes it is TSO prefix. + See OS/390 C/C++ Programming Guide, Using a Data Set Name, + somewhere around section 2.9. + + If in doubt, use fully qualified and quoted names. Instead of + archive.zip, use 'prefix.archive.zip'. For input files, instead of + filename, use 'prefix.filename'. For PARM= in JCL, double up the + quotes. You even have to quote filenames in stdin. + +6. If your PARM includes any '/', make sure the PARM starts with '/'. + LE assumes anything before the first '/' is LE run time parameters. + It does no harm to always code a leading '/' for LE parms. + +7. JCL limits a PARM= to 100 characters total with approx. 65 on a + single line. Alas the syntax for continuing PARM= always embeds an + extra ',' somewhere in the parameters that the program finally + gets. No workaround, limit your PARM to a single line. With the + extra quotes around filenames, that does not leave much room. In + most cases, you will have to use '-@' to read the list of filenames + from SYSIN (stdin), it will not fit on a single PARM line. + +8. Filenames can be dataset names or you can refer to a ddname with + 'DD:name', case insensitive for external files, case sensitive for + OE files. You can even specify 'dd:name(mem)'. No wildcards, to + zip a complete pds you have to specify each member individually. + Directory recursion in OE does not appear to work at the moment. + +9. Zip attempts to map MVS filenames to Unix style names. It did not + work correctly for quoted names, fixed. Although you can pick up + an external (non-OE) file with a name using any case, be aware that + the mapping to a Unix style name faithfully follows the case you + supply. + +10. The archive file was being created with recfm=V and lrecl=32760. + 32760 is not valid for recfm=V under MVS, I originally changed it + to lrecl=32756. Then zip broke trying to fseek() over a record + boundary, I do not know whether this was a zip or LE bug. Trial + and error showed that recfm=U with byteseek seems to work on MVS. + No BDW or RDW, just a byte stream. The blocksize is always 6144. + + NOTE: This is an incompatible change from the previous beta, + archive files used to be recfm=V. That should not matter + because we just transfer the data, ignoring BDW and RDW + anyway. + +11. Zip used to complain about preallocated but empty archives, wrong + length records, no signature etc. The usual IBM/360 problem of no + end of file marker in a new, unopened dataset. Fixed, see routine + readzipfile in zipfile.c for the gory details. PARM= works fine. + +12. Several source files have records that are more than 80 bytes long. + It works if you transfer to mainframe datasets with a larger lrecl, + I used recfm=fb,lrecl=120 for the .C and .H files. To compile with + anything longer than 72 bytes, you need MVS C options NOMARGINS and + NOSEQUENCE (NOMAR,NOSEQ). + +13. cmsmvs was still using zname instead of name for open. Fixed. + +14. zip has to jump through a lot of hoops to see if an existing + zipfile actually contains data. A side effect of this is that + creating a zipfile with the RLSE parameter is a waste of time. + +Keith Owens <kaos@ocs.com.au>. Not a maintainer, just a beta tester. +Mon Sep 14 19:31:30 EST 1998 + + +Sample JCL to compile Zip under MVS LE. You might need a large region, +I used REGION=128M on the job card. Also watch the output lines, +75,000 with OPT(2), 100,000+ with OPT(2) replaced with DEF(DEBUG). You +need to allocate prefix.ZIP.C.OBJ (recfm=FB, lrecl=80) and +prefix.ZIP.LOAD (recfm=U, blksize is site defined). + +//CBC JCLLIB ORDER=CBC.SCBCPRC +//ZIP EXEC EDCC,COND=(0,NE),CREGSIZ='4M', +// INFILE='prefix.ZIP.C(ZIP)', +// OUTFILE='prefix.ZIP.C.OBJ(ZIP),DISP=SHR', +// CPARM='LONG,NOTERM,LIST,XREF,SOURCE', +// CPARM2='OPT(2),DEF(MVS),NOMAR,NOSEQ,CSECT' +//COMPILE.USERLIB DD DSN=prefix.ZIP.H,DISP=SHR +//CRYPT EXEC EDCC,COND=(0,NE),CREGSIZ='4M', +// INFILE='prefix.ZIP.C(CRYPT)', +// OUTFILE='prefix.ZIP.C.OBJ(CRYPT),DISP=SHR', +// CPARM='LONG,NOTERM,LIST,XREF,SOURCE', +// CPARM2='OPT(2),DEF(MVS),NOMAR,NOSEQ,CSECT' +//COMPILE.USERLIB DD DSN=prefix.ZIP.H,DISP=SHR +//TTYIO EXEC EDCC,COND=(0,NE),CREGSIZ='4M', +// INFILE='prefix.ZIP.C(TTYIO)', +// OUTFILE='prefix.ZIP.C.OBJ(TTYIO),DISP=SHR', +// CPARM='LONG,NOTERM,LIST,XREF,SOURCE', +// CPARM2='OPT(2),DEF(MVS),NOMAR,NOSEQ,CSECT' +//COMPILE.USERLIB DD DSN=prefix.ZIP.H,DISP=SHR +//TREES EXEC EDCC,COND=(0,NE),CREGSIZ='4M', +// INFILE='prefix.ZIP.C(TREES)', +// OUTFILE='prefix.ZIP.C.OBJ(TREES),DISP=SHR', +// CPARM='LONG,NOTERM,LIST,XREF,SOURCE', +// CPARM2='OPT(2),DEF(MVS),NOMAR,NOSEQ,CSECT' +//COMPILE.USERLIB DD DSN=prefix.ZIP.H,DISP=SHR +//DEFLATE EXEC EDCC,COND=(0,NE),CREGSIZ='4M', +// INFILE='prefix.ZIP.C(DEFLATE)', +// OUTFILE='prefix.ZIP.C.OBJ(DEFLATE),DISP=SHR', +// CPARM='LONG,NOTERM,LIST,XREF,SOURCE', +// CPARM2='OPT(2),DEF(MVS),NOMAR,NOSEQ,CSECT' +//COMPILE.USERLIB DD DSN=prefix.ZIP.H,DISP=SHR +//FILEIO EXEC EDCC,COND=(0,NE),CREGSIZ='4M', +// INFILE='prefix.ZIP.C(FILEIO)', +// OUTFILE='prefix.ZIP.C.OBJ(FILEIO),DISP=SHR', +// CPARM='LONG,NOTERM,LIST,XREF,SOURCE', +// CPARM2='OPT(2),DEF(MVS),NOMAR,NOSEQ,CSECT' +//COMPILE.USERLIB DD DSN=prefix.ZIP.H,DISP=SHR +//GLOBALS EXEC EDCC,COND=(0,NE),CREGSIZ='4M', +// INFILE='prefix.ZIP.C(GLOBALS)', +// OUTFILE='prefix.ZIP.C.OBJ(GLOBALS),DISP=SHR', +// CPARM='LONG,NOTERM,LIST,XREF,SOURCE', +// CPARM2='OPT(2),DEF(MVS),NOMAR,NOSEQ,CSECT' +//COMPILE.USERLIB DD DSN=prefix.ZIP.H,DISP=SHR +//UTIL EXEC EDCC,COND=(0,NE),CREGSIZ='4M', +// INFILE='prefix.ZIP.C(UTIL)', +// OUTFILE='prefix.ZIP.C.OBJ(UTIL),DISP=SHR', +// CPARM='LONG,NOTERM,LIST,XREF,SOURCE', +// CPARM2='OPT(2),DEF(MVS),NOMAR,NOSEQ,CSECT' +//COMPILE.USERLIB DD DSN=prefix.ZIP.H,DISP=SHR +//CRC32 EXEC EDCC,COND=(0,NE),CREGSIZ='4M', +// INFILE='prefix.ZIP.C(CRC32)', +// OUTFILE='prefix.ZIP.C.OBJ(CRC32),DISP=SHR', +// CPARM='LONG,NOTERM,LIST,XREF,SOURCE', +// CPARM2='OPT(2),DEF(MVS),NOMAR,NOSEQ,CSECT' +//COMPILE.USERLIB DD DSN=prefix.ZIP.H,DISP=SHR +//CRCTAB EXEC EDCC,COND=(0,NE),CREGSIZ='4M', +// INFILE='prefix.ZIP.C(CRCTAB)', +// OUTFILE='prefix.ZIP.C.OBJ(CRCTAB),DISP=SHR', +// CPARM='LONG,NOTERM,LIST,XREF,SOURCE', +// CPARM2='OPT(2),DEF(MVS),NOMAR,NOSEQ,CSECT' +//COMPILE.USERLIB DD DSN=prefix.ZIP.H,DISP=SHR +//ZIPFILE EXEC EDCC,COND=(0,NE),CREGSIZ='4M', +// INFILE='prefix.ZIP.C(ZIPFILE)', +// OUTFILE='prefix.ZIP.C.OBJ(ZIPFILE),DISP=SHR', +// CPARM='LONG,NOTERM,LIST,XREF,SOURCE', +// CPARM2='OPT(2),DEF(MVS),NOMAR,NOSEQ,CSECT' +//COMPILE.USERLIB DD DSN=prefix.ZIP.H,DISP=SHR +//ZIPUP EXEC EDCC,COND=(0,NE),CREGSIZ='4M', +// INFILE='prefix.ZIP.C(ZIPUP)', +// OUTFILE='prefix.ZIP.C.OBJ(ZIPUP),DISP=SHR', +// CPARM='LONG,NOTERM,LIST,XREF,SOURCE', +// CPARM2='OPT(2),DEF(MVS),NOMAR,NOSEQ,CSECT' +//COMPILE.USERLIB DD DSN=prefix.ZIP.H,DISP=SHR +//CMSMVS EXEC EDCC,COND=(0,NE),CREGSIZ='4M', +// INFILE='prefix.ZIP.C(CMSMVS)', +// OUTFILE='prefix.ZIP.C.OBJ(CMSMVS),DISP=SHR', +// CPARM='LONG,NOTERM,LIST,XREF,SOURCE', +// CPARM2='OPT(2),DEF(MVS),NOMAR,NOSEQ,CSECT' +//COMPILE.USERLIB DD DSN=prefix.ZIP.H,DISP=SHR +//MVS EXEC EDCC,COND=(0,NE),CREGSIZ='4M', +// INFILE='prefix.ZIP.C(MVS)', +// OUTFILE='prefix.ZIP.C.OBJ(MVS),DISP=SHR', +// CPARM='LONG,NOTERM,LIST,XREF,SOURCE', +// CPARM2='OPT(2),DEF(MVS),NOMAR,NOSEQ,CSECT' +//COMPILE.USERLIB DD DSN=prefix.ZIP.H,DISP=SHR +//PLINK EXEC PROC=EDCPL, +// OUTFILE='prefix.ZIP.LOAD(ZIP),DISP=SHR', +// PREGSIZ=6M, +// PPARM='NONCAL,MAP,MEMORY', +// LPARM='LIST,MAP,XREF' +//PLKED.SYSIN DD DISP=SHR,DSN=prefix.ZIP.C.OBJ(ZIP) +// DD DISP=SHR,DSN=prefix.ZIP.C.OBJ(CRYPT) +// DD DISP=SHR,DSN=prefix.ZIP.C.OBJ(TREES) +// DD DISP=SHR,DSN=prefix.ZIP.C.OBJ(DEFLATE) +// DD DISP=SHR,DSN=prefix.ZIP.C.OBJ(FILEIO) +// DD DISP=SHR,DSN=prefix.ZIP.C.OBJ(GLOBALS) +// DD DISP=SHR,DSN=prefix.ZIP.C.OBJ(UTIL) +// DD DISP=SHR,DSN=prefix.ZIP.C.OBJ(CRC32) +// DD DISP=SHR,DSN=prefix.ZIP.C.OBJ(CRCTAB) +// DD DISP=SHR,DSN=prefix.ZIP.C.OBJ(ZIPFILE) +// DD DISP=SHR,DSN=prefix.ZIP.C.OBJ(ZIPUP) +// DD DISP=SHR,DSN=prefix.ZIP.C.OBJ(MVS) +// DD DISP=SHR,DSN=prefix.ZIP.C.OBJ(CMSMVS) +//LKED.SYSLIB DD DISP=SHR,DSN=CEE.SCEELKED +//SYSUT1 DD UNIT=SYSDA,SPACE=(CYL,(2,2)) +// + +Sample JCL to zip the mainframe .C and .H files as ASCII (-a). Delete +any existing archive first, point the temporary file at a particular +prefix (-b), use 'prefix.ARCHIVE.ZIP' for the archive file, read the +list of files to zip from stdin (SYSIN). + +//DELETE EXEC PGM=IDCAMS +//SYSPRINT DD SYSOUT=* +//SYSIN DD * + DELETE prefix.ARCHIVE.ZIP + SET MAXCC = 0 +//ZIP EXEC PGM=ZIP, +// PARM='/-a -v -b temppref ''prefix.ARCHIVE.ZIP'' -@' +//STEPLIB DD DSN=prefix.ZIP.LOAD,DISP=SHR +//SYSPRINT DD SYSOUT=* +//SYSOUT DD SYSOUT=* +//CEEDUMP DD SYSOUT=* +//ZIPC DD DISP=SHR,DSN=prefix.ZIP.C +//ZIPH DD DISP=SHR,DSN=prefix.ZIP.H +//SYSIN DD * +dd:zipc(api) +dd:zipc(cms) +dd:zipc(cmsmvs) +dd:zipc(crctab) +dd:zipc(crc32) +dd:zipc(crypt) +dd:zipc(deflate) +dd:zipc(fileio) +dd:zipc(globals) +dd:zipc(mktime) +dd:zipc(mvs) +dd:zipc(trees) +dd:zipc(ttyio) +dd:zipc(util) +dd:zipc(zip) +dd:zipc(zipcloak) +dd:zipc(zipfile) +dd:zipc(zipnote) +dd:zipc(zipsplit) +dd:zipc(zipup) +dd:ziph(api) +dd:ziph(cmsmvs) +dd:ziph(crypt) +dd:ziph(cstat) +dd:ziph(ebcdic) +dd:ziph(mvs) +dd:ziph(revision) +dd:ziph(stat) +dd:ziph(tailor) +dd:ziph(ttyio) +dd:ziph(zip) +dd:ziph(ziperr) +dd:ziph(zipup) diff --git a/cmsmvs/cczip.exec b/cmsmvs/cczip.exec new file mode 100644 index 0000000..afa97d0 --- /dev/null +++ b/cmsmvs/cczip.exec @@ -0,0 +1,124 @@ +/* CCZIP EXEC Compile zip for VM/CMS */ +/* Author: George Petrov, 11 Apr 1995 (VMCOMPIL EXEC) */ +/* Modified for IBM C V3R1 by Ian E. Gorman, 2 Nov 1998 + Facilities for compiling and testing were provided by + OmniMark Technologies Corporation, Ottawa, Canada +*/ +Address Command +Signal On Error + +/* Allow longnames, compile re-entrant code. + globals.c and cmsmvs.c require EXTENDED features */ +CCopts = 'LONGNAME RENT LANGLVL(EXTENDED) NOEXECOPS' + +/* ZIP options -- VM_CMS, REENTRANT */ +CCopts = CCopts 'DEFINE(VM_CMS,REENTRANT)' + +/* Link the load module to run in more or less than 16MB memory */ +LINKopts = 'AMODE ANY RMODE ANY RLDSAVE' + +/* resources needed to build */ +'GLOBAL TXTLIB SCEELKED CMSLIB' +'GLOBAL LOADLIB SCEERUN' + +/* produce the TEXT (object) files */ +linklist='' +modname='ZIP' +Say 'Building' modname 'MODULE...' +Call Compile 'ZIP' +Call Compile 'CRCTAB' +Call Compile 'CRC32' +Call Compile 'CRYPT' +Call Compile 'DEFLATE' +Call Compile 'FILEIO' +Call Compile 'GLOBALS' +Call Compile 'TREES' +Call Compile 'TTYIO' +Call Compile 'UTIL' +Call Compile 'ZIPUP' +Call Compile 'ZIPFILE' +Call Compile 'CMSMVS' +Call Compile 'CMS' + +Say 'Linking...' +'EXEC CMOD' linklist '(MODNAME' modname LINKopts +Say modname 'built successfully.' + + +/*---------------------------------------------------------------------*/ +/* Build utility programs */ +/*---------------------------------------------------------------------*/ +CCopts = CCopts 'DEFINE(UTIL)' + + +linklist='' +modname='ZIPNOTE' +Say +Say 'Building' modname 'MODULE...' +Call Compile 'ZIPNOTE' +Call Compile 'ZIPFILE' +Call Compile 'FILEIO' +Call Compile 'UTIL' +Call Compile 'GLOBALS' +Call Compile 'CMSMVS' + +Say 'Linking...' +'EXEC CMOD' linklist '(MODNAME' modname LINKopts +Say modname 'built successfully.' + + +linklist='' +modname='ZIPSPLIT' +Say +Say 'Building' modname 'MODULE...' +Call Compile 'ZIPSPLIT' +Call Compile 'ZIPFILE' +Call Compile 'FILEIO' +Call Compile 'UTIL' +Call Compile 'GLOBALS' +Call Compile 'CMSMVS' + +Say 'Linking...' +'EXEC CMOD' linklist '(MODNAME' modname LINKopts +Say modname 'built successfully.' + + +linklist='' +modname='ZIPCLOAK' +Say +Say 'Building' modname 'MODULE...' +Call Compile 'ZIPCLOAK' +Call Compile 'ZIPFILE' +Call Compile 'FILEIO' +Call Compile 'UTIL' +Call Compile 'GLOBALS' +Call Compile 'CRCTAB' +Call Compile 'CRYPT' +Call Compile 'TTYIO' +Call Compile 'CMSMVS' + +Say 'Linking...' +'EXEC CMOD' linklist '(MODNAME' modname LINKopts +Say modname 'built successfully.' +Say 'Done.' + +Exit rc + + + +error: + Say 'Error' rc 'during compilation!' + Say 'Error in line' sigl':' + Say ' 'Sourceline(sigl) + Exit rc + + + +Compile: Procedure Expose CCopts LINKopts linklist + Parse arg filename filetype filemode . + If filetype='' Then filetype='C' + linklist = linklist filename + + Say 'Compiling' filename filetype filemode '...' + 'EXEC CC' filename filetype filemode '('CCopts + Return rc diff --git a/cmsmvs/cms.c b/cmsmvs/cms.c new file mode 100644 index 0000000..e8dfa34 --- /dev/null +++ b/cmsmvs/cms.c @@ -0,0 +1,34 @@ +/* + Copyright (c) 1990-2005 Info-ZIP. All rights reserved. + + See the accompanying file LICENSE, version 2004-May-22 or later + (the contents of which are also included in zip.h) for terms of use. + If, for some reason, both of these files are missing, the Info-ZIP license + also may be found at: ftp://ftp.info-zip.org/pub/infozip/license.html +*/ +/* + * VM/CMS specific things. + */ + +#include "zip.h" + +int procname(n, caseflag) +char *n; /* name to process */ +int caseflag; /* true to force case-sensitive match */ +/* Process a name or sh expression to operate on (or exclude). Return + an error code in the ZE_ class. */ +{ + FILE *stream; + + if (strcmp(n, "-") == 0) /* if compressing stdin */ + return newname(n, 0, caseflag); + else { + if ((stream = fopen(n, "r")) != (FILE *)NULL) + { + fclose(stream); + return newname(n, 0, caseflag); + } + else return ZE_MISS; + } + return ZE_OK; +} diff --git a/cmsmvs/cmsmvs.c b/cmsmvs/cmsmvs.c new file mode 100644 index 0000000..5297908 --- /dev/null +++ b/cmsmvs/cmsmvs.c @@ -0,0 +1,442 @@ +/* + Copyright (c) 1990-2005 Info-ZIP. All rights reserved. + + See the accompanying file LICENSE, version 2004-May-22 or later + (the contents of which are also included in zip.h) for terms of use. + If, for some reason, both of these files are missing, the Info-ZIP license + also may be found at: ftp://ftp.info-zip.org/pub/infozip/license.html +*/ +/* + * routines common to VM/CMS and MVS + */ + +#include "zip.h" + +#include <stdio.h> +#include <time.h> +#include <errno.h> + +#ifndef MVS /* MVS has perfectly good definitions of the following */ +int stat(const char *path, struct stat *buf) +{ + if ((buf->fp = fopen(path, "r")) != NULL) { + fldata_t fdata; + if (fldata( buf->fp, buf->fname, &fdata ) == 0) { + buf->st_dev = fdata.__device; + buf->st_mode = *(short *)(&fdata); + } + strcpy( buf->fname, path ); + fclose(buf->fp); + } + return (buf->fp != NULL ? 0 : 1); +} +#endif /* MVS */ + + +#ifndef UTIL /* the companion #endif is a bit of ways down ... */ + +#define PAD 0 +#define PATH_END '/' + +/* Library functions not in (most) header files */ + +#ifdef USE_ZIPMAIN +int main OF((void)); +#endif + +int utime OF((char *, ztimbuf *)); + +extern char *label; +local ulg label_time = 0; +local ulg label_mode = 0; +local time_t label_utim = 0; + +#ifndef MVS /* MVS has perfectly good definitions of the following */ +int fstat(int fd, struct stat *buf) +{ + fldata_t fdata; + + if ((fd != -1) && (fldata( (FILE *)fd, buf->fname, &fdata ) == 0)) { + buf->st_dev = fdata.__device; + buf->st_mode = *(short *)(&fdata); + buf->fp = (FILE *)fd; + return 0; + } + return -1; +} +#endif /* MVS */ + + +char *ex2in(x, isdir, pdosflag) +char *x; /* external file name */ +int isdir; /* input: x is a directory */ +int *pdosflag; /* output: force MSDOS file attributes? */ +/* Convert the external file name to a zip file name, returning the malloc'ed + string or NULL if not enough memory. */ +{ + char *n; /* internal file name (malloc'ed) */ + char *t; /* shortened name */ + int dosflag; + char mem[10] = ""; /* member name */ + char ext[10] = ""; /* extension name */ + + dosflag = dosify; /* default for non-DOS non-OS/2 */ + + /* Find starting point in name before doing malloc */ + for (t = x; *t == '/'; t++) + ; + + /* Make changes, if any, to the copied name (leave original intact) */ + if (!pathput) + t = last(t, PATH_END); + + /* Malloc space for internal name and copy it */ + if ((n = malloc(strlen(t) + 1)) == NULL) + return NULL; + strcpy(n, t); + +#ifdef MVS + /* strip quotes from name, non-OE format */ + if (*n == '\'' && (t = strrchr(n, '\'')) != n) { + if (!*(t+1)) { + /* yes, it is a quoted name */ + int l = strlen(n) - 2; + memmove(n, n+1, l); + *(n+l) = '\0'; + } + } + /* Change member names to fn.ext */ + if (t = strrchr(n, '(')) { + *t = '\0'; + strcpy(mem,t+1); /* Save member name */ + if (t = strchr(mem, ')')) *t = '\0'; /* Set end of mbr */ + /* Save extension */ + if (t = strrchr(n, '.')) t++; + else t = n; + strcpy(ext,t); + /* Build name as "member.ext" */ + strcpy(t,mem); + strcat(t,"."); + strcat(t,ext); + } + + /* Change all but the last '.' to '/' */ + if (t = strrchr(n, '.')) { + while (--t > n) + if (*t == '.') + *t = '/'; + } +#else + /* On CMS, remove the filemode (all past 2nd '.') */ + if (t = strchr(n, '.')) + if (t = strchr(t+1, '.')) + *t = '\0'; + t = n; +#endif + + strcpy(n, t); + + if (isdir == 42) return n; /* avoid warning on unused variable */ + + if (dosify) + msname(n); /* msname() needs string in native charset */ + + strtoasc(n, n); + + /* Returned malloc'ed name */ + if (pdosflag) + *pdosflag = dosflag; + return n; +} + + +char *in2ex(n) +char *n; /* internal file name */ +/* Convert the zip file name to an external file name, returning the malloc'ed + string or NULL if not enough memory. */ +{ + char *x; /* external file name */ + + if ((x = malloc(strlen(n) + 1 + PAD)) == NULL) + return NULL; + strtoebc(x, n); + return x; +} + + +void stamp(f, d) +char *f; /* name of file to change */ +ulg d; /* dos-style time to change it to */ +/* Set last updated and accessed time of file f to the DOS time d. */ +{ + ztimbuf u; /* argument for utime() */ + + /* Convert DOS time to time_t format in u.actime and u.modtime */ + u.actime = u.modtime = dos2unixtime(d); + + utime(f, &u); +} + + +ulg filetime(f, a, n, t) +char *f; /* name of file to get info on */ +ulg *a; /* return value: file attributes */ +long *n; /* return value: file size */ +iztimes *t; /* return value: access, modific. and creation times */ +{ + FILE *stream; + time_t ltime; + + if (strcmp(f, "-") != 0) { /* if not compressing stdin */ + Trace((mesg, "opening file '%s' with '%s'\n", f, FOPR)); + if ((stream = fopen(f, FOPR)) == (FILE *)NULL) { + return 0; + } else { + if (n != NULL) { + /* With byteseek, this will work */ + fseek(stream, 0L, SEEK_END); + *n = ftell(stream); + Trace((mesg, "file size = %lu\n", *((ulg *)n))); + } + fclose(stream); + } + } + else { + /* Reading from stdin */ + if (n != NULL) { + *n = -1L; + } + } + + /* Return current time for all the times -- for now */ + time(<ime); + if (t != NULL) + t->atime = t->mtime = t->ctime = ltime; + + /* Set attributes (always a file) */ + if (a != NULL) + *a = 0; + + return unix2dostime(<ime); +} + + + +int set_extra_field(z, z_utim) +struct zlist far *z; +iztimes *z_utim; +/* create extra field and change z->att if desired */ +{ + fldata_t fdata; + FILE *stream; + char *eb_ptr; +#ifdef USE_EF_UT_TIME + extent ef_l_len = (EB_HEADSIZE+EB_UT_LEN(1)); +#else /* !USE_EF_UT_TIME */ + extent ef_l_len = 0; +#endif /* ?USE_EF_UT_TIME */ + int set_cmsmvs_eb = 0; + +/*translate_eol = 0;*/ + if (aflag == ASCII) { + z->att = ASCII; + } else { + if (bflag) + z->att = BINARY; + else + z->att = __EBCDIC; + ef_l_len += sizeof(fdata)+EB_HEADSIZE; + set_cmsmvs_eb = 1; + } + + if (ef_l_len > 0) { + z->extra = (char *)malloc(ef_l_len); + if (z->extra == NULL) { + printf("\nFLDATA : Unable to allocate memory !\n"); + return ZE_MEM; + } + z->cext = z->ext = ef_l_len; + eb_ptr = z->cextra = z->extra; + + if (set_cmsmvs_eb) { + if (bflag) +/*** stream = fopen(z->zname,"rb,type=record"); $RGH$ ***/ + stream = fopen(z->name,"rb"); + else + stream = fopen(z->name,"r"); + if (stream == NULL) { + printf("\nFLDATA : Could not open file : %s !\n",z->name); + printf("Error %d: '%s'\n", errno, strerror(errno)); + return ZE_NONE; + } + + fldata(stream,z->name,&fdata); + /*put the system ID */ +#ifdef VM_CMS + *(eb_ptr) = EF_VMCMS & 0xFF; + *(eb_ptr+1) = EF_VMCMS >> 8; +#else + *(eb_ptr) = EF_MVS & 0xFF; + *(eb_ptr+1) = EF_MVS >> 8; +#endif + *(eb_ptr+2) = sizeof(fdata) & 0xFF; + *(eb_ptr+3) = sizeof(fdata) >> 8; + + memcpy(eb_ptr+EB_HEADSIZE,&fdata,sizeof(fdata)); + fclose(stream); +#ifdef USE_EF_UT_TIME + eb_ptr += (sizeof(fdata)+EB_HEADSIZE); +#endif /* USE_EF_UT_TIME */ + } +#ifdef USE_EF_UT_TIME + eb_ptr[0] = 0x55; /* ascii[(unsigned)('U')] */ + eb_ptr[1] = 0x54; /* ascii[(unsigned)('T')] */ + eb_ptr[2] = EB_UT_LEN(1); /* length of data part of e.f. */ + eb_ptr[3] = 0; + eb_ptr[4] = EB_UT_FL_MTIME; + eb_ptr[5] = (char)(z_utim->mtime); + eb_ptr[6] = (char)(z_utim->mtime >> 8); + eb_ptr[7] = (char)(z_utim->mtime >> 16); + eb_ptr[8] = (char)(z_utim->mtime >> 24); +#endif /* USE_EF_UT_TIME */ + } + + return ZE_OK; +} + +int deletedir(d) +char *d; /* directory to delete */ +/* Delete the directory *d if it is empty, do nothing otherwise. + Return the result of rmdir(), delete(), or system(). + For VMS, d must be in format [x.y]z.dir;1 (not [x.y.z]). + */ +{ + return 0; +} + +#ifdef USE_ZIPMAIN +/* This function is called as main() to parse arguments */ +/* into argc and argv. This is required for stand-alone */ +/* execution. This calls the "real" main() when done. */ + +int main(void) + { + int argc=0; + char *argv[50]; + + int iArgLen; + char argstr[256]; + char **pEPLIST, *pCmdStart, *pArgStart, *pArgEnd; + + /* Get address of extended parameter list from S/370 Register 0 */ + pEPLIST = (char **)__xregs(0); + + /* Null-terminate the argument string */ + pCmdStart = *(pEPLIST+0); + pArgStart = *(pEPLIST+1); + pArgEnd = *(pEPLIST+2); + iArgLen = pArgEnd - pCmdStart + 1; + + /* Make a copy of the command string */ + memcpy(argstr, pCmdStart, iArgLen); + argstr[iArgLen] = '\0'; /* Null-terminate */ + + /* Store first token (cmd) */ + argv[argc++] = strtok(argstr, " "); + + /* Store the rest (args) */ + while (argv[argc-1]) + argv[argc++] = strtok(NULL, " "); + argc--; /* Back off last NULL entry */ + + /* Call "real" main() function */ + return zipmain(argc, argv); + +} +#endif /* USE_ZIPMAIN */ + +#endif /* !UTIL */ + + +/******************************/ +/* Function version_local() */ +/******************************/ + +void version_local() +{ + char liblvlmsg [50+1]; + char *compiler = "?"; + char *platform = "?"; + char complevel[64]; + + /* Map the runtime library level information */ + union { + unsigned int iVRM; + struct { + unsigned int pd:4; /* Product designation */ + unsigned int vv:4; /* Version */ + unsigned int rr:8; /* Release */ + unsigned int mm:16; /* Modification level */ + } xVRM; + } VRM; + + + /* Break down the runtime library level */ + VRM.iVRM = __librel(); + sprintf(liblvlmsg, "Using runtime library level %s V%dR%dM%d", + (VRM.xVRM.pd==1 ? "LE" : "CE"), + VRM.xVRM.vv, VRM.xVRM.rr, VRM.xVRM.mm); + /* Note: LE = Language Environment, CE = Common Env. (C/370). */ + /* This refers ONLY to the current runtimes, not the compiler. */ + + +#ifdef VM_CMS + platform = "VM/CMS"; + #ifdef __IBMC__ + compiler = "IBM C"; + #else + compiler = "C/370"; + #endif +#endif + +#ifdef MVS + platform = "MVS"; + #ifdef __IBMC__ + compiler = "IBM C/C++"; + #else + compiler = "C/370"; + #endif +#endif + +#ifdef __COMPILER_VER__ + VRM.iVRM = __COMPILER_VER__; + sprintf(complevel," V%dR%dM%d", + VRM.xVRM.vv, VRM.xVRM.rr, VRM.xVRM.mm); +#else +#ifdef __IBMC__ + sprintf(complevel," V%dR%d", __IBMC__ / 100, (__IBMC__ % 100)/10); +#else + complevel[0] = '\0'; +#endif +#endif + + + printf("Compiled with %s%s for %s%s%s.\n\n", + + /* Add compiler name and level */ + compiler, complevel, + + /* Add platform */ + platform, + + /* Add timestamp */ +#ifdef __DATE__ + " on " __DATE__ +#ifdef __TIME__ + " at " __TIME__ +#endif +#endif + ".\n", + liblvlmsg + ); +} /* end function version_local() */ diff --git a/cmsmvs/cmsmvs.h b/cmsmvs/cmsmvs.h new file mode 100644 index 0000000..8fca61b --- /dev/null +++ b/cmsmvs/cmsmvs.h @@ -0,0 +1,134 @@ +/* + Copyright (c) 1990-1999 Info-ZIP. All rights reserved. + + See the accompanying file LICENSE, version 1999-Oct-05 or later + (the contents of which are also included in zip.h) for terms of use. + If, for some reason, both of these files are missing, the Info-ZIP license + also may be found at: ftp://ftp.cdrom.com/pub/infozip/license.html +*/ +/* Include file for VM/CMS and MVS */ + +/* This is normally named osdep.h on most systems. Since CMS */ +/* generally doesn't support directories, it's been given a unique */ +/* name to avoid confusion. */ + + +#ifndef __cmsmvs_h /* prevent multiple inclusions */ +#define __cmsmvs_h + +#ifdef MVS +# define _POSIX_SOURCE /* tell MVS we want full definitions */ +# include <features.h> +#endif /* MVS */ + +#include <time.h> /* the usual non-BSD time functions */ +/* cstat.h is not required for MVS and actually gets in the way. Is it + * needed for CMS? + */ +#ifdef MVS +# include <sys/stat.h> +# include <sys/modes.h> +#else /* !MVS */ +# include "cstat.h" +#endif + + +/* Newer compiler version defines something for us */ +#if defined(__VM__) && !defined(VM_CMS) +# define VM_CMS +#endif + +#define CMS_MVS +#define EBCDIC + +#ifndef MVS /* MVS has perfectly good definitions for the following */ +# define NO_UNISTD_H +# define NO_FCNTL_H +#endif /*MVS */ + +/* If we're generating a stand-alone CMS module, patch in */ +/* a new main() function before the real main() for arg parsing. */ +#ifdef CMS_STAND_ALONE +# define USE_ZIPMAIN +#endif + +#ifndef NULL +# define NULL 0 +#endif + +#define PASSWD_FROM_STDIN + /* Kludge until we know how to open a non-echo tty channel */ + +/* definition for ZIP */ +#define getch() getc(stdin) +#define native(c) ebcdic[(c)] +#define MAXPATHLEN 128 +#define NO_RMDIR +#define NO_MKTEMP +#define USE_CASE_MAP +#ifndef MVS /* MVS has perfectly good definitions for the following */ +# define fileno(x) (char *)(x) +# define fdopen fopen +# define unlink remove +# define link rename +# define utime(f,t) +# define isatty(t) 1 +#endif /*MVS */ +#ifdef ZCRYPT_INTERNAL +# define ZCR_SEED2 (unsigned)3141592654L /* use PI as seed pattern */ +#endif + +#ifdef MVS +# if defined(__CRC32_C) +# pragma csect(STATIC,"crc32_s") +# elif defined(__DEFLATE_C) +# pragma csect(STATIC,"deflat_s") +# elif defined(__ZIPFILE_C) +# pragma csect(STATIC,"zipfil_s") +# elif defined(__ZIPUP_C) +# pragma csect(STATIC,"zipup_s") +# endif +#endif /* MVS */ + +/* end defines for ZIP */ + + + +/* definitions for UNZIP */ +#ifdef UNZIP +#define INBUFSIZ 8192 + +#define USE_STRM_INPUT +#define USE_FWRITE + +#define PATH_MAX 128 +#endif /* UNZIP */ + + +#if 0 /*$RGH$*/ +/* RECFM=F, LRECL=1 works for sure */ +#define FOPR "rb,recfm=fb" +#define FOPM "r+" +#define FOPW "wb,recfm=fb,lrecl=1" +#define FOPWT "w" +#endif + +/* Try allowing ZIP files to be RECFM=V with "byteseek" for CMS, recfm=U for MVS */ +#define FOPR "rb,byteseek" +#define FOPM "r+,byteseek" +#ifdef MVS + #define FOPW "wb,recfm=u,byteseek" +#else /* !MVS */ + #define FOPW "wb,recfm=v,lrecl=32760,byteseek" +#endif /* MVS */ + +#if 0 +#define FOPW_TMP "w,byteseek" +#else +#define FOPW_TMP "w,type=memory(hiperspace)" +#endif + +#define CBSZ 0x40000 +#define ZBSZ 0x40000 + +#endif /* !__cmsmvs_h */ diff --git a/cmsmvs/cstat.h b/cmsmvs/cstat.h new file mode 100644 index 0000000..f02a5c3 --- /dev/null +++ b/cmsmvs/cstat.h @@ -0,0 +1,53 @@ +/* + Copyright (c) 1990-1999 Info-ZIP. All rights reserved. + + See the accompanying file LICENSE, version 1999-Oct-05 or later + (the contents of which are also included in zip.h) for terms of use. + If, for some reason, both of these files are missing, the Info-ZIP license + also may be found at: ftp://ftp.cdrom.com/pub/infozip/license.html +*/ +/* cstat.h + + Definitions used for file status functions + +*/ + +#ifndef __STAT_H +#define __STAT_H + +#include <stdio.h> + +#define S_IFMT 0xF000 /* file type mask */ +#define S_IFDIR 0x4000 /* directory */ +#define S_IFIFO 0x1000 /* FIFO special */ +#define S_IFCHR 0x2000 /* character special */ +#define S_IFBLK 0x3000 /* block special */ +#define S_IFREG 0x8000 /* or just 0x0000, regular */ +#define S_IREAD 0x0100 /* owner may read */ +#define S_IWRITE 0x0080 /* owner may write */ +#define S_IEXEC 0x0040 /* owner may execute <directory search> */ + +struct stat +{ + short st_dev; /* Drive number of disk containing the */ + /* file or file handle if the file is */ + /* on device */ + short st_ino; /* Not meaningfull for VM/CMS */ + short st_mode; /* Bit mask giving information about */ + /* the file's mode */ + short st_nlink; /* Set to the integer constant 1 */ + int st_uid; /* Not meaningfull for VM/CMS */ + int st_gid; /* Not meaningfull for VM/CMS */ + short st_rdev; /* Same as st_dev */ + long st_size; /* Size of the file in bytes */ + long st_atime; /* Most recent access */ + long st_mtime; /* Same as st_atime */ + long st_ctime; /* Same as st_atime */ + FILE *fp; + char fname[FILENAME_MAX]; +}; + +int stat(const char *path, struct stat *sb); +int fstat(int fd, struct stat *sb); + +#endif /* __STAT_H */ diff --git a/cmsmvs/mc.exec b/cmsmvs/mc.exec new file mode 100644 index 0000000..ca22a18 --- /dev/null +++ b/cmsmvs/mc.exec @@ -0,0 +1,95 @@ +/* MAKECPIP EXEC Make program to build a C/370 module */ +/* Author: George Petrov, 29 Sep 1994 */ + +arg fn . '(' cparms /* Filter name */ +'pipe (end ?) < 'fn' makefile', /* get all source files from */ + '| frlab GLOBALS:'||, + '| drop', + '| strip', + '| var globals' +cparms = cparms globals +say '' +say 'Compile options : 'cparms +say '' +if pos('REB',cparms) > 0 then do +parse var cparms cp1 'REB' . ' ' cp2 /* REBuild options specified ? */ +cparms = cp1||cp2 +pipe1=, +'pipe (end ?) < 'fn' makefile', /* get all source files from */ + '| nfind *'||, /* the makefile and compile */ + '| frlab TEXT:'||, /* only the those who are */ + '| r: tolab MODULE:'||, /* changed or never compiled */ + '| drop', + '| o: fanout', + '| chop before str /(/', + '| statew', + '| c: fanout', /* compiled */ + '| specs /Compiling / 1 w1-3 n / .../ n', + '| cons' +end +else do +pipe1=, +'pipe (end ?) < 'fn' makefile', /* get all source files from */ + '| nfind *'||, /* the makefile and compile */ + '| frlab TEXT:'||, /* only the those who are */ + '| r: tolab MODULE:'||, /* changed or never compiled */ + '| drop', + '| o: fanout', + '| specs w1 1 /C/ nw w3 nw write w1 1 /TEXT A/ nw', + '| chop before str /(/', + '| statew', + '| change (57 66) / /0/', + '| sort 1.8 d', /* sort the date and time */ + '| uniq 1-17 singles', /* if the first is a source */ + '| sort 1.8 d 64.2 d 57.2 d 60.2 d 66.8 d', /* sort the date */ + '| uniq 1-8 first', /* if the first is a source */ + '| locate 9.8 /C /', /* program then it has to be */ + '| c: fanout', /* compiled */ + '| specs /Compiling / 1 w1-3 n / .../ n', + '| cons' +end +pipe2= '?', + 'r:', + '| drop', + '| specs w1 1', /* save the module name in var */ + '| var module', + '?', + 'o:', + '| specs w1 1', + '| join * / /', + '| var texts', /* save all the text file names */ + '?', /* for later include */ + 'c:', + '| specs /CC / 1 w1-3 n /(NOTERM 'cparms'/ nw', /* compile! */ + '| err: cms | cons', + '?', + 'err:', + '| strip both', + '| nfind 0'||, + '| var err', + '| specs /----> Errors found! RC=/ 1 1-* n', + '| cons' +/* '| g: gate'*/ +pipe1 pipe2 +say '' +if symbol('err') = 'VAR' & err ^= 0 then do + say 'Errors found in source files - link aborted! RC = 'err + exit err +end +say 'Generating module 'module +'pipe cms cmod' fn texts' DMSCSL | > 'fn' LINK A' +'set cmstype ht' +'state 'fn' LINK A' +rcc = rc +'set cmstype rt' +if rcc = 0 then do + say '' + say 'ERRORS discovered during linking!' + say 'See: 'fn' LINK A for more info' +end +exit rc +error: +say 'Error in REXX detected!' +Say 'Syntax error on line' Sigl':' Sourceline(Sigl) +Say 'Error was:' Errortext(RC) +return rc diff --git a/cmsmvs/mvs.c b/cmsmvs/mvs.c new file mode 100644 index 0000000..fabc4f0 --- /dev/null +++ b/cmsmvs/mvs.c @@ -0,0 +1,221 @@ +/* + Copyright (c) 1990-2005 Info-ZIP. All rights reserved. + + See the accompanying file LICENSE, version 2004-May-22 or later + (the contents of which are also included in zip.h) for terms of use. + If, for some reason, both of these files are missing, the Info-ZIP license + also may be found at: ftp://ftp.info-zip.org/pub/infozip/license.html +*/ +/* + * MVS specific things + */ +#include "zip.h" +#include "mvs.h" +#include <errno.h> + +static int gen_node( DIR *dirp, RECORD *recptr ) +{ + char *ptr, *name, ttr[TTRLEN]; + int skip, count = 2; + unsigned int info_byte, alias, ttrn; + struct dirent *new; + + ptr = recptr->rest; + while (count < recptr->count) { + if (!memcmp( ptr, endmark, NAMELEN )) + return 1; + name = ptr; /* member name */ + ptr += NAMELEN; + memcpy( ttr, ptr, TTRLEN ); /* ttr name */ + ptr += TTRLEN; + info_byte = (unsigned int) (*ptr); /* info byte */ + if ( !(info_byte & ALIAS_MASK) ) { /* no alias */ + new = malloc( sizeof(struct dirent) ); + if (dirp->D_list == NULL) + dirp->D_list = dirp->D_curpos = new; + else + dirp->D_curpos = (dirp->D_curpos->d_next = new); + new->d_next = NULL; + memcpy( new->d_name, name, NAMELEN ); + new->d_name[NAMELEN] = '\0'; + if ((name = strchr( new->d_name, ' ' )) != NULL) + *name = '\0'; /* skip trailing blanks */ + } + skip = (info_byte & SKIP_MASK) * 2 + 1; + ptr += skip; + count += (TTRLEN + NAMELEN + skip); + } + return 0; +} + +DIR *opendir(const char *dirname) +{ + int bytes, list_end = 0; + DIR *dirp; + FILE *fp; + RECORD rec; + + fp = fopen( dirname, "rb" ); + if (fp != NULL) { + dirp = malloc( sizeof(DIR) ); + if (dirp != NULL) { + dirp->D_list = dirp->D_curpos = NULL; + strcpy( dirp->D_path, dirname ); + do { + bytes = fread( &rec, 1, sizeof(rec), fp ); + if (bytes == sizeof(rec)) + list_end = gen_node( dirp, &rec ); + } while (!feof(fp) && !list_end); + fclose( fp ); + dirp->D_curpos = dirp->D_list; + return dirp; + } + fclose( fp ); + } + return NULL; +} + +struct dirent *readdir(DIR *dirp) +{ + struct dirent *cur; + + cur = dirp->D_curpos; + dirp->D_curpos = dirp->D_curpos->d_next; + return cur; +} + +void rewinddir(DIR *dirp) +{ + dirp->D_curpos = dirp->D_list; +} + +int closedir(DIR *dirp) +{ + struct dirent *node; + + while (dirp->D_list != NULL) { + node = dirp->D_list; + dirp->D_list = dirp->D_list->d_next; + free( node ); + } + free( dirp ); + return 0; +} + +local char *readd(d) +DIR *d; /* directory stream to read from */ +/* Return a pointer to the next name in the directory stream d, or NULL if + no more entries or an error occurs. */ +{ + struct dirent *e; + + e = readdir(d); + return e == NULL ? (char *) NULL : e->d_name; +} + +int procname(n, caseflag) +char *n; /* name to process */ +int caseflag; /* true to force case-sensitive match */ +/* Process a name or sh expression to operate on (or exclude). Return + an error code in the ZE_ class. */ +{ + char *a; /* path and name for recursion */ + DIR *d; /* directory stream from opendir() */ + char *e; /* pointer to name from readd() */ + int m; /* matched flag */ + char *p; /* path for recursion */ + struct stat s; /* result of stat() */ + struct zlist far *z; /* steps through zfiles list */ + int exists; /* 1 if file exists */ + + if (strcmp(n, "-") == 0) /* if compressing stdin */ + return newname(n, 0, caseflag); + else if (!(exists = (LSSTAT(n, &s) == 0))) + { +#ifdef MVS + /* special case for MVS. stat does not work on non-HFS files so if + * stat fails with ENOENT, try to open the file for reading anyway. + * If the user has no OMVS segment, stat gets an initialization error, + * even on external files. + */ + if (errno == ENOENT || errno == EMVSINITIAL) { + FILE *f = fopen(n, "r"); + if (f) { + /* stat got ENOENT but fopen worked, external file */ + fclose(f); + exists = 1; + memset(&s, '\0', sizeof(s)); /* stat data is unreliable for externals */ + s.st_mode = S_IFREG; /* fudge it */ + } + } +#endif /* MVS */ + } + if (! exists) { + /* Not a file or directory--search for shell expression in zip file */ + p = ex2in(n, 0, (int *)NULL); /* shouldn't affect matching chars */ + m = 1; + for (z = zfiles; z != NULL; z = z->nxt) { + if (MATCH(p, z->iname, caseflag)) + { + z->mark = pcount ? filter(z->zname, caseflag) : 1; + if (verbose) + fprintf(mesg, "zip diagnostic: %scluding %s\n", + z->mark ? "in" : "ex", z->name); + m = 0; + } + } + free((zvoid *)p); + return m ? ZE_MISS : ZE_OK; + } + + /* Live name--use if file, recurse if directory */ + if (!S_ISDIR(s.st_mode)) + { + /* add or remove name of file */ + if ((m = newname(n, 0, caseflag)) != ZE_OK) + return m; + } else { + /* Add trailing / to the directory name */ + if ((p = malloc(strlen(n)+2)) == NULL) + return ZE_MEM; + if (strcmp(n, ".") == 0) { + *p = '\0'; /* avoid "./" prefix and do not create zip entry */ + } else { + strcpy(p, n); + a = p + strlen(p); + if (a[-1] != '/') + strcpy(a, "/"); + if (dirnames && (m = newname(p, 1, caseflag)) != ZE_OK) { + free((zvoid *)p); + return m; + } + } + /* recurse into directory */ + if (recurse && (d = opendir(n)) != NULL) + { + while ((e = readd(d)) != NULL) { + if (strcmp(e, ".") && strcmp(e, "..")) + { + if ((a = malloc(strlen(p) + strlen(e) + 1)) == NULL) + { + closedir(d); + free((zvoid *)p); + return ZE_MEM; + } + strcat(strcpy(a, p), e); + if ((m = procname(a, caseflag)) != ZE_OK) /* recurse on name */ + { + if (m == ZE_MISS) + zipwarn("name not matched: ", a); + else + ziperr(m, a); + } + free((zvoid *)a); + } + } + closedir(d); + } + free((zvoid *)p); + } /* (s.st_mode & S_IFDIR) == 0) */ + return ZE_OK; +} diff --git a/cmsmvs/mvs.h b/cmsmvs/mvs.h new file mode 100644 index 0000000..b2f9760 --- /dev/null +++ b/cmsmvs/mvs.h @@ -0,0 +1,40 @@ +/* + Copyright (c) 1990-1999 Info-ZIP. All rights reserved. + + See the accompanying file LICENSE, version 1999-Oct-05 or later + (the contents of which are also included in zip.h) for terms of use. + If, for some reason, both of these files are missing, the Info-ZIP license + also may be found at: ftp://ftp.cdrom.com/pub/infozip/license.html +*/ +/* <dirent.h> definitions */ + +#define NAMELEN 8 + +struct dirent { + struct dirent *d_next; + char d_name[NAMELEN+1]; +}; + +typedef struct _DIR { + struct dirent *D_list; + struct dirent *D_curpos; + char D_path[FILENAME_MAX]; +} DIR; + +DIR * opendir(const char *dirname); +struct dirent *readdir(DIR *dirp); +void rewinddir(DIR *dirp); +int closedir(DIR *dirp); +char * readd(DIR *dirp); + +#define ALIAS_MASK (unsigned int) 0x80 +#define SKIP_MASK (unsigned int) 0x1F +#define TTRLEN 3 +#define RECLEN 254 + +typedef _Packed struct { + unsigned short int count; + char rest[RECLEN]; +} RECORD; + +char *endmark = "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF"; diff --git a/cmsmvs/mvs.mki b/cmsmvs/mvs.mki new file mode 100644 index 0000000..7990902 --- /dev/null +++ b/cmsmvs/mvs.mki @@ -0,0 +1,128 @@ +# Makefile for the MVS (OS/390 Base) version of ZIP 2.3 +# Produced for C/C++ V3R2 in OS/390 1.2.0 by Ian E. Gorman, 2 Nov 1998 +# Facilities for compiling and testing were made available by +# OmniMark Technologies Corporation, Ottawa, Canada + +# NOTES +# +# The only tabs in this file are in the first character of each recipe +# line, where they are required by make. +# +# Run this makefile in OpenMVS (OS/390 POSIX) using source files in the +# HFS file system. You can write the load module to either HFS file +# system or to a PDS in the native MVS file system. The PDS must have +# sufficient free space to hold the load module. +# +# To compile to a member of a PDS: +# make +# or +# make zip.mvs +# +# To compile a test version into the HFS file system: +# make hfs + +# ZIP options -- MVS, REENTRANT +ZIPOPTS=-DMVS -DREENTRANT + +# directories + +# generic source code +SRC=.. +SRC_P=$(SRC)/ + +# source code for MVS +CMSMVS=../cmsmvs +CMSMVS_P=$(CMSMVS)/ + +# include files +INCLS=-I$(SRC) -I$(CMSMVS) + +# object files and load modules +BLD_P=../mvs/ + +# Other options + +# Suffixes (E and O must be different) +E= +O=.o + +# Need EXTENDED features for global.c and vmvms.c, so not using c89 +CC=cc +CFLAGS=-D_OPEN_SYS $(ZIPOPTS) $(INCLS) + +LD=cc +LDFLAGS= + +# Files + +# object (TEXT) files +OBJECTS= $(BLD_P)zip$(O) $(BLD_P)trees$(O) \ + $(BLD_P)crypt$(O) $(BLD_P)ttyio$(O) $(BLD_P)deflate$(O) \ + $(BLD_P)fileio$(O) $(BLD_P)globals$(O) $(BLD_P)util$(O) \ + $(BLD_P)crc32$(O) $(BLD_P)crctab$(O) $(BLD_P)zipfile$(O) \ + $(BLD_P)zipup$(O) $(BLD_P)cmsmvs$(O) $(BLD_P)mvs$(O) + +# Header files +HFILES= $(SRC_P)api.h $(SRC_P)crypt.h $(SRC_P)ebcdic.h \ + $(SRC_P)revision.h $(SRC_P)tailor.h $(SRC_P)ttyio.h \ + $(SRC_P)zip.h $(SRC_P)ziperr.h $(CMSMVS_P)cmsmvs.h \ + $(CMSMVS_P)cstat.h $(CMSMVS_P)mvs.h $(CMSMVS_P)zipup.h + +# Rules + +all: $(BLD_P)zip.mvs$(E) +hfs: $(BLD_P)zip$(E) + +# link + +$(BLD_P)zip.mvs$(E): $(OBJECTS) + $(LD) -o "//INFOZIP.LOAD(ZIP)" $(LDFLAGS) $^ + echo "tso call \"infozip(zip)\" \"'\"\"""$$""@""\"\"'\"" > $% + chmod a+x $% + +$(BLD_P)zip$(E): $(OBJECTS) + $(LD) -o $% $(LDFLAGS) $^ + +# compile + +$(BLD_P)trees$(O): $(SRC_P)trees.c $(HFILES) + $(CC) -c -o $% $(CFLAGS) $(SRC_P)trees.c + +$(BLD_P)crypt$(O): $(SRC_P)crypt.c $(HFILES) + $(CC) -c -o $% $(CFLAGS) $(SRC_P)crypt.c + +$(BLD_P)ttyio$(O): $(SRC_P)ttyio.c $(HFILES) + $(CC) -c -o $% $(CFLAGS) $(SRC_P)ttyio.c + +$(BLD_P)deflate$(O): $(SRC_P)deflate.c $(HFILES) + $(CC) -c -o $% $(CFLAGS) $(SRC_P)deflate.c + +$(BLD_P)fileio$(O): $(SRC_P)fileio.c $(HFILES) + $(CC) -c -o $% $(CFLAGS) $(SRC_P)fileio.c + +$(BLD_P)globals$(O): $(SRC_P)globals.c $(HFILES) + $(CC) -c -o $% $(CFLAGS) $(SRC_P)globals.c + +$(BLD_P)zip$(O): $(SRC_P)zip.c $(HFILES) + $(CC) -c -o $% $(CFLAGS) $(SRC_P)zip.c + +$(BLD_P)util$(O): $(SRC_P)util.c $(HFILES) + $(CC) -c -o $% $(CFLAGS) $(SRC_P)util.c + +$(BLD_P)crc32$(O): $(SRC_P)crc32.c $(HFILES) + $(CC) -c -o $% $(CFLAGS) $(SRC_P)crc32.c + +$(BLD_P)crctab$(O): $(SRC_P)crctab.c $(HFILES) + $(CC) -c -o $% $(CFLAGS) $(SRC_P)crctab.c + +$(BLD_P)zipfile$(O): $(SRC_P)zipfile.c $(HFILES) + $(CC) -c -o $% $(CFLAGS) $(SRC_P)zipfile.c + +$(BLD_P)zipup$(O): $(SRC_P)zipup.c $(HFILES) + $(CC) -c -o $% $(CFLAGS) $(SRC_P)zipup.c + +$(BLD_P)cmsmvs$(O): $(CMSMVS_P)cmsmvs.c $(HFILES) + $(CC) -c -o $% $(CFLAGS) $(CMSMVS_P)cmsmvs.c + +$(BLD_P)mvs$(O): $(CMSMVS_P)mvs.c $(HFILES) + $(CC) -c -o $% $(CFLAGS) $(CMSMVS_P)mvs.c diff --git a/cmsmvs/pipzip.rexx b/cmsmvs/pipzip.rexx new file mode 100644 index 0000000..4249ded --- /dev/null +++ b/cmsmvs/pipzip.rexx @@ -0,0 +1,27 @@ +/* PIPZIP REXX Rexx filter to use ZIP */ +/* Author : George Petrov, 8 May 1995 */ + +parse arg opts +'callpipe *:', + '| specs w1 1 /./ n w2 n', + '| join * / /', + '| specs /zip 'opts'/ 1 1-* nw', + '| cms', + '| *:' + +exit rc + + + + + + + + + + + + + + + diff --git a/cmsmvs/zip.exec b/cmsmvs/zip.exec new file mode 100644 index 0000000..0b9de97 --- /dev/null +++ b/cmsmvs/zip.exec @@ -0,0 +1,66 @@ +/***********************************************************************/ +/* */ +/* Front-end EXEC to set up linkage to the C runtime libraries */ +/* before executing a MODULE generated from C code. */ +/* */ +/* Copy this file as an EXEC with a filename matching the C MODULE. */ +/* */ +/* Greg Hartwig (ghartwig@vnet.ibm.com) 7/31/97, 4/24/98. */ +/* */ +/***********************************************************************/ +Address Command +Parse Arg argstring +Parse Source . . myname . + +/* Set output and input character translation so brackets show up */ +'SET OUTPUT AD' 'BA'x +'SET OUTPUT BD' 'BB'x +'SET INPUT BA AD' +'SET INPUT BB BD' + +Call CLIB +If rc<>0 Then Do + Say 'The required C runtime libraries don''t appear to be available.' + Say myname 'can not run.' + Exit 12 +End + +/* Run the command */ +myname argstring +Exit rc + + + + +/* Contents of the CLIB EXEC, modified for RC checking. */ +/* Removed TXTLIB setting. Only LOADLIB needed for execution. */ +CLIB: +/***************************************************/ +/* SET UP LIBRARIES FOR LE for MVS & VM */ +/***************************************************/ +Address COMMAND + +loadlib ='EDCLINK' /* C/370 runtime */ +loadlib ='SCEERUN' /* LE runtime */ + + +theirs=queued() /* old stack contentsM068*/ + 'QUERY LOADLIB ( LIFO' /* old setting M068*/ + LoadlibList='' /* init list M068*/ +rc=0 + Do while queued()^=theirs /* all lines from cmdM068*/ + Parse upper pull 'LOADLIB' '=' Ltemp /* get one line M068*/ + LoadlibList= Ltemp Loadliblist /* was stacked LIFO M068*/ + End /*M068*/ + If loadlibList='NONE' , + Then Do + 'GLOBAL LOADLIB' Loadlib /* enforce what we need */ + End + Else Do + Do xx=1 to Words(loadlib) + If Find(loadliblist,word(loadlib,xx)) = 0 , + then loadliblist = loadliblist word(loadlib,xx) + End + 'GLOBAL LOADLIB' loadliblist /* enforce what we need */ + End +Return diff --git a/cmsmvs/zip.makefile b/cmsmvs/zip.makefile new file mode 100644 index 0000000..b183367 --- /dev/null +++ b/cmsmvs/zip.makefile @@ -0,0 +1,22 @@ +* This is a comment +* this makefile compiles filter ZIPME + +GLOBALS: + long def(VM_CMS) +TEXT: + trees c + crypt c + ttyio c + deflate c + fileio c + globals c + zip c + util c + crc32.c + crctab.c + zipfile c + zipup c + cmsmvs c + cms c +MODULE: + zip module diff --git a/cmsmvs/zipcloak.exec b/cmsmvs/zipcloak.exec new file mode 100644 index 0000000..0b9de97 --- /dev/null +++ b/cmsmvs/zipcloak.exec @@ -0,0 +1,66 @@ +/***********************************************************************/ +/* */ +/* Front-end EXEC to set up linkage to the C runtime libraries */ +/* before executing a MODULE generated from C code. */ +/* */ +/* Copy this file as an EXEC with a filename matching the C MODULE. */ +/* */ +/* Greg Hartwig (ghartwig@vnet.ibm.com) 7/31/97, 4/24/98. */ +/* */ +/***********************************************************************/ +Address Command +Parse Arg argstring +Parse Source . . myname . + +/* Set output and input character translation so brackets show up */ +'SET OUTPUT AD' 'BA'x +'SET OUTPUT BD' 'BB'x +'SET INPUT BA AD' +'SET INPUT BB BD' + +Call CLIB +If rc<>0 Then Do + Say 'The required C runtime libraries don''t appear to be available.' + Say myname 'can not run.' + Exit 12 +End + +/* Run the command */ +myname argstring +Exit rc + + + + +/* Contents of the CLIB EXEC, modified for RC checking. */ +/* Removed TXTLIB setting. Only LOADLIB needed for execution. */ +CLIB: +/***************************************************/ +/* SET UP LIBRARIES FOR LE for MVS & VM */ +/***************************************************/ +Address COMMAND + +loadlib ='EDCLINK' /* C/370 runtime */ +loadlib ='SCEERUN' /* LE runtime */ + + +theirs=queued() /* old stack contentsM068*/ + 'QUERY LOADLIB ( LIFO' /* old setting M068*/ + LoadlibList='' /* init list M068*/ +rc=0 + Do while queued()^=theirs /* all lines from cmdM068*/ + Parse upper pull 'LOADLIB' '=' Ltemp /* get one line M068*/ + LoadlibList= Ltemp Loadliblist /* was stacked LIFO M068*/ + End /*M068*/ + If loadlibList='NONE' , + Then Do + 'GLOBAL LOADLIB' Loadlib /* enforce what we need */ + End + Else Do + Do xx=1 to Words(loadlib) + If Find(loadliblist,word(loadlib,xx)) = 0 , + then loadliblist = loadliblist word(loadlib,xx) + End + 'GLOBAL LOADLIB' loadliblist /* enforce what we need */ + End +Return diff --git a/cmsmvs/zipmvsc.job b/cmsmvs/zipmvsc.job new file mode 100644 index 0000000..6b4b1ca --- /dev/null +++ b/cmsmvs/zipmvsc.job @@ -0,0 +1,95 @@ +//CCZIP JOB (BI09255), +// MSGLEVEL=(1,1),MSGCLASS=C,CLASS=D,NOTIFY=C888090 +//PROCLIB JCLLIB ORDER=(SYS1.C370.PROCLIB.M24) +//ZIP EXEC EDCC,COND=(12,LE),CREGSIZ='4M', +// INFILE='C888090.ZIP.C(ZIP)', +// OUTFILE='C888090.ZIP.C.OBJ(ZIP),DISP=SHR', +// CPARM='LONG,NOTERM,LIST,XREF,SOURCE,OPT(2),DEF(MVS)' +//COMPILE.USERLIB DD DSN=C888090.ZIP.H,DISP=SHR +//CRYPT EXEC EDCC,COND=(12,LE),CREGSIZ='4M', +// INFILE='C888090.ZIP.C(CRYPT)', +// OUTFILE='C888090.ZIP.C.OBJ(CRYPT),DISP=SHR', +// CPARM='LONG,NOTERM,LIST,XREF,SOURCE,OPT(2),DEF(MVS)' +//COMPILE.USERLIB DD DSN=C888090.ZIP.H,DISP=SHR +//TTYIO EXEC EDCC,COND=(12,LE),CREGSIZ='4M', +// INFILE='C888090.ZIP.C(TTYIO)', +// OUTFILE='C888090.ZIP.C.OBJ(TTYIO),DISP=SHR', +// CPARM='LONG,NOTERM,LIST,XREF,SOURCE,OPT(2),DEF(MVS)' +//COMPILE.USERLIB DD DSN=C888090.ZIP.H,DISP=SHR +//TREES EXEC EDCC,COND=(12,LE),CREGSIZ='4M', +// INFILE='C888090.ZIP.C(TREES)', +// OUTFILE='C888090.ZIP.C.OBJ(TREES),DISP=SHR', +// CPARM='LONG,NOTERM,LIST,XREF,SOURCE,OPT(2),DEF(MVS)' +//COMPILE.USERLIB DD DSN=C888090.ZIP.H,DISP=SHR +//DEFLATE EXEC EDCC,COND=(12,LE),CREGSIZ='4M', +// INFILE='C888090.ZIP.C(DEFLATE)', +// OUTFILE='C888090.ZIP.C.OBJ(DEFLATE),DISP=SHR', +// CPARM='LONG,NOTERM,LIST,XREF,SOURCE,OPT(2),DEF(MVS)' +//COMPILE.USERLIB DD DSN=C888090.ZIP.H,DISP=SHR +//FILEIO EXEC EDCC,COND=(12,LE),CREGSIZ='4M', +// INFILE='C888090.ZIP.C(FILEIO)', +// OUTFILE='C888090.ZIP.C.OBJ(FILEIO),DISP=SHR', +// CPARM='LONG,NOTERM,LIST,XREF,SOURCE,OPT(2),DEF(MVS)' +//COMPILE.USERLIB DD DSN=C888090.ZIP.H,DISP=SHR +//GLOBALS EXEC EDCC,COND=(12,LE),CREGSIZ='4M', +// INFILE='C888090.ZIP.C(GLOBALS)', +// OUTFILE='C888090.ZIP.C.OBJ(GLOBALS),DISP=SHR', +// CPARM='LONG,NOTERM,LIST,XREF,SOURCE,OPT(2),DEF(MVS)' +//COMPILE.USERLIB DD DSN=C888090.ZIP.H,DISP=SHR +//UTIL EXEC EDCC,COND=(12,LE),CREGSIZ='4M', +// INFILE='C888090.ZIP.C(UTIL)', +// OUTFILE='C888090.ZIP.C.OBJ(UTIL),DISP=SHR', +// CPARM='LONG,NOTERM,LIST,XREF,SOURCE,OPT(2),DEF(MVS)' +//COMPILE.USERLIB DD DSN=C888090.ZIP.H,DISP=SHR +//CRC32 EXEC EDCC,COND=(12,LE),CREGSIZ='4M', +// INFILE='C888090.ZIP.C(CRC32)', +// OUTFILE='C888090.ZIP.C.OBJ(CRC32),DISP=SHR', +// CPARM='LONG,NOTERM,LIST,XREF,SOURCE,OPT(2),DEF(MVS)' +//COMPILE.USERLIB DD DSN=C888090.ZIP.H,DISP=SHR +//CRCTAB EXEC EDCC,COND=(12,LE),CREGSIZ='4M', +// INFILE='C888090.ZIP.C(CRCTAB)', +// OUTFILE='C888090.ZIP.C.OBJ(CRCTAB),DISP=SHR', +// CPARM='LONG,NOTERM,LIST,XREF,SOURCE,OPT(2),DEF(MVS)' +//COMPILE.USERLIB DD DSN=C888090.ZIP.H,DISP=SHR +//ZIPFILE EXEC EDCC,COND=(12,LE),CREGSIZ='4M', +// INFILE='C888090.ZIP.C(ZIPFILE)', +// OUTFILE='C888090.ZIP.C.OBJ(ZIPFILE),DISP=SHR', +// CPARM='LONG,NOTERM,LIST,XREF,SOURCE,OPT(2),DEF(MVS)' +//COMPILE.USERLIB DD DSN=C888090.ZIP.H,DISP=SHR +//ZIPUP EXEC EDCC,COND=(12,LE),CREGSIZ='4M', +// INFILE='C888090.ZIP.C(ZIPUP)', +// OUTFILE='C888090.ZIP.C.OBJ(ZIPUP),DISP=SHR', +// CPARM='LONG,NOTERM,LIST,XREF,SOURCE,OPT(2),DEF(MVS)' +//COMPILE.USERLIB DD DSN=C888090.ZIP.H,DISP=SHR +//CMSMVS EXEC EDCC,COND=(12,LE),CREGSIZ='4M', +// INFILE='C888090.ZIP.C(CMSMVS)', +// OUTFILE='C888090.ZIP.C.OBJ(CMSMVS),DISP=SHR', +// CPARM='LONG,NOTERM,LIST,XREF,SOURCE,OPT(2),DEF(MVS)' +//COMPILE.USERLIB DD DSN=C888090.ZIP.H,DISP=SHR +//MVS EXEC EDCC,COND=(12,LE),CREGSIZ='4M', +// INFILE='C888090.ZIP.C(MVS)', +// OUTFILE='C888090.ZIP.C.OBJ(MVS),DISP=SHR', +// CPARM='LONG,NOTERM,LIST,XREF,SOURCE,OPT(2),DEF(MVS)' +//COMPILE.USERLIB DD DSN=C888090.ZIP.H,DISP=SHR +//PLINK EXEC PROC=EDCPL,COND=(12,LE), +// OUTFILE='C888090.ZIP.LOAD(ZIP),DISP=SHR', +// PPARM='NONCAL,MAP', +// LPARM='LIST,MAP,XREF' +//SYSPRINT DD SYSOUT=* +//PLKED.SYSIN DD DSN=C888090.ZIP.C.OBJ(ZIP),DISP=SHR +// DD DSN=C888090.ZIP.C.OBJ(BITS),DISP=SHR +// DD DSN=C888090.ZIP.C.OBJ(CRYPT),DISP=SHR +// DD DSN=C888090.ZIP.C.OBJ(TREES),DISP=SHR +// DD DSN=C888090.ZIP.C.OBJ(DEFLATE),DISP=SHR +// DD DSN=C888090.ZIP.C.OBJ(FILEIO),DISP=SHR +// DD DSN=C888090.ZIP.C.OBJ(GLOBALS),DISP=SHR +// DD DSN=C888090.ZIP.C.OBJ(UTIL),DISP=SHR +// DD DSN=C888090.ZIP.C.OBJ(CRC32),DISP=SHR +// DD DSN=C888090.ZIP.C.OBJ(CRCTAB),DISP=SHR +// DD DSN=C888090.ZIP.C.OBJ(ZIPFILE),DISP=SHR +// DD DSN=C888090.ZIP.C.OBJ(ZIPUP),DISP=SHR +// DD DSN=C888090.ZIP.C.OBJ(CMSMVS),DISP=SHR +// DD DSN=C888090.ZIP.C.OBJ(MVS),DISP=SHR +//PLKED.SYSLIB DD DSN=SYS1.C370.SEDCBASE,DISP=SHR +// DD DSN=SYS1.PL1.SIBMBASE,DISP=SHR +//SYSUT1 DD UNIT=SYSDA,SPACE=(CYL,(2,2)),DISP=NEW diff --git a/cmsmvs/zipname.conven b/cmsmvs/zipname.conven new file mode 100644 index 0000000..e17fe9c --- /dev/null +++ b/cmsmvs/zipname.conven @@ -0,0 +1,200 @@ + + Zip file/directories name convention under MVS + --------------------------------------------------- + Draft 1.1 + + +1. Translating native file names to Zip filenames. + +1.1 Zipping a PDS + +On MVS there are directories called PDS (Partition Data Set) which have +the following format : name1.name2.name3(mname) +for example: myuserid.unzip.c(unzip) + +So as you see the path delimiter is '.'. Each dir name can be max 8 +chars long beginning with a number. + +Between '(' and ')' there is the so called member name - it is also 8 +chars long. This is the actual file name. + + +1.1.1 Converting MVS PDS name to zip path/filename (status: not implemented) + +The PDS name is converted to zippath as follows: +in the zip : name1/name2/mname.name3 +becomes on MVS: name1.name2.name3(mname) + + +1.2 Unzipping as PDS (status: implemented) + +When you unzip the file name myuserid/unzip/unzip.c the same process +is done backwards, so you get : myuserid.unzip.c(unzip) + +Notice that the file extension is used as last dirname! + + +1.2 Unzipping to a different PDS (status: implemented) + +You can also use -d option while unzipping for example: +unzip mytest myuserid/unzip/unzip.c -dnewdest.test + +then the new name will become: +newdest.test.myuserid.unzip.c(unzip) + + Second example: + +unzip mytest myuserid/unzip/*.c -dnewdest.test + +then you get a PDS: +newdest.test.myuserid.unzip.c(...) + +with all *.c files in it. + + +1.3 Zipping a Sequential Dataset (status: not implemented) + + Sequential dataset is a dataset with NO members. +Such a dataset is translated from native MVS to zip format by replacing +the '.' (points) with '/' (backslash). + +Example: +on MVS: name1.name2.name3 +becomes in the zip : name1/name2/name3 + +NOTE : The new filename in the zip has NO extension this way it can be + recognised as a Sequential dataset and not a PDS. + But this also means that all files in the zip archive that have + no extension will be unzipped as Sequential datasets! + + +1.4 Using a DDNAMES for input. (status: not implemented) + +To use DDNAMES as input file names put a 'dd:' before the ddname: +example: zip myzip dd:name1 dd:name2 dd:sales + +In the Zip archive the ddnames are saved as name.DDNAME so if you try +the example above you will get in your zip file (when listing it) : + +..size .. date time .. crc .. NAME1.DDNAME +..size .. date time .. crc .. NAME2.DDNAME +..size .. date time .. crc .. SALES.DDNAME + + +1.4 Using a DDNAMES as zip name (status: implemented) + +It is allowed to use a DDNAME as zipfile, just put dd: before it +example: unzip dd:myzip *.c + this will unzip all .c files from ddname myzip + +example2: ZIP DD:MYZIP DD:MANE1 MYSOURCE.C MYDOC.TEXT(ZIPPING) + this will zip ddname name1 file mysource.c and PDS mydoc.text(zipping) + into as a zip file in the ddname myzip + + +2. Converting longer path names (unix like) (status: not implemented) + to native MVS names. + +When in the zip archive there are dirnames longer that 8 chars they are +chopped at the 8 position. For example + MyLongZippath/WithLongFileName.text +is translated to: + MYLONGZI.TEXT(WITHLONG) + +Notice that all chars are converted to uppercase. + + +2.1 Using special characters (status: implemented) + +Also all '_' (underscore), '+' (plus), '-' (minus), '(' and ')' +from the file name/path in the zip archive are skipped because they +are not valid in the MVS filenames. + + +2.2 Numeric file names (status: not implemented) + +On MVS no name can begin with a number, so when a dir/file name begins with +one, a leading letter 'N' is inserted. For example: + Contents.512 +becomes: + CONTENTS.N512 + + + + + Zip file/directories name convention under VM/CMS + --------------------------------------------------- + +1. Translating native file names to Zip filenames. + +On VM/CMS (not ESA ) there are NO directories so you got only disks +and files. + +The file names are delimited with spaces. But for use with unzip/zip +you have to use '.' points as delimiters. + +For example on your A disk you have file called PROFILE EXEC +if you want to zip it type : zip myzip profile.exec + +If the same file is on your F disk you have to type: +zip myzip profile.exec.f + +So as you can see the general format is fname.ftype.fmode + +In the zipfile the disk from which the file comes is not saved! +So only the fname.ftype is saved. + +If you unzip and you want to give a different destination disk just use +the -d option like: + + unzip mytest *.c -df + +This will unzip all *.c files to your F disk. + + +2. Converting longer path names (unix like) to native VM/CMS names. + +When in the zip archive there are dirnames longer that 8 chars they are +chopped at the 8 position. Also the path is removed. For example + Zippath/WithLongFileName.text +is translated to: + WITHLONG.TEXT + +Notice that all chars are converted to uppercase. + +Also all '+' (plus), '-' (minus), '(' and ')' +from the file name/path in the zip archive are skipped because they +are not valid in the VM/CMS filenames. + +If there is no extension for the file name in the zip archive, unzip +will add .NONAME for example: + mypath/dir1/testfile +becomes: + TESTFILE.NONAME + +3. Future? + +There is also discussion for a new option on ZIP that you can give +a virtual directory to be added before each file name that is zipped. + +For example you want to zip a few .c file and put them in the zip +structure under the directory 'mydir/test', but you can't create dirs on +VM/CMS so you have to the something like: + +ZIP myzip file1.c file2.c -dmydir/test + +and you get in the zip archive files: + + mydir/test/file1.c + mydir/test/file2.c + +------------------------------------------------------------------------- + + +NOTE: Not all of those functions are implemented in the first beta + release of VM/MVS UNZIP/ZIP. + +Every ideas/corrections/bugs will be appreciated. +Mail to maillist: Info-ZIP@LISTS.WKU.EDU + +George Petrov diff --git a/cmsmvs/zipnote.exec b/cmsmvs/zipnote.exec new file mode 100644 index 0000000..0b9de97 --- /dev/null +++ b/cmsmvs/zipnote.exec @@ -0,0 +1,66 @@ +/***********************************************************************/ +/* */ +/* Front-end EXEC to set up linkage to the C runtime libraries */ +/* before executing a MODULE generated from C code. */ +/* */ +/* Copy this file as an EXEC with a filename matching the C MODULE. */ +/* */ +/* Greg Hartwig (ghartwig@vnet.ibm.com) 7/31/97, 4/24/98. */ +/* */ +/***********************************************************************/ +Address Command +Parse Arg argstring +Parse Source . . myname . + +/* Set output and input character translation so brackets show up */ +'SET OUTPUT AD' 'BA'x +'SET OUTPUT BD' 'BB'x +'SET INPUT BA AD' +'SET INPUT BB BD' + +Call CLIB +If rc<>0 Then Do + Say 'The required C runtime libraries don''t appear to be available.' + Say myname 'can not run.' + Exit 12 +End + +/* Run the command */ +myname argstring +Exit rc + + + + +/* Contents of the CLIB EXEC, modified for RC checking. */ +/* Removed TXTLIB setting. Only LOADLIB needed for execution. */ +CLIB: +/***************************************************/ +/* SET UP LIBRARIES FOR LE for MVS & VM */ +/***************************************************/ +Address COMMAND + +loadlib ='EDCLINK' /* C/370 runtime */ +loadlib ='SCEERUN' /* LE runtime */ + + +theirs=queued() /* old stack contentsM068*/ + 'QUERY LOADLIB ( LIFO' /* old setting M068*/ + LoadlibList='' /* init list M068*/ +rc=0 + Do while queued()^=theirs /* all lines from cmdM068*/ + Parse upper pull 'LOADLIB' '=' Ltemp /* get one line M068*/ + LoadlibList= Ltemp Loadliblist /* was stacked LIFO M068*/ + End /*M068*/ + If loadlibList='NONE' , + Then Do + 'GLOBAL LOADLIB' Loadlib /* enforce what we need */ + End + Else Do + Do xx=1 to Words(loadlib) + If Find(loadliblist,word(loadlib,xx)) = 0 , + then loadliblist = loadliblist word(loadlib,xx) + End + 'GLOBAL LOADLIB' loadliblist /* enforce what we need */ + End +Return diff --git a/cmsmvs/zipsplit.exec b/cmsmvs/zipsplit.exec new file mode 100644 index 0000000..0b9de97 --- /dev/null +++ b/cmsmvs/zipsplit.exec @@ -0,0 +1,66 @@ +/***********************************************************************/ +/* */ +/* Front-end EXEC to set up linkage to the C runtime libraries */ +/* before executing a MODULE generated from C code. */ +/* */ +/* Copy this file as an EXEC with a filename matching the C MODULE. */ +/* */ +/* Greg Hartwig (ghartwig@vnet.ibm.com) 7/31/97, 4/24/98. */ +/* */ +/***********************************************************************/ +Address Command +Parse Arg argstring +Parse Source . . myname . + +/* Set output and input character translation so brackets show up */ +'SET OUTPUT AD' 'BA'x +'SET OUTPUT BD' 'BB'x +'SET INPUT BA AD' +'SET INPUT BB BD' + +Call CLIB +If rc<>0 Then Do + Say 'The required C runtime libraries don''t appear to be available.' + Say myname 'can not run.' + Exit 12 +End + +/* Run the command */ +myname argstring +Exit rc + + + + +/* Contents of the CLIB EXEC, modified for RC checking. */ +/* Removed TXTLIB setting. Only LOADLIB needed for execution. */ +CLIB: +/***************************************************/ +/* SET UP LIBRARIES FOR LE for MVS & VM */ +/***************************************************/ +Address COMMAND + +loadlib ='EDCLINK' /* C/370 runtime */ +loadlib ='SCEERUN' /* LE runtime */ + + +theirs=queued() /* old stack contentsM068*/ + 'QUERY LOADLIB ( LIFO' /* old setting M068*/ + LoadlibList='' /* init list M068*/ +rc=0 + Do while queued()^=theirs /* all lines from cmdM068*/ + Parse upper pull 'LOADLIB' '=' Ltemp /* get one line M068*/ + LoadlibList= Ltemp Loadliblist /* was stacked LIFO M068*/ + End /*M068*/ + If loadlibList='NONE' , + Then Do + 'GLOBAL LOADLIB' Loadlib /* enforce what we need */ + End + Else Do + Do xx=1 to Words(loadlib) + If Find(loadliblist,word(loadlib,xx)) = 0 , + then loadliblist = loadliblist word(loadlib,xx) + End + 'GLOBAL LOADLIB' loadliblist /* enforce what we need */ + End +Return diff --git a/cmsmvs/zipup.h b/cmsmvs/zipup.h new file mode 100644 index 0000000..0ea8962 --- /dev/null +++ b/cmsmvs/zipup.h @@ -0,0 +1,18 @@ +/* + Copyright (c) 1990-1999 Info-ZIP. All rights reserved. + + See the accompanying file LICENSE, version 1999-Oct-05 or later + (the contents of which are also included in zip.h) for terms of use. + If, for some reason, both of these files are missing, the Info-ZIP license + also may be found at: ftp://ftp.cdrom.com/pub/infozip/license.html +*/ +#define fhow "r,byteseek" +#define fhowb "rb,byteseek" + +#define fbad NULL +typedef FILE *ftype; +#define zopen(n,p) (ftype)fopen((n),(p)) +#define zread(f,b,n) fread((b),1,(n),(FILE*)(f)) +#define zclose(f) fclose((FILE*)(f)) +#define zerr(f) ferror((FILE*)(f)) +#define zstdin stdin diff --git a/cmsmvs/zipvmc.exec b/cmsmvs/zipvmc.exec new file mode 100644 index 0000000..3232649 --- /dev/null +++ b/cmsmvs/zipvmc.exec @@ -0,0 +1,50 @@ +/* VMCOMPIL EXEC Unzip compile for VM/CMS */ +/* Author : George Petrov, 11 Apr 1995 */ + +signal on error + +parms = '(long def(VM_CMS)' + +/* Add local parms */ +parms = parms 'TARGET(COMPAT) SOURCE' + + +say 'Compiling TREES C...' +'cc trees c 'parms +say 'Compiling CRYPT C...' +'cc crypt c 'parms +say 'Compiling TTYIO C...' +'cc ttyio c 'parms +say 'Compiling DEFLATE C...' +'cc deflate c 'parms +say 'Compiling FILEIO C...' +'cc fileio c 'parms +say 'Compiling GLOBALS C...' +'cc globals c 'parms +say 'Compiling ZIP C...' +'cc zip c 'parms +say 'Compiling UTIL C...' +'cc util c 'parms +say 'Compiling CRC32 C...' +'cc crc32 c 'parms +say 'Compiling CRCTAB C...' +'cc crctab c 'parms +say 'Compiling ZIPFILE C...' +'cc zipfile c 'parms +say 'Compiling ZIPUP C...' +'cc zipup c 'parms +say 'Compiling CMSMVS C...' +'cc cmsmvs c 'parms +say 'Compiling CMS C...' +'cc cms c 'parms + +say 'Linking all files...' +'cmod zip zip trees crypt deflate fileio globals ttyio', + 'util crc32 crctab zipfile zipup cmsmvs cms' +say 'All Done!' +say "To run enter : ZIP parms" +exit rc + +error: +say 'Error durring compilation!' +exit rc |