[PATCH] Loading a different config file (confarg feature)

Paulo Ricardo Paz Vital vital at br.ibm.com
Tue Apr 3 03:37:55 EST 2007


Hi everyone,

After some conversations with Paul Nasrat in #yaboot channel at Freenode
and by e-mails, we (Leonardo Rangel and me) created a patch to
yaboot-1.3.14rc1 to include a feature to yaboot load a different file
than /etc/yaboot.conf specified by user (confarg feature).

As mentioned by Nasrat in our conversations, I've based this patch on
Fedora's yaboot-1.3.13-confarg.pacth [1]. There are no diffs between the
Fedora's patch and mine, only a transcription in help message of how to
use the conf argument in OF prompt.

[1]http://cvs.fedora.redhat.com/viewcvs/rpms/yaboot/devel/yaboot-1.3.13-confarg.patch?rev=1.2&view=log

Basically, the patch loads an alternative config file rather
than /etc/yaboot.conf when passed as argument to yaboot by user in OF
prompt, using the following expression:

"boot conf=device:partition,/path_to/config_file"

where "device" is the OF device path to the disk the file resides on,
and "partition" is the partition number the file resides on. These
values are printed when help command is used in yaboot prompt.

Based in this first patch, Leonardo Rangel and me developed a new
confarg feature to use in yaboot prompt. This second patch will be sent
soon by Leonardo.

Paulo Vital

---

diff --git a/second/yaboot.c b/second/yaboot.c
index 3fbb103..20296df 100644
--- a/second/yaboot.c
+++ b/second/yaboot.c
@@ -112,6 +112,7 @@ static void     setup_display(void);
 
 int useconf = 0;
 char bootdevice[BOOTDEVSZ];
+char bootargs[1024];
 char *password = NULL;
 struct boot_fspec_t boot;
 int _machine = _MACH_Pmac;
@@ -324,13 +325,11 @@ done:
  * config file. Handle the "\\" (blessed system folder)
  */
 static int
-load_config_file(struct boot_fspec_t *orig_fspec)
+load_config_file(struct boot_fspec_t *fspec)
 {
      char *conf_file = NULL, *p;
      struct boot_file_t file;
      int sz, opened = 0, result = 0;
-     char conf_path[512];
-     struct boot_fspec_t fspec = *orig_fspec;
 
      /* Allocate a buffer for the config file */
      conf_file = malloc(CONFIG_FILE_MAX);
@@ -339,22 +338,11 @@ load_config_file(struct boot_fspec_t *orig_fspec)
 	  goto bail;
      }
 
-     /* Build the path to the file */
-     if (_machine == _MACH_chrp)
-	  strcpy(conf_path, "/etc/");
-     else
-	  conf_path[0] = 0;
-     if (fspec.file && *fspec.file)
-	  strcat(conf_path, fspec.file);
-     else
-     strcat(conf_path, CONFIG_FILE_NAME);
-
      /* Open it */
-     fspec.file = conf_path;
-     result = open_file(&fspec, &file);
+     result = open_file(fspec, &file);
      if (result != FILE_ERR_OK) {
-	  prom_printf("%s:%d,", fspec.dev, fspec.part);
-	  prom_perror(result, fspec.file);
+	  prom_printf("%s:%d,", fspec->dev, fspec->part);
+	  prom_perror(result, fspec->file);
 	  prom_printf("Can't open config file\n");
 	  goto bail;
      }
@@ -374,7 +362,7 @@ load_config_file(struct boot_fspec_t *orig_fspec)
      opened = 0;
 
      /* Call the parsing code in cfg.c */
-     if (cfg_parse(conf_path, conf_file, sz) < 0) {
+     if (cfg_parse(fspec->file, conf_file, sz) < 0) {
 	  prom_printf ("Syntax error or read error config\n");
 	  goto bail;
      }
@@ -714,7 +702,6 @@ int get_params(struct boot_param_t* params)
      int singlekey = 0;
      int restricted = 0;
      static int first = 1;
-     static char bootargs[1024];
      static char imagepath[1024];
      static char initrdpath[1024];
      static char sysmappath[1024];
@@ -731,7 +718,6 @@ int get_params(struct boot_param_t* params)
 
      if (first) {
 	  first = 0;
-	  prom_get_chosen("bootargs", bootargs, sizeof(bootargs));
 	  imagename = bootargs;
 	  word_split(&imagename, &params->args);
 	  timeout = DEFAULT_TIMEOUT;
@@ -856,7 +842,11 @@ int get_params(struct boot_param_t* params)
 	       "If you omit \"device:\" and \"partno\" yaboot will use the
values of \n"
 	       "\"device=\" and \"partition=\" in yaboot.conf, right now those
are set to: \n"
 	       "device=%s\n"
-	       "partition=%d\n\n", defdevice, defpart);
+	       "partition=%d\n\n"
+	       "To use an alternative config file rather
than /etc/yaboot.conf, type on\n"
+	       " Open FirmWare Prompt: \"boot
conf=device:partition,/path/to/configfile\"\n"
+	       "where \"device\" and \"partition\" are defined like above.\n
\n", defdevice, defpart);
+
 	  return 0;
      }
 
@@ -1594,12 +1584,38 @@ int
 yaboot_main(void)
 {
      char *ptype;
+     int conf_given = 0;
+     char conf_path[1024];
 
      if (_machine == _MACH_Pmac)
 	  setup_display();
 
+     prom_get_chosen("bootargs", bootargs, sizeof(bootargs));
+     DEBUG_F("/chosen/bootargs = %s\n", bootargs);
      prom_get_chosen("bootpath", bootdevice, BOOTDEVSZ);
      DEBUG_F("/chosen/bootpath = %s\n", bootdevice);
+
+     /* If conf= specified on command line, it overrides
+        Usage: conf=device:partition,/path/to/conffile
+        Example: On Open Firmware Prompt, type
+                 boot
conf=/pci at 8000000f8000000/pci at 1/pci1014,028C at 1/scsi at 0/sd at 1,0:3,/etc/yaboot.conf */
+
+     if (!strncmp(bootargs, "conf=", 5)) {
+        DEBUG_F("Using conf argument in Open Firmware\n");
+        char *end = strchr(bootargs,' ');
+        if (end)
+            *end = 0;
+
+        strcpy(bootdevice, bootargs + 5);
+        conf_given = 1;
+        DEBUG_F("Using conf=%s\n", bootdevice);
+
+        /* Remove conf=xxx from bootargs */
+        if (end)
+            memmove(bootargs, end+1, strlen(end+1)+1);
+        else
+            bootargs[0] = 0;
+     }
      if (bootdevice[0] == 0) {
 	  prom_get_options("boot-device", bootdevice, BOOTDEVSZ);
 	  DEBUG_F("boot-device = %s\n", bootdevice);
@@ -1616,27 +1632,34 @@ yaboot_main(void)
      DEBUG_F("After parse_device_path: dev=%s, part=%d, file=%s\n",
 	     boot.dev, boot.part, boot.file);
 
-     if (strlen(boot.file)) {
-	  if (!strncmp(boot.file, "\\\\", 2))
-	       boot.file = "\\\\";
-	  else {
-	       char *p, *last;
-	       p = last = boot.file;
-	       while(*p) {
-		    if (*p == '\\')
-			 last = p;
-		    p++;
-	       }
-	       if (p)
-		    *(last) = 0;
-	       else
-		    boot.file = "";
-	       if (strlen(boot.file))
-		    strcat(boot.file, "\\");
-	  }
+     if (!conf_given) {
+         if (_machine == _MACH_chrp)
+             boot.file = "/etc/";
+         else if (strlen(boot.file)) {
+             if (!strncmp(boot.file, "\\\\", 2))
+                 boot.file = "\\\\";
+             else {
+                 char *p, *last;
+                 p = last = boot.file;
+                 while(*p) {
+                     if (*p == '\\')
+                         last = p;
+                     p++;
+                 }
+                 if (p)
+                     *(last) = 0;
+                 else
+                     boot.file = "";
+                 if (strlen(boot.file))
+                     strcat(boot.file, "\\");
+             }
+         }
+         strcpy(conf_path, boot.file);
+         strcat(conf_path, CONFIG_FILE_NAME);
+         boot.file = conf_path;
+         DEBUG_F("After path kludgeup: dev=%s, part=%d, file=%s\n",
+            boot.dev, boot.part, boot.file);
      }
-     DEBUG_F("After pmac path kludgeup: dev=%s, part=%d, file=%s\n",
-	     boot.dev, boot.part, boot.file);
 
      /*
       * If we're doing a netboot, first look for one which matches our





More information about the Yaboot-devel mailing list