Repository navigation
FTPD 1.3.0 is a minor release of the FTP server for MVS 3.8j (FTPD). It is a drop-in for an FTPD 1.2.0 that SMP installed: same data sets, same started task procedure, same APF entry, same FTPDPRM0. The FMID is TFTP130, and the install deletes TFTP120. Three things in it can stop an upgrade that is done without reading: the JES view now asks RAKF which jobs a user may see (without a profile, a user sees only the own jobs), the started task no longer switches to FTPD/USER at startup, and a text line longer than the record of the data set now fails the transfer instead of being cut. Besides that, it closes gaps in the SITE command set and repairs behaviour that was wrong, silent or hung.
FTPD 1.3.0 is built with LIBC/370 (libc370) 2.25.1 and CC/370 (cc370) 1.6.1 by the release workflow, which uses MBT (mbt) 3.0.0-rc1 as the build tool, and carries the UFSD client library (libufs) of UFSD 1.4.0, unchanged.
Read this first
Upgrading from 1.2.0 (installed by SMP). Install into the same data sets and skip the allocation job: the data sets exist, and the job would allocate them NEW. The APPLY ends COND CODE 0004 on HMA2461 SYSMOD TFTP120 NOT FOUND ON SMPSCDS LIBRARY. That is the expected result of a replacement, not a failure. MVS/CE is different: the FTPD 1.2.0 that comes with the MVS/CE image was not installed by SMP and has no FTPD.* data sets, so on MVS/CE the install is a first install as far as SMP and the data sets go. Run the allocation job, run the install job (its APPLY ends COND CODE 0000, no HMA2461), and replace the procedure of the image by the shipped one; the library of the image's procedure stays and is no longer used. From 1.1.0 or older, upgrade to 1.2.0 first (1.2.0 deletes TFTP110 only; on a system where TFTP100 still owns the load module the install copies nothing and ends RC 00).
Verify the install, not the return code. HMA2380 COPY SUCCESSFUL must be in the job log, and FTPD.LINKLIB must hold the member FTPD. After /S FTPD the startup messages must read:
FTPD000I FTPD 1.3.0 (6B6367D) STARTING
FTPD005I LIBC370 2.25.1 (FCDE4E8)
LIBC370 2.10.3 on the second line means the started task still runs 1.2.0.
What you must act on:
- Decide who may see the jobs of other users. The JES view asks the RAKF class
JESSPOOL. Before, every user could list, read and cancel the jobs of everybody. Now a user sees, reads and cancels only the own jobs, and the jobs of other users need a profile inJESSPOOL. The class exists from RAKF 2.0.0. On a RAKF without it (TK5 as shipped), FTPD 1.3.0 installs and runs, and each user sees only the own jobs. If an administrator or an operator relies on seeing all jobs, define the profiles on RAKF 2.0.0 or later before you upgrade.SITE JESOWNERwith another user ID or*needs the same right and answers501 JESOWNER is not permittedwithout it. - The started task keeps the identity RAKF gives it. FTPD 1.2.0 and earlier logged on as
FTPD/USERat startup, whatever RAKF assigned. FTPD 1.3.0 does not, and says which identity it runs under inFTPD004I(orFTPD004W). On a RAKF without a mapping by started-task name, such as TK5 before Update 6, the task now runs asSTC/STCGROUP. The group of theFTPDline inUSERSmust be allowed onFACILITY SVC244, or FTPD cannot obtain APF authorization (FTPD003W APF SETUP FAILED RC=4). The groupUSERof the 1.2.0 guide is not one the shipped profile allows. - A text line longer than the record of the data set fails.
STORandAPPEanswer451and remove a data set the command created. Before, FTPD cut the line without a word and answered250. A script that relied on the silent cut now fails.SITE TRUNCATEbrings the cutting back, and the250then says so. APPEappends. It adds to a sequential data set and creates what is missing; it refuses an existing member of a PDS. Before, it replaced the data set likeSTOR.SITE RDW, and aSITE SBSENDEOLother thanCRLF, answer501. Before, the answer was200and nothing changed.- Settings FTPD never used are now reported.
AUTHUSER,JESINTERFACELEVELand the lines of the formVOLSER,UNITinFTPDPRMare reported as ignored, in the log and with one console messageFTPD062W.CONFIGno longer writesFTPD047IandFTPD048I. - An FTPD that is not authorized answers
PASSwith530. Before,PASSgot no answer at all and the session was closed after the third one.FTPD003Wat startup still means the install is not finished. - The started task procedure no longer needs the
HASPCKPTandHASPACE1DD statements. FTPD finds the JES2 checkpoint and the spool itself. Keep a statement only when it is needed (anotherDSNPRFX, or a checkpoint that is neither cataloged nor on an online volume). A statement that names the wrong data set or volume now breaks every JES command with451.
Known issue: a comment card before the JOB statement takes the job's credentials (ftpd#277). When a job is stored to the JES view, FTPD takes the first card that has the word JOB between blanks for the JOB statement. A comment card such as //* RUN THE JOB NOW ahead of the real JOB statement matches, so NOTIFY, USER and PASSWORD are appended to the comment and the real JOB statement gets none. The job does not run under your identity. Workaround: put no card with the word JOB between blanks before the JOB statement, and write no comment with it. Planned for 1.4.0.
What changed
| before (1.2.0) | now (1.3.0) | |
|---|---|---|
| jobs in the JES view | every user lists, reads and cancels every job | own jobs only; others by JESSPOOL profile (#90) |
| identity of the started task | switched to FTPD/USER at startup (#179) |
keeps the identity RAKF gives it, named in FTPD004I |
MAXSESSIONS of 1, 2 or 3 |
no session ever starts: connections queue, no worker wakes (#168) | one worker per allowed session; the sessions run |
| connection refused by the worker pool | control connection stays open, session never freed (#177) | 421 and the connection is closed |
| burst of clients | one connection accepted per look, one look a second: ten clients greeted over about ten seconds (#209) | every waiting connection accepted at each look: greeted within about a second |
STOR/APPE into a data set under retention |
session waits for an operator reply to IEC507D (#198) |
550 with the expiration date |
same, expiration date 99000 |
the same wait (#204) | the same 550 |
STOR/APPE of a member into a PDS with a full directory |
451, and a retry fails the same way (#173) |
552 with the remedy |
after a STOR failed on a full PDS directory |
the old name stays allocated to the started task; MKD of it answers 550; P FTPD ends with abend SA0A (#194, #223) |
data set can be renamed, its old name created again, and P FTPD ends cleanly |
| listing that runs out of storage | empty list (#118) | 451 Insufficient storage to list ... |
STATS |
a transfer of a data set counted two to three times, running sessions included (#206) | each byte once, ended sessions only |
| download of more than 256 bytes per call | exposed to the X'75' restart defect on the send side (#137) | fixed by LIBC/370 2.24.0 and later |
text STOR into a VB/VBA data set |
record boundaries lost (#185) | one record per line |
text STOR into a RECFM=U data set |
all lines stored as one record (#245) | one block per line; RETR sends one line per block |
STOR that ends in E37 |
the DD numbers stay allocated, a batch job with DISP=OLD on the data set waits until FTPD ends, and P FTPD logs further IEC032I E37-04 (#265) |
DCB, allocation and ENQ are released and the session goes on |
| UFS create without free inodes | 452 |
552, the condition is permanent (#151) |
SITE keywords |
PRI=5 is an unknown word; keywords are case-sensitive |
shortest forms accepted; case does not matter (#130, #189) |
SITE JESSTATUS |
any value stored, every job listed | ALL, INPUT, ACTIVE or OUTPUT filter the list, RETR and DELE |
get or delete of a job ID such as JOB* |
550 Jobid ... not found ... from JES2 |
501 Invalid job ID before JES2 is asked (#267) |
Measured on MVS by the acceptance run of the release candidate, on TK5 and MVS/CE systems started for the test: a burst of clients was greeted within 0.97 seconds at most; STATS counted 80000 bytes for a transfer of 80000 bytes; a SITE RETPD above MAXRETPD was answered 501; after an E37 on STOR the DCB, the allocation and the ENQ were released and the session went on. The E37 row of 1.2.0 was measured on a throwaway system with 1.2.0 and with the same data set filled up. The rows for the connection refused by the worker pool (#177), the listing that runs out of storage (#118), the UFS inodes (#151), FTPD077E and the download of more than 256 bytes per call (the X'75' defect, #137, fixed in LIBC/370) are covered by the unit tests of the release; they were not exercised on a running system.
| 1.2.0 | 1.3.0 | |
|---|---|---|
| FMID | TFTP120 |
TFTP130, deletes TFTP120 |
| Libraries | FTPD.LINKLIB, FTPD.SAMPLIB, FTPD.AFTPDLOD |
unchanged |
| C library | LIBC/370 2.10.3 | LIBC/370 2.25.1, CC/370 1.6.1 |
| libufs (UFSD) | 1.4.0 | 1.4.0, unchanged |
| RAKF | 1.2.x or 2.0.0 | 1.2.x or 2.0.0; 2.0.0 or later to let users see the jobs of others (JESSPOOL) |
Install
The release has three assets (the files you install from):
| Asset | What it is |
|---|---|
ftpd-1.3.0-dist.zip, ftpd-1.3.0-dist.tar.gz |
the distribution archive, the same content in two formats; download this one |
ftpd-1.3.0-load.xmit |
the FTPD load module as a TSO RECEIVE-ready XMIT (also inside the archive) |
Unpack the archive and follow its README.md, which is the installation guide of this release. The archive holds:
| File | What it is |
|---|---|
README.md |
the installation guide |
ftpd-1.3.0-load.xmit |
the FTPD load module |
ftpd-1.3.0-samplib.xmit |
the started task procedure and the configuration pattern |
ftpd-1.3.0-alloc.jcl |
allocates the data sets: first install only |
ftpd-1.3.0-inst.jcl |
receives, applies and accepts the SYSMOD |
These are the SHA-256 sums of the published files, computed from the files downloaded from this release:
| Asset | SHA-256 |
|---|---|
ftpd-1.3.0-dist.zip |
8802bdd966b50cd75c8ba6a20f7c547d58bf6f66ec3e890c8cefdf2b229247ff |
ftpd-1.3.0-dist.tar.gz |
c5f14bd492b242e831dd369f0a406d154a09e0396d0bd856b8748b1c89c7e04b |
ftpd-1.3.0-load.xmit |
7a7dc277cf6f3c8220f51b2d436e58fd76beb4a6209f2aa36195cd5a6c536e9b |
The build that was tested and accepted is the commit 6b6367d; the files above come from the release workflow's own build of that commit, and the startup banner shows the same 6B6367D. The release also carries the two books as PDF, and a file SHA256SUMS with the sum of every file of the release (check with sha256sum -c SHA256SUMS):
| Attached to the release | What it is |
|---|---|
ml06-0001-0.pdf |
FTPD User's Guide (draft) |
ml06-0002-0.pdf |
FTPD Reference (draft) |
SHA256SUMS |
SHA-256 of the three assets and the two PDFs |
Which path applies
- First install: the guide, sections 1 to 9.
- Upgrade from 1.2.0, installed by SMP: section 2a of the guide, "Upgrading from 1.2.0". Stop FTPD, skip the allocation job, run the install job, start FTPD and read the banner.
- Upgrade from 1.1.0 or older: to 1.2.0 first, following the guide of that release; then this page.
- MVS/CE ships an FTPD 1.2.0 that SMP never saw and that has no
FTPD.*data sets. Stop it, then take the first install, with the allocation job; theAPPLYendsCOND CODE 0000, not0004. Skipping the allocation job there ends in a JCL error. - TK5: the shipped procedure defaults to
SYS2.PARMLIB, which does not exist on TK5. Put the member inSYS1.PARMLIBand start with/S FTPD,D='SYS1.PARMLIB'(guide, step 7).SYS1.PARMLIBon a fresh TK5 has no free space behind its members, so the copy ends inD37-04until the library is compressed; the guide shows how. Before TK5 Update 6 RAKF has no mapping by started-task name: see "What you must act on". - Remove FTPD:
docs/uninstall.mdof this release. The dummy functionTFTPDELdeletes every id FTPD ever had (TFTP100,TFTP110,TFTP120,TFTP130) in one run.
The guides at the tag: installation, removal, RAKF setup, including the JESSPOOL profiles (section 7).
Changes
Changed (behaviour; see "What you must act on")
- JES spool authorization by the RAKF class
JESSPOOL;SITE JESOWNERneeds the same right and compares the whole owner, not a prefix; a value longer than eight characters is refused, not cut (#90). - The started task no longer switches identity at startup (#179).
- A text line longer than the record fails
STOR/APPEwith451;SITE TRUNCATErestores the cutting. APPEappends (#153).SITE RDWandSITE SBSENDEOLother thanCRLFanswer501(#207).- Values of
SITE JESJOBNAME,JESOWNERandJESSTATUSare upper case whatever the client typed (#189). - A connection refused by the worker pool is answered with
421and closed (#177). - A FTPD that is not authorized answers
PASSwith530. - The
HASPCKPTandHASPACE1DD statements are optional.
Added
SITE RETPD=dayssets the retention period of data sets thatMKDandSTORcreate;MAXRETPDinFTPDPRMlimits it, and a larger value is answered with501(#130, #201).DEFDIRECTORYsets the directory blocks of a PDS thatMKDcreates (default 10, as before) (#130).SITEaccepts the shortest forms of its keywords (#130).SITE DCBDSN=dsntakes record format, record length and block size of a cataloged data set for the data sets that follow (#130, #180).SITE JESSTATUSfilters the job list,RETRandDELEof the JES view (#207).FTPD062W(settings reported as ignored),FTPD077E(the reset of the identity ended in an ABEND during a recovery).- Removal by the dummy function
TFTPDEL, which deletes every FMID FTPD has ever used; the upgrade and removal guides rewritten (#152, #224); the install guide closes the gaps found installing 1.2.0 on four systems (#175). - The FTPD User's Guide and Reference (ML06-0001, ML06-0002) in
docs/books/, with a section for every behaviour change of this release.
Fixed
MAXSESSIONSof 1, 2 or 3 starts sessions (#168; needs LIBC/370 2.25.1).- Session and socket no longer leak when the accept loop cannot queue a connection (#177).
- The listener takes every waiting connection at each look (#209).
- No wait for an operator reply to
IEC507Don a data set under retention or with the expiration date99000(#198, #204). 552instead of451for a member upload into a PDS with a full directory (#173), and the data set can be renamed and its old name reused afterwards, and the stop no longer ends with abend SA0A (#194, #223).RETRkeeps its current-file pointer until the close has returned, so an ABEND in CLOSE no longer leaves the DD allocated (#233).STORthat ends inE37leaves no allocation behind (#265).FTPD076Wno longer reports a DD as held when it is free (#232).- A listing that runs out of storage answers
451and not an empty list (#118). STATScounts each byte once (#206).- Downloads are no longer exposed to the X'75' restart defect on the send side (#137).
- Text
STORintoVB/VBAdata sets keeps record boundaries (#185); intoRECFM=Udata sets stores one block per line (#245). - A UFS file system without free inodes answers
552(#151). SITEcommands are case-insensitive (#189).getanddeleteof the JES view check the shape of the job ID (#267); the ERR log lines of a client that tries many bad job IDs are limited per session (#269).- Settings accepted with
200or at startup but never used are reported (#207).
Not changed
FEATlistsSIZEandMDTM, and the MVS view answers both with502while the UFS view answers213. This is on purpose: a client readsFEATonce after the login, in the MVS view. It is now documented and pinned by a test (#208).- A second JOB card in a stored job stream: the behaviour stays, and the guide says whose rights such a job gets (#270).
- Load module is
AC(1); the library and APF requirements of the installation are unchanged.
Known issues
- A comment card ahead of the JOB statement takes the job's credentials (#277); see "Read this first". Planned for 1.4.0.