Esempio n. 1
0
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);
}
Esempio n. 2
0
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);
}