dos.pp 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761
  1. {
  2. $Id$
  3. This file is part of the Free Pascal run time library.
  4. Copyright (c) 1999-2000 by the Free Pascal development team.
  5. Dos unit for BP7 compatible RTL (novell netware)
  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. { 2000/09/03 armin: first version
  13. 2001/04/08 armin: implemented more functions
  14. OK: Implemented and tested
  15. NI: not implemented
  16. 2001/04/15 armin: FindFirst bug corrected, FExpand and FSearch tested, GetCBreak, SetCBreak
  17. implemented
  18. }
  19. unit dos;
  20. interface
  21. Const
  22. FileNameLen = 255;
  23. Type
  24. searchrec = packed record
  25. DirP : POINTER; { used for opendir }
  26. EntryP: POINTER; { and readdir }
  27. Magic : WORD;
  28. fill : array[1..11] of byte;
  29. attr : byte;
  30. time : longint;
  31. { reserved : word; not in DJGPP V2 }
  32. size : longint;
  33. name : string[255]; { NW uses only [12] but more can't hurt }
  34. end;
  35. registers = packed record
  36. case i : integer of
  37. 0 : (ax,f1,bx,f2,cx,f3,dx,f4,bp,f5,si,f51,di,f6,ds,f7,es,f8,flags,fs,gs : word);
  38. 1 : (al,ah,f9,f10,bl,bh,f11,f12,cl,ch,f13,f14,dl,dh : byte);
  39. 2 : (eax, ebx, ecx, edx, ebp, esi, edi : longint);
  40. end;
  41. {$i dosh.inc}
  42. implementation
  43. uses
  44. strings;
  45. {$ASMMODE ATT}
  46. {$I nwsys.inc }
  47. {*****************************************************************************
  48. --- Info / Date / Time ---
  49. ******************************************************************************}
  50. {$PACKRECORDS 4}
  51. function dosversion : word;
  52. VAR F : FILE_SERV_INFO;
  53. begin
  54. IF GetServerInformation(SIZEOF(F),@F) = 0 THEN
  55. dosversion := WORD (F.netwareVersion) SHL 8 + F.netwareSubVersion;
  56. end;
  57. procedure getdate(var year,month,mday,wday : word);
  58. VAR N : NWdateAndTime;
  59. begin
  60. GetFileServerDateAndTime (N);
  61. wday:=N.DayOfWeek;
  62. year:=1900 + N.Year;
  63. month:=N.Month;
  64. mday:=N.Day;
  65. end;
  66. procedure setdate(year,month,day : word);
  67. VAR N : NWdateAndTime;
  68. begin
  69. GetFileServerDateAndTime (N);
  70. SetFileServerDateAndTime(year,month,day,N.Hour,N.Minute,N.Second);
  71. end;
  72. procedure gettime(var hour,minute,second,sec100 : word);
  73. VAR N : NWdateAndTime;
  74. begin
  75. GetFileServerDateAndTime (N);
  76. hour := N.Hour;
  77. Minute:= N.Minute;
  78. Second := N.Second;
  79. sec100 := 0;
  80. end;
  81. procedure settime(hour,minute,second,sec100 : word);
  82. VAR N : NWdateAndTime;
  83. begin
  84. GetFileServerDateAndTime (N);
  85. SetFileServerDateAndTime(N.year,N.month,N.day,hour,minute,second);
  86. end;
  87. Procedure packtime(var t : datetime;var p : longint);
  88. Begin
  89. 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);
  90. End;
  91. Procedure unpacktime(p : longint;var t : datetime);
  92. Begin
  93. with t do
  94. begin
  95. sec:=(p and 31) shl 1;
  96. min:=(p shr 5) and 63;
  97. hour:=(p shr 11) and 31;
  98. day:=(p shr 16) and 31;
  99. month:=(p shr 21) and 15;
  100. year:=(p shr 25)+1980;
  101. end;
  102. End;
  103. {******************************************************************************
  104. --- Exec ---
  105. ******************************************************************************}
  106. var
  107. lastdosexitcode : word;
  108. procedure exec(const path : pathstr;const comline : comstr);
  109. begin
  110. ConsolePrintf ('warning: fpc dos.exec not implemented'#13#10,0);
  111. end;
  112. function dosexitcode : word;
  113. begin
  114. dosexitcode:=lastdosexitcode;
  115. end;
  116. procedure getcbreak(var breakvalue : boolean);
  117. begin
  118. breakvalue := _SetCtrlCharCheckMode (false); { get current setting }
  119. if breakvalue then
  120. _SetCtrlCharCheckMode (breakvalue); { and restore old setting }
  121. end;
  122. procedure setcbreak(breakvalue : boolean);
  123. begin
  124. _SetCtrlCharCheckMode (breakvalue);
  125. end;
  126. procedure getverify(var verify : boolean);
  127. begin
  128. verify := true;
  129. end;
  130. procedure setverify(verify : boolean);
  131. begin
  132. end;
  133. {******************************************************************************
  134. --- Disk ---
  135. ******************************************************************************}
  136. function getvolnum (drive : byte) : longint;
  137. var dir : STRING[255];
  138. P,PS,
  139. V : LONGINT;
  140. begin
  141. if drive = 0 then
  142. begin // get volume name from current directory (i.e. SERVER-NAME/VOL2:TEST)
  143. getdir (0,dir);
  144. p := pos (':', dir);
  145. if p = 0 then
  146. begin
  147. getvolnum := -1;
  148. exit;
  149. end;
  150. byte (dir[0]) := p-1;
  151. dir[p] := #0;
  152. PS := pos ('/', dir);
  153. INC (PS);
  154. if _GetVolumeNumber (@dir[PS], V) <> 0 then
  155. getvolnum := -1
  156. else
  157. getvolnum := V;
  158. end else
  159. getvolnum := drive-1;
  160. end;
  161. {$ifdef Int64}
  162. function diskfree(drive : byte) : int64;
  163. VAR Buf : ARRAY [0..255] OF CHAR;
  164. TotalBlocks : WORD;
  165. SectorsPerBlock : WORD;
  166. availableBlocks : WORD;
  167. totalDirectorySlots : WORD;
  168. availableDirSlots : WORD;
  169. volumeisRemovable : WORD;
  170. volumeNumber : LONGINT;
  171. begin
  172. volumeNumber := getvolnum (drive);
  173. if volumeNumber >= 0 then
  174. begin
  175. {i think thats not the right function but for others i need a connection handle}
  176. if _GetVolumeInfoWithNumber (volumeNumber,@Buf,
  177. TotalBlocks,
  178. SectorsPerBlock,
  179. availableBlocks,
  180. totalDirectorySlots,
  181. availableDirSlots,
  182. volumeisRemovable) = 0 THEN
  183. begin
  184. diskfree := int64 (availableBlocks) * int64 (SectorsPerBlock) * 512;
  185. end else
  186. diskfree := 0;
  187. end else
  188. diskfree := 0;
  189. end;
  190. function disksize(drive : byte) : int64;
  191. VAR Buf : ARRAY [0..255] OF CHAR;
  192. TotalBlocks : WORD;
  193. SectorsPerBlock : WORD;
  194. availableBlocks : WORD;
  195. totalDirectorySlots : WORD;
  196. availableDirSlots : WORD;
  197. volumeisRemovable : WORD;
  198. volumeNumber : LONGINT;
  199. begin
  200. volumeNumber := getvolnum (drive);
  201. if volumeNumber >= 0 then
  202. begin
  203. {i think thats not the right function but for others i need a connection handle}
  204. if _GetVolumeInfoWithNumber (volumeNumber,@Buf,
  205. TotalBlocks,
  206. SectorsPerBlock,
  207. availableBlocks,
  208. totalDirectorySlots,
  209. availableDirSlots,
  210. volumeisRemovable) = 0 THEN
  211. begin
  212. disksize := int64 (TotalBlocks) * int64 (SectorsPerBlock) * 512;
  213. end else
  214. disksize := 0;
  215. end else
  216. disksize := 0;
  217. end;
  218. {$else}
  219. function diskfree(drive : byte) : longint;
  220. VAR Buf : ARRAY [0..255] OF CHAR;
  221. TotalBlocks : WORD;
  222. SectorsPerBlock : WORD;
  223. availableBlocks : WORD;
  224. totalDirectorySlots : WORD;
  225. availableDirSlots : WORD;
  226. volumeisRemovable : WORD;
  227. volumeNumber : LONGINT;
  228. begin
  229. volumeNumber := getvolnum (drive);
  230. if (volumeNumber >= 0) and (volumeNumber <= 255) then
  231. begin
  232. {i think thats not the right function but for others i need a connection handle}
  233. if _GetVolumeInfoWithNumber (byte(volumeNumber),@Buf,
  234. TotalBlocks,
  235. SectorsPerBlock,
  236. availableBlocks,
  237. totalDirectorySlots,
  238. availableDirSlots,
  239. volumeisRemovable) = 0 THEN
  240. begin
  241. diskfree := availableBlocks * SectorsPerBlock * 512;
  242. end else
  243. diskfree := 0;
  244. end else
  245. diskfree := 0;
  246. end;
  247. function disksize(drive : byte) : longint;
  248. VAR Buf : ARRAY [0..255] OF CHAR;
  249. TotalBlocks : WORD;
  250. SectorsPerBlock : WORD;
  251. availableBlocks : WORD;
  252. totalDirectorySlots : WORD;
  253. availableDirSlots : WORD;
  254. volumeisRemovable : WORD;
  255. volumeNumber : LONGINT;
  256. begin
  257. volumeNumber := getvolnum (drive);
  258. if (volumeNumber >= 0) and (volumeNumber <= 255) then
  259. begin
  260. {i think thats not the right function but for others i need a connection handle}
  261. if _GetVolumeInfoWithNumber (byte(volumeNumber),@Buf,
  262. TotalBlocks,
  263. SectorsPerBlock,
  264. availableBlocks,
  265. totalDirectorySlots,
  266. availableDirSlots,
  267. volumeisRemovable) = 0 THEN
  268. begin
  269. disksize := TotalBlocks * SectorsPerBlock * 512;
  270. end else
  271. disksize := 0;
  272. end else
  273. disksize := 0;
  274. end;
  275. {$endif}
  276. {******************************************************************************
  277. --- Findfirst FindNext ---
  278. ******************************************************************************}
  279. PROCEDURE find_setfields (VAR f : searchRec);
  280. BEGIN
  281. WITH F DO
  282. BEGIN
  283. IF Magic = $AD01 THEN
  284. BEGIN
  285. attr := WORD (PNWDirEnt(EntryP)^.d_attr); // lowest 16 bit -> same as dos
  286. time := PNWDirEnt(EntryP)^.d_time + (LONGINT (PNWDirEnt(EntryP)^.d_date) SHL 16);
  287. size := PNWDirEnt(EntryP)^.d_size;
  288. name := strpas (PNWDirEnt(EntryP)^.d_nameDOS);
  289. doserror := 0;
  290. END ELSE
  291. BEGIN
  292. FillChar (f,SIZEOF(f),0);
  293. doserror := 18;
  294. END;
  295. END;
  296. END;
  297. procedure findfirst(const path : pathstr;attr : word;var f : searchRec);
  298. var
  299. path0 : array[0..256] of char;
  300. begin
  301. IF path = '' then
  302. begin
  303. doserror := 18;
  304. exit;
  305. end;
  306. strpcopy(path0,path);
  307. PNWDirEnt(f.DirP) := _opendir (path0);
  308. IF f.DirP = NIL THEN
  309. doserror := 18
  310. ELSE
  311. BEGIN
  312. IF attr <> anyfile THEN
  313. _SetReaddirAttribute (PNWDirEnt(f.DirP), attr);
  314. F.Magic := $AD01;
  315. PNWDirEnt(f.EntryP) := _readdir (PNWDirEnt(f.DirP));
  316. IF F.EntryP = NIL THEN
  317. BEGIN
  318. _closedir (PNWDirEnt(f.DirP));
  319. f.Magic := 0;
  320. doserror := 18;
  321. END ELSE
  322. find_setfields (f);
  323. END;
  324. end;
  325. procedure findnext(var f : searchRec);
  326. begin
  327. IF F.Magic <> $AD01 THEN
  328. BEGIN
  329. doserror := 18;
  330. EXIT;
  331. END;
  332. doserror:=0;
  333. PNWDirEnt(f.EntryP) := _readdir (PNWDirEnt(f.DirP));
  334. IF F.EntryP = NIL THEN
  335. doserror := 18
  336. ELSE
  337. find_setfields (f);
  338. end;
  339. Procedure FindClose(Var f: SearchRec);
  340. begin
  341. IF F.Magic <> $AD01 THEN
  342. BEGIN
  343. doserror := 18;
  344. EXIT;
  345. END;
  346. doserror:=0;
  347. _closedir (PNWDirEnt(f.DirP));
  348. f.Magic := 0;
  349. f.DirP := NIL;
  350. f.EntryP := NIL;
  351. end;
  352. procedure swapvectors;
  353. begin
  354. end;
  355. {******************************************************************************
  356. --- File ---
  357. ******************************************************************************}
  358. procedure fsplit(path : pathstr;var dir : dirstr;var name : namestr;var ext : extstr);
  359. var
  360. dotpos,p1,i : longint;
  361. begin
  362. { allow slash as backslash }
  363. for i:=1 to length(path) do
  364. if path[i]='/' then path[i]:='\';
  365. { get drive name }
  366. p1:=pos(':',path);
  367. if p1>0 then
  368. begin
  369. dir:=path[1]+':';
  370. delete(path,1,p1);
  371. end
  372. else
  373. dir:='';
  374. { split the path and the name, there are no more path informtions }
  375. { if path contains no backslashes }
  376. while true do
  377. begin
  378. p1:=pos('\',path);
  379. if p1=0 then
  380. break;
  381. dir:=dir+copy(path,1,p1);
  382. delete(path,1,p1);
  383. end;
  384. { try to find out a extension }
  385. if LFNSupport then
  386. begin
  387. Ext:='';
  388. i:=Length(Path);
  389. DotPos:=256;
  390. While (i>0) Do
  391. Begin
  392. If (Path[i]='.') Then
  393. begin
  394. DotPos:=i;
  395. break;
  396. end;
  397. Dec(i);
  398. end;
  399. Ext:=Copy(Path,DotPos,255);
  400. Name:=Copy(Path,1,DotPos - 1);
  401. end
  402. else
  403. begin
  404. p1:=pos('.',path);
  405. if p1>0 then
  406. begin
  407. ext:=copy(path,p1,4);
  408. delete(path,p1,length(path)-p1+1);
  409. end
  410. else
  411. ext:='';
  412. name:=path;
  413. end;
  414. end;
  415. function fexpand(const path : pathstr) : pathstr;
  416. var
  417. s,pa : pathstr;
  418. i,j : longint;
  419. begin
  420. getdir(0,s);
  421. i:=ioresult;
  422. if LFNSupport then
  423. begin
  424. pa:=path;
  425. end
  426. else
  427. if FileNameCaseSensitive then
  428. pa:=path
  429. else
  430. pa:=upcase(path);
  431. { allow slash as backslash }
  432. for i:=1 to length(pa) do
  433. if pa[i]='/' then
  434. pa[i]:='\';
  435. if (length(pa)>1) and (pa[2]=':') and (pa[1] in ['A'..'Z','a'..'z']) then
  436. begin
  437. { Always uppercase driveletter }
  438. if (pa[1] in ['a'..'z']) then
  439. pa[1]:=Chr(Ord(Pa[1])-32);
  440. { we must get the right directory }
  441. getdir(ord(pa[1])-ord('A')+1,s);
  442. i:=ioresult;
  443. if (ord(pa[0])>2) and (pa[3]<>'\') then
  444. if pa[1]=s[1] then
  445. begin
  446. { remove ending slash if it already exists }
  447. if s[length(s)]='\' then
  448. dec(s[0]);
  449. pa:=s+'\'+copy (pa,3,length(pa));
  450. end
  451. else
  452. pa:=pa[1]+':\'+copy (pa,3,length(pa))
  453. end
  454. else
  455. if pa[1]='\' then
  456. begin
  457. { Do not touch Network drive names if LFNSupport is true }
  458. if not ((Length(pa)>1) and (pa[2]='\') and LFNSupport) then
  459. pa:=s[1]+':'+pa;
  460. end
  461. else if s[0]=#3 then
  462. pa:=s+pa
  463. else
  464. pa:=s+'\'+pa;
  465. { Turbo Pascal gives current dir on drive if only drive given as parameter! }
  466. if length(pa) = 2 then
  467. begin
  468. getdir(byte(pa[1])-64,s);
  469. pa := s;
  470. end;
  471. {First remove all references to '\.\'}
  472. while pos ('\.\',pa)<>0 do
  473. delete (pa,pos('\.\',pa),2);
  474. {Now remove also all references to '\..\' + of course previous dirs..}
  475. repeat
  476. i:=pos('\..\',pa);
  477. if i<>0 then
  478. begin
  479. j:=i-1;
  480. while (j>1) and (pa[j]<>'\') do
  481. dec (j);
  482. if pa[j+1] = ':' then j := 3;
  483. delete (pa,j,i-j+3);
  484. end;
  485. until i=0;
  486. { Turbo Pascal gets rid of a \.. at the end of the path }
  487. { Now remove also any reference to '\..' at end of line
  488. + of course previous dir.. }
  489. i:=pos('\..',pa);
  490. if i<>0 then
  491. begin
  492. if i = length(pa) - 2 then
  493. begin
  494. j:=i-1;
  495. while (j>1) and (pa[j]<>'\') do
  496. dec (j);
  497. delete (pa,j,i-j+3);
  498. end;
  499. pa := pa + '\';
  500. end;
  501. { Remove End . and \}
  502. if (length(pa)>0) and (pa[length(pa)]='.') then
  503. dec(byte(pa[0]));
  504. { if only the drive + a '\' is left then the '\' should be left to prevtn the program
  505. accessing the current directory on the drive rather than the root!}
  506. { if the last char of path = '\' then leave it in as this is what TP does! }
  507. if ((length(pa)>3) and (pa[length(pa)]='\')) and (path[length(path)] <> '\') then
  508. dec(byte(pa[0]));
  509. { if only a drive is given in path then there should be a '\' at the
  510. end of the string given back }
  511. if length(pa) = 2 then pa := pa + '\';
  512. fexpand:=pa;
  513. end;
  514. Function FSearch(path: pathstr; dirlist: string): pathstr;
  515. var
  516. i,p1 : longint;
  517. s : searchrec;
  518. newdir : pathstr;
  519. begin
  520. { check if the file specified exists }
  521. findfirst(path,anyfile,s);
  522. if doserror=0 then
  523. begin
  524. findclose(s);
  525. fsearch:=path;
  526. exit;
  527. end;
  528. { No wildcards allowed in these things }
  529. if (pos('?',path)<>0) or (pos('*',path)<>0) then
  530. fsearch:=''
  531. else
  532. begin
  533. { allow slash as backslash }
  534. for i:=1 to length(dirlist) do
  535. if dirlist[i]='/' then dirlist[i]:='\';
  536. repeat
  537. p1:=pos(';',dirlist);
  538. if p1<>0 then
  539. begin
  540. newdir:=copy(dirlist,1,p1-1);
  541. delete(dirlist,1,p1);
  542. end
  543. else
  544. begin
  545. newdir:=dirlist;
  546. dirlist:='';
  547. end;
  548. if (newdir<>'') and (not (newdir[length(newdir)] in ['\',':'])) then
  549. newdir:=newdir+'\';
  550. findfirst(newdir+path,anyfile,s);
  551. if doserror=0 then
  552. newdir:=newdir+path
  553. else
  554. newdir:='';
  555. until (dirlist='') or (newdir<>'');
  556. fsearch:=newdir;
  557. end;
  558. findclose(s);
  559. end;
  560. {******************************************************************************
  561. --- Get/Set File Time,Attr ---
  562. ******************************************************************************}
  563. procedure getftime(var f;var time : longint);
  564. VAR StatBuf : NWStatBufT;
  565. T : DateTime;
  566. DosDate,
  567. DosTime : WORD;
  568. begin
  569. IF _fstat (FileRec (f).Handle, StatBuf) = 0 THEN
  570. BEGIN
  571. _ConvertTimeToDos (StatBuf.st_mtime, DosDate, DosTime);
  572. time := DosTime + (LONGINT (DosDate) SHL 16);
  573. END ELSE
  574. time := 0;
  575. end;
  576. procedure setftime(var f;time : longint);
  577. begin
  578. {is there a netware function to do that ?????}
  579. ConsolePrintf ('warning: fpc dos.setftime not implemented'#13#10,0);
  580. end;
  581. procedure getfattr(var f;var attr : word);
  582. VAR StatBuf : NWStatBufT;
  583. begin
  584. IF _fstat (FileRec (f).Handle, StatBuf) = 0 THEN
  585. BEGIN
  586. attr := word (StatBuf.st_attr);
  587. END ELSE
  588. attr := 0;
  589. end;
  590. procedure setfattr(var f;attr : word);
  591. begin
  592. {is there a netware function to do that ?????}
  593. ConsolePrintf ('warning: fpc dos.setfattr not implemented'#13#10,0);
  594. end;
  595. {******************************************************************************
  596. --- Environment ---
  597. ******************************************************************************}
  598. function envcount : longint;
  599. begin
  600. envcount := 0; {is there a netware function to do that ?????}
  601. ConsolePrintf ('warning: fpc dos.envcount not implemented'#13#10,0);
  602. end;
  603. function envstr(index : integer) : string;
  604. begin
  605. envstr := ''; {is there a netware function to do that ?????}
  606. ConsolePrintf ('warning: fpc dos.envstr not implemented'#13#10,0);
  607. end;
  608. { the function exists in clib but i dont know how to set environment vars.
  609. may be it's only a dummy in clib }
  610. Function GetEnv(envvar: string): string;
  611. var
  612. envvar0 : array[0..256] of char;
  613. p : pchar;
  614. begin
  615. strpcopy(envvar0,envvar);
  616. p := _getenv (envvar0);
  617. if p = NIL then
  618. GetEnv := ''
  619. else
  620. GetEnv := strpas (p);
  621. end;
  622. {******************************************************************************
  623. --- Not Supported ---
  624. ******************************************************************************}
  625. Procedure keep(exitcode : word);
  626. Begin
  627. { no netware equivalent }
  628. End;
  629. Procedure getintvec(intno : byte;var vector : pointer);
  630. Begin
  631. { no netware equivalent }
  632. End;
  633. Procedure setintvec(intno : byte;vector : pointer);
  634. Begin
  635. { no netware equivalent }
  636. End;
  637. procedure intr(intno : byte;var regs : registers);
  638. begin
  639. { no netware equivalent }
  640. end;
  641. procedure msdos(var regs : registers);
  642. begin
  643. { no netware equivalent }
  644. end;
  645. end.
  646. {
  647. $Log$
  648. Revision 1.7 2004-02-09 12:03:16 michael
  649. + Switched to single interface in dosh.inc
  650. Revision 1.6 2003/03/25 18:17:54 armin
  651. * support for fcl, support for linking without debug info
  652. * renamed winsock2 to winsock for win32 compatinility
  653. * new sockets unit for netware
  654. * changes for compiler warnings
  655. Revision 1.5 2002/09/07 16:01:20 peter
  656. * old logs removed and tabs fixed
  657. }