mirror of
				https://gitlab.com/freepascal.org/fpc/source.git
				synced 2025-11-04 01:19:38 +01: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