Treat iSCSI targets as block devices.
[yaboot.git] / second / file.c
index 81d91a9f6c6341511238d03439cdd8be46ed9ac3..a52b664e8900c6e789764c696f5d4e61ab9fab0d 100644 (file)
@@ -186,7 +186,6 @@ enum dhcp_options {
      DHCP_PAD = 0,
      DHCP_NETMASK = 1,
      DHCP_ROUTERS = 3,
-     DHCP_DNS = 6,
      DHCP_END = 255,
 };
 
@@ -218,13 +217,18 @@ extract_vendor_options(struct bootp_packet *packet, struct boot_fspec_t *result)
       *         it's malformed. :( */
      while (options[i] != DHCP_END) {
           __u8 tag = options[i++], len;
-          __u32 value;
+          __u32 value = 0;
 
           if (tag == DHCP_PAD)
                continue;
 
           len = options[i++];
-          memcpy(&value, &options[i], len);
+          /* Clamp the maxium length of the memcpy() to the right size for
+           * value. */
+          if (len > sizeof(value))
+               memcpy(&value, &options[i], sizeof(value));
+          else
+               memcpy(&value, &options[i], len);
 
 #if DEBUG
 {
@@ -261,10 +265,8 @@ extract_vendor_options(struct bootp_packet *packet, struct boot_fspec_t *result)
 /*
  * Check netinfo for ipv4 parameters and add them to the fspec iff the
  * fspec has no existing value.
- *
- * Returns 1 on success, 0 on failure.
  */
-static int
+static void
 extract_netinfo_args(struct boot_fspec_t *result)
 {
      struct bootp_packet *packet;
@@ -272,7 +274,7 @@ extract_netinfo_args(struct boot_fspec_t *result)
      /* Check to see if we can get the [scyg]iaddr fields from netinfo */
      packet = prom_get_netinfo();
      if (!packet)
-          return 0;
+          return;
 
      DEBUG_F("We have a boot packet\n");
      DEBUG_F(" siaddr = <%x>\n", packet->siaddr);
@@ -304,8 +306,6 @@ extract_netinfo_args(struct boot_fspec_t *result)
           result->giaddr = ipv4_to_str(packet->siaddr);
           DEBUG_F("Forcing giaddr to siaddr <%s>\n", result->giaddr);
      }
-
-     return 1;
 }
 
 /*
@@ -370,7 +370,7 @@ extract_netboot_args(char *imagepath, struct boot_fspec_t *result)
          ret = extract_ipv6_args(imagepath, result);
      else
          ret = extract_ipv4_args(imagepath, result);
-     ret |= extract_netinfo_args(result);
+     extract_netinfo_args(result);
 
      DEBUG_F("ipv6 = <%d>\n", result->is_ipv6);
      DEBUG_F("siaddr = <%s>\n", result->siaddr);
@@ -675,6 +675,9 @@ int open_file(struct boot_fspec_t* spec, struct boot_file_t* file)
      case FILE_DEVICE_BLOCK:
          DEBUG_F("device is a block device\n");
          return file_block_open(file, spec, spec->part);
+     case FILE_DEVICE_ISCSI:
+         DEBUG_F("device is a iSCSI device\n");
+         return file_block_open(file, spec, spec->part);
      case FILE_DEVICE_NET:
          DEBUG_F("device is a network device\n");
          return file_net_open(file, spec);