mirror of
https://github.com/aaru-dps/aaruremote.git
synced 2025-12-16 19:24:37 +00:00
Fix parsing of /sys/block/XXX/device symlinks. (#14)
As of c810bd8d07, I'm not able to use
aaruremote on Linux (5.10). I've tried a few machines and they all have
device sylinks like the following example from my CD dumping machine
(has a mixture of SATA and IDE drives):
/sys/block/sr0/device -> ../../../0:0:0:0
/sys/block/sr1/device -> ../../../0:0:1:0
/sys/block/sr2/device -> ../../../4:0:0:0
/sys/block/sr3/device -> ../../../1:0:0:0
/sys/block/sr4/device -> ../../../3:0:0:0
/sys/block/sr5/device -> ../../../6:0:0:0
I'm not sure how many variants of this symlink exist in Linux, but from
reading the existing code I *think* the intent was to extract the
characters from the start the of last component of the filename up to
the delimeter character (`.` or `:`), so I've reworked the code to do
that without tripping up on the `..` parts of the path.
This commit is contained in:
@@ -157,6 +157,7 @@ int32_t GetDeviceType(void* device_ctx)
|
|||||||
const char* dev_name;
|
const char* dev_name;
|
||||||
const char* sysfs_path;
|
const char* sysfs_path;
|
||||||
char* dev_path;
|
char* dev_path;
|
||||||
|
char* dev_path2;
|
||||||
char* host_no;
|
char* host_no;
|
||||||
char* scsi_path;
|
char* scsi_path;
|
||||||
char* iscsi_path;
|
char* iscsi_path;
|
||||||
@@ -164,7 +165,6 @@ int32_t GetDeviceType(void* device_ctx)
|
|||||||
char* fc_path;
|
char* fc_path;
|
||||||
char* sas_path;
|
char* sas_path;
|
||||||
int ret;
|
int ret;
|
||||||
char delim;
|
|
||||||
char* chrptr;
|
char* chrptr;
|
||||||
char* sysfs_path_scr;
|
char* sysfs_path_scr;
|
||||||
FILE* file;
|
FILE* file;
|
||||||
@@ -242,14 +242,21 @@ int32_t GetDeviceType(void* device_ctx)
|
|||||||
return dev_type;
|
return dev_type;
|
||||||
}
|
}
|
||||||
|
|
||||||
ret = 0;
|
dev_path2 = strrchr(dev_path, '/');
|
||||||
delim = '.';
|
if(dev_path2)
|
||||||
chrptr = strrchr(dev_path, delim);
|
{
|
||||||
|
++dev_path2;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
dev_path2 = dev_path;
|
||||||
|
}
|
||||||
|
|
||||||
|
chrptr = strchr(dev_path2, '.');
|
||||||
|
|
||||||
if(!chrptr)
|
if(!chrptr)
|
||||||
{
|
{
|
||||||
delim = ':';
|
chrptr = strchr(dev_path2, ':');
|
||||||
chrptr = strrchr(dev_path, delim);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if(!chrptr)
|
if(!chrptr)
|
||||||
@@ -265,28 +272,7 @@ int32_t GetDeviceType(void* device_ctx)
|
|||||||
return dev_type;
|
return dev_type;
|
||||||
}
|
}
|
||||||
|
|
||||||
chrptr--;
|
memcpy((void*)host_no, dev_path2, (chrptr - dev_path2));
|
||||||
|
|
||||||
while(chrptr != dev_path)
|
|
||||||
{
|
|
||||||
if(chrptr[0] == '/')
|
|
||||||
{
|
|
||||||
chrptr++;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
else if(chrptr[0] == delim)
|
|
||||||
{
|
|
||||||
ret = 0;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
ret++;
|
|
||||||
}
|
|
||||||
|
|
||||||
chrptr--;
|
|
||||||
}
|
|
||||||
|
|
||||||
memcpy((void*)host_no, chrptr, ret);
|
|
||||||
|
|
||||||
snprintf(spi_path, len, "/sys/class/spi_host/host%s", host_no);
|
snprintf(spi_path, len, "/sys/class/spi_host/host%s", host_no);
|
||||||
snprintf(fc_path, len, "/sys/class/fc_host/host%s", host_no);
|
snprintf(fc_path, len, "/sys/class/fc_host/host%s", host_no);
|
||||||
|
|||||||
Reference in New Issue
Block a user