How to retrieve stream file stat Information using C stat API in RPGLE |
What is stat() API?
The stat() function gets information about a stream file in the IFS such as file size, access permissions, and the time it was last modified etc.
Prototype for the stat() API in C Language
int stat(const char *path, struct stat *buf);
- The stat() function gets status information about a specified file.
- The return value is an int (integer) and values are 0 which indicate success, or -1 if an error occurred.
- const char *path:First parameter is input path. A pointer to the null-terminated path name of the object from which information is required.
- struct stat *buf:Second parameter is output buf. A pointer to the stat data structure. For this parameter we need to create a data structure same as stat data structure in C.
Prototype for the stat() API in RPG
D stat PR 10I 0 ExtProc('stat') D ifspath * value options(*string) D statds * value
Layout of the stat data structure in C Language
struct stat { mode_t st_mode; // File mode ino_t st_ino; // File serial number nlink_t st_nlink; // Number of links uid_t st_uid; // User ID of the owner of file gid_t st_gid; // Group ID of the group of file off_t st_size; // For regular files, the file (size in bytes) time_t st_atime; // Time of last access time_t st_mtime; // Time of last data modification time_t st_ctime; // Time of last file status change dev_t st_dev; // ID of device containing file size_t st_blksize; // Size of a block of the file unsigned long st_allocsize; // Allocation size of the file qp0l_objtype_t st_objtype; // AS/400 object type unsigned short st_codepage; // Object data codepage char st_reserved1[62]; // Reserved unsigned int st_ino_gen_id // file serial number generation id };
Above defined is the structure definition of stat data structure in C language. You can refer more about stat data structure layout from the IBM documentation.
Layout of the stat data structure in RPG
D statds DS D filemode 10U 0 D fileid 10U 0 D Numoflinks 5U 0 D reserved2 5U 0 D useridofowner 2A D grpidofgroup 10U 0 D regularfiles 10U 0 D size 10I 0 D time_access 10I 0 D time_change 10I 0 D time_stschang 10I 0 D filesysid 10U 0 D blocksize 10U 0 D allocatedsize 10U 0 D objecttype 12A D codepage 5U 0 D ccsid 5U 0 D reserved1 62A D generationid 10U 0
RPGLE program for retrieve stream file stat
RPG Code in Fixed format to retrieve stream file stat Information using C stat() API in RPGLE.
HDFTACTGRP(*NO) D stat PR 10I 0 ExtProc('stat') D ifspath * value options(*string) D statds * value D errorifs PR * ExtProc('__errno') D strerror PR * ExtProc('strerror') D error_num 10I 0 value * Difspath s 512a Dreturn_stat s 10i 0 inz Derror_ptr S * Derror_num S 10I 0 based(error_ptr) Derrormsg_ptr S * Derror_msg S 500a based(errormsg_ptr) D statds DS D filemode 10U 0 D fileid 10U 0 D Numoflinks 5U 0 D reserved2 5U 0 D useridofowner 2A D grpidofgroup 10U 0 D regularfiles 10U 0 D size 10I 0 D time_access 10I 0 D time_change 10I 0 D time_stschang 10I 0 D filesysid 10U 0 D blocksize 10U 0 D allocatedsize 10U 0 D objecttype 12A D codepage 5U 0 D ccsid 5U 0 D reserved1 62A D generationid 10U 0 C EVAL ifspath = '/home/easyclass/helloworld' C EVAL return_stat = stat(%trim(ifspath): C %addr(statds)) C IF return_stat < 0 C EVAL error_ptr = errorIFS() C EVAL errormsg_ptr = strerror(error_num) C ENDIF C EVAL *inlr = *ON C RETURN
RPG Code in /Free and /End-Free format to retrieve stream file stat Information using C stat() API in RPGLE.
HDFTACTGRP(*NO) D stat PR 10I 0 ExtProc('stat') D ifspath * value options(*string) D statds * value D errorifs PR * ExtProc('__errno') D strerror PR * ExtProc('strerror') D error_num 10I 0 value * Difspath s 512a Dreturn_stat s 10i 0 inz Derror_ptr S * Derror_num S 10I 0 based(error_ptr) Derrormsg_ptr S * Derror_msg S 500a based(errormsg_ptr) D statds DS D filemode 10U 0 D fileid 10U 0 D Numoflinks 5U 0 D reserved2 5U 0 D useridofowner 2A D grpidofgroup 10U 0 D regularfiles 10U 0 D size 10I 0 D time_access 10I 0 D time_change 10I 0 D time_stschang 10I 0 D filesysid 10U 0 D blocksize 10U 0 D allocatedsize 10U 0 D objecttype 12A D codepage 5U 0 D ccsid 5U 0 D reserved1 62A D generationid 10U 0 /free ifspath = '/home/easyclass/helloworld'; return_stat = stat(%trim(ifspath): %addr(statds)); if return_stat < 0; error_ptr = errorIFS(); errormsg_ptr = strerror(error_num); endif; *inlr = *on; return; /end-free
RPG Code in Fully Free format to retrieve stream file stat Information using C stat() API in RPGLE.
**FREE CTL-OPT DFTACTGRP(*NO); DCL-PR stat int(10) EXTPROC('stat'); ifspath pointer VALUE options(*string); statds pointer VALUE; END-PR; DCL-PR errorifs pointer EXTPROC('__errno'); END-PR; DCL-PR strerror pointer EXTPROC('strerror'); error_num int(10) VALUE; END-PR; DCL-S ifspath CHAR(512); DCL-S return_stat int(10); DCL-S error_ptr pointer; DCL-S error_num int(10) based(error_ptr); DCL-S errormsg_ptr pointer; DCL-S error_msg char(500) based(errormsg_ptr); DCL-DS statds; filemode uns(10); fileid uns(10); Numoflinks uns(5); reserved2 uns(5); useridofowner char(2); grpidofgroup uns(10); regularfiles uns(10); size int(10); time_access int(10); time_change int(10); time_stschang int(10); filesysid uns(10); blocksize uns(10); allocatedsize uns(10); objecttype char(12); codepage uns(5); ccsid uns(5); reserved1 char(62); generationid uns(10); END-DS; ifspath = '/home/easyclass/helloworld'; return_stat = stat(%trim(ifspath): %addr(statds)); if return_stat < 0; error_ptr = errorIFS(); errormsg_ptr = strerror(error_num); endif; *inlr = *on; return;
Here, in the above source code, we are retrieving the information of the file helloworld in user home directory to the statds data structure by calling stat() C api in RPGLE and returning the integer value. If return is 0 means stat retrieved successfully and if its -1 then failed to retrieve stats and then we call ifs error handling apis to get the error number and corresponding error messages.