dos.pp 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894
  1. {
  2. $Id$
  3. This file is part of the Free Pascal run time library.
  4. Copyright (c) 1999-2000 by Michael Van Canneyt and Peter Vreman,
  5. members of the Free Pascal development team
  6. See the file COPYING.FPC, included in this distribution,
  7. for details about the copyright.
  8. This program is distributed in the hope that it will be useful,
  9. but WITHOUT ANY WARRANTY; without even the implied warranty of
  10. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
  11. **********************************************************************}
  12. Unit Dos;
  13. Interface
  14. Const
  15. {Max FileName Length for files}
  16. FileNameLen=255;
  17. {Bitmasks for CPU Flags}
  18. fcarry = $0001;
  19. fparity = $0004;
  20. fauxiliary = $0010;
  21. fzero = $0040;
  22. fsign = $0080;
  23. foverflow = $0800;
  24. {Bitmasks for file attribute}
  25. readonly = $01;
  26. hidden = $02;
  27. sysfile = $04;
  28. volumeid = $08;
  29. directory = $10;
  30. archive = $20;
  31. anyfile = $3F;
  32. {File Status}
  33. fmclosed = $D7B0;
  34. fminput = $D7B1;
  35. fmoutput = $D7B2;
  36. fminout = $D7B3;
  37. Type
  38. ComStr = String[FileNameLen];
  39. PathStr = String[FileNameLen];
  40. DirStr = String[FileNameLen];
  41. NameStr = String[FileNameLen];
  42. ExtStr = String[FileNameLen];
  43. SearchRec = packed Record
  44. {Fill : array[1..21] of byte; Fill replaced with below}
  45. SearchNum : LongInt; {to track which search this is}
  46. SearchPos : LongInt; {directory position}
  47. DirPtr : LongInt; {directory pointer for reading directory}
  48. SearchType : Byte; {0=normal, 1=open will close, 2=only 1 file}
  49. SearchAttr : Byte; {attribute we are searching for}
  50. Fill : Array[1..07] of Byte; {future use}
  51. {End of fill}
  52. Attr : Byte; {attribute of found file}
  53. Time : LongInt; {last modify date of found file}
  54. Size : LongInt; {file size of found file}
  55. Reserved : Word; {future use}
  56. Name : String[FileNameLen]; {name of found file}
  57. SearchSpec : String[FileNameLen]; {search pattern}
  58. NamePos : Word; {end of path, start of name position}
  59. End;
  60. {
  61. filerec.inc contains the definition of the filerec.
  62. textrec.inc contains the definition of the textrec.
  63. It is in a separate file to make it available in other units without
  64. having to use the DOS unit for it.
  65. }
  66. {$i filerec.inc}
  67. {$i textrec.inc}
  68. Registers = packed record
  69. case i : integer of
  70. 0 : (ax,f1,bx,f2,cx,f3,dx,f4,bp,f5,si,f51,di,f6,ds,f7,es,f8,flags,fs,gs : word);
  71. 1 : (al,ah,f9,f10,bl,bh,f11,f12,cl,ch,f13,f14,dl,dh : byte);
  72. 2 : (eax, ebx, ecx, edx, ebp, esi, edi : longint);
  73. End;
  74. DateTime = packed record
  75. Year,
  76. Month,
  77. Day,
  78. Hour,
  79. Min,
  80. Sec : word;
  81. End;
  82. Var
  83. DosError : integer;
  84. {Utils}
  85. function weekday(y,m,d : longint) : longint;
  86. Procedure UnixDateToDt(SecsPast: LongInt; Var Dt: DateTime);
  87. Function DTToUnixDate(DT: DateTime): LongInt;
  88. {Info/Date/Time}
  89. Function DosVersion: Word;
  90. Procedure GetDate(var year, month, mday, wday: word);
  91. Procedure GetTime(var hour, minute, second, sec100: word);
  92. procedure SetDate(year,month,day: word);
  93. Procedure SetTime(hour,minute,second,sec100: word);
  94. Procedure UnpackTime(p: longint; var t: datetime);
  95. Procedure PackTime(var t: datetime; var p: longint);
  96. {Exec}
  97. Procedure Exec(const path: pathstr; const comline: comstr);
  98. Function DosExitCode: word;
  99. {Disk}
  100. Procedure AddDisk(const path:string);
  101. Function DiskFree(drive: byte) : int64;
  102. Function DiskSize(drive: byte) : int64;
  103. Procedure FindFirst(const path: pathstr; attr: word; var f: searchRec);
  104. Procedure FindNext(var f: searchRec);
  105. Procedure FindClose(Var f: SearchRec);
  106. {File}
  107. Procedure GetFAttr(var f; var attr: word);
  108. Procedure GetFTime(var f; var time: longint);
  109. Function FSearch(path: pathstr; dirlist: string): pathstr;
  110. Function FExpand(const path: pathstr): pathstr;
  111. Procedure FSplit(path: pathstr; var dir: dirstr; var name: namestr; var ext: extstr);
  112. {Environment}
  113. Function EnvCount: longint;
  114. Function EnvStr(index: integer): string;
  115. Function GetEnv (envvar: string): string;
  116. {Do Nothing Functions, no Linux version}
  117. Procedure Intr(intno: byte; var regs: registers);
  118. Procedure MSDos(var regs: registers);
  119. Procedure SwapVectors;
  120. Procedure GetIntVec(intno: byte; var vector: pointer);
  121. Procedure SetIntVec(intno: byte; vector: pointer);
  122. Procedure Keep(exitcode: word);
  123. Procedure SetFAttr(var f; attr: word);
  124. Procedure SetFTime(var f; time: longint);
  125. Procedure GetCBreak(var breakvalue: boolean);
  126. Procedure SetCBreak(breakvalue: boolean);
  127. Procedure GetVerify(var verify: boolean);
  128. Procedure SetVerify(verify: boolean);
  129. Implementation
  130. Uses
  131. Strings,Unix;
  132. {******************************************************************************
  133. --- Link C Lib if set ---
  134. ******************************************************************************}
  135. type
  136. RtlInfoType = Record
  137. FMode,
  138. FInode,
  139. FUid,
  140. FGid,
  141. FSize,
  142. FMTime : LongInt;
  143. End;
  144. {******************************************************************************
  145. --- Info / Date / Time ---
  146. ******************************************************************************}
  147. Const
  148. {Date Calculation}
  149. C1970 = 2440588;
  150. D0 = 1461;
  151. D1 = 146097;
  152. D2 = 1721119;
  153. type
  154. GTRec = packed Record
  155. Year,
  156. Month,
  157. MDay,
  158. WDay,
  159. Hour,
  160. Minute,
  161. Second : Word;
  162. End;
  163. Function DosVersion:Word;
  164. Var
  165. Buffer : Array[0..255] of Char;
  166. Tmp2,
  167. TmpStr : String[40];
  168. TmpPos,
  169. SubRel,
  170. Rel : LongInt;
  171. info : utsname;
  172. Begin
  173. {$IFNDEF BSD}
  174. UName(info);
  175. Move(info.release,buffer[0],40);
  176. TmpStr:=StrPas(Buffer);
  177. {$ELSE}
  178. TmpStr:='FreeBSD doesn''t support UName';
  179. {$ENDIF}
  180. SubRel:=0;
  181. TmpPos:=Pos('.',TmpStr);
  182. if TmpPos>0 then
  183. begin
  184. Tmp2:=Copy(TmpStr,TmpPos+1,40);
  185. Delete(TmpStr,TmpPos,40);
  186. end;
  187. TmpPos:=Pos('.',Tmp2);
  188. if TmpPos>0 then
  189. Delete(Tmp2,TmpPos,40);
  190. Val(TmpStr,Rel);
  191. Val(Tmp2,SubRel);
  192. DosVersion:=Rel+(SubRel shl 8);
  193. End;
  194. function WeekDay (y,m,d:longint):longint;
  195. {
  196. Calculates th day of the week. returns -1 on error
  197. }
  198. var
  199. u,v : longint;
  200. begin
  201. if (m<1) or (m>12) or (y<1600) or (y>4000) or
  202. (d<1) or (d>30+((m+ord(m>7)) and 1)-ord(m=2)) or
  203. ((m*d=58) and (((y mod 4>0) or (y mod 100=0)) and (y mod 400>0))) then
  204. WeekDay:=-1
  205. else
  206. begin
  207. u:=m;
  208. v:=y;
  209. if m<3 then
  210. begin
  211. inc(u,12);
  212. dec(v);
  213. end;
  214. WeekDay:=(d+2*u+((3*(u+1)) div 5)+v+(v div 4)-(v div 100)+(v div 400)+1) mod 7;
  215. end;
  216. end;
  217. Procedure GetDate(Var Year, Month, MDay, WDay: Word);
  218. Begin
  219. Unix.GetDate(Year,Month,MDay);
  220. Wday:=weekday(Year,Month,MDay);
  221. end;
  222. Procedure SetDate(Year, Month, Day: Word);
  223. Begin
  224. {!!}
  225. End;
  226. Procedure GetTime(Var Hour, Minute, Second, Sec100: Word);
  227. Begin
  228. Unix.GetTime(Hour,Minute,Second,Sec100);
  229. end;
  230. Procedure SetTime(Hour, Minute, Second, Sec100: Word);
  231. Begin
  232. {!!}
  233. End;
  234. Procedure packtime(var t : datetime;var p : longint);
  235. Begin
  236. p:=(t.sec shr 1)+(t.min shl 5)+(t.hour shl 11)+(t.day shl 16)+(t.month shl 21)+((t.year-1980) shl 25);
  237. End;
  238. Procedure unpacktime(p : longint;var t : datetime);
  239. Begin
  240. t.sec:=(p and 31) shl 1;
  241. t.min:=(p shr 5) and 63;
  242. t.hour:=(p shr 11) and 31;
  243. t.day:=(p shr 16) and 31;
  244. t.month:=(p shr 21) and 15;
  245. t.year:=(p shr 25)+1980;
  246. End;
  247. Procedure UnixDateToDt(SecsPast: LongInt; Var Dt: DateTime);
  248. Begin
  249. EpochToLocal(SecsPast,dt.Year,dt.Month,dt.Day,dt.Hour,dt.Min,dt.Sec);
  250. End;
  251. Function DTToUnixDate(DT: DateTime): LongInt;
  252. Begin
  253. DTToUnixDate:=LocalToEpoch(dt.Year,dt.Month,dt.Day,dt.Hour,dt.Min,dt.Sec);
  254. End;
  255. {******************************************************************************
  256. --- Exec ---
  257. ******************************************************************************}
  258. var
  259. LastDosExitCode: word;
  260. Procedure Exec (Const Path: PathStr; Const ComLine: ComStr);
  261. var
  262. pid : longint;
  263. status : longint;
  264. Begin
  265. LastDosExitCode:=0;
  266. pid:=Fork;
  267. if pid=0 then
  268. begin
  269. {The child does the actual exec, and then exits}
  270. Execl (Path+' '+ComLine);
  271. {If the execve fails, we return an exitvalue of 127, to let it be known}
  272. halt (127)
  273. end
  274. else
  275. if pid=-1 then {Fork failed}
  276. begin
  277. DosError:=8;
  278. exit
  279. end;
  280. {We're in the parent, let's wait.}
  281. Waitpid (pid,@status,0);
  282. if status=127 then {The child couldn't execve !!}
  283. DosError:=8 {We set this error, erroneously, since we cannot get to the real error}
  284. else
  285. begin
  286. LastDosExitCode:=status shr 8;
  287. DosError:=0
  288. end;
  289. End;
  290. Function DosExitCode: Word;
  291. Begin
  292. DosExitCode:=LastDosExitCode;
  293. End;
  294. {******************************************************************************
  295. --- Disk ---
  296. ******************************************************************************}
  297. {
  298. The Diskfree and Disksize functions need a file on the specified drive, since this
  299. is required for the statfs system call.
  300. These filenames are set in drivestr[0..26], and have been preset to :
  301. 0 - '.' (default drive - hence current dir is ok.)
  302. 1 - '/fd0/.' (floppy drive 1 - should be adapted to local system )
  303. 2 - '/fd1/.' (floppy drive 2 - should be adapted to local system )
  304. 3 - '/' (C: equivalent of dos is the root partition)
  305. 4..26 (can be set by you're own applications)
  306. ! Use AddDisk() to Add new drives !
  307. They both return -1 when a failure occurs.
  308. }
  309. Const
  310. FixDriveStr : array[0..3] of pchar=(
  311. '.',
  312. '/fd0/.',
  313. '/fd1/.',
  314. '/.'
  315. );
  316. var
  317. Drives : byte;
  318. DriveStr : array[4..26] of pchar;
  319. Procedure AddDisk(const path:string);
  320. begin
  321. if not (DriveStr[Drives]=nil) then
  322. FreeMem(DriveStr[Drives],StrLen(DriveStr[Drives])+1);
  323. GetMem(DriveStr[Drives],length(Path)+1);
  324. StrPCopy(DriveStr[Drives],path);
  325. inc(Drives);
  326. if Drives>26 then
  327. Drives:=4;
  328. end;
  329. Function DiskFree(Drive: Byte): int64;
  330. var
  331. fs : statfs;
  332. Begin
  333. if ((Drive<4) and (not (fixdrivestr[Drive]=nil)) and fsstat(StrPas(fixdrivestr[drive]),fs)) or
  334. ((not (drivestr[Drive]=nil)) and fsstat(StrPas(drivestr[drive]),fs)) then
  335. Diskfree:=int64(fs.bavail)*int64(fs.bsize)
  336. else
  337. Diskfree:=-1;
  338. End;
  339. Function DiskSize(Drive: Byte): int64;
  340. var
  341. fs : statfs;
  342. Begin
  343. if ((Drive<4) and (not (fixdrivestr[Drive]=nil)) and fsstat(StrPas(fixdrivestr[drive]),fs)) or
  344. ((not (drivestr[Drive]=nil)) and fsstat(StrPas(drivestr[drive]),fs)) then
  345. DiskSize:=int64(fs.blocks)*int64(fs.bsize)
  346. else
  347. DiskSize:=-1;
  348. End;
  349. {******************************************************************************
  350. --- Findfirst FindNext ---
  351. ******************************************************************************}
  352. Const
  353. RtlFindSize = 15;
  354. Type
  355. RtlFindRecType = Record
  356. SearchNum,
  357. DirPtr,
  358. LastUsed : LongInt;
  359. End;
  360. Var
  361. RtlFindRecs : Array[1..RtlFindSize] of RtlFindRecType;
  362. CurrSearchNum : LongInt;
  363. Procedure FindClose(Var f: SearchRec);
  364. {
  365. Closes dirptr if it is open
  366. }
  367. Var
  368. i : longint;
  369. Begin
  370. if f.SearchType=0 then
  371. begin
  372. i:=1;
  373. repeat
  374. if (RtlFindRecs[i].SearchNum=f.SearchNum) then
  375. break;
  376. inc(i);
  377. until (i>RtlFindSize);
  378. If i<=RtlFindSize Then
  379. Begin
  380. RtlFindRecs[i].SearchNum:=0;
  381. if f.dirptr>0 then
  382. closedir(pdir(f.dirptr));
  383. End;
  384. end;
  385. f.dirptr:=0;
  386. End;
  387. Function FindGetFileInfo(const s:string;var f:SearchRec):boolean;
  388. var
  389. DT : DateTime;
  390. Info : RtlInfoType;
  391. st : stat;
  392. begin
  393. FindGetFileInfo:=false;
  394. if not Fstat(s,st) then
  395. exit;
  396. info.FSize:=st.Size;
  397. info.FMTime:=st.mtime;
  398. if (st.mode and STAT_IFMT)=STAT_IFDIR then
  399. info.fmode:=$10
  400. else
  401. info.fmode:=$20;
  402. if (st.mode and STAT_IWUSR)=0 then
  403. info.fmode:=info.fmode or 1;
  404. If ((Info.FMode and Not(f.searchattr))=0) Then
  405. Begin
  406. f.Name:=Copy(s,f.NamePos+1,255);
  407. f.Attr:=Info.FMode;
  408. f.Size:=Info.FSize;
  409. UnixDateToDT(Info.FMTime, DT);
  410. PackTime(DT,f.Time);
  411. FindGetFileInfo:=true;
  412. End;
  413. end;
  414. Function FindLastUsed: Longint;
  415. {
  416. Find unused or least recently used dirpointer slot in findrecs array
  417. }
  418. Var
  419. BestMatch,i : Longint;
  420. Found : Boolean;
  421. Begin
  422. BestMatch:=1;
  423. i:=1;
  424. Found:=False;
  425. While (i <= RtlFindSize) And (Not Found) Do
  426. Begin
  427. If (RtlFindRecs[i].SearchNum = 0) Then
  428. Begin
  429. BestMatch := i;
  430. Found := True;
  431. End
  432. Else
  433. Begin
  434. If RtlFindRecs[i].LastUsed > RtlFindRecs[BestMatch].LastUsed Then
  435. BestMatch := i;
  436. End;
  437. Inc(i);
  438. End;
  439. FindLastUsed := BestMatch;
  440. End;
  441. Procedure FindNext(Var f: SearchRec);
  442. {
  443. re-opens dir if not already in array and calls FindWorkProc
  444. }
  445. Var
  446. DirName : Array[0..256] of Char;
  447. i,
  448. ArrayPos : Longint;
  449. FName,
  450. SName : string;
  451. Found,
  452. Finished : boolean;
  453. p : PDirEnt;
  454. Begin
  455. If f.SearchType=0 Then
  456. Begin
  457. ArrayPos:=0;
  458. For i:=1 to RtlFindSize Do
  459. Begin
  460. If RtlFindRecs[i].SearchNum = f.SearchNum Then
  461. ArrayPos:=i;
  462. Inc(RtlFindRecs[i].LastUsed);
  463. End;
  464. If ArrayPos=0 Then
  465. Begin
  466. If f.NamePos = 0 Then
  467. Begin
  468. DirName[0] := '.';
  469. DirName[1] := '/';
  470. DirName[2] := #0;
  471. End
  472. Else
  473. Begin
  474. Move(f.SearchSpec[1], DirName[0], f.NamePos);
  475. DirName[f.NamePos] := #0;
  476. End;
  477. f.DirPtr := longint(opendir(@(DirName)));
  478. If f.DirPtr > 0 Then
  479. begin
  480. ArrayPos:=FindLastUsed;
  481. If RtlFindRecs[ArrayPos].SearchNum > 0 Then
  482. CloseDir(pdir(rtlfindrecs[arraypos].dirptr));
  483. RtlFindRecs[ArrayPos].SearchNum := f.SearchNum;
  484. RtlFindRecs[ArrayPos].DirPtr := f.DirPtr;
  485. if f.searchpos>0 then
  486. seekdir(pdir(f.dirptr), f.searchpos);
  487. end;
  488. End;
  489. if ArrayPos>0 then
  490. RtlFindRecs[ArrayPos].LastUsed:=0;
  491. end;
  492. {Main loop}
  493. SName:=Copy(f.SearchSpec,f.NamePos+1,255);
  494. Found:=False;
  495. Finished:=(f.dirptr=0);
  496. While Not Finished Do
  497. Begin
  498. p:=readdir(pdir(f.dirptr));
  499. if p=nil then
  500. FName:=''
  501. else
  502. FName:=Strpas(@p^.name);
  503. If FName='' Then
  504. Finished:=True
  505. Else
  506. Begin
  507. If FNMatch(SName,FName) Then
  508. Begin
  509. Found:=FindGetFileInfo(Copy(f.SearchSpec,1,f.NamePos)+FName,f);
  510. if Found then
  511. Finished:=true;
  512. End;
  513. End;
  514. End;
  515. {Shutdown}
  516. If Found Then
  517. Begin
  518. f.searchpos:=telldir(pdir(f.dirptr));
  519. DosError:=0;
  520. End
  521. Else
  522. Begin
  523. FindClose(f);
  524. DosError:=18;
  525. End;
  526. End;
  527. Procedure FindFirst(Const Path: PathStr; Attr: Word; Var f: SearchRec);
  528. {
  529. opens dir and calls FindWorkProc
  530. }
  531. Begin
  532. if Path='' then
  533. begin
  534. DosError:=3;
  535. exit;
  536. end;
  537. {Create Info}
  538. f.SearchSpec := Path;
  539. f.SearchAttr := Attr;
  540. f.SearchPos:=0;
  541. f.NamePos := Length(f.SearchSpec);
  542. while (f.NamePos>0) and (f.SearchSpec[f.NamePos]<>'/') do
  543. dec(f.NamePos);
  544. {Wildcards?}
  545. if (Pos('?',Path)=0) and (Pos('*',Path)=0) then
  546. begin
  547. if FindGetFileInfo(Path,f) then
  548. DosError:=0
  549. else
  550. begin
  551. if ErrNo=Sys_ENOENT then
  552. DosError:=3
  553. else
  554. DosError:=18;
  555. end;
  556. f.DirPtr:=0;
  557. f.SearchType:=1;
  558. f.searchnum:=-1;
  559. end
  560. else
  561. {Find Entry}
  562. begin
  563. Inc(CurrSearchNum);
  564. f.SearchNum:=CurrSearchNum;
  565. f.SearchType:=0;
  566. FindNext(f);
  567. end;
  568. End;
  569. {******************************************************************************
  570. --- File ---
  571. ******************************************************************************}
  572. Procedure FSplit(Path: PathStr; Var Dir: DirStr; Var Name: NameStr;Var Ext: ExtStr);
  573. Begin
  574. Unix.FSplit(Path,Dir,Name,Ext);
  575. End;
  576. Function FExpand(Const Path: PathStr): PathStr;
  577. Begin
  578. FExpand:=Unix.FExpand(Path);
  579. End;
  580. Function FSearch(path : pathstr;dirlist : string) : pathstr;
  581. Var
  582. info:stat;
  583. Begin
  584. if (length(Path)>0) and (path[1]='/') and FStat(path,info) then
  585. FSearch:=path
  586. else
  587. FSearch:=Unix.FSearch(path,dirlist);
  588. End;
  589. Procedure GetFAttr(var f; var attr : word);
  590. Var
  591. info : stat;
  592. LinAttr : longint;
  593. Begin
  594. DosError:=0;
  595. if not FStat(strpas(@textrec(f).name),info) then
  596. begin
  597. Attr:=0;
  598. DosError:=3;
  599. exit;
  600. end
  601. else
  602. LinAttr:=Info.Mode;
  603. if S_ISDIR(LinAttr) then
  604. Attr:=$10
  605. else
  606. Attr:=$20;
  607. if not Access(strpas(@textrec(f).name),W_OK) then
  608. Attr:=Attr or $1;
  609. if (not S_ISDIR(LinAttr)) and (filerec(f).name[0]='.') then
  610. Attr:=Attr or $2;
  611. end;
  612. Procedure getftime (var f; var time : longint);
  613. Var
  614. Info: stat;
  615. DT: DateTime;
  616. Begin
  617. doserror:=0;
  618. if not fstat(filerec(f).handle,info) then
  619. begin
  620. Time:=0;
  621. doserror:=3;
  622. exit
  623. end
  624. else
  625. UnixDateToDT(Info.mTime,DT);
  626. PackTime(DT,Time);
  627. End;
  628. {******************************************************************************
  629. --- Environment ---
  630. ******************************************************************************}
  631. Function EnvCount: Longint;
  632. var
  633. envcnt : longint;
  634. p : ppchar;
  635. Begin
  636. envcnt:=0;
  637. p:=envp; {defined in syslinux}
  638. while (p^<>nil) do
  639. begin
  640. inc(envcnt);
  641. inc(p);
  642. end;
  643. EnvCount := envcnt
  644. End;
  645. Function EnvStr(Index: Integer): String;
  646. Var
  647. i : longint;
  648. p : ppchar;
  649. Begin
  650. p:=envp; {defined in syslinux}
  651. i:=1;
  652. while (i<Index) and (p^<>nil) do
  653. begin
  654. inc(i);
  655. inc(p);
  656. end;
  657. if p=nil then
  658. envstr:=''
  659. else
  660. envstr:=strpas(p^)
  661. End;
  662. Function GetEnv(EnvVar: String): String;
  663. var
  664. p : pchar;
  665. Begin
  666. p:=Unix.GetEnv(EnvVar);
  667. if p=nil then
  668. GetEnv:=''
  669. else
  670. GetEnv:=StrPas(p);
  671. End;
  672. {******************************************************************************
  673. --- Do Nothing Procedures/Functions ---
  674. ******************************************************************************}
  675. Procedure Intr (intno: byte; var regs: registers);
  676. Begin
  677. {! No Linux equivalent !}
  678. End;
  679. Procedure msdos(var regs : registers);
  680. Begin
  681. {! No Linux equivalent !}
  682. End;
  683. Procedure getintvec(intno : byte;var vector : pointer);
  684. Begin
  685. {! No Linux equivalent !}
  686. End;
  687. Procedure setintvec(intno : byte;vector : pointer);
  688. Begin
  689. {! No Linux equivalent !}
  690. End;
  691. Procedure SwapVectors;
  692. Begin
  693. {! No Linux equivalent !}
  694. End;
  695. Procedure keep(exitcode : word);
  696. Begin
  697. {! No Linux equivalent !}
  698. End;
  699. Procedure setftime(var f; time : longint);
  700. Begin
  701. {! No Linux equivalent !}
  702. End;
  703. Procedure setfattr (var f;attr : word);
  704. Begin
  705. {! No Linux equivalent !}
  706. End;
  707. Procedure GetCBreak(Var BreakValue: Boolean);
  708. Begin
  709. {! No Linux equivalent !}
  710. breakvalue:=true
  711. End;
  712. Procedure SetCBreak(BreakValue: Boolean);
  713. Begin
  714. {! No Linux equivalent !}
  715. End;
  716. Procedure GetVerify(Var Verify: Boolean);
  717. Begin
  718. {! No Linux equivalent !}
  719. Verify:=true;
  720. End;
  721. Procedure SetVerify(Verify: Boolean);
  722. Begin
  723. {! No Linux equivalent !}
  724. End;
  725. {******************************************************************************
  726. --- Initialization ---
  727. ******************************************************************************}
  728. End.
  729. {
  730. $Log$
  731. Revision 1.3 2001-01-21 20:21:40 marco
  732. * Rename fest II. Rtl OK
  733. Revision 1.2 2000/09/18 13:14:50 marco
  734. * Global Linux +bsd to (rtl/freebsd rtl/unix rtl/linux structure)
  735. Revision 1.3 2000/07/14 10:33:10 michael
  736. + Conditionals fixed
  737. Revision 1.2 2000/07/13 11:33:48 michael
  738. + removed logs
  739. }