Skip to content
Snippets Groups Projects
Commit 311358a0 authored by ballen4705's avatar ballen4705
Browse files

Quiet option (-q) no longer prints all error log entries, just the number of

entries and the times at which they occured.


git-svn-id: https://smartmontools.svn.sourceforge.net/svnroot/smartmontools/trunk@98 4ea69e1a-61f1-4043-bf83-b5c94c648137
parent 22b19095
No related branches found
No related tags found
No related merge requests found
11 12
...@@ -28,7 +28,7 @@ ...@@ -28,7 +28,7 @@
#include "smartctl.h" #include "smartctl.h"
#include "extern.h" #include "extern.h"
const char *CVSid4="$Id: ataprint.c,v 1.31 2002/10/24 07:50:45 ballen4705 Exp $" const char *CVSid4="$Id: ataprint.c,v 1.32 2002/10/24 08:46:03 ballen4705 Exp $"
CVSID2 CVSID3 CVSID6; CVSID2 CVSID3 CVSID6;
// Function for printing ASCII byte-swapped strings, skipping white // Function for printing ASCII byte-swapped strings, skipping white
...@@ -514,7 +514,7 @@ void ataPrintSmartErrorlog (struct ata_smart_errorlog data){ ...@@ -514,7 +514,7 @@ void ataPrintSmartErrorlog (struct ata_smart_errorlog data){
QUIETON; QUIETON;
// if log pointer out of range, return // if log pointer out of range, return
if ( data.error_log_pointer>5 ){ if ( data.error_log_pointer>5 ){
pout("Invalid Error log index = %02x (T13/1321D rev 1c" pout("Invalid Error Log index = %02x (T13/1321D rev 1c"
"Section 8.41.6.8.2.2 gives valid range from 1 to 5)\n\n", "Section 8.41.6.8.2.2 gives valid range from 1 to 5)\n\n",
data.error_log_pointer); data.error_log_pointer);
return; return;
...@@ -522,11 +522,11 @@ void ataPrintSmartErrorlog (struct ata_smart_errorlog data){ ...@@ -522,11 +522,11 @@ void ataPrintSmartErrorlog (struct ata_smart_errorlog data){
// starting printing error log info // starting printing error log info
if (data.ata_error_count<=5) if (data.ata_error_count<=5)
pout ( "ATA Error Count:y %u\n", data.ata_error_count); pout ( "ATA Error Count: %u\n", data.ata_error_count);
else else
pout ( "ATA Error Count: %u (only the most recent five errors are shown below)\n", pout ( "ATA Error Count: %u (device log contains only the most recent five errors)\n",
data.ata_error_count); data.ata_error_count);
QUIETOFF;
pout("\tDCR = Device Control Register\n"); pout("\tDCR = Device Control Register\n");
pout("\tFR = Features Register\n"); pout("\tFR = Features Register\n");
pout("\tSC = Sector Count Register\n"); pout("\tSC = Sector Count Register\n");
...@@ -557,10 +557,11 @@ void ataPrintSmartErrorlog (struct ata_smart_errorlog data){ ...@@ -557,10 +557,11 @@ void ataPrintSmartErrorlog (struct ata_smart_errorlog data){
case 0x04: msgstate="doing SMART off-line or self test"; break; case 0x04: msgstate="doing SMART off-line or self test"; break;
default: msgstate="in a vendor specific or reserved state"; default: msgstate="in a vendor specific or reserved state";
} }
pout("Error Log Structure %i:\n",5-k);
// See table 42 of ATA5 spec // See table 42 of ATA5 spec
pout("Error occurred at disk power-on lifetime: %u hours\n", QUIETON;
data.errorlog_struct[i].error_struct.timestamp); pout("Error %i occurred at disk power-on lifetime: %u hours\n",
5-k,data.errorlog_struct[i].error_struct.timestamp);
QUIETOFF;
pout("When the command that caused the error occurred, the device was %s.\n",msgstate); pout("When the command that caused the error occurred, the device was %s.\n",msgstate);
pout("After command completion occurred, registers were:\n"); pout("After command completion occurred, registers were:\n");
pout("ER:%02x SC:%02x SN:%02x CL:%02x CH:%02x D/H:%02x ST:%02x\n", pout("ER:%02x SC:%02x SN:%02x CL:%02x CH:%02x D/H:%02x ST:%02x\n",
...@@ -593,6 +594,9 @@ void ataPrintSmartErrorlog (struct ata_smart_errorlog data){ ...@@ -593,6 +594,9 @@ void ataPrintSmartErrorlog (struct ata_smart_errorlog data){
pout("\n"); pout("\n");
} }
} }
QUIETON;
if (quietmode)
pout("\n");
QUIETOFF; QUIETOFF;
return; return;
} }
...@@ -666,6 +670,8 @@ int ataPrintSmartSelfTestlog (struct ata_smart_selftestlog data,int allentries){ ...@@ -666,6 +670,8 @@ int ataPrintSmartSelfTestlog (struct ata_smart_selftestlog data,int allentries){
percent,log->timestamp,firstlba); percent,log->timestamp,firstlba);
} }
} }
if (!allentries && retval)
pout("\n");
return retval; return retval;
} }
...@@ -952,12 +958,11 @@ int ataPrintMain (int fd){ ...@@ -952,12 +958,11 @@ int ataPrintMain (int fd){
"Drive failure expected in less than 24 hours. SAVE ALL DATA.\n"); "Drive failure expected in less than 24 hours. SAVE ALL DATA.\n");
QUIETOFF; QUIETOFF;
if (ataCheckSmart(smartval, smartthres,1)){ if (ataCheckSmart(smartval, smartthres,1)){
QUIETON;
returnval|=FAILATTR; returnval|=FAILATTR;
if (smartvendorattrib) if (smartvendorattrib)
pout("See vendor-specific Attribute list for failed Attributes.\n\n"); pout("See vendor-specific Attribute list for failed Attributes.\n\n");
else else {
{ QUIETON;
pout("Failed Attributes:\n"); pout("Failed Attributes:\n");
PrintSmartAttribWithThres(smartval, smartthres,1); PrintSmartAttribWithThres(smartval, smartthres,1);
} }
...@@ -970,10 +975,10 @@ int ataPrintMain (int fd){ ...@@ -970,10 +975,10 @@ int ataPrintMain (int fd){
else { else {
pout("SMART overall-health self-assessment test result: PASSED\n"); pout("SMART overall-health self-assessment test result: PASSED\n");
if (ataCheckSmart(smartval, smartthres,0)){ if (ataCheckSmart(smartval, smartthres,0)){
QUIETON;
if (smartvendorattrib) if (smartvendorattrib)
pout("See vendor-specific Attribute list for marginal Attributes.\n\n"); pout("See vendor-specific Attribute list for marginal Attributes.\n\n");
else { else {
QUIETON;
pout("Please note the following marginal attributes:\n"); pout("Please note the following marginal attributes:\n");
PrintSmartAttribWithThres(smartval, smartthres,2); PrintSmartAttribWithThres(smartval, smartthres,2);
} }
......
...@@ -28,7 +28,7 @@ ...@@ -28,7 +28,7 @@
#include "smartctl.h" #include "smartctl.h"
#include "extern.h" #include "extern.h"
const char *CVSid4="$Id: ataprint.cpp,v 1.31 2002/10/24 07:50:45 ballen4705 Exp $" const char *CVSid4="$Id: ataprint.cpp,v 1.32 2002/10/24 08:46:03 ballen4705 Exp $"
CVSID2 CVSID3 CVSID6; CVSID2 CVSID3 CVSID6;
// Function for printing ASCII byte-swapped strings, skipping white // Function for printing ASCII byte-swapped strings, skipping white
...@@ -514,7 +514,7 @@ void ataPrintSmartErrorlog (struct ata_smart_errorlog data){ ...@@ -514,7 +514,7 @@ void ataPrintSmartErrorlog (struct ata_smart_errorlog data){
QUIETON; QUIETON;
// if log pointer out of range, return // if log pointer out of range, return
if ( data.error_log_pointer>5 ){ if ( data.error_log_pointer>5 ){
pout("Invalid Error log index = %02x (T13/1321D rev 1c" pout("Invalid Error Log index = %02x (T13/1321D rev 1c"
"Section 8.41.6.8.2.2 gives valid range from 1 to 5)\n\n", "Section 8.41.6.8.2.2 gives valid range from 1 to 5)\n\n",
data.error_log_pointer); data.error_log_pointer);
return; return;
...@@ -522,11 +522,11 @@ void ataPrintSmartErrorlog (struct ata_smart_errorlog data){ ...@@ -522,11 +522,11 @@ void ataPrintSmartErrorlog (struct ata_smart_errorlog data){
// starting printing error log info // starting printing error log info
if (data.ata_error_count<=5) if (data.ata_error_count<=5)
pout ( "ATA Error Count:y %u\n", data.ata_error_count); pout ( "ATA Error Count: %u\n", data.ata_error_count);
else else
pout ( "ATA Error Count: %u (only the most recent five errors are shown below)\n", pout ( "ATA Error Count: %u (device log contains only the most recent five errors)\n",
data.ata_error_count); data.ata_error_count);
QUIETOFF;
pout("\tDCR = Device Control Register\n"); pout("\tDCR = Device Control Register\n");
pout("\tFR = Features Register\n"); pout("\tFR = Features Register\n");
pout("\tSC = Sector Count Register\n"); pout("\tSC = Sector Count Register\n");
...@@ -557,10 +557,11 @@ void ataPrintSmartErrorlog (struct ata_smart_errorlog data){ ...@@ -557,10 +557,11 @@ void ataPrintSmartErrorlog (struct ata_smart_errorlog data){
case 0x04: msgstate="doing SMART off-line or self test"; break; case 0x04: msgstate="doing SMART off-line or self test"; break;
default: msgstate="in a vendor specific or reserved state"; default: msgstate="in a vendor specific or reserved state";
} }
pout("Error Log Structure %i:\n",5-k);
// See table 42 of ATA5 spec // See table 42 of ATA5 spec
pout("Error occurred at disk power-on lifetime: %u hours\n", QUIETON;
data.errorlog_struct[i].error_struct.timestamp); pout("Error %i occurred at disk power-on lifetime: %u hours\n",
5-k,data.errorlog_struct[i].error_struct.timestamp);
QUIETOFF;
pout("When the command that caused the error occurred, the device was %s.\n",msgstate); pout("When the command that caused the error occurred, the device was %s.\n",msgstate);
pout("After command completion occurred, registers were:\n"); pout("After command completion occurred, registers were:\n");
pout("ER:%02x SC:%02x SN:%02x CL:%02x CH:%02x D/H:%02x ST:%02x\n", pout("ER:%02x SC:%02x SN:%02x CL:%02x CH:%02x D/H:%02x ST:%02x\n",
...@@ -593,6 +594,9 @@ void ataPrintSmartErrorlog (struct ata_smart_errorlog data){ ...@@ -593,6 +594,9 @@ void ataPrintSmartErrorlog (struct ata_smart_errorlog data){
pout("\n"); pout("\n");
} }
} }
QUIETON;
if (quietmode)
pout("\n");
QUIETOFF; QUIETOFF;
return; return;
} }
...@@ -666,6 +670,8 @@ int ataPrintSmartSelfTestlog (struct ata_smart_selftestlog data,int allentries){ ...@@ -666,6 +670,8 @@ int ataPrintSmartSelfTestlog (struct ata_smart_selftestlog data,int allentries){
percent,log->timestamp,firstlba); percent,log->timestamp,firstlba);
} }
} }
if (!allentries && retval)
pout("\n");
return retval; return retval;
} }
...@@ -952,12 +958,11 @@ int ataPrintMain (int fd){ ...@@ -952,12 +958,11 @@ int ataPrintMain (int fd){
"Drive failure expected in less than 24 hours. SAVE ALL DATA.\n"); "Drive failure expected in less than 24 hours. SAVE ALL DATA.\n");
QUIETOFF; QUIETOFF;
if (ataCheckSmart(smartval, smartthres,1)){ if (ataCheckSmart(smartval, smartthres,1)){
QUIETON;
returnval|=FAILATTR; returnval|=FAILATTR;
if (smartvendorattrib) if (smartvendorattrib)
pout("See vendor-specific Attribute list for failed Attributes.\n\n"); pout("See vendor-specific Attribute list for failed Attributes.\n\n");
else else {
{ QUIETON;
pout("Failed Attributes:\n"); pout("Failed Attributes:\n");
PrintSmartAttribWithThres(smartval, smartthres,1); PrintSmartAttribWithThres(smartval, smartthres,1);
} }
...@@ -970,10 +975,10 @@ int ataPrintMain (int fd){ ...@@ -970,10 +975,10 @@ int ataPrintMain (int fd){
else { else {
pout("SMART overall-health self-assessment test result: PASSED\n"); pout("SMART overall-health self-assessment test result: PASSED\n");
if (ataCheckSmart(smartval, smartthres,0)){ if (ataCheckSmart(smartval, smartthres,0)){
QUIETON;
if (smartvendorattrib) if (smartvendorattrib)
pout("See vendor-specific Attribute list for marginal Attributes.\n\n"); pout("See vendor-specific Attribute list for marginal Attributes.\n\n");
else { else {
QUIETON;
pout("Please note the following marginal attributes:\n"); pout("Please note the following marginal attributes:\n");
PrintSmartAttribWithThres(smartval, smartthres,2); PrintSmartAttribWithThres(smartval, smartthres,2);
} }
......
\# Copyright (C) 2002 Bruce Allen <smartmontools-support@lists.sourceforge.net> \# Copyright (C) 2002 Bruce Allen <smartmontools-support@lists.sourceforge.net>
\# \#
\# $Id: smartctl.8,v 1.17 2002/10/24 07:50:45 ballen4705 Exp $ \# $Id: smartctl.8,v 1.18 2002/10/24 08:46:03 ballen4705 Exp $
\# \#
\# This program is free software; you can redistribute it and/or modify it \# This program is free software; you can redistribute it and/or modify it
\# under the terms of the GNU General Public License as published by the Free \# under the terms of the GNU General Public License as published by the Free
...@@ -15,9 +15,9 @@ ...@@ -15,9 +15,9 @@
\# at the Concurrent Systems Laboratory (now part of the Storage Systems \# at the Concurrent Systems Laboratory (now part of the Storage Systems
\# Research Center), Jack Baskin School of Engineering, University of \# Research Center), Jack Baskin School of Engineering, University of
\# California, Santa Cruz. http://ssrc.soe.ucsc.edu/ \# California, Santa Cruz. http://ssrc.soe.ucsc.edu/
.TH SMARTCTL 8 "$Date: 2002/10/24 07:50:45 $" "smartmontools-5.0" .TH SMARTCTL 8 "$Date: 2002/10/24 08:46:03 $" "smartmontools-5.0"
.SH NAME .SH NAME
smartctl \- S.M.A.R.T. control utility smartctl \- S.M.A.R.T. control and monitor utility
.SH SYNOPSIS .SH SYNOPSIS
.B smartctl \-[ViqQaedtTfFcgvlLm[O|S|s|X|x|A]] device .B smartctl \-[ViqQaedtTfFcgvlLm[O|S|s|X|x|A]] device
...@@ -86,12 +86,14 @@ Says if the device supports S.M.A.R.T., and if so, whether ...@@ -86,12 +86,14 @@ Says if the device supports S.M.A.R.T., and if so, whether
S.M.A.R.T. support is currently enabled or disabled. S.M.A.R.T. support is currently enabled or disabled.
.TP .TP
.B q .B q
Quiet mode: Only print: For the '\-l' option, errors recorded in the Quiet mode: Only print: For the '\-l' option, just the number of
SMART error log; For the '\-L' option, errors recorded in the device errors recorded in the SMART error log and the power-on time when they
self-test log; For the '\-c' SMART "disk failing" status or device occured, if any errors are recorded; For the '\-L' option, errors
recorded in the device self-test log; For the '\-c' SMART "disk
failing" status or device attributes (pre-failure or usage) which
failed either now or in the past; For the '\-v' option device
attributes (pre-failure or usage) which failed either now or in the attributes (pre-failure or usage) which failed either now or in the
past; For the '\-v' option device attributes (pre-failure or usage) past.
which failed either now or in the past.
.TP .TP
.B Q .B Q
Very Quiet mode: Print no ouput. The only way to learn about what was Very Quiet mode: Print no ouput. The only way to learn about what was
...@@ -440,4 +442,4 @@ Please let us know if there is an on\-line source for this document. ...@@ -440,4 +442,4 @@ Please let us know if there is an on\-line source for this document.
.SH .SH
CVS ID OF THIS PAGE: CVS ID OF THIS PAGE:
$Id: smartctl.8,v 1.17 2002/10/24 07:50:45 ballen4705 Exp $ $Id: smartctl.8,v 1.18 2002/10/24 08:46:03 ballen4705 Exp $
...@@ -38,7 +38,7 @@ ...@@ -38,7 +38,7 @@
#include "scsiprint.h" #include "scsiprint.h"
extern const char *CVSid1, *CVSid2, *CVSid4, *CVSid5; extern const char *CVSid1, *CVSid2, *CVSid4, *CVSid5;
const char* CVSid6="$Id: smartctl.c,v 1.17 2002/10/23 20:36:59 ballen4705 Exp $" const char* CVSid6="$Id: smartctl.c,v 1.18 2002/10/24 08:46:03 ballen4705 Exp $"
CVSID1 CVSID2 CVSID4 CVSID5 CVSID6; CVSID1 CVSID2 CVSID4 CVSID5 CVSID6;
unsigned char driveinfo = FALSE; unsigned char driveinfo = FALSE;
...@@ -211,10 +211,8 @@ void ParseOpts (int argc, char** argv){ ...@@ -211,10 +211,8 @@ void ParseOpts (int argc, char** argv){
switch (optchar){ switch (optchar){
case QUIETMODE: case QUIETMODE:
quietmode=TRUE; quietmode=TRUE;
veryquietmode=TRUE;
break; break;
case VERYQUIETMODE: case VERYQUIETMODE:
quietmode=FALSE;
veryquietmode=TRUE; veryquietmode=TRUE;
break; break;
case SMART009MINUTES: case SMART009MINUTES:
...@@ -299,6 +297,10 @@ void ParseOpts (int argc, char** argv){ ...@@ -299,6 +297,10 @@ void ParseOpts (int argc, char** argv){
exit(FAILCMD); exit(FAILCMD);
} }
} }
// Do this here, so results are independent of argument order
if (quietmode)
veryquietmode=TRUE;
// error message if user has asked for more than one test // error message if user has asked for more than one test
if (1<(smartexeoffimmediate+smartshortselftest+smartextendselftest+ if (1<(smartexeoffimmediate+smartshortselftest+smartextendselftest+
smartshortcapselftest+smartextendcapselftest+smartselftestabort)){ smartshortcapselftest+smartextendcapselftest+smartselftestabort)){
......
...@@ -38,7 +38,7 @@ ...@@ -38,7 +38,7 @@
#include "scsiprint.h" #include "scsiprint.h"
extern const char *CVSid1, *CVSid2, *CVSid4, *CVSid5; extern const char *CVSid1, *CVSid2, *CVSid4, *CVSid5;
const char* CVSid6="$Id: smartctl.cpp,v 1.17 2002/10/23 20:36:59 ballen4705 Exp $" const char* CVSid6="$Id: smartctl.cpp,v 1.18 2002/10/24 08:46:03 ballen4705 Exp $"
CVSID1 CVSID2 CVSID4 CVSID5 CVSID6; CVSID1 CVSID2 CVSID4 CVSID5 CVSID6;
unsigned char driveinfo = FALSE; unsigned char driveinfo = FALSE;
...@@ -211,10 +211,8 @@ void ParseOpts (int argc, char** argv){ ...@@ -211,10 +211,8 @@ void ParseOpts (int argc, char** argv){
switch (optchar){ switch (optchar){
case QUIETMODE: case QUIETMODE:
quietmode=TRUE; quietmode=TRUE;
veryquietmode=TRUE;
break; break;
case VERYQUIETMODE: case VERYQUIETMODE:
quietmode=FALSE;
veryquietmode=TRUE; veryquietmode=TRUE;
break; break;
case SMART009MINUTES: case SMART009MINUTES:
...@@ -299,6 +297,10 @@ void ParseOpts (int argc, char** argv){ ...@@ -299,6 +297,10 @@ void ParseOpts (int argc, char** argv){
exit(FAILCMD); exit(FAILCMD);
} }
} }
// Do this here, so results are independent of argument order
if (quietmode)
veryquietmode=TRUE;
// error message if user has asked for more than one test // error message if user has asked for more than one test
if (1<(smartexeoffimmediate+smartshortselftest+smartextendselftest+ if (1<(smartexeoffimmediate+smartshortselftest+smartextendselftest+
smartshortcapselftest+smartextendcapselftest+smartselftestabort)){ smartshortcapselftest+smartextendcapselftest+smartselftestabort)){
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment