*
* Home page of code is: http://smartmontools.sourceforge.net
*
- * Copyright (C) 2002-11 Bruce Allen <smartmontools-support@lists.sourceforge.net>
- * Copyright (C) 2008-12 Christian Franke <smartmontools-support@lists.sourceforge.net>
+ * Copyright (C) 2002-11 Bruce Allen
+ * Copyright (C) 2008-15 Christian Franke
* Copyright (C) 2000 Michael Cornwell <cornwell@acm.org>
*
* This program is free software; you can redistribute it and/or modify
#include <stdio.h>
#include <sys/types.h>
#include <string.h>
+#include <stdlib.h>
#include <stdarg.h>
#include <stdexcept>
#include <getopt.h>
#include "smartctl.h"
#include "utility.h"
-const char * smartctl_cpp_cvsid = "$Id: smartctl.cpp 3726 2012-12-12 20:02:48Z chrfranke $"
+const char * smartctl_cpp_cvsid = "$Id: smartctl.cpp 4080 2015-05-05 20:31:22Z chrfranke $"
CONFIG_H_CVSID SMARTCTL_H_CVSID;
// Globals to control printing
" --identify[=[w][nvb]]\n"
" Show words and bits from IDENTIFY DEVICE data (ATA)\n\n"
" -g NAME, --get=NAME\n"
-" Get device setting: all, aam, apm, lookahead, security, wcache, rcache\n\n"
+" Get device setting: all, aam, apm, lookahead, security, wcache, rcache, wcreorder\n\n"
" -a, --all\n"
" Show all SMART information for device\n\n"
" -x, --xall\n"
" -s NAME[,VALUE], --set=NAME[,VALUE]\n"
" Enable/disable/change device setting: aam,[N|off], apm,[N|off],\n"
" lookahead,[on|off], security-freeze, standby,[N|off|now],\n"
-" wcache,[on|off], rcache,[on|off]\n\n"
+" wcache,[on|off], rcache,[on|off], wcreorder,[on|off]\n\n"
);
printf(
"======================================= READ AND DISPLAY DATA OPTIONS =====\n\n"
case 'f':
return "old, brief, hex[,id|val]";
case 'g':
- return "aam, apm, lookahead, security, wcache, rcache";
+ return "aam, apm, lookahead, security, wcache, rcache, wcreorder";
case opt_set:
return "aam,[N|off], apm,[N|off], lookahead,[on|off], security-freeze, "
- "standby,[N|off|now], wcache,[on|off], rcache,[on|off]";
+ "standby,[N|off|now], wcache,[on|off], rcache,[on|off], wcreorder,[on|off]";
case 's':
return getvalidarglist(opt_smart)+", "+getvalidarglist(opt_set);
case opt_identify:
sscanf(optarg, "devstat%n,%u%n", &n1, &val, &n2);
if (n1 == len)
ataopts.devstat_all_pages = true;
- else if (n2 == len && val <= 255)
- ataopts.devstat_pages.push_back(val);
- else
- badarg = 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);
ataopts.smart_logdir = ataopts.gp_logdir = true;
ataopts.sct_temp_sts = ataopts.sct_temp_hist = true;
ataopts.sct_erc_get = true;
+ ataopts.sct_wcache_reorder_get = true;
ataopts.devstat_all_pages = true;
ataopts.sataphy = true;
ataopts.get_set_used = true;
} else {
if (ataopts.smart_selective_args.num_spans >= 5 || start > stop) {
if (start > stop) {
- snprintf(extraerror, sizeof(extraerror), "ERROR: Start LBA (%"PRIu64") > ending LBA (%"PRId64") in argument \"%s\"\n",
+ snprintf(extraerror, sizeof(extraerror), "ERROR: Start LBA (%" PRIu64 ") > ending LBA (%" PRId64 ") in argument \"%s\"\n",
start, stop, optarg);
} else {
snprintf(extraerror, sizeof(extraerror),"ERROR: No more than five selective self-test spans may be"
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;
// Main program without exception handling
static int main_worker(int argc, char **argv)
{
- // Throw if CPU endianess does not match compile time test.
- check_endianness();
+ // Throw if runtime environment does not match compile time test.
+ check_config();
// Initialize interface
smart_interface::init();