/* 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
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;
currp = buff;
endp = currp + len;
+ cfg_reset();
+
if (setjmp (env))
return -1;
while (1) {
}
}
-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;
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++;
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;
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"