boolean_t PE_parse_boot_argn( const char *arg_string, void *arg_ptr, int max_len) { char *args; char *cp, c; uintptr_t i; int val; boolean_t arg_boolean; boolean_t arg_found; args = PE_boot_args(); if (*args == '\0') return FALSE; #if CONFIG_EMBEDDED if (max_len == -1) return FALSE; #endif arg_found = FALSE; while(*args && isargsep(*args)) args++; while (*args) { if (*args == '-') arg_boolean = TRUE; else arg_boolean = FALSE; cp = args; while (!isargsep (*cp) && *cp != '=') cp++; if (*cp != '=' && !arg_boolean) goto gotit; c = *cp; i = cp-args; if (strncmp(args, arg_string, i) || (i!=strlen(arg_string))) goto gotit; if (arg_boolean) { argnumcpy(1, arg_ptr, max_len); arg_found = TRUE; break; } else { while (*cp && isargsep (*cp)) cp++; if (*cp == '=' && c != '=') { args = cp+1; goto gotit; } if ('_' == *arg_string) /* Force a string copy if the argument name begins with an underscore */ { int hacklen = 17 > max_len ? 17 : max_len; argstrcpy2 (++cp, (char *)arg_ptr, hacklen - 1); /* Hack - terminate after 16 characters */ arg_found = TRUE; break; } switch (getval(cp, &val)) { case NUM: argnumcpy(val, arg_ptr, max_len); arg_found = TRUE; break; case STR: if(max_len > 0) //max_len of 0 performs no copy at all argstrcpy2(++cp, (char *)arg_ptr, max_len - 1); #if !CONFIG_EMBEDDED else if(max_len == -1) // unreachable on embedded argstrcpy(++cp, (char *)arg_ptr); #endif arg_found = TRUE; break; } goto gotit; } gotit: /* Skip over current arg */ while(!isargsep(*args)) args++; /* Skip leading white space (catch end of args) */ while(*args && isargsep(*args)) args++; } return(arg_found); }
bool Parse_boot_argn(const char *arg_string, void *arg_ptr, int max_len) { char *args; char *cp, c; uintptr_t i; long long val; boolean_t arg_bool; boolean_t arg_found; args = Platform_state.bootArgs->CommandLine; if (*args == '\0') return false; arg_found = false; while(*args && isargsep(*args)) args++; while (*args) { if (*args == '-') arg_bool = true; else arg_bool = false; cp = args; while (!isargsep(*cp) && *cp != '=') cp++; if (*cp != '=' && !arg_bool) goto gotit; c = *cp; i = cp-args; if (strncmp(args, arg_string, i) || (i!=strlen(arg_string))) goto gotit; if (arg_bool) { argnumcpy(1, arg_ptr, max_len); arg_found = true; break; } else { while (*cp && isargsep (*cp)) cp++; if (*cp == '=' && c != '=') { args = cp+1; goto gotit; } if ('_' == *arg_string) { /* Force a string copy if the argument name begins with an underscore */ int hacklen = 17 > max_len ? 17 : max_len; argstrlcpy(++cp, (char *)arg_ptr, hacklen - 1); /* Hack - terminate after 16 characters */ arg_found = true; break; } switch (getval(cp, &val, false)) { case NUM: argnumcpy(val, arg_ptr, max_len); arg_found = true; break; case STR: if(max_len > 0) //max_len of 0 performs no copy at all argstrlcpy(++cp, (char *)arg_ptr, max_len - 1); arg_found = true; break; } goto gotit; } gotit: /* Skip over current arg */ while(!isargsep(*args)) args++; /* Skip leading white space (catch end of args) */ while(*args && isargsep(*args)) args++; } return(arg_found); }