+
+ case 'g':
+ case_s_continued: // -s, see above
+ case opt_set: // --set
+ {
+ ataopts.get_set_used = true;
+ bool get = (optchar == 'g');
+ char name[16+1]; unsigned val;
+ int n1 = -1, n2 = -1, n3 = -1, len = strlen(optarg);
+ if (sscanf(optarg, "%16[^,=]%n%*[,=]%n%u%n", name, &n1, &n2, &val, &n3) >= 1
+ && (n1 == len || (!get && n2 > 0))) {
+ bool on = (n2 > 0 && !strcmp(optarg+n2, "on"));
+ bool off = (n2 > 0 && !strcmp(optarg+n2, "off"));
+ if (n3 != len)
+ val = ~0U;
+
+ if (get && !strcmp(name, "all")) {
+ ataopts.get_aam = ataopts.get_apm = true;
+ ataopts.get_security = true;
+ ataopts.get_lookahead = ataopts.get_wcache = true;
+ scsiopts.get_rcd = scsiopts.get_wce = true;
+ }
+ else if (!strcmp(name, "aam")) {
+ if (get)
+ ataopts.get_aam = true;
+ else if (off)
+ ataopts.set_aam = -1;
+ else if (val <= 254)
+ ataopts.set_aam = val + 1;
+ else {
+ snprintf(extraerror, sizeof(extraerror), "Option -s aam,N must have 0 <= N <= 254\n");
+ badarg = true;
+ }
+ }
+ else if (!strcmp(name, "apm")) {
+ if (get)
+ ataopts.get_apm = true;
+ else if (off)
+ ataopts.set_apm = -1;
+ else if (1 <= val && val <= 254)
+ ataopts.set_apm = val + 1;
+ else {
+ snprintf(extraerror, sizeof(extraerror), "Option -s apm,N must have 1 <= N <= 254\n");
+ badarg = true;
+ }
+ }
+ else if (!strcmp(name, "lookahead")) {
+ if (get) {
+ ataopts.get_lookahead = true;
+ }
+ else if (off)
+ ataopts.set_lookahead = -1;
+ else if (on)
+ ataopts.set_lookahead = 1;
+ else
+ badarg = true;
+ }
+ else if (!strcmp(name, "wcreorder")) {
+ if (get) {
+ ataopts.sct_wcache_reorder_get = true;
+ }
+ else if (off)
+ ataopts.sct_wcache_reorder_set = -1;
+ else if (on)
+ ataopts.sct_wcache_reorder_set = 1;
+ else
+ badarg = true;
+ }
+ else if (!strcmp(name, "rcache")) {
+ if (get)
+ scsiopts.get_rcd = true;
+ else if (off)
+ scsiopts.set_rcd = -1;
+ else if (on)
+ scsiopts.set_rcd = 1;
+ else
+ badarg = true;
+ }
+ else if (get && !strcmp(name, "security")) {
+ ataopts.get_security = true;
+ }
+ else if (!get && !strcmp(optarg, "security-freeze")) {
+ ataopts.set_security_freeze = true;
+ }
+ else if (!get && !strcmp(optarg, "standby,now")) {
+ ataopts.set_standby_now = true;
+ }
+ else if (!get && !strcmp(name, "standby")) {
+ if (off)
+ ataopts.set_standby = 0 + 1;
+ else if (val <= 255)
+ ataopts.set_standby = val + 1;
+ else {
+ snprintf(extraerror, sizeof(extraerror), "Option -s standby,N must have 0 <= N <= 255\n");
+ badarg = true;
+ }
+ }
+ else if (!strcmp(name, "wcache")) {
+ if (get) {
+ ataopts.get_wcache = true;
+ scsiopts.get_wce = true;
+ }
+ else if (off) {
+ ataopts.set_wcache = -1;
+ scsiopts.set_wce = -1;
+ }
+ else if (on) {
+ ataopts.set_wcache = 1;
+ scsiopts.set_wce = 1;
+ }
+ else
+ badarg = true;
+ }
+ else
+ badarg = true;
+ }
+ else
+ badarg = true;
+ }
+ break;
+
+ case opt_scan:
+ case opt_scan_open:
+ scan = optchar;
+ break;
+