diff options
Diffstat (limited to 'packages/cdrom')
| -rw-r--r-- | packages/cdrom/src/cdromlin.inc | 55 | ||||
| -rw-r--r-- | packages/cdrom/src/lincd.pp | 64 |
2 files changed, 109 insertions, 10 deletions
diff --git a/packages/cdrom/src/cdromlin.inc b/packages/cdrom/src/cdromlin.inc index 43e1b1178e..f5b22faf12 100644 --- a/packages/cdrom/src/cdromlin.inc +++ b/packages/cdrom/src/cdromlin.inc @@ -117,20 +117,55 @@ end; 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 - 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 - Devices[0]:=S; - Result:=1; + Devices[I] := RealName; + Result := I+1; 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; diff --git a/packages/cdrom/src/lincd.pp b/packages/cdrom/src/lincd.pp index 9eef43bb3e..f038e79e25 100644 --- a/packages/cdrom/src/lincd.pp +++ b/packages/cdrom/src/lincd.pp @@ -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 |
