sysutils.pp 13 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 FileCreate (Const FileName : String; mode:longint) : Longint;
  73. begin
  74. FileCreate:=FileCreate (FileName);
  75. end;
  76. Function FileRead (Handle : Longint; Var Buffer; Count : longint) : Longint;
  77. begin
  78. FileRead:=_read (Handle,@Buffer,Count);
  79. end;
  80. Function FileWrite (Handle : Longint; const Buffer; Count : Longint) : Longint;
  81. begin
  82. FileWrite:=_write (Handle,@Buffer,Count);
  83. end;
  84. Function FileSeek (Handle,FOffset,Origin : Longint) : Longint;
  85. begin
  86. FileSeek:=_lseek (Handle,FOffset,Origin);
  87. end;
  88. Function FileSeek (Handle : Longint; FOffset,Origin : Int64) : Int64;
  89. begin
  90. {$warning need to add 64bit FileSeek }
  91. FileSeek:=FileSeek(Handle,Longint(FOffset),Longint(Origin));
  92. end;
  93. Procedure FileClose (Handle : Longint);
  94. begin
  95. _close(Handle);
  96. end;
  97. Function FileTruncate (Handle,Size: Longint) : boolean;
  98. begin
  99. FileTruncate:=(_chsize(Handle,Size) = 0);
  100. end;
  101. Function FileAge (Const FileName : String): Longint;
  102. VAR Info : NWStatBufT;
  103. PTM : PNWTM;
  104. begin
  105. If _stat (pchar(FileName),Info) <> 0 then
  106. exit(-1)
  107. else
  108. begin
  109. PTM := _localtime (Info.st_mtime);
  110. IF PTM = NIL THEN
  111. exit(-1)
  112. else
  113. WITH PTM^ DO
  114. Result:=DateTimeToFileDate(EncodeDate(tm_year+1900,tm_mon+1,tm_mday)+EncodeTime(tm_hour,tm_min,tm_sec,0));
  115. end;
  116. end;
  117. Function FileExists (Const FileName : String) : Boolean;
  118. VAR Info : NWStatBufT;
  119. begin
  120. FileExists:=(_stat(pchar(filename),Info) = 0);
  121. end;
  122. PROCEDURE find_setfields (VAR f : TsearchRec);
  123. VAR T : Dos.DateTime;
  124. BEGIN
  125. WITH F DO
  126. BEGIN
  127. IF FindData.Magic = $AD01 THEN
  128. BEGIN
  129. {attr := FindData.EntryP^.d_attr AND $FF;} // lowest 8 bit -> same as dos
  130. attr := FindData.EntryP^.d_attr; { return complete netware attributes }
  131. UnpackTime(FindData.EntryP^.d_time + (LONGINT (FindData.EntryP^.d_date) SHL 16), T);
  132. time := DateTimeToFileDate(EncodeDate(T.Year,T.Month,T.day)+EncodeTime(T.Hour,T.Min,T.Sec,0));
  133. size := FindData.EntryP^.d_size;
  134. name := strpas (FindData.EntryP^.d_nameDOS);
  135. END ELSE
  136. BEGIN
  137. FillChar (f,SIZEOF(f),0);
  138. END;
  139. END;
  140. END;
  141. Function FindFirst (Const Path : String; Attr : Longint; Var Rslt : TSearchRec) : Longint;
  142. begin
  143. IF path = '' then
  144. exit (18);
  145. Rslt.FindData.DirP := _opendir (pchar(Path));
  146. IF Rslt.FindData.DirP = NIL THEN
  147. exit (18);
  148. IF attr <> faAnyFile THEN
  149. _SetReaddirAttribute (Rslt.FindData.DirP, attr);
  150. Rslt.FindData.Magic := $AD01;
  151. Rslt.FindData.EntryP := _readdir (Rslt.FindData.DirP);
  152. if Rslt.FindData.EntryP = nil then
  153. begin
  154. _closedir (Rslt.FindData.DirP);
  155. Rslt.FindData.DirP := NIL;
  156. result := 18;
  157. end else
  158. begin
  159. find_setfields (Rslt);
  160. result := 0;
  161. end;
  162. end;
  163. Function FindNext (Var Rslt : TSearchRec) : Longint;
  164. begin
  165. IF Rslt.FindData.Magic <> $AD01 THEN
  166. exit (18);
  167. Rslt.FindData.EntryP := _readdir (Rslt.FindData.DirP);
  168. IF Rslt.FindData.EntryP = NIL THEN
  169. exit (18);
  170. find_setfields (Rslt);
  171. result := 0;
  172. end;
  173. Procedure FindClose (Var F : TSearchrec);
  174. begin
  175. IF F.FindData.Magic = $AD01 THEN
  176. BEGIN
  177. IF F.FindData.DirP <> NIL THEN
  178. _closedir (F.FindData.DirP);
  179. F.FindData.Magic := 0;
  180. F.FindData.DirP := NIL;
  181. F.FindData.EntryP := NIL;
  182. END;
  183. end;
  184. Function FileGetDate (Handle : Longint) : Longint;
  185. Var Info : NWStatBufT;
  186. PTM : PNWTM;
  187. begin
  188. If _fstat(Handle,Info) <> 0 then
  189. Result:=-1
  190. else
  191. begin
  192. PTM := _localtime (Info.st_mtime);
  193. IF PTM = NIL THEN
  194. exit(-1)
  195. else
  196. WITH PTM^ DO
  197. Result:=DateTimeToFileDate(EncodeDate(tm_year+1900,tm_mon+1,tm_mday)+EncodeTime(tm_hour,tm_min,tm_sec,0));
  198. end;
  199. end;
  200. Function FileSetDate (Handle,Age : Longint) : Longint;
  201. begin
  202. { i think its impossible under netware from FileHandle. I dident found a way to get the
  203. complete pathname of a filehandle, that would be needed for ChangeDirectoryEntry }
  204. FileSetDate:=-1;
  205. ConsolePrintf ('warning: fpc sysutils.FileSetDate not implemented'#13#10,0);
  206. {$warning FileSetDate not implemented (i think is impossible) }
  207. end;
  208. Function FileGetAttr (Const FileName : String) : Longint;
  209. Var Info : NWStatBufT;
  210. begin
  211. If _stat (pchar(FileName),Info) <> 0 then
  212. Result:=-1
  213. Else
  214. Result := Info.st_attr AND $FFFF;
  215. end;
  216. Function FileSetAttr (Const Filename : String; Attr: longint) : Longint;
  217. VAR MS : NWModifyStructure;
  218. begin
  219. FillChar (MS, SIZEOF (MS), 0);
  220. if _ChangeDirectoryEntry (PChar (Filename), MS, MFileAtrributesBit, 0) <> 0 then
  221. result := -1
  222. else
  223. result := 0;
  224. end;
  225. Function DeleteFile (Const FileName : String) : Boolean;
  226. begin
  227. Result:= (_UnLink (pchar(FileName)) = 0);
  228. end;
  229. Function RenameFile (Const OldName, NewName : String) : Boolean;
  230. begin
  231. RenameFile:=(_rename(pchar(OldName),pchar(NewName)) = 0);
  232. end;
  233. {****************************************************************************
  234. Disk Functions
  235. ****************************************************************************}
  236. {
  237. The Diskfree and Disksize functions need a file on the specified drive, since this
  238. is required for the statfs system call.
  239. These filenames are set in drivestr[0..26], and have been preset to :
  240. 0 - '.' (default drive - hence current dir is ok.)
  241. 1 - '/fd0/.' (floppy drive 1 - should be adapted to local system )
  242. 2 - '/fd1/.' (floppy drive 2 - should be adapted to local system )
  243. 3 - '/' (C: equivalent of dos is the root partition)
  244. 4..26 (can be set by you're own applications)
  245. ! Use AddDisk() to Add new drives !
  246. They both return -1 when a failure occurs.
  247. }
  248. Const
  249. FixDriveStr : array[0..3] of pchar=(
  250. '.',
  251. 'a:.',
  252. 'b:.',
  253. 'sys:/'
  254. );
  255. var
  256. Drives : byte;
  257. DriveStr : array[4..26] of pchar;
  258. Procedure AddDisk(const path:string);
  259. begin
  260. if not (DriveStr[Drives]=nil) then
  261. FreeMem(DriveStr[Drives],StrLen(DriveStr[Drives])+1);
  262. GetMem(DriveStr[Drives],length(Path)+1);
  263. StrPCopy(DriveStr[Drives],path);
  264. inc(Drives);
  265. if Drives>26 then
  266. Drives:=4;
  267. end;
  268. Function DiskFree(Drive: Byte): int64;
  269. //var fs : statfs;
  270. Begin
  271. { if ((Drive<4) and (not (fixdrivestr[Drive]=nil)) and fsstat(StrPas(fixdrivestr[drive]),fs)) or
  272. ((not (drivestr[Drive]=nil)) and fsstat(StrPas(drivestr[drive]),fs)) then
  273. Diskfree:=int64(fs.bavail)*int64(fs.bsize)
  274. else
  275. Diskfree:=-1;}
  276. DiskFree := -1;
  277. ConsolePrintf ('warning: fpc sysutils.diskfree not implemented'#13#10,0);
  278. {$warning DiskFree not implemented (does it make sense ?) }
  279. End;
  280. Function DiskSize(Drive: Byte): int64;
  281. //var fs : statfs;
  282. Begin
  283. { if ((Drive<4) and (not (fixdrivestr[Drive]=nil)) and fsstat(StrPas(fixdrivestr[drive]),fs)) or
  284. ((not (drivestr[Drive]=nil)) and fsstat(StrPas(drivestr[drive]),fs)) then
  285. DiskSize:=int64(fs.blocks)*int64(fs.bsize)
  286. else
  287. DiskSize:=-1;}
  288. DiskSize := -1;
  289. ConsolePrintf ('warning: fpc sysutils.disksize not implemented'#13#10,0);
  290. {$warning DiskSize not implemented (does it make sense ?) }
  291. End;
  292. Function GetCurrentDir : String;
  293. begin
  294. GetDir (0,Result);
  295. end;
  296. Function SetCurrentDir (Const NewDir : String) : Boolean;
  297. begin
  298. {$I-}
  299. ChDir(NewDir);
  300. {$I+}
  301. result := (IOResult = 0);
  302. end;
  303. Function CreateDir (Const NewDir : String) : Boolean;
  304. begin
  305. {$I-}
  306. MkDir(NewDir);
  307. {$I+}
  308. result := (IOResult = 0);
  309. end;
  310. Function RemoveDir (Const Dir : String) : Boolean;
  311. begin
  312. {$I-}
  313. RmDir(Dir);
  314. {$I+}
  315. result := (IOResult = 0);
  316. end;
  317. function DirectoryExists (const Directory: string): boolean;
  318. VAR Info : NWStatBufT;
  319. begin
  320. If _stat (pchar(Directory),Info) <> 0 then
  321. exit(false)
  322. else
  323. Exit ((Info.st_attr and faDirectory) <> 0);
  324. end;
  325. {****************************************************************************
  326. Misc Functions
  327. ****************************************************************************}
  328. procedure Beep;
  329. begin
  330. _RingTheBell;
  331. end;
  332. {****************************************************************************
  333. Locale Functions
  334. ****************************************************************************}
  335. Procedure GetLocalTime(var SystemTime: TSystemTime);
  336. var xx : word;
  337. begin
  338. Dos.GetTime(SystemTime.Hour, SystemTime.Minute, SystemTime.Second, xx);
  339. Dos.GetDate(SystemTime.Year, SystemTime.Month, SystemTime.Day, xx);
  340. SystemTime.MilliSecond := 0;
  341. end;
  342. Procedure InitAnsi;
  343. Var i : longint;
  344. begin
  345. { Fill table entries 0 to 127 }
  346. for i := 0 to 96 do
  347. UpperCaseTable[i] := chr(i);
  348. for i := 97 to 122 do
  349. UpperCaseTable[i] := chr(i - 32);
  350. for i := 123 to 191 do
  351. UpperCaseTable[i] := chr(i);
  352. Move (CPISO88591UCT,UpperCaseTable[192],SizeOf(CPISO88591UCT));
  353. for i := 0 to 64 do
  354. LowerCaseTable[i] := chr(i);
  355. for i := 65 to 90 do
  356. LowerCaseTable[i] := chr(i + 32);
  357. for i := 91 to 191 do
  358. LowerCaseTable[i] := chr(i);
  359. Move (CPISO88591LCT,UpperCaseTable[192],SizeOf(CPISO88591UCT));
  360. end;
  361. Procedure InitInternational;
  362. begin
  363. InitAnsi;
  364. end;
  365. function SysErrorMessage(ErrorCode: Integer): String;
  366. begin
  367. Result:=''; // StrError(ErrorCode);
  368. end;
  369. {****************************************************************************
  370. OS utility functions
  371. ****************************************************************************}
  372. Function GetEnvironmentVariable(Const EnvVar : String) : String;
  373. begin
  374. Result:=StrPas(_getenv(PChar(EnvVar)));
  375. end;
  376. {****************************************************************************
  377. Initialization code
  378. ****************************************************************************}
  379. Initialization
  380. InitExceptions; { Initialize exceptions. OS independent }
  381. InitInternational; { Initialize internationalization settings }
  382. Finalization
  383. DoneExceptions;
  384. end.
  385. {
  386. $Log$
  387. Revision 1.12 2003-10-25 23:42:35 hajny
  388. * THandle in sysutils common using System.THandle
  389. Revision 1.11 2003/04/12 13:21:27 armin
  390. * added THandle
  391. Revision 1.10 2003/03/30 12:35:43 armin
  392. * removed uses netware from winsock, DirectoryExists implemented
  393. Revision 1.9 2003/03/29 15:16:26 hajny
  394. * dummy DirectoryExists added
  395. Revision 1.8 2003/02/15 19:12:54 armin
  396. * changes for new threadvar support
  397. Revision 1.7 2002/09/07 16:01:21 peter
  398. * old logs removed and tabs fixed
  399. Revision 1.6 2002/04/01 10:47:31 armin
  400. makefile.fpc for netware
  401. stderr to netware console
  402. free all memory (threadvars and heap) to avoid error message while unloading nlm
  403. Revision 1.5 2002/03/08 19:10:14 armin
  404. * added 64 bit fileseek (currently only 32 bit supported)
  405. }