* Patch GetCDRomDevices so all CD roms are used, by Andrew H (18314)

git-svn-id: trunk@17228 -
This commit is contained in:
michael 2011-04-02 15:58:21 +00:00
parent b78f9f7706
commit a1631aa703
2 changed files with 111 additions and 12 deletions

View File

@ -117,20 +117,55 @@ end;
Function GetCDRomDevices(Var Devices : Array of string) : Integer;
Var
S : String;
Function AlreadyAdded(AName: String; AMax: Integer): Boolean;
var
I: Integer;
begin
Result := False;
for I := 0 to AMax do
if Devices[I] = AName then
Exit(True);
end;
// Resolves name if it's a symlink and adds it ensuring no dups
Function AddCdrom(ACDRom: String; I: Integer): Integer;
var
SInfo : stat;
RealName: String;
begin
Result := I;
if fpStat(PChar(ACDRom), SInfo) <> -1 then
begin
RealName := ACDRom;
if SInfo.st_mode and S_IFMT = S_IFLNK then
RealName := fpReadLink(ACDRom);
if not AlreadyAdded(RealName, I-1) then
begin
Devices[I] := RealName;
Result := I+1;
end;
end;
end;
var
I,J: Integer;
CDRec: TCDSearchRec;
FSTab: array[0..10] of String;
begin
Result:=TestFSTab(Devices);
If (Result<1) then
begin
S:=DetectCD;
If (S<>'') then
begin
Devices[0]:=S;
Result:=1;
end;
end
I := 0;
// First Add Entries From FSTab
for J := 0 to TestFSTab(FSTab)-1 do
I := AddCdrom(FSTab[J], I);
//Now Do A Search
if FindFirstCD(CDRec) then
repeat
I := AddCdrom(CDRec.Name, I);
until FindNextCD(CDRec) = False;
Result := I;
end;

View File

@ -708,8 +708,15 @@ procedure set_sense_key(var a : Trequest_sense; __sense_key : Tu8);
{ ---------------------------------------------------------------------
Utility functions
---------------------------------------------------------------------}
type
TCDSearchRec = record
Name: String;
i,j: Integer;
end;
Function IsCDDevice(Device : String) : Boolean;
Function FindFirstCD(var ACDSearchRec: TCDSearchRec): Boolean;
Function FindNextCD(var ACDSearchRec: TCDSearchRec): Boolean;
Function DetectCd : String;
implementation
@ -1098,6 +1105,61 @@ Const
'/dev/sr?',
'/dev/optcd');
function FindFirstCD(var ACDSearchRec: TCDSearchRec): Boolean;
begin
Result := False;
With ACDSearchRec do
begin
I := 1;
J := 0;
Name := '';
end;
Result := FindNextCD(ACDSearchRec);
end;
function FindNextCD(var ACDSearchRec: TCDSearchRec): Boolean;
var
L: integer;
S: String;
FoundDev: String;
begin
Result := False;
FoundDev := '';
with ACDSearchRec do
begin
While (FoundDev='') and (I<NrDevices) do
begin
S:=Devices[i];
L:=Length(S);
If S[l]='?' then
begin
S:=Copy(S,1,L-1);
if j >= 3 then
j := 0;
while (j <= 3) and (Length(FoundDev)=0) do
begin
If IsCdDevice(S+Chr(Ord('0')+J)) then
FoundDev:=S+Chr(Ord('0')+J)
else If IsCdDevice(S+Chr(Ord('a')+J)) then
FoundDev:=S+Chr(Ord('a')+J);
Inc(j);
end;
if J >= 3 then
Inc(i);
end
else
begin
If IsCdDevice(S) then
FoundDev:=S;
Inc(i);
end;
end;
end;
Result := Length(FoundDev) > 0;
ACDSearchRec.Name:=FoundDev;
end;
Function DetectCD : String;
Var
@ -1163,7 +1225,9 @@ begin
If fpStat(Device,info)<>0 then
exit;
DeviceMajor:=info.st_rdev shr 8;
{$ifdef debug}
Writeln('Device major : ',DeviceMajor);
{$endif}
If DeviceMajor in [IDE0_MAJOR,IDE1_MAJOR,IDE2_MAJOR,IDE3_MAJOR] then
Result:=TestCDRomIOCTL(Device)
else