]> git.ipfire.org Git - ipfire-2.x.git/blobdiff - src/installer/hw.c
installer: Allow to start networking without ISO download
[ipfire-2.x.git] / src / installer / hw.c
index a3e5e59ba6bda296aef757a723544788748170ed..4e65a8b7a03b59a3568ecedca577ba17120cead4 100644 (file)
@@ -33,6 +33,7 @@
 #include <sys/ioctl.h>
 #include <sys/mount.h>
 #include <sys/swap.h>
+#include <sys/sysinfo.h>
 #include <unistd.h>
 
 #include <linux/fs.h>
@@ -219,6 +220,7 @@ struct hw_disk** hw_find_disks(struct hw* hw, const char* sourcedrive) {
                disk->ref = 1;
 
                strncpy(disk->path, dev_path, sizeof(disk->path));
+               const char* p = disk->path + 5;
 
                disk->size = size;
 
@@ -252,15 +254,15 @@ struct hw_disk** hw_find_disks(struct hw* hw, const char* sourcedrive) {
 
                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;
@@ -321,6 +323,27 @@ struct hw_disk** hw_select_disks(struct hw_disk** disks, int* selection) {
        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();
 
@@ -356,11 +379,26 @@ static unsigned long long hw_boot_size(struct hw_destination* dest) {
        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
@@ -486,23 +524,13 @@ struct hw_destination* hw_make_destination(int part_type, struct hw_disk** disks
 }
 
 unsigned long long hw_memory() {
-       FILE* handle = NULL;
-       char line[STRING_SIZE];
-
-       unsigned long long memory = 0;
+       struct sysinfo si;
 
-       /* 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;
-                       }
-               }
-
-               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) {
@@ -1009,3 +1037,7 @@ void hw_sync() {
        sync();
        sync();
 }
+
+int hw_start_networking(const char* output) {
+       return mysystem(output, "/usr/bin/start-networking.sh");
+}