summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--mdk-stage1/probing.c112
1 files changed, 45 insertions, 67 deletions
diff --git a/mdk-stage1/probing.c b/mdk-stage1/probing.c
index 5850f95c5..c140d2604 100644
--- a/mdk-stage1/probing.c
+++ b/mdk-stage1/probing.c
@@ -46,6 +46,7 @@
#include <sys/mount.h>
#include <pci/pci.h>
#include <libldetect.h>
+#include <errno.h>
#include <glob.h>
#include "stage1.h"
@@ -538,6 +539,33 @@ void probe_that_type(enum driver_type type, enum media_bus bus __attribute__ ((u
static struct media_info * medias = NULL;
+// Read a short string from a file and strips it, intended for sysfs attributes
+static ssize_t read_attribute(char *path, char *buf) {
+ ssize_t l = 0;
+ int fd = open(path, O_RDONLY);
+ buf[0] = '\0';
+ if (fd == -1) {
+ log_message("Failed to open %s for reading", path);
+ } else {
+ ssize_t n = read(fd, buf, 32);
+ if (n == -1) {
+ log_message("Couldn't read file (%s)", path);
+ } else {
+ // Strip whitespaces and newline
+ for (int i = n-1; i >= 0; i--) {
+ if (buf[i] == '\n' || buf[i] == ' ')
+ continue;
+ l = i+1;
+ break;
+ }
+ buf[l] = '\0';
+ }
+ close(fd);
+ }
+ log_message("Content of %s was %s", path, buf);
+ return l;
+}
+
void find_media(enum media_bus bus)
{
char b[50];
@@ -883,83 +911,33 @@ void find_media(enum media_bus bus)
* */
log_message("looking for NVME");
{
- int missing_vendor = 0;
glob_t globbuf;
- glob("/sys/block/nvme*/device/vendor", 0, NULL, &globbuf);
-
- if (globbuf.gl_pathc == 0) {
- glob("/sys/block/nvme*/device/model", 0, NULL, &globbuf);
- if (globbuf.gl_pathc != 0) {
- missing_vendor = 1;
- }
- }
+ glob("/sys/block/nvme*", 0, NULL, &globbuf);
for (int i = 0; i < globbuf.gl_pathc; i++) {
- char *path = globbuf.gl_pathv[i];
- char *model = "Unknown NVME Disk";
+ char *name, *pathend;
+ char path[64];
+ char model[64];
int vendor_length = 0;
- int fd;
- // Get device name by skipping /sys/block/
- char *name_end = strchr(path + 11, '/');
- if (!name_end) {
- log_message("Strange path from glob: %s", path);
- continue;
- }
+ strncpy(path, globbuf.gl_pathv[i], sizeof(path));
+ name = strdup(path + 11);
+ pathend = path + strlen(path);
- // Read vendor name
- if (!missing_vendor) {
- fd = open(path, O_RDONLY);
- buf[0] = '\0';
- if (fd == -1) {
- log_message("Failed to open %s for reading", path);
- } else {
- int n = read(fd, buf, sizeof(buf));
- if (n == -1) {
- log_message("Couldn't read vendor file (%s)", path);
- } else {
- // Strip whitespaces and newline
- for (int j = n-1; j >= 0; j--) {
- if (buf[j] == '\n' || buf[j] == ' ')
- continue;
- vendor_length = j+1;
- break;
- }
- buf[vendor_length] = ' ';
- buf[vendor_length+1] = '\0';
- vendor_length++;
- }
- close(fd);
- }
- }
+ strcpy(model, "Unknown NVME Disk");
- // Read model name
+ strcpy(pathend, "/device/vendor");
+ vendor_length = read_attribute(path, model);
- // Filename can be model or vendor, simpler to use same code in both cases
- strcpy(buf, path);
- char *dirpath = strrchr(buf, '/');
- strcpy(dirpath+1, "model");
- fd = open(path, O_RDONLY);
- if (fd == -1) {
- log_message("Failed to open %s for reading", path);
- } else {
- int n = read(fd, buf+vendor_length, sizeof(buf)-vendor_length);
- if (n == -1) {
- log_message("Couldn't read model file (%s)", path);
- } else {
- // Strip whitespaces and newline
- for (int j = n-1; j >= 0; j--) {
- if (buf[vendor_length+j] == '\n' || buf[vendor_length+j] == ' ')
- continue;
- buf[vendor_length+j+1] = '\0';
- break;
- }
- model = buf;
- }
- close(fd);
+ if (vendor_length) {
+ strcat(model, " ");
+ vendor_length++;
}
- tmp[count].name = strndup(path + 11, name_end - path - 11);
+ strcpy(pathend, "/device/model");
+ read_attribute(path, model+vendor_length);
+
+ tmp[count].name = name;
tmp[count].type = DISK;
tmp[count].model = strdup(model);
count++;