* DiscImageChef/Main.cs:

* DiscImageChef/Options.cs:
	* DiscImageChef/DiscImageChef.csproj:
	* DiscImageChef/Commands/DeviceInfo.cs:
	  Added "device-info" command.

	* DiscImageChef.Decoders/SCSI.cs:
	  Correct size miscalculation.
	Do not print "Device claims no standard", generates too much
	  noise.

	* DiscImageChef.Devices/Device/Constructor.cs:
	  Add OS error detection and handling.
	On Linux move to opening O_RDONLY and O_NONBLOCK to allow
	  opening read-only media and removable drives without media.

	* DiscImageChef.Devices/Device/Variables.cs:
	* DiscImageChef.Devices/Device/ScsiCommands.cs:
	  Add OS error detection and handling.

	* DiscImageChef.Devices/DiscImageChef.Devices.csproj:
	* DiscImageChef.Interop/DiscImageChef.Interop.csproj:
	  Downgraded .NET version.
This commit is contained in:
2015-10-13 01:45:07 +01:00
parent 9f545eb8ab
commit 9f0d09b789
14 changed files with 206 additions and 13 deletions

View File

@@ -1,3 +1,17 @@
2015-10-13 Natalia Portillo <claunia@claunia.com>
* Device/Constructor.cs:
Add OS error detection and handling.
On Linux move to opening O_RDONLY and O_NONBLOCK to allow
opening read-only media and removable drives without media.
* Device/Variables.cs:
* Device/ScsiCommands.cs:
Add OS error detection and handling.
* DiscImageChef.Devices.csproj:
Downgraded .NET version.
2015-10-12 Natalia Portillo <claunia@claunia.com>
* Enums.cs:

View File

@@ -37,6 +37,7 @@
// //$Id$
using System;
using Microsoft.Win32.SafeHandles;
using System.Runtime.InteropServices;
namespace DiscImageChef.Devices
{
@@ -50,6 +51,7 @@ namespace DiscImageChef.Devices
{
platformID = Interop.DetectOS.GetRealPlatformID();
Timeout = 15;
error = false;
switch (platformID)
{
@@ -61,15 +63,27 @@ namespace DiscImageChef.Devices
IntPtr.Zero, Windows.FileMode.OpenExisting,
Windows.FileAttributes.Normal, IntPtr.Zero);
throw new NotImplementedException();
//break;
if (((SafeFileHandle)fd).IsInvalid)
{
error = true;
lastError = Marshal.GetLastWin32Error();
}
//throw new NotImplementedException();
break;
}
case Interop.PlatformID.Linux:
{
fd = Linux.Extern.open(devicePath, Linux.FileFlags.ReadWrite);
fd = Linux.Extern.open(devicePath, Linux.FileFlags.Readonly | Linux.FileFlags.NonBlocking);
throw new NotImplementedException();
//break;
if ((int)fd < 0)
{
error = true;
lastError = Marshal.GetLastWin32Error();
}
//throw new NotImplementedException();
break;
}
default:
throw new InvalidOperationException(String.Format("Platform {0} not yet supported.", platformID));

View File

@@ -92,7 +92,8 @@ namespace DiscImageChef.Devices
byte[] cdb = { (byte)Enums.ScsiCommands.Inquiry, 0, 0, 0, 5, 0 };
bool sense;
SendScsiCommand(cdb, ref buffer, out senseBuffer, timeout, Enums.ScsiDirection.In, out duration, out sense);
lastError = SendScsiCommand(cdb, ref buffer, out senseBuffer, timeout, Enums.ScsiDirection.In, out duration, out sense);
error = lastError != 0;
if (sense)
return true;
@@ -103,7 +104,8 @@ namespace DiscImageChef.Devices
buffer = new byte[pagesLength];
senseBuffer = new byte[32];
SendScsiCommand(cdb, ref buffer, out senseBuffer, timeout, Enums.ScsiDirection.In, out duration, out sense);
lastError = SendScsiCommand(cdb, ref buffer, out senseBuffer, timeout, Enums.ScsiDirection.In, out duration, out sense);
error = lastError != 0;
return sense;
}
@@ -163,7 +165,8 @@ namespace DiscImageChef.Devices
byte[] cdb = { (byte)Enums.ScsiCommands.Inquiry, 1, page, 0, 5, 0 };
bool sense;
SendScsiCommand(cdb, ref buffer, out senseBuffer, timeout, Enums.ScsiDirection.In, out duration, out sense);
lastError = SendScsiCommand(cdb, ref buffer, out senseBuffer, timeout, Enums.ScsiDirection.In, out duration, out sense);
error = lastError != 0;
if (sense)
return true;
@@ -174,7 +177,8 @@ namespace DiscImageChef.Devices
buffer = new byte[pagesLength];
senseBuffer = new byte[32];
SendScsiCommand(cdb, ref buffer, out senseBuffer, timeout, Enums.ScsiDirection.In, out duration, out sense);
lastError = SendScsiCommand(cdb, ref buffer, out senseBuffer, timeout, Enums.ScsiDirection.In, out duration, out sense);
error = lastError != 0;
return sense;
}

View File

@@ -44,6 +44,8 @@ namespace DiscImageChef.Devices
{
Interop.PlatformID platformID;
object fd;
bool error;
int lastError;
/// <summary>
/// Gets the Platform ID for this device
@@ -78,6 +80,30 @@ namespace DiscImageChef.Devices
get;
set;
}
/// <summary>
/// Gets a value indicating whether this <see cref="DiscImageChef.Devices.Device"/> is in error.
/// </summary>
/// <value><c>true</c> if error; otherwise, <c>false</c>.</value>
public bool Error
{
get
{
return error;
}
}
/// <summary>
/// Gets the last error number.
/// </summary>
/// <value>The last error.</value>
public int LastError
{
get
{
return lastError;
}
}
}
}

View File

@@ -9,7 +9,7 @@
<OutputType>Library</OutputType>
<RootNamespace>DiscImageChef.Devices</RootNamespace>
<AssemblyName>DiscImageChef.Devices</AssemblyName>
<TargetFrameworkVersion>v4.5</TargetFrameworkVersion>
<TargetFrameworkVersion>v3.5</TargetFrameworkVersion>
<ReleaseVersion>2.2</ReleaseVersion>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">