diff options
Diffstat (limited to 'src/bus.c')
-rw-r--r-- | src/bus.c | 52 |
1 files changed, 52 insertions, 0 deletions
@@ -26,11 +26,63 @@ #include <unistd.h> #include <linux/fs.h> #include <sys/ioctl.h> +#include <errno.h> +#include <dirent.h> #include "netnuke.h" extern char* scsi_device_glob[]; extern char* ide_device_glob[]; +int scanbus_sysfs(nndevice_t** device) +{ + char tmpstr[128]; + const char* scsi_path = "/sys/class/scsi_disk"; + DIR *pdir; + struct dirent *pdent; + DIR *pbdir; + struct dirent *pbent; + + /* scan for scsi devices via sysfs */ + if((access(scsi_path, F_OK)) != 0) + { + COM(self, "Sysfs not available\n"); + return 1; + } + + pdir = opendir(scsi_path); + if(!pdir) + { + COM(self, "fatal opendir: %s\n", strerror(errno)); + exit(1); + } + + while((pdent = readdir(pdir))) + { + if(!strncasecmp(pdent->d_name, ".", 1) || !strncasecmp(pdent->d_name, "..", 2)) + continue; + + sprintf(tmpstr, "%s/%s/device/block", scsi_path, pdent->d_name); + pbdir = opendir(tmpstr); + if(!pbdir) + { + COM(self, "fatal opendir: %s\n", strerror(errno)); + exit(1); + } + + while((pbent = readdir(pbdir))) + { + if(!strncasecmp(pbent->d_name, ".", 1) || !strncasecmp(pbent->d_name, "..", 2)) + continue; + + printf("%s - %s\n", pdent->d_name, pbent->d_name); + } + closedir(pbdir); + } + closedir(pdir); + + return 0; +} + int scanbus(nndevice_t** device, int mask) { int fd = -1; |