mirror of
https://git.proxmox.com/git/mirror_smartmontools-debian
synced 2025-08-07 03:29:56 +00:00
Imported Upstream version 5.42+svn3521
This commit is contained in:
parent
a7e8ffec30
commit
d008864df4
441
CHANGELOG
441
CHANGELOG
@ -1,6 +1,6 @@
|
|||||||
CHANGELOG for smartmontools
|
CHANGELOG for smartmontools
|
||||||
|
|
||||||
$Id: CHANGELOG 3365 2011-06-09 18:47:31Z chrfranke $
|
$Id: CHANGELOG 3521 2012-03-06 21:15:25Z chrfranke $
|
||||||
|
|
||||||
The most recent version of this file is:
|
The most recent version of this file is:
|
||||||
http://smartmontools.svn.sourceforge.net/viewvc/smartmontools/trunk/smartmontools/CHANGELOG?view=markup
|
http://smartmontools.svn.sourceforge.net/viewvc/smartmontools/trunk/smartmontools/CHANGELOG?view=markup
|
||||||
@ -41,6 +41,445 @@ Maintainers / Developers Key (alphabetic order):
|
|||||||
|
|
||||||
<DEVELOPERS: ADDITIONS TO THE CHANGE LOG GO JUST BELOW HERE, PLEASE>
|
<DEVELOPERS: ADDITIONS TO THE CHANGE LOG GO JUST BELOW HERE, PLEASE>
|
||||||
|
|
||||||
|
[CF] Windows: Add Win8 to get_os_version_str().
|
||||||
|
|
||||||
|
[CF] Windows: Remove MSVC specific pragma, disable warning in project file.
|
||||||
|
|
||||||
|
[CF] Add '-d sat,auto[,N]' option for controller independent SAT detection.
|
||||||
|
|
||||||
|
[CF] dev_interface.h: Replace this_is_ata/scsi(*) by hide_ata/scsi(bool).
|
||||||
|
|
||||||
|
[CF] smartctl: Allow '-d test' in conjunction with other '-d TYPE' options.
|
||||||
|
|
||||||
|
[AS] FreeBSD: sync init script with one from ports repository.
|
||||||
|
|
||||||
|
[CF] drivedb.h updates:
|
||||||
|
- SandForce Driven SSDs: ADATA S510
|
||||||
|
- JMicron based SSDs: Toshiba THNSNC128GMLJ
|
||||||
|
- Samsung based SSDs: 830 Series
|
||||||
|
- Hitachi Deskstar E7K1000
|
||||||
|
- Hitachi Ultrastar A7K1000: Fix name, allow trailing characters
|
||||||
|
- Hitachi Ultrastar A7K2000: Remove duplicate entry
|
||||||
|
- Toshiba 2.5" HDD MK..55GSX
|
||||||
|
- Western Digital AV-GP: WD..EURS variants
|
||||||
|
|
||||||
|
[CF] drivedb.h USB updates:
|
||||||
|
- Buffalo MiniStation HD-PCTU2 (0x0411:0x01d9) (ticket #211)
|
||||||
|
- Philips SDE3273VC/97 (0x0471:0x2021) (ticket #212)
|
||||||
|
- Samsung M2 Portable 3.0 (0x04e8:0x60c5)
|
||||||
|
- Iomega GDHDU2 (0x059b:0x0475)
|
||||||
|
- LaCie minimus USB 3.0 (0x059f:0x104a)
|
||||||
|
- Seagate FreeAgent GoFlex Desk USB 3.0 (0x0bc2:0x50a5)
|
||||||
|
- Maxtor BlackArmor Portable (0x0d49:0x7550)
|
||||||
|
- WD My Passport Essential SE USB 3.0 (0x1058:0x0742)
|
||||||
|
- Initio (0x13fd:0x1e40)
|
||||||
|
- Verbatim External Hard Drive 2TB (0x18a5:0x022a)
|
||||||
|
- Hitachi Touro Desk (0x4971:0x1011)
|
||||||
|
|
||||||
|
[CF] smartd: Add smartd.conf directive '-e' to set ATA settings on
|
||||||
|
startup: aam, apm, lookahead, security-freeze, standby, wcache.
|
||||||
|
|
||||||
|
[CF] drivedb.h updates:
|
||||||
|
- SandForce Driven SSDs: Corsair Force GT
|
||||||
|
- Indilinx Barefoot based SSDs: Corsair Nova
|
||||||
|
- SAMSUNG SpinPoint M8
|
||||||
|
- Seagate SV35.5
|
||||||
|
|
||||||
|
[CF] smartctl: Change short option for '--set' from '-e' to '-s'.
|
||||||
|
Keep backward compatibility with short option for '--smart'.
|
||||||
|
|
||||||
|
[CF] smartctl: Print description of APM level.
|
||||||
|
|
||||||
|
[CF] smartctl: Add option '-e standby,[N|off|now]' to set standby timer
|
||||||
|
or standby mode.
|
||||||
|
|
||||||
|
[CF] smartctl: Add options '-g security' and '-e security-freeze' to
|
||||||
|
get/freeze ATA security settings.
|
||||||
|
|
||||||
|
[CF] smartctl: Add options '-g/e lookahead' and '-g/e wcache' to get/set
|
||||||
|
read look-ahead and write cache feature.
|
||||||
|
|
||||||
|
[CF] smartctl: Add options '-g aam' and '-e aam,[N|off]' to get/set
|
||||||
|
ATA Automatic Acoustic Management feature. Add '-g all'.
|
||||||
|
|
||||||
|
[CF] os_win32.cpp: Prevent warnings from gcc option -Wformat-security.
|
||||||
|
|
||||||
|
[CF] smartctl: Add options '-g, --get apm' and '-e, --set apm,[N|off]'
|
||||||
|
to get/set ATA Advanced Power Management feature.
|
||||||
|
Original patch was provided by Marcus Sorensen.
|
||||||
|
|
||||||
|
[AS] os_freebsd.cpp - do not skip ATA devices from cam list. Starting from
|
||||||
|
FreeBSD 9.0 such devices are exported ONLY as camdev`s, so DEVICESCAN
|
||||||
|
was broken. Its possible to get duplicates now on some old systems.
|
||||||
|
|
||||||
|
[CF] drivedb.h updates:
|
||||||
|
- SandForce Driven SSDs: Add OCZ Solid 3, OCZ Deneva 2 C/R
|
||||||
|
- Seagate Momentus 5400.7
|
||||||
|
|
||||||
|
[CF] Happy New Year! Update copyright year in version info.
|
||||||
|
|
||||||
|
[CF] drivedb.h updates:
|
||||||
|
- SandForce Driven SSDs: Add Patriot Pyro
|
||||||
|
- Intel 320 Series SSDs: Fix 40GB
|
||||||
|
- Seagate Barracuda XT: Add 4TB
|
||||||
|
|
||||||
|
[CF] drivedb.h updates:
|
||||||
|
- SandForce Driven SSDs: Add Corsair Force 3
|
||||||
|
- Hitachi Travelstar 5K320: Add SA00 and SA02 models
|
||||||
|
- Western Digital Caviar SE SATA: Add 300GB
|
||||||
|
|
||||||
|
[CF] Cygwin smartd: Remove SIGQUIT workaround, no longer needed with
|
||||||
|
current Cygwin tty emulation.
|
||||||
|
|
||||||
|
[CF] smartd: Disable auto standby also after start of scheduled
|
||||||
|
self-test.
|
||||||
|
|
||||||
|
[CF] smartd: Add smartd.conf DEFAULT directive. Allows to set default
|
||||||
|
settings for multiple devices.
|
||||||
|
|
||||||
|
[CF] smartd: Re-enable auto standby if smartd.conf is re-read.
|
||||||
|
|
||||||
|
[AS] drivedb.h update: Seagate Barracuda (SATA 3Gb/s, 4K Sectors)
|
||||||
|
|
||||||
|
[AS] drivedb.h update: Seagate Constellation ES.2 (SATA 6Gb/s)
|
||||||
|
|
||||||
|
[CF] drivedb.h updates:
|
||||||
|
- Sandforce Driven SSDs: Add OCZ Vertex 3 Max IOPS (ticket #209)
|
||||||
|
- Seagate ST1.2 CompactFlash (found in ticket #125)
|
||||||
|
|
||||||
|
[CF] Fix GPL version reported by '-V' option.
|
||||||
|
Now reports GPLv2+ which is consistent with file headers.
|
||||||
|
Patch was provided by Stanislav Brabec.
|
||||||
|
|
||||||
|
[CF] drivedb.h updates:
|
||||||
|
- Sandforce Driven SSDs: Add OCZ Deneva 2 Async variant, 60GB, 480GB
|
||||||
|
- Indilinx Martini based SSDs: OCZ VERTEX-PLUS only
|
||||||
|
|
||||||
|
[CF] smartd: Add '-l offlinests,ns' and '-l selfteststs,ns' directives.
|
||||||
|
dev_interface: Add smart_interface::disable_system_auto_standby().
|
||||||
|
os_win32.cpp: Implement disable_system_auto_standby().
|
||||||
|
|
||||||
|
[CF] dev_interface: Let smart_interface::set_err() return false.
|
||||||
|
|
||||||
|
[CF] drivedb.h updates:
|
||||||
|
- SAMSUNG SpinPoint M8U (USB)
|
||||||
|
- Toshiba 3.5" HDD MKx002TSKB: Fix typo
|
||||||
|
|
||||||
|
[CF] smartctl: Print average temperature from SCT status only if
|
||||||
|
value is reasonable. Field is not part of ATA-8.
|
||||||
|
|
||||||
|
[CF] smartd: Report ignored '-r' and '-R' directives.
|
||||||
|
|
||||||
|
[CF] smartctl: Use 16-bit value (ATA-8) for extended self-test polling
|
||||||
|
time if 8-bit value is 0xff (ticket #207).
|
||||||
|
|
||||||
|
[CF] drivedb.h updates:
|
||||||
|
- SandForce Driven SSDs: Add OCZ-REVODRIVE3, OCZ Z-DRIVE R4
|
||||||
|
- Hitachi Travelstar Z7K320
|
||||||
|
- Toshiba 2.5" HDD MK..56GSY
|
||||||
|
- Toshiba 2.5" HDD MKx002TSKB
|
||||||
|
- Seagate U9
|
||||||
|
- Seagate U*: sort entries, unify names, remove duplicate
|
||||||
|
- Seagate Constellation ES (SATA 6Gb/s)
|
||||||
|
- Seagate DB35
|
||||||
|
- Seagate DB35.2
|
||||||
|
- Western Digital Scorpio Black: Add 500GB
|
||||||
|
- Western Digital Scorpio Black (Adv. Format)
|
||||||
|
|
||||||
|
[CF] drivedb.h USB updates:
|
||||||
|
- Samsung S2 (0x04e8:0x1f05)
|
||||||
|
- Toshiba Stor.E (0x0939:0x0b16) (ticket #206)
|
||||||
|
- Seagate FreeAgent (0x0bc2:0x5040)
|
||||||
|
- Initio/Thermaltake BlacX (0x13fd:0x0840)
|
||||||
|
|
||||||
|
[DG] [SCSI] smartd: skip non-storage devices (e.g. SES devices)
|
||||||
|
|
||||||
|
[AS] drivedb.h updates: Added Seagate SV35 Series
|
||||||
|
|
||||||
|
[CF] smartctl: Don't start ATA self-test if another test is already
|
||||||
|
running (ticket #40). Add option '-t force' to allow override.
|
||||||
|
|
||||||
|
[CF] atacmds.h: Remove bogus ataSmart*Test*() prototypes.
|
||||||
|
|
||||||
|
[CF] Define __attribute_format_printf() for functions with printf() style
|
||||||
|
arguments. Allow MinGW build with __USE_MINGW_ANSI_STDIO enabled.
|
||||||
|
|
||||||
|
[CF] Makefile.am: Replace sed compound command in MAN_FILTER.
|
||||||
|
This fixes build on Solaris (ticket #203).
|
||||||
|
|
||||||
|
[AS] os_freebsd.cpp: Dereference symlinks before guess of device type
|
||||||
|
(problem reported by email).
|
||||||
|
|
||||||
|
[CF] drivedb.h USB updates:
|
||||||
|
- LG Mini HXD5 (0x043e:0x70f1)
|
||||||
|
- Freecom/Intel (0x07ab:0xfc8e)
|
||||||
|
- Dura Micro (0x0c0b:0xb001) (Debian bug 643928)
|
||||||
|
- Initio 6Y120L0 (0x13fd:0x1150): unsupported
|
||||||
|
|
||||||
|
[CF] drivedb.h USB update:
|
||||||
|
- Seagate FreeAgent GoFlex Desk USB 3.0 (0x0bc2:0x50a1):
|
||||||
|
Revert to -d sat,12 (ticket #151).
|
||||||
|
|
||||||
|
[AS] os_freebsd.cpp - fixed crash on FreeBSD9-RC1 caused by r225950
|
||||||
|
|
||||||
|
[AS] smartctl.8 - added information about -d areca on FreeBSD
|
||||||
|
|
||||||
|
[AS] os_freebsd.cpp: backport quirks for the LSI controllers with SATA
|
||||||
|
disks to the FreeBSD. Tested with DELL Perc/6i controller.
|
||||||
|
|
||||||
|
[AS] os_freebsd.cpp: disable SAT autodetection on megaraid controllers
|
||||||
|
|
||||||
|
[AS] drivedb.h update:
|
||||||
|
- Hitachi Ultrastar 7K2000
|
||||||
|
|
||||||
|
[CF] drivedb.h update:
|
||||||
|
- Seagate Momentus XT: Add bug warning for firmware SD24 and SD25
|
||||||
|
|
||||||
|
[CF] Don't include pkg-config macros in aclocal.m4, copy to m4/pkg.m4
|
||||||
|
instead. Allow builds from SVN without pkg-config installed
|
||||||
|
but prevent 'make dist' when pkg-config support is missing.
|
||||||
|
|
||||||
|
[CF] Move automake --foreign option from autogen.sh to configure.in.
|
||||||
|
This fixes autoreconf support.
|
||||||
|
|
||||||
|
[CF] Replace COPYING file with current (2010-03-24) version from
|
||||||
|
http://www.gnu.org/licenses/gpl-2.0.txt
|
||||||
|
|
||||||
|
smartmontools 5.42 2011-10-20
|
||||||
|
|
||||||
|
[CF] Windows installer: Add install dir to PATH in CMD shortcut.
|
||||||
|
|
||||||
|
[CF] drivedb.h updates:
|
||||||
|
- SAMSUNG SpinPoint MP5
|
||||||
|
- Seagate Barracuda 7200.11: Change warning text, Seagate
|
||||||
|
apparently released fixed firmware without changing version
|
||||||
|
number (Debian bug 632758)
|
||||||
|
- Western Digital RE4 GP
|
||||||
|
- Western Digital VelociRaptor: Add 150GB, 300GB LHX variants
|
||||||
|
- Western Digital Scorpio Blue Serial ATA (Adv. Format):
|
||||||
|
Add 1TB JPVT variant
|
||||||
|
|
||||||
|
[CF] drivedb.h USB update:
|
||||||
|
- WD Elements SE USB 3.0 (0x1058:0x1042)
|
||||||
|
|
||||||
|
[CF] Windows installer: Rework to support UAC.
|
||||||
|
Replace *-run.bat files by runcmd?.exe wrappers.
|
||||||
|
Run drive menu entries elevated (ticket #173).
|
||||||
|
|
||||||
|
[CF] smartctl.8.in: Add example script which prints all status bits
|
||||||
|
(ticket #191).
|
||||||
|
|
||||||
|
[CF] Cygwin smartd: Remove '--service' option, update man page.
|
||||||
|
|
||||||
|
[CF] smartd: Require absolute path name also for '-p' option.
|
||||||
|
Allow relative path names for '-A', '-s', '-p' in Windows
|
||||||
|
version only.
|
||||||
|
|
||||||
|
[CF] smartd: Log model family from drive database if known.
|
||||||
|
|
||||||
|
[CF] drivedb.h update:
|
||||||
|
- SMART Xcel-10 2.5 SATA SSD: Shorten names,
|
||||||
|
document supported default attributes.
|
||||||
|
|
||||||
|
[CF] smartctl -P showall: Report error if attribute name is too long.
|
||||||
|
|
||||||
|
[AS] freebsd: use system ciss header if available, it is added
|
||||||
|
to the base system by recent commit.
|
||||||
|
|
||||||
|
[CF] smartd.conf.5.in: Update Windows 'msgbox' info.
|
||||||
|
Add missing IF/ENDIF for Solaris and Windows.
|
||||||
|
|
||||||
|
[CF] man pages: Remove reference to T13 web site. It does no
|
||||||
|
longer provide links to the ATA documents.
|
||||||
|
|
||||||
|
[CF] smartctl: Replace '-t scttempint,N[,p]' option
|
||||||
|
by '-l scttempint,N[,p]'.
|
||||||
|
|
||||||
|
[CF] drivedb.h USB update:
|
||||||
|
- Oxford (0x0928:0x0000): unsupported, see
|
||||||
|
https://bugs.freedesktop.org/show_bug.cgi?id=24951
|
||||||
|
|
||||||
|
[CF] Minor cleanup to prevent warnings from new gcc 4.6 options
|
||||||
|
-Wunused-but-set-parameter/variable.
|
||||||
|
|
||||||
|
[CF] Windows smartd: Fix format string for 64-bit version.
|
||||||
|
|
||||||
|
[CF] Remove EXPERIMENTAL notes for features already present in 5.40.
|
||||||
|
|
||||||
|
[CF] smartctl: Add new log addresses from ACS-3 revision 1.
|
||||||
|
|
||||||
|
[CF] smartctl: Print ATA ACS-x versions properly (ticket #183).
|
||||||
|
|
||||||
|
[CF] smartctl: Add option '-l devstat[,PAGE]',
|
||||||
|
print ATA Device Statistics log pages (ticket #106).
|
||||||
|
|
||||||
|
Thanks to David Boreham for providing access to a machine for testing.
|
||||||
|
|
||||||
|
[AS] man pages: trivial man page syntax fixes (ticket #199)
|
||||||
|
|
||||||
|
[CF] drivedb.h update:
|
||||||
|
- SMART Xcel-10 2.5 SATA SSD: Fix syntax error (ticket #200)
|
||||||
|
|
||||||
|
[AS] drivedb.h update:
|
||||||
|
- SMART Xcel-10 2.5 SATA SSD
|
||||||
|
|
||||||
|
[DG] [SCSI] document 'ssd' list option in man page and smartctl usage.
|
||||||
|
|
||||||
|
[CF] Windows: Fix device type detection for Intel ICHxR RAID Volumes.
|
||||||
|
|
||||||
|
[CF] smartd: Resend warning emails if problem reappears (ticket #167).
|
||||||
|
|
||||||
|
[CF] smartd: Add separate directives '-l offlinests' and '-l selfteststs'
|
||||||
|
to enable tracking of status changes. Disable '-l offlinests' by
|
||||||
|
default to avoid misleading messages (see Debian bug 636078).
|
||||||
|
|
||||||
|
[CF] drivedb.h updates:
|
||||||
|
- Crucial/Micron RealSSD C300/C400: Add m4 series (ticket #192)
|
||||||
|
- SandForce Driven SSDs: Add OCZ-AGILITY3
|
||||||
|
- Indilinx Barefoot based SSDs: Add RENICE Z2
|
||||||
|
- Intel 710 Series SSDs
|
||||||
|
|
||||||
|
[CF] Windows smartd: Fix quoting of service command line.
|
||||||
|
|
||||||
|
[CF] Cygwin smartd: Remove FreeConsole() after fork().
|
||||||
|
No longer needed for recent versions of Cygwin DLL.
|
||||||
|
|
||||||
|
[CF] smartd: Add some sleep() time after machine standby mode.
|
||||||
|
Some drivers (Intel ICHxR Windows driver) report failures if
|
||||||
|
pass-through is accessed immediately after wake up.
|
||||||
|
|
||||||
|
[AS] -d hpt on linux/freebsd - increased max channel number to 16,
|
||||||
|
fixed documentation.
|
||||||
|
(see http://permalink.gmane.org/gmane.linux.utilities.smartmontools/7846)
|
||||||
|
|
||||||
|
[AS] os_linux.cpp - disabling SMART WRITE LOG SECTOR command on
|
||||||
|
megaraid interface for SATA disks.
|
||||||
|
|
||||||
|
[AS] os_freebsd.cpp: -l scterc was broken on FreeBSD, fixed for atacam and
|
||||||
|
ata drivers (bug #198).
|
||||||
|
|
||||||
|
[CF] drivedb.h updates:
|
||||||
|
- Crucial/Micron RealSSD C300/C400: Add C400
|
||||||
|
- SandForce Driven SSDs: Add Kingston HyperX,
|
||||||
|
OCZ-REVODRIVE, OCZ Deneva 2
|
||||||
|
- Intel X18-M/X25-M/X25-V G2 SSDs: Add 120GB
|
||||||
|
- Hitachi Travelstar 7K200: Match capital letters also
|
||||||
|
- Hitachi Ultrastar 7K3000
|
||||||
|
- Seagate Barracuda Green: Add ST2000DL001-* (ticket #195)
|
||||||
|
- WD My Passport Essential SE: Add WD10TMVW-*
|
||||||
|
|
||||||
|
[CF] drivedb.h USB updates:
|
||||||
|
- Seagate FreeAgent GoFlex USB 3.0 (0x0bc2:0x5071) (ticket #195)
|
||||||
|
- Seagate FreeAgent GoFlex Desk USB 3.0 (0x0bc2:0x50a1):
|
||||||
|
Enable -d sat,16 (ticket #151).
|
||||||
|
- Oyen Digital MiniPro USB 3.0 (0x0dc4:0x020a) (ticket #193)
|
||||||
|
- WD My Passport Essential SE USB 3.0 (0x1058:0x0740)
|
||||||
|
|
||||||
|
[CF] Windows: Add MSVC10 support, remove MSVC8 project files.
|
||||||
|
|
||||||
|
[DG] [SCSI] smartctl output Solid State Media (SSD) percentage used
|
||||||
|
endurance indicator. Add '-l ssd', useful for SATA SSDs?
|
||||||
|
|
||||||
|
[CF] atacmds.cpp: Rework search for temperature min/max values
|
||||||
|
in attributes 190/194. This fixes temperature tracking
|
||||||
|
for recent WDC drives.
|
||||||
|
|
||||||
|
[CF] drivedb.h USB updates:
|
||||||
|
- LaCie rikiki USB 3.0 (0x059f:0x1057)
|
||||||
|
- Freecom Mobile Drive XXS (0x07ab:0xfc88)
|
||||||
|
- WD Elements SE (0x1058:0x1023)
|
||||||
|
|
||||||
|
[CF] drivedb.h updates:
|
||||||
|
- Indilinx Barefoot based SSDs: Add G.Skill Falcon
|
||||||
|
- JMicron based SSDs (JMF61x): Add Kingston SSDNow V100 Series
|
||||||
|
- Transcend CompactFlash Cards: Add 8, 16GB
|
||||||
|
- Toshiba 1.8" HDD MD..29GSG
|
||||||
|
- SAMSUNG SpinPoint M7U
|
||||||
|
- Western Digital Caviar Green (Adv. Format): Add SATA 6Gb/s variants
|
||||||
|
- Western Digital My Passport USB: Shorten names
|
||||||
|
|
||||||
|
[DG] [SCSI] smartd initial log entry for each drive now shows INQUIRY
|
||||||
|
strings and optionally the LU (logical unit) id and capacity
|
||||||
|
|
||||||
|
[AS] os_freebsd.cpp: fixed return type in autodetect_smart_device.
|
||||||
|
|
||||||
|
[CF] drivedb.h USB updates:
|
||||||
|
- WD My Book Essential (0x1058:0x0910, Debian bug 633724)
|
||||||
|
- Atech (0x11b0:0x6298)
|
||||||
|
|
||||||
|
[CF] drivedb.h update:
|
||||||
|
- Seagate Barracuda ES.2: Add Dell firmware versions (ticket #189)
|
||||||
|
|
||||||
|
[CF] drivedb.h updates:
|
||||||
|
- Seagate Maxtor DiamondMax 21: Add STM380215AS
|
||||||
|
- Seagate Barracuda 7200.12: Add ST3250312AS, ST31000524AS
|
||||||
|
- Toshiba 2.5" HDD MK..50GACY
|
||||||
|
- Toshiba 2.5" HDD MK..76GSX
|
||||||
|
|
||||||
|
[AS] smartd.8 - removed configuration file information from this manual,
|
||||||
|
added reference to smartd.conf.5.
|
||||||
|
|
||||||
|
[AS] smartd.conf.5 - added more platform-specific sections, corrected "areca"
|
||||||
|
device information, corrected sample configuration.
|
||||||
|
|
||||||
|
[AS] os_freebsd.cpp: detecting access to /dev/mfidX devices to show help (#97)
|
||||||
|
|
||||||
|
[CF] Update configure options in INSTALL file, remove outdated info.
|
||||||
|
|
||||||
|
[CF] int64.h: Remove outdated uint64_to_double() workaround for MSVC6.
|
||||||
|
|
||||||
|
[CF] os_win32/update-smart-drivedb.nsi: Add support for /S(ilent) option.
|
||||||
|
|
||||||
|
[CF] configure.in: Don't search for initddir and systemdsystemunitdir
|
||||||
|
when cross-compiling.
|
||||||
|
|
||||||
|
[CF] Makefile.am: Use same syntax also for ENABLE_* man page sections.
|
||||||
|
|
||||||
|
[CF] Add experimental support for platform-specific man pages.
|
||||||
|
|
||||||
|
[CF] Windows: Move '-I os_win32' from configure.in to Makefile.am.
|
||||||
|
|
||||||
|
[CF] configure.in: Fix check for __attribute__((packed)).
|
||||||
|
|
||||||
|
[CF] drivedb.h USB update:
|
||||||
|
- Verbatim Portable Hard Drive (0x18a5:0x0214)
|
||||||
|
|
||||||
|
[CF] drivedb.h update:
|
||||||
|
- SandForce Driven SSDs: Add OWC Mercury Extreme Pro RE (ticket #168)
|
||||||
|
|
||||||
|
[CF] os_linux.cpp: Let MegaRAID autodetect_open() fail for SATA devices.
|
||||||
|
MegaRAID SAT layer has serious bugs as reported by AS.
|
||||||
|
|
||||||
|
[AS] os_freebsd.cpp: Implement 48bit support for the new "atacam"
|
||||||
|
interface. Tested on FreeBSD 8.2 and works fine.
|
||||||
|
|
||||||
|
[CF] os_win32.cpp: Fix USB ID detection if two devices with the same
|
||||||
|
name exist (ticket #178).
|
||||||
|
|
||||||
|
[AS] os_freebsd.cpp: including ciss headers to the base, we can not rely
|
||||||
|
on the header sources in the build time. Also this file was changed
|
||||||
|
last time > 2 yrs. ago and it is unlikely that it will be changed in
|
||||||
|
the feature. This will fix FreeBSD PR 150235.
|
||||||
|
|
||||||
|
[AS] drivedb.h update: Added Samsung Story Station 3.0 USB.
|
||||||
|
|
||||||
|
[AS] os_linux.cpp: Areca code converted to the new interface.
|
||||||
|
Patch is based on os_freebsd.cpp patch and is not tested yet.
|
||||||
|
|
||||||
|
[AS] os_freebsd.cpp: Areca code converted to the new interface.
|
||||||
|
|
||||||
|
[AS] os_freebsd.cpp: Added support for the Areca RAID controllers.
|
||||||
|
Support is basesd on Linux code, but using IOCTL on areca control
|
||||||
|
device instead of SCSI commands to talk with the drives. Hardware
|
||||||
|
access was provided by Andrej Binder.
|
||||||
|
|
||||||
|
[CF] Don't use isprint() for ASCII character check as it may be affected
|
||||||
|
by setlocale().
|
||||||
|
|
||||||
|
[AS] os_freebsd.cpp: Remove all referenced to the FreeBSD 5.0.
|
||||||
|
It is unsupported for a very long time and probably will not compile
|
||||||
|
and work anyway. Also this will fix bug #154.
|
||||||
|
|
||||||
smartmontools 5.41 2011-06-09
|
smartmontools 5.41 2011-06-09
|
||||||
|
|
||||||
[MS] drivedb.h: revert attribute 190 to default for Samsung SSD controllers,
|
[MS] drivedb.h: revert attribute 190 to default for Samsung SSD controllers,
|
||||||
|
41
COPYING
41
COPYING
@ -1,12 +1,12 @@
|
|||||||
GNU GENERAL PUBLIC LICENSE
|
GNU GENERAL PUBLIC LICENSE
|
||||||
Version 2, June 1991
|
Version 2, June 1991
|
||||||
|
|
||||||
Copyright (C) 1989, 1991 Free Software Foundation, Inc.
|
Copyright (C) 1989, 1991 Free Software Foundation, Inc.,
|
||||||
59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
||||||
Everyone is permitted to copy and distribute verbatim copies
|
Everyone is permitted to copy and distribute verbatim copies
|
||||||
of this license document, but changing it is not allowed.
|
of this license document, but changing it is not allowed.
|
||||||
|
|
||||||
Preamble
|
Preamble
|
||||||
|
|
||||||
The licenses for most software are designed to take away your
|
The licenses for most software are designed to take away your
|
||||||
freedom to share and change it. By contrast, the GNU General Public
|
freedom to share and change it. By contrast, the GNU General Public
|
||||||
@ -15,7 +15,7 @@ software--to make sure the software is free for all its users. This
|
|||||||
General Public License applies to most of the Free Software
|
General Public License applies to most of the Free Software
|
||||||
Foundation's software and to any other program whose authors commit to
|
Foundation's software and to any other program whose authors commit to
|
||||||
using it. (Some other Free Software Foundation software is covered by
|
using it. (Some other Free Software Foundation software is covered by
|
||||||
the GNU Library General Public License instead.) You can apply it to
|
the GNU Lesser General Public License instead.) You can apply it to
|
||||||
your programs, too.
|
your programs, too.
|
||||||
|
|
||||||
When we speak of free software, we are referring to freedom, not
|
When we speak of free software, we are referring to freedom, not
|
||||||
@ -55,8 +55,8 @@ patent must be licensed for everyone's free use or not licensed at all.
|
|||||||
|
|
||||||
The precise terms and conditions for copying, distribution and
|
The precise terms and conditions for copying, distribution and
|
||||||
modification follow.
|
modification follow.
|
||||||
|
|
||||||
GNU GENERAL PUBLIC LICENSE
|
GNU GENERAL PUBLIC LICENSE
|
||||||
TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
|
TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
|
||||||
|
|
||||||
0. This License applies to any program or other work which contains
|
0. This License applies to any program or other work which contains
|
||||||
@ -110,7 +110,7 @@ above, provided that you also meet all of these conditions:
|
|||||||
License. (Exception: if the Program itself is interactive but
|
License. (Exception: if the Program itself is interactive but
|
||||||
does not normally print such an announcement, your work based on
|
does not normally print such an announcement, your work based on
|
||||||
the Program is not required to print an announcement.)
|
the Program is not required to print an announcement.)
|
||||||
|
|
||||||
These requirements apply to the modified work as a whole. If
|
These requirements apply to the modified work as a whole. If
|
||||||
identifiable sections of that work are not derived from the Program,
|
identifiable sections of that work are not derived from the Program,
|
||||||
and can be reasonably considered independent and separate works in
|
and can be reasonably considered independent and separate works in
|
||||||
@ -168,7 +168,7 @@ access to copy from a designated place, then offering equivalent
|
|||||||
access to copy the source code from the same place counts as
|
access to copy the source code from the same place counts as
|
||||||
distribution of the source code, even though third parties are not
|
distribution of the source code, even though third parties are not
|
||||||
compelled to copy the source along with the object code.
|
compelled to copy the source along with the object code.
|
||||||
|
|
||||||
4. You may not copy, modify, sublicense, or distribute the Program
|
4. You may not copy, modify, sublicense, or distribute the Program
|
||||||
except as expressly provided under this License. Any attempt
|
except as expressly provided under this License. Any attempt
|
||||||
otherwise to copy, modify, sublicense or distribute the Program is
|
otherwise to copy, modify, sublicense or distribute the Program is
|
||||||
@ -225,7 +225,7 @@ impose that choice.
|
|||||||
|
|
||||||
This section is intended to make thoroughly clear what is believed to
|
This section is intended to make thoroughly clear what is believed to
|
||||||
be a consequence of the rest of this License.
|
be a consequence of the rest of this License.
|
||||||
|
|
||||||
8. If the distribution and/or use of the Program is restricted in
|
8. If the distribution and/or use of the Program is restricted in
|
||||||
certain countries either by patents or by copyrighted interfaces, the
|
certain countries either by patents or by copyrighted interfaces, the
|
||||||
original copyright holder who places the Program under this License
|
original copyright holder who places the Program under this License
|
||||||
@ -255,7 +255,7 @@ make exceptions for this. Our decision will be guided by the two goals
|
|||||||
of preserving the free status of all derivatives of our free software and
|
of preserving the free status of all derivatives of our free software and
|
||||||
of promoting the sharing and reuse of software generally.
|
of promoting the sharing and reuse of software generally.
|
||||||
|
|
||||||
NO WARRANTY
|
NO WARRANTY
|
||||||
|
|
||||||
11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
|
11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
|
||||||
FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
|
FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
|
||||||
@ -277,9 +277,9 @@ YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
|
|||||||
PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
|
PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
|
||||||
POSSIBILITY OF SUCH DAMAGES.
|
POSSIBILITY OF SUCH DAMAGES.
|
||||||
|
|
||||||
END OF TERMS AND CONDITIONS
|
END OF TERMS AND CONDITIONS
|
||||||
|
|
||||||
How to Apply These Terms to Your New Programs
|
How to Apply These Terms to Your New Programs
|
||||||
|
|
||||||
If you develop a new program, and you want it to be of the greatest
|
If you develop a new program, and you want it to be of the greatest
|
||||||
possible use to the public, the best way to achieve this is to make it
|
possible use to the public, the best way to achieve this is to make it
|
||||||
@ -303,17 +303,16 @@ the "copyright" line and a pointer to where the full notice is found.
|
|||||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
GNU General Public License for more details.
|
GNU General Public License for more details.
|
||||||
|
|
||||||
You should have received a copy of the GNU General Public License
|
You should have received a copy of the GNU General Public License along
|
||||||
along with this program; if not, write to the Free Software
|
with this program; if not, write to the Free Software Foundation, Inc.,
|
||||||
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||||
|
|
||||||
|
|
||||||
Also add information on how to contact you by electronic and paper mail.
|
Also add information on how to contact you by electronic and paper mail.
|
||||||
|
|
||||||
If the program is interactive, make it output a short notice like this
|
If the program is interactive, make it output a short notice like this
|
||||||
when it starts in an interactive mode:
|
when it starts in an interactive mode:
|
||||||
|
|
||||||
Gnomovision version 69, Copyright (C) year name of author
|
Gnomovision version 69, Copyright (C) year name of author
|
||||||
Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
|
Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
|
||||||
This is free software, and you are welcome to redistribute it
|
This is free software, and you are welcome to redistribute it
|
||||||
under certain conditions; type `show c' for details.
|
under certain conditions; type `show c' for details.
|
||||||
@ -336,5 +335,5 @@ necessary. Here is a sample; alter the names:
|
|||||||
This General Public License does not permit incorporating your program into
|
This General Public License does not permit incorporating your program into
|
||||||
proprietary programs. If your program is a subroutine library, you may
|
proprietary programs. If your program is a subroutine library, you may
|
||||||
consider it more useful to permit linking proprietary applications with the
|
consider it more useful to permit linking proprietary applications with the
|
||||||
library. If this is what you want to do, use the GNU Library General
|
library. If this is what you want to do, use the GNU Lesser General
|
||||||
Public License instead of this License.
|
Public License instead of this License.
|
||||||
|
85
INSTALL
85
INSTALL
@ -1,7 +1,7 @@
|
|||||||
Smartmontools installation instructions
|
Smartmontools installation instructions
|
||||||
=======================================
|
=======================================
|
||||||
|
|
||||||
$Id: INSTALL 3356 2011-06-06 18:37:53Z chrfranke $
|
$Id: INSTALL 3414 2011-09-09 21:07:55Z chrfranke $
|
||||||
|
|
||||||
Please also see the smartmontools home page:
|
Please also see the smartmontools home page:
|
||||||
http://smartmontools.sourceforge.net/
|
http://smartmontools.sourceforge.net/
|
||||||
@ -234,9 +234,11 @@ Table of contents:
|
|||||||
--sbindir=/usr/local/sbin
|
--sbindir=/usr/local/sbin
|
||||||
--sysconfdir=/usr/local/etc
|
--sysconfdir=/usr/local/etc
|
||||||
--mandir=/usr/local/share/man
|
--mandir=/usr/local/share/man
|
||||||
--[with-]docdir=/usr/local/share/doc/smartmontools
|
--docdir=/usr/local/share/doc/smartmontools
|
||||||
|
--with-exampledir=/usr/local/share/doc/smartmontools/examplescripts
|
||||||
--with-drivedbdir=/usr/local/share/smartmontools
|
--with-drivedbdir=/usr/local/share/smartmontools
|
||||||
--with-initscriptdir=/usr/local/etc/rc.d/init.d
|
--with-initscriptdir=auto
|
||||||
|
--with-systemdsystemunitdir=auto
|
||||||
--enable-drivedb
|
--enable-drivedb
|
||||||
--disable-attributelog
|
--disable-attributelog
|
||||||
--disable-sample
|
--disable-sample
|
||||||
@ -276,15 +278,15 @@ Filesystem Hierarchy Standard (FHS, http://www.pathname.com/fhs/):
|
|||||||
./configure --sbindir=/usr/local/sbin \
|
./configure --sbindir=/usr/local/sbin \
|
||||||
--sysconfdir=/usr/local/etc \
|
--sysconfdir=/usr/local/etc \
|
||||||
--mandir=/usr/local/man \
|
--mandir=/usr/local/man \
|
||||||
--with-initscriptdir=/usr/local/etc/rc.d/init.d \
|
--docdir=/usr/local/share/doc/smartmontools \
|
||||||
--with-docdir=/usr/local/share/doc/smartmontools-VERSION
|
--with-initscriptdir=/usr/local/etc/init.d
|
||||||
|
|
||||||
Red Hat:
|
Red Hat:
|
||||||
./configure --sbindir=/usr/sbin \
|
./configure --sbindir=/usr/sbin \
|
||||||
--sysconfdir=/etc \
|
--sysconfdir=/etc \
|
||||||
--mandir=/usr/share/man \
|
--mandir=/usr/share/man \
|
||||||
--with-initscriptdir=/etc/rc.d/init.d \
|
--docdir=/usr/share/doc/smartmontools \
|
||||||
--with-docdir=/usr/share/doc/smartmontools-VERSION
|
--with-initscriptdir=/etc/rc.d/init.d
|
||||||
|
|
||||||
Slackware:
|
Slackware:
|
||||||
If you don't want to overwrite any "distribution" package, use:
|
If you don't want to overwrite any "distribution" package, use:
|
||||||
@ -294,8 +296,8 @@ Slackware:
|
|||||||
./configure --sbindir=/usr/sbin \
|
./configure --sbindir=/usr/sbin \
|
||||||
--sysconfdir=/etc \
|
--sysconfdir=/etc \
|
||||||
--mandir=/usr/share/man \
|
--mandir=/usr/share/man \
|
||||||
--with-initscriptdir=/etc/rc.d \
|
--docdir=/usr/share/doc/smartmontools \
|
||||||
--with-docdir=/usr/share/doc/smartmontools-VERSION
|
--with-initscriptdir=/etc/rc.d
|
||||||
|
|
||||||
And
|
And
|
||||||
removepkg smartmontools smartsuite (only root can do this)
|
removepkg smartmontools smartsuite (only root can do this)
|
||||||
@ -318,8 +320,8 @@ SuSE:
|
|||||||
./configure --sbindir=/usr/sbin \
|
./configure --sbindir=/usr/sbin \
|
||||||
--sysconfdir=/etc \
|
--sysconfdir=/etc \
|
||||||
--mandir=/usr/share/man \
|
--mandir=/usr/share/man \
|
||||||
|
--docdir=/usr/share/doc/packages/smartmontools-VERSION \
|
||||||
--with-initscriptdir=/etc/init.d \
|
--with-initscriptdir=/etc/init.d \
|
||||||
--with-docdir=/usr/share/doc/packages/smartmontools-VERSION
|
|
||||||
|
|
||||||
[5] Guidelines for FreeBSD
|
[5] Guidelines for FreeBSD
|
||||||
==========================
|
==========================
|
||||||
@ -327,8 +329,8 @@ SuSE:
|
|||||||
the following:
|
the following:
|
||||||
|
|
||||||
./configure --prefix=/usr/local \
|
./configure --prefix=/usr/local \
|
||||||
|
--docdir=/usr/local/share/doc/smartmontools-VERSION \
|
||||||
--with-initscriptdir=/usr/local/etc/rc.d/ \
|
--with-initscriptdir=/usr/local/etc/rc.d/ \
|
||||||
--with-docdir=/usr/local/share/doc/smartmontools-VERSION \
|
|
||||||
--enable-sample
|
--enable-sample
|
||||||
|
|
||||||
NOTE: --enable-sample will cause the smartd.conf and smartd RC files to
|
NOTE: --enable-sample will cause the smartd.conf and smartd RC files to
|
||||||
@ -349,14 +351,10 @@ SuSE:
|
|||||||
./configure --host=i386-apple-darwin \
|
./configure --host=i386-apple-darwin \
|
||||||
--with-initscriptdir=/Library/StartupItems
|
--with-initscriptdir=/Library/StartupItems
|
||||||
|
|
||||||
[7] Guidelines for NetBSD/OpenBSD
|
[7] Guidelines for NetBSD
|
||||||
=================================
|
=========================
|
||||||
./configure --prefix=/usr/pkg \
|
./configure --prefix=/usr/pkg \
|
||||||
--with-docdir=/usr/pkg/share/doc/smartmontools
|
--docdir=/usr/pkg/share/doc/smartmontools
|
||||||
|
|
||||||
On OpenBSD, it is important that you use GNU make (gmake from
|
|
||||||
/usr/ports/devel/gmake) to build smartmontools, as the BSD make doesn't
|
|
||||||
know how to make the manpages.
|
|
||||||
|
|
||||||
[8] Guidelines for Solaris
|
[8] Guidelines for Solaris
|
||||||
==========================
|
==========================
|
||||||
@ -380,7 +378,7 @@ SuSE:
|
|||||||
--sbindir=/usr/sbin \
|
--sbindir=/usr/sbin \
|
||||||
--sysconfdir=/etc \
|
--sysconfdir=/etc \
|
||||||
--mandir=/usr/share/man \
|
--mandir=/usr/share/man \
|
||||||
--with-docdir=/usr/share/doc/smartmontools-VERSION \
|
--docdir=/usr/share/doc/smartmontools-VERSION \
|
||||||
--with-initscriptdir=/etc/init.d
|
--with-initscriptdir=/etc/init.d
|
||||||
|
|
||||||
To start the script automatically on bootup, create hardlinks that
|
To start the script automatically on bootup, create hardlinks that
|
||||||
@ -412,8 +410,8 @@ Same as Red Hat:
|
|||||||
./configure --sbindir=/usr/sbin \
|
./configure --sbindir=/usr/sbin \
|
||||||
--sysconfdir=/etc \
|
--sysconfdir=/etc \
|
||||||
--mandir=/usr/share/man \
|
--mandir=/usr/share/man \
|
||||||
--with-initscriptdir=/etc/rc.d/init.d \
|
--docdir=/usr/share/doc/smartmontools \
|
||||||
--with-docdir=/usr/share/doc/smartmontools
|
--with-initscriptdir=/etc/rc.d/init.d
|
||||||
|
|
||||||
Using DOS text file type as default for the working directories ("textmode"
|
Using DOS text file type as default for the working directories ("textmode"
|
||||||
mount option) is not recommended. Building the binaries and man pages using
|
mount option) is not recommended. Building the binaries and man pages using
|
||||||
@ -426,7 +424,7 @@ Same as Red Hat:
|
|||||||
longer accept scripts with CR/LF by default. To run the initial script
|
longer accept scripts with CR/LF by default. To run the initial script
|
||||||
./autogen.sh checked out with CR/LF on a "binmode" mount, type:
|
./autogen.sh checked out with CR/LF on a "binmode" mount, type:
|
||||||
|
|
||||||
bash -O igncr ./autogen.sh
|
bash -o igncr ./autogen.sh
|
||||||
|
|
||||||
instead. This is not necessary for the generated ./configure script.
|
instead. This is not necessary for the generated ./configure script.
|
||||||
|
|
||||||
@ -520,17 +518,17 @@ To both create and run the (interactive) installer, use:
|
|||||||
and resource compiler (windres) are available. This may be disabled
|
and resource compiler (windres) are available. This may be disabled
|
||||||
by passing 'WINDMC=no' to configure.
|
by passing 'WINDMC=no' to configure.
|
||||||
|
|
||||||
To prepare os_win32 directory for MSVC8, use the following on MSYS
|
To prepare os_win32 directory for MS Visual Studio C++ 2010 [Express],
|
||||||
or Cygwin:
|
use the following on MSYS or Cygwin:
|
||||||
|
|
||||||
mkdir vctmp && cd vctmp
|
mkdir vctmp && cd vctmp
|
||||||
../configure [... any MinGW option set from above ...]
|
../configure [... any MinGW option set from above ...]
|
||||||
make config-vc8
|
make config-vc10
|
||||||
|
|
||||||
The MSVC8 project files (os_win32/smartmontools_vc8.sln,
|
The MSVC project files (os_win32/smartmontools_vc10.sln,
|
||||||
os_win32/smart{ctl,d}_vc8.vcproj) are included in SVN (but not in
|
os_win32/smart{ctl,d}_vc10.vcxproj) are included in SVN (but not in
|
||||||
source tarball). The target config-vc8 from a Makefile configured
|
source tarball). The target config-vc10 from a Makefile configured
|
||||||
for MinGW creates os_win32/{config,svnversion}_vc8.h from
|
for MinGW creates os_win32/{config,svnversion}_vc10.h from
|
||||||
./{config,svnversion}.h. The configure skript must be run outside
|
./{config,svnversion}.h. The configure skript must be run outside
|
||||||
of the source directory to avoid inclusion of the original config.h.
|
of the source directory to avoid inclusion of the original config.h.
|
||||||
|
|
||||||
@ -545,30 +543,20 @@ To compile the OS/2 code, please run
|
|||||||
make install
|
make install
|
||||||
|
|
||||||
[12] Guidelines for OpenBSD
|
[12] Guidelines for OpenBSD
|
||||||
==========================
|
===========================
|
||||||
To match the way it will installed when it becomes available as a PORT, use
|
To match the way it will installed when it becomes available as a PORT, use
|
||||||
the following:
|
the following:
|
||||||
|
|
||||||
./configure --prefix=/usr/local \
|
./configure --prefix=/usr/local \
|
||||||
--sysconfdir=/etc
|
--sysconfdir=/etc \
|
||||||
--with-initscriptdir=/usr/local/share/doc/smartmontools-VERSION \
|
--docdir=/usr/local/share/doc/smartmontools-VERSION \
|
||||||
--with-docdir=/usr/local/share/doc/smartmontools-VERSION \
|
--without-initscriptdir \
|
||||||
--enable-sample
|
--enable-sample
|
||||||
|
|
||||||
It is important that you use GNU make (gmake from /usr/ports/devel/gmake)
|
NOTE: --enable-sample will cause the smartd.conf and smartd RC files to
|
||||||
to build smartmontools, as the default OpenBSD make doesn't know how to build
|
|
||||||
the man pages.
|
|
||||||
|
|
||||||
NOTE1: --with-initscriptdir installs a SystemV startup script. It really
|
|
||||||
should be --without-initscriptdir, but the Makefile code is incorrect and
|
|
||||||
trys to install the initscript (smartd) to /no. So, an interim fix it to
|
|
||||||
set the initscript dir to the doc dir.
|
|
||||||
|
|
||||||
NOTE2: --enable-sample will cause the smartd.conf and smartd RC files to
|
|
||||||
be installed with the string '.sample' append to the name, so you will end
|
be installed with the string '.sample' append to the name, so you will end
|
||||||
up with the following:
|
up with the following:
|
||||||
/usr/local/etc/smartd.conf.sample
|
/etc/smartd.conf.sample
|
||||||
/usr/local/etc/rc.d/smartd.sample
|
|
||||||
|
|
||||||
[13] Comments
|
[13] Comments
|
||||||
============
|
============
|
||||||
@ -580,6 +568,11 @@ by the following:
|
|||||||
cd objdir
|
cd objdir
|
||||||
../configure [options]
|
../configure [options]
|
||||||
|
|
||||||
|
Man pages contents is platform-specific by default. Info specific to other
|
||||||
|
platforms may be not visible. To generate man pages with full contents use:
|
||||||
|
|
||||||
|
make os_man_filter=
|
||||||
|
|
||||||
To install to another destination (used mainly by package maintainers,
|
To install to another destination (used mainly by package maintainers,
|
||||||
or to examine the package contents without risk of modifying any
|
or to examine the package contents without risk of modifying any
|
||||||
system files) you can replace the step:
|
system files) you can replace the step:
|
||||||
@ -587,7 +580,7 @@ system files) you can replace the step:
|
|||||||
with:
|
with:
|
||||||
make DESTDIR=/home/myself/smartmontools-package install
|
make DESTDIR=/home/myself/smartmontools-package install
|
||||||
|
|
||||||
Use a full path. Paths like ~/smartmontools-package may not work.
|
Use a full path. Paths like ./smartmontools-package may not work.
|
||||||
|
|
||||||
After installing smartmontools, you can read the man pages, and try
|
After installing smartmontools, you can read the man pages, and try
|
||||||
out the commands:
|
out the commands:
|
||||||
|
85
Makefile.am
85
Makefile.am
@ -1,10 +1,12 @@
|
|||||||
## Process this file with automake to produce Makefile.in
|
## Process this file with automake to produce Makefile.in
|
||||||
#
|
#
|
||||||
# $Id: Makefile.am 3338 2011-05-23 08:29:12Z samm2 $
|
# $Id: Makefile.am 3474 2011-11-10 18:19:58Z chrfranke $
|
||||||
#
|
#
|
||||||
|
|
||||||
@SET_MAKE@
|
@SET_MAKE@
|
||||||
|
|
||||||
|
ACLOCAL_AM_FLAGS = -I m4
|
||||||
|
|
||||||
# Make sure .cpp takes precedence to avoid compiling old .c file
|
# Make sure .cpp takes precedence to avoid compiling old .c file
|
||||||
SUFFIXES = .cpp .c .s .o
|
SUFFIXES = .cpp .c .s .o
|
||||||
|
|
||||||
@ -22,6 +24,9 @@ if ENABLE_ATTRIBUTELOG
|
|||||||
AM_CPPFLAGS += -DSMARTMONTOOLS_ATTRIBUTELOG='"$(attributelog)"'
|
AM_CPPFLAGS += -DSMARTMONTOOLS_ATTRIBUTELOG='"$(attributelog)"'
|
||||||
endif
|
endif
|
||||||
|
|
||||||
|
if OS_WIN32_MINGW
|
||||||
|
AM_CPPFLAGS += -I$(srcdir)/os_win32
|
||||||
|
endif
|
||||||
if NEED_GETOPT_LONG
|
if NEED_GETOPT_LONG
|
||||||
AM_CPPFLAGS += -I$(srcdir)/getopt -DHAVE_GETOPT_LONG -D__GNU_LIBRARY__
|
AM_CPPFLAGS += -I$(srcdir)/getopt -DHAVE_GETOPT_LONG -D__GNU_LIBRARY__
|
||||||
endif
|
endif
|
||||||
@ -83,6 +88,7 @@ EXTRA_smartd_SOURCES = os_darwin.cpp \
|
|||||||
os_generic.h \
|
os_generic.h \
|
||||||
cciss.cpp \
|
cciss.cpp \
|
||||||
cciss.h \
|
cciss.h \
|
||||||
|
cissio_freebsd.h \
|
||||||
dev_legacy.cpp \
|
dev_legacy.cpp \
|
||||||
megaraid.h
|
megaraid.h
|
||||||
|
|
||||||
@ -145,6 +151,7 @@ EXTRA_smartctl_SOURCES = os_linux.cpp \
|
|||||||
os_generic.h \
|
os_generic.h \
|
||||||
cciss.cpp \
|
cciss.cpp \
|
||||||
cciss.h \
|
cciss.h \
|
||||||
|
cissio_freebsd.h \
|
||||||
dev_legacy.cpp \
|
dev_legacy.cpp \
|
||||||
megaraid.h
|
megaraid.h
|
||||||
|
|
||||||
@ -324,10 +331,14 @@ EXTRA_DIST = \
|
|||||||
smartd.conf \
|
smartd.conf \
|
||||||
smartd.service.in \
|
smartd.service.in \
|
||||||
update-smart-drivedb.in \
|
update-smart-drivedb.in \
|
||||||
|
m4/pkg.m4 \
|
||||||
os_darwin/SMART.in \
|
os_darwin/SMART.in \
|
||||||
os_darwin/StartupParameters.plist \
|
os_darwin/StartupParameters.plist \
|
||||||
os_darwin/English_Localizable.strings \
|
os_darwin/English_Localizable.strings \
|
||||||
os_win32/installer.nsi \
|
os_win32/installer.nsi \
|
||||||
|
os_win32/runcmd.c \
|
||||||
|
os_win32/runcmda.exe.manifest \
|
||||||
|
os_win32/runcmdu.exe.manifest \
|
||||||
os_win32/syslogevt.c \
|
os_win32/syslogevt.c \
|
||||||
os_win32/syslogevt.mc \
|
os_win32/syslogevt.mc \
|
||||||
os_win32/update-smart-drivedb.nsi \
|
os_win32/update-smart-drivedb.nsi \
|
||||||
@ -368,7 +379,8 @@ MAINTAINERCLEANFILES = \
|
|||||||
$(srcdir)/depcomp \
|
$(srcdir)/depcomp \
|
||||||
$(srcdir)/install-sh \
|
$(srcdir)/install-sh \
|
||||||
$(srcdir)/missing \
|
$(srcdir)/missing \
|
||||||
$(srcdir)/mkinstalldirs
|
$(srcdir)/mkinstalldirs \
|
||||||
|
$(srcdir)/m4/pkg.m4
|
||||||
|
|
||||||
utility.o: svnversion.h
|
utility.o: svnversion.h
|
||||||
|
|
||||||
@ -408,17 +420,6 @@ if ENABLE_ATTRIBUTELOG
|
|||||||
attributelog_DATA =
|
attributelog_DATA =
|
||||||
endif
|
endif
|
||||||
|
|
||||||
smartd.conf.5.in: smartd.8.in
|
|
||||||
sed '1,/STARTINCLUDE/ D;/ENDINCLUDE/,$$D' < $(srcdir)/smartd.8.in > $(top_builddir)/tmp.directives
|
|
||||||
sed '/STARTINCLUDE/,$$D' < $(srcdir)/smartd.conf.5.in > $(top_builddir)/tmp.head
|
|
||||||
sed '1,/ENDINCLUDE/D' < $(srcdir)/smartd.conf.5.in > $(top_builddir)/tmp.tail
|
|
||||||
cat $(top_builddir)/tmp.head > $(srcdir)/smartd.conf.5.in
|
|
||||||
echo '.\" STARTINCLUDE' >> $(srcdir)/smartd.conf.5.in
|
|
||||||
cat $(top_builddir)/tmp.directives >> $(srcdir)/smartd.conf.5.in
|
|
||||||
echo '.\" ENDINCLUDE' >> $(srcdir)/smartd.conf.5.in
|
|
||||||
cat $(top_builddir)/tmp.tail >> $(srcdir)/smartd.conf.5.in
|
|
||||||
rm -f $(top_builddir)/tmp.head $(top_builddir)/tmp.tail $(top_builddir)/tmp.directives
|
|
||||||
|
|
||||||
update-smart-drivedb: update-smart-drivedb.in config.status
|
update-smart-drivedb: update-smart-drivedb.in config.status
|
||||||
$(SHELL) ./config.status --file=$@
|
$(SHELL) ./config.status --file=$@
|
||||||
chmod +x $@
|
chmod +x $@
|
||||||
@ -500,25 +501,25 @@ smartd.service: smartd.service.in Makefile
|
|||||||
if ENABLE_CAPABILITIES
|
if ENABLE_CAPABILITIES
|
||||||
MAN_CAPABILITIES = cat
|
MAN_CAPABILITIES = cat
|
||||||
else
|
else
|
||||||
MAN_CAPABILITIES = sed '/BEGIN ENABLE_CAPABILITIES/,/END ENABLE_CAPABILITIES/d'
|
MAN_CAPABILITIES = sed '/^\.\\" %IF ENABLE_CAPABILITIES/,/^\.\\" %ENDIF ENABLE_CAPABILITIES/ s,^,.\\"\# ,'
|
||||||
endif
|
endif
|
||||||
|
|
||||||
if ENABLE_DRIVEDB
|
if ENABLE_DRIVEDB
|
||||||
MAN_DRIVEDB = sed "s|/usr/local/share/smartmontools/drivedb\\.h|$(drivedbdir)/drivedb.h|g"
|
MAN_DRIVEDB = sed "s|/usr/local/share/smartmontools/drivedb\\.h|$(drivedbdir)/drivedb.h|g"
|
||||||
else
|
else
|
||||||
MAN_DRIVEDB = sed '/BEGIN ENABLE_DRIVEDB/,/END ENABLE_DRIVEDB/d'
|
MAN_DRIVEDB = sed '/^\.\\" %IF ENABLE_DRIVEDB/,/^\.\\" %ENDIF ENABLE_DRIVEDB/ s,^,.\\"\# ,'
|
||||||
endif
|
endif
|
||||||
|
|
||||||
if ENABLE_SAVESTATES
|
if ENABLE_SAVESTATES
|
||||||
MAN_SAVESTATES = sed "s|/usr/local/var/lib/smartmontools/smartd\\.|$(savestates)|g"
|
MAN_SAVESTATES = sed "s|/usr/local/var/lib/smartmontools/smartd\\.|$(savestates)|g"
|
||||||
else
|
else
|
||||||
MAN_SAVESTATES = sed '/BEGIN ENABLE_SAVESTATES/,/END ENABLE_SAVESTATES/d'
|
MAN_SAVESTATES = sed '/^\.\\" %IF ENABLE_SAVESTATES/,/^\.\\" %ENDIF ENABLE_SAVESTATES/ s,^,.\\"\# ,'
|
||||||
endif
|
endif
|
||||||
|
|
||||||
if ENABLE_ATTRIBUTELOG
|
if ENABLE_ATTRIBUTELOG
|
||||||
MAN_ATTRIBUTELOG = sed "s|/usr/local/var/lib/smartmontools/attrlog\\.|$(attributelog)|g"
|
MAN_ATTRIBUTELOG = sed "s|/usr/local/var/lib/smartmontools/attrlog\\.|$(attributelog)|g"
|
||||||
else
|
else
|
||||||
MAN_ATTRIBUTELOG = sed '/BEGIN ENABLE_ATTRIBUTELOG/,/END ENABLE_ATTRIBUTELOG/d'
|
MAN_ATTRIBUTELOG = sed '/^\.\\" %IF ENABLE_ATTRIBUTELOG/,/^\.\\" %ENDIF ENABLE_ATTRIBUTELOG/ s,^,.\\"\# ,'
|
||||||
endif
|
endif
|
||||||
|
|
||||||
MAN_FILTER = \
|
MAN_FILTER = \
|
||||||
@ -533,10 +534,21 @@ MAN_FILTER = \
|
|||||||
s|!exampledir!|$(exampledir)/|g; \
|
s|!exampledir!|$(exampledir)/|g; \
|
||||||
s|/usr/local/etc/smartd\\.conf|$(sysconfdir)/smartd.conf|g; \
|
s|/usr/local/etc/smartd\\.conf|$(sysconfdir)/smartd.conf|g; \
|
||||||
s|/usr/local/etc/smart_drivedb\\.h|$(sysconfdir)/smart_drivedb\\.h|g" | \
|
s|/usr/local/etc/smart_drivedb\\.h|$(sysconfdir)/smart_drivedb\\.h|g" | \
|
||||||
|
$(MAN_ATTRIBUTELOG) | \
|
||||||
$(MAN_CAPABILITIES) | \
|
$(MAN_CAPABILITIES) | \
|
||||||
$(MAN_DRIVEDB) | \
|
$(MAN_DRIVEDB) | \
|
||||||
$(MAN_SAVESTATES) | \
|
$(MAN_SAVESTATES) | \
|
||||||
$(MAN_ATTRIBUTELOG)
|
if test -n '$(os_man_filter)'; then \
|
||||||
|
sed -e 's,OS_MAN_FILTER,$(os_man_filter),g' \
|
||||||
|
-e '/^\.\\" %IF NOT OS .*$(os_man_filter)/,/^.\\" %ENDIF NOT OS .*$(os_man_filter)/ s,^,.\\"\# ,' \
|
||||||
|
-e '/^\.\\" %IF OS .*$(os_man_filter)/,/^\.\\" %ENDIF OS .*$(os_man_filter)/ s,^,!!,' \
|
||||||
|
-e '/^\.\\" %IF OS ./,/^\.\\" %ENDIF OS ./ s,^,.\\"\# ,' \
|
||||||
|
-e '/^!*\.\\" %IF NOT OS ./,/^!*\.\\" %ENDIF NOT OS ./ s,^,!!,' \
|
||||||
|
-e 's,^!!!*\.\\"! \(.*\)$$,\1 \\"\#,' \
|
||||||
|
-e 's,^!!!*,,' ; \
|
||||||
|
else \
|
||||||
|
cat; \
|
||||||
|
fi
|
||||||
|
|
||||||
# Implicit rule 'smart%: smart%.in ...' does not work with BSD make
|
# Implicit rule 'smart%: smart%.in ...' does not work with BSD make
|
||||||
smartctl.8: smartctl.8.in Makefile svnversion.h
|
smartctl.8: smartctl.8.in Makefile svnversion.h
|
||||||
@ -618,7 +630,9 @@ docdir_win32 = $(distdir_win32)/doc
|
|||||||
EXEFILES_WIN32 = \
|
EXEFILES_WIN32 = \
|
||||||
$(exedir_win32)/smartctl.exe \
|
$(exedir_win32)/smartctl.exe \
|
||||||
$(exedir_win32)/smartctl-nc.exe \
|
$(exedir_win32)/smartctl-nc.exe \
|
||||||
$(exedir_win32)/smartd.exe
|
$(exedir_win32)/smartd.exe \
|
||||||
|
$(exedir_win32)/runcmda.exe \
|
||||||
|
$(exedir_win32)/runcmdu.exe
|
||||||
|
|
||||||
if OS_WIN32_WINDMC
|
if OS_WIN32_WINDMC
|
||||||
EXEFILES_WIN32 += \
|
EXEFILES_WIN32 += \
|
||||||
@ -649,7 +663,9 @@ FILES_WIN32 = \
|
|||||||
$(docdir_win32)/smartd.8.html \
|
$(docdir_win32)/smartd.8.html \
|
||||||
$(docdir_win32)/smartd.8.txt \
|
$(docdir_win32)/smartd.8.txt \
|
||||||
$(docdir_win32)/smartd.conf.5.html \
|
$(docdir_win32)/smartd.conf.5.html \
|
||||||
$(docdir_win32)/smartd.conf.5.txt
|
$(docdir_win32)/smartd.conf.5.txt \
|
||||||
|
$(exedir_win32)/runcmda.exe.manifest \
|
||||||
|
$(exedir_win32)/runcmdu.exe.manifest
|
||||||
|
|
||||||
if ENABLE_DRIVEDB
|
if ENABLE_DRIVEDB
|
||||||
FILES_WIN32 += \
|
FILES_WIN32 += \
|
||||||
@ -658,6 +674,7 @@ endif
|
|||||||
|
|
||||||
CLEANFILES += \
|
CLEANFILES += \
|
||||||
$(FILES_WIN32) \
|
$(FILES_WIN32) \
|
||||||
|
runcmdu.exe \
|
||||||
smartctl-nc.exe smartctl-nc.exe.tmp \
|
smartctl-nc.exe smartctl-nc.exe.tmp \
|
||||||
syslogevt.exe syslogevt.h syslogevt.o \
|
syslogevt.exe syslogevt.h syslogevt.o \
|
||||||
syslogevt.res.o syslogevt.rc syslogevt_*.bin \
|
syslogevt.res.o syslogevt.rc syslogevt_*.bin \
|
||||||
@ -727,10 +744,18 @@ $(exedir_win32)/%.exe: %.exe
|
|||||||
$(exedir_win32)/update-smart-drivedb.exe: update-smart-drivedb.exe
|
$(exedir_win32)/update-smart-drivedb.exe: update-smart-drivedb.exe
|
||||||
cp -p $< $@
|
cp -p $< $@
|
||||||
|
|
||||||
|
# runcmd?.exe only differ by .exe.manifest files
|
||||||
|
$(exedir_win32)/runcmda.exe: $(exedir_win32)/runcmdu.exe
|
||||||
|
cp -p $< $@
|
||||||
|
|
||||||
$(exedir_win32)/%.h: $(srcdir)/%.h
|
$(exedir_win32)/%.h: $(srcdir)/%.h
|
||||||
$(UNIX2DOS) < $< > $@
|
$(UNIX2DOS) < $< > $@
|
||||||
touch -r $< $@
|
touch -r $< $@
|
||||||
|
|
||||||
|
$(exedir_win32)/%.exe.manifest: $(srcdir)/os_win32/%.exe.manifest
|
||||||
|
$(UNIX2DOS) < $< > $@
|
||||||
|
touch -r $< $@
|
||||||
|
|
||||||
$(docdir_win32)/%.html: %.html
|
$(docdir_win32)/%.html: %.html
|
||||||
$(UNIX2DOS) < $< > $@
|
$(UNIX2DOS) < $< > $@
|
||||||
touch -r $< $@
|
touch -r $< $@
|
||||||
@ -767,6 +792,10 @@ smartctl-nc.exe: smartctl.exe
|
|||||||
else echo "EXE patch failed"; exit 1; fi
|
else echo "EXE patch failed"; exit 1; fi
|
||||||
mv -f $@.tmp $@
|
mv -f $@.tmp $@
|
||||||
|
|
||||||
|
# Build runcmd?.exe
|
||||||
|
runcmdu.exe: os_win32/runcmd.c
|
||||||
|
$(CC) -Os -o $@ $<
|
||||||
|
|
||||||
if OS_WIN32_WINDMC
|
if OS_WIN32_WINDMC
|
||||||
# Build syslogevt.exe event message file tool
|
# Build syslogevt.exe event message file tool
|
||||||
|
|
||||||
@ -783,16 +812,16 @@ syslogevt.rc: os_win32/syslogevt.mc
|
|||||||
$(WINDMC) -b $<
|
$(WINDMC) -b $<
|
||||||
endif
|
endif
|
||||||
|
|
||||||
# Build {config,svnversion}_vc8.h for MSVC8 from MinGW {config,svnversion}.h
|
# Build {config,svnversion}_vc10.h for MSVC10 from MinGW {config,svnversion}.h
|
||||||
|
|
||||||
config-vc8: $(srcdir)/os_win32/config_vc8.h $(srcdir)/os_win32/svnversion_vc8.h
|
config-vc10: $(srcdir)/os_win32/config_vc10.h $(srcdir)/os_win32/svnversion_vc10.h
|
||||||
|
|
||||||
$(srcdir)/os_win32/config_vc8.h: config.h Makefile
|
$(srcdir)/os_win32/config_vc10.h: config.h Makefile
|
||||||
sed '1i/* config_vc8.h. Generated from config.h by Makefile. */' $< | \
|
sed -e '1i/* config_vc10.h. Generated from config.h by Makefile. */' \
|
||||||
sed 's,^#define HAVE_\(ATTR_PACKED\|INTTYPES_H\|[DK_]*NTDDDISK_H\|STDINT_H\|STRINGS_H\|STRTOULL\|U*INT64_T\|UNISTD_H\|WORKING_SNPRINTF\) 1$$,/* #undef HAVE_\1 */,' | \
|
-e 's,^#define HAVE_\(ATTR_PACKED\|INTTYPES_H\|[DK_]*NTDDDISK_H\|STRINGS_H\|STRTOULL\|UNISTD_H\|WORKING_SNPRINTF\) 1$$,/* #undef HAVE_\1 */,' \
|
||||||
sed 's,^\(#define SMARTMONTOOLS_BUILD_HOST "[^-]*\)[^"]*,\1-pc-win32vc8,' > $@
|
-e 's,^\(#define SMARTMONTOOLS_BUILD_HOST "[^-]*\)[^"]*,\1-pc-w32vc10,' $< > $@
|
||||||
|
|
||||||
$(srcdir)/os_win32/svnversion_vc8.h: svnversion.h
|
$(srcdir)/os_win32/svnversion_vc10.h: svnversion.h
|
||||||
cp svnversion.h $@
|
cp $< $@
|
||||||
|
|
||||||
endif
|
endif
|
||||||
|
39
NEWS
39
NEWS
@ -1,10 +1,47 @@
|
|||||||
smartmontools NEWS
|
smartmontools NEWS
|
||||||
------------------
|
------------------
|
||||||
$Id: NEWS 3365 2011-06-09 18:47:31Z chrfranke $
|
$Id: NEWS 3513 2012-02-15 21:57:21Z chrfranke $
|
||||||
|
|
||||||
The most up-to-date version of this file is:
|
The most up-to-date version of this file is:
|
||||||
http://smartmontools.svn.sourceforge.net/viewvc/smartmontools/trunk/smartmontools/NEWS?view=markup
|
http://smartmontools.svn.sourceforge.net/viewvc/smartmontools/trunk/smartmontools/NEWS?view=markup
|
||||||
|
|
||||||
|
Date <Not released yet, please try current SVN>
|
||||||
|
Summary: smartmontools release 5.43
|
||||||
|
-----------------------------------------------------------
|
||||||
|
- smartctl options '-g, --get' and '-s, --set' to get/set
|
||||||
|
various ATA settings: AAM, APM, Read look-ahead, Write
|
||||||
|
cache, Security (freeze), Standby mode/timer.
|
||||||
|
- smartd directive '-e' to set (most of) the above settings
|
||||||
|
on startup.
|
||||||
|
- smartctl does not start ATA self-test if another test is
|
||||||
|
already running. Override with new option '-t force'.
|
||||||
|
- smartctl supports extended self-test polling times
|
||||||
|
greater than 255 minutes.
|
||||||
|
- smartd.conf DEFAULT directive.
|
||||||
|
- Windows smartd: directives '-l offlinests,ns' and
|
||||||
|
'-l selfteststs,ns'.
|
||||||
|
- FreeBSD: fixed crash on SCSI devices with FreeBSD9-RC1
|
||||||
|
|
||||||
|
Date 2011-10-20
|
||||||
|
Summary: smartmontools release 5.42
|
||||||
|
-----------------------------------------------------------
|
||||||
|
- smartctl option '-l devstat' (Device Statistics).
|
||||||
|
- smartctl option '-l ssd' (SSD endurance indicator).
|
||||||
|
- smartd logs identify information of each SCSI/SAS device.
|
||||||
|
- smartd resends warning emails if problem reappears.
|
||||||
|
- smartd directives '-l offlinests' and '-l selfteststs'.
|
||||||
|
- Many HDD, SSD and USB additions to drive database.
|
||||||
|
- Platform-specific man pages.
|
||||||
|
- smartd.8 man page no longer includes smartd.conf.5.
|
||||||
|
- FreeBSD: Compilation fixes.
|
||||||
|
- FreeBSD: Support for Areca controllers.
|
||||||
|
- FreeBSD: Fix '-l scterc' support.
|
||||||
|
- FreeBSD: Support for 48-bit ATA commands.
|
||||||
|
- Linux: Support for Areca controllers enhanced.
|
||||||
|
- Windows installer: UAC support.
|
||||||
|
- Windows: update-smart-drivedb /S(ilent) option.
|
||||||
|
- Windows: improved USB ID detection.
|
||||||
|
|
||||||
Date 2011-06-09
|
Date 2011-06-09
|
||||||
Summary: smartmontools release 5.41
|
Summary: smartmontools release 5.41
|
||||||
-----------------------------------------------------------
|
-----------------------------------------------------------
|
||||||
|
112
atacmds.cpp
112
atacmds.cpp
@ -4,7 +4,7 @@
|
|||||||
* Home page of code is: http://smartmontools.sourceforge.net
|
* Home page of code is: http://smartmontools.sourceforge.net
|
||||||
*
|
*
|
||||||
* Copyright (C) 2002-11 Bruce Allen <smartmontools-support@lists.sourceforge.net>
|
* Copyright (C) 2002-11 Bruce Allen <smartmontools-support@lists.sourceforge.net>
|
||||||
* Copyright (C) 2008-11 Christian Franke <smartmontools-support@lists.sourceforge.net>
|
* Copyright (C) 2008-12 Christian Franke <smartmontools-support@lists.sourceforge.net>
|
||||||
* Copyright (C) 1999-2000 Michael Cornwell <cornwell@acm.org>
|
* Copyright (C) 1999-2000 Michael Cornwell <cornwell@acm.org>
|
||||||
* Copyright (C) 2000 Andre Hedrick <andre@linux-ide.org>
|
* Copyright (C) 2000 Andre Hedrick <andre@linux-ide.org>
|
||||||
*
|
*
|
||||||
@ -36,7 +36,7 @@
|
|||||||
#include "utility.h"
|
#include "utility.h"
|
||||||
#include "dev_ata_cmd_set.h" // for parsed_ata_device
|
#include "dev_ata_cmd_set.h" // for parsed_ata_device
|
||||||
|
|
||||||
const char * atacmds_cpp_cvsid = "$Id: atacmds.cpp 3345 2011-05-25 20:50:02Z chrfranke $"
|
const char * atacmds_cpp_cvsid = "$Id: atacmds.cpp 3507 2012-02-11 20:16:13Z chrfranke $"
|
||||||
ATACMDS_H_CVSID;
|
ATACMDS_H_CVSID;
|
||||||
|
|
||||||
// Print ATA debug messages?
|
// Print ATA debug messages?
|
||||||
@ -459,7 +459,7 @@ static void print_regs(const char * prefix, const ata_out_regs & r, const char *
|
|||||||
static void prettyprint(const unsigned char *p, const char *name){
|
static void prettyprint(const unsigned char *p, const char *name){
|
||||||
pout("\n===== [%s] DATA START (BASE-16) =====\n", name);
|
pout("\n===== [%s] DATA START (BASE-16) =====\n", name);
|
||||||
for (int i=0; i<512; i+=16, p+=16)
|
for (int i=0; i<512; i+=16, p+=16)
|
||||||
#define P(n) (isprint((int)(p[n]))?(int)(p[n]):'.')
|
#define P(n) (' ' <= p[n] && p[n] <= '~' ? (int)p[n] : '.')
|
||||||
// print complete line to avoid slow tty output and extra lines in syslog.
|
// print complete line to avoid slow tty output and extra lines in syslog.
|
||||||
pout("%03d-%03d: %02x %02x %02x %02x %02x %02x %02x %02x "
|
pout("%03d-%03d: %02x %02x %02x %02x %02x %02x %02x %02x "
|
||||||
"%02x %02x %02x %02x %02x %02x %02x %02x"
|
"%02x %02x %02x %02x %02x %02x %02x %02x"
|
||||||
@ -838,6 +838,31 @@ int ataCheckPowerMode(ata_device * device) {
|
|||||||
return (int)result;
|
return (int)result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Issue a no-data ATA command with optional sector count register value
|
||||||
|
bool ata_nodata_command(ata_device * device, unsigned char command,
|
||||||
|
int sector_count /* = -1 */)
|
||||||
|
{
|
||||||
|
ata_cmd_in in;
|
||||||
|
in.in_regs.command = command;
|
||||||
|
if (sector_count >= 0)
|
||||||
|
in.in_regs.sector_count = sector_count;
|
||||||
|
|
||||||
|
return device->ata_pass_through(in);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Issue SET FEATURES command with optional sector count register value
|
||||||
|
bool ata_set_features(ata_device * device, unsigned char features,
|
||||||
|
int sector_count /* = -1 */)
|
||||||
|
{
|
||||||
|
ata_cmd_in in;
|
||||||
|
in.in_regs.command = ATA_SET_FEATURES;
|
||||||
|
in.in_regs.features = features;
|
||||||
|
if (sector_count >= 0)
|
||||||
|
in.in_regs.sector_count = sector_count;
|
||||||
|
|
||||||
|
return device->ata_pass_through(in);
|
||||||
|
}
|
||||||
|
|
||||||
// Reads current Device Identity info (512 bytes) into buf. Returns 0
|
// Reads current Device Identity info (512 bytes) into buf. Returns 0
|
||||||
// if all OK. Returns -1 if no ATA Device identity can be
|
// if all OK. Returns -1 if no ATA Device identity can be
|
||||||
// established. Returns >0 if Device is ATA Packet Device (not SMART
|
// established. Returns >0 if Device is ATA Packet Device (not SMART
|
||||||
@ -1057,6 +1082,7 @@ int ataReadSmartValues(ata_device * device, struct ata_smart_values *data){
|
|||||||
swap2((char *)&(data->revnumber));
|
swap2((char *)&(data->revnumber));
|
||||||
swap2((char *)&(data->total_time_to_complete_off_line));
|
swap2((char *)&(data->total_time_to_complete_off_line));
|
||||||
swap2((char *)&(data->smart_capability));
|
swap2((char *)&(data->smart_capability));
|
||||||
|
swapx(&data->extend_test_completion_time_w);
|
||||||
for (i=0; i<NUMBER_ATA_SMART_ATTRIBUTES; i++){
|
for (i=0; i<NUMBER_ATA_SMART_ATTRIBUTES; i++){
|
||||||
struct ata_smart_attribute *x=data->vendor_attributes+i;
|
struct ata_smart_attribute *x=data->vendor_attributes+i;
|
||||||
swap2((char *)&(x->flags));
|
swap2((char *)&(x->flags));
|
||||||
@ -1637,7 +1663,8 @@ int ataSmartStatus2(ata_device * device){
|
|||||||
// This is the way to execute ALL tests: offline, short self-test,
|
// This is the way to execute ALL tests: offline, short self-test,
|
||||||
// extended self test, with and without captive mode, etc.
|
// extended self test, with and without captive mode, etc.
|
||||||
// TODO: Move to ataprint.cpp ?
|
// TODO: Move to ataprint.cpp ?
|
||||||
int ataSmartTest(ata_device * device, int testtype, const ata_selective_selftest_args & selargs,
|
int ataSmartTest(ata_device * device, int testtype, bool force,
|
||||||
|
const ata_selective_selftest_args & selargs,
|
||||||
const ata_smart_values * sv, uint64_t num_sectors)
|
const ata_smart_values * sv, uint64_t num_sectors)
|
||||||
{
|
{
|
||||||
char cmdmsg[128]; const char *type, *captive;
|
char cmdmsg[128]; const char *type, *captive;
|
||||||
@ -1664,7 +1691,20 @@ int ataSmartTest(ata_device * device, int testtype, const ata_selective_selftest
|
|||||||
type="Selective self-test";
|
type="Selective self-test";
|
||||||
else
|
else
|
||||||
type = 0;
|
type = 0;
|
||||||
|
|
||||||
|
// Check whether another test is already running
|
||||||
|
if (type && (sv->self_test_exec_status >> 4) == 0xf) {
|
||||||
|
if (!force) {
|
||||||
|
pout("Can't start self-test without aborting current test (%d0%% remaining),\n"
|
||||||
|
"%srun 'smartctl -X' to abort test.\n",
|
||||||
|
sv->self_test_exec_status & 0x0f,
|
||||||
|
(!select ? "add '-t force' option to override, or " : ""));
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
force = false;
|
||||||
|
|
||||||
// If doing a selective self-test, first use WRITE_LOG to write the
|
// If doing a selective self-test, first use WRITE_LOG to write the
|
||||||
// selective self-test log.
|
// selective self-test log.
|
||||||
ata_selective_selftest_args selargs_io = selargs; // filled with info about actual spans
|
ata_selective_selftest_args selargs_io = selargs; // filled with info about actual spans
|
||||||
@ -1706,7 +1746,7 @@ int ataSmartTest(ata_device * device, int testtype, const ata_selective_selftest
|
|||||||
else {
|
else {
|
||||||
pout("Drive command \"%s\" successful.\n", cmdmsg);
|
pout("Drive command \"%s\" successful.\n", cmdmsg);
|
||||||
if (type)
|
if (type)
|
||||||
pout("Testing has begun.\n");
|
pout("Testing has begun%s.\n", (force ? " (previous test aborted)" : ""));
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
@ -1722,7 +1762,12 @@ int TestTime(const ata_smart_values *data, int testtype)
|
|||||||
return (int) data->short_test_completion_time;
|
return (int) data->short_test_completion_time;
|
||||||
case EXTEND_SELF_TEST:
|
case EXTEND_SELF_TEST:
|
||||||
case EXTEND_CAPTIVE_SELF_TEST:
|
case EXTEND_CAPTIVE_SELF_TEST:
|
||||||
return (int) data->extend_test_completion_time;
|
if (data->extend_test_completion_time_b == 0xff
|
||||||
|
&& data->extend_test_completion_time_w != 0x0000
|
||||||
|
&& data->extend_test_completion_time_w != 0xffff)
|
||||||
|
return data->extend_test_completion_time_w; // ATA-8
|
||||||
|
else
|
||||||
|
return data->extend_test_completion_time_b;
|
||||||
case CONVEYANCE_SELF_TEST:
|
case CONVEYANCE_SELF_TEST:
|
||||||
case CONVEYANCE_CAPTIVE_SELF_TEST:
|
case CONVEYANCE_CAPTIVE_SELF_TEST:
|
||||||
return (int) data->conveyance_test_completion_time;
|
return (int) data->conveyance_test_completion_time;
|
||||||
@ -2072,24 +2117,36 @@ std::string ata_format_attr_raw_value(const ata_smart_attribute & attr,
|
|||||||
|
|
||||||
case RAWFMT_TEMPMINMAX:
|
case RAWFMT_TEMPMINMAX:
|
||||||
// Temperature
|
// Temperature
|
||||||
s = strprintf("%u", word[0]);
|
{
|
||||||
if (word[1] || word[2]) {
|
// Search for possible min/max values
|
||||||
unsigned lo = ~0, hi = ~0;
|
// 00 HH 00 LL 00 TT (Hitachi/IBM)
|
||||||
if (!raw[3]) {
|
// 00 00 HH LL 00 TT (Maxtor, Samsung)
|
||||||
// 00 HH 00 LL 00 TT (IBM)
|
// 00 00 00 HH LL TT (WDC)
|
||||||
hi = word[2]; lo = word[1];
|
unsigned char lo = 0, hi = 0;
|
||||||
|
int cnt = 0;
|
||||||
|
for (int i = 1; i < 6; i++) {
|
||||||
|
if (raw[i])
|
||||||
|
switch (cnt++) {
|
||||||
|
case 0:
|
||||||
|
lo = raw[i];
|
||||||
|
break;
|
||||||
|
case 1:
|
||||||
|
if (raw[i] < lo) {
|
||||||
|
hi = lo; lo = raw[i];
|
||||||
|
}
|
||||||
|
else
|
||||||
|
hi = raw[i];
|
||||||
|
break;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else if (!word[2]) {
|
|
||||||
// 00 00 HH LL 00 TT (Maxtor)
|
unsigned char t = raw[0];
|
||||||
hi = raw[3]; lo = raw[2];
|
if (cnt == 0)
|
||||||
}
|
s = strprintf("%d", t);
|
||||||
if (lo > hi) {
|
else if (cnt == 2 && 0 < lo && lo <= t && t <= hi && hi < 128)
|
||||||
unsigned t = lo; lo = hi; hi = t;
|
s = strprintf("%d (Min/Max %d/%d)", t, lo, hi);
|
||||||
}
|
|
||||||
if (lo <= word[0] && word[0] <= hi)
|
|
||||||
s += strprintf(" (Min/Max %u/%u)", lo, hi);
|
|
||||||
else
|
else
|
||||||
s += strprintf(" (%d %d %d %d)", raw[5], raw[4], raw[3], raw[2]);
|
s = strprintf("%d (%d %d %d %d %d)", t, raw[5], raw[4], raw[3], raw[2], raw[1]);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
@ -2301,10 +2358,13 @@ unsigned char ata_return_temperature_value(const ata_smart_values * data, const
|
|||||||
if (idx < 0)
|
if (idx < 0)
|
||||||
continue;
|
continue;
|
||||||
uint64_t raw = ata_get_attr_raw_value(data->vendor_attributes[idx], defs);
|
uint64_t raw = ata_get_attr_raw_value(data->vendor_attributes[idx], defs);
|
||||||
unsigned temp = (unsigned short)raw; // ignore possible min/max values in high words
|
unsigned temp;
|
||||||
|
// ignore possible min/max values in high words
|
||||||
if (format == RAWFMT_TEMP10X) // -v N,temp10x
|
if (format == RAWFMT_TEMP10X) // -v N,temp10x
|
||||||
temp = (temp+5) / 10;
|
temp = ((unsigned short)raw + 5) / 10;
|
||||||
if (!(0 < temp && temp <= 255))
|
else
|
||||||
|
temp = (unsigned char)raw;
|
||||||
|
if (!(0 < temp && temp < 128))
|
||||||
continue;
|
continue;
|
||||||
return temp;
|
return temp;
|
||||||
}
|
}
|
||||||
|
49
atacmds.h
49
atacmds.h
@ -4,7 +4,7 @@
|
|||||||
* Home page of code is: http://smartmontools.sourceforge.net
|
* Home page of code is: http://smartmontools.sourceforge.net
|
||||||
*
|
*
|
||||||
* Copyright (C) 2002-11 Bruce Allen <smartmontools-support@lists.sourceforge.net>
|
* Copyright (C) 2002-11 Bruce Allen <smartmontools-support@lists.sourceforge.net>
|
||||||
* Copyright (C) 2008-11 Christian Franke <smartmontools-support@lists.sourceforge.net>
|
* Copyright (C) 2008-12 Christian Franke <smartmontools-support@lists.sourceforge.net>
|
||||||
* Copyright (C) 1999-2000 Michael Cornwell <cornwell@acm.org>
|
* Copyright (C) 1999-2000 Michael Cornwell <cornwell@acm.org>
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or modify
|
* This program is free software; you can redistribute it and/or modify
|
||||||
@ -26,7 +26,7 @@
|
|||||||
#ifndef ATACMDS_H_
|
#ifndef ATACMDS_H_
|
||||||
#define ATACMDS_H_
|
#define ATACMDS_H_
|
||||||
|
|
||||||
#define ATACMDS_H_CVSID "$Id: atacmds.h 3316 2011-04-19 19:34:57Z chrfranke $"
|
#define ATACMDS_H_CVSID "$Id: atacmds.h 3508 2012-02-12 15:47:56Z chrfranke $"
|
||||||
|
|
||||||
#include "dev_interface.h" // ata_device
|
#include "dev_interface.h" // ata_device
|
||||||
|
|
||||||
@ -77,10 +77,25 @@ enum {
|
|||||||
};
|
};
|
||||||
|
|
||||||
// ATA Specification Command Register Values (Commands)
|
// ATA Specification Command Register Values (Commands)
|
||||||
|
#define ATA_CHECK_POWER_MODE 0xe5
|
||||||
#define ATA_IDENTIFY_DEVICE 0xec
|
#define ATA_IDENTIFY_DEVICE 0xec
|
||||||
#define ATA_IDENTIFY_PACKET_DEVICE 0xa1
|
#define ATA_IDENTIFY_PACKET_DEVICE 0xa1
|
||||||
|
#define ATA_IDLE 0xe3
|
||||||
#define ATA_SMART_CMD 0xb0
|
#define ATA_SMART_CMD 0xb0
|
||||||
#define ATA_CHECK_POWER_MODE 0xe5
|
#define ATA_SECURITY_FREEZE_LOCK 0xf5
|
||||||
|
#define ATA_SET_FEATURES 0xef
|
||||||
|
#define ATA_STANDBY_IMMEDIATE 0xe0
|
||||||
|
|
||||||
|
// SET_FEATURES subcommands
|
||||||
|
#define ATA_DISABLE_AAM 0xc2
|
||||||
|
#define ATA_DISABLE_APM 0x85
|
||||||
|
#define ATA_DISABLE_WRITE_CACHE 0x82
|
||||||
|
#define ATA_DISABLE_READ_LOOK_AHEAD 0x55
|
||||||
|
#define ATA_ENABLE_AAM 0x42
|
||||||
|
#define ATA_ENABLE_APM 0x05
|
||||||
|
#define ATA_ENABLE_WRITE_CACHE 0x02
|
||||||
|
#define ATA_ENABLE_READ_LOOK_AHEAD 0xaa
|
||||||
|
|
||||||
// 48-bit commands
|
// 48-bit commands
|
||||||
#define ATA_READ_LOG_EXT 0x2F
|
#define ATA_READ_LOG_EXT 0x2F
|
||||||
|
|
||||||
@ -200,8 +215,8 @@ ASSERT_SIZEOF_STRUCT(ata_smart_attribute, 12);
|
|||||||
#define ATTRIBUTE_FLAGS_OTHER(x) ((x) & 0xffc0)
|
#define ATTRIBUTE_FLAGS_OTHER(x) ((x) & 0xffc0)
|
||||||
|
|
||||||
|
|
||||||
/* ata_smart_values is format of the read drive Attribute command */
|
// Format of data returned by SMART READ DATA
|
||||||
/* see Table 34 of T13/1321D Rev 1 spec (Device SMART data structure) for *some* info */
|
// Table 62 of T13/1699-D (ATA8-ACS) Revision 6a, September 2008
|
||||||
#pragma pack(1)
|
#pragma pack(1)
|
||||||
struct ata_smart_values {
|
struct ata_smart_values {
|
||||||
unsigned short int revnumber;
|
unsigned short int revnumber;
|
||||||
@ -215,9 +230,10 @@ struct ata_smart_values {
|
|||||||
unsigned char errorlog_capability;
|
unsigned char errorlog_capability;
|
||||||
unsigned char vendor_specific_371; // Maxtor, IBM: self-test failure checkpoint see below!
|
unsigned char vendor_specific_371; // Maxtor, IBM: self-test failure checkpoint see below!
|
||||||
unsigned char short_test_completion_time;
|
unsigned char short_test_completion_time;
|
||||||
unsigned char extend_test_completion_time;
|
unsigned char extend_test_completion_time_b; // If 0xff, use 16-bit value below
|
||||||
unsigned char conveyance_test_completion_time;
|
unsigned char conveyance_test_completion_time;
|
||||||
unsigned char reserved_375_385[11];
|
unsigned short extend_test_completion_time_w; // e04130r2, added to T13/1699-D Revision 1c, April 2005
|
||||||
|
unsigned char reserved_377_385[9];
|
||||||
unsigned char vendor_specific_386_510[125]; // Maxtor bytes 508-509 Attribute/Threshold Revision #
|
unsigned char vendor_specific_386_510[125]; // Maxtor bytes 508-509 Attribute/Threshold Revision #
|
||||||
unsigned char chksum;
|
unsigned char chksum;
|
||||||
} ATTR_PACKED;
|
} ATTR_PACKED;
|
||||||
@ -718,6 +734,12 @@ extern bool dont_print_serial_number;
|
|||||||
int ata_read_identity(ata_device * device, ata_identify_device * buf, bool fix_swapped_id);
|
int ata_read_identity(ata_device * device, ata_identify_device * buf, bool fix_swapped_id);
|
||||||
int ataCheckPowerMode(ata_device * device);
|
int ataCheckPowerMode(ata_device * device);
|
||||||
|
|
||||||
|
// Issue a no-data ATA command with optional sector count register value
|
||||||
|
bool ata_nodata_command(ata_device * device, unsigned char command, int sector_count = -1);
|
||||||
|
|
||||||
|
// Issue SET FEATURES command with optional sector count register value
|
||||||
|
bool ata_set_features(ata_device * device, unsigned char features, int sector_count = -1);
|
||||||
|
|
||||||
/* Read S.M.A.R.T information from drive */
|
/* Read S.M.A.R.T information from drive */
|
||||||
int ataReadSmartValues(ata_device * device,struct ata_smart_values *);
|
int ataReadSmartValues(ata_device * device,struct ata_smart_values *);
|
||||||
int ataReadSmartThresholds(ata_device * device, struct ata_smart_thresholds_pvt *);
|
int ataReadSmartThresholds(ata_device * device, struct ata_smart_thresholds_pvt *);
|
||||||
@ -766,12 +788,10 @@ int ataEnableAutoOffline (ata_device * device);
|
|||||||
int ataDisableAutoOffline (ata_device * device);
|
int ataDisableAutoOffline (ata_device * device);
|
||||||
|
|
||||||
/* S.M.A.R.T. test commands */
|
/* S.M.A.R.T. test commands */
|
||||||
int ataSmartOfflineTest (ata_device * device);
|
int ataSmartTest(ata_device * device, int testtype, bool force,
|
||||||
int ataSmartExtendSelfTest (ata_device * device);
|
const ata_selective_selftest_args & args,
|
||||||
int ataSmartShortSelfTest (ata_device * device);
|
const ata_smart_values * sv, uint64_t num_sectors);
|
||||||
int ataSmartShortCapSelfTest (ata_device * device);
|
|
||||||
int ataSmartExtendCapSelfTest (ata_device * device);
|
|
||||||
int ataSmartSelfTestAbort (ata_device * device);
|
|
||||||
int ataWriteSelectiveSelfTestLog(ata_device * device, ata_selective_selftest_args & args,
|
int ataWriteSelectiveSelfTestLog(ata_device * device, ata_selective_selftest_args & args,
|
||||||
const ata_smart_values * sv, uint64_t num_sectors,
|
const ata_smart_values * sv, uint64_t num_sectors,
|
||||||
const ata_selective_selftest_args * prev_spans = 0);
|
const ata_selective_selftest_args * prev_spans = 0);
|
||||||
@ -830,9 +850,6 @@ inline bool isSCTFeatureControlCapable(const ata_identify_device *drive)
|
|||||||
inline bool isSCTDataTableCapable(const ata_identify_device *drive)
|
inline bool isSCTDataTableCapable(const ata_identify_device *drive)
|
||||||
{ return ((drive->words088_255[206-88] & 0x21) == 0x21); } // 0x20 = SCT Data Table support
|
{ return ((drive->words088_255[206-88] & 0x21) == 0x21); } // 0x20 = SCT Data Table support
|
||||||
|
|
||||||
int ataSmartTest(ata_device * device, int testtype, const ata_selective_selftest_args & args,
|
|
||||||
const ata_smart_values * sv, uint64_t num_sectors);
|
|
||||||
|
|
||||||
int TestTime(const ata_smart_values * data, int testtype);
|
int TestTime(const ata_smart_values * data, int testtype);
|
||||||
|
|
||||||
// Attribute state
|
// Attribute state
|
||||||
|
575
ataprint.cpp
575
ataprint.cpp
@ -4,7 +4,7 @@
|
|||||||
* Home page of code is: http://smartmontools.sourceforge.net
|
* Home page of code is: http://smartmontools.sourceforge.net
|
||||||
*
|
*
|
||||||
* Copyright (C) 2002-11 Bruce Allen <smartmontools-support@lists.sourceforge.net>
|
* Copyright (C) 2002-11 Bruce Allen <smartmontools-support@lists.sourceforge.net>
|
||||||
* Copyright (C) 2008-11 Christian Franke <smartmontools-support@lists.sourceforge.net>
|
* Copyright (C) 2008-12 Christian Franke <smartmontools-support@lists.sourceforge.net>
|
||||||
* Copyright (C) 1999-2000 Michael Cornwell <cornwell@acm.org>
|
* Copyright (C) 1999-2000 Michael Cornwell <cornwell@acm.org>
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or modify
|
* This program is free software; you can redistribute it and/or modify
|
||||||
@ -40,7 +40,7 @@
|
|||||||
#include "utility.h"
|
#include "utility.h"
|
||||||
#include "knowndrives.h"
|
#include "knowndrives.h"
|
||||||
|
|
||||||
const char * ataprint_cpp_cvsid = "$Id: ataprint.cpp 3357 2011-06-06 18:56:55Z chrfranke $"
|
const char * ataprint_cpp_cvsid = "$Id: ataprint.cpp 3509 2012-02-12 17:10:35Z chrfranke $"
|
||||||
ATAPRINT_H_CVSID;
|
ATAPRINT_H_CVSID;
|
||||||
|
|
||||||
|
|
||||||
@ -482,13 +482,26 @@ static void print_drive_info(const ata_identify_device * drive,
|
|||||||
|
|
||||||
std::string majorstr, minorstr;
|
std::string majorstr, minorstr;
|
||||||
if (version) {
|
if (version) {
|
||||||
majorstr = strprintf("%d", abs(version));
|
if (version <= 8) {
|
||||||
if (description)
|
majorstr = strprintf("%d", abs(version));
|
||||||
minorstr = description;
|
if (description)
|
||||||
else if (!minorrev)
|
minorstr = description;
|
||||||
minorstr = "Exact ATA specification draft version not indicated";
|
else if (!minorrev)
|
||||||
else
|
minorstr = "Exact ATA specification draft version not indicated";
|
||||||
minorstr = strprintf("Not recognized. Minor revision code: 0x%04x", minorrev);
|
else
|
||||||
|
minorstr = strprintf("Not recognized. Minor revision code: 0x%04x", minorrev);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
// Bit 9 in word 80 of ATA IDENTIFY data does not mean "ATA-9" but "ACS-2"
|
||||||
|
// TODO: handle this in ataVersionInfo()
|
||||||
|
majorstr = "8";
|
||||||
|
if (description)
|
||||||
|
minorstr = description;
|
||||||
|
else if (!minorrev)
|
||||||
|
minorstr = strprintf("ACS-%d (revision not indicated)", version-9+2);
|
||||||
|
else
|
||||||
|
minorstr = strprintf("ACS-%d (unknown minor revision code: 0x%04x)", version-9+2, minorrev);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pout("ATA Version is: %s\n", infofound(majorstr.c_str()));
|
pout("ATA Version is: %s\n", infofound(majorstr.c_str()));
|
||||||
@ -741,7 +754,7 @@ static void PrintSmartExtendedSelfTestPollingTime(const ata_smart_values * data)
|
|||||||
pout("Extended self-test routine\n");
|
pout("Extended self-test routine\n");
|
||||||
if (isSupportSelfTest(data))
|
if (isSupportSelfTest(data))
|
||||||
pout("recommended polling time: \t (%4d) minutes.\n",
|
pout("recommended polling time: \t (%4d) minutes.\n",
|
||||||
(int)data->extend_test_completion_time);
|
TestTime(data, EXTEND_SELF_TEST));
|
||||||
else
|
else
|
||||||
pout("recommended polling time: \t Not Supported.\n");
|
pout("recommended polling time: \t Not Supported.\n");
|
||||||
}
|
}
|
||||||
@ -946,7 +959,7 @@ static unsigned GetNumLogSectors(const ata_smart_log_directory * logdir, unsigne
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Get name of log.
|
// Get name of log.
|
||||||
// Table A.2 of T13/2015-D Revision 4a (ACS-2), December 9, 2010.
|
// Table A.2 of T13/2161-D Revision 1 (ACS-3), August 13, 2011.
|
||||||
static const char * GetLogName(unsigned logaddr)
|
static const char * GetLogName(unsigned logaddr)
|
||||||
{
|
{
|
||||||
switch (logaddr) {
|
switch (logaddr) {
|
||||||
@ -954,19 +967,21 @@ static const char * GetLogName(unsigned logaddr)
|
|||||||
case 0x01: return "Summary SMART error log";
|
case 0x01: return "Summary SMART error log";
|
||||||
case 0x02: return "Comprehensive SMART error log";
|
case 0x02: return "Comprehensive SMART error log";
|
||||||
case 0x03: return "Ext. Comprehensive SMART error log";
|
case 0x03: return "Ext. Comprehensive SMART error log";
|
||||||
case 0x04: return "Device Statistics";
|
case 0x04: return "Device Statistics log";
|
||||||
case 0x05: return "Reserved for the CFA"; // ACS-2
|
case 0x05: return "Reserved for the CFA"; // ACS-2
|
||||||
case 0x06: return "SMART self-test log";
|
case 0x06: return "SMART self-test log";
|
||||||
case 0x07: return "Extended self-test log";
|
case 0x07: return "Extended self-test log";
|
||||||
case 0x08: return "Power Conditions"; // ACS-2
|
case 0x08: return "Power Conditions log"; // ACS-2
|
||||||
case 0x09: return "Selective self-test log";
|
case 0x09: return "Selective self-test log";
|
||||||
case 0x0d: return "LPS Mis-alignment log"; // ACS-2
|
case 0x0d: return "LPS Mis-alignment log"; // ACS-2
|
||||||
case 0x10: return "NCQ Command Error";
|
case 0x10: return "NCQ Command Error log";
|
||||||
case 0x11: return "SATA Phy Event Counters";
|
case 0x11: return "SATA Phy Event Counters";
|
||||||
|
case 0x19: return "LBA Status log"; // ACS-3
|
||||||
case 0x20: return "Streaming performance log"; // Obsolete
|
case 0x20: return "Streaming performance log"; // Obsolete
|
||||||
case 0x21: return "Write stream error log";
|
case 0x21: return "Write stream error log";
|
||||||
case 0x22: return "Read stream error log";
|
case 0x22: return "Read stream error log";
|
||||||
case 0x23: return "Delayed sector log"; // Obsolete
|
case 0x23: return "Delayed sector log"; // Obsolete
|
||||||
|
case 0x30: return "IDENTIFY DEVICE data log"; // ACS-3
|
||||||
case 0xe0: return "SCT Command/Status";
|
case 0xe0: return "SCT Command/Status";
|
||||||
case 0xe1: return "SCT Data Transfer";
|
case 0xe1: return "SCT Data Transfer";
|
||||||
default:
|
default:
|
||||||
@ -1032,7 +1047,7 @@ static void PrintLogPages(const char * type, const unsigned char * data,
|
|||||||
(page * 512) + i,
|
(page * 512) + i,
|
||||||
p[ 0], p[ 1], p[ 2], p[ 3], p[ 4], p[ 5], p[ 6], p[ 7],
|
p[ 0], p[ 1], p[ 2], p[ 3], p[ 4], p[ 5], p[ 6], p[ 7],
|
||||||
p[ 8], p[ 9], p[10], p[11], p[12], p[13], p[14], p[15]);
|
p[ 8], p[ 9], p[10], p[11], p[12], p[13], p[14], p[15]);
|
||||||
#define P(n) (isprint((int)(p[n]))?(int)(p[n]):'.')
|
#define P(n) (' ' <= p[n] && p[n] <= '~' ? (int)p[n] : '.')
|
||||||
pout("|%c%c%c%c%c%c%c%c"
|
pout("|%c%c%c%c%c%c%c%c"
|
||||||
"%c%c%c%c%c%c%c%c|\n",
|
"%c%c%c%c%c%c%c%c|\n",
|
||||||
P( 0), P( 1), P( 2), P( 3), P( 4), P( 5), P( 6), P( 7),
|
P( 0), P( 1), P( 2), P( 3), P( 4), P( 5), P( 6), P( 7),
|
||||||
@ -1043,6 +1058,249 @@ static void PrintLogPages(const char * type, const unsigned char * data,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
///////////////////////////////////////////////////////////////////////
|
||||||
|
// Device statistics (Log 0x04)
|
||||||
|
|
||||||
|
// See Section A.5 of
|
||||||
|
// ATA/ATAPI Command Set - 3 (ACS-3)
|
||||||
|
// T13/2161-D Revision 1, August 13, 2011
|
||||||
|
|
||||||
|
struct devstat_entry_info
|
||||||
|
{
|
||||||
|
short size; // #bytes of value, -1 for signed char
|
||||||
|
const char * name;
|
||||||
|
};
|
||||||
|
|
||||||
|
const devstat_entry_info devstat_info_0x00[] = {
|
||||||
|
{ 2, "List of supported log pages" },
|
||||||
|
{ 0, 0 }
|
||||||
|
};
|
||||||
|
|
||||||
|
const devstat_entry_info devstat_info_0x01[] = {
|
||||||
|
{ 2, "General Statistics" },
|
||||||
|
{ 4, "Lifetime Power-On Resets" },
|
||||||
|
{ 4, "Power-on Hours" }, // spec says no flags(?)
|
||||||
|
{ 6, "Logical Sectors Written" },
|
||||||
|
{ 6, "Number of Write Commands" },
|
||||||
|
{ 6, "Logical Sectors Read" },
|
||||||
|
{ 6, "Number of Read Commands" },
|
||||||
|
{ 0, 0 }
|
||||||
|
};
|
||||||
|
|
||||||
|
const devstat_entry_info devstat_info_0x02[] = {
|
||||||
|
{ 2, "Freefall Statistics" },
|
||||||
|
{ 4, "Number of Free-Fall Events Detected" },
|
||||||
|
{ 4, "Overlimit Shock Events" },
|
||||||
|
{ 0, 0 }
|
||||||
|
};
|
||||||
|
|
||||||
|
const devstat_entry_info devstat_info_0x03[] = {
|
||||||
|
{ 2, "Rotating Media Statistics" },
|
||||||
|
{ 4, "Spindle Motor Power-on Hours" },
|
||||||
|
{ 4, "Head Flying Hours" },
|
||||||
|
{ 4, "Head Load Events" },
|
||||||
|
{ 4, "Number of Reallocated Logical Sectors" },
|
||||||
|
{ 4, "Read Recovery Attempts" },
|
||||||
|
{ 4, "Number of Mechanical Start Failures" },
|
||||||
|
{ 4, "Number of Realloc. Candidate Logical Sectors" }, // ACS-3
|
||||||
|
{ 0, 0 }
|
||||||
|
};
|
||||||
|
|
||||||
|
const devstat_entry_info devstat_info_0x04[] = {
|
||||||
|
{ 2, "General Errors Statistics" },
|
||||||
|
{ 4, "Number of Reported Uncorrectable Errors" },
|
||||||
|
//{ 4, "Number of Resets Between Command Acceptance and Command Completion" },
|
||||||
|
{ 4, "Resets Between Cmd Acceptance and Completion" },
|
||||||
|
{ 0, 0 }
|
||||||
|
};
|
||||||
|
|
||||||
|
const devstat_entry_info devstat_info_0x05[] = {
|
||||||
|
{ 2, "Temperature Statistics" },
|
||||||
|
{ -1, "Current Temperature" },
|
||||||
|
{ -1, "Average Short Term Temperature" },
|
||||||
|
{ -1, "Average Long Term Temperature" },
|
||||||
|
{ -1, "Highest Temperature" },
|
||||||
|
{ -1, "Lowest Temperature" },
|
||||||
|
{ -1, "Highest Average Short Term Temperature" },
|
||||||
|
{ -1, "Lowest Average Short Term Temperature" },
|
||||||
|
{ -1, "Highest Average Long Term Temperature" },
|
||||||
|
{ -1, "Lowest Average Long Term Temperature" },
|
||||||
|
{ 4, "Time in Over-Temperature" },
|
||||||
|
{ -1, "Specified Maximum Operating Temperature" },
|
||||||
|
{ 4, "Time in Under-Temperature" },
|
||||||
|
{ -1, "Specified Minimum Operating Temperature" },
|
||||||
|
{ 0, 0 }
|
||||||
|
};
|
||||||
|
|
||||||
|
const devstat_entry_info devstat_info_0x06[] = {
|
||||||
|
{ 2, "Transport Statistics" },
|
||||||
|
{ 4, "Number of Hardware Resets" },
|
||||||
|
{ 4, "Number of ASR Events" },
|
||||||
|
{ 4, "Number of Interface CRC Errors" },
|
||||||
|
{ 0, 0 }
|
||||||
|
};
|
||||||
|
|
||||||
|
const devstat_entry_info devstat_info_0x07[] = {
|
||||||
|
{ 2, "Solid State Device Statistics" },
|
||||||
|
{ 1, "Percentage Used Endurance Indicator" },
|
||||||
|
{ 0, 0 }
|
||||||
|
};
|
||||||
|
|
||||||
|
const devstat_entry_info * devstat_infos[] = {
|
||||||
|
devstat_info_0x00,
|
||||||
|
devstat_info_0x01,
|
||||||
|
devstat_info_0x02,
|
||||||
|
devstat_info_0x03,
|
||||||
|
devstat_info_0x04,
|
||||||
|
devstat_info_0x05,
|
||||||
|
devstat_info_0x06,
|
||||||
|
devstat_info_0x07
|
||||||
|
};
|
||||||
|
|
||||||
|
const int num_devstat_infos = sizeof(devstat_infos)/sizeof(devstat_infos[0]);
|
||||||
|
|
||||||
|
static void print_device_statistics_page(const unsigned char * data, int page,
|
||||||
|
bool & need_trailer)
|
||||||
|
{
|
||||||
|
const devstat_entry_info * info = (page < num_devstat_infos ? devstat_infos[page] : 0);
|
||||||
|
const char * name = (info ? info[0].name : "Unknown Statistics");
|
||||||
|
|
||||||
|
// Check page number in header
|
||||||
|
static const char line[] = " ===== = = == ";
|
||||||
|
if (!data[2]) {
|
||||||
|
pout("%3d%s%s (empty) ==\n", page, line, name);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (data[2] != page) {
|
||||||
|
pout("%3d%s%s (invalid page %d in header) ==\n", page, line, name, data[2]);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
pout("%3d%s%s (rev %d) ==\n", page, line, name, data[0]);
|
||||||
|
|
||||||
|
// Print entries
|
||||||
|
for (int i = 1, offset = 8; offset < 512-7; i++, offset+=8) {
|
||||||
|
// Check for last known entry
|
||||||
|
if (info && !info[i].size)
|
||||||
|
info = 0;
|
||||||
|
|
||||||
|
// Skip unsupported entries
|
||||||
|
unsigned char flags = data[offset+7];
|
||||||
|
if (!(flags & 0x80))
|
||||||
|
continue;
|
||||||
|
|
||||||
|
// Get value size, default to max if unknown
|
||||||
|
int size = (info ? info[i].size : 7);
|
||||||
|
|
||||||
|
// Format value
|
||||||
|
char valstr[32];
|
||||||
|
if (flags & 0x40) { // valid flag
|
||||||
|
// Get value
|
||||||
|
int64_t val;
|
||||||
|
if (size < 0) {
|
||||||
|
val = (signed char)data[offset];
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
val = 0;
|
||||||
|
for (int j = 0; j < size; j++)
|
||||||
|
val |= (int64_t)data[offset+j] << (j*8);
|
||||||
|
}
|
||||||
|
snprintf(valstr, sizeof(valstr), "%"PRId64, val);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
// Value not known (yet)
|
||||||
|
strcpy(valstr, "-");
|
||||||
|
}
|
||||||
|
|
||||||
|
pout("%3d 0x%03x %d%c %15s%c %s\n",
|
||||||
|
page, offset,
|
||||||
|
abs(size),
|
||||||
|
(flags & 0x1f ? '+' : ' '), // unknown flags
|
||||||
|
valstr,
|
||||||
|
(flags & 0x20 ? '~' : ' '), // normalized flag
|
||||||
|
(info ? info[i].name : "Unknown"));
|
||||||
|
if (flags & 0x20)
|
||||||
|
need_trailer = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static bool print_device_statistics(ata_device * device, unsigned nsectors,
|
||||||
|
const std::vector<int> & single_pages, bool all_pages, bool ssd_page)
|
||||||
|
{
|
||||||
|
// Read list of supported pages from page 0
|
||||||
|
unsigned char page_0[512] = {0, };
|
||||||
|
if (!ataReadLogExt(device, 0x04, 0, 0, page_0, 1))
|
||||||
|
return false;
|
||||||
|
|
||||||
|
unsigned char nentries = page_0[8];
|
||||||
|
if (!(page_0[2] == 0 && nentries > 0)) {
|
||||||
|
pout("Device Statistics page 0 is invalid (page=%d, nentries=%d)\n", page_0[2], nentries);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Prepare list of pages to print
|
||||||
|
std::vector<int> pages;
|
||||||
|
unsigned i;
|
||||||
|
if (all_pages) {
|
||||||
|
// Add all supported pages
|
||||||
|
for (i = 0; i < nentries; i++) {
|
||||||
|
int page = page_0[8+1+i];
|
||||||
|
if (page)
|
||||||
|
pages.push_back(page);
|
||||||
|
}
|
||||||
|
ssd_page = false;
|
||||||
|
}
|
||||||
|
// Add manually specified pages
|
||||||
|
bool print_page_0 = false;
|
||||||
|
for (i = 0; i < single_pages.size() || ssd_page; i++) {
|
||||||
|
int page = (i < single_pages.size() ? single_pages[i] : 7);
|
||||||
|
if (!page)
|
||||||
|
print_page_0 = true;
|
||||||
|
else if (page >= (int)nsectors)
|
||||||
|
pout("Device Statistics Log has only %u pages\n", nsectors);
|
||||||
|
else
|
||||||
|
pages.push_back(page);
|
||||||
|
if (page == 7)
|
||||||
|
ssd_page = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Print list of supported pages if requested
|
||||||
|
if (print_page_0) {
|
||||||
|
pout("Device Statistics (GP Log 0x04) supported pages\n");
|
||||||
|
pout("Page Description\n");
|
||||||
|
for (i = 0; i < nentries; i++) {
|
||||||
|
int page = page_0[8+1+i];
|
||||||
|
pout("%3d %s\n", page,
|
||||||
|
(page < num_devstat_infos ? devstat_infos[page][0].name : "Unknown Statistics"));
|
||||||
|
}
|
||||||
|
pout("\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
// Read & print pages
|
||||||
|
if (!pages.empty()) {
|
||||||
|
pout("Device Statistics (GP Log 0x04)\n");
|
||||||
|
pout("Page Offset Size Value Description\n");
|
||||||
|
bool need_trailer = false;
|
||||||
|
|
||||||
|
for (i = 0; i < pages.size(); i++) {
|
||||||
|
int page = pages[i];
|
||||||
|
unsigned char page_n[512] = {0, };
|
||||||
|
if (!ataReadLogExt(device, 0x04, 0, page, page_n, 1))
|
||||||
|
return false;
|
||||||
|
print_device_statistics_page(page_n, page, need_trailer);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (need_trailer)
|
||||||
|
pout("%30s|_ ~ normalized value\n", "");
|
||||||
|
pout("\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
///////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
// Print log 0x11
|
// Print log 0x11
|
||||||
static void PrintSataPhyEventCounters(const unsigned char * data, bool reset)
|
static void PrintSataPhyEventCounters(const unsigned char * data, bool reset)
|
||||||
{
|
{
|
||||||
@ -1646,11 +1904,11 @@ static int ataPrintSCTStatus(const ata_sct_status_response * sts)
|
|||||||
pout("Device State: %s (%u)\n",
|
pout("Device State: %s (%u)\n",
|
||||||
sct_device_state_msg(sts->device_state), sts->device_state);
|
sct_device_state_msg(sts->device_state), sts->device_state);
|
||||||
char buf1[20], buf2[20];
|
char buf1[20], buf2[20];
|
||||||
if ( !sts->min_temp && !sts->life_min_temp && !sts->byte205
|
if ( !sts->min_temp && !sts->life_min_temp
|
||||||
&& !sts->under_limit_count && !sts->over_limit_count ) {
|
&& !sts->under_limit_count && !sts->over_limit_count) {
|
||||||
// "Reserved" fields not set, assume "old" format version 2
|
// "Reserved" fields not set, assume "old" format version 2
|
||||||
// Table 11 of T13/1701DT Revision 5
|
// Table 11 of T13/1701DT-N (SMART Command Transport) Revision 5, February 2005
|
||||||
// Table 54 of T13/1699-D Revision 3e
|
// Table 54 of T13/1699-D (ATA8-ACS) Revision 3e, July 2006
|
||||||
pout("Current Temperature: %s Celsius\n",
|
pout("Current Temperature: %s Celsius\n",
|
||||||
sct_ptemp(sts->hda_temp, buf1));
|
sct_ptemp(sts->hda_temp, buf1));
|
||||||
pout("Power Cycle Max Temperature: %s Celsius\n",
|
pout("Power Cycle Max Temperature: %s Celsius\n",
|
||||||
@ -1660,17 +1918,18 @@ static int ataPrintSCTStatus(const ata_sct_status_response * sts)
|
|||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
// Assume "new" format version 2 or version 3
|
// Assume "new" format version 2 or version 3
|
||||||
// T13/e06152r0-3 (Additional SCT Temperature Statistics)
|
// T13/e06152r0-3 (Additional SCT Temperature Statistics), August - October 2006
|
||||||
// Table 60 of T13/1699-D Revision 3f
|
// Table 60 of T13/1699-D (ATA8-ACS) Revision 3f, December 2006 (format version 2)
|
||||||
|
// Table 80 of T13/1699-D (ATA8-ACS) Revision 6a, September 2008 (format version 3)
|
||||||
pout("Current Temperature: %s Celsius\n",
|
pout("Current Temperature: %s Celsius\n",
|
||||||
sct_ptemp(sts->hda_temp, buf1));
|
sct_ptemp(sts->hda_temp, buf1));
|
||||||
pout("Power Cycle Min/Max Temperature: %s/%s Celsius\n",
|
pout("Power Cycle Min/Max Temperature: %s/%s Celsius\n",
|
||||||
sct_ptemp(sts->min_temp, buf1), sct_ptemp(sts->max_temp, buf2));
|
sct_ptemp(sts->min_temp, buf1), sct_ptemp(sts->max_temp, buf2));
|
||||||
pout("Lifetime Min/Max Temperature: %s/%s Celsius\n",
|
pout("Lifetime Min/Max Temperature: %s/%s Celsius\n",
|
||||||
sct_ptemp(sts->life_min_temp, buf1), sct_ptemp(sts->life_max_temp, buf2));
|
sct_ptemp(sts->life_min_temp, buf1), sct_ptemp(sts->life_max_temp, buf2));
|
||||||
if (sts->byte205) // e06152r0-2, removed in e06152r3
|
signed char avg = sts->byte205; // Average Temperature from e06152r0-2, removed in e06152r3
|
||||||
pout("Lifetime Average Temperature: %s Celsius\n",
|
if (0 < avg && sts->life_min_temp <= avg && avg <= sts->life_max_temp)
|
||||||
sct_ptemp((signed char)sts->byte205, buf1));
|
pout("Lifetime Average Temperature: %2d Celsius\n", avg);
|
||||||
pout("Under/Over Temperature Limit Count: %2u/%u\n",
|
pout("Under/Over Temperature Limit Count: %2u/%u\n",
|
||||||
sts->under_limit_count, sts->over_limit_count);
|
sts->under_limit_count, sts->over_limit_count);
|
||||||
}
|
}
|
||||||
@ -1743,6 +2002,121 @@ static void ataPrintSCTErrorRecoveryControl(bool set, unsigned short read_timer,
|
|||||||
pout(" Write: %6d (%0.1f seconds)\n", write_timer, write_timer/10.0);
|
pout(" Write: %6d (%0.1f seconds)\n", write_timer, write_timer/10.0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void print_aam_level(const char * msg, int level, int recommended = -1)
|
||||||
|
{
|
||||||
|
// Table 56 of T13/1699-D (ATA8-ACS) Revision 6a, September 6, 2008
|
||||||
|
// Obsolete since T13/2015-D (ACS-2) Revision 4a, December 9, 2010
|
||||||
|
const char * s;
|
||||||
|
if (level == 0)
|
||||||
|
s = "vendor specific";
|
||||||
|
else if (level < 128)
|
||||||
|
s = "unknown/retired";
|
||||||
|
else if (level == 128)
|
||||||
|
s = "quiet";
|
||||||
|
else if (level < 254)
|
||||||
|
s = "intermediate";
|
||||||
|
else if (level == 254)
|
||||||
|
s = "maximum performance";
|
||||||
|
else
|
||||||
|
s = "reserved";
|
||||||
|
|
||||||
|
if (recommended >= 0)
|
||||||
|
pout("%s%d (%s), recommended: %d\n", msg, level, s, recommended);
|
||||||
|
else
|
||||||
|
pout("%s%d (%s)\n", msg, level, s);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void print_apm_level(const char * msg, int level)
|
||||||
|
{
|
||||||
|
// Table 120 of T13/2015-D (ACS-2) Revision 7, June 22, 2011
|
||||||
|
const char * s;
|
||||||
|
if (!(1 <= level && level <= 254))
|
||||||
|
s = "reserved";
|
||||||
|
else if (level == 1)
|
||||||
|
s = "minimum power consumption with standby";
|
||||||
|
else if (level < 128)
|
||||||
|
s = "intermediate level with standby";
|
||||||
|
else if (level == 128)
|
||||||
|
s = "minimum power consumption without standby";
|
||||||
|
else if (level < 254)
|
||||||
|
s = "intermediate level without standby";
|
||||||
|
else
|
||||||
|
s = "maximum performance";
|
||||||
|
|
||||||
|
pout("%s%d (%s)\n", msg, level, s);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void print_ata_security_status(const char * msg, unsigned short state)
|
||||||
|
{
|
||||||
|
const char * s1, * s2 = "", * s3 = "", * s4 = "";
|
||||||
|
|
||||||
|
// Table 6 of T13/2015-D (ACS-2) Revision 7, June 22, 2011
|
||||||
|
if (!(state & 0x0001))
|
||||||
|
s1 = "Unavailable";
|
||||||
|
else if (!(state & 0x0002)) {
|
||||||
|
s1 = "Disabled, ";
|
||||||
|
if (!(state & 0x0008))
|
||||||
|
s2 = "NOT FROZEN [SEC1]";
|
||||||
|
else
|
||||||
|
s2 = "frozen [SEC2]";
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
s1 = "ENABLED, PW level ";
|
||||||
|
if (!(state & 0x0020))
|
||||||
|
s2 = "HIGH";
|
||||||
|
else
|
||||||
|
s2 = "MAX";
|
||||||
|
|
||||||
|
if (!(state & 0x0004)) {
|
||||||
|
s3 = ", not locked, ";
|
||||||
|
if (!(state & 0x0008))
|
||||||
|
s4 = "not frozen [SEC5]";
|
||||||
|
else
|
||||||
|
s4 = "frozen [SEC6]";
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
s3 = ", **LOCKED** [SEC4]";
|
||||||
|
if (state & 0x0010)
|
||||||
|
s4 = ", PW ATTEMPTS EXCEEDED";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pout("%s%s%s%s%s\n", msg, s1, s2, s3, s4);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void print_standby_timer(const char * msg, int timer, const ata_identify_device & drive)
|
||||||
|
{
|
||||||
|
const char * s1 = 0;
|
||||||
|
int hours = 0, minutes = 0 , seconds = 0;
|
||||||
|
|
||||||
|
// Table 63 of T13/2015-D (ACS-2) Revision 7, June 22, 2011
|
||||||
|
if (timer == 0)
|
||||||
|
s1 = "disabled";
|
||||||
|
else if (timer <= 240)
|
||||||
|
seconds = timer * 5, minutes = seconds / 60, seconds %= 60;
|
||||||
|
else if (timer <= 251)
|
||||||
|
minutes = (timer - 240) * 30, hours = minutes / 60, minutes %= 60;
|
||||||
|
else if (timer == 252)
|
||||||
|
minutes = 21;
|
||||||
|
else if (timer == 253)
|
||||||
|
s1 = "between 8 hours and 12 hours";
|
||||||
|
else if (timer == 255)
|
||||||
|
minutes = 21, seconds = 15;
|
||||||
|
else
|
||||||
|
s1 = "reserved";
|
||||||
|
|
||||||
|
const char * s2 = "", * s3 = "";
|
||||||
|
if (!(drive.words047_079[49-47] & 0x2000))
|
||||||
|
s2 = " or vendor-specific";
|
||||||
|
if (timer > 0 && (drive.words047_079[50-47] & 0xc001) == 0x4001)
|
||||||
|
s3 = ", a vendor-specific minimum applies";
|
||||||
|
|
||||||
|
if (s1)
|
||||||
|
pout("%s%d (%s%s%s)\n", msg, timer, s1, s2, s3);
|
||||||
|
else
|
||||||
|
pout("%s%d (%02d:%02d:%02d%s%s)\n", msg, timer, hours, minutes, seconds, s2, s3);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
int ataPrintMain (ata_device * device, const ata_print_options & options)
|
int ataPrintMain (ata_device * device, const ata_print_options & options)
|
||||||
{
|
{
|
||||||
@ -1815,6 +2189,9 @@ int ataPrintMain (ata_device * device, const ata_print_options & options)
|
|||||||
|| options.smart_ext_error_log
|
|| options.smart_ext_error_log
|
||||||
|| options.smart_ext_selftest_log
|
|| options.smart_ext_selftest_log
|
||||||
|| options.sataphy
|
|| options.sataphy
|
||||||
|
|| options.devstat_all_pages
|
||||||
|
|| options.devstat_ssd_page
|
||||||
|
|| !options.devstat_pages.empty()
|
||||||
);
|
);
|
||||||
|
|
||||||
unsigned i;
|
unsigned i;
|
||||||
@ -1837,7 +2214,7 @@ int ataPrintMain (ata_device * device, const ata_print_options & options)
|
|||||||
// Exit if no further options specified
|
// Exit if no further options specified
|
||||||
if (!( options.drive_info || need_smart_support
|
if (!( options.drive_info || need_smart_support
|
||||||
|| need_smart_logdir || need_gp_logdir
|
|| need_smart_logdir || need_gp_logdir
|
||||||
|| need_sct_support )) {
|
|| need_sct_support || options.get_set_used)) {
|
||||||
if (powername)
|
if (powername)
|
||||||
pout("Device is in %s mode\n", powername);
|
pout("Device is in %s mode\n", powername);
|
||||||
else
|
else
|
||||||
@ -1937,6 +2314,47 @@ int ataPrintMain (ata_device * device, const ata_print_options & options)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Print AAM status
|
||||||
|
if (options.get_aam) {
|
||||||
|
if ((drive.command_set_2 & 0xc200) != 0x4200) // word083
|
||||||
|
pout("AAM feature is: Unavailable\n");
|
||||||
|
else if (!(drive.word086 & 0x0200))
|
||||||
|
pout("AAM feature is: Disabled\n");
|
||||||
|
else
|
||||||
|
print_aam_level("AAM level is: ", drive.words088_255[94-88] & 0xff,
|
||||||
|
drive.words088_255[94-88] >> 8);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Print APM status
|
||||||
|
if (options.get_apm) {
|
||||||
|
if ((drive.command_set_2 & 0xc008) != 0x4008) // word083
|
||||||
|
pout("APM feature is: Unavailable\n");
|
||||||
|
else if (!(drive.word086 & 0x0008))
|
||||||
|
pout("APM feature is: Disabled\n");
|
||||||
|
else
|
||||||
|
print_apm_level("APM level is: ", drive.words088_255[91-88] & 0xff);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Print read look-ahead status
|
||||||
|
if (options.get_lookahead) {
|
||||||
|
pout("Rd look-ahead is: %s\n",
|
||||||
|
( (drive.command_set_2 & 0xc000) != 0x4000 // word083
|
||||||
|
|| !(drive.command_set_1 & 0x0040)) ? "Unavailable" : // word082
|
||||||
|
!(drive.cfs_enable_1 & 0x0040) ? "Disabled" : "Enabled"); // word085
|
||||||
|
}
|
||||||
|
|
||||||
|
// Print write cache status
|
||||||
|
if (options.get_wcache) {
|
||||||
|
pout("Write cache is: %s\n",
|
||||||
|
( (drive.command_set_2 & 0xc000) != 0x4000 // word083
|
||||||
|
|| !(drive.command_set_1 & 0x0020)) ? "Unavailable" : // word082
|
||||||
|
!(drive.cfs_enable_1 & 0x0020) ? "Disabled" : "Enabled"); // word085
|
||||||
|
}
|
||||||
|
|
||||||
|
// Print ATA security status
|
||||||
|
if (options.get_security)
|
||||||
|
print_ata_security_status("ATA Security is: ", drive.words088_255[128-88]);
|
||||||
|
|
||||||
// Print remaining drive info
|
// Print remaining drive info
|
||||||
if (options.drive_info) {
|
if (options.drive_info) {
|
||||||
// Print the (now possibly changed) power mode if available
|
// Print the (now possibly changed) power mode if available
|
||||||
@ -1955,6 +2373,88 @@ int ataPrintMain (ata_device * device, const ata_print_options & options)
|
|||||||
|| options.smart_auto_offl_disable || options.smart_auto_offl_enable)
|
|| options.smart_auto_offl_disable || options.smart_auto_offl_enable)
|
||||||
pout("=== START OF ENABLE/DISABLE COMMANDS SECTION ===\n");
|
pout("=== START OF ENABLE/DISABLE COMMANDS SECTION ===\n");
|
||||||
|
|
||||||
|
// Enable/Disable AAM
|
||||||
|
if (options.set_aam) {
|
||||||
|
if (options.set_aam > 0) {
|
||||||
|
if (!ata_set_features(device, ATA_ENABLE_AAM, options.set_aam-1)) {
|
||||||
|
pout("AAM enable failed: %s\n", device->get_errmsg());
|
||||||
|
returnval |= FAILSMART;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
print_aam_level("AAM set to level ", options.set_aam-1);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
if (!ata_set_features(device, ATA_DISABLE_AAM)) {
|
||||||
|
pout("AAM disable failed: %s\n", device->get_errmsg());
|
||||||
|
returnval |= FAILSMART;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
pout("AAM disabled\n");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Enable/Disable APM
|
||||||
|
if (options.set_apm) {
|
||||||
|
if (options.set_apm > 0) {
|
||||||
|
if (!ata_set_features(device, ATA_ENABLE_APM, options.set_apm-1)) {
|
||||||
|
pout("APM enable failed: %s\n", device->get_errmsg());
|
||||||
|
returnval |= FAILSMART;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
print_apm_level("APM set to level ", options.set_apm-1);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
if (!ata_set_features(device, ATA_DISABLE_APM)) {
|
||||||
|
pout("APM disable failed: %s\n", device->get_errmsg());
|
||||||
|
returnval |= FAILSMART;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
pout("APM disabled\n");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Enable/Disable read look-ahead
|
||||||
|
if (options.set_lookahead) {
|
||||||
|
bool enable = (options.set_lookahead > 0);
|
||||||
|
if (!ata_set_features(device, (enable ? ATA_ENABLE_READ_LOOK_AHEAD : ATA_DISABLE_READ_LOOK_AHEAD))) {
|
||||||
|
pout("Read look-ahead %sable failed: %s\n", (enable ? "en" : "dis"), device->get_errmsg());
|
||||||
|
returnval |= FAILSMART;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
pout("Read look-ahead %sabled\n", (enable ? "en" : "dis"));
|
||||||
|
}
|
||||||
|
|
||||||
|
// Enable/Disable write cache
|
||||||
|
if (options.set_wcache) {
|
||||||
|
bool enable = (options.set_wcache > 0);
|
||||||
|
if (!ata_set_features(device, (enable ? ATA_ENABLE_WRITE_CACHE : ATA_DISABLE_WRITE_CACHE))) {
|
||||||
|
pout("Write cache %sable failed: %s\n", (enable ? "en" : "dis"), device->get_errmsg());
|
||||||
|
returnval |= FAILSMART;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
pout("Write cache %sabled\n", (enable ? "en" : "dis"));
|
||||||
|
}
|
||||||
|
|
||||||
|
// Freeze ATA security
|
||||||
|
if (options.set_security_freeze) {
|
||||||
|
if (!ata_nodata_command(device, ATA_SECURITY_FREEZE_LOCK)) {
|
||||||
|
pout("ATA SECURITY FREEZE LOCK failed: %s\n", device->get_errmsg());
|
||||||
|
returnval |= FAILSMART;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
pout("ATA Security set to frozen mode\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
// Set standby timer
|
||||||
|
if (options.set_standby) {
|
||||||
|
if (!ata_nodata_command(device, ATA_IDLE, options.set_standby-1)) {
|
||||||
|
pout("ATA IDLE command failed: %s\n", device->get_errmsg());
|
||||||
|
returnval |= FAILSMART;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
print_standby_timer("Standby timer set to ", options.set_standby-1, drive);
|
||||||
|
}
|
||||||
|
|
||||||
// Enable/Disable SMART commands
|
// Enable/Disable SMART commands
|
||||||
if (options.smart_enable) {
|
if (options.smart_enable) {
|
||||||
if (ataEnableSmart(device)) {
|
if (ataEnableSmart(device)) {
|
||||||
@ -2493,6 +2993,16 @@ int ataPrintMain (ata_device * device, const ata_print_options & options)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Print Device Statistics
|
||||||
|
if (options.devstat_all_pages || options.devstat_ssd_page || !options.devstat_pages.empty()) {
|
||||||
|
unsigned nsectors = GetNumLogSectors(gplogdir, 0x04, true);
|
||||||
|
if (!nsectors)
|
||||||
|
pout("Device Statistics (GP Log 0x04) not supported\n");
|
||||||
|
else if (!print_device_statistics(device, nsectors, options.devstat_pages,
|
||||||
|
options.devstat_all_pages, options.devstat_ssd_page))
|
||||||
|
failuretest(OPTIONAL_CMD, returnval|=FAILSMART);
|
||||||
|
}
|
||||||
|
|
||||||
// Print SATA Phy Event Counters
|
// Print SATA Phy Event Counters
|
||||||
if (options.sataphy) {
|
if (options.sataphy) {
|
||||||
unsigned nsectors = GetNumLogSectors(gplogdir, 0x11, true);
|
unsigned nsectors = GetNumLogSectors(gplogdir, 0x11, true);
|
||||||
@ -2510,6 +3020,17 @@ int ataPrintMain (ata_device * device, const ata_print_options & options)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Set to standby (spindown) mode
|
||||||
|
// (Above commands may spinup drive)
|
||||||
|
if (options.set_standby_now) {
|
||||||
|
if (!ata_nodata_command(device, ATA_STANDBY_IMMEDIATE)) {
|
||||||
|
pout("ATA STANDBY IMMEDIATE command failed: %s\n", device->get_errmsg());
|
||||||
|
returnval |= FAILSMART;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
pout("Device placed in STANDBY mode\n");
|
||||||
|
}
|
||||||
|
|
||||||
// START OF THE TESTING SECTION OF THE CODE. IF NO TESTING, RETURN
|
// START OF THE TESTING SECTION OF THE CODE. IF NO TESTING, RETURN
|
||||||
if (!smart_val_ok || options.smart_selftest_type == -1)
|
if (!smart_val_ok || options.smart_selftest_type == -1)
|
||||||
return returnval;
|
return returnval;
|
||||||
@ -2553,8 +3074,8 @@ int ataPrintMain (ata_device * device, const ata_print_options & options)
|
|||||||
|
|
||||||
// Now do the test. Note ataSmartTest prints its own error/success
|
// Now do the test. Note ataSmartTest prints its own error/success
|
||||||
// messages
|
// messages
|
||||||
if (ataSmartTest(device, options.smart_selftest_type, options.smart_selective_args,
|
if (ataSmartTest(device, options.smart_selftest_type, options.smart_selftest_force,
|
||||||
&smartval, sizes.sectors ))
|
options.smart_selective_args, &smartval, sizes.sectors ))
|
||||||
failuretest(OPTIONAL_CMD, returnval|=FAILSMART);
|
failuretest(OPTIONAL_CMD, returnval|=FAILSMART);
|
||||||
else {
|
else {
|
||||||
// Tell user how long test will take to complete. This is tricky
|
// Tell user how long test will take to complete. This is tricky
|
||||||
|
34
ataprint.h
34
ataprint.h
@ -4,7 +4,7 @@
|
|||||||
* Home page of code is: http://smartmontools.sourceforge.net
|
* Home page of code is: http://smartmontools.sourceforge.net
|
||||||
*
|
*
|
||||||
* Copyright (C) 2002-9 Bruce Allen <smartmontools-support@lists.sourceforge.net>
|
* Copyright (C) 2002-9 Bruce Allen <smartmontools-support@lists.sourceforge.net>
|
||||||
* Copyright (C) 2008-9 Christian Franke <smartmontools-support@lists.sourceforge.net>
|
* Copyright (C) 2008-12 Christian Franke <smartmontools-support@lists.sourceforge.net>
|
||||||
* Copyright (C) 1999-2000 Michael Cornwell <cornwell@acm.org>
|
* Copyright (C) 1999-2000 Michael Cornwell <cornwell@acm.org>
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or modify
|
* This program is free software; you can redistribute it and/or modify
|
||||||
@ -26,7 +26,7 @@
|
|||||||
#ifndef ATAPRINT_H_
|
#ifndef ATAPRINT_H_
|
||||||
#define ATAPRINT_H_
|
#define ATAPRINT_H_
|
||||||
|
|
||||||
#define ATAPRINT_H_CVSID "$Id: ataprint.h 3316 2011-04-19 19:34:57Z chrfranke $\n"
|
#define ATAPRINT_H_CVSID "$Id: ataprint.h 3508 2012-02-12 15:47:56Z chrfranke $\n"
|
||||||
|
|
||||||
#include <vector>
|
#include <vector>
|
||||||
|
|
||||||
@ -61,6 +61,9 @@ struct ata_print_options
|
|||||||
|
|
||||||
std::vector<ata_log_request> log_requests;
|
std::vector<ata_log_request> log_requests;
|
||||||
|
|
||||||
|
bool devstat_all_pages, devstat_ssd_page;
|
||||||
|
std::vector<int> devstat_pages;
|
||||||
|
|
||||||
bool sct_temp_sts, sct_temp_hist;
|
bool sct_temp_sts, sct_temp_hist;
|
||||||
bool sct_erc_get;
|
bool sct_erc_get;
|
||||||
bool sct_erc_set;
|
bool sct_erc_set;
|
||||||
@ -72,6 +75,7 @@ struct ata_print_options
|
|||||||
bool smart_auto_save_disable, smart_auto_save_enable;
|
bool smart_auto_save_disable, smart_auto_save_enable;
|
||||||
|
|
||||||
int smart_selftest_type; // OFFLINE_FULL_SCAN, ..., see atacmds.h. -1 for no test
|
int smart_selftest_type; // OFFLINE_FULL_SCAN, ..., see atacmds.h. -1 for no test
|
||||||
|
bool smart_selftest_force; // Ignore already running test
|
||||||
ata_selective_selftest_args smart_selective_args; // Extra args for selective self-test
|
ata_selective_selftest_args smart_selective_args; // Extra args for selective self-test
|
||||||
|
|
||||||
unsigned sct_temp_int;
|
unsigned sct_temp_int;
|
||||||
@ -87,6 +91,20 @@ struct ata_print_options
|
|||||||
bool show_presets; // Show presets and exit
|
bool show_presets; // Show presets and exit
|
||||||
unsigned char powermode; // Skip check, if disk in idle or standby mode
|
unsigned char powermode; // Skip check, if disk in idle or standby mode
|
||||||
|
|
||||||
|
bool get_set_used; // true if any get/set command is used
|
||||||
|
bool get_aam; // print Automatic Acoustic Management status
|
||||||
|
int set_aam; // disable(-1), enable(1..255->0..254) Automatic Acoustic Management
|
||||||
|
bool get_apm; // print Advanced Power Management status
|
||||||
|
int set_apm; // disable(-1), enable(2..255->1..254) Advanced Power Management
|
||||||
|
bool get_lookahead; // print read look-ahead status
|
||||||
|
int set_lookahead; // disable(-1), enable(1) read look-ahead
|
||||||
|
int set_standby; // set(1..255->0..254) standby timer
|
||||||
|
bool set_standby_now; // set drive to standby
|
||||||
|
bool get_security; // print ATA security status
|
||||||
|
bool set_security_freeze; // Freeze ATA security
|
||||||
|
bool get_wcache; // print write cache status
|
||||||
|
int set_wcache; // disable(-1), enable(1) write cache
|
||||||
|
|
||||||
ata_print_options()
|
ata_print_options()
|
||||||
: drive_info(false),
|
: drive_info(false),
|
||||||
smart_check_status(false),
|
smart_check_status(false),
|
||||||
@ -99,6 +117,7 @@ struct ata_print_options
|
|||||||
smart_ext_error_log(0),
|
smart_ext_error_log(0),
|
||||||
smart_ext_selftest_log(0),
|
smart_ext_selftest_log(0),
|
||||||
retry_error_log(false), retry_selftest_log(false),
|
retry_error_log(false), retry_selftest_log(false),
|
||||||
|
devstat_all_pages(false), devstat_ssd_page(false),
|
||||||
sct_temp_sts(false), sct_temp_hist(false),
|
sct_temp_sts(false), sct_temp_hist(false),
|
||||||
sct_erc_get(false),
|
sct_erc_get(false),
|
||||||
sct_erc_set(false),
|
sct_erc_set(false),
|
||||||
@ -107,14 +126,21 @@ struct ata_print_options
|
|||||||
smart_disable(false), smart_enable(false),
|
smart_disable(false), smart_enable(false),
|
||||||
smart_auto_offl_disable(false), smart_auto_offl_enable(false),
|
smart_auto_offl_disable(false), smart_auto_offl_enable(false),
|
||||||
smart_auto_save_disable(false), smart_auto_save_enable(false),
|
smart_auto_save_disable(false), smart_auto_save_enable(false),
|
||||||
smart_selftest_type(-1),
|
smart_selftest_type(-1), smart_selftest_force(false),
|
||||||
sct_temp_int(0), sct_temp_int_pers(false),
|
sct_temp_int(0), sct_temp_int_pers(false),
|
||||||
output_format(0),
|
output_format(0),
|
||||||
fix_firmwarebug(FIX_NOTSPECIFIED),
|
fix_firmwarebug(FIX_NOTSPECIFIED),
|
||||||
fix_swapped_id(false),
|
fix_swapped_id(false),
|
||||||
ignore_presets(false),
|
ignore_presets(false),
|
||||||
show_presets(false),
|
show_presets(false),
|
||||||
powermode(0)
|
powermode(0),
|
||||||
|
get_set_used(false),
|
||||||
|
get_aam(false), set_aam(0),
|
||||||
|
get_apm(false), set_apm(0),
|
||||||
|
get_lookahead(false), set_lookahead(0),
|
||||||
|
set_standby(0), set_standby_now(false),
|
||||||
|
get_security(false), set_security_freeze(false),
|
||||||
|
get_wcache(false), set_wcache(0)
|
||||||
{ }
|
{ }
|
||||||
};
|
};
|
||||||
|
|
||||||
|
18
autogen.sh
18
autogen.sh
@ -1,5 +1,5 @@
|
|||||||
#!/bin/sh
|
#!/bin/sh
|
||||||
# $Id: autogen.sh 3043 2010-01-22 19:24:59Z chrfranke $
|
# $Id: autogen.sh 3462 2011-10-27 19:55:10Z chrfranke $
|
||||||
#
|
#
|
||||||
# Generate ./configure from config.in and Makefile.in from Makefile.am.
|
# Generate ./configure from config.in and Makefile.in from Makefile.am.
|
||||||
# This also adds files like missing,depcomp,install-sh to the source
|
# This also adds files like missing,depcomp,install-sh to the source
|
||||||
@ -92,9 +92,21 @@ case "$ver" in
|
|||||||
echo "Please report success/failure to the smartmontools-support mailing list."
|
echo "Please report success/failure to the smartmontools-support mailing list."
|
||||||
esac
|
esac
|
||||||
|
|
||||||
|
# Install pkg-config macros
|
||||||
|
# (Don't use 'aclocal -I m4 --install' to keep support for automake < 1.10)
|
||||||
|
test -d m4 || mkdir m4 || exit 1
|
||||||
|
test -f m4/pkg.m4 || acdir=`${ACLOCAL} --print-ac-dir` &&
|
||||||
|
test -n "$acdir" && test -f "$acdir/pkg.m4" &&
|
||||||
|
{
|
||||||
|
echo "$0: installing \`m4/pkg.m4' from \`$acdir/pkg.m4'"
|
||||||
|
cp "$acdir/pkg.m4" m4/pkg.m4
|
||||||
|
}
|
||||||
|
test -f m4/pkg.m4 ||
|
||||||
|
echo "Warning: cannot install m4/pkg.m4, 'make dist' and systemd detection will not work."
|
||||||
|
|
||||||
set -e # stops on error status
|
set -e # stops on error status
|
||||||
|
|
||||||
${ACLOCAL}
|
${ACLOCAL} -I m4
|
||||||
autoheader
|
autoheader
|
||||||
${AUTOMAKE} --add-missing --copy --foreign
|
${AUTOMAKE} --add-missing --copy
|
||||||
autoconf
|
autoconf
|
||||||
|
10
cciss.cpp
10
cciss.cpp
@ -18,13 +18,13 @@
|
|||||||
# ifndef be32toh
|
# ifndef be32toh
|
||||||
# define be32toh __be32_to_cpu
|
# define be32toh __be32_to_cpu
|
||||||
# endif
|
# endif
|
||||||
#elif defined(__FreeBSD__) && defined(HAVE_DEV_CISS_CISSIO_H)
|
#elif defined(__FreeBSD__)
|
||||||
# include <sys/endian.h>
|
# include <sys/endian.h>
|
||||||
# include <dev/ciss/cissio.h>
|
# include CISS_LOCATION
|
||||||
# define _HAVE_CCISS
|
# define _HAVE_CCISS
|
||||||
#elif defined(__FreeBSD_kernel__) && defined(HAVE_DEV_CISS_CISSIO_H)
|
#elif defined(__FreeBSD_kernel__)
|
||||||
# include <endian.h>
|
# include <endian.h>
|
||||||
# include <dev/ciss/cissio.h>
|
# include CISS_LOCATION
|
||||||
# define _HAVE_CCISS
|
# define _HAVE_CCISS
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@ -34,7 +34,7 @@
|
|||||||
#include "scsicmds.h"
|
#include "scsicmds.h"
|
||||||
#include "utility.h"
|
#include "utility.h"
|
||||||
|
|
||||||
const char * cciss_cpp_cvsid = "$Id: cciss.cpp 3266 2011-02-21 16:33:04Z chrfranke $"
|
const char * cciss_cpp_cvsid = "$Id: cciss.cpp 3446 2011-10-13 22:36:28Z samm2 $"
|
||||||
CCISS_H_CVSID;
|
CCISS_H_CVSID;
|
||||||
|
|
||||||
typedef struct _ReportLUNdata_struct
|
typedef struct _ReportLUNdata_struct
|
||||||
|
235
cissio_freebsd.h
Normal file
235
cissio_freebsd.h
Normal file
@ -0,0 +1,235 @@
|
|||||||
|
/*-
|
||||||
|
* Copyright (c) 2001 Michael Smith
|
||||||
|
* All rights reserved.
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or without
|
||||||
|
* modification, are permitted provided that the following conditions
|
||||||
|
* are met:
|
||||||
|
* 1. Redistributions of source code must retain the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer.
|
||||||
|
* 2. Redistributions in binary form must reproduce the above copyright
|
||||||
|
* notice, this list of conditions and the following disclaimer in the
|
||||||
|
* documentation and/or other materials provided with the distribution.
|
||||||
|
*
|
||||||
|
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
|
||||||
|
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||||
|
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||||
|
* ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
|
||||||
|
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||||
|
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
||||||
|
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||||
|
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||||
|
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
||||||
|
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||||
|
* SUCH DAMAGE.
|
||||||
|
*
|
||||||
|
* $FreeBSD: src/sys/dev/ciss/cissio.h,v 1.6.2.1.6.1 2010/12/21 17:09:25 kensmith Exp $
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Driver ioctl interface.
|
||||||
|
*
|
||||||
|
* Note that this interface is API-compatible with the Linux implementation
|
||||||
|
* except as noted, and thus this header bears a striking resemblance to
|
||||||
|
* the Linux driver's cciss_ioctl.h.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <sys/ioccom.h>
|
||||||
|
|
||||||
|
#pragma pack(1)
|
||||||
|
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
u_int8_t bus;
|
||||||
|
u_int8_t dev_fn;
|
||||||
|
u_int32_t board_id;
|
||||||
|
} cciss_pci_info_struct;
|
||||||
|
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
u_int32_t delay;
|
||||||
|
u_int32_t count;
|
||||||
|
} cciss_coalint_struct;
|
||||||
|
|
||||||
|
typedef char NodeName_type[16];
|
||||||
|
typedef u_int32_t Heartbeat_type;
|
||||||
|
|
||||||
|
#define CISS_PARSCSIU2 0x0001
|
||||||
|
#define CISS_PARCSCIU3 0x0002
|
||||||
|
#define CISS_FIBRE1G 0x0100
|
||||||
|
#define CISS_FIBRE2G 0x0200
|
||||||
|
typedef u_int32_t BusTypes_type;
|
||||||
|
|
||||||
|
typedef char FirmwareVer_type[4];
|
||||||
|
typedef u_int32_t DriverVer_type;
|
||||||
|
|
||||||
|
/* passthrough command definitions */
|
||||||
|
#define SENSEINFOBYTES 32
|
||||||
|
#define CISS_MAX_LUN 16
|
||||||
|
#define LEVEL2LUN 1
|
||||||
|
#define LEVEL3LUN 0
|
||||||
|
|
||||||
|
/* command status value */
|
||||||
|
#define CMD_SUCCESS 0x0000
|
||||||
|
#define CMD_TARGET_STATUS 0x0001
|
||||||
|
#define CMD_DATA_UNDERRUN 0x0002
|
||||||
|
#define CMD_DATA_OVERRUN 0x0003
|
||||||
|
#define CMD_INVALID 0x0004
|
||||||
|
#define CMD_PROTOCOL_ERR 0x0005
|
||||||
|
#define CMD_HARDWARE_ERR 0x0006
|
||||||
|
#define CMD_CONNECTION_LOST 0x0007
|
||||||
|
#define CMD_ABORTED 0x0008
|
||||||
|
#define CMD_ABORT_FAILED 0x0009
|
||||||
|
#define CMD_UNSOLICITED_ABORT 0x000A
|
||||||
|
#define CMD_TIMEOUT 0x000B
|
||||||
|
#define CMD_UNABORTABLE 0x000C
|
||||||
|
|
||||||
|
/* transfer direction */
|
||||||
|
#define XFER_NONE 0x00
|
||||||
|
#define XFER_WRITE 0x01
|
||||||
|
#define XFER_READ 0x02
|
||||||
|
#define XFER_RSVD 0x03
|
||||||
|
|
||||||
|
/* task attribute */
|
||||||
|
#define ATTR_UNTAGGED 0x00
|
||||||
|
#define ATTR_SIMPLE 0x04
|
||||||
|
#define ATTR_HEADOFQUEUE 0x05
|
||||||
|
#define ATTR_ORDERED 0x06
|
||||||
|
#define ATTR_ACA 0x07
|
||||||
|
|
||||||
|
/* CDB type */
|
||||||
|
#define TYPE_CMD 0x00
|
||||||
|
#define TYPE_MSG 0x01
|
||||||
|
|
||||||
|
/* command list structure */
|
||||||
|
typedef union {
|
||||||
|
struct {
|
||||||
|
u_int8_t Dev;
|
||||||
|
u_int8_t Bus:6;
|
||||||
|
u_int8_t Mode:2;
|
||||||
|
} __packed PeripDev;
|
||||||
|
struct {
|
||||||
|
u_int8_t DevLSB;
|
||||||
|
u_int8_t DevMSB:6;
|
||||||
|
u_int8_t Mode:2;
|
||||||
|
} __packed LogDev;
|
||||||
|
struct {
|
||||||
|
u_int8_t Dev:5;
|
||||||
|
u_int8_t Bus:3;
|
||||||
|
u_int8_t Targ:6;
|
||||||
|
u_int8_t Mode:2;
|
||||||
|
} __packed LogUnit;
|
||||||
|
} SCSI3Addr_struct;
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
u_int32_t TargetId:24;
|
||||||
|
u_int32_t Bus:6;
|
||||||
|
u_int32_t Mode:2;
|
||||||
|
SCSI3Addr_struct Target[2];
|
||||||
|
} __packed PhysDevAddr_struct;
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
u_int32_t VolId:30;
|
||||||
|
u_int32_t Mode:2;
|
||||||
|
u_int8_t reserved[4];
|
||||||
|
} __packed LogDevAddr_struct;
|
||||||
|
|
||||||
|
typedef union {
|
||||||
|
u_int8_t LunAddrBytes[8];
|
||||||
|
SCSI3Addr_struct SCSI3Lun[4];
|
||||||
|
PhysDevAddr_struct PhysDev;
|
||||||
|
LogDevAddr_struct LogDev;
|
||||||
|
} __packed LUNAddr_struct;
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
u_int8_t CDBLen;
|
||||||
|
struct {
|
||||||
|
u_int8_t Type:3;
|
||||||
|
u_int8_t Attribute:3;
|
||||||
|
u_int8_t Direction:2;
|
||||||
|
} __packed Type;
|
||||||
|
u_int16_t Timeout;
|
||||||
|
u_int8_t CDB[16];
|
||||||
|
} __packed RequestBlock_struct;
|
||||||
|
|
||||||
|
typedef union {
|
||||||
|
struct {
|
||||||
|
u_int8_t Reserved[3];
|
||||||
|
u_int8_t Type;
|
||||||
|
u_int32_t ErrorInfo;
|
||||||
|
} __packed Common_Info;
|
||||||
|
struct {
|
||||||
|
u_int8_t Reserved[2];
|
||||||
|
u_int8_t offense_size;
|
||||||
|
u_int8_t offense_num;
|
||||||
|
u_int32_t offense_value;
|
||||||
|
} __packed Invalid_Cmd;
|
||||||
|
} __packed MoreErrInfo_struct;
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
u_int8_t ScsiStatus;
|
||||||
|
u_int8_t SenseLen;
|
||||||
|
u_int16_t CommandStatus;
|
||||||
|
u_int32_t ResidualCnt;
|
||||||
|
MoreErrInfo_struct MoreErrInfo;
|
||||||
|
u_int8_t SenseInfo[SENSEINFOBYTES];
|
||||||
|
} __packed ErrorInfo_struct;
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
LUNAddr_struct LUN_info; /* 8 */
|
||||||
|
RequestBlock_struct Request; /* 20 */
|
||||||
|
ErrorInfo_struct error_info; /* 48 */
|
||||||
|
u_int16_t buf_size; /* 2 */
|
||||||
|
u_int8_t *buf; /* 4 */
|
||||||
|
} __packed IOCTL_Command_struct;
|
||||||
|
|
||||||
|
#ifdef __amd64__
|
||||||
|
typedef struct {
|
||||||
|
LUNAddr_struct LUN_info; /* 8 */
|
||||||
|
RequestBlock_struct Request; /* 20 */
|
||||||
|
ErrorInfo_struct error_info; /* 48 */
|
||||||
|
u_int16_t buf_size; /* 2 */
|
||||||
|
u_int32_t buf; /* 4 */
|
||||||
|
} __packed IOCTL_Command_struct32;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/************************************************************************
|
||||||
|
* Command queue statistics
|
||||||
|
*/
|
||||||
|
|
||||||
|
#define CISSQ_FREE 0
|
||||||
|
#define CISSQ_NOTIFY 1
|
||||||
|
#define CISSQ_COUNT 2
|
||||||
|
|
||||||
|
struct ciss_qstat {
|
||||||
|
uint32_t q_length;
|
||||||
|
uint32_t q_max;
|
||||||
|
};
|
||||||
|
|
||||||
|
union ciss_statrequest {
|
||||||
|
uint32_t cs_item;
|
||||||
|
struct ciss_qstat cs_qstat;
|
||||||
|
};
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Note that we'd normally pass the struct in directly, but
|
||||||
|
* this code is trying to be compatible with other drivers.
|
||||||
|
*/
|
||||||
|
#define CCISS_GETPCIINFO _IOR ('C', 200, cciss_pci_info_struct)
|
||||||
|
#define CCISS_GETINTINFO _IOR ('C', 201, cciss_coalint_struct)
|
||||||
|
#define CCISS_SETINTINFO _IOW ('C', 202, cciss_coalint_struct)
|
||||||
|
#define CCISS_GETNODENAME _IOR ('C', 203, NodeName_type)
|
||||||
|
#define CCISS_SETNODENAME _IOW ('C', 204, NodeName_type)
|
||||||
|
#define CCISS_GETHEARTBEAT _IOR ('C', 205, Heartbeat_type)
|
||||||
|
#define CCISS_GETBUSTYPES _IOR ('C', 206, BusTypes_type)
|
||||||
|
#define CCISS_GETFIRMVER _IOR ('C', 207, FirmwareVer_type)
|
||||||
|
#define CCISS_GETDRIVERVER _IOR ('C', 208, DriverVer_type)
|
||||||
|
#define CCISS_REVALIDVOLS _IO ('C', 209)
|
||||||
|
#define CCISS_PASSTHRU _IOWR ('C', 210, IOCTL_Command_struct)
|
||||||
|
#ifdef __amd64
|
||||||
|
#define CCISS_PASSTHRU32 _IOWR ('C', 210, IOCTL_Command_struct32)
|
||||||
|
#endif
|
||||||
|
#define CCISS_GETQSTATS _IOWR ('C', 211, union ciss_statrequest)
|
||||||
|
|
||||||
|
#pragma pack()
|
95
configure.in
95
configure.in
@ -1,15 +1,15 @@
|
|||||||
#
|
#
|
||||||
# $Id: configure.in 3365 2011-06-09 18:47:31Z chrfranke $
|
# $Id: configure.in 3462 2011-10-27 19:55:10Z chrfranke $
|
||||||
#
|
#
|
||||||
dnl Process this file with autoconf to produce a configure script.
|
dnl Process this file with autoconf to produce a configure script.
|
||||||
AC_PREREQ(2.50)
|
AC_PREREQ(2.50)
|
||||||
AC_INIT(smartmontools, 5.41, smartmontools-support@lists.sourceforge.net)
|
AC_INIT(smartmontools, 5.43, smartmontools-support@lists.sourceforge.net)
|
||||||
AC_CONFIG_SRCDIR(smartctl.cpp)
|
AC_CONFIG_SRCDIR(smartctl.cpp)
|
||||||
|
|
||||||
smartmontools_configure_date=`date -u +'%Y-%m-%d %T %Z'`
|
smartmontools_configure_date=`date -u +'%Y-%m-%d %T %Z'`
|
||||||
smartmontools_cvs_tag=`echo '$Id: configure.in 3365 2011-06-09 18:47:31Z chrfranke $'`
|
smartmontools_cvs_tag=`echo '$Id: configure.in 3462 2011-10-27 19:55:10Z chrfranke $'`
|
||||||
smartmontools_release_date=2011-06-09
|
smartmontools_release_date=2011-10-20
|
||||||
smartmontools_release_time="18:46:32 UTC"
|
smartmontools_release_time="19:19:34 UTC"
|
||||||
|
|
||||||
AC_DEFINE_UNQUOTED(SMARTMONTOOLS_CONFIGURE_ARGS, "$ac_configure_args", [smartmontools Configure Arguments])
|
AC_DEFINE_UNQUOTED(SMARTMONTOOLS_CONFIGURE_ARGS, "$ac_configure_args", [smartmontools Configure Arguments])
|
||||||
AC_DEFINE_UNQUOTED(SMARTMONTOOLS_CONFIGURE_DATE, "$smartmontools_configure_date", [smartmontools Configure Date])
|
AC_DEFINE_UNQUOTED(SMARTMONTOOLS_CONFIGURE_DATE, "$smartmontools_configure_date", [smartmontools Configure Date])
|
||||||
@ -20,7 +20,7 @@ AC_DEFINE_UNQUOTED(PACKAGE_HOMEPAGE, "http://smartmontools.sourcefor
|
|||||||
|
|
||||||
AM_CONFIG_HEADER(config.h)
|
AM_CONFIG_HEADER(config.h)
|
||||||
|
|
||||||
AM_INIT_AUTOMAKE
|
AM_INIT_AUTOMAKE([foreign])
|
||||||
|
|
||||||
AM_MAINTAINER_MODE
|
AM_MAINTAINER_MODE
|
||||||
|
|
||||||
@ -29,14 +29,18 @@ dnl Checks for programs.
|
|||||||
AC_PROG_CXX
|
AC_PROG_CXX
|
||||||
AM_PROG_AS
|
AM_PROG_AS
|
||||||
AC_PROG_INSTALL
|
AC_PROG_INSTALL
|
||||||
PKG_PROG_PKG_CONFIG
|
|
||||||
|
m4_pattern_forbid([^PKG_PROG_])
|
||||||
|
if test "$cross_compiling" = "no"; then
|
||||||
|
m4_ifdef([PKG_PROG_PKG_CONFIG], [PKG_PROG_PKG_CONFIG],
|
||||||
|
[AC_MSG_WARN([m4/pkg.m4 missing, systemd detection disabled])])
|
||||||
|
fi
|
||||||
|
|
||||||
AC_ARG_VAR(WINDMC, [Windows message compiler command])
|
AC_ARG_VAR(WINDMC, [Windows message compiler command])
|
||||||
AC_ARG_VAR(WINDRES, [Windows resource compiler command])
|
AC_ARG_VAR(WINDRES, [Windows resource compiler command])
|
||||||
AC_ARG_VAR(MAKENSIS, [NSIS compiler command])
|
AC_ARG_VAR(MAKENSIS, [NSIS compiler command])
|
||||||
|
|
||||||
AC_CANONICAL_HOST
|
AC_CANONICAL_HOST
|
||||||
dnl Set flags which may affect AC_CHECK_*.
|
|
||||||
case "${host}" in
|
case "${host}" in
|
||||||
*-*-mingw*)
|
*-*-mingw*)
|
||||||
# Cygwin gcc 4.x does no longer support '-mno-cygwin' to select MinGW gcc.
|
# Cygwin gcc 4.x does no longer support '-mno-cygwin' to select MinGW gcc.
|
||||||
@ -56,11 +60,6 @@ case "${host}" in
|
|||||||
fi
|
fi
|
||||||
fi
|
fi
|
||||||
AC_MSG_RESULT([${MAKENSIS:-no}])
|
AC_MSG_RESULT([${MAKENSIS:-no}])
|
||||||
|
|
||||||
CPPFLAGS="$CPPFLAGS -I$srcdir/os_win32"
|
|
||||||
;;
|
|
||||||
*-*-freebsd*)
|
|
||||||
CPPFLAGS="$CPPFLAGS -I/usr/src/sys"
|
|
||||||
;;
|
;;
|
||||||
esac
|
esac
|
||||||
|
|
||||||
@ -98,10 +97,13 @@ AC_CHECK_HEADERS([sys/tweio.h])
|
|||||||
AC_CHECK_HEADERS([sys/twereg.h])
|
AC_CHECK_HEADERS([sys/twereg.h])
|
||||||
dnl Check for FreeBSD twa include files...
|
dnl Check for FreeBSD twa include files...
|
||||||
AC_CHECK_HEADERS([sys/tw_osl_ioctl.h])
|
AC_CHECK_HEADERS([sys/tw_osl_ioctl.h])
|
||||||
dnl Check for FreeBSD ciss include files...
|
|
||||||
AC_CHECK_HEADERS([dev/ciss/cissio.h])
|
|
||||||
dnl This header file is needed for cciss_ioctl.h at least on SuSE LINUX
|
dnl This header file is needed for cciss_ioctl.h at least on SuSE LINUX
|
||||||
AC_CHECK_HEADERS([linux/compiler.h])
|
AC_CHECK_HEADERS([linux/compiler.h])
|
||||||
|
dnl Check for the FreeBSD CCISS system header and use internal one if not found
|
||||||
|
AC_CHECK_HEADERS([dev/ciss/cissio.h],
|
||||||
|
[AC_DEFINE([CISS_LOCATION],[<dev/ciss/cissio.h>],[freebsd ciss header location])],
|
||||||
|
[AC_DEFINE([CISS_LOCATION],["cissio_freebsd.h"],[freebsd ciss header location])]
|
||||||
|
)
|
||||||
dnl Check for Linux CCISS include file
|
dnl Check for Linux CCISS include file
|
||||||
AC_CHECK_HEADERS([linux/cciss_ioctl.h], [], [], [AC_INCLUDES_DEFAULT
|
AC_CHECK_HEADERS([linux/cciss_ioctl.h], [], [], [AC_INCLUDES_DEFAULT
|
||||||
#ifdef HAVE_LINUX_COMPILER_H
|
#ifdef HAVE_LINUX_COMPILER_H
|
||||||
@ -148,13 +150,13 @@ fi
|
|||||||
AC_MSG_RESULT([$libc_have_working_snprintf])
|
AC_MSG_RESULT([$libc_have_working_snprintf])
|
||||||
|
|
||||||
# check for __attribute__((packed))
|
# check for __attribute__((packed))
|
||||||
|
# (sizeof() check is required to avoid false positives if other
|
||||||
|
# __attribute__((x)) are supported)
|
||||||
AC_MSG_CHECKING([whether $CXX supports __attribute__((packed))])
|
AC_MSG_CHECKING([whether $CXX supports __attribute__((packed))])
|
||||||
AC_COMPILE_IFELSE([AC_LANG_PROGRAM(, [[struct a { int b; } __attribute__((packed));]])],
|
AC_COMPILE_IFELSE([AC_LANG_PROGRAM(, [[
|
||||||
[gcc_have_attr_packed=yes], [gcc_have_attr_packed=no])
|
struct s { char a; short b; } __attribute__((packed));
|
||||||
AC_COMPILE_IFELSE([AC_LANG_PROGRAM(, [[#if defined(__SUNPRO_C) || defined(__SUNPRO_CC)
|
typedef char t[sizeof(struct s) == 3 ? 1 : -1];]])],
|
||||||
#error "Sun's compiler cannot handle __attribute__((packed))!"
|
[gcc_have_attr_packed=yes], [gcc_have_attr_packed=no])
|
||||||
#endif]])],
|
|
||||||
[true], [gcc_have_attr_packed=no])
|
|
||||||
AC_SUBST(gcc_have_attr_packed)
|
AC_SUBST(gcc_have_attr_packed)
|
||||||
if test "$gcc_have_attr_packed" = "yes"; then
|
if test "$gcc_have_attr_packed" = "yes"; then
|
||||||
AC_DEFINE(HAVE_ATTR_PACKED, 1, [Define to 1 if C++ compiler supports __attribute__((packed))])
|
AC_DEFINE(HAVE_ATTR_PACKED, 1, [Define to 1 if C++ compiler supports __attribute__((packed))])
|
||||||
@ -172,7 +174,11 @@ AC_ARG_WITH(systemdsystemunitdir,
|
|||||||
systemdsystemunitdir=
|
systemdsystemunitdir=
|
||||||
case "$with_systemdsystemunitdir" in
|
case "$with_systemdsystemunitdir" in
|
||||||
auto|yes)
|
auto|yes)
|
||||||
test -n "$PKG_CONFIG" && systemdsystemunitdir=`$PKG_CONFIG --variable=systemdsystemunitdir systemd`
|
if test -n "$PKG_CONFIG"; then
|
||||||
|
AC_MSG_CHECKING([for systemdsystemunitdir])
|
||||||
|
systemdsystemunitdir=`$PKG_CONFIG --variable=systemdsystemunitdir systemd`
|
||||||
|
AC_MSG_RESULT([${systemdsystemunitdir:-no}])
|
||||||
|
fi
|
||||||
case "$with_systemdsystemunitdir:$sysconfdir:$systemdsystemunitdir" in
|
case "$with_systemdsystemunitdir:$sysconfdir:$systemdsystemunitdir" in
|
||||||
yes:*:) AC_MSG_ERROR([Location of systemd service files not found]) ;;
|
yes:*:) AC_MSG_ERROR([Location of systemd service files not found]) ;;
|
||||||
yes:*:*|auto:*:|auto:/etc:*) ;;
|
yes:*:*|auto:*:|auto:/etc:*) ;;
|
||||||
@ -188,26 +194,23 @@ AC_ARG_WITH(initscriptdir,
|
|||||||
[AC_HELP_STRING([--with-initscriptdir@<:@=DIR|auto|yes|no@:>@], [Location of init scripts [auto]])],
|
[AC_HELP_STRING([--with-initscriptdir@<:@=DIR|auto|yes|no@:>@], [Location of init scripts [auto]])],
|
||||||
[], [with_initscriptdir=auto])
|
[], [with_initscriptdir=auto])
|
||||||
|
|
||||||
AC_MSG_CHECKING(which init (rc) directory to use)
|
initddir=
|
||||||
initddir=""
|
case "$with_initscriptdir:$cross_compiling:$systemdsystemunitdir" in
|
||||||
for dir in rc.d/init.d init.d rc.d; do
|
auto:no:|yes:*)
|
||||||
if test -d /etc/$dir; then
|
AC_MSG_CHECKING([for init (rc) directory])
|
||||||
initddir='${sysconfdir}'/$dir
|
for dir in rc.d/init.d init.d rc.d; do
|
||||||
break
|
if test -d /etc/$dir; then
|
||||||
fi
|
initddir='${sysconfdir}'/$dir
|
||||||
done
|
break
|
||||||
AC_MSG_RESULT([${initddir:-not found}])
|
fi
|
||||||
|
done
|
||||||
case "$with_initscriptdir" in
|
AC_MSG_RESULT([${initddir:-no}])
|
||||||
auto) test -n "$systemdsystemunitdir" && initddir= ;;
|
case "$with_initscriptdir:$initddir" in
|
||||||
yes)
|
yes:) AC_MSG_ERROR([Location of init scripts not found]) ;;
|
||||||
if test -z "$initddir"; then
|
esac ;;
|
||||||
AC_MSG_ERROR([Location of init scripts not found])
|
auto:*|no:*) ;;
|
||||||
fi ;;
|
|
||||||
no) initddir= ;;
|
|
||||||
*) initddir="$with_initscriptdir" ;;
|
*) initddir="$with_initscriptdir" ;;
|
||||||
esac
|
esac
|
||||||
|
|
||||||
AC_SUBST(initddir)
|
AC_SUBST(initddir)
|
||||||
AM_CONDITIONAL(INSTALL_INITSCRIPT, [test -n "$initddir"])
|
AM_CONDITIONAL(INSTALL_INITSCRIPT, [test -n "$initddir"])
|
||||||
|
|
||||||
@ -340,54 +343,65 @@ os_solaris=no
|
|||||||
os_win32=no
|
os_win32=no
|
||||||
os_win32_mingw=no
|
os_win32_mingw=no
|
||||||
os_win64=no
|
os_win64=no
|
||||||
|
os_man_filter=
|
||||||
case "${host}" in
|
case "${host}" in
|
||||||
*-*-linux*)
|
*-*-linux*)
|
||||||
os_deps='os_linux.o cciss.o'
|
os_deps='os_linux.o cciss.o'
|
||||||
|
os_man_filter=Linux
|
||||||
;;
|
;;
|
||||||
*-*-freebsd*|*-*-dragonfly*|*-*-kfreebsd*-gnu*)
|
*-*-freebsd*|*-*-dragonfly*|*-*-kfreebsd*-gnu*)
|
||||||
os_deps='os_freebsd.o cciss.o'
|
os_deps='os_freebsd.o cciss.o'
|
||||||
os_libs='-lcam'
|
os_libs='-lcam'
|
||||||
os_dltools='curl wget lynx fetch'
|
os_dltools='curl wget lynx fetch'
|
||||||
AC_CHECK_LIB(usb, libusb20_dev_get_device_desc)
|
AC_CHECK_LIB(usb, libusb20_dev_get_device_desc)
|
||||||
|
os_man_filter=FreeBSD
|
||||||
;;
|
;;
|
||||||
sparc-*-solaris*)
|
sparc-*-solaris*)
|
||||||
os_deps='os_solaris.o os_solaris_ata.o'
|
os_deps='os_solaris.o os_solaris_ata.o'
|
||||||
os_mailer='mailx'
|
os_mailer='mailx'
|
||||||
os_solaris=yes
|
os_solaris=yes
|
||||||
|
os_man_filter=Solaris
|
||||||
;;
|
;;
|
||||||
*-pc-solaris*)
|
*-pc-solaris*)
|
||||||
os_deps='os_solaris.o'
|
os_deps='os_solaris.o'
|
||||||
os_mailer='mailx'
|
os_mailer='mailx'
|
||||||
os_solaris=yes
|
os_solaris=yes
|
||||||
|
os_man_filter=Solaris
|
||||||
;;
|
;;
|
||||||
*-*-netbsd*)
|
*-*-netbsd*)
|
||||||
os_deps='os_netbsd.o'
|
os_deps='os_netbsd.o'
|
||||||
os_libs='-lutil'
|
os_libs='-lutil'
|
||||||
|
os_man_filter=NetBSD
|
||||||
;;
|
;;
|
||||||
*-*-openbsd*)
|
*-*-openbsd*)
|
||||||
os_deps='os_openbsd.o'
|
os_deps='os_openbsd.o'
|
||||||
os_libs='-lutil'
|
os_libs='-lutil'
|
||||||
os_dltools='curl wget lynx ftp'
|
os_dltools='curl wget lynx ftp'
|
||||||
|
os_man_filter=OpenBSD
|
||||||
;;
|
;;
|
||||||
*-*-cygwin*)
|
*-*-cygwin*)
|
||||||
os_deps='os_win32.o'
|
os_deps='os_win32.o'
|
||||||
os_win32=yes
|
os_win32=yes
|
||||||
|
os_man_filter=Cygwin
|
||||||
;;
|
;;
|
||||||
x86_64-*-mingw*)
|
x86_64-*-mingw*)
|
||||||
os_deps='os_win32.o'
|
os_deps='os_win32.o'
|
||||||
os_win32=yes
|
os_win32=yes
|
||||||
os_win32_mingw=yes
|
os_win32_mingw=yes
|
||||||
os_win64=yes
|
os_win64=yes
|
||||||
|
os_man_filter=Windows
|
||||||
;;
|
;;
|
||||||
*-*-mingw*)
|
*-*-mingw*)
|
||||||
os_deps='os_win32.o'
|
os_deps='os_win32.o'
|
||||||
os_win32=yes
|
os_win32=yes
|
||||||
os_win32_mingw=yes
|
os_win32_mingw=yes
|
||||||
|
os_man_filter=Windows
|
||||||
;;
|
;;
|
||||||
*-*-darwin*)
|
*-*-darwin*)
|
||||||
os_deps='os_darwin.o'
|
os_deps='os_darwin.o'
|
||||||
os_libs='-framework CoreFoundation -framework IOKit'
|
os_libs='-framework CoreFoundation -framework IOKit'
|
||||||
os_darwin=yes
|
os_darwin=yes
|
||||||
|
os_man_filter=Darwin
|
||||||
;;
|
;;
|
||||||
*-*-nto-qnx*)
|
*-*-nto-qnx*)
|
||||||
os_deps='os_qnxnto.o'
|
os_deps='os_qnxnto.o'
|
||||||
@ -415,6 +429,7 @@ AC_MSG_RESULT([$os_new_interface])
|
|||||||
AC_SUBST([os_deps])
|
AC_SUBST([os_deps])
|
||||||
AC_SUBST([os_libs])
|
AC_SUBST([os_libs])
|
||||||
AC_SUBST([os_dltools])
|
AC_SUBST([os_dltools])
|
||||||
|
AC_SUBST([os_man_filter])
|
||||||
if test -n "$os_mailer"; then
|
if test -n "$os_mailer"; then
|
||||||
AC_DEFINE_UNQUOTED(DEFAULT_MAILER, "$os_mailer", [Default mailer if "mail" is unavailable])
|
AC_DEFINE_UNQUOTED(DEFAULT_MAILER, "$os_mailer", [Default mailer if "mail" is unavailable])
|
||||||
fi
|
fi
|
||||||
|
@ -3,7 +3,7 @@
|
|||||||
*
|
*
|
||||||
* Home page of code is: http://smartmontools.sourceforge.net
|
* Home page of code is: http://smartmontools.sourceforge.net
|
||||||
*
|
*
|
||||||
* Copyright (C) 2008-11 Christian Franke <smartmontools-support@lists.sourceforge.net>
|
* Copyright (C) 2008-12 Christian Franke <smartmontools-support@lists.sourceforge.net>
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or modify
|
* 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
|
* it under the terms of the GNU General Public License as published by
|
||||||
@ -25,7 +25,7 @@
|
|||||||
#include <stdarg.h>
|
#include <stdarg.h>
|
||||||
#include <stdexcept>
|
#include <stdexcept>
|
||||||
|
|
||||||
const char * dev_interface_cpp_cvsid = "$Id: dev_interface.cpp 3256 2011-02-08 22:13:41Z chrfranke $"
|
const char * dev_interface_cpp_cvsid = "$Id: dev_interface.cpp 3519 2012-03-06 20:01:44Z chrfranke $"
|
||||||
DEV_INTERFACE_H_CVSID;
|
DEV_INTERFACE_H_CVSID;
|
||||||
|
|
||||||
/////////////////////////////////////////////////////////////////////////////
|
/////////////////////////////////////////////////////////////////////////////
|
||||||
@ -61,8 +61,7 @@ bool smart_device::set_err(int no, const char * msg, ...)
|
|||||||
|
|
||||||
bool smart_device::set_err(int no)
|
bool smart_device::set_err(int no)
|
||||||
{
|
{
|
||||||
smi()->set_err_var(&m_err, no);
|
return smi()->set_err_var(&m_err, no);
|
||||||
return false;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
smart_device * smart_device::autodetect_open()
|
smart_device * smart_device::autodetect_open()
|
||||||
@ -230,7 +229,7 @@ std::string smart_interface::get_valid_dev_types_str()
|
|||||||
{
|
{
|
||||||
// default
|
// default
|
||||||
std::string s =
|
std::string s =
|
||||||
"ata, scsi, sat[,N][+TYPE], usbcypress[,X], usbjmicron[,x][,N], usbsunplus";
|
"ata, scsi, sat[,auto][,N][+TYPE], usbcypress[,X], usbjmicron[,x][,N], usbsunplus";
|
||||||
// append custom
|
// append custom
|
||||||
std::string s2 = get_valid_custom_dev_types_str();
|
std::string s2 = get_valid_custom_dev_types_str();
|
||||||
if (!s2.empty()) {
|
if (!s2.empty()) {
|
||||||
@ -244,28 +243,34 @@ std::string smart_interface::get_app_examples(const char * /*appname*/)
|
|||||||
return "";
|
return "";
|
||||||
}
|
}
|
||||||
|
|
||||||
void smart_interface::set_err(int no, const char * msg, ...)
|
bool smart_interface::disable_system_auto_standby(bool /*disable*/)
|
||||||
{
|
{
|
||||||
if (!msg) {
|
return set_err(ENOSYS);
|
||||||
set_err(no); return;
|
}
|
||||||
}
|
|
||||||
|
bool smart_interface::set_err(int no, const char * msg, ...)
|
||||||
|
{
|
||||||
|
if (!msg)
|
||||||
|
return set_err(no);
|
||||||
m_err.no = no;
|
m_err.no = no;
|
||||||
va_list ap; va_start(ap, msg);
|
va_list ap; va_start(ap, msg);
|
||||||
m_err.msg = vstrprintf(msg, ap);
|
m_err.msg = vstrprintf(msg, ap);
|
||||||
va_end(ap);
|
va_end(ap);
|
||||||
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
void smart_interface::set_err(int no)
|
bool smart_interface::set_err(int no)
|
||||||
{
|
{
|
||||||
set_err_var(&m_err, no);
|
return set_err_var(&m_err, no);
|
||||||
}
|
}
|
||||||
|
|
||||||
void smart_interface::set_err_var(smart_device::error_info * err, int no)
|
bool smart_interface::set_err_var(smart_device::error_info * err, int no)
|
||||||
{
|
{
|
||||||
err->no = no;
|
err->no = no;
|
||||||
err->msg = get_msg_for_errno(no);
|
err->msg = get_msg_for_errno(no);
|
||||||
if (err->msg.empty() && no != 0)
|
if (err->msg.empty() && no != 0)
|
||||||
err->msg = strprintf("Unknown error %d", no);
|
err->msg = strprintf("Unknown error %d", no);
|
||||||
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
const char * smart_interface::get_msg_for_errno(int no)
|
const char * smart_interface::get_msg_for_errno(int no)
|
||||||
|
@ -3,7 +3,7 @@
|
|||||||
*
|
*
|
||||||
* Home page of code is: http://smartmontools.sourceforge.net
|
* Home page of code is: http://smartmontools.sourceforge.net
|
||||||
*
|
*
|
||||||
* Copyright (C) 2008-11 Christian Franke <smartmontools-support@lists.sourceforge.net>
|
* Copyright (C) 2008-12 Christian Franke <smartmontools-support@lists.sourceforge.net>
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or modify
|
* 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
|
* it under the terms of the GNU General Public License as published by
|
||||||
@ -18,20 +18,14 @@
|
|||||||
#ifndef DEV_INTERFACE_H
|
#ifndef DEV_INTERFACE_H
|
||||||
#define DEV_INTERFACE_H
|
#define DEV_INTERFACE_H
|
||||||
|
|
||||||
#define DEV_INTERFACE_H_CVSID "$Id: dev_interface.h 3256 2011-02-08 22:13:41Z chrfranke $\n"
|
#define DEV_INTERFACE_H_CVSID "$Id: dev_interface.h 3520 2012-03-06 20:50:10Z chrfranke $\n"
|
||||||
|
|
||||||
|
#include "utility.h"
|
||||||
|
|
||||||
#include <stdexcept>
|
#include <stdexcept>
|
||||||
#include <string>
|
#include <string>
|
||||||
#include <vector>
|
#include <vector>
|
||||||
|
|
||||||
#if !defined(__GNUC__) && !defined(__attribute__)
|
|
||||||
#define __attribute__(x) /**/
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef _MSC_VER // Disable MSVC warning
|
|
||||||
#pragma warning(disable:4250) // 'class1' : inherits 'class2::member' via dominance
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/////////////////////////////////////////////////////////////////////////////
|
/////////////////////////////////////////////////////////////////////////////
|
||||||
// Common functionality for all device types
|
// Common functionality for all device types
|
||||||
|
|
||||||
@ -157,7 +151,7 @@ public:
|
|||||||
/// Printf()-like formatting is supported.
|
/// Printf()-like formatting is supported.
|
||||||
/// Returns false always to allow use as a return expression.
|
/// Returns false always to allow use as a return expression.
|
||||||
bool set_err(int no, const char * msg, ...)
|
bool set_err(int no, const char * msg, ...)
|
||||||
__attribute__ ((format (printf, 3, 4)));
|
__attribute_format_printf(3, 4);
|
||||||
|
|
||||||
/// Set last error info struct.
|
/// Set last error info struct.
|
||||||
bool set_err(const error_info & err)
|
bool set_err(const error_info & err)
|
||||||
@ -204,14 +198,6 @@ public:
|
|||||||
virtual void release(const smart_device * dev);
|
virtual void release(const smart_device * dev);
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
/// Set dynamic downcast for ATA
|
|
||||||
void this_is_ata(ata_device * ata);
|
|
||||||
// {see below;}
|
|
||||||
|
|
||||||
/// Set dynamic downcast for SCSI
|
|
||||||
void this_is_scsi(scsi_device * scsi);
|
|
||||||
// {see below;}
|
|
||||||
|
|
||||||
/// Get interface which produced this object.
|
/// Get interface which produced this object.
|
||||||
smart_interface * smi()
|
smart_interface * smi()
|
||||||
{ return m_intf; }
|
{ return m_intf; }
|
||||||
@ -223,10 +209,15 @@ protected:
|
|||||||
private:
|
private:
|
||||||
smart_interface * m_intf;
|
smart_interface * m_intf;
|
||||||
device_info m_info;
|
device_info m_info;
|
||||||
ata_device * m_ata_ptr;
|
|
||||||
scsi_device * m_scsi_ptr;
|
|
||||||
error_info m_err;
|
error_info m_err;
|
||||||
|
|
||||||
|
// Pointers for to_ata(), to_scsi(),
|
||||||
|
// set by ATA/SCSI interface classes.
|
||||||
|
friend class ata_device;
|
||||||
|
ata_device * m_ata_ptr;
|
||||||
|
friend class scsi_device;
|
||||||
|
scsi_device * m_scsi_ptr;
|
||||||
|
|
||||||
// Prevent copy/assigment
|
// Prevent copy/assigment
|
||||||
smart_device(const smart_device &);
|
smart_device(const smart_device &);
|
||||||
void operator=(const smart_device &);
|
void operator=(const smart_device &);
|
||||||
@ -518,10 +509,14 @@ protected:
|
|||||||
bool multi_sector_support = false,
|
bool multi_sector_support = false,
|
||||||
bool ata_48bit_support = false);
|
bool ata_48bit_support = false);
|
||||||
|
|
||||||
|
/// Hide/unhide ATA interface.
|
||||||
|
void hide_ata(bool hide = true)
|
||||||
|
{ m_ata_ptr = (!hide ? this : 0); }
|
||||||
|
|
||||||
/// Default constructor, registers device as ATA.
|
/// Default constructor, registers device as ATA.
|
||||||
ata_device()
|
ata_device()
|
||||||
: smart_device(never_called)
|
: smart_device(never_called)
|
||||||
{ this_is_ata(this); }
|
{ hide_ata(false); }
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
@ -540,30 +535,17 @@ public:
|
|||||||
virtual bool scsi_pass_through(scsi_cmnd_io * iop) = 0;
|
virtual bool scsi_pass_through(scsi_cmnd_io * iop) = 0;
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
|
/// Hide/unhide SCSI interface.
|
||||||
|
void hide_scsi(bool hide = true)
|
||||||
|
{ m_scsi_ptr = (!hide ? this : 0); }
|
||||||
|
|
||||||
/// Default constructor, registers device as SCSI.
|
/// Default constructor, registers device as SCSI.
|
||||||
scsi_device()
|
scsi_device()
|
||||||
: smart_device(never_called)
|
: smart_device(never_called)
|
||||||
{ this_is_scsi(this); }
|
{ hide_scsi(false); }
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
/////////////////////////////////////////////////////////////////////////////
|
|
||||||
|
|
||||||
// Set dynamic downcasts
|
|
||||||
// Note that due to virtual inheritance,
|
|
||||||
// (ata == this) does not imply ((void*)ata == (void*)this))
|
|
||||||
|
|
||||||
inline void smart_device::this_is_ata(ata_device * ata)
|
|
||||||
{
|
|
||||||
m_ata_ptr = (ata == this ? ata : 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
inline void smart_device::this_is_scsi(scsi_device * scsi)
|
|
||||||
{
|
|
||||||
m_scsi_ptr = (scsi == this ? scsi : 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/////////////////////////////////////////////////////////////////////////////
|
/////////////////////////////////////////////////////////////////////////////
|
||||||
/// Smart pointer class for device pointers
|
/// Smart pointer class for device pointers
|
||||||
|
|
||||||
@ -748,6 +730,13 @@ public:
|
|||||||
/// TODO: Remove this hack.
|
/// TODO: Remove this hack.
|
||||||
virtual std::string get_app_examples(const char * appname);
|
virtual std::string get_app_examples(const char * appname);
|
||||||
|
|
||||||
|
/// Disable/Enable system auto standby/sleep mode.
|
||||||
|
/// Return false if unsupported or if system is running
|
||||||
|
/// on battery.
|
||||||
|
/// Default implementation returns false.
|
||||||
|
virtual bool disable_system_auto_standby(bool disable);
|
||||||
|
|
||||||
|
|
||||||
///////////////////////////////////////////////
|
///////////////////////////////////////////////
|
||||||
// Last error information
|
// Last error information
|
||||||
|
|
||||||
@ -763,12 +752,13 @@ public:
|
|||||||
|
|
||||||
/// Set last error number and message.
|
/// Set last error number and message.
|
||||||
/// Printf()-like formatting is supported.
|
/// Printf()-like formatting is supported.
|
||||||
void set_err(int no, const char * msg, ...)
|
/// Returns false always to allow use as a return expression.
|
||||||
__attribute__ ((format (printf, 3, 4)));
|
bool set_err(int no, const char * msg, ...)
|
||||||
|
__attribute_format_printf(3, 4);
|
||||||
|
|
||||||
/// Set last error info struct.
|
/// Set last error info struct.
|
||||||
void set_err(const smart_device::error_info & err)
|
bool set_err(const smart_device::error_info & err)
|
||||||
{ m_err = err; }
|
{ m_err = err; return false; }
|
||||||
|
|
||||||
/// Clear last error info.
|
/// Clear last error info.
|
||||||
void clear_err()
|
void clear_err()
|
||||||
@ -776,11 +766,11 @@ public:
|
|||||||
|
|
||||||
/// Set last error number and default message.
|
/// Set last error number and default message.
|
||||||
/// Message is retrieved from get_msg_for_errno(no).
|
/// Message is retrieved from get_msg_for_errno(no).
|
||||||
void set_err(int no);
|
bool set_err(int no);
|
||||||
|
|
||||||
/// Set last error number and default message to any error_info.
|
/// Set last error number and default message to any error_info.
|
||||||
/// Used by set_err(no).
|
/// Used by set_err(no).
|
||||||
void set_err_var(smart_device::error_info * err, int no);
|
bool set_err_var(smart_device::error_info * err, int no);
|
||||||
|
|
||||||
/// Convert error number into message, used by set_err(no).
|
/// Convert error number into message, used by set_err(no).
|
||||||
/// Default implementation returns strerror(no).
|
/// Default implementation returns strerror(no).
|
||||||
|
26
int64.h
26
int64.h
@ -3,8 +3,8 @@
|
|||||||
*
|
*
|
||||||
* Home page of code is: http://smartmontools.sourceforge.net
|
* Home page of code is: http://smartmontools.sourceforge.net
|
||||||
*
|
*
|
||||||
* Copyright (C) 2002-8 Bruce Allen <smartmontools-support@lists.sourceforge.net>
|
* Copyright (C) 2002-11 Bruce Allen <smartmontools-support@lists.sourceforge.net>
|
||||||
* Copyright (C) 2004-8 Christian Franke
|
* Copyright (C) 2004-11 Christian Franke
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or modify
|
* 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
|
* it under the terms of the GNU General Public License as published by
|
||||||
@ -20,7 +20,7 @@
|
|||||||
#ifndef INT64_H_
|
#ifndef INT64_H_
|
||||||
#define INT64_H_
|
#define INT64_H_
|
||||||
|
|
||||||
#define INT64_H_CVSID "$Id: int64.h,v 1.17 2008/03/04 22:09:47 ballen4705 Exp $\n"
|
#define INT64_H_CVSID "$Id: int64.h 3475 2011-11-10 21:43:40Z chrfranke $"
|
||||||
|
|
||||||
// 64 bit integer typedefs and format strings
|
// 64 bit integer typedefs and format strings
|
||||||
|
|
||||||
@ -40,7 +40,7 @@
|
|||||||
#include <sys/int_types.h>
|
#include <sys/int_types.h>
|
||||||
#else
|
#else
|
||||||
#if defined(_WIN32) && defined(_MSC_VER)
|
#if defined(_WIN32) && defined(_MSC_VER)
|
||||||
// for MSVC 6.0
|
// for MSVC <= 9 (MSVC10 and MinGW provide <stdint.h>)
|
||||||
typedef __int64 int64_t;
|
typedef __int64 int64_t;
|
||||||
typedef unsigned __int64 uint64_t;
|
typedef unsigned __int64 uint64_t;
|
||||||
#else
|
#else
|
||||||
@ -59,12 +59,12 @@ typedef unsigned long long uint64_t;
|
|||||||
#endif // HAVE_STDINT_H
|
#endif // HAVE_STDINT_H
|
||||||
#endif // HAVE_INTTYPES_H
|
#endif // HAVE_INTTYPES_H
|
||||||
|
|
||||||
#ifdef _WIN32
|
#if defined(_WIN32) && !defined(PRId64)
|
||||||
// for MSVCRT.DLL (used by both MSVC 6.0 and MinGW)
|
// for MSVC (MinGW provides <inttypes.h>)
|
||||||
#define PRId64 "I64d"
|
#define PRId64 "I64d"
|
||||||
#define PRIu64 "I64u"
|
#define PRIu64 "I64u"
|
||||||
#define PRIx64 "I64x"
|
#define PRIx64 "I64x"
|
||||||
#endif // _WIN32
|
#endif // _WIN32 && !PRId64
|
||||||
|
|
||||||
// If macros not defined in inttypes.h, fix here. Default is GCC
|
// If macros not defined in inttypes.h, fix here. Default is GCC
|
||||||
// style
|
// style
|
||||||
@ -80,16 +80,4 @@ typedef unsigned long long uint64_t;
|
|||||||
#define PRIx64 "llx"
|
#define PRIx64 "llx"
|
||||||
#endif // ndef PRIx64
|
#endif // ndef PRIx64
|
||||||
|
|
||||||
|
|
||||||
#if defined(_WIN32) && defined(_MSC_VER)
|
|
||||||
// for MSVC 6.0: "unsigned __int64 -> double" conversion not implemented (why?-)
|
|
||||||
__inline double uint64_to_double(uint64_t ull) {
|
|
||||||
return ((int64_t)ull >= 0 ? (double)(int64_t)ull :
|
|
||||||
((double)(int64_t)(ull - 9223372036854775808UI64)) + 9223372036854775808.0);
|
|
||||||
}
|
|
||||||
#else
|
|
||||||
#define uint64_to_double(ull) ((double)(ull))
|
|
||||||
#endif // _WIN32 && _MSC_VER
|
|
||||||
|
|
||||||
|
|
||||||
#endif // INT64_H
|
#endif // INT64_H
|
||||||
|
@ -34,7 +34,7 @@
|
|||||||
|
|
||||||
#include <stdexcept>
|
#include <stdexcept>
|
||||||
|
|
||||||
const char * knowndrives_cpp_cvsid = "$Id: knowndrives.cpp 3343 2011-05-25 20:18:17Z chrfranke $"
|
const char * knowndrives_cpp_cvsid = "$Id: knowndrives.cpp 3447 2011-10-14 20:32:00Z chrfranke $"
|
||||||
KNOWNDRIVES_H_CVSID;
|
KNOWNDRIVES_H_CVSID;
|
||||||
|
|
||||||
#define MODEL_STRING_LENGTH 40
|
#define MODEL_STRING_LENGTH 40
|
||||||
@ -375,9 +375,16 @@ static int showonepreset(const drive_settings * dbentry)
|
|||||||
}
|
}
|
||||||
for (int i = 0; i < MAX_ATTRIBUTE_NUM; i++) {
|
for (int i = 0; i < MAX_ATTRIBUTE_NUM; i++) {
|
||||||
if (defs[i].priority != PRIOR_DEFAULT) {
|
if (defs[i].priority != PRIOR_DEFAULT) {
|
||||||
|
std::string name = ata_get_smart_attr_name(i, defs);
|
||||||
// Use leading zeros instead of spaces so that everything lines up.
|
// Use leading zeros instead of spaces so that everything lines up.
|
||||||
pout("%-*s %03d %s\n", TABLEPRINTWIDTH, first_preset ? "ATTRIBUTE OPTIONS:" : "",
|
pout("%-*s %03d %s\n", TABLEPRINTWIDTH, first_preset ? "ATTRIBUTE OPTIONS:" : "",
|
||||||
i, ata_get_smart_attr_name(i, defs).c_str());
|
i, name.c_str());
|
||||||
|
// Check max name length suitable for smartctl -A output
|
||||||
|
const unsigned maxlen = 23;
|
||||||
|
if (name.size() > maxlen) {
|
||||||
|
pout("%*s\n", TABLEPRINTWIDTH+6+maxlen, "Error: Attribute name too long ------^");
|
||||||
|
errcnt++;
|
||||||
|
}
|
||||||
first_preset = false;
|
first_preset = false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
587
os_freebsd.cpp
587
os_freebsd.cpp
@ -74,7 +74,7 @@
|
|||||||
#define PATHINQ_SETTINGS_SIZE 128
|
#define PATHINQ_SETTINGS_SIZE 128
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
const char *os_XXXX_c_cvsid="$Id: os_freebsd.cpp 3335 2011-05-21 17:32:16Z samm2 $" \
|
const char *os_XXXX_c_cvsid="$Id: os_freebsd.cpp 3502 2012-01-26 09:41:05Z samm2 $" \
|
||||||
ATACMDS_H_CVSID CCISS_H_CVSID CONFIG_H_CVSID INT64_H_CVSID OS_FREEBSD_H_CVSID SCSICMDS_H_CVSID UTILITY_H_CVSID;
|
ATACMDS_H_CVSID CCISS_H_CVSID CONFIG_H_CVSID INT64_H_CVSID OS_FREEBSD_H_CVSID SCSICMDS_H_CVSID UTILITY_H_CVSID;
|
||||||
|
|
||||||
#define NO_RETURN 0
|
#define NO_RETURN 0
|
||||||
@ -117,6 +117,8 @@ void printwarning(int msgNo, const char* extra) {
|
|||||||
#define ATA_DEVICE "/dev/ata"
|
#define ATA_DEVICE "/dev/ata"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#define ARGUSED(x) ((void)(x))
|
||||||
|
|
||||||
// global variable holding byte count of allocated memory
|
// global variable holding byte count of allocated memory
|
||||||
long long bytes;
|
long long bytes;
|
||||||
|
|
||||||
@ -192,6 +194,9 @@ static const char smartctl_examples[] =
|
|||||||
" smartctl -a --device=cciss,0 /dev/ciss0\n"
|
" smartctl -a --device=cciss,0 /dev/ciss0\n"
|
||||||
" (Prints all SMART information for first disk \n"
|
" (Prints all SMART information for first disk \n"
|
||||||
" on Common Interface for SCSI-3 Support driver)\n"
|
" on Common Interface for SCSI-3 Support driver)\n"
|
||||||
|
" smartctl -a --device=areca,1 /dev/arcmsr0\n"
|
||||||
|
" (Prints all SMART information for first disk \n"
|
||||||
|
" on first ARECA RAID controller)\n"
|
||||||
|
|
||||||
;
|
;
|
||||||
|
|
||||||
@ -236,7 +241,7 @@ public:
|
|||||||
virtual bool ata_pass_through(const ata_cmd_in & in, ata_cmd_out & out);
|
virtual bool ata_pass_through(const ata_cmd_in & in, ata_cmd_out & out);
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
virtual int do_cmd(struct ata_ioc_request* request);
|
virtual int do_cmd(struct ata_ioc_request* request, bool is_48bit_cmd);
|
||||||
};
|
};
|
||||||
|
|
||||||
freebsd_ata_device::freebsd_ata_device(smart_interface * intf, const char * dev_name, const char * req_type)
|
freebsd_ata_device::freebsd_ata_device(smart_interface * intf, const char * dev_name, const char * req_type)
|
||||||
@ -245,9 +250,10 @@ freebsd_ata_device::freebsd_ata_device(smart_interface * intf, const char * dev_
|
|||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
int freebsd_ata_device::do_cmd( struct ata_ioc_request* request)
|
int freebsd_ata_device::do_cmd( struct ata_ioc_request* request, bool is_48bit_cmd)
|
||||||
{
|
{
|
||||||
int fd = get_fd();
|
int fd = get_fd();
|
||||||
|
ARGUSED(is_48bit_cmd); // no support for 48 bit commands in the IOCATAREQUEST
|
||||||
return ioctl(fd, IOCATAREQUEST, request);
|
return ioctl(fd, IOCATAREQUEST, request);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -255,10 +261,14 @@ int freebsd_ata_device::do_cmd( struct ata_ioc_request* request)
|
|||||||
|
|
||||||
bool freebsd_ata_device::ata_pass_through(const ata_cmd_in & in, ata_cmd_out & out)
|
bool freebsd_ata_device::ata_pass_through(const ata_cmd_in & in, ata_cmd_out & out)
|
||||||
{
|
{
|
||||||
|
bool ata_48bit = false; // no ata_48bit_support via IOCATAREQUEST
|
||||||
|
if(!strcmp("atacam",get_dev_type())) // enable for atacam interface
|
||||||
|
ata_48bit = true;
|
||||||
|
|
||||||
if (!ata_cmd_is_ok(in,
|
if (!ata_cmd_is_ok(in,
|
||||||
true, // data_out_support
|
true, // data_out_support
|
||||||
true, // multi_sector_support
|
true, // multi_sector_support
|
||||||
false) // no ata_48bit_support via IOCATAREQUEST
|
ata_48bit)
|
||||||
)
|
)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
@ -277,22 +287,22 @@ bool freebsd_ata_device::ata_pass_through(const ata_cmd_in & in, ata_cmd_out & o
|
|||||||
request.flags=ATA_CMD_CONTROL;
|
request.flags=ATA_CMD_CONTROL;
|
||||||
break;
|
break;
|
||||||
case ata_cmd_in::data_in:
|
case ata_cmd_in::data_in:
|
||||||
request.flags=ATA_CMD_READ;
|
request.flags=ATA_CMD_READ | ATA_CMD_CONTROL;
|
||||||
request.data=(char *)in.buffer;
|
request.data=(char *)in.buffer;
|
||||||
request.count=in.size;
|
request.count=in.size;
|
||||||
break;
|
break;
|
||||||
case ata_cmd_in::data_out:
|
case ata_cmd_in::data_out:
|
||||||
request.flags=ATA_CMD_WRITE;
|
request.flags=ATA_CMD_WRITE | ATA_CMD_CONTROL;
|
||||||
request.data=(char *)in.buffer;
|
request.data=(char *)in.buffer;
|
||||||
request.count=in.size;
|
request.count=in.size;
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
return set_err(ENOSYS);
|
return set_err(ENOSYS);
|
||||||
}
|
}
|
||||||
|
|
||||||
clear_err();
|
clear_err();
|
||||||
errno = 0;
|
errno = 0;
|
||||||
if (do_cmd(&request))
|
if (do_cmd(&request, in.in_regs.is_48bit_cmd()))
|
||||||
return set_err(errno);
|
return set_err(errno);
|
||||||
if (request.error)
|
if (request.error)
|
||||||
return set_err(EIO, "request failed, error code 0x%02x", request.error);
|
return set_err(EIO, "request failed, error code 0x%02x", request.error);
|
||||||
@ -310,10 +320,6 @@ bool freebsd_ata_device::ata_pass_through(const ata_cmd_in & in, ata_cmd_out & o
|
|||||||
unsigned const char normal_lo=0x4f, normal_hi=0xc2;
|
unsigned const char normal_lo=0x4f, normal_hi=0xc2;
|
||||||
unsigned const char failed_lo=0xf4, failed_hi=0x2c;
|
unsigned const char failed_lo=0xf4, failed_hi=0x2c;
|
||||||
|
|
||||||
#if (FREEBSDVER < 502000)
|
|
||||||
printwarning(NO_RETURN,NULL);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
// Cyl low and Cyl high unchanged means "Good SMART status"
|
// Cyl low and Cyl high unchanged means "Good SMART status"
|
||||||
if (!(out.out_regs.lba_mid==normal_lo && out.out_regs.lba_high==normal_hi)
|
if (!(out.out_regs.lba_mid==normal_lo && out.out_regs.lba_high==normal_hi)
|
||||||
// These values mean "Bad SMART status"
|
// These values mean "Bad SMART status"
|
||||||
@ -354,7 +360,7 @@ protected:
|
|||||||
int m_fd;
|
int m_fd;
|
||||||
struct cam_device *m_camdev;
|
struct cam_device *m_camdev;
|
||||||
|
|
||||||
virtual int do_cmd( struct ata_ioc_request* request);
|
virtual int do_cmd( struct ata_ioc_request* request , bool is_48bit_cmd);
|
||||||
};
|
};
|
||||||
|
|
||||||
bool freebsd_atacam_device::open(){
|
bool freebsd_atacam_device::open(){
|
||||||
@ -374,7 +380,7 @@ bool freebsd_atacam_device::close(){
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
int freebsd_atacam_device::do_cmd( struct ata_ioc_request* request)
|
int freebsd_atacam_device::do_cmd( struct ata_ioc_request* request, bool is_48bit_cmd)
|
||||||
{
|
{
|
||||||
union ccb ccb;
|
union ccb ccb;
|
||||||
int camflags;
|
int camflags;
|
||||||
@ -383,10 +389,12 @@ int freebsd_atacam_device::do_cmd( struct ata_ioc_request* request)
|
|||||||
|
|
||||||
if (request->count == 0)
|
if (request->count == 0)
|
||||||
camflags = CAM_DIR_NONE;
|
camflags = CAM_DIR_NONE;
|
||||||
else if (request->flags == ATA_CMD_READ)
|
else if (request->flags & ATA_CMD_READ)
|
||||||
camflags = CAM_DIR_IN;
|
camflags = CAM_DIR_IN;
|
||||||
else
|
else
|
||||||
camflags = CAM_DIR_OUT;
|
camflags = CAM_DIR_OUT;
|
||||||
|
if(is_48bit_cmd)
|
||||||
|
camflags |= CAM_ATAIO_48BIT;
|
||||||
|
|
||||||
cam_fill_ataio(&ccb.ataio,
|
cam_fill_ataio(&ccb.ataio,
|
||||||
0,
|
0,
|
||||||
@ -397,18 +405,20 @@ int freebsd_atacam_device::do_cmd( struct ata_ioc_request* request)
|
|||||||
request->count,
|
request->count,
|
||||||
request->timeout * 1000); // timeout in seconds
|
request->timeout * 1000); // timeout in seconds
|
||||||
|
|
||||||
|
ccb.ataio.cmd.flags = CAM_ATAIO_NEEDRESULT;
|
||||||
// ata_28bit_cmd
|
// ata_28bit_cmd
|
||||||
if (request->flags == ATA_CMD_CONTROL)
|
|
||||||
ccb.ataio.cmd.flags = CAM_ATAIO_NEEDRESULT;
|
|
||||||
else
|
|
||||||
ccb.ataio.cmd.flags = 0;
|
|
||||||
ccb.ataio.cmd.command = request->u.ata.command;
|
ccb.ataio.cmd.command = request->u.ata.command;
|
||||||
ccb.ataio.cmd.features = request->u.ata.feature;
|
ccb.ataio.cmd.features = request->u.ata.feature;
|
||||||
ccb.ataio.cmd.lba_low = request->u.ata.lba;
|
ccb.ataio.cmd.lba_low = request->u.ata.lba;
|
||||||
ccb.ataio.cmd.lba_mid = request->u.ata.lba >> 8;
|
ccb.ataio.cmd.lba_mid = request->u.ata.lba >> 8;
|
||||||
ccb.ataio.cmd.lba_high = request->u.ata.lba >> 16;
|
ccb.ataio.cmd.lba_high = request->u.ata.lba >> 16;
|
||||||
|
// ata_48bit cmd
|
||||||
|
ccb.ataio.cmd.lba_low_exp = request->u.ata.lba >> 24;
|
||||||
|
ccb.ataio.cmd.lba_mid_exp = request->u.ata.lba >> 32;
|
||||||
|
ccb.ataio.cmd.lba_high_exp = request->u.ata.lba >> 40;
|
||||||
ccb.ataio.cmd.device = 0x40 | ((request->u.ata.lba >> 24) & 0x0f);
|
ccb.ataio.cmd.device = 0x40 | ((request->u.ata.lba >> 24) & 0x0f);
|
||||||
ccb.ataio.cmd.sector_count = request->u.ata.count;
|
ccb.ataio.cmd.sector_count = request->u.ata.count;
|
||||||
|
ccb.ataio.cmd.sector_count_exp = request->u.ata.count >> 8;;
|
||||||
|
|
||||||
ccb.ccb_h.flags |= CAM_DEV_QFRZDIS;
|
ccb.ccb_h.flags |= CAM_DEV_QFRZDIS;
|
||||||
|
|
||||||
@ -422,7 +432,17 @@ int freebsd_atacam_device::do_cmd( struct ata_ioc_request* request)
|
|||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
request->u.ata.count = ccb.ataio.res.sector_count;
|
request->u.ata.lba =
|
||||||
|
((u_int64_t)(ccb.ataio.res.lba_low)) |
|
||||||
|
((u_int64_t)(ccb.ataio.res.lba_mid) << 8) |
|
||||||
|
((u_int64_t)(ccb.ataio.res.lba_high) << 16) |
|
||||||
|
((u_int64_t)(ccb.ataio.res.lba_low_exp) << 24) |
|
||||||
|
((u_int64_t)(ccb.ataio.res.lba_mid_exp) << 32) |
|
||||||
|
((u_int64_t)(ccb.ataio.res.lba_high_exp) << 40);
|
||||||
|
|
||||||
|
request->u.ata.count = ccb.ataio.res.sector_count | (ccb.ataio.res.sector_count_exp << 8);
|
||||||
|
request->error = ccb.ataio.res.error;
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -993,6 +1013,20 @@ bool freebsd_scsi_device::scsi_pass_through(scsi_cmnd_io * iop)
|
|||||||
warnx("error allocating ccb");
|
warnx("error allocating ccb");
|
||||||
return -ENOMEM;
|
return -ENOMEM;
|
||||||
}
|
}
|
||||||
|
// mfi SAT layer is known to be buggy
|
||||||
|
if(!strcmp("mfi",m_camdev->sim_name)) {
|
||||||
|
if (iop->cmnd[0] == SAT_ATA_PASSTHROUGH_12 || iop->cmnd[0] == SAT_ATA_PASSTHROUGH_16) {
|
||||||
|
// Controller does not return ATA output registers in SAT sense data
|
||||||
|
if (iop->cmnd[2] & (1 << 5)) // chk_cond
|
||||||
|
return set_err(ENOSYS, "ATA return descriptor not supported by controller firmware");
|
||||||
|
}
|
||||||
|
// SMART WRITE LOG SECTOR causing media errors
|
||||||
|
if ((iop->cmnd[0] == SAT_ATA_PASSTHROUGH_16 && iop->cmnd[14] == ATA_SMART_CMD
|
||||||
|
&& iop->cmnd[3]==0 && iop->cmnd[4] == ATA_SMART_WRITE_LOG_SECTOR) ||
|
||||||
|
(iop->cmnd[0] == SAT_ATA_PASSTHROUGH_12 && iop->cmnd[9] == ATA_SMART_CMD &&
|
||||||
|
iop->cmnd[3] == ATA_SMART_WRITE_LOG_SECTOR))
|
||||||
|
return set_err(ENOSYS, "SMART WRITE LOG SECTOR command is not supported by controller firmware");
|
||||||
|
}
|
||||||
|
|
||||||
// clear out structure, except for header that was filled in for us
|
// clear out structure, except for header that was filled in for us
|
||||||
bzero(&(&ccb->ccb_h)[1],
|
bzero(&(&ccb->ccb_h)[1],
|
||||||
@ -1012,24 +1046,20 @@ bool freebsd_scsi_device::scsi_pass_through(scsi_cmnd_io * iop)
|
|||||||
|
|
||||||
if (cam_send_ccb(m_camdev,ccb) < 0) {
|
if (cam_send_ccb(m_camdev,ccb) < 0) {
|
||||||
warn("error sending SCSI ccb");
|
warn("error sending SCSI ccb");
|
||||||
#if (FREEBSDVER > 500000)
|
|
||||||
cam_error_print(m_camdev,ccb,CAM_ESF_ALL,CAM_EPF_ALL,stderr);
|
cam_error_print(m_camdev,ccb,CAM_ESF_ALL,CAM_EPF_ALL,stderr);
|
||||||
#endif
|
|
||||||
cam_freeccb(ccb);
|
cam_freeccb(ccb);
|
||||||
return -EIO;
|
return -EIO;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (((ccb->ccb_h.status & CAM_STATUS_MASK) != CAM_REQ_CMP) && ((ccb->ccb_h.status & CAM_STATUS_MASK) != CAM_SCSI_STATUS_ERROR)) {
|
if (((ccb->ccb_h.status & CAM_STATUS_MASK) != CAM_REQ_CMP) && ((ccb->ccb_h.status & CAM_STATUS_MASK) != CAM_SCSI_STATUS_ERROR)) {
|
||||||
#if (FREEBSDVER > 500000)
|
|
||||||
cam_error_print(m_camdev,ccb,CAM_ESF_ALL,CAM_EPF_ALL,stderr);
|
cam_error_print(m_camdev,ccb,CAM_ESF_ALL,CAM_EPF_ALL,stderr);
|
||||||
#endif
|
|
||||||
cam_freeccb(ccb);
|
cam_freeccb(ccb);
|
||||||
return -EIO;
|
return -EIO;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (iop->sensep) {
|
if (iop->sensep) {
|
||||||
memcpy(iop->sensep,&(ccb->csio.sense_data),sizeof(struct scsi_sense_data));
|
iop->resp_sense_len = ccb->csio.sense_len - ccb->csio.sense_resid;
|
||||||
iop->resp_sense_len = sizeof(struct scsi_sense_data);
|
memcpy(iop->sensep,&(ccb->csio.sense_data),iop->resp_sense_len);
|
||||||
}
|
}
|
||||||
|
|
||||||
iop->scsi_status = ccb->csio.scsi_status;
|
iop->scsi_status = ccb->csio.scsi_status;
|
||||||
@ -1051,6 +1081,435 @@ bool freebsd_scsi_device::scsi_pass_through(scsi_cmnd_io * iop)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/////////////////////////////////////////////////////////////////////////////
|
||||||
|
/// Areca RAID support
|
||||||
|
|
||||||
|
class freebsd_areca_device
|
||||||
|
: public /*implements*/ ata_device,
|
||||||
|
public /*extends*/ freebsd_smart_device
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
freebsd_areca_device(smart_interface * intf, const char * dev_name, int disknum);
|
||||||
|
|
||||||
|
protected:
|
||||||
|
virtual bool ata_pass_through(const ata_cmd_in & in, ata_cmd_out & out);
|
||||||
|
|
||||||
|
private:
|
||||||
|
int m_disknum; ///< Disk number.
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
// PURPOSE
|
||||||
|
// This is an interface routine meant to isolate the OS dependent
|
||||||
|
// parts of the code, and to provide a debugging interface. Each
|
||||||
|
// different port and OS needs to provide it's own interface. This
|
||||||
|
// is the linux interface to the Areca "arcmsr" driver. It allows ATA
|
||||||
|
// commands to be passed through the SCSI driver.
|
||||||
|
// DETAILED DESCRIPTION OF ARGUMENTS
|
||||||
|
// fd: is the file descriptor provided by open()
|
||||||
|
// disknum is the disk number (0 to 15) in the RAID array
|
||||||
|
// command: defines the different operations.
|
||||||
|
// select: additional input data if needed (which log, which type of
|
||||||
|
// self-test).
|
||||||
|
// data: location to write output data, if needed (512 bytes).
|
||||||
|
// Note: not all commands use all arguments.
|
||||||
|
// RETURN VALUES
|
||||||
|
// -1 if the command failed
|
||||||
|
// 0 if the command succeeded,
|
||||||
|
// STATUS_CHECK routine:
|
||||||
|
// -1 if the command failed
|
||||||
|
// 0 if the command succeeded and disk SMART status is "OK"
|
||||||
|
// 1 if the command succeeded and disk SMART status is "FAILING"
|
||||||
|
|
||||||
|
|
||||||
|
/*FunctionCode*/
|
||||||
|
#define FUNCTION_READ_RQBUFFER 0x0801
|
||||||
|
#define FUNCTION_WRITE_WQBUFFER 0x0802
|
||||||
|
#define FUNCTION_CLEAR_RQBUFFER 0x0803
|
||||||
|
#define FUNCTION_CLEAR_WQBUFFER 0x0804
|
||||||
|
|
||||||
|
/* ARECA IO CONTROL CODE*/
|
||||||
|
#define ARCMSR_IOCTL_READ_RQBUFFER _IOWR('F', FUNCTION_READ_RQBUFFER, sSRB_BUFFER)
|
||||||
|
#define ARCMSR_IOCTL_WRITE_WQBUFFER _IOWR('F', FUNCTION_WRITE_WQBUFFER, sSRB_BUFFER)
|
||||||
|
#define ARCMSR_IOCTL_CLEAR_RQBUFFER _IOWR('F', FUNCTION_CLEAR_RQBUFFER, sSRB_BUFFER)
|
||||||
|
#define ARCMSR_IOCTL_CLEAR_WQBUFFER _IOWR('F', FUNCTION_CLEAR_WQBUFFER, sSRB_BUFFER)
|
||||||
|
#define ARECA_SIG_STR "ARCMSR"
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// The SRB_IO_CONTROL & SRB_BUFFER structures are used to communicate(to/from) to areca driver
|
||||||
|
typedef struct _SRB_IO_CONTROL
|
||||||
|
{
|
||||||
|
unsigned int HeaderLength;
|
||||||
|
unsigned char Signature[8];
|
||||||
|
unsigned int Timeout;
|
||||||
|
unsigned int ControlCode;
|
||||||
|
unsigned int ReturnCode;
|
||||||
|
unsigned int Length;
|
||||||
|
} sSRB_IO_CONTROL;
|
||||||
|
|
||||||
|
typedef struct _SRB_BUFFER
|
||||||
|
{
|
||||||
|
sSRB_IO_CONTROL srbioctl;
|
||||||
|
unsigned char ioctldatabuffer[1032]; // the buffer to put the command data to/from firmware
|
||||||
|
} sSRB_BUFFER;
|
||||||
|
|
||||||
|
|
||||||
|
// For debugging areca code
|
||||||
|
|
||||||
|
static void areca_dumpdata(unsigned char *block, int len)
|
||||||
|
{
|
||||||
|
int ln = (len / 16) + 1; // total line#
|
||||||
|
unsigned char c;
|
||||||
|
int pos = 0;
|
||||||
|
|
||||||
|
printf(" Address = %p, Length = (0x%x)%d\n", block, len, len);
|
||||||
|
printf(" 0 1 2 3 4 5 6 7 8 9 A B C D E F ASCII \n");
|
||||||
|
printf("=====================================================================\n");
|
||||||
|
|
||||||
|
for ( int l = 0; l < ln && len; l++ )
|
||||||
|
{
|
||||||
|
// printf the line# and the HEX data
|
||||||
|
// if a line data length < 16 then append the space to the tail of line to reach 16 chars
|
||||||
|
printf("%02X | ", l);
|
||||||
|
for ( pos = 0; pos < 16 && len; pos++, len-- )
|
||||||
|
{
|
||||||
|
c = block[l*16+pos];
|
||||||
|
printf("%02X ", c);
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( pos < 16 )
|
||||||
|
{
|
||||||
|
for ( int loop = pos; loop < 16; loop++ )
|
||||||
|
{
|
||||||
|
printf(" ");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// print ASCII char
|
||||||
|
for ( int loop = 0; loop < pos; loop++ )
|
||||||
|
{
|
||||||
|
c = block[l*16+loop];
|
||||||
|
if ( c >= 0x20 && c <= 0x7F )
|
||||||
|
{
|
||||||
|
printf("%c", c);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
printf(".");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
printf("\n");
|
||||||
|
}
|
||||||
|
printf("=====================================================================\n");
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static int arcmsr_command_handler(int fd, unsigned long arcmsr_cmd, unsigned char *data, int data_len, void *ext_data /* reserved for further use */)
|
||||||
|
{
|
||||||
|
ARGUSED(ext_data);
|
||||||
|
|
||||||
|
int ioctlreturn = 0;
|
||||||
|
sSRB_BUFFER sBuf;
|
||||||
|
|
||||||
|
unsigned char *areca_return_packet;
|
||||||
|
int total = 0;
|
||||||
|
int expected = -1;
|
||||||
|
unsigned char return_buff[2048];
|
||||||
|
unsigned char *ptr = &return_buff[0];
|
||||||
|
memset(return_buff, 0, sizeof(return_buff));
|
||||||
|
|
||||||
|
memset((unsigned char *)&sBuf, 0, sizeof(sBuf));
|
||||||
|
|
||||||
|
|
||||||
|
sBuf.srbioctl.HeaderLength = sizeof(sSRB_IO_CONTROL);
|
||||||
|
memcpy(sBuf.srbioctl.Signature, ARECA_SIG_STR, strlen(ARECA_SIG_STR));
|
||||||
|
sBuf.srbioctl.Timeout = 10000;
|
||||||
|
sBuf.srbioctl.ControlCode = ARCMSR_IOCTL_READ_RQBUFFER;
|
||||||
|
|
||||||
|
switch ( arcmsr_cmd )
|
||||||
|
{
|
||||||
|
// command for writing data to driver
|
||||||
|
case ARCMSR_IOCTL_WRITE_WQBUFFER:
|
||||||
|
if ( data && data_len )
|
||||||
|
{
|
||||||
|
sBuf.srbioctl.Length = data_len;
|
||||||
|
memcpy((unsigned char *)sBuf.ioctldatabuffer, (unsigned char *)data, data_len);
|
||||||
|
}
|
||||||
|
// commands for clearing related buffer of driver
|
||||||
|
case ARCMSR_IOCTL_CLEAR_RQBUFFER:
|
||||||
|
case ARCMSR_IOCTL_CLEAR_WQBUFFER:
|
||||||
|
break;
|
||||||
|
// command for reading data from driver
|
||||||
|
case ARCMSR_IOCTL_READ_RQBUFFER:
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
// unknown arcmsr commands
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
while ( 1 )
|
||||||
|
{
|
||||||
|
ioctlreturn = ioctl(fd,arcmsr_cmd,&sBuf);
|
||||||
|
if ( ioctlreturn )
|
||||||
|
{
|
||||||
|
// errors found
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( arcmsr_cmd != ARCMSR_IOCTL_READ_RQBUFFER )
|
||||||
|
{
|
||||||
|
// if succeeded, just returns the length of outgoing data
|
||||||
|
return data_len;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( sBuf.srbioctl.Length )
|
||||||
|
{
|
||||||
|
if(ata_debugmode)
|
||||||
|
areca_dumpdata(&sBuf.ioctldatabuffer[0], sBuf.srbioctl.Length);
|
||||||
|
memcpy(ptr, &sBuf.ioctldatabuffer[0], sBuf.srbioctl.Length);
|
||||||
|
ptr += sBuf.srbioctl.Length;
|
||||||
|
total += sBuf.srbioctl.Length;
|
||||||
|
// the returned bytes enough to compute payload length ?
|
||||||
|
if ( expected < 0 && total >= 5 )
|
||||||
|
{
|
||||||
|
areca_return_packet = (unsigned char *)&return_buff[0];
|
||||||
|
if ( areca_return_packet[0] == 0x5E &&
|
||||||
|
areca_return_packet[1] == 0x01 &&
|
||||||
|
areca_return_packet[2] == 0x61 )
|
||||||
|
{
|
||||||
|
// valid header, let's compute the returned payload length,
|
||||||
|
// we expected the total length is
|
||||||
|
// payload + 3 bytes header + 2 bytes length + 1 byte checksum
|
||||||
|
expected = areca_return_packet[4] * 256 + areca_return_packet[3] + 6;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( total >= 7 && total >= expected )
|
||||||
|
{
|
||||||
|
//printf("total bytes received = %d, expected length = %d\n", total, expected);
|
||||||
|
|
||||||
|
// ------ Okay! we received enough --------
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Deal with the different error cases
|
||||||
|
if ( ioctlreturn )
|
||||||
|
{
|
||||||
|
pout("ioctl write buffer failed code = %x\n", ioctlreturn);
|
||||||
|
return -2;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
if ( data )
|
||||||
|
{
|
||||||
|
memcpy(data, return_buff, total);
|
||||||
|
}
|
||||||
|
|
||||||
|
return total;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
freebsd_areca_device::freebsd_areca_device(smart_interface * intf, const char * dev_name, int disknum)
|
||||||
|
: smart_device(intf, dev_name, "areca", "areca"),
|
||||||
|
freebsd_smart_device("ATA"),
|
||||||
|
m_disknum(disknum)
|
||||||
|
{
|
||||||
|
set_info().info_name = strprintf("%s [areca_%02d]", dev_name, disknum);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Areca RAID Controller
|
||||||
|
// int freebsd_areca_device::ata_command_interface(smart_command_set command, int select, char * data)
|
||||||
|
bool freebsd_areca_device::ata_pass_through(const ata_cmd_in & in, ata_cmd_out & out)
|
||||||
|
{
|
||||||
|
if (!ata_cmd_is_ok(in,
|
||||||
|
true, // data_out_support
|
||||||
|
false, // TODO: multi_sector_support
|
||||||
|
true) // ata_48bit_support
|
||||||
|
)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
// ATA input registers
|
||||||
|
typedef struct _ATA_INPUT_REGISTERS
|
||||||
|
{
|
||||||
|
unsigned char features;
|
||||||
|
unsigned char sector_count;
|
||||||
|
unsigned char sector_number;
|
||||||
|
unsigned char cylinder_low;
|
||||||
|
unsigned char cylinder_high;
|
||||||
|
unsigned char device_head;
|
||||||
|
unsigned char command;
|
||||||
|
unsigned char reserved[8];
|
||||||
|
unsigned char data[512]; // [in/out] buffer for outgoing/incoming data
|
||||||
|
} sATA_INPUT_REGISTERS;
|
||||||
|
|
||||||
|
// ATA output registers
|
||||||
|
// Note: The output registers is re-sorted for areca internal use only
|
||||||
|
typedef struct _ATA_OUTPUT_REGISTERS
|
||||||
|
{
|
||||||
|
unsigned char error;
|
||||||
|
unsigned char status;
|
||||||
|
unsigned char sector_count;
|
||||||
|
unsigned char sector_number;
|
||||||
|
unsigned char cylinder_low;
|
||||||
|
unsigned char cylinder_high;
|
||||||
|
}sATA_OUTPUT_REGISTERS;
|
||||||
|
|
||||||
|
// Areca packet format for outgoing:
|
||||||
|
// B[0~2] : 3 bytes header, fixed value 0x5E, 0x01, 0x61
|
||||||
|
// B[3~4] : 2 bytes command length + variant data length, little endian
|
||||||
|
// B[5] : 1 bytes areca defined command code, ATA passthrough command code is 0x1c
|
||||||
|
// B[6~last-1] : variant bytes payload data
|
||||||
|
// B[last] : 1 byte checksum, simply sum(B[3] ~ B[last -1])
|
||||||
|
//
|
||||||
|
//
|
||||||
|
// header 3 bytes length 2 bytes cmd 1 byte payload data x bytes cs 1 byte
|
||||||
|
// +--------------------------------------------------------------------------------+
|
||||||
|
// + 0x5E 0x01 0x61 | 0x00 0x00 | 0x1c | .................... | 0x00 |
|
||||||
|
// +--------------------------------------------------------------------------------+
|
||||||
|
//
|
||||||
|
|
||||||
|
//Areca packet format for incoming:
|
||||||
|
// B[0~2] : 3 bytes header, fixed value 0x5E, 0x01, 0x61
|
||||||
|
// B[3~4] : 2 bytes payload length, little endian
|
||||||
|
// B[5~last-1] : variant bytes returned payload data
|
||||||
|
// B[last] : 1 byte checksum, simply sum(B[3] ~ B[last -1])
|
||||||
|
//
|
||||||
|
//
|
||||||
|
// header 3 bytes length 2 bytes payload data x bytes cs 1 byte
|
||||||
|
// +-------------------------------------------------------------------+
|
||||||
|
// + 0x5E 0x01 0x61 | 0x00 0x00 | .................... | 0x00 |
|
||||||
|
// +-------------------------------------------------------------------+
|
||||||
|
unsigned char areca_packet[640];
|
||||||
|
int areca_packet_len = sizeof(areca_packet);
|
||||||
|
unsigned char cs = 0;
|
||||||
|
|
||||||
|
sATA_INPUT_REGISTERS *ata_cmd;
|
||||||
|
|
||||||
|
// For debugging
|
||||||
|
memset(areca_packet, 0, areca_packet_len);
|
||||||
|
|
||||||
|
// ----- BEGIN TO SETUP HEADERS -------
|
||||||
|
areca_packet[0] = 0x5E;
|
||||||
|
areca_packet[1] = 0x01;
|
||||||
|
areca_packet[2] = 0x61;
|
||||||
|
areca_packet[3] = (unsigned char)((areca_packet_len - 6) & 0xff);
|
||||||
|
areca_packet[4] = (unsigned char)(((areca_packet_len - 6) >> 8) & 0xff);
|
||||||
|
areca_packet[5] = 0x1c; // areca defined code for ATA passthrough command
|
||||||
|
|
||||||
|
// ----- BEGIN TO SETUP PAYLOAD DATA -----
|
||||||
|
memcpy(&areca_packet[7], "SmrT", 4); // areca defined password
|
||||||
|
ata_cmd = (sATA_INPUT_REGISTERS *)&areca_packet[12];
|
||||||
|
|
||||||
|
// Set registers
|
||||||
|
{
|
||||||
|
const ata_in_regs_48bit & r = in.in_regs;
|
||||||
|
ata_cmd->features = r.features_16;
|
||||||
|
ata_cmd->sector_count = r.sector_count_16;
|
||||||
|
ata_cmd->sector_number = r.lba_low_16;
|
||||||
|
ata_cmd->cylinder_low = r.lba_mid_16;
|
||||||
|
ata_cmd->cylinder_high = r.lba_high_16;
|
||||||
|
ata_cmd->device_head = r.device;
|
||||||
|
ata_cmd->command = r.command;
|
||||||
|
}
|
||||||
|
bool readdata = false;
|
||||||
|
if (in.direction == ata_cmd_in::data_in) {
|
||||||
|
readdata = true;
|
||||||
|
// the command will read data
|
||||||
|
areca_packet[6] = 0x13;
|
||||||
|
}
|
||||||
|
else if ( in.direction == ata_cmd_in::no_data )
|
||||||
|
{
|
||||||
|
// the commands will return no data
|
||||||
|
areca_packet[6] = 0x15;
|
||||||
|
}
|
||||||
|
else if (in.direction == ata_cmd_in::data_out)
|
||||||
|
{
|
||||||
|
// the commands will write data
|
||||||
|
memcpy(ata_cmd->data, in.buffer, in.size);
|
||||||
|
areca_packet[6] = 0x14;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
// COMMAND NOT SUPPORTED VIA ARECA IOCTL INTERFACE
|
||||||
|
return set_err(ENOTSUP, "DATA OUT not supported for this Areca controller type");
|
||||||
|
}
|
||||||
|
|
||||||
|
areca_packet[11] = m_disknum - 1; // drive number
|
||||||
|
|
||||||
|
// ----- BEGIN TO SETUP CHECKSUM -----
|
||||||
|
for ( int loop = 3; loop < areca_packet_len - 1; loop++ )
|
||||||
|
{
|
||||||
|
cs += areca_packet[loop];
|
||||||
|
}
|
||||||
|
areca_packet[areca_packet_len-1] = cs;
|
||||||
|
|
||||||
|
// ----- BEGIN TO SEND TO ARECA DRIVER ------
|
||||||
|
int expected = 0;
|
||||||
|
unsigned char return_buff[2048];
|
||||||
|
memset(return_buff, 0, sizeof(return_buff));
|
||||||
|
|
||||||
|
expected = arcmsr_command_handler(get_fd(), ARCMSR_IOCTL_CLEAR_RQBUFFER, NULL, 0, NULL);
|
||||||
|
if (expected==-3) {
|
||||||
|
return set_err(EIO);
|
||||||
|
}
|
||||||
|
|
||||||
|
expected = arcmsr_command_handler(get_fd(), ARCMSR_IOCTL_CLEAR_WQBUFFER, NULL, 0, NULL);
|
||||||
|
expected = arcmsr_command_handler(get_fd(), ARCMSR_IOCTL_WRITE_WQBUFFER, areca_packet, areca_packet_len, NULL);
|
||||||
|
if ( expected > 0 )
|
||||||
|
{
|
||||||
|
expected = arcmsr_command_handler(get_fd(), ARCMSR_IOCTL_READ_RQBUFFER, return_buff, sizeof(return_buff), NULL);
|
||||||
|
}
|
||||||
|
if ( expected < 0 )
|
||||||
|
{
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
// ----- VERIFY THE CHECKSUM -----
|
||||||
|
cs = 0;
|
||||||
|
for ( int loop = 3; loop < expected - 1; loop++ )
|
||||||
|
{
|
||||||
|
cs += return_buff[loop];
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( return_buff[expected - 1] != cs )
|
||||||
|
{
|
||||||
|
return set_err(EIO);
|
||||||
|
}
|
||||||
|
|
||||||
|
sATA_OUTPUT_REGISTERS *ata_out = (sATA_OUTPUT_REGISTERS *)&return_buff[5] ;
|
||||||
|
if ( ata_out->status )
|
||||||
|
{
|
||||||
|
if ( in.in_regs.command == ATA_IDENTIFY_DEVICE
|
||||||
|
&& !nonempty((unsigned char *)in.buffer, in.size))
|
||||||
|
{
|
||||||
|
return set_err(ENODEV, "No drive on port %d", m_disknum);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// returns with data
|
||||||
|
if (readdata)
|
||||||
|
{
|
||||||
|
memcpy(in.buffer, &return_buff[7], in.size);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Return register values
|
||||||
|
{
|
||||||
|
ata_out_regs_48bit & r = out.out_regs;
|
||||||
|
r.error = ata_out->error;
|
||||||
|
r.sector_count_16 = ata_out->sector_count;
|
||||||
|
r.lba_low_16 = ata_out->sector_number;
|
||||||
|
r.lba_mid_16 = ata_out->cylinder_low;
|
||||||
|
r.lba_high_16 = ata_out->cylinder_high;
|
||||||
|
r.status = ata_out->status;
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/////////////////////////////////////////////////////////////////////////////
|
/////////////////////////////////////////////////////////////////////////////
|
||||||
/// Implement CCISS RAID support with old functions
|
/// Implement CCISS RAID support with old functions
|
||||||
|
|
||||||
@ -1072,11 +1531,6 @@ bool freebsd_cciss_device::open()
|
|||||||
{
|
{
|
||||||
const char *dev = get_dev_name();
|
const char *dev = get_dev_name();
|
||||||
int fd;
|
int fd;
|
||||||
#ifndef HAVE_DEV_CISS_CISSIO_H
|
|
||||||
pout("CCISS support is not available in this build of smartmontools,\n"
|
|
||||||
"/usr/src/sys/dev/ciss/cissio.h was not available at build time.\n\n");
|
|
||||||
return false;
|
|
||||||
#endif
|
|
||||||
if ((fd = ::open(dev,O_RDWR))<0) {
|
if ((fd = ::open(dev,O_RDWR))<0) {
|
||||||
set_err(errno);
|
set_err(errno);
|
||||||
return false;
|
return false;
|
||||||
@ -1096,12 +1550,10 @@ freebsd_cciss_device::freebsd_cciss_device(smart_interface * intf,
|
|||||||
|
|
||||||
bool freebsd_cciss_device::scsi_pass_through(scsi_cmnd_io * iop)
|
bool freebsd_cciss_device::scsi_pass_through(scsi_cmnd_io * iop)
|
||||||
{
|
{
|
||||||
#ifdef HAVE_DEV_CISS_CISSIO_H
|
|
||||||
int status = cciss_io_interface(get_fd(), m_disknum, iop, scsi_debugmode);
|
int status = cciss_io_interface(get_fd(), m_disknum, iop, scsi_debugmode);
|
||||||
if (status < 0)
|
if (status < 0)
|
||||||
return set_err(-status);
|
return set_err(-status);
|
||||||
return true;
|
return true;
|
||||||
#endif
|
|
||||||
// not reached
|
// not reached
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
@ -1152,12 +1604,18 @@ smart_device * freebsd_scsi_device::autodetect_open()
|
|||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
// SAT or USB ?
|
// SAT or USB, skip MFI controllers because of bugs
|
||||||
{
|
{
|
||||||
smart_device * newdev = smi()->autodetect_sat_device(this, req_buff, len);
|
smart_device * newdev = smi()->autodetect_sat_device(this, req_buff, len);
|
||||||
if (newdev)
|
if (newdev) {
|
||||||
// NOTE: 'this' is now owned by '*newdev'
|
// NOTE: 'this' is now owned by '*newdev'
|
||||||
|
if(!strcmp("mfi",m_camdev->sim_name)) {
|
||||||
|
newdev->close();
|
||||||
|
newdev->set_err(ENOSYS, "SATA device detected,\n"
|
||||||
|
"MegaRAID SAT layer is reportedly buggy, use '-d sat' to try anyhow");
|
||||||
|
}
|
||||||
return newdev;
|
return newdev;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Nothing special found
|
// Nothing special found
|
||||||
@ -1311,8 +1769,7 @@ bool get_dev_names_cam(std::vector<std::string> & names, bool show_all)
|
|||||||
if (ccb.cdm.matches[i].type == DEV_MATCH_BUS) {
|
if (ccb.cdm.matches[i].type == DEV_MATCH_BUS) {
|
||||||
bus_result = &ccb.cdm.matches[i].result.bus_result;
|
bus_result = &ccb.cdm.matches[i].result.bus_result;
|
||||||
|
|
||||||
if (strcmp(bus_result->dev_name,"ata") == 0 /* ATAPICAM devices will be probed as ATA devices, skip'em there */
|
if (strcmp(bus_result->dev_name,"xpt") == 0) /* skip XPT bus at all */
|
||||||
|| strcmp(bus_result->dev_name,"xpt") == 0) /* skip XPT bus at all */
|
|
||||||
skip_bus = 1;
|
skip_bus = 1;
|
||||||
else
|
else
|
||||||
skip_bus = 0;
|
skip_bus = 0;
|
||||||
@ -1641,10 +2098,23 @@ smart_device * freebsd_smart_interface::autodetect_smart_device(const char * nam
|
|||||||
int bus=-1;
|
int bus=-1;
|
||||||
int i,c;
|
int i,c;
|
||||||
int len;
|
int len;
|
||||||
|
const char * test_name = name;
|
||||||
|
|
||||||
// if dev_name null, or string length zero
|
// if dev_name null, or string length zero
|
||||||
if (!name || !(len = strlen(name)))
|
if (!name || !(len = strlen(name)))
|
||||||
return false;
|
return 0;
|
||||||
|
|
||||||
|
// Dereference symlinks
|
||||||
|
struct stat st;
|
||||||
|
std::string pathbuf;
|
||||||
|
if (!lstat(name, &st) && S_ISLNK(st.st_mode)) {
|
||||||
|
char * p = realpath(name, (char *)0);
|
||||||
|
if (p) {
|
||||||
|
pathbuf = p;
|
||||||
|
free(p);
|
||||||
|
test_name = pathbuf.c_str();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// check ATA bus
|
// check ATA bus
|
||||||
char * * atanames = 0; int numata = 0;
|
char * * atanames = 0; int numata = 0;
|
||||||
@ -1652,10 +2122,10 @@ smart_device * freebsd_smart_interface::autodetect_smart_device(const char * nam
|
|||||||
if (numata > 0) {
|
if (numata > 0) {
|
||||||
// check ATA/ATAPI devices
|
// check ATA/ATAPI devices
|
||||||
for (i = 0; i < numata; i++) {
|
for (i = 0; i < numata; i++) {
|
||||||
if(!strcmp(atanames[i],name)) {
|
if(!strcmp(atanames[i],test_name)) {
|
||||||
for (c = i; c < numata; c++) free(atanames[c]);
|
for (c = i; c < numata; c++) free(atanames[c]);
|
||||||
free(atanames);
|
free(atanames);
|
||||||
return new freebsd_ata_device(this, name, "");
|
return new freebsd_ata_device(this, test_name, "");
|
||||||
}
|
}
|
||||||
else free(atanames[i]);
|
else free(atanames[i]);
|
||||||
}
|
}
|
||||||
@ -1673,14 +2143,13 @@ smart_device * freebsd_smart_interface::autodetect_smart_device(const char * nam
|
|||||||
else if (!scsinames.empty()) {
|
else if (!scsinames.empty()) {
|
||||||
// check all devices on CAM bus
|
// check all devices on CAM bus
|
||||||
for (i = 0; i < (int)scsinames.size(); i++) {
|
for (i = 0; i < (int)scsinames.size(); i++) {
|
||||||
if(strcmp(scsinames[i].c_str(), name)==0)
|
if(strcmp(scsinames[i].c_str(), test_name)==0)
|
||||||
{ // our disk device is CAM
|
{ // our disk device is CAM
|
||||||
if ((cam_dev = cam_open_device(name, O_RDWR)) == NULL) {
|
if ((cam_dev = cam_open_device(test_name, O_RDWR)) == NULL) {
|
||||||
// open failure
|
// open failure
|
||||||
set_err(errno);
|
set_err(errno);
|
||||||
return false;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
// zero the payload
|
// zero the payload
|
||||||
bzero(&(&ccb.ccb_h)[1], PATHINQ_SETTINGS_SIZE);
|
bzero(&(&ccb.ccb_h)[1], PATHINQ_SETTINGS_SIZE);
|
||||||
ccb.ccb_h.func_code = XPT_PATH_INQ; // send PATH_INQ to the device
|
ccb.ccb_h.func_code = XPT_PATH_INQ; // send PATH_INQ to the device
|
||||||
@ -1698,24 +2167,27 @@ smart_device * freebsd_smart_interface::autodetect_smart_device(const char * nam
|
|||||||
if(usbdevlist(bus,vendor_id, product_id, version)){
|
if(usbdevlist(bus,vendor_id, product_id, version)){
|
||||||
const char * usbtype = get_usb_dev_type_by_id(vendor_id, product_id, version);
|
const char * usbtype = get_usb_dev_type_by_id(vendor_id, product_id, version);
|
||||||
if (usbtype)
|
if (usbtype)
|
||||||
return get_sat_device(usbtype, new freebsd_scsi_device(this, name, ""));
|
return get_sat_device(usbtype, new freebsd_scsi_device(this, test_name, ""));
|
||||||
}
|
}
|
||||||
return false;
|
return 0;
|
||||||
}
|
}
|
||||||
#if FREEBSDVER > 800100
|
#if FREEBSDVER > 800100
|
||||||
// check if we have ATA device connected to CAM (ada)
|
// check if we have ATA device connected to CAM (ada)
|
||||||
if(ccb.cpi.protocol == PROTO_ATA){
|
if(ccb.cpi.protocol == PROTO_ATA){
|
||||||
cam_close_device(cam_dev);
|
cam_close_device(cam_dev);
|
||||||
return new freebsd_atacam_device(this, name, "");
|
return new freebsd_atacam_device(this, test_name, "");
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
// close cam device, we don`t need it anymore
|
// close cam device, we don`t need it anymore
|
||||||
cam_close_device(cam_dev);
|
cam_close_device(cam_dev);
|
||||||
// handle as usual scsi
|
// handle as usual scsi
|
||||||
return new freebsd_scsi_device(this, name, "");
|
return new freebsd_scsi_device(this, test_name, "");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
// device is LSI raid supported by mfi driver
|
||||||
|
if(!strncmp("/dev/mfid", test_name, strlen("/dev/mfid")))
|
||||||
|
set_err(EINVAL, "To monitor disks on LSI RAID load mfip.ko module and run 'smartctl -a /dev/passX' to show SMART information");
|
||||||
// device type unknown
|
// device type unknown
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
@ -1767,7 +2239,7 @@ smart_device * freebsd_smart_interface::get_custom_smart_device(const char * nam
|
|||||||
set_err(EINVAL, "Option '-d hpt,L/M/N' invalid controller id L supplied");
|
set_err(EINVAL, "Option '-d hpt,L/M/N' invalid controller id L supplied");
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
if (!(1 <= channel && channel <= 8)) {
|
if (!(1 <= channel && channel <= 16)) {
|
||||||
set_err(EINVAL, "Option '-d hpt,L/M/N' invalid channel number M supplied");
|
set_err(EINVAL, "Option '-d hpt,L/M/N' invalid channel number M supplied");
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
@ -1796,13 +2268,26 @@ smart_device * freebsd_smart_interface::get_custom_smart_device(const char * nam
|
|||||||
if(!strcmp(type,"atacam"))
|
if(!strcmp(type,"atacam"))
|
||||||
return new freebsd_atacam_device(this, name, "");
|
return new freebsd_atacam_device(this, name, "");
|
||||||
#endif
|
#endif
|
||||||
|
// Areca?
|
||||||
|
disknum = n1 = n2 = -1;
|
||||||
|
if (sscanf(type, "areca,%n%d%n", &n1, &disknum, &n2) == 1 || n1 == 6) {
|
||||||
|
if (n2 != (int)strlen(type)) {
|
||||||
|
set_err(EINVAL, "Option -d areca,N requires N to be a non-negative integer");
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
if (!(1 <= disknum && disknum <= 24)) {
|
||||||
|
set_err(EINVAL, "Option -d areca,N (N=%d) must have 1 <= N <= 24", disknum);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
return new freebsd_areca_device(this, name, disknum);
|
||||||
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
std::string freebsd_smart_interface::get_valid_custom_dev_types_str()
|
std::string freebsd_smart_interface::get_valid_custom_dev_types_str()
|
||||||
{
|
{
|
||||||
return "3ware,N, hpt,L/M/N, cciss,N"
|
return "3ware,N, hpt,L/M/N, cciss,N, areca,N"
|
||||||
#if FREEBSDVER > 800100
|
#if FREEBSDVER > 800100
|
||||||
", atacam"
|
", atacam"
|
||||||
#endif
|
#endif
|
||||||
|
203
os_linux.cpp
203
os_linux.cpp
@ -89,7 +89,7 @@
|
|||||||
|
|
||||||
#define ARGUSED(x) ((void)(x))
|
#define ARGUSED(x) ((void)(x))
|
||||||
|
|
||||||
const char * os_linux_cpp_cvsid = "$Id: os_linux.cpp 3317 2011-04-19 19:42:54Z chrfranke $"
|
const char * os_linux_cpp_cvsid = "$Id: os_linux.cpp 3441 2011-10-12 17:22:15Z chrfranke $"
|
||||||
OS_LINUX_H_CVSID;
|
OS_LINUX_H_CVSID;
|
||||||
|
|
||||||
|
|
||||||
@ -940,9 +940,13 @@ smart_device * linux_megaraid_device::autodetect_open()
|
|||||||
{
|
{
|
||||||
// SAT or USB ?
|
// SAT or USB ?
|
||||||
ata_device * newdev = smi()->autodetect_sat_device(this, req_buff, len);
|
ata_device * newdev = smi()->autodetect_sat_device(this, req_buff, len);
|
||||||
if (newdev)
|
if (newdev) {
|
||||||
// NOTE: 'this' is now owned by '*newdev'
|
// NOTE: 'this' is now owned by '*newdev'
|
||||||
|
newdev->close();
|
||||||
|
newdev->set_err(ENOSYS, "SATA device detected,\n"
|
||||||
|
"MegaRAID SAT layer is reportedly buggy, use '-d sat+megaraid,N' to try anyhow");
|
||||||
return newdev;
|
return newdev;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Nothing special found
|
// Nothing special found
|
||||||
@ -1050,11 +1054,17 @@ bool linux_megaraid_device::scsi_pass_through(scsi_cmnd_io *iop)
|
|||||||
if (iop->cmnd[0] == 0x00)
|
if (iop->cmnd[0] == 0x00)
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
if (iop->cmnd[0] == 0xa1 || iop->cmnd[0] == 0x85) { // SAT_ATA_PASSTHROUGH_12/16
|
if (iop->cmnd[0] == SAT_ATA_PASSTHROUGH_12 || iop->cmnd[0] == SAT_ATA_PASSTHROUGH_16) {
|
||||||
// Controller does not return ATA output registers in SAT sense data
|
// Controller does not return ATA output registers in SAT sense data
|
||||||
if (iop->cmnd[2] & (1 << 5)) // chk_cond
|
if (iop->cmnd[2] & (1 << 5)) // chk_cond
|
||||||
return set_err(ENOSYS, "ATA return descriptor not supported by controller firmware");
|
return set_err(ENOSYS, "ATA return descriptor not supported by controller firmware");
|
||||||
}
|
}
|
||||||
|
// SMART WRITE LOG SECTOR causing media errors
|
||||||
|
if ((iop->cmnd[0] == SAT_ATA_PASSTHROUGH_16 && iop->cmnd[14] == ATA_SMART_CMD
|
||||||
|
&& iop->cmnd[3]==0 && iop->cmnd[4] == ATA_SMART_WRITE_LOG_SECTOR) ||
|
||||||
|
(iop->cmnd[0] == SAT_ATA_PASSTHROUGH_12 && iop->cmnd[9] == ATA_SMART_CMD &&
|
||||||
|
iop->cmnd[3] == ATA_SMART_WRITE_LOG_SECTOR))
|
||||||
|
return set_err(ENOSYS, "SMART WRITE LOG SECTOR command is not supported by controller firmware");
|
||||||
|
|
||||||
if (pt_cmd == NULL)
|
if (pt_cmd == NULL)
|
||||||
return false;
|
return false;
|
||||||
@ -1115,14 +1125,11 @@ bool linux_megaraid_device::megasas_cmd(int cdbLen, void *cdb,
|
|||||||
/* Issue passthrough scsi commands to PERC2/3/4 controllers */
|
/* Issue passthrough scsi commands to PERC2/3/4 controllers */
|
||||||
bool linux_megaraid_device::megadev_cmd(int cdbLen, void *cdb,
|
bool linux_megaraid_device::megadev_cmd(int cdbLen, void *cdb,
|
||||||
int dataLen, void *data,
|
int dataLen, void *data,
|
||||||
int senseLen, void *sense, int /*report*/)
|
int /*senseLen*/, void * /*sense*/, int /*report*/)
|
||||||
{
|
{
|
||||||
struct uioctl_t uio;
|
struct uioctl_t uio;
|
||||||
int rc;
|
int rc;
|
||||||
|
|
||||||
sense = NULL;
|
|
||||||
senseLen = 0;
|
|
||||||
|
|
||||||
/* Don't issue to the controller */
|
/* Don't issue to the controller */
|
||||||
if (m_disknum == 7)
|
if (m_disknum == 7)
|
||||||
return false;
|
return false;
|
||||||
@ -1641,14 +1648,14 @@ bool linux_escalade_device::ata_pass_through(const ata_cmd_in & in, ata_cmd_out
|
|||||||
/// Areca RAID support
|
/// Areca RAID support
|
||||||
|
|
||||||
class linux_areca_device
|
class linux_areca_device
|
||||||
: public /*implements*/ ata_device_with_command_set,
|
: public /*implements*/ ata_device,
|
||||||
public /*extends*/ linux_smart_device
|
public /*extends*/ linux_smart_device
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
linux_areca_device(smart_interface * intf, const char * dev_name, int disknum);
|
linux_areca_device(smart_interface * intf, const char * dev_name, int disknum);
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
virtual int ata_command_interface(smart_command_set command, int select, char * data);
|
virtual bool ata_pass_through(const ata_cmd_in & in, ata_cmd_out & out);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
int m_disknum; ///< Disk number.
|
int m_disknum; ///< Disk number.
|
||||||
@ -1966,8 +1973,16 @@ linux_areca_device::linux_areca_device(smart_interface * intf, const char * dev_
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Areca RAID Controller
|
// Areca RAID Controller
|
||||||
int linux_areca_device::ata_command_interface(smart_command_set command, int select, char * data)
|
// int linux_areca_device::ata_command_interface(smart_command_set command, int select, char * data)
|
||||||
|
bool linux_areca_device::ata_pass_through(const ata_cmd_in & in, ata_cmd_out & out)
|
||||||
{
|
{
|
||||||
|
if (!ata_cmd_is_ok(in,
|
||||||
|
true, // data_out_support
|
||||||
|
false, // TODO: multi_sector_support
|
||||||
|
true) // ata_48bit_support
|
||||||
|
)
|
||||||
|
return false;
|
||||||
|
|
||||||
// ATA input registers
|
// ATA input registers
|
||||||
typedef struct _ATA_INPUT_REGISTERS
|
typedef struct _ATA_INPUT_REGISTERS
|
||||||
{
|
{
|
||||||
@ -2041,113 +2056,42 @@ int linux_areca_device::ata_command_interface(smart_command_set command, int sel
|
|||||||
areca_packet[4] = (unsigned char)(((areca_packet_len - 6) >> 8) & 0xff);
|
areca_packet[4] = (unsigned char)(((areca_packet_len - 6) >> 8) & 0xff);
|
||||||
areca_packet[5] = 0x1c; // areca defined code for ATA passthrough command
|
areca_packet[5] = 0x1c; // areca defined code for ATA passthrough command
|
||||||
|
|
||||||
|
|
||||||
// ----- BEGIN TO SETUP PAYLOAD DATA -----
|
// ----- BEGIN TO SETUP PAYLOAD DATA -----
|
||||||
|
|
||||||
memcpy(&areca_packet[7], "SmrT", 4); // areca defined password
|
memcpy(&areca_packet[7], "SmrT", 4); // areca defined password
|
||||||
|
|
||||||
ata_cmd = (sATA_INPUT_REGISTERS *)&areca_packet[12];
|
ata_cmd = (sATA_INPUT_REGISTERS *)&areca_packet[12];
|
||||||
ata_cmd->cylinder_low = 0x4F;
|
|
||||||
ata_cmd->cylinder_high = 0xC2;
|
|
||||||
|
|
||||||
|
// Set registers
|
||||||
if ( command == READ_VALUES ||
|
{
|
||||||
command == READ_THRESHOLDS ||
|
const ata_in_regs_48bit & r = in.in_regs;
|
||||||
command == READ_LOG ||
|
ata_cmd->features = r.features_16;
|
||||||
command == IDENTIFY ||
|
ata_cmd->sector_count = r.sector_count_16;
|
||||||
command == PIDENTIFY )
|
ata_cmd->sector_number = r.lba_low_16;
|
||||||
{
|
ata_cmd->cylinder_low = r.lba_mid_16;
|
||||||
// the commands will return data
|
ata_cmd->cylinder_high = r.lba_high_16;
|
||||||
areca_packet[6] = 0x13;
|
ata_cmd->device_head = r.device;
|
||||||
ata_cmd->sector_count = 0x1;
|
ata_cmd->command = r.command;
|
||||||
}
|
}
|
||||||
else if ( command == WRITE_LOG )
|
bool readdata = false;
|
||||||
{
|
if (in.direction == ata_cmd_in::data_in) {
|
||||||
// the commands will write data
|
readdata = true;
|
||||||
areca_packet[6] = 0x14;
|
// the command will read data
|
||||||
|
areca_packet[6] = 0x13;
|
||||||
}
|
}
|
||||||
else
|
else if ( in.direction == ata_cmd_in::no_data )
|
||||||
{
|
{
|
||||||
// the commands will return no data
|
// the commands will return no data
|
||||||
areca_packet[6] = 0x15;
|
areca_packet[6] = 0x15;
|
||||||
}
|
}
|
||||||
|
else if (in.direction == ata_cmd_in::data_out)
|
||||||
|
|
||||||
ata_cmd->command = ATA_SMART_CMD;
|
|
||||||
// Now set ATA registers depending upon command
|
|
||||||
switch ( command )
|
|
||||||
{
|
{
|
||||||
case CHECK_POWER_MODE:
|
// the commands will write data
|
||||||
//printf("command = CHECK_POWER_MODE\n");
|
memcpy(ata_cmd->data, in.buffer, in.size);
|
||||||
ata_cmd->command = ATA_CHECK_POWER_MODE;
|
areca_packet[6] = 0x14;
|
||||||
break;
|
}
|
||||||
case READ_VALUES:
|
else {
|
||||||
//printf("command = READ_VALUES\n");
|
// COMMAND NOT SUPPORTED VIA ARECA IOCTL INTERFACE
|
||||||
ata_cmd->features = ATA_SMART_READ_VALUES;
|
return set_err(ENOTSUP, "DATA OUT not supported for this Areca controller type");
|
||||||
break;
|
}
|
||||||
case READ_THRESHOLDS:
|
|
||||||
//printf("command = READ_THRESHOLDS\n");
|
|
||||||
ata_cmd->features = ATA_SMART_READ_THRESHOLDS;
|
|
||||||
break;
|
|
||||||
case READ_LOG:
|
|
||||||
//printf("command = READ_LOG\n");
|
|
||||||
ata_cmd->features = ATA_SMART_READ_LOG_SECTOR;
|
|
||||||
ata_cmd->sector_number = select;
|
|
||||||
break;
|
|
||||||
case WRITE_LOG:
|
|
||||||
//printf("command = WRITE_LOG\n");
|
|
||||||
ata_cmd->features = ATA_SMART_WRITE_LOG_SECTOR;
|
|
||||||
memcpy(ata_cmd->data, data, 512);
|
|
||||||
ata_cmd->sector_count = 1;
|
|
||||||
ata_cmd->sector_number = select;
|
|
||||||
break;
|
|
||||||
case IDENTIFY:
|
|
||||||
//printf("command = IDENTIFY\n");
|
|
||||||
ata_cmd->command = ATA_IDENTIFY_DEVICE;
|
|
||||||
break;
|
|
||||||
case PIDENTIFY:
|
|
||||||
//printf("command = PIDENTIFY\n");
|
|
||||||
errno=ENODEV;
|
|
||||||
return -1;
|
|
||||||
case ENABLE:
|
|
||||||
//printf("command = ENABLE\n");
|
|
||||||
ata_cmd->features = ATA_SMART_ENABLE;
|
|
||||||
break;
|
|
||||||
case DISABLE:
|
|
||||||
//printf("command = DISABLE\n");
|
|
||||||
ata_cmd->features = ATA_SMART_DISABLE;
|
|
||||||
break;
|
|
||||||
case AUTO_OFFLINE:
|
|
||||||
//printf("command = AUTO_OFFLINE\n");
|
|
||||||
ata_cmd->features = ATA_SMART_AUTO_OFFLINE;
|
|
||||||
// Enable or disable?
|
|
||||||
ata_cmd->sector_count = select;
|
|
||||||
break;
|
|
||||||
case AUTOSAVE:
|
|
||||||
//printf("command = AUTOSAVE\n");
|
|
||||||
ata_cmd->features = ATA_SMART_AUTOSAVE;
|
|
||||||
// Enable or disable?
|
|
||||||
ata_cmd->sector_count = select;
|
|
||||||
break;
|
|
||||||
case IMMEDIATE_OFFLINE:
|
|
||||||
//printf("command = IMMEDIATE_OFFLINE\n");
|
|
||||||
ata_cmd->features = ATA_SMART_IMMEDIATE_OFFLINE;
|
|
||||||
// What test type to run?
|
|
||||||
ata_cmd->sector_number = select;
|
|
||||||
break;
|
|
||||||
case STATUS_CHECK:
|
|
||||||
//printf("command = STATUS_CHECK\n");
|
|
||||||
ata_cmd->features = ATA_SMART_STATUS;
|
|
||||||
break;
|
|
||||||
case STATUS:
|
|
||||||
//printf("command = STATUS\n");
|
|
||||||
ata_cmd->features = ATA_SMART_STATUS;
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
//printf("command = UNKNOWN\n");
|
|
||||||
errno=ENOSYS;
|
|
||||||
return -1;
|
|
||||||
};
|
|
||||||
|
|
||||||
areca_packet[11] = m_disknum - 1; // drive number
|
areca_packet[11] = m_disknum - 1; // drive number
|
||||||
|
|
||||||
@ -2166,7 +2110,7 @@ int linux_areca_device::ata_command_interface(smart_command_set command, int sel
|
|||||||
expected = arcmsr_command_handler(get_fd(), ARCMSR_IOCTL_CLEAR_RQBUFFER, NULL, 0, NULL);
|
expected = arcmsr_command_handler(get_fd(), ARCMSR_IOCTL_CLEAR_RQBUFFER, NULL, 0, NULL);
|
||||||
if (expected==-3) {
|
if (expected==-3) {
|
||||||
find_areca_in_proc(NULL);
|
find_areca_in_proc(NULL);
|
||||||
return -1;
|
return set_err(EIO);
|
||||||
}
|
}
|
||||||
|
|
||||||
expected = arcmsr_command_handler(get_fd(), ARCMSR_IOCTL_CLEAR_WQBUFFER, NULL, 0, NULL);
|
expected = arcmsr_command_handler(get_fd(), ARCMSR_IOCTL_CLEAR_WQBUFFER, NULL, 0, NULL);
|
||||||
@ -2189,45 +2133,36 @@ int linux_areca_device::ata_command_interface(smart_command_set command, int sel
|
|||||||
|
|
||||||
if ( return_buff[expected - 1] != cs )
|
if ( return_buff[expected - 1] != cs )
|
||||||
{
|
{
|
||||||
errno = EIO;
|
return set_err(EIO);
|
||||||
return -1;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
sATA_OUTPUT_REGISTERS *ata_out = (sATA_OUTPUT_REGISTERS *)&return_buff[5] ;
|
sATA_OUTPUT_REGISTERS *ata_out = (sATA_OUTPUT_REGISTERS *)&return_buff[5] ;
|
||||||
if ( ata_out->status )
|
if ( ata_out->status )
|
||||||
{
|
{
|
||||||
if ( command == IDENTIFY )
|
if ( in.in_regs.command == ATA_IDENTIFY_DEVICE
|
||||||
{
|
&& !nonempty((unsigned char *)in.buffer, in.size))
|
||||||
pout("The firmware of your Areca RAID controller appears to be outdated!\n" \
|
{
|
||||||
"Please update your controller to firmware version 1.46 or later.\n" \
|
return set_err(ENODEV, "No drive on port %d", m_disknum);
|
||||||
"You may download it here: ftp://ftp.areca.com.tw/RaidCards/BIOS_Firmware\n\n");
|
}
|
||||||
}
|
|
||||||
errno = EIO;
|
|
||||||
return -1;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// returns with data
|
// returns with data
|
||||||
if ( command == READ_VALUES ||
|
if (readdata)
|
||||||
command == READ_THRESHOLDS ||
|
|
||||||
command == READ_LOG ||
|
|
||||||
command == IDENTIFY ||
|
|
||||||
command == PIDENTIFY )
|
|
||||||
{
|
{
|
||||||
memcpy(data, &return_buff[7], 512);
|
memcpy(in.buffer, &return_buff[7], in.size);
|
||||||
}
|
}
|
||||||
|
|
||||||
if ( command == CHECK_POWER_MODE )
|
// Return register values
|
||||||
{
|
{
|
||||||
data[0] = ata_out->sector_count;
|
ata_out_regs_48bit & r = out.out_regs;
|
||||||
|
r.error = ata_out->error;
|
||||||
|
r.sector_count_16 = ata_out->sector_count;
|
||||||
|
r.lba_low_16 = ata_out->sector_number;
|
||||||
|
r.lba_mid_16 = ata_out->cylinder_low;
|
||||||
|
r.lba_high_16 = ata_out->cylinder_high;
|
||||||
|
r.status = ata_out->status;
|
||||||
}
|
}
|
||||||
|
return true;
|
||||||
if ( command == STATUS_CHECK &&
|
|
||||||
( ata_out->cylinder_low == 0xF4 && ata_out->cylinder_high == 0x2C ) )
|
|
||||||
{
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -3150,7 +3085,7 @@ smart_device * linux_smart_interface::get_custom_smart_device(const char * name,
|
|||||||
set_err(EINVAL, "Option '-d hpt,L/M/N' invalid controller id L supplied");
|
set_err(EINVAL, "Option '-d hpt,L/M/N' invalid controller id L supplied");
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
if (!(1 <= channel && channel <= 8)) {
|
if (!(1 <= channel && channel <= 16)) {
|
||||||
set_err(EINVAL, "Option '-d hpt,L/M/N' invalid channel number M supplied");
|
set_err(EINVAL, "Option '-d hpt,L/M/N' invalid channel number M supplied");
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -445,13 +445,18 @@ int do_scsi_cmnd_io(int fd, struct scsi_cmnd_io * iop, int report)
|
|||||||
|
|
||||||
if ((SCSI_STATUS_CHECK_CONDITION == iop->scsi_status) &&
|
if ((SCSI_STATUS_CHECK_CONDITION == iop->scsi_status) &&
|
||||||
iop->sensep && (len > 3)) {
|
iop->sensep && (len > 3)) {
|
||||||
pout(" status=0x%x: sense_key=0x%x asc=0x%x ascq=0x%x\n",
|
if ((iop->sensep[0] & 0x7f) > 0x71)
|
||||||
iop->scsi_status, iop->sensep[2] & 0xf,
|
pout(" status=%x: [desc] sense_key=%x asc=%x ascq=%x\n",
|
||||||
iop->sensep[12], iop->sensep[13]);
|
iop->scsi_status, iop->sensep[1] & 0xf,
|
||||||
|
iop->sensep[2], iop->sensep[3]);
|
||||||
|
else
|
||||||
|
pout(" status=%x: sense_key=%x asc=%x ascq=%x\n",
|
||||||
|
iop->scsi_status, iop->sensep[2] & 0xf,
|
||||||
|
iop->sensep[12], iop->sensep[13]);
|
||||||
if (report > 1) {
|
if (report > 1) {
|
||||||
pout(" >>> Sense buffer, len=%d:\n", len);
|
pout(" >>> Sense buffer, len=%d:\n", len);
|
||||||
dStrHex((const char *)iop->sensep, ((len > 252) ? 252 : len) , 1);
|
dStrHex((const char *)iop->sensep, ((len > 252) ? 252 : len) , 1);
|
||||||
}
|
}
|
||||||
} else if (iop->scsi_status)
|
} else if (iop->scsi_status)
|
||||||
pout(" status=%x\n", iop->scsi_status);
|
pout(" status=%x\n", iop->scsi_status);
|
||||||
if (iop->resid)
|
if (iop->resid)
|
||||||
|
126
os_win32.cpp
126
os_win32.cpp
@ -3,7 +3,7 @@
|
|||||||
*
|
*
|
||||||
* Home page of code is: http://smartmontools.sourceforge.net
|
* Home page of code is: http://smartmontools.sourceforge.net
|
||||||
*
|
*
|
||||||
* Copyright (C) 2004-11 Christian Franke <smartmontools-support@lists.sourceforge.net>
|
* Copyright (C) 2004-12 Christian Franke <smartmontools-support@lists.sourceforge.net>
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or modify
|
* 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
|
* it under the terms of the GNU General Public License as published by
|
||||||
@ -60,8 +60,8 @@
|
|||||||
#include <ddk/ntddscsi.h>
|
#include <ddk/ntddscsi.h>
|
||||||
#include <ddk/ntddstor.h>
|
#include <ddk/ntddstor.h>
|
||||||
#else
|
#else
|
||||||
// MSVC8, older MinGW
|
// MSVC10, older MinGW
|
||||||
// (Missing: IOCTL_STORAGE_QUERY_PROPERTY, FILE_DEVICE_SCSI)
|
// (Missing: IOCTL_SCSI_MINIPORT_*)
|
||||||
#include <ntddscsi.h>
|
#include <ntddscsi.h>
|
||||||
#include <winioctl.h>
|
#include <winioctl.h>
|
||||||
#endif
|
#endif
|
||||||
@ -85,7 +85,7 @@
|
|||||||
#define SELECT_WIN_32_64(x32, x64) (x64)
|
#define SELECT_WIN_32_64(x32, x64) (x64)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
const char * os_win32_cpp_cvsid = "$Id: os_win32.cpp 3358 2011-06-06 19:04:20Z chrfranke $";
|
const char * os_win32_cpp_cvsid = "$Id: os_win32.cpp 3521 2012-03-06 21:15:25Z chrfranke $";
|
||||||
|
|
||||||
// Disable Win9x/ME specific code if no longer supported by compiler.
|
// Disable Win9x/ME specific code if no longer supported by compiler.
|
||||||
#ifdef _WIN64
|
#ifdef _WIN64
|
||||||
@ -184,8 +184,10 @@ ASSERT_SIZEOF(SCSI_PASS_THROUGH_DIRECT, SELECT_WIN_32_64(44, 56));
|
|||||||
// SMART IOCTL via SCSI MINIPORT ioctl
|
// SMART IOCTL via SCSI MINIPORT ioctl
|
||||||
|
|
||||||
#ifndef FILE_DEVICE_SCSI
|
#ifndef FILE_DEVICE_SCSI
|
||||||
|
|
||||||
#define FILE_DEVICE_SCSI 0x001b
|
#define FILE_DEVICE_SCSI 0x001b
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef IOCTL_SCSI_MINIPORT_SMART_VERSION
|
||||||
|
|
||||||
#define IOCTL_SCSI_MINIPORT_SMART_VERSION ((FILE_DEVICE_SCSI << 16) + 0x0500)
|
#define IOCTL_SCSI_MINIPORT_SMART_VERSION ((FILE_DEVICE_SCSI << 16) + 0x0500)
|
||||||
#define IOCTL_SCSI_MINIPORT_IDENTIFY ((FILE_DEVICE_SCSI << 16) + 0x0501)
|
#define IOCTL_SCSI_MINIPORT_IDENTIFY ((FILE_DEVICE_SCSI << 16) + 0x0501)
|
||||||
@ -201,7 +203,7 @@ ASSERT_SIZEOF(SCSI_PASS_THROUGH_DIRECT, SELECT_WIN_32_64(44, 56));
|
|||||||
#define IOCTL_SCSI_MINIPORT_READ_SMART_LOG ((FILE_DEVICE_SCSI << 16) + 0x050b)
|
#define IOCTL_SCSI_MINIPORT_READ_SMART_LOG ((FILE_DEVICE_SCSI << 16) + 0x050b)
|
||||||
#define IOCTL_SCSI_MINIPORT_WRITE_SMART_LOG ((FILE_DEVICE_SCSI << 16) + 0x050c)
|
#define IOCTL_SCSI_MINIPORT_WRITE_SMART_LOG ((FILE_DEVICE_SCSI << 16) + 0x050c)
|
||||||
|
|
||||||
#endif // FILE_DEVICE_SCSI
|
#endif // IOCTL_SCSI_MINIPORT_SMART_VERSION
|
||||||
|
|
||||||
ASSERT_CONST(IOCTL_SCSI_MINIPORT, 0x04d008);
|
ASSERT_CONST(IOCTL_SCSI_MINIPORT, 0x04d008);
|
||||||
ASSERT_SIZEOF(SRB_IO_CONTROL, 28);
|
ASSERT_SIZEOF(SRB_IO_CONTROL, 28);
|
||||||
@ -581,6 +583,8 @@ class winnt_smart_interface
|
|||||||
: public /*extends*/ win_smart_interface
|
: public /*extends*/ win_smart_interface
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
|
virtual bool disable_system_auto_standby(bool disable);
|
||||||
|
|
||||||
virtual bool scan_smart_devices(smart_device_list & devlist, const char * type,
|
virtual bool scan_smart_devices(smart_device_list & devlist, const char * type,
|
||||||
const char * pattern = 0);
|
const char * pattern = 0);
|
||||||
|
|
||||||
@ -655,6 +659,9 @@ std::string win_smart_interface::get_os_version_str()
|
|||||||
case VER_PLATFORM_WIN32_NT <<16|0x0600| 1:
|
case VER_PLATFORM_WIN32_NT <<16|0x0600| 1:
|
||||||
w = (vi.wProductType == VER_NT_WORKSTATION ? "win7"
|
w = (vi.wProductType == VER_NT_WORKSTATION ? "win7"
|
||||||
: "2008r2"); break;
|
: "2008r2"); break;
|
||||||
|
case VER_PLATFORM_WIN32_NT <<16|0x0600| 2:
|
||||||
|
w = (vi.wProductType == VER_NT_WORKSTATION ? "win8"
|
||||||
|
: "win8s"); break;
|
||||||
default: w = 0; break;
|
default: w = 0; break;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1016,6 +1023,28 @@ std::string win_smart_interface::get_app_examples(const char * appname)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
bool winnt_smart_interface::disable_system_auto_standby(bool disable)
|
||||||
|
{
|
||||||
|
if (disable) {
|
||||||
|
SYSTEM_POWER_STATUS ps;
|
||||||
|
if (!GetSystemPowerStatus(&ps))
|
||||||
|
return set_err(ENOSYS, "Unknown power status");
|
||||||
|
if (ps.ACLineStatus != 1) {
|
||||||
|
SetThreadExecutionState(ES_CONTINUOUS);
|
||||||
|
if (ps.ACLineStatus == 0)
|
||||||
|
set_err(EIO, "AC offline");
|
||||||
|
else
|
||||||
|
set_err(EIO, "Unknown AC line status");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!SetThreadExecutionState(ES_CONTINUOUS | (disable ? ES_SYSTEM_REQUIRED : 0)))
|
||||||
|
return set_err(ENOSYS);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/////////////////////////////////////////////////////////////////////////////
|
/////////////////////////////////////////////////////////////////////////////
|
||||||
// ATA Interface
|
// ATA Interface
|
||||||
/////////////////////////////////////////////////////////////////////////////
|
/////////////////////////////////////////////////////////////////////////////
|
||||||
@ -1896,7 +1925,7 @@ bool win_tw_cli_device::open()
|
|||||||
// Show tw_cli error message
|
// Show tw_cli error message
|
||||||
err++;
|
err++;
|
||||||
err[strcspn(err, "\r\n")] = 0;
|
err[strcspn(err, "\r\n")] = 0;
|
||||||
return set_err(EIO, err);
|
return set_err(EIO, "%s", err);
|
||||||
}
|
}
|
||||||
return set_err(EIO);
|
return set_err(EIO);
|
||||||
}
|
}
|
||||||
@ -2022,14 +2051,22 @@ static int storage_predict_failure_ioctl(HANDLE hdevice, char * data = 0)
|
|||||||
|
|
||||||
/////////////////////////////////////////////////////////////////////////////
|
/////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
// Return true if Intel ICHxR RAID volume
|
||||||
|
static bool is_intel_raid_volume(const STORAGE_DEVICE_DESCRIPTOR_DATA * data)
|
||||||
|
{
|
||||||
|
if (!(data->desc.VendorIdOffset && data->desc.ProductIdOffset))
|
||||||
|
return false;
|
||||||
|
const char * vendor = data->raw + data->desc.VendorIdOffset;
|
||||||
|
if (!(!strnicmp(vendor, "Intel", 5) && strspn(vendor+5, " ") == strlen(vendor+5)))
|
||||||
|
return false;
|
||||||
|
if (strnicmp(data->raw + data->desc.ProductIdOffset, "Raid ", 5))
|
||||||
|
return false;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
// get DEV_* for open handle
|
// get DEV_* for open handle
|
||||||
static win_dev_type get_controller_type(HANDLE hdevice, bool admin, GETVERSIONINPARAMS_EX * ata_version_ex)
|
static win_dev_type get_controller_type(HANDLE hdevice, bool admin, GETVERSIONINPARAMS_EX * ata_version_ex)
|
||||||
{
|
{
|
||||||
// Try SMART_GET_VERSION first to detect ATA SMART support
|
|
||||||
// for drivers reporting BusTypeScsi (3ware)
|
|
||||||
if (admin && smart_get_version(hdevice, ata_version_ex) >= 0)
|
|
||||||
return DEV_ATA;
|
|
||||||
|
|
||||||
// Get BusType from device descriptor
|
// Get BusType from device descriptor
|
||||||
STORAGE_DEVICE_DESCRIPTOR_DATA data;
|
STORAGE_DEVICE_DESCRIPTOR_DATA data;
|
||||||
if (storage_query_property_ioctl(hdevice, &data))
|
if (storage_query_property_ioctl(hdevice, &data))
|
||||||
@ -2042,12 +2079,24 @@ static win_dev_type get_controller_type(HANDLE hdevice, bool admin, GETVERSIONIN
|
|||||||
if (ata_version_ex)
|
if (ata_version_ex)
|
||||||
memset(ata_version_ex, 0, sizeof(*ata_version_ex));
|
memset(ata_version_ex, 0, sizeof(*ata_version_ex));
|
||||||
return DEV_ATA;
|
return DEV_ATA;
|
||||||
|
|
||||||
case BusTypeScsi:
|
case BusTypeScsi:
|
||||||
|
case BusTypeRAID:
|
||||||
|
// Intel ICHxR RAID volume: reports SMART_GET_VERSION but does not support SMART_*
|
||||||
|
if (is_intel_raid_volume(&data))
|
||||||
|
return DEV_SCSI;
|
||||||
|
// LSI/3ware RAID volume: supports SMART_*
|
||||||
|
if (admin && smart_get_version(hdevice, ata_version_ex) >= 0)
|
||||||
|
return DEV_ATA;
|
||||||
|
return DEV_SCSI;
|
||||||
|
|
||||||
case 0x09: // BusTypeiScsi
|
case 0x09: // BusTypeiScsi
|
||||||
case 0x0a: // BusTypeSas
|
case 0x0a: // BusTypeSas
|
||||||
return DEV_SCSI;
|
return DEV_SCSI;
|
||||||
|
|
||||||
case BusTypeUsb:
|
case BusTypeUsb:
|
||||||
return DEV_USB;
|
return DEV_USB;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
return DEV_UNKNOWN;
|
return DEV_UNKNOWN;
|
||||||
}
|
}
|
||||||
@ -2173,8 +2222,9 @@ static bool get_usb_id(int drive, unsigned short & vendor_id, unsigned short & p
|
|||||||
if (!ws.query(we, "SELECT Antecedent,Dependent FROM Win32_USBControllerDevice"))
|
if (!ws.query(we, "SELECT Antecedent,Dependent FROM Win32_USBControllerDevice"))
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
std::string usb_devid;
|
unsigned short usb_venid = 0, prev_usb_venid = 0;
|
||||||
std::string prev_usb_ant, prev_usb_devid;
|
unsigned short usb_proid = 0, prev_usb_proid = 0;
|
||||||
|
std::string prev_usb_ant;
|
||||||
std::string prev_ant, ant, dep;
|
std::string prev_ant, ant, dep;
|
||||||
|
|
||||||
const regular_expression regex("^.*PnPEntity\\.DeviceID=\"([^\"]*)\"", REG_EXTENDED);
|
const regular_expression regex("^.*PnPEntity\\.DeviceID=\"([^\"]*)\"", REG_EXTENDED);
|
||||||
@ -2200,10 +2250,14 @@ static bool get_usb_id(int drive, unsigned short & vendor_id, unsigned short & p
|
|||||||
|
|
||||||
if (str_starts_with(devid, "USB\\\\VID_")) {
|
if (str_starts_with(devid, "USB\\\\VID_")) {
|
||||||
// USB bridge entry, save CONTROLLER, ID
|
// USB bridge entry, save CONTROLLER, ID
|
||||||
if (debug)
|
int nc = -1;
|
||||||
pout(" +-> \"%s\"\n", devid.c_str());
|
if (!(sscanf(devid.c_str(), "USB\\\\VID_%4hx&PID_%4hx%n",
|
||||||
|
&prev_usb_venid, &prev_usb_proid, &nc) == 2 && nc == 9+4+5+4)) {
|
||||||
|
prev_usb_venid = prev_usb_proid = 0;
|
||||||
|
}
|
||||||
prev_usb_ant = ant;
|
prev_usb_ant = ant;
|
||||||
prev_usb_devid = devid;
|
if (debug)
|
||||||
|
pout(" +-> \"%s\" [0x%04x:0x%04x]\n", devid.c_str(), prev_usb_venid, prev_usb_proid);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
else if (str_starts_with(devid, "USBSTOR\\\\")) {
|
else if (str_starts_with(devid, "USBSTOR\\\\")) {
|
||||||
@ -2220,26 +2274,32 @@ static bool get_usb_id(int drive, unsigned short & vendor_id, unsigned short & p
|
|||||||
// Continue if not name of physical disk drive
|
// Continue if not name of physical disk drive
|
||||||
if (name2 != name) {
|
if (name2 != name) {
|
||||||
if (debug)
|
if (debug)
|
||||||
pout(" | (Name: \"%s\")\n", name2.c_str());
|
pout(" +---> (\"%s\")\n", name2.c_str());
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
if (debug)
|
|
||||||
pout(" | Name: \"%s\"\n", name2.c_str());
|
|
||||||
|
|
||||||
// Fail if previos USB bridge is associated to other controller
|
// Fail if previos USB bridge is associated to other controller or ID is unknown
|
||||||
if (ant != prev_usb_ant)
|
if (!(ant == prev_usb_ant && prev_usb_venid)) {
|
||||||
|
if (debug)
|
||||||
|
pout(" +---> \"%s\" (Error: No USB bridge found)\n", name2.c_str());
|
||||||
return false;
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
// Handle multiple devices with same name
|
// Handle multiple devices with same name
|
||||||
if (!usb_devid.empty()) {
|
if (usb_venid) {
|
||||||
// Fail if multiple devices with same name have different USB bridge types
|
// Fail if multiple devices with same name have different USB bridge types
|
||||||
if (usb_devid != prev_usb_devid)
|
if (!(usb_venid == prev_usb_venid && usb_proid == prev_usb_proid)) {
|
||||||
|
if (debug)
|
||||||
|
pout(" +---> \"%s\" (Error: More than one USB ID found)\n", name2.c_str());
|
||||||
return false;
|
return false;
|
||||||
continue;
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Found
|
// Found
|
||||||
usb_devid = prev_usb_devid;
|
usb_venid = prev_usb_venid;
|
||||||
|
usb_proid = prev_usb_proid;
|
||||||
|
if (debug)
|
||||||
|
pout(" +===> \"%s\" [0x%04x:0x%04x]\n", name2.c_str(), usb_venid, usb_proid);
|
||||||
|
|
||||||
// Continue to check for duplicate names ...
|
// Continue to check for duplicate names ...
|
||||||
}
|
}
|
||||||
@ -2249,14 +2309,12 @@ static bool get_usb_id(int drive, unsigned short & vendor_id, unsigned short & p
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Parse USB ID
|
if (!usb_venid)
|
||||||
int nc = -1;
|
|
||||||
if (!(sscanf(usb_devid.c_str(), "USB\\\\VID_%4hx&PID_%4hx%n",
|
|
||||||
&vendor_id, &product_id, &nc) == 2 && nc == 9+4+5+4))
|
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
if (debug)
|
vendor_id = usb_venid;
|
||||||
pout("USB ID = 0x%04x:0x%04x\n", vendor_id, product_id);
|
product_id = usb_proid;
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -3747,7 +3805,7 @@ bool win_aspi_device::scsi_pass_through(scsi_cmnd_io * iop)
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
j += snprintf(&buff[j], (sz > j ? (sz - j) : 0), "]\n");
|
j += snprintf(&buff[j], (sz > j ? (sz - j) : 0), "]\n");
|
||||||
pout(buff);
|
pout("%s", buff);
|
||||||
}
|
}
|
||||||
|
|
||||||
ASPI_SRB srb;
|
ASPI_SRB srb;
|
||||||
@ -3990,7 +4048,7 @@ bool win_scsi_device::scsi_pass_through(struct scsi_cmnd_io * iop)
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
j += snprintf(&buff[j], (sz > j ? (sz - j) : 0), "]\n");
|
j += snprintf(&buff[j], (sz > j ? (sz - j) : 0), "]\n");
|
||||||
pout(buff);
|
pout("%s", buff);
|
||||||
}
|
}
|
||||||
|
|
||||||
SCSI_PASS_THROUGH_DIRECT_WITH_BUFFER sb;
|
SCSI_PASS_THROUGH_DIRECT_WITH_BUFFER sb;
|
||||||
|
@ -3,7 +3,7 @@
|
|||||||
*
|
*
|
||||||
* Home page of code is: http://smartmontools.sourceforge.net
|
* Home page of code is: http://smartmontools.sourceforge.net
|
||||||
*
|
*
|
||||||
* Copyright (C) 2004-10 Christian Franke <smartmontools-support@lists.sourceforge.net>
|
* Copyright (C) 2004-11 Christian Franke <smartmontools-support@lists.sourceforge.net>
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or modify
|
* 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
|
* it under the terms of the GNU General Public License as published by
|
||||||
@ -33,7 +33,7 @@
|
|||||||
|
|
||||||
#include "daemon_win32.h"
|
#include "daemon_win32.h"
|
||||||
|
|
||||||
const char * daemon_win32_cpp_cvsid = "$Id: daemon_win32.cpp 3267 2011-02-21 17:14:25Z chrfranke $"
|
const char * daemon_win32_cpp_cvsid = "$Id: daemon_win32.cpp 3426 2011-10-06 18:23:15Z chrfranke $"
|
||||||
DAEMON_WIN32_H_CVSID;
|
DAEMON_WIN32_H_CVSID;
|
||||||
|
|
||||||
|
|
||||||
@ -1034,13 +1034,27 @@ static int svcadm_main(const char * ident, const daemon_winsvc_options * svc_opt
|
|||||||
CloseServiceHandle(hm);
|
CloseServiceHandle(hm);
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
// Add quotes if necessary
|
||||||
|
if (strchr(path, ' ')) {
|
||||||
|
i = strlen(path);
|
||||||
|
path[i+1] = '"'; path[i+2] = 0;
|
||||||
|
while (--i >= 0)
|
||||||
|
path[i+1] = path[i];
|
||||||
|
path[0] = '"';
|
||||||
|
}
|
||||||
// Append options
|
// Append options
|
||||||
strcat(path, " "); strcat(path, svc_opts->cmd_opt);
|
strcat(path, " "); strcat(path, svc_opts->cmd_opt);
|
||||||
for (i = 2; i < argc; i++) {
|
for (i = 2; i < argc; i++) {
|
||||||
const char * s = argv[i];
|
const char * s = argv[i];
|
||||||
if (strlen(path)+strlen(s)+1 >= sizeof(path))
|
if (strlen(path)+1+1+strlen(s)+1 >= sizeof(path))
|
||||||
break;
|
break;
|
||||||
strcat(path, " "); strcat(path, s);
|
// Add quotes if necessary
|
||||||
|
if (strchr(s, ' ') && !strchr(s, '"')) {
|
||||||
|
strcat(path, " \""); strcat(path, s); strcat(path, "\"");
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
strcat(path, " "); strcat(path, s);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
// Create
|
// Create
|
||||||
if (!(hs = CreateService(hm,
|
if (!(hs = CreateService(hm,
|
||||||
|
@ -13,7 +13,7 @@
|
|||||||
; You should have received a copy of the GNU General Public License
|
; You should have received a copy of the GNU General Public License
|
||||||
; (for example COPYING); If not, see <http://www.gnu.org/licenses/>.
|
; (for example COPYING); If not, see <http://www.gnu.org/licenses/>.
|
||||||
;
|
;
|
||||||
; $Id: installer.nsi 3298 2011-03-22 18:36:44Z chrfranke $
|
; $Id: installer.nsi 3457 2011-10-20 16:36:47Z chrfranke $
|
||||||
;
|
;
|
||||||
|
|
||||||
|
|
||||||
@ -42,6 +42,8 @@ InstallColors /windows
|
|||||||
|
|
||||||
InstallDir "$PROGRAMFILES\smartmontools"
|
InstallDir "$PROGRAMFILES\smartmontools"
|
||||||
InstallDirRegKey HKLM "Software\smartmontools" "Install_Dir"
|
InstallDirRegKey HKLM "Software\smartmontools" "Install_Dir"
|
||||||
|
|
||||||
|
Var EDITOR
|
||||||
Var UBCDDIR
|
Var UBCDDIR
|
||||||
|
|
||||||
LicenseData "${INPDIR}\doc\COPYING.txt"
|
LicenseData "${INPDIR}\doc\COPYING.txt"
|
||||||
@ -199,64 +201,65 @@ Section "Start Menu Shortcuts" MENU_SECTION
|
|||||||
|
|
||||||
CreateDirectory "$SMPROGRAMS\smartmontools"
|
CreateDirectory "$SMPROGRAMS\smartmontools"
|
||||||
|
|
||||||
|
!macro CreateAdminShortCut link target args
|
||||||
|
CreateShortCut '${link}' '${target}' '${args}'
|
||||||
|
push '${link}'
|
||||||
|
Call ShellLinkSetRunAs
|
||||||
|
!macroend
|
||||||
|
|
||||||
|
; runcmdu
|
||||||
|
IfFileExists "$INSTDIR\bin\smartctl.exe" 0 +2
|
||||||
|
IfFileExists "$INSTDIR\bin\smartd.exe" 0 +4
|
||||||
|
SetOutPath "$INSTDIR\bin"
|
||||||
|
File "${INPDIR}\bin\runcmdu.exe"
|
||||||
|
File "${INPDIR}\bin\runcmdu.exe.manifest"
|
||||||
|
|
||||||
; smartctl
|
; smartctl
|
||||||
IfFileExists "$INSTDIR\bin\smartctl.exe" 0 noctl
|
IfFileExists "$INSTDIR\bin\smartctl.exe" 0 noctl
|
||||||
SetOutPath "$INSTDIR\bin"
|
SetOutPath "$INSTDIR\bin"
|
||||||
DetailPrint "Create file: $INSTDIR\bin\smartctl-run.bat"
|
IfFileExists "$WINDIR\system32\cmd.exe" 0 nocmd
|
||||||
Push "$INSTDIR\bin\smartctl-run.bat"
|
!insertmacro CreateAdminShortCut "$SMPROGRAMS\smartmontools\smartctl (Admin CMD).lnk" "$WINDIR\system32\cmd.exe" '/k PATH=$INSTDIR\bin;%PATH%&cd /d "$INSTDIR\bin"'
|
||||||
Call CreateSmartctlBat
|
nocmd:
|
||||||
IfFileExists "$WINDIR\system32\cmd.exe" 0 +2
|
|
||||||
CreateShortCut "$SMPROGRAMS\smartmontools\smartctl (CMD).lnk" "cmd.exe" "/k smartctl-run.bat"
|
|
||||||
CreateDirectory "$SMPROGRAMS\smartmontools\smartctl Examples"
|
CreateDirectory "$SMPROGRAMS\smartmontools\smartctl Examples"
|
||||||
FileOpen $0 "$SMPROGRAMS\smartmontools\smartctl Examples\!Read this first!.txt" "w"
|
FileOpen $0 "$SMPROGRAMS\smartmontools\smartctl Examples\!Read this first!.txt" "w"
|
||||||
FileWrite $0 "All the example commands in this directory$\r$\napply to the first drive (sda).$\r$\n"
|
FileWrite $0 "All the example commands in this directory$\r$\napply to the first drive (sda).$\r$\n"
|
||||||
FileClose $0
|
FileClose $0
|
||||||
CreateShortCut "$SMPROGRAMS\smartmontools\smartctl Examples\All info (-a).lnk" "$INSTDIR\bin\smartctl-run.bat" "-a sda"
|
!insertmacro CreateAdminShortCut "$SMPROGRAMS\smartmontools\smartctl Examples\All info (-a).lnk" "$INSTDIR\bin\runcmdu.exe" "smartctl -a sda"
|
||||||
CreateShortCut "$SMPROGRAMS\smartmontools\smartctl Examples\Identify drive (-i).lnk" "$INSTDIR\bin\smartctl-run.bat" "-i sda"
|
!insertmacro CreateAdminShortCut "$SMPROGRAMS\smartmontools\smartctl Examples\Identify drive (-i).lnk" "$INSTDIR\bin\runcmdu.exe" "smartctl -i sda"
|
||||||
CreateShortCut "$SMPROGRAMS\smartmontools\smartctl Examples\SMART attributes (-A).lnk" "$INSTDIR\bin\smartctl-run.bat" "-A sda"
|
!insertmacro CreateAdminShortCut "$SMPROGRAMS\smartmontools\smartctl Examples\SMART attributes (-A).lnk" "$INSTDIR\bin\runcmdu.exe" "smartctl -A sda"
|
||||||
CreateShortCut "$SMPROGRAMS\smartmontools\smartctl Examples\SMART capabilities (-c).lnk" "$INSTDIR\bin\smartctl-run.bat" "-c sda"
|
!insertmacro CreateAdminShortCut "$SMPROGRAMS\smartmontools\smartctl Examples\SMART capabilities (-c).lnk" "$INSTDIR\bin\runcmdu.exe" "smartctl -c sda"
|
||||||
CreateShortCut "$SMPROGRAMS\smartmontools\smartctl Examples\SMART health status (-H).lnk" "$INSTDIR\bin\smartctl-run.bat" "-H sda"
|
!insertmacro CreateAdminShortCut "$SMPROGRAMS\smartmontools\smartctl Examples\SMART health status (-H).lnk" "$INSTDIR\bin\runcmdu.exe" "smartctl -H sda"
|
||||||
CreateShortCut "$SMPROGRAMS\smartmontools\smartctl Examples\SMART error log (-l error).lnk" "$INSTDIR\bin\smartctl-run.bat" "-l error sda"
|
!insertmacro CreateAdminShortCut "$SMPROGRAMS\smartmontools\smartctl Examples\SMART error log (-l error).lnk" "$INSTDIR\bin\runcmdu.exe" "smartctl -l error sda"
|
||||||
CreateShortCut "$SMPROGRAMS\smartmontools\smartctl Examples\SMART selftest log (-l selftest).lnk" "$INSTDIR\bin\smartctl-run.bat" "-l selftest sda"
|
!insertmacro CreateAdminShortCut "$SMPROGRAMS\smartmontools\smartctl Examples\SMART selftest log (-l selftest).lnk" "$INSTDIR\bin\runcmdu.exe" "smartctl -l selftest sda"
|
||||||
CreateShortCut "$SMPROGRAMS\smartmontools\smartctl Examples\Start long selftest (-t long).lnk" "$INSTDIR\bin\smartctl-run.bat" "-t long sda"
|
!insertmacro CreateAdminShortCut "$SMPROGRAMS\smartmontools\smartctl Examples\Start long selftest (-t long).lnk" "$INSTDIR\bin\runcmdu.exe" "smartctl -t long sda"
|
||||||
CreateShortCut "$SMPROGRAMS\smartmontools\smartctl Examples\Start offline test (-t offline).lnk" "$INSTDIR\bin\smartctl-run.bat" "-t offline sda"
|
!insertmacro CreateAdminShortCut "$SMPROGRAMS\smartmontools\smartctl Examples\Start offline test (-t offline).lnk" "$INSTDIR\bin\runcmdu.exe" "smartctl -t offline sda"
|
||||||
CreateShortCut "$SMPROGRAMS\smartmontools\smartctl Examples\Start short selftest (-t short).lnk" "$INSTDIR\bin\smartctl-run.bat" "-t short sda"
|
!insertmacro CreateAdminShortCut "$SMPROGRAMS\smartmontools\smartctl Examples\Start short selftest (-t short).lnk" "$INSTDIR\bin\runcmdu.exe" "smartctl -t short sda"
|
||||||
CreateShortCut "$SMPROGRAMS\smartmontools\smartctl Examples\Stop(Abort) selftest (-X).lnk" "$INSTDIR\bin\smartctl-run.bat" "-X sda"
|
!insertmacro CreateAdminShortCut "$SMPROGRAMS\smartmontools\smartctl Examples\Stop(Abort) selftest (-X).lnk" "$INSTDIR\bin\runcmdu.exe" "smartctl -X sda"
|
||||||
CreateShortCut "$SMPROGRAMS\smartmontools\smartctl Examples\Turn SMART off (-s off).lnk" "$INSTDIR\bin\smartctl-run.bat" "-s off sda"
|
!insertmacro CreateAdminShortCut "$SMPROGRAMS\smartmontools\smartctl Examples\Turn SMART off (-s off).lnk" "$INSTDIR\bin\runcmdu.exe" "smartctl -s off sda"
|
||||||
CreateShortCut "$SMPROGRAMS\smartmontools\smartctl Examples\Turn SMART on (-s on).lnk" "$INSTDIR\bin\smartctl-run.bat" "-s on sda"
|
!insertmacro CreateAdminShortCut "$SMPROGRAMS\smartmontools\smartctl Examples\Turn SMART on (-s on).lnk" "$INSTDIR\bin\runcmdu.exe" "smartctl -s on sda"
|
||||||
noctl:
|
noctl:
|
||||||
|
|
||||||
; smartd
|
; smartd
|
||||||
IfFileExists "$INSTDIR\bin\smartd.exe" 0 nod
|
IfFileExists "$INSTDIR\bin\smartd.exe" 0 nod
|
||||||
SetOutPath "$INSTDIR\bin"
|
SetOutPath "$INSTDIR\bin"
|
||||||
DetailPrint "Create file: $INSTDIR\bin\smartd-run.bat"
|
|
||||||
FileOpen $0 "$INSTDIR\bin\smartd-run.bat" "w"
|
|
||||||
FileWrite $0 '@echo off$\r$\necho smartd %1 %2 %3 %4 %5$\r$\n"$INSTDIR\bin\smartd" %1 %2 %3 %4 %5$\r$\npause$\r$\n'
|
|
||||||
FileClose $0
|
|
||||||
CreateDirectory "$SMPROGRAMS\smartmontools\smartd Examples"
|
CreateDirectory "$SMPROGRAMS\smartmontools\smartd Examples"
|
||||||
CreateShortCut "$SMPROGRAMS\smartmontools\smartd Examples\Daemon start, smartd.log.lnk" "$INSTDIR\bin\smartd-run.bat" "-l local0"
|
!insertmacro CreateAdminShortCut "$SMPROGRAMS\smartmontools\smartd Examples\Daemon start, smartd.log.lnk" "$INSTDIR\bin\runcmdu.exe" "smartd -l local0"
|
||||||
IfFileExists "$WINDIR\system32\cmd.exe" 0 +2
|
!insertmacro CreateAdminShortCut "$SMPROGRAMS\smartmontools\smartd Examples\Daemon start, eventlog.lnk" "$INSTDIR\bin\runcmdu.exe" "smartd"
|
||||||
CreateShortCut "$SMPROGRAMS\smartmontools\smartd Examples\Daemon start, eventlog.lnk" "$INSTDIR\bin\smartd-run.bat" ""
|
!insertmacro CreateAdminShortCut "$SMPROGRAMS\smartmontools\smartd Examples\Daemon stop.lnk" "$INSTDIR\bin\runcmdu.exe" "smartd stop"
|
||||||
CreateShortCut "$SMPROGRAMS\smartmontools\smartd Examples\Daemon stop.lnk" "$INSTDIR\bin\smartd-run.bat" "stop"
|
!insertmacro CreateAdminShortCut "$SMPROGRAMS\smartmontools\smartd Examples\Do all tests once (-q onecheck).lnk" "$INSTDIR\bin\runcmdu.exe" "smartd -q onecheck"
|
||||||
CreateShortCut "$SMPROGRAMS\smartmontools\smartd Examples\Do all tests once (-q onecheck).lnk" "$INSTDIR\bin\smartd-run.bat" "-q onecheck"
|
!insertmacro CreateAdminShortCut "$SMPROGRAMS\smartmontools\smartd Examples\Debug mode (-d).lnk" "$INSTDIR\bin\runcmdu.exe" "smartd -d"
|
||||||
CreateShortCut "$SMPROGRAMS\smartmontools\smartd Examples\Debug mode (-d).lnk" "$INSTDIR\bin\smartd-run.bat" "-d"
|
!insertmacro CreateAdminShortCut "$SMPROGRAMS\smartmontools\smartd Examples\smartd.conf (edit).lnk" "$EDITOR" "$INSTDIR\bin\smartd.conf"
|
||||||
IfFileExists "$WINDIR\notepad.exe" 0 nopad
|
CreateShortCut "$SMPROGRAMS\smartmontools\smartd Examples\smartd.conf (view).lnk" "$EDITOR" "$INSTDIR\bin\smartd.conf"
|
||||||
CreateShortCut "$SMPROGRAMS\smartmontools\smartd Examples\Edit smartd.conf.lnk" "$WINDIR\notepad.exe" "$INSTDIR\bin\smartd.conf"
|
CreateShortCut "$SMPROGRAMS\smartmontools\smartd Examples\smartd.log (view).lnk" "$EDITOR" "$INSTDIR\bin\smartd.log"
|
||||||
CreateShortCut "$SMPROGRAMS\smartmontools\smartd Examples\View smartd.log.lnk" "$WINDIR\notepad.exe" "$INSTDIR\bin\smartd.log"
|
|
||||||
nopad:
|
|
||||||
|
|
||||||
; smartd service (not on 9x/ME)
|
; smartd service (not on 9x/ME)
|
||||||
IfFileExists "$WINDIR\system32\cmd.exe" 0 nosvc
|
IfFileExists "$WINDIR\system32\cmd.exe" 0 nosvc
|
||||||
CreateShortCut "$SMPROGRAMS\smartmontools\smartd Examples\Service install, eventlog, 30min.lnk" "$INSTDIR\bin\smartd-run.bat" "install"
|
!insertmacro CreateAdminShortCut "$SMPROGRAMS\smartmontools\smartd Examples\Service install, eventlog, 30min.lnk" "$INSTDIR\bin\runcmdu.exe" "smartd install"
|
||||||
CreateShortCut "$SMPROGRAMS\smartmontools\smartd Examples\Service install, smartd.log, 10min.lnk" "$INSTDIR\bin\smartd-run.bat" "install -l local0 -i 600"
|
!insertmacro CreateAdminShortCut "$SMPROGRAMS\smartmontools\smartd Examples\Service install, smartd.log, 10min.lnk" "$INSTDIR\bin\runcmdu.exe" "smartd install -l local0 -i 600"
|
||||||
CreateShortCut "$SMPROGRAMS\smartmontools\smartd Examples\Service install, smartd.log, 30min.lnk" "$INSTDIR\bin\smartd-run.bat" "install -l local0"
|
!insertmacro CreateAdminShortCut "$SMPROGRAMS\smartmontools\smartd Examples\Service install, smartd.log, 30min.lnk" "$INSTDIR\bin\runcmdu.exe" "smartd install -l local0"
|
||||||
CreateShortCut "$SMPROGRAMS\smartmontools\smartd Examples\Service remove.lnk" "$INSTDIR\bin\smartd-run.bat" "remove"
|
!insertmacro CreateAdminShortCut "$SMPROGRAMS\smartmontools\smartd Examples\Service remove.lnk" "$INSTDIR\bin\runcmdu.exe" "smartd remove"
|
||||||
DetailPrint "Create file: $INSTDIR\bin\net-run.bat"
|
!insertmacro CreateAdminShortCut "$SMPROGRAMS\smartmontools\smartd Examples\Service start.lnk" "$INSTDIR\bin\runcmdu.exe" "net start smartd"
|
||||||
FileOpen $0 "$INSTDIR\bin\net-run.bat" "w"
|
!insertmacro CreateAdminShortCut "$SMPROGRAMS\smartmontools\smartd Examples\Service stop.lnk" "$INSTDIR\bin\runcmdu.exe" "net stop smartd"
|
||||||
FileWrite $0 "@echo off$\r$\necho net %1 %2 %3 %4 %5$\r$\nnet %1 %2 %3 %4 %5$\r$\npause$\r$\n"
|
|
||||||
FileClose $0
|
|
||||||
CreateShortCut "$SMPROGRAMS\smartmontools\smartd Examples\Service start.lnk" "$INSTDIR\bin\net-run.bat" "start smartd"
|
|
||||||
CreateShortCut "$SMPROGRAMS\smartmontools\smartd Examples\Service stop.lnk" "$INSTDIR\bin\net-run.bat" "stop smartd"
|
|
||||||
nosvc:
|
nosvc:
|
||||||
nod:
|
nod:
|
||||||
|
|
||||||
@ -270,11 +273,11 @@ Section "Start Menu Shortcuts" MENU_SECTION
|
|||||||
CreateShortCut "$SMPROGRAMS\smartmontools\Documentation\smartctl manual page (txt).lnk" "$INSTDIR\doc\smartctl.8.txt"
|
CreateShortCut "$SMPROGRAMS\smartmontools\Documentation\smartctl manual page (txt).lnk" "$INSTDIR\doc\smartctl.8.txt"
|
||||||
CreateShortCut "$SMPROGRAMS\smartmontools\Documentation\smartd manual page (txt).lnk" "$INSTDIR\doc\smartd.8.txt"
|
CreateShortCut "$SMPROGRAMS\smartmontools\Documentation\smartd manual page (txt).lnk" "$INSTDIR\doc\smartd.8.txt"
|
||||||
CreateShortCut "$SMPROGRAMS\smartmontools\Documentation\smartd.conf manual page (txt).lnk" "$INSTDIR\doc\smartd.conf.5.txt"
|
CreateShortCut "$SMPROGRAMS\smartmontools\Documentation\smartd.conf manual page (txt).lnk" "$INSTDIR\doc\smartd.conf.5.txt"
|
||||||
IfFileExists "$WINDIR\notepad.exe" 0 +5
|
CreateShortCut "$SMPROGRAMS\smartmontools\Documentation\smartd.conf sample.lnk" "$EDITOR" "$INSTDIR\doc\smartd.conf"
|
||||||
CreateShortCut "$SMPROGRAMS\smartmontools\Documentation\smartd.conf sample.lnk" "$WINDIR\notepad.exe" "$INSTDIR\doc\smartd.conf"
|
IfFileExists "$INSTDIR\bin\drivedb.h" 0 nodb
|
||||||
IfFileExists "$INSTDIR\bin\drivedb.h" 0 +3
|
CreateShortCut "$SMPROGRAMS\smartmontools\Documentation\drivedb.h (view).lnk" "$EDITOR" "$INSTDIR\bin\drivedb.h"
|
||||||
CreateShortCut "$SMPROGRAMS\smartmontools\Documentation\drivedb.h (view).lnk" "$WINDIR\notepad.exe" "$INSTDIR\bin\drivedb.h"
|
!insertmacro CreateAdminShortCut "$SMPROGRAMS\smartmontools\Documentation\drivedb-add.h (create, edit).lnk" "$EDITOR" "$INSTDIR\bin\drivedb-add.h"
|
||||||
CreateShortCut "$SMPROGRAMS\smartmontools\Documentation\drivedb-add.h (create, edit).lnk" "$WINDIR\notepad.exe" "$INSTDIR\bin\drivedb-add.h"
|
nodb:
|
||||||
CreateShortCut "$SMPROGRAMS\smartmontools\Documentation\AUTHORS.lnk" "$INSTDIR\doc\AUTHORS.txt"
|
CreateShortCut "$SMPROGRAMS\smartmontools\Documentation\AUTHORS.lnk" "$INSTDIR\doc\AUTHORS.txt"
|
||||||
CreateShortCut "$SMPROGRAMS\smartmontools\Documentation\CHANGELOG.lnk" "$INSTDIR\doc\CHANGELOG.txt"
|
CreateShortCut "$SMPROGRAMS\smartmontools\Documentation\CHANGELOG.lnk" "$INSTDIR\doc\CHANGELOG.txt"
|
||||||
CreateShortCut "$SMPROGRAMS\smartmontools\Documentation\COPYING.lnk" "$INSTDIR\doc\COPYING.txt"
|
CreateShortCut "$SMPROGRAMS\smartmontools\Documentation\COPYING.lnk" "$INSTDIR\doc\COPYING.txt"
|
||||||
@ -290,12 +293,16 @@ Section "Start Menu Shortcuts" MENU_SECTION
|
|||||||
CreateShortCut "$SMPROGRAMS\smartmontools\smartmontools Home Page.lnk" "http://smartmontools.sourceforge.net/"
|
CreateShortCut "$SMPROGRAMS\smartmontools\smartmontools Home Page.lnk" "http://smartmontools.sourceforge.net/"
|
||||||
|
|
||||||
; drivedb.h update
|
; drivedb.h update
|
||||||
IfFileExists "$INSTDIR\bin\update-smart-drivedb.exe" 0 +2
|
IfFileExists "$INSTDIR\bin\update-smart-drivedb.exe" 0 noupdb
|
||||||
CreateShortCut "$SMPROGRAMS\smartmontools\drivedb.h update.lnk" "$INSTDIR\bin\update-smart-drivedb.exe"
|
SetOutPath "$INSTDIR\bin"
|
||||||
|
!insertmacro CreateAdminShortCut "$SMPROGRAMS\smartmontools\drivedb.h update.lnk" "$INSTDIR\bin\update-smart-drivedb.exe" ""
|
||||||
|
noupdb:
|
||||||
|
|
||||||
; Uninstall
|
; Uninstall
|
||||||
IfFileExists "$INSTDIR\uninst-smartmontools.exe" 0 +2
|
IfFileExists "$INSTDIR\uninst-smartmontools.exe" 0 noinst
|
||||||
CreateShortCut "$SMPROGRAMS\smartmontools\Uninstall smartmontools.lnk" "$INSTDIR\uninst-smartmontools.exe"
|
SetOutPath "$INSTDIR"
|
||||||
|
!insertmacro CreateAdminShortCut "$SMPROGRAMS\smartmontools\Uninstall smartmontools.lnk" "$INSTDIR\uninst-smartmontools.exe" ""
|
||||||
|
noinst:
|
||||||
|
|
||||||
SectionEnd
|
SectionEnd
|
||||||
|
|
||||||
@ -329,10 +336,10 @@ SectionGroup "Add smartctl to drive menu"
|
|||||||
!macro DriveSection id name args
|
!macro DriveSection id name args
|
||||||
Section 'smartctl ${args} ...' DRIVE_${id}_SECTION
|
Section 'smartctl ${args} ...' DRIVE_${id}_SECTION
|
||||||
SectionIn 3
|
SectionIn 3
|
||||||
Call CheckSmartctlBat
|
Call CheckRunCmdA
|
||||||
DetailPrint 'Add drive menu entry "${name}": smartctl ${args} ...'
|
DetailPrint 'Add drive menu entry "${name}": smartctl ${args} ...'
|
||||||
WriteRegStr HKCR "Drive\shell\smartctl${id}" "" "${name}"
|
WriteRegStr HKCR "Drive\shell\smartctl${id}" "" "${name}"
|
||||||
WriteRegStr HKCR "Drive\shell\smartctl${id}\command" "" '"$INSTDIR\bin\smartctl-run.bat" ${args} %L'
|
WriteRegStr HKCR "Drive\shell\smartctl${id}\command" "" '"$INSTDIR\bin\runcmda.exe" "$INSTDIR\bin\smartctl.exe" ${args} %L'
|
||||||
SectionEnd
|
SectionEnd
|
||||||
!macroend
|
!macroend
|
||||||
|
|
||||||
@ -372,14 +379,11 @@ Section "UBCD4Win Plugin" UBCD_SECTION
|
|||||||
FileWrite $0 '$\r$\n$\t<MENU ID="Diagnostic">$\r$\n$\t$\t<MITEM TYPE="ITEM" DISABLED="'
|
FileWrite $0 '$\r$\n$\t<MENU ID="Diagnostic">$\r$\n$\t$\t<MITEM TYPE="ITEM" DISABLED="'
|
||||||
FileWrite $0 '@Not(@FileExists(@GetProgramDrive()\Programs\smartmontools\smartctl.exe))" '
|
FileWrite $0 '@Not(@FileExists(@GetProgramDrive()\Programs\smartmontools\smartctl.exe))" '
|
||||||
FileWrite $0 'CMD="RUN" FUNC="cmd.exe /k cd /d @GetProgramDrive()\Programs\smartmontools&'
|
FileWrite $0 'CMD="RUN" FUNC="cmd.exe /k cd /d @GetProgramDrive()\Programs\smartmontools&'
|
||||||
FileWrite $0 'set PATH=@GetProgramDrive()\Programs\smartmontools;%PATH%&smartctl-run.bat ">'
|
FileWrite $0 'set PATH=@GetProgramDrive()\Programs\smartmontools;%PATH% ">'
|
||||||
FileWrite $0 'smartctl</MITEM>$\r$\n$\t</MENU>$\r$\n</NU2MENU>$\r$\n'
|
FileWrite $0 'smartctl</MITEM>$\r$\n$\t</MENU>$\r$\n</NU2MENU>$\r$\n'
|
||||||
FileClose $0
|
FileClose $0
|
||||||
|
|
||||||
SetOutPath "$UBCDDIR\files"
|
SetOutPath "$UBCDDIR\files"
|
||||||
DetailPrint "Create file: smartctl-run.bat"
|
|
||||||
Push "$UBCDDIR\files\smartctl-run.bat"
|
|
||||||
Call CreateSmartctlBat
|
|
||||||
File "${INPDIR}\bin\smartctl.exe"
|
File "${INPDIR}\bin\smartctl.exe"
|
||||||
File "${INPDIR}\bin\smartd.exe"
|
File "${INPDIR}\bin\smartd.exe"
|
||||||
File "${INPDIR}\doc\smartctl.8.html"
|
File "${INPDIR}\doc\smartctl.8.html"
|
||||||
@ -441,6 +445,10 @@ Section "Uninstall"
|
|||||||
Delete "$INSTDIR\bin\smartctl-run.bat"
|
Delete "$INSTDIR\bin\smartctl-run.bat"
|
||||||
Delete "$INSTDIR\bin\smartd-run.bat"
|
Delete "$INSTDIR\bin\smartd-run.bat"
|
||||||
Delete "$INSTDIR\bin\net-run.bat"
|
Delete "$INSTDIR\bin\net-run.bat"
|
||||||
|
Delete "$INSTDIR\bin\runcmda.exe"
|
||||||
|
Delete "$INSTDIR\bin\runcmda.exe.manifest"
|
||||||
|
Delete "$INSTDIR\bin\runcmdu.exe"
|
||||||
|
Delete "$INSTDIR\bin\runcmdu.exe.manifest"
|
||||||
Delete "$INSTDIR\doc\AUTHORS.txt"
|
Delete "$INSTDIR\doc\AUTHORS.txt"
|
||||||
Delete "$INSTDIR\doc\CHANGELOG.txt"
|
Delete "$INSTDIR\doc\CHANGELOG.txt"
|
||||||
Delete "$INSTDIR\doc\COPYING.txt"
|
Delete "$INSTDIR\doc\COPYING.txt"
|
||||||
@ -500,6 +508,11 @@ SectionEnd
|
|||||||
|
|
||||||
Function .onInit
|
Function .onInit
|
||||||
|
|
||||||
|
; Use Notepad++ if installed
|
||||||
|
StrCpy $EDITOR "$PROGRAMFILES\Notepad++\notepad++.exe"
|
||||||
|
IfFileExists "$EDITOR" +2 0
|
||||||
|
StrCpy $EDITOR "notepad.exe"
|
||||||
|
|
||||||
; Get UBCD4Win install location
|
; Get UBCD4Win install location
|
||||||
ReadRegStr $0 HKLM "Software\UBCD4Win" "InstallPath"
|
ReadRegStr $0 HKLM "Software\UBCD4Win" "InstallPath"
|
||||||
StrCmp $0 "" 0 +2
|
StrCmp $0 "" 0 +2
|
||||||
@ -598,40 +611,13 @@ done:
|
|||||||
FunctionEnd
|
FunctionEnd
|
||||||
|
|
||||||
|
|
||||||
; Create smartctl-run.bat
|
; Install runcmda.exe if missing
|
||||||
|
|
||||||
Function CreateSmartctlBat
|
Function CheckRunCmdA
|
||||||
Exch $0
|
IfFileExists "$INSTDIR\bin\runcmda.exe" done 0
|
||||||
FileOpen $0 $0 "w"
|
|
||||||
FileWrite $0 '@echo off$\r$\nif not "%1" == "" goto run$\r$\n'
|
|
||||||
FileWrite $0 'echo Examples (for first drive):$\r$\n'
|
|
||||||
FileWrite $0 'echo smartctl -i sda Show identify information$\r$\n'
|
|
||||||
FileWrite $0 'echo smartctl -H sda Show SMART health status$\r$\n'
|
|
||||||
FileWrite $0 'echo smartctl -c sda Show SMART capabilities$\r$\n'
|
|
||||||
FileWrite $0 'echo smartctl -A sda Show SMART attributes$\r$\n'
|
|
||||||
FileWrite $0 'echo smartctl -l error sda Show error log$\r$\n'
|
|
||||||
FileWrite $0 'echo smartctl -l selftest sda Show self-test log$\r$\n'
|
|
||||||
FileWrite $0 'echo smartctl -a sda Show all of the above$\r$\n'
|
|
||||||
FileWrite $0 'echo smartctl -t short sda Start short self test$\r$\n'
|
|
||||||
FileWrite $0 'echo smartctl -t long sda Start long self test$\r$\n'
|
|
||||||
FileWrite $0 'echo Use "sdb", "sdc", ... for second, third, ... drive.$\r$\n'
|
|
||||||
FileWrite $0 'echo See man page (smartctl.8.*) for further info.$\r$\n'
|
|
||||||
FileWrite $0 'goto end$\r$\n:run$\r$\n'
|
|
||||||
FileWrite $0 'echo smartctl %1 %2 %3 %4 %5$\r$\n'
|
|
||||||
FileWrite $0 '"$INSTDIR\bin\smartctl" %1 %2 %3 %4 %5$\r$\n'
|
|
||||||
FileWrite $0 'pause$\r$\n:end$\r$\n'
|
|
||||||
FileClose $0
|
|
||||||
Pop $0
|
|
||||||
FunctionEnd
|
|
||||||
|
|
||||||
; Create smartctl-run.bat if missing
|
|
||||||
|
|
||||||
Function CheckSmartctlBat
|
|
||||||
IfFileExists "$INSTDIR\bin\smartctl-run.bat" done 0
|
|
||||||
SetOutPath "$INSTDIR\bin"
|
SetOutPath "$INSTDIR\bin"
|
||||||
DetailPrint "Create file: $INSTDIR\bin\smartctl-run.bat"
|
File "${INPDIR}\bin\runcmda.exe"
|
||||||
Push "$INSTDIR\bin\smartctl-run.bat"
|
File "${INPDIR}\bin\runcmda.exe.manifest"
|
||||||
Call CreateSmartctlBat
|
|
||||||
done:
|
done:
|
||||||
FunctionEnd
|
FunctionEnd
|
||||||
|
|
||||||
@ -780,3 +766,58 @@ FunctionEnd
|
|||||||
!macroend
|
!macroend
|
||||||
!insertmacro StrStr ""
|
!insertmacro StrStr ""
|
||||||
!insertmacro StrStr "un."
|
!insertmacro StrStr "un."
|
||||||
|
|
||||||
|
|
||||||
|
;--------------------------------------------------------------------
|
||||||
|
; Set Run As Administrator flag in shortcut
|
||||||
|
;
|
||||||
|
; Slightly modified version from:
|
||||||
|
; http://nsis.sourceforge.net/IShellLink_Set_RunAs_flag
|
||||||
|
;
|
||||||
|
|
||||||
|
!include "LogicLib.nsh"
|
||||||
|
|
||||||
|
!define IPersistFile {0000010b-0000-0000-c000-000000000046}
|
||||||
|
!define CLSID_ShellLink {00021401-0000-0000-C000-000000000046}
|
||||||
|
!define IID_IShellLinkA {000214EE-0000-0000-C000-000000000046}
|
||||||
|
!define IID_IShellLinkW {000214F9-0000-0000-C000-000000000046}
|
||||||
|
!define IShellLinkDataList {45e2b4ae-b1c3-11d0-b92f-00a0c90312e1}
|
||||||
|
!ifdef NSIS_UNICODE
|
||||||
|
!define IID_IShellLink ${IID_IShellLinkW}
|
||||||
|
!else
|
||||||
|
!define IID_IShellLink ${IID_IShellLinkA}
|
||||||
|
!endif
|
||||||
|
|
||||||
|
Function ShellLinkSetRunAs
|
||||||
|
System::Store S ; push $0-$9, $R0-$R9
|
||||||
|
pop $9
|
||||||
|
; $0 = CoCreateInstance(CLSID_ShellLink, 0, CLSCTX_INPROC_SERVER, IID_IShellLink, &$1)
|
||||||
|
System::Call "ole32::CoCreateInstance(g'${CLSID_ShellLink}',i0,i1,g'${IID_IShellLink}',*i.r1)i.r0"
|
||||||
|
${If} $0 = 0
|
||||||
|
System::Call "$1->0(g'${IPersistFile}',*i.r2)i.r0" ; $0 = $1->QueryInterface(IPersistFile, &$2)
|
||||||
|
${If} $0 = 0
|
||||||
|
System::Call "$2->5(w '$9',i 0)i.r0" ; $0 = $2->Load($9, STGM_READ)
|
||||||
|
${If} $0 = 0
|
||||||
|
System::Call "$1->0(g'${IShellLinkDataList}',*i.r3)i.r0" ; $0 = $1->QueryInterface(IShellLinkDataList, &$3)
|
||||||
|
${If} $0 = 0
|
||||||
|
System::Call "$3->6(*i.r4)i.r0"; $0 = $3->GetFlags(&$4)
|
||||||
|
${If} $0 = 0
|
||||||
|
System::Call "$3->7(i $4|0x2000)i.r0" ; $0 = $3->SetFlags($4|SLDF_RUNAS_USER)
|
||||||
|
${If} $0 = 0
|
||||||
|
System::Call "$2->6(w '$9',i1)i.r0" ; $2->Save($9, TRUE)
|
||||||
|
${EndIf}
|
||||||
|
${EndIf}
|
||||||
|
System::Call "$3->2()" ; $3->Release()
|
||||||
|
${EndIf}
|
||||||
|
System::Call "$2->2()" ; $2->Release()
|
||||||
|
${EndIf}
|
||||||
|
${EndIf}
|
||||||
|
System::Call "$1->2()" ; $1->Release()
|
||||||
|
${EndIf}
|
||||||
|
${If} $0 <> 0
|
||||||
|
DetailPrint "Set RunAsAdmin: $9 failed ($0)"
|
||||||
|
${Else}
|
||||||
|
DetailPrint "Set RunAsAdmin: $9"
|
||||||
|
${EndIf}
|
||||||
|
System::Store L ; push $0-$9, $R0-$R9
|
||||||
|
FunctionEnd
|
||||||
|
83
os_win32/runcmd.c
Normal file
83
os_win32/runcmd.c
Normal file
@ -0,0 +1,83 @@
|
|||||||
|
/*
|
||||||
|
* Run console command and wait for user input
|
||||||
|
*
|
||||||
|
* Home page of code is: http://smartmontools.sourceforge.net
|
||||||
|
*
|
||||||
|
* Copyright (C) 2011 Christian Franke <smartmontools-support@lists.sourceforge.net>
|
||||||
|
*
|
||||||
|
* 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 Software Foundation; either version 2, or (at your option)
|
||||||
|
* any later version.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* (for example COPYING); If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
char svnid[] = "$Id: runcmd.c 3453 2011-10-16 12:45:27Z chrfranke $";
|
||||||
|
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <windows.h>
|
||||||
|
|
||||||
|
int main(int argc, char **argv)
|
||||||
|
{
|
||||||
|
char * cmd = GetCommandLineA();
|
||||||
|
DWORD exitcode;
|
||||||
|
STARTUPINFOA si = { sizeof(si), };
|
||||||
|
PROCESS_INFORMATION pi;
|
||||||
|
int key;
|
||||||
|
|
||||||
|
if (*cmd == '"') {
|
||||||
|
cmd++;
|
||||||
|
while (*cmd && !(*cmd == '"' && cmd[-1] != '\\'))
|
||||||
|
cmd++;
|
||||||
|
if (*cmd)
|
||||||
|
cmd++;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
while (*cmd && !(*cmd == ' ' || *cmd == '\t'))
|
||||||
|
cmd++;
|
||||||
|
}
|
||||||
|
|
||||||
|
while (*cmd == ' ' || *cmd == '\t')
|
||||||
|
cmd++;
|
||||||
|
|
||||||
|
if (*cmd) {
|
||||||
|
printf("%s\n\n", cmd); fflush(stdout);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!*cmd) {
|
||||||
|
printf("Usage: %s COMMAND [ARG ...]\n", argv[0]);
|
||||||
|
exitcode = 1;
|
||||||
|
}
|
||||||
|
else if (!CreateProcessA((char *)0, cmd,
|
||||||
|
(SECURITY_ATTRIBUTES *)0, (SECURITY_ATTRIBUTES *)0,
|
||||||
|
TRUE/*inherit*/, 0/*no flags*/, (void *)0, (char *)0, &si, &pi)
|
||||||
|
) {
|
||||||
|
DWORD err = GetLastError();
|
||||||
|
if (err == ERROR_FILE_NOT_FOUND)
|
||||||
|
printf("Command not found\n");
|
||||||
|
else
|
||||||
|
printf("CreateProcess() failed with error=%u\n", err);
|
||||||
|
exitcode = 1;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
CloseHandle(pi.hThread);
|
||||||
|
|
||||||
|
exitcode = 42;
|
||||||
|
WaitForSingleObject(pi.hProcess, INFINITE);
|
||||||
|
GetExitCodeProcess(pi.hProcess, &exitcode);
|
||||||
|
CloseHandle(pi.hProcess);
|
||||||
|
|
||||||
|
if (exitcode)
|
||||||
|
printf("\nExitcode: %u (0x%02x)", exitcode, exitcode);
|
||||||
|
}
|
||||||
|
|
||||||
|
printf("\nType <return> to exit: "); fflush(stdout);
|
||||||
|
while (!((key = getc(stdin)) == EOF || key == '\n' || key == '\r'))
|
||||||
|
;
|
||||||
|
printf("\n");
|
||||||
|
|
||||||
|
return exitcode;
|
||||||
|
}
|
85
os_win32/runcmd_vc10.vcxproj
Normal file
85
os_win32/runcmd_vc10.vcxproj
Normal file
@ -0,0 +1,85 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||||
|
<ItemGroup Label="ProjectConfigurations">
|
||||||
|
<ProjectConfiguration Include="Debug|Win32">
|
||||||
|
<Configuration>Debug</Configuration>
|
||||||
|
<Platform>Win32</Platform>
|
||||||
|
</ProjectConfiguration>
|
||||||
|
<ProjectConfiguration Include="Release|Win32">
|
||||||
|
<Configuration>Release</Configuration>
|
||||||
|
<Platform>Win32</Platform>
|
||||||
|
</ProjectConfiguration>
|
||||||
|
</ItemGroup>
|
||||||
|
<PropertyGroup Label="Globals">
|
||||||
|
<ProjectGuid>{11A4B619-D97B-499F-AF17-CF9F80BF70E8}</ProjectGuid>
|
||||||
|
<Keyword>Win32Proj</Keyword>
|
||||||
|
<RootNamespace>runcmd</RootNamespace>
|
||||||
|
<ProjectName>runcmd</ProjectName>
|
||||||
|
</PropertyGroup>
|
||||||
|
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
|
||||||
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
|
||||||
|
<ConfigurationType>Application</ConfigurationType>
|
||||||
|
<UseDebugLibraries>true</UseDebugLibraries>
|
||||||
|
<CharacterSet>MultiByte</CharacterSet>
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
|
||||||
|
<ConfigurationType>Application</ConfigurationType>
|
||||||
|
<UseDebugLibraries>false</UseDebugLibraries>
|
||||||
|
<WholeProgramOptimization>true</WholeProgramOptimization>
|
||||||
|
<CharacterSet>MultiByte</CharacterSet>
|
||||||
|
</PropertyGroup>
|
||||||
|
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
|
||||||
|
<ImportGroup Label="ExtensionSettings">
|
||||||
|
</ImportGroup>
|
||||||
|
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
|
||||||
|
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
||||||
|
</ImportGroup>
|
||||||
|
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
|
||||||
|
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
||||||
|
</ImportGroup>
|
||||||
|
<PropertyGroup Label="UserMacros" />
|
||||||
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
|
||||||
|
<LinkIncremental>true</LinkIncremental>
|
||||||
|
<OutDir>.\runcmdu_vc10.d\</OutDir>
|
||||||
|
<IntDir>.\runcmdu_vc10.d\</IntDir>
|
||||||
|
<TargetName>$(ProjectName)u</TargetName>
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
|
||||||
|
<LinkIncremental>false</LinkIncremental>
|
||||||
|
<OutDir>.\runcmdu_vc10.r\</OutDir>
|
||||||
|
<IntDir>.\runcmdu_vc10.r\</IntDir>
|
||||||
|
<TargetName>$(ProjectName)u</TargetName>
|
||||||
|
</PropertyGroup>
|
||||||
|
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
|
||||||
|
<ClCompile>
|
||||||
|
<WarningLevel>Level3</WarningLevel>
|
||||||
|
<Optimization>Disabled</Optimization>
|
||||||
|
<PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||||
|
</ClCompile>
|
||||||
|
<Link>
|
||||||
|
<SubSystem>Console</SubSystem>
|
||||||
|
<GenerateDebugInformation>true</GenerateDebugInformation>
|
||||||
|
</Link>
|
||||||
|
</ItemDefinitionGroup>
|
||||||
|
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
|
||||||
|
<ClCompile>
|
||||||
|
<WarningLevel>Level3</WarningLevel>
|
||||||
|
<Optimization>MaxSpeed</Optimization>
|
||||||
|
<FunctionLevelLinking>true</FunctionLevelLinking>
|
||||||
|
<IntrinsicFunctions>true</IntrinsicFunctions>
|
||||||
|
<PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||||
|
</ClCompile>
|
||||||
|
<Link>
|
||||||
|
<SubSystem>Console</SubSystem>
|
||||||
|
<GenerateDebugInformation>true</GenerateDebugInformation>
|
||||||
|
<EnableCOMDATFolding>true</EnableCOMDATFolding>
|
||||||
|
<OptimizeReferences>true</OptimizeReferences>
|
||||||
|
</Link>
|
||||||
|
</ItemDefinitionGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<ClCompile Include="runcmd.c" />
|
||||||
|
</ItemGroup>
|
||||||
|
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
|
||||||
|
<ImportGroup Label="ExtensionTargets">
|
||||||
|
</ImportGroup>
|
||||||
|
</Project>
|
18
os_win32/runcmda.exe.manifest
Normal file
18
os_win32/runcmda.exe.manifest
Normal file
@ -0,0 +1,18 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
|
||||||
|
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
|
||||||
|
<assemblyIdentity
|
||||||
|
version="1.0.0.0"
|
||||||
|
name="runcmda.exe"
|
||||||
|
type="win32"
|
||||||
|
/>
|
||||||
|
<trustInfo xmlns="urn:schemas-microsoft-com:asm.v3">
|
||||||
|
<security>
|
||||||
|
<requestedPrivileges>
|
||||||
|
<requestedExecutionLevel
|
||||||
|
level="requireAdministrator"
|
||||||
|
uiAccess="false"
|
||||||
|
/>
|
||||||
|
</requestedPrivileges>
|
||||||
|
</security>
|
||||||
|
</trustInfo>
|
||||||
|
</assembly>
|
18
os_win32/runcmdu.exe.manifest
Normal file
18
os_win32/runcmdu.exe.manifest
Normal file
@ -0,0 +1,18 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
|
||||||
|
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
|
||||||
|
<assemblyIdentity
|
||||||
|
version="1.0.0.0"
|
||||||
|
name="runcmdu.exe"
|
||||||
|
type="win32"
|
||||||
|
/>
|
||||||
|
<trustInfo xmlns="urn:schemas-microsoft-com:asm.v3">
|
||||||
|
<security>
|
||||||
|
<requestedPrivileges>
|
||||||
|
<requestedExecutionLevel
|
||||||
|
level="asInvoker"
|
||||||
|
uiAccess="false"
|
||||||
|
/>
|
||||||
|
</requestedPrivileges>
|
||||||
|
</security>
|
||||||
|
</trustInfo>
|
||||||
|
</assembly>
|
304
os_win32/smartctl_vc10.vcxproj
Normal file
304
os_win32/smartctl_vc10.vcxproj
Normal file
@ -0,0 +1,304 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||||
|
<ItemGroup Label="ProjectConfigurations">
|
||||||
|
<ProjectConfiguration Include="Debug|Win32">
|
||||||
|
<Configuration>Debug</Configuration>
|
||||||
|
<Platform>Win32</Platform>
|
||||||
|
</ProjectConfiguration>
|
||||||
|
<ProjectConfiguration Include="Release|Win32">
|
||||||
|
<Configuration>Release</Configuration>
|
||||||
|
<Platform>Win32</Platform>
|
||||||
|
</ProjectConfiguration>
|
||||||
|
</ItemGroup>
|
||||||
|
<PropertyGroup Label="Globals">
|
||||||
|
<ProjectGuid>{3AFEDCDD-D289-4543-A91D-EFBA6C710247}</ProjectGuid>
|
||||||
|
<RootNamespace>smartctl</RootNamespace>
|
||||||
|
<Keyword>Win32Proj</Keyword>
|
||||||
|
<ProjectName>smartctl</ProjectName>
|
||||||
|
</PropertyGroup>
|
||||||
|
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
|
||||||
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
|
||||||
|
<ConfigurationType>Application</ConfigurationType>
|
||||||
|
<CharacterSet>MultiByte</CharacterSet>
|
||||||
|
<WholeProgramOptimization>true</WholeProgramOptimization>
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
|
||||||
|
<ConfigurationType>Application</ConfigurationType>
|
||||||
|
<CharacterSet>MultiByte</CharacterSet>
|
||||||
|
</PropertyGroup>
|
||||||
|
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
|
||||||
|
<ImportGroup Label="ExtensionSettings">
|
||||||
|
</ImportGroup>
|
||||||
|
<ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="PropertySheets">
|
||||||
|
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
||||||
|
</ImportGroup>
|
||||||
|
<ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="PropertySheets">
|
||||||
|
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
||||||
|
</ImportGroup>
|
||||||
|
<PropertyGroup Label="UserMacros" />
|
||||||
|
<PropertyGroup>
|
||||||
|
<_ProjectFileVersion>10.0.30319.1</_ProjectFileVersion>
|
||||||
|
<OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">.\smartctl_vc10.d\</OutDir>
|
||||||
|
<IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">.\smartctl_vc10.d\</IntDir>
|
||||||
|
<LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</LinkIncremental>
|
||||||
|
<OutDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">.\</OutDir>
|
||||||
|
<IntDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">.\smartctl_vc10.r\</IntDir>
|
||||||
|
<LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">false</LinkIncremental>
|
||||||
|
</PropertyGroup>
|
||||||
|
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
|
||||||
|
<ClCompile>
|
||||||
|
<Optimization>Disabled</Optimization>
|
||||||
|
<AdditionalIncludeDirectories>.;..\getopt;..\regex;$(IntDir);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
||||||
|
<PreprocessorDefinitions>_DEBUG;HAVE_CONFIG_H;_USE_32BIT_TIME_T;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||||
|
<MinimalRebuild>true</MinimalRebuild>
|
||||||
|
<BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
|
||||||
|
<RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
|
||||||
|
<PrecompiledHeader>
|
||||||
|
</PrecompiledHeader>
|
||||||
|
<WarningLevel>Level3</WarningLevel>
|
||||||
|
<DebugInformationFormat>EditAndContinue</DebugInformationFormat>
|
||||||
|
<DisableSpecificWarnings>4250</DisableSpecificWarnings>
|
||||||
|
</ClCompile>
|
||||||
|
<Link>
|
||||||
|
<GenerateDebugInformation>true</GenerateDebugInformation>
|
||||||
|
<SubSystem>Console</SubSystem>
|
||||||
|
<TargetMachine>MachineX86</TargetMachine>
|
||||||
|
</Link>
|
||||||
|
</ItemDefinitionGroup>
|
||||||
|
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
|
||||||
|
<ClCompile>
|
||||||
|
<AdditionalIncludeDirectories>.;..\getopt;..\regex;$(IntDir);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
||||||
|
<PreprocessorDefinitions>NDEBUG;HAVE_CONFIG_H;_USE_32BIT_TIME_T;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||||
|
<RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>
|
||||||
|
<PrecompiledHeader>
|
||||||
|
</PrecompiledHeader>
|
||||||
|
<WarningLevel>Level3</WarningLevel>
|
||||||
|
<DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
|
||||||
|
<DisableSpecificWarnings>4250</DisableSpecificWarnings>
|
||||||
|
</ClCompile>
|
||||||
|
<Link>
|
||||||
|
<GenerateDebugInformation>true</GenerateDebugInformation>
|
||||||
|
<ProgramDatabaseFile>$(IntDir)$(TargetName).pdb</ProgramDatabaseFile>
|
||||||
|
<SubSystem>Console</SubSystem>
|
||||||
|
<OptimizeReferences>true</OptimizeReferences>
|
||||||
|
<EnableCOMDATFolding>true</EnableCOMDATFolding>
|
||||||
|
<TargetMachine>MachineX86</TargetMachine>
|
||||||
|
</Link>
|
||||||
|
</ItemDefinitionGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<ClCompile Include="daemon_win32.cpp">
|
||||||
|
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</ExcludedFromBuild>
|
||||||
|
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">true</ExcludedFromBuild>
|
||||||
|
</ClCompile>
|
||||||
|
<ClCompile Include="hostname_win32.cpp">
|
||||||
|
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</ExcludedFromBuild>
|
||||||
|
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">true</ExcludedFromBuild>
|
||||||
|
</ClCompile>
|
||||||
|
<ClCompile Include="syslog_win32.cpp">
|
||||||
|
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</ExcludedFromBuild>
|
||||||
|
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">true</ExcludedFromBuild>
|
||||||
|
</ClCompile>
|
||||||
|
<ClCompile Include="wmiquery.cpp" />
|
||||||
|
<ClCompile Include="..\regex\regcomp.c">
|
||||||
|
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</ExcludedFromBuild>
|
||||||
|
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">true</ExcludedFromBuild>
|
||||||
|
</ClCompile>
|
||||||
|
<ClCompile Include="..\regex\regex.c" />
|
||||||
|
<ClCompile Include="..\regex\regex_internal.c">
|
||||||
|
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</ExcludedFromBuild>
|
||||||
|
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">true</ExcludedFromBuild>
|
||||||
|
</ClCompile>
|
||||||
|
<ClCompile Include="..\regex\regexec.c">
|
||||||
|
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</ExcludedFromBuild>
|
||||||
|
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">true</ExcludedFromBuild>
|
||||||
|
</ClCompile>
|
||||||
|
<ClCompile Include="..\getopt\getopt.c" />
|
||||||
|
<ClCompile Include="..\getopt\getopt1.c" />
|
||||||
|
<ClCompile Include="..\atacmdnames.cpp" />
|
||||||
|
<ClCompile Include="..\atacmds.cpp" />
|
||||||
|
<ClCompile Include="..\ataprint.cpp" />
|
||||||
|
<ClCompile Include="..\cciss.cpp">
|
||||||
|
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</ExcludedFromBuild>
|
||||||
|
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">true</ExcludedFromBuild>
|
||||||
|
</ClCompile>
|
||||||
|
<ClCompile Include="..\dev_ata_cmd_set.cpp" />
|
||||||
|
<ClCompile Include="..\dev_interface.cpp" />
|
||||||
|
<ClCompile Include="..\dev_legacy.cpp">
|
||||||
|
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</ExcludedFromBuild>
|
||||||
|
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">true</ExcludedFromBuild>
|
||||||
|
</ClCompile>
|
||||||
|
<ClCompile Include="..\knowndrives.cpp" />
|
||||||
|
<ClCompile Include="..\os_darwin.cpp">
|
||||||
|
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</ExcludedFromBuild>
|
||||||
|
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">true</ExcludedFromBuild>
|
||||||
|
</ClCompile>
|
||||||
|
<ClCompile Include="..\os_freebsd.cpp">
|
||||||
|
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</ExcludedFromBuild>
|
||||||
|
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">true</ExcludedFromBuild>
|
||||||
|
</ClCompile>
|
||||||
|
<ClCompile Include="..\os_generic.cpp">
|
||||||
|
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</ExcludedFromBuild>
|
||||||
|
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">true</ExcludedFromBuild>
|
||||||
|
</ClCompile>
|
||||||
|
<ClCompile Include="..\os_linux.cpp">
|
||||||
|
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</ExcludedFromBuild>
|
||||||
|
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">true</ExcludedFromBuild>
|
||||||
|
</ClCompile>
|
||||||
|
<ClCompile Include="..\os_netbsd.cpp">
|
||||||
|
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</ExcludedFromBuild>
|
||||||
|
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">true</ExcludedFromBuild>
|
||||||
|
</ClCompile>
|
||||||
|
<ClCompile Include="..\os_openbsd.cpp">
|
||||||
|
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</ExcludedFromBuild>
|
||||||
|
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">true</ExcludedFromBuild>
|
||||||
|
</ClCompile>
|
||||||
|
<ClCompile Include="..\os_os2.cpp">
|
||||||
|
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</ExcludedFromBuild>
|
||||||
|
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">true</ExcludedFromBuild>
|
||||||
|
</ClCompile>
|
||||||
|
<ClCompile Include="..\os_qnxnto.cpp">
|
||||||
|
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</ExcludedFromBuild>
|
||||||
|
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">true</ExcludedFromBuild>
|
||||||
|
</ClCompile>
|
||||||
|
<ClCompile Include="..\os_solaris.cpp">
|
||||||
|
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</ExcludedFromBuild>
|
||||||
|
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">true</ExcludedFromBuild>
|
||||||
|
</ClCompile>
|
||||||
|
<ClCompile Include="..\os_win32.cpp" />
|
||||||
|
<ClCompile Include="..\scsiata.cpp" />
|
||||||
|
<ClCompile Include="..\scsicmds.cpp" />
|
||||||
|
<ClCompile Include="..\scsiprint.cpp" />
|
||||||
|
<ClCompile Include="..\smartctl.cpp" />
|
||||||
|
<ClCompile Include="..\smartd.cpp">
|
||||||
|
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</ExcludedFromBuild>
|
||||||
|
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">true</ExcludedFromBuild>
|
||||||
|
</ClCompile>
|
||||||
|
<ClCompile Include="..\utility.cpp" />
|
||||||
|
</ItemGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<CustomBuildStep Include="daemon_win32.h">
|
||||||
|
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</ExcludedFromBuild>
|
||||||
|
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">true</ExcludedFromBuild>
|
||||||
|
</CustomBuildStep>
|
||||||
|
<CustomBuildStep Include="hostname_win32.h">
|
||||||
|
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</ExcludedFromBuild>
|
||||||
|
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">true</ExcludedFromBuild>
|
||||||
|
</CustomBuildStep>
|
||||||
|
<CustomBuildStep Include="syslog.h">
|
||||||
|
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</ExcludedFromBuild>
|
||||||
|
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">true</ExcludedFromBuild>
|
||||||
|
</CustomBuildStep>
|
||||||
|
<ClInclude Include="wbemcli_small.h" />
|
||||||
|
<ClInclude Include="wmiquery.h" />
|
||||||
|
<ClInclude Include="..\regex\regex.h" />
|
||||||
|
<ClInclude Include="..\regex\regex_internal.h" />
|
||||||
|
<ClInclude Include="..\getopt\getopt.h" />
|
||||||
|
<ClInclude Include="..\atacmdnames.h" />
|
||||||
|
<ClInclude Include="..\atacmds.h" />
|
||||||
|
<ClInclude Include="..\ataprint.h" />
|
||||||
|
<CustomBuildStep Include="..\cciss.h">
|
||||||
|
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</ExcludedFromBuild>
|
||||||
|
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">true</ExcludedFromBuild>
|
||||||
|
</CustomBuildStep>
|
||||||
|
<ClInclude Include="..\cissio_freebsd.h">
|
||||||
|
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</ExcludedFromBuild>
|
||||||
|
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">true</ExcludedFromBuild>
|
||||||
|
</ClInclude>
|
||||||
|
<CustomBuild Include="config_vc10.h">
|
||||||
|
<Message Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Copy %(FullPath) $(IntDir)config.h</Message>
|
||||||
|
<Command Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">copy %(FullPath) $(IntDir)config.h
|
||||||
|
</Command>
|
||||||
|
<Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(IntDir)config.h;%(Outputs)</Outputs>
|
||||||
|
<Message Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">Copy %(FullPath) $(IntDir)config.h</Message>
|
||||||
|
<Command Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">copy %(FullPath) $(IntDir)config.h
|
||||||
|
</Command>
|
||||||
|
<Outputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(IntDir)config.h;%(Outputs)</Outputs>
|
||||||
|
</CustomBuild>
|
||||||
|
<ClInclude Include="..\csmisas.h" />
|
||||||
|
<ClInclude Include="..\dev_ata_cmd_set.h" />
|
||||||
|
<ClInclude Include="..\dev_interface.h" />
|
||||||
|
<ClInclude Include="..\dev_tunnelled.h" />
|
||||||
|
<ClInclude Include="..\drivedb.h" />
|
||||||
|
<ClInclude Include="..\int64.h" />
|
||||||
|
<ClInclude Include="..\knowndrives.h" />
|
||||||
|
<CustomBuildStep Include="..\megaraid.h">
|
||||||
|
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</ExcludedFromBuild>
|
||||||
|
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">true</ExcludedFromBuild>
|
||||||
|
</CustomBuildStep>
|
||||||
|
<CustomBuildStep Include="..\os_darwin.h">
|
||||||
|
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</ExcludedFromBuild>
|
||||||
|
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">true</ExcludedFromBuild>
|
||||||
|
</CustomBuildStep>
|
||||||
|
<CustomBuildStep Include="..\os_freebsd.h">
|
||||||
|
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</ExcludedFromBuild>
|
||||||
|
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">true</ExcludedFromBuild>
|
||||||
|
</CustomBuildStep>
|
||||||
|
<CustomBuildStep Include="..\os_generic.h">
|
||||||
|
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</ExcludedFromBuild>
|
||||||
|
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">true</ExcludedFromBuild>
|
||||||
|
</CustomBuildStep>
|
||||||
|
<CustomBuildStep Include="..\os_linux.h">
|
||||||
|
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</ExcludedFromBuild>
|
||||||
|
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">true</ExcludedFromBuild>
|
||||||
|
</CustomBuildStep>
|
||||||
|
<CustomBuildStep Include="..\os_netbsd.h">
|
||||||
|
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</ExcludedFromBuild>
|
||||||
|
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">true</ExcludedFromBuild>
|
||||||
|
</CustomBuildStep>
|
||||||
|
<CustomBuildStep Include="..\os_openbsd.h">
|
||||||
|
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</ExcludedFromBuild>
|
||||||
|
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">true</ExcludedFromBuild>
|
||||||
|
</CustomBuildStep>
|
||||||
|
<CustomBuildStep Include="..\os_os2.h">
|
||||||
|
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</ExcludedFromBuild>
|
||||||
|
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">true</ExcludedFromBuild>
|
||||||
|
</CustomBuildStep>
|
||||||
|
<CustomBuildStep Include="..\os_qnxnto.h">
|
||||||
|
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</ExcludedFromBuild>
|
||||||
|
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">true</ExcludedFromBuild>
|
||||||
|
</CustomBuildStep>
|
||||||
|
<CustomBuildStep Include="..\os_solaris.h">
|
||||||
|
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</ExcludedFromBuild>
|
||||||
|
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">true</ExcludedFromBuild>
|
||||||
|
</CustomBuildStep>
|
||||||
|
<ClInclude Include="..\scsicmds.h" />
|
||||||
|
<ClInclude Include="..\scsiprint.h" />
|
||||||
|
<ClInclude Include="..\smartctl.h" />
|
||||||
|
<CustomBuild Include="svnversion_vc10.h">
|
||||||
|
<Message Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Copy %(FullPath) $(IntDir)svnversion.h</Message>
|
||||||
|
<Command Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">copy %(FullPath) $(IntDir)svnversion.h
|
||||||
|
</Command>
|
||||||
|
<Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(IntDir)svnversion.h;%(Outputs)</Outputs>
|
||||||
|
<Message Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">Copy %(FullPath) $(IntDir)svnversion.h</Message>
|
||||||
|
<Command Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">copy %(FullPath) $(IntDir)svnversion.h
|
||||||
|
</Command>
|
||||||
|
<Outputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(IntDir)svnversion.h;%(Outputs)</Outputs>
|
||||||
|
</CustomBuild>
|
||||||
|
<ClInclude Include="..\utility.h" />
|
||||||
|
</ItemGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<None Include="installer.nsi" />
|
||||||
|
<None Include="update-smart-drivedb.nsi" />
|
||||||
|
<None Include="..\AUTHORS" />
|
||||||
|
<None Include="..\autogen.sh" />
|
||||||
|
<None Include="..\CHANGELOG" />
|
||||||
|
<None Include="..\config.h.in" />
|
||||||
|
<None Include="..\configure.in" />
|
||||||
|
<None Include="..\do_release" />
|
||||||
|
<None Include="..\Doxyfile" />
|
||||||
|
<None Include="..\INSTALL" />
|
||||||
|
<None Include="..\Makefile.am" />
|
||||||
|
<None Include="..\NEWS" />
|
||||||
|
<None Include="..\README" />
|
||||||
|
<None Include="..\smartctl.8.in" />
|
||||||
|
<None Include="..\smartd.8.in" />
|
||||||
|
<None Include="..\smartd.conf.5.in" />
|
||||||
|
<None Include="..\smartd.initd.in" />
|
||||||
|
<None Include="..\TODO" />
|
||||||
|
<None Include="..\update-smart-drivedb.in" />
|
||||||
|
<None Include="..\WARNINGS" />
|
||||||
|
</ItemGroup>
|
||||||
|
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
|
||||||
|
<ImportGroup Label="ExtensionTargets">
|
||||||
|
</ImportGroup>
|
||||||
|
</Project>
|
154
os_win32/smartctl_vc10.vcxproj.filters
Normal file
154
os_win32/smartctl_vc10.vcxproj.filters
Normal file
@ -0,0 +1,154 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||||
|
<ItemGroup>
|
||||||
|
<Filter Include="os_win32">
|
||||||
|
<UniqueIdentifier>{9321e988-dd03-496d-9933-7c8b235a46bf}</UniqueIdentifier>
|
||||||
|
</Filter>
|
||||||
|
<Filter Include="regex">
|
||||||
|
<UniqueIdentifier>{bfbfd4ea-fae3-45ec-9cfb-c5424218c47c}</UniqueIdentifier>
|
||||||
|
</Filter>
|
||||||
|
<Filter Include="getopt">
|
||||||
|
<UniqueIdentifier>{8ff0bf5f-c96e-45c3-bcb4-7450cecfa0d4}</UniqueIdentifier>
|
||||||
|
</Filter>
|
||||||
|
</ItemGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<ClCompile Include="daemon_win32.cpp">
|
||||||
|
<Filter>os_win32</Filter>
|
||||||
|
</ClCompile>
|
||||||
|
<ClCompile Include="hostname_win32.cpp">
|
||||||
|
<Filter>os_win32</Filter>
|
||||||
|
</ClCompile>
|
||||||
|
<ClCompile Include="syslog_win32.cpp">
|
||||||
|
<Filter>os_win32</Filter>
|
||||||
|
</ClCompile>
|
||||||
|
<ClCompile Include="wmiquery.cpp">
|
||||||
|
<Filter>os_win32</Filter>
|
||||||
|
</ClCompile>
|
||||||
|
<ClCompile Include="..\regex\regcomp.c">
|
||||||
|
<Filter>regex</Filter>
|
||||||
|
</ClCompile>
|
||||||
|
<ClCompile Include="..\regex\regex.c">
|
||||||
|
<Filter>regex</Filter>
|
||||||
|
</ClCompile>
|
||||||
|
<ClCompile Include="..\regex\regex_internal.c">
|
||||||
|
<Filter>regex</Filter>
|
||||||
|
</ClCompile>
|
||||||
|
<ClCompile Include="..\regex\regexec.c">
|
||||||
|
<Filter>regex</Filter>
|
||||||
|
</ClCompile>
|
||||||
|
<ClCompile Include="..\getopt\getopt.c">
|
||||||
|
<Filter>getopt</Filter>
|
||||||
|
</ClCompile>
|
||||||
|
<ClCompile Include="..\getopt\getopt1.c">
|
||||||
|
<Filter>getopt</Filter>
|
||||||
|
</ClCompile>
|
||||||
|
<ClCompile Include="..\atacmdnames.cpp" />
|
||||||
|
<ClCompile Include="..\atacmds.cpp" />
|
||||||
|
<ClCompile Include="..\ataprint.cpp" />
|
||||||
|
<ClCompile Include="..\cciss.cpp" />
|
||||||
|
<ClCompile Include="..\dev_ata_cmd_set.cpp" />
|
||||||
|
<ClCompile Include="..\dev_interface.cpp" />
|
||||||
|
<ClCompile Include="..\dev_legacy.cpp" />
|
||||||
|
<ClCompile Include="..\knowndrives.cpp" />
|
||||||
|
<ClCompile Include="..\os_darwin.cpp" />
|
||||||
|
<ClCompile Include="..\os_freebsd.cpp" />
|
||||||
|
<ClCompile Include="..\os_generic.cpp" />
|
||||||
|
<ClCompile Include="..\os_linux.cpp" />
|
||||||
|
<ClCompile Include="..\os_netbsd.cpp" />
|
||||||
|
<ClCompile Include="..\os_openbsd.cpp" />
|
||||||
|
<ClCompile Include="..\os_os2.cpp" />
|
||||||
|
<ClCompile Include="..\os_qnxnto.cpp" />
|
||||||
|
<ClCompile Include="..\os_solaris.cpp" />
|
||||||
|
<ClCompile Include="..\os_win32.cpp" />
|
||||||
|
<ClCompile Include="..\scsiata.cpp" />
|
||||||
|
<ClCompile Include="..\scsicmds.cpp" />
|
||||||
|
<ClCompile Include="..\scsiprint.cpp" />
|
||||||
|
<ClCompile Include="..\smartctl.cpp" />
|
||||||
|
<ClCompile Include="..\smartd.cpp" />
|
||||||
|
<ClCompile Include="..\utility.cpp" />
|
||||||
|
</ItemGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<ClInclude Include="wbemcli_small.h">
|
||||||
|
<Filter>os_win32</Filter>
|
||||||
|
</ClInclude>
|
||||||
|
<ClInclude Include="wmiquery.h">
|
||||||
|
<Filter>os_win32</Filter>
|
||||||
|
</ClInclude>
|
||||||
|
<ClInclude Include="..\regex\regex.h">
|
||||||
|
<Filter>regex</Filter>
|
||||||
|
</ClInclude>
|
||||||
|
<ClInclude Include="..\regex\regex_internal.h">
|
||||||
|
<Filter>regex</Filter>
|
||||||
|
</ClInclude>
|
||||||
|
<ClInclude Include="..\getopt\getopt.h">
|
||||||
|
<Filter>getopt</Filter>
|
||||||
|
</ClInclude>
|
||||||
|
<ClInclude Include="..\atacmdnames.h" />
|
||||||
|
<ClInclude Include="..\atacmds.h" />
|
||||||
|
<ClInclude Include="..\ataprint.h" />
|
||||||
|
<ClInclude Include="..\cissio_freebsd.h" />
|
||||||
|
<ClInclude Include="..\csmisas.h" />
|
||||||
|
<ClInclude Include="..\dev_ata_cmd_set.h" />
|
||||||
|
<ClInclude Include="..\dev_interface.h" />
|
||||||
|
<ClInclude Include="..\dev_tunnelled.h" />
|
||||||
|
<ClInclude Include="..\drivedb.h" />
|
||||||
|
<ClInclude Include="..\int64.h" />
|
||||||
|
<ClInclude Include="..\knowndrives.h" />
|
||||||
|
<ClInclude Include="..\scsicmds.h" />
|
||||||
|
<ClInclude Include="..\scsiprint.h" />
|
||||||
|
<ClInclude Include="..\smartctl.h" />
|
||||||
|
<ClInclude Include="..\utility.h" />
|
||||||
|
</ItemGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<None Include="installer.nsi">
|
||||||
|
<Filter>os_win32</Filter>
|
||||||
|
</None>
|
||||||
|
<None Include="update-smart-drivedb.nsi">
|
||||||
|
<Filter>os_win32</Filter>
|
||||||
|
</None>
|
||||||
|
<None Include="..\AUTHORS" />
|
||||||
|
<None Include="..\autogen.sh" />
|
||||||
|
<None Include="..\CHANGELOG" />
|
||||||
|
<None Include="..\config.h.in" />
|
||||||
|
<None Include="..\configure.in" />
|
||||||
|
<None Include="..\do_release" />
|
||||||
|
<None Include="..\Doxyfile" />
|
||||||
|
<None Include="..\INSTALL" />
|
||||||
|
<None Include="..\Makefile.am" />
|
||||||
|
<None Include="..\NEWS" />
|
||||||
|
<None Include="..\README" />
|
||||||
|
<None Include="..\smartctl.8.in" />
|
||||||
|
<None Include="..\smartd.8.in" />
|
||||||
|
<None Include="..\smartd.conf.5.in" />
|
||||||
|
<None Include="..\smartd.initd.in" />
|
||||||
|
<None Include="..\TODO" />
|
||||||
|
<None Include="..\update-smart-drivedb.in" />
|
||||||
|
<None Include="..\WARNINGS" />
|
||||||
|
</ItemGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<CustomBuildStep Include="daemon_win32.h">
|
||||||
|
<Filter>os_win32</Filter>
|
||||||
|
</CustomBuildStep>
|
||||||
|
<CustomBuildStep Include="hostname_win32.h">
|
||||||
|
<Filter>os_win32</Filter>
|
||||||
|
</CustomBuildStep>
|
||||||
|
<CustomBuildStep Include="syslog.h">
|
||||||
|
<Filter>os_win32</Filter>
|
||||||
|
</CustomBuildStep>
|
||||||
|
<CustomBuildStep Include="..\cciss.h" />
|
||||||
|
<CustomBuildStep Include="..\megaraid.h" />
|
||||||
|
<CustomBuildStep Include="..\os_darwin.h" />
|
||||||
|
<CustomBuildStep Include="..\os_freebsd.h" />
|
||||||
|
<CustomBuildStep Include="..\os_generic.h" />
|
||||||
|
<CustomBuildStep Include="..\os_linux.h" />
|
||||||
|
<CustomBuildStep Include="..\os_netbsd.h" />
|
||||||
|
<CustomBuildStep Include="..\os_openbsd.h" />
|
||||||
|
<CustomBuildStep Include="..\os_os2.h" />
|
||||||
|
<CustomBuildStep Include="..\os_qnxnto.h" />
|
||||||
|
<CustomBuildStep Include="..\os_solaris.h" />
|
||||||
|
</ItemGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<CustomBuild Include="config_vc10.h" />
|
||||||
|
<CustomBuild Include="svnversion_vc10.h" />
|
||||||
|
</ItemGroup>
|
||||||
|
</Project>
|
File diff suppressed because it is too large
Load Diff
301
os_win32/smartd_vc10.vcxproj
Normal file
301
os_win32/smartd_vc10.vcxproj
Normal file
@ -0,0 +1,301 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||||
|
<ItemGroup Label="ProjectConfigurations">
|
||||||
|
<ProjectConfiguration Include="Debug|Win32">
|
||||||
|
<Configuration>Debug</Configuration>
|
||||||
|
<Platform>Win32</Platform>
|
||||||
|
</ProjectConfiguration>
|
||||||
|
<ProjectConfiguration Include="Release|Win32">
|
||||||
|
<Configuration>Release</Configuration>
|
||||||
|
<Platform>Win32</Platform>
|
||||||
|
</ProjectConfiguration>
|
||||||
|
</ItemGroup>
|
||||||
|
<PropertyGroup Label="Globals">
|
||||||
|
<ProjectGuid>{C0762191-C2AC-40B6-A2EB-F1658BBDC4C6}</ProjectGuid>
|
||||||
|
<RootNamespace>smartd</RootNamespace>
|
||||||
|
<Keyword>Win32Proj</Keyword>
|
||||||
|
<ProjectName>smartd</ProjectName>
|
||||||
|
</PropertyGroup>
|
||||||
|
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
|
||||||
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
|
||||||
|
<ConfigurationType>Application</ConfigurationType>
|
||||||
|
<CharacterSet>MultiByte</CharacterSet>
|
||||||
|
<WholeProgramOptimization>true</WholeProgramOptimization>
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
|
||||||
|
<ConfigurationType>Application</ConfigurationType>
|
||||||
|
<CharacterSet>MultiByte</CharacterSet>
|
||||||
|
</PropertyGroup>
|
||||||
|
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
|
||||||
|
<ImportGroup Label="ExtensionSettings">
|
||||||
|
</ImportGroup>
|
||||||
|
<ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="PropertySheets">
|
||||||
|
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
||||||
|
</ImportGroup>
|
||||||
|
<ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="PropertySheets">
|
||||||
|
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
||||||
|
</ImportGroup>
|
||||||
|
<PropertyGroup Label="UserMacros" />
|
||||||
|
<PropertyGroup>
|
||||||
|
<_ProjectFileVersion>10.0.30319.1</_ProjectFileVersion>
|
||||||
|
<OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">.\smartd_vc10.d\</OutDir>
|
||||||
|
<IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">.\smartd_vc10.d\</IntDir>
|
||||||
|
<LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</LinkIncremental>
|
||||||
|
<OutDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">.\</OutDir>
|
||||||
|
<IntDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">.\smartd_vc10.r\</IntDir>
|
||||||
|
<LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">false</LinkIncremental>
|
||||||
|
</PropertyGroup>
|
||||||
|
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
|
||||||
|
<ClCompile>
|
||||||
|
<Optimization>Disabled</Optimization>
|
||||||
|
<AdditionalIncludeDirectories>.;..\getopt;..\regex;$(IntDir);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
||||||
|
<PreprocessorDefinitions>_DEBUG;HAVE_CONFIG_H;_USE_32BIT_TIME_T;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||||
|
<MinimalRebuild>true</MinimalRebuild>
|
||||||
|
<BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
|
||||||
|
<RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
|
||||||
|
<PrecompiledHeader>
|
||||||
|
</PrecompiledHeader>
|
||||||
|
<WarningLevel>Level3</WarningLevel>
|
||||||
|
<DebugInformationFormat>EditAndContinue</DebugInformationFormat>
|
||||||
|
<DisableSpecificWarnings>4250</DisableSpecificWarnings>
|
||||||
|
</ClCompile>
|
||||||
|
<Link>
|
||||||
|
<GenerateDebugInformation>true</GenerateDebugInformation>
|
||||||
|
<SubSystem>Console</SubSystem>
|
||||||
|
<TargetMachine>MachineX86</TargetMachine>
|
||||||
|
</Link>
|
||||||
|
</ItemDefinitionGroup>
|
||||||
|
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
|
||||||
|
<ClCompile>
|
||||||
|
<AdditionalIncludeDirectories>.;..\getopt;..\regex;$(IntDir);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
||||||
|
<PreprocessorDefinitions>NDEBUG;HAVE_CONFIG_H;_USE_32BIT_TIME_T;_CRT_NONSTDC_NO_DEPRECATE;_CRT_SECURE_NO_DEPRECATE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||||
|
<RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>
|
||||||
|
<PrecompiledHeader>
|
||||||
|
</PrecompiledHeader>
|
||||||
|
<WarningLevel>Level3</WarningLevel>
|
||||||
|
<DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
|
||||||
|
<DisableSpecificWarnings>4250</DisableSpecificWarnings>
|
||||||
|
</ClCompile>
|
||||||
|
<Link>
|
||||||
|
<GenerateDebugInformation>true</GenerateDebugInformation>
|
||||||
|
<ProgramDatabaseFile>$(IntDir)$(TargetName).pdb</ProgramDatabaseFile>
|
||||||
|
<SubSystem>Console</SubSystem>
|
||||||
|
<OptimizeReferences>true</OptimizeReferences>
|
||||||
|
<EnableCOMDATFolding>true</EnableCOMDATFolding>
|
||||||
|
<TargetMachine>MachineX86</TargetMachine>
|
||||||
|
</Link>
|
||||||
|
</ItemDefinitionGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<ClCompile Include="daemon_win32.cpp" />
|
||||||
|
<ClCompile Include="hostname_win32.cpp" />
|
||||||
|
<ClCompile Include="syslog_win32.cpp" />
|
||||||
|
<ClCompile Include="wmiquery.cpp" />
|
||||||
|
<ClCompile Include="..\regex\regcomp.c">
|
||||||
|
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</ExcludedFromBuild>
|
||||||
|
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">true</ExcludedFromBuild>
|
||||||
|
</ClCompile>
|
||||||
|
<ClCompile Include="..\regex\regex.c" />
|
||||||
|
<ClCompile Include="..\regex\regex_internal.c">
|
||||||
|
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</ExcludedFromBuild>
|
||||||
|
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">true</ExcludedFromBuild>
|
||||||
|
</ClCompile>
|
||||||
|
<ClCompile Include="..\regex\regexec.c">
|
||||||
|
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</ExcludedFromBuild>
|
||||||
|
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">true</ExcludedFromBuild>
|
||||||
|
</ClCompile>
|
||||||
|
<ClCompile Include="..\getopt\getopt.c" />
|
||||||
|
<ClCompile Include="..\getopt\getopt1.c" />
|
||||||
|
<ClCompile Include="..\atacmdnames.cpp" />
|
||||||
|
<ClCompile Include="..\atacmds.cpp" />
|
||||||
|
<ClCompile Include="..\ataprint.cpp">
|
||||||
|
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</ExcludedFromBuild>
|
||||||
|
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">true</ExcludedFromBuild>
|
||||||
|
</ClCompile>
|
||||||
|
<ClCompile Include="..\cciss.cpp">
|
||||||
|
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</ExcludedFromBuild>
|
||||||
|
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">true</ExcludedFromBuild>
|
||||||
|
</ClCompile>
|
||||||
|
<ClCompile Include="..\dev_ata_cmd_set.cpp" />
|
||||||
|
<ClCompile Include="..\dev_interface.cpp" />
|
||||||
|
<ClCompile Include="..\dev_legacy.cpp">
|
||||||
|
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</ExcludedFromBuild>
|
||||||
|
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">true</ExcludedFromBuild>
|
||||||
|
</ClCompile>
|
||||||
|
<ClCompile Include="..\knowndrives.cpp" />
|
||||||
|
<ClCompile Include="..\os_darwin.cpp">
|
||||||
|
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</ExcludedFromBuild>
|
||||||
|
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">true</ExcludedFromBuild>
|
||||||
|
</ClCompile>
|
||||||
|
<ClCompile Include="..\os_freebsd.cpp">
|
||||||
|
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</ExcludedFromBuild>
|
||||||
|
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">true</ExcludedFromBuild>
|
||||||
|
</ClCompile>
|
||||||
|
<ClCompile Include="..\os_generic.cpp">
|
||||||
|
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</ExcludedFromBuild>
|
||||||
|
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">true</ExcludedFromBuild>
|
||||||
|
</ClCompile>
|
||||||
|
<ClCompile Include="..\os_linux.cpp">
|
||||||
|
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</ExcludedFromBuild>
|
||||||
|
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">true</ExcludedFromBuild>
|
||||||
|
</ClCompile>
|
||||||
|
<ClCompile Include="..\os_netbsd.cpp">
|
||||||
|
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</ExcludedFromBuild>
|
||||||
|
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">true</ExcludedFromBuild>
|
||||||
|
</ClCompile>
|
||||||
|
<ClCompile Include="..\os_openbsd.cpp">
|
||||||
|
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</ExcludedFromBuild>
|
||||||
|
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">true</ExcludedFromBuild>
|
||||||
|
</ClCompile>
|
||||||
|
<ClCompile Include="..\os_os2.cpp">
|
||||||
|
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</ExcludedFromBuild>
|
||||||
|
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">true</ExcludedFromBuild>
|
||||||
|
</ClCompile>
|
||||||
|
<ClCompile Include="..\os_qnxnto.cpp">
|
||||||
|
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</ExcludedFromBuild>
|
||||||
|
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">true</ExcludedFromBuild>
|
||||||
|
</ClCompile>
|
||||||
|
<ClCompile Include="..\os_solaris.cpp">
|
||||||
|
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</ExcludedFromBuild>
|
||||||
|
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">true</ExcludedFromBuild>
|
||||||
|
</ClCompile>
|
||||||
|
<ClCompile Include="..\os_win32.cpp" />
|
||||||
|
<ClCompile Include="..\scsiata.cpp" />
|
||||||
|
<ClCompile Include="..\scsicmds.cpp" />
|
||||||
|
<ClCompile Include="..\scsiprint.cpp">
|
||||||
|
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</ExcludedFromBuild>
|
||||||
|
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">true</ExcludedFromBuild>
|
||||||
|
</ClCompile>
|
||||||
|
<ClCompile Include="..\smartctl.cpp">
|
||||||
|
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</ExcludedFromBuild>
|
||||||
|
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">true</ExcludedFromBuild>
|
||||||
|
</ClCompile>
|
||||||
|
<ClCompile Include="..\smartd.cpp" />
|
||||||
|
<ClCompile Include="..\utility.cpp" />
|
||||||
|
</ItemGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<ClInclude Include="daemon_win32.h" />
|
||||||
|
<ClInclude Include="hostname_win32.h" />
|
||||||
|
<ClInclude Include="syslog.h" />
|
||||||
|
<ClInclude Include="wbemcli_small.h" />
|
||||||
|
<ClInclude Include="wmiquery.h" />
|
||||||
|
<ClInclude Include="..\regex\regex.h" />
|
||||||
|
<ClInclude Include="..\regex\regex_internal.h" />
|
||||||
|
<ClInclude Include="..\getopt\getopt.h" />
|
||||||
|
<ClInclude Include="..\atacmdnames.h" />
|
||||||
|
<ClInclude Include="..\atacmds.h" />
|
||||||
|
<CustomBuildStep Include="..\ataprint.h">
|
||||||
|
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</ExcludedFromBuild>
|
||||||
|
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">true</ExcludedFromBuild>
|
||||||
|
</CustomBuildStep>
|
||||||
|
<CustomBuildStep Include="..\cciss.h">
|
||||||
|
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</ExcludedFromBuild>
|
||||||
|
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">true</ExcludedFromBuild>
|
||||||
|
</CustomBuildStep>
|
||||||
|
<ClInclude Include="..\cissio_freebsd.h">
|
||||||
|
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</ExcludedFromBuild>
|
||||||
|
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">true</ExcludedFromBuild>
|
||||||
|
</ClInclude>
|
||||||
|
<CustomBuild Include="config_vc10.h">
|
||||||
|
<Message Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Copy %(FullPath) $(IntDir)config.h</Message>
|
||||||
|
<Command Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">copy %(FullPath) $(IntDir)config.h
|
||||||
|
</Command>
|
||||||
|
<Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(IntDir)config.h;%(Outputs)</Outputs>
|
||||||
|
<Message Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">Copy %(FullPath) $(IntDir)config.h</Message>
|
||||||
|
<Command Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">copy %(FullPath) $(IntDir)config.h
|
||||||
|
</Command>
|
||||||
|
<Outputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(IntDir)config.h;%(Outputs)</Outputs>
|
||||||
|
</CustomBuild>
|
||||||
|
<ClInclude Include="..\csmisas.h" />
|
||||||
|
<ClInclude Include="..\dev_ata_cmd_set.h" />
|
||||||
|
<ClInclude Include="..\dev_interface.h" />
|
||||||
|
<ClInclude Include="..\dev_tunnelled.h" />
|
||||||
|
<ClInclude Include="..\drivedb.h" />
|
||||||
|
<ClInclude Include="..\int64.h" />
|
||||||
|
<ClInclude Include="..\knowndrives.h" />
|
||||||
|
<CustomBuildStep Include="..\megaraid.h">
|
||||||
|
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</ExcludedFromBuild>
|
||||||
|
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">true</ExcludedFromBuild>
|
||||||
|
</CustomBuildStep>
|
||||||
|
<CustomBuildStep Include="..\os_darwin.h">
|
||||||
|
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</ExcludedFromBuild>
|
||||||
|
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">true</ExcludedFromBuild>
|
||||||
|
</CustomBuildStep>
|
||||||
|
<CustomBuildStep Include="..\os_freebsd.h">
|
||||||
|
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</ExcludedFromBuild>
|
||||||
|
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">true</ExcludedFromBuild>
|
||||||
|
</CustomBuildStep>
|
||||||
|
<CustomBuildStep Include="..\os_generic.h">
|
||||||
|
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</ExcludedFromBuild>
|
||||||
|
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">true</ExcludedFromBuild>
|
||||||
|
</CustomBuildStep>
|
||||||
|
<CustomBuildStep Include="..\os_linux.h">
|
||||||
|
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</ExcludedFromBuild>
|
||||||
|
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">true</ExcludedFromBuild>
|
||||||
|
</CustomBuildStep>
|
||||||
|
<CustomBuildStep Include="..\os_netbsd.h">
|
||||||
|
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</ExcludedFromBuild>
|
||||||
|
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">true</ExcludedFromBuild>
|
||||||
|
</CustomBuildStep>
|
||||||
|
<CustomBuildStep Include="..\os_openbsd.h">
|
||||||
|
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</ExcludedFromBuild>
|
||||||
|
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">true</ExcludedFromBuild>
|
||||||
|
</CustomBuildStep>
|
||||||
|
<CustomBuildStep Include="..\os_os2.h">
|
||||||
|
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</ExcludedFromBuild>
|
||||||
|
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">true</ExcludedFromBuild>
|
||||||
|
</CustomBuildStep>
|
||||||
|
<CustomBuildStep Include="..\os_qnxnto.h">
|
||||||
|
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</ExcludedFromBuild>
|
||||||
|
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">true</ExcludedFromBuild>
|
||||||
|
</CustomBuildStep>
|
||||||
|
<CustomBuildStep Include="..\os_solaris.h">
|
||||||
|
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</ExcludedFromBuild>
|
||||||
|
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">true</ExcludedFromBuild>
|
||||||
|
</CustomBuildStep>
|
||||||
|
<ClInclude Include="..\scsicmds.h" />
|
||||||
|
<CustomBuildStep Include="..\scsiprint.h">
|
||||||
|
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</ExcludedFromBuild>
|
||||||
|
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">true</ExcludedFromBuild>
|
||||||
|
</CustomBuildStep>
|
||||||
|
<CustomBuildStep Include="..\smartctl.h">
|
||||||
|
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</ExcludedFromBuild>
|
||||||
|
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">true</ExcludedFromBuild>
|
||||||
|
</CustomBuildStep>
|
||||||
|
<CustomBuild Include="svnversion_vc10.h">
|
||||||
|
<Message Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Copy %(FullPath) $(IntDir)svnversion.h</Message>
|
||||||
|
<Command Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">copy %(FullPath) $(IntDir)svnversion.h
|
||||||
|
</Command>
|
||||||
|
<Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(IntDir)svnversion.h;%(Outputs)</Outputs>
|
||||||
|
<Message Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">Copy %(FullPath) $(IntDir)svnversion.h</Message>
|
||||||
|
<Command Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">copy %(FullPath) $(IntDir)svnversion.h
|
||||||
|
</Command>
|
||||||
|
<Outputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(IntDir)svnversion.h;%(Outputs)</Outputs>
|
||||||
|
</CustomBuild>
|
||||||
|
<ClInclude Include="..\utility.h" />
|
||||||
|
</ItemGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<None Include="installer.nsi" />
|
||||||
|
<None Include="update-smart-drivedb.nsi" />
|
||||||
|
<None Include="..\AUTHORS" />
|
||||||
|
<None Include="..\autogen.sh" />
|
||||||
|
<None Include="..\CHANGELOG" />
|
||||||
|
<None Include="..\config.h.in" />
|
||||||
|
<None Include="..\configure.in" />
|
||||||
|
<None Include="..\do_release" />
|
||||||
|
<None Include="..\Doxyfile" />
|
||||||
|
<None Include="..\INSTALL" />
|
||||||
|
<None Include="..\Makefile.am" />
|
||||||
|
<None Include="..\NEWS" />
|
||||||
|
<None Include="..\README" />
|
||||||
|
<None Include="..\smartctl.8.in" />
|
||||||
|
<None Include="..\smartd.8.in" />
|
||||||
|
<None Include="..\smartd.conf.5.in" />
|
||||||
|
<None Include="..\smartd.initd.in" />
|
||||||
|
<None Include="..\TODO" />
|
||||||
|
<None Include="..\update-smart-drivedb.in" />
|
||||||
|
<None Include="..\WARNINGS" />
|
||||||
|
</ItemGroup>
|
||||||
|
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
|
||||||
|
<ImportGroup Label="ExtensionTargets">
|
||||||
|
</ImportGroup>
|
||||||
|
</Project>
|
154
os_win32/smartd_vc10.vcxproj.filters
Normal file
154
os_win32/smartd_vc10.vcxproj.filters
Normal file
@ -0,0 +1,154 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||||
|
<ItemGroup>
|
||||||
|
<Filter Include="os_win32">
|
||||||
|
<UniqueIdentifier>{44bb110e-4d44-4d5e-8186-354210a8d3ba}</UniqueIdentifier>
|
||||||
|
</Filter>
|
||||||
|
<Filter Include="regex">
|
||||||
|
<UniqueIdentifier>{fd3bb1d5-a72e-4f92-84a3-6eac97975ec7}</UniqueIdentifier>
|
||||||
|
</Filter>
|
||||||
|
<Filter Include="getopt">
|
||||||
|
<UniqueIdentifier>{1d1b67d5-219f-4e86-a5ff-9d94f1f751f9}</UniqueIdentifier>
|
||||||
|
</Filter>
|
||||||
|
</ItemGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<ClCompile Include="daemon_win32.cpp">
|
||||||
|
<Filter>os_win32</Filter>
|
||||||
|
</ClCompile>
|
||||||
|
<ClCompile Include="hostname_win32.cpp">
|
||||||
|
<Filter>os_win32</Filter>
|
||||||
|
</ClCompile>
|
||||||
|
<ClCompile Include="syslog_win32.cpp">
|
||||||
|
<Filter>os_win32</Filter>
|
||||||
|
</ClCompile>
|
||||||
|
<ClCompile Include="wmiquery.cpp">
|
||||||
|
<Filter>os_win32</Filter>
|
||||||
|
</ClCompile>
|
||||||
|
<ClCompile Include="..\regex\regcomp.c">
|
||||||
|
<Filter>regex</Filter>
|
||||||
|
</ClCompile>
|
||||||
|
<ClCompile Include="..\regex\regex.c">
|
||||||
|
<Filter>regex</Filter>
|
||||||
|
</ClCompile>
|
||||||
|
<ClCompile Include="..\regex\regex_internal.c">
|
||||||
|
<Filter>regex</Filter>
|
||||||
|
</ClCompile>
|
||||||
|
<ClCompile Include="..\regex\regexec.c">
|
||||||
|
<Filter>regex</Filter>
|
||||||
|
</ClCompile>
|
||||||
|
<ClCompile Include="..\getopt\getopt.c">
|
||||||
|
<Filter>getopt</Filter>
|
||||||
|
</ClCompile>
|
||||||
|
<ClCompile Include="..\getopt\getopt1.c">
|
||||||
|
<Filter>getopt</Filter>
|
||||||
|
</ClCompile>
|
||||||
|
<ClCompile Include="..\atacmdnames.cpp" />
|
||||||
|
<ClCompile Include="..\atacmds.cpp" />
|
||||||
|
<ClCompile Include="..\ataprint.cpp" />
|
||||||
|
<ClCompile Include="..\cciss.cpp" />
|
||||||
|
<ClCompile Include="..\dev_ata_cmd_set.cpp" />
|
||||||
|
<ClCompile Include="..\dev_interface.cpp" />
|
||||||
|
<ClCompile Include="..\dev_legacy.cpp" />
|
||||||
|
<ClCompile Include="..\knowndrives.cpp" />
|
||||||
|
<ClCompile Include="..\os_darwin.cpp" />
|
||||||
|
<ClCompile Include="..\os_freebsd.cpp" />
|
||||||
|
<ClCompile Include="..\os_generic.cpp" />
|
||||||
|
<ClCompile Include="..\os_linux.cpp" />
|
||||||
|
<ClCompile Include="..\os_netbsd.cpp" />
|
||||||
|
<ClCompile Include="..\os_openbsd.cpp" />
|
||||||
|
<ClCompile Include="..\os_os2.cpp" />
|
||||||
|
<ClCompile Include="..\os_qnxnto.cpp" />
|
||||||
|
<ClCompile Include="..\os_solaris.cpp" />
|
||||||
|
<ClCompile Include="..\os_win32.cpp" />
|
||||||
|
<ClCompile Include="..\scsiata.cpp" />
|
||||||
|
<ClCompile Include="..\scsicmds.cpp" />
|
||||||
|
<ClCompile Include="..\scsiprint.cpp" />
|
||||||
|
<ClCompile Include="..\smartctl.cpp" />
|
||||||
|
<ClCompile Include="..\smartd.cpp" />
|
||||||
|
<ClCompile Include="..\utility.cpp" />
|
||||||
|
</ItemGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<ClInclude Include="daemon_win32.h">
|
||||||
|
<Filter>os_win32</Filter>
|
||||||
|
</ClInclude>
|
||||||
|
<ClInclude Include="hostname_win32.h">
|
||||||
|
<Filter>os_win32</Filter>
|
||||||
|
</ClInclude>
|
||||||
|
<ClInclude Include="syslog.h">
|
||||||
|
<Filter>os_win32</Filter>
|
||||||
|
</ClInclude>
|
||||||
|
<ClInclude Include="wbemcli_small.h">
|
||||||
|
<Filter>os_win32</Filter>
|
||||||
|
</ClInclude>
|
||||||
|
<ClInclude Include="wmiquery.h">
|
||||||
|
<Filter>os_win32</Filter>
|
||||||
|
</ClInclude>
|
||||||
|
<ClInclude Include="..\regex\regex.h">
|
||||||
|
<Filter>regex</Filter>
|
||||||
|
</ClInclude>
|
||||||
|
<ClInclude Include="..\regex\regex_internal.h">
|
||||||
|
<Filter>regex</Filter>
|
||||||
|
</ClInclude>
|
||||||
|
<ClInclude Include="..\getopt\getopt.h">
|
||||||
|
<Filter>getopt</Filter>
|
||||||
|
</ClInclude>
|
||||||
|
<ClInclude Include="..\atacmdnames.h" />
|
||||||
|
<ClInclude Include="..\atacmds.h" />
|
||||||
|
<ClInclude Include="..\cissio_freebsd.h" />
|
||||||
|
<ClInclude Include="..\csmisas.h" />
|
||||||
|
<ClInclude Include="..\dev_ata_cmd_set.h" />
|
||||||
|
<ClInclude Include="..\dev_interface.h" />
|
||||||
|
<ClInclude Include="..\dev_tunnelled.h" />
|
||||||
|
<ClInclude Include="..\drivedb.h" />
|
||||||
|
<ClInclude Include="..\int64.h" />
|
||||||
|
<ClInclude Include="..\knowndrives.h" />
|
||||||
|
<ClInclude Include="..\scsicmds.h" />
|
||||||
|
<ClInclude Include="..\utility.h" />
|
||||||
|
</ItemGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<None Include="installer.nsi">
|
||||||
|
<Filter>os_win32</Filter>
|
||||||
|
</None>
|
||||||
|
<None Include="update-smart-drivedb.nsi">
|
||||||
|
<Filter>os_win32</Filter>
|
||||||
|
</None>
|
||||||
|
<None Include="..\AUTHORS" />
|
||||||
|
<None Include="..\autogen.sh" />
|
||||||
|
<None Include="..\CHANGELOG" />
|
||||||
|
<None Include="..\config.h.in" />
|
||||||
|
<None Include="..\configure.in" />
|
||||||
|
<None Include="..\do_release" />
|
||||||
|
<None Include="..\Doxyfile" />
|
||||||
|
<None Include="..\INSTALL" />
|
||||||
|
<None Include="..\Makefile.am" />
|
||||||
|
<None Include="..\NEWS" />
|
||||||
|
<None Include="..\README" />
|
||||||
|
<None Include="..\smartctl.8.in" />
|
||||||
|
<None Include="..\smartd.8.in" />
|
||||||
|
<None Include="..\smartd.conf.5.in" />
|
||||||
|
<None Include="..\smartd.initd.in" />
|
||||||
|
<None Include="..\TODO" />
|
||||||
|
<None Include="..\update-smart-drivedb.in" />
|
||||||
|
<None Include="..\WARNINGS" />
|
||||||
|
</ItemGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<CustomBuildStep Include="..\ataprint.h" />
|
||||||
|
<CustomBuildStep Include="..\cciss.h" />
|
||||||
|
<CustomBuildStep Include="..\megaraid.h" />
|
||||||
|
<CustomBuildStep Include="..\os_darwin.h" />
|
||||||
|
<CustomBuildStep Include="..\os_freebsd.h" />
|
||||||
|
<CustomBuildStep Include="..\os_generic.h" />
|
||||||
|
<CustomBuildStep Include="..\os_linux.h" />
|
||||||
|
<CustomBuildStep Include="..\os_netbsd.h" />
|
||||||
|
<CustomBuildStep Include="..\os_openbsd.h" />
|
||||||
|
<CustomBuildStep Include="..\os_os2.h" />
|
||||||
|
<CustomBuildStep Include="..\os_qnxnto.h" />
|
||||||
|
<CustomBuildStep Include="..\os_solaris.h" />
|
||||||
|
<CustomBuildStep Include="..\scsiprint.h" />
|
||||||
|
<CustomBuildStep Include="..\smartctl.h" />
|
||||||
|
</ItemGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<CustomBuild Include="config_vc10.h" />
|
||||||
|
<CustomBuild Include="svnversion_vc10.h" />
|
||||||
|
</ItemGroup>
|
||||||
|
</Project>
|
File diff suppressed because it is too large
Load Diff
@ -1,11 +1,13 @@
|
|||||||
|
|
||||||
Microsoft Visual Studio Solution File, Format Version 9.00
|
Microsoft Visual Studio Solution File, Format Version 11.00
|
||||||
# Visual Studio 2005
|
# Visual C++ Express 2010
|
||||||
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "smartctl_vc8", "smartctl_vc8.vcproj", "{3AFEDCDD-D289-4543-A91D-EFBA6C710247}"
|
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "smartctl", "smartctl_vc10.vcxproj", "{3AFEDCDD-D289-4543-A91D-EFBA6C710247}"
|
||||||
EndProject
|
EndProject
|
||||||
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "smartd_vc8", "smartd_vc8.vcproj", "{C0762191-C2AC-40B6-A2EB-F1658BBDC4C6}"
|
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "smartd", "smartd_vc10.vcxproj", "{C0762191-C2AC-40B6-A2EB-F1658BBDC4C6}"
|
||||||
EndProject
|
EndProject
|
||||||
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "syslogevt_vc8", "syslogevt_vc8.vcproj", "{FAB7557B-86EA-405D-B49D-33AB3F4D3E33}"
|
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "syslogevt", "syslogevt_vc10.vcxproj", "{FAB7557B-86EA-405D-B49D-33AB3F4D3E33}"
|
||||||
|
EndProject
|
||||||
|
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "runcmd", "runcmd_vc10.vcxproj", "{11A4B619-D97B-499F-AF17-CF9F80BF70E8}"
|
||||||
EndProject
|
EndProject
|
||||||
Global
|
Global
|
||||||
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
||||||
@ -25,6 +27,10 @@ Global
|
|||||||
{FAB7557B-86EA-405D-B49D-33AB3F4D3E33}.Debug|Win32.Build.0 = Debug|Win32
|
{FAB7557B-86EA-405D-B49D-33AB3F4D3E33}.Debug|Win32.Build.0 = Debug|Win32
|
||||||
{FAB7557B-86EA-405D-B49D-33AB3F4D3E33}.Release|Win32.ActiveCfg = Release|Win32
|
{FAB7557B-86EA-405D-B49D-33AB3F4D3E33}.Release|Win32.ActiveCfg = Release|Win32
|
||||||
{FAB7557B-86EA-405D-B49D-33AB3F4D3E33}.Release|Win32.Build.0 = Release|Win32
|
{FAB7557B-86EA-405D-B49D-33AB3F4D3E33}.Release|Win32.Build.0 = Release|Win32
|
||||||
|
{11A4B619-D97B-499F-AF17-CF9F80BF70E8}.Debug|Win32.ActiveCfg = Debug|Win32
|
||||||
|
{11A4B619-D97B-499F-AF17-CF9F80BF70E8}.Debug|Win32.Build.0 = Debug|Win32
|
||||||
|
{11A4B619-D97B-499F-AF17-CF9F80BF70E8}.Release|Win32.ActiveCfg = Release|Win32
|
||||||
|
{11A4B619-D97B-499F-AF17-CF9F80BF70E8}.Release|Win32.Build.0 = Release|Win32
|
||||||
EndGlobalSection
|
EndGlobalSection
|
||||||
GlobalSection(SolutionProperties) = preSolution
|
GlobalSection(SolutionProperties) = preSolution
|
||||||
HideSolutionNode = FALSE
|
HideSolutionNode = FALSE
|
103
os_win32/syslogevt_vc10.vcxproj
Normal file
103
os_win32/syslogevt_vc10.vcxproj
Normal file
@ -0,0 +1,103 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||||
|
<ItemGroup Label="ProjectConfigurations">
|
||||||
|
<ProjectConfiguration Include="Debug|Win32">
|
||||||
|
<Configuration>Debug</Configuration>
|
||||||
|
<Platform>Win32</Platform>
|
||||||
|
</ProjectConfiguration>
|
||||||
|
<ProjectConfiguration Include="Release|Win32">
|
||||||
|
<Configuration>Release</Configuration>
|
||||||
|
<Platform>Win32</Platform>
|
||||||
|
</ProjectConfiguration>
|
||||||
|
</ItemGroup>
|
||||||
|
<PropertyGroup Label="Globals">
|
||||||
|
<ProjectGuid>{FAB7557B-86EA-405D-B49D-33AB3F4D3E33}</ProjectGuid>
|
||||||
|
<RootNamespace>syslogevt</RootNamespace>
|
||||||
|
<Keyword>Win32Proj</Keyword>
|
||||||
|
<ProjectName>syslogevt</ProjectName>
|
||||||
|
</PropertyGroup>
|
||||||
|
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
|
||||||
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
|
||||||
|
<ConfigurationType>Application</ConfigurationType>
|
||||||
|
<CharacterSet>MultiByte</CharacterSet>
|
||||||
|
<WholeProgramOptimization>true</WholeProgramOptimization>
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
|
||||||
|
<ConfigurationType>Application</ConfigurationType>
|
||||||
|
<CharacterSet>MultiByte</CharacterSet>
|
||||||
|
</PropertyGroup>
|
||||||
|
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
|
||||||
|
<ImportGroup Label="ExtensionSettings">
|
||||||
|
</ImportGroup>
|
||||||
|
<ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="PropertySheets">
|
||||||
|
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
||||||
|
</ImportGroup>
|
||||||
|
<ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="PropertySheets">
|
||||||
|
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
||||||
|
</ImportGroup>
|
||||||
|
<PropertyGroup Label="UserMacros" />
|
||||||
|
<PropertyGroup>
|
||||||
|
<_ProjectFileVersion>10.0.30319.1</_ProjectFileVersion>
|
||||||
|
<OutDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">syslogevt_vc10.d\</OutDir>
|
||||||
|
<IntDir Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">syslogevt_vc10.d\</IntDir>
|
||||||
|
<LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</LinkIncremental>
|
||||||
|
<OutDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">.\</OutDir>
|
||||||
|
<IntDir Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">syslogevt_vc10.r\</IntDir>
|
||||||
|
<LinkIncremental Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">false</LinkIncremental>
|
||||||
|
</PropertyGroup>
|
||||||
|
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
|
||||||
|
<ClCompile>
|
||||||
|
<Optimization>Disabled</Optimization>
|
||||||
|
<PreprocessorDefinitions>_DEBUG;_CONSOLE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_DEPRECATE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||||
|
<MinimalRebuild>true</MinimalRebuild>
|
||||||
|
<BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks>
|
||||||
|
<RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
|
||||||
|
<PrecompiledHeader>
|
||||||
|
</PrecompiledHeader>
|
||||||
|
<WarningLevel>Level3</WarningLevel>
|
||||||
|
<DebugInformationFormat>EditAndContinue</DebugInformationFormat>
|
||||||
|
</ClCompile>
|
||||||
|
<Link>
|
||||||
|
<GenerateDebugInformation>true</GenerateDebugInformation>
|
||||||
|
<SubSystem>Console</SubSystem>
|
||||||
|
<TargetMachine>MachineX86</TargetMachine>
|
||||||
|
</Link>
|
||||||
|
</ItemDefinitionGroup>
|
||||||
|
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
|
||||||
|
<ClCompile>
|
||||||
|
<PreprocessorDefinitions>NDEBUG;_CONSOLE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_DEPRECATE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||||
|
<RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>
|
||||||
|
<PrecompiledHeader>
|
||||||
|
</PrecompiledHeader>
|
||||||
|
<WarningLevel>Level3</WarningLevel>
|
||||||
|
<DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
|
||||||
|
</ClCompile>
|
||||||
|
<Link>
|
||||||
|
<OutputFile>syslogevt.exe</OutputFile>
|
||||||
|
<GenerateDebugInformation>true</GenerateDebugInformation>
|
||||||
|
<ProgramDatabaseFile>$(IntDir)$(TargetName).pdb</ProgramDatabaseFile>
|
||||||
|
<SubSystem>Console</SubSystem>
|
||||||
|
<OptimizeReferences>true</OptimizeReferences>
|
||||||
|
<EnableCOMDATFolding>true</EnableCOMDATFolding>
|
||||||
|
<TargetMachine>MachineX86</TargetMachine>
|
||||||
|
</Link>
|
||||||
|
</ItemDefinitionGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<ClCompile Include="syslogevt.c" />
|
||||||
|
</ItemGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<CustomBuild Include="syslogevt.mc">
|
||||||
|
<Message Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">mc -r $(IntDir) syslogevt.mc</Message>
|
||||||
|
<Command Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">mc -r $(IntDir) syslogevt.mc
|
||||||
|
</Command>
|
||||||
|
<Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">$(IntDir)syslogevt.rc;$(IntDir)msg00001.bin;syslogevt.h;%(Outputs)</Outputs>
|
||||||
|
<Message Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">mc -r $(IntDir) syslogevt.mc</Message>
|
||||||
|
<Command Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">mc -r $(IntDir) syslogevt.mc
|
||||||
|
</Command>
|
||||||
|
<Outputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">$(IntDir)syslogevt.rc;$(IntDir)msg00001.bin;syslogevt.h;%(Outputs)</Outputs>
|
||||||
|
</CustomBuild>
|
||||||
|
</ItemGroup>
|
||||||
|
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
|
||||||
|
<ImportGroup Label="ExtensionTargets">
|
||||||
|
</ImportGroup>
|
||||||
|
</Project>
|
@ -1,205 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="Windows-1252"?>
|
|
||||||
<VisualStudioProject
|
|
||||||
ProjectType="Visual C++"
|
|
||||||
Version="8,00"
|
|
||||||
Name="syslogevt_vc8"
|
|
||||||
ProjectGUID="{FAB7557B-86EA-405D-B49D-33AB3F4D3E33}"
|
|
||||||
RootNamespace="syslogevt_vc8"
|
|
||||||
Keyword="Win32Proj"
|
|
||||||
>
|
|
||||||
<Platforms>
|
|
||||||
<Platform
|
|
||||||
Name="Win32"
|
|
||||||
/>
|
|
||||||
</Platforms>
|
|
||||||
<ToolFiles>
|
|
||||||
</ToolFiles>
|
|
||||||
<Configurations>
|
|
||||||
<Configuration
|
|
||||||
Name="Debug|Win32"
|
|
||||||
OutputDirectory="syslogevt_vc8.d"
|
|
||||||
IntermediateDirectory="syslogevt_vc8.d"
|
|
||||||
ConfigurationType="1"
|
|
||||||
CharacterSet="2"
|
|
||||||
>
|
|
||||||
<Tool
|
|
||||||
Name="VCPreBuildEventTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCCustomBuildTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCXMLDataGeneratorTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCWebServiceProxyGeneratorTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCMIDLTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCCLCompilerTool"
|
|
||||||
Optimization="0"
|
|
||||||
PreprocessorDefinitions="_DEBUG;_CONSOLE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_DEPRECATE"
|
|
||||||
MinimalRebuild="true"
|
|
||||||
BasicRuntimeChecks="3"
|
|
||||||
RuntimeLibrary="3"
|
|
||||||
UsePrecompiledHeader="0"
|
|
||||||
WarningLevel="3"
|
|
||||||
Detect64BitPortabilityProblems="true"
|
|
||||||
DebugInformationFormat="4"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCManagedResourceCompilerTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCResourceCompilerTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCPreLinkEventTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCLinkerTool"
|
|
||||||
LinkIncremental="2"
|
|
||||||
GenerateDebugInformation="true"
|
|
||||||
SubSystem="1"
|
|
||||||
TargetMachine="1"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCALinkTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCManifestTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCXDCMakeTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCBscMakeTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCFxCopTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCAppVerifierTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCWebDeploymentTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCPostBuildEventTool"
|
|
||||||
/>
|
|
||||||
</Configuration>
|
|
||||||
<Configuration
|
|
||||||
Name="Release|Win32"
|
|
||||||
OutputDirectory="syslogevt_vc8.r"
|
|
||||||
IntermediateDirectory="syslogevt_vc8.r"
|
|
||||||
ConfigurationType="1"
|
|
||||||
CharacterSet="2"
|
|
||||||
WholeProgramOptimization="1"
|
|
||||||
>
|
|
||||||
<Tool
|
|
||||||
Name="VCPreBuildEventTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCCustomBuildTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCXMLDataGeneratorTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCWebServiceProxyGeneratorTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCMIDLTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCCLCompilerTool"
|
|
||||||
PreprocessorDefinitions="NDEBUG;_CONSOLE;_CRT_SECURE_NO_DEPRECATE;_CRT_NONSTDC_NO_DEPRECATE"
|
|
||||||
RuntimeLibrary="2"
|
|
||||||
UsePrecompiledHeader="0"
|
|
||||||
WarningLevel="3"
|
|
||||||
Detect64BitPortabilityProblems="true"
|
|
||||||
DebugInformationFormat="3"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCManagedResourceCompilerTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCResourceCompilerTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCPreLinkEventTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCLinkerTool"
|
|
||||||
OutputFile="syslogevt.exe"
|
|
||||||
LinkIncremental="1"
|
|
||||||
GenerateDebugInformation="true"
|
|
||||||
ProgramDatabaseFile="$(IntDir)\$(TargetName).pdb"
|
|
||||||
SubSystem="1"
|
|
||||||
OptimizeReferences="2"
|
|
||||||
EnableCOMDATFolding="2"
|
|
||||||
TargetMachine="1"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCALinkTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCManifestTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCXDCMakeTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCBscMakeTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCFxCopTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCAppVerifierTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCWebDeploymentTool"
|
|
||||||
/>
|
|
||||||
<Tool
|
|
||||||
Name="VCPostBuildEventTool"
|
|
||||||
/>
|
|
||||||
</Configuration>
|
|
||||||
</Configurations>
|
|
||||||
<References>
|
|
||||||
</References>
|
|
||||||
<Files>
|
|
||||||
<File
|
|
||||||
RelativePath=".\syslogevt.c"
|
|
||||||
>
|
|
||||||
</File>
|
|
||||||
<File
|
|
||||||
RelativePath=".\syslogevt.mc"
|
|
||||||
>
|
|
||||||
<FileConfiguration
|
|
||||||
Name="Debug|Win32"
|
|
||||||
>
|
|
||||||
<Tool
|
|
||||||
Name="VCCustomBuildTool"
|
|
||||||
Description="mc -r $(IntDir) syslogevt.mc"
|
|
||||||
CommandLine="mc -r $(IntDir) syslogevt.mc
"
|
|
||||||
Outputs="$(IntDir)\syslogevt.rc;$(IntDir)\msg00001.bin;syslogevt.h"
|
|
||||||
/>
|
|
||||||
</FileConfiguration>
|
|
||||||
<FileConfiguration
|
|
||||||
Name="Release|Win32"
|
|
||||||
>
|
|
||||||
<Tool
|
|
||||||
Name="VCCustomBuildTool"
|
|
||||||
Description="mc -r $(IntDir) syslogevt.mc"
|
|
||||||
CommandLine="mc -r $(IntDir) syslogevt.mc
"
|
|
||||||
Outputs="$(IntDir)\syslogevt.rc;$(IntDir)\msg00001.bin;syslogevt.h"
|
|
||||||
/>
|
|
||||||
</FileConfiguration>
|
|
||||||
</File>
|
|
||||||
</Files>
|
|
||||||
<Globals>
|
|
||||||
</Globals>
|
|
||||||
</VisualStudioProject>
|
|
@ -13,7 +13,7 @@
|
|||||||
; You should have received a copy of the GNU General Public License
|
; You should have received a copy of the GNU General Public License
|
||||||
; (for example COPYING); If not, see <http://www.gnu.org/licenses/>.
|
; (for example COPYING); If not, see <http://www.gnu.org/licenses/>.
|
||||||
;
|
;
|
||||||
; $Id: update-smart-drivedb.nsi 3296 2011-03-16 22:17:51Z chrfranke $
|
; $Id: update-smart-drivedb.nsi 3392 2011-06-29 19:13:22Z chrfranke $
|
||||||
;
|
;
|
||||||
|
|
||||||
|
|
||||||
@ -49,7 +49,7 @@ Section ""
|
|||||||
Push $0
|
Push $0
|
||||||
Call Download
|
Call Download
|
||||||
IfErrors 0 endload
|
IfErrors 0 endload
|
||||||
MessageBox MB_OK "Download failed"
|
MessageBox MB_OK "Download failed" /SD IDOK
|
||||||
Abort "Download failed"
|
Abort "Download failed"
|
||||||
endload:
|
endload:
|
||||||
|
|
||||||
@ -59,7 +59,7 @@ Section ""
|
|||||||
ExecWait '.\smartctl-nc.exe -B drivedb.h.new -P showall' $1
|
ExecWait '.\smartctl-nc.exe -B drivedb.h.new -P showall' $1
|
||||||
StrCmp $1 "0" endsyntax
|
StrCmp $1 "0" endsyntax
|
||||||
Rename "drivedb.h.new" "drivedb.h.error"
|
Rename "drivedb.h.new" "drivedb.h.error"
|
||||||
MessageBox MB_OK "drivedb.h.error: rejected by smartctl, probably no longer compatible"
|
MessageBox MB_OK "drivedb.h.error: rejected by smartctl, probably no longer compatible" /SD IDOK
|
||||||
Abort "drivedb.h.error: rejected by smartctl, probably no longer compatible"
|
Abort "drivedb.h.error: rejected by smartctl, probably no longer compatible"
|
||||||
endsyntax:
|
endsyntax:
|
||||||
|
|
||||||
@ -69,7 +69,7 @@ Section ""
|
|||||||
Call Cmp
|
Call Cmp
|
||||||
IfErrors changed 0
|
IfErrors changed 0
|
||||||
DetailPrint "drivedb.h is already up to date"
|
DetailPrint "drivedb.h is already up to date"
|
||||||
MessageBox MB_OK "$INSTDIR\drivedb.h is already up to date"
|
MessageBox MB_OK "$INSTDIR\drivedb.h is already up to date" /SD IDOK
|
||||||
Delete "drivedb.h.new"
|
Delete "drivedb.h.new"
|
||||||
DetailPrint "Create file: drivedb.h.lastcheck"
|
DetailPrint "Create file: drivedb.h.lastcheck"
|
||||||
FileOpen $1 "drivedb.h.lastcheck" w
|
FileOpen $1 "drivedb.h.lastcheck" w
|
||||||
@ -81,7 +81,7 @@ Section ""
|
|||||||
|
|
||||||
endcomp:
|
endcomp:
|
||||||
Rename "drivedb.h.new" "drivedb.h"
|
Rename "drivedb.h.new" "drivedb.h"
|
||||||
MessageBox MB_OK "$INSTDIR\drivedb.h updated from $0"
|
MessageBox MB_OK "$INSTDIR\drivedb.h updated from $0" /SD IDOK
|
||||||
|
|
||||||
SectionEnd
|
SectionEnd
|
||||||
|
|
||||||
@ -124,18 +124,18 @@ FunctionEnd
|
|||||||
; Compare drivedb.h drivedb.h.new, SetErrors if different
|
; Compare drivedb.h drivedb.h.new, SetErrors if different
|
||||||
; TODO: ignore differences in Id string
|
; TODO: ignore differences in Id string
|
||||||
Function Cmp
|
Function Cmp
|
||||||
ClearErrors
|
ClearErrors
|
||||||
FileOpen $R0 "drivedb.h" r
|
FileOpen $R0 "drivedb.h" r
|
||||||
FileOpen $R1 "drivedb.h.new" r
|
FileOpen $R1 "drivedb.h.new" r
|
||||||
readloop:
|
readloop:
|
||||||
FileRead $R0 $R2
|
FileRead $R0 $R2
|
||||||
FileRead $R1 $R3
|
FileRead $R1 $R3
|
||||||
StrCmp $R2 $R3 0 +2
|
|
||||||
IfErrors 0 readloop
|
|
||||||
FileClose $R0
|
|
||||||
FileClose $R1
|
|
||||||
ClearErrors
|
|
||||||
StrCmp $R2 $R3 0 +2
|
StrCmp $R2 $R3 0 +2
|
||||||
Return
|
IfErrors 0 readloop
|
||||||
SetErrors
|
FileClose $R0
|
||||||
|
FileClose $R1
|
||||||
|
ClearErrors
|
||||||
|
StrCmp $R2 $R3 0 +2
|
||||||
|
Return
|
||||||
|
SetErrors
|
||||||
FunctionEnd
|
FunctionEnd
|
||||||
|
@ -18,7 +18,7 @@
|
|||||||
#ifndef WMIQUERY_H
|
#ifndef WMIQUERY_H
|
||||||
#define WMIQUERY_H
|
#define WMIQUERY_H
|
||||||
|
|
||||||
#define WMIQUERY_H_CVSID "$Id: wmiquery.h 3243 2011-01-19 20:03:47Z chrfranke $"
|
#define WMIQUERY_H_CVSID "$Id: wmiquery.h 3475 2011-11-10 21:43:40Z chrfranke $"
|
||||||
|
|
||||||
#ifdef HAVE_WBEMCLI_H
|
#ifdef HAVE_WBEMCLI_H
|
||||||
#include <wbemcli.h>
|
#include <wbemcli.h>
|
||||||
@ -28,8 +28,13 @@
|
|||||||
|
|
||||||
#include <string>
|
#include <string>
|
||||||
|
|
||||||
#if !defined(__GNUC__) && !defined(__attribute__)
|
#ifndef __GNUC__
|
||||||
#define __attribute__(x) /**/
|
#define __attribute_format_printf(x, y) /**/
|
||||||
|
#elif defined(__MINGW32__) && __USE_MINGW_ANSI_STDIO
|
||||||
|
// Check format of __mingw_*printf() instead of MSVCRT.DLL:*printf()
|
||||||
|
#define __attribute_format_printf(x, y) __attribute__((format (gnu_printf, x, y)))
|
||||||
|
#else
|
||||||
|
#define __attribute_format_printf(x, y) __attribute__((format (printf, x, y)))
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/////////////////////////////////////////////////////////////////////////////
|
/////////////////////////////////////////////////////////////////////////////
|
||||||
@ -171,11 +176,11 @@ public:
|
|||||||
|
|
||||||
/// Version of vquery() with printf() formatting.
|
/// Version of vquery() with printf() formatting.
|
||||||
bool query(wbem_enumerator & result, const char * qstr, ...) /*const*/
|
bool query(wbem_enumerator & result, const char * qstr, ...) /*const*/
|
||||||
__attribute__ ((format (printf, 3, 4)));
|
__attribute_format_printf(3, 4);
|
||||||
|
|
||||||
/// Version of vquery1() with printf() formatting.
|
/// Version of vquery1() with printf() formatting.
|
||||||
bool query1(wbem_object & obj, const char * qstr, ...) /*const*/
|
bool query1(wbem_object & obj, const char * qstr, ...) /*const*/
|
||||||
__attribute__ ((format (printf, 3, 4)));
|
__attribute_format_printf(3, 4);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
com_intf_ptr<IWbemServices> m_intf;
|
com_intf_ptr<IWbemServices> m_intf;
|
||||||
|
94
scsiata.cpp
94
scsiata.cpp
@ -3,8 +3,8 @@
|
|||||||
*
|
*
|
||||||
* Home page of code is: http://smartmontools.sourceforge.net
|
* Home page of code is: http://smartmontools.sourceforge.net
|
||||||
*
|
*
|
||||||
* Copyright (C) 2006-10 Douglas Gilbert <dgilbert@interlog.com>
|
* Copyright (C) 2006-12 Douglas Gilbert <dgilbert@interlog.com>
|
||||||
* Copyright (C) 2009-10 Christian Franke <smartmontools-support@lists.sourceforge.net>
|
* Copyright (C) 2009-12 Christian Franke <smartmontools-support@lists.sourceforge.net>
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or modify
|
* 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
|
* it under the terms of the GNU General Public License as published by
|
||||||
@ -62,7 +62,7 @@
|
|||||||
#include "dev_ata_cmd_set.h" // ata_device_with_command_set
|
#include "dev_ata_cmd_set.h" // ata_device_with_command_set
|
||||||
#include "dev_tunnelled.h" // tunnelled_device<>
|
#include "dev_tunnelled.h" // tunnelled_device<>
|
||||||
|
|
||||||
const char * scsiata_cpp_cvsid = "$Id: scsiata.cpp 3258 2011-02-14 22:31:01Z manfred99 $";
|
const char * scsiata_cpp_cvsid = "$Id: scsiata.cpp 3519 2012-03-06 20:01:44Z chrfranke $";
|
||||||
|
|
||||||
/* This is a slightly stretched SCSI sense "descriptor" format header.
|
/* This is a slightly stretched SCSI sense "descriptor" format header.
|
||||||
The addition is to allow the 0x70 and 0x71 response codes. The idea
|
The addition is to allow the 0x70 and 0x71 response codes. The idea
|
||||||
@ -114,28 +114,42 @@ class sat_device
|
|||||||
: public tunnelled_device<
|
: public tunnelled_device<
|
||||||
/*implements*/ ata_device
|
/*implements*/ ata_device
|
||||||
/*by tunnelling through a*/, scsi_device
|
/*by tunnelling through a*/, scsi_device
|
||||||
>
|
>,
|
||||||
|
virtual public /*implements*/ scsi_device
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
sat_device(smart_interface * intf, scsi_device * scsidev,
|
sat_device(smart_interface * intf, scsi_device * scsidev,
|
||||||
const char * req_type, int passthrulen = 0);
|
const char * req_type, int passthrulen = 0, bool enable_auto = false);
|
||||||
|
|
||||||
virtual ~sat_device() throw();
|
virtual ~sat_device() throw();
|
||||||
|
|
||||||
|
virtual smart_device * autodetect_open();
|
||||||
|
|
||||||
virtual bool ata_pass_through(const ata_cmd_in & in, ata_cmd_out & out);
|
virtual bool ata_pass_through(const ata_cmd_in & in, ata_cmd_out & out);
|
||||||
|
|
||||||
|
virtual bool scsi_pass_through(scsi_cmnd_io * iop);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
int m_passthrulen;
|
int m_passthrulen;
|
||||||
|
bool m_enable_auto;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
sat_device::sat_device(smart_interface * intf, scsi_device * scsidev,
|
sat_device::sat_device(smart_interface * intf, scsi_device * scsidev,
|
||||||
const char * req_type, int passthrulen /*= 0*/)
|
const char * req_type, int passthrulen /* = 0 */, bool enable_auto /* = false */)
|
||||||
: smart_device(intf, scsidev->get_dev_name(), "sat", req_type),
|
: smart_device(intf, scsidev->get_dev_name(),
|
||||||
|
(enable_auto ? "sat,auto" : "sat"), req_type),
|
||||||
tunnelled_device<ata_device, scsi_device>(scsidev),
|
tunnelled_device<ata_device, scsi_device>(scsidev),
|
||||||
m_passthrulen(passthrulen)
|
m_passthrulen(passthrulen),
|
||||||
|
m_enable_auto(enable_auto)
|
||||||
{
|
{
|
||||||
set_info().info_name = strprintf("%s [SAT]", scsidev->get_info_name());
|
if (enable_auto)
|
||||||
|
hide_ata(); // Start as SCSI, switch to ATA in autodetect_open()
|
||||||
|
else
|
||||||
|
hide_scsi(); // ATA always
|
||||||
|
|
||||||
|
set_info().info_name = strprintf("%s [%sSAT]", scsidev->get_info_name(),
|
||||||
|
(enable_auto ? "SCSI/" : ""));
|
||||||
}
|
}
|
||||||
|
|
||||||
sat_device::~sat_device() throw()
|
sat_device::~sat_device() throw()
|
||||||
@ -421,6 +435,45 @@ bool sat_device::ata_pass_through(const ata_cmd_in & in, ata_cmd_out & out)
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool sat_device::scsi_pass_through(scsi_cmnd_io * iop)
|
||||||
|
{
|
||||||
|
scsi_device * scsidev = get_tunnel_dev();
|
||||||
|
if (!scsidev->scsi_pass_through(iop)) {
|
||||||
|
set_err(scsidev->get_err());
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
smart_device * sat_device::autodetect_open()
|
||||||
|
{
|
||||||
|
if (!open() || !m_enable_auto)
|
||||||
|
return this;
|
||||||
|
|
||||||
|
scsi_device * scsidev = get_tunnel_dev();
|
||||||
|
|
||||||
|
unsigned char inqdata[36] = {0, };
|
||||||
|
if (scsiStdInquiry(scsidev, inqdata, sizeof(inqdata))) {
|
||||||
|
smart_device::error_info err = scsidev->get_err();
|
||||||
|
close();
|
||||||
|
set_err(err.no, "INQUIRY [SAT]: %s", err.msg.c_str());
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Check for SAT "VENDOR"
|
||||||
|
int inqsize = inqdata[4] + 5;
|
||||||
|
bool sat = (inqsize >= 36 && !memcmp(inqdata + 8, "ATA ", 8));
|
||||||
|
|
||||||
|
// Change interface
|
||||||
|
hide_ata(!sat);
|
||||||
|
hide_scsi(sat);
|
||||||
|
|
||||||
|
set_info().dev_type = (sat ? "sat" : scsidev->get_dev_type());
|
||||||
|
set_info().info_name = strprintf("%s [%s]", scsidev->get_info_name(),
|
||||||
|
(sat ? "SAT" : "SCSI"));
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
} // namespace
|
} // namespace
|
||||||
|
|
||||||
/////////////////////////////////////////////////////////////////////////////
|
/////////////////////////////////////////////////////////////////////////////
|
||||||
@ -590,7 +643,6 @@ int usbcypress_device::ata_command_interface(smart_command_set command, int sele
|
|||||||
int copydata = 0;
|
int copydata = 0;
|
||||||
int outlen = 0;
|
int outlen = 0;
|
||||||
int ck_cond = 0; /* set to 1 to read register(s) back */
|
int ck_cond = 0; /* set to 1 to read register(s) back */
|
||||||
int protocol = 3; /* non-data */
|
|
||||||
int t_dir = 1; /* 0 -> to device, 1 -> from device */
|
int t_dir = 1; /* 0 -> to device, 1 -> from device */
|
||||||
int byte_block = 1; /* 0 -> bytes, 1 -> 512 byte blocks */
|
int byte_block = 1; /* 0 -> bytes, 1 -> 512 byte blocks */
|
||||||
int t_length = 0; /* 0 -> no data transferred */
|
int t_length = 0; /* 0 -> no data transferred */
|
||||||
@ -615,7 +667,6 @@ int usbcypress_device::ata_command_interface(smart_command_set command, int sele
|
|||||||
case READ_VALUES: /* READ DATA */
|
case READ_VALUES: /* READ DATA */
|
||||||
feature = ATA_SMART_READ_VALUES;
|
feature = ATA_SMART_READ_VALUES;
|
||||||
sector_count = 1; /* one (512 byte) block */
|
sector_count = 1; /* one (512 byte) block */
|
||||||
protocol = 4; /* PIO data-in */
|
|
||||||
t_length = 2; /* sector count holds count */
|
t_length = 2; /* sector count holds count */
|
||||||
copydata = 512;
|
copydata = 512;
|
||||||
break;
|
break;
|
||||||
@ -623,7 +674,6 @@ int usbcypress_device::ata_command_interface(smart_command_set command, int sele
|
|||||||
feature = ATA_SMART_READ_THRESHOLDS;
|
feature = ATA_SMART_READ_THRESHOLDS;
|
||||||
sector_count = 1; /* one (512 byte) block */
|
sector_count = 1; /* one (512 byte) block */
|
||||||
lba_low = 1;
|
lba_low = 1;
|
||||||
protocol = 4; /* PIO data-in */
|
|
||||||
t_length = 2; /* sector count holds count */
|
t_length = 2; /* sector count holds count */
|
||||||
copydata=512;
|
copydata=512;
|
||||||
break;
|
break;
|
||||||
@ -631,7 +681,6 @@ int usbcypress_device::ata_command_interface(smart_command_set command, int sele
|
|||||||
feature = ATA_SMART_READ_LOG_SECTOR;
|
feature = ATA_SMART_READ_LOG_SECTOR;
|
||||||
sector_count = 1; /* one (512 byte) block */
|
sector_count = 1; /* one (512 byte) block */
|
||||||
lba_low = select;
|
lba_low = select;
|
||||||
protocol = 4; /* PIO data-in */
|
|
||||||
t_length = 2; /* sector count holds count */
|
t_length = 2; /* sector count holds count */
|
||||||
copydata = 512;
|
copydata = 512;
|
||||||
break;
|
break;
|
||||||
@ -639,7 +688,6 @@ int usbcypress_device::ata_command_interface(smart_command_set command, int sele
|
|||||||
feature = ATA_SMART_WRITE_LOG_SECTOR;
|
feature = ATA_SMART_WRITE_LOG_SECTOR;
|
||||||
sector_count = 1; /* one (512 byte) block */
|
sector_count = 1; /* one (512 byte) block */
|
||||||
lba_low = select;
|
lba_low = select;
|
||||||
protocol = 5; /* PIO data-out */
|
|
||||||
t_length = 2; /* sector count holds count */
|
t_length = 2; /* sector count holds count */
|
||||||
t_dir = 0; /* to device */
|
t_dir = 0; /* to device */
|
||||||
outlen = 512;
|
outlen = 512;
|
||||||
@ -647,14 +695,12 @@ int usbcypress_device::ata_command_interface(smart_command_set command, int sele
|
|||||||
case IDENTIFY:
|
case IDENTIFY:
|
||||||
ata_command = ATA_IDENTIFY_DEVICE;
|
ata_command = ATA_IDENTIFY_DEVICE;
|
||||||
sector_count = 1; /* one (512 byte) block */
|
sector_count = 1; /* one (512 byte) block */
|
||||||
protocol = 4; /* PIO data-in */
|
|
||||||
t_length = 2; /* sector count holds count */
|
t_length = 2; /* sector count holds count */
|
||||||
copydata = 512;
|
copydata = 512;
|
||||||
break;
|
break;
|
||||||
case PIDENTIFY:
|
case PIDENTIFY:
|
||||||
ata_command = ATA_IDENTIFY_PACKET_DEVICE;
|
ata_command = ATA_IDENTIFY_PACKET_DEVICE;
|
||||||
sector_count = 1; /* one (512 byte) block */
|
sector_count = 1; /* one (512 byte) block */
|
||||||
protocol = 4; /* PIO data-in */
|
|
||||||
t_length = 2; /* sector count (7:0) holds count */
|
t_length = 2; /* sector count (7:0) holds count */
|
||||||
copydata = 512;
|
copydata = 512;
|
||||||
break;
|
break;
|
||||||
@ -1251,13 +1297,19 @@ using namespace sat;
|
|||||||
ata_device * smart_interface::get_sat_device(const char * type, scsi_device * scsidev)
|
ata_device * smart_interface::get_sat_device(const char * type, scsi_device * scsidev)
|
||||||
{
|
{
|
||||||
if (!strncmp(type, "sat", 3)) {
|
if (!strncmp(type, "sat", 3)) {
|
||||||
int ptlen = 0, n1 = -1, n2 = -1;
|
const char * t = type + 3;
|
||||||
if (!(((sscanf(type, "sat%n,%d%n", &n1, &ptlen, &n2) == 1 && n2 == (int)strlen(type)) || n1 == (int)strlen(type))
|
bool enable_auto = false;
|
||||||
&& (ptlen == 0 || ptlen == 12 || ptlen == 16))) {
|
if (!strncmp(t, ",auto", 5)) {
|
||||||
set_err(EINVAL, "Option '-d sat,<n>' requires <n> to be 0, 12 or 16");
|
t += 5;
|
||||||
|
enable_auto = true;
|
||||||
|
}
|
||||||
|
int ptlen = 0, n = -1;
|
||||||
|
if (*t && !(sscanf(t, ",%d%n", &ptlen, &n) == 1 && n == (int)strlen(t)
|
||||||
|
&& (ptlen == 0 || ptlen == 12 || ptlen == 16))) {
|
||||||
|
set_err(EINVAL, "Option '-d sat[,auto][,N]' requires N to be 0, 12 or 16");
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
return new sat_device(this, scsidev, type, ptlen);
|
return new sat_device(this, scsidev, type, ptlen, enable_auto);
|
||||||
}
|
}
|
||||||
|
|
||||||
else if (!strncmp(type, "usbcypress", 10)) {
|
else if (!strncmp(type, "usbcypress", 10)) {
|
||||||
|
@ -7,7 +7,7 @@
|
|||||||
* Copyright (C) 2000 Michael Cornwell <cornwell@acm.org>
|
* Copyright (C) 2000 Michael Cornwell <cornwell@acm.org>
|
||||||
*
|
*
|
||||||
* Additional SCSI work:
|
* Additional SCSI work:
|
||||||
* Copyright (C) 2003-10 Douglas Gilbert <dgilbert@interlog.com>
|
* Copyright (C) 2003-11 Douglas Gilbert <dgilbert@interlog.com>
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or modify
|
* 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
|
* it under the terms of the GNU General Public License as published by
|
||||||
@ -32,7 +32,7 @@
|
|||||||
#ifndef SCSICMDS_H_
|
#ifndef SCSICMDS_H_
|
||||||
#define SCSICMDS_H_
|
#define SCSICMDS_H_
|
||||||
|
|
||||||
#define SCSICMDS_H_CVSID "$Id: scsicmds.h 3302 2011-03-25 23:04:36Z dpgilbert $\n"
|
#define SCSICMDS_H_CVSID "$Id: scsicmds.h 3413 2011-09-06 21:23:00Z dpgilbert $\n"
|
||||||
|
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
@ -183,11 +183,14 @@ struct scsiNonMediumError {
|
|||||||
#define NON_MEDIUM_ERROR_LPAGE 0x06
|
#define NON_MEDIUM_ERROR_LPAGE 0x06
|
||||||
#define LAST_N_ERROR_LPAGE 0x07
|
#define LAST_N_ERROR_LPAGE 0x07
|
||||||
#define FORMAT_STATUS_LPAGE 0x08
|
#define FORMAT_STATUS_LPAGE 0x08
|
||||||
|
#define LB_PROV_LPAGE 0x0c /* SBC-3 */
|
||||||
#define TEMPERATURE_LPAGE 0x0d
|
#define TEMPERATURE_LPAGE 0x0d
|
||||||
#define STARTSTOP_CYCLE_COUNTER_LPAGE 0x0e
|
#define STARTSTOP_CYCLE_COUNTER_LPAGE 0x0e
|
||||||
#define APPLICATION_CLIENT_LPAGE 0x0f
|
#define APPLICATION_CLIENT_LPAGE 0x0f
|
||||||
#define SELFTEST_RESULTS_LPAGE 0x10
|
#define SELFTEST_RESULTS_LPAGE 0x10
|
||||||
|
#define SS_MEDIA_LPAGE 0x11 /* SBC-3 */
|
||||||
#define BACKGROUND_RESULTS_LPAGE 0x15 /* SBC-3 */
|
#define BACKGROUND_RESULTS_LPAGE 0x15 /* SBC-3 */
|
||||||
|
#define NONVOL_CACHE_LPAGE 0x17 /* SBC-3 */
|
||||||
#define PROTOCOL_SPECIFIC_LPAGE 0x18
|
#define PROTOCOL_SPECIFIC_LPAGE 0x18
|
||||||
#define IE_LPAGE 0x2f
|
#define IE_LPAGE 0x2f
|
||||||
|
|
||||||
|
@ -42,7 +42,7 @@
|
|||||||
|
|
||||||
#define GBUF_SIZE 65535
|
#define GBUF_SIZE 65535
|
||||||
|
|
||||||
const char * scsiprint_c_cvsid = "$Id: scsiprint.cpp 3307 2011-03-31 14:54:58Z dpgilbert $"
|
const char * scsiprint_c_cvsid = "$Id: scsiprint.cpp 3441 2011-10-12 17:22:15Z chrfranke $"
|
||||||
SCSIPRINT_H_CVSID;
|
SCSIPRINT_H_CVSID;
|
||||||
|
|
||||||
|
|
||||||
@ -64,6 +64,9 @@ static int gLastNErrorLPage = 0;
|
|||||||
static int gBackgroundResultsLPage = 0;
|
static int gBackgroundResultsLPage = 0;
|
||||||
static int gProtocolSpecificLPage = 0;
|
static int gProtocolSpecificLPage = 0;
|
||||||
static int gTapeAlertsLPage = 0;
|
static int gTapeAlertsLPage = 0;
|
||||||
|
static int gSSMediaLPage = 0;
|
||||||
|
|
||||||
|
/* Vendor specific log pages */
|
||||||
static int gSeagateCacheLPage = 0;
|
static int gSeagateCacheLPage = 0;
|
||||||
static int gSeagateFactoryLPage = 0;
|
static int gSeagateFactoryLPage = 0;
|
||||||
|
|
||||||
@ -124,6 +127,9 @@ static void scsiGetSupportedLogPages(scsi_device * device)
|
|||||||
case TAPE_ALERTS_LPAGE:
|
case TAPE_ALERTS_LPAGE:
|
||||||
gTapeAlertsLPage = 1;
|
gTapeAlertsLPage = 1;
|
||||||
break;
|
break;
|
||||||
|
case SS_MEDIA_LPAGE:
|
||||||
|
gSSMediaLPage = 1;
|
||||||
|
break;
|
||||||
case SEAGATE_CACHE_LPAGE:
|
case SEAGATE_CACHE_LPAGE:
|
||||||
gSeagateCacheLPage = 1;
|
gSeagateCacheLPage = 1;
|
||||||
break;
|
break;
|
||||||
@ -517,7 +523,7 @@ static void scsiPrintSeagateFactoryLPage(scsi_device * device)
|
|||||||
ull |= xp[j];
|
ull |= xp[j];
|
||||||
}
|
}
|
||||||
if (0 == pc)
|
if (0 == pc)
|
||||||
pout(" = %.2f\n", uint64_to_double(ull) / 60.0 );
|
pout(" = %.2f\n", ull / 60.0 );
|
||||||
else
|
else
|
||||||
pout(" = %"PRIu64"\n", ull);
|
pout(" = %"PRIu64"\n", ull);
|
||||||
}
|
}
|
||||||
@ -571,7 +577,7 @@ static void scsiPrintErrorCounterLog(scsi_device * device)
|
|||||||
pout("%s%8"PRIu64" %8"PRIu64" %8"PRIu64" %8"PRIu64" %8"PRIu64,
|
pout("%s%8"PRIu64" %8"PRIu64" %8"PRIu64" %8"PRIu64" %8"PRIu64,
|
||||||
pageNames[k], ecp->counter[0], ecp->counter[1],
|
pageNames[k], ecp->counter[0], ecp->counter[1],
|
||||||
ecp->counter[2], ecp->counter[3], ecp->counter[4]);
|
ecp->counter[2], ecp->counter[3], ecp->counter[4]);
|
||||||
processed_gb = uint64_to_double(ecp->counter[5]) / 1000000000.0;
|
processed_gb = ecp->counter[5] / 1000000000.0;
|
||||||
pout(" %12.3f %8"PRIu64"\n", processed_gb, ecp->counter[6]);
|
pout(" %12.3f %8"PRIu64"\n", processed_gb, ecp->counter[6]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -942,6 +948,63 @@ static int scsiPrintBackgroundResults(scsi_device * device)
|
|||||||
return retval;
|
return retval;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// See SCSI Block Commands - 3 (SBC-3) rev 27 (draft) section 6.3.6 .
|
||||||
|
// Returns 0 if ok else FAIL* bitmask. Note can have a status entry
|
||||||
|
// and up to 2048 events (although would hope to have less). May set
|
||||||
|
// FAILLOG if serious errors detected (in the future).
|
||||||
|
static int scsiPrintSSMedia(scsi_device * device)
|
||||||
|
{
|
||||||
|
int num, err, pc, pl, truncated;
|
||||||
|
int retval = 0;
|
||||||
|
UINT8 * ucp;
|
||||||
|
|
||||||
|
if ((err = scsiLogSense(device, SS_MEDIA_LPAGE, 0, gBuf,
|
||||||
|
LOG_RESP_LONG_LEN, 0))) {
|
||||||
|
print_on();
|
||||||
|
pout("scsiPrintSSMedia Failed [%s]\n", scsiErrString(err));
|
||||||
|
print_off();
|
||||||
|
return FAILSMART;
|
||||||
|
}
|
||||||
|
if ((gBuf[0] & 0x3f) != SS_MEDIA_LPAGE) {
|
||||||
|
print_on();
|
||||||
|
pout("Solid state media Log Sense Failed, page mismatch\n");
|
||||||
|
print_off();
|
||||||
|
return FAILSMART;
|
||||||
|
}
|
||||||
|
// compute page length
|
||||||
|
num = (gBuf[2] << 8) + gBuf[3] + 4;
|
||||||
|
if (num < 12) {
|
||||||
|
print_on();
|
||||||
|
pout("Solid state media Log Sense length is %d, too short\n", num);
|
||||||
|
print_off();
|
||||||
|
return FAILSMART;
|
||||||
|
}
|
||||||
|
truncated = (num > LOG_RESP_LONG_LEN) ? num : 0;
|
||||||
|
if (truncated)
|
||||||
|
num = LOG_RESP_LONG_LEN;
|
||||||
|
ucp = gBuf + 4;
|
||||||
|
num -= 4;
|
||||||
|
while (num > 3) {
|
||||||
|
pc = (ucp[0] << 8) | ucp[1];
|
||||||
|
// pcb = ucp[2];
|
||||||
|
pl = ucp[3] + 4;
|
||||||
|
switch (pc) {
|
||||||
|
case 1:
|
||||||
|
if (pl < 8) {
|
||||||
|
print_on();
|
||||||
|
pout("Percentage used endurance indicator too short (pl=%d)\n", pl);
|
||||||
|
print_off();
|
||||||
|
return FAILSMART;
|
||||||
|
}
|
||||||
|
pout("SS Media used endurance indicator: %d%%\n", ucp[7]);
|
||||||
|
default: /* ignore other parameter codes */
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
num -= pl;
|
||||||
|
ucp += pl;
|
||||||
|
}
|
||||||
|
return retval;
|
||||||
|
}
|
||||||
|
|
||||||
static void show_sas_phy_event_info(int peis, unsigned int val,
|
static void show_sas_phy_event_info(int peis, unsigned int val,
|
||||||
unsigned thresh_val)
|
unsigned thresh_val)
|
||||||
@ -1076,14 +1139,14 @@ static void show_sas_phy_event_info(int peis, unsigned int val,
|
|||||||
|
|
||||||
static void show_sas_port_param(unsigned char * ucp, int param_len)
|
static void show_sas_port_param(unsigned char * ucp, int param_len)
|
||||||
{
|
{
|
||||||
int j, m, n, nphys, pcb, t, sz, spld_len;
|
int j, m, n, nphys, t, sz, spld_len;
|
||||||
unsigned char * vcp;
|
unsigned char * vcp;
|
||||||
uint64_t ull;
|
uint64_t ull;
|
||||||
unsigned int ui;
|
unsigned int ui;
|
||||||
char s[64];
|
char s[64];
|
||||||
|
|
||||||
sz = sizeof(s);
|
sz = sizeof(s);
|
||||||
pcb = ucp[2];
|
// pcb = ucp[2];
|
||||||
t = (ucp[0] << 8) | ucp[1];
|
t = (ucp[0] << 8) | ucp[1];
|
||||||
pout("relative target port id = %d\n", t);
|
pout("relative target port id = %d\n", t);
|
||||||
pout(" generation code = %d\n", ucp[6]);
|
pout(" generation code = %d\n", ucp[6]);
|
||||||
@ -1649,6 +1712,16 @@ int scsiPrintMain(scsi_device * device, const scsi_print_options & options)
|
|||||||
}
|
}
|
||||||
any_output = true;
|
any_output = true;
|
||||||
}
|
}
|
||||||
|
if (options.smart_ss_media_log) {
|
||||||
|
if (! checkedSupportedLogPages)
|
||||||
|
scsiGetSupportedLogPages(device);
|
||||||
|
res = 0;
|
||||||
|
if (gSSMediaLPage)
|
||||||
|
res = scsiPrintSSMedia(device);
|
||||||
|
if (0 != res)
|
||||||
|
failuretest(OPTIONAL_CMD, returnval|=res);
|
||||||
|
any_output = true;
|
||||||
|
}
|
||||||
if (options.smart_vendor_attrib) {
|
if (options.smart_vendor_attrib) {
|
||||||
if (! checkedSupportedLogPages)
|
if (! checkedSupportedLogPages)
|
||||||
scsiGetSupportedLogPages(device);
|
scsiGetSupportedLogPages(device);
|
||||||
|
@ -29,7 +29,7 @@
|
|||||||
#ifndef SCSI_PRINT_H_
|
#ifndef SCSI_PRINT_H_
|
||||||
#define SCSI_PRINT_H_
|
#define SCSI_PRINT_H_
|
||||||
|
|
||||||
#define SCSIPRINT_H_CVSID "$Id: scsiprint.h 3196 2010-10-28 21:31:49Z chrfranke $\n"
|
#define SCSIPRINT_H_CVSID "$Id: scsiprint.h 3413 2011-09-06 21:23:00Z dpgilbert $\n"
|
||||||
|
|
||||||
// Options for scsiPrintMain
|
// Options for scsiPrintMain
|
||||||
struct scsi_print_options
|
struct scsi_print_options
|
||||||
@ -40,6 +40,7 @@ struct scsi_print_options
|
|||||||
bool smart_error_log;
|
bool smart_error_log;
|
||||||
bool smart_selftest_log;
|
bool smart_selftest_log;
|
||||||
bool smart_background_log;
|
bool smart_background_log;
|
||||||
|
bool smart_ss_media_log;
|
||||||
|
|
||||||
bool smart_disable, smart_enable;
|
bool smart_disable, smart_enable;
|
||||||
bool smart_auto_save_disable, smart_auto_save_enable;
|
bool smart_auto_save_disable, smart_auto_save_enable;
|
||||||
@ -58,6 +59,7 @@ struct scsi_print_options
|
|||||||
smart_error_log(false),
|
smart_error_log(false),
|
||||||
smart_selftest_log(false),
|
smart_selftest_log(false),
|
||||||
smart_background_log(false),
|
smart_background_log(false),
|
||||||
|
smart_ss_media_log(false),
|
||||||
smart_disable(false), smart_enable(false),
|
smart_disable(false), smart_enable(false),
|
||||||
smart_auto_save_disable(false), smart_auto_save_enable(false),
|
smart_auto_save_disable(false), smart_auto_save_enable(false),
|
||||||
smart_default_selftest(false),
|
smart_default_selftest(false),
|
||||||
|
275
smartctl.8.in
275
smartctl.8.in
@ -1,7 +1,7 @@
|
|||||||
.ig
|
.ig
|
||||||
Copyright (C) 2002-10 Bruce Allen <smartmontools-support@lists.sourceforge.net>
|
Copyright (C) 2002-10 Bruce Allen <smartmontools-support@lists.sourceforge.net>
|
||||||
|
|
||||||
$Id: smartctl.8.in 3320 2011-04-30 20:44:55Z chrfranke $
|
$Id: smartctl.8.in 3519 2012-03-06 20:01:44Z chrfranke $
|
||||||
|
|
||||||
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
|
||||||
@ -25,13 +25,20 @@
|
|||||||
.SH SYNOPSIS
|
.SH SYNOPSIS
|
||||||
.B smartctl [options] device
|
.B smartctl [options] device
|
||||||
|
|
||||||
|
.\" %IF NOT OS Windows
|
||||||
.SH FULL PATH
|
.SH FULL PATH
|
||||||
.B /usr/local/sbin/smartctl
|
.B /usr/local/sbin/smartctl
|
||||||
|
|
||||||
|
.\" %ENDIF NOT OS Windows
|
||||||
.SH PACKAGE VERSION
|
.SH PACKAGE VERSION
|
||||||
CURRENT_SVN_VERSION CURRENT_SVN_DATE CURRENT_SVN_REV
|
CURRENT_SVN_VERSION CURRENT_SVN_DATE CURRENT_SVN_REV
|
||||||
|
|
||||||
.SH DESCRIPTION
|
.SH DESCRIPTION
|
||||||
|
.\" %IF NOT OS ALL
|
||||||
|
.\"! [This man page is generated for the OS_MAN_FILTER version of smartmontools.
|
||||||
|
.\"! It does not contain info specific to other platforms.]
|
||||||
|
.\"! .PP
|
||||||
|
.\" %ENDIF NOT OS ALL
|
||||||
\fBsmartctl\fP controls the Self\-Monitoring, Analysis and Reporting
|
\fBsmartctl\fP controls the Self\-Monitoring, Analysis and Reporting
|
||||||
Technology (SMART) system built into many ATA\-3 and later ATA, IDE and
|
Technology (SMART) system built into many ATA\-3 and later ATA, IDE and
|
||||||
SCSI\-3 hard drives. The purpose of SMART is to monitor the reliability
|
SCSI\-3 hard drives. The purpose of SMART is to monitor the reliability
|
||||||
@ -58,6 +65,7 @@ the final argument to \fBsmartctl\fP. The command set used by the device
|
|||||||
is often derived from the device path but may need help with the \'\-d\'
|
is often derived from the device path but may need help with the \'\-d\'
|
||||||
option (for more information see the section on "ATA, SCSI command sets
|
option (for more information see the section on "ATA, SCSI command sets
|
||||||
and SAT" below). Device paths are as follows:
|
and SAT" below). Device paths are as follows:
|
||||||
|
.\" %IF OS Linux
|
||||||
.IP \fBLINUX\fP: 9
|
.IP \fBLINUX\fP: 9
|
||||||
Use the forms \fB"/dev/hd[a\-t]"\fP for IDE/ATA devices, and
|
Use the forms \fB"/dev/hd[a\-t]"\fP for IDE/ATA devices, and
|
||||||
\fB"/dev/sd[a\-z]"\fP for SCSI devices. For SCSI Tape Drives and
|
\fB"/dev/sd[a\-z]"\fP for SCSI devices. For SCSI Tape Drives and
|
||||||
@ -71,29 +79,41 @@ below. For disks behind HighPoint RocketRAID controllers you may need
|
|||||||
you need \fB"/dev/sg[2\-9]"\fP (note that smartmontools interacts with
|
you need \fB"/dev/sg[2\-9]"\fP (note that smartmontools interacts with
|
||||||
the Areca controllers via a SCSI generic device which is different
|
the Areca controllers via a SCSI generic device which is different
|
||||||
than the SCSI device used for reading and writing data)!
|
than the SCSI device used for reading and writing data)!
|
||||||
|
.\" %ENDIF OS Linux
|
||||||
|
.\" %IF OS Darwin
|
||||||
.IP \fBDARWIN\fP: 9
|
.IP \fBDARWIN\fP: 9
|
||||||
Use the forms \fB/dev/disk[0\-9]\fP or equivalently \fBdisk[0\-9]\fP or equivalently
|
Use the forms \fB/dev/disk[0\-9]\fP or equivalently \fBdisk[0\-9]\fP or equivalently
|
||||||
\fB/dev/rdisk[0\-9]\fP. Long forms are also available: please use \'\-h\' to see some
|
\fB/dev/rdisk[0\-9]\fP. Long forms are also available: please use \'\-h\' to see some
|
||||||
examples. Note that there is currently no Darwin SCSI support.
|
examples. Note that there is currently no Darwin SCSI support.
|
||||||
|
.\" %ENDIF OS Darwin
|
||||||
|
.\" %IF OS FreeBSD
|
||||||
.IP \fBFREEBSD\fP: 9
|
.IP \fBFREEBSD\fP: 9
|
||||||
Use the forms \fB"/dev/ad[0\-9]+"\fP for IDE/ATA
|
Use the forms \fB"/dev/ad[0\-9]+"\fP for IDE/ATA
|
||||||
devices and \fB"/dev/da[0\-9]+"\fP or \fB"/dev/pass[0\-9]+"\fP for SCSI devices.
|
devices and \fB"/dev/da[0\-9]+"\fP or \fB"/dev/pass[0\-9]+"\fP for SCSI devices.
|
||||||
For SATA devices on AHCI bus use \fB"/dev/ada[0\-9]+"\fP format.
|
For SATA devices on AHCI bus use \fB"/dev/ada[0\-9]+"\fP format.
|
||||||
|
.\" %ENDIF OS FreeBSD
|
||||||
|
.\" %IF OS NetBSD OpenBSD
|
||||||
.IP \fBNETBSD/OPENBSD\fP: 9
|
.IP \fBNETBSD/OPENBSD\fP: 9
|
||||||
Use the form \fB"/dev/wd[0\-9]+c"\fP for IDE/ATA
|
Use the form \fB"/dev/wd[0\-9]+c"\fP for IDE/ATA
|
||||||
devices. For SCSI disk and tape devices, use the device names
|
devices. For SCSI disk and tape devices, use the device names
|
||||||
\fB"/dev/sd[0\-9]+c"\fP and \fB"/dev/st[0\-9]+c"\fP respectively.
|
\fB"/dev/sd[0\-9]+c"\fP and \fB"/dev/st[0\-9]+c"\fP respectively.
|
||||||
Be sure to specify the correct "whole disk" partition letter for
|
Be sure to specify the correct "whole disk" partition letter for
|
||||||
your architecture.
|
your architecture.
|
||||||
|
.\" %ENDIF OS NetBSD OpenBSD
|
||||||
|
.\" %IF OS Solaris
|
||||||
.IP \fBSOLARIS\fP: 9
|
.IP \fBSOLARIS\fP: 9
|
||||||
Use the forms \fB"/dev/rdsk/c?t?d?s?"\fP for IDE/ATA and SCSI disk
|
Use the forms \fB"/dev/rdsk/c?t?d?s?"\fP for IDE/ATA and SCSI disk
|
||||||
devices, and \fB"/dev/rmt/*"\fP for SCSI tape devices.
|
devices, and \fB"/dev/rmt/*"\fP for SCSI tape devices.
|
||||||
|
.\" %ENDIF OS Solaris
|
||||||
|
.\" %IF OS Windows
|
||||||
.IP \fBWINDOWS\ 9x/ME\fP: 9
|
.IP \fBWINDOWS\ 9x/ME\fP: 9
|
||||||
Use the forms \fB"/dev/hd[a\-d]"\fP for standard IDE/ATA devices
|
Use the forms \fB"/dev/hd[a\-d]"\fP for standard IDE/ATA devices
|
||||||
accessed via SMARTVSD.VXD, and \fB"/dev/hd[e\-h]"\fP for additional devices
|
accessed via SMARTVSD.VXD, and \fB"/dev/hd[e\-h]"\fP for additional devices
|
||||||
accessed via a patched SMARTVSE.VXD (see INSTALL file for details).
|
accessed via a patched SMARTVSE.VXD (see INSTALL file for details).
|
||||||
Use the form \fB"/dev/scsi[0\-9][0\-f]"\fP for SCSI devices via an aspi dll
|
Use the form \fB"/dev/scsi[0\-9][0\-f]"\fP for SCSI devices via an aspi dll
|
||||||
on ASPI adapter 0\-9, ID 0\-15. The prefix \fB"/dev/"\fP is optional.
|
on ASPI adapter 0\-9, ID 0\-15. The prefix \fB"/dev/"\fP is optional.
|
||||||
|
.\" %ENDIF OS Windows
|
||||||
|
.\" %IF OS Windows Cygwin
|
||||||
.IP \fBWINDOWS\ NT4/2000/XP/2003/Vista/Win7/2008\fP: 9
|
.IP \fBWINDOWS\ NT4/2000/XP/2003/Vista/Win7/2008\fP: 9
|
||||||
Use the forms \fB"/dev/sd[a\-z]"\fP for IDE/(S)ATA and SCSI disks
|
Use the forms \fB"/dev/sd[a\-z]"\fP for IDE/(S)ATA and SCSI disks
|
||||||
"\\\\.\\PhysicalDrive[0\-25]" (where "a" maps to "0").
|
"\\\\.\\PhysicalDrive[0\-25]" (where "a" maps to "0").
|
||||||
@ -122,10 +142,15 @@ The option \'\-d 3ware,N\' is not necessary on Windows.
|
|||||||
driver use \fB"/dev/csmi[0\-9],N"\fP where N specifies the port behind
|
driver use \fB"/dev/csmi[0\-9],N"\fP where N specifies the port behind
|
||||||
the logical scsi controller "\\\\.\\Scsi[0\-9]:".
|
the logical scsi controller "\\\\.\\Scsi[0\-9]:".
|
||||||
The prefix \fB"/dev/"\fP is optional.
|
The prefix \fB"/dev/"\fP is optional.
|
||||||
|
.\" %ENDIF OS Windows Cygwin
|
||||||
|
.\" %IF OS Cygwin
|
||||||
.IP \fBCYGWIN\fP: 9
|
.IP \fBCYGWIN\fP: 9
|
||||||
See "WINDOWS NT4/2000/XP/2003/Vista/Win7/2008" above.
|
See "WINDOWS NT4/2000/XP/2003/Vista/Win7/2008" above.
|
||||||
|
.\" %ENDIF OS Cygwin
|
||||||
|
.\" %IF OS OS2
|
||||||
.IP \fBOS/2,eComStation\fP: 9
|
.IP \fBOS/2,eComStation\fP: 9
|
||||||
Use the form \fB"/dev/hd[a\-z]"\fP for IDE/ATA devices.
|
Use the form \fB"/dev/hd[a\-z]"\fP for IDE/ATA devices.
|
||||||
|
.\" %ENDIF OS OS2
|
||||||
.PP
|
.PP
|
||||||
if \'\-\' is specified as the device path, \fBsmartctl\fP reads and
|
if \'\-\' is specified as the device path, \fBsmartctl\fP reads and
|
||||||
interprets it's own debug output from standard input.
|
interprets it's own debug output from standard input.
|
||||||
@ -189,7 +214,7 @@ and the SMART options which require support for 48-bit ATA commands.
|
|||||||
Prints all SMART and non-SMART information about the device. For ATA
|
Prints all SMART and non-SMART information about the device. For ATA
|
||||||
devices this is equivalent to
|
devices this is equivalent to
|
||||||
.nf
|
.nf
|
||||||
\'\-H \-i \-c \-A \-f brief \-l xerror,error \-l xselftest,selftest
|
\'\-H \-i \-g all \-c \-A \-f brief \-l xerror,error \-l xselftest,selftest
|
||||||
\-l selective \-l directory \-l scttemp \-l scterc \-l sataphy\'.
|
\-l selective \-l directory \-l scttemp \-l scterc \-l sataphy\'.
|
||||||
.fi
|
.fi
|
||||||
and for SCSI, this is equivalent to
|
and for SCSI, this is equivalent to
|
||||||
@ -215,6 +240,9 @@ For example:
|
|||||||
.nf
|
.nf
|
||||||
smartctl --scan-open -- -a -W 4,45,50 -m admin@work > smartd.conf
|
smartctl --scan-open -- -a -W 4,45,50 -m admin@work > smartd.conf
|
||||||
.fi
|
.fi
|
||||||
|
.TP
|
||||||
|
.B \-g NAME, \-\-get=NAME
|
||||||
|
Get non\-SMART device settings. See \'\-s, \-\-set\' below for further info.
|
||||||
|
|
||||||
.TP
|
.TP
|
||||||
.B RUN\-TIME BEHAVIOR OPTIONS:
|
.B RUN\-TIME BEHAVIOR OPTIONS:
|
||||||
@ -259,12 +287,13 @@ any further commands.
|
|||||||
\fBsmartctl\fP
|
\fBsmartctl\fP
|
||||||
from issuing SCSI commands to an ATA device.
|
from issuing SCSI commands to an ATA device.
|
||||||
|
|
||||||
|
.\" %IF NOT OS Darwin
|
||||||
.I scsi
|
.I scsi
|
||||||
\- the device type is SCSI. This prevents
|
\- the device type is SCSI. This prevents
|
||||||
\fBsmartctl\fP
|
\fBsmartctl\fP
|
||||||
from issuing ATA commands to a SCSI device.
|
from issuing ATA commands to a SCSI device.
|
||||||
|
|
||||||
.I sat
|
.I sat[,auto][,N]
|
||||||
\- the device type is SCSI to ATA Translation (SAT).
|
\- the device type is SCSI to ATA Translation (SAT).
|
||||||
This is for ATA disks that have a SCSI to ATA Translation (SAT) Layer
|
This is for ATA disks that have a SCSI to ATA Translation (SAT) Layer
|
||||||
(SATL) between the disk and the operating system.
|
(SATL) between the disk and the operating system.
|
||||||
@ -272,6 +301,10 @@ SAT defines two ATA PASS THROUGH SCSI commands, one 12 bytes long and
|
|||||||
the other 16 bytes long. The default is the 16 byte variant which can be
|
the other 16 bytes long. The default is the 16 byte variant which can be
|
||||||
overridden with either \'\-d sat,12\' or \'\-d sat,16\'.
|
overridden with either \'\-d sat,12\' or \'\-d sat,16\'.
|
||||||
|
|
||||||
|
If \'-d sat,auto\' is specified, device type SAT (for ATA/SATA disks) is
|
||||||
|
only used if the SCSI INQUIRY data reports a SATL (VENDOR: "ATA ").
|
||||||
|
Otherwise device type SCSI (for SCSI/SAS disks) is used.
|
||||||
|
|
||||||
.I usbcypress
|
.I usbcypress
|
||||||
\- this device type is for ATA disks that are behind a Cypress USB to PATA
|
\- this device type is for ATA disks that are behind a Cypress USB to PATA
|
||||||
bridge. This will use the ATACB proprietary scsi pass through command.
|
bridge. This will use the ATACB proprietary scsi pass through command.
|
||||||
@ -298,6 +331,8 @@ PORT does not exist or is not connected to a disk.
|
|||||||
\- this device type is for SATA disks that are behind a SunplusIT USB to SATA
|
\- this device type is for SATA disks that are behind a SunplusIT USB to SATA
|
||||||
bridge.
|
bridge.
|
||||||
|
|
||||||
|
.\" %ENDIF NOT OS Darwin
|
||||||
|
.\" %IF OS Linux
|
||||||
.I marvell
|
.I marvell
|
||||||
\- [Linux only] interact with SATA disks behind Marvell chip-set
|
\- [Linux only] interact with SATA disks behind Marvell chip-set
|
||||||
controllers (using the Marvell rather than libata driver).
|
controllers (using the Marvell rather than libata driver).
|
||||||
@ -320,6 +355,8 @@ For PERC2/3/4 controllers: \fB/dev/megadev0\fP
|
|||||||
.fi
|
.fi
|
||||||
For PERC5/6 controllers: \fB/dev/megaraid_sas_ioctl_node\fP
|
For PERC5/6 controllers: \fB/dev/megaraid_sas_ioctl_node\fP
|
||||||
|
|
||||||
|
.\" %ENDIF OS Linux
|
||||||
|
.\" %IF OS FreeBSD Linux
|
||||||
.I 3ware,N
|
.I 3ware,N
|
||||||
\- [FreeBSD and Linux only] the device consists of one or more ATA disks
|
\- [FreeBSD and Linux only] the device consists of one or more ATA disks
|
||||||
connected to a 3ware RAID controller. The non-negative integer N
|
connected to a 3ware RAID controller. The non-negative integer N
|
||||||
@ -395,20 +432,36 @@ using the character device interface /dev/twl0\-15, /dev/twa0\-15 and /dev/twe0\
|
|||||||
The necessary WRITE LOG commands can not be passed through the SCSI
|
The necessary WRITE LOG commands can not be passed through the SCSI
|
||||||
interface.
|
interface.
|
||||||
|
|
||||||
|
.\" %ENDIF OS FreeBSD Linux
|
||||||
|
.\" %IF OS Linux FreeBSD
|
||||||
.I areca,N
|
.I areca,N
|
||||||
\- [Linux only] the device consists of one or more SATA disks connected to an
|
\- [Linux and FreeBSD only] the device consists of one or more SATA disks connected to an
|
||||||
Areca SATA RAID controller. The positive integer N (in the range from 1 to
|
Areca SATA RAID controller. The positive integer N (in the range from 1 to
|
||||||
24 inclusive) denotes which disk on the controller is monitored.
|
24 inclusive) denotes which disk on the controller is monitored.
|
||||||
Use syntax such as:
|
.\" %ENDIF OS Linux FreeBSD
|
||||||
|
.\" %IF OS Linux
|
||||||
|
On Linux use syntax such as:
|
||||||
.nf
|
.nf
|
||||||
\fBsmartctl \-a \-d areca,2 /dev/sg2\fP
|
\fBsmartctl \-a \-d areca,2 /dev/sg2\fP
|
||||||
.fi
|
.fi
|
||||||
.nf
|
.nf
|
||||||
\fBsmartctl \-a \-d areca,3 /dev/sg3\fP
|
\fBsmartctl \-a \-d areca,3 /dev/sg3\fP
|
||||||
.fi
|
.fi
|
||||||
|
.\" %ENDIF OS Linux
|
||||||
|
.\" %IF OS FreeBSD
|
||||||
|
On FreeBSD use syntax such as:
|
||||||
|
.nf
|
||||||
|
\fBsmartctl \-a \-d areca,2 /dev/arcmsr1\fP
|
||||||
|
.fi
|
||||||
|
.nf
|
||||||
|
\fBsmartctl \-a \-d areca,3 /dev/arcmsr2\fP
|
||||||
|
.fi
|
||||||
|
.\" %ENDIF OS FreeBSD
|
||||||
The first line above addresses the second disk on the first Areca RAID controller.
|
The first line above addresses the second disk on the first Areca RAID controller.
|
||||||
The second line addresses the third disk on the second Areca RAID
|
The second line addresses the third disk on the second Areca RAID
|
||||||
controller. To help identify the correct device, use the command:
|
controller.
|
||||||
|
.\" %IF OS Linux
|
||||||
|
To help identify the correct device on Linus, use the command:
|
||||||
.nf
|
.nf
|
||||||
\fBcat /proc/scsi/sg/device_hdr /proc/scsi/sg/devices\fP
|
\fBcat /proc/scsi/sg/device_hdr /proc/scsi/sg/devices\fP
|
||||||
.fi
|
.fi
|
||||||
@ -417,11 +470,15 @@ to show the SCSI generic devices (one per line, starting with
|
|||||||
smartmontools are the ones with the type field equal to 3. If the
|
smartmontools are the ones with the type field equal to 3. If the
|
||||||
incorrect device is addressed, please read the warning/error messages
|
incorrect device is addressed, please read the warning/error messages
|
||||||
carefully. They should provide hints about what devices to use.
|
carefully. They should provide hints about what devices to use.
|
||||||
|
.\" %ENDIF OS Linux
|
||||||
|
|
||||||
|
.\" %IF OS Linux FreeBSD
|
||||||
Important: the Areca controller must have firmware version 1.46 or
|
Important: the Areca controller must have firmware version 1.46 or
|
||||||
later. Lower-numbered firmware versions will give (harmless) SCSI
|
later. Lower-numbered firmware versions will give (harmless) SCSI
|
||||||
error messages and no SMART information.
|
error messages and no SMART information.
|
||||||
|
|
||||||
|
.\" %ENDIF OS Linux FreeBSD
|
||||||
|
.\" %IF OS FreeBSD Linux
|
||||||
.I cciss,N
|
.I cciss,N
|
||||||
\- [FreeBSD and Linux only] the device consists of one or more SCSI/SAS disks
|
\- [FreeBSD and Linux only] the device consists of one or more SCSI/SAS disks
|
||||||
connected to a cciss RAID controller. The non-negative integer N (in the range
|
connected to a cciss RAID controller. The non-negative integer N (in the range
|
||||||
@ -435,26 +492,33 @@ to monitor also SATA disks by specifiying \'\-d sat+cciss,N\'.
|
|||||||
connected to a HighPoint RocketRAID controller. The integer L is the
|
connected to a HighPoint RocketRAID controller. The integer L is the
|
||||||
controller id, the integer M is the channel number, and the integer N
|
controller id, the integer M is the channel number, and the integer N
|
||||||
is the PMPort number if it is available. The allowed values of L are
|
is the PMPort number if it is available. The allowed values of L are
|
||||||
from 1 to 4 inclusive, M are from 1 to 8 inclusive and N from 1 to 4
|
from 1 to 4 inclusive, M are from 1 to 16 inclusive and N from 1 to 4
|
||||||
if PMPort available. And also these values are limited by the model
|
if PMPort available. And also these values are limited by the model
|
||||||
of the HighPoint RocketRAID controller.
|
of the HighPoint RocketRAID controller.
|
||||||
Use syntax such as:
|
Use syntax such as:
|
||||||
|
.\" %ENDIF OS FreeBSD Linux
|
||||||
|
.\" %IF OS Linux
|
||||||
.nf
|
.nf
|
||||||
\fBsmartctl \-a \-d hpt,1/3 /dev/sda\fP (under Linux)
|
\fBsmartctl \-a \-d hpt,1/3 /dev/sda\fP (under Linux)
|
||||||
.fi
|
.fi
|
||||||
.nf
|
.nf
|
||||||
\fBsmartctl \-a \-d hpt,1/2/3 /dev/sda\fP (under Linux)
|
\fBsmartctl \-a \-d hpt,1/2/3 /dev/sda\fP (under Linux)
|
||||||
.fi
|
.fi
|
||||||
|
.\" %ENDIF OS Linux
|
||||||
|
.\" %IF OS FreeBSD
|
||||||
.nf
|
.nf
|
||||||
\fBsmartctl \-a \-d hpt,1/3 /dev/hptrr\fP (under FreeBSD)
|
\fBsmartctl \-a \-d hpt,1/3 /dev/hptrr\fP (under FreeBSD)
|
||||||
.fi
|
.fi
|
||||||
.nf
|
.nf
|
||||||
\fBsmartctl \-a \-d hpt,1/2/3 /dev/hptrr\fP (under FreeBSD)
|
\fBsmartctl \-a \-d hpt,1/2/3 /dev/hptrr\fP (under FreeBSD)
|
||||||
.fi
|
.fi
|
||||||
|
.\" %ENDIF OS FreeBSD
|
||||||
|
.\" %IF OS FreeBSD Linux
|
||||||
Note that the /dev/sda\-z form should be the device node which stands for
|
Note that the /dev/sda\-z form should be the device node which stands for
|
||||||
the disks derived from the HighPoint RocketRAID controllers under Linux and
|
the disks derived from the HighPoint RocketRAID controllers under Linux and
|
||||||
under FreeBSD, it is the character device which the driver registered (eg,
|
under FreeBSD, it is the character device which the driver registered (eg,
|
||||||
/dev/hptrr, /dev/hptmv6).
|
/dev/hptrr, /dev/hptmv6).
|
||||||
|
.\" %ENDIF OS FreeBSD Linux
|
||||||
.TP
|
.TP
|
||||||
.B \-T TYPE, \-\-tolerance=TYPE
|
.B \-T TYPE, \-\-tolerance=TYPE
|
||||||
[ATA only] Specifies how tolerant \fBsmartctl\fP should be of ATA and SMART
|
[ATA only] Specifies how tolerant \fBsmartctl\fP should be of ATA and SMART
|
||||||
@ -692,6 +756,67 @@ issue a warning. Use \fIon\fP to clear the GLTSD bit and thus enable
|
|||||||
saving counters to non\-volatile storage. For extreme streaming\-video
|
saving counters to non\-volatile storage. For extreme streaming\-video
|
||||||
type applications you might consider using \fIoff\fP to set the GLTSD
|
type applications you might consider using \fIoff\fP to set the GLTSD
|
||||||
bit.
|
bit.
|
||||||
|
.TP
|
||||||
|
.B \-g NAME, \-\-get=NAME, \-s NAME[,VALUE], \-\-set=NAME[,VALUE]
|
||||||
|
[NEW EXPERIMENTAL SMARTCTL FEATURE] Gets/sets non\-SMART device settings.
|
||||||
|
Note that the \'\-\-set\' option shares its short option \'\-s\' with
|
||||||
|
\'\-\-smart\'. Valid arguments are:
|
||||||
|
|
||||||
|
.I all
|
||||||
|
\- Gets all values. This is equivalent to
|
||||||
|
.nf
|
||||||
|
\'-g aam -g apm -g lookahead -g security -g wcache\'
|
||||||
|
.fi
|
||||||
|
|
||||||
|
.I aam[,N|off]
|
||||||
|
\- [ATA only] Gets/sets the Automatic Acoustic Management (AAM) feature
|
||||||
|
(if supported). A value of 128 sets the most quiet (slowest) mode and 254
|
||||||
|
the fastest (loudest) mode, \'off\' disables AAM. Devices may support
|
||||||
|
intermediate levels. Values below 128 are defined as vendor specific (0)
|
||||||
|
or retired (1\-127). Note that the AAM feature was declared obsolete in
|
||||||
|
ATA ACS-2 Revision 4a (Dec 2010).
|
||||||
|
|
||||||
|
.I apm[,N|off]
|
||||||
|
\- [ATA only] Gets/sets the Advanced Power Management (APM) feature on
|
||||||
|
device (if supported). If a value between 1 and 254 is provided, it will
|
||||||
|
attempt to enable APM and set the specified value, \'off\' disables APM.
|
||||||
|
Note the actual behavior depends on the drive, for example some drives disable
|
||||||
|
APM if their value is set above 128. Values below 128 are supposed to allow
|
||||||
|
drive spindown, values 128 and above adjust only head-parking frequency,
|
||||||
|
although the actual behavior defined is also vendor-specific.
|
||||||
|
|
||||||
|
.I lookahead[,on|off]
|
||||||
|
\- [ATA only] Gets/sets the read look-ahead feature (if supported).
|
||||||
|
Read look-ahead is usually enabled by default.
|
||||||
|
|
||||||
|
.I security
|
||||||
|
\- [ATA only] Gets the status of ATA Security feature (if supported).
|
||||||
|
If ATA Security is enabled an ATA user password is set. The drive will be
|
||||||
|
locked on next reset then.
|
||||||
|
|
||||||
|
.I security-freeze
|
||||||
|
\- [ATA only] Sets ATA Security feature to frozen mode. This prevents that
|
||||||
|
the drive accepts any security commands until next reset. Note that the
|
||||||
|
frozen mode may already be set by BIOS or OS.
|
||||||
|
|
||||||
|
.I standby,[N|off]
|
||||||
|
\- [ATA only] Sets the standby (spindown) timer and places the drive in the
|
||||||
|
IDLE mode. A value of 0 or \'off\' disables the standby timer.
|
||||||
|
Values from 1 to 240 specify timeouts from 5 seconds to 20 minutes in 5
|
||||||
|
second increments. Values from 241 to 251 specify timeouts from 30 minutes
|
||||||
|
to 330 minutes in 30 minute increments. Value 252 specifies 21 minutes.
|
||||||
|
Value 253 specifies a vendor specific time between 8 and 12 hours. Value
|
||||||
|
255 specifies 21 minutes and 15 seconds. Some drives may use a vendor
|
||||||
|
specific interpretation for the values. Note that there is no get option
|
||||||
|
because ATA standards do not specify a method to read the standby timer.
|
||||||
|
|
||||||
|
.I standby,now
|
||||||
|
\- [ATA only] Places the drive in the STANDBY mode. This usually spins down
|
||||||
|
the drive. The setting of the standby timer is not affected.
|
||||||
|
|
||||||
|
.I wcache[,on|off]
|
||||||
|
\- [ATA only] Gets/sets the volatile write cache feature (if supported).
|
||||||
|
The write cache is usually enabled by default.
|
||||||
|
|
||||||
.TP
|
.TP
|
||||||
.B SMART READ AND DISPLAY DATA OPTIONS:
|
.B SMART READ AND DISPLAY DATA OPTIONS:
|
||||||
@ -1035,20 +1160,36 @@ ranges returned by the SCT Status command, \'scttemphist\' prints
|
|||||||
temperature limits and the temperature history table returned by
|
temperature limits and the temperature history table returned by
|
||||||
the SCT Data Table command, and \'scttemp\' prints both.
|
the SCT Data Table command, and \'scttemp\' prints both.
|
||||||
The temperature values are preserved across power cycles.
|
The temperature values are preserved across power cycles.
|
||||||
The default temperature logging interval is 1 minute and can be
|
The logging interval can be configured with the
|
||||||
configured with the \'\-t scttempint,N[,p]\' option, see below.
|
\'\-l scttempint,N[,p]\' option, see below.
|
||||||
The SCT commands are specified in the proposed ATA\-8 Command Set
|
The SCT commands were introduced in ATA\-8 ACS and were also
|
||||||
(ACS), and are already implemented in some recent ATA\-7 disks.
|
supported by in many ATA\-7 disks.
|
||||||
|
|
||||||
|
.I scttempint,N[,p]
|
||||||
|
\- [ATA only] clears the SCT temperature history table and sets the
|
||||||
|
time interval for temperature logging to N minutes.
|
||||||
|
If \',p\' is specified, the setting is preserved across power cycles.
|
||||||
|
Otherwise, the setting is volatile and will be reverted to the last
|
||||||
|
non-volatile setting by the next hard reset. The default interval
|
||||||
|
is vendor specific, typical values are 1, 2, or 5 minutes.
|
||||||
|
|
||||||
.I scterc[,READTIME,WRITETIME]
|
.I scterc[,READTIME,WRITETIME]
|
||||||
|
\- [ATA only] prints values and descriptions of the SCT Error Recovery
|
||||||
|
Control settings. These are equivalent to TLER (as used by Western
|
||||||
|
Digital), CCTL (as used by Samsung and Hitachi) and ERC (as used by
|
||||||
|
Seagate). READTIME and WRITETIME arguments (deciseconds) set the
|
||||||
|
specified values. Values of 0 disable the feature, other values less
|
||||||
|
than 65 are probably not supported. For RAID configurations, this is
|
||||||
|
typically set to 70,70 deciseconds.
|
||||||
|
|
||||||
|
.I devstat[,PAGE]
|
||||||
\- [ATA only] [NEW EXPERIMENTAL SMARTCTL FEATURE] prints values
|
\- [ATA only] [NEW EXPERIMENTAL SMARTCTL FEATURE] prints values
|
||||||
and descriptions of the SCT Error Recovery Control settings. These
|
and descriptions of the ATA Device Statistics log pages
|
||||||
are equivalent to TLER (as used by Western Digital), CCTL (as used
|
(General Purpose Log address 0x04). If no PAGE number is specified,
|
||||||
by Samsung and Hitachi) and ERC (as used by Seagate). READTIME and
|
entries from all supported pages are printed. If PAGE 0 is specified,
|
||||||
WRITETIME arguments (deciseconds) set the specified values. Values of 0
|
the list of supported pages is printed. Device Statistics was
|
||||||
disable the feature, other values less than 65 are probably not
|
introduced in ATA\-8 ACS and is only supported by some recent devices
|
||||||
supported. For RAID configurations, this is typically set to
|
(e.g. Intel 320 and 710 Series SSDs).
|
||||||
70,70 deciseconds.
|
|
||||||
|
|
||||||
.I sataphy[,reset]
|
.I sataphy[,reset]
|
||||||
\- [SATA only] prints values and descriptions of the SATA Phy Event
|
\- [SATA only] prints values and descriptions of the SATA Phy Event
|
||||||
@ -1087,6 +1228,16 @@ This command:
|
|||||||
.fi
|
.fi
|
||||||
writes a binary representation of the one sector log 0x11
|
writes a binary representation of the one sector log 0x11
|
||||||
(SATA Phy Event Counters) to file log.bin.
|
(SATA Phy Event Counters) to file log.bin.
|
||||||
|
|
||||||
|
.I ssd
|
||||||
|
\- [ATA] prints the Solid State Device Statistics log page.
|
||||||
|
This has the same effect as \'\-l devstat,7\', see above.
|
||||||
|
|
||||||
|
.I ssd
|
||||||
|
\- [SCSI] prints the Solid State Media percentage used endurance
|
||||||
|
indicator. A value of 0 indicates as new condition while 100
|
||||||
|
indicates the device is at the end of its lifetime as projected by the
|
||||||
|
manufacturer. The value may reach 255.
|
||||||
.TP
|
.TP
|
||||||
.B \-v ID,FORMAT[:BYTEORDER][,NAME], \-\-vendorattribute=ID,FORMAT[:BYTEORDER][,NAME]
|
.B \-v ID,FORMAT[:BYTEORDER][,NAME], \-\-vendorattribute=ID,FORMAT[:BYTEORDER][,NAME]
|
||||||
[ATA only] Sets a vendor\-specific raw value print FORMAT, an optional
|
[ATA only] Sets a vendor\-specific raw value print FORMAT, an optional
|
||||||
@ -1107,7 +1258,9 @@ For example, \'\-v 5,raw48:012345\' prints the raw value of
|
|||||||
attribute 5 with big endian instead of little endian
|
attribute 5 with big endian instead of little endian
|
||||||
byte ordering.
|
byte ordering.
|
||||||
|
|
||||||
The NAME is a string of letters, digits and underscore.
|
The NAME is a string of letters, digits and underscore. Its length should
|
||||||
|
not exceed 23 characters. The \'\-P showall\' option reports an error if
|
||||||
|
this is the case.
|
||||||
|
|
||||||
.I \-v help
|
.I \-v help
|
||||||
\- Prints (to STDOUT) a list of all valid arguments to this option,
|
\- Prints (to STDOUT) a list of all valid arguments to this option,
|
||||||
@ -1355,7 +1508,8 @@ presets, then exit.
|
|||||||
|
|
||||||
.I showall
|
.I showall
|
||||||
\- list all recognized drives, and the presets that are set for them,
|
\- list all recognized drives, and the presets that are set for them,
|
||||||
then exit.
|
then exit. This also checks the drive database regular expressions
|
||||||
|
and settings for syntax errors.
|
||||||
|
|
||||||
The \'\-P showall\' option takes up to two optional arguments to
|
The \'\-P showall\' option takes up to two optional arguments to
|
||||||
match a specific drive type and firmware version. The command:
|
match a specific drive type and firmware version. The command:
|
||||||
@ -1377,16 +1531,43 @@ lists all entries for this MODEL and a specific FIRMWARE version.
|
|||||||
the built in database by default. If \'+\' is specified, then the new
|
the built in database by default. If \'+\' is specified, then the new
|
||||||
entries prepend the built in entries.
|
entries prepend the built in entries.
|
||||||
|
|
||||||
If this option is not specified, optional entries are read from the file
|
Optional entries are read from the file
|
||||||
\fB/usr/local/etc/smart_drivedb.h\fP (Windows: \fBEXEDIR/drivedb-add.h\fP).
|
.\" %IF NOT OS Windows
|
||||||
.\" BEGIN ENABLE_DRIVEDB
|
\fB/usr/local/etc/smart_drivedb.h\fP
|
||||||
If \fB/usr/local/share/smartmontools/drivedb.h\fP
|
.\" %ENDIF NOT OS Windows
|
||||||
(Windows: \fBEXEDIR/drivedb.h\fP) is present, the
|
.\" %IF OS ALL
|
||||||
contents of this file is used instead of the built in table.
|
(Windows: \fBEXEDIR/drivedb-add.h\fP)
|
||||||
|
.\" %ENDIF OS ALL
|
||||||
|
.\" %IF OS Windows
|
||||||
|
.\"! \fBEXEDIR/drivedb-add.h\fP.
|
||||||
|
.\" %ENDIF OS Windows
|
||||||
|
.\" %IF ENABLE_DRIVEDB
|
||||||
|
if this option is not specified.
|
||||||
|
|
||||||
Run the script \fB/usr/local/sbin/update-smart-drivedb\fP to update this
|
If
|
||||||
file from the smartmontools SVN repository.
|
.\" %IF NOT OS Windows
|
||||||
.\" END ENABLE_DRIVEDB
|
\fB/usr/local/share/smartmontools/drivedb.h\fP
|
||||||
|
.\" %ENDIF NOT OS Windows
|
||||||
|
.\" %IF OS ALL
|
||||||
|
(Windows: \fBEXEDIR/drivedb.h\fP)
|
||||||
|
.\" %ENDIF OS ALL
|
||||||
|
.\" %IF OS Windows
|
||||||
|
.\"! \fBEXEDIR/drivedb.h\fP
|
||||||
|
.\" %ENDIF OS Windows
|
||||||
|
is present, the contents of this file is used instead of the built in table.
|
||||||
|
|
||||||
|
Run
|
||||||
|
.\" %IF NOT OS Windows
|
||||||
|
\fB/usr/local/sbin/update-smart-drivedb\fP
|
||||||
|
.\" %ENDIF NOT OS Windows
|
||||||
|
.\" %IF OS ALL
|
||||||
|
(Windows: \fBEXEDIR/update-smart-drivedb.exe\fP)
|
||||||
|
.\" %ENDIF OS ALL
|
||||||
|
.\" %IF OS Windows
|
||||||
|
.\"! \fBEXEDIR/update-smart-drivedb.exe\fP
|
||||||
|
.\" %ENDIF OS Windows
|
||||||
|
to update this file from the smartmontools SVN repository.
|
||||||
|
.\" %ENDIF ENABLE_DRIVEDB
|
||||||
|
|
||||||
The database files use the same C/C++ syntax that is used to initialize
|
The database files use the same C/C++ syntax that is used to initialize
|
||||||
the built in database array. C/C++ style comments are allowed.
|
the built in database array. C/C++ style comments are allowed.
|
||||||
@ -1609,14 +1790,6 @@ option must be use together with one or more of the \fIselect,N\-M\fP
|
|||||||
options above. The value of this option is preserved between selective
|
options above. The value of this option is preserved between selective
|
||||||
self\-tests.
|
self\-tests.
|
||||||
|
|
||||||
.I scttempint,N[,p]
|
|
||||||
\- [ATA only] set the time interval for SCT temperature logging to N
|
|
||||||
minutes. If \',p\' is specified, the setting is preserved across power
|
|
||||||
cycles. Otherwise, the setting is volatile and will be reverted to
|
|
||||||
default (1 minute), or last non-volatile setting by the next hard reset.
|
|
||||||
This command also clears the temperature history table. See
|
|
||||||
\'\-l scttemp\' above for more information about SCT temperature logging.
|
|
||||||
|
|
||||||
.I vendor,N
|
.I vendor,N
|
||||||
\- [ATA only] issues the ATA command SMART EXECUTE OFF-LINE IMMEDIATE
|
\- [ATA only] issues the ATA command SMART EXECUTE OFF-LINE IMMEDIATE
|
||||||
with subcommand N in LBA LOW register. The subcommand is specified as
|
with subcommand N in LBA LOW register. The subcommand is specified as
|
||||||
@ -1634,6 +1807,14 @@ The subcommand 0x40 (\'\-t vendor,0x40\') clears the timed workload
|
|||||||
related SMART attributes (226, 227, 228). Note that the raw values of
|
related SMART attributes (226, 227, 228). Note that the raw values of
|
||||||
these attributes are held at 65535 (0xffff) until the workload timer
|
these attributes are held at 65535 (0xffff) until the workload timer
|
||||||
reaches 60 minutes.
|
reaches 60 minutes.
|
||||||
|
|
||||||
|
.I force
|
||||||
|
\- [ATA only] start new self\-test even if another test is already running.
|
||||||
|
By default a running self\-test will not be interrupted to begin another
|
||||||
|
test.
|
||||||
|
|
||||||
|
.I scttempint,N[,p]
|
||||||
|
\- is no longer supported, use \'\-l scttempint,N[,p]\' instead, see above.
|
||||||
.TP
|
.TP
|
||||||
.B \-C, \-\-captive
|
.B \-C, \-\-captive
|
||||||
[ATA] Runs self\-tests in captive mode. This has no effect with \'\-t
|
[ATA] Runs self\-tests in captive mode. This has no effect with \'\-t
|
||||||
@ -1840,8 +2021,8 @@ Device open failed, device did not return an IDENTIFY DEVICE structure,
|
|||||||
or device is in a low-power mode (see \'\-n\' option above).
|
or device is in a low-power mode (see \'\-n\' option above).
|
||||||
.TP
|
.TP
|
||||||
.B Bit 2:
|
.B Bit 2:
|
||||||
Some SMART command to the disk failed, or there was a checksum error
|
Some SMART or other ATA command to the disk failed, or there was a checksum
|
||||||
in a SMART data structure (see \'\-b\' option above).
|
error in a SMART data structure (see \'\-b\' option above).
|
||||||
.TP
|
.TP
|
||||||
.B Bit 3:
|
.B Bit 3:
|
||||||
SMART status check returned "DISK FAILING".
|
SMART status check returned "DISK FAILING".
|
||||||
@ -1861,7 +2042,7 @@ The device error log contains records of errors.
|
|||||||
The device self\-test log contains records of errors.
|
The device self\-test log contains records of errors.
|
||||||
[ATA only] Failed self-tests outdated by a newer successful extended
|
[ATA only] Failed self-tests outdated by a newer successful extended
|
||||||
self\-test are ignored.
|
self\-test are ignored.
|
||||||
|
.PP
|
||||||
To test within the shell for whether or not the different bits are
|
To test within the shell for whether or not the different bits are
|
||||||
turned on or off, you can use the following type of construction (this
|
turned on or off, you can use the following type of construction (this
|
||||||
is bash syntax):
|
is bash syntax):
|
||||||
@ -1874,6 +2055,14 @@ This looks at only at bit 3 of the exit status
|
|||||||
$smartstat will be nonzero if SMART status check returned "disk
|
$smartstat will be nonzero if SMART status check returned "disk
|
||||||
failing" and zero otherwise.
|
failing" and zero otherwise.
|
||||||
|
|
||||||
|
This bash script prints all status bits:
|
||||||
|
.nf
|
||||||
|
status=$?
|
||||||
|
for ((i=0; i<8; i++)); do
|
||||||
|
echo "Bit $i: $((status & 2**i && 1))"
|
||||||
|
done
|
||||||
|
.fi
|
||||||
|
|
||||||
.PP
|
.PP
|
||||||
.SH NOTES
|
.SH NOTES
|
||||||
The TapeAlert log page flags are cleared for the initiator when the
|
The TapeAlert log page flags are cleared for the initiator when the
|
||||||
@ -1897,7 +2086,7 @@ The following have made large contributions to smartmontools:
|
|||||||
\fBGuido Guenther\fP (Autoconf/Automake packaging)
|
\fBGuido Guenther\fP (Autoconf/Automake packaging)
|
||||||
\fBGeoffrey Keating\fP (Darwin ATA interface)
|
\fBGeoffrey Keating\fP (Darwin ATA interface)
|
||||||
\fBEduard Martinescu\fP (FreeBSD interface)
|
\fBEduard Martinescu\fP (FreeBSD interface)
|
||||||
\fBFr\*'ed\*'eric L. W. Meunier\fP (Web site and Mailing list)
|
\fBFr\['e]d\['e]ric L. W. Meunier\fP (Web site and Mailing list)
|
||||||
\fBGabriele Pohl\fP (Web site and Wiki, conversion from CVS to SVN)
|
\fBGabriele Pohl\fP (Web site and Wiki, conversion from CVS to SVN)
|
||||||
\fBKeiji Sawada\fP (Solaris ATA interface)
|
\fBKeiji Sawada\fP (Solaris ATA interface)
|
||||||
\fBManfred Schwarb\fP (Drive database)
|
\fBManfred Schwarb\fP (Drive database)
|
||||||
@ -1941,8 +2130,6 @@ does, a good place to start is with Sections 4.8 and 6.54 of the first
|
|||||||
volume of the \'AT Attachment with Packet Interface\-7\' (ATA/ATAPI\-7)
|
volume of the \'AT Attachment with Packet Interface\-7\' (ATA/ATAPI\-7)
|
||||||
specification Revision 4b. This documents the SMART functionality which the
|
specification Revision 4b. This documents the SMART functionality which the
|
||||||
\fBsmartmontools\fP utilities provide access to.
|
\fBsmartmontools\fP utilities provide access to.
|
||||||
This and other versions of this Specification are available from
|
|
||||||
the T13 web site \fBhttp://www.t13.org/\fP .
|
|
||||||
|
|
||||||
.fi
|
.fi
|
||||||
The functioning of SMART was originally defined by the SFF\-8035i
|
The functioning of SMART was originally defined by the SFF\-8035i
|
||||||
@ -1955,4 +2142,4 @@ Links to these and other documents may be found on the Links page of the
|
|||||||
|
|
||||||
.SH
|
.SH
|
||||||
SVN ID OF THIS PAGE:
|
SVN ID OF THIS PAGE:
|
||||||
$Id: smartctl.8.in 3320 2011-04-30 20:44:55Z chrfranke $
|
$Id: smartctl.8.in 3519 2012-03-06 20:01:44Z chrfranke $
|
||||||
|
232
smartctl.cpp
232
smartctl.cpp
@ -4,7 +4,7 @@
|
|||||||
* Home page of code is: http://smartmontools.sourceforge.net
|
* Home page of code is: http://smartmontools.sourceforge.net
|
||||||
*
|
*
|
||||||
* Copyright (C) 2002-11 Bruce Allen <smartmontools-support@lists.sourceforge.net>
|
* Copyright (C) 2002-11 Bruce Allen <smartmontools-support@lists.sourceforge.net>
|
||||||
* Copyright (C) 2008-11 Christian Franke <smartmontools-support@lists.sourceforge.net>
|
* Copyright (C) 2008-12 Christian Franke <smartmontools-support@lists.sourceforge.net>
|
||||||
* Copyright (C) 2000 Michael Cornwell <cornwell@acm.org>
|
* Copyright (C) 2000 Michael Cornwell <cornwell@acm.org>
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or modify
|
* This program is free software; you can redistribute it and/or modify
|
||||||
@ -55,7 +55,7 @@
|
|||||||
#include "smartctl.h"
|
#include "smartctl.h"
|
||||||
#include "utility.h"
|
#include "utility.h"
|
||||||
|
|
||||||
const char * smartctl_cpp_cvsid = "$Id: smartctl.cpp 3316 2011-04-19 19:34:57Z chrfranke $"
|
const char * smartctl_cpp_cvsid = "$Id: smartctl.cpp 3517 2012-03-06 19:44:42Z chrfranke $"
|
||||||
CONFIG_H_CVSID SMARTCTL_H_CVSID;
|
CONFIG_H_CVSID SMARTCTL_H_CVSID;
|
||||||
|
|
||||||
// Globals to control printing
|
// Globals to control printing
|
||||||
@ -73,7 +73,7 @@ static void UsageSummary()
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
static std::string getvalidarglist(char opt);
|
static std::string getvalidarglist(int opt);
|
||||||
|
|
||||||
/* void prints help information for command syntax */
|
/* void prints help information for command syntax */
|
||||||
static void Usage()
|
static void Usage()
|
||||||
@ -85,9 +85,11 @@ static void Usage()
|
|||||||
" Display this help and exit\n\n"
|
" Display this help and exit\n\n"
|
||||||
" -V, --version, --copyright, --license\n"
|
" -V, --version, --copyright, --license\n"
|
||||||
" Print license, copyright, and version information and exit\n\n"
|
" Print license, copyright, and version information and exit\n\n"
|
||||||
" -i, --info \n"
|
" -i, --info\n"
|
||||||
" Show identity information for device\n\n"
|
" Show identity information for device\n\n"
|
||||||
" -a, --all \n"
|
" -g NAME, --get=NAME\n"
|
||||||
|
" Get device setting: all, aam, apm, lookahead, security, wcache\n\n"
|
||||||
|
" -a, --all\n"
|
||||||
" Show all SMART information for device\n\n"
|
" Show all SMART information for device\n\n"
|
||||||
" -x, --xall\n"
|
" -x, --xall\n"
|
||||||
" Show all information for device\n\n"
|
" Show all information for device\n\n"
|
||||||
@ -119,6 +121,10 @@ static void Usage()
|
|||||||
" Enable/disable automatic offline testing on device (on/off)\n\n"
|
" Enable/disable automatic offline testing on device (on/off)\n\n"
|
||||||
" -S VALUE, --saveauto=VALUE (ATA)\n"
|
" -S VALUE, --saveauto=VALUE (ATA)\n"
|
||||||
" Enable/disable Attribute autosave on device (on/off)\n\n"
|
" Enable/disable Attribute autosave on device (on/off)\n\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]\n\n"
|
||||||
);
|
);
|
||||||
printf(
|
printf(
|
||||||
"======================================= READ AND DISPLAY DATA OPTIONS =====\n\n"
|
"======================================= READ AND DISPLAY DATA OPTIONS =====\n\n"
|
||||||
@ -132,10 +138,11 @@ static void Usage()
|
|||||||
" Set output format for attributes to one of: old, brief\n\n"
|
" Set output format for attributes to one of: old, brief\n\n"
|
||||||
" -l TYPE, --log=TYPE\n"
|
" -l TYPE, --log=TYPE\n"
|
||||||
" Show device log. TYPE: error, selftest, selective, directory[,g|s],\n"
|
" Show device log. TYPE: error, selftest, selective, directory[,g|s],\n"
|
||||||
|
" xerror[,N][,error], xselftest[,N][,selftest],\n"
|
||||||
" background, sasphy[,reset], sataphy[,reset],\n"
|
" background, sasphy[,reset], sataphy[,reset],\n"
|
||||||
" scttemp[sts,hist], scterc[,N,M],\n"
|
" scttemp[sts,hist], scttempint,N[,p],\n"
|
||||||
" gplog,N[,RANGE], smartlog,N[,RANGE],\n"
|
" scterc[,N,M], devstat[,N], ssd,\n"
|
||||||
" xerror[,N][,error], xselftest[,N][,selftest]\n\n"
|
" gplog,N[,RANGE], smartlog,N[,RANGE]\n\n"
|
||||||
" -v N,OPTION , --vendorattribute=N,OPTION (ATA)\n"
|
" -v N,OPTION , --vendorattribute=N,OPTION (ATA)\n"
|
||||||
" Set display OPTION for vendor Attribute N (see man page)\n\n"
|
" Set display OPTION for vendor Attribute N (see man page)\n\n"
|
||||||
" -F TYPE, --firmwarebug=TYPE (ATA)\n"
|
" -F TYPE, --firmwarebug=TYPE (ATA)\n"
|
||||||
@ -159,8 +166,8 @@ static void Usage()
|
|||||||
"]\n\n"
|
"]\n\n"
|
||||||
"============================================ DEVICE SELF-TEST OPTIONS =====\n\n"
|
"============================================ DEVICE SELF-TEST OPTIONS =====\n\n"
|
||||||
" -t TEST, --test=TEST\n"
|
" -t TEST, --test=TEST\n"
|
||||||
" Run test. TEST: offline short long conveyance vendor,N select,M-N\n"
|
" Run test. TEST: offline, short, long, conveyance, force, vendor,N,\n"
|
||||||
" pending,N afterselect,[on|off] scttempint,N[,p]\n\n"
|
" select,M-N, pending,N, afterselect,[on|off]\n\n"
|
||||||
" -C, --captive\n"
|
" -C, --captive\n"
|
||||||
" Do test in captive mode (along with -t)\n\n"
|
" Do test in captive mode (along with -t)\n\n"
|
||||||
" -X, --abort\n"
|
" -X, --abort\n"
|
||||||
@ -171,9 +178,12 @@ static void Usage()
|
|||||||
printf("%s\n", examples.c_str());
|
printf("%s\n", examples.c_str());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Values for --long only options, see parse_options()
|
||||||
|
enum { opt_scan = 1000, opt_scan_open, opt_set, opt_smart };
|
||||||
|
|
||||||
/* Returns a string containing a formatted list of the valid arguments
|
/* Returns a string containing a formatted list of the valid arguments
|
||||||
to the option opt or empty on failure. Note 'v' case different */
|
to the option opt or empty on failure. Note 'v' case different */
|
||||||
static std::string getvalidarglist(char opt)
|
static std::string getvalidarglist(int opt)
|
||||||
{
|
{
|
||||||
switch (opt) {
|
switch (opt) {
|
||||||
case 'q':
|
case 'q':
|
||||||
@ -186,25 +196,36 @@ static std::string getvalidarglist(char opt)
|
|||||||
return "warn, exit, ignore";
|
return "warn, exit, ignore";
|
||||||
case 'r':
|
case 'r':
|
||||||
return "ioctl[,N], ataioctl[,N], scsiioctl[,N]";
|
return "ioctl[,N], ataioctl[,N], scsiioctl[,N]";
|
||||||
case 's':
|
case opt_smart:
|
||||||
case 'o':
|
case 'o':
|
||||||
case 'S':
|
case 'S':
|
||||||
return "on, off";
|
return "on, off";
|
||||||
case 'l':
|
case 'l':
|
||||||
return "error, selftest, selective, directory[,g|s], background, scttemp[sts|hist], scterc[,N,M], "
|
return "error, selftest, selective, directory[,g|s], "
|
||||||
"sasphy[,reset], sataphy[,reset], gplog,N[,RANGE], smartlog,N[,RANGE], "
|
"xerror[,N][,error], xselftest[,N][,selftest], "
|
||||||
"xerror[,N][,error], xselftest[,N][,selftest]";
|
"background, sasphy[,reset], sataphy[,reset], "
|
||||||
|
"scttemp[sts,hist], scttempint,N[,p], "
|
||||||
|
"scterc[,N,M], devstat[,N], ssd, "
|
||||||
|
"gplog,N[,RANGE], smartlog,N[,RANGE]";
|
||||||
|
|
||||||
case 'P':
|
case 'P':
|
||||||
return "use, ignore, show, showall";
|
return "use, ignore, show, showall";
|
||||||
case 't':
|
case 't':
|
||||||
return "offline, short, long, conveyance, vendor,N, select,M-N, "
|
return "offline, short, long, conveyance, force, vendor,N, select,M-N, "
|
||||||
"pending,N, afterselect,[on|off], scttempint,N[,p]";
|
"pending,N, afterselect,[on|off]";
|
||||||
case 'F':
|
case 'F':
|
||||||
return "none, samsung, samsung2, samsung3, swapid";
|
return "none, samsung, samsung2, samsung3, swapid";
|
||||||
case 'n':
|
case 'n':
|
||||||
return "never, sleep, standby, idle";
|
return "never, sleep, standby, idle";
|
||||||
case 'f':
|
case 'f':
|
||||||
return "old, brief";
|
return "old, brief";
|
||||||
|
case 'g':
|
||||||
|
return "aam, apm, lookahead, security, wcache";
|
||||||
|
case opt_set:
|
||||||
|
return "aam,[N|off], apm,[N|off], lookahead,[on|off], security-freeze, "
|
||||||
|
"standby,[N|off|now], wcache,[on|off]";
|
||||||
|
case 's':
|
||||||
|
return getvalidarglist(opt_smart)+", "+getvalidarglist(opt_set);
|
||||||
case 'v':
|
case 'v':
|
||||||
default:
|
default:
|
||||||
return "";
|
return "";
|
||||||
@ -213,7 +234,7 @@ static std::string getvalidarglist(char opt)
|
|||||||
|
|
||||||
/* Prints the message "=======> VALID ARGUMENTS ARE: <LIST> \n", where
|
/* Prints the message "=======> VALID ARGUMENTS ARE: <LIST> \n", where
|
||||||
<LIST> is the list of valid arguments for option opt. */
|
<LIST> is the list of valid arguments for option opt. */
|
||||||
static void printvalidarglistmessage(char opt)
|
static void printvalidarglistmessage(int opt)
|
||||||
{
|
{
|
||||||
if (opt=='v'){
|
if (opt=='v'){
|
||||||
pout("=======> VALID ARGUMENTS ARE:\n\thelp\n%s\n<=======\n",
|
pout("=======> VALID ARGUMENTS ARE:\n\thelp\n%s\n<=======\n",
|
||||||
@ -239,15 +260,15 @@ static checksum_err_mode_t checksum_err_mode = CHECKSUM_ERR_WARN;
|
|||||||
|
|
||||||
static void scan_devices(const char * type, bool with_open, char ** argv);
|
static void scan_devices(const char * type, bool with_open, char ** argv);
|
||||||
|
|
||||||
|
|
||||||
/* Takes command options and sets features to be run */
|
/* Takes command options and sets features to be run */
|
||||||
static const char * parse_options(int argc, char** argv,
|
static const char * parse_options(int argc, char** argv,
|
||||||
ata_print_options & ataopts,
|
ata_print_options & ataopts, scsi_print_options & scsiopts,
|
||||||
scsi_print_options & scsiopts)
|
bool & print_type_only)
|
||||||
{
|
{
|
||||||
// Please update getvalidarglist() if you edit shortopts
|
// Please update getvalidarglist() if you edit shortopts
|
||||||
const char *shortopts = "h?Vq:d:T:b:r:s:o:S:HcAl:iaxv:P:t:CXF:n:B:f:";
|
const char *shortopts = "h?Vq:d:T:b:r:s:o:S:HcAl:iaxv:P:t:CXF:n:B:f:g:";
|
||||||
// Please update getvalidarglist() if you edit longopts
|
// Please update getvalidarglist() if you edit longopts
|
||||||
enum { opt_scan = 1000, opt_scan_open = 1001 };
|
|
||||||
struct option longopts[] = {
|
struct option longopts[] = {
|
||||||
{ "help", no_argument, 0, 'h' },
|
{ "help", no_argument, 0, 'h' },
|
||||||
{ "usage", no_argument, 0, 'h' },
|
{ "usage", no_argument, 0, 'h' },
|
||||||
@ -259,7 +280,7 @@ static const char * parse_options(int argc, char** argv,
|
|||||||
{ "tolerance", required_argument, 0, 'T' },
|
{ "tolerance", required_argument, 0, 'T' },
|
||||||
{ "badsum", required_argument, 0, 'b' },
|
{ "badsum", required_argument, 0, 'b' },
|
||||||
{ "report", required_argument, 0, 'r' },
|
{ "report", required_argument, 0, 'r' },
|
||||||
{ "smart", required_argument, 0, 's' },
|
{ "smart", required_argument, 0, opt_smart },
|
||||||
{ "offlineauto", required_argument, 0, 'o' },
|
{ "offlineauto", required_argument, 0, 'o' },
|
||||||
{ "saveauto", required_argument, 0, 'S' },
|
{ "saveauto", required_argument, 0, 'S' },
|
||||||
{ "health", no_argument, 0, 'H' },
|
{ "health", no_argument, 0, 'H' },
|
||||||
@ -278,6 +299,8 @@ static const char * parse_options(int argc, char** argv,
|
|||||||
{ "nocheck", required_argument, 0, 'n' },
|
{ "nocheck", required_argument, 0, 'n' },
|
||||||
{ "drivedb", required_argument, 0, 'B' },
|
{ "drivedb", required_argument, 0, 'B' },
|
||||||
{ "format", required_argument, 0, 'f' },
|
{ "format", required_argument, 0, 'f' },
|
||||||
|
{ "get", required_argument, 0, 'g' },
|
||||||
|
{ "set", required_argument, 0, opt_set },
|
||||||
{ "scan", no_argument, 0, opt_scan },
|
{ "scan", no_argument, 0, opt_scan },
|
||||||
{ "scan-open", no_argument, 0, opt_scan_open },
|
{ "scan-open", no_argument, 0, opt_scan_open },
|
||||||
{ 0, 0, 0, 0 }
|
{ 0, 0, 0, 0 }
|
||||||
@ -318,7 +341,10 @@ static const char * parse_options(int argc, char** argv,
|
|||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case 'd':
|
case 'd':
|
||||||
type = (strcmp(optarg, "auto") ? optarg : (char *)0);
|
if (!strcmp(optarg, "test"))
|
||||||
|
print_type_only = true;
|
||||||
|
else
|
||||||
|
type = (strcmp(optarg, "auto") ? optarg : (char *)0);
|
||||||
break;
|
break;
|
||||||
case 'T':
|
case 'T':
|
||||||
if (!strcmp(optarg,"normal")) {
|
if (!strcmp(optarg,"normal")) {
|
||||||
@ -370,17 +396,22 @@ static const char * parse_options(int argc, char** argv,
|
|||||||
free(s);
|
free(s);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 's':
|
case 's':
|
||||||
|
case opt_smart: // --smart
|
||||||
if (!strcmp(optarg,"on")) {
|
if (!strcmp(optarg,"on")) {
|
||||||
ataopts.smart_enable = scsiopts.smart_enable = true;
|
ataopts.smart_enable = scsiopts.smart_enable = true;
|
||||||
ataopts.smart_disable = scsiopts.smart_disable = false;
|
ataopts.smart_disable = scsiopts.smart_disable = false;
|
||||||
} else if (!strcmp(optarg,"off")) {
|
} else if (!strcmp(optarg,"off")) {
|
||||||
ataopts.smart_disable = scsiopts.smart_disable = true;
|
ataopts.smart_disable = scsiopts.smart_disable = true;
|
||||||
ataopts.smart_enable = scsiopts.smart_enable = false;
|
ataopts.smart_enable = scsiopts.smart_enable = false;
|
||||||
|
} else if (optchar == 's') {
|
||||||
|
goto case_s_continued; // --set, see below
|
||||||
} else {
|
} else {
|
||||||
badarg = true;
|
badarg = true;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 'o':
|
case 'o':
|
||||||
if (!strcmp(optarg,"on")) {
|
if (!strcmp(optarg,"on")) {
|
||||||
ataopts.smart_auto_offl_enable = true;
|
ataopts.smart_auto_offl_enable = true;
|
||||||
@ -405,6 +436,7 @@ static const char * parse_options(int argc, char** argv,
|
|||||||
break;
|
break;
|
||||||
case 'H':
|
case 'H':
|
||||||
ataopts.smart_check_status = scsiopts.smart_check_status = true;
|
ataopts.smart_check_status = scsiopts.smart_check_status = true;
|
||||||
|
scsiopts.smart_ss_media_log = true;
|
||||||
break;
|
break;
|
||||||
case 'F':
|
case 'F':
|
||||||
if (!strcmp(optarg,"none")) {
|
if (!strcmp(optarg,"none")) {
|
||||||
@ -450,6 +482,9 @@ static const char * parse_options(int argc, char** argv,
|
|||||||
ataopts.sataphy = ataopts.sataphy_reset = true;
|
ataopts.sataphy = ataopts.sataphy_reset = true;
|
||||||
} else if (!strcmp(optarg,"background")) {
|
} else if (!strcmp(optarg,"background")) {
|
||||||
scsiopts.smart_background_log = true;
|
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")) {
|
} else if (!strcmp(optarg,"scterc")) {
|
||||||
ataopts.sct_erc_get = true;
|
ataopts.sct_erc_get = true;
|
||||||
} else if (!strcmp(optarg,"scttemp")) {
|
} else if (!strcmp(optarg,"scttemp")) {
|
||||||
@ -459,6 +494,27 @@ static const char * parse_options(int argc, char** argv,
|
|||||||
} else if (!strcmp(optarg,"scttemphist")) {
|
} else if (!strcmp(optarg,"scttemphist")) {
|
||||||
ataopts.sct_temp_hist = true;
|
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))) {
|
||||||
|
strcpy(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 && val <= 255)
|
||||||
|
ataopts.devstat_pages.push_back(val);
|
||||||
|
else
|
||||||
|
badarg = true;
|
||||||
|
|
||||||
} else if (!strncmp(optarg, "xerror", sizeof("xerror")-1)) {
|
} else if (!strncmp(optarg, "xerror", sizeof("xerror")-1)) {
|
||||||
int n1 = -1, n2 = -1, len = strlen(optarg);
|
int n1 = -1, n2 = -1, len = strlen(optarg);
|
||||||
unsigned val = 8;
|
unsigned val = 8;
|
||||||
@ -546,6 +602,7 @@ static const char * parse_options(int argc, char** argv,
|
|||||||
ataopts.smart_selftest_log = scsiopts.smart_selftest_log = true;
|
ataopts.smart_selftest_log = scsiopts.smart_selftest_log = true;
|
||||||
ataopts.smart_selective_selftest_log = true;
|
ataopts.smart_selective_selftest_log = true;
|
||||||
/* scsiopts.smart_background_log = true; */
|
/* scsiopts.smart_background_log = true; */
|
||||||
|
scsiopts.smart_ss_media_log = true;
|
||||||
break;
|
break;
|
||||||
case 'x':
|
case 'x':
|
||||||
ataopts.drive_info = scsiopts.drive_info = true;
|
ataopts.drive_info = scsiopts.drive_info = true;
|
||||||
@ -562,7 +619,12 @@ static const char * parse_options(int argc, char** argv,
|
|||||||
ataopts.sct_temp_sts = ataopts.sct_temp_hist = true;
|
ataopts.sct_temp_sts = ataopts.sct_temp_hist = true;
|
||||||
ataopts.sct_erc_get = true;
|
ataopts.sct_erc_get = true;
|
||||||
ataopts.sataphy = true;
|
ataopts.sataphy = true;
|
||||||
|
ataopts.get_set_used = true;
|
||||||
|
ataopts.get_aam = ataopts.get_apm = true;
|
||||||
|
ataopts.get_security = true;
|
||||||
|
ataopts.get_lookahead = ataopts.get_wcache = true;
|
||||||
scsiopts.smart_background_log = true;
|
scsiopts.smart_background_log = true;
|
||||||
|
scsiopts.smart_ss_media_log = true;
|
||||||
scsiopts.sasphy = true;
|
scsiopts.sasphy = true;
|
||||||
if (!output_format_set)
|
if (!output_format_set)
|
||||||
ataopts.output_format = 1; // '-f brief'
|
ataopts.output_format = 1; // '-f brief'
|
||||||
@ -616,6 +678,8 @@ static const char * parse_options(int argc, char** argv,
|
|||||||
} else if (!strcmp(optarg,"conveyance")) {
|
} else if (!strcmp(optarg,"conveyance")) {
|
||||||
testcnt++;
|
testcnt++;
|
||||||
ataopts.smart_selftest_type = CONVEYANCE_SELF_TEST;
|
ataopts.smart_selftest_type = CONVEYANCE_SELF_TEST;
|
||||||
|
} else if (!strcmp(optarg,"force")) {
|
||||||
|
ataopts.smart_selftest_force = true;
|
||||||
} else if (!strcmp(optarg,"afterselect,on")) {
|
} else if (!strcmp(optarg,"afterselect,on")) {
|
||||||
// scan remainder of disk after doing selected segment
|
// scan remainder of disk after doing selected segment
|
||||||
ataopts.smart_selective_args.scan_after_select = 2;
|
ataopts.smart_selective_args.scan_after_select = 2;
|
||||||
@ -662,15 +726,9 @@ static const char * parse_options(int argc, char** argv,
|
|||||||
ataopts.smart_selective_args.num_spans++;
|
ataopts.smart_selective_args.num_spans++;
|
||||||
ataopts.smart_selftest_type = SELECTIVE_SELF_TEST;
|
ataopts.smart_selftest_type = SELECTIVE_SELF_TEST;
|
||||||
}
|
}
|
||||||
} else if (!strncmp(optarg, "scttempint,", sizeof("scstempint,")-1)) {
|
} else if (!strncmp(optarg, "scttempint", sizeof("scstempint")-1)) {
|
||||||
unsigned interval = 0; int n1 = -1, n2 = -1, len = strlen(optarg);
|
strcpy(extraerror, "-t scttempint is no longer supported, use -l scttempint instead\n");
|
||||||
if (!( sscanf(optarg,"scttempint,%u%n,p%n", &interval, &n1, &n2) == 1
|
badarg = true;
|
||||||
&& 0 < interval && interval <= 0xffff && (n1 == len || n2 == len))) {
|
|
||||||
strcpy(extraerror, "Option -t 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, "vendor,", sizeof("vendor,")-1)) {
|
} else if (!strncmp(optarg, "vendor,", sizeof("vendor,")-1)) {
|
||||||
unsigned subcmd = ~0U; int n = -1;
|
unsigned subcmd = ~0U; int n = -1;
|
||||||
if (!( sscanf(optarg, "%*[a-z],0x%x%n", &subcmd, &n) == 1
|
if (!( sscanf(optarg, "%*[a-z],0x%x%n", &subcmd, &n) == 1
|
||||||
@ -733,6 +791,97 @@ static const char * parse_options(int argc, char** argv,
|
|||||||
EXIT(0);
|
EXIT(0);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
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;
|
||||||
|
}
|
||||||
|
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 {
|
||||||
|
sprintf(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 {
|
||||||
|
sprintf(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 (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 {
|
||||||
|
sprintf(extraerror, "Option -s standby,N must have 0 <= N <= 255\n");
|
||||||
|
badarg = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (!strcmp(name, "wcache")) {
|
||||||
|
if (get)
|
||||||
|
ataopts.get_wcache = true;
|
||||||
|
else if (off)
|
||||||
|
ataopts.set_wcache = -1;
|
||||||
|
else if (on)
|
||||||
|
ataopts.set_wcache = 1;
|
||||||
|
else
|
||||||
|
badarg = true;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
badarg = true;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
badarg = true;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
case opt_scan:
|
case opt_scan:
|
||||||
case opt_scan_open:
|
case opt_scan_open:
|
||||||
scan = optchar;
|
scan = optchar;
|
||||||
@ -747,7 +896,7 @@ static const char * parse_options(int argc, char** argv,
|
|||||||
// Check whether the option is a long option that doesn't map to -h.
|
// Check whether the option is a long option that doesn't map to -h.
|
||||||
if (arg[1] == '-' && optchar != 'h') {
|
if (arg[1] == '-' && optchar != 'h') {
|
||||||
// Iff optopt holds a valid option then argument must be missing.
|
// Iff optopt holds a valid option then argument must be missing.
|
||||||
if (optopt && (strchr(shortopts, optopt) != NULL)) {
|
if (optopt && (optopt >= opt_scan || strchr(shortopts, optopt))) {
|
||||||
pout("=======> ARGUMENT REQUIRED FOR OPTION: %s\n", arg+2);
|
pout("=======> ARGUMENT REQUIRED FOR OPTION: %s\n", arg+2);
|
||||||
printvalidarglistmessage(optopt);
|
printvalidarglistmessage(optopt);
|
||||||
} else
|
} else
|
||||||
@ -757,7 +906,7 @@ static const char * parse_options(int argc, char** argv,
|
|||||||
UsageSummary();
|
UsageSummary();
|
||||||
EXIT(FAILCMD);
|
EXIT(FAILCMD);
|
||||||
}
|
}
|
||||||
if (optopt) {
|
if (0 < optopt && optopt < '~') {
|
||||||
// Iff optopt holds a valid option then argument must be
|
// Iff optopt holds a valid option then argument must be
|
||||||
// missing. Note (BA) this logic seems to fail using Solaris
|
// missing. Note (BA) this logic seems to fail using Solaris
|
||||||
// getopt!
|
// getopt!
|
||||||
@ -781,7 +930,10 @@ static const char * parse_options(int argc, char** argv,
|
|||||||
// It would be nice to print the actual option name given by the user
|
// It would be nice to print the actual option name given by the user
|
||||||
// here, but we just print the short form. Please fix this if you know
|
// here, but we just print the short form. Please fix this if you know
|
||||||
// a clean way to do it.
|
// a clean way to do it.
|
||||||
pout("=======> INVALID ARGUMENT TO -%c: %s\n", optchar, optarg);
|
char optstr[] = { (char)optchar, 0 };
|
||||||
|
pout("=======> INVALID ARGUMENT TO -%s: %s\n",
|
||||||
|
(optchar == opt_set ? "-set" :
|
||||||
|
optchar == opt_smart ? "-smart" : optstr), optarg);
|
||||||
printvalidarglistmessage(optchar);
|
printvalidarglistmessage(optchar);
|
||||||
if (extraerror[0])
|
if (extraerror[0])
|
||||||
pout("=======> %s", extraerror);
|
pout("=======> %s", extraerror);
|
||||||
@ -1020,12 +1172,8 @@ static int main_worker(int argc, char **argv)
|
|||||||
// Parse input arguments
|
// Parse input arguments
|
||||||
ata_print_options ataopts;
|
ata_print_options ataopts;
|
||||||
scsi_print_options scsiopts;
|
scsi_print_options scsiopts;
|
||||||
const char * type = parse_options(argc, argv, ataopts, scsiopts);
|
bool print_type_only = false;
|
||||||
|
const char * type = parse_options(argc, argv, ataopts, scsiopts, print_type_only);
|
||||||
// '-d test' -> Report result of autodetection
|
|
||||||
bool print_type_only = (type && !strcmp(type, "test"));
|
|
||||||
if (print_type_only)
|
|
||||||
type = 0;
|
|
||||||
|
|
||||||
const char * name = argv[argc-1];
|
const char * name = argv[argc-1];
|
||||||
|
|
||||||
|
1442
smartd.8.in
1442
smartd.8.in
File diff suppressed because it is too large
Load Diff
249
smartd.conf.5.in
249
smartd.conf.5.in
@ -1,7 +1,7 @@
|
|||||||
.ig
|
.ig
|
||||||
Copyright (C) 2002-10 Bruce Allen <smartmontools-support@lists.sourceforge.net>
|
Copyright (C) 2002-10 Bruce Allen <smartmontools-support@lists.sourceforge.net>
|
||||||
|
|
||||||
$Id: smartd.conf.5.in 3284 2011-03-04 21:33:35Z chrfranke $
|
$Id: smartd.conf.5.in 3519 2012-03-06 20:01:44Z chrfranke $
|
||||||
|
|
||||||
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
|
||||||
@ -21,13 +21,20 @@ California, Santa Cruz. http://ssrc.soe.ucsc.edu/
|
|||||||
.SH NAME
|
.SH NAME
|
||||||
\fBsmartd.conf\fP \- SMART Disk Monitoring Daemon Configuration File\fP
|
\fBsmartd.conf\fP \- SMART Disk Monitoring Daemon Configuration File\fP
|
||||||
|
|
||||||
|
.\" %IF NOT OS Windows
|
||||||
.SH FULL PATH
|
.SH FULL PATH
|
||||||
.B /usr/local/etc/smartd.conf
|
.B /usr/local/etc/smartd.conf
|
||||||
|
|
||||||
|
.\" %ENDIF NOT OS Windows
|
||||||
.SH PACKAGE VERSION
|
.SH PACKAGE VERSION
|
||||||
CURRENT_SVN_VERSION CURRENT_SVN_DATE CURRENT_SVN_REV
|
CURRENT_SVN_VERSION CURRENT_SVN_DATE CURRENT_SVN_REV
|
||||||
|
|
||||||
.SH DESCRIPTION
|
.SH DESCRIPTION
|
||||||
|
.\" %IF NOT OS ALL
|
||||||
|
.\"! [This man page is generated for the OS_MAN_FILTER version of smartmontools.
|
||||||
|
.\"! It does not contain info specific to other platforms.]
|
||||||
|
.\"! .PP
|
||||||
|
.\" %ENDIF NOT OS ALL
|
||||||
\fB/usr/local/etc/smartd.conf\fP is the configuration file for the \fBsmartd\fP
|
\fB/usr/local/etc/smartd.conf\fP is the configuration file for the \fBsmartd\fP
|
||||||
daemon, which monitors the Self-Monitoring, Analysis and Reporting
|
daemon, which monitors the Self-Monitoring, Analysis and Reporting
|
||||||
Technology (SMART) system built into many ATA-3 and later ATA, IDE and
|
Technology (SMART) system built into many ATA-3 and later ATA, IDE and
|
||||||
@ -42,36 +49,44 @@ re-read the configuration file. This signal can be generated by typing
|
|||||||
\fB\<CONTROL-C\>\fP in the terminal window where \fBsmartd\fP is
|
\fB\<CONTROL-C\>\fP in the terminal window where \fBsmartd\fP is
|
||||||
running.
|
running.
|
||||||
|
|
||||||
.\" DO NOT MODIFY THIS OR THE FOLLOWING TWO LINES. WHAT FOLLOWS
|
|
||||||
.\" IS AUTOMATICALLY INCLUDED FROM THE FILE smartd.8.in
|
|
||||||
.\" STARTINCLUDE
|
|
||||||
|
|
||||||
.SH CONFIGURATION FILE /usr/local/etc/smartd.conf
|
.SH CONFIGURATION FILE /usr/local/etc/smartd.conf
|
||||||
In the absence of a configuration file, under Linux
|
In the absence of a configuration file
|
||||||
\fBsmartd\fP
|
\fBsmartd\fP will try to open all available devices.
|
||||||
will try to open the 20 ATA devices
|
.\" %IF OS Linux
|
||||||
|
Ubder linux will try to open the 20 ATA devices
|
||||||
.B /dev/hd[a-t]
|
.B /dev/hd[a-t]
|
||||||
and the 26 SCSI devices
|
and the 26 SCSI devices
|
||||||
.B /dev/sd[a-z].
|
.B /dev/sd[a-z].
|
||||||
|
.\" %ENDIF OS Linux
|
||||||
|
.\" %IF OS FreeBSD
|
||||||
Under FreeBSD,
|
Under FreeBSD,
|
||||||
\fBsmartd\fP
|
\fBsmartd\fP
|
||||||
will try to open all existing ATA devices (with entries in /dev)
|
will try to open all existing ATA/SATA devices (using ATA subsystem)
|
||||||
.B /dev/ad[0-9]+
|
.B /dev/ad[0-9]+
|
||||||
and all existing SCSI devices (using CAM subsystem).
|
and all existing SCSI/SAS/AHCI devices (using CAM subsystem).
|
||||||
|
.\" %ENDIF OS FreeBSD
|
||||||
|
.\" %IF OS NetBSD OpenBSD
|
||||||
Under NetBSD/OpenBSD,
|
Under NetBSD/OpenBSD,
|
||||||
\fBsmartd\fP
|
\fBsmartd\fP
|
||||||
will try to open all existing ATA devices (with entries in /dev)
|
will try to open all existing ATA devices (with entries in /dev)
|
||||||
.B /dev/wd[0-9]+c
|
.B /dev/wd[0-9]+c
|
||||||
and all existing SCSI devices
|
and all existing SCSI devices
|
||||||
.B /dev/sd[0-9]+c.
|
.B /dev/sd[0-9]+c.
|
||||||
|
.\" %ENDIF OS NetBSD OpenBSD
|
||||||
|
.\" %IF OS Solaris
|
||||||
Under Solaris \fBsmartd\fP will try to open all entries \fB"/dev/rdsk/c?t?d?s?"\fP for IDE/ATA and SCSI disk
|
Under Solaris \fBsmartd\fP will try to open all entries \fB"/dev/rdsk/c?t?d?s?"\fP for IDE/ATA and SCSI disk
|
||||||
devices, and entries \fB"/dev/rmt/*"\fP for SCSI tape devices.
|
devices, and entries \fB"/dev/rmt/*"\fP for SCSI tape devices.
|
||||||
|
.\" %ENDIF OS Solaris
|
||||||
|
.\" %IF OS Windows
|
||||||
Under Windows \fBsmartd\fP will try to open all entries \fB"/dev/hd[a-j]"\fP ("\\\\.\\PhysicalDrive[0-9]")
|
Under Windows \fBsmartd\fP will try to open all entries \fB"/dev/hd[a-j]"\fP ("\\\\.\\PhysicalDrive[0-9]")
|
||||||
for IDE/ATA devices on WinNT4/2000/XP, \fB"/dev/hd[a-d]"\fP
|
for IDE/ATA devices on WinNT4/2000/XP, \fB"/dev/hd[a-d]"\fP
|
||||||
(bitmask from "\\\\.\\SMARTVSD") for IDE/ATA devices on Win95/98/98SE/ME,
|
(bitmask from "\\\\.\\SMARTVSD") for IDE/ATA devices on Win95/98/98SE/ME,
|
||||||
and \fB"/dev/scsi[0-9][0-7]"\fP (ASPI adapter 0-9, ID 0-7) for SCSI
|
and \fB"/dev/scsi[0-9][0-7]"\fP (ASPI adapter 0-9, ID 0-7) for SCSI
|
||||||
devices on all versions of Windows.
|
devices on all versions of Windows.
|
||||||
|
.\" %ENDIF OS Windows
|
||||||
|
.\" %IF OS Darwin
|
||||||
Under Darwin, \fBsmartd\fP will open any ATA block storage device.
|
Under Darwin, \fBsmartd\fP will open any ATA block storage device.
|
||||||
|
.\" %ENDIF OS Darwin
|
||||||
|
|
||||||
This can be annoying if you have an ATA or SCSI device that hangs or
|
This can be annoying if you have an ATA or SCSI device that hangs or
|
||||||
misbehaves when receiving SMART commands. Even if this causes no
|
misbehaves when receiving SMART commands. Even if this causes no
|
||||||
@ -154,6 +169,7 @@ Section below!
|
|||||||
.B \ \ /dev/sda -a -d sat
|
.B \ \ /dev/sda -a -d sat
|
||||||
.B #
|
.B #
|
||||||
.nf
|
.nf
|
||||||
|
.\" %IF OS Linux
|
||||||
.B # Three disks connected to a MegaRAID controller
|
.B # Three disks connected to a MegaRAID controller
|
||||||
.B # Start short self-tests daily between 1-2, 2-3, and
|
.B # Start short self-tests daily between 1-2, 2-3, and
|
||||||
.B # 3-4 am.
|
.B # 3-4 am.
|
||||||
@ -162,6 +178,7 @@ Section below!
|
|||||||
.B \ \ /dev/sda -d megaraid,2 -a -s S/../.././03
|
.B \ \ /dev/sda -d megaraid,2 -a -s S/../.././03
|
||||||
.B
|
.B
|
||||||
.B #
|
.B #
|
||||||
|
.\" %ENDIF OS Linux
|
||||||
.nf
|
.nf
|
||||||
.B # Four ATA disks on a 3ware 6/7/8000 controller.
|
.B # Four ATA disks on a 3ware 6/7/8000 controller.
|
||||||
.B # Start short self-tests daily between midnight and 1am,
|
.B # Start short self-tests daily between midnight and 1am,
|
||||||
@ -192,33 +209,48 @@ Section below!
|
|||||||
.B # Three SATA disks on a HighPoint RocketRAID controller.
|
.B # Three SATA disks on a HighPoint RocketRAID controller.
|
||||||
.B # Start short self-tests daily between 1-2, 2-3, and
|
.B # Start short self-tests daily between 1-2, 2-3, and
|
||||||
.B # 3-4 am.
|
.B # 3-4 am.
|
||||||
|
.\" %IF OS Linux
|
||||||
.B # under Linux
|
.B # under Linux
|
||||||
.B \ \ /dev/sde -d hpt,1/1 -a -s S/../.././01
|
.B \ \ /dev/sde -d hpt,1/1 -a -s S/../.././01
|
||||||
.B \ \ /dev/sde -d hpt,1/2 -a -s S/../.././02
|
.B \ \ /dev/sde -d hpt,1/2 -a -s S/../.././02
|
||||||
.B \ \ /dev/sde -d hpt,1/3 -a -s S/../.././03
|
.B \ \ /dev/sde -d hpt,1/3 -a -s S/../.././03
|
||||||
.B # or under FreeBSD
|
.\" %ENDIF OS Linux
|
||||||
.B # /dev/hptrr -d hpt,1/1 -a -s S/../.././01
|
.\" %IF OS FreeBSD
|
||||||
.B # /dev/hptrr -d hpt,1/2 -a -s S/../.././02
|
.B # under FreeBSD
|
||||||
.B # /dev/hptrr -d hpt,1/3 -a -s S/../.././03
|
.B /dev/hptrr -d hpt,1/1 -a -s S/../.././01
|
||||||
|
.B /dev/hptrr -d hpt,1/2 -a -s S/../.././02
|
||||||
|
.B /dev/hptrr -d hpt,1/3 -a -s S/../.././03
|
||||||
|
.\" %ENDIF OS FreeBSD
|
||||||
.B #
|
.B #
|
||||||
.nf
|
.nf
|
||||||
.B # Two SATA disks connected to a HighPoint RocketRAID
|
.B # Two SATA disks connected to a HighPoint RocketRAID
|
||||||
.B # via a pmport device. Start long self-tests Sundays
|
.B # via a pmport device. Start long self-tests Sundays
|
||||||
.B # between midnight and 1am and 2-3 am.
|
.B # between midnight and 1am and 2-3 am.
|
||||||
|
.\" %IF OS Linux
|
||||||
.B # under Linux
|
.B # under Linux
|
||||||
.B \ \ /dev/sde -d hpt,1/4/1 -a -s L/../../7/00
|
.B \ \ /dev/sde -d hpt,1/4/1 -a -s L/../../7/00
|
||||||
.B \ \ /dev/sde -d hpt,1/4/2 -a -s L/../../7/02
|
.B \ \ /dev/sde -d hpt,1/4/2 -a -s L/../../7/02
|
||||||
.B # or under FreeBSD
|
.\" %ENDIF OS Linux
|
||||||
.B # /dev/hptrr -d hpt,1/4/1 -a -s L/../../7/00
|
.\" %IF OS FreeBSD
|
||||||
.B # /dev/hptrr -d hpt,1/4/2 -a -s L/../../7/02
|
.B # under FreeBSD
|
||||||
|
.B \ \ /dev/hptrr -d hpt,1/4/1 -a -s L/../../7/00
|
||||||
|
.B \ \ /dev/hptrr -d hpt,1/4/2 -a -s L/../../7/02
|
||||||
.B #
|
.B #
|
||||||
|
.\" %ENDIF OS FreeBSD
|
||||||
.nf
|
.nf
|
||||||
.B # Three SATA disks connected to an Areca
|
.B # Three SATA disks connected to an Areca
|
||||||
.B # RAID controller. Start long self-tests Sundays
|
.B # RAID controller. Start long self-tests Sundays
|
||||||
.B # between midnight and 3 am.
|
.B # between midnight and 3 am.
|
||||||
|
.\" %IF OS Linux
|
||||||
.B \ \ /dev/sg2 -d areca,1 -a -s L/../../7/00
|
.B \ \ /dev/sg2 -d areca,1 -a -s L/../../7/00
|
||||||
.B \ \ /dev/sg2 -d areca,2 -a -s L/../../7/01
|
.B \ \ /dev/sg2 -d areca,2 -a -s L/../../7/01
|
||||||
.B \ \ /dev/sg2 -d areca,3 -a -s L/../../7/02
|
.B \ \ /dev/sg2 -d areca,3 -a -s L/../../7/02
|
||||||
|
.\" %ENDIF OS Linux
|
||||||
|
.\" %IF OS FreeBSD
|
||||||
|
.B \ \ /dev/arcmsr0 -d areca,1 -a -s L/../../7/00
|
||||||
|
.B \ \ /dev/arcmsr0 -d areca,2 -a -s L/../../7/01
|
||||||
|
.B \ \ /dev/arcmsr0 -d areca,3 -a -s L/../../7/02
|
||||||
|
.\" %ENDIF OS FreeBSD
|
||||||
.B #
|
.B #
|
||||||
.nf
|
.nf
|
||||||
.B # The following line enables monitoring of the
|
.B # The following line enables monitoring of the
|
||||||
@ -252,10 +284,40 @@ may optionally be followed by Directives that will apply to all
|
|||||||
devices that are found in the scan. Please see below for additional
|
devices that are found in the scan. Please see below for additional
|
||||||
details.
|
details.
|
||||||
|
|
||||||
|
[NEW EXPERIMENTAL SMARTD FEATURE] If an entry in the configuration file
|
||||||
|
starts with
|
||||||
|
.B DEFAULT
|
||||||
|
instead of a device name, then all directives in this entry are set
|
||||||
|
as defaults for the next device entries.
|
||||||
|
|
||||||
|
This configuration:
|
||||||
|
|
||||||
|
.nf
|
||||||
|
\ \ DEFAULT -a -R5! -W 2,40,45 -I 194 -s L/../../7/00 -m admin@example.com
|
||||||
|
\ \ /dev/sda
|
||||||
|
\ \ /dev/sdb
|
||||||
|
\ \ /dev/sdc
|
||||||
|
\ \ DEFAULT -H -m admin@example.com
|
||||||
|
\ \ /dev/sdd
|
||||||
|
\ \ /dev/sde -d removable
|
||||||
|
.fi
|
||||||
|
|
||||||
|
has the same effect as:
|
||||||
|
|
||||||
|
.nf
|
||||||
|
\ \ /dev/sda -a -R5! -W 2,40,45 -I 194 -s L/../../7/00 -m admin@example.com
|
||||||
|
\ \ /dev/sdb -a -R5! -W 2,40,45 -I 194 -s L/../../7/00 -m admin@example.com
|
||||||
|
\ \ /dev/sdc -a -R5! -W 2,40,45 -I 194 -s L/../../7/00 -m admin@example.com
|
||||||
|
\ \ /dev/sdd -H -m admin@example.com
|
||||||
|
\ \ /dev/sde -d removable -H -m admin@example.com
|
||||||
|
.fi
|
||||||
|
|
||||||
.sp 2
|
.sp 2
|
||||||
The following are the Directives that may appear following the device
|
The following are the Directives that may appear following the device
|
||||||
name or
|
name or
|
||||||
.B DEVICESCAN
|
.B DEVICESCAN
|
||||||
|
or
|
||||||
|
.B DEFAULT
|
||||||
on any line of the
|
on any line of the
|
||||||
.B /usr/local/etc/smartd.conf
|
.B /usr/local/etc/smartd.conf
|
||||||
configuration file. Note that
|
configuration file. Note that
|
||||||
@ -284,14 +346,16 @@ Directive (see below). The individual ATA disks hosted by the 3ware
|
|||||||
controller appear to \fBsmartd\fP as normal ATA devices. Hence all
|
controller appear to \fBsmartd\fP as normal ATA devices. Hence all
|
||||||
the ATA directives can be used for these disks (but see note below).
|
the ATA directives can be used for these disks (but see note below).
|
||||||
|
|
||||||
|
.\" %IF OS Linux FreeBSD
|
||||||
.B If an Areca controller is used
|
.B If an Areca controller is used
|
||||||
then the corresponding SCSI generic device (/dev/sg?) must be listed,
|
then the corresponding device (SCSI /dev/sg? on Linux or /dev/arcmsr0 on
|
||||||
along with the \'\-d areca,N\' Directive (see below). The individual
|
FreeBSD) must be listed, along with the \'\-d areca,N\' Directive (see below).
|
||||||
SATA disks hosted by the Areca controller appear to \fBsmartd\fP as
|
The individual SATA disks hosted by the Areca controller appear to \fBsmartd\fP
|
||||||
normal ATA devices. Hence all the ATA directives can be used for
|
as normal ATA devices. Hence all the ATA directives can be used for
|
||||||
these disks. Areca firmware version 1.46 or later which supports
|
these disks. Areca firmware version 1.46 or later which supports
|
||||||
smartmontools must be used; Please see the \fBsmartctl\fP(8) man page
|
smartmontools must be used; Please see the \fBsmartctl\fP(8) man page
|
||||||
for further details.
|
for further details.
|
||||||
|
.\" %ENDIF OS Linux FreeBSD
|
||||||
.TP
|
.TP
|
||||||
.B \-d TYPE
|
.B \-d TYPE
|
||||||
Specifies the type of the device.
|
Specifies the type of the device.
|
||||||
@ -308,12 +372,13 @@ This is the default.
|
|||||||
\fBsmartd\fP
|
\fBsmartd\fP
|
||||||
from issuing SCSI commands to an ATA device.
|
from issuing SCSI commands to an ATA device.
|
||||||
|
|
||||||
|
.\" %IF NOT OS Darwin
|
||||||
.I scsi
|
.I scsi
|
||||||
\- the device type is SCSI. This prevents
|
\- the device type is SCSI. This prevents
|
||||||
\fBsmartd\fP
|
\fBsmartd\fP
|
||||||
from issuing ATA commands to a SCSI device.
|
from issuing ATA commands to a SCSI device.
|
||||||
|
|
||||||
.I sat
|
.I sat[,auto][,N]
|
||||||
\- the device type is SCSI to ATA Translation (SAT).
|
\- the device type is SCSI to ATA Translation (SAT).
|
||||||
This is for ATA disks that have a SCSI to ATA Translation (SAT) Layer
|
This is for ATA disks that have a SCSI to ATA Translation (SAT) Layer
|
||||||
(SATL) between the disk and the operating system.
|
(SATL) between the disk and the operating system.
|
||||||
@ -321,6 +386,10 @@ SAT defines two ATA PASS THROUGH SCSI commands, one 12 bytes long and
|
|||||||
the other 16 bytes long. The default is the 16 byte variant which can be
|
the other 16 bytes long. The default is the 16 byte variant which can be
|
||||||
overridden with either \'\-d sat,12\' or \'\-d sat,16\'.
|
overridden with either \'\-d sat,12\' or \'\-d sat,16\'.
|
||||||
|
|
||||||
|
If \'-d sat,auto\' is specified, device type SAT (for ATA/SATA disks) is
|
||||||
|
only used if the SCSI INQUIRY data reports a SATL (VENDOR: "ATA ").
|
||||||
|
Otherwise device type SCSI (for SCSI/SAS disks) is used.
|
||||||
|
|
||||||
.I usbcypress
|
.I usbcypress
|
||||||
\- this device type is for ATA disks that are behind a Cypress USB to PATA
|
\- this device type is for ATA disks that are behind a Cypress USB to PATA
|
||||||
bridge. This will use the ATACB proprietary scsi pass through command.
|
bridge. This will use the ATACB proprietary scsi pass through command.
|
||||||
@ -347,6 +416,8 @@ PORT does not exist or is not connected to a disk.
|
|||||||
\- this device type is for SATA disks that are behind a SunplusIT USB to SATA
|
\- this device type is for SATA disks that are behind a SunplusIT USB to SATA
|
||||||
bridge.
|
bridge.
|
||||||
|
|
||||||
|
.\" %ENDIF NOT OS Darwin
|
||||||
|
.\" %IF OS Linux
|
||||||
.I marvell
|
.I marvell
|
||||||
\- [Linux only] interact with SATA disks behind Marvell chip-set
|
\- [Linux only] interact with SATA disks behind Marvell chip-set
|
||||||
controllers (using the Marvell rather than libata driver).
|
controllers (using the Marvell rather than libata driver).
|
||||||
@ -360,6 +431,8 @@ In log files and email messages this disk will be identified as
|
|||||||
megaraid_disk_XXX with XXX in the range from 000 to 127 inclusive.
|
megaraid_disk_XXX with XXX in the range from 000 to 127 inclusive.
|
||||||
Please see the \fBsmartctl\fP(8) man page for further details.
|
Please see the \fBsmartctl\fP(8) man page for further details.
|
||||||
|
|
||||||
|
.\" %ENDIF OS Linux
|
||||||
|
.\" %IF OS FreeBSD Linux
|
||||||
.I 3ware,N
|
.I 3ware,N
|
||||||
\- [FreeBSD and Linux only] the device consists of one or more ATA disks
|
\- [FreeBSD and Linux only] the device consists of one or more ATA disks
|
||||||
connected to a 3ware RAID controller. The non-negative integer N
|
connected to a 3ware RAID controller. The non-negative integer N
|
||||||
@ -374,14 +447,18 @@ messages will make the most sense if you always list the 3ware SCSI
|
|||||||
logical device corresponding to the particular physical disks.
|
logical device corresponding to the particular physical disks.
|
||||||
Please see the \fBsmartctl\fP(8) man page for further details.
|
Please see the \fBsmartctl\fP(8) man page for further details.
|
||||||
|
|
||||||
|
.\" %ENDIF OS FreeBSD Linux
|
||||||
|
.\" %IF OS Linux FreeBSD
|
||||||
.I areca,N
|
.I areca,N
|
||||||
\- [Linux only] the device consists of one or more SATA disks connected to an
|
\- [Linux and FreeBSD only] the device consists of one or more SATA disks connected to an
|
||||||
Areca SATA RAID controller. The positive integer N (in the range from 1 to
|
Areca SATA RAID controller. The positive integer N (in the range from 1 to
|
||||||
24 inclusive) denotes which disk on the controller is monitored.
|
24 inclusive) denotes which disk on the controller is monitored.
|
||||||
In log files and email messages this disk will be identifed as
|
In log files and email messages this disk will be identifed as
|
||||||
areca_disk_XX with XX in the range from 01 to 24 inclusive.
|
areca_disk_XX with XX in the range from 01 to 24 inclusive.
|
||||||
Please see the \fBsmartctl\fP(8) man page for further details.
|
Please see the \fBsmartctl\fP(8) man page for further details.
|
||||||
|
|
||||||
|
.\" %ENDIF OS Linux FreeBSD
|
||||||
|
.\" %IF OS FreeBSD Linux
|
||||||
.I cciss,N
|
.I cciss,N
|
||||||
\- [FreeBSD and Linux only] the device consists of one or more SCSI/SAS disks
|
\- [FreeBSD and Linux only] the device consists of one or more SCSI/SAS disks
|
||||||
connected to a cciss RAID controller. The non-negative integer N (in the range
|
connected to a cciss RAID controller. The non-negative integer N (in the range
|
||||||
@ -395,7 +472,7 @@ Please see the \fBsmartctl\fP(8) man page for further details.
|
|||||||
connected to a HighPoint RocketRAID controller. The integer L is the
|
connected to a HighPoint RocketRAID controller. The integer L is the
|
||||||
controller id, the integer M is the channel number, and the integer N
|
controller id, the integer M is the channel number, and the integer N
|
||||||
is the PMPort number if it is available. The allowed values of L are
|
is the PMPort number if it is available. The allowed values of L are
|
||||||
from 1 to 4 inclusive, M are from 1 to 8 inclusive and N from 1 to 4
|
from 1 to 4 inclusive, M are from 1 to 16 inclusive and N from 1 to 4
|
||||||
if PMPort available. And also these values are limited by the model
|
if PMPort available. And also these values are limited by the model
|
||||||
of the HighPoint RocketRAID controller.
|
of the HighPoint RocketRAID controller.
|
||||||
In log files and email messages this disk will be identified as
|
In log files and email messages this disk will be identified as
|
||||||
@ -403,6 +480,7 @@ hpt_X/X/X and X/X/X is the same as L/M/N, note if no N indicated, N set
|
|||||||
to the default value 1.
|
to the default value 1.
|
||||||
Please see the \fBsmartctl\fP(8) man page for further details.
|
Please see the \fBsmartctl\fP(8) man page for further details.
|
||||||
|
|
||||||
|
.\" %ENDIF OS FreeBSD Linux
|
||||||
.I removable
|
.I removable
|
||||||
\- the device or its media is removable. This indicates to
|
\- the device or its media is removable. This indicates to
|
||||||
\fBsmartd\fP
|
\fBsmartd\fP
|
||||||
@ -528,9 +606,8 @@ valid arguments to this Directive are:
|
|||||||
error log has increased since the last check.
|
error log has increased since the last check.
|
||||||
|
|
||||||
.I xerror
|
.I xerror
|
||||||
\- [ATA only] [NEW EXPERIMENTAL SMARTD FEATURE] report if the number of ATA
|
\- [ATA only] report if the number of ATA errors reported in the Extended
|
||||||
errors reported in the Extended Comprehensive SMART error log has increased
|
Comprehensive SMART error log has increased since the last check.
|
||||||
since the last check.
|
|
||||||
|
|
||||||
If both \'\-l error\' and \'\-l xerror\' are specified, smartd checks
|
If both \'\-l error\' and \'\-l xerror\' are specified, smartd checks
|
||||||
the maximum of both values.
|
the maximum of both values.
|
||||||
@ -552,7 +629,44 @@ command-line option.
|
|||||||
options.]
|
options.]
|
||||||
|
|
||||||
[ATA only] Failed self-tests outdated by a newer successful extended
|
[ATA only] Failed self-tests outdated by a newer successful extended
|
||||||
self\-test are ignored.
|
self\-test are ignored. The warning email counter is reset if the
|
||||||
|
number of failed self tests dropped to 0. This typically happens when
|
||||||
|
an extended self\-test is run after all bad sectors have been reallocated.
|
||||||
|
|
||||||
|
.I offlinests[,ns]
|
||||||
|
\- [ATA only] report if the Offline Data Collection status has changed
|
||||||
|
since the last check. The report will be logged as LOG_CRIT if the new
|
||||||
|
status indicates an error. With some drives the status often changes,
|
||||||
|
therefore \'\-l offlinests\' is not enabled by '\-a\' Directive.
|
||||||
|
.\" %IF NOT OS Cygwin Windows
|
||||||
|
.\"! Appending \',ns\' (no standby) to this directive is not implemented
|
||||||
|
.\"! on OS_MAN_FILTER.
|
||||||
|
.\" %ENDIF NOT OS Cygwin Windows
|
||||||
|
.\" %IF OS Cygwin Windows
|
||||||
|
|
||||||
|
[Windows and Cygwin only] If \',ns\' (no standby) is appended to this
|
||||||
|
directive, smartd disables system auto standby as long as an Offline
|
||||||
|
Data Collection is in progress. See \'\-l selfteststs,ns\' below.
|
||||||
|
.\" %ENDIF OS Cygwin Windows
|
||||||
|
|
||||||
|
.I selfteststs[,ns]
|
||||||
|
\- [ATA only] report if the Self-Test execution status has changed
|
||||||
|
since the last check. The report will be logged as LOG_CRIT if the new
|
||||||
|
status indicates an error.
|
||||||
|
.\" %IF NOT OS Cygwin Windows
|
||||||
|
.\"! Appending \',ns\' (no standby) to this directive is not implemented
|
||||||
|
.\"! on OS_MAN_FILTER.
|
||||||
|
.\" %ENDIF NOT OS Cygwin Windows
|
||||||
|
.\" %IF OS Cygwin Windows
|
||||||
|
|
||||||
|
[Windows and Cygwin only] If \',ns\' (no standby) is appended to this
|
||||||
|
directive, smartd disables system auto standby as long as a Self-Test
|
||||||
|
is in progress. This prevents that a Self-Test is aborted because the
|
||||||
|
OS sets the system to a standby/sleep mode when idle. Smartd check
|
||||||
|
interval (\'\-i\' option) should be shorter than the configured idle
|
||||||
|
timeout. Auto standby is not disabled if the system is running on
|
||||||
|
battery.
|
||||||
|
.\" %ENDIF OS Cygwin Windows
|
||||||
|
|
||||||
.I scterc,READTIME,WRITETIME
|
.I scterc,READTIME,WRITETIME
|
||||||
\- [ATA only] [NEW EXPERIMENTAL SMARTD FEATURE] sets the SCT Error
|
\- [ATA only] [NEW EXPERIMENTAL SMARTD FEATURE] sets the SCT Error
|
||||||
@ -563,6 +677,32 @@ not supported. For RAID configurations, this is typically set to
|
|||||||
70,70 deciseconds.
|
70,70 deciseconds.
|
||||||
[Please see the \fBsmartctl \-l scterc\fP command-line option.]
|
[Please see the \fBsmartctl \-l scterc\fP command-line option.]
|
||||||
|
|
||||||
|
.TP
|
||||||
|
.B -e NAME[,VALUE]
|
||||||
|
[NEW EXPERIMENTAL SMARTD FEATURE] Sets non\-SMART device settings
|
||||||
|
when \fBsmartd\fP starts up and has no further effect.
|
||||||
|
[Please see the \fBsmartctl \-\-set\fP command-line option.]
|
||||||
|
Valid arguments are:
|
||||||
|
|
||||||
|
.I aam,[N|off]
|
||||||
|
\- [ATA only] Sets the Automatic Acoustic Management (AAM) feature.
|
||||||
|
|
||||||
|
.I apm,[N|off]
|
||||||
|
\- [ATA only] Sets the Advanced Power Management (APM) feature.
|
||||||
|
|
||||||
|
.I lookahead,[on|off]
|
||||||
|
\- [ATA only] Sets the read look-ahead feature.
|
||||||
|
|
||||||
|
.I security-freeze
|
||||||
|
\- [ATA only] Sets ATA Security feature to frozen mode.
|
||||||
|
|
||||||
|
.I standby,[N|off]
|
||||||
|
\- [ATA only] Sets the standby (spindown) timer and places the drive in the
|
||||||
|
IDLE mode.
|
||||||
|
|
||||||
|
.I wcache,[on|off]
|
||||||
|
\- [ATA only] Sets the volatile write cache feature.
|
||||||
|
|
||||||
.TP
|
.TP
|
||||||
.B \-s REGEXP
|
.B \-s REGEXP
|
||||||
Run Self-Tests or Offline Immediate Tests, at scheduled times. A
|
Run Self-Tests or Offline Immediate Tests, at scheduled times. A
|
||||||
@ -729,16 +869,20 @@ was started. If you wish to specify an explicit path to the mail
|
|||||||
executable (for example /usr/local/bin/mail) or a custom script to
|
executable (for example /usr/local/bin/mail) or a custom script to
|
||||||
run, please use the \'\-M exec\' Directive below.
|
run, please use the \'\-M exec\' Directive below.
|
||||||
|
|
||||||
|
.\" %IF OS Solaris
|
||||||
Note that by default under Solaris, in the previous paragraph,
|
Note that by default under Solaris, in the previous paragraph,
|
||||||
\'\fBmailx\fP\' and \'\fB/bin/mailx\fP\' are used, since Solaris
|
\'\fBmailx\fP\' and \'\fB/bin/mailx\fP\' are used, since Solaris
|
||||||
\'/bin/mail\' does not accept a \'\-s\' (Subject) command-line
|
\'/bin/mail\' does not accept a \'\-s\' (Subject) command-line
|
||||||
argument.
|
argument.
|
||||||
|
|
||||||
|
.\" %ENDIF OS Solaris
|
||||||
|
.\" %IF OS Windows
|
||||||
On Windows, the \'\fBBlat\fP\' mailer
|
On Windows, the \'\fBBlat\fP\' mailer
|
||||||
(\fBhttp://blat.sourceforge.net/\fP) is used by default.
|
(\fBhttp://blat.sourceforge.net/\fP) is used by default.
|
||||||
This mailer uses a different command line syntax, see
|
This mailer uses a different command line syntax, see
|
||||||
\'\-M exec\' below.
|
\'\-M exec\' below.
|
||||||
|
|
||||||
|
.\" %ENDIF OS Windows
|
||||||
Note also that there is a special argument
|
Note also that there is a special argument
|
||||||
.B <nomailer>
|
.B <nomailer>
|
||||||
which can be given to the \'\-m\' Directive in conjunction with the \'\-M
|
which can be given to the \'\-m\' Directive in conjunction with the \'\-M
|
||||||
@ -751,6 +895,7 @@ sending mail, this should help you to understand and fix them. If
|
|||||||
you have mail problems, we recommend running \fBsmartd\fP in debug
|
you have mail problems, we recommend running \fBsmartd\fP in debug
|
||||||
mode with the \'-d\' flag, using the \'-M test\' Directive described
|
mode with the \'-d\' flag, using the \'-M test\' Directive described
|
||||||
below.
|
below.
|
||||||
|
.\" %IF OS Windows
|
||||||
|
|
||||||
The following extension is available on Windows:
|
The following extension is available on Windows:
|
||||||
By specifying \'\fBmsgbox\fP\' as a mail address, a warning
|
By specifying \'\fBmsgbox\fP\' as a mail address, a warning
|
||||||
@ -758,8 +903,13 @@ By specifying \'\fBmsgbox\fP\' as a mail address, a warning
|
|||||||
Using both \'\fBmsgbox\fP\' and regular mail addresses is possible,
|
Using both \'\fBmsgbox\fP\' and regular mail addresses is possible,
|
||||||
if \'\fBmsgbox\fP\' is the first word in the comma separated list.
|
if \'\fBmsgbox\fP\' is the first word in the comma separated list.
|
||||||
With \'\fBsysmsgbox\fP\', a system modal (always on top) message box
|
With \'\fBsysmsgbox\fP\', a system modal (always on top) message box
|
||||||
is used. If running as a service, a service notification message box
|
is used.
|
||||||
(always shown on current visible desktop) is used.
|
|
||||||
|
If running as a service, a service notification message box
|
||||||
|
(always shown on current visible desktop) is used. Please note that
|
||||||
|
service notification message boxes are no longer supported on Windows
|
||||||
|
Vista/2008 or later.
|
||||||
|
.\" %ENDIF OS Windows
|
||||||
.TP
|
.TP
|
||||||
.B \-M TYPE
|
.B \-M TYPE
|
||||||
These Directives modify the behavior of the
|
These Directives modify the behavior of the
|
||||||
@ -790,6 +940,9 @@ then a two-day interval, then a four-day interval, and so on for each
|
|||||||
type of disk problem detected. Each interval is twice as long as the
|
type of disk problem detected. Each interval is twice as long as the
|
||||||
previous interval.
|
previous interval.
|
||||||
|
|
||||||
|
If a disk problem is no longer detected, the internal email counter is
|
||||||
|
reset. If the problem reappears a new warning email is sent immediately.
|
||||||
|
|
||||||
In addition, one may add zero or more of the following Directives:
|
In addition, one may add zero or more of the following Directives:
|
||||||
|
|
||||||
.I test
|
.I test
|
||||||
@ -844,7 +997,7 @@ scsi, this is the same as SMARTD_DEVICE. For 3ware RAID controllers,
|
|||||||
the form used is \'/dev/sdc [3ware_disk_01]\'. For HighPoint
|
the form used is \'/dev/sdc [3ware_disk_01]\'. For HighPoint
|
||||||
RocketRAID controller, the form is \'/dev/sdd [hpt_1/1/1]\' under Linux
|
RocketRAID controller, the form is \'/dev/sdd [hpt_1/1/1]\' under Linux
|
||||||
or \'/dev/hptrr [hpt_1/1/1]\' under FreeBSD. For Areca controllers, the
|
or \'/dev/hptrr [hpt_1/1/1]\' under FreeBSD. For Areca controllers, the
|
||||||
form is \'/dev/sg2 [areca_disk_09]\'. In these cases the device string
|
form is \'/dev/sg2 [areca_disk_09]\' on Linux or \'/dev/arcmsr0 [areca_disk_09]\' on FreeBSD. In these cases the device string
|
||||||
contains a space and is NOT quoted. So to use $SMARTD_DEVICESTRING in a
|
contains a space and is NOT quoted. So to use $SMARTD_DEVICESTRING in a
|
||||||
bash script you should probably enclose it in double quotes.
|
bash script you should probably enclose it in double quotes.
|
||||||
.IP \fBSMARTD_FAILTYPE\fP 4
|
.IP \fBSMARTD_FAILTYPE\fP 4
|
||||||
@ -945,12 +1098,14 @@ that would normally be provided to \'mail\'. Examples include:
|
|||||||
.B -m root -M exec /Example_1/bash/script/below
|
.B -m root -M exec /Example_1/bash/script/below
|
||||||
.fi
|
.fi
|
||||||
|
|
||||||
|
.\" %IF OS Windows
|
||||||
Note that on Windows, the syntax of the \'\fBBlat\fP\' mailer is
|
Note that on Windows, the syntax of the \'\fBBlat\fP\' mailer is
|
||||||
used:
|
used:
|
||||||
.nf
|
.nf
|
||||||
- -q -subject "$SMARTD_SUBJECT" -to "$SMARTD_ADDRESS"
|
- -q -subject "$SMARTD_SUBJECT" -to "$SMARTD_ADDRESS"
|
||||||
.fi
|
.fi
|
||||||
|
|
||||||
|
.\" %ENDIF OS Windows
|
||||||
If the \'\-m ADD\' Directive is given with the special address argument
|
If the \'\-m ADD\' Directive is given with the special address argument
|
||||||
.B <nomailer>
|
.B <nomailer>
|
||||||
then the executable pointed to by PATH is run in a shell with
|
then the executable pointed to by PATH is run in a shell with
|
||||||
@ -1071,6 +1226,10 @@ has increased between two check cycles. Some disks do not reset this
|
|||||||
attribute when a bad sector is reallocated.
|
attribute when a bad sector is reallocated.
|
||||||
See also \'\-v 197,increasing\' below.
|
See also \'\-v 197,increasing\' below.
|
||||||
|
|
||||||
|
The warning email counter is reset if the number of pending sectors
|
||||||
|
dropped to 0. This typically happens when all pending sectors have
|
||||||
|
been reallocated or could be read again.
|
||||||
|
|
||||||
A pending sector is a disk sector (containing 512 bytes of your data)
|
A pending sector is a disk sector (containing 512 bytes of your data)
|
||||||
which the device would like to mark as ``bad" and reallocate.
|
which the device would like to mark as ``bad" and reallocate.
|
||||||
Typically this is because your computer tried to read that sector, and
|
Typically this is because your computer tried to read that sector, and
|
||||||
@ -1099,6 +1258,10 @@ has increased since the last check cycle. Some disks do not reset this
|
|||||||
attribute when a bad sector is reallocated.
|
attribute when a bad sector is reallocated.
|
||||||
See also \'\-v 198,increasing\' below.
|
See also \'\-v 198,increasing\' below.
|
||||||
|
|
||||||
|
The warning email counter is reset if the number of offline uncorrectable
|
||||||
|
sectors dropped to 0. This typically happens when all offline uncorrectable
|
||||||
|
sectors have been reallocated or could be read again.
|
||||||
|
|
||||||
An offline uncorrectable sector is a disk sector which was not
|
An offline uncorrectable sector is a disk sector which was not
|
||||||
readable during an off\-line scan or a self\-test. This is important
|
readable during an off\-line scan or a self\-test. This is important
|
||||||
to know, because if you have data stored in this disk sector, and you
|
to know, because if you have data stored in this disk sector, and you
|
||||||
@ -1115,6 +1278,9 @@ If the limit \fBCRIT\fP is reached, a message with loglevel
|
|||||||
will be send if '-m' is specified. If only the limit \fBINFO\fP is
|
will be send if '-m' is specified. If only the limit \fBINFO\fP is
|
||||||
reached, a message with loglevel \fB\'LOG_INFO\'\fP will be logged.
|
reached, a message with loglevel \fB\'LOG_INFO\'\fP will be logged.
|
||||||
|
|
||||||
|
The warning email counter is reset if the temperature dropped below
|
||||||
|
\fBINFO\fP or \fBCRIT\fP-5 if \fBINFO\fP is not specified.
|
||||||
|
|
||||||
If this directive is used in conjunction with state persistence
|
If this directive is used in conjunction with state persistence
|
||||||
(\'\-s\' option), the min and max temperature values are preserved
|
(\'\-s\' option), the min and max temperature values are preserved
|
||||||
across boot cycles. The minimum temperature value is not updated
|
across boot cycles. The minimum temperature value is not updated
|
||||||
@ -1230,10 +1396,12 @@ to check the SMART health status,
|
|||||||
to report failures of Usage (rather than Prefail) Attributes,
|
to report failures of Usage (rather than Prefail) Attributes,
|
||||||
.B \'\-t\'
|
.B \'\-t\'
|
||||||
to track changes in both Prefailure and Usage Attributes,
|
to track changes in both Prefailure and Usage Attributes,
|
||||||
.B \'\-l\ selftest\'
|
.B \'\-l\ error\'
|
||||||
to report increases in the number of Self-Test Log errors,
|
|
||||||
.B \'\-l\ error\'
|
|
||||||
to report increases in the number of ATA errors,
|
to report increases in the number of ATA errors,
|
||||||
|
.B \'\-l\ selftest\'
|
||||||
|
to report increases in the number of Self-Test Log errors,
|
||||||
|
.B \'\-l\ selfteststs\'
|
||||||
|
to report changes of Self-Test execution status,
|
||||||
.B \'\-C 197\'
|
.B \'\-C 197\'
|
||||||
to report nonzero values of the current pending sector count, and
|
to report nonzero values of the current pending sector count, and
|
||||||
.B \'\-U 198\'
|
.B \'\-U 198\'
|
||||||
@ -1270,9 +1438,8 @@ string \fBDEVICESCAN\fP in capital letters, then \fBsmartd\fP will
|
|||||||
ignore any remaining lines in the configuration file, and will scan
|
ignore any remaining lines in the configuration file, and will scan
|
||||||
for devices.
|
for devices.
|
||||||
|
|
||||||
[NEW EXPERIMENTAL SMARTD FEATURE] Configuration entries for devices
|
Configuration entries for devices not found by the platform\-specific
|
||||||
not found by the platform\-specific device scanning may precede the
|
device scanning may precede the \fBDEVICESCAN\fP entry.
|
||||||
\fBDEVICESCAN\fP entry.
|
|
||||||
|
|
||||||
If \fBDEVICESCAN\fP is not followed by any Directives, then smartd
|
If \fBDEVICESCAN\fP is not followed by any Directives, then smartd
|
||||||
will scan for both ATA and SCSI devices, and will monitor all possible
|
will scan for both ATA and SCSI devices, and will monitor all possible
|
||||||
@ -1358,10 +1525,6 @@ this is interpreted as indicating that there was an internal error
|
|||||||
within the script, and a snippet of STDOUT/STDERR is logged to SYSLOG.
|
within the script, and a snippet of STDOUT/STDERR is logged to SYSLOG.
|
||||||
The remainder is flushed.
|
The remainder is flushed.
|
||||||
|
|
||||||
.\" ENDINCLUDE
|
|
||||||
.\" DO NOT MODIFY THIS OR PREVIOUS/NEXT LINES. THIS DEFINES THE
|
|
||||||
.\" END OF THE INCLUDED SECTION FROM smartd.8.in
|
|
||||||
|
|
||||||
.PP
|
.PP
|
||||||
.SH AUTHOR
|
.SH AUTHOR
|
||||||
\fBBruce Allen\fP smartmontools\-support@lists.sourceforge.net
|
\fBBruce Allen\fP smartmontools\-support@lists.sourceforge.net
|
||||||
@ -1378,7 +1541,7 @@ The following have made large contributions to smartmontools:
|
|||||||
\fBGuido Guenther\fP (Autoconf/Automake packaging)
|
\fBGuido Guenther\fP (Autoconf/Automake packaging)
|
||||||
\fBGeoffrey Keating\fP (Darwin ATA interface)
|
\fBGeoffrey Keating\fP (Darwin ATA interface)
|
||||||
\fBEduard Martinescu\fP (FreeBSD interface)
|
\fBEduard Martinescu\fP (FreeBSD interface)
|
||||||
\fBFr\*'ed\*'eric L. W. Meunier\fP (Web site and Mailing list)
|
\fBFr\['e]d\['e]ric L. W. Meunier\fP (Web site and Mailing list)
|
||||||
\fBGabriele Pohl\fP (Web site and Wiki, conversion from CVS to SVN)
|
\fBGabriele Pohl\fP (Web site and Wiki, conversion from CVS to SVN)
|
||||||
\fBKeiji Sawada\fP (Solaris ATA interface)
|
\fBKeiji Sawada\fP (Solaris ATA interface)
|
||||||
\fBManfred Schwarb\fP (Drive database)
|
\fBManfred Schwarb\fP (Drive database)
|
||||||
@ -1412,4 +1575,4 @@ SEE ALSO:
|
|||||||
|
|
||||||
.SH
|
.SH
|
||||||
SVN ID OF THIS PAGE:
|
SVN ID OF THIS PAGE:
|
||||||
$Id: smartd.conf.5.in 3284 2011-03-04 21:33:35Z chrfranke $
|
$Id: smartd.conf.5.in 3519 2012-03-06 20:01:44Z chrfranke $
|
||||||
|
655
smartd.cpp
655
smartd.cpp
File diff suppressed because it is too large
Load Diff
@ -1,71 +1,70 @@
|
|||||||
#!/bin/sh
|
#!/bin/sh
|
||||||
# $FreeBSD: ports/sysutils/smartmontools/files/smartd.in,v 1.2 2010/03/27 00:15:05 dougb Exp $
|
|
||||||
|
|
||||||
|
# $FreeBSD: ports/sysutils/smartmontools/files/smartd.in,v 1.4 2012/02/15 08:46:57 dougb Exp $
|
||||||
|
#
|
||||||
# PROVIDE: smartd
|
# PROVIDE: smartd
|
||||||
# REQUIRE: DAEMON
|
# REQUIRE: LOGIN
|
||||||
# BEFORE: LOGIN
|
|
||||||
# KEYWORD: shutdown nojail
|
# KEYWORD: shutdown nojail
|
||||||
|
#
|
||||||
# Define these smartd_* variables in one of these files:
|
# Define these smartd_* variables in one of these files:
|
||||||
# /etc/rc.conf
|
# /etc/rc.conf
|
||||||
# /etc/rc.conf.local
|
# /etc/rc.conf.local
|
||||||
# /etc/rc.conf.d/smartd
|
# /etc/rc.conf.d/smartd
|
||||||
#
|
#
|
||||||
# DO NOT CHANGE THESE DEFAULT VALUES HERE
|
# DO NOT CHANGE THESE DEFAULT VALUES HERE
|
||||||
#
|
|
||||||
smartd_enable="${smartd_enable-NO}"
|
|
||||||
smartd_pidfile="/var/run/smartd.pid"
|
|
||||||
|
|
||||||
. /etc/rc.subr
|
. /etc/rc.subr
|
||||||
|
|
||||||
name="smartd"
|
name=smartd
|
||||||
rcvar=`set_rcvar`
|
rcvar=smartd_enable
|
||||||
|
|
||||||
|
load_rc_config smartd
|
||||||
|
|
||||||
|
: ${smartd_enable:="NO"}
|
||||||
|
|
||||||
|
required_files=${smartd_config:="/usr/local/etc/smartd.conf"}
|
||||||
|
pidfile=${smartd_pidfile:="/var/run/smartd.pid"}
|
||||||
|
|
||||||
command="/usr/local/sbin/smartd"
|
command="/usr/local/sbin/smartd"
|
||||||
|
command_args="-c ${required_files} -p ${pidfile}"
|
||||||
|
|
||||||
extra_commands="reload report"
|
extra_commands="reload report"
|
||||||
reload_cmd="smartd_reload"
|
reload_cmd="smartd_reload"
|
||||||
report_cmd="smartd_report"
|
report_cmd="smartd_report"
|
||||||
|
|
||||||
|
start_precmd=smartd_prestart
|
||||||
|
|
||||||
|
smartd_prestart()
|
||||||
|
{
|
||||||
|
case "${smartd_flags}" in
|
||||||
|
-p*|*-p*)
|
||||||
|
err 1 'smartd_flags includes the -p option, use smartd_pidfile instead'
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
}
|
||||||
|
|
||||||
smartd_reload()
|
smartd_reload()
|
||||||
{
|
{
|
||||||
rc_pid=$(check_pidfile $pidfile $command)
|
local status
|
||||||
if [ -z "$rc_pid" ]; then
|
|
||||||
[ -n "$rc_fast" ] && return 0
|
if ! status=`run_rc_command status 2>&1`; then
|
||||||
_run_rc_notrunning
|
echo $status
|
||||||
return 1
|
return 1
|
||||||
fi
|
fi
|
||||||
echo 'Reloading smartd.'
|
echo 'Reloading smartd.'
|
||||||
kill -HUP $rc_pid
|
kill -HUP $rc_pid
|
||||||
}
|
}
|
||||||
|
|
||||||
smartd_report()
|
smartd_report()
|
||||||
{
|
{
|
||||||
rc_pid=$(check_pidfile $pidfile $command)
|
local status
|
||||||
if [ -z "$rc_pid" ]; then
|
|
||||||
[ -n "$rc_fast" ] && return 0
|
if ! status=`run_rc_command status 2>&1`; then
|
||||||
_run_rc_notrunning
|
echo $status
|
||||||
return 1
|
return 1
|
||||||
fi
|
fi
|
||||||
echo 'Checking SMART devices now.'
|
echo 'Checking SMART devices now.'
|
||||||
kill -USR1 $rc_pid
|
kill -USR1 $rc_pid
|
||||||
}
|
}
|
||||||
|
|
||||||
load_rc_config $name
|
|
||||||
|
|
||||||
: ${smartd_config="/usr/local/etc/smartd.conf"}
|
|
||||||
: ${smartd_flags="-c ${smartd_config}"}
|
|
||||||
|
|
||||||
pidfile="${smartd_pidfile}"
|
|
||||||
required_files="${smartd_config}"
|
|
||||||
|
|
||||||
case "${smartd_flags}" in
|
|
||||||
*-p\ *)
|
|
||||||
echo "ERROR: \$smartd_flags includes -p option." \
|
|
||||||
"Please use \$smartd_pidfile instead."
|
|
||||||
exit 1
|
|
||||||
;;
|
|
||||||
*)
|
|
||||||
smartd_flags="-p ${pidfile} ${smartd_flags}"
|
|
||||||
;;
|
|
||||||
esac
|
|
||||||
|
|
||||||
run_rc_command "$1"
|
run_rc_command "$1"
|
||||||
|
11
utility.cpp
11
utility.cpp
@ -3,8 +3,8 @@
|
|||||||
*
|
*
|
||||||
* Home page of code is: http://smartmontools.sourceforge.net
|
* Home page of code is: http://smartmontools.sourceforge.net
|
||||||
*
|
*
|
||||||
* Copyright (C) 2002-11 Bruce Allen <smartmontools-support@lists.sourceforge.net>
|
* Copyright (C) 2002-12 Bruce Allen <smartmontools-support@lists.sourceforge.net>
|
||||||
* Copyright (C) 2008-11 Christian Franke <smartmontools-support@lists.sourceforge.net>
|
* Copyright (C) 2008-12 Christian Franke <smartmontools-support@lists.sourceforge.net>
|
||||||
* Copyright (C) 2000 Michael Cornwell <cornwell@acm.org>
|
* Copyright (C) 2000 Michael Cornwell <cornwell@acm.org>
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or modify
|
* This program is free software; you can redistribute it and/or modify
|
||||||
@ -53,7 +53,7 @@
|
|||||||
#include "atacmds.h"
|
#include "atacmds.h"
|
||||||
#include "dev_interface.h"
|
#include "dev_interface.h"
|
||||||
|
|
||||||
const char * utility_cpp_cvsid = "$Id: utility.cpp 3305 2011-03-30 21:32:05Z chrfranke $"
|
const char * utility_cpp_cvsid = "$Id: utility.cpp 3500 2012-01-01 18:03:36Z chrfranke $"
|
||||||
UTILITY_H_CVSID INT64_H_CVSID;
|
UTILITY_H_CVSID INT64_H_CVSID;
|
||||||
|
|
||||||
const char * packet_types[] = {
|
const char * packet_types[] = {
|
||||||
@ -91,7 +91,7 @@ std::string format_version_info(const char * prog_name, bool full /*= false*/)
|
|||||||
"(build date "__DATE__")" // checkout without expansion of Id keywords
|
"(build date "__DATE__")" // checkout without expansion of Id keywords
|
||||||
#endif
|
#endif
|
||||||
" [%s] "BUILD_INFO"\n"
|
" [%s] "BUILD_INFO"\n"
|
||||||
"Copyright (C) 2002-11 by Bruce Allen, http://smartmontools.sourceforge.net\n",
|
"Copyright (C) 2002-12 by Bruce Allen, http://smartmontools.sourceforge.net\n",
|
||||||
prog_name, smi()->get_os_version_str().c_str()
|
prog_name, smi()->get_os_version_str().c_str()
|
||||||
);
|
);
|
||||||
if (!full)
|
if (!full)
|
||||||
@ -101,7 +101,8 @@ std::string format_version_info(const char * prog_name, bool full /*= false*/)
|
|||||||
"\n"
|
"\n"
|
||||||
"%s comes with ABSOLUTELY NO WARRANTY. This is free\n"
|
"%s comes with ABSOLUTELY NO WARRANTY. This is free\n"
|
||||||
"software, and you are welcome to redistribute it under\n"
|
"software, and you are welcome to redistribute it under\n"
|
||||||
"the terms of the GNU General Public License Version 2.\n"
|
"the terms of the GNU General Public License; either\n"
|
||||||
|
"version 2, or (at your option) any later version.\n"
|
||||||
"See http://www.gnu.org for further details.\n"
|
"See http://www.gnu.org for further details.\n"
|
||||||
"\n",
|
"\n",
|
||||||
prog_name
|
prog_name
|
||||||
|
18
utility.h
18
utility.h
@ -26,7 +26,7 @@
|
|||||||
#ifndef UTILITY_H_
|
#ifndef UTILITY_H_
|
||||||
#define UTILITY_H_
|
#define UTILITY_H_
|
||||||
|
|
||||||
#define UTILITY_H_CVSID "$Id: utility.h 3305 2011-03-30 21:32:05Z chrfranke $"
|
#define UTILITY_H_CVSID "$Id: utility.h 3475 2011-11-10 21:43:40Z chrfranke $"
|
||||||
|
|
||||||
#include <time.h>
|
#include <time.h>
|
||||||
#include <sys/types.h> // for regex.h (according to POSIX)
|
#include <sys/types.h> // for regex.h (according to POSIX)
|
||||||
@ -36,8 +36,14 @@
|
|||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <string>
|
#include <string>
|
||||||
|
|
||||||
#if !defined(__GNUC__) && !defined(__attribute__)
|
#ifndef __GNUC__
|
||||||
#define __attribute__(x) /**/
|
#define __attribute_format_printf(x, y) /**/
|
||||||
|
#elif defined(__MINGW32__) && __USE_MINGW_ANSI_STDIO
|
||||||
|
// Check format of __mingw_*printf() instead of MSVCRT.DLL:*printf()
|
||||||
|
#define __attribute_format_printf(x, y) __attribute__((format (gnu_printf, x, y)))
|
||||||
|
#define HAVE_WORKING_SNPRINTF 1
|
||||||
|
#else
|
||||||
|
#define __attribute_format_printf(x, y) __attribute__((format (printf, x, y)))
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// Make version information string
|
// Make version information string
|
||||||
@ -45,13 +51,13 @@ std::string format_version_info(const char * prog_name, bool full = false);
|
|||||||
|
|
||||||
// return (v)sprintf() formated std::string
|
// return (v)sprintf() formated std::string
|
||||||
std::string strprintf(const char * fmt, ...)
|
std::string strprintf(const char * fmt, ...)
|
||||||
__attribute__ ((format (printf, 1, 2)));
|
__attribute_format_printf(1, 2);
|
||||||
std::string vstrprintf(const char * fmt, va_list ap);
|
std::string vstrprintf(const char * fmt, va_list ap);
|
||||||
|
|
||||||
#ifndef HAVE_WORKING_SNPRINTF
|
#ifndef HAVE_WORKING_SNPRINTF
|
||||||
// Substitute by safe replacement functions
|
// Substitute by safe replacement functions
|
||||||
int safe_snprintf(char *buf, int size, const char *fmt, ...)
|
int safe_snprintf(char *buf, int size, const char *fmt, ...)
|
||||||
__attribute__ ((format (printf, 3, 4)));
|
__attribute_format_printf(3, 4);
|
||||||
int safe_vsnprintf(char *buf, int size, const char *fmt, va_list ap);
|
int safe_vsnprintf(char *buf, int size, const char *fmt, va_list ap);
|
||||||
#define snprintf safe_snprintf
|
#define snprintf safe_snprintf
|
||||||
#define vsnprintf safe_vsnprintf
|
#define vsnprintf safe_vsnprintf
|
||||||
@ -75,7 +81,7 @@ void dateandtimezoneepoch(char *buffer, time_t tval);
|
|||||||
// itself is defined differently in smartctl and smartd. So the
|
// itself is defined differently in smartctl and smartd. So the
|
||||||
// function definition(s) are in smartd.c and in smartctl.c.
|
// function definition(s) are in smartd.c and in smartctl.c.
|
||||||
void pout(const char *fmt, ...)
|
void pout(const char *fmt, ...)
|
||||||
__attribute__ ((format (printf, 1, 2)));
|
__attribute_format_printf(1, 2);
|
||||||
|
|
||||||
// replacement for perror() with redirected output.
|
// replacement for perror() with redirected output.
|
||||||
void syserror(const char *message);
|
void syserror(const char *message);
|
||||||
|
Loading…
Reference in New Issue
Block a user