2
0
Эх сурвалжийг харах

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

git-svn-id: trunk@17228 -
michael 14 жил өмнө
parent
commit
a1631aa703

+ 45 - 10
packages/cdrom/src/cdromlin.inc

@@ -117,20 +117,55 @@ end;
 
 
 Function GetCDRomDevices(Var Devices : Array of string) : Integer;
 Function GetCDRomDevices(Var Devices : Array of string) : Integer;
 
 
-Var
-  S : String;
 
 
-begin
-  Result:=TestFSTab(Devices);
-  If (Result<1) then
+  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
     begin
-    S:=DetectCD;
-    If (S<>'') then
+      RealName := ACDRom;
+      if SInfo.st_mode and S_IFMT = S_IFLNK then
+        RealName := fpReadLink(ACDRom);
+
+      if not AlreadyAdded(RealName, I-1) then
       begin
       begin
-      Devices[0]:=S;
-      Result:=1;
+        Devices[I] := RealName;
+        Result := I+1;
       end;
       end;
-    end
+    end;
+  end;
+
+var
+  I,J: Integer;
+  CDRec: TCDSearchRec;
+  FSTab: array[0..10] of String;
+
+begin
+  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;
 end;
 
 
 
 

+ 64 - 0
packages/cdrom/src/lincd.pp

@@ -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