STATPGM.RPGLE
000001160318 /* THE INFORMATION CONTAINED IN THIS DOCUMENT HAS NOT BEEN SUBMITTE D */
000002160318 /* TO ANY FORMAL TESTS AND IS DISTRIBUTED ON AN 'AS IS' BASIS */
000003160318 /* WITHOUT ANY WARRANTY EITHER EXPRESSED OR IMPLIED. THE USE OF THI S */
000004160318 /* INFORMATION OR THE IMPLEMENTATION OF ANY OF THESE TECHNIQUES IS A */
000005160318 /* CUSTOMER RESPONSIBILITY AND DEPENDS ON THE CUSTOMER'S ABILITY TO */
000006160318 /* EVALUATE AND INTEGRATE THEM INTO THE CUSTOMER'S OPERATION */
000007160318 /* ENVIRONMENT. WHILE EACH ITEM MAY HAVE BEEN REVIEWED BY IBM */
000008160318 /* FOR ACCURACY IN A SPECIFIC SITUATION, THERE IS NO GUARANTEE THAT THE */
000009160318 /* SAME OR SIMILAR RESULTS WILL BE OBTAINED ELSEWHERE. CUSTOMERS */
000010160318 /* ATTEMPTING TO ADAPT THESE TECHNIQUES TO THEIR ENVIRONMENTS DO SO */
000011160318 /* AT THEIR OWN RISK. */
000012160317 // ----------------------------------------------------------------------
000100160317 Ctl-Opt DFTACTGRP(*NO) ACTGRP(*NEW);
000101160317 // *********************************************************************
000102160317 // File Information Structure (stat)
000103160317 //
000104160317 // struct stat {
000105160317 // mode_t st_mode; /* File mode */
000106160317 // ino_t st_ino; /* File serial number */
000107160317 // nlink_t st_nlink; /* Number of links */
000108160317 // uid_t st_uid; /* User ID of the owner of file */
000109160317 // gid_t st_gid; /* Group ID of the group of file */
000110160317 // off_t st_size; /* For regular files, the file
000111160317 // * size in bytes */
000112160317 // time_t st_atime; /* Time of last access */
000113160317 // time_t st_mtime; /* Time of last data modification */
000114160317 // time_t st_ctime; /* Time of last file status change */
000115160317 // dev_t st_dev; /* ID of device containing file */
000116160317 // size_t st_blksize; /* Size of a block of the file */
000117160317 // unsigned long st_allocsize; /* Allocation size of the file */
000118160317 // qp0l_objtype_t st_objtype; /* AS/400 object type */
000119160317 // unsigned short st_codepage; /* Object data codepage */
000120160317 // char st_reserved1[66]; /* Reserved */
000121160317 // };
000122160317 //
000123160317 Dcl-S p_statds Pointer;
000124160317 Dcl-Ds statds BASED(p_statds);
000125160317 st_mode Uns(10);
000126160317 st_ino Uns(10);
000127160317 st_nlink Uns(5);
000128160317 st_pad Char(2);
000129160317 st_uid Uns(10);
000130160317 st_gid Uns(10);
000131160317 st_size Int(10);
000132160317 st_atime Int(10);
000133160317 st_mtime Int(10);
000134160317 st_ctime Int(10);
000135160317 st_dev Uns(10);
000136160317 st_blksize Uns(10);
000137160317 st_alctize Uns(10);
000138160317 st_objtype Char(12);
000139160317 st_codepag Uns(5);
000140160317 st_resv11 Char(62);
000141160317 st_ino_gen_id Uns(10);
000142160317 End-Ds;
000143160317
000144160317 // --------------------------------------------------------------------
000145160317 // Get File Information
000146160317 //
000147160317 // int stat(const char *path, struct stat *buf)
000148160317 // --------------------------------------------------------------------
000149160317 Dcl-Pr stat Int(10) ExtProc('stat');
000150160317 path Pointer value options(*string);
000151160317 buf Pointer value;
000152160317 End-Pr;
000153160317
000154160317 Dcl-Pr GetTimeZone Char(5) End-Pr;
000155160317
000156160317 Dcl-Ds timezone;
000157160317 tzDir Char(1);
000158160317 tzHour Zoned(2:0);
000159160317 tzFrac Zoned(2:0);
000160160317 End-Ds;
000161160317
000162160317
000163160317 Dcl-S statsize Int(10);
000164160317 Dcl-S Msg Char(50);
000165160317 Dcl-S AccessTime TimeStamp;
000166160317 Dcl-S ModifyTime TimeStamp;
000167160317 Dcl-S ChgStsTime TimeStamp;
000168160317 Dcl-S charTS Char(26);
000169160317 Dcl-S Epoch TimeStamp INZ(z'1970-01-01-00.00.00');
000170160317 // Prototype for QWCRSVAL
000171160317 Dcl-Pr Pgm_QWCRSVAL ExtPgm('QWCRSVAL');
000172160317 peRcvVar Char(1) Dim(100);
000173160317 peRVarLen Int(10);
000174160317 peNumVals Int(10);
000175160317 peSysValNm Char(10);
000176160317 dsErrCode Char(256);
000177160317 End-Pr;
000178160317
000179160317 *inlr = *on;
000180160317
000181160317 statsize = %size(statds);
000182160317 p_statds = %Alloc(statsize);
000183160317
000184160317 If stat('/temp/jt400.jar': p_statds) < 0;
000185160317 Msg = 'stat() failed? Check errno!';
000186160317 // ...--> dsply Msg
000187160317 c dsply Msg
000188160317 Return;
000189160317 EndIf;
000190160317
000191160317 // * times in statds are seconds from the "epoch" (Jan 1, 1970)
000192160317 // * and are in GMT (Greenwich Mean Time)...
000193160317 // * Hey! Lets convert them to RPG timestamps!
000194160317 AccessTime = Epoch + %Seconds(st_atime);
000195160317 ModifyTime = Epoch + %Seconds(st_mtime);
000196160317 ChgStsTime = Epoch + %Seconds(st_ctime);
000197160317
000198160317 // * adjust timestamps for timezone:
000199160317 timezone = GetTimeZone;
000200160317 If tzDir = '-';
000201160317 AccessTime -= %Hours(tzHour);
000202160317 ModifyTime -= %Hours(tzHour);
000203160317 ChgStsTime -= %Hours(tzHour);
000204160317 Else;
000205160317 AccessTime += %Hours(tzHour);
000206160317 ModifyTime += %Hours(tzHour);
000207160317 ChgStsTime += %Hours(tzHour);
000208160317 EndIf;
000209160317
000210160317 // display the relevant times:
000211160317 charTS = %Char(AccessTime);
000212160317 Msg = 'Last Access ' + charTS;
000213160317 // ...--> dsply Msg
000214160317 c dsply Msg
000215160317
000216160317 charTS = %Char(ModifyTime);
000217160317 Msg = 'Last Modified ' + charTS;
000218160317 // ...--> dsply Msg
000219160317 c dsply Msg
000220160317
000221160317 charTS = %Char(ChgStsTime);
000222160317 Msg = 'Status Changed ' + charTS;
000223160317 // ...--> dsply Msg
000224160317 c dsply Msg
000225160317
000226160317 DeAlloc p_statds;
000227160317 *inlr = *on;
000228160317
000229160317
000230160317 // ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
000231160317 // This gets the offset from Universal Coordinated Time (UTC)
000232160317 // from the system value QUTCOFFSET
000233160317 // ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
000234160317 Dcl-Proc GetTimeZone;
000235160317 Dcl-Pi GetTimeZone Char(5) End-Pi;
000236160317 Dcl-S peRcvVar Char(1) DIM(100);
000237160317 Dcl-S peRVarLen Int(10);
000238160317 Dcl-S peNumVals Int(10);
000239160317 Dcl-S peSysValNm Char(10);
000240160317 Dcl-S p_Offset Pointer;
000241160317 Dcl-S wkOffset Int(10) BASED(p_Offset);
000242160317 Dcl-S p_SV Pointer;
000243160317 Dcl-Ds dsSV BASED(p_SV);
000244160317 dsSVSysVal Char(10);
000245160317 dsSVDtaTyp Char(1);
000246160317 dsSVDtaSts Char(1);
000247160317 dsSVDtaLen Int(10);
000248160317 dsSVData Char(5);
000249160317 End-Ds;
000250160317 Dcl-Ds dsErrCode;
000251160317 dsBytesPrv BinDec(9:0) Pos(1) INZ(256);
000252160317 dsBytesAvl BinDec(9:0) Pos(5) INZ(0);
000253160317 dsExcpID Char(7) Pos(9);
000254160317 dsReserved Char(1) Pos(16);
000255160317 dsExcpData Char(240) Pos(17);
000256160317 End-Ds;
000257160317 peRVarLen = 100;
000258160317 peNumVals = 1;
000259160317 peSysValNm = 'QUTCOFFSET';
000260160317 CallP(e) Pgm_QWCRSVAL(peRcvVar : peRVarLen :
000261160317 peNumVals : peSysValNm : dsErrCode);
000262160317 *In99 = %Error;
000263160317 If dsBytesAvl > 0 or *IN99 = *On;
000264160317 Return *blanks;
000265160317 EndIf;
000266160317 p_Offset = %addr(peRcvVar(5));
000267160317 p_SV = %addr(peRcvVar(wkOffset+1));
000268160317 Return dsSVData;
000269160317 End-Proc;
沒有留言:
張貼留言