Skip to content

FTPD 1.3.0

Latest

Choose a tag to compare

@github-actions github-actions released this 22 Oct 19:26
· 23 commits to main since this release
6b6367d

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 in JESSPOOL. 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 JESOWNER with another user ID or * needs the same right and answers 501 JESOWNER is not permitted without it.
  • The started task keeps the identity RAKF gives it. FTPD 1.2.0 and earlier logged on as FTPD/USER at startup, whatever RAKF assigned. FTPD 1.3.0 does not, and says which identity it runs under in FTPD004I (or FTPD004W). On a RAKF without a mapping by started-task name, such as TK5 before Update 6, the task now runs as STC/STCGROUP. The group of the FTPD line in USERS must be allowed on FACILITY SVC244, or FTPD cannot obtain APF authorization (FTPD003W APF SETUP FAILED RC=4). The group USER of the 1.2.0 guide is not one the shipped profile allows.
  • A text line longer than the record of the data set fails. STOR and APPE answer 451 and remove a data set the command created. Before, FTPD cut the line without a word and answered 250. A script that relied on the silent cut now fails. SITE TRUNCATE brings the cutting back, and the 250 then says so.
  • APPE appends. 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 like STOR.
  • SITE RDW, and a SITE SBSENDEOL other than CRLF, answer 501. Before, the answer was 200 and nothing changed.
  • Settings FTPD never used are now reported. AUTHUSER, JESINTERFACELEVEL and the lines of the form VOLSER,UNIT in FTPDPRM are reported as ignored, in the log and with one console message FTPD062W. CONFIG no longer writes FTPD047I and FTPD048I.
  • An FTPD that is not authorized answers PASS with 530. Before, PASS got no answer at all and the session was closed after the third one. FTPD003W at startup still means the install is not finished.
  • The started task procedure no longer needs the HASPCKPT and HASPACE1 DD statements. FTPD finds the JES2 checkpoint and the spool itself. Keep a statement only when it is needed (another DSNPRFX, 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 with 451.

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; the APPLY ends COND CODE 0000, not 0004. 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 in SYS1.PARMLIB and start with /S FTPD,D='SYS1.PARMLIB' (guide, step 7). SYS1.PARMLIB on a fresh TK5 has no free space behind its members, so the copy ends in D37-04 until 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.md of this release. The dummy function TFTPDEL deletes 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 JESOWNER needs 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/APPE with 451; SITE TRUNCATE restores the cutting.
  • APPE appends (#153).
  • SITE RDW and SITE SBSENDEOL other than CRLF answer 501 (#207).
  • Values of SITE JESJOBNAME, JESOWNER and JESSTATUS are upper case whatever the client typed (#189).
  • A connection refused by the worker pool is answered with 421 and closed (#177).
  • A FTPD that is not authorized answers PASS with 530.
  • The HASPCKPT and HASPACE1 DD statements are optional.

Added

  • SITE RETPD=days sets the retention period of data sets that MKD and STOR create; MAXRETPD in FTPDPRM limits it, and a larger value is answered with 501 (#130, #201).
  • DEFDIRECTORY sets the directory blocks of a PDS that MKD creates (default 10, as before) (#130).
  • SITE accepts the shortest forms of its keywords (#130).
  • SITE DCBDSN=dsn takes record format, record length and block size of a cataloged data set for the data sets that follow (#130, #180).
  • SITE JESSTATUS filters the job list, RETR and DELE of 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

  • MAXSESSIONS of 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 IEC507D on a data set under retention or with the expiration date 99000 (#198, #204).
  • 552 instead of 451 for 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).
  • RETR keeps its current-file pointer until the close has returned, so an ABEND in CLOSE no longer leaves the DD allocated (#233).
  • STOR that ends in E37 leaves no allocation behind (#265).
  • FTPD076W no longer reports a DD as held when it is free (#232).
  • A listing that runs out of storage answers 451 and not an empty list (#118).
  • STATS counts each byte once (#206).
  • Downloads are no longer exposed to the X'75' restart defect on the send side (#137).
  • Text STOR into VB/VBA data sets keeps record boundaries (#185); into RECFM=U data sets stores one block per line (#245).
  • A UFS file system without free inodes answers 552 (#151).
  • SITE commands are case-insensitive (#189).
  • get and delete of 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 200 or at startup but never used are reported (#207).

Not changed

  • FEAT lists SIZE and MDTM, and the MVS view answers both with 502 while the UFS view answers 213. This is on purpose: a client reads FEAT once 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.