sysutils.pp 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526
  1. {
  2. $Id$
  3. This file is part of the Free Pascal run time library.
  4. Copyright (c) 1999-2000 by Florian Klaempfl
  5. member of the Free Pascal development team
  6. Sysutils unit for netware
  7. See the file COPYING.FPC, included in this distribution,
  8. for details about the copyright.
  9. This program is distributed in the hope that it will be useful,
  10. but WITHOUT ANY WARRANTY; without even the implied warranty of
  11. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
  12. **********************************************************************}
  13. unit sysutils;
  14. interface
  15. {$MODE objfpc}
  16. { force ansistrings }
  17. {$H+}
  18. uses DOS;
  19. {$I nwsys.inc}
  20. {$I errno.inc}
  21. TYPE
  22. TNetwareFindData =
  23. RECORD
  24. DirP : PNWDirEnt; { used for opendir }
  25. EntryP: PNWDirEnt; { and readdir }
  26. Magic : WORD; { to avoid abends with uninitialized TSearchRec }
  27. END;
  28. { Include platform independent interface part }
  29. {$i sysutilh.inc}
  30. { additional NetWare file flags}
  31. CONST
  32. faSHARE = $00000080; { Sharable file }
  33. faNO_SUBALLOC = $00000800; { Don't sub alloc. this file }
  34. faTRANS = $00001000; { Transactional file (TTS usable) }
  35. faREADAUD = $00004000; { Read audit }
  36. faWRITAUD = $00008000; { Write audit }
  37. faIMMPURG = $00010000; { Immediate purge }
  38. faNORENAM = $00020000; { Rename inhibit }
  39. faNODELET = $00040000; { Delete inhibit }
  40. faNOCOPY = $00080000; { Copy inhibit }
  41. faFILE_MIGRATED = $00400000; { File has been migrated }
  42. faDONT_MIGRATE = $00800000; { Don't migrate this file }
  43. faIMMEDIATE_COMPRESS = $02000000; { Compress this file immediately }
  44. faFILE_COMPRESSED = $04000000; { File is compressed }
  45. faDONT_COMPRESS = $08000000; { Don't compress this file }
  46. faCANT_COMPRESS = $20000000; { Can't compress this file }
  47. faATTR_ARCHIVE = $40000000; { Entry has had an EA modified, }
  48. { an ownerID changed, or trustee }
  49. { info changed, etc. }
  50. implementation
  51. { Include platform independent implementation part }
  52. {$i sysutils.inc}
  53. {****************************************************************************
  54. File Functions
  55. ****************************************************************************}
  56. Function FileOpen (Const FileName : string; Mode : Integer) : Longint;
  57. VAR NWOpenFlags : longint;
  58. BEGIN
  59. NWOpenFlags:=0;
  60. Case (Mode and 3) of
  61. 0 : NWOpenFlags:=NWOpenFlags or O_RDONLY;
  62. 1 : NWOpenFlags:=NWOpenFlags or O_WRONLY;
  63. 2 : NWOpenFlags:=NWOpenFlags or O_RDWR;
  64. end;
  65. FileOpen := _open (pchar(FileName),NWOpenFlags,0);
  66. //!! We need to set locking based on Mode !!
  67. end;
  68. Function FileCreate (Const FileName : String) : Longint;
  69. begin
  70. FileCreate:=_open(Pchar(FileName),O_RdWr or O_Creat or O_Trunc,0);
  71. end;
  72. Function FileRead (Handle : Longint; Var Buffer; Count : longint) : Longint;
  73. begin
  74. FileRead:=_read (Handle,@Buffer,Count);
  75. end;
  76. Function FileWrite (Handle : Longint; const Buffer; Count : Longint) : Longint;
  77. begin
  78. FileWrite:=_write (Handle,@Buffer,Count);
  79. end;
  80. Function FileSeek (Handle,FOffset,Origin : Longint) : Longint;
  81. begin
  82. FileSeek:=_lseek (Handle,FOffset,Origin);
  83. end;
  84. Procedure FileClose (Handle : Longint);
  85. begin
  86. _close(Handle);
  87. end;
  88. Function FileTruncate (Handle,Size: Longint) : boolean;
  89. begin
  90. FileTruncate:=(_chsize(Handle,Size) = 0);
  91. end;
  92. Function FileAge (Const FileName : String): Longint;
  93. VAR Info : NWStatBufT;
  94. PTM : PNWTM;
  95. begin
  96. If _stat (pchar(FileName),Info) <> 0 then
  97. exit(-1)
  98. else
  99. begin
  100. PTM := _localtime (Info.st_mtime);
  101. IF PTM = NIL THEN
  102. exit(-1)
  103. else
  104. WITH PTM^ DO
  105. Result:=DateTimeToFileDate(EncodeDate(tm_year+1900,tm_mon+1,tm_mday)+EncodeTime(tm_hour,tm_min,tm_sec,0));
  106. end;
  107. end;
  108. Function FileExists (Const FileName : String) : Boolean;
  109. VAR Info : NWStatBufT;
  110. begin
  111. FileExists:=(_stat(pchar(filename),Info) = 0);
  112. end;
  113. PROCEDURE find_setfields (VAR f : TsearchRec);
  114. VAR T : Dos.DateTime;
  115. BEGIN
  116. WITH F DO
  117. BEGIN
  118. IF FindData.Magic = $AD01 THEN
  119. BEGIN
  120. {attr := FindData.EntryP^.d_attr AND $FF;} // lowest 8 bit -> same as dos
  121. attr := FindData.EntryP^.d_attr; { return complete netware attributes }
  122. UnpackTime(FindData.EntryP^.d_time + (LONGINT (FindData.EntryP^.d_date) SHL 16), T);
  123. time := DateTimeToFileDate(EncodeDate(T.Year,T.Month,T.day)+EncodeTime(T.Hour,T.Min,T.Sec,0));
  124. size := FindData.EntryP^.d_size;
  125. name := strpas (FindData.EntryP^.d_nameDOS);
  126. END ELSE
  127. BEGIN
  128. FillChar (f,SIZEOF(f),0);
  129. END;
  130. END;
  131. END;
  132. Function FindFirst (Const Path : String; Attr : Longint; Var Rslt : TSearchRec) : Longint;
  133. begin
  134. IF path = '' then
  135. exit (18);
  136. Rslt.FindData.DirP := _opendir (pchar(Path));
  137. IF Rslt.FindData.DirP = NIL THEN
  138. exit (18);
  139. IF attr <> faAnyFile THEN
  140. _SetReaddirAttribute (Rslt.FindData.DirP, attr);
  141. Rslt.FindData.Magic := $AD01;
  142. Rslt.FindData.EntryP := _readdir (Rslt.FindData.DirP);
  143. IF Rslt.FindData.EntryP = NIL THEN
  144. BEGIN
  145. _closedir (Rslt.FindData.DirP);
  146. Rslt.FindData.DirP := NIL;
  147. exit (18);
  148. END ELSE
  149. BEGIN
  150. find_setfields (Rslt);
  151. exit (0);
  152. END;
  153. end;
  154. Function FindNext (Var Rslt : TSearchRec) : Longint;
  155. begin
  156. IF Rslt.FindData.Magic <> $AD01 THEN
  157. exit (18);
  158. Rslt.FindData.EntryP := _readdir (Rslt.FindData.DirP);
  159. IF Rslt.FindData.EntryP = NIL THEN
  160. exit (18)
  161. ELSE
  162. BEGIN
  163. find_setfields (Rslt);
  164. exit (0);
  165. END;
  166. end;
  167. Procedure FindClose (Var F : TSearchrec);
  168. begin
  169. IF F.FindData.Magic = $AD01 THEN
  170. BEGIN
  171. IF F.FindData.DirP <> NIL THEN
  172. _closedir (F.FindData.DirP);
  173. F.FindData.Magic := 0;
  174. F.FindData.DirP := NIL;
  175. F.FindData.EntryP := NIL;
  176. END;
  177. end;
  178. Function FileGetDate (Handle : Longint) : Longint;
  179. Var Info : NWStatBufT;
  180. PTM : PNWTM;
  181. begin
  182. If _fstat(Handle,Info) <> 0 then
  183. Result:=-1
  184. else
  185. begin
  186. PTM := _localtime (Info.st_mtime);
  187. IF PTM = NIL THEN
  188. exit(-1)
  189. else
  190. WITH PTM^ DO
  191. Result:=DateTimeToFileDate(EncodeDate(tm_year+1900,tm_mon+1,tm_mday)+EncodeTime(tm_hour,tm_min,tm_sec,0));
  192. end;
  193. end;
  194. Function FileSetDate (Handle,Age : Longint) : Longint;
  195. begin
  196. { i think its impossible under netware from FileHandle. I dident found a way to get the
  197. complete pathname of a filehandle, that would be needed for ChangeDirectoryEntry }
  198. FileSetDate:=-1;
  199. ConsolePrintf ('warning: fpc sysutils.FileSetDate not implemented'#13#10,0);
  200. end;
  201. Function FileGetAttr (Const FileName : String) : Longint;
  202. Var Info : NWStatBufT;
  203. begin
  204. If _stat (pchar(FileName),Info) <> 0 then
  205. Result:=-1
  206. Else
  207. Result := Info.st_attr AND $FFFF;
  208. end;
  209. Function FileSetAttr (Const Filename : String; Attr: longint) : Longint;
  210. VAR MS : NWModifyStructure;
  211. begin
  212. FillChar (MS, SIZEOF (MS), 0);
  213. if _ChangeDirectoryEntry (PChar (Filename), MS, MFileAtrributesBit, 0) <> 0 then
  214. exit (-1)
  215. else
  216. exit (0);
  217. end;
  218. Function DeleteFile (Const FileName : String) : Boolean;
  219. begin
  220. Result:= (_UnLink (pchar(FileName)) = 0);
  221. end;
  222. Function RenameFile (Const OldName, NewName : String) : Boolean;
  223. begin
  224. RenameFile:=(_rename(pchar(OldName),pchar(NewName)) = 0);
  225. end;
  226. Function FileSearch (Const Name, DirList : String) : String;
  227. begin
  228. FileSearch:=Dos.FSearch(Name,Dirlist);
  229. end;
  230. {****************************************************************************
  231. Disk Functions
  232. ****************************************************************************}
  233. {
  234. The Diskfree and Disksize functions need a file on the specified drive, since this
  235. is required for the statfs system call.
  236. These filenames are set in drivestr[0..26], and have been preset to :
  237. 0 - '.' (default drive - hence current dir is ok.)
  238. 1 - '/fd0/.' (floppy drive 1 - should be adapted to local system )
  239. 2 - '/fd1/.' (floppy drive 2 - should be adapted to local system )
  240. 3 - '/' (C: equivalent of dos is the root partition)
  241. 4..26 (can be set by you're own applications)
  242. ! Use AddDisk() to Add new drives !
  243. They both return -1 when a failure occurs.
  244. }
  245. Const
  246. FixDriveStr : array[0..3] of pchar=(
  247. '.',
  248. '/fd0/.',
  249. '/fd1/.',
  250. '/.'
  251. );
  252. var
  253. Drives : byte;
  254. DriveStr : array[4..26] of pchar;
  255. Procedure AddDisk(const path:string);
  256. begin
  257. if not (DriveStr[Drives]=nil) then
  258. FreeMem(DriveStr[Drives],StrLen(DriveStr[Drives])+1);
  259. GetMem(DriveStr[Drives],length(Path)+1);
  260. StrPCopy(DriveStr[Drives],path);
  261. inc(Drives);
  262. if Drives>26 then
  263. Drives:=4;
  264. end;
  265. Function DiskFree(Drive: Byte): int64;
  266. //var fs : statfs;
  267. Begin
  268. { if ((Drive<4) and (not (fixdrivestr[Drive]=nil)) and fsstat(StrPas(fixdrivestr[drive]),fs)) or
  269. ((not (drivestr[Drive]=nil)) and fsstat(StrPas(drivestr[drive]),fs)) then
  270. Diskfree:=int64(fs.bavail)*int64(fs.bsize)
  271. else
  272. Diskfree:=-1;}
  273. DiskFree := -1;
  274. ConsolePrintf ('warning: fpc sysutils.diskfree not implemented'#13#10,0);
  275. End;
  276. Function DiskSize(Drive: Byte): int64;
  277. //var fs : statfs;
  278. Begin
  279. { if ((Drive<4) and (not (fixdrivestr[Drive]=nil)) and fsstat(StrPas(fixdrivestr[drive]),fs)) or
  280. ((not (drivestr[Drive]=nil)) and fsstat(StrPas(drivestr[drive]),fs)) then
  281. DiskSize:=int64(fs.blocks)*int64(fs.bsize)
  282. else
  283. DiskSize:=-1;}
  284. DiskSize := -1;
  285. ConsolePrintf ('warning: fpc sysutils.disksize not implemented'#13#10,0);
  286. End;
  287. Function GetCurrentDir : String;
  288. begin
  289. GetDir (0,Result);
  290. end;
  291. Function SetCurrentDir (Const NewDir : String) : Boolean;
  292. begin
  293. {$I-}
  294. ChDir(NewDir);
  295. {$I+}
  296. result := (IOResult = 0);
  297. end;
  298. Function CreateDir (Const NewDir : String) : Boolean;
  299. begin
  300. {$I-}
  301. MkDir(NewDir);
  302. {$I+}
  303. result := (IOResult = 0);
  304. end;
  305. Function RemoveDir (Const Dir : String) : Boolean;
  306. begin
  307. {$I-}
  308. RmDir(Dir);
  309. {$I+}
  310. result := (IOResult = 0);
  311. end;
  312. {****************************************************************************
  313. Misc Functions
  314. ****************************************************************************}
  315. procedure Beep;
  316. begin
  317. _RingTheBell;
  318. end;
  319. {****************************************************************************
  320. Locale Functions
  321. ****************************************************************************}
  322. Procedure GetLocalTime(var SystemTime: TSystemTime);
  323. var xx : word;
  324. begin
  325. Dos.GetTime(SystemTime.Hour, SystemTime.Minute, SystemTime.Second, xx);
  326. Dos.GetDate(SystemTime.Year, SystemTime.Month, SystemTime.Day, xx);
  327. SystemTime.MilliSecond := 0;
  328. end;
  329. Procedure InitAnsi;
  330. Var i : longint;
  331. begin
  332. { Fill table entries 0 to 127 }
  333. for i := 0 to 96 do
  334. UpperCaseTable[i] := chr(i);
  335. for i := 97 to 122 do
  336. UpperCaseTable[i] := chr(i - 32);
  337. for i := 123 to 191 do
  338. UpperCaseTable[i] := chr(i);
  339. Move (CPISO88591UCT,UpperCaseTable[192],SizeOf(CPISO88591UCT));
  340. for i := 0 to 64 do
  341. LowerCaseTable[i] := chr(i);
  342. for i := 65 to 90 do
  343. LowerCaseTable[i] := chr(i + 32);
  344. for i := 91 to 191 do
  345. LowerCaseTable[i] := chr(i);
  346. Move (CPISO88591LCT,UpperCaseTable[192],SizeOf(CPISO88591UCT));
  347. end;
  348. Procedure InitInternational;
  349. begin
  350. InitAnsi;
  351. end;
  352. function SysErrorMessage(ErrorCode: Integer): String;
  353. begin
  354. Result:=''; // StrError(ErrorCode);
  355. end;
  356. {****************************************************************************
  357. OS utility functions
  358. ****************************************************************************}
  359. Function GetEnvironmentVariable(Const EnvVar : String) : String;
  360. begin
  361. Result:=StrPas(_getenv(PChar(EnvVar)));
  362. end;
  363. {****************************************************************************
  364. Initialization code
  365. ****************************************************************************}
  366. Initialization
  367. InitExceptions; { Initialize exceptions. OS independent }
  368. InitInternational; { Initialize internationalization settings }
  369. Finalization
  370. OutOfMemory.Free;
  371. InValidPointer.Free;
  372. end.
  373. {
  374. $Log$
  375. Revision 1.3 2001-04-16 18:39:50 florian
  376. * updates from Armin commited
  377. Revision 1.2 2001/04/11 14:17:00 florian
  378. * added logs, fixed email address of Armin, it is
  379. [email protected]
  380. Revision 1.1 2001/04/11 14:14:12 florian
  381. * initial commit, thanks to Armin Diehl ([email protected])
  382. Revision 1.8 2001/02/20 22:19:38 peter
  383. * always test before commiting after merging, linux -> unix change
  384. Revision 1.7 2001/02/20 22:14:19 peter
  385. * merged getenvironmentvariable
  386. Revision 1.6 2001/01/21 20:21:40 marco
  387. * Rename fest II. Rtl OK
  388. Revision 1.5 2000/12/28 20:50:04 peter
  389. * merged fixes from 1.0.x
  390. Revision 1.4 2000/12/18 14:01:42 jonas
  391. * fixed constant range error
  392. Revision 1.3 2000/11/28 20:06:12 michael
  393. + merged fix for findfirst/findnext/findclose
  394. Revision 1.2 2000/09/18 13:14:51 marco
  395. * Global Linux +bsd to (rtl/freebsd rtl/unix rtl/linux structure)
  396. Revision 1.3 2000/08/29 17:58:13 michael
  397. Merged syserrormsg fix
  398. Revision 1.2 2000/08/20 15:46:46 peter
  399. * sysutils.pp moved to target and merged with disk.inc, filutil.inc
  400. Revision 1.1.2.2 2000/11/28 20:01:22 michael
  401. + Fixed findfirst/findnext/findclose
  402. Revision 1.1.2.1 2000/09/14 13:38:26 marco
  403. * Moved from Linux dir. now start of generic unix dir, from which the
  404. really exotic features should be moved to the target specific dirs.
  405. }