|
|
|
@ -95,14 +95,12 @@ static __inline__ int abortboot(int bootdelay) |
|
|
|
|
{ |
|
|
|
|
int abort = 0; |
|
|
|
|
uint64_t etime = endtick(bootdelay); |
|
|
|
|
struct |
|
|
|
|
{ |
|
|
|
|
struct { |
|
|
|
|
char* str; |
|
|
|
|
u_int len; |
|
|
|
|
int retry; |
|
|
|
|
} |
|
|
|
|
delaykey [] = |
|
|
|
|
{ |
|
|
|
|
delaykey [] = { |
|
|
|
|
{ str: getenv ("bootdelaykey"), retry: 1 }, |
|
|
|
|
{ str: getenv ("bootdelaykey2"), retry: 1 }, |
|
|
|
|
{ str: getenv ("bootstopkey"), retry: 0 }, |
|
|
|
@ -498,7 +496,7 @@ void main_loop (void) |
|
|
|
|
|
|
|
|
|
#ifdef CONFIG_BOOT_RETRY_TIME |
|
|
|
|
/***************************************************************************
|
|
|
|
|
* initialise command line timeout |
|
|
|
|
* initialize command line timeout |
|
|
|
|
*/ |
|
|
|
|
void init_cmd_timeout(void) |
|
|
|
|
{ |
|
|
|
@ -529,23 +527,9 @@ void reset_cmd_timeout(void) |
|
|
|
|
* Author: Janghoon Lyu <nandy@mizi.com> |
|
|
|
|
*/ |
|
|
|
|
|
|
|
|
|
#if 1 /* avoid redundand code -- wd */ |
|
|
|
|
#define putnstr(str,n) do { \ |
|
|
|
|
printf ("%.*s", n, str); \
|
|
|
|
|
} while (0) |
|
|
|
|
#else |
|
|
|
|
void putnstr(const char *str, size_t n) |
|
|
|
|
{ |
|
|
|
|
if (str == NULL) |
|
|
|
|
return; |
|
|
|
|
|
|
|
|
|
while (n && *str != '\0') { |
|
|
|
|
putc(*str); |
|
|
|
|
str++; |
|
|
|
|
n--; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
#endif |
|
|
|
|
|
|
|
|
|
#define CTL_CH(c) ((c) - 'a' + 1) |
|
|
|
|
|
|
|
|
@ -1138,97 +1122,99 @@ static void process_macros (const char *input, char *output) |
|
|
|
|
{ |
|
|
|
|
char c, prev; |
|
|
|
|
const char *varname_start = NULL; |
|
|
|
|
int inputcnt = strlen (input); |
|
|
|
|
int inputcnt = strlen (input); |
|
|
|
|
int outputcnt = CFG_CBSIZE; |
|
|
|
|
int state = 0; /* 0 = waiting for '$' */ |
|
|
|
|
/* 1 = waiting for '(' or '{' */ |
|
|
|
|
/* 2 = waiting for ')' or '}' */ |
|
|
|
|
/* 3 = waiting for ''' */ |
|
|
|
|
int state = 0; /* 0 = waiting for '$' */ |
|
|
|
|
|
|
|
|
|
/* 1 = waiting for '(' or '{' */ |
|
|
|
|
/* 2 = waiting for ')' or '}' */ |
|
|
|
|
/* 3 = waiting for ''' */ |
|
|
|
|
#ifdef DEBUG_PARSER |
|
|
|
|
char *output_start = output; |
|
|
|
|
|
|
|
|
|
printf ("[PROCESS_MACROS] INPUT len %d: \"%s\"\n", strlen(input), input); |
|
|
|
|
printf ("[PROCESS_MACROS] INPUT len %d: \"%s\"\n", strlen (input), |
|
|
|
|
input); |
|
|
|
|
#endif |
|
|
|
|
|
|
|
|
|
prev = '\0'; /* previous character */ |
|
|
|
|
prev = '\0'; /* previous character */ |
|
|
|
|
|
|
|
|
|
while (inputcnt && outputcnt) { |
|
|
|
|
c = *input++; |
|
|
|
|
inputcnt--; |
|
|
|
|
|
|
|
|
|
if (state!=3) { |
|
|
|
|
/* remove one level of escape characters */ |
|
|
|
|
if ((c == '\\') && (prev != '\\')) { |
|
|
|
|
if (inputcnt-- == 0) |
|
|
|
|
break; |
|
|
|
|
prev = c; |
|
|
|
|
c = *input++; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
switch (state) { |
|
|
|
|
case 0: /* Waiting for (unescaped) $ */ |
|
|
|
|
if ((c == '\'') && (prev != '\\')) { |
|
|
|
|
state = 3; |
|
|
|
|
break; |
|
|
|
|
} |
|
|
|
|
if ((c == '$') && (prev != '\\')) { |
|
|
|
|
state++; |
|
|
|
|
} else { |
|
|
|
|
*(output++) = c; |
|
|
|
|
outputcnt--; |
|
|
|
|
inputcnt--; |
|
|
|
|
|
|
|
|
|
if (state != 3) { |
|
|
|
|
/* remove one level of escape characters */ |
|
|
|
|
if ((c == '\\') && (prev != '\\')) { |
|
|
|
|
if (inputcnt-- == 0) |
|
|
|
|
break; |
|
|
|
|
prev = c; |
|
|
|
|
c = *input++; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
break; |
|
|
|
|
case 1: /* Waiting for ( */ |
|
|
|
|
if (c == '(' || c == '{') { |
|
|
|
|
state++; |
|
|
|
|
varname_start = input; |
|
|
|
|
} else { |
|
|
|
|
state = 0; |
|
|
|
|
*(output++) = '$'; |
|
|
|
|
outputcnt--; |
|
|
|
|
|
|
|
|
|
if (outputcnt) { |
|
|
|
|
|
|
|
|
|
switch (state) { |
|
|
|
|
case 0: /* Waiting for (unescaped) $ */ |
|
|
|
|
if ((c == '\'') && (prev != '\\')) { |
|
|
|
|
state = 3; |
|
|
|
|
break; |
|
|
|
|
} |
|
|
|
|
if ((c == '$') && (prev != '\\')) { |
|
|
|
|
state++; |
|
|
|
|
} else { |
|
|
|
|
*(output++) = c; |
|
|
|
|
outputcnt--; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
break; |
|
|
|
|
case 2: /* Waiting for ) */ |
|
|
|
|
if (c == ')' || c == '}') { |
|
|
|
|
int i; |
|
|
|
|
char envname[CFG_CBSIZE], *envval; |
|
|
|
|
int envcnt = input-varname_start-1; /* Varname # of chars */ |
|
|
|
|
|
|
|
|
|
/* Get the varname */ |
|
|
|
|
for (i = 0; i < envcnt; i++) { |
|
|
|
|
envname[i] = varname_start[i]; |
|
|
|
|
} |
|
|
|
|
envname[i] = 0; |
|
|
|
|
|
|
|
|
|
/* Get its value */ |
|
|
|
|
envval = getenv (envname); |
|
|
|
|
break; |
|
|
|
|
case 1: /* Waiting for ( */ |
|
|
|
|
if (c == '(' || c == '{') { |
|
|
|
|
state++; |
|
|
|
|
varname_start = input; |
|
|
|
|
} else { |
|
|
|
|
state = 0; |
|
|
|
|
*(output++) = '$'; |
|
|
|
|
outputcnt--; |
|
|
|
|
|
|
|
|
|
/* Copy into the line if it exists */ |
|
|
|
|
if (envval != NULL) |
|
|
|
|
while ((*envval) && outputcnt) { |
|
|
|
|
*(output++) = *(envval++); |
|
|
|
|
if (outputcnt) { |
|
|
|
|
*(output++) = c; |
|
|
|
|
outputcnt--; |
|
|
|
|
} |
|
|
|
|
/* Look for another '$' */ |
|
|
|
|
state = 0; |
|
|
|
|
} |
|
|
|
|
break; |
|
|
|
|
case 3: /* Waiting for ' */ |
|
|
|
|
if ((c == '\'') && (prev != '\\')) { |
|
|
|
|
state = 0; |
|
|
|
|
} else { |
|
|
|
|
*(output++) = c; |
|
|
|
|
outputcnt--; |
|
|
|
|
} |
|
|
|
|
break; |
|
|
|
|
case 2: /* Waiting for ) */ |
|
|
|
|
if (c == ')' || c == '}') { |
|
|
|
|
int i; |
|
|
|
|
char envname[CFG_CBSIZE], *envval; |
|
|
|
|
int envcnt = input - varname_start - 1; /* Varname # of chars */ |
|
|
|
|
|
|
|
|
|
/* Get the varname */ |
|
|
|
|
for (i = 0; i < envcnt; i++) { |
|
|
|
|
envname[i] = varname_start[i]; |
|
|
|
|
} |
|
|
|
|
envname[i] = 0; |
|
|
|
|
|
|
|
|
|
/* Get its value */ |
|
|
|
|
envval = getenv (envname); |
|
|
|
|
|
|
|
|
|
/* Copy into the line if it exists */ |
|
|
|
|
if (envval != NULL) |
|
|
|
|
while ((*envval) && outputcnt) { |
|
|
|
|
*(output++) = *(envval++); |
|
|
|
|
outputcnt--; |
|
|
|
|
} |
|
|
|
|
/* Look for another '$' */ |
|
|
|
|
state = 0; |
|
|
|
|
} |
|
|
|
|
break; |
|
|
|
|
case 3: /* Waiting for ' */ |
|
|
|
|
if ((c == '\'') && (prev != '\\')) { |
|
|
|
|
state = 0; |
|
|
|
|
} else { |
|
|
|
|
*(output++) = c; |
|
|
|
|
outputcnt--; |
|
|
|
|
} |
|
|
|
|
break; |
|
|
|
|
} |
|
|
|
|
break; |
|
|
|
|
} |
|
|
|
|
prev = c; |
|
|
|
|
prev = c; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if (outputcnt) |
|
|
|
@ -1236,7 +1222,7 @@ static void process_macros (const char *input, char *output) |
|
|
|
|
|
|
|
|
|
#ifdef DEBUG_PARSER |
|
|
|
|
printf ("[PROCESS_MACROS] OUTPUT len %d: \"%s\"\n", |
|
|
|
|
strlen(output_start), output_start); |
|
|
|
|
strlen (output_start), output_start); |
|
|
|
|
#endif |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|