+ scsiopts.smart_background_log = true;
+ } else if (!strcmp(optarg,"ssd")) {
+ ataopts.devstat_ssd_page = true;
+ scsiopts.smart_ss_media_log = true;
+ } else if (!strcmp(optarg,"scterc")) {
+ ataopts.sct_erc_get = true;
+ } else if (!strcmp(optarg,"scttemp")) {
+ ataopts.sct_temp_sts = ataopts.sct_temp_hist = true;
+ } else if (!strcmp(optarg,"scttempsts")) {
+ ataopts.sct_temp_sts = true;
+ } else if (!strcmp(optarg,"scttemphist")) {
+ ataopts.sct_temp_hist = true;
+
+ } else if (!strncmp(optarg, "scttempint,", sizeof("scstempint,")-1)) {
+ unsigned interval = 0; int n1 = -1, n2 = -1, len = strlen(optarg);
+ if (!( sscanf(optarg,"scttempint,%u%n,p%n", &interval, &n1, &n2) == 1
+ && 0 < interval && interval <= 0xffff && (n1 == len || n2 == len))) {
+ snprintf(extraerror, sizeof(extraerror), "Option -l scttempint,N[,p] must have positive integer N\n");
+ badarg = true;
+ }
+ ataopts.sct_temp_int = interval;
+ ataopts.sct_temp_int_pers = (n2 == len);
+
+ } else if (!strncmp(optarg, "devstat", sizeof("devstat")-1)) {
+ int n1 = -1, n2 = -1, len = strlen(optarg);
+ unsigned val = ~0;
+ sscanf(optarg, "devstat%n,%u%n", &n1, &val, &n2);
+ if (n1 == len)
+ ataopts.devstat_all_pages = true;
+ else {
+ if (n2 != len) // retry with hex
+ sscanf(optarg, "devstat,0x%x%n", &val, &n2);
+ if (n2 == len && val <= 0xff)
+ ataopts.devstat_pages.push_back(val);
+ else
+ badarg = true;
+ }
+
+ } else if (!strncmp(optarg, "xerror", sizeof("xerror")-1)) {
+ int n1 = -1, n2 = -1, len = strlen(optarg);
+ unsigned val = 8;
+ sscanf(optarg, "xerror%n,error%n", &n1, &n2);
+ if (!(n1 == len || n2 == len)) {
+ n1 = n2 = -1;
+ sscanf(optarg, "xerror,%u%n,error%n", &val, &n1, &n2);
+ }
+ if ((n1 == len || n2 == len) && val > 0) {
+ ataopts.smart_ext_error_log = val;
+ ataopts.retry_error_log = (n2 == len);
+ }
+ else
+ badarg = true;
+
+ } else if (!strncmp(optarg, "xselftest", sizeof("xselftest")-1)) {
+ int n1 = -1, n2 = -1, len = strlen(optarg);
+ unsigned val = 25;
+ sscanf(optarg, "xselftest%n,selftest%n", &n1, &n2);
+ if (!(n1 == len || n2 == len)) {
+ n1 = n2 = -1;
+ sscanf(optarg, "xselftest,%u%n,selftest%n", &val, &n1, &n2);
+ }
+ if ((n1 == len || n2 == len) && val > 0) {
+ ataopts.smart_ext_selftest_log = val;
+ ataopts.retry_selftest_log = (n2 == len);
+ }
+ else
+ badarg = true;
+
+ } else if (!strncmp(optarg, "scterc,", sizeof("scterc,")-1)) {
+ unsigned rt = ~0, wt = ~0; int n = -1;
+ sscanf(optarg,"scterc,%u,%u%n", &rt, &wt, &n);
+ if (n == (int)strlen(optarg) && rt <= 999 && wt <= 999) {
+ ataopts.sct_erc_set = true;
+ ataopts.sct_erc_readtime = rt;
+ ataopts.sct_erc_writetime = wt;
+ }
+ else {
+ snprintf(extraerror, sizeof(extraerror), "Option -l scterc,[READTIME,WRITETIME] syntax error\n");
+ badarg = true;
+ }
+ } else if ( !strncmp(optarg, "gplog," , sizeof("gplog," )-1)
+ || !strncmp(optarg, "smartlog,", sizeof("smartlog,")-1)) {
+ unsigned logaddr = ~0U; unsigned page = 0, nsectors = 1; char sign = 0;
+ int n1 = -1, n2 = -1, n3 = -1, len = strlen(optarg);
+ sscanf(optarg, "%*[a-z],0x%x%n,%u%n%c%u%n",
+ &logaddr, &n1, &page, &n2, &sign, &nsectors, &n3);
+ if (len > n2 && n3 == -1 && !strcmp(optarg+n2, "-max")) {
+ nsectors = ~0U; sign = '+'; n3 = len;
+ }
+ bool gpl = (optarg[0] == 'g');
+ const char * erropt = (gpl ? "gplog" : "smartlog");
+ if (!( n1 == len || n2 == len
+ || (n3 == len && (sign == '+' || sign == '-')))) {
+ snprintf(extraerror, sizeof(extraerror), "Option -l %s,ADDR[,FIRST[-LAST|+SIZE]] syntax error\n", erropt);
+ badarg = true;
+ }
+ else if (!( logaddr <= 0xff && page <= (gpl ? 0xffffU : 0x00ffU)
+ && 0 < nsectors
+ && (nsectors <= (gpl ? 0xffffU : 0xffU) || nsectors == ~0U)
+ && (sign != '-' || page <= nsectors) )) {
+ snprintf(extraerror, sizeof(extraerror), "Option -l %s,ADDR[,FIRST[-LAST|+SIZE]] parameter out of range\n", erropt);
+ badarg = true;
+ }
+ else {
+ ata_log_request req;
+ req.gpl = gpl; req.logaddr = logaddr; req.page = page;
+ req.nsectors = (sign == '-' ? nsectors-page+1 : nsectors);
+ ataopts.log_requests.push_back(req);
+ }
+ }
+
+ else if (str_starts_with(optarg, "nvmelog,")) {
+ int n = -1, len = strlen(optarg);
+ unsigned page = 0, size = 0;
+ sscanf(optarg, "nvmelog,0x%x,0x%x%n", &page, &size, &n);
+ if (n == len && page <= 0xff && 0 < size && size <= 0x4000) {
+ nvmeopts.log_page = page; nvmeopts.log_page_size = size;
+ }
+ else
+ badarg = true;
+ }
+
+ else {
+ badarg = true;