cdromlin.inc 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171
  1. uses
  2. baseunix,
  3. unix,
  4. lincd;
  5. Function ReadCDTOC(Device : String; Var CDTOC : Array of TTocEntry) : Integer;
  6. Var
  7. I,Drive : Integer;
  8. tochdr : Tcdrom_tochdr;
  9. tocentry : tcdrom_tocentry;
  10. begin
  11. drive:=fpOpen(Device, Open_RDONLY or Open_NONBLOCK);
  12. if drive<0 then
  13. begin
  14. Result:=-1;
  15. Exit;
  16. end;
  17. if fpioctl(drive, CDROMREADTOCHDR, @tochdr)<>0 then
  18. begin
  19. Result:=-1;
  20. Exit;
  21. end;
  22. If (tochdr.cdth_trk1-tochdr.cdth_trk0)>High(CDToc) then
  23. Result:=-2
  24. else
  25. begin
  26. Result:=0;
  27. for i := tochdr.cdth_trk0 to tochdr.cdth_trk1 do
  28. begin
  29. tocentry.cdte_track := i;
  30. tocentry.cdte_format := CDROM_MSF;
  31. fpIOCtl(drive, CDROMREADTOCENTRY, @tocentry);
  32. // We should do some error checking here actually.
  33. With cdtoc[result] do
  34. begin
  35. min := tocentry.cdte_addr.msf.minute;
  36. sec := tocentry.cdte_addr.msf.second;
  37. frame := tocentry.cdte_addr.msf.frame;
  38. inc(frame,min*60*75);
  39. inc(frame,sec*75);
  40. end;
  41. Inc(result);
  42. end;
  43. tocentry.cdte_track := $AA;
  44. tocentry.cdte_format := CDROM_MSF;
  45. fpIOCtl(drive, CDROMREADTOCENTRY, @tocentry);
  46. With cdtoc[Result] do
  47. begin
  48. Min := tocentry.cdte_addr.msf.minute;
  49. sec := tocentry.cdte_addr.msf.second;
  50. frame := tocentry.cdte_addr.msf.frame;
  51. inc(frame, min*60*75);
  52. inc(frame, sec*75);
  53. end;
  54. end;
  55. fpClose(drive);
  56. end;
  57. { ---------------------------------------------------------------------
  58. /etc/fstab scanning.
  59. ---------------------------------------------------------------------}
  60. Function ExtractDevice(S : String) : String;
  61. Var
  62. P,L : Integer;
  63. begin
  64. Result:='';
  65. P:=Pos('#',S);
  66. If P<>0 then
  67. S:=Copy(S,1,P-1);
  68. If Length(S)>0 then
  69. begin
  70. P:=1;
  71. While (P<=Length(S)) and (S[P] in [#9,' ']) do
  72. Inc(p);
  73. L:=P;
  74. While (L<=Length(S)) and (Not (S[L] in [#9,' '])) do
  75. Inc(L);
  76. If L>P then
  77. Result:=Copy(S,P,L-P);
  78. end;
  79. end;
  80. Function TestFSTab(var Devices : Array of String) : Integer;
  81. Var
  82. fstab : text;
  83. Line : String;
  84. begin
  85. Result:=0;
  86. Assign(FSTab,'/etc/fstab');
  87. {$i-}
  88. Reset(fstab);
  89. {$i+}
  90. If IOResult=0 then
  91. begin
  92. While Not EOF(fstab) do
  93. begin
  94. ReadLn(fsTab,Line);
  95. Line:=ExtractDevice(Line);
  96. If IsCdDevice(Line) and (Result<=High(Devices)) then
  97. begin
  98. Devices[Result]:=Line;
  99. inc(Result);
  100. end;
  101. end;
  102. Close(fstab);
  103. end
  104. else
  105. Result:=-1;
  106. end;
  107. Function GetCDRomDevices(Var Devices : Array of string) : Integer;
  108. Function AlreadyAdded(AName: String; AMax: Integer): Boolean;
  109. var
  110. I: Integer;
  111. begin
  112. Result := False;
  113. for I := 0 to AMax do
  114. if Devices[I] = AName then
  115. Exit(True);
  116. end;
  117. // Resolves name if it's a symlink and adds it ensuring no dups
  118. Function AddCdrom(ACDRom: String; I: Integer): Integer;
  119. var
  120. SInfo : stat;
  121. RealName: String;
  122. begin
  123. Result := I;
  124. if fpStat(PChar(ACDRom), SInfo) <> -1 then
  125. begin
  126. RealName := ACDRom;
  127. if SInfo.st_mode and S_IFMT = S_IFLNK then
  128. RealName := fpReadLink(ACDRom);
  129. if not AlreadyAdded(RealName, I-1) then
  130. begin
  131. Devices[I] := RealName;
  132. Result := I+1;
  133. end;
  134. end;
  135. end;
  136. var
  137. I,J: Integer;
  138. CDRec: TCDSearchRec;
  139. FSTab: array[0..10] of String;
  140. begin
  141. I := 0;
  142. // First Add Entries From FSTab
  143. for J := 0 to TestFSTab(FSTab)-1 do
  144. I := AddCdrom(FSTab[J], I);
  145. //Now Do A Search
  146. if FindFirstCD(CDRec) then
  147. repeat
  148. I := AddCdrom(CDRec.Name, I);
  149. until FindNextCD(CDRec) = False;
  150. Result := I;
  151. end;