diff --git a/device.c b/device.c index 7c51894..fab5b8d 100644 --- a/device.c +++ b/device.c @@ -32,6 +32,15 @@ int DeviceOpen(const char* device_path) #endif } +void DeviceClose(int device_fd) +{ +#if defined(__linux__) && !defined(__ANDROID__) + return LinuxCloseDevice(device_fd); +#else + return -1; +#endif +} + int32_t GetDeviceType(const char* device_path) { #if defined(__linux__) && !defined(__ANDROID__) diff --git a/dicmote.h b/dicmote.h index d7e4805..4f670ba 100644 --- a/dicmote.h +++ b/dicmote.h @@ -62,6 +62,7 @@ #define DICMOTE_PACKET_TYPE_RESPONSE_GET_FIREWIRE_DATA 22 #define DICMOTE_PACKET_TYPE_COMMAND_GET_PCMCIA_DATA 23 #define DICMOTE_PACKET_TYPE_RESPONSE_GET_PCMCIA_DATA 24 +#define DICMOTE_PACKET_TYPE_COMMAND_CLOSE_DEVICE 25 #define DICMOTE_PROTOCOL_MAX 1 #define DICMOTE_PACKET_NOP_REASON_OOO 0 #define DICMOTE_PACKET_NOP_REASON_NOT_IMPLEMENTED 1 @@ -418,12 +419,18 @@ typedef struct char cis[65536]; } DicPacketResGetPcmciaData; +typedef struct +{ + DicPacketHeader hdr; +} DicPacketCmdClose; + #pragma pack(pop) DeviceInfoList* ListDevices(); void FreeDeviceInfoList(DeviceInfoList* start); uint16_t DeviceInfoListCount(DeviceInfoList* start); int DeviceOpen(const char* device_path); +void DeviceClose(int device_fd); int32_t GetDeviceType(const char* device_path); int32_t SendScsiCommand(int device_fd, char* cdb, diff --git a/linux/device.c b/linux/device.c index fcb6311..e50553c 100644 --- a/linux/device.c +++ b/linux/device.c @@ -39,6 +39,8 @@ int LinuxOpenDevice(const char* device_path) return fd; } +void LinuxCloseDevice(int device_fd) { close(device_fd); } + int32_t LinuxGetDeviceType(const char* device_path) { #ifdef HAS_UDEV diff --git a/linux/linux.h b/linux/linux.h index e8fab46..33a0a8b 100644 --- a/linux/linux.h +++ b/linux/linux.h @@ -24,7 +24,8 @@ DeviceInfoList* LinuxListDevices(); -int LinuxOpenDevice(const char* device_path); +int LinuxOpenDevice(const char* device_path); +void LinuxCloseDevice(int device_fd); int32_t LinuxGetDeviceType(const char* device_path); diff --git a/worker.c b/worker.c index 1359830..511deb0 100644 --- a/worker.c +++ b/worker.c @@ -1019,6 +1019,10 @@ void* WorkingLoop(void* arguments) free(pkt_cmd_sdhci); free(pkt_res_sdhci); continue; + case DICMOTE_PACKET_TYPE_COMMAND_CLOSE_DEVICE: + DeviceClose(device_fd); + skip_next_hdr = 1; + continue; default: pkt_nop->reason_code = DICMOTE_PACKET_NOP_REASON_NOT_RECOGNIZED; memset(&pkt_nop->reason, 0, 256);