mirror of
https://github.com/aaru-dps/aaruremote.git
synced 2025-12-16 19:24:37 +00:00
Add buffered OS read command packet processing.
This commit is contained in:
21
aaruremote.h
21
aaruremote.h
@@ -65,6 +65,8 @@
|
||||
#define AARUREMOTE_PACKET_TYPE_MULTI_COMMAND_SDHCI 28
|
||||
#define AARUREMOTE_PACKET_TYPE_RESPONSE_MULTI_SDHCI 29
|
||||
#define AARUREMOTE_PACKET_TYPE_COMMAND_REOPEN 30
|
||||
#define AARUREMOTE_PACKET_TYPE_COMMAND_OSREAD 31
|
||||
#define AARUREMOTE_PACKET_TYPE_RESPONSE_OSREAD 32
|
||||
#define AARUREMOTE_PROTOCOL_MAX 2
|
||||
#define AARUREMOTE_PACKET_NOP_REASON_OOO 0
|
||||
#define AARUREMOTE_PACKET_NOP_REASON_NOT_IMPLEMENTED 1
|
||||
@@ -505,6 +507,20 @@ typedef struct
|
||||
AaruPacketHeader hdr;
|
||||
} AaruPacketCmdReOpen;
|
||||
|
||||
typedef struct
|
||||
{
|
||||
AaruPacketHeader hdr;
|
||||
uint64_t offset;
|
||||
uint32_t length;
|
||||
} AaruPacketCmdOsRead;
|
||||
|
||||
typedef struct
|
||||
{
|
||||
AaruPacketHeader hdr;
|
||||
int32_t error_no;
|
||||
uint32_t duration;
|
||||
} AaruPacketResOsRead;
|
||||
|
||||
#pragma pack(pop)
|
||||
|
||||
typedef struct
|
||||
@@ -616,6 +632,11 @@ int32_t SendMultiSdhciCommand(void* device_ctx,
|
||||
MmcSingleCommand commands[],
|
||||
uint32_t* duration,
|
||||
uint32_t* sense);
|
||||
int32_t OsRead(void* device_ctx,
|
||||
char *buffer,
|
||||
uint64_t offset,
|
||||
uint32_t length,
|
||||
uint32_t* duration);
|
||||
AaruPacketHello* GetHello();
|
||||
int PrintNetworkAddresses();
|
||||
char* PrintIpv4Address(struct in_addr addr);
|
||||
|
||||
72
worker.c
72
worker.c
@@ -71,6 +71,8 @@ void* WorkingLoop(void* arguments)
|
||||
AaruPacketResScsi* pkt_res_scsi;
|
||||
AaruPacketResSdhci* pkt_res_sdhci;
|
||||
AaruPacketMultiResSdhci* pkt_res_multi_sdhci;
|
||||
AaruPacketCmdOsRead* pkt_cmd_osread;
|
||||
AaruPacketResOsRead* pkt_res_osread;
|
||||
int skip_next_hdr;
|
||||
int ret;
|
||||
socklen_t cli_len;
|
||||
@@ -1189,10 +1191,10 @@ void* WorkingLoop(void* arguments)
|
||||
off += multi_sdhci_commands->buf_len;
|
||||
}
|
||||
|
||||
NetWrite(cli_ctx, pkt_res_sdhci, le32toh(pkt_res_sdhci->hdr.len));
|
||||
NetWrite(cli_ctx, pkt_res_multi_sdhci, le32toh(pkt_res_multi_sdhci->hdr.len));
|
||||
free(multi_sdhci_commands);
|
||||
free(pkt_cmd_sdhci);
|
||||
free(pkt_res_sdhci);
|
||||
free(pkt_cmd_multi_sdhci);
|
||||
free(pkt_res_multi_sdhci);
|
||||
|
||||
continue;
|
||||
case AARUREMOTE_PACKET_TYPE_COMMAND_REOPEN:
|
||||
@@ -1230,6 +1232,70 @@ void* WorkingLoop(void* arguments)
|
||||
|
||||
free(in_buf);
|
||||
|
||||
continue;
|
||||
case AARUREMOTE_PACKET_TYPE_COMMAND_OSREAD:
|
||||
in_buf = malloc(le32toh(pkt_hdr->len));
|
||||
|
||||
if(!in_buf)
|
||||
{
|
||||
printf("Fatal error %d allocating memory for packet, closing connection...\n", errno);
|
||||
free(pkt_hdr);
|
||||
NetClose(cli_ctx);
|
||||
continue;
|
||||
}
|
||||
|
||||
NetRecv(cli_ctx, in_buf, le32toh(pkt_hdr->len), 0);
|
||||
|
||||
pkt_cmd_osread = (AaruPacketCmdOsRead*)in_buf;
|
||||
|
||||
buffer = malloc(le32toh(pkt_cmd_osread->length));
|
||||
|
||||
if(!buffer)
|
||||
{
|
||||
printf("Fatal error %d allocating memory for buffer, closing connection...\n", errno);
|
||||
free(pkt_hdr);
|
||||
free(in_buf);
|
||||
NetClose(cli_ctx);
|
||||
continue;
|
||||
}
|
||||
|
||||
memset(buffer, 0, le32toh(pkt_cmd_osread->length));
|
||||
|
||||
ret = OsRead(device_ctx,
|
||||
buffer,
|
||||
le64toh(pkt_cmd_osread->offset),
|
||||
le32toh(pkt_cmd_osread->length),
|
||||
&duration);
|
||||
|
||||
out_buf = malloc(sizeof(AaruPacketResOsRead) + le32toh(pkt_cmd_osread->length));
|
||||
|
||||
if(!out_buf)
|
||||
{
|
||||
printf("Fatal error %d allocating memory for packet, continuing...\n", errno);
|
||||
free(buffer);
|
||||
free(pkt_hdr);
|
||||
free(in_buf);
|
||||
NetClose(cli_ctx);
|
||||
continue;
|
||||
}
|
||||
|
||||
pkt_res_osread = (AaruPacketResOsRead*)out_buf;
|
||||
|
||||
pkt_res_osread->hdr.len = htole32(sizeof(AaruPacketResOsRead) + le32toh(pkt_cmd_osread->length));
|
||||
pkt_res_osread->hdr.packet_type = AARUREMOTE_PACKET_TYPE_RESPONSE_OSREAD;
|
||||
pkt_res_osread->hdr.version = AARUREMOTE_PACKET_VERSION;
|
||||
pkt_res_osread->hdr.remote_id = htole32(AARUREMOTE_REMOTE_ID);
|
||||
pkt_res_osread->hdr.packet_id = htole32(AARUREMOTE_PACKET_ID);
|
||||
pkt_res_osread->error_no = htole32(ret);
|
||||
pkt_res_osread->duration = htole32(duration);
|
||||
|
||||
memcpy(out_buf + sizeof(AaruPacketResOsRead), buffer, le32toh(pkt_cmd_osread->length));
|
||||
|
||||
NetWrite(cli_ctx, pkt_res_osread, le32toh(pkt_res_osread->hdr.len));
|
||||
free(buffer);
|
||||
free(pkt_cmd_osread);
|
||||
free(pkt_res_osread);
|
||||
|
||||
continue;
|
||||
default:
|
||||
pkt_nop->reason_code = AARUREMOTE_PACKET_NOP_REASON_NOT_RECOGNIZED;
|
||||
|
||||
Reference in New Issue
Block a user