HCON Library
File Transfer Library (libfxfer.a)
C (libg3270.a)
Pascal (libg3270p.a)
Fortran (libg3270f.a)
#include <g32_api.h> #include <fxfer.h>
g32_fxfer (as, xfer) struct g32_api *as; struct fxc *xfer;
const %include /usr/include/g32const.inc %include /usr/include/g32fxconst.inc type %include /usr/include/g32types.inc %include /usr/include/fxhfile.inc
function g32fxfer(var as : g32_api; var xfer : fxc) : integer; external;
INTEGER G32FXFER, RC, AS(9) EXTERNAL G32FXFER CHARACTER*XX SRCF, DSTF, INPUTFLD, CODESET INTEGER FLAGS,RECL,BLKSIZE,SPACE,INCR,UNIT
RC = G32FXFER(AS,SCRF, DSTF, FLAGS, RECL, BLKSIZE, SPACE, + INCR, UNIT, INPUTFLD, CODESET)
The g32_fxfer function allows a file transfer to take place within an API program without the API program having to invoke a g32_close and relinquish the link. The file transfer is run in a programmatic fashion, meaning the user must set up the flag options, the source file name, and the destination file name using either the programmatic fxfer fxc structure for C and Pascal or the numerous variables for FORTRAN. The g32_fxfer function will detach from the session without terminating it, run the specified file transfer, and then reattach to the session.
If a g32_alloc function has been issued before invoking the g32_fxfer command, be sure that the corresponding g32_dealloc function is incorporated into the program before the g32_fxfer function is called.
The status of the file transfer can be checked by using the cfxfer file-transfer status check function after the g32_fxfer function has been invoked.
HCON application programs using the Pascal language interface must include and link both the C and Pascal libraries. Application programs using the FORTRAN language for the HCON API must include and link both the C and FORTRAN libraries.
as | Specifies a pointer to the g32_api structure. Status is returned in this structure. |
xfer | Specifies a pointer to the fxc structure defined in the fxfer.h file. |
as | Specifies a record of type g32_api. |
xfer | Specifies a record of type fxc within the fxfer.inc file. |
Notes:
0 | Indicates successful completion. The user may call the cfxfer function to get the status of the file transfer. |
1 | Indicates the file transfer did not complete successfully. The user may call the cfxfer function to get the status of the file transfer. |
-1 | Indicates the g32_fxfer command failed while accessing the link. The errcode field in the g32_api structure is set to an error code identifying the error. The xerrinfo field can be set to give more information about the error. |
The following example fragment illustrates the use of the g32_fxfer function in an api_3270 mode program in C language:
#include <g32_api.h> /* API include file */ #include <fxfer.h> /* file transfer include file */ main() { struct g32_api *as,asx; struct fxc *xfer; struct fxs sxfer; int session_mode=MODE_3270; char *aixfile="/etc/motd"; char *hostfile="test file a"; char sessionname[30],uid[30],pw[30]; int mlog=0,ret=0; as = &asx; sessionname = '\0'; /* We are assuming SNAME is set */ . . ret=g32_open(as,mlog,uid,pw,sessionname); printf("The g32_open return code = %d\n",ret); . . /* Malloc space for the file transfer structure */ xfer = (struct fxc *) malloc(2048); /* Set the file transfer flags to upload, replace, translate and Host CMS */ xfer->fxc_opts.f_flags = FXC_UP | FXC_REPL | FXC_TNL | FXC_CMS; xfer->fxc_opts.f_lrecl = 80; /* Set the Logical Record length to 80 */ xfer->fxc_opts.f_inputfld = (char *)0; /* Set Input Field to NULL */ xfer->fxc_opts.f_aix_codepg = (char *)0; /* Set Alternate Codepg to NULL */ xfer->fxc_src = aixfile; /* Set the Source file name to aixfile */ xfer->fxc_dst = hostfile; /* Set the Destination file name to hostfile */ ret=g32_fxfer(as,xfer); printf("The g32_fxfer return code = %d\n",ret); /* If the file transfer completed then get the status code of the file transfer */ if ((ret == 0) || (ret == 1)) { ret = cfxfer(&sxfer); if (ret == 0) { printf("Source file: %s\n",sxfer.fxs_src); printf("Destination file: %s\n", \ sxfer.fxs_dst); printf("Byte Count: %d\n",sxfer.fxs_bytcnt); printf("File transfer time: %d\n",sxfer.fxs_ctime); printf("Status Message Number: %d\n",sxfer.fxs_stat); printf("System Call error number:%d\n",sxfer.fxs_errno); } } . . . ret=g32_close(as); printf("The g32_close return code = %d\n",ret); return(0); }
The following example fragment illustrates the use of the g32_fxfer function in an api_3270 mode program in Pascal language.
program test1(input,output); const%include /usr/include/g32const.inc %include /usr/include/fxconst.inc type %include /usr/include/g32hfile.inc %include /usr/include/g32types.inc %include /usr/include/fxhfile.inc var as:g32_api; xfer:fxc; sxfer:fxs; ret,sess_mode,flag:integer; session,timeout,uid,pw:stringptr; source,destination:stringptr; begin sess_mode = MODE_3270; flag := 0; { Initialize API stringptrs and create space } new(uid,8); uid@ := chr(0); new(pw,8); pw@ := chr(0); new(session,2); session@ := 'a'; { Open session a } new(timout,8); timeout := '60'; { Call g32openx and open session a } ret := g32openx(as,flag,uid,pw,session,timeout); writeln('The g32openx return code = ',ret:4); . . . { Set up the file transfer options and file names } new(source,1024); source := 'testfile'; { Source file, assumes testfile exists in the current directory } new(destination,1024); destination := 'testfile'; { Destination file, TSO file testfile } { Set flags to Upload, Replace, Translate and Host TSO } xfer.fxc_opts.f_flags := FXC_UP + FXC_TSO + FXC_REPL + \ FXC_TNL; xfer.fxc_src := source; xfer.fxc_dst := destination; {Call the g32_fxfer using the specified flags and file names} ret := g32fxfer(as,xfer); writeln('The g32fxfer return code = ',ret:4); { If g32_fxfer returned with 1 or 0 call the file transfer \ status check function } if (ret >= 0) then begin ret := pcfxfer(sxfer); if (ret = 0) then begin writeln('Source file: ',sxfer.fxs_src@); writeln('Destination file: ',sxfer.fxs_dst@); writeln('File Transfer Time: ',sxfer.fxs_ctime@); writeln('Byte Count: ',sxfer.fxs_bytcnt); writeln('Status Message Number: ',sxfer.fxs_stat); writeln('System Call Error Number: ',sxfer.fxs_errno); end; end; . . . { Close the session using the g32close function } ret := g32close(as); writeln('The g32close return code = ',ret:4); end.
The following example fragment illustrates the use of the g32_fxfer function in an api_3270 mode program in FORTRAN language:
INTEGER G32OPENX,G32FXFER,G32CLOSE,FCFXFER INTEGER RET,'AS(9)FLAG EXTERNAL G32OPENX EXTERNAL G32FXFER EXTERNAL G32CLOSE EXTERNAL FCFXFER CHARACTER*8 UID CHARACTER*8 PW CHARACTER*2 SESSION CHARACTER*8 TIMEOUT CHARACTER*256 SRCF CHARACTER*256 DSTF CHARACTER*256 SRC CHARACTER*256 DST CHARACTER*64 INPUTFLD CHARACTER*8 CODESET CHARACTER*40 TIME INTEGER BYTCNT,STAT,ERRNO,TIME INTEGER FLAGS,RECL,BLKSIZE,SPACE,INCR,UNIT C Set up all FORMAT statement 1 FORMAT("THE G32OPENX RETURN CODE = ",I4) 2 FORMAT("THE G32FXFER RETURN CODE = ",I4) 3 FORMAT("THE G32CLOSE RETURN CODE = ",I4) 4 FORMAT("THE FCFXFER RETURN CODE = ",I4) 5 FORMAT("--------------------------------------") 10 FORMAT("SOURCE FILE: ",A) 11 FORMAT("DESTINATION FILE: ",A) 12 FORMAT("BYTE COUNT: ",I10) 13 FORMAT("TIME: ",A) 14 FORMAT("STATUS MESSAGE NUMBER: ",I10) 15 FORMAT("SYSTEM CALL ERROR NUMBER: ",I10) C Set up all character values for the G32OPENX command UID = CHAR(0) PW = CHAR(0) SESSION = 'z'//CHAR(0) TIMEOUT = '60'//CHAR(0) FLAG = 0 SRCF = 'testcase1'//CHAR(0) DSTF = '/home/test.case1'//CHAR(0) C Source and Destination files for the fcfxfer status C check command SRC = CHAR(0) DST = CHAR(0) C Set Input Field to NULL INPUTFLD = CHAR(0) C Set Alternate AIX codeset to NULL CODESET = CHAR(0) C Set the G32FXFER file transfer flags and options C Take the defaults for Logical Record Length, Block Size, C and Space RECL = 0 BLKSIZE = 0 SPACE = 0 C Set FLAGS to download (2), translate(4), and Host TSO(1024) FLAGS = 1030 C Call G32OPENX RET = G32OPENX(AS,FLAG,UID,PW,sessionname,TIMEOUT) WRITE(*,1) RET . . . C Call G32FXFER RET = G32FXFER(AS,SRCF,DSTF,FLAGS,RECL,BLKSIZE,SPACE + INCR,UNIT,INPUTFLD,CODESET) WRITE(*,2) RET . . . C Call G32CLOSE RET = G32CLOSE(AS) WRITE(*,3) RET C Call FCFXFER for file transfer status output RET = FCFXFER(SRC,DST,BYTCNT,STAT,ERRNO,TIME) WRITE(*,4) RET WRITE(*,5) WRITE(*,10) SRC WRITE(*,11) DST WRITE(*,12) BYTCNT WRITE(*,13) TIME WRITE(*,14) STAT WRITE(*,15) ERRNO WRITE(*,5) STOP END
The g32_fxfer function is part of the Host Connection Program (HCON).
The g32_fxfer function requires one or more adapters used to connect to a host.
This function requires that the Host-Supported File Transfer Program (IND$FILE or its equivalent) be installed on the host.
/usr/include/fxfer.h | Contains the file-transfer include file with structures and definitions for C. |
/usr/include/fxconst.inc | Contains the Pascal fxfer function constants. |
/usr/include/fxhfile.inc | Contains Pascal file-transfer invocation include file. |
/usr/include/g32_api.h | Contains data structures and associated symbol definitions. |
/usr/include/g32const.inc | Defines Pascal API constants. |
/usr/include/g32hfile.inc | Defines Pascal API external definitions. |
/usr/include/g32types.inc | Defines Pascal API data types. |