]> git.ozlabs.org Git - yaboot.git/blobdiff - second/cfg.c
long append="..." causes yaboot to reject entire yaboot.conf (MAX_TOKEN too small)
[yaboot.git] / second / cfg.c
index 4167582ae538324bae1572fe536eb4d116ba3a44..f23e690d4807ad0b37da58d91b9ae589d879ffa3 100644 (file)
@@ -29,6 +29,7 @@
 /* Imported functions */
 extern int strcasecmp(const char *s1, const char *s2);
 extern int strncasecmp(const char *cs, const char *ct, size_t n);
+extern char bootoncelabel[1024];
 
 typedef enum {
      cft_strg, cft_flag, cft_end
@@ -40,7 +41,7 @@ typedef struct {
      void *data;
 } CONFIG;
 
-#define MAX_TOKEN 200
+#define MAX_TOKEN 511
 #define MAX_VAR_NAME MAX_TOKEN
 #define EOF -1
 
@@ -421,6 +422,30 @@ cfg_set_redo:
      return 0;
 }
 
+static int cfg_reset ()
+{
+    CONFIG *walk;
+#if DEBUG
+    prom_printf("Resetting image table\n");
+#endif
+    line_num = 0;
+    images = NULL;
+    curr_table = NULL;
+    curr_table = cf_options;
+    for (walk = curr_table; walk->type != cft_end; walk++) {
+#if DEBUG
+        prom_printf("ItemA %s = %s\n", walk->name, walk->data);
+#endif
+        if (walk->data != NULL)
+            walk->data = NULL;
+#if DEBUG
+        prom_printf("ItemB %s = %s\n\n", walk->name, walk->data);
+#endif
+    }
+
+    return 0;
+}
+
 int cfg_parse (char *cfg_file, char *buff, int len)
 {
      char *item, *value;
@@ -429,6 +454,8 @@ int cfg_parse (char *cfg_file, char *buff, int len)
      currp = buff;
      endp = currp + len;
 
+     cfg_reset();
+
      if (setjmp (env))
          return -1;
      while (1) {
@@ -482,10 +509,16 @@ static int printl_count = 0;
 static void printlabel (char *label, int defflag)
 {
      int len = strlen (label);
+     char a = ' ';
 
      if (!printl_count)
          prom_printf ("\n");
-     prom_printf ("%s %s",defflag?"*":" ", label);
+     switch (defflag) {
+         case 1:  a='*'; break;
+         case 2:  a='&'; break;
+         default: a=' '; break;
+     }
+     prom_printf ("%c %s", a, label);
      while (len++ < 25)
          prom_putchar (' ');
      printl_count++;
@@ -513,7 +546,9 @@ void cfg_print_images (void)
               if (alias)
                    label = alias + 1;
          }
-         if(!strcmp(ret,label))
+         if(!strcmp(bootoncelabel,label))
+              defflag=2;
+         else if(!strcmp(ret,label))
               defflag=1;
          else
               defflag=0;
@@ -550,6 +585,43 @@ char *cfg_get_default (void)
      return ret;
 }
 
+/*
+ * cfg_set_default_by_mac ()
+ * return 1 if the default cf_option was changed to label with the MAC addr
+ * return 0 if not changed
+ */
+int cfg_set_default_by_mac (char *mac_addr)
+{
+     CONFIG *walk;
+     struct IMAGES *tmp;
+     char * label = NULL;
+     int haslabel = 0;
+
+     /* check if there is an image label equal to mac_addr */
+     for (tmp = images; tmp; tmp = tmp->next) {
+        label = cfg_get_strg_i (tmp->table, "label");
+        if (!strcmp(label,mac_addr)){
+            haslabel = 1;
+        }
+     }
+
+     if (!haslabel)
+         return 0;
+     else {
+         /*
+          * if there is an image label equal to mac_addr, change the default
+          * cf_options to this image label
+          */
+         for (walk = cf_options; walk->type != cft_end; walk++) {
+             if (!strcasecmp(walk->name,"default")) {
+                 walk->data = mac_addr;
+                 return 1;
+             }
+         }
+         return 0;
+     }
+}
+
 /*
  * Local variables:
  * c-file-style: "k&r"