Genera refactor and cleanup.

This commit is contained in:
2024-04-30 15:42:08 +01:00
parent 017a36da2d
commit 351237ae1e
33 changed files with 513 additions and 653 deletions

View File

@@ -1,19 +1,22 @@
Aaru Remote Aaru Remote
==================== ====================
The Aaru Remote is a slim miniature application designed to receive device commands from a remote [Aaru](https://github.com/aaru-dps/Aaru) The Aaru Remote is a slim miniature application designed to receive device commands from a
remote [Aaru](https://github.com/aaru-dps/Aaru)
instance, sends it to a local device, and returns the data to the instance. instance, sends it to a local device, and returns the data to the instance.
The main motivation for this is the desire to update Aaru to the latest and greatest features of .NET and C#. The main motivation for this is the desire to update Aaru to the latest and greatest features of .NET and C#.
This creates a problem, as some people have old devices that do not work in modern Linux distributions. This creates a problem, as some people have old devices that do not work in modern Linux distributions.
This remote will be supported in older versions of Linux, and will in future versions be supported in FreeBSD, Windows, and possibly This remote will be supported in older versions of Linux, and will in future versions be supported in FreeBSD, Windows,
and possibly
network-enabled game consoles (like PSP, Wii, etc). network-enabled game consoles (like PSP, Wii, etc).
While some people will suggest porting the whole Aaru to C or C++, that won't happen, and for the only situation that While some people will suggest porting the whole Aaru to C or C++, that won't happen, and for the only situation that
would be needed (accessing devices where C# does not run) this slim is more than enough. would be needed (accessing devices where C# does not run) this slim is more than enough.
The usage is very simple, just run the remote and it will listen for a connection over TCP/IP in port 6666, and print you The usage is very simple, just run the remote and it will listen for a connection over TCP/IP in port 6666, and print
you
the available IPs. Running as non-root user only works with some SCSI devices, so better run as root. the available IPs. Running as non-root user only works with some SCSI devices, so better run as root.
On the other side, you can use the Aaru with the *remote* command and one of those IP addresses to test the On the other side, you can use the Aaru with the *remote* command and one of those IP addresses to test the
@@ -25,8 +28,9 @@ All commands that support devices are supported, with a URI with the following s
Feature matrix Feature matrix
============== ==============
| | Minimum OS<sup>*1</sup> | SCSI | CHS ATA | 28-bit LBA ATA | 48-bit LBA ATA | Secure Digital | MultiMediaCard | USB | FireWire | PCMCIA | Special<sup>*2</sup> | | | Minimum OS<sup>*1</sup> | SCSI | CHS ATA | 28-bit LBA ATA | 48-bit LBA ATA | Secure Digital | MultiMediaCard | USB | FireWire | PCMCIA | Special<sup>*2</sup> |
|------------|-----------------------|---------------|---------------|---------------|---------------|--------------|--------------|--------------------|--------------------|----------------|-------| |--------------|-------------------------|-----------------|-----------------|-----------------|-----------------|----------------|----------------|----------------------|----------------------|------------------|----------------------|
| FreeBSD | 12 | Yes | Yes | Yes | Yes | Not yet | Not yet | Not yet<sup>*4</sup> | Not yet<sup>*4</sup> | No<sup>*5</sup> | | | FreeBSD | 12 | Yes | Yes | Yes | Yes | Not yet | Not yet | Not yet<sup>*4</sup> | Not yet<sup>*4</sup> | No<sup>*5</sup> | |
| Linux | 2.6 | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes<sup>*6</sup> | | | Linux | 2.6 | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes<sup>*6</sup> | |
| Nintendo Wii | 4.3 | No<sup>*3</sup> | No<sup>*3</sup> | No<sup>*3</sup> | No<sup>*3</sup> | Not yet | Not yet | Not yet | No<sup>*3</sup> | No<sup>*3</sup> | Not yet | | Nintendo Wii | 4.3 | No<sup>*3</sup> | No<sup>*3</sup> | No<sup>*3</sup> | No<sup>*3</sup> | Not yet | Not yet | Not yet | No<sup>*3</sup> | No<sup>*3</sup> | Not yet |
@@ -41,6 +45,7 @@ Feature matrix
TODO TODO
==== ====
- More buffer overflow guards - More buffer overflow guards
- Support PSP - Support PSP
- Support Wii - Support Wii

View File

@@ -32,26 +32,22 @@ static u_int32_t AtaProtocolToCamFlags(uint8_t protocol)
case AARUREMOTE_ATA_PROTOCOL_HARD_RESET: case AARUREMOTE_ATA_PROTOCOL_HARD_RESET:
case AARUREMOTE_ATA_PROTOCOL_NO_DATA: case AARUREMOTE_ATA_PROTOCOL_NO_DATA:
case AARUREMOTE_ATA_PROTOCOL_SOFT_RESET: case AARUREMOTE_ATA_PROTOCOL_SOFT_RESET:
case AARUREMOTE_ATA_PROTOCOL_RETURN_RESPONSE: return CAM_DIR_NONE; case AARUREMOTE_ATA_PROTOCOL_RETURN_RESPONSE:
return CAM_DIR_NONE;
case AARUREMOTE_ATA_PROTOCOL_PIO_IN: case AARUREMOTE_ATA_PROTOCOL_PIO_IN:
case AARUREMOTE_ATA_PROTOCOL_UDMA_IN: return CAM_DIR_IN; case AARUREMOTE_ATA_PROTOCOL_UDMA_IN:
return CAM_DIR_IN;
case AARUREMOTE_ATA_PROTOCOL_PIO_OUT: case AARUREMOTE_ATA_PROTOCOL_PIO_OUT:
case AARUREMOTE_ATA_PROTOCOL_UDMA_OUT: return CAM_DIR_OUT; case AARUREMOTE_ATA_PROTOCOL_UDMA_OUT:
default: return 0; return CAM_DIR_OUT;
default:
return 0;
} }
} }
int32_t SendAtaChsCommand(void* device_ctx, int32_t SendAtaChsCommand(void *device_ctx, AtaRegistersChs registers, AtaErrorRegistersChs *error_registers,
AtaRegistersChs registers, uint8_t protocol, uint8_t transfer_register, char *buffer, uint32_t timeout,
AtaErrorRegistersChs* error_registers, uint8_t transfer_blocks, uint32_t *duration, uint32_t *sense, uint32_t *buf_len)
uint8_t protocol,
uint8_t transfer_register,
char* buffer,
uint32_t timeout,
uint8_t transfer_blocks,
uint32_t* duration,
uint32_t* sense,
uint32_t* buf_len)
{ {
DeviceContext *ctx = device_ctx; DeviceContext *ctx = device_ctx;
*duration = 0; *duration = 0;
@@ -86,8 +82,12 @@ int32_t SendAtaChsCommand(void* device_ctx,
case AARUREMOTE_ATA_PROTOCOL_DMA: case AARUREMOTE_ATA_PROTOCOL_DMA:
case AARUREMOTE_ATA_PROTOCOL_DMA_QUEUED: case AARUREMOTE_ATA_PROTOCOL_DMA_QUEUED:
case AARUREMOTE_ATA_PROTOCOL_UDMA_IN: case AARUREMOTE_ATA_PROTOCOL_UDMA_IN:
case AARUREMOTE_ATA_PROTOCOL_UDMA_OUT: camccb->ataio.cmd.flags |= CAM_ATAIO_DMA; break; case AARUREMOTE_ATA_PROTOCOL_UDMA_OUT:
case AARUREMOTE_ATA_PROTOCOL_FPDMA: camccb->ataio.cmd.flags |= CAM_ATAIO_FPDMA; break; camccb->ataio.cmd.flags |= CAM_ATAIO_DMA;
break;
case AARUREMOTE_ATA_PROTOCOL_FPDMA:
camccb->ataio.cmd.flags |= CAM_ATAIO_FPDMA;
break;
} }
camccb->ataio.cmd.command = registers.command; camccb->ataio.cmd.command = registers.command;
@@ -142,17 +142,9 @@ int32_t SendAtaChsCommand(void* device_ctx,
return error; return error;
} }
int32_t SendAtaLba28Command(void* device_ctx, int32_t SendAtaLba28Command(void *device_ctx, AtaRegistersLba28 registers, AtaErrorRegistersLba28 *error_registers,
AtaRegistersLba28 registers, uint8_t protocol, uint8_t transfer_register, char *buffer, uint32_t timeout,
AtaErrorRegistersLba28* error_registers, uint8_t transfer_blocks, uint32_t *duration, uint32_t *sense, uint32_t *buf_len)
uint8_t protocol,
uint8_t transfer_register,
char* buffer,
uint32_t timeout,
uint8_t transfer_blocks,
uint32_t* duration,
uint32_t* sense,
uint32_t* buf_len)
{ {
DeviceContext *ctx = device_ctx; DeviceContext *ctx = device_ctx;
*duration = 0; *duration = 0;
@@ -187,8 +179,12 @@ int32_t SendAtaLba28Command(void* device_ctx,
case AARUREMOTE_ATA_PROTOCOL_DMA: case AARUREMOTE_ATA_PROTOCOL_DMA:
case AARUREMOTE_ATA_PROTOCOL_DMA_QUEUED: case AARUREMOTE_ATA_PROTOCOL_DMA_QUEUED:
case AARUREMOTE_ATA_PROTOCOL_UDMA_IN: case AARUREMOTE_ATA_PROTOCOL_UDMA_IN:
case AARUREMOTE_ATA_PROTOCOL_UDMA_OUT: camccb->ataio.cmd.flags |= CAM_ATAIO_DMA; break; case AARUREMOTE_ATA_PROTOCOL_UDMA_OUT:
case AARUREMOTE_ATA_PROTOCOL_FPDMA: camccb->ataio.cmd.flags |= CAM_ATAIO_FPDMA; break; camccb->ataio.cmd.flags |= CAM_ATAIO_DMA;
break;
case AARUREMOTE_ATA_PROTOCOL_FPDMA:
camccb->ataio.cmd.flags |= CAM_ATAIO_FPDMA;
break;
} }
camccb->ataio.cmd.command = registers.command; camccb->ataio.cmd.command = registers.command;
@@ -243,17 +239,9 @@ int32_t SendAtaLba28Command(void* device_ctx,
return error; return error;
} }
int32_t SendAtaLba48Command(void* device_ctx, int32_t SendAtaLba48Command(void *device_ctx, AtaRegistersLba48 registers, AtaErrorRegistersLba48 *error_registers,
AtaRegistersLba48 registers, uint8_t protocol, uint8_t transfer_register, char *buffer, uint32_t timeout,
AtaErrorRegistersLba48* error_registers, uint8_t transfer_blocks, uint32_t *duration, uint32_t *sense, uint32_t *buf_len)
uint8_t protocol,
uint8_t transfer_register,
char* buffer,
uint32_t timeout,
uint8_t transfer_blocks,
uint32_t* duration,
uint32_t* sense,
uint32_t* buf_len)
{ {
DeviceContext *ctx = device_ctx; DeviceContext *ctx = device_ctx;
*duration = 0; *duration = 0;
@@ -290,8 +278,12 @@ int32_t SendAtaLba48Command(void* device_ctx,
case AARUREMOTE_ATA_PROTOCOL_DMA: case AARUREMOTE_ATA_PROTOCOL_DMA:
case AARUREMOTE_ATA_PROTOCOL_DMA_QUEUED: case AARUREMOTE_ATA_PROTOCOL_DMA_QUEUED:
case AARUREMOTE_ATA_PROTOCOL_UDMA_IN: case AARUREMOTE_ATA_PROTOCOL_UDMA_IN:
case AARUREMOTE_ATA_PROTOCOL_UDMA_OUT: camccb->ataio.cmd.flags |= CAM_ATAIO_DMA; break; case AARUREMOTE_ATA_PROTOCOL_UDMA_OUT:
case AARUREMOTE_ATA_PROTOCOL_FPDMA: camccb->ataio.cmd.flags |= CAM_ATAIO_FPDMA; break; camccb->ataio.cmd.flags |= CAM_ATAIO_DMA;
break;
case AARUREMOTE_ATA_PROTOCOL_FPDMA:
camccb->ataio.cmd.flags |= CAM_ATAIO_FPDMA;
break;
} }
camccb->ataio.cmd.command = registers.command; camccb->ataio.cmd.command = registers.command;

View File

@@ -86,15 +86,25 @@ int32_t GetDeviceType(void* device_ctx)
switch(camccb->cgd.protocol) switch(camccb->cgd.protocol)
{ {
case PROTO_ATA: case PROTO_ATA:
case PROTO_SATAPM: device_type = AARUREMOTE_DEVICE_TYPE_ATA; break; case PROTO_SATAPM:
case PROTO_ATAPI: device_type = AARUREMOTE_DEVICE_TYPE_ATAPI; break; device_type = AARUREMOTE_DEVICE_TYPE_ATA;
case PROTO_SCSI: device_type = AARUREMOTE_DEVICE_TYPE_SCSI; break; break;
case PROTO_NVME: device_type = AARUREMOTE_DEVICE_TYPE_NVME; break; case PROTO_ATAPI:
device_type = AARUREMOTE_DEVICE_TYPE_ATAPI;
break;
case PROTO_SCSI:
device_type = AARUREMOTE_DEVICE_TYPE_SCSI;
break;
case PROTO_NVME:
device_type = AARUREMOTE_DEVICE_TYPE_NVME;
break;
case PROTO_MMCSD: case PROTO_MMCSD:
// TODO: MMC vs SD // TODO: MMC vs SD
device_type = AARUREMOTE_DEVICE_TYPE_MMC; device_type = AARUREMOTE_DEVICE_TYPE_MMC;
break; break;
default: device_type = AARUREMOTE_DEVICE_TYPE_UNKNOWN; break; default:
device_type = AARUREMOTE_DEVICE_TYPE_UNKNOWN;
break;
} }
cam_freeccb(camccb); cam_freeccb(camccb);

View File

@@ -19,11 +19,7 @@
#include "../aaruremote.h" #include "../aaruremote.h"
uint8_t GetFireWireData(void* device_ctx, uint8_t GetFireWireData(void *device_ctx, uint32_t *id_model, uint32_t *id_vendor, uint64_t *guid, char *vendor,
uint32_t* id_model,
uint32_t* id_vendor,
uint64_t* guid,
char* vendor,
char *model) char *model)
{ {
return 0; return 0;

View File

@@ -110,7 +110,8 @@ DeviceInfoList* ListDevices()
strncpy(list_next->this.serial, (const char *)camccb->cgd.ident_data.serial, 20); strncpy(list_next->this.serial, (const char *)camccb->cgd.ident_data.serial, 20);
if(strncmp(camdev->sim_name, "ahcich", 6) == 0) strncpy(list_next->this.bus, "SATA", 5); if(strncmp(camdev->sim_name, "ahcich", 6) == 0)
strncpy(list_next->this.bus, "SATA", 5);
else else
strncpy(list_next->this.bus, "ATA", 4); strncpy(list_next->this.bus, "ATA", 4);

View File

@@ -25,16 +25,8 @@
#include "../aaruremote.h" #include "../aaruremote.h"
#include "freebsd.h" #include "freebsd.h"
int32_t SendScsiCommand(void* device_ctx, int32_t SendScsiCommand(void *device_ctx, char *cdb, char *buffer, char **sense_buffer, uint32_t timeout,
char* cdb, int32_t direction, uint32_t *duration, uint32_t *sense, uint32_t cdb_len, uint32_t *buf_len,
char* buffer,
char** sense_buffer,
uint32_t timeout,
int32_t direction,
uint32_t* duration,
uint32_t* sense,
uint32_t cdb_len,
uint32_t* buf_len,
uint32_t *sense_len) uint32_t *sense_len)
{ {
DeviceContext *ctx = device_ctx; DeviceContext *ctx = device_ctx;
@@ -52,10 +44,18 @@ int32_t SendScsiCommand(void* device_ctx,
switch(direction) switch(direction)
{ {
case AARUREMOTE_SCSI_DIRECTION_NONE: flags = CAM_DIR_NONE; break; case AARUREMOTE_SCSI_DIRECTION_NONE:
case AARUREMOTE_SCSI_DIRECTION_OUT: flags = CAM_DIR_OUT; break; flags = CAM_DIR_NONE;
case AARUREMOTE_SCSI_DIRECTION_IN: flags = CAM_DIR_IN; break; break;
case AARUREMOTE_SCSI_DIRECTION_INOUT: flags = CAM_DIR_BOTH; break; case AARUREMOTE_SCSI_DIRECTION_OUT:
flags = CAM_DIR_OUT;
break;
case AARUREMOTE_SCSI_DIRECTION_IN:
flags = CAM_DIR_IN;
break;
case AARUREMOTE_SCSI_DIRECTION_INOUT:
flags = CAM_DIR_BOTH;
break;
} }
if(!ctx) return -1; if(!ctx) return -1;
@@ -81,7 +81,8 @@ int32_t SendScsiCommand(void* device_ctx,
camccb->csio.cdb_len = cdb_len; camccb->csio.cdb_len = cdb_len;
camccb->csio.tag_action = 0x20; camccb->csio.tag_action = 0x20;
if(cdb_len <= CAM_MAX_CDBLEN) memcpy(camccb->csio.cdb_io.cdb_bytes, cdb, cdb_len); if(cdb_len <= CAM_MAX_CDBLEN)
memcpy(camccb->csio.cdb_io.cdb_bytes, cdb, cdb_len);
else else
{ {
camccb->csio.cdb_io.cdb_ptr = (u_int8_t *)cdb; camccb->csio.cdb_io.cdb_ptr = (u_int8_t *)cdb;
@@ -127,8 +128,7 @@ int32_t SendScsiCommand(void* device_ctx,
*sense = (camccb->ccb_h.status & CAM_STATUS_MASK) == CAM_SCSI_STATUS_ERROR; *sense = (camccb->ccb_h.status & CAM_STATUS_MASK) == CAM_SCSI_STATUS_ERROR;
*sense_buffer = malloc(camccb->csio.sense_len - camccb->csio.sense_resid); *sense_buffer = malloc(camccb->csio.sense_len - camccb->csio.sense_resid);
(*sense_buffer)[0] = camccb->csio.sense_data.error_code; (*sense_buffer)[0] = camccb->csio.sense_data.error_code;
memcpy((*sense_buffer) + 1, memcpy((*sense_buffer) + 1, camccb->csio.sense_data.sense_buf,
camccb->csio.sense_data.sense_buf,
(camccb->csio.sense_len - camccb->csio.sense_resid) - 1); (camccb->csio.sense_len - camccb->csio.sense_resid) - 1);
} }

View File

@@ -19,41 +19,20 @@
#include "../aaruremote.h" #include "../aaruremote.h"
int32_t SendSdhciCommand(void* device_ctx, int32_t SendSdhciCommand(void *device_ctx, uint8_t command, uint8_t write, uint8_t application, uint32_t flags,
uint8_t command, uint32_t argument, uint32_t block_size, uint32_t blocks, char *buffer, uint32_t buf_len,
uint8_t write, uint32_t timeout, uint32_t *response, uint32_t *duration, uint32_t *sense)
uint8_t application,
uint32_t flags,
uint32_t argument,
uint32_t block_size,
uint32_t blocks,
char* buffer,
uint32_t buf_len,
uint32_t timeout,
uint32_t* response,
uint32_t* duration,
uint32_t* sense)
{ {
return -1; return -1;
} }
int32_t GetSdhciRegisters(void* device_ctx, int32_t GetSdhciRegisters(void *device_ctx, char **csd, char **cid, char **ocr, char **scr, uint32_t *csd_len,
char** csd, uint32_t *cid_len, uint32_t *ocr_len, uint32_t *scr_len)
char** cid,
char** ocr,
char** scr,
uint32_t* csd_len,
uint32_t* cid_len,
uint32_t* ocr_len,
uint32_t* scr_len)
{ {
return -1; return -1;
} }
int32_t SendMultiSdhciCommand(void* device_ctx, int32_t SendMultiSdhciCommand(void *device_ctx, uint64_t count, MmcSingleCommand commands[], uint32_t *duration,
uint64_t count,
MmcSingleCommand commands[],
uint32_t* duration,
uint32_t *sense) uint32_t *sense)
{ {
return -1; return -1;

View File

@@ -19,14 +19,8 @@
#include "../aaruremote.h" #include "../aaruremote.h"
uint8_t GetUsbData(void* device_ctx, uint8_t GetUsbData(void *device_ctx, uint16_t *desc_len, char *descriptors, uint16_t *id_vendor, uint16_t *id_product,
uint16_t* desc_len, char *manufacturer, char *product, char *serial)
char* descriptors,
uint16_t* id_vendor,
uint16_t* id_product,
char* manufacturer,
char* product,
char* serial)
{ {
return 0; return 0;
} }

View File

@@ -29,26 +29,22 @@ int32_t AtaProtocolToScsiDirection(uint8_t protocol)
case AARUREMOTE_ATA_PROTOCOL_HARD_RESET: case AARUREMOTE_ATA_PROTOCOL_HARD_RESET:
case AARUREMOTE_ATA_PROTOCOL_NO_DATA: case AARUREMOTE_ATA_PROTOCOL_NO_DATA:
case AARUREMOTE_ATA_PROTOCOL_SOFT_RESET: case AARUREMOTE_ATA_PROTOCOL_SOFT_RESET:
case AARUREMOTE_ATA_PROTOCOL_RETURN_RESPONSE: return AARUREMOTE_SCSI_DIRECTION_NONE; case AARUREMOTE_ATA_PROTOCOL_RETURN_RESPONSE:
return AARUREMOTE_SCSI_DIRECTION_NONE;
case AARUREMOTE_ATA_PROTOCOL_PIO_IN: case AARUREMOTE_ATA_PROTOCOL_PIO_IN:
case AARUREMOTE_ATA_PROTOCOL_UDMA_IN: return AARUREMOTE_SCSI_DIRECTION_IN; case AARUREMOTE_ATA_PROTOCOL_UDMA_IN:
return AARUREMOTE_SCSI_DIRECTION_IN;
case AARUREMOTE_ATA_PROTOCOL_PIO_OUT: case AARUREMOTE_ATA_PROTOCOL_PIO_OUT:
case AARUREMOTE_ATA_PROTOCOL_UDMA_OUT: return AARUREMOTE_SCSI_DIRECTION_OUT; case AARUREMOTE_ATA_PROTOCOL_UDMA_OUT:
default: return AARUREMOTE_SCSI_DIRECTION_UNSPECIFIED; return AARUREMOTE_SCSI_DIRECTION_OUT;
default:
return AARUREMOTE_SCSI_DIRECTION_UNSPECIFIED;
} }
} }
int32_t SendAtaChsCommand(void* device_ctx, int32_t SendAtaChsCommand(void *device_ctx, AtaRegistersChs registers, AtaErrorRegistersChs *error_registers,
AtaRegistersChs registers, uint8_t protocol, uint8_t transfer_register, char *buffer, uint32_t timeout,
AtaErrorRegistersChs* error_registers, uint8_t transfer_blocks, uint32_t *duration, uint32_t *sense, uint32_t *buf_len)
uint8_t protocol,
uint8_t transfer_register,
char* buffer,
uint32_t timeout,
uint8_t transfer_blocks,
uint32_t* duration,
uint32_t* sense,
uint32_t* buf_len)
{ {
*duration = 0; *duration = 0;
*sense = 0; *sense = 0;
@@ -68,8 +64,12 @@ int32_t SendAtaChsCommand(void* device_ctx,
switch(protocol) switch(protocol)
{ {
case AARUREMOTE_ATA_PROTOCOL_PIO_IN: case AARUREMOTE_ATA_PROTOCOL_PIO_IN:
case AARUREMOTE_ATA_PROTOCOL_UDMA_IN: cdb[2] = 0x08; break; case AARUREMOTE_ATA_PROTOCOL_UDMA_IN:
default: cdb[2] = 0x00; break; cdb[2] = 0x08;
break;
default:
cdb[2] = 0x00;
break;
} }
if(transfer_blocks) cdb[2] |= 0x04; if(transfer_blocks) cdb[2] |= 0x04;
@@ -85,17 +85,8 @@ int32_t SendAtaChsCommand(void* device_ctx,
cdb[13] = registers.device_head; cdb[13] = registers.device_head;
cdb[14] = registers.command; cdb[14] = registers.command;
int error = SendScsiCommand(ctx, int error = SendScsiCommand(ctx, (char *)cdb, buffer, &sense_buf, timeout, AtaProtocolToScsiDirection(protocol),
(char*)cdb, duration, sense, 16, buf_len, &sense_len);
buffer,
&sense_buf,
timeout,
AtaProtocolToScsiDirection(protocol),
duration,
sense,
16,
buf_len,
&sense_len);
if(sense_len < 22 || (sense_buf[8] != 0x09 && sense_buf[9] != 0x0C)) return error; if(sense_len < 22 || (sense_buf[8] != 0x09 && sense_buf[9] != 0x0C)) return error;
@@ -113,17 +104,9 @@ int32_t SendAtaChsCommand(void* device_ctx,
return error; return error;
} }
int32_t SendAtaLba28Command(void* device_ctx, int32_t SendAtaLba28Command(void *device_ctx, AtaRegistersLba28 registers, AtaErrorRegistersLba28 *error_registers,
AtaRegistersLba28 registers, uint8_t protocol, uint8_t transfer_register, char *buffer, uint32_t timeout,
AtaErrorRegistersLba28* error_registers, uint8_t transfer_blocks, uint32_t *duration, uint32_t *sense, uint32_t *buf_len)
uint8_t protocol,
uint8_t transfer_register,
char* buffer,
uint32_t timeout,
uint8_t transfer_blocks,
uint32_t* duration,
uint32_t* sense,
uint32_t* buf_len)
{ {
*duration = 0; *duration = 0;
*sense = 0; *sense = 0;
@@ -143,8 +126,12 @@ int32_t SendAtaLba28Command(void* device_ctx,
switch(protocol) switch(protocol)
{ {
case AARUREMOTE_ATA_PROTOCOL_PIO_IN: case AARUREMOTE_ATA_PROTOCOL_PIO_IN:
case AARUREMOTE_ATA_PROTOCOL_UDMA_IN: cdb[2] = 0x08; break; case AARUREMOTE_ATA_PROTOCOL_UDMA_IN:
default: cdb[2] = 0x00; break; cdb[2] = 0x08;
break;
default:
cdb[2] = 0x00;
break;
} }
if(transfer_blocks) cdb[2] |= 0x04; if(transfer_blocks) cdb[2] |= 0x04;
@@ -162,17 +149,8 @@ int32_t SendAtaLba28Command(void* device_ctx,
cdb[13] = registers.device_head; cdb[13] = registers.device_head;
cdb[14] = registers.command; cdb[14] = registers.command;
int error = SendScsiCommand(ctx, int error = SendScsiCommand(ctx, (char *)cdb, buffer, &sense_buf, timeout, AtaProtocolToScsiDirection(protocol),
(char*)cdb, duration, sense, 16, buf_len, &sense_len);
buffer,
&sense_buf,
timeout,
AtaProtocolToScsiDirection(protocol),
duration,
sense,
16,
buf_len,
&sense_len);
if(sense_len < 22 || (sense_buf[8] != 0x09 && sense_buf[9] != 0x0C)) return error; if(sense_len < 22 || (sense_buf[8] != 0x09 && sense_buf[9] != 0x0C)) return error;
@@ -190,17 +168,9 @@ int32_t SendAtaLba28Command(void* device_ctx,
return error; return error;
} }
int32_t SendAtaLba48Command(void* device_ctx, int32_t SendAtaLba48Command(void *device_ctx, AtaRegistersLba48 registers, AtaErrorRegistersLba48 *error_registers,
AtaRegistersLba48 registers, uint8_t protocol, uint8_t transfer_register, char *buffer, uint32_t timeout,
AtaErrorRegistersLba48* error_registers, uint8_t transfer_blocks, uint32_t *duration, uint32_t *sense, uint32_t *buf_len)
uint8_t protocol,
uint8_t transfer_register,
char* buffer,
uint32_t timeout,
uint8_t transfer_blocks,
uint32_t* duration,
uint32_t* sense,
uint32_t* buf_len)
{ {
*duration = 0; *duration = 0;
*sense = 0; *sense = 0;
@@ -221,8 +191,12 @@ int32_t SendAtaLba48Command(void* device_ctx,
switch(protocol) switch(protocol)
{ {
case AARUREMOTE_ATA_PROTOCOL_PIO_IN: case AARUREMOTE_ATA_PROTOCOL_PIO_IN:
case AARUREMOTE_ATA_PROTOCOL_UDMA_IN: cdb[2] = 0x08; break; case AARUREMOTE_ATA_PROTOCOL_UDMA_IN:
default: cdb[2] = 0x00; break; cdb[2] = 0x08;
break;
default:
cdb[2] = 0x00;
break;
} }
if(transfer_blocks) cdb[2] |= 0x04; if(transfer_blocks) cdb[2] |= 0x04;
@@ -245,17 +219,8 @@ int32_t SendAtaLba48Command(void* device_ctx,
cdb[13] = registers.device_head; cdb[13] = registers.device_head;
cdb[14] = registers.command; cdb[14] = registers.command;
int error = SendScsiCommand(ctx, int error = SendScsiCommand(ctx, (char *)cdb, buffer, &sense_buf, timeout, AtaProtocolToScsiDirection(protocol),
(char*)cdb, duration, sense, 16, buf_len, &sense_len);
buffer,
&sense_buf,
timeout,
AtaProtocolToScsiDirection(protocol),
duration,
sense,
16,
buf_len,
&sense_len);
if(sense_len < 22 || (sense_buf[8] != 0x09 && sense_buf[9] != 0x0C)) return error; if(sense_len < 22 || (sense_buf[8] != 0x09 && sense_buf[9] != 0x0C)) return error;

View File

@@ -24,11 +24,7 @@
#include "../aaruremote.h" #include "../aaruremote.h"
#include "linux.h" #include "linux.h"
uint8_t GetFireWireData(void* device_ctx, uint8_t GetFireWireData(void *device_ctx, uint32_t *id_model, uint32_t *id_vendor, uint64_t *guid, char *vendor,
uint32_t* id_model,
uint32_t* id_vendor,
uint64_t* guid,
char* vendor,
char *model) char *model)
{ {
DeviceContext *ctx = device_ctx; DeviceContext *ctx = device_ctx;

View File

@@ -144,11 +144,19 @@ DeviceInfoList* ListDevices()
switch(GetDeviceType(&tmp_ctx)) switch(GetDeviceType(&tmp_ctx))
{ {
case AARUREMOTE_DEVICE_TYPE_ATA: strncpy(list_next->this.bus, "ATA", 256); break; case AARUREMOTE_DEVICE_TYPE_ATA:
case AARUREMOTE_DEVICE_TYPE_ATAPI: strncpy(list_next->this.bus, "ATAPI", 256); break; strncpy(list_next->this.bus, "ATA", 256);
break;
case AARUREMOTE_DEVICE_TYPE_ATAPI:
strncpy(list_next->this.bus, "ATAPI", 256);
break;
case AARUREMOTE_DEVICE_TYPE_MMC: case AARUREMOTE_DEVICE_TYPE_MMC:
case AARUREMOTE_DEVICE_TYPE_SECURE_DIGITAL: strncpy(list_next->this.bus, "MMC/SD", 256); break; case AARUREMOTE_DEVICE_TYPE_SECURE_DIGITAL:
case AARUREMOTE_DEVICE_TYPE_NVME: strncpy(list_next->this.bus, "NVMe", 256); break; strncpy(list_next->this.bus, "MMC/SD", 256);
break;
case AARUREMOTE_DEVICE_TYPE_NVME:
strncpy(list_next->this.bus, "NVMe", 256);
break;
case AARUREMOTE_DEVICE_TYPE_SCSI: case AARUREMOTE_DEVICE_TYPE_SCSI:
tmp_string = malloc(1024); tmp_string = malloc(1024);
memset((void*)tmp_string, 0, 1024); memset((void*)tmp_string, 0, 1024);
@@ -188,7 +196,8 @@ DeviceInfoList* ListDevices()
if(ret > 0) if(ret > 0)
{ {
if(strncmp(line_str, "sbp2", 4) == 0) strncpy(list_next->this.bus, "FireWire", 256); if(strncmp(line_str, "sbp2", 4) == 0)
strncpy(list_next->this.bus, "FireWire", 256);
else if(strncmp(line_str, "usb-storage", 11) == 0) else if(strncmp(line_str, "usb-storage", 11) == 0)
strncpy(list_next->this.bus, "USB", 256); strncpy(list_next->this.bus, "USB", 256);
else else
@@ -212,7 +221,9 @@ DeviceInfoList* ListDevices()
free((void*)tmp_string); free((void*)tmp_string);
break; break;
default: memset(&list_next->this.bus, 0, 256); break; default:
memset(&list_next->this.bus, 0, 256);
break;
} }
} }
#endif #endif
@@ -237,7 +248,8 @@ DeviceInfoList* ListDevices()
strncpy(list_next->this.vendor, line_str, 256); strncpy(list_next->this.vendor, line_str, 256);
for(i = 255; i >= 0; i--) for(i = 255; i >= 0; i--)
{ {
if(list_next->this.vendor[i] == 0) continue; if(list_next->this.vendor[i] == 0)
continue;
else if(list_next->this.vendor[i] == 0x0A || list_next->this.vendor[i] == 0x0D || else if(list_next->this.vendor[i] == 0x0A || list_next->this.vendor[i] == 0x0D ||
list_next->this.vendor[i] == ' ') list_next->this.vendor[i] == ' ')
@@ -251,10 +263,7 @@ DeviceInfoList* ListDevices()
fclose(file); fclose(file);
} }
} }
else if(strncmp(dirent->d_name, "loop", 4) == 0) else if(strncmp(dirent->d_name, "loop", 4) == 0) { strncpy(list_next->this.vendor, "Linux", 256); }
{
strncpy(list_next->this.vendor, "Linux", 256);
}
free((void *)tmp_string); free((void *)tmp_string);
tmp_string = malloc(1024); tmp_string = malloc(1024);
@@ -278,7 +287,8 @@ DeviceInfoList* ListDevices()
strncpy(list_next->this.model, line_str, 256); strncpy(list_next->this.model, line_str, 256);
for(i = 255; i >= 0; i--) for(i = 255; i >= 0; i--)
{ {
if(list_next->this.model[i] == 0) continue; if(list_next->this.model[i] == 0)
continue;
else if(list_next->this.model[i] == 0x0A || list_next->this.model[i] == 0x0D || else if(list_next->this.model[i] == 0x0A || list_next->this.model[i] == 0x0D ||
list_next->this.model[i] == ' ') list_next->this.model[i] == ' ')
@@ -292,10 +302,7 @@ DeviceInfoList* ListDevices()
fclose(file); fclose(file);
} }
} }
else if(strncmp(dirent->d_name, "loop", 4) == 0) else if(strncmp(dirent->d_name, "loop", 4) == 0) { strncpy(list_next->this.model, "Linux", 256); }
{
strncpy(list_next->this.model, "Linux", 256);
}
free((void *)tmp_string); free((void *)tmp_string);
tmp_string = malloc(1024); tmp_string = malloc(1024);
@@ -318,7 +325,8 @@ DeviceInfoList* ListDevices()
strncpy(list_next->this.serial, line_str, 256); strncpy(list_next->this.serial, line_str, 256);
for(i = 255; i >= 0; i--) for(i = 255; i >= 0; i--)
{ {
if(list_next->this.serial[i] == 0) continue; if(list_next->this.serial[i] == 0)
continue;
else if(list_next->this.serial[i] == 0x0A || list_next->this.serial[i] == 0x0D || else if(list_next->this.serial[i] == 0x0A || list_next->this.serial[i] == 0x0D ||
list_next->this.serial[i] == ' ') list_next->this.serial[i] == ' ')
@@ -358,7 +366,8 @@ DeviceInfoList* ListDevices()
// TODO: Get better device type from sysfs paths // TODO: Get better device type from sysfs paths
if(strlen(list_next->this.bus) == 0) if(strlen(list_next->this.bus) == 0)
{ {
if(strncmp(dirent->d_name, "loop", 4) == 0) strncpy(list_next->this.bus, "loop", 4); if(strncmp(dirent->d_name, "loop", 4) == 0)
strncpy(list_next->this.bus, "loop", 4);
else if(strncmp(dirent->d_name, "nvme", 4) == 0) else if(strncmp(dirent->d_name, "nvme", 4) == 0)
strncpy(list_next->this.bus, "NVMe", 4); strncpy(list_next->this.bus, "NVMe", 4);
else if(strncmp(dirent->d_name, "mmc", 3) == 0) else if(strncmp(dirent->d_name, "mmc", 3) == 0)

View File

@@ -55,6 +55,7 @@ struct mmc_ioc_cmd
/* DAT buffer */ /* DAT buffer */
uint64_t data_ptr; uint64_t data_ptr;
}; };
#define mmc_ioc_cmd_set_data(ic, ptr) ic.data_ptr = (__u64)(unsigned long)ptr #define mmc_ioc_cmd_set_data(ic, ptr) ic.data_ptr = (__u64)(unsigned long)ptr
/** /**

View File

@@ -24,16 +24,8 @@
#include "../aaruremote.h" #include "../aaruremote.h"
#include "linux.h" #include "linux.h"
int32_t SendScsiCommand(void* device_ctx, int32_t SendScsiCommand(void *device_ctx, char *cdb, char *buffer, char **sense_buffer, uint32_t timeout,
char* cdb, int32_t direction, uint32_t *duration, uint32_t *sense, uint32_t cdb_len, uint32_t *buf_len,
char* buffer,
char** sense_buffer,
uint32_t timeout,
int32_t direction,
uint32_t* duration,
uint32_t* sense,
uint32_t cdb_len,
uint32_t* buf_len,
uint32_t *sense_len) uint32_t *sense_len)
{ {
DeviceContext *ctx = device_ctx; DeviceContext *ctx = device_ctx;
@@ -50,12 +42,20 @@ int32_t SendScsiCommand(void* device_ctx,
switch(direction) switch(direction)
{ {
case AARUREMOTE_SCSI_DIRECTION_IN: dir = SG_DXFER_FROM_DEV; break; case AARUREMOTE_SCSI_DIRECTION_IN:
case AARUREMOTE_SCSI_DIRECTION_OUT: dir = SG_DXFER_TO_DEV; break; dir = SG_DXFER_FROM_DEV;
break;
case AARUREMOTE_SCSI_DIRECTION_OUT:
dir = SG_DXFER_TO_DEV;
break;
case AARUREMOTE_SCSI_DIRECTION_INOUT: case AARUREMOTE_SCSI_DIRECTION_INOUT:
case AARUREMOTE_SCSI_DIRECTION_UNSPECIFIED: dir = SG_DXFER_TO_FROM_DEV; break; case AARUREMOTE_SCSI_DIRECTION_UNSPECIFIED:
dir = SG_DXFER_TO_FROM_DEV;
break;
case AARUREMOTE_SCSI_DIRECTION_NONE: case AARUREMOTE_SCSI_DIRECTION_NONE:
default: dir = SG_DXFER_NONE; break; default:
dir = SG_DXFER_NONE;
break;
} }
hdr.interface_id = 'S'; hdr.interface_id = 'S';

View File

@@ -27,20 +27,9 @@
#include "linux.h" #include "linux.h"
#include "mmc/ioctl.h" #include "mmc/ioctl.h"
int32_t SendSdhciCommand(void* device_ctx, int32_t SendSdhciCommand(void *device_ctx, uint8_t command, uint8_t write, uint8_t application, uint32_t flags,
uint8_t command, uint32_t argument, uint32_t block_size, uint32_t blocks, char *buffer, uint32_t buf_len,
uint8_t write, uint32_t timeout, uint32_t *response, uint32_t *duration, uint32_t *sense)
uint8_t application,
uint32_t flags,
uint32_t argument,
uint32_t block_size,
uint32_t blocks,
char* buffer,
uint32_t buf_len,
uint32_t timeout,
uint32_t* response,
uint32_t* duration,
uint32_t* sense)
{ {
DeviceContext *ctx = device_ctx; DeviceContext *ctx = device_ctx;
struct mmc_ioc_cmd mmc_ioc_cmd; struct mmc_ioc_cmd mmc_ioc_cmd;
@@ -79,15 +68,8 @@ int32_t SendSdhciCommand(void* device_ctx,
return error; return error;
} }
int32_t GetSdhciRegisters(void* device_ctx, int32_t GetSdhciRegisters(void *device_ctx, char **csd, char **cid, char **ocr, char **scr, uint32_t *csd_len,
char** csd, uint32_t *cid_len, uint32_t *ocr_len, uint32_t *scr_len)
char** cid,
char** ocr,
char** scr,
uint32_t* csd_len,
uint32_t* cid_len,
uint32_t* ocr_len,
uint32_t* scr_len)
{ {
DeviceContext *ctx = device_ctx; DeviceContext *ctx = device_ctx;
char *tmp_string; char *tmp_string;
@@ -237,10 +219,7 @@ int32_t GetSdhciRegisters(void* device_ctx,
return csd_len != 0 || cid_len != 0 || scr_len != 0 || ocr_len != 0; return csd_len != 0 || cid_len != 0 || scr_len != 0 || ocr_len != 0;
} }
int32_t SendMultiSdhciCommand(void* device_ctx, int32_t SendMultiSdhciCommand(void *device_ctx, uint64_t count, MmcSingleCommand commands[], uint32_t *duration,
uint64_t count,
MmcSingleCommand commands[],
uint32_t* duration,
uint32_t *sense) uint32_t *sense)
{ {
DeviceContext *ctx = device_ctx; DeviceContext *ctx = device_ctx;

View File

@@ -24,14 +24,8 @@
#include "../aaruremote.h" #include "../aaruremote.h"
#include "linux.h" #include "linux.h"
uint8_t GetUsbData(void* device_ctx, uint8_t GetUsbData(void *device_ctx, uint16_t *desc_len, char *descriptors, uint16_t *id_vendor, uint16_t *id_product,
uint16_t* desc_len, char *manufacturer, char *product, char *serial)
char* descriptors,
uint16_t* id_vendor,
uint16_t* id_product,
char* manufacturer,
char* product,
char* serial)
{ {
DeviceContext *ctx = device_ctx; DeviceContext *ctx = device_ctx;
char *dev_path; char *dev_path;

View File

@@ -40,6 +40,7 @@ int PrintNetworkAddresses()
} }
char *PrintIpv4Address(struct in_addr addr) { return inet_ntoa(addr); } char *PrintIpv4Address(struct in_addr addr) { return inet_ntoa(addr); }
void *NetSocket(uint32_t domain, uint32_t type, uint32_t protocol) void *NetSocket(uint32_t domain, uint32_t type, uint32_t protocol)
{ {
NetworkContext *ctx; NetworkContext *ctx;

View File

@@ -25,45 +25,25 @@ void DeviceClose(void* device_ctx) {}
int32_t GetDeviceType(void *device_ctx) { return AARUREMOTE_DEVICE_TYPE_UNKNOWN; } int32_t GetDeviceType(void *device_ctx) { return AARUREMOTE_DEVICE_TYPE_UNKNOWN; }
int32_t GetSdhciRegisters(void* device_ctx, int32_t GetSdhciRegisters(void *device_ctx, char **csd, char **cid, char **ocr, char **scr, uint32_t *csd_len,
char** csd, uint32_t *cid_len, uint32_t *ocr_len, uint32_t *scr_len)
char** cid,
char** ocr,
char** scr,
uint32_t* csd_len,
uint32_t* cid_len,
uint32_t* ocr_len,
uint32_t* scr_len)
{ {
return 0; return 0;
} }
int32_t SendSdhciCommand(void* device_ctx, int32_t SendSdhciCommand(void *device_ctx, uint8_t command, uint8_t write, uint8_t application, uint32_t flags,
uint8_t command, uint32_t argument, uint32_t block_size, uint32_t blocks, char *buffer, uint32_t buf_len,
uint8_t write, uint32_t timeout, uint32_t *response, uint32_t *duration, uint32_t *sense)
uint8_t application, {
uint32_t flags, return -1;
uint32_t argument, }
uint32_t block_size,
uint32_t blocks, int32_t SendMultiSdhciCommand(void *device_ctx, uint64_t count, MmcSingleCommand commands[], uint32_t *duration,
char* buffer,
uint32_t buf_len,
uint32_t timeout,
uint32_t* response,
uint32_t* duration,
uint32_t *sense) uint32_t *sense)
{ {
return -1; return -1;
} }
int32_t SendMultiSdhciCommand(void* device_ctx,
uint64_t count,
MmcSingleCommand commands[],
uint32_t* duration,
uint32_t* sense)
{
return -1;
}
int32_t ReOpen(void *device_ctx, uint32_t *closeFailed) int32_t ReOpen(void *device_ctx, uint32_t *closeFailed)
{ {
*closeFailed = 1; *closeFailed = 1;

View File

@@ -17,56 +17,28 @@
#include "../aaruremote.h" #include "../aaruremote.h"
int32_t SendAtaChsCommand(void* device_ctx, int32_t SendAtaChsCommand(void *device_ctx, AtaRegistersChs registers, AtaErrorRegistersChs *error_registers,
AtaRegistersChs registers, uint8_t protocol, uint8_t transfer_register, char *buffer, uint32_t timeout,
AtaErrorRegistersChs* error_registers, uint8_t transfer_blocks, uint32_t *duration, uint32_t *sense, uint32_t *buf_len)
uint8_t protocol,
uint8_t transfer_register,
char* buffer,
uint32_t timeout,
uint8_t transfer_blocks,
uint32_t* duration,
uint32_t* sense,
uint32_t* buf_len)
{ {
return -1; return -1;
} }
int32_t SendAtaLba28Command(void* device_ctx, int32_t SendAtaLba28Command(void *device_ctx, AtaRegistersLba28 registers, AtaErrorRegistersLba28 *error_registers,
AtaRegistersLba28 registers, uint8_t protocol, uint8_t transfer_register, char *buffer, uint32_t timeout,
AtaErrorRegistersLba28* error_registers, uint8_t transfer_blocks, uint32_t *duration, uint32_t *sense, uint32_t *buf_len)
uint8_t protocol,
uint8_t transfer_register,
char* buffer,
uint32_t timeout,
uint8_t transfer_blocks,
uint32_t* duration,
uint32_t* sense,
uint32_t* buf_len)
{ {
return -1; return -1;
} }
int32_t SendAtaLba48Command(void* device_ctx, int32_t SendAtaLba48Command(void *device_ctx, AtaRegistersLba48 registers, AtaErrorRegistersLba48 *error_registers,
AtaRegistersLba48 registers, uint8_t protocol, uint8_t transfer_register, char *buffer, uint32_t timeout,
AtaErrorRegistersLba48* error_registers, uint8_t transfer_blocks, uint32_t *duration, uint32_t *sense, uint32_t *buf_len)
uint8_t protocol,
uint8_t transfer_register,
char* buffer,
uint32_t timeout,
uint8_t transfer_blocks,
uint32_t* duration,
uint32_t* sense,
uint32_t* buf_len)
{ {
return -1; return -1;
} }
uint8_t GetFireWireData(void* device_ctx, uint8_t GetFireWireData(void *device_ctx, uint32_t *id_model, uint32_t *id_vendor, uint64_t *guid, char *vendor,
uint32_t* id_model,
uint32_t* id_vendor,
uint64_t* guid,
char* vendor,
char *model) char *model)
{ {
return 0; return 0;
@@ -74,29 +46,15 @@ uint8_t GetFireWireData(void* device_ctx,
uint8_t GetPcmciaData(void *device_ctx, uint16_t *cis_len, char *cis) { return 0; } uint8_t GetPcmciaData(void *device_ctx, uint16_t *cis_len, char *cis) { return 0; }
int32_t SendScsiCommand(void* device_ctx, int32_t SendScsiCommand(void *device_ctx, char *cdb, char *buffer, char **sense_buffer, uint32_t timeout,
char* cdb, int32_t direction, uint32_t *duration, uint32_t *sense, uint32_t cdb_len, uint32_t *buf_len,
char* buffer,
char** sense_buffer,
uint32_t timeout,
int32_t direction,
uint32_t* duration,
uint32_t* sense,
uint32_t cdb_len,
uint32_t* buf_len,
uint32_t *sense_len) uint32_t *sense_len)
{ {
return -1; return -1;
} }
uint8_t GetUsbData(void* device_ctx, uint8_t GetUsbData(void *device_ctx, uint16_t *desc_len, char *descriptors, uint16_t *id_vendor, uint16_t *id_product,
uint16_t* desc_len, char *manufacturer, char *product, char *serial)
char* descriptors,
uint16_t* id_vendor,
uint16_t* id_product,
char* manufacturer,
char* product,
char* serial)
{ {
return 0; return 0;
} }