#include <sys/ioctl.h>
#include <sys/mount.h>
#include <sys/swap.h>
+#include <sys/sysinfo.h>
#include <unistd.h>
#include <linux/fs.h>
disk->ref = 1;
strncpy(disk->path, dev_path, sizeof(disk->path));
+ const char* p = disk->path + 5;
disk->size = size;
if (*disk->vendor && *disk->model) {
snprintf(disk->description, sizeof(disk->description),
- "%s - %s - %s", size_str, disk->vendor, disk->model);
+ "%s - %s - %s - %s", size_str, p, disk->vendor, disk->model);
} else if (*disk->vendor || *disk->model) {
snprintf(disk->description, sizeof(disk->description),
- "%s - %s", size_str, (*disk->vendor) ? disk->vendor : disk->model);
+ "%s - %s - %s", size_str, p, (*disk->vendor) ? disk->vendor : disk->model);
} else {
snprintf(disk->description, sizeof(disk->description),
- "%s - N/A", size_str);
+ "%s - %s", size_str, p);
}
*disks++ = disk;
return ret;
}
+struct hw_disk** hw_select_first_disk(const struct hw_disk** disks) {
+ struct hw_disk** ret = hw_create_disks();
+ struct hw_disk** selected_disks = ret;
+
+ unsigned int num_disks = hw_count_disks(disks);
+ assert(num_disks > 0);
+
+ for (unsigned int i = 0; i < num_disks; i++) {
+ struct hw_disk *disk = disks[i];
+ disk->ref++;
+
+ *selected_disks++ = disk;
+ break;
+ }
+
+ // Set sentinel
+ *selected_disks = NULL;
+
+ return ret;
+}
+
static unsigned long long hw_swap_size(struct hw_destination* dest) {
unsigned long long memory = hw_memory();
return MB2BYTES(64);
}
+static int hw_device_has_p_suffix(const struct hw_destination* dest) {
+ // All RAID devices have the p suffix.
+ if (dest->is_raid)
+ return 1;
+
+ // Devices with a number at the end have the p suffix, too.
+ // e.g. mmcblk0, cciss0
+ unsigned int last_char = strlen(dest->path) - 1;
+ if ((dest->path[last_char] >= '0') && (dest->path[last_char] <= '9'))
+ return 1;
+
+ return 0;
+}
+
static int hw_calculate_partition_table(struct hw_destination* dest) {
char path[DEV_SIZE];
int part_idx = 1;
- snprintf(path, sizeof(path), "%s%s", dest->path, (dest->is_raid) ? "p" : "");
+ snprintf(path, sizeof(path), "%s%s", dest->path,
+ hw_device_has_p_suffix(dest) ? "p" : "");
dest->part_boot_idx = 0;
// Determine the size of the target block device
}
unsigned long long hw_memory() {
- FILE* handle = NULL;
- char line[STRING_SIZE];
-
- unsigned long long memory = 0;
-
- /* Calculate amount of memory in machine */
- if ((handle = fopen("/proc/meminfo", "r"))) {
- while (fgets(line, sizeof(line), handle)) {
- if (!sscanf (line, "MemTotal: %llu kB", &memory)) {
- memory = 0;
- }
- }
+ struct sysinfo si;
- fclose(handle);
- }
+ int r = sysinfo(&si);
+ if (r < 0)
+ return 0;
- return memory * 1024;
+ return si.totalram;
}
static int hw_zero_out_device(const char* path, int bytes) {