fopts->step = 0;
}
} else if ((val = STR_STRIP_PREFIX(token, "error=")) != token) {
- if (fopts->data.rval != INJECT_OPTS_RVAL_DEFAULT)
+ if (fopts->data.flags & INJECT_F_RETVAL)
return false;
intval = string_to_uint_upto(val, MAX_ERRNO_VALUE);
if (intval < 0)
if (intval < 1)
return false;
fopts->data.rval = -intval;
+ fopts->data.flags |= INJECT_F_RETVAL;
} else if (!fault_tokens_only
&& (val = STR_STRIP_PREFIX(token, "retval=")) != token) {
- if (fopts->data.rval != INJECT_OPTS_RVAL_DEFAULT)
+ if (fopts->data.flags & INJECT_F_RETVAL)
return false;
intval = string_to_uint(val);
if (intval < 0)
return false;
fopts->data.rval = intval;
+ fopts->data.flags |= INJECT_F_RETVAL;
} else if (!fault_tokens_only
&& (val = STR_STRIP_PREFIX(token, "signal=")) != token) {
intval = sigstr_to_uint(val);
if (intval < 1 || intval > NSIG_BYTES * 8)
return false;
fopts->data.signo = intval;
+ fopts->data.flags |= INJECT_F_SIGNAL;
} else {
return false;
}
{
struct inject_opts opts = {
.first = 1,
- .step = 1,
- .data = {
- .rval = INJECT_OPTS_RVAL_DEFAULT,
- .signo = 0
- }
+ .step = 1
};
char *buf = NULL;
char *name = parse_inject_expression(str, &buf, &opts, fault_tokens_only);
}
/* If neither of retval, error, or signal is specified, then ... */
- if (opts.data.rval == INJECT_OPTS_RVAL_DEFAULT && !opts.data.signo) {
+ if (!opts.data.flags) {
if (fault_tokens_only) {
/* in fault= syntax the default error code is ENOSYS. */
opts.data.rval = -ENOSYS;
+ opts.data.flags |= INJECT_F_RETVAL;
} else {
/* in inject= syntax this is not allowed. */
error_msg_and_die("invalid %s '%s'", description, str);
opts->first = opts->step;
- if (opts->data.signo > 0)
+ if (opts->data.flags & INJECT_F_SIGNAL)
*signo = opts->data.signo;
- if (opts->data.rval != INJECT_OPTS_RVAL_DEFAULT && !arch_set_scno(tcp, -1))
+ if (opts->data.flags & INJECT_F_RETVAL && !arch_set_scno(tcp, -1))
tcp->flags |= TCB_TAMPERED;
return 0;