summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLennart Poettering <lennart@poettering.net>2009-04-14 22:50:09 +0200
committerLennart Poettering <lennart@poettering.net>2009-04-14 22:50:09 +0200
commit40be070d15df307c1a911a18c71421ec258ffd89 (patch)
tree8e50f32bd5c7d8f0b05e0ee551786df28f72dc2c
parent2346ef47503dfccf4978a62893a9d58e37937f88 (diff)
add new --power-cycle/--can-smart/--status switches to skdump
-rw-r--r--skdump.c51
1 files changed, 51 insertions, 0 deletions
diff --git a/skdump.c b/skdump.c
index 5f2a86c..24673e7 100644
--- a/skdump.c
+++ b/skdump.c
@@ -35,8 +35,11 @@ enum {
MODE_DUMP = 10,
MODE_OVERALL,
MODE_POWER_ON,
+ MODE_POWER_CYCLE,
MODE_BAD,
MODE_TEMPERATURE,
+ MODE_STATUS,
+ MODE_CAN_SMART,
MODE_SAVE
};
@@ -57,8 +60,11 @@ int main(int argc, char *argv[]) {
static const struct option long_options[] = {
{"overall", no_argument, &mode, MODE_OVERALL},
{"power-on", no_argument, &mode, MODE_POWER_ON},
+ {"power-cycle", no_argument, &mode, MODE_POWER_CYCLE},
{"bad", no_argument, &mode, MODE_BAD},
{"temperature", no_argument, &mode, MODE_TEMPERATURE},
+ {"can-smart", no_argument, &mode, MODE_CAN_SMART},
+ {"status", no_argument, &mode, MODE_STATUS},
{"save", optional_argument, NULL, ARG_SAVE},
{"load", optional_argument, NULL, ARG_LOAD},
{"help", no_argument, NULL, 'h' },
@@ -85,7 +91,10 @@ int main(int argc, char *argv[]) {
"Reads ATA SMART data from a device and parses it.\n"
"\n"
"\t--overall \tShow overall status\n"
+ "\t--status \tShow SMART status\n"
+ "\t--can-smart \tShow whether SMART is supported\n"
"\t--power-on \tPrint power on time in ms\n"
+ "\t--power-cycle \tPrint number of power cycles\n"
"\t--bad \tPrint bad sector count\n"
"\t--temperature \tPrint drive temperature in mKelvin\n"
"\t--save[=FILENAME]\tSave raw data to file/STDOUT\n"
@@ -175,6 +184,19 @@ int main(int argc, char *argv[]) {
break;
+ case MODE_CAN_SMART: {
+ SkBool available;
+
+ if ((ret = sk_disk_smart_is_available(d, &available)) < 0) {
+ fprintf(stderr, "Failed to query whether SMART is available: %s\n", strerror(errno));
+ goto finish;
+ }
+
+ printf("%s\n", available ? "YES" : "NO");
+ q = available ? 0 : 1;
+ break;
+ }
+
case MODE_OVERALL: {
SkSmartOverall overall;
@@ -193,6 +215,19 @@ int main(int argc, char *argv[]) {
goto finish;
}
+ case MODE_STATUS: {
+ SkBool good;
+
+ if ((ret = sk_disk_smart_status(d, &good)) < 0) {
+ fprintf(stderr, "Failed to get SMART status: %s\n", strerror(errno));
+ goto finish;
+ }
+
+ printf("%s\n", good ? "GOOD" : "BAD");
+ q = good ? 0 : 1;
+ goto finish;
+ }
+
case MODE_POWER_ON: {
uint64_t ms;
@@ -210,6 +245,22 @@ int main(int argc, char *argv[]) {
break;
}
+ case MODE_POWER_CYCLE: {
+ uint64_t count;
+
+ if ((ret = sk_disk_smart_read_data(d)) < 0) {
+ fprintf(stderr, "Failed to read SMART data: %s\n", strerror(errno));
+ goto finish;
+ }
+
+ if ((ret = sk_disk_smart_get_power_cycle(d, &count)) < 0) {
+ fprintf(stderr, "Failed to get power cycles: %s\n", strerror(errno));
+ goto finish;
+ }
+
+ printf("%llu\n", (unsigned long long) count);
+ break;
+ }
case MODE_BAD: {
uint64_t bad;