+ case 'i':
+ case 'o':
+ if (!fw3_parse_device(&dev, optarg, false) ||
+ dev.any || dev.invert || *dev.network)
+ {
+ warn("fw3_ipt_rule_append(): Bad argument '%s'", optarg);
+ goto free;
+ }
+
+ dev.invert = inv;
+ fw3_ipt_rule_in_out(r, (optc == 'i') ? &dev : NULL,
+ (optc == 'o') ? &dev : NULL);
+ break;
+
+ case 's':
+ case 'd':
+ if (!fw3_parse_address(&addr, optarg, false) ||
+ addr.range || addr.invert)
+ {
+ warn("fw3_ipt_rule_append(): Bad argument '%s'", optarg);
+ goto free;
+ }
+
+ addr.invert = inv;
+ fw3_ipt_rule_src_dest(r, (optc == 's') ? &addr : NULL,
+ (optc == 'd') ? &addr : NULL);
+ break;
+