summaryrefslogtreecommitdiff
path: root/packages/cdrom
diff options
context:
space:
mode:
authorflorian <florian@3ad0048d-3df7-0310-abae-a5850022a9f2>2011-04-10 19:20:48 +0000
committerflorian <florian@3ad0048d-3df7-0310-abae-a5850022a9f2>2011-04-10 19:20:48 +0000
commit160cc1e115eeb75638dce6effdd16b2bc810ddb4 (patch)
treeb791a95695a7cf674e61a6153139c6f9c6c491fa /packages/cdrom
parent3843727e74b31bbf2a34e7e3b89ee422269f770e (diff)
parent413a6aa6469e6c297780217a27ca91363c637944 (diff)
downloadfpc-avr.tar.gz
* rebase to trunk@17295avr
git-svn-id: http://svn.freepascal.org/svn/fpc/branches/avr@17296 3ad0048d-3df7-0310-abae-a5850022a9f2
Diffstat (limited to 'packages/cdrom')
-rw-r--r--packages/cdrom/src/cdromlin.inc55
-rw-r--r--packages/cdrom/src/lincd.pp64
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