Ejemplo n.º 1
0
static int
fuzzer_trigger(unsigned int chance)
{
    switch(method) {
    case FOFF:
	return 0;
    case FRANDOM:
	if ((rk_random() % chance) != 1)
	    return 0;
	return 1;
    case FLINEAR:
	if (fnum == fcur++)
	    return 1;
	return 0;
    case FLINEAR_SIZE:
	return 0;
    }
    return 0;
}
Ejemplo n.º 2
0
static int
arg_match_long(struct getargs *args, size_t num_args,
	       char *argv, int argc, char **rargv, int *goptind)
{
    size_t i;
    char *goptarg = NULL;
    int negate = 0;
    int partial_match = 0;
    struct getargs *partial = NULL;
    struct getargs *current = NULL;
    size_t argv_len;
    char *p;
    size_t p_len;

    argv_len = strlen(argv);
    p = strchr (argv, '=');
    if (p != NULL)
	argv_len = p - argv;

    for (i = 0; i < num_args; ++i) {
	if(args[i].long_name) {
	    size_t len = strlen(args[i].long_name);
	    p = argv;
	    p_len = argv_len;
	    negate = 0;

	    for (;;) {
		if (strncmp (args[i].long_name, p, p_len) == 0) {
		    if(p_len == len)
			current = &args[i];
		    else {
			++partial_match;
			partial = &args[i];
		    }
		    goptarg  = p + p_len;
		} else if (ISFLAG(args[i]) && strncmp (p, "no-", 3) == 0) {
		    negate = !negate;
		    p += 3;
		    p_len -= 3;
		    continue;
		}
		break;
	    }
	    if (current)
		break;
	}
    }
    if (current == NULL) {
	if (partial_match == 1)
	    current = partial;
	else
	    return ARG_ERR_NO_MATCH;
    }

    if(*goptarg == '\0'
       && !ISFLAG(*current)
       && current->type != arg_collect
       && current->type != arg_counter)
	return ARG_ERR_NO_MATCH;
    switch(current->type){
    case arg_integer:
    {
	int tmp;
	if(sscanf(goptarg + 1, "%d", &tmp) != 1)
	    return ARG_ERR_BAD_ARG;
	*(int*)current->value = tmp;
	return 0;
    }
    case arg_string:
    {
	*(char**)current->value = goptarg + 1;
	return 0;
    }
    case arg_strings:
    {
	return add_string((getarg_strings*)current->value, goptarg + 1);
    }
    case arg_flag:
    case arg_negative_flag:
    {
	int *flag = current->value;
	if(*goptarg == '\0' ||
	   strcmp(goptarg + 1, "yes") == 0 ||
	   strcmp(goptarg + 1, "true") == 0){
	    *flag = !negate;
	    return 0;
	} else if (*goptarg && strcmp(goptarg + 1, "maybe") == 0) {
	    *flag = rk_random() & 1;
	} else {
	    *flag = negate;
	    return 0;
	}
	return ARG_ERR_BAD_ARG;
    }
    case arg_counter :
    {
	int val;

	if (*goptarg == '\0')
	    val = 1;
	else if(sscanf(goptarg + 1, "%d", &val) != 1)
	    return ARG_ERR_BAD_ARG;
	*(int *)current->value += val;
	return 0;
    }
    case arg_double:
    {
	double tmp;
	if(sscanf(goptarg + 1, "%lf", &tmp) != 1)
	    return ARG_ERR_BAD_ARG;
	*(double*)current->value = tmp;
	return 0;
    }
    case arg_collect:{
	struct getarg_collect_info *c = current->value;
	int o = (int)(argv - rargv[*goptind]);
	return (*c->func)(FALSE, argc, rargv, goptind, &o, c->data);
    }

    default:
	abort ();
	UNREACHABLE(return 0);
    }
}