mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-04-22 13:31:20 +02:00
* Patch GetCDRomDevices so all CD roms are used, by Andrew H (18314)
git-svn-id: trunk@17228 -
This commit is contained in:
parent
b78f9f7706
commit
a1631aa703
@ -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;
|
||||
|
||||
|
||||
|
@ -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
|
||||
|
Loading…
Reference in New Issue
Block a user