X-Git-Url: http://git.ozlabs.org/?p=yaboot.git;a=blobdiff_plain;f=second%2Fcfg.c;h=fe3f1e1b40d8c78ed4d8d396d42792582ff63904;hp=3d0824312ead778b79da8f9927f3e48369b1923f;hb=6166753b1295119cfd8f7a5973b0b523098ef263;hpb=6f00a510abbfaa45b580cf5f371f0168ba662d3d diff --git a/second/cfg.c b/second/cfg.c index 3d08243..fe3f1e1 100644 --- a/second/cfg.c +++ b/second/cfg.c @@ -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 @@ -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) { @@ -443,16 +470,6 @@ int cfg_parse (char *cfg_file, char *buff, int len) } } -static char *cfg_get_strg_i (CONFIG * table, char *item) -{ - CONFIG *walk; - - for (walk = table; walk->type != cft_end; walk++) - if (walk->name && !strcasecmp (walk->name, item)) - return walk->data; - return 0; -} - char *cfg_get_strg (char *image, char *item) { struct IMAGES *p; @@ -492,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++; @@ -523,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; @@ -560,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"