mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-08-12 04:26:13 +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;
|
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
|
begin
|
||||||
Result:=TestFSTab(Devices);
|
I := 0;
|
||||||
If (Result<1) then
|
// First Add Entries From FSTab
|
||||||
begin
|
for J := 0 to TestFSTab(FSTab)-1 do
|
||||||
S:=DetectCD;
|
I := AddCdrom(FSTab[J], I);
|
||||||
If (S<>'') then
|
|
||||||
begin
|
//Now Do A Search
|
||||||
Devices[0]:=S;
|
if FindFirstCD(CDRec) then
|
||||||
Result:=1;
|
repeat
|
||||||
end;
|
I := AddCdrom(CDRec.Name, I);
|
||||||
end
|
until FindNextCD(CDRec) = False;
|
||||||
|
Result := I;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
|
||||||
|
@ -708,8 +708,15 @@ procedure set_sense_key(var a : Trequest_sense; __sense_key : Tu8);
|
|||||||
{ ---------------------------------------------------------------------
|
{ ---------------------------------------------------------------------
|
||||||
Utility functions
|
Utility functions
|
||||||
---------------------------------------------------------------------}
|
---------------------------------------------------------------------}
|
||||||
|
type
|
||||||
|
TCDSearchRec = record
|
||||||
|
Name: String;
|
||||||
|
i,j: Integer;
|
||||||
|
end;
|
||||||
|
|
||||||
Function IsCDDevice(Device : String) : Boolean;
|
Function IsCDDevice(Device : String) : Boolean;
|
||||||
|
Function FindFirstCD(var ACDSearchRec: TCDSearchRec): Boolean;
|
||||||
|
Function FindNextCD(var ACDSearchRec: TCDSearchRec): Boolean;
|
||||||
Function DetectCd : String;
|
Function DetectCd : String;
|
||||||
|
|
||||||
implementation
|
implementation
|
||||||
@ -1098,6 +1105,61 @@ Const
|
|||||||
'/dev/sr?',
|
'/dev/sr?',
|
||||||
'/dev/optcd');
|
'/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;
|
Function DetectCD : String;
|
||||||
|
|
||||||
Var
|
Var
|
||||||
@ -1163,7 +1225,9 @@ begin
|
|||||||
If fpStat(Device,info)<>0 then
|
If fpStat(Device,info)<>0 then
|
||||||
exit;
|
exit;
|
||||||
DeviceMajor:=info.st_rdev shr 8;
|
DeviceMajor:=info.st_rdev shr 8;
|
||||||
|
{$ifdef debug}
|
||||||
Writeln('Device major : ',DeviceMajor);
|
Writeln('Device major : ',DeviceMajor);
|
||||||
|
{$endif}
|
||||||
If DeviceMajor in [IDE0_MAJOR,IDE1_MAJOR,IDE2_MAJOR,IDE3_MAJOR] then
|
If DeviceMajor in [IDE0_MAJOR,IDE1_MAJOR,IDE2_MAJOR,IDE3_MAJOR] then
|
||||||
Result:=TestCDRomIOCTL(Device)
|
Result:=TestCDRomIOCTL(Device)
|
||||||
else
|
else
|
||||||
|
Loading…
Reference in New Issue
Block a user