|
This is a multipart message in MIME format. -- [ Picked text/plain from multipart/alternative ] I've read Scott's example at: http://archive.midrange.com/rpg400-l/200105/msg00320.html And I've read the Redbook 'Who knew...' for handling the errno part. I have a file which shows up with wrklnk '/rob/spool2.txt' However, my command STATTEST FILENAME('/rob/spool2.txt') Results in: DSPLY 3025No such path or directory. File attributes: Object . . . . . . : /rob/spool2.txt Type . . . . . . . . . . . . . . . . . : STMF Owner . . . . . . . . . . . . . . . . : ROB System object is on . . . . . . . . . : Local Auxiliary storage pool . . . . . . . . : 1 Object overflowed . . . . . . . . . : No Coded character set ID . . . . . . . . : 37 Hidden file . . . . . . . . . . . . . : No PC system file . . . . . . . . . . . . : No Read only . . . . . . . . . . . . . . : No Need to archive (PC) . . . . . . . . . : Yes Need to archive (AS/400) . . . . . . . : No Last access date/time . . . . . . . . : 01/07/02 17:50:5 Data change date/time . . . . . . . . : 06/01/01 15:08:5 Attribute change date/time . . . . . . : 10/21/01 11:11:5 Size of object data in bytes . . . . . : 2926 Allocated size of object . . . . . . . : 8192 File format . . . . . . . . . . . . . : *TYPE2 Size of extended attributes . . . . . : 0 Storage freed . . . . . . . . . . . . : No Auditing value . . . . . . . . . . . . : *NONE Object domain . . . . . . . . . . . . : *SYSTEM Number of hard links . . . . . . . . . : 1 Last used date . . . . . . . . . . . . : 01/07/02 Days used count . . . . . . . . . . . : 2 Reset date . . . . . . . . . . . . . : Allow write during save . . . . . . . : No Digitally signed . . . . . . . . . . . : No File ID . . . . . . . . . . . . . . . : X'0000000000000001833C09CE0000A3BF' Entire source: H Datfmt(*USA) H ExprOpts(*RESDECPOS) H Bnddir('ROUTINES/SRVPGM':'QC2LE') H ActGrp('QILE') H DftActGrp(*NO) D********************************************************************** D* File Information Structure (stat) D* D* struct stat { D* mode_t st_mode; /* File mode */ D* ino_t st_ino; /* File serial number */ D* nlink_t st_nlink; /* Number of links */ D* uid_t st_uid; /* User ID of the owner of file */ D* gid_t st_gid; /* Group ID of the group of file */ D* off_t st_size; /* For regular files, the file D* * size in bytes */ D* time_t st_atime; /* Time of last access */ D* time_t st_mtime; /* Time of last data modification */ D* time_t st_ctime; /* Time of last file status change */ D* dev_t st_dev; /* ID of device containing file */ D* size_t st_blksize; /* Size of a block of the file */ D* unsigned long st_allocsize; /* Allocation size of the file */ D* qp0l_objtype_t st_objtype; /* AS/400 object type */ D* unsigned short st_codepage; /* Object data codepage */ D* char st_reserved1[66]; /* Reserved */ D* }; ** times in statds are seconds from the "epoch" (Jan 1, 1970) ** and are in GMT (Greenwich Mean Time)... D* D p_statds S * D statds DS BASED(p_statds) D st_mode 10U 0 D st_ino 10U 0 D st_nlink 5U 0 D st_pad 2A D st_uid 10U 0 D st_gid 10U 0 D st_size 10I 0 D st_atime 10I 0 D st_mtime 10I 0 D st_ctime 10I 0 D st_dev 10U 0 D st_blksize 10U 0 D st_alctize 10U 0 D st_objtype 12A D st_codepag 5U 0 D st_resv11 62A D st_ino_gen_id 10U 0 D STATTEST PR EXTPGM('STATTEST') D FileName 100a const D STATTEST PI D FileName 100a const D*-------------------------------------------------------------------- D* Get File Information D* D* int stat(const char *path, struct stat *buf) D*-------------------------------------------------------------------- D stat PR 10I 0 ExtProc('stat') D path * value options(*string) D buf * value D GetTimeZone PR 5A D timezone DS D tzDir 1A D tzHour 2S 0 D tzFrac 2S 0 D statsize S 10I 0 d Msg S 50A D AccessTime S Z D ModifyTime S Z D ChgStsTime S Z D charTS S 26A D Epoch S Z INZ(z'1970-01-01-00.00.00') DGetErrNo PR * ExtProc('__errno') DStrError PR * ExtProc('strerror') D ErrorNo 10i 0 Value DpErrorNo s * inz DErrorNo s 10i 0 based(pErrorNo) DpErrorMsg s * inz DErrorMsg s 100a based(pErrorMsg) c eval *inlr = *on c eval statsize = %size(statds) c alloc statsize p_statds c if stat(FileName: p_statds) < 0 c eval pErrorNo = GetErrNo c eval pErrorMsg = StrError(ErrorNo) c eval Msg = %char(ErrorNo) + ErrorMsg c c dsply Msg c return c endif ** times in statds are seconds from the "epoch" (Jan 1, 1970) ** and are in GMT (Greenwich Mean Time)... ** Hey! Lets convert them to RPG timestamps! c Epoch adddur st_atime:*S AccessTime c Epoch adddur st_mtime:*S ModifyTime c Epoch adddur st_ctime:*S ChgStsTime ** adjust timestamps for timezone: c eval timezone = GetTimeZone c if tzDir = '-' c subdur tzHour:*H AccessTime c subdur tzHour:*H ModifyTime c subdur tzHour:*H ChgStsTime c else c adddur tzHour:*H AccessTime c adddur tzHour:*H ModifyTime c adddur tzHour:*H ChgStsTime c endif C* display the relevant times: c move AccessTime charTS c eval Msg = 'Last Access ' + charTS c dsply Msg c move ModifyTime charTS c eval Msg = 'Last Modified ' + charTS c dsply Msg c move ChgStsTime charTS c eval Msg = 'Status Changed ' + charTS c dsply Msg c dealloc p_statds c eval *inlr = *on P*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ P* This gets the offset from Universal Coordinated Time (UTC) P* from the system value QUTCOFFSET P*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ P GetTimeZone B D GetTimeZone PI 5A D peRcvVar S 1A DIM(100) D peRVarLen S 10I 0 D peNumVals S 10I 0 D peSysValNm S 10A D p_Offset S * D wkOffset S 10I 0 BASED(p_Offset) D p_SV S * D dsSV ds BASED(p_SV) D dsSVSysVal 10A D dsSVDtaTyp 1A D dsSVDtaSts 1A D dsSVDtaLen 10I 0 D dsSVData 5A D dsErrCode DS D dsBytesPrv 1 4B 0 INZ(256) D dsBytesAvl 5 8B 0 INZ(0) D dsExcpID 9 15 D dsReserved 16 16 D dsExcpData 17 256 C CALL 'QWCRSVAL' 99 C PARM peRcvVar C PARM 100 peRVarLen c PARM 1 peNumVals c PARM 'QUTCOFFSET' peSysValNm c PARM dsErrCode c if dsBytesAvl > 0 or *IN99 = *On c return *blanks c endif c eval p_Offset = %addr(peRcvVar(5)) c eval p_SV = %addr(peRcvVar(wkOffset+1)) c return dsSVData P E Rob Berendt -- "They that can give up essential liberty to obtain a little temporary safety deserve neither liberty nor safety." Benjamin Franklin
As an Amazon Associate we earn from qualifying purchases.
This mailing list archive is Copyright 1997-2024 by midrange.com and David Gibbs as a compilation work. Use of the archive is restricted to research of a business or technical nature. Any other uses are prohibited. Full details are available on our policy page. If you have questions about this, please contact [javascript protected email address].
Operating expenses for this site are earned using the Amazon Associate program and Google Adsense.