@@ -1289,18 +1289,18 @@ illegal_option(
*/
static void
check_opt(
- struct opt_params *opts,
+ struct opt_params *opt,
int index,
bool str_seen)
{
- struct subopt_param *sp = &opts->subopt_params[index];
+ struct subopt_param *sp = &opt->subopt_params[index];
int i;
if (sp->index != index) {
fprintf(stderr,
("Developer screwed up option parsing (%d/%d)! Please report!\n"),
sp->index, index);
- reqval(opts->name, (char **)opts->subopts, index);
+ reqval(opt->name, (char **)opt->subopts, index);
}
/*
@@ -1313,11 +1313,11 @@ check_opt(
*/
if (!str_seen) {
if (sp->seen)
- respec(opts->name, (char **)opts->subopts, index);
+ respec(opt->name, (char **)opt->subopts, index);
sp->seen = true;
} else {
if (sp->str_seen)
- respec(opts->name, (char **)opts->subopts, index);
+ respec(opt->name, (char **)opt->subopts, index);
sp->str_seen = true;
}
@@ -1327,10 +1327,44 @@ check_opt(
if (conflict_opt.opt == LAST_CONFLICT)
break;
- if (opts->subopt_params[conflict_opt.subopt].seen ||
- opts->subopt_params[conflict_opt.subopt].str_seen)
- conflict(opts->name, (char **)opts->subopts,
+ if (conflict_opt.test_values)
+ break;
+ if (opt->subopt_params[conflict_opt.subopt].seen ||
+ opt->subopt_params[conflict_opt.subopt].str_seen) {
+ conflict(opt->name, (char **)opt->subopts,
conflict_opt.subopt, index);
+ }
+ }
+}
+
+/*
+ * Check for conflict values between options.
+ */
+static void
+check_opt_value(
+ struct opt_params *opt,
+ int index,
+ long long value)
+{
+ struct subopt_param *sp = &opt->subopt_params[index];
+ int i;
+
+ /* check for conflicts with the option */
+ for (i = 0; i < MAX_CONFLICTS; i++) {
+ struct subopt_conflict conflict_opt = sp->conflicts[i];
+
+ if (conflict_opt.opt == LAST_CONFLICT)
+ break;
+ if (!conflict_opt.test_values)
+ break;
+ if ((opt->subopt_params[conflict_opt.subopt].seen ||
+ opt->subopt_params[conflict_opt.subopt].str_seen) &&
+ opt->subopt_params[conflict_opt.subopt].value
+ == conflict_opt.invalid_value &&
+ value == conflict_opt.at_value) {
+ conflict(opt->name, (char **)opt->subopts,
+ conflict_opt.subopt, index);
+ }
}
}
@@ -1377,6 +1411,8 @@ getnum(
illegal_option(str, opts, index, NULL);
}
+ check_opt_value(opts, index, c);
+
/* Validity check the result. */
if (c < sp->minval)
illegal_option(str, opts, index, _("value is too small"));
Add a check that reports a conflict only when subopts are mixed with specific values. Signed-off-by: Jan Tulak <jtulak@redhat.com> --- mkfs/xfs_mkfs.c | 52 ++++++++++++++++++++++++++++++++++++++++++++-------- 1 file changed, 44 insertions(+), 8 deletions(-)