rpms/yaboot/devel yaboot-1.3.14-better_netboot.patch, NONE, 1.1 yaboot.spec, 1.58, 1.59

Tony Breeds tbreeds at fedoraproject.org
Fri Mar 13 00:32:33 UTC 2009


Author: tbreeds

Update of /cvs/pkgs/rpms/yaboot/devel
In directory cvs1.fedora.phx.redhat.com:/tmp/cvs-serv16124

Modified Files:
	yaboot.spec 
Added Files:
	yaboot-1.3.14-better_netboot.patch 
Log Message:
- Adding better netboot support (#458438)
- Allocate more buffer space for larger kernels and initrds (#472225)



yaboot-1.3.14-better_netboot.patch:

--- NEW FILE yaboot-1.3.14-better_netboot.patch ---
diff --git a/include/debug.h b/include/debug.h
index 47a9cce..dcac25a 100644
--- a/include/debug.h
+++ b/include/debug.h
@@ -32,8 +32,8 @@
     prom_printf( fmt, ## args );\
 }
 # define DEBUG_OPEN DEBUG_F( "dev=%s, part=0x%p (%d), file_name=%s\n",\
-                             dev_name, part, part ? part->part_number : -1,\
-                             file_name)
+                             fspec->dev, part, part ? part->part_number : -1,\
+                             fspec->file)
 # define DEBUG_SLEEP prom_sleep(3)
 #else
 #define DEBUG_ENTER
diff --git a/include/file.h b/include/file.h
index b6b9fe5..ca76a52 100644
--- a/include/file.h
+++ b/include/file.h
@@ -39,7 +39,13 @@ struct boot_file_t;
 struct boot_fspec_t {
 	char*	dev;		/* OF device path */
 	int	part;		/* Partition number or -1 */
+	char*	siaddr;		/* Server address */
 	char*	file;		/* File path */
+	char*	ciaddr;		/* Client address */
+	char*	giaddr;		/* Gateway address */
+	char*	bootp_retries;	/* Bootp retries */
+	char*	tftp_retries;	/* TFTP retries */
+	char*	addl_params;	/* copy all additional parameters */
 };
 
 struct boot_file_t {
@@ -63,7 +69,7 @@ struct boot_file_t {
 };
 
 extern int
-open_file(const struct boot_fspec_t*	spec,
+open_file(struct boot_fspec_t*	spec,
 	  struct boot_file_t*		file);
 
 extern int
diff --git a/include/fs.h b/include/fs.h
index d960fea..1ff7986 100644
--- a/include/fs.h
+++ b/include/fs.h
@@ -27,14 +27,14 @@
 #include "file.h"
 
 int fserrorno;
+struct boot_fspec_t;
 
 struct fs_t {
 	const char* name;
 
 	int (*open)(	struct boot_file_t*	file,
-			const char*		dev_name,
 			struct partition_t*	part,
-			const char*		file_name);
+			struct boot_fspec_t*	fspec);
 
 	int (*read)(	struct boot_file_t*	file,
 			unsigned int		size,
@@ -49,7 +49,7 @@ struct fs_t {
 extern const struct fs_t *fs_of;
 extern const struct fs_t *fs_of_netboot;
 
-const struct fs_t *fs_open(struct boot_file_t *file, const char *dev_name,
-			  struct partition_t *part, const char *file_name);
+const struct fs_t *fs_open(struct boot_file_t *file,
+			  struct partition_t *part, struct boot_fspec_t *fspec);
 
 #endif
diff --git a/second/file.c b/second/file.c
index 4054dd1..e429272 100644
--- a/second/file.c
+++ b/second/file.c
@@ -38,19 +38,56 @@
 
 extern char bootdevice[];
 
-static char *netdev_path_to_filename(const char *path)
+/* Convert __u32 into std, dotted quad string, leaks like a sive :( */
+static char *
+ipv4_to_str(__u32 ip)
 {
-     char *tmp, *args, *filename;
-     size_t len;
+     char *buf = malloc(sizeof("000.000.000.000"));
 
-     DEBUG_F("path = %s\n", path);
+     sprintf(buf,"%u.%u.%u.%u",
+             (ip & 0xff000000) >> 24, (ip & 0x00ff0000) >> 16,
+             (ip & 0x0000ff00) >>  8, (ip & 0x000000ff));
 
-     if (!path)
+     return buf;
+}
+
+/*
+ * Copy the string from source to dest till newline or comma(,) is seen
+ * in the source.
+ * Move source and dest pointers respectively.
+ * Returns pointer to the start of the string that has just been copied.
+ */
+static char *
+scopy(char **dest, char **source)
+{
+     char *ret = *dest;
+
+     if (!**source)
 	  return NULL;
 
-     args = strrchr(path, ':');
+     while (**source != ',' && **source != '\0')
+	  *(*dest)++ = *(*source)++;
+     if (**source != '\0')
+	  *(*source)++;
+     **dest = '\0';
+     *(*dest)++;
+     return ret;
+}
+
+/*
+ * Extract all the ipv4 arguments from the bootpath provided and fill result
+ * Returns 1 on success, 0 on failure.
+ */
+static int
+extract_ipv4_args(char *imagepath, struct boot_fspec_t *result)
+{
+     char *tmp, *args, *str, *start;
+
+     args = strrchr(imagepath, ':');
      if (!args)
-	  return NULL;
+	  return 1;
+
+     start = args; /* used to see if we read any optional parameters */
 
      /* The obp-tftp device arguments should be at the end of
       * the argument list.  Skip over any extra arguments (promiscuous,
@@ -77,46 +114,110 @@ static char *netdev_path_to_filename(const char *path)
      if (tmp && tmp > args)
 	  args = tmp + strlen("rarp");
 
-     args = strchr(args, ',');
+     if (args != start) /* we read some parameters, so go past the next comma(,) */
+	  args = strchr(args, ',');
      if (!args)
-	  return NULL;
+	  return 1;
+
+     str = malloc(strlen(args) + 1); /*long enough to hold all strings */
+     if (!str)
+	  return 0;
 
-     tmp = args;
-     tmp--;
-     /* If the preceding character is ':' then there were no
-      * non-obp-tftp arguments and we know we're right up to the
-      * filename.  Otherwise, we must advance args once more.
+     if (args[-1] != ':')
+	  args++; /* If comma(,) is not immediately followed by ':' then go past the , */
+
+     /*
+      * read the arguments in order: siaddr,filename,ciaddr,giaddr,
+      * bootp-retries,tftp-retries,addl_prameters
       */
-     args++;
-     if (*tmp != ':') {
-	  args = strchr(args, ',');
-	  if (!args)
-	       return NULL;
-	  args++;
+     result->siaddr = scopy(&str, &args);
+     result->file = scopy(&str, &args);
+     result->ciaddr = scopy(&str, &args);
+     result->giaddr = scopy(&str, &args);
+     result->bootp_retries = scopy(&str, &args);
+     result->tftp_retries = scopy(&str, &args);
+     if (*args) {
+	  result->addl_params = strdup(args);
+	  if (!result->addl_params)
+		return 0;
      }
+     return 1;
+}
 
-     /* filename may be empty; e.g. enet:192.168.1.1,,192.168.1.2 */
-     if (*args == ',') {
-	  DEBUG_F("null filename\n");
-	  return NULL;
+/*
+ * 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
+extract_netinfo_args(struct boot_fspec_t *result)
+{
+     struct bootp_packet *packet;
+
+     /* Check to see if we can get the [scyg]iaddr fields from netinfo */
+     packet = prom_get_netinfo();
+     if (packet == NULL)
+          return 0;
+
+     DEBUG_F("We have a boot packet\n");
+     DEBUG_F(" siaddr = <%x>\n", packet->siaddr);
+     DEBUG_F(" ciaddr = <%x>\n", packet->ciaddr);
+     DEBUG_F(" yiaddr = <%x>\n", packet->yiaddr);
+     DEBUG_F(" giaddr = <%x>\n", packet->giaddr);
+
+     /* Try to fallback to yiaddr if ciaddr is empty. Broken? */
+     if (packet->ciaddr == 0 && packet->yiaddr != 0)
+          packet->ciaddr = packet->yiaddr;
+
+     if ((result->siaddr == NULL || *(result->siaddr) == NULL)
+         && packet->siaddr != 0)
+          result->siaddr = ipv4_to_str(packet->siaddr);
+     if ((result->ciaddr == NULL || *(result->ciaddr) == NULL)
+         && packet->ciaddr != 0)
+          result->ciaddr = ipv4_to_str(packet->ciaddr);
+     if ((result->giaddr == NULL || *(result->giaddr) == NULL)
+         && packet->giaddr != 0)
+          result->giaddr = ipv4_to_str(packet->giaddr);
+
+     /* FIXME: Yck! if we /still/ do not have a gateway then "cheat" and use
+      *        the server.  This will be okay if the client and server are on
+      *        the same IP network, if not then lets hope the server does ICMP
+      *        redirections */
+     if (result->giaddr == NULL) {
+          result->giaddr = ipv4_to_str(packet->siaddr);
+          DEBUG_F("Forcing giaddr to siaddr <%s>\n", result->giaddr);
      }
 
-     /* Now see whether there are more args following the filename. */
-     tmp = strchr(args, ',');
-     if (!tmp)
-	  len = strlen(args) + 1;
-     else
-	  len = tmp - args + 1;
+     return 1;
+}
 
-     filename = malloc(len);
-     if (!filename)
-	  return NULL;
+/*
+ * Extract all the arguments provided in the imagepath and fill it in result.
+ * Returns 1 on success, 0 on failure.
+ */
+static int
+extract_netboot_args(char *imagepath, struct boot_fspec_t *result)
+{
+     int ret;
 
-     strncpy(filename, args, len);
-     filename[len - 1] = '\0';
+     DEBUG_F("imagepath = %s\n", imagepath);
 
-     DEBUG_F("filename = %s\n", filename);
-     return filename;
+     if (!imagepath)
+	  return 1;
+
+     ret = extract_ipv4_args(imagepath, result);
+     ret |= extract_netinfo_args(result);
+
+     DEBUG_F("siaddr = <%s>\n", result->siaddr);
+     DEBUG_F("file = <%s>\n", result->file);
+     DEBUG_F("ciaddr = <%s>\n", result->ciaddr);
+     DEBUG_F("giaddr = <%s>\n", result->giaddr);
+     DEBUG_F("bootp_retries = <%s>\n", result->bootp_retries);
+     DEBUG_F("tftp_retries = <%s>\n", result->tftp_retries);
+     DEBUG_F("addl_params = <%s>\n", result->addl_params);
+   
+     return ret;
 }
 
 static char *netdev_path_to_dev(const char *path)
@@ -163,6 +264,10 @@ static char *netdev_path_to_dev(const char *path)
     - enet:,/tftpboot/vmlinux
     - enet:bootp
     - enet:0
+    - arguments for obp-tftp open as specified in section 4.1 of
+      http://playground.sun.com/1275/practice/obp-tftp/tftp1_0.pdf
+      [bootp,]siaddr,filename,ciaddr,giaddr,bootp-retries,tftp-retries
+      ex: enet:bootp,10.0.0.11,bootme,10.0.0.12,10.0.0.1,5,5
    Supported only if defdevice == NULL
     - disc
     - any other device path lacking a :
@@ -179,6 +284,9 @@ parse_device_path(char *imagepath, char *defdevice, int defpart,
      char *defdev = NULL;
      int device_kind = -1;
 
+     DEBUG_F("imagepath = %s; defdevice %s; defpart %d, deffile %s\n",
+		imagepath, defdevice, defpart, deffile);
+
      result->dev = NULL;
      result->part = -1;
      result->file = NULL;
@@ -247,10 +355,15 @@ parse_device_path(char *imagepath, char *defdevice, int defpart,
      }
 
      if (device_kind == FILE_DEVICE_NET) {
-	  if (strchr(ipath, ':'))
-	       result->file = netdev_path_to_filename(ipath);
-	  else
+	  if (strchr(ipath, ':')) {
+	       if (extract_netboot_args(ipath, result) == 0)
+		   return 0;
+	  } else {
+               /* If we didn't get a ':' then look only in netinfo */
+	       if (extract_netinfo_args(result) == 0)
+		   return 0;
 	       result->file = strdup(ipath);
+          }
 
 	  if (!defdev)
 	       result->dev = netdev_path_to_dev(ipath);
@@ -287,15 +400,14 @@ parse_device_path(char *imagepath, char *defdevice, int defpart,
 
 static int
 file_block_open(	struct boot_file_t*	file,
-			const char*		dev_name,
-			const char*		file_name,
+			struct boot_fspec_t*	fspec,
 			int			partition)
 {
      struct partition_t*	parts;
      struct partition_t*	p;
      struct partition_t*	found;
 
-     parts = partitions_lookup(dev_name);
+     parts = partitions_lookup(fspec->dev);
      found = NULL;
 
 #if DEBUG
@@ -308,7 +420,7 @@ file_block_open(	struct boot_file_t*	file,
 	  DEBUG_F("number: %02d, start: 0x%08lx, length: 0x%08lx\n",
 		  p->part_number, p->part_start, p->part_size );
 	  if (partition == -1) {
-	       file->fs = fs_open( file, dev_name, p, file_name );
+	       file->fs = fs_open( file, p, fspec );
 	       if (file->fs == NULL || fserrorno != FILE_ERR_OK)
 		    continue;
 	       else {
@@ -328,7 +440,7 @@ file_block_open(	struct boot_file_t*	file,
       * cases, let OF figure out a default partition.
       */
      DEBUG_F( "Using OF defaults.. (found = %p)\n", found );
-     file->fs = fs_open( file, dev_name, found, file_name );
+     file->fs = fs_open( file, found, fspec );
 
 done:
      if (parts)
@@ -338,12 +450,10 @@ done:
 }
 
 static int
-file_net_open(	struct boot_file_t*	file,
-		const char*		dev_name,
-		const char*		file_name)
+file_net_open(struct boot_file_t* file, struct boot_fspec_t *fspec)
 {
      file->fs = fs_of_netboot;
-     return fs_of_netboot->open(file, dev_name, NULL, file_name);
+     return fs_of_netboot->open(file, NULL, fspec);
 }
 
 static int
@@ -380,7 +490,7 @@ static struct fs_t fs_default =
 };
 
 
-int open_file(const struct boot_fspec_t* spec, struct boot_file_t* file)
+int open_file(struct boot_fspec_t* spec, struct boot_file_t* file)
 {
      int result;
 
@@ -399,10 +509,10 @@ int open_file(const struct boot_fspec_t* spec, struct boot_file_t* file)
      switch(file->device_kind) {
      case FILE_DEVICE_BLOCK:
 	  DEBUG_F("device is a block device\n");
-	  return file_block_open(file, spec->dev, spec->file, spec->part);
+	  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->dev, spec->file);
+	  return file_net_open(file, spec);
      }
      return 0;
 }
diff --git a/second/fs.c b/second/fs.c
index 2ae7066..b748bed 100644
--- a/second/fs.c
+++ b/second/fs.c
@@ -56,12 +56,12 @@ const struct fs_t *fs_of = &of_filesystem;              /* needed by ISO9660 */
 const struct fs_t *fs_of_netboot = &of_net_filesystem;  /* needed by file.c */
 
 const struct fs_t *
-fs_open(struct boot_file_t *file, const char *dev_name,
-	struct partition_t *part, const char *file_name)
+fs_open(struct boot_file_t *file,
+	struct partition_t *part, struct boot_fspec_t *fspec)
 {
      const struct fs_t **fs;
      for (fs = block_filesystems; *fs; fs++)
-	  if ((fserrorno = (*fs)->open(file, dev_name, part, file_name)) != FILE_ERR_BAD_FSYS)
+	  if ((fserrorno = (*fs)->open(file, part, fspec)) != FILE_ERR_BAD_FSYS)
 	       break;
 
      return *fs;
diff --git a/second/fs_ext2.c b/second/fs_ext2.c
index 67571f2..d24450d 100644
--- a/second/fs_ext2.c
+++ b/second/fs_ext2.c
@@ -46,9 +46,8 @@ typedef int FILE;
 #include "ext2fs/ext2fs.h"
 
 static int ext2_open(	struct boot_file_t*	file,
-			const char*		dev_name,
 			struct partition_t*	part,
-			const char*		file_name);
+			struct boot_fspec_t*	fspec);
 static int ext2_read(	struct boot_file_t*	file,
 			unsigned int		size,
 			void*			buffer);
@@ -123,14 +122,15 @@ void com_err (const char *a, long i, const char *fmt,...)
 
 static int
 ext2_open(	struct boot_file_t*	file,
-		const char*		dev_name,
 		struct partition_t*	part,
-		const char*		file_name)
+		struct boot_fspec_t*	fspec)
 {
      int result = 0;
      int error = FILE_ERR_NOTFOUND;
      static char buffer[1024];
      int ofopened = 0;
+     char *dev_name = fspec->dev;
+     char *file_name = fspec->file;
 
      DEBUG_ENTER;
      DEBUG_OPEN;
diff --git a/second/fs_iso.c b/second/fs_iso.c
index 303790f..33d43b3 100644
--- a/second/fs_iso.c
+++ b/second/fs_iso.c
@@ -29,9 +29,8 @@
 #include "errors.h"
 
 static int iso_open(	struct boot_file_t*	file,
-			const char*		dev_name,
 			struct partition_t*	part,
-			const char*		file_name);
+			struct boot_fspec_t*	fspec);
 static int iso_read(	struct boot_file_t*	file,
 			unsigned int		size,
 			void*			buffer);
@@ -50,9 +49,8 @@ struct fs_t iso_filesystem =
 
 static int
 iso_open(	struct boot_file_t*	file,
-		const char*		dev_name,
 		struct partition_t*	part,
-		const char*		file_name)
+		struct boot_fspec_t*	fspec)
 {
      return FILE_ERR_BAD_FSYS;
 }
diff --git a/second/fs_of.c b/second/fs_of.c
index 95c131d..5c7dd9b 100644
--- a/second/fs_of.c
+++ b/second/fs_of.c
@@ -45,17 +45,17 @@
 #include "debug.h"
 
 #define LOAD_BUFFER_POS		0x1000000
-#define LOAD_BUFFER_SIZE	0x1000000
+#define LOAD_BUFFER_SIZE	0x1400000
 
-static int of_open(struct boot_file_t* file, const char* dev_name,
-		   struct partition_t* part, const char* file_name);
+static int of_open(struct boot_file_t* file,
+		   struct partition_t* part, struct boot_fspec_t* fspec);
 static int of_read(struct boot_file_t* file, unsigned int size, void* buffer);
 static int of_seek(struct boot_file_t* file, unsigned int newpos);
 static int of_close(struct boot_file_t* file);
 
 
-static int of_net_open(struct boot_file_t* file, const char* dev_name,
-		       struct partition_t* part, const char* file_name);
+static int of_net_open(struct boot_file_t* file,
+		       struct partition_t* part, struct boot_fspec_t* fspec);
 static int of_net_read(struct boot_file_t* file, unsigned int size, void* buffer);
 static int of_net_seek(struct boot_file_t* file, unsigned int newpos);
 
@@ -79,8 +79,8 @@ struct fs_t of_net_filesystem =
 };
 
 static int
-of_open(struct boot_file_t* file, const char* dev_name,
-	struct partition_t* part, const char* file_name)
+of_open(struct boot_file_t* file,
+	struct partition_t* part, struct boot_fspec_t* fspec)
 {
      static char	buffer[1024];
      char               *filename;
@@ -89,7 +89,7 @@ of_open(struct boot_file_t* file, const char* dev_name,
      DEBUG_ENTER;
      DEBUG_OPEN;
 
-     strncpy(buffer, dev_name, 768);
+     strncpy(buffer, fspec->dev, 768);
      strcat(buffer, ":");
      if (part) {
           if (part->sys_ind == LINUX_RAID) {
@@ -101,10 +101,10 @@ of_open(struct boot_file_t* file, const char* dev_name,
 	  sprintf(pn, "%02d", part->part_number);
 	  strcat(buffer, pn);
      }
-     if (file_name && strlen(file_name)) {
+     if (fspec->file && strlen(fspec->file)) {
 	  if (part)
 	       strcat(buffer, ",");
-	  filename = strdup(file_name);
+	  filename = strdup(fspec->file);
 	  for (p = filename; *p; p++)
 	       if (*p == '/')
 		    *p = '\\';
@@ -131,25 +131,47 @@ of_open(struct boot_file_t* file, const char* dev_name,
 }
 
 static int
-of_net_open(struct boot_file_t* file, const char* dev_name,
-	    struct partition_t* part, const char* file_name)
+of_net_open(struct boot_file_t* file,
+	    struct partition_t* part, struct boot_fspec_t* fspec)
 {
      static char	buffer[1024];
-     char               *filename;
+     char               *filename = NULL;
      char               *p;
 
      DEBUG_ENTER;
      DEBUG_OPEN;
 
-     strncpy(buffer, dev_name, 768);
-     if (file_name && strlen(file_name)) {
-	  strcat(buffer, ",");
-	  filename = strdup(file_name);
+     if (fspec->file && strlen(fspec->file)) {
+	  filename = strdup(fspec->file);
 	  for (p = filename; *p; p++)
 	       if (*p == '/')
 		    *p = '\\';
-	  strcat(buffer, filename);
-	  free(filename);
+     }
+
+     DEBUG_F("siaddr <%s>; filename <%s>; ciaddr <%s>; giaddr <%s>;\n",
+		fspec->siaddr, filename, fspec->ciaddr, fspec->giaddr);
+     strncpy(buffer, fspec->dev, 768);
+     /* If we didn't get a ':' include one */
+     if (fspec->dev[strlen(fspec->dev)-1] != ':')
+          strcat(buffer, ":");
+     strcat(buffer, fspec->siaddr);
+     strcat(buffer, ",");
+     strcat(buffer, filename);
+     strcat(buffer, ",");
+     strcat(buffer, fspec->ciaddr);
+     strcat(buffer, ",");
+     strcat(buffer, fspec->giaddr);
+
+     /* If /packages/cas exists the we have a "new skool" tftp */
+     if (prom_finddevice("/packages/cas") != PROM_INVALID_HANDLE) {
+          strcat(buffer, ",");
+          strcat(buffer, fspec->bootp_retries);
+          strcat(buffer, ",");
+          strcat(buffer, fspec->tftp_retries);
+          strcat(buffer, ",");
+          strcat(buffer, fspec->addl_params);
+     } else {
+          DEBUG_F("No \"/packages/cas\" using simple args\n")
      }
 
      DEBUG_F("Opening: \"%s\"\n", buffer);
diff --git a/second/fs_reiserfs.c b/second/fs_reiserfs.c
index 238f523..4b83a7a 100644
--- a/second/fs_reiserfs.c
+++ b/second/fs_reiserfs.c
@@ -33,8 +33,8 @@
 #include "reiserfs/reiserfs.h"
 
 /* Exported in struct fs_t */
-static int reiserfs_open( struct boot_file_t *file, const char *dev_name,
-			  struct partition_t *part, const char *file_name );
+static int reiserfs_open( struct boot_file_t *file, struct partition_t *part,
+			  struct boot_fspec_t *fspec);
 static int reiserfs_read( struct boot_file_t *file, unsigned int size,
 
 			  void *buffer );
@@ -63,10 +63,12 @@ int errnum;
 
 
 static int
-reiserfs_open( struct boot_file_t *file, const char *dev_name,
-               struct partition_t *part, const char *file_name )
+reiserfs_open( struct boot_file_t *file, struct partition_t *part,
+		struct boot_fspec_t *fspec)
 {
      static char buffer[1024];
+     char *dev_name = fspec->dev;
+     char *file_name = fspec->file;
 
      DEBUG_ENTER;
      DEBUG_OPEN;
@@ -74,7 +76,7 @@ reiserfs_open( struct boot_file_t *file, const char *dev_name,
      memset( INFO, 0, sizeof(struct reiserfs_state) );
      INFO->file = file;
 
-     if (part)
+     if (fspec->part)
      {
 	  DEBUG_F( "Determining offset for partition %d\n", part->part_number );
 	  INFO->partition_offset = ((uint64_t)part->part_start) * part->blocksize;
diff --git a/second/fs_xfs.c b/second/fs_xfs.c
index 04d6cf3..e27d857 100644
--- a/second/fs_xfs.c
+++ b/second/fs_xfs.c
@@ -39,8 +39,8 @@ int xfs_read_data (char *buf, int len);
 int xfs_dir (char *dirname);
 
 /* Exported in struct fs_t */
-static int xfs_open(struct boot_file_t *file, const char *dev_name,
-		    struct partition_t *part, const char *file_name);
+static int xfs_open(struct boot_file_t *file,
+		    struct partition_t *part, struct boot_fspec_t *fspec);
 static int xfs_read(struct boot_file_t *file, unsigned int size, void *buffer);
 static int xfs_seek(struct boot_file_t *file, unsigned int newpos);
 static int xfs_close(struct boot_file_t *file);
@@ -59,8 +59,8 @@ uint64_t partition_offset;
 int errnum;
 
 static int
-xfs_open(struct boot_file_t *file, const char *dev_name,
-	 struct partition_t *part, const char *file_name)
+xfs_open(struct boot_file_t *file,
+	 struct partition_t *part, struct boot_fspec_t *fspec)
 {
 	static char buffer[1024];
 
@@ -78,11 +78,11 @@ xfs_open(struct boot_file_t *file, const char *dev_name,
 	else
 		partition_offset = 0;
 
-	strncpy(buffer, dev_name, 1020);
+	strncpy(buffer, fspec->dev, 1020);
 	if (_machine != _MACH_bplan)
 		strcat(buffer, ":0");  /* 0 is full disk in (non-buggy) OF */
 	DEBUG_F("Trying to open dev_name=%s; filename=%s; partition offset=%Lu\n",
-		buffer, file_name, partition_offset);
+		buffer, fspec->file, partition_offset);
 	file->of_device = prom_open(buffer);
 
 	if (file->of_device == PROM_INVALID_HANDLE || file->of_device == NULL)
@@ -105,8 +105,8 @@ xfs_open(struct boot_file_t *file, const char *dev_name,
 		return FILE_ERR_BAD_FSYS;
 	}
 
-	DEBUG_F("Attempting to open %s\n", file_name);
-	strcpy(buffer, file_name); /* xfs_dir modifies argument */
+	DEBUG_F("Attempting to open %s\n", fspec->file);
+	strcpy(buffer, fspec->file); /* xfs_dir modifies argument */
 	if(!xfs_dir(buffer))
 	{
 		DEBUG_F("xfs_dir() failed. errnum = %d\n", errnum);
@@ -116,7 +116,7 @@ xfs_open(struct boot_file_t *file, const char *dev_name,
 		return errnum;
 	}
 
-	DEBUG_F("Successfully opened %s\n", file_name);
+	DEBUG_F("Successfully opened %s\n", fspec->file);
 
 	DEBUG_LEAVE(FILE_ERR_OK);
 	return FILE_ERR_OK;
diff --git a/second/yaboot.c b/second/yaboot.c
index 3db7b4f..8a74d7a 100644
--- a/second/yaboot.c
+++ b/second/yaboot.c
@@ -300,6 +300,7 @@ void print_message_file(char *filename)
 	  }
 
      strncpy(msgpath, filename, sizeof(msgpath));
+     msgfile = boot; /* Copy all the original paramters */
      if (!parse_device_path(msgpath, defdev, defpart, "/etc/yaboot.msg", &msgfile)) {
 	  prom_printf("%s: Unable to parse\n", msgpath);
 	  goto done;
@@ -988,6 +989,7 @@ int get_params(struct boot_param_t* params)
      if (!label && password)
 	  check_password ("To boot a custom image you must enter the password.");
 
+     params->kernel = boot; /* Copy all the original paramters */
      if (!parse_device_path(imagepath, defdevice, defpart,
 			    "/vmlinux", &params->kernel)) {
 	  prom_printf("%s: Unable to parse\n", imagepath);
@@ -1009,6 +1011,7 @@ int get_params(struct boot_param_t* params)
                strncpy(initrdpath, p, 1024);
 
 	       DEBUG_F("Parsing initrd path <%s>\n", initrdpath);
+	       params->rd = boot; /* Copy all the original paramters */
 	       if (!parse_device_path(initrdpath, defdevice, defpart,
 				      "/root.bin", &params->rd)) {
 		    prom_printf("%s: Unable to parse\n", imagepath);
@@ -1019,6 +1022,7 @@ int get_params(struct boot_param_t* params)
 	  if (p && *p) {
 	       DEBUG_F("Parsing sysmap path <%s>\n", p);
 	       strncpy(sysmappath, p, 1024);
+	       params->sysmap = boot; /* Copy all the original paramters */
 	       if (!parse_device_path(sysmappath, defdevice, defpart,
 				      "/boot/System.map", &params->sysmap)) {
 		    prom_printf("%s: Unable to parse\n", imagepath);


Index: yaboot.spec
===================================================================
RCS file: /cvs/pkgs/rpms/yaboot/devel/yaboot.spec,v
retrieving revision 1.58
retrieving revision 1.59
diff -u -r1.58 -r1.59
--- yaboot.spec	25 Feb 2009 18:00:01 -0000	1.58
+++ yaboot.spec	13 Mar 2009 00:32:03 -0000	1.59
@@ -1,7 +1,7 @@
 Summary: Linux bootloader for Power Macintosh "New World" computers.
 Name: yaboot
 Version: 1.3.14
-Release: 10%{?dist}
+Release: 11%{?dist}
 License: GPLv2+
 Group: System Environment/Base
 Source: http://yaboot.ozlabs.org/releases/yaboot-%{version}.tar.gz
@@ -25,6 +25,7 @@
 Patch30: yaboot-1.3.14-fix-bootonce-nvram.patch 
 Patch31: yaboot-1.3.14-bigger-max-token.patch
 Patch32: yaboot-relocatable-kernel.patch
+Patch33: yaboot-1.3.14-better_netboot.patch
 
 URL: http://yaboot.ozlabs.org/
 BuildRoot: %{_tmppath}/%{name}-root
@@ -60,6 +61,7 @@
 %patch30 -p1 -b .bootonce
 %patch31 -p1 -b .maxtoken
 %patch32 -p1 -b .relocatable
+%patch33 -p1 -b .netboot
 
 %build
 make VERSIONEXTRA='\ (Red Hat %version-%release)'
@@ -95,6 +97,10 @@
 %ghost %config(noreplace) %{_sysconfdir}/yaboot.conf
 
 %changelog
+* Fri Mar 13 2009 tony at bakeyournoodle.com - 1.3.14-11
+- Adding better netboot support (#458438)
+- Allocate more buffer space for larger kernels and initrds (#472225)
+
 * Wed Feb 25 2009 Fedora Release Engineering <rel-eng at lists.fedoraproject.org> - 1.3.14-10
 - Rebuilt for https://fedoraproject.org/wiki/Fedora_11_Mass_Rebuild
 




More information about the fedora-extras-commits mailing list