Right now, I'm trying to upload and download files with variable record lengths from an IBM mainframe running zOS 2.1. Like this guy: How to FTP a variable length file from linux to mainframe z/OS
curl --user "******" --verbose --silent --show-error "ftp://themainframe/'SOME.FILE.NAME'" | hexdump
0000000 dead cafe babe
0000006
curl --user "******" --quote "site RDw" --verbose --silent --show-error "ftp://themainframe/'SOME.FILE.NAME'" | hexdump
0000000 000a 0000 dead cafe babe
000000a
It looks good. The rdw is "000a 0000" and the record "dead cafe babe". But. If I upload it again - even while using "quote site RDw" the server will ignore the RDW and store it as part of the actual data.
curl --user "******" --quote "site RDw" --verbose --silent --show-error "ftp://themainframe/'SOME.FILE.NAME'" > SOME.FILE.NAME
cat SOME.FILE.NAME | curl --user "******" --upload-file "-" --quote "site RDw" --verbose --silent --show-error "ftp://themainframe/'SOME.FILE.NAME'"
0000000 000c 0000 0008 0000 dead beef
000000c
Since that's not what I wanted, I searched some more. And - I found this article: http://www-01.ibm.com/support/docview.wss?uid=swg21188301
And gave it another try.
curl --user "******" --quote "TYPE E" --quote "MODE B" --verbose --silent --show-error "ftp://themainframe/'SOME.FILE.NAME'" | hexdump
0000000 4000 04de adbe ef00
0000007
That looked interesting. So I compared it with another file, containing a larger dataset...
0000000 4002 cbdc...
00002ce
And another one...
0000000 8000 16f0...
0000019 4000 16f0...
0000032
My first impression is: An 80 seems to indicate that there will be more datasets, whereas the 40 indicates the last one. That seemed to be true for every file I tried. For a normal file with variable record lengths as well as for a blocked file withe variable record lengths.
So I tried to upload it again...
curl --user "******" --quote "TYPE E" --quote "MODE B" --verbose --silent --show-error "ftp://themainframe/'SOME.FILE.NAME'" > SOME.FILE.NAME
cat SOME.FILE.NAME | curl --user "******" --upload-file "-" --quote "TYPE E" --quote "MODE B" --verbose --silent --show-error "ftp://themainframe/'SOME.FILE.NAME'"
And it seemed to work
Well - at least now I'm able to transfer files with variable record lengths from and to the mainframe while preserving the record lengths.
But - and here is the question: Is the first byte of each record "only" an indicator for wheather there will be more data sets? Or am I missing something?
The first byte of a variable block record is the record length, so that's what you are seeing