Use opaque packet for device context.

This commit is contained in:
2019-10-26 16:11:19 +01:00
parent bcae241162
commit adcd54d992
17 changed files with 282 additions and 213 deletions

12
ata.c
View File

@@ -21,7 +21,7 @@
#include "linux/linux.h" #include "linux/linux.h"
#endif #endif
int32_t SendAtaChsCommand(int device_fd, int32_t SendAtaChsCommand(void* device_ctx,
AtaRegistersChs registers, AtaRegistersChs registers,
AtaErrorRegistersChs* error_registers, AtaErrorRegistersChs* error_registers,
uint8_t protocol, uint8_t protocol,
@@ -34,7 +34,7 @@ int32_t SendAtaChsCommand(int device_fd,
uint32_t* buf_len) uint32_t* buf_len)
{ {
#if defined(__linux__) && !defined(__ANDROID__) #if defined(__linux__) && !defined(__ANDROID__)
return LinuxSendAtaChsCommand(device_fd, return LinuxSendAtaChsCommand(device_ctx,
registers, registers,
error_registers, error_registers,
protocol, protocol,
@@ -50,7 +50,7 @@ int32_t SendAtaChsCommand(int device_fd,
#endif #endif
} }
int32_t SendAtaLba28Command(int device_fd, int32_t SendAtaLba28Command(void* device_ctx,
AtaRegistersLba28 registers, AtaRegistersLba28 registers,
AtaErrorRegistersLba28* error_registers, AtaErrorRegistersLba28* error_registers,
uint8_t protocol, uint8_t protocol,
@@ -63,7 +63,7 @@ int32_t SendAtaLba28Command(int device_fd,
uint32_t* buf_len) uint32_t* buf_len)
{ {
#if defined(__linux__) && !defined(__ANDROID__) #if defined(__linux__) && !defined(__ANDROID__)
return LinuxSendAtaLba28Command(device_fd, return LinuxSendAtaLba28Command(device_ctx,
registers, registers,
error_registers, error_registers,
protocol, protocol,
@@ -79,7 +79,7 @@ int32_t SendAtaLba28Command(int device_fd,
#endif #endif
} }
int32_t SendAtaLba48Command(int device_fd, int32_t SendAtaLba48Command(void* device_ctx,
AtaRegistersLba48 registers, AtaRegistersLba48 registers,
AtaErrorRegistersLba48* error_registers, AtaErrorRegistersLba48* error_registers,
uint8_t protocol, uint8_t protocol,
@@ -92,7 +92,7 @@ int32_t SendAtaLba48Command(int device_fd,
uint32_t* buf_len) uint32_t* buf_len)
{ {
#if defined(__linux__) && !defined(__ANDROID__) #if defined(__linux__) && !defined(__ANDROID__)
return LinuxSendAtaLba48Command(device_fd, return LinuxSendAtaLba48Command(device_ctx,
registers, registers,
error_registers, error_registers,
protocol, protocol,

View File

@@ -23,7 +23,7 @@
#include <stdint.h> #include <stdint.h>
int DeviceOpen(const char* device_path) void* DeviceOpen(const char* device_path)
{ {
#if defined(__linux__) && !defined(__ANDROID__) #if defined(__linux__) && !defined(__ANDROID__)
return LinuxOpenDevice(device_path); return LinuxOpenDevice(device_path);
@@ -32,10 +32,10 @@ int DeviceOpen(const char* device_path)
#endif #endif
} }
void DeviceClose(int device_fd) void DeviceClose(void* device_ctx)
{ {
#if defined(__linux__) && !defined(__ANDROID__) #if defined(__linux__) && !defined(__ANDROID__)
return LinuxCloseDevice(device_fd); return LinuxCloseDevice(device_ctx);
#else #else
return -1; return -1;
#endif #endif

View File

@@ -429,10 +429,10 @@ typedef struct
DeviceInfoList* ListDevices(); DeviceInfoList* ListDevices();
void FreeDeviceInfoList(DeviceInfoList* start); void FreeDeviceInfoList(DeviceInfoList* start);
uint16_t DeviceInfoListCount(DeviceInfoList* start); uint16_t DeviceInfoListCount(DeviceInfoList* start);
int DeviceOpen(const char* device_path); void* DeviceOpen(const char* device_path);
void DeviceClose(int device_fd); void DeviceClose(void* device_ctx);
int32_t GetDeviceType(const char* device_path); int32_t GetDeviceType(void* device_ctx);
int32_t SendScsiCommand(int device_fd, int32_t SendScsiCommand(void* device_ctx,
char* cdb, char* cdb,
char* buffer, char* buffer,
char** sense_buffer, char** sense_buffer,
@@ -445,31 +445,31 @@ int32_t SendScsiCommand(int device_fd,
uint32_t* sense_len); uint32_t* sense_len);
int Hexchr2Bin(const char hex, char* out); int Hexchr2Bin(const char hex, char* out);
size_t Hexs2Bin(const char* hex, unsigned char** out); size_t Hexs2Bin(const char* hex, unsigned char** out);
int32_t GetSdhciRegisters(const char* device_path, int32_t GetSdhciRegisters(void* device_ctx,
char** csd, char** csd,
char** cid, char** cid,
char** ocr, char** ocr,
char** scr, char** scr,
uint32_t* csd_len, uint32_t* csd_len,
uint32_t* cid_len, uint32_t* cid_len,
uint32_t* ocr_len, uint32_t* ocr_len,
uint32_t* scr_len); uint32_t* scr_len);
uint8_t GetUsbData(const char* device_path, uint8_t GetUsbData(void* device_ctx,
uint16_t* desc_len, uint16_t* desc_len,
char* descriptors, char* descriptors,
uint16_t* id_vendor, uint16_t* id_vendor,
uint16_t* id_product, uint16_t* id_product,
char* manufacturer, char* manufacturer,
char* product, char* product,
char* serial); char* serial);
uint8_t GetFireWireData(const char* device_path, uint8_t GetFireWireData(void* device_ctx,
uint32_t* id_model, uint32_t* id_model,
uint32_t* id_vendor, uint32_t* id_vendor,
uint64_t* guid, uint64_t* guid,
char* vendor, char* vendor,
char* model); char* model);
uint8_t GetPcmciaData(const char* device_path, uint16_t* cis_len, char* cis); uint8_t GetPcmciaData(void* device_ctx, uint16_t* cis_len, char* cis);
int32_t SendAtaChsCommand(int device_fd, int32_t SendAtaChsCommand(void* device_ctx,
AtaRegistersChs registers, AtaRegistersChs registers,
AtaErrorRegistersChs* error_registers, AtaErrorRegistersChs* error_registers,
uint8_t protocol, uint8_t protocol,
@@ -480,7 +480,7 @@ int32_t SendAtaChsCommand(int device_fd,
uint32_t* duration, uint32_t* duration,
uint32_t* sense, uint32_t* sense,
uint32_t* buf_len); uint32_t* buf_len);
int32_t SendAtaLba28Command(int device_fd, int32_t SendAtaLba28Command(void* device_ctx,
AtaRegistersLba28 registers, AtaRegistersLba28 registers,
AtaErrorRegistersLba28* error_registers, AtaErrorRegistersLba28* error_registers,
uint8_t protocol, uint8_t protocol,
@@ -491,7 +491,7 @@ int32_t SendAtaLba28Command(int device_fd,
uint32_t* duration, uint32_t* duration,
uint32_t* sense, uint32_t* sense,
uint32_t* buf_len); uint32_t* buf_len);
int32_t SendAtaLba48Command(int device_fd, int32_t SendAtaLba48Command(void* device_ctx,
AtaRegistersLba48 registers, AtaRegistersLba48 registers,
AtaErrorRegistersLba48* error_registers, AtaErrorRegistersLba48* error_registers,
uint8_t protocol, uint8_t protocol,
@@ -502,7 +502,7 @@ int32_t SendAtaLba48Command(int device_fd,
uint32_t* duration, uint32_t* duration,
uint32_t* sense, uint32_t* sense,
uint32_t* buf_len); uint32_t* buf_len);
int32_t SendSdhciCommand(int device_fd, int32_t SendSdhciCommand(void* device_ctx,
uint8_t command, uint8_t command,
uint8_t write, uint8_t write,
uint8_t application, uint8_t application,

View File

@@ -37,7 +37,7 @@ int32_t AtaProtocolToScsiDirection(uint8_t protocol)
} }
} }
int32_t LinuxSendAtaChsCommand(int device_fd, int32_t LinuxSendAtaChsCommand(void* device_ctx,
AtaRegistersChs registers, AtaRegistersChs registers,
AtaErrorRegistersChs* error_registers, AtaErrorRegistersChs* error_registers,
uint8_t protocol, uint8_t protocol,
@@ -51,9 +51,12 @@ int32_t LinuxSendAtaChsCommand(int device_fd,
{ {
*duration = 0; *duration = 0;
*sense = 0; *sense = 0;
unsigned char cdb[16]; unsigned char cdb[16];
char* sense_buf; char* sense_buf;
uint32_t sense_len; uint32_t sense_len;
LinuxDeviceContext* ctx = device_ctx;
if(!ctx) return -1;
memset(&cdb, 0, 16); memset(&cdb, 0, 16);
@@ -81,7 +84,7 @@ int32_t LinuxSendAtaChsCommand(int device_fd,
cdb[13] = registers.device_head; cdb[13] = registers.device_head;
cdb[14] = registers.command; cdb[14] = registers.command;
int error = LinuxSendScsiCommand(device_fd, int error = LinuxSendScsiCommand(ctx,
(char*)cdb, (char*)cdb,
buffer, buffer,
&sense_buf, &sense_buf,
@@ -109,7 +112,7 @@ int32_t LinuxSendAtaChsCommand(int device_fd,
return error; return error;
} }
int32_t LinuxSendAtaLba28Command(int device_fd, int32_t LinuxSendAtaLba28Command(void* device_ctx,
AtaRegistersLba28 registers, AtaRegistersLba28 registers,
AtaErrorRegistersLba28* error_registers, AtaErrorRegistersLba28* error_registers,
uint8_t protocol, uint8_t protocol,
@@ -123,9 +126,12 @@ int32_t LinuxSendAtaLba28Command(int device_fd,
{ {
*duration = 0; *duration = 0;
*sense = 0; *sense = 0;
unsigned char cdb[16]; unsigned char cdb[16];
char* sense_buf; char* sense_buf;
uint32_t sense_len; uint32_t sense_len;
LinuxDeviceContext* ctx = device_ctx;
if(!ctx) return -1;
memset(&cdb, 0, 16); memset(&cdb, 0, 16);
@@ -155,7 +161,7 @@ int32_t LinuxSendAtaLba28Command(int device_fd,
cdb[13] = registers.device_head; cdb[13] = registers.device_head;
cdb[14] = registers.command; cdb[14] = registers.command;
int error = LinuxSendScsiCommand(device_fd, int error = LinuxSendScsiCommand(ctx,
(char*)cdb, (char*)cdb,
buffer, buffer,
&sense_buf, &sense_buf,
@@ -183,7 +189,7 @@ int32_t LinuxSendAtaLba28Command(int device_fd,
return error; return error;
} }
int32_t LinuxSendAtaLba48Command(int device_fd, int32_t LinuxSendAtaLba48Command(void* device_ctx,
AtaRegistersLba48 registers, AtaRegistersLba48 registers,
AtaErrorRegistersLba48* error_registers, AtaErrorRegistersLba48* error_registers,
uint8_t protocol, uint8_t protocol,
@@ -197,9 +203,12 @@ int32_t LinuxSendAtaLba48Command(int device_fd,
{ {
*duration = 0; *duration = 0;
*sense = 0; *sense = 0;
unsigned char cdb[16]; unsigned char cdb[16];
char* sense_buf; char* sense_buf;
uint32_t sense_len; uint32_t sense_len;
LinuxDeviceContext* ctx = device_ctx;
if(!ctx) return -1;
memset(&cdb, 0, 16); memset(&cdb, 0, 16);
@@ -235,7 +244,7 @@ int32_t LinuxSendAtaLba48Command(int device_fd,
cdb[13] = registers.device_head; cdb[13] = registers.device_head;
cdb[14] = registers.command; cdb[14] = registers.command;
int error = LinuxSendScsiCommand(device_fd, int error = LinuxSendScsiCommand(ctx,
(char*)cdb, (char*)cdb,
buffer, buffer,
&sense_buf, &sense_buf,

View File

@@ -28,21 +28,48 @@
#include <libudev.h> #include <libudev.h>
#endif #endif
int LinuxOpenDevice(const char* device_path) void* LinuxOpenDevice(const char* device_path)
{ {
int fd; LinuxDeviceContext* ctx;
fd = open(device_path, O_RDWR | O_NONBLOCK | O_CREAT); ctx = malloc(sizeof(LinuxDeviceContext));
if((fd < 0) && (errno == EACCES || errno == EROFS)) { fd = open(device_path, O_RDONLY | O_NONBLOCK); } if(!ctx) return NULL;
return fd; memset(ctx, 0, sizeof(LinuxDeviceContext));
ctx->fd = open(device_path, O_RDWR | O_NONBLOCK | O_CREAT);
if((ctx->fd < 0) && (errno == EACCES || errno == EROFS)) { ctx->fd = open(device_path, O_RDONLY | O_NONBLOCK); }
if(ctx->fd <= 0)
{
free(ctx);
return NULL;
}
strncpy(ctx->device_path, device_path, 4096);
return ctx;
} }
void LinuxCloseDevice(int device_fd) { close(device_fd); } void LinuxCloseDevice(void* device_ctx)
int32_t LinuxGetDeviceType(const char* device_path)
{ {
LinuxDeviceContext* ctx = device_ctx;
if(!ctx) return;
close(ctx->fd);
free(ctx);
}
int32_t LinuxGetDeviceType(void* device_ctx)
{
LinuxDeviceContext* ctx = device_ctx;
if(!ctx) return -1;
#ifdef HAS_UDEV #ifdef HAS_UDEV
struct udev* udev; struct udev* udev;
struct udev_device* udev_device; struct udev_device* udev_device;
@@ -54,7 +81,7 @@ int32_t LinuxGetDeviceType(const char* device_path)
if(!udev) return DICMOTE_DEVICE_TYPE_UNKNOWN; if(!udev) return DICMOTE_DEVICE_TYPE_UNKNOWN;
chrptr = strrchr(device_path, '/'); chrptr = strrchr(ctx->device_path, '/');
if(chrptr == 0) return DICMOTE_DEVICE_TYPE_UNKNOWN; if(chrptr == 0) return DICMOTE_DEVICE_TYPE_UNKNOWN;
chrptr++; chrptr++;
@@ -140,13 +167,13 @@ int32_t LinuxGetDeviceType(const char* device_path)
FILE* file; FILE* file;
size_t len = 4096; size_t len = 4096;
if(strlen(device_path) <= 5) return dev_type; if(strlen(ctx->device_path) <= 5) return dev_type;
if(strstr(device_path, "nvme")) return DICMOTE_DEVICE_TYPE_NVME; if(strstr(ctx->device_path, "nvme")) return DICMOTE_DEVICE_TYPE_NVME;
dev_name = device_path + 5; dev_name = ctx->device_path + 5;
if(strstr(device_path, "mmcblk")) if(strstr(ctx->device_path, "mmcblk"))
{ {
dev_type = DICMOTE_DEVICE_TYPE_MMC; dev_type = DICMOTE_DEVICE_TYPE_MMC;
@@ -293,23 +320,24 @@ int32_t LinuxGetDeviceType(const char* device_path)
#endif #endif
} }
int32_t LinuxGetSdhciRegisters(const char* device_path, int32_t LinuxGetSdhciRegisters(void* device_ctx,
char** csd, char** csd,
char** cid, char** cid,
char** ocr, char** ocr,
char** scr, char** scr,
uint32_t* csd_len, uint32_t* csd_len,
uint32_t* cid_len, uint32_t* cid_len,
uint32_t* ocr_len, uint32_t* ocr_len,
uint32_t* scr_len) uint32_t* scr_len)
{ {
char* tmp_string; LinuxDeviceContext* ctx = device_ctx;
char* sysfs_path_csd; char* tmp_string;
char* sysfs_path_cid; char* sysfs_path_csd;
char* sysfs_path_scr; char* sysfs_path_cid;
char* sysfs_path_ocr; char* sysfs_path_scr;
size_t len; char* sysfs_path_ocr;
FILE* file; size_t len;
FILE* file;
*csd = NULL; *csd = NULL;
*cid = NULL; *cid = NULL;
*ocr = NULL; *ocr = NULL;
@@ -320,9 +348,11 @@ int32_t LinuxGetSdhciRegisters(const char* device_path,
*scr_len = 0; *scr_len = 0;
size_t n = 1026; size_t n = 1026;
if(strncmp(device_path, "/dev/mmcblk", 11) != 0) return 0; if(!ctx) return -1;
len = strlen(device_path) + 19; if(strncmp(ctx->device_path, "/dev/mmcblk", 11) != 0) return 0;
len = strlen(ctx->device_path) + 19;
sysfs_path_csd = malloc(len); sysfs_path_csd = malloc(len);
sysfs_path_cid = malloc(len); sysfs_path_cid = malloc(len);
sysfs_path_scr = malloc(len); sysfs_path_scr = malloc(len);
@@ -343,9 +373,9 @@ int32_t LinuxGetSdhciRegisters(const char* device_path,
memset(sysfs_path_cid, 0, len); memset(sysfs_path_cid, 0, len);
memset(sysfs_path_scr, 0, len); memset(sysfs_path_scr, 0, len);
memset(sysfs_path_ocr, 0, len); memset(sysfs_path_ocr, 0, len);
memset(tmp_string, 0, strlen(device_path) - 5); memset(tmp_string, 0, strlen(ctx->device_path) - 5);
memcpy(tmp_string, device_path + 5, strlen(device_path) - 5); memcpy(tmp_string, ctx->device_path + 5, strlen(ctx->device_path) - 5);
snprintf(sysfs_path_csd, len, "/sys/block/%s/device/csd", tmp_string); snprintf(sysfs_path_csd, len, "/sys/block/%s/device/csd", tmp_string);
snprintf(sysfs_path_cid, len, "/sys/block/%s/device/cid", tmp_string); snprintf(sysfs_path_cid, len, "/sys/block/%s/device/cid", tmp_string);
snprintf(sysfs_path_scr, len, "/sys/block/%s/device/scr", tmp_string); snprintf(sysfs_path_scr, len, "/sys/block/%s/device/scr", tmp_string);

View File

@@ -15,27 +15,32 @@
* along with this program. If not, see <http://www.gnu.org/licenses/>. * along with this program. If not, see <http://www.gnu.org/licenses/>.
*/ */
#include "linux.h"
#include <stdint.h> #include <stdint.h>
#include <stdio.h> #include <stdio.h>
#include <string.h> #include <string.h>
#include <sys/stat.h> #include <sys/stat.h>
#include <unistd.h> #include <unistd.h>
uint8_t LinuxGetIeee1394Data(const char* device_path, uint8_t LinuxGetIeee1394Data(void* device_ctx,
uint32_t* id_model, uint32_t* id_model,
uint32_t* id_vendor, uint32_t* id_vendor,
uint64_t* guid, uint64_t* guid,
char* vendor, char* vendor,
char* model) char* model)
{ {
char* dev_path; LinuxDeviceContext* ctx = device_ctx;
char tmp_path[4096]; char* dev_path;
char resolved_link[4096]; char tmp_path[4096];
struct stat sb; char resolved_link[4096];
ssize_t len; struct stat sb;
char* rchr; ssize_t len;
int found; char* rchr;
FILE* file; int found;
FILE* file;
if(!ctx) return 0;
*id_model = 0; *id_model = 0;
*id_vendor = 0; *id_vendor = 0;
@@ -43,11 +48,11 @@ uint8_t LinuxGetIeee1394Data(const char* device_path,
memset(tmp_path, 0, 4096); memset(tmp_path, 0, 4096);
memset(resolved_link, 0, 4096); memset(resolved_link, 0, 4096);
if(strncmp(device_path, "/dev/sd", 7) != 0 && strncmp(device_path, "/dev/sr", 7) != 0 && if(strncmp(ctx->device_path, "/dev/sd", 7) != 0 && strncmp(ctx->device_path, "/dev/sr", 7) != 0 &&
strncmp(device_path, "/dev/st", 7) != 0) strncmp(ctx->device_path, "/dev/st", 7) != 0)
return 0; return 0;
dev_path = (char*)device_path + 5; dev_path = (char*)ctx->device_path + 5;
snprintf(tmp_path, 4096, "/sys/block/%s", dev_path); snprintf(tmp_path, 4096, "/sys/block/%s", dev_path);

View File

@@ -24,12 +24,12 @@
DeviceInfoList* LinuxListDevices(); DeviceInfoList* LinuxListDevices();
int LinuxOpenDevice(const char* device_path); void* LinuxOpenDevice(const char* device_path);
void LinuxCloseDevice(int device_fd); void LinuxCloseDevice(void* device_ctx);
int32_t LinuxGetDeviceType(const char* device_path); int32_t LinuxGetDeviceType(void* device_ctx);
int32_t LinuxSendScsiCommand(int device_fd, int32_t LinuxSendScsiCommand(void* device_ctx,
char* cdb, char* cdb,
char* buffer, char* buffer,
char** sense_buffer, char** sense_buffer,
@@ -41,35 +41,35 @@ int32_t LinuxSendScsiCommand(int device_fd,
uint32_t* buf_len, uint32_t* buf_len,
uint32_t* sense_len); uint32_t* sense_len);
int32_t LinuxGetSdhciRegisters(const char* device_path, int32_t LinuxGetSdhciRegisters(void* device_ctx,
char** csd, char** csd,
char** cid, char** cid,
char** ocr, char** ocr,
char** scr, char** scr,
uint32_t* csd_len, uint32_t* csd_len,
uint32_t* cid_len, uint32_t* cid_len,
uint32_t* ocr_len, uint32_t* ocr_len,
uint32_t* scr_len); uint32_t* scr_len);
uint8_t LinuxGetUsbData(const char* device_path, uint8_t LinuxGetUsbData(void* device_ctx,
uint16_t* desc_len, uint16_t* desc_len,
char* descriptors, char* descriptors,
uint16_t* id_vendor, uint16_t* id_vendor,
uint16_t* id_product, uint16_t* id_product,
char* manufacturer, char* manufacturer,
char* product, char* product,
char* serial); char* serial);
uint8_t LinuxGetIeee1394Data(const char* device_path, uint8_t LinuxGetIeee1394Data(void* device_ctx,
uint32_t* id_model, uint32_t* id_model,
uint32_t* id_vendor, uint32_t* id_vendor,
uint64_t* guid, uint64_t* guid,
char* vendor, char* vendor,
char* model); char* model);
uint8_t LinuxGetPcmciaData(const char* device_path, uint16_t* cis_len, char* cis); uint8_t LinuxGetPcmciaData(void* device_ctx, uint16_t* cis_len, char* cis);
int32_t LinuxSendAtaChsCommand(int device_fd, int32_t LinuxSendAtaChsCommand(void* device_ctx,
AtaRegistersChs registers, AtaRegistersChs registers,
AtaErrorRegistersChs* error_registers, AtaErrorRegistersChs* error_registers,
uint8_t protocol, uint8_t protocol,
@@ -81,7 +81,7 @@ int32_t LinuxSendAtaChsCommand(int device_fd,
uint32_t* sense, uint32_t* sense,
uint32_t* buf_len); uint32_t* buf_len);
int32_t LinuxSendAtaLba28Command(int device_fd, int32_t LinuxSendAtaLba28Command(void* device_ctx,
AtaRegistersLba28 registers, AtaRegistersLba28 registers,
AtaErrorRegistersLba28* error_registers, AtaErrorRegistersLba28* error_registers,
uint8_t protocol, uint8_t protocol,
@@ -93,7 +93,7 @@ int32_t LinuxSendAtaLba28Command(int device_fd,
uint32_t* sense, uint32_t* sense,
uint32_t* buf_len); uint32_t* buf_len);
int32_t LinuxSendAtaLba48Command(int device_fd, int32_t LinuxSendAtaLba48Command(void* device_ctx,
AtaRegistersLba48 registers, AtaRegistersLba48 registers,
AtaErrorRegistersLba48* error_registers, AtaErrorRegistersLba48* error_registers,
uint8_t protocol, uint8_t protocol,
@@ -105,7 +105,7 @@ int32_t LinuxSendAtaLba48Command(int device_fd,
uint32_t* sense, uint32_t* sense,
uint32_t* buf_len); uint32_t* buf_len);
int32_t LinuxSendSdhciCommand(int device_fd, int32_t LinuxSendSdhciCommand(void* device_ctx,
uint8_t command, uint8_t command,
uint8_t write, uint8_t write,
uint8_t application, uint8_t application,
@@ -119,4 +119,10 @@ int32_t LinuxSendSdhciCommand(int device_fd,
uint32_t* duration, uint32_t* duration,
uint32_t* sense); uint32_t* sense);
typedef struct
{
int fd;
char device_path[4096];
} LinuxDeviceContext;
#endif // DICREMOTE_LINUX_LINUX_H_ #endif // DICREMOTE_LINUX_LINUX_H_

View File

@@ -15,6 +15,8 @@
* along with this program. If not, see <http://www.gnu.org/licenses/>. * along with this program. If not, see <http://www.gnu.org/licenses/>.
*/ */
#include "linux.h"
#include <dirent.h> #include <dirent.h>
#include <stdint.h> #include <stdint.h>
#include <stdio.h> #include <stdio.h>
@@ -22,27 +24,30 @@
#include <sys/stat.h> #include <sys/stat.h>
#include <unistd.h> #include <unistd.h>
uint8_t LinuxGetPcmciaData(const char* device_path, uint16_t* cis_len, char* cis) uint8_t LinuxGetPcmciaData(void* device_ctx, uint16_t* cis_len, char* cis)
{ {
char* dev_path; LinuxDeviceContext* ctx = device_ctx;
char tmp_path[4096]; char* dev_path;
char resolved_link[4096]; char tmp_path[4096];
struct stat sb; char resolved_link[4096];
ssize_t len; struct stat sb;
char* rchr; ssize_t len;
FILE* file; char* rchr;
DIR* dir; FILE* file;
struct dirent* dent; DIR* dir;
struct dirent* dent;
*cis_len = 0; *cis_len = 0;
if(!ctx) return 0;
memset(tmp_path, 0, 4096); memset(tmp_path, 0, 4096);
memset(resolved_link, 0, 4096); memset(resolved_link, 0, 4096);
if(strncmp(device_path, "/dev/sd", 7) != 0 && strncmp(device_path, "/dev/sr", 7) != 0 && if(strncmp(ctx->device_path, "/dev/sd", 7) != 0 && strncmp(ctx->device_path, "/dev/sr", 7) != 0 &&
strncmp(device_path, "/dev/st", 7) != 0) strncmp(ctx->device_path, "/dev/st", 7) != 0)
return 0; return 0;
dev_path = (char*)device_path + 5; dev_path = (char*)ctx->device_path + 5;
snprintf(tmp_path, 4096, "/sys/block/%s", dev_path); snprintf(tmp_path, 4096, "/sys/block/%s", dev_path);

View File

@@ -16,6 +16,7 @@
*/ */
#include "../dicmote.h" #include "../dicmote.h"
#include "linux.h"
#include <malloc.h> #include <malloc.h>
#include <scsi/sg.h> #include <scsi/sg.h>
@@ -23,7 +24,7 @@
#include <string.h> #include <string.h>
#include <sys/ioctl.h> #include <sys/ioctl.h>
int32_t LinuxSendScsiCommand(int device_fd, int32_t LinuxSendScsiCommand(void* device_ctx,
char* cdb, char* cdb,
char* buffer, char* buffer,
char** sense_buffer, char** sense_buffer,
@@ -35,10 +36,13 @@ int32_t LinuxSendScsiCommand(int device_fd,
uint32_t* buf_len, uint32_t* buf_len,
uint32_t* sense_len) uint32_t* sense_len)
{ {
sg_io_hdr_t hdr; LinuxDeviceContext* ctx = device_ctx;
int dir, ret; sg_io_hdr_t hdr;
int dir, ret;
*sense_len = 32; *sense_len = 32;
if(!ctx) return -1;
memset(&hdr, 0, sizeof(sg_io_hdr_t)); memset(&hdr, 0, sizeof(sg_io_hdr_t));
*sense_buffer = malloc(*sense_len); *sense_buffer = malloc(*sense_len);
@@ -65,7 +69,7 @@ int32_t LinuxSendScsiCommand(int device_fd,
hdr.timeout = timeout; hdr.timeout = timeout;
hdr.flags = SG_FLAG_DIRECT_IO; hdr.flags = SG_FLAG_DIRECT_IO;
ret = ioctl(device_fd, SG_IO, &hdr); ret = ioctl(ctx->fd, SG_IO, &hdr);
*sense = (hdr.info & SG_INFO_OK_MASK) != SG_INFO_OK; *sense = (hdr.info & SG_INFO_OK_MASK) != SG_INFO_OK;
// TODO: Manual timing if duration is 0 // TODO: Manual timing if duration is 0

View File

@@ -15,14 +15,15 @@
* along with this program. If not, see <http://www.gnu.org/licenses/>. * along with this program. If not, see <http://www.gnu.org/licenses/>.
*/ */
#include <stdint.h> #include "linux.h"
#include "mmc/ioctl.h"
#include <errno.h> #include <errno.h>
#include "mmc/ioctl.h" #include <stdint.h>
#include <string.h> #include <string.h>
#include <sys/ioctl.h> #include <sys/ioctl.h>
int32_t LinuxSendSdhciCommand(int device_fd, int32_t LinuxSendSdhciCommand(void* device_ctx,
uint8_t command, uint8_t command,
uint8_t write, uint8_t write,
uint8_t application, uint8_t application,
@@ -36,11 +37,14 @@ int32_t LinuxSendSdhciCommand(int device_fd,
uint32_t* duration, uint32_t* duration,
uint32_t* sense) uint32_t* sense)
{ {
struct mmc_ioc_cmd mmc_ioc_cmd; LinuxDeviceContext* ctx = device_ctx;
int32_t error; struct mmc_ioc_cmd mmc_ioc_cmd;
int32_t error;
*duration = 0; *duration = 0;
*sense = 0; *sense = 0;
if(!ctx) return -1;
memset(response, 0, sizeof(uint32_t) * 4); memset(response, 0, sizeof(uint32_t) * 4);
memset(&mmc_ioc_cmd, 0, sizeof(struct mmc_ioc_cmd)); memset(&mmc_ioc_cmd, 0, sizeof(struct mmc_ioc_cmd));
@@ -59,7 +63,7 @@ int32_t LinuxSendSdhciCommand(int device_fd,
mmc_ioc_cmd.data_ptr = (uint64_t)buffer; mmc_ioc_cmd.data_ptr = (uint64_t)buffer;
// TODO: Timing // TODO: Timing
error = ioctl(device_fd, MMC_IOC_CMD, &mmc_ioc_cmd); error = ioctl(ctx->fd, MMC_IOC_CMD, &mmc_ioc_cmd);
if(error < 0) error = errno; if(error < 0) error = errno;

View File

@@ -23,23 +23,26 @@
#include <sys/stat.h> #include <sys/stat.h>
#include <unistd.h> #include <unistd.h>
uint8_t LinuxGetUsbData(const char* device_path, uint8_t LinuxGetUsbData(void* device_ctx,
uint16_t* desc_len, uint16_t* desc_len,
char* descriptors, char* descriptors,
uint16_t* id_vendor, uint16_t* id_vendor,
uint16_t* id_product, uint16_t* id_product,
char* manufacturer, char* manufacturer,
char* product, char* product,
char* serial) char* serial)
{ {
char* dev_path; LinuxDeviceContext* ctx = device_ctx;
char tmp_path[4096]; char* dev_path;
char resolved_link[4096]; char tmp_path[4096];
struct stat sb; char resolved_link[4096];
ssize_t len; struct stat sb;
char* rchr; ssize_t len;
int found = 1; char* rchr;
FILE* file; int found = 1;
FILE* file;
if(!ctx) return -1;
*desc_len = 0; *desc_len = 0;
*id_vendor = 0; *id_vendor = 0;
@@ -47,11 +50,11 @@ uint8_t LinuxGetUsbData(const char* device_path,
memset(tmp_path, 0, 4096); memset(tmp_path, 0, 4096);
memset(resolved_link, 0, 4096); memset(resolved_link, 0, 4096);
if(strncmp(device_path, "/dev/sd", 7) != 0 && strncmp(device_path, "/dev/sr", 7) != 0 && if(strncmp(ctx->device_path, "/dev/sd", 7) != 0 && strncmp(ctx->device_path, "/dev/sr", 7) != 0 &&
strncmp(device_path, "/dev/st", 7) != 0) strncmp(ctx->device_path, "/dev/st", 7) != 0)
return 0; return 0;
dev_path = (char*)device_path + 5; dev_path = (char*)ctx->device_path + 5;
snprintf(tmp_path, 4096, "/sys/block/%s", dev_path); snprintf(tmp_path, 4096, "/sys/block/%s", dev_path);

View File

@@ -21,10 +21,10 @@
#include "linux/linux.h" #include "linux/linux.h"
#endif #endif
uint8_t GetPcmciaData(const char* device_path, uint16_t* cis_len, char* cis) uint8_t GetPcmciaData(void* device_ctx, uint16_t* cis_len, char* cis)
{ {
#if defined(__linux__) && !defined(__ANDROID__) #if defined(__linux__) && !defined(__ANDROID__)
return LinuxGetPcmciaData(device_path, cis_len, cis); return LinuxGetPcmciaData(device_ctx, cis_len, cis);
#else #else
return 0; return 0;
#endif #endif

4
scsi.c
View File

@@ -21,7 +21,7 @@
#include <stdint.h> #include <stdint.h>
int32_t SendScsiCommand(int device_fd, int32_t SendScsiCommand(void* device_ctx,
char* cdb, char* cdb,
char* buffer, char* buffer,
char** sense_buffer, char** sense_buffer,
@@ -35,7 +35,7 @@ int32_t SendScsiCommand(int device_fd,
{ {
#if defined(__linux__) && !defined(__ANDROID__) #if defined(__linux__) && !defined(__ANDROID__)
return LinuxSendScsiCommand( return LinuxSendScsiCommand(
device_fd, cdb, buffer, sense_buffer, timeout, direction, duration, sense, cdb_len, buf_len, sense_len); device_ctx, cdb, buffer, sense_buffer, timeout, direction, duration, sense, cdb_len, buf_len, sense_len);
#else #else
return -1; return -1;
#endif #endif

View File

@@ -21,7 +21,7 @@
#include <stdint.h> #include <stdint.h>
int32_t SendSdhciCommand(int device_fd, int32_t SendSdhciCommand(void* device_ctx,
uint8_t command, uint8_t command,
uint8_t write, uint8_t write,
uint8_t application, uint8_t application,
@@ -37,7 +37,7 @@ int32_t SendSdhciCommand(int device_fd,
uint32_t* sense) uint32_t* sense)
{ {
#if defined(__linux__) && !defined(__ANDROID__) #if defined(__linux__) && !defined(__ANDROID__)
return LinuxSendSdhciCommand(device_fd, return LinuxSendSdhciCommand(device_ctx,
command, command,
write, write,
application, application,

18
usb.c
View File

@@ -21,17 +21,17 @@
#include "linux/linux.h" #include "linux/linux.h"
#endif #endif
uint8_t GetUsbData(const char* device_path, uint8_t GetUsbData(void* device_ctx,
uint16_t* desc_len, uint16_t* desc_len,
char* descriptors, char* descriptors,
uint16_t* id_vendor, uint16_t* id_vendor,
uint16_t* id_product, uint16_t* id_product,
char* manufacturer, char* manufacturer,
char* product, char* product,
char* serial) char* serial)
{ {
#if defined(__linux__) && !defined(__ANDROID__) #if defined(__linux__) && !defined(__ANDROID__)
return LinuxGetUsbData(device_path, desc_len, descriptors, id_vendor, id_product, manufacturer, product, serial); return LinuxGetUsbData(device_ctx, desc_len, descriptors, id_vendor, id_product, manufacturer, product, serial);
#else #else
return 0; return 0;
#endif #endif

View File

@@ -35,6 +35,12 @@
#define DICREMOTE_WII_DEVICE_PATH_GCMM_A "/dev/gcmm/slota" #define DICREMOTE_WII_DEVICE_PATH_GCMM_A "/dev/gcmm/slota"
#define DICREMOTE_WII_DEVICE_PATH_GCMM_B "/dev/gcmm/slotb" #define DICREMOTE_WII_DEVICE_PATH_GCMM_B "/dev/gcmm/slotb"
typedef struct
{
s32 ios_fd;
s32 dev_type;
} WiiDeviceContext;
DeviceInfoList* WiiListDevices(); DeviceInfoList* WiiListDevices();
#endif // DICREMOTE_WII_WII_H_ #endif // DICREMOTE_WII_WII_H_

View File

@@ -28,7 +28,6 @@ void* WorkingLoop(void* arguments)
AtaErrorRegistersChs ata_chs_error_regs; AtaErrorRegistersChs ata_chs_error_regs;
AtaErrorRegistersLba28 ata_lba28_error_regs; AtaErrorRegistersLba28 ata_lba28_error_regs;
AtaErrorRegistersLba48 ata_lba48_error_regs; AtaErrorRegistersLba48 ata_lba48_error_regs;
char device_path[1024];
char* buffer; char* buffer;
char* cdb_buf; char* cdb_buf;
char* cid; char* cid;
@@ -59,7 +58,6 @@ void* WorkingLoop(void* arguments)
DicPacketResListDevs* pkt_res_devinfo; DicPacketResListDevs* pkt_res_devinfo;
DicPacketResScsi* pkt_res_scsi; DicPacketResScsi* pkt_res_scsi;
DicPacketResSdhci* pkt_res_sdhci; DicPacketResSdhci* pkt_res_sdhci;
int device_fd = -1;
int skip_next_hdr; int skip_next_hdr;
int cli_sock, sock_fd; int cli_sock, sock_fd;
int ret; int ret;
@@ -72,6 +70,7 @@ void* WorkingLoop(void* arguments)
uint32_t sense; uint32_t sense;
uint32_t sense_len; uint32_t sense_len;
uint64_t n; uint64_t n;
void* device_ctx = NULL;
if(!arguments) if(!arguments)
{ {
@@ -382,17 +381,14 @@ void* WorkingLoop(void* arguments)
NetRecv(cli_sock, pkt_dev_open, le32toh(pkt_hdr->len), 0); NetRecv(cli_sock, pkt_dev_open, le32toh(pkt_hdr->len), 0);
device_fd = DeviceOpen(pkt_dev_open->device_path); device_ctx = DeviceOpen(pkt_dev_open->device_path);
pkt_nop->reason_code = pkt_nop->reason_code =
device_fd == -1 ? DICMOTE_PACKET_NOP_REASON_OPEN_ERROR : DICMOTE_PACKET_NOP_REASON_OPEN_OK; device_ctx == NULL ? DICMOTE_PACKET_NOP_REASON_OPEN_ERROR : DICMOTE_PACKET_NOP_REASON_OPEN_OK;
pkt_nop->error_no = errno; pkt_nop->error_no = errno;
memset(&pkt_nop->reason, 0, 256); memset(&pkt_nop->reason, 0, 256);
NetWrite(cli_sock, pkt_nop, sizeof(DicPacketNop)); NetWrite(cli_sock, pkt_nop, sizeof(DicPacketNop));
if(pkt_nop->reason_code == DICMOTE_PACKET_NOP_REASON_OPEN_OK)
strncpy(device_path, pkt_dev_open->device_path, 1024);
free(pkt_dev_open); free(pkt_dev_open);
continue; continue;
case DICMOTE_PACKET_TYPE_COMMAND_GET_DEVTYPE: case DICMOTE_PACKET_TYPE_COMMAND_GET_DEVTYPE:
@@ -427,7 +423,7 @@ void* WorkingLoop(void* arguments)
pkt_dev_type->hdr.version = DICMOTE_PACKET_VERSION; pkt_dev_type->hdr.version = DICMOTE_PACKET_VERSION;
pkt_dev_type->hdr.remote_id = htole32(DICMOTE_REMOTE_ID); pkt_dev_type->hdr.remote_id = htole32(DICMOTE_REMOTE_ID);
pkt_dev_type->hdr.packet_id = htole32(DICMOTE_PACKET_ID); pkt_dev_type->hdr.packet_id = htole32(DICMOTE_PACKET_ID);
pkt_dev_type->device_type = htole32(GetDeviceType(device_path)); pkt_dev_type->device_type = htole32(GetDeviceType(device_ctx));
NetWrite(cli_sock, pkt_dev_type, sizeof(DicPacketResGetDeviceType)); NetWrite(cli_sock, pkt_dev_type, sizeof(DicPacketResGetDeviceType));
free(pkt_dev_type); free(pkt_dev_type);
@@ -462,7 +458,7 @@ void* WorkingLoop(void* arguments)
// Swap buf_len // Swap buf_len
pkt_cmd_scsi->buf_len = le32toh(pkt_cmd_scsi->buf_len); pkt_cmd_scsi->buf_len = le32toh(pkt_cmd_scsi->buf_len);
ret = SendScsiCommand(device_fd, ret = SendScsiCommand(device_ctx,
cdb_buf, cdb_buf,
buffer, buffer,
&sense_buf, &sense_buf,
@@ -539,7 +535,7 @@ void* WorkingLoop(void* arguments)
pkt_res_sdhci_registers->hdr.version = DICMOTE_PACKET_VERSION; pkt_res_sdhci_registers->hdr.version = DICMOTE_PACKET_VERSION;
pkt_res_sdhci_registers->hdr.packet_type = DICMOTE_PACKET_TYPE_RESPONSE_GET_SDHCI_REGISTERS; pkt_res_sdhci_registers->hdr.packet_type = DICMOTE_PACKET_TYPE_RESPONSE_GET_SDHCI_REGISTERS;
pkt_res_sdhci_registers->hdr.len = htole32(sizeof(DicPacketResGetSdhciRegisters)); pkt_res_sdhci_registers->hdr.len = htole32(sizeof(DicPacketResGetSdhciRegisters));
pkt_res_sdhci_registers->is_sdhci = GetSdhciRegisters(device_path, pkt_res_sdhci_registers->is_sdhci = GetSdhciRegisters(device_ctx,
&csd, &csd,
&cid, &cid,
&ocr, &ocr,
@@ -618,7 +614,7 @@ void* WorkingLoop(void* arguments)
pkt_res_usb->hdr.version = DICMOTE_PACKET_VERSION; pkt_res_usb->hdr.version = DICMOTE_PACKET_VERSION;
pkt_res_usb->hdr.packet_type = DICMOTE_PACKET_TYPE_RESPONSE_GET_USB_DATA; pkt_res_usb->hdr.packet_type = DICMOTE_PACKET_TYPE_RESPONSE_GET_USB_DATA;
pkt_res_usb->hdr.len = htole32(sizeof(DicPacketResGetUsbData)); pkt_res_usb->hdr.len = htole32(sizeof(DicPacketResGetUsbData));
pkt_res_usb->is_usb = GetUsbData(device_path, pkt_res_usb->is_usb = GetUsbData(device_ctx,
&pkt_res_usb->desc_len, &pkt_res_usb->desc_len,
pkt_res_usb->descriptors, pkt_res_usb->descriptors,
&pkt_res_usb->id_vendor, &pkt_res_usb->id_vendor,
@@ -664,7 +660,7 @@ void* WorkingLoop(void* arguments)
pkt_res_firewire->hdr.version = DICMOTE_PACKET_VERSION; pkt_res_firewire->hdr.version = DICMOTE_PACKET_VERSION;
pkt_res_firewire->hdr.packet_type = DICMOTE_PACKET_TYPE_RESPONSE_GET_FIREWIRE_DATA; pkt_res_firewire->hdr.packet_type = DICMOTE_PACKET_TYPE_RESPONSE_GET_FIREWIRE_DATA;
pkt_res_firewire->hdr.len = htole32(sizeof(DicPacketResGetFireWireData)); pkt_res_firewire->hdr.len = htole32(sizeof(DicPacketResGetFireWireData));
pkt_res_firewire->is_firewire = GetFireWireData(device_path, pkt_res_firewire->is_firewire = GetFireWireData(device_ctx,
&pkt_res_firewire->id_model, &pkt_res_firewire->id_model,
&pkt_res_firewire->id_vendor, &pkt_res_firewire->id_vendor,
&pkt_res_firewire->guid, &pkt_res_firewire->guid,
@@ -707,7 +703,7 @@ void* WorkingLoop(void* arguments)
pkt_res_pcmcia->hdr.packet_type = DICMOTE_PACKET_TYPE_RESPONSE_GET_PCMCIA_DATA; pkt_res_pcmcia->hdr.packet_type = DICMOTE_PACKET_TYPE_RESPONSE_GET_PCMCIA_DATA;
pkt_res_pcmcia->hdr.len = htole32(sizeof(DicPacketResGetPcmciaData)); pkt_res_pcmcia->hdr.len = htole32(sizeof(DicPacketResGetPcmciaData));
pkt_res_pcmcia->is_pcmcia = pkt_res_pcmcia->is_pcmcia =
GetPcmciaData(device_path, &pkt_res_pcmcia->cis_len, pkt_res_pcmcia->cis); GetPcmciaData(device_ctx, &pkt_res_pcmcia->cis_len, pkt_res_pcmcia->cis);
pkt_res_pcmcia->cis_len = htole32(pkt_res_pcmcia->cis_len); pkt_res_pcmcia->cis_len = htole32(pkt_res_pcmcia->cis_len);
@@ -742,7 +738,7 @@ void* WorkingLoop(void* arguments)
duration = 0; duration = 0;
sense = 1; sense = 1;
ret = SendAtaChsCommand(device_fd, ret = SendAtaChsCommand(device_ctx,
pkt_cmd_ata_chs->registers, pkt_cmd_ata_chs->registers,
&ata_chs_error_regs, &ata_chs_error_regs,
pkt_cmd_ata_chs->protocol, pkt_cmd_ata_chs->protocol,
@@ -814,7 +810,7 @@ void* WorkingLoop(void* arguments)
duration = 0; duration = 0;
sense = 1; sense = 1;
ret = SendAtaLba28Command(device_fd, ret = SendAtaLba28Command(device_ctx,
pkt_cmd_ata_lba28->registers, pkt_cmd_ata_lba28->registers,
&ata_lba28_error_regs, &ata_lba28_error_regs,
pkt_cmd_ata_lba28->protocol, pkt_cmd_ata_lba28->protocol,
@@ -892,7 +888,7 @@ void* WorkingLoop(void* arguments)
duration = 0; duration = 0;
sense = 1; sense = 1;
ret = SendAtaLba48Command(device_fd, ret = SendAtaLba48Command(device_ctx,
pkt_cmd_ata_lba48->registers, pkt_cmd_ata_lba48->registers,
&ata_lba48_error_regs, &ata_lba48_error_regs,
pkt_cmd_ata_lba48->protocol, pkt_cmd_ata_lba48->protocol,
@@ -969,7 +965,7 @@ void* WorkingLoop(void* arguments)
duration = 0; duration = 0;
sense = 1; sense = 1;
ret = SendSdhciCommand(device_fd, ret = SendSdhciCommand(device_ctx,
pkt_cmd_sdhci->command, pkt_cmd_sdhci->command,
pkt_cmd_sdhci->write, pkt_cmd_sdhci->write,
pkt_cmd_sdhci->application, pkt_cmd_sdhci->application,
@@ -1020,7 +1016,8 @@ void* WorkingLoop(void* arguments)
free(pkt_res_sdhci); free(pkt_res_sdhci);
continue; continue;
case DICMOTE_PACKET_TYPE_COMMAND_CLOSE_DEVICE: case DICMOTE_PACKET_TYPE_COMMAND_CLOSE_DEVICE:
DeviceClose(device_fd); DeviceClose(device_ctx);
device_ctx = NULL;
skip_next_hdr = 1; skip_next_hdr = 1;
continue; continue;
default: default: