mirror of
https://git.proxmox.com/git/mirror_smartmontools-debian
synced 2025-07-24 14:55:06 +00:00
Imported Upstream version 6.4+svn4214
This commit is contained in:
parent
d2cd5c38d6
commit
6b80b4d2c7
295
ChangeLog
295
ChangeLog
@ -1,4 +1,297 @@
|
||||
$Id: ChangeLog 4109 2015-06-04 16:30:15Z chrfranke $
|
||||
$Id: ChangeLog 4214 2016-01-24 22:53:37Z samm2 $
|
||||
|
||||
2016-01-24 Alex Samorukov <samm@os2.kiev.ua>
|
||||
|
||||
os_freebsd.cpp: fix possible reallocf with 0 bytes arg (ticket #640)
|
||||
drivedb.h: add Corsair Extreme SSD (ticket #642)
|
||||
os_darwin.cpp: fix error reporting if open fails
|
||||
|
||||
2016-01-23 Alex Samorukov <samm@os2.kiev.ua>
|
||||
|
||||
os_darwin.cpp: do not print bogus memory allocation error message if
|
||||
there are no devices found
|
||||
|
||||
2016-01-22 Christian Franke <franke@computer.org>
|
||||
|
||||
Various fixes suggested by clang analyser (ticket #640):
|
||||
dev_areca.cpp: Fix check of ARCMSR_READ_RQBUFFER result.
|
||||
knowndrives.cpp: Add missing member initialization.
|
||||
smartd.cpp: Fix crash on missing argument to '-s' directive.
|
||||
Add missing variable initialization. Remove redundant assignment.
|
||||
|
||||
2016-01-21 Alex Samorukov <samm@os2.kiev.ua>
|
||||
|
||||
drivedb.h: Added ADATA SP550 SSD (ticket #638)
|
||||
os_freebsd.cpp: Reduce variable scope where possible (cppcheck: variableScope)
|
||||
os_openbsd/os_netbsd - removed never used warning code defines (cppcheck)
|
||||
|
||||
2016-01-21 Christian Franke <franke@computer.org>
|
||||
|
||||
ataprint.cpp, smartd.cpp: Don't issue SCT commands if ATA Security
|
||||
is locked (ticket #637).
|
||||
|
||||
2016-01-19 Alex Samorukov <samm@os2.kiev.ua>
|
||||
|
||||
drivedb.h:
|
||||
- Samsung PM871 SSD family (ticket #636)
|
||||
- Fixed detection for Samsung SSD 850 EVO mSATA 120GB (ticket #635)
|
||||
- Fixed Western Digital Caviar Black regexp, extended WD Black (ticket #631)
|
||||
|
||||
2016-01-06 Christian Franke <franke@computer.org>
|
||||
|
||||
drivedb.h:
|
||||
- SandForce Driven SSDs: Extra warning entry for buggy Corsair Force LS
|
||||
(ticket #628)
|
||||
- Innodisk 3MG2-P SSDs: 1.8" variant
|
||||
- Innodisk 3ME3 SSDs
|
||||
- USB: Seagate Expansion Portable (0x0bc2:0x2322) (ticket #627)
|
||||
- USB: Jess-Link (0x0dbf:0x9001)
|
||||
|
||||
2016-01-01 Christian Franke <franke@computer.org>
|
||||
|
||||
Happy New Year! Update copyright year in version info.
|
||||
|
||||
2015-12-19 Christian Franke <franke@computer.org>
|
||||
|
||||
Makefile.am: Fix path of 'smart-pkg-uninstall' (Regression from r4190).
|
||||
|
||||
update-smart-drivedb.8.in: Fix platform specific formatting.
|
||||
|
||||
2015-12-18 Alex Samorukov <samm@os2.kiev.ua>
|
||||
|
||||
os_netbsd.cpp, os_openbsd.cpp: fix ioctl returtn value check
|
||||
os_darwin.cpp: fix error handling
|
||||
os_darwin: use /usr/local/ prefix to install on 10.11 (El Capitan)
|
||||
|
||||
2015-12-16 Douglas Gilbert <dgilbert@interlog.com>
|
||||
|
||||
scsiprint.cpp: stop tape drive looking for Solid State media
|
||||
log page (ticket #314).
|
||||
|
||||
2015-12-14 Douglas Gilbert <dgilbert@interlog.com>
|
||||
|
||||
scsiprint.cpp: fix compiler warning for is_tape. Clean code around
|
||||
handling of tape drives.
|
||||
|
||||
2015-12-14 Christian Franke <franke@computer.org>
|
||||
|
||||
drivedb.h:
|
||||
- Intel 320 Series SSDs: 1.8" microSATA
|
||||
- Intel 53x and Pro 2500 Series SSDs: Rename, add 535 (ticket #625),
|
||||
add Pro 2500
|
||||
- Intel 730 and DC S35x0/3610/3700 Series SSDs: Rename,
|
||||
add S3510/3610, 1.2TB, 1.6TB
|
||||
- USB: LaCie (0x059f:0x106f) (ticket #624)
|
||||
- USB: WD My Passport (0x1058:0x071a, 0x1058:0x0816)
|
||||
- USB: Initio (0x13fd:0x1650)
|
||||
- USB: Unknown (0xabcd:0x6103)
|
||||
|
||||
update-smart-drivedb.in: Add '-s SMARTCTL' option.
|
||||
update-smart-drivedb.8.in: Document it.
|
||||
|
||||
2015-12-07 Christian Franke <franke@computer.org>
|
||||
|
||||
configure.ac: Append 'svn' to list of download tools.
|
||||
|
||||
update-smart-drivedb.in: Use HTTPS download by default.
|
||||
Add options '-t TOOL', '-u LOCATION', '--cacert FILE',
|
||||
'--capath DIR', '--insecure' and '--dryrun'.
|
||||
Add 'svn' as new download tool.
|
||||
Ignore differences in SVN Id string (re-added).
|
||||
Remove usage of 'which' command.
|
||||
|
||||
update-smart-drivedb.8.in: Document the new options.
|
||||
|
||||
2015-11-23 Christian Franke <franke@computer.org>
|
||||
|
||||
atacmds.cpp: parse_attribute_def(): Init buffers before sscanf() call
|
||||
(cppcheck-1.71: uninitvar).
|
||||
|
||||
scsiprint.cpp: Fix GLTSD bit set/cleared info messages (ticket #621).
|
||||
|
||||
2015-11-22 Christian Franke <franke@computer.org>
|
||||
|
||||
Makefile.am: Add NEWS file to svnversion.h target.
|
||||
|
||||
os_win32/installer.nsi: Select 64-bit version on 64-bit Windows.
|
||||
Fix installation of runcmda.exe. Update links.
|
||||
|
||||
2015-11-15 Christian Franke <franke@computer.org>
|
||||
|
||||
configure.ac: Check whether MinGW adds an application manifest.
|
||||
|
||||
Makefile.am: Add default manifest for MinGW builds.
|
||||
|
||||
os_win32/default.manifest: New default application manifest.
|
||||
Remove external application manifests.
|
||||
|
||||
os_win32/installer.nsi: Use macros from 'LogicLib.nsh' where possible.
|
||||
Add missing MessageBox /SD options.
|
||||
Remove external application manifests.
|
||||
|
||||
2015-11-07 Christian Franke <franke@computer.org>
|
||||
|
||||
drivedb.h:
|
||||
- Micron M500DC/M510DC Enterprise SSDs: Rename, add M510DC
|
||||
- SandForce Driven SSDs: Mushkin Chronos 7mm/MX/G2, Enhanced ECO2
|
||||
- Innodisk 3MG2-P SSDs
|
||||
- SiliconMotion based SSDs: Crucial BX100 (ticket #597)
|
||||
|
||||
2015-10-31 Christian Franke <franke@computer.org>
|
||||
|
||||
atacmds.cpp, atacmds.h, knowndrives.cpp, knowndrives.h:
|
||||
Read default SMART attribute settings from drivedb.h (ticket #465).
|
||||
Remove hard-coded attribute names and format settings.
|
||||
|
||||
drivedb.h: Uncomment default settings to create the "DEFAULT" entry.
|
||||
Add ",HDD" or ",SSD" to HDD/SSD specific settings.
|
||||
|
||||
smartctl.cpp, smartd.cpp: Use new database initialization function.
|
||||
|
||||
Create branch RELEASE_6_4_DRIVEDB with last drivedb.h file
|
||||
compatible with smartmontools 6.4.
|
||||
|
||||
2015-10-22 Paul Grabinar <pgrabinar@ocz.com>
|
||||
|
||||
drivedb.h:
|
||||
- SandForce Driven SSDs: OCZ RevoDrive 350, Z-Drive 4500
|
||||
- Indilinx Barefoot 3 based SSDs: Add attributes,
|
||||
OCZ ARC 100, Saber 1000, Vector 180, Vertex 460A
|
||||
- OCZ Intrepid 3000 SSDs: Intrepid 3700
|
||||
- OCZ Trion
|
||||
|
||||
2015-10-20 Christian Franke <franke@computer.org>
|
||||
|
||||
Reduce variable scope where possible (cppcheck: variableScope).
|
||||
|
||||
Makefile.am: Remove *.s from files used to generate svnversion.h.
|
||||
|
||||
2015-10-18 Alex Samorukov <samm@os2.kiev.ua>
|
||||
|
||||
fixes suggested by cppcheck:
|
||||
Check realloc result to avoid memory leak (memleakOnRealloc)
|
||||
Fix printf() signednsess (invalidPrintfArgType_sint)
|
||||
|
||||
2015-10-17 Christian Franke <franke@computer.org>
|
||||
|
||||
Various fixes suggested by cppcheck:
|
||||
Close FILE pointer before reopening it (cppcheck: publicAllocationError).
|
||||
Add missing member initializations to ctors (cppcheck: uninitMemberVar).
|
||||
Remove redundant nullptr check (cppcheck: nullPointerRedundantCheck).
|
||||
Remove redundant assignments (cppcheck: redundantAssignment).
|
||||
Clarify calculation precedence (cppcheck: clarifyCalculation).
|
||||
Use C++-style casts for pointer types (cppcheck: cstyleCast).
|
||||
Remove duplicate on both sides of '||' (cppcheck: duplicateExpression).
|
||||
Declare ctors with one argument as 'explicit'
|
||||
(cppcheck: noExplicitConstructor).
|
||||
Remove unread variables and assignments (cppcheck: unreadVariable).
|
||||
Fix signedness of sscanf() formats strings
|
||||
(cppcheck: invalidScanfArgType_int).
|
||||
|
||||
2015-10-14 Christian Franke <franke@computer.org>
|
||||
|
||||
configure.ac: Disable os_solaris_ata.o by default.
|
||||
Add --with-solaris-sparc-ata option to enable.
|
||||
Makefile.am: Exclude os_solaris_ata.s from source tarball
|
||||
(Debian bug 729842).
|
||||
os_solaris.cpp: Check for WITH_SOLARIS_SPARC_ATA instead of __sparc.
|
||||
|
||||
2015-10-13 Christian Franke <franke@computer.org>
|
||||
|
||||
Makefile.am: Fix error handling in various shell scripts.
|
||||
|
||||
2015-10-13 Casper Dik <...>
|
||||
|
||||
os_solaris.cpp: Detect SATA devices as SCSI devices. This adds
|
||||
support for auto detection of SATA devices behind SAT layer.
|
||||
Set USCSI_SILENT flag to suppress /dev/console messages on command
|
||||
error.
|
||||
|
||||
2015-10-11 Christian Franke <franke@computer.org>
|
||||
|
||||
drivedb.h: SiliconMotion based SSDs: Transcend SSD370S, SSD420,
|
||||
update attribute 245 (ticket #595, ticket #602).
|
||||
|
||||
2015-10-10 Christian Franke <franke@computer.org>
|
||||
|
||||
Makefile.am: Use MKDIR_P to create directories
|
||||
(available since automake 1.10).
|
||||
|
||||
os_win32.cpp: Detect USB ID if WMI reports type name "SCSI" instead
|
||||
of "USBSTOR".
|
||||
Detect USB ID also if drive letter is specified as device name.
|
||||
|
||||
2015-10-04 Christian Franke <franke@computer.org>
|
||||
|
||||
drivedb.h:
|
||||
- USB: Genesys Logic (0x05e3:0x0735)
|
||||
- USB: Addonics (0x0bf6:0x1001): unsupported (ticket #609)
|
||||
- USB: Initio (0x13fd:0x3920)
|
||||
- USB: JMicron JMS539 (0x152d:0x0539, 0x0100): Set from -d usbjmicron to
|
||||
unsupported because some devices may require -d sat instead (ticket #552).
|
||||
- USB: JMicron (0x152d:0x0565) (ticket #607)
|
||||
- USB: VIA VL711 (0x2109:0x0711): unsupported (ticket #594)
|
||||
- USB: Hitachi Touro Mobile (0x4971:0x1024)
|
||||
|
||||
2015-09-25 Christian Franke <franke@computer.org>
|
||||
|
||||
scsiata.cpp: Ignore SAT ATA PASS-THROUGH fixed format sense data if no
|
||||
ATA status bit is set (ticket #612).
|
||||
|
||||
2015-09-23 Alex Samorukov <samm@os2.kiev.ua>
|
||||
|
||||
drivedb.h: Innostor USB3.0 to SATAIII bridge (#611)
|
||||
|
||||
2015-09-21 Alex Samorukov <samm@os2.kiev.ua>
|
||||
|
||||
drivedb.h: decode 188 attribute for the "Seagate Enterprise Capacity
|
||||
3.5 HDD" drives family, (see #551).
|
||||
|
||||
2015-09-04 Alex Samorukov <samm@os2.kiev.ua>
|
||||
|
||||
Makefile.am: integrate darwin dmg build process to the Makefile
|
||||
|
||||
2015-09-03 Alex Samorukov <samm@os2.kiev.ua>
|
||||
|
||||
os_darwin: Initial import of the files required to build
|
||||
OSX/smartmontools native package (see #555).
|
||||
|
||||
2015-08-27 Alex Samorukov <samm@os2.kiev.ua>
|
||||
|
||||
Homepage URL updated from the sourceforge to smartmontools.org (r4120)
|
||||
|
||||
2015-08-26 Alex Samorukov <samm@os2.kiev.ua>
|
||||
|
||||
os_darwin.cpp: Implement get_os_version_str() for the darwin.
|
||||
|
||||
2015-08-17 Christian Franke <franke@computer.org>
|
||||
|
||||
scsiata.cpp: Ignore bogus SCSI sense_key if ATA status in
|
||||
SAT ATA Return Descriptor indicates success (ticket #548).
|
||||
|
||||
2015-08-08 Christian Franke <franke@computer.org>
|
||||
|
||||
os_win32.cpp: Fix get_os_version_str() for Windows >= 8.1.
|
||||
Add Windows 10 Final.
|
||||
|
||||
2015-08-02 Christian Franke <franke@computer.org>
|
||||
|
||||
configure.ac: Remove '--disable-drivedb',
|
||||
'--enable-savestates', '--enable-attributelog'.
|
||||
Print error message if used.
|
||||
|
||||
2015-07-15 Christian Franke <franke@computer.org>
|
||||
|
||||
autogen.sh: Drop support for automake 1.7 - 1.9.x.
|
||||
Rework search for automake-VERSION.
|
||||
configure.ac: Drop support for autoconf 2.5x.
|
||||
Drop support for automake 1.7 - 1.9.x.
|
||||
Remove --with-docdir option.
|
||||
|
||||
2015-06-24 Alex Samorukov <samm@os2.kiev.ua>
|
||||
|
||||
drivedb.h:
|
||||
- USB: SimpleTech 3.0 bridge (0x4971:0x8017), reported in #554
|
||||
|
||||
2015-06-04 Christian Franke <franke@computer.org>
|
||||
|
||||
|
4
INSTALL
4
INSTALL
@ -1,10 +1,10 @@
|
||||
Smartmontools installation instructions
|
||||
=======================================
|
||||
|
||||
$Id: INSTALL 4094 2015-05-27 21:41:17Z chrfranke $
|
||||
$Id: INSTALL 4120 2015-08-27 16:12:21Z samm2 $
|
||||
|
||||
Please also see the smartmontools home page:
|
||||
http://smartmontools.sourceforge.net/
|
||||
http://www.smartmontools.org/
|
||||
|
||||
Table of contents:
|
||||
|
||||
|
237
Makefile.am
237
Makefile.am
@ -1,6 +1,6 @@
|
||||
## Process this file with automake to produce Makefile.in
|
||||
#
|
||||
# $Id: Makefile.am 4102 2015-06-01 19:25:47Z chrfranke $
|
||||
# $Id: Makefile.am 4192 2015-12-19 13:59:40Z chrfranke $
|
||||
#
|
||||
|
||||
@SET_MAKE@
|
||||
@ -96,7 +96,6 @@ EXTRA_smartctl_SOURCES = \
|
||||
os_qnxnto.h \
|
||||
os_solaris.cpp \
|
||||
os_solaris.h \
|
||||
os_solaris_ata.s \
|
||||
os_win32.cpp \
|
||||
os_generic.cpp \
|
||||
os_generic.h \
|
||||
@ -111,8 +110,8 @@ EXTRA_smartctl_SOURCES = \
|
||||
|
||||
if OS_WIN32_MINGW
|
||||
|
||||
smartctl_LDADD += smartctl_res.o
|
||||
smartctl_DEPENDENCIES += smartctl_res.o
|
||||
smartctl_LDADD += smartctl_res.o $(os_win32_manifest)
|
||||
smartctl_DEPENDENCIES += smartctl_res.o $(os_win32_manifest)
|
||||
|
||||
endif
|
||||
|
||||
@ -156,7 +155,6 @@ EXTRA_smartd_SOURCES = \
|
||||
os_qnxnto.h \
|
||||
os_solaris.cpp \
|
||||
os_solaris.h \
|
||||
os_solaris_ata.s \
|
||||
os_win32.cpp \
|
||||
os_generic.cpp \
|
||||
os_generic.h \
|
||||
@ -177,11 +175,14 @@ smartd_SOURCES += \
|
||||
os_win32/syslog_win32.cpp \
|
||||
os_win32/syslog.h
|
||||
|
||||
smartd_LDADD += smartd_res.o
|
||||
smartd_DEPENDENCIES += smartd_res.o
|
||||
smartd_LDADD += smartd_res.o $(os_win32_manifest)
|
||||
smartd_DEPENDENCIES += smartd_res.o $(os_win32_manifest)
|
||||
|
||||
endif
|
||||
|
||||
# Exclude from source tarball
|
||||
nodist_EXTRA_smartctl_SOURCES = os_solaris_ata.s
|
||||
nodist_EXTRA_smartd_SOURCES = os_solaris_ata.s
|
||||
|
||||
if NEED_GETOPT_LONG
|
||||
|
||||
@ -255,8 +256,8 @@ endif
|
||||
all-local: $(extra_MANS)
|
||||
install-man: $(extra_MANS)
|
||||
@$(NORMAL_INSTALL)
|
||||
$(mkinstalldirs) '$(DESTDIR)$(mandir)/man4'
|
||||
$(mkinstalldirs) '$(DESTDIR)$(mandir)/man1m'
|
||||
$(MKDIR_P) '$(DESTDIR)$(mandir)/man4'
|
||||
$(MKDIR_P) '$(DESTDIR)$(mandir)/man1m'
|
||||
for i in $(extra_MANS); do \
|
||||
if test -f $(srcdir)/$$i; then file=$(srcdir)/$$i; \
|
||||
else file=$$i; fi; \
|
||||
@ -319,7 +320,7 @@ sysconf_DATA = smartd.conf
|
||||
|
||||
# If modified smartd.conf exists install smartd.conf.sample instead
|
||||
install-sysconfDATA: $(sysconf_DATA)
|
||||
$(mkinstalldirs) '$(DESTDIR)$(sysconfdir)'
|
||||
$(MKDIR_P) '$(DESTDIR)$(sysconfdir)'
|
||||
@s="$(srcdir)/smartd.conf"; \
|
||||
f="$(DESTDIR)$(sysconfdir)/smartd.conf$(smartd_suffix)"; \
|
||||
if test -z "$(smartd_suffix)" && test -f "$$f"; then \
|
||||
@ -365,10 +366,13 @@ EXTRA_DIST = \
|
||||
os_darwin/SMART.in \
|
||||
os_darwin/StartupParameters.plist \
|
||||
os_darwin/English_Localizable.strings \
|
||||
os_darwin/pkg/PackageInfo.in \
|
||||
os_darwin/pkg/Distribution.in \
|
||||
os_darwin/pkg/installer/README.html \
|
||||
os_darwin/pkg/root/usr/local/sbin/smart-pkg-uninstall \
|
||||
os_win32/default.manifest \
|
||||
os_win32/installer.nsi \
|
||||
os_win32/runcmd.c \
|
||||
os_win32/runcmda.exe.manifest \
|
||||
os_win32/runcmdu.exe.manifest \
|
||||
os_win32/smartctl_res.rc.in \
|
||||
os_win32/smartd_res.rc.in \
|
||||
os_win32/smartd_warning.cmd \
|
||||
@ -386,12 +390,15 @@ CLEANFILES = \
|
||||
smartd.8 \
|
||||
smartd.1m \
|
||||
smartd.8.html \
|
||||
smartd.8.html.tmp \
|
||||
smartd.8.txt \
|
||||
smartctl.8 \
|
||||
smartctl.1m \
|
||||
smartctl.8.html \
|
||||
smartctl.8.html.tmp \
|
||||
smartctl.8.txt \
|
||||
smartd.conf.5.html \
|
||||
smartd.conf.5.html.tmp \
|
||||
smartd.conf.5.txt \
|
||||
smartd.initd \
|
||||
smartd.freebsd.initd \
|
||||
@ -416,7 +423,6 @@ MAINTAINERCLEANFILES = \
|
||||
$(srcdir)/depcomp \
|
||||
$(srcdir)/install-sh \
|
||||
$(srcdir)/missing \
|
||||
$(srcdir)/mkinstalldirs \
|
||||
$(srcdir)/m4/pkg.m4
|
||||
|
||||
utility.o: svnversion.h
|
||||
@ -424,7 +430,7 @@ utility.o: svnversion.h
|
||||
if IS_SVN_BUILD
|
||||
# Get version info from SVN
|
||||
svnversion.h: ChangeLog Makefile $(svn_deps)
|
||||
@echo ' svn info | $$(VERSION_FROM_SVN_INFO) > $@'
|
||||
@echo ' svn info | $$(VERSION_FROM_SVN_INFO) > $@'
|
||||
@echo '/* svnversion.h. Generated by Makefile from svn info. */' > $@
|
||||
@(cd $(srcdir) \
|
||||
&& svnversion 2>/dev/null | sed -n 's,^\([0-9].*\),REV "\1",p' \
|
||||
@ -434,10 +440,10 @@ svnversion.h: ChangeLog Makefile $(svn_deps)
|
||||
else
|
||||
|
||||
# SVN not available, guess version info from Id strings
|
||||
svnversion.h: ChangeLog Makefile
|
||||
@echo ' cat ChangeLog $$(SOURCES) | $$(VERSION_FROM_SVN_IDS) > $@'
|
||||
svnversion.h: ChangeLog Makefile NEWS
|
||||
@echo ' cat ChangeLog NEWS $$(SOURCES) | $$(VERSION_FROM_SVN_IDS) > $@'
|
||||
@echo '/* svnversion.h. Generated by Makefile from Id strings. */' > $@
|
||||
@(cd $(srcdir) && cat ChangeLog Makefile.am configure.ac smart*.in *.cpp *.h *.s) \
|
||||
@(cd $(srcdir) && cat ChangeLog NEWS Makefile.am configure.ac smart*.in *.cpp *.h) \
|
||||
| sed -n 's,^.*\$$[I][d]: [^ ]* \([0-9][0-9]* [0-9][-0-9]* [0-9][:0-9]*\)[^:0-9][^$$]*\$$.*$$,\1,p' \
|
||||
| sort -n -r \
|
||||
| sed -n 'h;s,^\([^ ]*\) .*$$,REV "\1",p;g;s,^[^ ]* \([^ ]*\) .*$$,DATE "\1",p;g;s,^[^ ]* [^ ]* \([^ ]*\)$$,TIME "\1",p;q' \
|
||||
@ -472,15 +478,15 @@ SMART : os_darwin/SMART.in
|
||||
sed "s|/usr/sbin/|$(sbindir)/|" $< > $@
|
||||
|
||||
install-initdDATA-darwin: $(initd_DATA)
|
||||
$(mkinstalldirs) $(DESTDIR)$(initddir)
|
||||
$(mkinstalldirs) $(DESTDIR)$(initddir)/SMART
|
||||
$(mkinstalldirs) $(DESTDIR)$(initddir)/SMART/Resources
|
||||
$(MKDIR_P) $(DESTDIR)$(initddir)
|
||||
$(MKDIR_P) $(DESTDIR)$(initddir)/SMART
|
||||
$(MKDIR_P) $(DESTDIR)$(initddir)/SMART/Resources
|
||||
$(INSTALL_SCRIPT) $(top_builddir)/SMART $(DESTDIR)$(initddir)/SMART
|
||||
$(INSTALL_DATA) $(srcdir)/os_darwin/StartupParameters.plist \
|
||||
$(DESTDIR)$(initddir)/SMART/StartupParameters.plist
|
||||
for i in English ; do \
|
||||
RDIR=$(DESTDIR)$(initddir)/SMART/Resources/$${i}.lproj ; \
|
||||
$(mkinstalldirs) $$RDIR ;\
|
||||
$(MKDIR_P) $$RDIR ;\
|
||||
$(INSTALL_DATA) $(srcdir)/os_darwin/$${i}_Localizable.strings \
|
||||
$$RDIR/Localizable.strings ; \
|
||||
done
|
||||
@ -501,7 +507,7 @@ initd_DATA_install = install-initdDATA-generic
|
||||
initd_DATA_uninstall = uninstall-initdDATA-generic
|
||||
|
||||
install-initdDATA-generic: $(initd_DATA)
|
||||
$(mkinstalldirs) '$(DESTDIR)$(initddir)'
|
||||
$(MKDIR_P) '$(DESTDIR)$(initddir)'
|
||||
$(INSTALL_SCRIPT) '$(top_builddir)/$(initdfile)' '$(DESTDIR)$(initddir)/smartd$(smartd_suffix)'
|
||||
|
||||
uninstall-initdDATA-generic:
|
||||
@ -525,24 +531,23 @@ systemdsystemunit_DATA = smartd.service
|
||||
endif
|
||||
|
||||
smartd.service: smartd.service.in Makefile
|
||||
@echo ' cat $(srcdir)/smartd.service.in | $$(SMARTD_SERVICE_FILTER) > $@'
|
||||
@cat $(srcdir)/smartd.service.in | \
|
||||
@echo ' $$(SMARTD_SERVICE_FILTER) < $(srcdir)/smartd.service.in > $@'
|
||||
@{ \
|
||||
sed 's|/usr/local/sbin/smartd|$(sbindir)/smartd|' | \
|
||||
if test -n '$(systemdenvfile)'; then \
|
||||
sed 's|/usr/local/etc/sysconfig/smartmontools|$(systemdenvfile)|'; \
|
||||
else \
|
||||
sed -e '/^EnvironmentFile=/d' -e 's| *\$$smartd[_a-z]* *||g'; \
|
||||
fi > $@
|
||||
fi; } < $(srcdir)/smartd.service.in > $@
|
||||
|
||||
|
||||
# Create empty directories if configured.
|
||||
# Default install rules no longer create empty directories since automake 1.11.
|
||||
# Uses $(mkinstalldirs) instead of $(MKDIR_P) to preserve support for automake 1.7 - 1.9.
|
||||
installdirs-local:
|
||||
@for d in '$(smartdplugindir)' '$(savestatesdir)' '$(attributelogdir)'; do \
|
||||
test -n "$$d" || continue; \
|
||||
echo " $(mkinstalldirs) '$(DESTDIR)$$d'"; \
|
||||
$(mkinstalldirs) "$(DESTDIR)$$d" || exit 1; \
|
||||
echo " $(MKDIR_P) '$(DESTDIR)$$d'"; \
|
||||
$(MKDIR_P) "$(DESTDIR)$$d" || exit 1; \
|
||||
done
|
||||
|
||||
install-data-local: installdirs-local
|
||||
@ -550,7 +555,7 @@ install-data-local: installdirs-local
|
||||
#
|
||||
# Build man pages
|
||||
#
|
||||
MAN_FILTER = \
|
||||
MAN_FILTER = { \
|
||||
sed -e 's|CURRENT_SVN_VERSION|$(releaseversion)|g' \
|
||||
-e "s|CURRENT_SVN_DATE|`sed -n 's,^.*DATE[^"]*"\([^"]*\)".*$$,\1,p' svnversion.h`|g" \
|
||||
-e "s|CURRENT_SVN_REV|`sed -n 's,^.*REV[^"]*"\([^"]*\)".*$$,r\1,p' svnversion.h`|g" \
|
||||
@ -606,24 +611,24 @@ MAN_FILTER = \
|
||||
-e 's,^!!!*,,' ; \
|
||||
else \
|
||||
cat; \
|
||||
fi
|
||||
fi; }
|
||||
|
||||
# Implicit rule 'smart%: smart%.in ...' does not work with BSD make
|
||||
smartctl.8: smartctl.8.in Makefile svnversion.h
|
||||
@echo ' cat $(srcdir)/smartctl.8.in | $$(MAN_FILTER) > $@'
|
||||
@cat $(srcdir)/smartctl.8.in | $(MAN_FILTER) > $@
|
||||
@echo ' $$(MAN_FILTER) < $(srcdir)/smartctl.8.in > $@'
|
||||
@$(MAN_FILTER) < $(srcdir)/smartctl.8.in > $@
|
||||
|
||||
smartd.8: smartd.8.in Makefile svnversion.h
|
||||
@echo ' cat $(srcdir)/smartd.8.in | $$(MAN_FILTER) > $@'
|
||||
@cat $(srcdir)/smartd.8.in | $(MAN_FILTER) > $@
|
||||
@echo ' $$(MAN_FILTER) < $(srcdir)/smartd.8.in > $@'
|
||||
@$(MAN_FILTER) < $(srcdir)/smartd.8.in > $@
|
||||
|
||||
smartd.conf.5: smartd.conf.5.in Makefile svnversion.h
|
||||
@echo ' cat $(srcdir)/smartd.conf.5.in | $$(MAN_FILTER) > $@'
|
||||
@cat $(srcdir)/smartd.conf.5.in | $(MAN_FILTER) > $@
|
||||
@echo ' $$(MAN_FILTER) < $(srcdir)/smartd.conf.5.in > $@'
|
||||
@$(MAN_FILTER) < $(srcdir)/smartd.conf.5.in > $@
|
||||
|
||||
update-smart-drivedb.8: update-smart-drivedb.8.in Makefile svnversion.h
|
||||
@echo ' cat $(srcdir)/update-smart-drivedb.8.in | $$(MAN_FILTER) > $@'
|
||||
@cat $(srcdir)/update-smart-drivedb.8.in | $(MAN_FILTER) > $@
|
||||
@echo ' $$(MAN_FILTER) < $(srcdir)/update-smart-drivedb.8.in > $@'
|
||||
@$(MAN_FILTER) < $(srcdir)/update-smart-drivedb.8.in > $@
|
||||
|
||||
# Build Solaris specific man pages
|
||||
SOLARIS_MAN_FILTER = \
|
||||
@ -634,20 +639,20 @@ SOLARIS_MAN_FILTER = \
|
||||
-e 's,/var/log/messages,/var/adm/messages,g'
|
||||
|
||||
smartctl.1m: smartctl.8
|
||||
@echo ' cat smartctl.8 | $$(SOLARIS_MAN_FILTER) > $@'
|
||||
@cat smartctl.8 | $(SOLARIS_MAN_FILTER) > $@
|
||||
@echo ' $$(SOLARIS_MAN_FILTER) < smartctl.8 > $@'
|
||||
@$(SOLARIS_MAN_FILTER) < smartctl.8 > $@
|
||||
|
||||
smartd.1m: smartd.8
|
||||
@echo ' cat smartd.8 | $$(SOLARIS_MAN_FILTER) > $@'
|
||||
@cat smartd.8 | $(SOLARIS_MAN_FILTER) > $@
|
||||
@echo ' $$(SOLARIS_MAN_FILTER) < smartd.8 > $@'
|
||||
@$(SOLARIS_MAN_FILTER) < smartd.8 > $@
|
||||
|
||||
smartd.conf.4: smartd.conf.5
|
||||
@echo ' cat smartd.conf.5 | $$(SOLARIS_MAN_FILTER) > $@'
|
||||
@cat smartd.conf.5 | $(SOLARIS_MAN_FILTER) > $@
|
||||
@echo ' $$(SOLARIS_MAN_FILTER) < smartd.conf.5 > $@'
|
||||
@$(SOLARIS_MAN_FILTER) < smartd.conf.5 > $@
|
||||
|
||||
update-smart-drivedb.1m: update-smart-drivedb.8
|
||||
@echo ' cat update-smart-drivedb.8 | $$(SOLARIS_MAN_FILTER) > $@'
|
||||
@cat update-smart-drivedb.8 | $(SOLARIS_MAN_FILTER) > $@
|
||||
@echo ' $$(SOLARIS_MAN_FILTER) < update-smart-drivedb.8 > $@'
|
||||
@$(SOLARIS_MAN_FILTER) < update-smart-drivedb.8 > $@
|
||||
|
||||
|
||||
# Commands to convert man pages into .html and .txt
|
||||
@ -669,21 +674,15 @@ htmlman: smartctl.8.html smartd.8.html smartd.conf.5.html
|
||||
|
||||
txtman: smartctl.8.txt smartd.8.txt smartd.conf.5.txt
|
||||
|
||||
if OS_WIN32_MINGW
|
||||
|
||||
%.5.html: %.5
|
||||
$(DOS2UNIX) < $< | $(MAN2HTML) | $(FIXHTML) > $@
|
||||
$(MAN2HTML) $< > $@.tmp
|
||||
@echo ' $$(FIXHTML) < $@.tmp > $@'
|
||||
@$(FIXHTML) < $@.tmp > $@
|
||||
|
||||
%.8.html: %.8
|
||||
$(DOS2UNIX) < $< | $(MAN2HTML) | $(FIXHTML) > $@
|
||||
else
|
||||
|
||||
%.5.html: %.5
|
||||
$(MAN2HTML) $< | $(FIXHTML) > $@
|
||||
|
||||
%.8.html: %.8
|
||||
$(MAN2HTML) $< | $(FIXHTML) > $@
|
||||
endif
|
||||
$(MAN2HTML) $< > $@.tmp
|
||||
@echo ' $$(FIXHTML) < $@.tmp > $@'
|
||||
@$(FIXHTML) < $@.tmp > $@
|
||||
|
||||
%.5.txt: %.5
|
||||
$(MAN2TXT) $< > $@
|
||||
@ -711,22 +710,35 @@ smartd_res.o: smartd_res.rc syslogevt.rc
|
||||
$(WINDRES) -I. $< $@
|
||||
|
||||
# Convert version for VERSIONINFO resource: 6.1 r3754 -> 6.1.0.3754, set Copyright year
|
||||
WIN_RC_FILTER = \
|
||||
( ver=`echo '$(PACKAGE_VERSION).0' | sed -n 's,^\([0-9]*\.[0-9]*\.[0-9]*\).*$$,\1,p'`; \
|
||||
rev=`sed -n 's,^.*REV[^"]*"\([0-9]*\).*$$,\1,p' svnversion.h`; \
|
||||
txtver="$${ver:-0.0.0}.$${rev:-0}"; binver=`echo "$$txtver" | sed 's|\.|,|g'`; \
|
||||
yy=`sed -n 's,^.*DATE[^"]*"20\([0-9][0-9]\).*$$,\1,p' svnversion.h`; yy="$${yy:-XX}"; \
|
||||
sed -e "s|@BINARY_VERSION@|$$binver|g" -e "s|@TEXT_VERSION@|$$txtver|g" -e "s|@YY@|$$yy|g"; )
|
||||
WIN_RC_FILTER = { \
|
||||
ver=`echo '$(PACKAGE_VERSION).0' | sed -n 's,^\([0-9]*\.[0-9]*\.[0-9]*\).*$$,\1,p'` && \
|
||||
rev=`sed -n 's,^.*REV[^"]*"\([0-9]*\).*$$,\1,p' svnversion.h` && \
|
||||
txtver="$${ver:-0.0.0}.$${rev:-0}" && binver=`echo "$$txtver" | sed 's|\.|,|g'` && \
|
||||
yy=`sed -n 's,^.*DATE[^"]*"20\([0-9][0-9]\).*$$,\1,p' svnversion.h` && yy="$${yy:-XX}" && \
|
||||
sed -e "s|@BINARY_VERSION@|$$binver|g" -e "s|@TEXT_VERSION@|$$txtver|g" -e "s|@YY@|$$yy|g"; }
|
||||
|
||||
smartctl_res.rc: os_win32/smartctl_res.rc.in Makefile svnversion.h
|
||||
cat $< | $(WIN_RC_FILTER) > $@
|
||||
@echo ' $$(WIN_RC_FILTER) < $< > $@'
|
||||
@$(WIN_RC_FILTER) < $< > $@
|
||||
|
||||
smartd_res.rc: os_win32/smartd_res.rc.in Makefile svnversion.h
|
||||
cat $< | $(WIN_RC_FILTER) > $@
|
||||
@echo ' $$(WIN_RC_FILTER) < $< > $@'
|
||||
@$(WIN_RC_FILTER) < $< > $@
|
||||
|
||||
syslogevt.rc: os_win32/syslogevt.mc
|
||||
$(WINDMC) -b $<
|
||||
|
||||
# Application manifests
|
||||
|
||||
default.manifest.o: os_win32/default.manifest
|
||||
echo '1 24 "$<"' | $(WINDRES) -J rc -o $@
|
||||
|
||||
defadmin.manifest.o: defadmin.manifest
|
||||
echo '1 24 "$<"' | $(WINDRES) -J rc -o $@
|
||||
|
||||
defadmin.manifest: os_win32/default.manifest
|
||||
sed 's,"asInvoker","requireAdministrator",' $< > $@
|
||||
|
||||
# Definitions for Windows distribution
|
||||
|
||||
if OS_WIN64
|
||||
@ -775,9 +787,7 @@ FILES_WIN32 = \
|
||||
$(docdir_win32)/smartd.8.html \
|
||||
$(docdir_win32)/smartd.8.txt \
|
||||
$(docdir_win32)/smartd.conf.5.html \
|
||||
$(docdir_win32)/smartd.conf.5.txt \
|
||||
$(exedir_win32)/runcmda.exe.manifest \
|
||||
$(exedir_win32)/runcmdu.exe.manifest
|
||||
$(docdir_win32)/smartd.conf.5.txt
|
||||
|
||||
if ENABLE_DRIVEDB
|
||||
FILES_WIN32 += \
|
||||
@ -786,20 +796,18 @@ endif
|
||||
|
||||
CLEANFILES += \
|
||||
$(FILES_WIN32) \
|
||||
runcmdu.exe \
|
||||
defadmin.manifest \
|
||||
distdir.mkdir \
|
||||
runcmda.exe runcmdu.exe \
|
||||
smartctl-nc.exe smartctl-nc.exe.tmp \
|
||||
smartctl_res.rc smartctl_res.o \
|
||||
smartd_res.rc smartd_res.o \
|
||||
syslogevt.h syslogevt.o \
|
||||
smartctl_res.rc smartd_res.rc \
|
||||
syslogevt.h \
|
||||
syslogevt.rc syslogevt_*.bin \
|
||||
wtssendmsg.exe \
|
||||
update-smart-drivedb.exe \
|
||||
distdir.mkdir
|
||||
wtssendmsg.exe
|
||||
|
||||
# Textfile converter from package cygutils or tofrodos
|
||||
# Note: Only use without options to be compatible with both packages
|
||||
# Note: Only use without options to be compatible with all variants
|
||||
UNIX2DOS = unix2dos
|
||||
DOS2UNIX = dos2unix
|
||||
|
||||
# Build Windows distribution
|
||||
|
||||
@ -824,11 +832,11 @@ if OS_WIN32_NSIS
|
||||
# Note: Only option character '-' is also compatible with Linux version of makensis
|
||||
$(distinst_win32): os_win32/installer.nsi distdir.mkdir $(FILES_WIN32)
|
||||
test -z '$(builddir_win64)' || ( cd $(builddir_win64) && make distdir-win32 )
|
||||
@date=`sed -n 's,^.*DATE[^"]*"\([^"]*\)".*$$,\1,p' svnversion.h`; \
|
||||
rev=`sed -n 's,^.*REV[^"]*"\([^"]*\)".*$$,r\1,p' svnversion.h`; \
|
||||
verstr="$(PACKAGE_VERSION) $$date $$rev "$(BUILD_INFO); \
|
||||
d64=; test -z '$(builddir_win64)' || d64='-DINPDIR64=$(builddir_win64)/$(PACKAGE)-$(VERSION).win64'; \
|
||||
echo "'$(MAKENSIS)' -V2 -NOCD -DINPDIR=$(distdir_win32) $$d64 -DOUTFILE=$@ -DVERSTR='$$verstr' $<"; \
|
||||
@date=`sed -n 's,^.*DATE[^"]*"\([^"]*\)".*$$,\1,p' svnversion.h` && \
|
||||
rev=`sed -n 's,^.*REV[^"]*"\([^"]*\)".*$$,r\1,p' svnversion.h` && \
|
||||
verstr="$(PACKAGE_VERSION) $$date $$rev "$(BUILD_INFO) && \
|
||||
d64= && if [ -n '$(builddir_win64)' ]; then d64='-DINPDIR64=$(builddir_win64)/$(PACKAGE)-$(VERSION).win64'; fi && \
|
||||
echo "'$(MAKENSIS)' -V2 -NOCD -DINPDIR=$(distdir_win32) $$d64 -DOUTFILE=$@ -DVERSTR='$$verstr' $<" && \
|
||||
'$(MAKENSIS)' -V2 -NOCD -DINPDIR=$(distdir_win32) $$d64 -DOUTFILE=$@ -DVERSTR="$$verstr" $<
|
||||
md5sum $@ > $@.md5
|
||||
sha1sum $@ > $@.sha1
|
||||
@ -861,18 +869,10 @@ $(exedir_win32)/%.exe: %.exe
|
||||
$(exedir_win32)/update-smart-drivedb.exe: update-smart-drivedb.exe
|
||||
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
|
||||
$(UNIX2DOS) < $< > $@
|
||||
touch -r $< $@
|
||||
|
||||
$(exedir_win32)/%.exe.manifest: $(srcdir)/os_win32/%.exe.manifest
|
||||
$(UNIX2DOS) < $< > $@
|
||||
touch -r $< $@
|
||||
|
||||
$(exedir_win32)/%.cmd: $(srcdir)/os_win32/%.cmd
|
||||
$(UNIX2DOS) < $< > $@
|
||||
touch -r $< $@
|
||||
@ -914,11 +914,17 @@ smartctl-nc.exe: smartctl.exe
|
||||
mv -f $@.tmp $@
|
||||
|
||||
# Build runcmd?.exe and wtssendmsg.exe
|
||||
runcmdu.exe: os_win32/runcmd.c
|
||||
$(CC) -Os -o $@ $<
|
||||
runcmd.o: os_win32/runcmd.c
|
||||
$(CC) -c -Os $<
|
||||
|
||||
wtssendmsg.exe: os_win32/wtssendmsg.c
|
||||
$(CC) -Os -o $@ $< -lwtsapi32
|
||||
runcmdu.exe: runcmd.o $(os_win32_manifest)
|
||||
$(CC) -o $@ $^
|
||||
|
||||
runcmda.exe: runcmd.o defadmin.manifest.o
|
||||
$(CC) -o $@ $^
|
||||
|
||||
wtssendmsg.exe: os_win32/wtssendmsg.c $(os_win32_manifest)
|
||||
$(CC) -Os -o $@ $< $(os_win32_manifest) -lwtsapi32
|
||||
|
||||
# Build os_win32/vc10/{config.h,smart*.rc,svnversion.h} for MSVC10 from MinGW files
|
||||
|
||||
@ -942,3 +948,44 @@ $(srcdir)/os_win32/vc10/smartd_res.rc: smartd_res.rc
|
||||
cp $< $@
|
||||
|
||||
endif
|
||||
if OS_DARWIN
|
||||
# Definitions for OSX distribution
|
||||
distdir_darwin = $(PACKAGE)-$(VERSION).darwin
|
||||
dmg_darwin = $(PACKAGE)-$(VERSION).dmg
|
||||
pkg_darwin = $(PACKAGE)-$(VERSION).pkg
|
||||
|
||||
# build darwin installer
|
||||
$(pkg_darwin):
|
||||
${MAKE} install DESTDIR=$(distdir_darwin)/root
|
||||
@cp $(srcdir)/os_darwin/pkg/root/usr/local/sbin/smart-pkg-uninstall $(distdir_darwin)/root$(sbindir)
|
||||
@mkdir -p $(distdir_darwin)/pkg
|
||||
@( cd $(distdir_darwin)/root && find . | cpio -o --format odc --owner 0:80 | gzip -c ) > $(distdir_darwin)/pkg/Payload
|
||||
PAYLOAD_FILES=`find $(distdir_darwin)/root | wc -l` &&\
|
||||
PAYLOAD_SIZEKB=`du -BK -s $(distdir_darwin)/root|${AWK} '{print $$1}'|tr -d 'K'` &&\
|
||||
sed -e "s|@version@|$(VERSION)|" -e "s|@files@|$${PAYLOAD_FILES}|" \
|
||||
-e "s|@size@|$${PAYLOAD_SIZEKB}|" $(srcdir)/os_darwin/pkg/PackageInfo.in \
|
||||
> $(distdir_darwin)/pkg/PackageInfo &&\
|
||||
sed -e "s|@version@|$(VERSION)|" -e "s|@files@|$${PAYLOAD_FILES}|" -e "s|@size@|$${PAYLOAD_SIZEKB}|" \
|
||||
-e "s|@pkgname@|$(pkg_darwin)|" \
|
||||
$(srcdir)/os_darwin/pkg/Distribution.in > $(distdir_darwin)/pkg/Distribution
|
||||
@mkdir -p $(distdir_darwin)/pkg/Resources/English.lproj
|
||||
@cp $(srcdir)/COPYING $(distdir_darwin)/pkg/Resources/English.lproj/license.txt
|
||||
@mkbom -u 0 -g 80 $(distdir_darwin)/root $(distdir_darwin)/pkg/Bom
|
||||
@mkdir -p $(distdir_darwin)/dmg
|
||||
@( cd $(distdir_darwin)/pkg && xar --compression none -cf "../dmg/$(pkg_darwin)" * )
|
||||
|
||||
# build darwon dmg image
|
||||
$(dmg_darwin):
|
||||
@cp $(srcdir)/os_darwin/pkg/installer/README.html $(distdir_darwin)/dmg
|
||||
@mkisofs -V 'smartmontools' -no-pad -r -apple -o $(distdir_darwin)/smartmontools-$(VERSION).iso \
|
||||
-hfs-bless "$(distdir_darwin)/dmg/" "$(distdir_darwin)/dmg/"
|
||||
@dmg dmg $(distdir_darwin)/smartmontools-$(VERSION).iso $(dmg_darwin)
|
||||
md5sum $@ > $@.md5
|
||||
sha1sum $@ > $@.sha1
|
||||
sha256sum $@ > $@.sha256
|
||||
|
||||
install-darwin: install-darwin-cleanup $(pkg_darwin) $(dmg_darwin)
|
||||
|
||||
install-darwin-cleanup:
|
||||
@rm -rf $(distdir_darwin)
|
||||
endif
|
||||
|
22
NEWS
22
NEWS
@ -1,10 +1,30 @@
|
||||
smartmontools NEWS
|
||||
------------------
|
||||
$Id: NEWS 4109 2015-06-04 16:30:15Z chrfranke $
|
||||
$Id: NEWS 4176 2015-11-22 16:45:30Z chrfranke $
|
||||
|
||||
The most up-to-date version of this file is:
|
||||
http://sourceforge.net/p/smartmontools/code/HEAD/tree/trunk/smartmontools/NEWS
|
||||
|
||||
Date <Not released yet, please try current SVN or daily builds>
|
||||
Summary: smartmontools release 6.5
|
||||
-----------------------------------------------------------
|
||||
- SAT: Improved heuristics to detect bogus sense data from SAT layer.
|
||||
- configure options '--disable-drivedb', '--enable-savestates',
|
||||
'--enable-attributelog' and '--with-docdir' are no longer supported.
|
||||
- autoconf < 2.60 and automake < 1.10 are no longer supported.
|
||||
- Drive database file now also includes the DEFAULT setting
|
||||
for each attribute.
|
||||
- HDD, SSD and USB additions to drive database.
|
||||
- Darwin: New support files for package installer.
|
||||
New makefile target 'install-darwin' builds DMG image.
|
||||
- Solaris: Auto detection of SATA devices behind SAT layer.
|
||||
- Solaris SPARC: Legacy ATA support disabled by default.
|
||||
New configure option '--with-solaris-sparc-ata' enables it.
|
||||
File os_solaris_ata.s is no longer included in source tarball.
|
||||
- Windows: Auto detection of USB devices specified by drive letter.
|
||||
- Windows: New application manifests indicating Win 10 support.
|
||||
- Windows installer: Defaults to 64-bit version on 64-bit Windows.
|
||||
|
||||
Date 2015-06-04
|
||||
Summary: smartmontools release 6.4
|
||||
-----------------------------------------------------------
|
||||
|
4
README
4
README
@ -3,12 +3,12 @@ smartmontools - S.M.A.R.T. utility toolset for Darwin/Mac
|
||||
OSX, FreeBSD, Linux, NetBSD, OpenBSD, Solaris, and Windows.
|
||||
==========================================================
|
||||
|
||||
$Id: README 4063 2015-04-19 17:34:25Z chrfranke $
|
||||
$Id: README 4120 2015-08-27 16:12:21Z samm2 $
|
||||
|
||||
== HOME ==
|
||||
The home for smartmontools is located at:
|
||||
|
||||
http://smartmontools.sourceforge.net/
|
||||
http://www.smartmontools.org/
|
||||
|
||||
Please see this web site for updates, documentation, and for submitting
|
||||
patches and bug reports.
|
||||
|
@ -1,7 +1,7 @@
|
||||
/*
|
||||
* atacmdnames.cpp
|
||||
*
|
||||
* Home page of code is: http://smartmontools.sourceforge.net
|
||||
* Home page of code is: http://www.smartmontools.org
|
||||
*
|
||||
* Copyright (C) 2003-8 Philip Williams
|
||||
* Copyright (C) 2012 Christian Franke <smartmontools-support@lists.sourceforge.net>
|
||||
@ -20,7 +20,7 @@
|
||||
#include <stdlib.h>
|
||||
#include <stdio.h>
|
||||
|
||||
const char * atacmdnames_cpp_cvsid = "$Id: atacmdnames.cpp 3670 2012-10-31 22:00:50Z chrfranke $"
|
||||
const char * atacmdnames_cpp_cvsid = "$Id: atacmdnames.cpp 4120 2015-08-27 16:12:21Z samm2 $"
|
||||
ATACMDNAMES_H_CVSID;
|
||||
|
||||
const char cmd_reserved[] = "[RESERVED]";
|
||||
|
@ -4,7 +4,7 @@
|
||||
* This module is based on the T13/1532D Volume 1 Revision 3 (ATA/ATAPI-7)
|
||||
* specification, which is available from http://www.t13.org/#FTP_site
|
||||
*
|
||||
* Home page of code is: http://smartmontools.sourceforge.net
|
||||
* Home page of code is: http://www.smartmontools.org
|
||||
* Address of support mailing list: smartmontools-support@lists.sourceforge.net
|
||||
*
|
||||
* Copyright (C) 2003-8 Philip Williams
|
||||
@ -23,7 +23,7 @@
|
||||
#ifndef ATACMDNAMES_H_
|
||||
#define ATACMDNAMES_H_
|
||||
|
||||
#define ATACMDNAMES_H_CVSID "$Id: atacmdnames.h 3728 2012-12-13 17:57:50Z chrfranke $\n"
|
||||
#define ATACMDNAMES_H_CVSID "$Id: atacmdnames.h 4120 2015-08-27 16:12:21Z samm2 $\n"
|
||||
|
||||
/* Returns the name of the command (and possibly sub-command) with the given
|
||||
command code and feature register values. */
|
||||
|
292
atacmds.cpp
292
atacmds.cpp
@ -1,10 +1,10 @@
|
||||
/*
|
||||
* atacmds.cpp
|
||||
*
|
||||
* Home page of code is: http://smartmontools.sourceforge.net
|
||||
* Home page of code is: http://www.smartmontools.org
|
||||
*
|
||||
* Copyright (C) 2002-11 Bruce Allen <smartmontools-support@lists.sourceforge.net>
|
||||
* Copyright (C) 2008-15 Christian Franke <smartmontools-support@lists.sourceforge.net>
|
||||
* Copyright (C) 2002-11 Bruce Allen
|
||||
* Copyright (C) 2008-15 Christian Franke
|
||||
* Copyright (C) 1999-2000 Michael Cornwell <cornwell@acm.org>
|
||||
* Copyright (C) 2000 Andre Hedrick <andre@linux-ide.org>
|
||||
*
|
||||
@ -32,10 +32,11 @@
|
||||
#include "config.h"
|
||||
#include "int64.h"
|
||||
#include "atacmds.h"
|
||||
#include "knowndrives.h" // get_default_attr_defs()
|
||||
#include "utility.h"
|
||||
#include "dev_ata_cmd_set.h" // for parsed_ata_device
|
||||
|
||||
const char * atacmds_cpp_cvsid = "$Id: atacmds.cpp 4048 2015-03-29 16:09:04Z chrfranke $"
|
||||
const char * atacmds_cpp_cvsid = "$Id: atacmds.cpp 4178 2015-11-23 18:44:27Z chrfranke $"
|
||||
ATACMDS_H_CVSID;
|
||||
|
||||
// Print ATA debug messages?
|
||||
@ -170,7 +171,9 @@ bool parse_attribute_def(const char * opt, ata_vendor_attr_defs & defs,
|
||||
// Parse option
|
||||
int len = strlen(opt);
|
||||
int id = 0, n1 = -1, n2 = -1;
|
||||
char fmtname[32+1], attrname[32+1];
|
||||
char fmtname[32+1], attrname[32+1], hddssd[3+1];
|
||||
attrname[0] = hddssd[0] = 0;
|
||||
|
||||
if (opt[0] == 'N') {
|
||||
// "N,format[,name]"
|
||||
if (!( sscanf(opt, "N,%32[^,]%n,%32[^,]%n", fmtname, &n1, attrname, &n2) >= 1
|
||||
@ -178,13 +181,16 @@ bool parse_attribute_def(const char * opt, ata_vendor_attr_defs & defs,
|
||||
return false;
|
||||
}
|
||||
else {
|
||||
// "id,format[+][,name]"
|
||||
if (!( sscanf(opt, "%d,%32[^,]%n,%32[^,]%n", &id, fmtname, &n1, attrname, &n2) >= 2
|
||||
&& 1 <= id && id <= 255 && (n1 == len || n2 == len)))
|
||||
// "id,format[+][,name[,HDD|SSD]]"
|
||||
int n3 = -1;
|
||||
if (!( sscanf(opt, "%d,%32[^,]%n,%32[^,]%n,%3[DHS]%n",
|
||||
&id, fmtname, &n1, attrname, &n2, hddssd, &n3) >= 2
|
||||
&& 1 <= id && id <= 255
|
||||
&& ( n1 == len || n2 == len
|
||||
// ",HDD|SSD" for DEFAULT settings only
|
||||
|| (n3 == len && priority == PRIOR_DEFAULT))))
|
||||
return false;
|
||||
}
|
||||
if (n1 == len)
|
||||
attrname[0] = 0;
|
||||
|
||||
unsigned flags = 0;
|
||||
// For "-v 19[78],increasing" above
|
||||
@ -196,6 +202,9 @@ bool parse_attribute_def(const char * opt, ata_vendor_attr_defs & defs,
|
||||
// Split "format[:byteorder]"
|
||||
char byteorder[8+1] = "";
|
||||
if (strchr(fmtname, ':')) {
|
||||
if (priority == PRIOR_DEFAULT)
|
||||
// TODO: Allow Byteorder in DEFAULT entry
|
||||
return false;
|
||||
n1 = n2 = -1;
|
||||
if (!( sscanf(fmtname, "%*[^:]%n:%8[012345rvwz]%n", &n1, byteorder, &n2) >= 1
|
||||
&& n2 == (int)strlen(fmtname)))
|
||||
@ -220,6 +229,16 @@ bool parse_attribute_def(const char * opt, ata_vendor_attr_defs & defs,
|
||||
if (!*byteorder && (format == RAWFMT_RAW64 || format == RAWFMT_HEX64))
|
||||
flags |= (ATTRFLAG_NO_NORMVAL|ATTRFLAG_NO_WORSTVAL);
|
||||
|
||||
// ",HDD|SSD" suffix for DEFAULT settings
|
||||
if (hddssd[0]) {
|
||||
if (!strcmp(hddssd, "HDD"))
|
||||
flags |= ATTRFLAG_HDD_ONLY;
|
||||
else if (!strcmp(hddssd, "SSD"))
|
||||
flags |= ATTRFLAG_SSD_ONLY;
|
||||
else
|
||||
return false;
|
||||
}
|
||||
|
||||
if (!id) {
|
||||
// "N,format" -> set format for all entries
|
||||
for (i = 0; i < MAX_ATTRIBUTE_NUM; i++) {
|
||||
@ -617,7 +636,7 @@ int smartcommandhandler(ata_device * device, smart_command_set command, int sele
|
||||
|
||||
// If requested, invalidate serial number before any printing is done
|
||||
if ((command == IDENTIFY || command == PIDENTIFY) && !retval && dont_print_serial_number)
|
||||
invalidate_serno((ata_identify_device *)data);
|
||||
invalidate_serno( reinterpret_cast<ata_identify_device *>(data) );
|
||||
|
||||
// If reporting is enabled, say what output was produced by the command
|
||||
if (ata_debugmode) {
|
||||
@ -831,9 +850,9 @@ int ata_read_identity(ata_device * device, ata_identify_device * buf, bool fix_s
|
||||
packet = true;
|
||||
}
|
||||
|
||||
unsigned i;
|
||||
if (fix_swapped_id) {
|
||||
// Swap ID strings
|
||||
unsigned i;
|
||||
for (i = 0; i < sizeof(buf->serial_no)-1; i += 2)
|
||||
swap2((char *)(buf->serial_no+i));
|
||||
for (i = 0; i < sizeof(buf->fw_rev)-1; i += 2)
|
||||
@ -851,14 +870,12 @@ int ata_read_identity(ata_device * device, ata_identify_device * buf, bool fix_s
|
||||
// NetBSD kernel delivers IDENTIFY data in host byte order
|
||||
// TODO: Handle NetBSD case in os_netbsd.cpp
|
||||
if (isbigendian()){
|
||||
|
||||
// swap various capability words that are needed
|
||||
unsigned i;
|
||||
for (i=0; i<33; i++)
|
||||
swap2((char *)(buf->words047_079+i));
|
||||
|
||||
for (i=80; i<=87; i++)
|
||||
swap2((char *)(rawshort+i));
|
||||
|
||||
for (i=0; i<168; i++)
|
||||
swap2((char *)(buf->words088_255+i));
|
||||
}
|
||||
@ -1859,35 +1876,12 @@ ata_attr_state ata_get_attr_state(const ata_smart_attribute & attr,
|
||||
return ATTRSTATE_OK;
|
||||
}
|
||||
|
||||
// Get default raw value print format
|
||||
static ata_attr_raw_format get_default_raw_format(unsigned char id)
|
||||
{
|
||||
switch (id) {
|
||||
case 3: // Spin-up time
|
||||
return RAWFMT_RAW16_OPT_AVG16;
|
||||
|
||||
case 5: // Reallocated sector count
|
||||
case 196: // Reallocated event count
|
||||
return RAWFMT_RAW16_OPT_RAW16;
|
||||
|
||||
case 9: // Power on hours
|
||||
case 240: // Head flying hours
|
||||
return RAWFMT_RAW24_OPT_RAW8;
|
||||
|
||||
case 190: // Temperature
|
||||
case 194:
|
||||
return RAWFMT_TEMPMINMAX;
|
||||
|
||||
default:
|
||||
return RAWFMT_RAW48;
|
||||
}
|
||||
}
|
||||
|
||||
// Get attribute raw value.
|
||||
uint64_t ata_get_attr_raw_value(const ata_smart_attribute & attr,
|
||||
const ata_vendor_attr_defs & defs)
|
||||
{
|
||||
const ata_vendor_attr_defs::entry & def = defs[attr.id];
|
||||
// TODO: Allow Byteorder in DEFAULT entry
|
||||
|
||||
// Use default byteorder if not specified
|
||||
const char * byteorder = def.byteorder;
|
||||
@ -1978,8 +1972,13 @@ std::string ata_format_attr_raw_value(const ata_smart_attribute & attr,
|
||||
|
||||
// Get print format
|
||||
ata_attr_raw_format format = defs[attr.id].raw_format;
|
||||
if (format == RAWFMT_DEFAULT)
|
||||
format = get_default_raw_format(attr.id);
|
||||
if (format == RAWFMT_DEFAULT) {
|
||||
// Get format from DEFAULT entry
|
||||
format = get_default_attr_defs()[attr.id].raw_format;
|
||||
if (format == RAWFMT_DEFAULT)
|
||||
// Unknown Attribute
|
||||
format = RAWFMT_RAW48;
|
||||
}
|
||||
|
||||
// Print
|
||||
std::string s;
|
||||
@ -2158,212 +2157,23 @@ std::string ata_format_attr_raw_value(const ata_smart_attribute & attr,
|
||||
return s;
|
||||
}
|
||||
|
||||
// Attribute names shouldn't be longer than 23 chars, otherwise they break the
|
||||
// output of smartctl.
|
||||
static const char * get_default_attr_name(unsigned char id, int rpm)
|
||||
{
|
||||
bool hdd = (rpm > 1), ssd = (rpm == 1);
|
||||
|
||||
static const char Unknown_HDD_Attribute[] = "Unknown_HDD_Attribute";
|
||||
static const char Unknown_SSD_Attribute[] = "Unknown_SSD_Attribute";
|
||||
|
||||
switch (id) {
|
||||
case 1:
|
||||
return "Raw_Read_Error_Rate";
|
||||
case 2:
|
||||
return "Throughput_Performance";
|
||||
case 3:
|
||||
return "Spin_Up_Time";
|
||||
case 4:
|
||||
return "Start_Stop_Count";
|
||||
case 5:
|
||||
return "Reallocated_Sector_Ct";
|
||||
case 6:
|
||||
if (ssd) return Unknown_SSD_Attribute;
|
||||
return "Read_Channel_Margin";
|
||||
case 7:
|
||||
if (ssd) return Unknown_SSD_Attribute;
|
||||
return "Seek_Error_Rate";
|
||||
case 8:
|
||||
if (ssd) return Unknown_SSD_Attribute;
|
||||
return "Seek_Time_Performance";
|
||||
case 9:
|
||||
return "Power_On_Hours";
|
||||
case 10:
|
||||
if (ssd) return Unknown_SSD_Attribute;
|
||||
return "Spin_Retry_Count";
|
||||
case 11:
|
||||
if (ssd) return Unknown_SSD_Attribute;
|
||||
return "Calibration_Retry_Count";
|
||||
case 12:
|
||||
return "Power_Cycle_Count";
|
||||
case 13:
|
||||
return "Read_Soft_Error_Rate";
|
||||
case 175:
|
||||
if (hdd) return Unknown_HDD_Attribute;
|
||||
return "Program_Fail_Count_Chip";
|
||||
case 176:
|
||||
if (hdd) return Unknown_HDD_Attribute;
|
||||
return "Erase_Fail_Count_Chip";
|
||||
case 177:
|
||||
if (hdd) return Unknown_HDD_Attribute;
|
||||
return "Wear_Leveling_Count";
|
||||
case 178:
|
||||
if (hdd) return Unknown_HDD_Attribute;
|
||||
return "Used_Rsvd_Blk_Cnt_Chip";
|
||||
case 179:
|
||||
if (hdd) return Unknown_HDD_Attribute;
|
||||
return "Used_Rsvd_Blk_Cnt_Tot";
|
||||
case 180:
|
||||
if (hdd) return Unknown_HDD_Attribute;
|
||||
return "Unused_Rsvd_Blk_Cnt_Tot";
|
||||
case 181:
|
||||
return "Program_Fail_Cnt_Total";
|
||||
case 182:
|
||||
if (hdd) return Unknown_HDD_Attribute;
|
||||
return "Erase_Fail_Count_Total";
|
||||
case 183:
|
||||
return "Runtime_Bad_Block";
|
||||
case 184:
|
||||
return "End-to-End_Error";
|
||||
case 187:
|
||||
return "Reported_Uncorrect";
|
||||
case 188:
|
||||
return "Command_Timeout";
|
||||
case 189:
|
||||
if (ssd) return Unknown_SSD_Attribute;
|
||||
return "High_Fly_Writes";
|
||||
case 190:
|
||||
// Western Digital uses this for temperature.
|
||||
// It's identical to Attribute 194 except that it
|
||||
// has a failure threshold set to correspond to the
|
||||
// max allowed operating temperature of the drive, which
|
||||
// is typically 55C. So if this attribute has failed
|
||||
// in the past, it indicates that the drive temp exceeded
|
||||
// 55C sometime in the past.
|
||||
return "Airflow_Temperature_Cel";
|
||||
case 191:
|
||||
if (ssd) return Unknown_SSD_Attribute;
|
||||
return "G-Sense_Error_Rate";
|
||||
case 192:
|
||||
return "Power-Off_Retract_Count";
|
||||
case 193:
|
||||
if (ssd) return Unknown_SSD_Attribute;
|
||||
return "Load_Cycle_Count";
|
||||
case 194:
|
||||
return "Temperature_Celsius";
|
||||
case 195:
|
||||
// Fujitsu: "ECC_On_The_Fly_Count";
|
||||
return "Hardware_ECC_Recovered";
|
||||
case 196:
|
||||
return "Reallocated_Event_Count";
|
||||
case 197:
|
||||
return "Current_Pending_Sector";
|
||||
case 198:
|
||||
return "Offline_Uncorrectable";
|
||||
case 199:
|
||||
return "UDMA_CRC_Error_Count";
|
||||
case 200:
|
||||
if (ssd) return Unknown_SSD_Attribute;
|
||||
// Western Digital
|
||||
return "Multi_Zone_Error_Rate";
|
||||
case 201:
|
||||
if (ssd) return Unknown_SSD_Attribute;
|
||||
return "Soft_Read_Error_Rate";
|
||||
case 202:
|
||||
if (ssd) return Unknown_SSD_Attribute;
|
||||
// Fujitsu: "TA_Increase_Count"
|
||||
return "Data_Address_Mark_Errs";
|
||||
case 203:
|
||||
// Fujitsu
|
||||
return "Run_Out_Cancel";
|
||||
// Maxtor: ECC Errors
|
||||
case 204:
|
||||
// Fujitsu: "Shock_Count_Write_Opern"
|
||||
return "Soft_ECC_Correction";
|
||||
case 205:
|
||||
// Fujitsu: "Shock_Rate_Write_Opern"
|
||||
return "Thermal_Asperity_Rate";
|
||||
case 206:
|
||||
// Fujitsu
|
||||
if (ssd) return Unknown_SSD_Attribute;
|
||||
return "Flying_Height";
|
||||
case 207:
|
||||
// Maxtor
|
||||
if (ssd) return Unknown_SSD_Attribute;
|
||||
return "Spin_High_Current";
|
||||
case 208:
|
||||
// Maxtor
|
||||
if (ssd) return Unknown_SSD_Attribute;
|
||||
return "Spin_Buzz";
|
||||
case 209:
|
||||
// Maxtor
|
||||
if (ssd) return Unknown_SSD_Attribute;
|
||||
return "Offline_Seek_Performnce";
|
||||
case 220:
|
||||
if (ssd) return Unknown_SSD_Attribute;
|
||||
return "Disk_Shift";
|
||||
case 221:
|
||||
if (ssd) return Unknown_SSD_Attribute;
|
||||
return "G-Sense_Error_Rate";
|
||||
case 222:
|
||||
if (ssd) return Unknown_SSD_Attribute;
|
||||
return "Loaded_Hours";
|
||||
case 223:
|
||||
if (ssd) return Unknown_SSD_Attribute;
|
||||
return "Load_Retry_Count";
|
||||
case 224:
|
||||
if (ssd) return Unknown_SSD_Attribute;
|
||||
return "Load_Friction";
|
||||
case 225:
|
||||
if (ssd) return Unknown_SSD_Attribute;
|
||||
return "Load_Cycle_Count";
|
||||
case 226:
|
||||
if (ssd) return Unknown_SSD_Attribute;
|
||||
return "Load-in_Time";
|
||||
case 227:
|
||||
if (ssd) return Unknown_SSD_Attribute;
|
||||
return "Torq-amp_Count";
|
||||
case 228:
|
||||
return "Power-off_Retract_Count";
|
||||
case 230:
|
||||
// seen in IBM DTPA-353750
|
||||
if (ssd) return Unknown_SSD_Attribute;
|
||||
return "Head_Amplitude";
|
||||
case 231:
|
||||
return "Temperature_Celsius";
|
||||
case 232:
|
||||
// seen in Intel X25-E SSD
|
||||
return "Available_Reservd_Space";
|
||||
case 233:
|
||||
// seen in Intel X25-E SSD
|
||||
if (hdd) return Unknown_HDD_Attribute;
|
||||
return "Media_Wearout_Indicator";
|
||||
case 240:
|
||||
if (ssd) return Unknown_SSD_Attribute;
|
||||
return "Head_Flying_Hours";
|
||||
case 241:
|
||||
return "Total_LBAs_Written";
|
||||
case 242:
|
||||
return "Total_LBAs_Read";
|
||||
case 250:
|
||||
return "Read_Error_Retry_Rate";
|
||||
case 254:
|
||||
if (ssd) return Unknown_SSD_Attribute;
|
||||
return "Free_Fall_Sensor";
|
||||
default:
|
||||
return "Unknown_Attribute";
|
||||
}
|
||||
}
|
||||
|
||||
// Get attribute name
|
||||
std::string ata_get_smart_attr_name(unsigned char id, const ata_vendor_attr_defs & defs,
|
||||
int rpm /* = 0 */)
|
||||
{
|
||||
if (!defs[id].name.empty())
|
||||
return defs[id].name;
|
||||
else
|
||||
return get_default_attr_name(id, rpm);
|
||||
else {
|
||||
const ata_vendor_attr_defs::entry & def = get_default_attr_defs()[id];
|
||||
if (def.name.empty())
|
||||
return "Unknown_Attribute";
|
||||
else if ((def.flags & ATTRFLAG_HDD_ONLY) && rpm == 1)
|
||||
return "Unknown_SSD_Attribute";
|
||||
else if ((def.flags & ATTRFLAG_SSD_ONLY) && rpm > 1)
|
||||
return "Unknown_HDD_Attribute";
|
||||
else
|
||||
return def.name;
|
||||
}
|
||||
}
|
||||
|
||||
// Find attribute index for attribute id, -1 if not found.
|
||||
|
16
atacmds.h
16
atacmds.h
@ -1,10 +1,10 @@
|
||||
/*
|
||||
* atacmds.h
|
||||
*
|
||||
* Home page of code is: http://smartmontools.sourceforge.net
|
||||
* Home page of code is: http://www.smartmontools.org
|
||||
*
|
||||
* Copyright (C) 2002-11 Bruce Allen <smartmontools-support@lists.sourceforge.net>
|
||||
* Copyright (C) 2008-15 Christian Franke <smartmontools-support@lists.sourceforge.net>
|
||||
* Copyright (C) 2002-11 Bruce Allen
|
||||
* Copyright (C) 2008-15 Christian Franke
|
||||
* Copyright (C) 1999-2000 Michael Cornwell <cornwell@acm.org>
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
@ -25,7 +25,7 @@
|
||||
#ifndef ATACMDS_H_
|
||||
#define ATACMDS_H_
|
||||
|
||||
#define ATACMDS_H_CVSID "$Id: atacmds.h 4048 2015-03-29 16:09:04Z chrfranke $"
|
||||
#define ATACMDS_H_CVSID "$Id: atacmds.h 4162 2015-10-31 16:36:16Z chrfranke $"
|
||||
|
||||
#include "dev_interface.h" // ata_device
|
||||
|
||||
@ -684,9 +684,11 @@ enum ata_attr_raw_format
|
||||
|
||||
// Attribute flags
|
||||
enum {
|
||||
ATTRFLAG_INCREASING = 0x01, // Value not reset (for reallocated/pending counts)
|
||||
ATTRFLAG_NO_NORMVAL = 0x02, // Normalized value not valid
|
||||
ATTRFLAG_NO_WORSTVAL = 0x04 // Worst value not valid
|
||||
ATTRFLAG_INCREASING = 0x01, // Value not reset (for reallocated/pending counts)
|
||||
ATTRFLAG_NO_NORMVAL = 0x02, // Normalized value not valid
|
||||
ATTRFLAG_NO_WORSTVAL = 0x04, // Worst value not valid
|
||||
ATTRFLAG_HDD_ONLY = 0x08, // DEFAULT setting for HDD only
|
||||
ATTRFLAG_SSD_ONLY = 0x10, // DEFAULT setting for SSD only
|
||||
};
|
||||
|
||||
// Vendor attribute display defs for all attribute ids
|
||||
|
@ -1,7 +1,7 @@
|
||||
/*
|
||||
* ataidentify.cpp
|
||||
*
|
||||
* Home page of code is: http://smartmontools.sourceforge.net
|
||||
* Home page of code is: http://www.smartmontools.org
|
||||
*
|
||||
* Copyright (C) 2012-15 Christian Franke
|
||||
*
|
||||
@ -18,7 +18,7 @@
|
||||
#include "config.h"
|
||||
#include "ataidentify.h"
|
||||
|
||||
const char * ataidentify_cpp_cvsid = "$Id: ataidentify.cpp 4074 2015-05-01 16:03:50Z chrfranke $"
|
||||
const char * ataidentify_cpp_cvsid = "$Id: ataidentify.cpp 4120 2015-08-27 16:12:21Z samm2 $"
|
||||
ATAIDENTIFY_H_CVSID;
|
||||
|
||||
#include "int64.h"
|
||||
|
@ -1,7 +1,7 @@
|
||||
/*
|
||||
* ataidentify.h
|
||||
*
|
||||
* Home page of code is: http://smartmontools.sourceforge.net
|
||||
* Home page of code is: http://www.smartmontools.org
|
||||
*
|
||||
* Copyright (C) 2012 Christian Franke <smartmontools-support@lists.sourceforge.net>
|
||||
*
|
||||
@ -18,7 +18,7 @@
|
||||
#ifndef ATAIDENTIFY_H
|
||||
#define ATAIDENTIFY_H
|
||||
|
||||
#define ATAIDENTIFY_H_CVSID "$Id: ataidentify.h 3610 2012-09-20 21:27:19Z chrfranke $"
|
||||
#define ATAIDENTIFY_H_CVSID "$Id: ataidentify.h 4120 2015-08-27 16:12:21Z samm2 $"
|
||||
|
||||
void ata_print_identify_data(const void * id, bool all_words, int bit_level);
|
||||
|
||||
|
60
ataprint.cpp
60
ataprint.cpp
@ -1,10 +1,10 @@
|
||||
/*
|
||||
* ataprint.cpp
|
||||
*
|
||||
* Home page of code is: http://smartmontools.sourceforge.net
|
||||
* Home page of code is: http://www.smartmontools.org
|
||||
*
|
||||
* Copyright (C) 2002-11 Bruce Allen
|
||||
* Copyright (C) 2008-15 Christian Franke
|
||||
* Copyright (C) 2008-16 Christian Franke
|
||||
* Copyright (C) 1999-2000 Michael Cornwell <cornwell@acm.org>
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
@ -40,7 +40,7 @@
|
||||
#include "utility.h"
|
||||
#include "knowndrives.h"
|
||||
|
||||
const char * ataprint_cpp_cvsid = "$Id: ataprint.cpp 4104 2015-06-03 18:50:39Z chrfranke $"
|
||||
const char * ataprint_cpp_cvsid = "$Id: ataprint.cpp 4203 2016-01-21 20:42:39Z chrfranke $"
|
||||
ATAPRINT_H_CVSID;
|
||||
|
||||
|
||||
@ -697,6 +697,7 @@ static void print_drive_info(const ata_identify_device * drive,
|
||||
pout("ATA Version is: %s\n", infofound(ataver.c_str()));
|
||||
|
||||
// Print Transport specific version
|
||||
// cppcheck-suppress variableScope
|
||||
char buf[32] = "";
|
||||
unsigned short word222 = drive->words088_255[222-88];
|
||||
if (word222 != 0x0000 && word222 != 0xffff) switch (word222 >> 12) {
|
||||
@ -1542,13 +1543,13 @@ static void print_device_statistics_page(const unsigned char * data, int page)
|
||||
page, offset,
|
||||
abs(size),
|
||||
valstr,
|
||||
(flags & 0x20 ? 'N' : '-'), // normalized statistics
|
||||
(flags & 0x10 ? 'D' : '-'), // supports DSN (ACS-3)
|
||||
(flags & 0x08 ? 'C' : '-'), // monitored condition met (ACS-3)
|
||||
(flags & 0x07 ? '+' : ' '), // reserved flags
|
||||
(info ? info[i].name :
|
||||
page == 0xff ? "Vendor Specific" // ACS-4
|
||||
: "Unknown" ));
|
||||
((flags & 0x20) ? 'N' : '-'), // normalized statistics
|
||||
((flags & 0x10) ? 'D' : '-'), // supports DSN (ACS-3)
|
||||
((flags & 0x08) ? 'C' : '-'), // monitored condition met (ACS-3)
|
||||
((flags & 0x07) ? '+' : ' '), // reserved flags
|
||||
( info ? info[i].name :
|
||||
(page == 0xff) ? "Vendor Specific" // ACS-4
|
||||
: "Unknown" ));
|
||||
}
|
||||
}
|
||||
|
||||
@ -1714,7 +1715,7 @@ static void PrintSataPhyEventCounters(const unsigned char * data, bool reset)
|
||||
case 0x010: name = "R_ERR response for host-to-device data FIS, non-CRC"; break;
|
||||
case 0x012: name = "R_ERR response for host-to-device non-data FIS, CRC"; break;
|
||||
case 0x013: name = "R_ERR response for host-to-device non-data FIS, non-CRC"; break;
|
||||
default: name = (id & 0x8000 ? "Vendor specific" : "Unknown"); break;
|
||||
default: name = ((id & 0x8000) ? "Vendor specific" : "Unknown"); break;
|
||||
}
|
||||
|
||||
// Counters stop at max value, add '+' in this case
|
||||
@ -1812,7 +1813,7 @@ static int PrintSmartErrorlog(const ata_smart_errorlog *data,
|
||||
for (int k = 4; k >= 0; k-- ) {
|
||||
|
||||
// The error log data structure entries are a circular buffer
|
||||
int j, i=(data->error_log_pointer+k)%5;
|
||||
int i = (data->error_log_pointer + k) % 5;
|
||||
const ata_smart_errorlog_struct * elog = data->errorlog_struct+i;
|
||||
const ata_smart_errorlog_error_struct * summary = &(elog->error_struct);
|
||||
|
||||
@ -1848,7 +1849,7 @@ static int PrintSmartErrorlog(const ata_smart_errorlog *data,
|
||||
pout(" Commands leading to the command that caused the error were:\n"
|
||||
" CR FR SC SN CL CH DH DC Powered_Up_Time Command/Feature_Name\n"
|
||||
" -- -- -- -- -- -- -- -- ---------------- --------------------\n");
|
||||
for ( j = 4; j >= 0; j--){
|
||||
for (int j = 4; j >= 0; j--) {
|
||||
const ata_smart_errorlog_command_struct * thiscommand = elog->commands+j;
|
||||
|
||||
// Spec says: unused data command structures shall be zero filled
|
||||
@ -2775,13 +2776,21 @@ int ataPrintMain (ata_device * device, const ata_print_options & options)
|
||||
!(drive.cfs_enable_1 & 0x0020) ? "Disabled" : "Enabled"); // word085
|
||||
}
|
||||
|
||||
// Print ATA security status
|
||||
// Check for ATA Security LOCK
|
||||
unsigned short word128 = drive.words088_255[128-88];
|
||||
bool locked = ((word128 & 0x0007) == 0x0007); // LOCKED|ENABLED|SUPPORTED
|
||||
|
||||
// Print ATA Security status
|
||||
if (options.get_security)
|
||||
print_ata_security_status("ATA Security is: ", drive.words088_255[128-88]);
|
||||
print_ata_security_status("ATA Security is: ", word128);
|
||||
|
||||
// Print write cache reordering status
|
||||
if (options.sct_wcache_reorder_get) {
|
||||
if (isSCTFeatureControlCapable(&drive)) {
|
||||
if (!isSCTFeatureControlCapable(&drive))
|
||||
pout("Wt Cache Reorder: Unavailable\n");
|
||||
else if (locked)
|
||||
pout("Wt Cache Reorder: Unknown (SCT not supported if ATA Security is LOCKED)\n");
|
||||
else {
|
||||
int wcache_reorder = ataGetSetSCTWriteCacheReordering(device,
|
||||
false /*enable*/, false /*persistent*/, false /*set*/);
|
||||
|
||||
@ -2793,8 +2802,6 @@ int ataPrintMain (ata_device * device, const ata_print_options & options)
|
||||
else
|
||||
pout("Wt Cache Reorder: Unknown (0x%02x)\n", wcache_reorder);
|
||||
}
|
||||
else
|
||||
pout("Wt Cache Reorder: Unavailable\n");
|
||||
}
|
||||
|
||||
// Print remaining drive info
|
||||
@ -2886,6 +2893,9 @@ int ataPrintMain (ata_device * device, const ata_print_options & options)
|
||||
if (!isSCTFeatureControlCapable(&drive))
|
||||
pout("Write cache reordering %sable failed: SCT Feature Control command not supported\n",
|
||||
(enable ? "en" : "dis"));
|
||||
else if (locked)
|
||||
pout("Write cache reordering %sable failed: SCT not supported if ATA Security is LOCKED\n",
|
||||
(enable ? "en" : "dis"));
|
||||
else if (ataGetSetSCTWriteCacheReordering(device,
|
||||
enable, false /*persistent*/, true /*set*/) < 0) {
|
||||
pout("Write cache reordering %sable failed: %s\n", (enable ? "en" : "dis"), device->get_errmsg());
|
||||
@ -3310,7 +3320,7 @@ int ataPrintMain (ata_device * device, const ata_print_options & options)
|
||||
pout("SMART Extended Self-test Log size %u not supported\n\n", nsectors);
|
||||
else {
|
||||
raw_buffer log_07_buf(nsectors * 512);
|
||||
ata_smart_extselftestlog * log_07 = (ata_smart_extselftestlog *)log_07_buf.data();
|
||||
ata_smart_extselftestlog * log_07 = reinterpret_cast<ata_smart_extselftestlog *>(log_07_buf.data());
|
||||
if (!ataReadExtSelfTestLog(device, log_07, nsectors)) {
|
||||
pout("Read SMART Extended Self-test Log failed\n\n");
|
||||
failuretest(OPTIONAL_CMD, returnval|=FAILSMART);
|
||||
@ -3378,9 +3388,15 @@ int ataPrintMain (ata_device * device, const ata_print_options & options)
|
||||
|
||||
// Check if SCT commands available
|
||||
bool sct_ok = isSCTCapable(&drive);
|
||||
if(!sct_ok && (options.sct_temp_sts || options.sct_temp_hist || options.sct_temp_int
|
||||
|| options.sct_erc_get || options.sct_erc_set ))
|
||||
pout("SCT Commands not supported\n\n");
|
||||
if ( options.sct_temp_sts || options.sct_temp_hist || options.sct_temp_int
|
||||
|| options.sct_erc_get || options.sct_erc_set ) {
|
||||
if (!sct_ok)
|
||||
pout("SCT Commands not supported\n\n");
|
||||
else if (locked) {
|
||||
pout("SCT Commands not supported if ATA Security is LOCKED\n\n");
|
||||
sct_ok = false;
|
||||
}
|
||||
}
|
||||
|
||||
// Print SCT status and temperature history table
|
||||
if (sct_ok && (options.sct_temp_sts || options.sct_temp_hist || options.sct_temp_int)) {
|
||||
|
@ -1,7 +1,7 @@
|
||||
/*
|
||||
* ataprint.h
|
||||
*
|
||||
* Home page of code is: http://smartmontools.sourceforge.net
|
||||
* Home page of code is: http://www.smartmontools.org
|
||||
*
|
||||
* Copyright (C) 2002-9 Bruce Allen <smartmontools-support@lists.sourceforge.net>
|
||||
* Copyright (C) 2008-12 Christian Franke <smartmontools-support@lists.sourceforge.net>
|
||||
@ -25,7 +25,7 @@
|
||||
#ifndef ATAPRINT_H_
|
||||
#define ATAPRINT_H_
|
||||
|
||||
#define ATAPRINT_H_CVSID "$Id: ataprint.h 3825 2013-07-06 21:38:25Z samm2 $\n"
|
||||
#define ATAPRINT_H_CVSID "$Id: ataprint.h 4120 2015-08-27 16:12:21Z samm2 $\n"
|
||||
|
||||
#include <vector>
|
||||
|
||||
|
119
autogen.sh
119
autogen.sh
@ -1,7 +1,7 @@
|
||||
#!/bin/sh
|
||||
# $Id: autogen.sh 4053 2015-04-14 20:18:50Z chrfranke $
|
||||
# $Id: autogen.sh 4115 2015-07-15 20:52:26Z chrfranke $
|
||||
#
|
||||
# Generate ./configure from config.in and Makefile.in from Makefile.am.
|
||||
# Generate ./configure from configure.ac and Makefile.in from Makefile.am.
|
||||
# This also adds files like missing,depcomp,install-sh to the source
|
||||
# directory. To update these files at a later date use:
|
||||
# autoreconf -f -i -v
|
||||
@ -23,77 +23,40 @@ test -x /usr/bin/uname && /usr/bin/uname | grep -i CYGWIN >/dev/null &&
|
||||
rm -f dostest.tmp
|
||||
}
|
||||
|
||||
typep()
|
||||
{
|
||||
cmd=$1 ; TMP=$IFS ; IFS=: ; set $PATH
|
||||
for dir
|
||||
do
|
||||
if [ -x "$dir/$cmd" ]; then
|
||||
echo "$dir/$cmd"
|
||||
IFS=$TMP
|
||||
return 0
|
||||
fi
|
||||
done
|
||||
IFS=$TMP
|
||||
return 1
|
||||
}
|
||||
# Find automake
|
||||
if [ -n "$AUTOMAKE" ]; then
|
||||
ver=$("$AUTOMAKE" --version) || exit 1
|
||||
else
|
||||
maxver=
|
||||
for v in 1.15 1.14 1.13 1.12 1.11 1.10; do
|
||||
minver=$v; test -n "$maxver" || maxver=$v
|
||||
ver=$(automake-$v --version 2>/dev/null) || continue
|
||||
AUTOMAKE="automake-$v"
|
||||
break
|
||||
done
|
||||
if [ -z "$AUTOMAKE" ]; then
|
||||
echo "GNU Automake $minver (up to $maxver) is required to bootstrap smartmontools from SVN."
|
||||
exit 1;
|
||||
fi
|
||||
fi
|
||||
|
||||
test -x "$AUTOMAKE" ||
|
||||
AUTOMAKE=`typep automake-1.15` || AUTOMAKE=`typep automake-1.14` ||
|
||||
AUTOMAKE=`typep automake-1.13` || AUTOMAKE=`typep automake-1.12` ||
|
||||
AUTOMAKE=`typep automake-1.11` || AUTOMAKE=`typep automake-1.10` ||
|
||||
AUTOMAKE=`typep automake-1.9` || AUTOMAKE=`typep automake-1.8` ||
|
||||
AUTOMAKE=`typep automake-1.7` || AUTOMAKE=`typep automake17` ||
|
||||
{
|
||||
echo
|
||||
echo "You must have at least GNU Automake 1.7 (up to 1.15) installed"
|
||||
echo "in order to bootstrap smartmontools from SVN. Download the"
|
||||
echo "appropriate package for your distribution, or the source tarball"
|
||||
echo "from ftp://ftp.gnu.org/gnu/automake/ ."
|
||||
echo
|
||||
echo "Also note that support for new Automake series (anything newer"
|
||||
echo "than 1.15) is only added after extensive tests. If you live in"
|
||||
echo "the bleeding edge, you should know what you're doing, mainly how"
|
||||
echo "to test it before the developers. Be patient."
|
||||
exit 1;
|
||||
}
|
||||
ver=$(echo "$ver" | sed -n '1s,^.*[^.0-9]\([12]\.[0-9][-.0-9pl]*\).*$,\1,p')
|
||||
if [ -z "$ver" ]; then
|
||||
echo "$AUTOMAKE: Unable to determine automake version."
|
||||
exit 1
|
||||
fi
|
||||
|
||||
test -x "$ACLOCAL" || ACLOCAL="aclocal`echo "$AUTOMAKE" | sed 's/.*automake//'`" && ACLOCAL=`typep "$ACLOCAL"` ||
|
||||
{
|
||||
echo
|
||||
echo "autogen.sh found automake-1.X, but not the respective aclocal-1.X."
|
||||
echo "Your installation of GNU Automake is broken or incomplete."
|
||||
exit 2;
|
||||
}
|
||||
# Check aclocal
|
||||
if [ -z "$ACLOCAL" ]; then
|
||||
ACLOCAL="aclocal$(echo "$AUTOMAKE" | sed -n 's,^.*automake\(-[.0-9]*\),\1,p')"
|
||||
fi
|
||||
|
||||
# Detect Automake version
|
||||
case "$AUTOMAKE" in
|
||||
*automake-1.7|*automake17)
|
||||
ver=1.7 ;;
|
||||
*automake-1.8)
|
||||
ver=1.8 ;;
|
||||
*)
|
||||
ver="`$AUTOMAKE --version | sed -n '1s,^.*[^.0-9]\([12]\.[0-9][-.0-9pl]*\).*$,\1,p'`"
|
||||
ver="${ver:-?.?.?}"
|
||||
esac
|
||||
"$ACLOCAL" --version >/dev/null || exit 1
|
||||
|
||||
# Warn if Automake version was not tested or does not support filesystem
|
||||
# Warn if Automake version was not tested
|
||||
amwarnings=$warnings
|
||||
case "$ver" in
|
||||
1.[78]|1.[78].*)
|
||||
# Check for case sensitive filesystem
|
||||
# (to avoid e.g. "DIST_COMMON = ... ChangeLog ..." in Makefile.in on Cygwin)
|
||||
rm -f CASETEST.TMP
|
||||
echo > casetest.tmp
|
||||
test -f CASETEST.TMP &&
|
||||
{
|
||||
echo "Warning: GNU Automake version ${ver} does not properly handle case"
|
||||
echo "insensitive filesystems. Some make targets may not work."
|
||||
}
|
||||
rm -f casetest.tmp
|
||||
;;
|
||||
|
||||
1.9.[1-6]|1.10|1.10.[123]|1.11|1.11.[1-6]|1.12.[2-6]|1.13.[34])
|
||||
1.10|1.10.[123]|1.11|1.11.[1-6]|1.12.[2-6]|1.13.[34])
|
||||
# OK
|
||||
;;
|
||||
|
||||
@ -108,32 +71,14 @@ case "$ver" in
|
||||
echo "Please report success/failure to the smartmontools-support mailing list."
|
||||
esac
|
||||
|
||||
# Warn if Automake version is too old
|
||||
case "$ver" in
|
||||
1.[789]|1.[789].*)
|
||||
echo "WARNING:"
|
||||
echo "The use of GNU Automake version $ver is deprecated. Support for Automake"
|
||||
echo "versions 1.7 - 1.9.x will be removed in a future release of smartmontools."
|
||||
esac
|
||||
|
||||
# Install pkg-config macros
|
||||
# (Don't use 'aclocal -I m4 --install' to keep support for automake < 1.10)
|
||||
# required for aclocal-1.10 --install
|
||||
test -d m4 || mkdir m4 || exit 1
|
||||
test -z "$force" || rm -f m4/pkg.m4
|
||||
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
|
||||
|
||||
test -z "$warnings" || set -x
|
||||
|
||||
${ACLOCAL} -I m4 $force $warnings
|
||||
${ACLOCAL} -I m4 --install $force $warnings
|
||||
autoheader $force $warnings
|
||||
${AUTOMAKE} --add-missing --copy ${force:+--force-missing} $amwarnings
|
||||
autoconf $force $warnings
|
||||
|
@ -38,7 +38,7 @@
|
||||
#include "scsicmds.h"
|
||||
#include "utility.h"
|
||||
|
||||
const char * cciss_cpp_cvsid = "$Id: cciss.cpp 3945 2014-07-13 15:29:05Z chrfranke $"
|
||||
const char * cciss_cpp_cvsid = "$Id: cciss.cpp 4156 2015-10-18 12:20:40Z samm2 $"
|
||||
CCISS_H_CVSID;
|
||||
|
||||
typedef struct _ReportLUNdata_struct
|
||||
@ -73,10 +73,9 @@ int cciss_io_interface(int device, int target, struct scsi_cmnd_io * iop, int re
|
||||
unsigned char pBuf[512] = {0};
|
||||
unsigned char phylun[8] = {0};
|
||||
int iBufLen = 512;
|
||||
int status = -1;
|
||||
int len = 0; // used later in the code.
|
||||
|
||||
status = cciss_getlun(device, target, phylun, report);
|
||||
int status = cciss_getlun(device, target, phylun, report);
|
||||
if (report > 0)
|
||||
printf(" cciss_getlun(%d, %d) = 0x%x; scsi3addr: %02x %02x %02x %02x %02x %02x %02x %02x\n",
|
||||
device, target, status,
|
||||
@ -181,7 +180,7 @@ static int cciss_sendpassthru(unsigned int cmdtype, unsigned char *CDB,
|
||||
|
||||
if ((err = ioctl(fd, CCISS_PASSTHRU, &iocommand)))
|
||||
{
|
||||
fprintf(stderr, "CCISS ioctl error %d (fd %d CDBLen %d buf_size %d)\n",
|
||||
fprintf(stderr, "CCISS ioctl error %d (fd %d CDBLen %u buf_size %u)\n",
|
||||
fd, err, CDBlen, size);
|
||||
}
|
||||
return err;
|
||||
|
151
configure.ac
151
configure.ac
@ -1,12 +1,12 @@
|
||||
#
|
||||
# $Id: configure.ac 4109 2015-06-04 16:30:15Z chrfranke $
|
||||
# $Id: configure.ac 4181 2015-12-07 20:58:40Z chrfranke $
|
||||
#
|
||||
dnl Process this file with autoconf to produce a configure script.
|
||||
AC_PREREQ(2.50)
|
||||
AC_INIT(smartmontools, 6.4, smartmontools-support@lists.sourceforge.net)
|
||||
AC_CONFIG_SRCDIR(smartctl.cpp)
|
||||
AC_PREREQ([2.60])
|
||||
AC_INIT(smartmontools, 6.5, smartmontools-support@lists.sourceforge.net)
|
||||
AM_INIT_AUTOMAKE([1.10 foreign])
|
||||
|
||||
smartmontools_cvs_tag=`echo '$Id: configure.ac 4109 2015-06-04 16:30:15Z chrfranke $'`
|
||||
smartmontools_cvs_tag=`echo '$Id: configure.ac 4181 2015-12-07 20:58:40Z chrfranke $'`
|
||||
smartmontools_release_date=2015-06-04
|
||||
smartmontools_release_time="16:29:41 UTC"
|
||||
|
||||
@ -14,12 +14,11 @@ AC_DEFINE_UNQUOTED(SMARTMONTOOLS_CONFIGURE_ARGS, "$ac_configure_args",
|
||||
AC_DEFINE_UNQUOTED(SMARTMONTOOLS_RELEASE_DATE, "$smartmontools_release_date", [smartmontools Release Date])
|
||||
AC_DEFINE_UNQUOTED(SMARTMONTOOLS_RELEASE_TIME, "$smartmontools_release_time", [smartmontools Release Time])
|
||||
AC_DEFINE_UNQUOTED(CONFIG_H_CVSID, "$smartmontools_cvs_tag", [smartmontools CVS Tag])
|
||||
AC_DEFINE_UNQUOTED(PACKAGE_HOMEPAGE, "http://smartmontools.sourceforge.net/", [smartmontools Home Page])
|
||||
AC_DEFINE_UNQUOTED(PACKAGE_HOMEPAGE, "http://www.smartmontools.org/", [smartmontools Home Page])
|
||||
|
||||
AC_CONFIG_SRCDIR([smartctl.cpp])
|
||||
AC_CONFIG_HEADER([config.h])
|
||||
|
||||
AM_INIT_AUTOMAKE([foreign])
|
||||
|
||||
AM_MAINTAINER_MODE
|
||||
|
||||
AC_LANG([C++])
|
||||
@ -231,32 +230,15 @@ case "${host}" in
|
||||
esac
|
||||
AC_SUBST(initdfile)
|
||||
|
||||
autoconf_25x=${docdir:-yes}
|
||||
AC_ARG_WITH(docdir,
|
||||
[AS_HELP_STRING([--with-docdir=DIR], [Deprecated (use --docdir=DIR instead)])],
|
||||
[docdir="$withval"],
|
||||
[ if test -z "$docdir"; then
|
||||
# autoconf 2.5x without '--docdir' support
|
||||
docdir='${datadir}/doc/${PACKAGE}'
|
||||
fi
|
||||
])
|
||||
AC_SUBST(docdir)
|
||||
|
||||
AC_ARG_WITH(exampledir,
|
||||
[AS_HELP_STRING([--with-exampledir=DIR], [Location of example scripts [DOCDIR/examplescripts]])],
|
||||
[exampledir="$withval"], [exampledir='${docdir}/examplescripts'])
|
||||
AC_SUBST(exampledir)
|
||||
|
||||
used_deprecated_option=no
|
||||
AC_ARG_ENABLE(drivedb,
|
||||
[AS_HELP_STRING([--disable-drivedb], [Deprecated (use --without-drivedbdir instead)])],
|
||||
[used_deprecated_option=yes], [enable_drivedb=yes])
|
||||
|
||||
drivedbdir=
|
||||
drivedbdir='${datadir}/${PACKAGE}'
|
||||
AC_ARG_WITH(drivedbdir,
|
||||
[AS_HELP_STRING([--with-drivedbdir=@<:@DIR|no@:>@], [Location of drive database file [DATADIR/smartmontools]])],
|
||||
[test "$withval" != "no" && drivedbdir="$withval"],
|
||||
[test "$enable_drivedb" != "no" && drivedbdir='${datadir}/${PACKAGE}'])
|
||||
[AS_HELP_STRING([--with-drivedbdir@<:@=DIR|yes|no@:>@], [Location of drive database file [DATADIR/smartmontools]])],
|
||||
[case "$withval" in yes) ;; no) drivedbdir= ;; *) drivedbdir="$withval" ;; esac])
|
||||
AC_SUBST(drivedbdir)
|
||||
AM_CONDITIONAL(ENABLE_DRIVEDB, [test -n "$drivedbdir"])
|
||||
|
||||
@ -272,31 +254,23 @@ AC_ARG_WITH(smartdplugindir,
|
||||
[smartdplugindir='${smartdscriptdir}/smartd_warning.d'])
|
||||
AC_SUBST(smartdplugindir)
|
||||
|
||||
AC_ARG_ENABLE(savestates,
|
||||
[AS_HELP_STRING([--enable-savestates], [Deprecated (use --with-savestates@<:@=yes@:>@ instead)])],
|
||||
[used_deprecated_option=yes], [enable_savestates=no])
|
||||
|
||||
savestates='${localstatedir}/lib/${PACKAGE}/smartd.'
|
||||
savestates=
|
||||
AC_ARG_WITH(savestates,
|
||||
[AS_HELP_STRING([--with-savestates@<:@=PREFIX|yes|no@:>@],
|
||||
[Enable default smartd state files [no] (yes=LOCALSTATEDIR/lib/smartmontools/smartd.)])],
|
||||
[case "$withval" in yes) ;; no) savestates= ;; *) savestates="$withval" ;; esac],
|
||||
[test "$enable_savestates" != "yes" && savestates=])
|
||||
[case "$withval" in yes) savestates='${localstatedir}/lib/${PACKAGE}/smartd.' ;;
|
||||
no) ;; *) savestates="$withval" ;; esac])
|
||||
savestatesdir="${savestates%/*}"
|
||||
AC_SUBST(savestates)
|
||||
AC_SUBST(savestatesdir)
|
||||
AM_CONDITIONAL(ENABLE_SAVESTATES, [test -n "$savestates"])
|
||||
|
||||
AC_ARG_ENABLE(attributelog,
|
||||
[AS_HELP_STRING([--enable-attributelog], [Deprecated (use --with-attributelog@<:@=yes@:>@ instead)])],
|
||||
[used_deprecated_option=yes], [enable_attributelog=no])
|
||||
|
||||
attributelog='${localstatedir}/lib/${PACKAGE}/attrlog.'
|
||||
attributelog=
|
||||
AC_ARG_WITH(attributelog,
|
||||
[AS_HELP_STRING([--with-attributelog@<:@=PREFIX|yes|no@:>@],
|
||||
[Enable default smartd attribute log files [no] (yes=LOCALSTATEDIR/lib/smartmontools/attrlog.)])],
|
||||
[case "$withval" in yes) ;; no) attributelog= ;; *) attributelog="$withval" ;; esac],
|
||||
[test "$enable_attributelog" != "yes" && attributelog=])
|
||||
[case "$withval" in yes) attributelog='${localstatedir}/lib/${PACKAGE}/attrlog.' ;;
|
||||
no) ;; *) attributelog="$withval" ;; esac])
|
||||
attributelogdir="${attributelog%/*}"
|
||||
AC_SUBST(attributelog)
|
||||
AC_SUBST(attributelogdir)
|
||||
@ -351,6 +325,21 @@ AC_MSG_CHECKING([whether to use libcap-ng])
|
||||
AC_SUBST(CAPNG_LDADD)
|
||||
AC_MSG_RESULT([$use_libcap_ng])
|
||||
|
||||
AC_ARG_WITH(solaris-sparc-ata,
|
||||
[AS_HELP_STRING([--with-solaris-sparc-ata@<:@=yes|no@:>@],
|
||||
[Enable legacy ATA support on Solaris SPARC (requires os_solaris_ata.s from SVN repository) [no]])])
|
||||
|
||||
case "$host:$with_solaris_sparc_ata" in
|
||||
sparc-*-solaris*:yes)
|
||||
if test ! -f "$srcdir/os_solaris_ata.s"; then
|
||||
AC_MSG_ERROR([Missing source file: $srcdir/os_solaris_ata.s
|
||||
This file is no longer included in the source tarball but still
|
||||
available in the SVN repository.])
|
||||
fi
|
||||
AC_DEFINE(WITH_SOLARIS_SPARC_ATA, 1, [Define to 1 to enable legacy ATA support on Solaris SPARC.])
|
||||
;;
|
||||
esac
|
||||
|
||||
# Assume broken snprintf only on Windows with MSVCRT (MinGW without ANSI stdio support)
|
||||
libc_have_working_snprintf=yes
|
||||
|
||||
@ -385,20 +374,49 @@ if test "$libc_have_working_snprintf" = "yes"; then
|
||||
AC_DEFINE(HAVE_WORKING_SNPRINTF, 1, [Define to 1 if the `snprintf' function is sane.]) dnl `vim syntax
|
||||
fi
|
||||
|
||||
if test "$prefix" = "NONE"; then
|
||||
# Fix mandir default set by autoconf 2.5x
|
||||
if test "$mandir" = '${prefix}/man'; then
|
||||
AC_SUBST([mandir], ['${prefix}/share/man'])
|
||||
fi
|
||||
os_win32_manifest=
|
||||
case "$host" in
|
||||
*-*-mingw*)
|
||||
# Newer MinGW may add a default manifest
|
||||
AC_MSG_CHECKING([whether $CC adds an application manifest])
|
||||
cc_adds_manifest=no
|
||||
AC_LINK_IFELSE([AC_LANG_PROGRAM()], [
|
||||
if "$WINDRES" -O rc conftest.exe 2>/dev/null | grep '^1.*RT_MANIFEST' >/dev/null 2>&1; then
|
||||
cc_adds_manifest=incomplete
|
||||
# Manifest must provide a Win 10 compatibility ID
|
||||
if "$WINDRES" -O rc conftest.exe 2>/dev/null | grep '{8e0f7a12-bfb3-4fe8-b9a5-48fd50a15a9a}' >/dev/null 2>&1; then
|
||||
cc_adds_manifest=yes
|
||||
fi
|
||||
fi],
|
||||
[AC_MSG_ERROR([test compile failed])])
|
||||
AC_MSG_RESULT([$cc_adds_manifest])
|
||||
test "$cc_adds_manifest" = "yes" || os_win32_manifest='default.manifest.o'
|
||||
;;
|
||||
esac
|
||||
|
||||
# TODO: Remove after smartmontools 6.5
|
||||
AC_ARG_WITH(docdir,
|
||||
[AS_HELP_STRING([--with-docdir=DIR], [(removed, use --docdir=DIR instead)])],
|
||||
[AC_MSG_ERROR([--with-docdir is no longer supported, use --docdir instead])])
|
||||
AC_ARG_ENABLE(drivedb,
|
||||
[AS_HELP_STRING([--disable-drivedb], [(removed, use --without-drivedbdir instead)])])
|
||||
AC_ARG_ENABLE(savestates,
|
||||
[AS_HELP_STRING([--enable-savestates], [(removed, use --with-savestates@<:@=yes@:>@ instead)])])
|
||||
AC_ARG_ENABLE(attributelog,
|
||||
[AS_HELP_STRING([--enable-attributelog], [(removed, use --with-attributelog@<:@=yes@:>@ instead)])])
|
||||
if test -n "${enable_drivedb+set}${enable_savestates+set}${enable_attributelog+set}"; then
|
||||
AC_MSG_ERROR([Options --disable-drivedb, --enable-savestates, --enable-attributelog are no longer supported.
|
||||
Use --without-drivedbdir, --with-savestates, --with-attributelog instead.])
|
||||
fi
|
||||
|
||||
|
||||
AC_SUBST(releaseversion,['${PACKAGE}-${VERSION}'])
|
||||
AC_SUBST(smartmontools_release_date)
|
||||
AC_SUBST(smartmontools_release_time)
|
||||
|
||||
# Set platform-specific modules and symbols
|
||||
os_libs=
|
||||
os_dltools='curl wget lynx'
|
||||
os_dltools='curl wget lynx svn'
|
||||
os_mailer=mail
|
||||
os_hostname="'hostname'"
|
||||
os_dnsdomainname=
|
||||
@ -419,12 +437,14 @@ case "${host}" in
|
||||
*-*-freebsd*|*-*-dragonfly*|*-*-kfreebsd*-gnu*)
|
||||
os_deps='os_freebsd.o cciss.o dev_areca.o'
|
||||
os_libs='-lcam'
|
||||
os_dltools='curl wget lynx fetch'
|
||||
os_dltools='curl wget lynx fetch svn'
|
||||
AC_CHECK_LIB(usb, libusb20_dev_get_device_desc)
|
||||
os_man_filter=FreeBSD
|
||||
;;
|
||||
sparc-*-solaris*)
|
||||
os_deps='os_solaris.o os_solaris_ata.o'
|
||||
os_deps='os_solaris.o'
|
||||
test "$with_solaris_sparc_ata" = "yes" \
|
||||
&& os_deps="$os_deps os_solaris_ata.o"
|
||||
os_mailer='mailx'
|
||||
os_solaris=yes
|
||||
os_man_filter=Solaris
|
||||
@ -443,7 +463,7 @@ case "${host}" in
|
||||
*-*-openbsd*)
|
||||
os_deps='os_openbsd.o'
|
||||
os_libs='-lutil'
|
||||
os_dltools='curl wget lynx ftp'
|
||||
os_dltools='curl wget lynx ftp svn'
|
||||
os_man_filter=OpenBSD
|
||||
;;
|
||||
*-*-cygwin*)
|
||||
@ -505,6 +525,7 @@ AC_SUBST([os_hostname])
|
||||
AC_SUBST([os_dnsdomainname])
|
||||
AC_SUBST([os_nisdomainname])
|
||||
AC_SUBST([os_man_filter])
|
||||
AC_SUBST([os_win32_manifest])
|
||||
|
||||
# Create drivedb.h update branch name from version: 5.41[.X] -> RELEASE_5_41_DRIVEDB
|
||||
DRIVEDB_BRANCH=`echo $VERSION | sed 's,^\([[0-9]]*\.[[0-9]]*\)\..*$,\1,' \
|
||||
@ -576,6 +597,7 @@ echo "OS specific modules: $os_deps $os_libs $LIBS" >&AS_MESSAGE_FD
|
||||
|
||||
case "$host_os" in
|
||||
mingw*)
|
||||
echo "application manifest: ${os_win32_manifest:-built-in}" >&AS_MESSAGE_FD
|
||||
echo "resource compiler: $WINDRES" >&AS_MESSAGE_FD
|
||||
echo "message compiler: $WINDMC" >&AS_MESSAGE_FD
|
||||
echo "NSIS compiler: $MAKENSIS" >&AS_MESSAGE_FD
|
||||
@ -646,19 +668,14 @@ case "$host_os" in
|
||||
esac
|
||||
echo "-----------------------------------------------------------------------------" >&AS_MESSAGE_FD
|
||||
|
||||
if test "$autoconf_25x" = "yes"; then
|
||||
echo "WARNING:" >&AS_MESSAGE_FD
|
||||
echo "Support for old autoconf 2.5x versions will be removed in a future" >&AS_MESSAGE_FD
|
||||
echo "release of smartmontools." >&AS_MESSAGE_FD
|
||||
elif test "${with_docdir+set}" = "set"; then
|
||||
echo "WARNING:" >&AS_MESSAGE_FD
|
||||
echo "Option --with-docdir is deprecated and will be removed in a future" >&AS_MESSAGE_FD
|
||||
echo "release of smartmontools. Use --docdir instead." >&AS_MESSAGE_FD
|
||||
fi
|
||||
|
||||
if test "$used_deprecated_option" = "yes"; then
|
||||
echo "WARNING:" >&AS_MESSAGE_FD
|
||||
echo "Options --disable-drivedb, --enable-savestates, --enable-attributelog are" >&AS_MESSAGE_FD
|
||||
echo "deprecated and will be removed in a future release of smartmontools." >&AS_MESSAGE_FD
|
||||
echo "Use --without-drivedb, --with-savestates, --with-attributelog instead." >&AS_MESSAGE_FD
|
||||
fi
|
||||
# TODO: Remove after smartmontools 6.5
|
||||
case "$host:${with_solaris_sparc_ata+set}" in
|
||||
sparc-*-solaris*:)
|
||||
AC_MSG_WARN([
|
||||
Legacy ATA support is no longer enabled by default on Solaris SPARC.
|
||||
The required source file 'os_solaris_ata.s' is no longer included in
|
||||
the source tarball but still available in the SVN repository.
|
||||
Use option '--with-solaris-sparc-ata' to enable legacy ATA support.
|
||||
Use option '--without-solaris-sparc-ata' to suppress this warning.])
|
||||
;;
|
||||
esac
|
||||
|
@ -1,7 +1,7 @@
|
||||
/*
|
||||
* dev_areca.cpp
|
||||
*
|
||||
* Home page of code is: http://smartmontools.sourceforge.net
|
||||
* Home page of code is: http://www.smartmontools.org
|
||||
*
|
||||
* Copyright (C) 2012 Hank Wu <hank@areca.com.tw>
|
||||
*
|
||||
@ -21,7 +21,7 @@
|
||||
#include "dev_interface.h"
|
||||
#include "dev_areca.h"
|
||||
|
||||
const char * dev_areca_cpp_cvsid = "$Id: dev_areca.cpp 3872 2014-02-03 21:07:51Z chrfranke $"
|
||||
const char * dev_areca_cpp_cvsid = "$Id: dev_areca.cpp 4209 2016-01-22 20:49:44Z chrfranke $"
|
||||
DEV_ARECA_H_CVSID;
|
||||
|
||||
#include "atacmds.h"
|
||||
@ -297,14 +297,14 @@ int generic_areca_device::arcmsr_ui_handler(unsigned char *areca_packet, int are
|
||||
if (expected==-3) {
|
||||
return set_err(EIO);
|
||||
}
|
||||
expected = arcmsr_command_handler(ARCMSR_CLEAR_WQBUFFER, NULL, 0);
|
||||
arcmsr_command_handler(ARCMSR_CLEAR_WQBUFFER, NULL, 0);
|
||||
expected = arcmsr_command_handler(ARCMSR_WRITE_WQBUFFER, areca_packet, areca_packet_len);
|
||||
if ( expected > 0 )
|
||||
{
|
||||
expected = arcmsr_command_handler(ARCMSR_READ_RQBUFFER, return_buff, sizeof(return_buff));
|
||||
}
|
||||
|
||||
if ( expected < 0 )
|
||||
if ( expected < 3 + 1 ) // Prefix + Checksum
|
||||
{
|
||||
return -1;
|
||||
}
|
||||
|
11
dev_areca.h
11
dev_areca.h
@ -1,7 +1,7 @@
|
||||
/*
|
||||
* dev_areca.h
|
||||
*
|
||||
* Home page of code is: http://smartmontools.sourceforge.net
|
||||
* Home page of code is: http://www.smartmontools.org
|
||||
*
|
||||
* Copyright (C) 2012 Hank Wu <hank@areca.com.tw>
|
||||
*
|
||||
@ -18,7 +18,7 @@
|
||||
#ifndef DEV_ARECA_H
|
||||
#define DEV_ARECA_H
|
||||
|
||||
#define DEV_ARECA_H_CVSID "$Id: dev_areca.h 3854 2013-09-12 05:36:20Z chrfranke $"
|
||||
#define DEV_ARECA_H_CVSID "$Id: dev_areca.h 4146 2015-10-17 12:12:49Z chrfranke $"
|
||||
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
/// Areca RAID support
|
||||
@ -118,9 +118,10 @@ public:
|
||||
virtual bool arcmsr_ata_pass_through(const ata_cmd_in & in, ata_cmd_out & out);
|
||||
|
||||
protected:
|
||||
generic_areca_device() : smart_device(never_called)
|
||||
{
|
||||
}
|
||||
generic_areca_device()
|
||||
: smart_device(never_called),
|
||||
m_disknum(-1), m_encnum(-1)
|
||||
{ }
|
||||
|
||||
void set_disknum(int disknum)
|
||||
{m_disknum = disknum;}
|
||||
|
@ -1,7 +1,7 @@
|
||||
/*
|
||||
* dev_ata_cmd_set.cpp
|
||||
*
|
||||
* Home page of code is: http://smartmontools.sourceforge.net
|
||||
* Home page of code is: http://www.smartmontools.org
|
||||
*
|
||||
* Copyright (C) 2008 Christian Franke <smartmontools-support@lists.sourceforge.net>
|
||||
*
|
||||
@ -22,7 +22,7 @@
|
||||
|
||||
#include <errno.h>
|
||||
|
||||
const char * dev_ata_cmd_set_cpp_cvsid = "$Id: dev_ata_cmd_set.cpp,v 1.4 2008/10/24 21:49:23 manfred99 Exp $"
|
||||
const char * dev_ata_cmd_set_cpp_cvsid = "$Id: dev_ata_cmd_set.cpp 4122 2015-08-27 19:08:07Z chrfranke $"
|
||||
DEV_ATA_CMD_SET_H_CVSID;
|
||||
|
||||
|
||||
|
@ -1,7 +1,7 @@
|
||||
/*
|
||||
* dev_ata_cmd_set.h
|
||||
*
|
||||
* Home page of code is: http://smartmontools.sourceforge.net
|
||||
* Home page of code is: http://www.smartmontools.org
|
||||
*
|
||||
* Copyright (C) 2008 Christian Franke <smartmontools-support@lists.sourceforge.net>
|
||||
*
|
||||
@ -18,7 +18,7 @@
|
||||
#ifndef DEV_ATA_CMD_SET_H
|
||||
#define DEV_ATA_CMD_SET_H
|
||||
|
||||
#define DEV_ATA_CMD_SET_H_CVSID "$Id: dev_ata_cmd_set.h,v 1.3 2008/08/23 21:32:12 chrfranke Exp $\n"
|
||||
#define DEV_ATA_CMD_SET_H_CVSID "$Id: dev_ata_cmd_set.h 4122 2015-08-27 19:08:07Z chrfranke $"
|
||||
|
||||
#include "atacmds.h" // smart_command_set
|
||||
#include "dev_interface.h"
|
||||
|
@ -1,7 +1,7 @@
|
||||
/*
|
||||
* dev_interface.cpp
|
||||
*
|
||||
* Home page of code is: http://smartmontools.sourceforge.net
|
||||
* Home page of code is: http://www.smartmontools.org
|
||||
*
|
||||
* Copyright (C) 2008-13 Christian Franke <smartmontools-support@lists.sourceforge.net>
|
||||
*
|
||||
@ -32,7 +32,7 @@
|
||||
#include <sys/timeb.h>
|
||||
#endif
|
||||
|
||||
const char * dev_interface_cpp_cvsid = "$Id: dev_interface.cpp 3741 2013-01-02 17:06:54Z chrfranke $"
|
||||
const char * dev_interface_cpp_cvsid = "$Id: dev_interface.cpp 4120 2015-08-27 16:12:21Z samm2 $"
|
||||
DEV_INTERFACE_H_CVSID;
|
||||
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
|
@ -1,9 +1,9 @@
|
||||
/*
|
||||
* dev_interface.h
|
||||
*
|
||||
* Home page of code is: http://smartmontools.sourceforge.net
|
||||
* Home page of code is: http://www.smartmontools.org
|
||||
*
|
||||
* Copyright (C) 2008-12 Christian Franke <smartmontools-support@lists.sourceforge.net>
|
||||
* Copyright (C) 2008-15 Christian Franke
|
||||
*
|
||||
* 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
|
||||
@ -18,7 +18,7 @@
|
||||
#ifndef DEV_INTERFACE_H
|
||||
#define DEV_INTERFACE_H
|
||||
|
||||
#define DEV_INTERFACE_H_CVSID "$Id: dev_interface.h 3663 2012-10-24 20:35:55Z chrfranke $\n"
|
||||
#define DEV_INTERFACE_H_CVSID "$Id: dev_interface.h 4152 2015-10-17 16:08:21Z chrfranke $\n"
|
||||
|
||||
#include "utility.h"
|
||||
|
||||
@ -78,7 +78,7 @@ protected:
|
||||
enum do_not_use_in_implementation_classes { never_called };
|
||||
/// Dummy constructor for abstract classes.
|
||||
/// Must never be called in implementation classes.
|
||||
smart_device(do_not_use_in_implementation_classes);
|
||||
explicit smart_device(do_not_use_in_implementation_classes);
|
||||
|
||||
public:
|
||||
virtual ~smart_device() throw();
|
||||
|
@ -1,7 +1,7 @@
|
||||
/*
|
||||
* dev_legacy.cpp
|
||||
*
|
||||
* Home page of code is: http://smartmontools.sourceforge.net
|
||||
* Home page of code is: http://www.smartmontools.org
|
||||
*
|
||||
* Copyright (C) 2008-11 Christian Franke <smartmontools-support@lists.sourceforge.net>
|
||||
*
|
||||
@ -25,7 +25,7 @@
|
||||
|
||||
#include <errno.h>
|
||||
|
||||
const char * dev_legacy_cpp_cvsid = "$Id: dev_legacy.cpp 3263 2011-02-20 18:32:56Z chrfranke $"
|
||||
const char * dev_legacy_cpp_cvsid = "$Id: dev_legacy.cpp 4120 2015-08-27 16:12:21Z samm2 $"
|
||||
DEV_INTERFACE_H_CVSID;
|
||||
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
@ -275,7 +275,7 @@ smart_device * legacy_smart_interface::autodetect_smart_device(const char * name
|
||||
|
||||
static void free_devnames(char * * devnames, int numdevs)
|
||||
{
|
||||
static const char version[] = "$Id: dev_legacy.cpp 3263 2011-02-20 18:32:56Z chrfranke $";
|
||||
static const char version[] = "$Id: dev_legacy.cpp 4120 2015-08-27 16:12:21Z samm2 $";
|
||||
for (int i = 0; i < numdevs; i++)
|
||||
FreeNonZero(devnames[i], -1,__LINE__, version);
|
||||
FreeNonZero(devnames, (sizeof (char*) * numdevs),__LINE__, version);
|
||||
|
@ -1,7 +1,7 @@
|
||||
/*
|
||||
* dev_tunnelled.h
|
||||
*
|
||||
* Home page of code is: http://smartmontools.sourceforge.net
|
||||
* Home page of code is: http://www.smartmontools.org
|
||||
*
|
||||
* Copyright (C) 2008 Christian Franke <smartmontools-support@lists.sourceforge.net>
|
||||
*
|
||||
@ -18,7 +18,7 @@
|
||||
#ifndef DEV_TUNNELLED_H
|
||||
#define DEV_TUNNELLED_H
|
||||
|
||||
#define DEV_TUNNELLED_H_CVSID "$Id: dev_tunnelled.h,v 1.1 2008/07/25 21:16:00 chrfranke Exp $\n"
|
||||
#define DEV_TUNNELLED_H_CVSID "$Id: dev_tunnelled.h 4122 2015-08-27 19:08:07Z chrfranke $"
|
||||
|
||||
#include "dev_interface.h"
|
||||
|
||||
|
384
drivedb.h
384
drivedb.h
@ -1,10 +1,10 @@
|
||||
/*
|
||||
* drivedb.h - smartmontools drive database file
|
||||
*
|
||||
* Home page of code is: http://smartmontools.sourceforge.net
|
||||
* Home page of code is: http://www.smartmontools.org
|
||||
*
|
||||
* Copyright (C) 2003-11 Philip Williams, Bruce Allen
|
||||
* Copyright (C) 2008-15 Christian Franke
|
||||
* Copyright (C) 2008-16 Christian Franke
|
||||
*
|
||||
* 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
|
||||
@ -75,83 +75,85 @@
|
||||
/*
|
||||
const drive_settings builtin_knowndrives[] = {
|
||||
*/
|
||||
{ "$Id: drivedb.h 4105 2015-06-03 19:32:30Z chrfranke $",
|
||||
{ "$Id: drivedb.h 4212 2016-01-24 21:53:53Z samm2 $",
|
||||
"-", "-",
|
||||
"This is a dummy entry to hold the SVN-Id of drivedb.h",
|
||||
""
|
||||
/* Default settings:
|
||||
},
|
||||
{ "DEFAULT",
|
||||
"-", "-",
|
||||
"Default settings",
|
||||
"-v 1,raw48,Raw_Read_Error_Rate "
|
||||
"-v 2,raw48,Throughput_Performance "
|
||||
"-v 3,raw16(avg16),Spin_Up_Time "
|
||||
"-v 4,raw48,Start_Stop_Count "
|
||||
"-v 5,raw16(raw16),Reallocated_Sector_Ct "
|
||||
"-v 6,raw48,Read_Channel_Margin " // HDD only
|
||||
"-v 7,raw48,Seek_Error_Rate " // HDD only
|
||||
"-v 8,raw48,Seek_Time_Performance " // HDD only
|
||||
"-v 6,raw48,Read_Channel_Margin,HDD "
|
||||
"-v 7,raw48,Seek_Error_Rate,HDD "
|
||||
"-v 8,raw48,Seek_Time_Performance,HDD "
|
||||
"-v 9,raw24(raw8),Power_On_Hours "
|
||||
"-v 10,raw48,Spin_Retry_Count " // HDD only
|
||||
"-v 11,raw48,Calibration_Retry_Count " // HDD only
|
||||
"-v 10,raw48,Spin_Retry_Count,HDD "
|
||||
"-v 11,raw48,Calibration_Retry_Count,HDD "
|
||||
"-v 12,raw48,Power_Cycle_Count "
|
||||
"-v 13,raw48,Read_Soft_Error_Rate "
|
||||
// 14-174 Unknown_Attribute
|
||||
"-v 175,raw48,Program_Fail_Count_Chip " // SSD only
|
||||
"-v 176,raw48,Erase_Fail_Count_Chip " // SSD only
|
||||
"-v 177,raw48,Wear_Leveling_Count " // SSD only
|
||||
"-v 178,raw48,Used_Rsvd_Blk_Cnt_Chip " // SSD only
|
||||
"-v 179,raw48,Used_Rsvd_Blk_Cnt_Tot " // SSD only
|
||||
"-v 180,raw48,Unused_Rsvd_Blk_Cnt_Tot " // SSD only
|
||||
"-v 175,raw48,Program_Fail_Count_Chip,SSD "
|
||||
"-v 176,raw48,Erase_Fail_Count_Chip,SSD "
|
||||
"-v 177,raw48,Wear_Leveling_Count,SSD "
|
||||
"-v 178,raw48,Used_Rsvd_Blk_Cnt_Chip,SSD "
|
||||
"-v 179,raw48,Used_Rsvd_Blk_Cnt_Tot,SSD "
|
||||
"-v 180,raw48,Unused_Rsvd_Blk_Cnt_Tot,SSD "
|
||||
"-v 181,raw48,Program_Fail_Cnt_Total "
|
||||
"-v 182,raw48,Erase_Fail_Count_Total " // SSD only
|
||||
"-v 182,raw48,Erase_Fail_Count_Total,SSD "
|
||||
"-v 183,raw48,Runtime_Bad_Block "
|
||||
"-v 184,raw48,End-to-End_Error "
|
||||
// 185-186 Unknown_Attribute
|
||||
"-v 187,raw48,Reported_Uncorrect "
|
||||
"-v 188,raw48,Command_Timeout "
|
||||
"-v 189,raw48,High_Fly_Writes " // HDD only
|
||||
"-v 189,raw48,High_Fly_Writes,HDD "
|
||||
"-v 190,tempminmax,Airflow_Temperature_Cel "
|
||||
"-v 191,raw48,G-Sense_Error_Rate " // HDD only
|
||||
"-v 191,raw48,G-Sense_Error_Rate,HDD "
|
||||
"-v 192,raw48,Power-Off_Retract_Count "
|
||||
"-v 193,raw48,Load_Cycle_Count " // HDD only
|
||||
"-v 193,raw48,Load_Cycle_Count,HDD "
|
||||
"-v 194,tempminmax,Temperature_Celsius "
|
||||
"-v 195,raw48,Hardware_ECC_Recovered "
|
||||
"-v 196,raw16(raw16),Reallocated_Event_Count "
|
||||
"-v 197,raw48,Current_Pending_Sector "
|
||||
"-v 198,raw48,Offline_Uncorrectable "
|
||||
"-v 199,raw48,UDMA_CRC_Error_Count "
|
||||
"-v 200,raw48,Multi_Zone_Error_Rate " // HDD only
|
||||
"-v 201,raw48,Soft_Read_Error_Rate " // HDD only
|
||||
"-v 202,raw48,Data_Address_Mark_Errs " // HDD only
|
||||
"-v 200,raw48,Multi_Zone_Error_Rate,HDD "
|
||||
"-v 201,raw48,Soft_Read_Error_Rate,HDD "
|
||||
"-v 202,raw48,Data_Address_Mark_Errs,HDD "
|
||||
"-v 203,raw48,Run_Out_Cancel "
|
||||
"-v 204,raw48,Soft_ECC_Correction "
|
||||
"-v 205,raw48,Thermal_Asperity_Rate "
|
||||
"-v 206,raw48,Flying_Height " // HDD only
|
||||
"-v 207,raw48,Spin_High_Current " // HDD only
|
||||
"-v 208,raw48,Spin_Buzz " // HDD only
|
||||
"-v 209,raw48,Offline_Seek_Performnce " // HDD only
|
||||
"-v 206,raw48,Flying_Height,HDD "
|
||||
"-v 207,raw48,Spin_High_Current,HDD "
|
||||
"-v 208,raw48,Spin_Buzz,HDD "
|
||||
"-v 209,raw48,Offline_Seek_Performnce,HDD "
|
||||
// 210-219 Unknown_Attribute
|
||||
"-v 220,raw48,Disk_Shift " // HDD only
|
||||
"-v 221,raw48,G-Sense_Error_Rate " // HDD only
|
||||
"-v 222,raw48,Loaded_Hours " // HDD only
|
||||
"-v 223,raw48,Load_Retry_Count " // HDD only
|
||||
"-v 224,raw48,Load_Friction " // HDD only
|
||||
"-v 225,raw48,Load_Cycle_Count " // HDD only
|
||||
"-v 226,raw48,Load-in_Time " // HDD only
|
||||
"-v 227,raw48,Torq-amp_Count " // HDD only
|
||||
"-v 220,raw48,Disk_Shift,HDD "
|
||||
"-v 221,raw48,G-Sense_Error_Rate,HDD "
|
||||
"-v 222,raw48,Loaded_Hours,HDD "
|
||||
"-v 223,raw48,Load_Retry_Count,HDD "
|
||||
"-v 224,raw48,Load_Friction,HDD "
|
||||
"-v 225,raw48,Load_Cycle_Count,HDD "
|
||||
"-v 226,raw48,Load-in_Time,HDD "
|
||||
"-v 227,raw48,Torq-amp_Count,HDD "
|
||||
"-v 228,raw48,Power-off_Retract_Count "
|
||||
// 229 Unknown_Attribute
|
||||
"-v 230,raw48,Head_Amplitude " // HDD only
|
||||
"-v 230,raw48,Head_Amplitude,HDD "
|
||||
"-v 231,raw48,Temperature_Celsius "
|
||||
"-v 232,raw48,Available_Reservd_Space "
|
||||
"-v 233,raw48,Media_Wearout_Indicator " // SSD only
|
||||
"-v 233,raw48,Media_Wearout_Indicator,SSD "
|
||||
// 234-239 Unknown_Attribute
|
||||
"-v 240,raw24(raw8),Head_Flying_Hours " // HDD only, smartmontools <= r3966: raw48
|
||||
"-v 240,raw24(raw8),Head_Flying_Hours,HDD "
|
||||
"-v 241,raw48,Total_LBAs_Written "
|
||||
"-v 242,raw48,Total_LBAs_Read "
|
||||
// 243-249 Unknown_Attribute
|
||||
"-v 250,raw48,Read_Error_Retry_Rate "
|
||||
// 251-253 Unknown_Attribute
|
||||
"-v 254,raw48,Free_Fall_Sensor " // HDD only
|
||||
*/
|
||||
"-v 254,raw48,Free_Fall_Sensor,HDD"
|
||||
},
|
||||
{ "Apacer SSD",
|
||||
"(2|4|8|16|32)GB SATA Flash Drive", // tested with APSDM002G15AN-CT/SFDDA01C and SFI2101D, APSDM004G13AN-AT/SFDE001A
|
||||
@ -305,9 +307,11 @@ const drive_settings builtin_knowndrives[] = {
|
||||
"-v 247,raw48,Host_Program_Page_Count "
|
||||
"-v 248,raw48,Bckgnd_Program_Page_Cnt"
|
||||
},
|
||||
{ "Micron M500DC Enterprise SSDs",
|
||||
"Micron_M500DC_(EE|MT)FDDA[AK](120|240|480|800)MBB", // tested with
|
||||
{ "Micron M500DC/M510DC Enterprise SSDs",
|
||||
"Micron_M500DC_(EE|MT)FDDA[AK](120|240|480|800)MBB|" // tested with
|
||||
// Micron_M500DC_EEFDDAA120MBB/129, Micron_M500DC_MTFDDAK800MBB/0129
|
||||
"MICRON_M510DC_(EE|MT)FDDAK(120|240|480|800|960)MBP", // tested with
|
||||
// Micron_M510DC_MTFDDAK240MBP/0005
|
||||
"", "",
|
||||
//"-v 1,raw48,Raw_Read_Error_Rate "
|
||||
"-v 5,raw48,Reallocated_Block_Count "
|
||||
@ -331,6 +335,33 @@ const drive_settings builtin_knowndrives[] = {
|
||||
"-v 247,raw48,Host_Program_Page_Count "
|
||||
"-v 248,raw48,Bckgnd_Program_Page_Cnt"
|
||||
},
|
||||
{ "SandForce Driven SSDs", // Corsair Force LS with buggy firmware only
|
||||
"Corsair Force LS SSD", // tested with Corsair Force LS SSD/S9FM01.8
|
||||
"S9FM01\\.8",
|
||||
"A firmware update is available for this drive.\n"
|
||||
"It is HIGHLY RECOMMENDED for drives with specific serial numbers.\n"
|
||||
"See the following web pages for details:\n"
|
||||
"http://www.corsair.com/en-us/force-series-ls-60gb-sata-3-6gb-s-ssd\n"
|
||||
"https://www.smartmontools.org/ticket/628",
|
||||
"-v 1,raw24/raw32,Raw_Read_Error_Rate "
|
||||
"-v 5,raw48,Retired_Block_Count "
|
||||
"-v 9,msec24hour32,Power_On_Hours_and_Msec "
|
||||
//"-v 12,raw48,Power_Cycle_Count "
|
||||
"-v 162,raw48,Unknown_SandForce_Attr "
|
||||
"-v 170,raw48,Reserve_Block_Count "
|
||||
"-v 172,raw48,Erase_Fail_Count "
|
||||
"-v 173,raw48,Unknown_SandForce_Attr "
|
||||
"-v 174,raw48,Unexpect_Power_Loss_Ct "
|
||||
"-v 181,raw48,Program_Fail_Count "
|
||||
//"-v 187,raw48,Reported_Uncorrect "
|
||||
//"-v 192,raw48,Power-Off_Retract_Count "
|
||||
//"-v 194,tempminmax,Temperature_Celsius "
|
||||
//"-v 196,raw16(raw16),Reallocated_Event_Count "
|
||||
"-v 218,raw48,Unknown_SandForce_Attr "
|
||||
"-v 231,raw48,SSD_Life_Left "
|
||||
"-v 241,raw48,Lifetime_Writes_GiB "
|
||||
"-v 242,raw48,Lifetime_Reads_GiB"
|
||||
},
|
||||
{ "SandForce Driven SSDs",
|
||||
"SandForce 1st Ed\\.|" // Demo Drive, tested with firmware 320A13F0
|
||||
"ADATA SSD S(396|510|599) .?..GB|" // tested with ADATA SSD S510 60GB/320ABBF0,
|
||||
@ -344,7 +375,8 @@ const drive_settings builtin_knowndrives[] = {
|
||||
"Corsair CSSD-F(40|60|80|115|120|160|240)GBP?2.*|" // Corsair Force, tested with
|
||||
// Corsair CSSD-F40GB2/1.1, Corsair CSSD-F115GB2-A/2.1a
|
||||
"Corsair Force ((3 |LS )?SSD|GS|GT)|" // SF-2281, tested with
|
||||
// Corsair Force SSD/5.05, 3 SSD/1.3.2, GT/1.3.3, GS/5.03, LS SSD/S8FM06.5
|
||||
// Corsair Force SSD/5.05, 3 SSD/1.3.2, GT/1.3.3, GS/5.03,
|
||||
// Corsair Force LS SSD/S8FM06.5, S9FM01.8, S9FM02.0
|
||||
"FM-25S2S-(60|120|240)GBP2|" // G.SKILL Phoenix Pro, SF-1200, tested with
|
||||
// FM-25S2S-240GBP2/4.2
|
||||
"FTM(06|12|24|48)CT25H|" // Supertalent TeraDrive CT, tested with
|
||||
@ -359,8 +391,9 @@ const drive_settings builtin_knowndrives[] = {
|
||||
"KINGSTON SMS200S3(30|60|120)G|" // mSATA, SF-2241, tested with SMS200S3120G/KC3ABBF0
|
||||
"KINGSTON SMS450S3(32|64|128)G|" // mSATA, SF-2281, tested with SMS450S3128G/503ABBF0
|
||||
"KINGSTON (SV300|SKC100|SE100)S3.*G|" // other SF-2281
|
||||
"MKNSSDCR(45|60|90|120|180|240|480)GB(-[DM]X)?|" // Mushkin Chronos (Deluxe/Enhanced), SF-2281,
|
||||
// tested with MKNSSDCR120GB, MKNSSDCR120GB-MX/560ABBF0
|
||||
"MKNSSDCR(45|60|90|120|180|240|360|480)GB(-(7|DX7?|MX|G2))?|" // Mushkin Chronos (7mm/Deluxe/MX/G2),
|
||||
// SF-2281, tested with MKNSSDCR120GB, MKNSSDCR120GB-MX/560ABBF0, MKNSSDCR480GB-DX7/603ABBF0
|
||||
"MKNSSDEC(60|120|240|480|512)GB|" // Mushkin Enhanced ECO2, tested with MKNSSDEC120GB/604ABBF0
|
||||
"MKNSSDAT(30|40|60|120|180|240|480)GB(-(DX|V))?|" // Mushkin Atlas (Deluxe/Value), mSATA, SF-2281,
|
||||
// tested with MKNSSDAT120GB-V/540ABBF0
|
||||
"Mushkin MKNSSDCL(40|60|80|90|115|120|180|240|480)GB-DX2?|" // Mushkin Callisto deluxe,
|
||||
@ -370,6 +403,7 @@ const drive_settings builtin_knowndrives[] = {
|
||||
"OCZ-NOCTI|" // mSATA, SF-2100, tested with OCZ-NOCTI/2.15
|
||||
"OCZ-REVODRIVE3?( X2)?|" // PCIe, SF-1200/2281, tested with
|
||||
// OCZ-REVODRIVE( X2)?/1.20, OCZ-REVODRIVE3 X2/2.11
|
||||
"OCZ-REVODRIVE350|"
|
||||
"OCZ[ -](VELO|VERTEX2[ -](EX|PRO))( [123]\\..*)?|" // SF-1500, tested with
|
||||
// OCZ VERTEX2-PRO/1.10 (Bogus thresholds for attribute 232 and 235)
|
||||
"D2[CR]STK251...-....|" // OCZ Deneva 2 C/R, SF-22xx/25xx,
|
||||
@ -378,6 +412,7 @@ const drive_settings builtin_knowndrives[] = {
|
||||
// OCZ-AGILITY3/2.11, OCZ-SOLID3/2.15, OCZ-VERTEX3 MI/2.15
|
||||
"OCZ Z-DRIVE R4 [CR]M8[48]|" // PCIe, SF-2282/2582, tested with OCZ Z-DRIVE R4 CM84/2.13
|
||||
// (Bogus attributes under Linux)
|
||||
"OCZ Z-DRIVE 4500|"
|
||||
"TALOS2|" // OCZ Talos 2 C/R, SAS (works with -d sat), 2*SF-2282, tested with TALOS2/3.20E
|
||||
"(APOC|DENC|DENEVA|FTNC|GFGC|MANG|MMOC|NIMC|TMSC).*|" // other OCZ SF-1200,
|
||||
// tested with DENCSTE251M11-0120/1.33, DENEVA PCI-E/1.33
|
||||
@ -409,9 +444,11 @@ const drive_settings builtin_knowndrives[] = {
|
||||
//"-v 12,raw48,Power_Cycle_Count "
|
||||
"-v 13,raw24/raw32,Soft_Read_Error_Rate "
|
||||
"-v 100,raw48,Gigabytes_Erased "
|
||||
"-v 162,raw48,Unknown_SandForce_Attr " // Corsair Force LS SSD/S9FM01.8, *2.0
|
||||
"-v 170,raw48,Reserve_Block_Count "
|
||||
"-v 171,raw48,Program_Fail_Count "
|
||||
"-v 172,raw48,Erase_Fail_Count "
|
||||
"-v 173,raw48,Unknown_SandForce_Attr " // Corsair Force LS SSD/S9FM01.8, *2.0
|
||||
"-v 174,raw48,Unexpect_Power_Loss_Ct "
|
||||
"-v 177,raw48,Wear_Range_Delta "
|
||||
"-v 181,raw48,Program_Fail_Count "
|
||||
@ -419,6 +456,7 @@ const drive_settings builtin_knowndrives[] = {
|
||||
"-v 184,raw48,IO_Error_Detect_Code_Ct "
|
||||
//"-v 187,raw48,Reported_Uncorrect "
|
||||
"-v 189,tempminmax,Airflow_Temperature_Cel "
|
||||
//"-v 192,raw48,Power-Off_Retract_Count "
|
||||
//"-v 194,tempminmax,Temperature_Celsius "
|
||||
"-v 195,raw24/raw32,ECC_Uncorr_Error_Count "
|
||||
//"-v 196,raw16(raw16),Reallocated_Event_Count "
|
||||
@ -426,6 +464,7 @@ const drive_settings builtin_knowndrives[] = {
|
||||
"-v 199,raw48,SATA_CRC_Error_Count "
|
||||
"-v 201,raw24/raw32,Unc_Soft_Read_Err_Rate "
|
||||
"-v 204,raw24/raw32,Soft_ECC_Correct_Rate "
|
||||
"-v 218,raw48,Unknown_SandForce_Attr " // Corsair Force LS SSD/S9FM01.8, *2.0
|
||||
"-v 230,raw48,Life_Curve_Status "
|
||||
"-v 231,raw48,SSD_Life_Left "
|
||||
//"-v 232,raw48,Available_Reservd_Space "
|
||||
@ -437,6 +476,7 @@ const drive_settings builtin_knowndrives[] = {
|
||||
},
|
||||
{ "Indilinx Barefoot based SSDs",
|
||||
"Corsair CSSD-V(32|60|64|128|256)GB2|" // Corsair Nova, tested with Corsair CSSD-V32GB2/2.2
|
||||
"Corsair CMFSSD-(32|64|128|256)D1|" // Corsair Extreme, tested with Corsair CMFSSD-128D1/1.0
|
||||
"CRUCIAL_CT(64|128|256)M225|" // tested with CRUCIAL_CT64M225/1571
|
||||
"G.SKILL FALCON (64|128|256)GB SSD|" // tested with G.SKILL FALCON 128GB SSD/2030
|
||||
"OCZ[ -](AGILITY|ONYX|VERTEX( 1199|-TURBO| v1\\.10)?)|" // tested with
|
||||
@ -489,8 +529,10 @@ const drive_settings builtin_knowndrives[] = {
|
||||
//"-v 233,raw48,Media_Wearout_Indicator"
|
||||
},
|
||||
{ "Indilinx Barefoot 3 based SSDs",
|
||||
"OCZ-VECTOR(150)?|" // tested with OCZ-VECTOR/1.03, OCZ-VECTOR150/1.2
|
||||
"OCZ-VERTEX4[56]0|" // Barefoot 3 M10, tested with OCZ-VERTEX450/1.0, OCZ-VERTEX460/1.0
|
||||
"OCZ-VECTOR(1[58]0)?|" // tested with OCZ-VECTOR/1.03, OCZ-VECTOR150/1.2, OCZ-VECTOR180
|
||||
"OCZ-VERTEX4[56]0A?|" // Barefoot 3 M10, tested with OCZ-VERTEX450/1.0, OCZ-VERTEX460/1.0, VERTEX460A
|
||||
"OCZ-SABER1000|"
|
||||
"OCZ-ARC100|"
|
||||
"Radeon R7", // Barefoot 3 M00, tested with Radeon R7/1.00
|
||||
"", "",
|
||||
"-v 5,raw48,Runtime_Bad_Block "
|
||||
@ -504,15 +546,27 @@ const drive_settings builtin_knowndrives[] = {
|
||||
"-v 197,raw48,Total_Unc_Read_Failures "
|
||||
"-v 198,raw48,Host_Reads_GiB "
|
||||
"-v 199,raw48,Host_Writes_GiB "
|
||||
"-v 205,raw48,Max_Rated_PE_Count "
|
||||
"-v 206,raw48,Min_Erase_Count "
|
||||
"-v 207,raw48,Max_Erase_Count "
|
||||
"-v 208,raw48,Average_Erase_Count "
|
||||
"-v 210,raw48,SATA_CRC_Error_Count "
|
||||
"-v 212,raw48,Pages_Requiring_Rd_Rtry "
|
||||
"-v 213,raw48,Snmple_Retry_Attempts "
|
||||
"-v 214,raw48,Adaptive_Retry_Attempts "
|
||||
"-v 222,raw48,RAID_Recovery_Count "
|
||||
"-v 224,raw48,In_Warranty "
|
||||
"-v 225,raw48,DAS_Polarity "
|
||||
"-v 226,raw48,Partial_Pfail "
|
||||
"-v 230,raw48,Write_Throttling "
|
||||
"-v 233,raw48,Remaining_Lifetime_Perc "
|
||||
"-v 241,raw48,Host_Writes_GiB " // M00/M10
|
||||
"-v 242,raw48,Host_Reads_GiB " // M00/M10
|
||||
"-v 249,raw48,Total_NAND_Prog_Ct_GiB"
|
||||
"-v 249,raw48,Total_NAND_Prog_Ct_GiB "
|
||||
"-v 251,raw48,Total_NAND_Read_Ct_GiB"
|
||||
},
|
||||
{ "OCZ Intrepid 3000 SSDs", // tested with OCZ INTREPID 3600/1.4.3.6, 3800/1.4.3.0
|
||||
"OCZ INTREPID 3[68]00",
|
||||
{ "OCZ Intrepid 3000 SSDs", // tested with OCZ INTREPID 3600/1.4.3.6, 3800/1.4.3.0, 3700/1.5.0.4
|
||||
"OCZ INTREPID 3[678]00",
|
||||
"", "",
|
||||
"-v 5,raw48,Runtime_Bad_Block "
|
||||
//"-v 9,raw24(raw8),Power_On_Hours "
|
||||
@ -545,6 +599,19 @@ const drive_settings builtin_knowndrives[] = {
|
||||
"-v 249,raw48,Total_NAND_Prog_Ct_GiB "
|
||||
"-v 251,raw48,Total_NAND_Read_Ct_GiB"
|
||||
},
|
||||
{
|
||||
"OCZ Trion",
|
||||
"OCZ-TRION100", // tested with OCZ-TRION100/SAFM11.2
|
||||
"", "",
|
||||
//"-v 9,raw24(raw8),Power_On_Hours "
|
||||
//"-v 12,raw48,Power_Cycle_Count "
|
||||
"-v 167,raw48,SSD_Protect_Mode "
|
||||
"-v 168,raw48,SATA_PHY_Error_Count "
|
||||
"-v 169,raw48,Bad_Block_Count "
|
||||
"-v 173,raw48,Erase_Count "
|
||||
"-v 192,raw48,Unexpect_Power_Loss_Ct"
|
||||
//"-v 194,tempminmax,Temperature_Celsius "
|
||||
},
|
||||
{ "InnoDisk InnoLite SATADOM D150QV-L SSDs", // tested with InnoLite SATADOM D150QV-L/120319
|
||||
"InnoLite SATADOM D150QV-L",
|
||||
"", "",
|
||||
@ -569,6 +636,84 @@ const drive_settings builtin_knowndrives[] = {
|
||||
"-v 236,raw48,Unstable_Power_Count "
|
||||
"-v 240,raw48,Write_Head"
|
||||
},
|
||||
{ "Innodisk 3MG2-P SSDs", // tested with 2.5" SATA SSD 3MG2-P/M140402,
|
||||
// 1.8 SATA SSD 3IE2-P/M150821, 2.5" SATA SSD 3IE2-P/M150821,
|
||||
// SATA Slim 3MG2-P/M141114, M.2 (S80) 3MG2-P/M141114
|
||||
"((1\\.8|2\\.5)\"? SATA SSD|SATA Slim|M\\.2 \\(S80\\)) 3(MG|IE)2-P",
|
||||
"", "",
|
||||
//"-v 1,raw48,Raw_Read_Error_Rate "
|
||||
//"-v 2,raw48,Throughput_Performance "
|
||||
//"-v 9,raw24(raw8),Power_On_Hours "
|
||||
//"-v 12,raw48,Power_Cycle_Count "
|
||||
"-v 160,raw48,Uncorrectable_Error_Cnt "
|
||||
"-v 161,raw48,Number_of_Pure_Spare "
|
||||
"-v 163,raw48,Initial_Bad_Block_Count "
|
||||
"-v 164,raw48,Total_Erase_Count "
|
||||
"-v 165,raw48,Max_Erase_Count "
|
||||
"-v 166,raw48,Min_Erase_Count "
|
||||
"-v 167,raw48,Average_Erase_Count "
|
||||
"-v 168,raw48,Max_Erase_Count_of_Spec "
|
||||
"-v 169,raw48,Remaining_Lifetime_Perc "
|
||||
//"-v 175,raw48,Program_Fail_Count_Chip "
|
||||
//"-v 176,raw48,Erase_Fail_Count_Chip "
|
||||
//"-v 177,raw48,Wear_Leveling_Count "
|
||||
"-v 178,raw48,Runtime_Invalid_Blk_Cnt "
|
||||
//"-v 181,raw48,Program_Fail_Cnt_Total "
|
||||
//"-v 182,raw48,Erase_Fail_Count_Total "
|
||||
//"-v 187,raw48,Reported_Uncorrect " // ] only in spec
|
||||
//"-v 192,raw48,Power-Off_Retract_Count "
|
||||
//"-v 194,tempminmax,Temperature_Celsius "
|
||||
//"-v 195,raw48,Hardware_ECC_Recovered "
|
||||
//"-v 196,raw16(raw16),Reallocated_Event_Count "
|
||||
//"-v 197,raw48,Current_Pending_Sector "
|
||||
//"-v 198,raw48,Offline_Uncorrectable "
|
||||
//"-v 199,raw48,UDMA_CRC_Error_Count "
|
||||
"-v 225,raw48,Host_Writes_32MiB " // ]
|
||||
//"-v 232,raw48,Available_Reservd_Space "
|
||||
"-v 233,raw48,Flash_Writes_32MiB " // ]
|
||||
"-v 234,raw48,Flash_Reads_32MiB " // ]
|
||||
"-v 241,raw48,Host_Writes_32MiB "
|
||||
"-v 242,raw48,Host_Reads_32MiB "
|
||||
"-v 245,raw48,Flash_Writes_32MiB"
|
||||
},
|
||||
{ "Innodisk 3ME3 SSDs", // tested with 2.5" SATA SSD 3ME3/S15A19, CFast 3ME3/S15A19
|
||||
// InnoDisk Corp. - mSATA 3ME3/S15A19, mSATA mini 3ME3/S15A19, M.2 (S42) 3ME3,
|
||||
// SATA Slim 3ME3/S15A19, SATADOM-MH 3ME3/S15A19, SATADOM-ML 3ME3/S15A19,
|
||||
// SATADOM-MV 3ME3/S15A19, SATADOM-SL 3ME3/S15A19, SATADOM-SV 3ME3/S15A19
|
||||
"(2.5\" SATA SSD|CFast|InnoDisk Corp\\. - mSATA|mSATA mini|"
|
||||
"M\\.2 \\(S42\\)|SATA Slim|SATADOM-(MH|ML|MV|SL|SV)) 3ME3",
|
||||
"", "",
|
||||
//"-v 1,raw48,Raw_Read_Error_Rate "
|
||||
//"-v 2,raw48,Throughput_Performance "
|
||||
//"-v 3,raw16(avg16),Spin_Up_Time "
|
||||
"-v 5,raw48,Later_Bad_Block "
|
||||
"-v 7,raw48,Seek_Error_Rate " // ?
|
||||
"-v 8,raw48,Seek_Time_Performance " // ?
|
||||
//"-v 9,raw24(raw8),Power_On_Hours "
|
||||
"-v 10,raw48,Spin_Retry_Count " // ?
|
||||
//"-v 12,raw48,Power_Cycle_Count "
|
||||
"-v 163,raw48,Total_Bad_Block_Count "
|
||||
"-v 165,raw48,Max_Erase_Count "
|
||||
"-v 167,raw48,Average_Erase_Count "
|
||||
"-v 168,raw48,SATA_PHY_Error_Count "
|
||||
"-v 169,raw48,Remaining_Lifetime_Perc "
|
||||
"-v 170,raw48,Spare_Block_Count "
|
||||
"-v 171,raw48,Program_Fail_Count "
|
||||
"-v 172,raw48,Erase_Fail_Count "
|
||||
"-v 175,raw48,Bad_Cluster_Table_Count "
|
||||
"-v 176,raw48,RANGE_RECORD_Count "
|
||||
//"-v 187,raw48,Reported_Uncorrect "
|
||||
//"-v 192,raw48,Power-Off_Retract_Count "
|
||||
//"-v 194,tempminmax,Temperature_Celsius "
|
||||
//"-v 197,raw48,Current_Pending_Sector "
|
||||
"-v 225,raw48,Data_Log_Write_Count "
|
||||
"-v 229,hex48,Flash_ID "
|
||||
"-v 232,raw48,Spares_Remaining_Perc "
|
||||
"-v 235,raw16,Later_Bad_Blk_Inf_R/W/E " // Read/Write/Erase
|
||||
"-v 240,raw48,Write_Head "
|
||||
"-v 241,raw48,Host_Writes_32MiB "
|
||||
"-v 242,raw48,Host_Reads_32MiB"
|
||||
},
|
||||
{ "InnoDisk iCF 9000 CompactFlash Cards", // tested with InnoDisk Corp. - iCF9000 1GB/140808,
|
||||
// ..., InnoDisk Corp. - iCF9000 64GB/140808
|
||||
"InnoDisk Corp\\. - iCF9000 (1|2|4|8|16|32|64)GB",
|
||||
@ -684,9 +829,10 @@ const drive_settings builtin_knowndrives[] = {
|
||||
"-v 242,raw48,Host_Reads_32MiB"
|
||||
},
|
||||
{ "Intel 320 Series SSDs", // tested with INTEL SSDSA2CT040G3/4PC10362,
|
||||
// INTEL SSDSA2CW160G3/4PC10362, INTEL SSDSA2BT040G3/4PC10362, INTEL SSDSA2BW120G3A/4PC10362,
|
||||
// INTEL SSDSA2BW300G3D/4PC10362, INTEL SSDSA2BW160G3L/4PC1LE04
|
||||
"INTEL SSDSA[12][BC][WT](040|080|120|160|300|600)G3[ADL]?",
|
||||
// INTEL SSDSA2CW160G3/4PC10362, SSDSA2BT040G3/4PC10362, SSDSA2BW120G3A/4PC10362,
|
||||
// INTEL SSDSA2BW300G3D/4PC10362, SSDSA2BW160G3L/4PC1LE04, SSDSA1NW160G3/4PC10362
|
||||
"INTEL SSDSA[12][BCN][WT](040|080|120|160|300|600)G3[ADL]?",
|
||||
// 2B = 2.5" 7mm, 2C = 2.5" 9.5mm, 1N = 1.8" microSATA
|
||||
"", "",
|
||||
"-F nologdir "
|
||||
//"-v 3,raw16(avg16),Spin_Up_Time "
|
||||
@ -800,9 +946,11 @@ const drive_settings builtin_knowndrives[] = {
|
||||
"-v 242,raw48,Host_Reads_32MiB "
|
||||
"-v 249,raw48,NAND_Writes_1GiB"
|
||||
},
|
||||
{ "Intel 530 Series SSDs", // tested with INTEL SSDSC2BW180A4/DC12, SSDSC2BW240A4/DC12,
|
||||
// INTEL SSDMCEAW120A4/DC33, INTEL SSDMCEAW240A4/DC33
|
||||
"INTEL SSD(MCEA|SC2B)W(080|120|180|240|360|480)A4", // MCEA = mSATA
|
||||
{ "Intel 53x and Pro 2500 Series SSDs", // SandForce SF-2281, tested with
|
||||
// INTEL SSDSC2BW180A4/DC12, SSDSC2BW240A4/DC12, SSDMCEAW120A4/DC33
|
||||
// INTEL SSDMCEAW240A4/DC33, SSDSC2BF480A5/TG26, SSDSC2BW240H6/RG21
|
||||
"INTEL SSD(MCEA|SC2B|SCKJ)[WF](056|080|120|180|240|360|480)(A4|A5|H6)",
|
||||
// SC2B = 2.5", MCEA = mSATA, SCKJ = M.2; A4 = 530, A5 = Pro 2500, H6 = 535
|
||||
"", "",
|
||||
//"-v 5,raw16(raw16),Reallocated_Sector_Ct "
|
||||
"-v 9,msec24hour32,Power_On_Hours_and_Msec "
|
||||
@ -844,9 +992,11 @@ const drive_settings builtin_knowndrives[] = {
|
||||
"-v 242,raw48,Host_Reads_32MiB "
|
||||
"-v 249,raw48,NAND_Writes_1GiB"
|
||||
},
|
||||
{ "Intel 730 and DC S3500/S3700 Series SSDs", // tested with INTEL SSDSC2BP480G4, SSDSC2BB120G4/D2010355,
|
||||
// INTEL SSDSC2BB800G4T, SSDSC2BA200G3/5DV10250
|
||||
"INTEL SSDSC(1N|2B)[ABP](080|100|120|160|200|240|300|400|480|600|800)G[34]T?", // A=S3700, B=S3500, P=730
|
||||
{ "Intel 730 and DC S35x0/3610/3700 Series SSDs", // tested with INTEL SSDSC2BP480G4, SSDSC2BB120G4/D2010355,
|
||||
// INTEL SSDSC2BB800G4T, SSDSC2BA200G3/5DV10250, SSDSC2BB080G6/G2010130, SSDSC2BX200G4/G2010110,
|
||||
// INTEL SSDSC2BB016T6/G2010140, SSDSC2BX016T4/G2010140
|
||||
"INTEL SSDSC(1N|2B)[ABPX]((080|100|120|160|200|240|300|400|480|600|800)G[346]T?|(012|016)T[46])",
|
||||
// A = S3700, B*4 = S3500, B*6 = S3510, P = 730, X = S3610
|
||||
"", "",
|
||||
//"-v 3,raw16(avg16),Spin_Up_Time "
|
||||
//"-v 4,raw48,Start_Stop_Count "
|
||||
@ -875,6 +1025,7 @@ const drive_settings builtin_knowndrives[] = {
|
||||
"-v 234,raw24/raw32:04321,Thermal_Throttle "
|
||||
"-v 241,raw48,Host_Writes_32MiB "
|
||||
"-v 242,raw48,Host_Reads_32MiB "
|
||||
"-v 243,raw48,NAND_Writes_32MiB " // S3510/3610
|
||||
"-F xerrorlba" // tested with SSDSC2BB600G4/D2010355
|
||||
},
|
||||
{ "Kingston branded X25-V SSDs", // fixed firmware
|
||||
@ -1006,15 +1157,17 @@ const drive_settings builtin_knowndrives[] = {
|
||||
"SAMSUNG SSD 830 Series|" // tested with SAMSUNG SSD 830 Series 64GB/CXM03B1Q
|
||||
"Samsung SSD 840 (PRO )?Series|" // tested with Samsung SSD 840 PRO Series 128GB/DXM04B0Q,
|
||||
// Samsung SSD 840 Series/DXT06B0Q
|
||||
"Samsung SSD 8[45]0 EVO ((120|250|500)G|1T)B( mSATA)?|" // tested with Samsung SSD 840 EVO (120|250|500)GB/EXT0AB0Q,
|
||||
"Samsung SSD 8[45]0 EVO (mSATA )?((120|250|500)G|1T)B( mSATA)?|" // tested with Samsung SSD 840 EVO (120|250|500)GB/EXT0AB0Q,
|
||||
// Samsung SSD 840 EVO (120|250)GB/EXT0BB6Q, 1TB/EXT0BB0Q, 120GB mSATA/EXT41B6Q,
|
||||
// Samsung SSD 850 EVO 250GB/EMT01B6Q
|
||||
// Samsung SSD 850 EVO mSATA 120GB/EMT41B6Q
|
||||
"Samsung SSD 850 PRO ((128|256|512)G|1T)B|" // tested with Samsung SSD 850 PRO 128GB/EXM01B6Q,
|
||||
// Samsung SSD 850 PRO 1TB/EXM01B6Q
|
||||
"SAMSUNG MZ7WD((120|240)HAFV|480HAGM|960HAGP)-00003|" // SM843T Series, tested with
|
||||
// SAMSUNG MZ7WD120HAFV-00003/DXM85W3Q
|
||||
"SAMSUNG MZ7GE(240HMGR|(480|960)HMHP)-00003", // SM853T Series, tested with
|
||||
"SAMSUNG MZ7GE(240HMGR|(480|960)HMHP)-00003|" // SM853T Series, tested with
|
||||
// SAMSUNG MZ7GE240HMGR-00003/EXT0303Q
|
||||
"SAMSUNG MZ[7N]LN(128|256|512)HC(HP|GR|JH)-.*", // PM871 Series, tested with SAMSUNG MZ7LN128HCHP
|
||||
"", "",
|
||||
//"-v 5,raw16(raw16),Reallocated_Sector_Ct "
|
||||
//"-v 9,raw24(raw8),Power_On_Hours "
|
||||
@ -1106,8 +1259,12 @@ const drive_settings builtin_knowndrives[] = {
|
||||
"-v 244,raw48,Thermal_Throttle "
|
||||
},
|
||||
{ "SiliconMotion based SSDs", // SM2246EN (Transcend TS6500)
|
||||
"TS((16|32|64|128|256|512)G|1T)(SSD|MSA)370", // Transcend SSD370 SATA/mSATA, TS6500, tested with
|
||||
// TS32GMSA370/20140402, TS16GMSA370/20140516, TS64GSSD370/20140516, TS256GSSD370/N0815B
|
||||
"CT(120|250|500|1000)BX100SSD1|" // Crucial BX100, tested with CT250BX100SSD1/MU02,
|
||||
// CT500BX100SSD1/MU02, CT1000BX100SSD1/MU02
|
||||
"TS((16|32|64|128|256|512)G|1T)(SSD|MSA)(370S?|420I?)|" // Transcend SSD370/420 SATA/mSATA, TS6500,
|
||||
// tested with TS32GMSA370/20140402, TS16GMSA370/20140516, TS64GSSD370/20140516,
|
||||
// TS256GSSD370/N0815B, TS256GSSD370S/N1114H, TS512GSSD370S/N1114H, TS32GSSD420I/N1114H
|
||||
"ADATA SP550", // ADATA SP550/O0803B5a
|
||||
"", "",
|
||||
//"-v 1,raw48,Raw_Read_Error_Rate "
|
||||
//"-v 2,raw48,Throughput_Performance "
|
||||
@ -1140,7 +1297,7 @@ const drive_settings builtin_knowndrives[] = {
|
||||
//"-v 232,raw48,Available_Reservd_Space "
|
||||
"-v 241,raw48,Host_Writes_32MiB "
|
||||
"-v 242,raw48,Host_Reads_32MiB "
|
||||
"-v 245,raw48,Unkn_SiliconMotion_Attr" // FW N0815B
|
||||
"-v 245,raw48,Flash_Writes_32MiB" // FW N0815B, N1114H
|
||||
},
|
||||
{ "Smart Storage Systems Xcel-10 SSDs", // based on http://www.smartm.com/files/salesLiterature/storage/xcel10.pdf
|
||||
"SMART A25FD-(32|64|128)GI32N", // tested with SMART A25FD-128GI32N/B9F23D4K
|
||||
@ -2780,7 +2937,8 @@ const drive_settings builtin_knowndrives[] = {
|
||||
},
|
||||
{ "Seagate Enterprise Capacity 3.5 HDD", // tested with ST6000NM0024-1HT17Z/SN02
|
||||
"ST[2456]000NM0[01][248]4-.*", // *[069]4 = 4Kn
|
||||
"", "", ""
|
||||
"", "",
|
||||
"-v 188,raw16"
|
||||
},
|
||||
{ "Seagate NAS HDD", // tested with ST2000VN000-1H3164/SC42, ST3000VN000-1H4167/SC43
|
||||
"ST[234]000VN000-.*",
|
||||
@ -3001,13 +3159,21 @@ const drive_settings builtin_knowndrives[] = {
|
||||
"", "", ""
|
||||
},
|
||||
{ "Western Digital Caviar Black",
|
||||
"WDC WD((500|640|750)1AAL|1001FA[EL]|2001FAS)S-.*",
|
||||
"WDC WD((500|640|750)1AAL|1001FA[EL]|2001FAS)S-.*|"
|
||||
"WDC WD(2002|7502|1502|5003|1002|5002)(FAE|AAE|AZE|AAL)X-.*", // could be
|
||||
// WD2002FAEX, WD7502AAEX, WD1502FAEX, WD5003AZEX, WD1002FAEX, WD5002AALX
|
||||
"", "", ""
|
||||
},
|
||||
{ "Western Digital Black", // tested with
|
||||
// WDC WD5003AZEX-00RKKA0/80.00A80, WDC WD1003FZEX-00MK2A0/01.01A01,
|
||||
// WDC WD3001FAEX-00MJRA0/01.01L01, WDC WD4001FAEX-00MJRA0/01.01L01
|
||||
"WDC WD(5002AAL|5003AZE|(64|75)02AAE|((10|15|20)0[23]|[34]001)F[AZ]E)X-.*",
|
||||
// WDC WD4003FZEX-00Z4SA0/01.01A01
|
||||
"WDC WD(6001|2003|5001|1003|4003|5003|3003|3001)(FZW|FZE|AZE)X-.*|" // could be
|
||||
// new series WD6001FZWX WD2003FZEX WD5001FZWX WD1003FZEX
|
||||
// WD4003FZEX WD5003AZEX WD3003FZEX
|
||||
"WDC WD(4001|3001|2002|1002|5003|7500|5000|3200|2500|1600)(FAE|AZE|B[PE]K)[XT]-.*",
|
||||
// old series: WD4001FAEX WD3001FAEX WD2002FAEX WD1002FAEX WD5003AZEX
|
||||
// WD7500BPKT WD5000BPKT WD3200BEKT WD2500BEKT WD1600BEKT
|
||||
"", "", ""
|
||||
},
|
||||
{ "Western Digital AV ATA", // tested with WDC WD3200AVJB-63J5A0/01.03E01
|
||||
@ -3313,8 +3479,7 @@ const drive_settings builtin_knowndrives[] = {
|
||||
"",
|
||||
"-d sat"
|
||||
},
|
||||
// Fujitsu chip on DeLock 42475
|
||||
{ "USB: Fujitsu SATA-to-USB3.0 bridge chip", // USB 3.0
|
||||
{ "USB: ; Fujitsu", // DeLock 42475, USB 3.0
|
||||
"0x04c5:0x201d",
|
||||
"", // 0x0001
|
||||
"",
|
||||
@ -3523,6 +3688,12 @@ const drive_settings builtin_knowndrives[] = {
|
||||
"",
|
||||
"-d sat"
|
||||
},
|
||||
{ "USB: LaCie; ",
|
||||
"0x059f:0x106f",
|
||||
"", // 0x0001
|
||||
"",
|
||||
"-d sat"
|
||||
},
|
||||
// In-System Design
|
||||
{ "USB: ; In-System/Cypress ISD-300A1",
|
||||
"0x05ab:0x0060",
|
||||
@ -3549,6 +3720,12 @@ const drive_settings builtin_knowndrives[] = {
|
||||
"",
|
||||
"-d sat"
|
||||
},
|
||||
{ "USB: ; Genesys Logic",
|
||||
"0x05e3:0x0735",
|
||||
"", // 0x1003
|
||||
"",
|
||||
"-d sat"
|
||||
},
|
||||
// Micron
|
||||
{ "USB: Micron USB SSD; ",
|
||||
"0x0634:0x0655",
|
||||
@ -3590,6 +3767,12 @@ const drive_settings builtin_knowndrives[] = {
|
||||
"-d sat"
|
||||
},
|
||||
// Freecom
|
||||
{ "USB: ; Innostor IS631", // No Name USB3->SATA Enclosure
|
||||
"0x07ab:0x0621",
|
||||
"",
|
||||
"",
|
||||
"-d sat"
|
||||
},
|
||||
{ "USB: Freecom Mobile Drive XXS; JMicron",
|
||||
"0x07ab:0xfc88",
|
||||
"", // 0x0101
|
||||
@ -3698,8 +3881,8 @@ const drive_settings builtin_knowndrives[] = {
|
||||
"-d sat"
|
||||
},
|
||||
{ "USB: Seagate Expansion Portable; ",
|
||||
"0x0bc2:0x23(00|12|20|21)",
|
||||
"", // 0x0219 (0x2312)
|
||||
"0x0bc2:0x23(00|12|20|21|22)",
|
||||
"", // 12=0x0219, 22=0x0000
|
||||
"",
|
||||
"-d sat"
|
||||
},
|
||||
@ -3799,6 +3982,13 @@ const drive_settings builtin_knowndrives[] = {
|
||||
"",
|
||||
"-d sat"
|
||||
},
|
||||
// Addonics
|
||||
{ "USB: Addonics HDMU3; ", // (ticket #609)
|
||||
"0x0bf6:0x1001",
|
||||
"", // 0x0100
|
||||
"",
|
||||
""
|
||||
},
|
||||
// Dura Micro
|
||||
{ "USB: Dura Micro; Cypress",
|
||||
"0x0c0b:0xb001",
|
||||
@ -3855,6 +4045,13 @@ const drive_settings builtin_knowndrives[] = {
|
||||
"",
|
||||
"-d sat"
|
||||
},
|
||||
// Jess-Link International
|
||||
{ "USB: ; Cypress", // Medion HDDrive2Go
|
||||
"0x0dbf:0x9001",
|
||||
"", // 0x0240
|
||||
"",
|
||||
"-d usbcypress"
|
||||
},
|
||||
// Oyen Digital
|
||||
{ "USB: Oyen Digital MiniPro USB 3.0; ",
|
||||
"0x0dc4:0x020a",
|
||||
@ -3884,7 +4081,7 @@ const drive_settings builtin_knowndrives[] = {
|
||||
"-d usbcypress"
|
||||
},
|
||||
{ "USB: WD My Passport; ",
|
||||
"0x1058:0x0(70[245a]|730|74[0128a]|7a8|8[123]0)",
|
||||
"0x1058:0x0(70[245a]|71a|730|74[0128a]|7a8|8(10|16|20|30))",
|
||||
"",
|
||||
"",
|
||||
"-d sat"
|
||||
@ -3971,8 +4168,8 @@ const drive_settings builtin_knowndrives[] = {
|
||||
"-d sat"
|
||||
},
|
||||
{ "USB: ; Initio",
|
||||
"0x13fd:0x1640",
|
||||
"", // 0x0864
|
||||
"0x13fd:0x16[45]0",
|
||||
"", // 0x1640: 0x0864, 0x1650: 0x0436
|
||||
"",
|
||||
"-d sat,12" // some SMART commands fail, see ticket #295
|
||||
},
|
||||
@ -3989,9 +4186,9 @@ const drive_settings builtin_knowndrives[] = {
|
||||
"-d sat"
|
||||
},
|
||||
{ "USB: ; Initio",
|
||||
"0x13fd:0x39[14]0", // 0x3910: Seagate Expansion Portable SRD00F1 (0x0100)
|
||||
"0x13fd:0x39[124]0", // 0x3910: Seagate Expansion Portable SRD00F1 (0x0100)
|
||||
"", // 0x3920: ezDISK EZ370 (0x0205)
|
||||
"", // 0x3940: MS-TECH LU-275S (0x0306)
|
||||
"",
|
||||
"-d sat"
|
||||
},
|
||||
// Super Top
|
||||
@ -4004,23 +4201,29 @@ const drive_settings builtin_knowndrives[] = {
|
||||
// JMicron
|
||||
{ "USB: ; JMicron JMS539", // USB2/3->SATA (old firmware)
|
||||
"0x152d:0x0539",
|
||||
"0x0100", // 1.00
|
||||
"",
|
||||
"-d usbjmicron"
|
||||
"0x0100", // 1.00, various devices support -d usbjmicron
|
||||
"", // 1.00, SSI SI-1359RUS3 supports -d sat,
|
||||
"" // -d usbjmicron may disconnect drive (ticket #552)
|
||||
},
|
||||
{ "USB: ; JMicron JMS539", // USB2/3->SATA (new firmware)
|
||||
"0x152d:0x0539",
|
||||
"0x020[56]|" // 2.05, ticket #338
|
||||
"0x020[56]|" // 2.05, ZTC USB 3.0 enclosure (ticket #338)
|
||||
"0x28(03|12)", // 28.03, Mediasonic ProBox HF2-SU3S2 Rev 2 (port multiplier, ticket #504)
|
||||
"", // 28.12, Mediasonic ProBox H82-SU3S2 (port multiplier)
|
||||
"-d sat"
|
||||
},
|
||||
{ "USB: ; JMicron ", // USB->SATA->4xSATA (port multiplier)
|
||||
"0x152d:0x0551",
|
||||
"0x152d:0x0551", // JMS539? (old firmware may use 0x152d:0x0539, ticket #552)
|
||||
"", // 0x0100
|
||||
"",
|
||||
"-d usbjmicron,x"
|
||||
},
|
||||
{ "USB: ; JMicron", // USB2/3->2xSATA
|
||||
"0x152d:0x0565",
|
||||
"", // 0x9114, Akasa DuoDock X (ticket #607)
|
||||
"",
|
||||
"-d sat"
|
||||
},
|
||||
{ "USB: ; JMicron JMS567", // USB2/3->SATA
|
||||
"0x152d:0x0567",
|
||||
"", // 0x0114
|
||||
@ -4247,6 +4450,12 @@ const drive_settings builtin_knowndrives[] = {
|
||||
"",
|
||||
"-d sat" // ATA output registers missing
|
||||
},
|
||||
{ "USB: ; VIA VL711", // USB2/3->SATA
|
||||
"0x2109:0x0711",
|
||||
"", // 0x0114, Mediasonic ProBox K32-SU3 (ticket #594)
|
||||
"",
|
||||
"" // unsupported
|
||||
},
|
||||
// 0x2537 (?)
|
||||
{ "USB: ; ", // USB 3.0
|
||||
"0x2537:0x106[68]", // 0x1066: Orico 2599US3, 0x1068: Fantec ER-35U3
|
||||
@ -4275,7 +4484,13 @@ const drive_settings builtin_knowndrives[] = {
|
||||
"-d sat" // ATA output registers missing
|
||||
},
|
||||
{ "USB: Hitachi Touro Mobile; ", // 1TB
|
||||
"0x4971:0x1020",
|
||||
"0x4971:0x102[04]",
|
||||
"", // 0x0100
|
||||
"",
|
||||
"-d sat"
|
||||
},
|
||||
{ "USB: SimpleTech;", // USB 3.0 HDD BOX Agestar, Rock External HDD 3,5" UASP
|
||||
"0x4971:0x8017",
|
||||
"",
|
||||
"",
|
||||
"-d sat"
|
||||
@ -4300,6 +4515,13 @@ const drive_settings builtin_knowndrives[] = {
|
||||
"",
|
||||
"-d sat"
|
||||
},
|
||||
// 0xabcd (?)
|
||||
{ "USB: ; ",
|
||||
"0xabcd:0x6103", // LogiLink AU0028A V1.0 USB 3.0 to IDE & SATA Adapter
|
||||
"",
|
||||
"",
|
||||
"-d sat"
|
||||
},
|
||||
/*
|
||||
}; // builtin_knowndrives[]
|
||||
*/
|
||||
|
@ -1,6 +1,6 @@
|
||||
# Home page: http://smartmontools.sourceforge.net
|
||||
# Home page: http://www.smartmontools.org
|
||||
#
|
||||
# $Id: README 3958 2014-07-18 19:13:32Z chrfranke $
|
||||
# $Id: README 4120 2015-08-27 16:12:21Z samm2 $
|
||||
#
|
||||
# Copyright (C) 2003-8 Bruce Allen <smartmontools-support@lists.sourceforge.net>
|
||||
# Copyright (C) 2009-14 Christian Franke <smartmontools-support@lists.sourceforge.net>
|
||||
|
4
int64.h
4
int64.h
@ -1,7 +1,7 @@
|
||||
/*
|
||||
* int64.h
|
||||
*
|
||||
* Home page of code is: http://smartmontools.sourceforge.net
|
||||
* Home page of code is: http://www.smartmontools.org
|
||||
*
|
||||
* Copyright (C) 2002-11 Bruce Allen <smartmontools-support@lists.sourceforge.net>
|
||||
* Copyright (C) 2004-11 Christian Franke
|
||||
@ -20,7 +20,7 @@
|
||||
#ifndef INT64_H_
|
||||
#define INT64_H_
|
||||
|
||||
#define INT64_H_CVSID "$Id: int64.h 3727 2012-12-13 17:23:06Z samm2 $"
|
||||
#define INT64_H_CVSID "$Id: int64.h 4120 2015-08-27 16:12:21Z samm2 $"
|
||||
|
||||
// 64 bit integer typedefs and format strings
|
||||
|
||||
|
163
knowndrives.cpp
163
knowndrives.cpp
@ -1,11 +1,10 @@
|
||||
/*
|
||||
* knowndrives.cpp
|
||||
*
|
||||
* Home page of code is: http://smartmontools.sourceforge.net
|
||||
* Address of support mailing list: smartmontools-support@lists.sourceforge.net
|
||||
* Home page of code is: http://www.smartmontools.org
|
||||
*
|
||||
* Copyright (C) 2003-11 Philip Williams, Bruce Allen
|
||||
* Copyright (C) 2008-12 Christian Franke <smartmontools-support@lists.sourceforge.net>
|
||||
* Copyright (C) 2008-16 Christian Franke
|
||||
*
|
||||
* 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
|
||||
@ -33,7 +32,7 @@
|
||||
|
||||
#include <stdexcept>
|
||||
|
||||
const char * knowndrives_cpp_cvsid = "$Id: knowndrives.cpp 3719 2012-12-03 21:19:33Z chrfranke $"
|
||||
const char * knowndrives_cpp_cvsid = "$Id: knowndrives.cpp 4208 2016-01-22 19:45:35Z chrfranke $"
|
||||
KNOWNDRIVES_H_CVSID;
|
||||
|
||||
#define MODEL_STRING_LENGTH 40
|
||||
@ -51,6 +50,8 @@ const drive_settings builtin_knowndrives[] = {
|
||||
#include "drivedb.h"
|
||||
};
|
||||
|
||||
const unsigned builtin_knowndrives_size =
|
||||
sizeof(builtin_knowndrives) / sizeof(builtin_knowndrives[0]);
|
||||
|
||||
/// Drive database class. Stores custom entries read from file.
|
||||
/// Provides transparent access to concatenation of custom and
|
||||
@ -140,16 +141,26 @@ const char * drive_database::copy_string(const char * src)
|
||||
static drive_database knowndrives;
|
||||
|
||||
|
||||
// Return true if modelfamily string describes entry for USB ID
|
||||
static bool is_usb_modelfamily(const char * modelfamily)
|
||||
enum dbentry_type {
|
||||
DBENTRY_ATA_DEFAULT,
|
||||
DBENTRY_ATA,
|
||||
DBENTRY_USB
|
||||
};
|
||||
|
||||
// Return type of entry
|
||||
static dbentry_type get_modelfamily_type(const char * modelfamily)
|
||||
{
|
||||
return !strncmp(modelfamily, "USB:", 4);
|
||||
if (modelfamily[0] == 'D' && !strcmp(modelfamily, "DEFAULT"))
|
||||
return DBENTRY_ATA_DEFAULT;
|
||||
else if(modelfamily[0] == 'U' && str_starts_with(modelfamily, "USB:"))
|
||||
return DBENTRY_USB;
|
||||
else
|
||||
return DBENTRY_ATA;
|
||||
}
|
||||
|
||||
// Return true if entry for USB ID
|
||||
static inline bool is_usb_entry(const drive_settings * dbentry)
|
||||
static inline dbentry_type get_dbentry_type(const drive_settings * dbentry)
|
||||
{
|
||||
return is_usb_modelfamily(dbentry->modelfamily);
|
||||
return get_modelfamily_type(dbentry->modelfamily);
|
||||
}
|
||||
|
||||
// Compile regular expression, print message on failure.
|
||||
@ -185,8 +196,8 @@ static const drive_settings * lookup_drive(const char * model, const char * firm
|
||||
firmware = "";
|
||||
|
||||
for (unsigned i = 0; i < knowndrives.size(); i++) {
|
||||
// Skip USB entries
|
||||
if (is_usb_entry(&knowndrives[i]))
|
||||
// Skip DEFAULT and USB entries
|
||||
if (get_dbentry_type(&knowndrives[i]) != DBENTRY_ATA)
|
||||
continue;
|
||||
|
||||
// Check whether model matches the regular expression in knowndrives[i].
|
||||
@ -219,8 +230,8 @@ static bool parse_db_presets(const char * presets, ata_vendor_attr_defs * defs,
|
||||
if (!(sscanf(presets+i, "-%c %80[^ ]%n", &opt, arg, &len) >= 2 && len > 0))
|
||||
return false;
|
||||
if (opt == 'v' && defs) {
|
||||
// Parse "-v N,format[,name]"
|
||||
if (!parse_attribute_def(arg, *defs, PRIOR_DATABASE))
|
||||
// Parse "-v N,format[,name[,HDD|SSD]]"
|
||||
if (!parse_attribute_def(arg, *defs, (firmwarebugs ? PRIOR_DATABASE : PRIOR_DEFAULT)))
|
||||
return false;
|
||||
}
|
||||
else if (opt == 'F' && firmwarebugs) {
|
||||
@ -243,6 +254,13 @@ static bool parse_db_presets(const char * presets, ata_vendor_attr_defs * defs,
|
||||
return true;
|
||||
}
|
||||
|
||||
// Parse '-v' options in default preset string, return false on error.
|
||||
static inline bool parse_default_presets(const char * presets,
|
||||
ata_vendor_attr_defs & defs)
|
||||
{
|
||||
return parse_db_presets(presets, &defs, 0, 0);
|
||||
}
|
||||
|
||||
// Parse '-v' and '-F' options in preset string, return false on error.
|
||||
static inline bool parse_presets(const char * presets,
|
||||
ata_vendor_attr_defs & defs,
|
||||
@ -287,7 +305,7 @@ int lookup_usb_device(int vendor_id, int product_id, int bcd_device,
|
||||
const drive_settings & dbentry = knowndrives[i];
|
||||
|
||||
// Skip drive entries
|
||||
if (!is_usb_entry(&dbentry))
|
||||
if (get_dbentry_type(&dbentry) != DBENTRY_USB)
|
||||
continue;
|
||||
|
||||
// Check whether USB vendor:product ID matches
|
||||
@ -341,7 +359,8 @@ static int showonepreset(const drive_settings * dbentry)
|
||||
return 1;
|
||||
}
|
||||
|
||||
bool usb = is_usb_entry(dbentry);
|
||||
dbentry_type type = get_dbentry_type(dbentry);
|
||||
bool usb = (type == DBENTRY_USB);
|
||||
|
||||
// print and check model and firmware regular expressions
|
||||
int errcnt = 0;
|
||||
@ -364,12 +383,21 @@ static int showonepreset(const drive_settings * dbentry)
|
||||
bool first_preset = true;
|
||||
if (*dbentry->presets) {
|
||||
ata_vendor_attr_defs defs;
|
||||
if (!parse_presets(dbentry->presets, defs, firmwarebugs)) {
|
||||
pout("Syntax error in preset option string \"%s\"\n", dbentry->presets);
|
||||
errcnt++;
|
||||
if (type == DBENTRY_ATA_DEFAULT) {
|
||||
if (!parse_default_presets(dbentry->presets, defs)) {
|
||||
pout("Syntax error in DEFAULT option string \"%s\"\n", dbentry->presets);
|
||||
errcnt++;
|
||||
}
|
||||
}
|
||||
else {
|
||||
if (!parse_presets(dbentry->presets, defs, firmwarebugs)) {
|
||||
pout("Syntax error in preset option string \"%s\"\n", dbentry->presets);
|
||||
errcnt++;
|
||||
}
|
||||
}
|
||||
|
||||
for (int i = 0; i < MAX_ATTRIBUTE_NUM; i++) {
|
||||
if (defs[i].priority != PRIOR_DEFAULT) {
|
||||
if (defs[i].priority != PRIOR_DEFAULT || !defs[i].name.empty()) {
|
||||
std::string name = ata_get_smart_attr_name(i, defs);
|
||||
// Use leading zeros instead of spaces so that everything lines up.
|
||||
pout("%-*s %03d %s\n", TABLEPRINTWIDTH, first_preset ? "ATTRIBUTE OPTIONS:" : "",
|
||||
@ -563,7 +591,7 @@ class stdin_iterator
|
||||
{
|
||||
public:
|
||||
explicit stdin_iterator(FILE * f)
|
||||
: m_f(f) { get(); get(); }
|
||||
: m_f(f), m_next(0) { get(); get(); }
|
||||
|
||||
stdin_iterator & operator++()
|
||||
{ get(); return *this; }
|
||||
@ -767,19 +795,29 @@ static bool parse_drive_database(parse_ptr src, drive_database & db, const char
|
||||
break;
|
||||
case 4:
|
||||
if (!token.value.empty()) {
|
||||
if (!is_usb_modelfamily(values[0].c_str())) {
|
||||
ata_vendor_attr_defs defs; firmwarebug_defs fix;
|
||||
if (!parse_presets(token.value.c_str(), defs, fix)) {
|
||||
pout("%s(%d): Syntax error in preset option string\n", path, token.line);
|
||||
ok = false;
|
||||
}
|
||||
}
|
||||
else {
|
||||
std::string type;
|
||||
if (!parse_usb_type(token.value.c_str(), type)) {
|
||||
pout("%s(%d): Syntax error in USB type string\n", path, token.line);
|
||||
ok = false;
|
||||
}
|
||||
// Syntax check
|
||||
switch (get_modelfamily_type(values[0].c_str())) {
|
||||
case DBENTRY_ATA_DEFAULT: {
|
||||
ata_vendor_attr_defs defs;
|
||||
if (!parse_default_presets(token.value.c_str(), defs)) {
|
||||
pout("%s(%d): Syntax error in DEFAULT option string\n", path, token.line);
|
||||
ok = false;
|
||||
}
|
||||
} break;
|
||||
default: { // DBENTRY_ATA
|
||||
ata_vendor_attr_defs defs; firmwarebug_defs fix;
|
||||
if (!parse_presets(token.value.c_str(), defs, fix)) {
|
||||
pout("%s(%d): Syntax error in preset option string\n", path, token.line);
|
||||
ok = false;
|
||||
}
|
||||
} break;
|
||||
case DBENTRY_USB: {
|
||||
std::string type;
|
||||
if (!parse_usb_type(token.value.c_str(), type)) {
|
||||
pout("%s(%d): Syntax error in USB type string\n", path, token.line);
|
||||
ok = false;
|
||||
}
|
||||
} break;
|
||||
}
|
||||
}
|
||||
break;
|
||||
@ -857,7 +895,7 @@ const char * get_drivedb_path_default()
|
||||
#endif
|
||||
|
||||
// Read drive databases from standard places.
|
||||
bool read_default_drive_databases()
|
||||
static bool read_default_drive_databases()
|
||||
{
|
||||
// Read file for local additions: /{,usr/local/}etc/smart_drivedb.h
|
||||
const char * db1 = get_drivedb_path_add();
|
||||
@ -877,9 +915,60 @@ bool read_default_drive_databases()
|
||||
#endif
|
||||
{
|
||||
// Append builtin table.
|
||||
knowndrives.append(builtin_knowndrives,
|
||||
sizeof(builtin_knowndrives)/sizeof(builtin_knowndrives[0]));
|
||||
knowndrives.append(builtin_knowndrives, builtin_knowndrives_size);
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
static ata_vendor_attr_defs default_attr_defs;
|
||||
|
||||
// Initialize default_attr_defs.
|
||||
static bool init_default_attr_defs()
|
||||
{
|
||||
// Lookup default entry
|
||||
const drive_settings * entry = 0;
|
||||
for (unsigned i = 0; i < knowndrives.size(); i++) {
|
||||
if (get_dbentry_type(&knowndrives[i]) != DBENTRY_ATA_DEFAULT)
|
||||
continue;
|
||||
entry = &knowndrives[i];
|
||||
break;
|
||||
}
|
||||
|
||||
if (!entry) {
|
||||
// Fall back to builtin database
|
||||
for (unsigned i = 0; i < builtin_knowndrives_size; i++) {
|
||||
if (get_dbentry_type(&builtin_knowndrives[i]) != DBENTRY_ATA_DEFAULT)
|
||||
continue;
|
||||
entry = &builtin_knowndrives[i];
|
||||
break;
|
||||
}
|
||||
|
||||
if (!entry)
|
||||
throw std::logic_error("DEFAULT entry missing in builtin drive database");
|
||||
|
||||
pout("Warning: DEFAULT entry missing in drive database file(s)\n");
|
||||
}
|
||||
|
||||
if (!parse_default_presets(entry->presets, default_attr_defs)) {
|
||||
pout("Syntax error in DEFAULT drive database entry\n");
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
// Init default db entry and optionally read drive databases from standard places.
|
||||
bool init_drive_database(bool use_default_db)
|
||||
{
|
||||
if (use_default_db && !read_default_drive_databases())
|
||||
return false;
|
||||
|
||||
return init_default_attr_defs();
|
||||
}
|
||||
|
||||
// Get vendor attribute options from default db entry.
|
||||
const ata_vendor_attr_defs & get_default_attr_defs()
|
||||
{
|
||||
return default_attr_defs;
|
||||
}
|
||||
|
@ -1,11 +1,10 @@
|
||||
/*
|
||||
* knowndrives.h
|
||||
*
|
||||
* Home page of code is: http://smartmontools.sourceforge.net
|
||||
* Address of support mailing list: smartmontools-support@lists.sourceforge.net
|
||||
* Home page of code is: http://www.smartmontools.org
|
||||
*
|
||||
* Copyright (C) 2003-11 Philip Williams, Bruce Allen
|
||||
* Copyright (C) 2008-12 Christian Franke <smartmontools-support@lists.sourceforge.net>
|
||||
* Copyright (C) 2008-15 Christian Franke
|
||||
*
|
||||
* 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
|
||||
@ -20,7 +19,7 @@
|
||||
#ifndef KNOWNDRIVES_H_
|
||||
#define KNOWNDRIVES_H_
|
||||
|
||||
#define KNOWNDRIVES_H_CVSID "$Id: knowndrives.h 3597 2012-09-04 21:10:37Z chrfranke $\n"
|
||||
#define KNOWNDRIVES_H_CVSID "$Id: knowndrives.h 4162 2015-10-31 16:36:16Z chrfranke $\n"
|
||||
|
||||
// Structure to store drive database entries, see drivedb.h for a description.
|
||||
struct drive_settings {
|
||||
@ -73,7 +72,10 @@ const char * get_drivedb_path_default();
|
||||
// Read drive database from file.
|
||||
bool read_drive_database(const char * path);
|
||||
|
||||
// Read drive databases from standard places.
|
||||
bool read_default_drive_databases();
|
||||
// Init default db entry and optionally read drive databases from standard places.
|
||||
bool init_drive_database(bool use_default_db);
|
||||
|
||||
// Get vendor attribute options from default db entry.
|
||||
const ata_vendor_attr_defs & get_default_attr_defs();
|
||||
|
||||
#endif
|
||||
|
@ -1,7 +1,7 @@
|
||||
/*
|
||||
* os_darwin.cpp
|
||||
*
|
||||
* Home page of code is: http://smartmontools.sourceforge.net
|
||||
* Home page of code is: http://www.smartmontools.org
|
||||
*
|
||||
* Copyright (C) 2004-8 Geoffrey Keating <geoffk@geoffk.org>
|
||||
* Copyright (C) 2014 Alex Samorukov <samm@os2.kiev.ua>
|
||||
@ -22,6 +22,7 @@
|
||||
#include <mach/mach.h>
|
||||
#include <mach/mach_error.h>
|
||||
#include <mach/mach_init.h>
|
||||
#include <sys/utsname.h>
|
||||
#include <IOKit/IOCFPlugIn.h>
|
||||
#include <IOKit/IOKitLib.h>
|
||||
#include <IOKit/IOReturn.h>
|
||||
@ -45,7 +46,7 @@
|
||||
#include "dev_interface.h"
|
||||
|
||||
// Needed by '-V' option (CVS versioning) of smartd/smartctl
|
||||
const char *os_darwin_cpp_cvsid="$Id: os_darwin.cpp 3982 2014-08-16 21:07:19Z samm2 $" \
|
||||
const char *os_darwin_cpp_cvsid="$Id: os_darwin.cpp 4214 2016-01-24 22:53:37Z samm2 $" \
|
||||
ATACMDS_H_CVSID CONFIG_H_CVSID INT64_H_CVSID OS_DARWIN_H_CVSID SCSICMDS_H_CVSID UTILITY_H_CVSID;
|
||||
|
||||
// examples for smartctl
|
||||
@ -77,7 +78,7 @@ static struct {
|
||||
IOATASMARTInterface **smartIf;
|
||||
} devices[20];
|
||||
|
||||
const char * dev_darwin_cpp_cvsid = "$Id: os_darwin.cpp 3982 2014-08-16 21:07:19Z samm2 $"
|
||||
const char * dev_darwin_cpp_cvsid = "$Id: os_darwin.cpp 4214 2016-01-24 22:53:37Z samm2 $"
|
||||
DEV_INTERFACE_H_CVSID;
|
||||
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
@ -181,8 +182,8 @@ bool darwin_smart_device::open()
|
||||
|
||||
if (strcmp (type, "ATA") != 0)
|
||||
{
|
||||
errno = EINVAL;
|
||||
return -1;
|
||||
set_err (EINVAL);
|
||||
return false;
|
||||
}
|
||||
|
||||
// Find a free device number.
|
||||
@ -191,8 +192,8 @@ bool darwin_smart_device::open()
|
||||
break;
|
||||
if (devnum == sizeof (devices) / sizeof (devices[0]))
|
||||
{
|
||||
errno = EMFILE;
|
||||
return -1;
|
||||
set_err (EMFILE);
|
||||
return false;
|
||||
}
|
||||
|
||||
devname = NULL;
|
||||
@ -218,8 +219,8 @@ bool darwin_smart_device::open()
|
||||
|
||||
if (! disk)
|
||||
{
|
||||
errno = ENOENT;
|
||||
return -1;
|
||||
set_err(ENOENT);
|
||||
return false;
|
||||
}
|
||||
|
||||
// Find a SMART-capable driver which is a parent of this device.
|
||||
@ -232,9 +233,9 @@ bool darwin_smart_device::open()
|
||||
err = IORegistryEntryGetParentEntry (disk, kIOServicePlane, &disk);
|
||||
if (err != kIOReturnSuccess || ! disk)
|
||||
{
|
||||
errno = ENODEV;
|
||||
set_err(ENODEV);
|
||||
IOObjectRelease (prevdisk);
|
||||
return -1;
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
@ -257,8 +258,8 @@ bool darwin_smart_device::open()
|
||||
CFUUIDGetUUIDBytes ( kIOATASMARTInterfaceID),
|
||||
(void **)&devices[devnum].smartIf);
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
m_fd = devnum;
|
||||
if (m_fd < 0) {
|
||||
set_err((errno==ENOENT || errno==ENOTDIR) ? ENODEV : errno);
|
||||
@ -311,9 +312,9 @@ static int make_device_names (char*** devlist, const char* name) {
|
||||
|
||||
// Create an array of service names.
|
||||
IOIteratorReset (i);
|
||||
*devlist = (char**)calloc (result, sizeof (char *));
|
||||
if (! *devlist)
|
||||
if (! result)
|
||||
goto error;
|
||||
*devlist = (char**)calloc (result, sizeof (char *));
|
||||
index = 0;
|
||||
while ((device = IOIteratorNext (i)) != MACH_PORT_NULL) {
|
||||
if (is_smart_capable (device))
|
||||
@ -342,6 +343,9 @@ static int make_device_names (char*** devlist, const char* name) {
|
||||
free ((*devlist)[index]);
|
||||
free (*devlist);
|
||||
}
|
||||
if(!result) // no devs found
|
||||
return 0;
|
||||
|
||||
return -1;
|
||||
}
|
||||
|
||||
@ -454,7 +458,7 @@ bool darwin_ata_device::ata_pass_through(const ata_cmd_in & in, ata_cmd_out & ou
|
||||
if (select != SHORT_SELF_TEST && select != EXTEND_SELF_TEST)
|
||||
{
|
||||
errno = EINVAL;
|
||||
err = -1;
|
||||
return set_err(ENOSYS, "Unsupported SMART self-test mode");
|
||||
}
|
||||
err = smartIf->SMARTExecuteOffLineImmediate (ifp,
|
||||
select == EXTEND_SELF_TEST);
|
||||
@ -488,6 +492,8 @@ class darwin_smart_interface
|
||||
: public /*implements*/ smart_interface
|
||||
{
|
||||
public:
|
||||
virtual std::string get_os_version_str();
|
||||
|
||||
virtual std::string get_app_examples(const char * appname);
|
||||
|
||||
virtual bool scan_smart_devices(smart_device_list & devlist, const char * type,
|
||||
@ -505,6 +511,15 @@ protected:
|
||||
|
||||
//////////////////////////////////////////////////////////////////////
|
||||
|
||||
std::string darwin_smart_interface::get_os_version_str()
|
||||
{
|
||||
// now we are just getting darwin runtime version, to get OSX version more things needs to be done, see
|
||||
// http://stackoverflow.com/questions/11072804/how-do-i-determine-the-os-version-at-runtime-in-os-x-or-ios-without-using-gesta
|
||||
struct utsname osname;
|
||||
uname(&osname);
|
||||
return strprintf("%s %s %s", osname.sysname, osname.release, osname.machine);
|
||||
}
|
||||
|
||||
std::string darwin_smart_interface::get_app_examples(const char * appname)
|
||||
{
|
||||
if (!strcmp(appname, "smartctl"))
|
||||
|
@ -1,7 +1,7 @@
|
||||
/*
|
||||
* os_generic.h
|
||||
*
|
||||
* Home page of code is: http://smartmontools.sourceforge.net
|
||||
* Home page of code is: http://www.smartmontools.org
|
||||
*
|
||||
* Copyright (C) 2004-8 Geoff Keating <geoffk@geoffk.org>
|
||||
*
|
||||
@ -24,7 +24,7 @@
|
||||
#ifndef OS_DARWIN_H_
|
||||
#define OS_DARWIN_H_
|
||||
|
||||
#define OS_DARWIN_H_CVSID "$Id: os_darwin.h 3728 2012-12-13 17:57:50Z chrfranke $\n"
|
||||
#define OS_DARWIN_H_CVSID "$Id: os_darwin.h 4120 2015-08-27 16:12:21Z samm2 $\n"
|
||||
|
||||
// Isn't in 10.3.9?
|
||||
|
||||
|
@ -2,7 +2,7 @@
|
||||
|
||||
# Darwin init file for smartd
|
||||
#
|
||||
# Home page of code is: http://smartmontools.sourceforge.net
|
||||
# Home page of code is: http://www.smartmontools.org
|
||||
#
|
||||
# Copyright (C) 2004-8 Geoffrey Keating <geoffk@geoffk.org>
|
||||
#
|
||||
@ -15,7 +15,7 @@
|
||||
# example COPYING); if not, write to the Free Software Foundation, Inc.,
|
||||
# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
||||
|
||||
# $Id: SMART.in 3728 2012-12-13 17:57:50Z chrfranke $
|
||||
# $Id: SMART.in 4120 2015-08-27 16:12:21Z samm2 $
|
||||
|
||||
##
|
||||
# SMART monitoring
|
||||
|
21
os_darwin/pkg/Distribution.in
Normal file
21
os_darwin/pkg/Distribution.in
Normal file
@ -0,0 +1,21 @@
|
||||
<?xml version="1.0" encoding="utf-8" standalone="no"?>
|
||||
<installer-gui-script minSpecVersion="2">
|
||||
<allowed-os-versions>
|
||||
<os-version min="10.5"/>
|
||||
</allowed-os-versions>
|
||||
<license file="license.txt" mime-type="text/plain"/>
|
||||
<!-- <welcome file="welcome.rtf" mime-type="text/rtf"/> -->
|
||||
<title>S.M.A.R.T. disk monitoring tools</title>
|
||||
<pkg-ref id="com.smartmontools.pkg"/>
|
||||
<choices-outline>
|
||||
<line choice="default">
|
||||
<line choice="com.smartmontools.pkg"/>
|
||||
</line>
|
||||
</choices-outline>
|
||||
<choice id="default"/>
|
||||
<choice id="com.smartmontools.pkg" visible="false">
|
||||
<pkg-ref version="@version@" installKBytes="@size@" id="com.smartmontools.pkg">@pkgname@</pkg-ref>
|
||||
</choice>
|
||||
<domains enable_localSystem="true"/>
|
||||
<options customize="never" rootVolumeOnly="true"/>
|
||||
</installer-gui-script>
|
6
os_darwin/pkg/PackageInfo.in
Normal file
6
os_darwin/pkg/PackageInfo.in
Normal file
@ -0,0 +1,6 @@
|
||||
<pkg-info format-version="2" identifier="com.smartmontools.pkg" version="@version@" install-location="/" auth="root">
|
||||
<payload installKBytes="@size@" numberOfFiles="@files@"/>
|
||||
<!-- <scripts>
|
||||
<postinstall file="./postinstall"/>
|
||||
</scripts> -->
|
||||
</pkg-info>
|
24
os_darwin/pkg/installer/README.html
Normal file
24
os_darwin/pkg/installer/README.html
Normal file
@ -0,0 +1,24 @@
|
||||
<html>
|
||||
<body>
|
||||
<h2>About this package</h2>
|
||||
The smartmontools package contains two utility programs (smartctl and smartd) to control
|
||||
and monitor storage systems using the Self-Monitoring, Analysis and Reporting
|
||||
Technology System (SMART) built into most modern ATA and SCSI harddisks.
|
||||
In many cases, these utilities will provide advanced warning of disk degradation and failure.
|
||||
<h2>Installing</h2>
|
||||
To install package click on the smartmontools.pkg icon and follow installation process. Files will be installed to the <b>/usr/local/</b> directory.
|
||||
<h2>Usage</h2>
|
||||
If you are having trouble understanding the output of smartctl or smartd, please first read the manual pages installed on your system:
|
||||
<pre>
|
||||
man 8 smartctl
|
||||
man 8 smartd
|
||||
man 8 update-smart-drivedb
|
||||
man 5 smartd.conf
|
||||
</pre>
|
||||
To use smartmontools with USB drives please download and install
|
||||
<a href="https://github.com/kasbert/OS-X-SAT-SMART-Driver">Max OS X kernel driver for providing access to external drive SMART data</a>.
|
||||
More information could be found on the <a href="https://www.smartmontools.org">www.smartmontools.org</a> website.
|
||||
<h2>Uninstalling</h2>
|
||||
If you want to uninstall already installed package run <tt>'sudo smart-pkg-uninstall'</tt> in the terminal.
|
||||
</body>
|
||||
</html>
|
40
os_darwin/pkg/root/usr/local/sbin/smart-pkg-uninstall
Executable file
40
os_darwin/pkg/root/usr/local/sbin/smart-pkg-uninstall
Executable file
@ -0,0 +1,40 @@
|
||||
#!/bin/sh
|
||||
|
||||
echo "Smartmontools package uninstaller:"
|
||||
|
||||
# check if we are running with root uid
|
||||
if [[ $EUID -ne 0 ]]; then
|
||||
echo " Error: this script must be run as root"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# check if package is installed
|
||||
pkgutil --info com.smartmontools.pkg > /dev/null 2>/dev/null
|
||||
if [ $? -ne 0 ]; then
|
||||
echo " Error: smartmontools package is not installed"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# smartmontools pkg could be installed only on system volume, so this should be safe
|
||||
cd /
|
||||
|
||||
echo " - removing files"
|
||||
for str in `pkgutil --files com.smartmontools.pkg`
|
||||
do
|
||||
if [ -f "$str" ]
|
||||
then
|
||||
rm -f "$str"
|
||||
fi
|
||||
done
|
||||
echo " - removing empty directories"
|
||||
for str in `pkgutil --files com.smartmontools.pkg`
|
||||
do
|
||||
if [ -d "$str" ]
|
||||
then
|
||||
rmdir -p "$str" 2>/dev/null
|
||||
fi
|
||||
done
|
||||
|
||||
echo " - removing package system entry"
|
||||
pkgutil --forget com.smartmontools.pkg
|
||||
echo "Done, smartmontolls package removed"
|
@ -1,9 +1,9 @@
|
||||
/*
|
||||
* os_freebsd.c
|
||||
*
|
||||
* Home page of code is: http://smartmontools.sourceforge.net
|
||||
* Home page of code is: http://www.smartmontools.org
|
||||
*
|
||||
* Copyright (C) 2003-10 Eduard Martinescu <smartmontools-support@lists.sourceforge.net>
|
||||
* Copyright (C) 2003-10 Eduard Martinescu
|
||||
*
|
||||
* 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
|
||||
@ -38,6 +38,8 @@
|
||||
|
||||
#include "config.h"
|
||||
#include "int64.h"
|
||||
// set by /usr/include/sys/ata.h, suppress warning
|
||||
#undef ATA_READ_LOG_EXT
|
||||
#include "atacmds.h"
|
||||
#include "scsicmds.h"
|
||||
#include "cciss.h"
|
||||
@ -75,7 +77,7 @@
|
||||
#define PATHINQ_SETTINGS_SIZE 128
|
||||
#endif
|
||||
|
||||
const char *os_XXXX_c_cvsid="$Id: os_freebsd.cpp 3902 2014-05-23 19:14:15Z samm2 $" \
|
||||
const char *os_XXXX_c_cvsid="$Id: os_freebsd.cpp 4211 2016-01-24 07:56:06Z samm2 $" \
|
||||
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
|
||||
@ -86,19 +88,21 @@ ATACMDS_H_CVSID CCISS_H_CVSID CONFIG_H_CVSID INT64_H_CVSID OS_FREEBSD_H_CVSID SC
|
||||
|
||||
// Utility function for printing warnings
|
||||
void printwarning(int msgNo, const char* extra) {
|
||||
static int printed[] = {0,0,0,0};
|
||||
static const char* message[]={
|
||||
"The SMART RETURN STATUS return value (smartmontools -H option/Directive)\n can not be retrieved with this version of ATAng, please do not rely on this value\nYou should update to at least 5.2\n",
|
||||
|
||||
"Error SMART Status command failed\nPlease get assistance from \n" PACKAGE_HOMEPAGE "\nRegister values returned from SMART Status command are:\n",
|
||||
|
||||
"You must specify a DISK # for 3ware drives with -d 3ware,<n> where <n> begins with 1 for first disk drive\n",
|
||||
|
||||
"ATA support is not provided for this kernel version. Please ugrade to a recent 5-CURRENT kernel (post 09/01/2003 or so)\n"
|
||||
};
|
||||
|
||||
if (msgNo >= 0 && msgNo <= MAX_MSG) {
|
||||
static int printed[] = {0,0,0,0};
|
||||
if (!printed[msgNo]) {
|
||||
|
||||
static const char* message[]={
|
||||
"The SMART RETURN STATUS return value (smartmontools -H option/Directive)\n can not be retrieved with this version of ATAng, please do not rely on this value\nYou should update to at least 5.2\n",
|
||||
|
||||
"Error SMART Status command failed\nPlease get assistance from \n" PACKAGE_HOMEPAGE "\nRegister values returned from SMART Status command are:\n",
|
||||
|
||||
"You must specify a DISK # for 3ware drives with -d 3ware,<n> where <n> begins with 1 for first disk drive\n",
|
||||
|
||||
"ATA support is not provided for this kernel version. Please ugrade to a recent 5-CURRENT kernel (post 09/01/2003 or so)\n"
|
||||
};
|
||||
|
||||
printed[msgNo] = 1;
|
||||
pout("%s", message[msgNo]);
|
||||
if (extra)
|
||||
@ -917,7 +921,8 @@ bool freebsd_scsi_device::close(){
|
||||
freebsd_scsi_device::freebsd_scsi_device(smart_interface * intf,
|
||||
const char * dev_name, const char * req_type)
|
||||
: smart_device(intf, dev_name, "scsi", req_type),
|
||||
freebsd_smart_device()
|
||||
freebsd_smart_device(),
|
||||
m_camdev(0)
|
||||
{
|
||||
}
|
||||
|
||||
@ -1122,10 +1127,8 @@ freebsd_areca_ata_device::freebsd_areca_ata_device(smart_interface * intf, const
|
||||
|
||||
smart_device * freebsd_areca_ata_device::autodetect_open()
|
||||
{
|
||||
int is_ata = 1;
|
||||
|
||||
// autodetect device type
|
||||
is_ata = arcmsr_get_dev_type();
|
||||
int is_ata = arcmsr_get_dev_type();
|
||||
if(is_ata < 0)
|
||||
{
|
||||
set_err(EIO);
|
||||
@ -1476,11 +1479,12 @@ bool get_dev_names_cam(std::vector<std::string> & names, bool show_all)
|
||||
}
|
||||
|
||||
for (unsigned i = 0; i < ccb.cdm.num_matches; i++) {
|
||||
struct bus_match_result *bus_result;
|
||||
struct device_match_result *dev_result;
|
||||
struct periph_match_result *periph_result;
|
||||
|
||||
if (ccb.cdm.matches[i].type == DEV_MATCH_BUS) {
|
||||
struct bus_match_result *bus_result;
|
||||
|
||||
bus_result = &ccb.cdm.matches[i].result.bus_result;
|
||||
|
||||
if (strcmp(bus_result->dev_name,"xpt") == 0) /* skip XPT bus at all */
|
||||
@ -1592,9 +1596,11 @@ int get_dev_names_ata(char*** names) {
|
||||
n++;
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
if (n <= 0)
|
||||
goto end;
|
||||
mp = (char **)reallocf(mp,n*(sizeof (char*))); // shrink to correct size
|
||||
if (mp == NULL && n > 0 ) { // reallocf never fail for size=0, but may return NULL
|
||||
if (mp == NULL) {
|
||||
serrno=errno;
|
||||
pout("Out of memory constructing scan device list (on line %d)\n", __LINE__);
|
||||
n = -1;
|
||||
@ -1779,13 +1785,13 @@ static int usbdevlist(int busno,unsigned short & vendor_id,
|
||||
return false;
|
||||
#else // freebsd < 8.0 USB stack, ioctl interface
|
||||
|
||||
int i, f, a, rc;
|
||||
int i, a, rc;
|
||||
char buf[50];
|
||||
int ncont;
|
||||
|
||||
for (ncont = 0, i = 0; i < 10; i++) {
|
||||
snprintf(buf, sizeof(buf), "%s%d", USBDEV, i);
|
||||
f = open(buf, O_RDONLY);
|
||||
int f = open(buf, O_RDONLY);
|
||||
if (f >= 0) {
|
||||
memset(done, 0, sizeof done);
|
||||
for (a = 1; a < USB_MAX_DEVICES; a++) {
|
||||
@ -1813,12 +1819,11 @@ smart_device * freebsd_smart_interface::autodetect_smart_device(const char * nam
|
||||
struct cam_device *cam_dev;
|
||||
union ccb ccb;
|
||||
int bus=-1;
|
||||
int i,c;
|
||||
int len;
|
||||
int i;
|
||||
const char * test_name = name;
|
||||
|
||||
// if dev_name null, or string length zero
|
||||
if (!name || !(len = strlen(name)))
|
||||
if (!name || !*name)
|
||||
return 0;
|
||||
|
||||
// Dereference symlinks
|
||||
@ -1840,7 +1845,7 @@ smart_device * freebsd_smart_interface::autodetect_smart_device(const char * nam
|
||||
// check ATA/ATAPI devices
|
||||
for (i = 0; i < numata; i++) {
|
||||
if(!strcmp(atanames[i],test_name)) {
|
||||
for (c = i; c < numata; c++) free(atanames[c]);
|
||||
for (int c = i; c < numata; c++) free(atanames[c]);
|
||||
free(atanames);
|
||||
return new freebsd_ata_device(this, test_name, "");
|
||||
}
|
||||
@ -1917,13 +1922,15 @@ smart_device * freebsd_smart_interface::autodetect_smart_device(const char * nam
|
||||
|
||||
smart_device * freebsd_smart_interface::get_custom_smart_device(const char * name, const char * type)
|
||||
{
|
||||
// 3Ware ?
|
||||
static const char * fbsd_dev_twe_ctrl = "/dev/twe";
|
||||
static const char * fbsd_dev_twa_ctrl = "/dev/twa";
|
||||
static const char * fbsd_dev_tws_ctrl = "/dev/tws";
|
||||
int disknum = -1, n1 = -1, n2 = -1, contr = -1;
|
||||
int disknum = -1, n1 = -1, n2 = -1;
|
||||
|
||||
if (sscanf(type, "3ware,%n%d%n", &n1, &disknum, &n2) == 1 || n1 == 6) {
|
||||
// 3Ware ?
|
||||
static const char * fbsd_dev_twe_ctrl = "/dev/twe";
|
||||
static const char * fbsd_dev_twa_ctrl = "/dev/twa";
|
||||
static const char * fbsd_dev_tws_ctrl = "/dev/tws";
|
||||
int contr = -1;
|
||||
|
||||
if (n2 != (int)strlen(type)) {
|
||||
set_err(EINVAL, "Option -d 3ware,N requires N to be a non-negative integer");
|
||||
return 0;
|
||||
|
@ -1,7 +1,7 @@
|
||||
/*
|
||||
* os_freebsd.h
|
||||
*
|
||||
* Home page of code is: http://smartmontools.sourceforge.net
|
||||
* Home page of code is: http://www.smartmontools.org
|
||||
*
|
||||
* Copyright (C) 2003-8 Eduard Martinescu <smartmontools-support@lists.sourceforge.net>
|
||||
*
|
||||
@ -82,7 +82,7 @@
|
||||
#ifndef OS_FREEBSD_H_
|
||||
#define OS_FREEBSD_H_
|
||||
|
||||
#define OS_FREEBSD_H_CVSID "$Id: os_freebsd.h 3727 2012-12-13 17:23:06Z samm2 $"
|
||||
#define OS_FREEBSD_H_CVSID "$Id: os_freebsd.h 4120 2015-08-27 16:12:21Z samm2 $"
|
||||
|
||||
#define MAX_NUM_DEV 26
|
||||
|
||||
|
@ -1,7 +1,7 @@
|
||||
/*
|
||||
* os_generic.cpp
|
||||
*
|
||||
* Home page of code is: http://smartmontools.sourceforge.net
|
||||
* Home page of code is: http://www.smartmontools.org
|
||||
*
|
||||
* Copyright (C) YEAR YOUR_NAME <smartmontools-support@lists.sourceforge.net>
|
||||
* Copyright (C) 2003-8 Bruce Allen <smartmontools-support@lists.sourceforge.net>
|
||||
@ -83,7 +83,7 @@
|
||||
// should have one *_H_CVSID macro appearing below for each file
|
||||
// appearing with #include "*.h" above. Please list these (below) in
|
||||
// alphabetic/dictionary order.
|
||||
const char * os_XXXX_cpp_cvsid="$Id: os_generic.cpp 3579 2012-07-20 17:50:12Z chrfranke $"
|
||||
const char * os_XXXX_cpp_cvsid="$Id: os_generic.cpp 4120 2015-08-27 16:12:21Z samm2 $"
|
||||
ATACMDS_H_CVSID CONFIG_H_CVSID INT64_H_CVSID OS_GENERIC_H_CVSID UTILITY_H_CVSID;
|
||||
|
||||
// This is here to prevent compiler warnings for unused arguments of
|
||||
|
@ -1,7 +1,7 @@
|
||||
/*
|
||||
* os_generic.h
|
||||
*
|
||||
* Home page of code is: http://smartmontools.sourceforge.net
|
||||
* Home page of code is: http://www.smartmontools.org
|
||||
*
|
||||
* Copyright (C) YEAR YOUR_NAME <smartmontools-support@lists.sourceforge.net>
|
||||
* Copyright (C) 2003-8 Bruce Allen <smartmontools-support@lists.sourceforge.net>
|
||||
@ -25,7 +25,7 @@
|
||||
// In the three following lines, change 'GENERIC' to your OS name
|
||||
#ifndef OS_GENERIC_H_
|
||||
#define OS_GENERIC_H_
|
||||
#define OS_GENERIC_H_CVSID "$Id: os_generic.h 3728 2012-12-13 17:57:50Z chrfranke $\n"
|
||||
#define OS_GENERIC_H_CVSID "$Id: os_generic.h 4120 2015-08-27 16:12:21Z samm2 $\n"
|
||||
|
||||
// Additional material should start here. Note: to keep the '-V' CVS
|
||||
// reporting option working as intended, you should only #include
|
||||
|
47
os_linux.cpp
47
os_linux.cpp
@ -1,11 +1,11 @@
|
||||
/*
|
||||
* os_linux.cpp
|
||||
*
|
||||
* Home page of code is: http://smartmontools.sourceforge.net
|
||||
* Home page of code is: http://www.smartmontools.org
|
||||
*
|
||||
* Copyright (C) 2003-11 Bruce Allen <smartmontools-support@lists.sourceforge.net>
|
||||
* Copyright (C) 2003-11 Bruce Allen
|
||||
* Copyright (C) 2003-11 Doug Gilbert <dgilbert@interlog.com>
|
||||
* Copyright (C) 2008-15 Christian Franke <smartmontools-support@lists.sourceforge.net>
|
||||
* Copyright (C) 2008-15 Christian Franke
|
||||
*
|
||||
* Original AACRaid code:
|
||||
* Copyright (C) 2014 Raghava Aditya <raghava.aditya@pmcs.com>
|
||||
@ -99,7 +99,7 @@
|
||||
|
||||
#define ARGUSED(x) ((void)(x))
|
||||
|
||||
const char * os_linux_cpp_cvsid = "$Id: os_linux.cpp 4047 2015-03-22 16:16:24Z chrfranke $"
|
||||
const char * os_linux_cpp_cvsid = "$Id: os_linux.cpp 4157 2015-10-20 16:03:57Z chrfranke $"
|
||||
OS_LINUX_H_CVSID;
|
||||
extern unsigned char failuretest_permissive;
|
||||
|
||||
@ -356,7 +356,6 @@ int linux_ata_device::ata_command_interface(smart_command_set command, int selec
|
||||
unsigned char task[sizeof(ide_task_request_t)+512];
|
||||
ide_task_request_t *reqtask=(ide_task_request_t *) task;
|
||||
task_struct_t *taskfile=(task_struct_t *) reqtask->io_ports;
|
||||
int retval;
|
||||
|
||||
memset(task, 0, sizeof(task));
|
||||
|
||||
@ -377,7 +376,7 @@ int linux_ata_device::ata_command_interface(smart_command_set command, int selec
|
||||
// copy user data into the task request structure
|
||||
memcpy(task+sizeof(ide_task_request_t), data, 512);
|
||||
|
||||
if ((retval=ioctl(get_fd(), HDIO_DRIVE_TASKFILE, task))) {
|
||||
if (ioctl(get_fd(), HDIO_DRIVE_TASKFILE, task)) {
|
||||
if (errno==-EINVAL)
|
||||
pout("Kernel lacks HDIO_DRIVE_TASKFILE support; compile kernel with CONFIG_IDE_TASKFILE_IO set\n");
|
||||
return -1;
|
||||
@ -388,8 +387,6 @@ int linux_ata_device::ata_command_interface(smart_command_set command, int selec
|
||||
// There are two different types of ioctls(). The HDIO_DRIVE_TASK
|
||||
// one is this:
|
||||
if (command==STATUS_CHECK || command==AUTOSAVE || command==AUTO_OFFLINE){
|
||||
int retval;
|
||||
|
||||
// NOT DOCUMENTED in /usr/src/linux/include/linux/hdreg.h. You
|
||||
// have to read the IDE driver source code. Sigh.
|
||||
// buff[0]: ATA COMMAND CODE REGISTER
|
||||
@ -405,7 +402,7 @@ int linux_ata_device::ata_command_interface(smart_command_set command, int selec
|
||||
buff[4]=normal_lo;
|
||||
buff[5]=normal_hi;
|
||||
|
||||
if ((retval=ioctl(get_fd(), HDIO_DRIVE_TASK, buff))) {
|
||||
if (ioctl(get_fd(), HDIO_DRIVE_TASK, buff)) {
|
||||
if (errno==-EINVAL) {
|
||||
pout("Error SMART Status command via HDIO_DRIVE_TASK failed");
|
||||
pout("Rebuild older linux 2.2 kernels with HDIO_DRIVE_TASK support added\n");
|
||||
@ -1202,7 +1199,7 @@ bool linux_megaraid_device::open()
|
||||
int mjr;
|
||||
int report = scsi_debugmode;
|
||||
|
||||
if(sscanf(get_dev_name(),"/dev/bus/%d", &m_hba) == 0) {
|
||||
if (sscanf(get_dev_name(), "/dev/bus/%u", &m_hba) == 0) {
|
||||
if (!linux_smart_device::open())
|
||||
return false;
|
||||
/* Get device HBA */
|
||||
@ -1325,7 +1322,6 @@ bool linux_megaraid_device::megasas_cmd(int cdbLen, void *cdb,
|
||||
{
|
||||
struct megasas_pthru_frame *pthru;
|
||||
struct megasas_iocpacket uio;
|
||||
int rc;
|
||||
|
||||
memset(&uio, 0, sizeof(uio));
|
||||
pthru = &uio.frame.pthru;
|
||||
@ -1367,9 +1363,8 @@ bool linux_megaraid_device::megasas_cmd(int cdbLen, void *cdb,
|
||||
uio.sgl[0].iov_len = dataLen;
|
||||
}
|
||||
|
||||
rc = 0;
|
||||
errno = 0;
|
||||
rc = ioctl(m_fd, MEGASAS_IOC_FIRMWARE, &uio);
|
||||
int rc = ioctl(m_fd, MEGASAS_IOC_FIRMWARE, &uio);
|
||||
if (pthru->cmd_status || rc != 0) {
|
||||
if (pthru->cmd_status == 12) {
|
||||
return set_err(EIO, "megasas_cmd: Device %d does not exist\n", m_disknum);
|
||||
@ -1991,10 +1986,8 @@ linux_areca_ata_device::linux_areca_ata_device(smart_interface * intf, const cha
|
||||
|
||||
smart_device * linux_areca_ata_device::autodetect_open()
|
||||
{
|
||||
int is_ata = 1;
|
||||
|
||||
// autodetect device type
|
||||
is_ata = arcmsr_get_dev_type();
|
||||
int is_ata = arcmsr_get_dev_type();
|
||||
if(is_ata < 0)
|
||||
{
|
||||
set_err(EIO);
|
||||
@ -2824,20 +2817,19 @@ bool linux_smart_interface::get_dev_megasas(smart_device_list & devlist)
|
||||
return false;
|
||||
|
||||
// getting bus numbers with megasas devices
|
||||
struct dirent *ep;
|
||||
unsigned int host_no = 0;
|
||||
char sysfsdir[256];
|
||||
|
||||
/* we are using sysfs to get list of all scsi hosts */
|
||||
// we are using sysfs to get list of all scsi hosts
|
||||
DIR * dp = opendir ("/sys/class/scsi_host/");
|
||||
if (dp != NULL)
|
||||
{
|
||||
struct dirent *ep;
|
||||
while ((ep = readdir (dp)) != NULL) {
|
||||
if (!sscanf(ep->d_name, "host%d", &host_no))
|
||||
unsigned int host_no = 0;
|
||||
if (!sscanf(ep->d_name, "host%u", &host_no))
|
||||
continue;
|
||||
/* proc_name should be megaraid_sas */
|
||||
char sysfsdir[256];
|
||||
snprintf(sysfsdir, sizeof(sysfsdir) - 1,
|
||||
"/sys/class/scsi_host/host%d/proc_name", host_no);
|
||||
"/sys/class/scsi_host/host%u/proc_name", host_no);
|
||||
if((fp = fopen(sysfsdir, "r")) == NULL)
|
||||
continue;
|
||||
if(fgets(line, sizeof(line), fp) != NULL && !strncmp(line,"megaraid_sas",12)) {
|
||||
@ -2972,7 +2964,7 @@ linux_smart_interface::megasas_pd_add_list(int bus_no, smart_device_list & devli
|
||||
*/
|
||||
megasas_pd_list * list = 0;
|
||||
for (unsigned list_size = 1024; ; ) {
|
||||
list = (megasas_pd_list *)realloc(list, list_size);
|
||||
list = reinterpret_cast<megasas_pd_list *>(realloc(list, list_size));
|
||||
if (!list)
|
||||
throw std::bad_alloc();
|
||||
bzero(list, list_size);
|
||||
@ -3186,12 +3178,11 @@ smart_device * linux_smart_interface::get_custom_smart_device(const char * name,
|
||||
}
|
||||
|
||||
//aacraid?
|
||||
unsigned int device;
|
||||
unsigned int host;
|
||||
if(sscanf(type, "aacraid,%d,%d,%d", &host, &channel, &device)==3) {
|
||||
unsigned host, chan, device;
|
||||
if (sscanf(type, "aacraid,%u,%u,%u", &host, &chan, &device) == 3) {
|
||||
//return new linux_aacraid_device(this,name,channel,device);
|
||||
return get_sat_device("sat,auto",
|
||||
new linux_aacraid_device(this, name, host, channel, device));
|
||||
new linux_aacraid_device(this, name, host, chan, device));
|
||||
|
||||
}
|
||||
|
||||
|
@ -1,7 +1,7 @@
|
||||
/*
|
||||
* os_linux.h
|
||||
*
|
||||
* Home page of code is: http://smartmontools.sourceforge.net
|
||||
* Home page of code is: http://www.smartmontools.org
|
||||
*
|
||||
* Copyright (C) 2003-8 Bruce Allen <smartmontools-support@lists.sourceforge.net>
|
||||
*
|
||||
@ -38,7 +38,7 @@
|
||||
#ifndef OS_LINUX_H_
|
||||
#define OS_LINUX_H_
|
||||
|
||||
#define OS_LINUX_H_CVSID "$Id: os_linux.h 3728 2012-12-13 17:57:50Z chrfranke $\n"
|
||||
#define OS_LINUX_H_CVSID "$Id: os_linux.h 4120 2015-08-27 16:12:21Z samm2 $\n"
|
||||
|
||||
/*
|
||||
The following definitions/macros/prototypes are used for three
|
||||
|
@ -1,7 +1,7 @@
|
||||
/*
|
||||
* os_netbsd.cpp
|
||||
*
|
||||
* Home page of code is: http://smartmontools.sourceforge.net
|
||||
* Home page of code is: http://www.smartmontools.org
|
||||
*
|
||||
* Copyright (C) 2003-8 Sergey Svishchev <smartmontools-support@lists.sourceforge.net>
|
||||
*
|
||||
@ -26,14 +26,14 @@
|
||||
#include <errno.h>
|
||||
#include <unistd.h>
|
||||
|
||||
const char * os_netbsd_cpp_cvsid = "$Id: os_netbsd.cpp 3806 2013-03-29 20:17:03Z chrfranke $"
|
||||
const char * os_netbsd_cpp_cvsid = "$Id: os_netbsd.cpp 4205 2016-01-22 15:22:53Z samm2 $"
|
||||
OS_NETBSD_H_CVSID;
|
||||
|
||||
/* global variable holding byte count of allocated memory */
|
||||
extern long long bytes;
|
||||
|
||||
enum warnings {
|
||||
BAD_SMART, NO_3WARE, NO_ARECA, MAX_MSG
|
||||
BAD_SMART, MAX_MSG
|
||||
};
|
||||
|
||||
/* Utility function for printing warnings */
|
||||
@ -132,7 +132,14 @@ get_dev_names(char ***names, const char *prefix)
|
||||
n++;
|
||||
}
|
||||
|
||||
mp = (char **)realloc(mp, n * (sizeof(char *)));
|
||||
void * tmp = (char **)realloc(mp, n * (sizeof(char *)));
|
||||
if (NULL == tmp) {
|
||||
pout("Out of memory constructing scan device list\n");
|
||||
free(mp);
|
||||
return -1;
|
||||
}
|
||||
else
|
||||
mp = tmp;
|
||||
bytes += (n) * (sizeof(char *));
|
||||
*names = mp;
|
||||
return n;
|
||||
@ -320,7 +327,8 @@ ata_command_interface(int fd, smart_command_set command, int select, char *data)
|
||||
return 0;
|
||||
}
|
||||
|
||||
if ((retval = ioctl(fd, ATAIOCCOMMAND, &req))) {
|
||||
retval = ioctl(fd, ATAIOCCOMMAND, &req);
|
||||
if (retval < 0) {
|
||||
perror("Failed command");
|
||||
return -1;
|
||||
}
|
||||
|
@ -1,7 +1,7 @@
|
||||
/*
|
||||
* os_netbsd.h
|
||||
*
|
||||
* Home page of code is: http://smartmontools.sourceforge.net
|
||||
* Home page of code is: http://www.smartmontools.org
|
||||
*
|
||||
* Copyright (C) 2003-8 Sergey Svishchev <smartmontools-support@lists.sourceforge.net>
|
||||
*
|
||||
@ -24,7 +24,7 @@
|
||||
#ifndef OS_NETBSD_H_
|
||||
#define OS_NETBSD_H_
|
||||
|
||||
#define OS_NETBSD_H_CVSID "$Id: os_netbsd.h 3728 2012-12-13 17:57:50Z chrfranke $\n"
|
||||
#define OS_NETBSD_H_CVSID "$Id: os_netbsd.h 4120 2015-08-27 16:12:21Z samm2 $\n"
|
||||
|
||||
#include <sys/device.h>
|
||||
#include <sys/param.h>
|
||||
|
@ -1,7 +1,7 @@
|
||||
/*
|
||||
* os_openbsd.c
|
||||
*
|
||||
* Home page of code is: http://smartmontools.sourceforge.net
|
||||
* Home page of code is: http://www.smartmontools.org
|
||||
*
|
||||
* Copyright (C) 2004-10 David Snyder <smartmontools-support@lists.sourceforge.net>
|
||||
*
|
||||
@ -27,14 +27,14 @@
|
||||
|
||||
#include <errno.h>
|
||||
|
||||
const char * os_openbsd_cpp_cvsid = "$Id: os_openbsd.cpp 3727 2012-12-13 17:23:06Z samm2 $"
|
||||
const char * os_openbsd_cpp_cvsid = "$Id: os_openbsd.cpp 4205 2016-01-22 15:22:53Z samm2 $"
|
||||
OS_OPENBSD_H_CVSID;
|
||||
|
||||
/* global variable holding byte count of allocated memory */
|
||||
extern long long bytes;
|
||||
|
||||
enum warnings {
|
||||
BAD_SMART, NO_3WARE, NO_ARECA, MAX_MSG
|
||||
BAD_SMART, MAX_MSG
|
||||
};
|
||||
|
||||
/* Utility function for printing warnings */
|
||||
@ -136,7 +136,14 @@ get_dev_names(char ***names, const char *prefix)
|
||||
n++;
|
||||
}
|
||||
|
||||
mp = (char **)realloc(mp, n * (sizeof(char *)));
|
||||
void * tmp = (char **)realloc(mp, n * (sizeof(char *)));
|
||||
if (NULL == tmp) {
|
||||
pout("Out of memory constructing scan device list\n");
|
||||
free(mp);
|
||||
return -1;
|
||||
}
|
||||
else
|
||||
mp = tmp;
|
||||
bytes += (n) * (sizeof(char *));
|
||||
*names = mp;
|
||||
return n;
|
||||
@ -316,7 +323,8 @@ ata_command_interface(int fd, smart_command_set command, int select, char *data)
|
||||
|
||||
unsigned const short normal = WDSMART_CYL, failed = 0x2cf4;
|
||||
|
||||
if ((retval = ioctl(fd, ATAIOCCOMMAND, &req))) {
|
||||
retval = ioctl(fd, ATAIOCCOMMAND, &req);
|
||||
if (retval < 0) {
|
||||
perror("Failed command");
|
||||
return -1;
|
||||
}
|
||||
|
@ -1,7 +1,7 @@
|
||||
/*
|
||||
* os_openbsd.h
|
||||
*
|
||||
* Home page of code is: http://smartmontools.sourceforge.net
|
||||
* Home page of code is: http://www.smartmontools.org
|
||||
*
|
||||
* Copyright (C) 2004-8 David Snyder <smartmontools-support@lists.sourceforge.net>
|
||||
*
|
||||
@ -26,7 +26,7 @@
|
||||
#ifndef OS_OPENBSD_H_
|
||||
#define OS_OPENBSD_H_
|
||||
|
||||
#define OS_OPENBSD_H_CVSID "$Id: os_openbsd.h 3728 2012-12-13 17:57:50Z chrfranke $\n"
|
||||
#define OS_OPENBSD_H_CVSID "$Id: os_openbsd.h 4120 2015-08-27 16:12:21Z samm2 $\n"
|
||||
|
||||
/* from NetBSD: atareg.h,v 1.17, by Manuel Bouyer */
|
||||
/* Actually fits _perfectly_ into OBSDs wdcreg.h, but... */
|
||||
|
@ -1,7 +1,7 @@
|
||||
/*
|
||||
* os_os2.c
|
||||
*
|
||||
* Home page of code is: http://smartmontools.sourceforge.net
|
||||
* Home page of code is: http://www.smartmontools.org
|
||||
*
|
||||
* Copyright (C) 2004-8 Yuri Dario <smartmontools-support@lists.sourceforge.net>
|
||||
*
|
||||
@ -31,7 +31,7 @@
|
||||
#include "os_os2.h"
|
||||
|
||||
// Needed by '-V' option (CVS versioning) of smartd/smartctl
|
||||
const char *os_XXXX_c_cvsid="$Id: os_os2.cpp 3806 2013-03-29 20:17:03Z chrfranke $" \
|
||||
const char *os_XXXX_c_cvsid="$Id: os_os2.cpp 4120 2015-08-27 16:12:21Z samm2 $" \
|
||||
ATACMDS_H_CVSID OS_XXXX_H_CVSID SCSICMDS_H_CVSID UTILITY_H_CVSID;
|
||||
|
||||
// global handle to device driver
|
||||
|
4
os_os2.h
4
os_os2.h
@ -1,7 +1,7 @@
|
||||
/*
|
||||
* os_os2.c
|
||||
*
|
||||
* Home page of code is: http://smartmontools.sourceforge.net
|
||||
* Home page of code is: http://www.smartmontools.org
|
||||
*
|
||||
* Copyright (C) 2004-8 Yuri Dario <smartmontools-support@lists.sourceforge.net>
|
||||
*
|
||||
@ -18,7 +18,7 @@
|
||||
#ifndef OS_OS2_H_
|
||||
#define OS_OS2_H_
|
||||
|
||||
#define OS_XXXX_H_CVSID "$Id: os_os2.h 3728 2012-12-13 17:57:50Z chrfranke $\n"
|
||||
#define OS_XXXX_H_CVSID "$Id: os_os2.h 4120 2015-08-27 16:12:21Z samm2 $\n"
|
||||
|
||||
// Additional material should start here. Note: to keep the '-V' CVS
|
||||
// reporting option working as intended, you should only #include
|
||||
|
@ -1,7 +1,7 @@
|
||||
/*
|
||||
* os_generic.h
|
||||
*
|
||||
* Home page of code is: http://smartmontools.sourceforge.net
|
||||
* Home page of code is: http://www.smartmontools.org
|
||||
*
|
||||
* Copyright (C) Joerg Hering <smartmontools-support@lists.sourceforge.net>
|
||||
* Copyright (C) 2003-8 Bruce Allen <smartmontools-support@lists.sourceforge.net>
|
||||
@ -23,7 +23,7 @@
|
||||
*/
|
||||
#ifndef OS_QNXNTO_H_
|
||||
#define OS_QNXNTO_H_
|
||||
#define OS_QNXNTO_H_CVSID "$Id: os_qnxnto.h 3728 2012-12-13 17:57:50Z chrfranke $\n"
|
||||
#define OS_QNXNTO_H_CVSID "$Id: os_qnxnto.h 4120 2015-08-27 16:12:21Z samm2 $\n"
|
||||
|
||||
// Additional material should start here. Note: to keep the '-V' CVS
|
||||
// reporting option working as intended, you should only #include
|
||||
|
@ -1,10 +1,10 @@
|
||||
/*
|
||||
* os_solaris.c
|
||||
*
|
||||
* Home page of code is: http://smartmontools.sourceforge.net
|
||||
* Home page of code is: http://www.smartmontools.org
|
||||
*
|
||||
* Copyright (C) 2003-8 SAWADA Keiji <smartmontools-support@lists.sourceforge.net>
|
||||
* Copyright (C) 2003-8 Casper Dik <smartmontools-support@lists.sourceforge.net>
|
||||
* Copyright (C) 2003-08 SAWADA Keiji
|
||||
* Copyright (C) 2003-15 Casper Dik
|
||||
*
|
||||
* 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
|
||||
@ -39,9 +39,9 @@
|
||||
|
||||
extern long long bytes;
|
||||
|
||||
static const char *filenameandversion="$Id: os_solaris.cpp 3806 2013-03-29 20:17:03Z chrfranke $";
|
||||
static const char *filenameandversion="$Id: os_solaris.cpp 4142 2015-10-14 19:05:19Z chrfranke $";
|
||||
|
||||
const char *os_XXXX_c_cvsid="$Id: os_solaris.cpp 3806 2013-03-29 20:17:03Z chrfranke $" \
|
||||
const char *os_XXXX_c_cvsid="$Id: os_solaris.cpp 4142 2015-10-14 19:05:19Z chrfranke $" \
|
||||
ATACMDS_H_CVSID CONFIG_H_CVSID INT64_H_CVSID OS_SOLARIS_H_CVSID SCSICMDS_H_CVSID UTILITY_H_CVSID;
|
||||
|
||||
// The printwarning() function warns about unimplemented functions
|
||||
@ -99,6 +99,7 @@ void print_smartctl_examples(){
|
||||
static const char *uscsidrvrs[] = {
|
||||
"sd",
|
||||
"ssd",
|
||||
"disk", // SATA devices
|
||||
"st"
|
||||
};
|
||||
|
||||
@ -271,7 +272,7 @@ int deviceclose(int fd){
|
||||
return close(fd);
|
||||
}
|
||||
|
||||
#if defined(__sparc)
|
||||
#if defined(WITH_SOLARIS_SPARC_ATA)
|
||||
// swap each 2-byte pairs in a sector
|
||||
static void swap_sector(void *p)
|
||||
{
|
||||
@ -286,7 +287,7 @@ static void swap_sector(void *p)
|
||||
|
||||
// Interface to ATA devices. See os_linux.c
|
||||
int ata_command_interface(int fd, smart_command_set command, int select, char *data){
|
||||
#if defined(__sparc)
|
||||
#if defined(WITH_SOLARIS_SPARC_ATA)
|
||||
int err;
|
||||
|
||||
switch (command){
|
||||
@ -328,7 +329,7 @@ int ata_command_interface(int fd, smart_command_set command, int select, char *d
|
||||
EXIT(1);
|
||||
break;
|
||||
}
|
||||
#else /* __sparc */
|
||||
#else /* WITH_SOLARIS_SPARC_ATA */
|
||||
ARGUSED(fd); ARGUSED(command); ARGUSED(select); ARGUSED(data);
|
||||
|
||||
/* Above smart_* routines uses undocumented ioctls of "dada"
|
||||
@ -395,7 +396,7 @@ int do_scsi_cmnd_io(int fd, struct scsi_cmnd_io * iop, int report)
|
||||
default:
|
||||
return -EINVAL;
|
||||
}
|
||||
uscsi.uscsi_flags |= (USCSI_ISOLATE | USCSI_RQENABLE);
|
||||
uscsi.uscsi_flags |= (USCSI_ISOLATE | USCSI_RQENABLE | USCSI_SILENT);
|
||||
|
||||
if (ioctl(fd, USCSICMD, &uscsi)) {
|
||||
int err = errno;
|
||||
|
@ -1,7 +1,7 @@
|
||||
/*
|
||||
* os_solaris.h
|
||||
*
|
||||
* Home page of code is: http://smartmontools.sourceforge.net
|
||||
* Home page of code is: http://www.smartmontools.org
|
||||
*
|
||||
* Copyright (C) 2003-8 SAWADA Keiji <smartmontools-support@lists.sourceforge.net>
|
||||
* Copyright (C) 2003-8 Casper Dik <smartmontools-support@lists.sourceforge.net>
|
||||
@ -25,7 +25,7 @@
|
||||
#ifndef OS_SOLARIS_H_
|
||||
#define OS_SOLARIS_H_
|
||||
|
||||
#define OS_SOLARIS_H_CVSID "$Id: os_solaris.h 3728 2012-12-13 17:57:50Z chrfranke $\n"
|
||||
#define OS_SOLARIS_H_CVSID "$Id: os_solaris.h 4120 2015-08-27 16:12:21Z samm2 $\n"
|
||||
|
||||
// Additional material should start here. Note: to keep the '-V' CVS
|
||||
// reporting option working as intended, you should only #include
|
||||
|
158
os_win32.cpp
158
os_win32.cpp
@ -1,7 +1,7 @@
|
||||
/*
|
||||
* os_win32.cpp
|
||||
*
|
||||
* Home page of code is: http://smartmontools.sourceforge.net
|
||||
* Home page of code is: http://www.smartmontools.org
|
||||
*
|
||||
* Copyright (C) 2004-15 Christian Franke
|
||||
*
|
||||
@ -111,7 +111,7 @@
|
||||
#define strnicmp strncasecmp
|
||||
#endif
|
||||
|
||||
const char * os_win32_cpp_cvsid = "$Id: os_win32.cpp 4098 2015-05-30 16:37:37Z chrfranke $";
|
||||
const char * os_win32_cpp_cvsid = "$Id: os_win32.cpp 4156 2015-10-18 12:20:40Z samm2 $";
|
||||
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
// Windows I/O-controls, some declarations are missing in the include files
|
||||
@ -643,60 +643,37 @@ std::string win_smart_interface::get_os_version_str()
|
||||
const int vlen = sizeof(vstr)-sizeof(SMARTMONTOOLS_BUILD_HOST);
|
||||
assert(vptr == vstr+strlen(vstr) && vptr+vlen+1 == vstr+sizeof(vstr));
|
||||
|
||||
OSVERSIONINFOEXA vi; memset(&vi, 0, sizeof(vi));
|
||||
// Starting with Windows 8.1, GetVersionEx() does no longer report the
|
||||
// actual OS version, see:
|
||||
// http://msdn.microsoft.com/en-us/library/windows/desktop/dn302074.aspx
|
||||
|
||||
// RtlGetVersion() is not affected
|
||||
LONG /*NTSTATUS*/ (WINAPI /*NTAPI*/ * RtlGetVersion_p)(LPOSVERSIONINFOEXW) =
|
||||
(LONG (WINAPI *)(LPOSVERSIONINFOEXW))
|
||||
GetProcAddress(GetModuleHandleA("ntdll.dll"), "RtlGetVersion");
|
||||
|
||||
OSVERSIONINFOEXW vi; memset(&vi, 0, sizeof(vi));
|
||||
vi.dwOSVersionInfoSize = sizeof(vi);
|
||||
if (!GetVersionExA((OSVERSIONINFOA *)&vi)) {
|
||||
memset(&vi, 0, sizeof(vi));
|
||||
vi.dwOSVersionInfoSize = sizeof(OSVERSIONINFOA);
|
||||
if (!GetVersionExA((OSVERSIONINFOA *)&vi))
|
||||
if (!RtlGetVersion_p || RtlGetVersion_p(&vi)) {
|
||||
if (!GetVersionExW((OSVERSIONINFOW *)&vi))
|
||||
return vstr;
|
||||
}
|
||||
|
||||
const char * w = 0;
|
||||
if (vi.dwPlatformId == VER_PLATFORM_WIN32_NT) {
|
||||
|
||||
if (vi.dwMajorVersion > 6 || (vi.dwMajorVersion == 6 && vi.dwMinorVersion >= 2)) {
|
||||
// Starting with Windows 8.1 Preview, GetVersionEx() does no longer report the
|
||||
// actual OS version, see:
|
||||
// http://msdn.microsoft.com/en-us/library/windows/desktop/dn302074.aspx
|
||||
|
||||
ULONGLONG major_equal = VerSetConditionMask(0, VER_MAJORVERSION, VER_EQUAL);
|
||||
for (unsigned major = vi.dwMajorVersion; major <= 9; major++) {
|
||||
OSVERSIONINFOEXA vi2; memset(&vi2, 0, sizeof(vi2));
|
||||
vi2.dwOSVersionInfoSize = sizeof(vi2); vi2.dwMajorVersion = major;
|
||||
if (!VerifyVersionInfo(&vi2, VER_MAJORVERSION, major_equal))
|
||||
continue;
|
||||
if (vi.dwMajorVersion < major) {
|
||||
vi.dwMajorVersion = major; vi.dwMinorVersion = 0;
|
||||
}
|
||||
|
||||
ULONGLONG minor_equal = VerSetConditionMask(0, VER_MINORVERSION, VER_EQUAL);
|
||||
for (unsigned minor = vi.dwMinorVersion; minor <= 9; minor++) {
|
||||
memset(&vi2, 0, sizeof(vi2)); vi2.dwOSVersionInfoSize = sizeof(vi2);
|
||||
vi2.dwMinorVersion = minor;
|
||||
if (!VerifyVersionInfo(&vi2, VER_MINORVERSION, minor_equal))
|
||||
continue;
|
||||
vi.dwMinorVersion = minor;
|
||||
break;
|
||||
}
|
||||
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (vi.dwMajorVersion <= 0xf && vi.dwMinorVersion <= 0xf) {
|
||||
bool ws = (vi.wProductType <= VER_NT_WORKSTATION);
|
||||
switch (vi.dwMajorVersion << 4 | vi.dwMinorVersion) {
|
||||
case 0x50: w = "2000"; break;
|
||||
case 0x51: w = "xp"; break;
|
||||
case 0x52: w = (!GetSystemMetrics(89/*SM_SERVERR2*/)
|
||||
? "2003" : "2003r2"); break;
|
||||
case 0x60: w = (ws ? "vista" : "2008" ); break;
|
||||
case 0x61: w = (ws ? "win7" : "2008r2"); break;
|
||||
case 0x62: w = (ws ? "win8" : "2012" ); break;
|
||||
case 0x63: w = (ws ? "win8.1": "2012r2"); break;
|
||||
case 0x64: w = (ws ? "win10" : "w10srv"); break;
|
||||
}
|
||||
if ( vi.dwPlatformId == VER_PLATFORM_WIN32_NT
|
||||
&& vi.dwMajorVersion <= 0xf && vi.dwMinorVersion <= 0xf) {
|
||||
bool ws = (vi.wProductType <= VER_NT_WORKSTATION);
|
||||
switch (vi.dwMajorVersion << 4 | vi.dwMinorVersion) {
|
||||
case 0x50: w = "2000"; break;
|
||||
case 0x51: w = "xp"; break;
|
||||
case 0x52: w = (!GetSystemMetrics(89/*SM_SERVERR2*/)
|
||||
? "2003" : "2003r2"); break;
|
||||
case 0x60: w = (ws ? "vista" : "2008" ); break;
|
||||
case 0x61: w = (ws ? "win7" : "2008r2"); break;
|
||||
case 0x62: w = (ws ? "win8" : "2012" ); break;
|
||||
case 0x63: w = (ws ? "win8.1": "2012r2"); break;
|
||||
case 0x64: w = (ws ? "w10tp" : "w10tps"); break; // 6.4 = Win 10 Technical Preview
|
||||
case 0xa0: w = (ws ? "win10" : "w10srv"); break; // 10.0 = Win 10 Final
|
||||
}
|
||||
}
|
||||
|
||||
@ -750,7 +727,8 @@ enum win_dev_type { DEV_UNKNOWN = 0, DEV_ATA, DEV_SCSI, DEV_SAT, DEV_USB };
|
||||
static win_dev_type get_phy_drive_type(int drive);
|
||||
static win_dev_type get_phy_drive_type(int drive, GETVERSIONINPARAMS_EX * ata_version_ex);
|
||||
static win_dev_type get_log_drive_type(int drive);
|
||||
static bool get_usb_id(int drive, unsigned short & vendor_id,
|
||||
static bool get_usb_id(int phydrive, int logdrive,
|
||||
unsigned short & vendor_id,
|
||||
unsigned short & product_id);
|
||||
|
||||
static const char * ata_get_def_options(void);
|
||||
@ -807,9 +785,10 @@ static int sdxy_to_phydrive(const char (& xy)[2+1])
|
||||
return phydrive;
|
||||
}
|
||||
|
||||
static win_dev_type get_dev_type(const char * name, int & phydrive)
|
||||
static win_dev_type get_dev_type(const char * name, int & phydrive, int & logdrive)
|
||||
{
|
||||
phydrive = -1;
|
||||
phydrive = logdrive = -1;
|
||||
|
||||
name = skipdev(name);
|
||||
if (!strncmp(name, "st", 2))
|
||||
return DEV_SCSI;
|
||||
@ -818,7 +797,7 @@ static win_dev_type get_dev_type(const char * name, int & phydrive)
|
||||
if (!strncmp(name, "tape", 4))
|
||||
return DEV_SCSI;
|
||||
|
||||
int logdrive = drive_letter(name);
|
||||
logdrive = drive_letter(name);
|
||||
if (logdrive >= 0) {
|
||||
win_dev_type type = get_log_drive_type(logdrive);
|
||||
return (type != DEV_UNKNOWN ? type : DEV_SCSI);
|
||||
@ -830,9 +809,9 @@ static win_dev_type get_dev_type(const char * name, int & phydrive)
|
||||
return get_phy_drive_type(phydrive);
|
||||
}
|
||||
|
||||
phydrive = -1;
|
||||
if (sscanf(name, "pd%d", &phydrive) == 1 && phydrive >= 0)
|
||||
return get_phy_drive_type(phydrive);
|
||||
|
||||
return DEV_UNKNOWN;
|
||||
}
|
||||
|
||||
@ -949,8 +928,8 @@ smart_device * win_smart_interface::autodetect_smart_device(const char * name)
|
||||
if (str_starts_with(testname, "csmi"))
|
||||
return new win_csmi_device(this, name, "");
|
||||
|
||||
int phydrive = -1;
|
||||
win_dev_type type = get_dev_type(name, phydrive);
|
||||
int phydrive = -1, logdrive = -1;
|
||||
win_dev_type type = get_dev_type(name, phydrive, logdrive);
|
||||
|
||||
if (type == DEV_ATA)
|
||||
return new win_ata_device(this, name, "");
|
||||
@ -964,7 +943,7 @@ smart_device * win_smart_interface::autodetect_smart_device(const char * name)
|
||||
if (type == DEV_USB) {
|
||||
// Get USB bridge ID
|
||||
unsigned short vendor_id = 0, product_id = 0;
|
||||
if (!(phydrive >= 0 && get_usb_id(phydrive, vendor_id, product_id))) {
|
||||
if (!get_usb_id(phydrive, logdrive, vendor_id, product_id)) {
|
||||
set_err(EINVAL, "Unable to read USB device ID");
|
||||
return 0;
|
||||
}
|
||||
@ -1064,7 +1043,7 @@ bool win_smart_interface::scan_smart_devices(smart_device_list & devlist,
|
||||
raid_seen[vers_ex.wControllerId] = true;
|
||||
// Add physical drives
|
||||
int len = strlen(name);
|
||||
for (int pi = 0; pi < 32; pi++) {
|
||||
for (unsigned int pi = 0; pi < 32; pi++) {
|
||||
if (vers_ex.dwDeviceMapEx & (1L << pi)) {
|
||||
snprintf(name+len, sizeof(name)-1-len, ",%u", pi);
|
||||
devlist.push_back( new win_ata_device(this, name, "ata") );
|
||||
@ -1098,7 +1077,7 @@ bool win_smart_interface::scan_smart_devices(smart_device_list & devlist,
|
||||
// TODO: Use common function for this and autodetect_smart_device()
|
||||
// Get USB bridge ID
|
||||
unsigned short vendor_id = 0, product_id = 0;
|
||||
if (!get_usb_id(i, vendor_id, product_id))
|
||||
if (!get_usb_id(i, -1, vendor_id, product_id))
|
||||
continue;
|
||||
// Get type name for this ID
|
||||
const char * usbtype = get_usb_dev_type_by_id(vendor_id, product_id);
|
||||
@ -2314,8 +2293,10 @@ static bool get_serial_from_wmi(int drive, ata_identify_device * id)
|
||||
/////////////////////////////////////////////////////////////////////////////
|
||||
// USB ID detection using WMI
|
||||
|
||||
// Get USB ID for a physical drive number
|
||||
static bool get_usb_id(int drive, unsigned short & vendor_id, unsigned short & product_id)
|
||||
// Get USB ID for a physical or logical drive number
|
||||
static bool get_usb_id(int phydrive, int logdrive,
|
||||
unsigned short & vendor_id,
|
||||
unsigned short & product_id)
|
||||
{
|
||||
bool debug = (scsi_debugmode > 1);
|
||||
|
||||
@ -2327,13 +2308,41 @@ static bool get_usb_id(int drive, unsigned short & vendor_id, unsigned short & p
|
||||
}
|
||||
|
||||
// Get device name
|
||||
std::string name;
|
||||
|
||||
wbem_object wo;
|
||||
if (!ws.query1(wo, "SELECT Model FROM Win32_DiskDrive WHERE DeviceID=\"\\\\\\\\.\\\\PHYSICALDRIVE%d\"", drive))
|
||||
if (0 <= logdrive && logdrive <= 'Z'-'A') {
|
||||
// Drive letter -> Partition info
|
||||
if (!ws.query1(wo, "ASSOCIATORS OF {Win32_LogicalDisk.DeviceID=\"%c:\"} WHERE ResultClass = Win32_DiskPartition",
|
||||
'A'+logdrive))
|
||||
return false;
|
||||
|
||||
std::string partid = wo.get_str("DeviceID");
|
||||
if (debug)
|
||||
pout("%c: --> \"%s\" -->\n", 'A'+logdrive, partid.c_str());
|
||||
|
||||
// Partition ID -> Physical drive info
|
||||
if (!ws.query1(wo, "ASSOCIATORS OF {Win32_DiskPartition.DeviceID=\"%s\"} WHERE ResultClass = Win32_DiskDrive",
|
||||
partid.c_str()))
|
||||
return false;
|
||||
|
||||
name = wo.get_str("Model");
|
||||
if (debug)
|
||||
pout("%s --> \"%s\":\n", wo.get_str("DeviceID").c_str(), name.c_str());
|
||||
}
|
||||
|
||||
else if (phydrive >= 0) {
|
||||
// Physical drive number -> Physical drive info
|
||||
if (!ws.query1(wo, "SELECT Model FROM Win32_DiskDrive WHERE DeviceID=\"\\\\\\\\.\\\\PHYSICALDRIVE%d\"", phydrive))
|
||||
return false;
|
||||
|
||||
name = wo.get_str("Model");
|
||||
if (debug)
|
||||
pout("\\.\\\\PHYSICALDRIVE%d --> \"%s\":\n", phydrive, name.c_str());
|
||||
}
|
||||
else
|
||||
return false;
|
||||
|
||||
std::string name = wo.get_str("Model");
|
||||
if (debug)
|
||||
pout("PhysicalDrive%d, \"%s\":\n", drive, name.c_str());
|
||||
|
||||
// Get USB_CONTROLLER -> DEVICE associations
|
||||
wbem_enumerator we;
|
||||
@ -2376,10 +2385,9 @@ static bool get_usb_id(int drive, unsigned short & vendor_id, unsigned short & p
|
||||
prev_usb_ant = ant;
|
||||
if (debug)
|
||||
pout(" +-> \"%s\" [0x%04x:0x%04x]\n", devid.c_str(), prev_usb_venid, prev_usb_proid);
|
||||
continue;
|
||||
}
|
||||
else if (str_starts_with(devid, "USBSTOR\\\\")) {
|
||||
// USBSTOR device found
|
||||
else if (str_starts_with(devid, "USBSTOR\\\\") || str_starts_with(devid, "SCSI\\\\")) {
|
||||
// USBSTORage or SCSI device found
|
||||
if (debug)
|
||||
pout(" +--> \"%s\"\n", devid.c_str());
|
||||
|
||||
@ -2643,7 +2651,6 @@ bool win_ata_device::open(int phydrive, int logdrive, const char * options, int
|
||||
close();
|
||||
return set_err(ENOSYS);
|
||||
}
|
||||
devmap = 0x0f;
|
||||
}
|
||||
m_smartver_state = 1;
|
||||
|
||||
@ -2896,9 +2903,10 @@ bool win_ata_device::ata_pass_through(const ata_cmd_in & in, ata_cmd_out & out)
|
||||
break;
|
||||
case 'f':
|
||||
if (in.in_regs.command == ATA_IDENTIFY_DEVICE) {
|
||||
rc = get_identify_from_device_property(get_fh(), (ata_identify_device *)data);
|
||||
ata_identify_device * id = reinterpret_cast<ata_identify_device *>(data);
|
||||
rc = get_identify_from_device_property(get_fh(), id);
|
||||
if (rc == 0 && m_phydrive >= 0)
|
||||
get_serial_from_wmi(m_phydrive, (ata_identify_device *)data);
|
||||
get_serial_from_wmi(m_phydrive, id);
|
||||
id_is_cached = true;
|
||||
}
|
||||
else if (in.in_regs.command == ATA_SMART_CMD) switch (in.in_regs.features) {
|
||||
@ -3889,10 +3897,8 @@ bool win_areca_ata_device::open()
|
||||
|
||||
smart_device * win_areca_ata_device::autodetect_open()
|
||||
{
|
||||
int is_ata = 1;
|
||||
|
||||
// autodetect device type
|
||||
is_ata = arcmsr_get_dev_type();
|
||||
int is_ata = arcmsr_get_dev_type();
|
||||
if(is_ata < 0)
|
||||
{
|
||||
set_err(EIO);
|
||||
|
@ -1,7 +1,7 @@
|
||||
/*
|
||||
* os_win32/daemon_win32.cpp
|
||||
*
|
||||
* Home page of code is: http://smartmontools.sourceforge.net
|
||||
* Home page of code is: http://www.smartmontools.org
|
||||
*
|
||||
* Copyright (C) 2004-14 Christian Franke <smartmontools-support@lists.sourceforge.net>
|
||||
*
|
||||
@ -20,7 +20,7 @@
|
||||
|
||||
#include "daemon_win32.h"
|
||||
|
||||
const char * daemon_win32_cpp_cvsid = "$Id: daemon_win32.cpp 3959 2014-07-18 19:22:18Z chrfranke $"
|
||||
const char * daemon_win32_cpp_cvsid = "$Id: daemon_win32.cpp 4120 2015-08-27 16:12:21Z samm2 $"
|
||||
DAEMON_WIN32_H_CVSID;
|
||||
|
||||
#include <stdio.h>
|
||||
|
@ -1,7 +1,7 @@
|
||||
/*
|
||||
* os_win32/daemon_win32.h
|
||||
*
|
||||
* Home page of code is: http://smartmontools.sourceforge.net
|
||||
* Home page of code is: http://www.smartmontools.org
|
||||
*
|
||||
* Copyright (C) 2004-12 Christian Franke <smartmontools-support@lists.sourceforge.net>
|
||||
*
|
||||
@ -18,7 +18,7 @@
|
||||
#ifndef DAEMON_WIN32_H
|
||||
#define DAEMON_WIN32_H
|
||||
|
||||
#define DAEMON_WIN32_H_CVSID "$Id: daemon_win32.h 3584 2012-08-05 17:05:32Z chrfranke $"
|
||||
#define DAEMON_WIN32_H_CVSID "$Id: daemon_win32.h 4120 2015-08-27 16:12:21Z samm2 $"
|
||||
|
||||
#include <signal.h>
|
||||
|
||||
|
27
os_win32/default.manifest
Normal file
27
os_win32/default.manifest
Normal file
@ -0,0 +1,27 @@
|
||||
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
|
||||
<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
|
||||
<trustInfo xmlns="urn:schemas-microsoft-com:asm.v3">
|
||||
<security>
|
||||
<requestedPrivileges>
|
||||
<requestedExecutionLevel
|
||||
level="asInvoker"
|
||||
uiAccess="false"
|
||||
/>
|
||||
</requestedPrivileges>
|
||||
</security>
|
||||
</trustInfo>
|
||||
<compatibility xmlns="urn:schemas-microsoft-com:compatibility.v1">
|
||||
<application>
|
||||
<!-- Windows Vista -->
|
||||
<supportedOS Id="{e2011457-1546-43c5-a5fe-008deee3d3f0}"/>
|
||||
<!-- Windows 7 -->
|
||||
<supportedOS Id="{35138b9a-5d96-4fbd-8e2d-a2440225f93a}"/>
|
||||
<!-- Windows 8 -->
|
||||
<supportedOS Id="{4a2f28e3-53b9-4441-ba9c-d69d4a4a6e38}"/>
|
||||
<!-- Windows 8.1 -->
|
||||
<supportedOS Id="{1f676c76-80e1-4239-95bb-83d0f6d0da78}"/>
|
||||
<!-- Windows 10 -->
|
||||
<supportedOS Id="{8e0f7a12-bfb3-4fe8-b9a5-48fd50a15a9a}"/>
|
||||
</application>
|
||||
</compatibility>
|
||||
</assembly>
|
@ -1,7 +1,7 @@
|
||||
;
|
||||
; smartmontools install NSIS script
|
||||
; os_win32/installer.nsi - smartmontools install NSIS script
|
||||
;
|
||||
; Home page of code is: http://smartmontools.sourceforge.net
|
||||
; Home page of code is: http://www.smartmontools.org
|
||||
;
|
||||
; Copyright (C) 2006-15 Christian Franke
|
||||
;
|
||||
@ -13,7 +13,7 @@
|
||||
; You should have received a copy of the GNU General Public License
|
||||
; (for example COPYING); If not, see <http://www.gnu.org/licenses/>.
|
||||
;
|
||||
; $Id: installer.nsi 4072 2015-04-28 20:35:15Z chrfranke $
|
||||
; $Id: installer.nsi 4174 2015-11-22 16:19:29Z chrfranke $
|
||||
;
|
||||
|
||||
|
||||
@ -36,6 +36,8 @@
|
||||
Name "smartmontools"
|
||||
OutFile "${OUTFILE}"
|
||||
|
||||
RequestExecutionLevel admin
|
||||
|
||||
SetCompressor /solid lzma
|
||||
|
||||
XPStyle on
|
||||
@ -43,7 +45,7 @@ InstallColors /windows
|
||||
|
||||
; Set in .onInit
|
||||
;InstallDir "$PROGRAMFILES\smartmontools"
|
||||
;InstallDirRegKey HKLM "Software\smartmontools" "Install_Dir"
|
||||
;InstallDirRegKey HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\smartmontools" "InstallLocation"
|
||||
|
||||
Var EDITOR
|
||||
|
||||
@ -56,12 +58,9 @@ Var EDITOR
|
||||
LicenseData "${INPDIR}\doc\COPYING.txt"
|
||||
|
||||
!include "FileFunc.nsh"
|
||||
!include "LogicLib.nsh"
|
||||
!include "Sections.nsh"
|
||||
|
||||
!insertmacro GetParameters
|
||||
!insertmacro GetOptions
|
||||
|
||||
RequestExecutionLevel admin
|
||||
|
||||
;--------------------------------------------------------------------
|
||||
; Pages
|
||||
@ -81,6 +80,11 @@ UninstPage instfiles
|
||||
InstType "Full"
|
||||
InstType "Extract files only"
|
||||
InstType "Drive menu"
|
||||
!ifdef INPDIR64
|
||||
InstType "Full (x64)"
|
||||
InstType "Extract files only (x64)"
|
||||
InstType "Drive menu (x64)"
|
||||
!endif
|
||||
|
||||
|
||||
;--------------------------------------------------------------------
|
||||
@ -88,8 +92,17 @@ InstType "Drive menu"
|
||||
|
||||
!ifdef INPDIR64
|
||||
Section "64-bit version" X64_SECTION
|
||||
SectionIn 4 5 6
|
||||
; Handled in Function CheckX64
|
||||
SectionEnd
|
||||
|
||||
!define FULL_TYPES "1 4"
|
||||
!define EXTRACT_TYPES "2 5"
|
||||
!define DRIVEMENU_TYPE "3 6"
|
||||
!else
|
||||
!define FULL_TYPES "1"
|
||||
!define EXTRACT_TYPES "2"
|
||||
!define DRIVEMENU_TYPE "3"
|
||||
!endif
|
||||
|
||||
SectionGroup "!Program files"
|
||||
@ -97,14 +110,15 @@ SectionGroup "!Program files"
|
||||
!macro FileExe path option
|
||||
!ifdef INPDIR64
|
||||
; Use dummy SetOutPath to control archive location of executables
|
||||
StrCmp $X64 "" +5
|
||||
${If} $X64 != ""
|
||||
Goto +2
|
||||
SetOutPath "$INSTDIR\bin64"
|
||||
File ${option} '${INPDIR64}\${path}'
|
||||
GoTo +4
|
||||
${Else}
|
||||
Goto +2
|
||||
SetOutPath "$INSTDIR\bin"
|
||||
File ${option} '${INPDIR}\${path}'
|
||||
${EndIf}
|
||||
!else
|
||||
File ${option} '${INPDIR}\${path}'
|
||||
!endif
|
||||
@ -112,7 +126,7 @@ SectionGroup "!Program files"
|
||||
|
||||
Section "smartctl" SMARTCTL_SECTION
|
||||
|
||||
SectionIn 1 2
|
||||
SectionIn ${FULL_TYPES} ${EXTRACT_TYPES}
|
||||
|
||||
SetOutPath "$INSTDIR\bin"
|
||||
!insertmacro FileExe "bin\smartctl.exe" ""
|
||||
@ -121,17 +135,18 @@ SectionGroup "!Program files"
|
||||
|
||||
Section "smartd" SMARTD_SECTION
|
||||
|
||||
SectionIn 1 2
|
||||
SectionIn ${FULL_TYPES} ${EXTRACT_TYPES}
|
||||
|
||||
SetOutPath "$INSTDIR\bin"
|
||||
|
||||
; Stop service ?
|
||||
StrCpy $1 ""
|
||||
IfFileExists "$INSTDIR\bin\smartd.exe" 0 nosrv
|
||||
${If} ${FileExists} "$INSTDIR\bin\smartd.exe"
|
||||
ReadRegStr $0 HKLM "System\CurrentControlSet\Services\smartd" "ImagePath"
|
||||
StrCmp $0 "" nosrv
|
||||
${If} $0 != ""
|
||||
ExecWait "net stop smartd" $1
|
||||
nosrv:
|
||||
${EndIf}
|
||||
${EndIf}
|
||||
!insertmacro FileExe "bin\smartd.exe" ""
|
||||
|
||||
IfFileExists "$INSTDIR\bin\smartd.conf" 0 +2
|
||||
@ -142,15 +157,16 @@ SectionGroup "!Program files"
|
||||
!insertmacro FileExe "bin\wtssendmsg.exe" ""
|
||||
|
||||
; Restart service ?
|
||||
StrCmp $1 "0" 0 +3
|
||||
${If} $1 == "0"
|
||||
MessageBox MB_YESNO|MB_ICONQUESTION|MB_DEFBUTTON2 "Restart smartd service ?" /SD IDNO IDYES 0 IDNO +2
|
||||
ExecWait "net start smartd"
|
||||
${EndIf}
|
||||
|
||||
SectionEnd
|
||||
|
||||
Section "smartctl-nc (GSmartControl)" SMARTCTL_NC_SECTION
|
||||
|
||||
SectionIn 1 2
|
||||
SectionIn ${FULL_TYPES} ${EXTRACT_TYPES}
|
||||
|
||||
SetOutPath "$INSTDIR\bin"
|
||||
!insertmacro FileExe "bin\smartctl-nc.exe" ""
|
||||
@ -159,7 +175,7 @@ SectionGroup "!Program files"
|
||||
|
||||
Section "drivedb.h (Drive Database)" DRIVEDB_SECTION
|
||||
|
||||
SectionIn 1 2
|
||||
SectionIn ${FULL_TYPES} ${EXTRACT_TYPES}
|
||||
|
||||
SetOutPath "$INSTDIR\bin"
|
||||
File "${INPDIR}\bin\drivedb.h"
|
||||
@ -171,7 +187,7 @@ SectionGroupEnd
|
||||
|
||||
Section "!Documentation" DOC_SECTION
|
||||
|
||||
SectionIn 1 2
|
||||
SectionIn ${FULL_TYPES} ${EXTRACT_TYPES}
|
||||
|
||||
SetOutPath "$INSTDIR\doc"
|
||||
File "${INPDIR}\doc\AUTHORS.txt"
|
||||
@ -183,10 +199,11 @@ Section "!Documentation" DOC_SECTION
|
||||
File "${INPDIR}\doc\README.txt"
|
||||
File "${INPDIR}\doc\TODO.txt"
|
||||
!ifdef INPDIR64
|
||||
StrCmp $X64 "" +3
|
||||
${If} $X64 != ""
|
||||
File "${INPDIR64}\doc\checksums64.txt"
|
||||
GoTo +2
|
||||
${Else}
|
||||
File "${INPDIR}\doc\checksums32.txt"
|
||||
${EndIf}
|
||||
!else
|
||||
File "${INPDIR}\doc\checksums??.txt"
|
||||
!endif
|
||||
@ -202,7 +219,7 @@ SectionEnd
|
||||
|
||||
Section "Uninstaller" UNINST_SECTION
|
||||
|
||||
SectionIn 1
|
||||
SectionIn ${FULL_TYPES}
|
||||
AddSize 40
|
||||
|
||||
CreateDirectory "$INSTDIR"
|
||||
@ -210,8 +227,9 @@ Section "Uninstaller" UNINST_SECTION
|
||||
; Keep old Install_Dir registry entry for GSmartControl
|
||||
ReadRegStr $0 HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\GSmartControl" "InstallLocation"
|
||||
ReadRegStr $1 HKLM "Software\smartmontools" "Install_Dir"
|
||||
StrCmp "$0$1" "" +2 0
|
||||
${If} "$0$1" != ""
|
||||
WriteRegStr HKLM "Software\smartmontools" "Install_Dir" "$INSTDIR"
|
||||
${EndIf}
|
||||
|
||||
; Write uninstall keys and program
|
||||
WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\smartmontools" "DisplayName" "smartmontools"
|
||||
@ -221,9 +239,9 @@ Section "Uninstaller" UNINST_SECTION
|
||||
WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\smartmontools" "InstallLocation" "$INSTDIR"
|
||||
WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\smartmontools" "UninstallString" '"$INSTDIR\uninst-smartmontools.exe"'
|
||||
WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\smartmontools" "Publisher" "smartmontools.org"
|
||||
WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\smartmontools" "URLInfoAbout" "http://www.smartmontools.org/"
|
||||
WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\smartmontools" "URLInfoAbout" "https://www.smartmontools.org/"
|
||||
WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\smartmontools" "HelpLink" "http://sourceforge.net/projects/smartmontools/support"
|
||||
WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\smartmontools" "URLUpdateInfo" "http://smartmontools.no-ip.org/"
|
||||
WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\smartmontools" "URLUpdateInfo" "http://builds.smartmontools.org/"
|
||||
WriteRegDWORD HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\smartmontools" "NoModify" 1
|
||||
WriteRegDWORD HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\smartmontools" "NoRepair" 1
|
||||
WriteUninstaller "uninst-smartmontools.exe"
|
||||
@ -232,7 +250,7 @@ SectionEnd
|
||||
|
||||
Section "Start Menu Shortcuts" MENU_SECTION
|
||||
|
||||
SectionIn 1
|
||||
SectionIn ${FULL_TYPES}
|
||||
|
||||
SetShellVarContext all
|
||||
|
||||
@ -245,15 +263,15 @@ Section "Start Menu Shortcuts" MENU_SECTION
|
||||
!macroend
|
||||
|
||||
; runcmdu
|
||||
IfFileExists "$INSTDIR\bin\smartctl.exe" 0 +2
|
||||
IfFileExists "$INSTDIR\bin\smartd.exe" 0 noruncmd
|
||||
${If} ${FileExists} "$INSTDIR\bin\smartctl.exe"
|
||||
${OrIf} ${FileExists} "$INSTDIR\bin\smartd.exe"
|
||||
SetOutPath "$INSTDIR\bin"
|
||||
!insertmacro FileExe "bin\runcmdu.exe" ""
|
||||
File "${INPDIR}\bin\runcmdu.exe.manifest"
|
||||
noruncmd:
|
||||
Delete "$INSTDIR\bin\runcmdu.exe.manifest" ; TODO: Remove after smartmontools 6.5
|
||||
${EndIf}
|
||||
|
||||
; smartctl
|
||||
IfFileExists "$INSTDIR\bin\smartctl.exe" 0 noctl
|
||||
${If} ${FileExists} "$INSTDIR\bin\smartctl.exe"
|
||||
SetOutPath "$INSTDIR\bin"
|
||||
!insertmacro CreateAdminShortCut "$SMPROGRAMS\smartmontools\smartctl (Admin CMD).lnk" "$WINDIR\system32\cmd.exe" '/k PATH=$INSTDIR\bin;%PATH%&cd /d "$INSTDIR\bin"'
|
||||
CreateDirectory "$SMPROGRAMS\smartmontools\smartctl Examples"
|
||||
@ -273,10 +291,10 @@ Section "Start Menu Shortcuts" MENU_SECTION
|
||||
!insertmacro CreateAdminShortCut "$SMPROGRAMS\smartmontools\smartctl Examples\Stop(Abort) selftest (-X).lnk" "$INSTDIR\bin\runcmdu.exe" "smartctl -X sda"
|
||||
!insertmacro CreateAdminShortCut "$SMPROGRAMS\smartmontools\smartctl Examples\Turn SMART off (-s off).lnk" "$INSTDIR\bin\runcmdu.exe" "smartctl -s off sda"
|
||||
!insertmacro CreateAdminShortCut "$SMPROGRAMS\smartmontools\smartctl Examples\Turn SMART on (-s on).lnk" "$INSTDIR\bin\runcmdu.exe" "smartctl -s on sda"
|
||||
noctl:
|
||||
${EndIf}
|
||||
|
||||
; smartd
|
||||
IfFileExists "$INSTDIR\bin\smartd.exe" 0 nod
|
||||
${If} ${FileExists} "$INSTDIR\bin\smartd.exe"
|
||||
SetOutPath "$INSTDIR\bin"
|
||||
CreateDirectory "$SMPROGRAMS\smartmontools\smartd Examples"
|
||||
!insertmacro CreateAdminShortCut "$SMPROGRAMS\smartmontools\smartd Examples\Daemon start, smartd.log.lnk" "$INSTDIR\bin\runcmdu.exe" "smartd -l local0"
|
||||
@ -295,10 +313,10 @@ Section "Start Menu Shortcuts" MENU_SECTION
|
||||
!insertmacro CreateAdminShortCut "$SMPROGRAMS\smartmontools\smartd Examples\Service remove.lnk" "$INSTDIR\bin\runcmdu.exe" "smartd remove"
|
||||
!insertmacro CreateAdminShortCut "$SMPROGRAMS\smartmontools\smartd Examples\Service start.lnk" "$INSTDIR\bin\runcmdu.exe" "net start smartd"
|
||||
!insertmacro CreateAdminShortCut "$SMPROGRAMS\smartmontools\smartd Examples\Service stop.lnk" "$INSTDIR\bin\runcmdu.exe" "net stop smartd"
|
||||
nod:
|
||||
${EndIf}
|
||||
|
||||
; Documentation
|
||||
IfFileExists "$INSTDIR\doc\README.TXT" 0 nodoc
|
||||
${If} ${FileExists} "$INSTDIR\doc\README.TXT"
|
||||
SetOutPath "$INSTDIR\doc"
|
||||
CreateDirectory "$SMPROGRAMS\smartmontools\Documentation"
|
||||
CreateShortCut "$SMPROGRAMS\smartmontools\Documentation\smartctl manual page (html).lnk" "$INSTDIR\doc\smartctl.8.html"
|
||||
@ -308,36 +326,36 @@ Section "Start Menu Shortcuts" MENU_SECTION
|
||||
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 sample.lnk" "$EDITOR" "$INSTDIR\doc\smartd.conf"
|
||||
IfFileExists "$INSTDIR\bin\drivedb.h" 0 nodb
|
||||
${If} ${FileExists} "$INSTDIR\bin\drivedb.h"
|
||||
CreateShortCut "$SMPROGRAMS\smartmontools\Documentation\drivedb.h (view).lnk" "$EDITOR" "$INSTDIR\bin\drivedb.h"
|
||||
!insertmacro CreateAdminShortCut "$SMPROGRAMS\smartmontools\Documentation\drivedb-add.h (create, edit).lnk" "$EDITOR" "$INSTDIR\bin\drivedb-add.h"
|
||||
nodb:
|
||||
${EndIf}
|
||||
CreateShortCut "$SMPROGRAMS\smartmontools\Documentation\ChangeLog.lnk" "$INSTDIR\doc\ChangeLog.txt"
|
||||
CreateShortCut "$SMPROGRAMS\smartmontools\Documentation\COPYING.lnk" "$INSTDIR\doc\COPYING.txt"
|
||||
CreateShortCut "$SMPROGRAMS\smartmontools\Documentation\NEWS.lnk" "$INSTDIR\doc\NEWS.txt"
|
||||
CreateShortCut "$SMPROGRAMS\smartmontools\Documentation\Windows version download page.lnk" "http://smartmontools.no-ip.org/"
|
||||
nodoc:
|
||||
${EndIf}
|
||||
|
||||
; Homepage
|
||||
CreateShortCut "$SMPROGRAMS\smartmontools\smartmontools Home Page.lnk" "http://www.smartmontools.org/"
|
||||
CreateShortCut "$SMPROGRAMS\smartmontools\smartmontools Home Page.lnk" "https://www.smartmontools.org/"
|
||||
CreateShortCut "$SMPROGRAMS\smartmontools\smartmontools Daily Builds.lnk" "http://builds.smartmontools.org/"
|
||||
|
||||
; drivedb.h update
|
||||
IfFileExists "$INSTDIR\bin\update-smart-drivedb.exe" 0 noupdb
|
||||
${If} ${FileExists} "$INSTDIR\bin\update-smart-drivedb.exe"
|
||||
SetOutPath "$INSTDIR\bin"
|
||||
!insertmacro CreateAdminShortCut "$SMPROGRAMS\smartmontools\drivedb.h update.lnk" "$INSTDIR\bin\update-smart-drivedb.exe" ""
|
||||
noupdb:
|
||||
${EndIf}
|
||||
|
||||
; Uninstall
|
||||
IfFileExists "$INSTDIR\uninst-smartmontools.exe" 0 noinst
|
||||
${If} ${FileExists} "$INSTDIR\uninst-smartmontools.exe"
|
||||
SetOutPath "$INSTDIR"
|
||||
!insertmacro CreateAdminShortCut "$SMPROGRAMS\smartmontools\Uninstall smartmontools.lnk" "$INSTDIR\uninst-smartmontools.exe" ""
|
||||
noinst:
|
||||
${EndIf}
|
||||
|
||||
SectionEnd
|
||||
|
||||
Section "Add install dir to PATH" PATH_SECTION
|
||||
|
||||
SectionIn 1
|
||||
SectionIn ${FULL_TYPES}
|
||||
|
||||
Push "$INSTDIR\bin"
|
||||
Call AddToPath
|
||||
@ -357,13 +375,13 @@ SectionGroup "Add smartctl to drive menu"
|
||||
!macroend
|
||||
|
||||
Section "Remove existing entries first" DRIVE_REMOVE_SECTION
|
||||
SectionIn 3
|
||||
SectionIn ${DRIVEMENU_TYPE}
|
||||
!insertmacro DriveMenuRemove
|
||||
SectionEnd
|
||||
|
||||
!macro DriveSection id name args
|
||||
Section 'smartctl ${args} ...' DRIVE_${id}_SECTION
|
||||
SectionIn 3
|
||||
SectionIn ${DRIVEMENU_TYPE}
|
||||
Call CheckRunCmdA
|
||||
DetailPrint 'Add drive menu entry "${name}": smartctl ${args} ...'
|
||||
WriteRegStr HKCR "Drive\shell\smartctl${id}" "" "${name}"
|
||||
@ -385,37 +403,40 @@ SectionGroupEnd
|
||||
Section "Uninstall"
|
||||
|
||||
; Stop & remove service
|
||||
IfFileExists "$INSTDIR\bin\smartd.exe" 0 nosrv
|
||||
${If} ${FileExists} "$INSTDIR\bin\smartd.exe"
|
||||
ReadRegStr $0 HKLM "System\CurrentControlSet\Services\smartd" "ImagePath"
|
||||
StrCmp $0 "" nosrv
|
||||
${If} $0 != ""
|
||||
ExecWait "net stop smartd"
|
||||
MessageBox MB_YESNO|MB_ICONQUESTION|MB_DEFBUTTON2 "Remove smartd service ?" /SD IDNO IDYES 0 IDNO nosrv
|
||||
MessageBox MB_YESNO|MB_ICONQUESTION|MB_DEFBUTTON2 "Remove smartd service ?" /SD IDNO IDYES 0 IDNO +2
|
||||
ExecWait "$INSTDIR\bin\smartd.exe remove"
|
||||
nosrv:
|
||||
${EndIf}
|
||||
${EndIf}
|
||||
|
||||
; Remove installer registry keys
|
||||
DeleteRegKey HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\smartmontools"
|
||||
DeleteRegKey HKLM "Software\smartmontools"
|
||||
|
||||
; Remove conf file ?
|
||||
IfFileExists "$INSTDIR\bin\smartd.conf" 0 noconf
|
||||
${If} ${FileExists} "$INSTDIR\bin\smartd.conf"
|
||||
; Assume unchanged if timestamp is equal to sample file
|
||||
GetFileTime "$INSTDIR\bin\smartd.conf" $0 $1
|
||||
GetFileTime "$INSTDIR\doc\smartd.conf" $2 $3
|
||||
StrCmp "$0:$1" "$2:$3" +2 0
|
||||
MessageBox MB_YESNO|MB_ICONQUESTION|MB_DEFBUTTON2 "Delete configuration file$\n$INSTDIR\bin\smartd.conf ?" /SD IDNO IDYES 0 IDNO noconf
|
||||
MessageBox MB_YESNO|MB_ICONQUESTION|MB_DEFBUTTON2 "Delete configuration file$\n$INSTDIR\bin\smartd.conf ?" /SD IDNO IDYES 0 IDNO +2
|
||||
Delete "$INSTDIR\bin\smartd.conf"
|
||||
noconf:
|
||||
${EndIf}
|
||||
|
||||
; Remove log file ?
|
||||
IfFileExists "$INSTDIR\bin\smartd.log" 0 +3
|
||||
${If} ${FileExists} "$INSTDIR\bin\smartd.log"
|
||||
MessageBox MB_YESNO|MB_ICONQUESTION|MB_DEFBUTTON2 "Delete log file$\n$INSTDIR\bin\smartd.log ?" /SD IDNO IDYES 0 IDNO +2
|
||||
Delete "$INSTDIR\bin\smartd.log"
|
||||
${EndIf}
|
||||
|
||||
; Remove drivedb-add file ?
|
||||
IfFileExists "$INSTDIR\bin\drivedb-add.h" 0 +3
|
||||
${If} ${FileExists} "$INSTDIR\bin\drivedb-add.h"
|
||||
MessageBox MB_YESNO|MB_ICONQUESTION|MB_DEFBUTTON2 "Delete local drive database file$\n$INSTDIR\bin\drivedb-add.h ?" /SD IDNO IDYES 0 IDNO +2
|
||||
Delete "$INSTDIR\bin\drivedb-add.h"
|
||||
${EndIf}
|
||||
|
||||
; Remove files
|
||||
Delete "$INSTDIR\bin\smartctl.exe"
|
||||
@ -431,9 +452,9 @@ Section "Uninstall"
|
||||
Delete "$INSTDIR\bin\smartd-run.bat"
|
||||
Delete "$INSTDIR\bin\net-run.bat"
|
||||
Delete "$INSTDIR\bin\runcmda.exe"
|
||||
Delete "$INSTDIR\bin\runcmda.exe.manifest"
|
||||
Delete "$INSTDIR\bin\runcmda.exe.manifest" ; TODO: Remove after smartmontools 6.5
|
||||
Delete "$INSTDIR\bin\runcmdu.exe"
|
||||
Delete "$INSTDIR\bin\runcmdu.exe.manifest"
|
||||
Delete "$INSTDIR\bin\runcmdu.exe.manifest" ; TODO: Remove after smartmontools 6.5
|
||||
Delete "$INSTDIR\bin\wtssendmsg.exe"
|
||||
Delete "$INSTDIR\doc\AUTHORS.txt"
|
||||
Delete "$INSTDIR\doc\ChangeLog.txt"
|
||||
@ -477,14 +498,15 @@ Section "Uninstall"
|
||||
!insertmacro DriveMenuRemove
|
||||
|
||||
; Check for still existing entries
|
||||
IfFileExists "$INSTDIR\bin\smartd.exe" 0 +3
|
||||
${If} ${FileExists} "$INSTDIR\bin\smartd.exe"
|
||||
MessageBox MB_OK|MB_ICONEXCLAMATION "$INSTDIR\bin\smartd.exe could not be removed.$\nsmartd is possibly still running." /SD IDOK
|
||||
Goto +3
|
||||
IfFileExists "$INSTDIR" 0 +2
|
||||
${ElseIf} ${FileExists} "$INSTDIR"
|
||||
MessageBox MB_OK "Note: $INSTDIR could not be removed." /SD IDOK
|
||||
${EndIf}
|
||||
|
||||
IfFileExists "$SMPROGRAMS\smartmontools" 0 +2
|
||||
${If} ${FileExists} "$SMPROGRAMS\smartmontools"
|
||||
MessageBox MB_OK "Note: $SMPROGRAMS\smartmontools could not be removed." /SD IDOK
|
||||
${EndIf}
|
||||
|
||||
SectionEnd
|
||||
|
||||
@ -500,19 +522,32 @@ SectionEnd
|
||||
Function .onInit
|
||||
|
||||
; Set default install directories
|
||||
StrCmp $INSTDIR "" 0 endinst ; /D=PATH option specified ?
|
||||
ReadRegStr $INSTDIR HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\smartmontools" "InstallLocation"
|
||||
StrCmp $INSTDIR "" 0 endinst ; Already installed ?
|
||||
ReadRegStr $INSTDIR HKLM "Software\smartmontools" "Install_Dir"
|
||||
StrCmp $INSTDIR "" 0 endinst ; Already installed ?
|
||||
StrCpy $INSTDIR "$PROGRAMFILES\smartmontools"
|
||||
${If} $INSTDIR == "" ; /D=PATH option not specified ?
|
||||
ReadRegStr $INSTDIR HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\smartmontools" "InstallLocation"
|
||||
${If} $INSTDIR == "" ; Not already installed ?
|
||||
ReadRegStr $INSTDIR HKLM "Software\smartmontools" "Install_Dir"
|
||||
${If} $INSTDIR == "" ; Not already installed (smartmontools < r3911/6.3) ?
|
||||
StrCpy $INSTDIR "$PROGRAMFILES\smartmontools"
|
||||
!ifdef INPDIR64
|
||||
StrCpy $INSTDIR32 $INSTDIR
|
||||
StrCpy $INSTDIR64 "$PROGRAMFILES64\smartmontools"
|
||||
StrCpy $INSTDIR32 $INSTDIR
|
||||
StrCpy $INSTDIR64 "$PROGRAMFILES64\smartmontools"
|
||||
!endif
|
||||
endinst:
|
||||
${EndIf}
|
||||
${EndIf}
|
||||
${EndIf}
|
||||
|
||||
!ifdef INPDIR64
|
||||
; Check for 64-bit unless already installed in 32-bit location
|
||||
${If} $INSTDIR64 != ""
|
||||
${OrIf} $INSTDIR != "$PROGRAMFILES\smartmontools"
|
||||
; $1 = IsWow64Process(GetCurrentProcess(), ($0=FALSE, &$0))
|
||||
System::Call "kernel32::GetCurrentProcess() i.s"
|
||||
System::Call "kernel32::IsWow64Process(i s, *i 0 r0) i.r1"
|
||||
${If} "$0 $1" == "1 1" ; 64-bit Windows ?
|
||||
!insertmacro SelectSection ${X64_SECTION}
|
||||
${EndIf}
|
||||
${EndIf}
|
||||
|
||||
; Sizes of binary sections include 32-bit and 64-bit executables
|
||||
!insertmacro AdjustSectionSize ${SMARTCTL_SECTION}
|
||||
!insertmacro AdjustSectionSize ${SMARTD_SECTION}
|
||||
@ -521,47 +556,57 @@ Function .onInit
|
||||
|
||||
; Use Notepad++ if installed
|
||||
StrCpy $EDITOR "$PROGRAMFILES\Notepad++\notepad++.exe"
|
||||
IfFileExists "$EDITOR" +2 0
|
||||
${IfNot} ${FileExists} "$EDITOR"
|
||||
StrCpy $EDITOR "notepad.exe"
|
||||
${EndIf}
|
||||
|
||||
Call ParseCmdLine
|
||||
|
||||
!ifdef INPDIR64
|
||||
Call CheckX64
|
||||
!endif
|
||||
FunctionEnd
|
||||
|
||||
; Check x64 section and update INSTDIR accordingly
|
||||
|
||||
!ifdef INPDIR64
|
||||
Function CheckX64
|
||||
SectionGetFlags ${X64_SECTION} $0
|
||||
IntOp $0 $0 & ${SF_SELECTED}
|
||||
IntCmp $0 ${SF_SELECTED} x64
|
||||
${IfNot} ${SectionIsSelected} ${X64_SECTION}
|
||||
StrCpy $X64 ""
|
||||
StrCmp $INSTDIR32 "" +3
|
||||
${If} $INSTDIR32 != ""
|
||||
${AndIf} $INSTDIR == $INSTDIR64
|
||||
StrCpy $INSTDIR $INSTDIR32
|
||||
StrCpy $INSTDIR32 ""
|
||||
Goto done
|
||||
x64:
|
||||
${EndIf}
|
||||
${Else}
|
||||
StrCpy $X64 "t"
|
||||
StrCmp $INSTDIR64 "" +3
|
||||
${If} $INSTDIR64 != ""
|
||||
${AndIf} $INSTDIR == $INSTDIR32
|
||||
StrCpy $INSTDIR $INSTDIR64
|
||||
StrCpy $INSTDIR64 ""
|
||||
done:
|
||||
${EndIf}
|
||||
${EndIf}
|
||||
FunctionEnd
|
||||
!endif
|
||||
|
||||
; Command line parsing
|
||||
!macro CheckCmdLineOption name section
|
||||
StrCpy $allopts "$allopts,${name}"
|
||||
|
||||
!macro GetCmdLineOption var name
|
||||
Push ",$opts,"
|
||||
Push ",${name},"
|
||||
Call StrStr
|
||||
Pop $0
|
||||
StrCmp $0 "" 0 sel_${name}
|
||||
!insertmacro UnselectSection ${section}
|
||||
Goto done_${name}
|
||||
sel_${name}:
|
||||
!insertmacro SelectSection ${section}
|
||||
StrCpy $nomatch ""
|
||||
done_${name}:
|
||||
Pop ${var}
|
||||
${If} ${var} != ""
|
||||
StrCpy $nomatch ""
|
||||
${EndIf}
|
||||
!macroend
|
||||
|
||||
!macro CheckCmdLineOption name section
|
||||
StrCpy $allopts "$allopts,${name}"
|
||||
!insertmacro GetCmdLineOption $0 ${name}
|
||||
${If} $0 == ""
|
||||
!insertmacro UnselectSection ${section}
|
||||
${Else}
|
||||
!insertmacro SelectSection ${section}
|
||||
${EndIf}
|
||||
!macroend
|
||||
|
||||
Function ParseCmdLine
|
||||
@ -569,19 +614,30 @@ Function ParseCmdLine
|
||||
Var /global opts
|
||||
${GetParameters} $R0
|
||||
${GetOptions} $R0 "/SO" $opts
|
||||
IfErrors 0 +2
|
||||
${If} ${Errors}
|
||||
Return
|
||||
${EndIf}
|
||||
Var /global allopts
|
||||
StrCpy $allopts ""
|
||||
Var /global nomatch
|
||||
StrCpy $nomatch "t"
|
||||
; turn sections on or off
|
||||
!ifdef INPDIR64
|
||||
!insertmacro CheckCmdLineOption "x64" ${X64_SECTION}
|
||||
Call CheckX64
|
||||
StrCmp $opts "x64" 0 +2
|
||||
Return ; leave sections unchanged if only "x64" is specified
|
||||
; Change previous 64-bit setting
|
||||
StrCpy $allopts ",x32|x64"
|
||||
!insertmacro GetCmdLineOption $0 "x32"
|
||||
${If} $0 != ""
|
||||
!insertmacro UnselectSection ${X64_SECTION}
|
||||
${EndIf}
|
||||
!insertmacro GetCmdLineOption $0 "x64"
|
||||
${If} $0 != ""
|
||||
!insertmacro SelectSection ${X64_SECTION}
|
||||
${EndIf}
|
||||
; Leave other sections unchanged if only "x32" or "x64" is specified
|
||||
${If} $opts == "x32"
|
||||
${OrIf} $opts == "x64"
|
||||
Return
|
||||
${EndIf}
|
||||
!endif
|
||||
; Turn sections on or off
|
||||
!insertmacro CheckCmdLineOption "smartctl" ${SMARTCTL_SECTION}
|
||||
!insertmacro CheckCmdLineOption "smartd" ${SMARTD_SECTION}
|
||||
!insertmacro CheckCmdLineOption "smartctlnc" ${SMARTCTL_NC_SECTION}
|
||||
@ -597,22 +653,25 @@ Function ParseCmdLine
|
||||
!insertmacro CheckCmdLineOption "drive3" ${DRIVE_3_SECTION}
|
||||
!insertmacro CheckCmdLineOption "drive4" ${DRIVE_4_SECTION}
|
||||
!insertmacro CheckCmdLineOption "drive5" ${DRIVE_5_SECTION}
|
||||
StrCmp $opts "-" done
|
||||
StrCmp $nomatch "" done
|
||||
StrCpy $0 "$allopts,-" "" 1
|
||||
MessageBox MB_OK "Usage: smartmontools-VERSION.win32-setup [/S] [/SO component,...] [/D=INSTDIR]$\n$\ncomponents:$\n $0"
|
||||
Abort
|
||||
done:
|
||||
${If} $opts != "-"
|
||||
${If} $nomatch != ""
|
||||
StrCpy $0 "$allopts,-" "" 1
|
||||
MessageBox MB_OK "Usage: smartmontools-VERSION.win32-setup [/S] [/SO component,...] [/D=INSTDIR]$\n$\ncomponents:$\n $0"
|
||||
Abort
|
||||
${EndIf}
|
||||
${EndIf}
|
||||
FunctionEnd
|
||||
|
||||
; Install runcmda.exe if missing
|
||||
; Install runcmda.exe only once
|
||||
|
||||
Function CheckRunCmdA
|
||||
IfFileExists "$INSTDIR\bin\runcmda.exe" done 0
|
||||
Var /global runcmda
|
||||
${If} $runcmda == ""
|
||||
StrCpy $runcmda "t"
|
||||
SetOutPath "$INSTDIR\bin"
|
||||
!insertmacro FileExe "bin\runcmda.exe" ""
|
||||
File "${INPDIR}\bin\runcmda.exe.manifest"
|
||||
done:
|
||||
Delete "$INSTDIR\bin\runcmda.exe.manifest" ; TODO: Remove after smartmontools 6.5
|
||||
${EndIf}
|
||||
FunctionEnd
|
||||
|
||||
|
||||
@ -658,16 +717,19 @@ Function AddToPath
|
||||
System::Call "advapi32::RegQueryValueEx(i $3, t'PATH', i 0, i 0, t.r1, *i ${NSIS_MAX_STRLEN} r2) i.r4"
|
||||
System::Call "advapi32::RegCloseKey(i $3)"
|
||||
|
||||
IntCmp $4 234 0 +4 +4 ; $4 == ERROR_MORE_DATA
|
||||
${If} $4 = 234 ; ERROR_MORE_DATA
|
||||
DetailPrint "AddToPath: original length $2 > ${NSIS_MAX_STRLEN}"
|
||||
MessageBox MB_OK "PATH not updated, original length $2 > ${NSIS_MAX_STRLEN}"
|
||||
MessageBox MB_OK "PATH not updated, original length $2 > ${NSIS_MAX_STRLEN}" /SD IDOK
|
||||
Goto done
|
||||
${EndIf}
|
||||
|
||||
IntCmp $4 0 +5 ; $4 != NO_ERROR
|
||||
IntCmp $4 2 +3 ; $4 != ERROR_FILE_NOT_FOUND
|
||||
${If} $4 <> 0 ; NO_ERROR
|
||||
${If} $4 <> 2 ; ERROR_FILE_NOT_FOUND
|
||||
DetailPrint "AddToPath: unexpected error code $4"
|
||||
Goto done
|
||||
${EndIf}
|
||||
StrCpy $1 ""
|
||||
${EndIf}
|
||||
|
||||
; Check if already in PATH
|
||||
Push "$1;"
|
||||
@ -686,18 +748,21 @@ Function AddToPath
|
||||
StrLen $3 $1
|
||||
IntOp $2 $2 + $3
|
||||
IntOp $2 $2 + 2 ; $2 = strlen(dir) + strlen(PATH) + sizeof(";")
|
||||
IntCmp $2 ${NSIS_MAX_STRLEN} +4 +4 0
|
||||
${If} $2 > ${NSIS_MAX_STRLEN}
|
||||
DetailPrint "AddToPath: new length $2 > ${NSIS_MAX_STRLEN}"
|
||||
MessageBox MB_OK "PATH not updated, new length $2 > ${NSIS_MAX_STRLEN}."
|
||||
MessageBox MB_OK "PATH not updated, new length $2 > ${NSIS_MAX_STRLEN}." /SD IDOK
|
||||
Goto done
|
||||
${EndIf}
|
||||
|
||||
; Append dir to PATH
|
||||
DetailPrint "Add to PATH: $0"
|
||||
StrCpy $2 $1 1 -1
|
||||
StrCmp $2 ";" 0 +2
|
||||
${If} $2 == ";"
|
||||
StrCpy $1 $1 -1 ; remove trailing ';'
|
||||
StrCmp $1 "" +2 ; no leading ';'
|
||||
${EndIf}
|
||||
${If} $1 != "" ; no leading ';'
|
||||
StrCpy $0 "$1;$0"
|
||||
${EndIf}
|
||||
WriteRegExpandStr ${Environ} "PATH" $0
|
||||
SendMessage ${HWND_BROADCAST} ${WM_WININICHANGE} 0 "STR:Environment" /TIMEOUT=5000
|
||||
|
||||
@ -727,8 +792,9 @@ Function un.RemoveFromPath
|
||||
|
||||
ReadRegStr $1 ${Environ} "PATH"
|
||||
StrCpy $5 $1 1 -1
|
||||
StrCmp $5 ";" +2
|
||||
${If} $5 != ";"
|
||||
StrCpy $1 "$1;" ; ensure trailing ';'
|
||||
${EndIf}
|
||||
Push $1
|
||||
Push "$0;"
|
||||
Call un.StrStr
|
||||
@ -742,8 +808,9 @@ Function un.RemoveFromPath
|
||||
StrCpy $6 $2 "" $3 ; $6 is now the part after the path to remove
|
||||
StrCpy $3 "$5$6"
|
||||
StrCpy $5 $3 1 -1
|
||||
StrCmp $5 ";" 0 +2
|
||||
${If} $5 == ";"
|
||||
StrCpy $3 $3 -1 ; remove trailing ';'
|
||||
${EndIf}
|
||||
WriteRegExpandStr ${Environ} "PATH" $3
|
||||
SendMessage ${HWND_BROADCAST} ${WM_WININICHANGE} 0 "STR:Environment" /TIMEOUT=5000
|
||||
|
||||
@ -778,13 +845,12 @@ Function ${un}StrStr
|
||||
StrCpy $R4 0
|
||||
; $R1=substring, $R2=string, $R3=strlen(substring)
|
||||
; $R4=count, $R5=tmp
|
||||
loop:
|
||||
${Do}
|
||||
StrCpy $R5 $R2 $R3 $R4
|
||||
StrCmp $R5 $R1 done
|
||||
StrCmp $R5 "" done
|
||||
${IfThen} $R5 == $R1 ${|} ${ExitDo} ${|}
|
||||
${IfThen} $R5 == "" ${|} ${ExitDo} ${|}
|
||||
IntOp $R4 $R4 + 1
|
||||
Goto loop
|
||||
done:
|
||||
${Loop}
|
||||
StrCpy $R1 $R2 "" $R4
|
||||
Pop $R5
|
||||
Pop $R4
|
||||
@ -804,8 +870,6 @@ FunctionEnd
|
||||
; 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}
|
||||
@ -852,5 +916,5 @@ Function ShellLinkSetRunAs
|
||||
${Else}
|
||||
DetailPrint "Set RunAsAdmin: $9"
|
||||
${EndIf}
|
||||
System::Store L ; push $0-$9, $R0-$R9
|
||||
System::Store L ; pop $R9-$R0, $9-$0
|
||||
FunctionEnd
|
||||
|
@ -1,7 +1,7 @@
|
||||
/*
|
||||
* Run console command and wait for user input
|
||||
*
|
||||
* Home page of code is: http://smartmontools.sourceforge.net
|
||||
* Home page of code is: http://www.smartmontools.org
|
||||
*
|
||||
* Copyright (C) 2011 Christian Franke <smartmontools-support@lists.sourceforge.net>
|
||||
*
|
||||
@ -15,7 +15,7 @@
|
||||
*
|
||||
*/
|
||||
|
||||
char svnid[] = "$Id: runcmd.c 3453 2011-10-16 12:45:27Z chrfranke $";
|
||||
char svnid[] = "$Id: runcmd.c 4120 2015-08-27 16:12:21Z samm2 $";
|
||||
|
||||
#include <stdio.h>
|
||||
#include <windows.h>
|
||||
|
@ -1,18 +0,0 @@
|
||||
<?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>
|
@ -1,18 +0,0 @@
|
||||
<?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>
|
@ -1,7 +1,7 @@
|
||||
/*
|
||||
* os_win32/syslog.h
|
||||
*
|
||||
* Home page of code is: http://smartmontools.sourceforge.net
|
||||
* Home page of code is: http://www.smartmontools.org
|
||||
*
|
||||
* Copyright (C) 2004-8 Christian Franke <smartmontools-support@lists.sourceforge.net>
|
||||
*
|
||||
@ -19,7 +19,7 @@
|
||||
#ifndef SYSLOG_H
|
||||
#define SYSLOG_H
|
||||
|
||||
#define SYSLOG_H_CVSID "$Id: syslog.h 3728 2012-12-13 17:57:50Z chrfranke $\n"
|
||||
#define SYSLOG_H_CVSID "$Id: syslog.h 4120 2015-08-27 16:12:21Z samm2 $\n"
|
||||
|
||||
#include <stdarg.h>
|
||||
|
||||
|
@ -1,9 +1,9 @@
|
||||
/*
|
||||
* os_win32/syslog_win32.cpp
|
||||
*
|
||||
* Home page of code is: http://smartmontools.sourceforge.net
|
||||
* Home page of code is: http://www.smartmontools.org
|
||||
*
|
||||
* Copyright (C) 2004-12 Christian Franke <smartmontools-support@lists.sourceforge.net>
|
||||
* Copyright (C) 2004-15 Christian Franke
|
||||
*
|
||||
* 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
|
||||
@ -33,7 +33,7 @@
|
||||
#define WIN32_LEAN_AND_MEAN
|
||||
#include <windows.h> // RegisterEventSourceA(), ReportEventA(), ...
|
||||
|
||||
const char *syslog_win32_cpp_cvsid = "$Id: syslog_win32.cpp 3575 2012-07-19 21:32:56Z chrfranke $"
|
||||
const char *syslog_win32_cpp_cvsid = "$Id: syslog_win32.cpp 4149 2015-10-17 15:38:01Z chrfranke $"
|
||||
SYSLOG_H_CVSID;
|
||||
|
||||
#ifdef _MSC_VER
|
||||
@ -420,7 +420,7 @@ int main(int argc, char* argv[])
|
||||
if (i % 13 == 0)
|
||||
Sleep(1000L);
|
||||
sprintf(buf, "Log Line %d\n", i);
|
||||
syslog(i % 17 ? LOG_INFO : LOG_ERR, buf);
|
||||
syslog((i % 17) ? LOG_INFO : LOG_ERR, buf);
|
||||
}
|
||||
closelog();
|
||||
return 0;
|
||||
|
@ -1,7 +1,7 @@
|
||||
;/*
|
||||
; * os_win32/syslogevt.mc
|
||||
; *
|
||||
; * Home page of code is: http://smartmontools.sourceforge.net
|
||||
; * Home page of code is: http://www.smartmontools.org
|
||||
; *
|
||||
; * Copyright (C) 2004-10 Christian Franke <smartmontools-support@lists.sourceforge.net>
|
||||
; *
|
||||
@ -16,7 +16,7 @@
|
||||
; *
|
||||
; */
|
||||
;
|
||||
;// $Id: syslogevt.mc 3727 2012-12-13 17:23:06Z samm2 $
|
||||
;// $Id: syslogevt.mc 4120 2015-08-27 16:12:21Z samm2 $
|
||||
;
|
||||
;// Use message compiler "mc" or "windmc" to generate
|
||||
;// syslogevt.rc, syslogevt.h, msg00001.bin
|
||||
|
@ -1,7 +1,7 @@
|
||||
;
|
||||
; smartmontools drive database update NSIS script
|
||||
;
|
||||
; Home page of code is: http://smartmontools.sourceforge.net
|
||||
; Home page of code is: http://www.smartmontools.org
|
||||
;
|
||||
; Copyright (C) 2011-13 Christian Franke <smartmontools-support@lists.sourceforge.net>
|
||||
;
|
||||
@ -13,7 +13,7 @@
|
||||
; You should have received a copy of the GNU General Public License
|
||||
; (for example COPYING); If not, see <http://www.gnu.org/licenses/>.
|
||||
;
|
||||
; $Id: update-smart-drivedb.nsi 3815 2013-06-06 17:31:59Z chrfranke $
|
||||
; $Id: update-smart-drivedb.nsi 4120 2015-08-27 16:12:21Z samm2 $
|
||||
;
|
||||
|
||||
|
||||
|
@ -1,7 +1,7 @@
|
||||
/*
|
||||
* os_win32/wbemcli_small.h
|
||||
*
|
||||
* Home page of code is: http://smartmontools.sourceforge.net
|
||||
* Home page of code is: http://www.smartmontools.org
|
||||
*
|
||||
* This file was extracted from wbemcli.h of the w64 mingw-runtime package
|
||||
* (http://mingw-w64.sourceforge.net/). See original copyright below.
|
||||
|
@ -1,7 +1,7 @@
|
||||
/*
|
||||
* os_win32/wmiquery.cpp
|
||||
*
|
||||
* Home page of code is: http://smartmontools.sourceforge.net
|
||||
* Home page of code is: http://www.smartmontools.org
|
||||
*
|
||||
* Copyright (C) 2011-13 Christian Franke <smartmontools-support@lists.sourceforge.net>
|
||||
*
|
||||
@ -23,7 +23,7 @@
|
||||
|
||||
#include <stdio.h>
|
||||
|
||||
const char * wmiquery_cpp_cvsid = "$Id: wmiquery.cpp 3802 2013-03-24 18:36:21Z chrfranke $"
|
||||
const char * wmiquery_cpp_cvsid = "$Id: wmiquery.cpp 4120 2015-08-27 16:12:21Z samm2 $"
|
||||
WMIQUERY_H_CVSID;
|
||||
|
||||
|
||||
|
@ -1,9 +1,9 @@
|
||||
/*
|
||||
* os_win32/wmiquery.h
|
||||
*
|
||||
* Home page of code is: http://smartmontools.sourceforge.net
|
||||
* Home page of code is: http://www.smartmontools.org
|
||||
*
|
||||
* Copyright (C) 2011 Christian Franke <smartmontools-support@lists.sourceforge.net>
|
||||
* Copyright (C) 2011-15 Christian Franke
|
||||
*
|
||||
* 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
|
||||
@ -18,7 +18,7 @@
|
||||
#ifndef WMIQUERY_H
|
||||
#define WMIQUERY_H
|
||||
|
||||
#define WMIQUERY_H_CVSID "$Id: wmiquery.h 3475 2011-11-10 21:43:40Z chrfranke $"
|
||||
#define WMIQUERY_H_CVSID "$Id: wmiquery.h 4152 2015-10-17 16:08:21Z chrfranke $"
|
||||
|
||||
#ifdef HAVE_WBEMCLI_H
|
||||
#include <wbemcli.h>
|
||||
@ -45,7 +45,7 @@ class com_bstr
|
||||
{
|
||||
public:
|
||||
/// Construct from string.
|
||||
com_bstr(const char * str);
|
||||
explicit com_bstr(const char * str);
|
||||
|
||||
/// Destructor frees BSTR.
|
||||
~com_bstr()
|
||||
|
@ -1,7 +1,7 @@
|
||||
/*
|
||||
* WTSSendMessage() command line tool
|
||||
*
|
||||
* Home page of code is: http://smartmontools.sourceforge.net
|
||||
* Home page of code is: http://www.smartmontools.org
|
||||
*
|
||||
* Copyright (C) 2012 Christian Franke <smartmontools-support@lists.sourceforge.net>
|
||||
*
|
||||
@ -18,7 +18,7 @@
|
||||
#define WINVER 0x0500
|
||||
#define _WIN32_WINNT WINVER
|
||||
|
||||
char svnid[] = "$Id: wtssendmsg.c 3714 2012-11-24 16:34:47Z chrfranke $";
|
||||
char svnid[] = "$Id: wtssendmsg.c 4120 2015-08-27 16:12:21Z samm2 $";
|
||||
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
@ -30,7 +30,7 @@ char svnid[] = "$Id: wtssendmsg.c 3714 2012-11-24 16:34:47Z chrfranke $";
|
||||
|
||||
static int usage()
|
||||
{
|
||||
printf("wtssendmsg $Revision: 3714 $ - Display a message box on client desktops\n"
|
||||
printf("wtssendmsg $Revision: 4120 $ - Display a message box on client desktops\n"
|
||||
"Copyright (C) 2012 Christian Franke, smartmontools.org\n\n"
|
||||
"Usage: wtssendmsg [-cas] [-v] [\"Caption\"] \"Message\"|-\n"
|
||||
" wtssendmsg -v\n\n"
|
||||
|
21
scsiata.cpp
21
scsiata.cpp
@ -1,10 +1,10 @@
|
||||
/*
|
||||
* scsiata.cpp
|
||||
*
|
||||
* Home page of code is: http://smartmontools.sourceforge.net
|
||||
* Home page of code is: http://www.smartmontools.org
|
||||
*
|
||||
* Copyright (C) 2006-12 Douglas Gilbert <dgilbert@interlog.com>
|
||||
* Copyright (C) 2009-13 Christian Franke <smartmontools-support@lists.sourceforge.net>
|
||||
* Copyright (C) 2006-15 Douglas Gilbert <dgilbert@interlog.com>
|
||||
* Copyright (C) 2009-15 Christian Franke
|
||||
*
|
||||
* 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
|
||||
@ -62,7 +62,7 @@
|
||||
#include "dev_ata_cmd_set.h" // ata_device_with_command_set
|
||||
#include "dev_tunnelled.h" // tunnelled_device<>
|
||||
|
||||
const char * scsiata_cpp_cvsid = "$Id: scsiata.cpp 4041 2015-03-14 00:50:20Z dpgilbert $";
|
||||
const char * scsiata_cpp_cvsid = "$Id: scsiata.cpp 4130 2015-09-25 15:08:06Z chrfranke $";
|
||||
|
||||
/* This is a slightly stretched SCSI sense "descriptor" format header.
|
||||
The addition is to allow the 0x70 and 0x71 response codes. The idea
|
||||
@ -394,6 +394,16 @@ bool sat_device::ata_pass_through(const ata_cmd_in & in, ata_cmd_out & out)
|
||||
}
|
||||
scsi_do_sense_disect(&io_hdr, &sinfo);
|
||||
int status = scsiSimpleSenseFilter(&sinfo);
|
||||
|
||||
// Workaround for bogus sense_key in sense data with SAT ATA Return Descriptor
|
||||
if ( status && ck_cond && ardp && ard_len > 13
|
||||
&& (ardp[13] & 0xc1) == 0x40 /* !BSY && DRDY && !ERR */) {
|
||||
if (scsi_debugmode > 0)
|
||||
pout("ATA status (0x%02x) indicates success, ignoring SCSI sense_key\n",
|
||||
ardp[13]);
|
||||
status = 0;
|
||||
}
|
||||
|
||||
if (0 != status) { /* other than no_sense and recovered_error */
|
||||
if (scsi_debugmode > 0) {
|
||||
pout("sat_device::ata_pass_through: scsi error: %s\n",
|
||||
@ -433,7 +443,8 @@ bool sat_device::ata_pass_through(const ata_cmd_in & in, ata_cmd_out & out)
|
||||
}
|
||||
} else if ((! sense_descriptor) &&
|
||||
(0 == ssh.asc) &&
|
||||
(SCSI_ASCQ_ATA_PASS_THROUGH == ssh.ascq)) {
|
||||
(SCSI_ASCQ_ATA_PASS_THROUGH == ssh.ascq) &&
|
||||
(0 != io_hdr.sensep[4] /* Some ATA STATUS bit must be set */)) {
|
||||
/* in SAT-2 and later, ATA registers may be passed back via
|
||||
* fixed format sense data [ref: sat3r07 section 12.2.2.7] */
|
||||
ata_out_regs & lo = out.out_regs;
|
||||
|
174
scsicmds.cpp
174
scsicmds.cpp
@ -1,12 +1,10 @@
|
||||
/*
|
||||
* scsicmds.cpp
|
||||
*
|
||||
* Home page of code is: http://smartmontools.sourceforge.net
|
||||
* Home page of code is: http://www.smartmontools.org
|
||||
*
|
||||
* Copyright (C) 2002-8 Bruce Allen
|
||||
* Copyright (C) 1999-2000 Michael Cornwell <cornwell@acm.org>
|
||||
*
|
||||
* Additional SCSI work:
|
||||
* Copyright (C) 2003-15 Douglas Gilbert <dgilbert@interlog.com>
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
@ -49,7 +47,7 @@
|
||||
#include "dev_interface.h"
|
||||
#include "utility.h"
|
||||
|
||||
const char *scsicmds_c_cvsid="$Id: scsicmds.cpp 4081 2015-05-10 16:42:50Z chrfranke $"
|
||||
const char *scsicmds_c_cvsid="$Id: scsicmds.cpp 4157 2015-10-20 16:03:57Z chrfranke $"
|
||||
SCSICMDS_H_CVSID;
|
||||
|
||||
// Print SCSI debug messages?
|
||||
@ -61,13 +59,11 @@ supported_vpd_pages * supported_vpd_pages_p = NULL;
|
||||
supported_vpd_pages::supported_vpd_pages(scsi_device * device) : num_valid(0)
|
||||
{
|
||||
unsigned char b[0xfc]; /* pre SPC-3 INQUIRY max response size */
|
||||
int n;
|
||||
|
||||
memset(b, 0, sizeof(b));
|
||||
if (device && (0 == scsiInquiryVpd(device, SCSI_VPD_SUPPORTED_VPD_PAGES,
|
||||
b, sizeof(b)))) {
|
||||
num_valid = (b[2] << 8) + b[3];
|
||||
n = sizeof(pages);
|
||||
int n = sizeof(pages);
|
||||
if (num_valid > n)
|
||||
num_valid = n;
|
||||
memcpy(pages, b + 4, num_valid);
|
||||
@ -91,7 +87,6 @@ void
|
||||
dStrHex(const char* str, int len, int no_ascii)
|
||||
{
|
||||
const char* p = str;
|
||||
unsigned char c;
|
||||
char buff[82];
|
||||
int a = 0;
|
||||
const int bpstart = 5;
|
||||
@ -110,7 +105,7 @@ dStrHex(const char* str, int len, int no_ascii)
|
||||
|
||||
for(i = 0; i < len; i++)
|
||||
{
|
||||
c = *p++;
|
||||
unsigned char c = *p++;
|
||||
bpos += 3;
|
||||
if (bpos == (bpstart + (9 * 3)))
|
||||
bpos++;
|
||||
@ -175,14 +170,12 @@ static const char * vendor_specific = "<vendor specific>";
|
||||
const char *
|
||||
scsi_get_opcode_name(UINT8 opcode)
|
||||
{
|
||||
int k;
|
||||
int len = sizeof(opcode_name_arr) / sizeof(opcode_name_arr[0]);
|
||||
struct scsi_opcode_name * onp;
|
||||
|
||||
if (opcode >= 0xc0)
|
||||
return vendor_specific;
|
||||
for (k = 0; k < len; ++k) {
|
||||
onp = &opcode_name_arr[k];
|
||||
for (int k = 0; k < len; ++k) {
|
||||
struct scsi_opcode_name * onp = &opcode_name_arr[k];
|
||||
if (opcode == onp->opcode)
|
||||
return onp->name;
|
||||
else if (opcode < onp->opcode)
|
||||
@ -195,11 +188,9 @@ void
|
||||
scsi_do_sense_disect(const struct scsi_cmnd_io * io_buf,
|
||||
struct scsi_sense_disect * out)
|
||||
{
|
||||
int resp_code;
|
||||
|
||||
memset(out, 0, sizeof(struct scsi_sense_disect));
|
||||
if (SCSI_STATUS_CHECK_CONDITION == io_buf->scsi_status) {
|
||||
resp_code = (io_buf->sensep[0] & 0x7f);
|
||||
int resp_code = (io_buf->sensep[0] & 0x7f);
|
||||
out->resp_code = resp_code;
|
||||
if (resp_code >= 0x72) {
|
||||
out->sense_key = (io_buf->sensep[1] & 0xf);
|
||||
@ -302,19 +293,19 @@ scsi_vpd_dev_id_iter(const unsigned char * initial_desig_desc, int page_len,
|
||||
int * off, int m_assoc, int m_desig_type, int m_code_set)
|
||||
{
|
||||
const unsigned char * ucp;
|
||||
int k, c_set, assoc, desig_type;
|
||||
int k;
|
||||
|
||||
for (k = *off, ucp = initial_desig_desc ; (k + 3) < page_len; ) {
|
||||
k = (k < 0) ? 0 : (k + ucp[k + 3] + 4);
|
||||
if ((k + 4) > page_len)
|
||||
break;
|
||||
c_set = (ucp[k] & 0xf);
|
||||
int c_set = (ucp[k] & 0xf);
|
||||
if ((m_code_set >= 0) && (m_code_set != c_set))
|
||||
continue;
|
||||
assoc = ((ucp[k + 1] >> 4) & 0x3);
|
||||
int assoc = ((ucp[k + 1] >> 4) & 0x3);
|
||||
if ((m_assoc >= 0) && (m_assoc != assoc))
|
||||
continue;
|
||||
desig_type = (ucp[k + 1] & 0xf);
|
||||
int desig_type = (ucp[k + 1] & 0xf);
|
||||
if ((m_desig_type >= 0) && (m_desig_type != desig_type))
|
||||
continue;
|
||||
*off = k;
|
||||
@ -330,11 +321,6 @@ int
|
||||
scsi_decode_lu_dev_id(const unsigned char * b, int blen, char * s, int slen,
|
||||
int * transport)
|
||||
{
|
||||
int m, c_set, assoc, desig_type, i_len, naa, off, u, have_scsi_ns;
|
||||
const unsigned char * ucp;
|
||||
const unsigned char * ip;
|
||||
int si = 0;
|
||||
|
||||
if (transport)
|
||||
*transport = -1;
|
||||
if (slen < 32) {
|
||||
@ -342,25 +328,29 @@ scsi_decode_lu_dev_id(const unsigned char * b, int blen, char * s, int slen,
|
||||
s[0] = '\0';
|
||||
return -1;
|
||||
}
|
||||
have_scsi_ns = 0;
|
||||
|
||||
s[0] = '\0';
|
||||
off = -1;
|
||||
int si = 0;
|
||||
int have_scsi_ns = 0;
|
||||
int off = -1;
|
||||
int u;
|
||||
while ((u = scsi_vpd_dev_id_iter(b, blen, &off, -1, -1, -1)) == 0) {
|
||||
ucp = b + off;
|
||||
i_len = ucp[3];
|
||||
const unsigned char * ucp = b + off;
|
||||
int i_len = ucp[3];
|
||||
if ((off + i_len + 4) > blen) {
|
||||
snprintf(s+si, slen-si, "error: designator length");
|
||||
return -1;
|
||||
}
|
||||
assoc = ((ucp[1] >> 4) & 0x3);
|
||||
int assoc = ((ucp[1] >> 4) & 0x3);
|
||||
if (transport && assoc && (ucp[1] & 0x80) && (*transport < 0))
|
||||
*transport = (ucp[0] >> 4) & 0xf;
|
||||
if (0 != assoc)
|
||||
continue;
|
||||
ip = ucp + 4;
|
||||
c_set = (ucp[0] & 0xf);
|
||||
desig_type = (ucp[1] & 0xf);
|
||||
const unsigned char * ip = ucp + 4;
|
||||
int c_set = (ucp[0] & 0xf);
|
||||
int desig_type = (ucp[1] & 0xf);
|
||||
|
||||
int naa;
|
||||
switch (desig_type) {
|
||||
case 0: /* vendor specific */
|
||||
case 1: /* T10 vendor identification */
|
||||
@ -373,7 +363,7 @@ scsi_decode_lu_dev_id(const unsigned char * b, int blen, char * s, int slen,
|
||||
if (have_scsi_ns)
|
||||
si = 0;
|
||||
si += snprintf(s+si, slen-si, "0x");
|
||||
for (m = 0; m < i_len; ++m)
|
||||
for (int m = 0; m < i_len; ++m)
|
||||
si += snprintf(s+si, slen-si, "%02x", (unsigned int)ip[m]);
|
||||
break;
|
||||
case 3: /* NAA */
|
||||
@ -394,7 +384,7 @@ scsi_decode_lu_dev_id(const unsigned char * b, int blen, char * s, int slen,
|
||||
return -1;
|
||||
}
|
||||
si += snprintf(s+si, slen-si, "0x");
|
||||
for (m = 0; m < 8; ++m)
|
||||
for (int m = 0; m < 8; ++m)
|
||||
si += snprintf(s+si, slen-si, "%02x", (unsigned int)ip[m]);
|
||||
} else if ((3 == naa ) || (5 == naa)) {
|
||||
/* NAA=3 Locally assigned; NAA=5 IEEE Registered */
|
||||
@ -403,7 +393,7 @@ scsi_decode_lu_dev_id(const unsigned char * b, int blen, char * s, int slen,
|
||||
return -1;
|
||||
}
|
||||
si += snprintf(s+si, slen-si, "0x");
|
||||
for (m = 0; m < 8; ++m)
|
||||
for (int m = 0; m < 8; ++m)
|
||||
si += snprintf(s+si, slen-si, "%02x", (unsigned int)ip[m]);
|
||||
} else if (6 == naa) { /* NAA IEEE Registered extended */
|
||||
if (16 != i_len) {
|
||||
@ -411,7 +401,7 @@ scsi_decode_lu_dev_id(const unsigned char * b, int blen, char * s, int slen,
|
||||
return -1;
|
||||
}
|
||||
si += snprintf(s+si, slen-si, "0x");
|
||||
for (m = 0; m < 16; ++m)
|
||||
for (int m = 0; m < 16; ++m)
|
||||
si += snprintf(s+si, slen-si, "%02x", (unsigned int)ip[m]);
|
||||
}
|
||||
break;
|
||||
@ -461,7 +451,6 @@ scsiLogSense(scsi_device * device, int pagenum, int subpagenum, UINT8 *pBuf,
|
||||
UINT8 cdb[10];
|
||||
UINT8 sense[32];
|
||||
int pageLen;
|
||||
int status, res;
|
||||
|
||||
if (known_resp_len > bufLen)
|
||||
return -EIO;
|
||||
@ -494,6 +483,7 @@ scsiLogSense(scsi_device * device, int pagenum, int subpagenum, UINT8 *pBuf,
|
||||
if (!device->scsi_pass_through(&io_hdr))
|
||||
return -device->get_errno();
|
||||
scsi_do_sense_disect(&io_hdr, &sinfo);
|
||||
int res;
|
||||
if ((res = scsiSimpleSenseFilter(&sinfo)))
|
||||
return res;
|
||||
/* sanity check on response */
|
||||
@ -529,7 +519,7 @@ scsiLogSense(scsi_device * device, int pagenum, int subpagenum, UINT8 *pBuf,
|
||||
if (!device->scsi_pass_through(&io_hdr))
|
||||
return -device->get_errno();
|
||||
scsi_do_sense_disect(&io_hdr, &sinfo);
|
||||
status = scsiSimpleSenseFilter(&sinfo);
|
||||
int status = scsiSimpleSenseFilter(&sinfo);
|
||||
if (0 != status)
|
||||
return status;
|
||||
/* sanity check on response */
|
||||
@ -589,7 +579,6 @@ scsiModeSense(scsi_device * device, int pagenum, int subpagenum, int pc,
|
||||
struct scsi_sense_disect sinfo;
|
||||
UINT8 cdb[6];
|
||||
UINT8 sense[32];
|
||||
int status;
|
||||
|
||||
if ((bufLen < 0) || (bufLen > 255))
|
||||
return -EINVAL;
|
||||
@ -611,7 +600,7 @@ scsiModeSense(scsi_device * device, int pagenum, int subpagenum, int pc,
|
||||
if (!device->scsi_pass_through(&io_hdr))
|
||||
return -device->get_errno();
|
||||
scsi_do_sense_disect(&io_hdr, &sinfo);
|
||||
status = scsiSimpleSenseFilter(&sinfo);
|
||||
int status = scsiSimpleSenseFilter(&sinfo);
|
||||
if (SIMPLE_ERR_TRY_AGAIN == status) {
|
||||
if (!device->scsi_pass_through(&io_hdr))
|
||||
return -device->get_errno();
|
||||
@ -687,7 +676,6 @@ scsiModeSense10(scsi_device * device, int pagenum, int subpagenum, int pc,
|
||||
struct scsi_sense_disect sinfo;
|
||||
UINT8 cdb[10];
|
||||
UINT8 sense[32];
|
||||
int status;
|
||||
|
||||
memset(&io_hdr, 0, sizeof(io_hdr));
|
||||
memset(cdb, 0, sizeof(cdb));
|
||||
@ -708,7 +696,7 @@ scsiModeSense10(scsi_device * device, int pagenum, int subpagenum, int pc,
|
||||
if (!device->scsi_pass_through(&io_hdr))
|
||||
return -device->get_errno();
|
||||
scsi_do_sense_disect(&io_hdr, &sinfo);
|
||||
status = scsiSimpleSenseFilter(&sinfo);
|
||||
int status = scsiSimpleSenseFilter(&sinfo);
|
||||
if (SIMPLE_ERR_TRY_AGAIN == status) {
|
||||
if (!device->scsi_pass_through(&io_hdr))
|
||||
return -device->get_errno();
|
||||
@ -879,8 +867,6 @@ scsiRequestSense(scsi_device * device, struct scsi_sense_disect * sense_info)
|
||||
UINT8 cdb[6];
|
||||
UINT8 sense[32];
|
||||
UINT8 buff[18];
|
||||
int len;
|
||||
UINT8 resp_code;
|
||||
|
||||
memset(&io_hdr, 0, sizeof(io_hdr));
|
||||
memset(cdb, 0, sizeof(cdb));
|
||||
@ -898,13 +884,13 @@ scsiRequestSense(scsi_device * device, struct scsi_sense_disect * sense_info)
|
||||
if (!device->scsi_pass_through(&io_hdr))
|
||||
return -device->get_errno();
|
||||
if (sense_info) {
|
||||
resp_code = buff[0] & 0x7f;
|
||||
UINT8 resp_code = buff[0] & 0x7f;
|
||||
sense_info->resp_code = resp_code;
|
||||
sense_info->sense_key = buff[2] & 0xf;
|
||||
sense_info->asc = 0;
|
||||
sense_info->ascq = 0;
|
||||
if ((0x70 == resp_code) || (0x71 == resp_code)) {
|
||||
len = buff[7] + 8;
|
||||
int len = buff[7] + 8;
|
||||
if (len > 13) {
|
||||
sense_info->asc = buff[12];
|
||||
sense_info->ascq = buff[13];
|
||||
@ -1203,7 +1189,7 @@ scsiGetSize(scsi_device * device, unsigned int * lb_sizep,
|
||||
int * lb_per_pb_expp)
|
||||
{
|
||||
unsigned int last_lba = 0, lb_size = 0;
|
||||
int k, res;
|
||||
int res;
|
||||
uint64_t ret_val = 0;
|
||||
UINT8 rc16resp[32];
|
||||
|
||||
@ -1220,7 +1206,7 @@ scsiGetSize(scsi_device * device, unsigned int * lb_sizep,
|
||||
pout("scsiGetSize: READ CAPACITY(16) failed, res=%d\n", res);
|
||||
return 0;
|
||||
}
|
||||
for (k = 0; k < 8; ++k) {
|
||||
for (int k = 0; k < 8; ++k) {
|
||||
if (k > 0)
|
||||
ret_val <<= 8;
|
||||
ret_val |= rc16resp[k + 0];
|
||||
@ -1265,10 +1251,10 @@ scsiGetProtPBInfo(scsi_device * device, unsigned char * rc16_12_31p)
|
||||
int
|
||||
scsiModePageOffset(const UINT8 * resp, int len, int modese_len)
|
||||
{
|
||||
int resp_len, bd_len;
|
||||
int offset = -1;
|
||||
|
||||
if (resp) {
|
||||
int resp_len, bd_len;
|
||||
if (10 == modese_len) {
|
||||
resp_len = (resp[0] << 8) + resp[1] + 2;
|
||||
bd_len = (resp[6] << 8) + resp[7];
|
||||
@ -1355,11 +1341,9 @@ scsiFetchIECmpage(scsi_device * device, struct scsi_iec_mode_page *iecp,
|
||||
int
|
||||
scsi_IsExceptionControlEnabled(const struct scsi_iec_mode_page *iecp)
|
||||
{
|
||||
int offset;
|
||||
|
||||
if (iecp && iecp->gotCurrent) {
|
||||
offset = scsiModePageOffset(iecp->raw_curr, sizeof(iecp->raw_curr),
|
||||
iecp->modese_len);
|
||||
int offset = scsiModePageOffset(iecp->raw_curr, sizeof(iecp->raw_curr),
|
||||
iecp->modese_len);
|
||||
if (offset >= 0)
|
||||
return (iecp->raw_curr[offset + 2] & DEXCPT_ENABLE) ? 0 : 1;
|
||||
else
|
||||
@ -1371,11 +1355,9 @@ scsi_IsExceptionControlEnabled(const struct scsi_iec_mode_page *iecp)
|
||||
int
|
||||
scsi_IsWarningEnabled(const struct scsi_iec_mode_page *iecp)
|
||||
{
|
||||
int offset;
|
||||
|
||||
if (iecp && iecp->gotCurrent) {
|
||||
offset = scsiModePageOffset(iecp->raw_curr, sizeof(iecp->raw_curr),
|
||||
iecp->modese_len);
|
||||
int offset = scsiModePageOffset(iecp->raw_curr, sizeof(iecp->raw_curr),
|
||||
iecp->modese_len);
|
||||
if (offset >= 0)
|
||||
return (iecp->raw_curr[offset + 2] & EWASC_ENABLE) ? 1 : 0;
|
||||
else
|
||||
@ -1403,10 +1385,9 @@ int
|
||||
scsiSetExceptionControlAndWarning(scsi_device * device, int enabled,
|
||||
const struct scsi_iec_mode_page *iecp)
|
||||
{
|
||||
int k, offset, resp_len;
|
||||
int offset, resp_len;
|
||||
int err = 0;
|
||||
UINT8 rout[SCSI_IECMP_RAW_LEN];
|
||||
int sp, eCEnabled, wEnabled;
|
||||
|
||||
if ((! iecp) || (! iecp->gotCurrent))
|
||||
return -EINVAL;
|
||||
@ -1423,7 +1404,7 @@ scsiSetExceptionControlAndWarning(scsi_device * device, int enabled,
|
||||
resp_len = rout[0] + 1;
|
||||
rout[2] &= 0xef;
|
||||
}
|
||||
sp = (rout[offset] & 0x80) ? 1 : 0; /* PS bit becomes 'SELECT's SP bit */
|
||||
int sp = (rout[offset] & 0x80) ? 1 : 0; /* PS bit becomes 'SELECT's SP bit */
|
||||
if (enabled) {
|
||||
rout[offset + 2] = SCSI_IEC_MP_BYTE2_ENABLED;
|
||||
if (scsi_debugmode > 2)
|
||||
@ -1442,7 +1423,7 @@ scsiSetExceptionControlAndWarning(scsi_device * device, int enabled,
|
||||
|
||||
rout[offset + 2] = chg2 ? (rout[offset + 2] & chg2) :
|
||||
iecp->raw_curr[offset + 2];
|
||||
for (k = 3; k < 12; ++k) {
|
||||
for (int k = 3; k < 12; ++k) {
|
||||
if (0 == iecp->raw_chg[offset + k])
|
||||
rout[offset + k] = iecp->raw_curr[offset + k];
|
||||
}
|
||||
@ -1453,8 +1434,8 @@ scsiSetExceptionControlAndWarning(scsi_device * device, int enabled,
|
||||
return 0;
|
||||
}
|
||||
} else { /* disabling Exception Control and (temperature) Warnings */
|
||||
eCEnabled = (rout[offset + 2] & DEXCPT_ENABLE) ? 0 : 1;
|
||||
wEnabled = (rout[offset + 2] & EWASC_ENABLE) ? 1 : 0;
|
||||
int eCEnabled = (rout[offset + 2] & DEXCPT_ENABLE) ? 0 : 1;
|
||||
int wEnabled = (rout[offset + 2] & EWASC_ENABLE) ? 1 : 0;
|
||||
if ((! eCEnabled) && (! wEnabled)) {
|
||||
if (scsi_debugmode > 0)
|
||||
pout("scsiSetExceptionControlAndWarning: already disabled\n");
|
||||
@ -1507,7 +1488,6 @@ scsiCheckIE(scsi_device * device, int hasIELogPage, int hasTempLogPage,
|
||||
struct scsi_sense_disect sense_info;
|
||||
int err;
|
||||
int temperatureSet = 0;
|
||||
unsigned short pagesize;
|
||||
UINT8 currTemp, trTemp;
|
||||
|
||||
*asc = 0;
|
||||
@ -1523,7 +1503,7 @@ scsiCheckIE(scsi_device * device, int hasIELogPage, int hasTempLogPage,
|
||||
return err;
|
||||
}
|
||||
// pull out page size from response, don't forget to add 4
|
||||
pagesize = (unsigned short) ((tBuf[2] << 8) | tBuf[3]) + 4;
|
||||
unsigned short pagesize = (unsigned short) ((tBuf[2] << 8) | tBuf[3]) + 4;
|
||||
if ((pagesize < 4) || tBuf[4] || tBuf[5]) {
|
||||
pout("Log Sense failed, IE page, bad parameter code or length\n");
|
||||
return SIMPLE_ERR_BAD_PARAM;
|
||||
@ -2157,7 +2137,7 @@ int
|
||||
scsiFetchExtendedSelfTestTime(scsi_device * device, int * durationSec,
|
||||
int modese_len)
|
||||
{
|
||||
int err, offset, res;
|
||||
int err, offset;
|
||||
UINT8 buff[64];
|
||||
|
||||
memset(buff, 0, sizeof(buff));
|
||||
@ -2183,7 +2163,7 @@ scsiFetchExtendedSelfTestTime(scsi_device * device, int * durationSec,
|
||||
if (offset < 0)
|
||||
return -EINVAL;
|
||||
if (buff[offset + 1] >= 0xa) {
|
||||
res = (buff[offset + 10] << 8) | buff[offset + 11];
|
||||
int res = (buff[offset + 10] << 8) | buff[offset + 11];
|
||||
*durationSec = res;
|
||||
return 0;
|
||||
}
|
||||
@ -2194,17 +2174,13 @@ scsiFetchExtendedSelfTestTime(scsi_device * device, int * durationSec,
|
||||
void
|
||||
scsiDecodeErrCounterPage(unsigned char * resp, struct scsiErrorCounter *ecp)
|
||||
{
|
||||
int k, j, num, pl, pc;
|
||||
unsigned char * ucp;
|
||||
unsigned char * xp;
|
||||
uint64_t * ullp;
|
||||
|
||||
memset(ecp, 0, sizeof(*ecp));
|
||||
num = (resp[2] << 8) | resp[3];
|
||||
ucp = &resp[0] + 4;
|
||||
int num = (resp[2] << 8) | resp[3];
|
||||
unsigned char * ucp = &resp[0] + 4;
|
||||
while (num > 3) {
|
||||
pc = (ucp[0] << 8) | ucp[1];
|
||||
pl = ucp[3] + 4;
|
||||
int pc = (ucp[0] << 8) | ucp[1];
|
||||
int pl = ucp[3] + 4;
|
||||
uint64_t * ullp;
|
||||
switch (pc) {
|
||||
case 0:
|
||||
case 1:
|
||||
@ -2221,14 +2197,14 @@ scsiDecodeErrCounterPage(unsigned char * resp, struct scsiErrorCounter *ecp)
|
||||
ullp = &ecp->counter[7];
|
||||
break;
|
||||
}
|
||||
k = pl - 4;
|
||||
xp = ucp + 4;
|
||||
int k = pl - 4;
|
||||
unsigned char * xp = ucp + 4;
|
||||
if (k > (int)sizeof(*ullp)) {
|
||||
xp += (k - sizeof(*ullp));
|
||||
k = sizeof(*ullp);
|
||||
}
|
||||
*ullp = 0;
|
||||
for (j = 0; j < k; ++j) {
|
||||
for (int j = 0; j < k; ++j) {
|
||||
if (j > 0)
|
||||
*ullp <<= 8;
|
||||
*ullp |= xp[j];
|
||||
@ -2242,17 +2218,15 @@ void
|
||||
scsiDecodeNonMediumErrPage(unsigned char *resp,
|
||||
struct scsiNonMediumError *nmep)
|
||||
{
|
||||
int k, j, num, pl, pc, szof;
|
||||
unsigned char * ucp;
|
||||
unsigned char * xp;
|
||||
|
||||
memset(nmep, 0, sizeof(*nmep));
|
||||
num = (resp[2] << 8) | resp[3];
|
||||
ucp = &resp[0] + 4;
|
||||
szof = sizeof(nmep->counterPC0);
|
||||
int num = (resp[2] << 8) | resp[3];
|
||||
unsigned char * ucp = &resp[0] + 4;
|
||||
int szof = sizeof(nmep->counterPC0);
|
||||
while (num > 3) {
|
||||
pc = (ucp[0] << 8) | ucp[1];
|
||||
pl = ucp[3] + 4;
|
||||
int pc = (ucp[0] << 8) | ucp[1];
|
||||
int pl = ucp[3] + 4;
|
||||
int k;
|
||||
unsigned char * xp;
|
||||
switch (pc) {
|
||||
case 0:
|
||||
nmep->gotPC0 = 1;
|
||||
@ -2263,7 +2237,7 @@ scsiDecodeNonMediumErrPage(unsigned char *resp,
|
||||
k = szof;
|
||||
}
|
||||
nmep->counterPC0 = 0;
|
||||
for (j = 0; j < k; ++j) {
|
||||
for (int j = 0; j < k; ++j) {
|
||||
if (j > 0)
|
||||
nmep->counterPC0 <<= 8;
|
||||
nmep->counterPC0 |= xp[j];
|
||||
@ -2278,7 +2252,7 @@ scsiDecodeNonMediumErrPage(unsigned char *resp,
|
||||
k = szof;
|
||||
}
|
||||
nmep->counterTFE_H = 0;
|
||||
for (j = 0; j < k; ++j) {
|
||||
for (int j = 0; j < k; ++j) {
|
||||
if (j > 0)
|
||||
nmep->counterTFE_H <<= 8;
|
||||
nmep->counterTFE_H |= xp[j];
|
||||
@ -2293,7 +2267,7 @@ scsiDecodeNonMediumErrPage(unsigned char *resp,
|
||||
k = szof;
|
||||
}
|
||||
nmep->counterPE_H = 0;
|
||||
for (j = 0; j < k; ++j) {
|
||||
for (int j = 0; j < k; ++j) {
|
||||
if (j > 0)
|
||||
nmep->counterPE_H <<= 8;
|
||||
nmep->counterPE_H |= xp[j];
|
||||
@ -2319,7 +2293,7 @@ scsiDecodeNonMediumErrPage(unsigned char *resp,
|
||||
int
|
||||
scsiCountFailedSelfTests(scsi_device * fd, int noisy)
|
||||
{
|
||||
int num, k, n, err, res, fails, fail_hour;
|
||||
int num, k, err, fails, fail_hour;
|
||||
UINT8 * ucp;
|
||||
unsigned char resp[LOG_RESP_SELF_TEST_LEN];
|
||||
|
||||
@ -2348,13 +2322,13 @@ scsiCountFailedSelfTests(scsi_device * fd, int noisy)
|
||||
for (k = 0, ucp = resp + 4; k < 20; ++k, ucp += 20 ) {
|
||||
|
||||
// timestamp in power-on hours (or zero if test in progress)
|
||||
n = (ucp[6] << 8) | ucp[7];
|
||||
int n = (ucp[6] << 8) | ucp[7];
|
||||
|
||||
// The spec says "all 20 bytes will be zero if no test" but
|
||||
// DG has found otherwise. So this is a heuristic.
|
||||
if ((0 == n) && (0 == ucp[4]))
|
||||
break;
|
||||
res = ucp[4] & 0xf;
|
||||
int res = ucp[4] & 0xf;
|
||||
if ((res > 2) && (res < 8)) {
|
||||
fails++;
|
||||
if (1 == fails)
|
||||
@ -2433,7 +2407,7 @@ int
|
||||
scsiGetRPM(scsi_device * device, int modese_len, int * form_factorp,
|
||||
int * haw_zbcp)
|
||||
{
|
||||
int err, offset, speed;
|
||||
int err, offset;
|
||||
UINT8 buff[64];
|
||||
int pc = MPAGE_CONTROL_DEFAULT;
|
||||
|
||||
@ -2441,7 +2415,7 @@ scsiGetRPM(scsi_device * device, int modese_len, int * form_factorp,
|
||||
if ((0 == scsiInquiryVpd(device, SCSI_VPD_BLOCK_DEVICE_CHARACTERISTICS,
|
||||
buff, sizeof(buff))) &&
|
||||
(((buff[2] << 8) + buff[3]) > 2)) {
|
||||
speed = (buff[4] << 8) + buff[5];
|
||||
int speed = (buff[4] << 8) + buff[5];
|
||||
if (form_factorp)
|
||||
*form_factorp = buff[7] & 0xf;
|
||||
if (haw_zbcp)
|
||||
@ -2687,7 +2661,7 @@ const unsigned char *
|
||||
sg_scsi_sense_desc_find(const unsigned char * sensep, int sense_len,
|
||||
int desc_type)
|
||||
{
|
||||
int add_sen_len, add_len, desc_len, k;
|
||||
int add_sen_len;
|
||||
const unsigned char * descp;
|
||||
|
||||
if ((sense_len < 8) || (0 == (add_sen_len = sensep[7])))
|
||||
@ -2697,9 +2671,9 @@ sg_scsi_sense_desc_find(const unsigned char * sensep, int sense_len,
|
||||
add_sen_len = (add_sen_len < (sense_len - 8)) ?
|
||||
add_sen_len : (sense_len - 8);
|
||||
descp = &sensep[8];
|
||||
for (desc_len = 0, k = 0; k < add_sen_len; k += desc_len) {
|
||||
for (int desc_len = 0, k = 0; k < add_sen_len; k += desc_len) {
|
||||
descp += desc_len;
|
||||
add_len = (k < (add_sen_len - 1)) ? descp[1]: -1;
|
||||
int add_len = (k < (add_sen_len - 1)) ? descp[1]: -1;
|
||||
desc_len = add_len + 2;
|
||||
if (descp[0] == desc_type)
|
||||
return descp;
|
||||
|
@ -1,12 +1,10 @@
|
||||
/*
|
||||
* scsicmds.h
|
||||
*
|
||||
* Home page of code is: http://smartmontools.sourceforge.net
|
||||
* Home page of code is: http://www.smartmontools.org
|
||||
*
|
||||
* Copyright (C) 2002-8 Bruce Allen
|
||||
* Copyright (C) 2000 Michael Cornwell <cornwell@acm.org>
|
||||
*
|
||||
* Additional SCSI work:
|
||||
* Copyright (C) 2003-15 Douglas Gilbert <dgilbert@interlog.com>
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
@ -32,7 +30,7 @@
|
||||
#ifndef SCSICMDS_H_
|
||||
#define SCSICMDS_H_
|
||||
|
||||
#define SCSICMDS_H_CVSID "$Id: scsicmds.h 4081 2015-05-10 16:42:50Z chrfranke $\n"
|
||||
#define SCSICMDS_H_CVSID "$Id: scsicmds.h 4152 2015-10-17 16:08:21Z chrfranke $\n"
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
@ -322,7 +320,7 @@ class scsi_device;
|
||||
class supported_vpd_pages
|
||||
{
|
||||
public:
|
||||
supported_vpd_pages(scsi_device * device);
|
||||
explicit supported_vpd_pages(scsi_device * device);
|
||||
~supported_vpd_pages() { num_valid = 0; }
|
||||
|
||||
bool is_supported(int vpd_page_num) const;
|
||||
|
281
scsiprint.cpp
281
scsiprint.cpp
@ -1,13 +1,11 @@
|
||||
/*
|
||||
* scsiprint.cpp
|
||||
*
|
||||
* Home page of code is: http://smartmontools.sourceforge.net
|
||||
* Home page of code is: http://www.smartmontools.org
|
||||
*
|
||||
* Copyright (C) 2002-11 Bruce Allen <smartmontools-support@lists.sourceforge.net>
|
||||
* Copyright (C) 2002-11 Bruce Allen
|
||||
* Copyright (C) 2000 Michael Cornwell <cornwell@acm.org>
|
||||
*
|
||||
* Additional SCSI work:
|
||||
* Copyright (C) 2003-13 Douglas Gilbert <dgilbert@interlog.com>
|
||||
* Copyright (C) 2003-15 Douglas Gilbert <dgilbert@interlog.com>
|
||||
*
|
||||
* 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
|
||||
@ -42,7 +40,7 @@
|
||||
|
||||
#define GBUF_SIZE 65535
|
||||
|
||||
const char * scsiprint_c_cvsid = "$Id: scsiprint.cpp 4040 2015-03-10 22:30:44Z dpgilbert $"
|
||||
const char * scsiprint_c_cvsid = "$Id: scsiprint.cpp 4189 2015-12-16 14:53:41Z dpgilbert $"
|
||||
SCSIPRINT_H_CVSID;
|
||||
|
||||
|
||||
@ -244,8 +242,7 @@ scsiGetTapeAlertsData(scsi_device * device, int peripheral_type)
|
||||
static void
|
||||
scsiGetStartStopData(scsi_device * device)
|
||||
{
|
||||
UINT32 u;
|
||||
int err, len, k, extra, pc;
|
||||
int err, len, k, extra;
|
||||
unsigned char * ucp;
|
||||
|
||||
if ((err = scsiLogSense(device, STARTSTOP_CYCLE_COUNTER_LPAGE, 0, gBuf,
|
||||
@ -271,7 +268,8 @@ scsiGetStartStopData(scsi_device * device)
|
||||
return;
|
||||
}
|
||||
extra = ucp[3] + 4;
|
||||
pc = (ucp[0] << 8) + ucp[1];
|
||||
int pc = (ucp[0] << 8) + ucp[1];
|
||||
UINT32 u;
|
||||
switch (pc) {
|
||||
case 1:
|
||||
if (10 == extra)
|
||||
@ -321,7 +319,7 @@ scsiGetStartStopData(scsi_device * device)
|
||||
static void
|
||||
scsiPrintGrownDefectListLen(scsi_device * device)
|
||||
{
|
||||
int err, dl_format, got_rd12, generation;
|
||||
int err, dl_format, got_rd12;
|
||||
unsigned int dl_len, div;
|
||||
|
||||
memset(gBuf, 0, 8);
|
||||
@ -353,7 +351,7 @@ scsiPrintGrownDefectListLen(scsi_device * device)
|
||||
got_rd12 = 1;
|
||||
|
||||
if (got_rd12) {
|
||||
generation = (gBuf[2] << 8) + gBuf[3];
|
||||
int generation = (gBuf[2] << 8) + gBuf[3];
|
||||
if ((generation > 1) && (scsi_debugmode > 0)) {
|
||||
print_on();
|
||||
pout("Read defect list (12): generation=%d\n", generation);
|
||||
@ -405,9 +403,8 @@ scsiPrintGrownDefectListLen(scsi_device * device)
|
||||
static void
|
||||
scsiPrintSeagateCacheLPage(scsi_device * device)
|
||||
{
|
||||
int k, j, num, pl, pc, err, len;
|
||||
int num, pl, pc, err, len;
|
||||
unsigned char * ucp;
|
||||
unsigned char * xp;
|
||||
uint64_t ull;
|
||||
|
||||
if ((err = scsiLogSense(device, SEAGATE_CACHE_LPAGE, 0, gBuf,
|
||||
@ -460,14 +457,14 @@ scsiPrintSeagateCacheLPage(scsi_device * device)
|
||||
"> segment size"); break;
|
||||
default: pout(" Unknown Seagate parameter code [0x%x]", pc); break;
|
||||
}
|
||||
k = pl - 4;
|
||||
xp = ucp + 4;
|
||||
int k = pl - 4;
|
||||
unsigned char * xp = ucp + 4;
|
||||
if (k > (int)sizeof(ull)) {
|
||||
xp += (k - (int)sizeof(ull));
|
||||
k = (int)sizeof(ull);
|
||||
}
|
||||
ull = 0;
|
||||
for (j = 0; j < k; ++j) {
|
||||
for (int j = 0; j < k; ++j) {
|
||||
if (j > 0)
|
||||
ull <<= 8;
|
||||
ull |= xp[j];
|
||||
@ -482,9 +479,8 @@ scsiPrintSeagateCacheLPage(scsi_device * device)
|
||||
static void
|
||||
scsiPrintSeagateFactoryLPage(scsi_device * device)
|
||||
{
|
||||
int k, j, num, pl, pc, len, err, good, bad;
|
||||
int num, pl, pc, len, err, good, bad;
|
||||
unsigned char * ucp;
|
||||
unsigned char * xp;
|
||||
uint64_t ull;
|
||||
|
||||
if ((err = scsiLogSense(device, SEAGATE_FACTORY_LPAGE, 0, gBuf,
|
||||
@ -552,14 +548,14 @@ scsiPrintSeagateFactoryLPage(scsi_device * device)
|
||||
break;
|
||||
}
|
||||
if (good) {
|
||||
k = pl - 4;
|
||||
xp = ucp + 4;
|
||||
int k = pl - 4;
|
||||
unsigned char * xp = ucp + 4;
|
||||
if (k > (int)sizeof(ull)) {
|
||||
xp += (k - (int)sizeof(ull));
|
||||
k = (int)sizeof(ull);
|
||||
}
|
||||
ull = 0;
|
||||
for (j = 0; j < k; ++j) {
|
||||
for (int j = 0; j < k; ++j) {
|
||||
if (j > 0)
|
||||
ull <<= 8;
|
||||
ull |= xp[j];
|
||||
@ -580,10 +576,7 @@ scsiPrintErrorCounterLog(scsi_device * device)
|
||||
{
|
||||
struct scsiErrorCounter errCounterArr[3];
|
||||
struct scsiErrorCounter * ecp;
|
||||
struct scsiNonMediumError nme;
|
||||
int found[3] = {0, 0, 0};
|
||||
const char * pageNames[3] = {"read: ", "write: ", "verify: "};
|
||||
double processed_gb;
|
||||
|
||||
if (gReadECounterLPage && (0 == scsiLogSense(device,
|
||||
READ_ERROR_COUNTER_LPAGE, 0, gBuf, LOG_RESP_LEN, 0))) {
|
||||
@ -618,10 +611,11 @@ scsiPrintErrorCounterLog(scsi_device * device)
|
||||
if (! found[k])
|
||||
continue;
|
||||
ecp = &errCounterArr[k];
|
||||
static const char * const pageNames[3] = {"read: ", "write: ", "verify: "};
|
||||
pout("%s%8" PRIu64 " %8" PRIu64 " %8" PRIu64 " %8" PRIu64 " %8" PRIu64,
|
||||
pageNames[k], ecp->counter[0], ecp->counter[1],
|
||||
ecp->counter[2], ecp->counter[3], ecp->counter[4]);
|
||||
processed_gb = ecp->counter[5] / 1000000000.0;
|
||||
double processed_gb = ecp->counter[5] / 1000000000.0;
|
||||
pout(" %12.3f %8" PRIu64 "\n", processed_gb, ecp->counter[6]);
|
||||
}
|
||||
}
|
||||
@ -629,6 +623,7 @@ scsiPrintErrorCounterLog(scsi_device * device)
|
||||
pout("Error Counter logging not supported\n");
|
||||
if (gNonMediumELPage && (0 == scsiLogSense(device,
|
||||
NON_MEDIUM_ERROR_LPAGE, 0, gBuf, LOG_RESP_LEN, 0))) {
|
||||
struct scsiNonMediumError nme;
|
||||
scsiDecodeNonMediumErrPage(gBuf, &nme);
|
||||
if (nme.gotPC0)
|
||||
pout("\nNon-medium error count: %8" PRIu64 "\n", nme.counterPC0);
|
||||
@ -720,7 +715,7 @@ static const char * self_test_result[] = {
|
||||
static int
|
||||
scsiPrintSelfTest(scsi_device * device)
|
||||
{
|
||||
int num, k, n, res, err, durationSec;
|
||||
int num, k, err, durationSec;
|
||||
int noheader = 1;
|
||||
int retval = 0;
|
||||
UINT8 * ucp;
|
||||
@ -762,7 +757,7 @@ scsiPrintSelfTest(scsi_device * device)
|
||||
int i;
|
||||
|
||||
// timestamp in power-on hours (or zero if test in progress)
|
||||
n = (ucp[6] << 8) | ucp[7];
|
||||
int n = (ucp[6] << 8) | ucp[7];
|
||||
|
||||
// The spec says "all 20 bytes will be zero if no test" but
|
||||
// DG has found otherwise. So this is a heuristic.
|
||||
@ -785,6 +780,7 @@ scsiPrintSelfTest(scsi_device * device)
|
||||
|
||||
// check the self-test result nibble, using the self-test results
|
||||
// field table from T10/1416-D (SPC-3) Rev. 23, section 7.2.10:
|
||||
int res;
|
||||
switch ((res = ucp[4] & 0xf)) {
|
||||
case 0x3:
|
||||
// an unknown error occurred while the device server
|
||||
@ -903,7 +899,7 @@ static const char * reassign_status[] = {
|
||||
static int
|
||||
scsiPrintBackgroundResults(scsi_device * device)
|
||||
{
|
||||
int num, j, m, err, pc, pl, truncated;
|
||||
int num, j, m, err, truncated;
|
||||
int noheader = 1;
|
||||
int firstresult = 1;
|
||||
int retval = 0;
|
||||
@ -937,9 +933,9 @@ scsiPrintBackgroundResults(scsi_device * device)
|
||||
ucp = gBuf + 4;
|
||||
num -= 4;
|
||||
while (num > 3) {
|
||||
pc = (ucp[0] << 8) | ucp[1];
|
||||
int pc = (ucp[0] << 8) | ucp[1];
|
||||
// pcb = ucp[2];
|
||||
pl = ucp[3] + 4;
|
||||
int pl = ucp[3] + 4;
|
||||
switch (pc) {
|
||||
case 0:
|
||||
if (noheader) {
|
||||
@ -1012,7 +1008,7 @@ scsiPrintBackgroundResults(scsi_device * device)
|
||||
static int
|
||||
scsiPrintSSMedia(scsi_device * device)
|
||||
{
|
||||
int num, err, pc, pl, truncated;
|
||||
int num, err, truncated;
|
||||
int retval = 0;
|
||||
UINT8 * ucp;
|
||||
|
||||
@ -1043,9 +1039,9 @@ scsiPrintSSMedia(scsi_device * device)
|
||||
ucp = gBuf + 4;
|
||||
num -= 4;
|
||||
while (num > 3) {
|
||||
pc = (ucp[0] << 8) | ucp[1];
|
||||
int pc = (ucp[0] << 8) | ucp[1];
|
||||
// pcb = ucp[2];
|
||||
pl = ucp[3] + 4;
|
||||
int pl = ucp[3] + 4;
|
||||
switch (pc) {
|
||||
case 1:
|
||||
if (pl < 8) {
|
||||
@ -1202,7 +1198,6 @@ show_sas_port_param(unsigned char * ucp, int param_len)
|
||||
int j, m, n, nphys, t, sz, spld_len;
|
||||
unsigned char * vcp;
|
||||
uint64_t ull;
|
||||
unsigned int ui;
|
||||
char s[64];
|
||||
|
||||
sz = sizeof(s);
|
||||
@ -1299,6 +1294,7 @@ show_sas_port_param(unsigned char * ucp, int param_len)
|
||||
}
|
||||
pout(" attached SAS address = 0x%" PRIx64 "\n", ull);
|
||||
pout(" attached phy identifier = %d\n", vcp[24]);
|
||||
unsigned int ui;
|
||||
ui = (vcp[32] << 24) | (vcp[33] << 16) | (vcp[34] << 8) | vcp[35];
|
||||
pout(" Invalid DWORD count = %u\n", ui);
|
||||
ui = (vcp[36] << 24) | (vcp[37] << 16) | (vcp[38] << 8) | vcp[39];
|
||||
@ -1308,15 +1304,16 @@ show_sas_port_param(unsigned char * ucp, int param_len)
|
||||
ui = (vcp[44] << 24) | (vcp[45] << 16) | (vcp[46] << 8) | vcp[47];
|
||||
pout(" Phy reset problem = %u\n", ui);
|
||||
if (spld_len > 51) {
|
||||
int num_ped, peis;
|
||||
int num_ped;
|
||||
unsigned char * xcp;
|
||||
unsigned int pvdt;
|
||||
|
||||
num_ped = vcp[51];
|
||||
if (num_ped > 0)
|
||||
pout(" Phy event descriptors:\n");
|
||||
xcp = vcp + 52;
|
||||
for (m = 0; m < (num_ped * 12); m += 12, xcp += 12) {
|
||||
int peis;
|
||||
unsigned int pvdt;
|
||||
peis = xcp[3];
|
||||
ui = (xcp[4] << 24) | (xcp[5] << 16) | (xcp[6] << 8) |
|
||||
xcp[7];
|
||||
@ -1332,12 +1329,12 @@ show_sas_port_param(unsigned char * ucp, int param_len)
|
||||
static int
|
||||
show_protocol_specific_page(unsigned char * resp, int len)
|
||||
{
|
||||
int k, num, param_len;
|
||||
int k, num;
|
||||
unsigned char * ucp;
|
||||
|
||||
num = len - 4;
|
||||
for (k = 0, ucp = resp + 4; k < num; ) {
|
||||
param_len = ucp[3] + 4;
|
||||
int param_len = ucp[3] + 4;
|
||||
if (6 != (0xf & ucp[4]))
|
||||
return 0; /* only decode SAS log page */
|
||||
if (0 == k)
|
||||
@ -1453,10 +1450,9 @@ scsiGetDriveInfo(scsi_device * device, UINT8 * peripheral_type, bool all)
|
||||
{
|
||||
char timedatetz[DATEANDEPOCHLEN];
|
||||
struct scsi_iec_mode_page iec;
|
||||
int err, iec_err, len, req_len, avail_len, n, scsi_version;
|
||||
int is_tape = 0;
|
||||
int err, iec_err, len, req_len, avail_len, scsi_version;
|
||||
bool is_tape = false;
|
||||
int peri_dt = 0;
|
||||
int returnval = 0;
|
||||
int transport = -1;
|
||||
int form_factor = 0;
|
||||
int haw_zbc = 0;
|
||||
@ -1482,8 +1478,10 @@ scsiGetDriveInfo(scsi_device * device, UINT8 * peripheral_type, bool all)
|
||||
avail_len = gBuf[4] + 5;
|
||||
len = (avail_len < req_len) ? avail_len : req_len;
|
||||
peri_dt = gBuf[0] & 0x1f;
|
||||
if (peripheral_type)
|
||||
*peripheral_type = peri_dt;
|
||||
*peripheral_type = peri_dt;
|
||||
if ((SCSI_PT_SEQUENTIAL_ACCESS == peri_dt) ||
|
||||
(SCSI_PT_MEDIUM_CHANGER == peri_dt))
|
||||
is_tape = true;
|
||||
|
||||
if (len < 36) {
|
||||
print_on();
|
||||
@ -1523,16 +1521,15 @@ scsiGetDriveInfo(scsi_device * device, UINT8 * peripheral_type, bool all)
|
||||
|
||||
protect = gBuf[5] & 0x1; /* from and including SPC-3 */
|
||||
|
||||
if (! is_tape) { /* only do this for disks */
|
||||
if (! is_tape) { /* assume disk if not tape drive (or tape changer) */
|
||||
unsigned int lb_size = 0;
|
||||
unsigned char lb_prov_resp[8];
|
||||
char cap_str[64];
|
||||
char si_str[64];
|
||||
char lb_str[16];
|
||||
int lb_per_pb_exp = 0;
|
||||
uint64_t capacity = scsiGetSize(device, &lb_size, &lb_per_pb_exp);
|
||||
|
||||
if (capacity) {
|
||||
char cap_str[64], si_str[64];
|
||||
format_with_thousands_sep(cap_str, sizeof(cap_str), capacity);
|
||||
format_capacity(si_str, sizeof(si_str), capacity);
|
||||
pout("User Capacity: %s bytes [%s]\n", cap_str, si_str);
|
||||
@ -1550,7 +1547,7 @@ scsiGetDriveInfo(scsi_device * device, UINT8 * peripheral_type, bool all)
|
||||
snprintf(lb_str, sizeof(lb_str) - 1, "%u",
|
||||
(lb_size * (1 << lb_per_pb_exp)));
|
||||
pout("Physical block size: %s bytes\n", lb_str);
|
||||
n = ((rc16_12[2] & 0x3f) << 8) + rc16_12[3];
|
||||
int n = ((rc16_12[2] & 0x3f) << 8) + rc16_12[3];
|
||||
if (n > 0) // not common so cut the clutter
|
||||
pout("Lowest aligned LBA: %d\n", n);
|
||||
}
|
||||
@ -1711,9 +1708,6 @@ scsiGetDriveInfo(scsi_device * device, UINT8 * peripheral_type, bool all)
|
||||
dateandtimezone(timedatetz);
|
||||
pout("Local Time is: %s\n", timedatetz);
|
||||
|
||||
if ((SCSI_PT_SEQUENTIAL_ACCESS == *peripheral_type) ||
|
||||
(SCSI_PT_MEDIUM_CHANGER == *peripheral_type))
|
||||
is_tape = 1;
|
||||
// See if unit accepts SCSI commmands from us
|
||||
if ((err = scsiTestUnitReady(device))) {
|
||||
if (SIMPLE_ERR_NOT_READY == err) {
|
||||
@ -1736,6 +1730,7 @@ scsiGetDriveInfo(scsi_device * device, UINT8 * peripheral_type, bool all)
|
||||
pout("device Test Unit Ready [%s]\n", scsiErrString(err));
|
||||
print_off();
|
||||
}
|
||||
int returnval = 0; // TODO: exit with FAILID if failuretest returns
|
||||
failuretest(MANDATORY_CMD, returnval|=FAILID);
|
||||
}
|
||||
|
||||
@ -1865,6 +1860,8 @@ scsiPrintMain(scsi_device * device, const scsi_print_options & options)
|
||||
int returnval = 0;
|
||||
int res, durationSec;
|
||||
struct scsi_sense_disect sense_info;
|
||||
bool is_disk;
|
||||
bool is_tape;
|
||||
|
||||
bool any_output = options.drive_info;
|
||||
|
||||
@ -1882,115 +1879,108 @@ scsiPrintMain(scsi_device * device, const scsi_print_options & options)
|
||||
failuretest(MANDATORY_CMD, returnval |= FAILID);
|
||||
any_output = true;
|
||||
}
|
||||
is_disk = (SCSI_PT_DIRECT_ACCESS == peripheral_type);
|
||||
is_tape = ((SCSI_PT_SEQUENTIAL_ACCESS == peripheral_type) ||
|
||||
(SCSI_PT_MEDIUM_CHANGER == peripheral_type));
|
||||
|
||||
// Print read look-ahead status for disks
|
||||
short int wce = -1, rcd = -1;
|
||||
if (options.get_rcd || options.get_wce) {
|
||||
if (SCSI_PT_DIRECT_ACCESS == peripheral_type)
|
||||
res = scsiGetSetCache(device, modese_len, &wce, &rcd);
|
||||
else
|
||||
res = -1; // fetch for disks only
|
||||
any_output = true;
|
||||
}
|
||||
short int wce = -1, rcd = -1;
|
||||
// Print read look-ahead status for disks
|
||||
if (options.get_rcd || options.get_wce) {
|
||||
if (is_disk) {
|
||||
res = scsiGetSetCache(device, modese_len, &wce, &rcd);
|
||||
if (options.get_rcd)
|
||||
pout("Read Cache is: %s\n",
|
||||
res ? "Unavailable" : // error
|
||||
rcd ? "Disabled" : "Enabled");
|
||||
if (options.get_wce)
|
||||
pout("Writeback Cache is: %s\n",
|
||||
res ? "Unavailable" : // error
|
||||
!wce ? "Disabled" : "Enabled");
|
||||
}
|
||||
} else
|
||||
any_output = true;
|
||||
|
||||
if (options.get_rcd) {
|
||||
pout("Read Cache is: %s\n",
|
||||
res ? "Unavailable" : // error
|
||||
rcd ? "Disabled" : "Enabled");
|
||||
}
|
||||
if (options.drive_info)
|
||||
pout("\n");
|
||||
|
||||
if (options.get_wce) {
|
||||
pout("Writeback Cache is: %s\n",
|
||||
res ? "Unavailable" : // error
|
||||
!wce ? "Disabled" : "Enabled");
|
||||
}
|
||||
if (options.drive_info)
|
||||
pout("\n");
|
||||
|
||||
// START OF THE ENABLE/DISABLE SECTION OF THE CODE
|
||||
if ( options.smart_disable || options.smart_enable
|
||||
|| options.smart_auto_save_disable || options.smart_auto_save_enable)
|
||||
pout("=== START OF ENABLE/DISABLE COMMANDS SECTION ===\n");
|
||||
// START OF THE ENABLE/DISABLE SECTION OF THE CODE
|
||||
if (options.smart_disable || options.smart_enable ||
|
||||
options.smart_auto_save_disable || options.smart_auto_save_enable)
|
||||
pout("=== START OF ENABLE/DISABLE COMMANDS SECTION ===\n");
|
||||
|
||||
if (options.smart_enable) {
|
||||
if (scsiSmartEnable(device))
|
||||
failuretest(MANDATORY_CMD, returnval |= FAILSMART);
|
||||
any_output = true;
|
||||
any_output = true;
|
||||
}
|
||||
|
||||
if (options.smart_disable) {
|
||||
if (scsiSmartDisable(device))
|
||||
failuretest(MANDATORY_CMD,returnval |= FAILSMART);
|
||||
any_output = true;
|
||||
any_output = true;
|
||||
}
|
||||
|
||||
if (options.smart_auto_save_enable) {
|
||||
if (scsiSetControlGLTSD(device, 0, modese_len)) {
|
||||
pout("Enable autosave (clear GLTSD bit) failed\n");
|
||||
failuretest(OPTIONAL_CMD,returnval |= FAILSMART);
|
||||
}
|
||||
else {
|
||||
pout("Autosave enabled (GLTSD bit set).\n");
|
||||
}
|
||||
any_output = true;
|
||||
if (scsiSetControlGLTSD(device, 0, modese_len)) {
|
||||
pout("Enable autosave (clear GLTSD bit) failed\n");
|
||||
failuretest(OPTIONAL_CMD,returnval |= FAILSMART);
|
||||
} else
|
||||
pout("Autosave enabled (GLTSD bit cleared).\n");
|
||||
any_output = true;
|
||||
}
|
||||
|
||||
// Enable/Disable write cache
|
||||
if (options.set_wce && SCSI_PT_DIRECT_ACCESS == peripheral_type) {
|
||||
short int enable = wce = (options.set_wce > 0);
|
||||
rcd = -1;
|
||||
if (scsiGetSetCache(device, modese_len, &wce, &rcd)) {
|
||||
pout("Write cache %sable failed: %s\n", (enable ? "en" : "dis"),
|
||||
device->get_errmsg());
|
||||
failuretest(OPTIONAL_CMD,returnval |= FAILSMART);
|
||||
}
|
||||
else
|
||||
pout("Write cache %sabled\n", (enable ? "en" : "dis"));
|
||||
any_output = true;
|
||||
if (options.set_wce && is_disk) {
|
||||
short int enable = wce = (options.set_wce > 0);
|
||||
|
||||
rcd = -1;
|
||||
if (scsiGetSetCache(device, modese_len, &wce, &rcd)) {
|
||||
pout("Write cache %sable failed: %s\n", (enable ? "en" : "dis"),
|
||||
device->get_errmsg());
|
||||
failuretest(OPTIONAL_CMD,returnval |= FAILSMART);
|
||||
} else
|
||||
pout("Write cache %sabled\n", (enable ? "en" : "dis"));
|
||||
any_output = true;
|
||||
}
|
||||
|
||||
// Enable/Disable read cache
|
||||
if (options.set_rcd && SCSI_PT_DIRECT_ACCESS == peripheral_type) {
|
||||
short int enable = (options.set_rcd > 0);
|
||||
rcd = !enable;
|
||||
wce = -1;
|
||||
if (scsiGetSetCache(device, modese_len, &wce, &rcd)) {
|
||||
pout("Read cache %sable failed: %s\n", (enable ? "en" : "dis"),
|
||||
if (options.set_rcd && is_disk) {
|
||||
short int enable = (options.set_rcd > 0);
|
||||
|
||||
rcd = !enable;
|
||||
wce = -1;
|
||||
if (scsiGetSetCache(device, modese_len, &wce, &rcd)) {
|
||||
pout("Read cache %sable failed: %s\n", (enable ? "en" : "dis"),
|
||||
device->get_errmsg());
|
||||
failuretest(OPTIONAL_CMD,returnval |= FAILSMART);
|
||||
}
|
||||
else
|
||||
pout("Read cache %sabled\n", (enable ? "en" : "dis"));
|
||||
any_output = true;
|
||||
failuretest(OPTIONAL_CMD,returnval |= FAILSMART);
|
||||
} else
|
||||
pout("Read cache %sabled\n", (enable ? "en" : "dis"));
|
||||
any_output = true;
|
||||
}
|
||||
|
||||
if (options.smart_auto_save_disable) {
|
||||
if (scsiSetControlGLTSD(device, 1, modese_len)) {
|
||||
pout("Disable autosave (set GLTSD bit) failed\n");
|
||||
failuretest(OPTIONAL_CMD,returnval |= FAILSMART);
|
||||
}
|
||||
else {
|
||||
pout("Autosave disabled (GLTSD bit cleared).\n");
|
||||
}
|
||||
any_output = true;
|
||||
if (scsiSetControlGLTSD(device, 1, modese_len)) {
|
||||
pout("Disable autosave (set GLTSD bit) failed\n");
|
||||
failuretest(OPTIONAL_CMD,returnval |= FAILSMART);
|
||||
} else
|
||||
pout("Autosave disabled (GLTSD bit set).\n");
|
||||
any_output = true;
|
||||
}
|
||||
if ( options.smart_disable || options.smart_enable
|
||||
|| options.smart_auto_save_disable || options.smart_auto_save_enable)
|
||||
pout("\n"); // END OF THE ENABLE/DISABLE SECTION OF THE CODE
|
||||
if (options.smart_disable || options.smart_enable ||
|
||||
options.smart_auto_save_disable || options.smart_auto_save_enable)
|
||||
pout("\n"); // END OF THE ENABLE/DISABLE SECTION OF THE CODE
|
||||
|
||||
// START OF READ-ONLY OPTIONS APART FROM -V and -i
|
||||
if ( options.smart_check_status || options.smart_ss_media_log
|
||||
|| options.smart_vendor_attrib || options.smart_error_log
|
||||
|| options.smart_selftest_log || options.smart_vendor_attrib
|
||||
|| options.smart_background_log || options.sasphy
|
||||
)
|
||||
pout("=== START OF READ SMART DATA SECTION ===\n");
|
||||
if (options.smart_check_status || options.smart_ss_media_log ||
|
||||
options.smart_vendor_attrib || options.smart_error_log ||
|
||||
options.smart_selftest_log || options.smart_background_log ||
|
||||
options.sasphy)
|
||||
pout("=== START OF READ SMART DATA SECTION ===\n");
|
||||
|
||||
if (options.smart_check_status) {
|
||||
scsiGetSupportedLogPages(device);
|
||||
checkedSupportedLogPages = 1;
|
||||
if ((SCSI_PT_SEQUENTIAL_ACCESS == peripheral_type) ||
|
||||
(SCSI_PT_MEDIUM_CHANGER == peripheral_type)) { /* tape device */
|
||||
if (is_tape) {
|
||||
if (gTapeAlertsLPage) {
|
||||
if (options.drive_info)
|
||||
pout("TapeAlert Supported\n");
|
||||
@ -2010,7 +2000,7 @@ scsiPrintMain(scsi_device * device, const scsi_print_options & options)
|
||||
any_output = true;
|
||||
}
|
||||
|
||||
if (options.smart_ss_media_log) {
|
||||
if (is_disk && options.smart_ss_media_log) {
|
||||
if (! checkedSupportedLogPages)
|
||||
scsiGetSupportedLogPages(device);
|
||||
res = 0;
|
||||
@ -2023,12 +2013,11 @@ scsiPrintMain(scsi_device * device, const scsi_print_options & options)
|
||||
if (options.smart_vendor_attrib) {
|
||||
if (! checkedSupportedLogPages)
|
||||
scsiGetSupportedLogPages(device);
|
||||
if (gTempLPage) {
|
||||
if (gTempLPage)
|
||||
scsiPrintTemp(device);
|
||||
}
|
||||
if (gStartStopLPage)
|
||||
scsiGetStartStopData(device);
|
||||
if (SCSI_PT_DIRECT_ACCESS == peripheral_type) {
|
||||
if (is_disk) {
|
||||
scsiPrintGrownDefectListLen(device);
|
||||
if (gSeagateCacheLPage)
|
||||
scsiPrintSeagateCacheLPage(device);
|
||||
@ -2088,21 +2077,19 @@ scsiPrintMain(scsi_device * device, const scsi_print_options & options)
|
||||
}
|
||||
// check if another test is running
|
||||
if (options.smart_short_selftest || options.smart_extend_selftest) {
|
||||
if (!scsiRequestSense(device, &sense_info) &&
|
||||
if (!scsiRequestSense(device, &sense_info) &&
|
||||
(sense_info.asc == 0x04 && sense_info.ascq == 0x09)) {
|
||||
if (!options.smart_selftest_force) {
|
||||
pout("Can't start self-test without aborting current test");
|
||||
if (sense_info.progress != -1) {
|
||||
pout(" (%d%% remaining)",
|
||||
100 - sense_info.progress * 100 / 65535);
|
||||
}
|
||||
pout(",\nadd '-t force' option to override, or run 'smartctl -X' "
|
||||
"to abort test.\n");
|
||||
return -1;
|
||||
}
|
||||
else
|
||||
scsiSmartSelfTestAbort(device);
|
||||
}
|
||||
if (!options.smart_selftest_force) {
|
||||
pout("Can't start self-test without aborting current test");
|
||||
if (sense_info.progress != -1)
|
||||
pout(" (%d%% remaining)",
|
||||
100 - sense_info.progress * 100 / 65535);
|
||||
pout(",\nadd '-t force' option to override, or run "
|
||||
"'smartctl -X' to abort test.\n");
|
||||
return -1;
|
||||
} else
|
||||
scsiSmartSelfTestAbort(device);
|
||||
}
|
||||
}
|
||||
if (options.smart_short_selftest) {
|
||||
if (scsiSmartShortSelfTest(device))
|
||||
@ -2145,8 +2132,8 @@ scsiPrintMain(scsi_device * device, const scsi_print_options & options)
|
||||
}
|
||||
|
||||
if (!any_output)
|
||||
pout("SCSI device successfully opened\n\n"
|
||||
"Use 'smartctl -a' (or '-x') to print SMART (and more) information\n\n");
|
||||
pout("SCSI device successfully opened\n\nUse 'smartctl -a' (or '-x') "
|
||||
"to print SMART (and more) information\n\n");
|
||||
|
||||
return returnval;
|
||||
}
|
||||
|
@ -1,7 +1,7 @@
|
||||
/*
|
||||
* scsiprint.h
|
||||
*
|
||||
* Home page of code is: http://smartmontools.sourceforge.net
|
||||
* Home page of code is: http://www.smartmontools.org
|
||||
*
|
||||
* Copyright (C) 2002-9 Bruce Allen <smartmontools-support@lists.sourceforge.net>
|
||||
* Copyright (C) 2000 Michael Cornwell <cornwell@acm.org>
|
||||
@ -29,7 +29,7 @@
|
||||
#ifndef SCSI_PRINT_H_
|
||||
#define SCSI_PRINT_H_
|
||||
|
||||
#define SCSIPRINT_H_CVSID "$Id: scsiprint.h 3776 2013-02-17 04:25:42Z dpgilbert $\n"
|
||||
#define SCSIPRINT_H_CVSID "$Id: scsiprint.h 4120 2015-08-27 16:12:21Z samm2 $\n"
|
||||
|
||||
// Options for scsiPrintMain
|
||||
struct scsi_print_options
|
||||
|
@ -2,7 +2,7 @@
|
||||
Copyright (C) 2002-10 Bruce Allen
|
||||
Copyright (C) 2004-15 Christian Franke
|
||||
|
||||
$Id: smartctl.8.in 4099 2015-05-30 17:32:13Z chrfranke $
|
||||
$Id: smartctl.8.in 4120 2015-08-27 16:12:21Z samm2 $
|
||||
|
||||
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
|
||||
@ -2233,7 +2233,7 @@ Alternatively send the info to the smartmontools support mailing list:
|
||||
|
||||
.SH REFERENCES
|
||||
Please see the following web site for more info:
|
||||
\fBhttp://smartmontools.sourceforge.net/\fP
|
||||
\fBhttp://www.smartmontools.org/\fP
|
||||
|
||||
An introductory article about smartmontools is \fIMonitoring Hard
|
||||
Disks with SMART\fP, by Bruce Allen, Linux Journal, January 2004,
|
||||
@ -2256,4 +2256,4 @@ Links to these and other documents may be found on the Links page of the
|
||||
.SH PACKAGE VERSION
|
||||
CURRENT_SVN_VERSION CURRENT_SVN_DATE CURRENT_SVN_REV
|
||||
.br
|
||||
$Id: smartctl.8.in 4099 2015-05-30 17:32:13Z chrfranke $
|
||||
$Id: smartctl.8.in 4120 2015-08-27 16:12:21Z samm2 $
|
||||
|
14
smartctl.cpp
14
smartctl.cpp
@ -1,7 +1,7 @@
|
||||
/*
|
||||
* smartctl.cpp
|
||||
*
|
||||
* Home page of code is: http://smartmontools.sourceforge.net
|
||||
* Home page of code is: http://www.smartmontools.org
|
||||
*
|
||||
* Copyright (C) 2002-11 Bruce Allen
|
||||
* Copyright (C) 2008-15 Christian Franke
|
||||
@ -51,7 +51,7 @@
|
||||
#include "smartctl.h"
|
||||
#include "utility.h"
|
||||
|
||||
const char * smartctl_cpp_cvsid = "$Id: smartctl.cpp 4080 2015-05-05 20:31:22Z chrfranke $"
|
||||
const char * smartctl_cpp_cvsid = "$Id: smartctl.cpp 4162 2015-10-31 16:36:16Z chrfranke $"
|
||||
CONFIG_H_CVSID SMARTCTL_H_CVSID;
|
||||
|
||||
// Globals to control printing
|
||||
@ -313,7 +313,7 @@ static const char * parse_options(int argc, char** argv,
|
||||
opterr=optopt=0;
|
||||
|
||||
const char * type = 0; // set to -d optarg
|
||||
bool no_defaultdb = false; // set true on '-B FILE'
|
||||
bool use_default_db = true; // set false on '-B FILE'
|
||||
bool output_format_set = false; // set true on '-f FORMAT'
|
||||
int scan = 0; // set by --scan, --scan-open
|
||||
bool badarg = false, captive = false;
|
||||
@ -665,7 +665,7 @@ static const char * parse_options(int argc, char** argv,
|
||||
} else if (!strcmp(optarg, "show")) {
|
||||
ataopts.show_presets = true;
|
||||
} else if (!strcmp(optarg, "showall")) {
|
||||
if (!no_defaultdb && !read_default_drive_databases())
|
||||
if (!init_drive_database(use_default_db))
|
||||
EXIT(FAILCMD);
|
||||
if (optind < argc) { // -P showall MODEL [FIRMWARE]
|
||||
int cnt = showmatchingpresets(argv[optind], (optind+1<argc ? argv[optind+1] : NULL));
|
||||
@ -805,7 +805,7 @@ static const char * parse_options(int argc, char** argv,
|
||||
if (*path == '+' && path[1])
|
||||
path++;
|
||||
else
|
||||
no_defaultdb = true;
|
||||
use_default_db = false;
|
||||
if (!read_drive_database(path))
|
||||
EXIT(FAILCMD);
|
||||
}
|
||||
@ -1001,7 +1001,7 @@ static const char * parse_options(int argc, char** argv,
|
||||
// Special handling of --scan, --scanopen
|
||||
if (scan) {
|
||||
// Read or init drive database to allow USB ID check.
|
||||
if (!no_defaultdb && !read_default_drive_databases())
|
||||
if (!init_drive_database(use_default_db))
|
||||
EXIT(FAILCMD);
|
||||
scan_devices(type, (scan == opt_scan_open), argv + optind);
|
||||
EXIT(0);
|
||||
@ -1079,7 +1079,7 @@ static const char * parse_options(int argc, char** argv,
|
||||
}
|
||||
|
||||
// Read or init drive database
|
||||
if (!no_defaultdb && !read_default_drive_databases())
|
||||
if (!init_drive_database(use_default_db))
|
||||
EXIT(FAILCMD);
|
||||
|
||||
return type;
|
||||
|
@ -1,7 +1,7 @@
|
||||
/*
|
||||
* smartctl.h
|
||||
*
|
||||
* Home page of code is: http://smartmontools.sourceforge.net
|
||||
* Home page of code is: http://www.smartmontools.org
|
||||
*
|
||||
* Copyright (C) 2002-10 Bruce Allen <smartmontools-support@lists.sourceforge.net>
|
||||
* Copyright (C) 2008-10 Christian Franke <smartmontools-support@lists.sourceforge.net>
|
||||
@ -26,7 +26,7 @@
|
||||
#ifndef SMARTCTL_H_
|
||||
#define SMARTCTL_H_
|
||||
|
||||
#define SMARTCTL_H_CVSID "$Id: smartctl.h 3727 2012-12-13 17:23:06Z samm2 $\n"
|
||||
#define SMARTCTL_H_CVSID "$Id: smartctl.h 4120 2015-08-27 16:12:21Z samm2 $\n"
|
||||
|
||||
// Return codes (bitmask)
|
||||
|
||||
|
@ -2,7 +2,7 @@
|
||||
Copyright (C) 2002-10 Bruce Allen
|
||||
Copyright (C) 2004-15 Christian Franke
|
||||
|
||||
$Id: smartd.8.in 4102 2015-06-01 19:25:47Z chrfranke $
|
||||
$Id: smartd.8.in 4120 2015-08-27 16:12:21Z samm2 $
|
||||
|
||||
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
|
||||
@ -745,7 +745,7 @@ Alternatively send the info to the smartmontools support mailing list:
|
||||
|
||||
.SH REFERENCES
|
||||
Please see the following web site for more info:
|
||||
\fBhttp://smartmontools.sourceforge.net/\fP
|
||||
\fBhttp://www.smartmontools.org/\fP
|
||||
|
||||
An introductory article about smartmontools is \fIMonitoring Hard
|
||||
Disks with SMART\fP, by Bruce Allen, Linux Journal, January 2004,
|
||||
@ -768,4 +768,4 @@ Links to these and other documents may be found on the Links page of the
|
||||
.SH PACKAGE VERSION
|
||||
CURRENT_SVN_VERSION CURRENT_SVN_DATE CURRENT_SVN_REV
|
||||
.br
|
||||
$Id: smartd.8.in 4102 2015-06-01 19:25:47Z chrfranke $
|
||||
$Id: smartd.8.in 4120 2015-08-27 16:12:21Z samm2 $
|
||||
|
@ -1,8 +1,8 @@
|
||||
# Sample configuration file for smartd. See man smartd.conf.
|
||||
|
||||
# Home page is: http://smartmontools.sourceforge.net
|
||||
# Home page is: http://www.smartmontools.org
|
||||
|
||||
# $Id: smartd.conf 4047 2015-03-22 16:16:24Z chrfranke $
|
||||
# $Id: smartd.conf 4120 2015-08-27 16:12:21Z samm2 $
|
||||
|
||||
# smartd will re-read the configuration file if it receives a HUP
|
||||
# signal
|
||||
|
82
smartd.cpp
82
smartd.cpp
@ -1,10 +1,10 @@
|
||||
/*
|
||||
* Home page of code is: http://smartmontools.sourceforge.net
|
||||
* Home page of code is: http://www.smartmontools.org
|
||||
*
|
||||
* Copyright (C) 2002-11 Bruce Allen <smartmontools-support@lists.sourceforge.net>
|
||||
* Copyright (C) 2002-11 Bruce Allen
|
||||
* Copyright (C) 2008-16 Christian Franke
|
||||
* Copyright (C) 2000 Michael Cornwell <cornwell@acm.org>
|
||||
* Copyright (C) 2008 Oliver Bock <brevilo@users.sourceforge.net>
|
||||
* Copyright (C) 2008-15 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
|
||||
@ -106,7 +106,7 @@ typedef int pid_t;
|
||||
extern "C" int getdomainname(char *, int); // no declaration in header files!
|
||||
#endif
|
||||
|
||||
const char * smartd_cpp_cvsid = "$Id: smartd.cpp 4059 2015-04-18 17:01:31Z chrfranke $"
|
||||
const char * smartd_cpp_cvsid = "$Id: smartd.cpp 4207 2016-01-22 19:35:10Z chrfranke $"
|
||||
CONFIG_H_CVSID;
|
||||
|
||||
// smartd exit codes
|
||||
@ -385,19 +385,21 @@ struct persistent_dev_state
|
||||
|
||||
// SCSI ONLY
|
||||
|
||||
struct scsi_error_counter {
|
||||
struct scsi_error_counter_t {
|
||||
struct scsiErrorCounter errCounter;
|
||||
unsigned char found;
|
||||
scsi_error_counter() : found(0) { }
|
||||
scsi_error_counter_t() : found(0)
|
||||
{ memset(&errCounter, 0, sizeof(errCounter)); }
|
||||
};
|
||||
scsi_error_counter scsi_error_counters[3];
|
||||
scsi_error_counter_t scsi_error_counters[3];
|
||||
|
||||
struct scsi_nonmedium_error {
|
||||
struct scsi_nonmedium_error_t {
|
||||
struct scsiNonMediumError nme;
|
||||
unsigned char found;
|
||||
scsi_nonmedium_error() : found(0) { }
|
||||
scsi_nonmedium_error_t() : found(0)
|
||||
{ memset(&nme, 0, sizeof(nme)); }
|
||||
};
|
||||
scsi_nonmedium_error scsi_nonmedium_error;
|
||||
scsi_nonmedium_error_t scsi_nonmedium_error;
|
||||
|
||||
persistent_dev_state();
|
||||
};
|
||||
@ -1056,13 +1058,13 @@ static void MailWarning(const dev_config & cfg, dev_state & state, int which, co
|
||||
env[11].set("SMARTD_NEXTDAYS", dates);
|
||||
|
||||
// now construct a command to send this as EMAIL
|
||||
char command[2048];
|
||||
if (!*executable)
|
||||
executable = "<mail>";
|
||||
const char * newadd = (!address.empty()? address.c_str() : "<nomailer>");
|
||||
const char * newwarn = (which? "Warning via" : "Test of");
|
||||
|
||||
#ifndef _WIN32
|
||||
char command[2048];
|
||||
snprintf(command, sizeof(command), "%s 2>&1", warning_script.c_str());
|
||||
|
||||
// tell SYSLOG what we are about to do...
|
||||
@ -1109,12 +1111,9 @@ static void MailWarning(const dev_config & cfg, dev_state & state, int which, co
|
||||
errno?strerror(errno):"");
|
||||
else {
|
||||
// mail process apparently succeeded. Check and report exit status
|
||||
int status8;
|
||||
|
||||
if (WIFEXITED(status)) {
|
||||
// exited 'normally' (but perhaps with nonzero status)
|
||||
status8=WEXITSTATUS(status);
|
||||
|
||||
int status8 = WEXITSTATUS(status);
|
||||
if (status8>128)
|
||||
PrintOut(LOG_CRIT,"%s %s to %s: failed (32-bit/8-bit exit status: %d/%d) perhaps caught signal %d [%s]\n",
|
||||
newwarn, executable, newadd, status, status8, status8-128, strsignal(status8-128));
|
||||
@ -1140,6 +1139,7 @@ static void MailWarning(const dev_config & cfg, dev_state & state, int which, co
|
||||
|
||||
#else // _WIN32
|
||||
{
|
||||
char command[2048];
|
||||
snprintf(command, sizeof(command), "cmd /c \"%s\"", warning_script.c_str());
|
||||
|
||||
char stdoutbuf[800]; // < buffer in syslog_win32::vsyslog()
|
||||
@ -1808,6 +1808,12 @@ static int ATADeviceScan(dev_config & cfg, dev_state & state, ata_device * atade
|
||||
}
|
||||
}
|
||||
|
||||
// Check for ATA Security LOCK
|
||||
unsigned short word128 = drive.words088_255[128-88];
|
||||
bool locked = ((word128 & 0x0007) == 0x0007); // LOCKED|ENABLED|SUPPORTED
|
||||
if (locked)
|
||||
PrintOut(LOG_INFO, "Device: %s, ATA Security is **LOCKED**\n", name);
|
||||
|
||||
// Set default '-C 197[+]' if no '-C ID' is specified.
|
||||
if (!cfg.curr_pending_set)
|
||||
cfg.curr_pending_id = get_unc_attr_id(false, cfg.attribute_defs, cfg.curr_pending_incr);
|
||||
@ -2110,6 +2116,9 @@ static int ATADeviceScan(dev_config & cfg, dev_state & state, ata_device * atade
|
||||
if (!isSCTErrorRecoveryControlCapable(&drive))
|
||||
PrintOut(LOG_INFO, "Device: %s, no SCT Error Recovery Control support, ignoring -l scterc\n",
|
||||
name);
|
||||
else if (locked)
|
||||
PrintOut(LOG_INFO, "Device: %s, no SCT support if ATA Security is LOCKED, ignoring -l scterc\n",
|
||||
name);
|
||||
else if ( ataSetSCTErrorRecoveryControltime(atadev, 1, cfg.sct_erc_readtime )
|
||||
|| ataSetSCTErrorRecoveryControltime(atadev, 2, cfg.sct_erc_writetime))
|
||||
PrintOut(LOG_INFO, "Device: %s, set of SCT Error Recovery Control failed\n", name);
|
||||
@ -2160,7 +2169,7 @@ static int ATADeviceScan(dev_config & cfg, dev_state & state, ata_device * atade
|
||||
// please.
|
||||
static int SCSIDeviceScan(dev_config & cfg, dev_state & state, scsi_device * scsidev)
|
||||
{
|
||||
int k, err, req_len, avail_len, version, len;
|
||||
int err, req_len, avail_len, version, len;
|
||||
const char *device = cfg.name.c_str();
|
||||
struct scsi_iec_mode_page iec;
|
||||
UINT8 tBuf[64];
|
||||
@ -2289,7 +2298,7 @@ static int SCSIDeviceScan(dev_config & cfg, dev_state & state, scsi_device * scs
|
||||
// Flag that certain log pages are supported (information may be
|
||||
// available from other sources).
|
||||
if (0 == scsiLogSense(scsidev, SUPPORTED_LPAGES, 0, tBuf, sizeof(tBuf), 0)) {
|
||||
for (k = 4; k < tBuf[3] + LOGPAGEHDRSIZE; ++k) {
|
||||
for (int k = 4; k < tBuf[3] + LOGPAGEHDRSIZE; ++k) {
|
||||
switch (tBuf[k]) {
|
||||
case TEMPERATURE_LPAGE:
|
||||
state.TempPageSupported = 1;
|
||||
@ -3222,12 +3231,7 @@ static int ATACheckDevice(const dev_config & cfg, dev_state & state, ata_device
|
||||
|
||||
static int SCSICheckDevice(const dev_config & cfg, dev_state & state, scsi_device * scsidev, bool allow_selftests)
|
||||
{
|
||||
UINT8 asc, ascq;
|
||||
UINT8 currenttemp;
|
||||
UINT8 triptemp;
|
||||
UINT8 tBuf[252];
|
||||
const char * name = cfg.name.c_str();
|
||||
const char *cp;
|
||||
|
||||
// If the user has asked for it, test the email warning system
|
||||
if (cfg.emailtest)
|
||||
@ -3242,9 +3246,9 @@ static int SCSICheckDevice(const dev_config & cfg, dev_state & state, scsi_devic
|
||||
} else if (debugmode)
|
||||
PrintOut(LOG_INFO,"Device: %s, opened SCSI device\n", name);
|
||||
reset_warning_mail(cfg, state, 9, "open device worked again");
|
||||
currenttemp = 0;
|
||||
asc = 0;
|
||||
ascq = 0;
|
||||
|
||||
UINT8 asc = 0, ascq = 0;
|
||||
UINT8 currenttemp = 0, triptemp = 0;
|
||||
if (!state.SuppressReport) {
|
||||
if (scsiCheckIE(scsidev, state.SmartPageSupported, state.TempPageSupported,
|
||||
&asc, &ascq, ¤ttemp, &triptemp)) {
|
||||
@ -3255,7 +3259,7 @@ static int SCSICheckDevice(const dev_config & cfg, dev_state & state, scsi_devic
|
||||
}
|
||||
}
|
||||
if (asc > 0) {
|
||||
cp = scsiGetIEString(asc, ascq);
|
||||
const char * cp = scsiGetIEString(asc, ascq);
|
||||
if (cp) {
|
||||
PrintOut(LOG_CRIT, "Device: %s, SMART Failure: %s\n", name, cp);
|
||||
MailWarning(cfg, state, 1,"Device: %s, SMART Failure: %s", name, cp);
|
||||
@ -3282,6 +3286,7 @@ static int SCSICheckDevice(const dev_config & cfg, dev_state & state, scsi_devic
|
||||
}
|
||||
if (!cfg.attrlog_file.empty()){
|
||||
// saving error counters to state
|
||||
UINT8 tBuf[252];
|
||||
if (state.ReadECounterPageSupported && (0 == scsiLogSense(scsidev,
|
||||
READ_ERROR_COUNTER_LPAGE, 0, tBuf, sizeof(tBuf), 0))) {
|
||||
scsiDecodeErrCounterPage(tBuf, &state.scsi_error_counters[0].errCounter);
|
||||
@ -3902,13 +3907,13 @@ static int ParseToken(char * token, dev_config & cfg)
|
||||
configfile, lineno, name, arg, cfg.test_regex.get_errmsg());
|
||||
return -1;
|
||||
}
|
||||
// Do a bit of sanity checking and warn user if we think that
|
||||
// their regexp is "strange". User probably confused about shell
|
||||
// glob(3) syntax versus regular expression syntax regexp(7).
|
||||
if (arg[(val = strspn(arg, "0123456789/.-+*|()?^$[]SLCOcnr"))])
|
||||
PrintOut(LOG_INFO, "File %s line %d (drive %s): warning, character %d (%c) looks odd in extended regular expression %s\n",
|
||||
configfile, lineno, name, val+1, arg[val], arg);
|
||||
}
|
||||
// Do a bit of sanity checking and warn user if we think that
|
||||
// their regexp is "strange". User probably confused about shell
|
||||
// glob(3) syntax versus regular expression syntax regexp(7).
|
||||
if (arg[(val = strspn(arg, "0123456789/.-+*|()?^$[]SLCOcnr"))])
|
||||
PrintOut(LOG_INFO, "File %s line %d (drive %s): warning, character %d (%c) looks odd in extended regular expression %s\n",
|
||||
configfile, lineno, name, val+1, arg[val], arg);
|
||||
break;
|
||||
case 'm':
|
||||
// send email to address that follows
|
||||
@ -4002,8 +4007,8 @@ static int ParseToken(char * token, dev_config & cfg)
|
||||
break;
|
||||
case 'W':
|
||||
// track Temperature
|
||||
if ((val=Get3Integers(arg=strtok(NULL,delim), name, token, lineno, configfile,
|
||||
&cfg.tempdiff, &cfg.tempinfo, &cfg.tempcrit))<0)
|
||||
if (Get3Integers(arg=strtok(NULL, delim), name, token, lineno, configfile,
|
||||
&cfg.tempdiff, &cfg.tempinfo, &cfg.tempcrit) < 0)
|
||||
return -1;
|
||||
break;
|
||||
case 'v':
|
||||
@ -4300,7 +4305,6 @@ static int ParseConfigFile(dev_config_vector & conf_entries)
|
||||
if (scandevice==-2)
|
||||
return -1;
|
||||
// the final line is part of a continuation line
|
||||
cont=0;
|
||||
entry+=scandevice;
|
||||
}
|
||||
break;
|
||||
@ -4446,7 +4450,7 @@ static void ParseOpts(int argc, char **argv)
|
||||
|
||||
opterr=optopt=0;
|
||||
bool badarg = false;
|
||||
bool no_defaultdb = false; // set true on '-B FILE'
|
||||
bool use_default_db = true; // set false on '-B FILE'
|
||||
|
||||
// Parse input options.
|
||||
int optchar;
|
||||
@ -4587,7 +4591,7 @@ static void ParseOpts(int argc, char **argv)
|
||||
if (*path == '+' && path[1])
|
||||
path++;
|
||||
else
|
||||
no_defaultdb = true;
|
||||
use_default_db = false;
|
||||
unsigned char savedebug = debugmode; debugmode = 1;
|
||||
if (!read_drive_database(path))
|
||||
EXIT(EXIT_BADCMD);
|
||||
@ -4692,9 +4696,9 @@ static void ParseOpts(int argc, char **argv)
|
||||
#endif
|
||||
|
||||
// Read or init drive database
|
||||
if (!no_defaultdb) {
|
||||
{
|
||||
unsigned char savedebug = debugmode; debugmode = 1;
|
||||
if (!read_default_drive_databases())
|
||||
if (!init_drive_database(use_default_db))
|
||||
EXIT(EXIT_BADCMD);
|
||||
debugmode = savedebug;
|
||||
}
|
||||
|
@ -2,7 +2,7 @@
|
||||
|
||||
# smartmontools init file for smartd
|
||||
# Copyright (C) 2002-8 Bruce Allen <smartmontools-support@lists.sourceforge.net>
|
||||
# $Id: smartd.initd.in 3727 2012-12-13 17:23:06Z samm2 $
|
||||
# $Id: smartd.initd.in 4120 2015-08-27 16:12:21Z samm2 $
|
||||
|
||||
# For RedHat and cousins:
|
||||
# chkconfig: 2345 40 40
|
||||
@ -540,7 +540,7 @@ elif uname | grep -i CYGWIN > /dev/null 2>&1 ; then
|
||||
Controls and monitors storage devices using the Self-Monitoring \
|
||||
Analysis and Reporting Technology System (S.M.A.R.T.) \
|
||||
built into ATA and SCSI Hard Drives. \
|
||||
http://smartmontools.sourceforge.net/"
|
||||
http://www.smartmontools.org/"
|
||||
|
||||
# Source configuration file. This should define the shell variable smartd_opts.
|
||||
# Email smartmontools-support@lists.sourceforge.net if there is a better choice
|
||||
|
@ -1,8 +1,8 @@
|
||||
.ig
|
||||
Copyright (C) 2013 Hannes von Haugwitz <hannes@vonhaugwitz.com>
|
||||
Copyright (C) 2014-15 Christian Franke <smartmontools-support@lists.sourceforge.net>
|
||||
Copyright (C) 2014-15 Christian Franke
|
||||
|
||||
$Id: update-smart-drivedb.8.in 4054 2015-04-15 19:04:49Z chrfranke $
|
||||
$Id: update-smart-drivedb.8.in 4193 2015-12-19 14:43:50Z chrfranke $
|
||||
|
||||
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
|
||||
@ -19,10 +19,15 @@ update-smart-drivedb \- update smartmontools drive database
|
||||
|
||||
.SH "SYNOPSIS"
|
||||
.B update-smart-drivedb
|
||||
.RB [ -v ]
|
||||
.RI [ OPTIONS ]
|
||||
.RI [ DESTFILE ]
|
||||
|
||||
.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
|
||||
.B update-smart-drivedb
|
||||
updates
|
||||
.B /usr/local/share/smartmontools/drivedb.h
|
||||
@ -33,18 +38,18 @@ from smartmontools SVN repository.
|
||||
It tries to download first from the current branch and then from
|
||||
trunk. The tools used for downloading are either
|
||||
.BR curl (1),
|
||||
.BR wget "(1) or"
|
||||
.BR lynx (1).
|
||||
.BR wget (1),
|
||||
.BR lynx (1),
|
||||
.\" %IF OS FreeBSD
|
||||
On FreeBSD,
|
||||
.BR fetch (1)
|
||||
is used as a fallback.
|
||||
[FreeBSD only],
|
||||
.\" %ENDIF OS FreeBSD
|
||||
.\" %IF OS OpenBSD
|
||||
On OpenBSD,
|
||||
.BR ftp (1)
|
||||
is used as a fallback.
|
||||
[OpenBSD only],
|
||||
.\" %ENDIF OS OpenBSD
|
||||
or
|
||||
.BR svn (1).
|
||||
|
||||
The old file is kept if the downloaded file is identical (ignoring
|
||||
the differences in Id string) otherwise it is moved to
|
||||
@ -52,8 +57,60 @@ the differences in Id string) otherwise it is moved to
|
||||
|
||||
.SH "OPTIONS"
|
||||
.TP
|
||||
\-v
|
||||
verbose output
|
||||
.B \-s SMARTCTL
|
||||
Use the
|
||||
.BR smartctl (8)
|
||||
executable at path SMARTCTL for drive database syntax check.
|
||||
The form \'\-s \-\' disables the syntax check.
|
||||
The default is
|
||||
.BR /usr/local/sbin/smartctl .
|
||||
.TP
|
||||
.B \-t TOOL
|
||||
Use TOOL for download.
|
||||
TOOL is one of:
|
||||
.I curl wget lynx
|
||||
.\" %IF OS FreeBSD
|
||||
.I fetch
|
||||
.\" %ENDIF OS FreeBSD
|
||||
.\" %IF OS OpenBSD
|
||||
.I ftp
|
||||
.\" %ENDIF OS OpenBSD
|
||||
.IR svn .
|
||||
The default is the first one found in PATH.
|
||||
.TP
|
||||
.B \-u LOCATION
|
||||
Use URL of LOCATION for download. LOCATION is one of:
|
||||
.br
|
||||
.I sf
|
||||
(Sourceforge code browser via HTTP),
|
||||
.br
|
||||
.I svn
|
||||
(SVN repository via HTTPS),
|
||||
.br
|
||||
.I svni
|
||||
(SVN repository via HTTP),
|
||||
.br
|
||||
.I trac
|
||||
(Trac code browser via HTTPS).
|
||||
.br
|
||||
The default is
|
||||
.IR svn .
|
||||
.TP
|
||||
.B \-\-cacert FILE
|
||||
Use CA certificates from FILE to verify the peer.
|
||||
.TP
|
||||
.B \-\-capath DIR
|
||||
Use CA certificate files from DIR to verify the peer.
|
||||
.TP
|
||||
.B \-\-insecure
|
||||
Don't abort download if certificate verification fails.
|
||||
This option is also required if a HTTP URL is selected with \'-u\' option.
|
||||
.TP
|
||||
.B \-\-dryrun
|
||||
Print download commands only.
|
||||
.TP
|
||||
.B \-v
|
||||
Verbose output.
|
||||
|
||||
.SH "EXAMPLES"
|
||||
.nf
|
||||
@ -80,7 +137,7 @@ current drive database.
|
||||
previous drive database.
|
||||
.TP
|
||||
.B /usr/local/share/smartmontools/drivedb.h.error
|
||||
new drive database rejected due to syntax errors.
|
||||
new drive database if rejected due to syntax errors.
|
||||
.TP
|
||||
.B /usr/local/share/smartmontools/drivedb.h.lastcheck
|
||||
empty file created if downloaded file was identical.
|
||||
@ -106,4 +163,4 @@ Alternatively send the info to the smartmontools support mailing list:
|
||||
.SH PACKAGE VERSION
|
||||
CURRENT_SVN_VERSION CURRENT_SVN_DATE CURRENT_SVN_REV
|
||||
.br
|
||||
$Id: update-smart-drivedb.8.in 4054 2015-04-15 19:04:49Z chrfranke $
|
||||
$Id: update-smart-drivedb.8.in 4193 2015-12-19 14:43:50Z chrfranke $
|
||||
|
@ -2,7 +2,7 @@
|
||||
#
|
||||
# smartmontools drive database update script
|
||||
#
|
||||
# Copyright (C) 2010-14 Christian Franke <smartmontools-support@lists.sourceforge.net>
|
||||
# Copyright (C) 2010-15 Christian Franke
|
||||
#
|
||||
# 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
|
||||
@ -12,7 +12,7 @@
|
||||
# You should have received a copy of the GNU General Public License
|
||||
# (for example COPYING); If not, see <http://www.gnu.org/licenses/>.
|
||||
#
|
||||
# $Id: update-smart-drivedb.in 4019 2014-12-06 20:12:50Z chrfranke $
|
||||
# $Id: update-smart-drivedb.in 4184 2015-12-14 19:20:44Z chrfranke $
|
||||
#
|
||||
|
||||
set -e
|
||||
@ -34,104 +34,342 @@ os_dltools="@os_dltools@"
|
||||
BRANCH="@DRIVEDB_BRANCH@"
|
||||
|
||||
# Default drivedb location
|
||||
DEST="$drivedbdir/drivedb.h"
|
||||
DRIVEDB="$drivedbdir/drivedb.h"
|
||||
|
||||
# Smartctl used for syntax check
|
||||
SMARTCTL="$sbindir/smartctl"
|
||||
|
||||
# Download URL for sourceforge code browser
|
||||
SRCEXPR='http://sourceforge.net/p/smartmontools/code/HEAD/tree/$location/smartmontools/drivedb.h?format=raw'
|
||||
myname=$0
|
||||
|
||||
# Parse options
|
||||
q="-q "
|
||||
case "$1" in
|
||||
-v) q=; shift ;;
|
||||
esac
|
||||
|
||||
case "$*" in
|
||||
-*|*\ *)
|
||||
cat <<EOF
|
||||
usage()
|
||||
{
|
||||
cat <<EOF
|
||||
smartmontools $VERSION drive database update script
|
||||
|
||||
Usage: $0 [-v] [DESTFILE]
|
||||
Usage: $myname [OPTIONS] [DESTFILE]
|
||||
|
||||
-v verbose output
|
||||
-s SMARTCTL Use SMARTCTL for syntax check ('-s -' to disable)
|
||||
[default: $SMARTCTL]
|
||||
-t TOOL Use TOOL for download: $os_dltools
|
||||
[default: first one found in PATH]
|
||||
-u LOCATION Use URL of LOCATION for download:
|
||||
sf (Sourceforge code browser via HTTP)
|
||||
svn (SVN repository via HTTPS) [default]
|
||||
svni (SVN repository via HTTP)
|
||||
trac (Trac code browser via HTTPS)
|
||||
--cacert FILE Use CA certificates from FILE to verify the peer
|
||||
--capath DIR Use CA certificate files from DIR to verify the peer
|
||||
--insecure Don't abort download if certificate verification fails
|
||||
--dryrun Print download commands only
|
||||
-v Verbose output
|
||||
|
||||
Updates $DEST
|
||||
Updates $DRIVEDB
|
||||
or DESTFILE from smartmontools SVN repository.
|
||||
Tries to download first from branch $BRANCH
|
||||
and then from trunk.
|
||||
EOF
|
||||
exit 1
|
||||
;;
|
||||
exit 1
|
||||
}
|
||||
|
||||
"") ;;
|
||||
*) DEST="$1" ;;
|
||||
error()
|
||||
{
|
||||
echo "$myname: $*" >&2
|
||||
exit 1
|
||||
}
|
||||
|
||||
warning()
|
||||
{
|
||||
echo "$myname: (Warning) $*" >&2
|
||||
}
|
||||
|
||||
selecturl()
|
||||
{
|
||||
case $1 in
|
||||
sf) url='http://sourceforge.net/p/smartmontools/code/HEAD/tree/trunk/smartmontools/drivedb.h?format=raw' ;;
|
||||
svn) url='https://svn.code.sf.net/p/smartmontools/code/trunk/smartmontools/drivedb.h' ;;
|
||||
svni) url='http://svn.code.sf.net/p/smartmontools/code/trunk/smartmontools/drivedb.h' ;;
|
||||
trac) url='https://www.smartmontools.org/export/HEAD/trunk/smartmontools/drivedb.h' ;;
|
||||
*) usage ;;
|
||||
esac
|
||||
}
|
||||
|
||||
inpath()
|
||||
{
|
||||
local d rc save
|
||||
rc=1
|
||||
save=$IFS
|
||||
IFS=':'
|
||||
for d in $PATH; do
|
||||
test -f "$d/$1" || continue
|
||||
test -x "$d/$1" || continue
|
||||
rc=0
|
||||
break
|
||||
done
|
||||
IFS=$save
|
||||
return $rc
|
||||
}
|
||||
|
||||
vecho()
|
||||
{
|
||||
test -n "$q" || echo "$*"
|
||||
}
|
||||
|
||||
# vrun COMMAND ARGS...
|
||||
vrun()
|
||||
{
|
||||
if [ -n "$dryrun" ]; then
|
||||
echo "$*"
|
||||
elif [ -n "$q" ]; then
|
||||
"$@" 2>/dev/null
|
||||
else
|
||||
echo "$*"
|
||||
"$@"
|
||||
fi
|
||||
}
|
||||
|
||||
# vrun2 OUTFILE COMMAND ARGS...
|
||||
vrun2()
|
||||
{
|
||||
local f err rc
|
||||
f=$1; shift
|
||||
rc=0
|
||||
if [ -n "$dryrun" ]; then
|
||||
echo "$* > $f"
|
||||
else
|
||||
vecho "$* > $f"
|
||||
err=`"$@" 2>&1 > $f` || rc=$?
|
||||
if [ -n "$err" ]; then
|
||||
vecho "$err" >&2
|
||||
test $rc != 0 || rc=42
|
||||
fi
|
||||
fi
|
||||
return $rc
|
||||
}
|
||||
|
||||
# download URL FILE
|
||||
download()
|
||||
{
|
||||
local f u se rc
|
||||
u=$1; f=$2
|
||||
rc=0
|
||||
|
||||
case $tool in
|
||||
curl)
|
||||
vrun curl ${q:+-s} -f --max-redirs 0 \
|
||||
${cacert:+--cacert "$cacert"} \
|
||||
${capath:+--capath "$capath"} \
|
||||
${insecure:+--insecure} \
|
||||
-o "$f" "$u" || rc=$?
|
||||
;;
|
||||
|
||||
wget)
|
||||
vrun wget $q --max-redirect=0 \
|
||||
${cacert:+--ca-certificate="$cacert"} \
|
||||
${capath:+--ca-directory="$capath"} \
|
||||
${insecure:+--no-check-certificate} \
|
||||
-O "$f" "$u" || rc=$?
|
||||
;;
|
||||
|
||||
lynx)
|
||||
test -z "$cacert" || vrun export SSL_CERT_FILE="$cacert"
|
||||
test -z "$capath" || vrun export SSL_CERT_DIR="$capath"
|
||||
# Check also stderr as lynx does not return != 0 on HTTP error
|
||||
vrun2 "$f" lynx -stderr -noredir -source "$u" || rc=$?
|
||||
;;
|
||||
|
||||
svn)
|
||||
vrun svn $q export \
|
||||
--non-interactive --no-auth-cache \
|
||||
${cacert:+--config-option "servers:global:ssl-trust-default-ca=no"} \
|
||||
${cacert:+--config-option "servers:global:ssl-authority-files=$cacert"} \
|
||||
${insecure:+--trust-server-cert} \
|
||||
"$u" "$f" || rc=$?
|
||||
;;
|
||||
|
||||
fetch) # FreeBSD
|
||||
vrun fetch $q --no-redirect \
|
||||
${cacert:+--ca-cert "$cacert"} \
|
||||
${capath:+--ca-path "$capath"} \
|
||||
${insecure:+--no-verify-hostname} \
|
||||
-o "$f" "$u" || rc=$?
|
||||
;;
|
||||
|
||||
ftp) # OpenBSD
|
||||
vrun ftp \
|
||||
${cacert:+-S cafile="$cacert"} \
|
||||
${capath:+-S capath="$capath"} \
|
||||
${insecure:+-S dont} \
|
||||
-o "$f" "$u" || rc=$?
|
||||
;;
|
||||
|
||||
*) error "$tool: unknown (internal error)" ;;
|
||||
esac
|
||||
return $rc
|
||||
}
|
||||
|
||||
# Parse options
|
||||
smtctl=$SMARTCTL
|
||||
tool=
|
||||
url=
|
||||
q="-q"
|
||||
dryrun=
|
||||
cacert=
|
||||
capath=
|
||||
insecure=
|
||||
|
||||
while true; do case $1 in
|
||||
-s)
|
||||
shift; test -n "$1" || usage
|
||||
smtctl=$1 ;;
|
||||
|
||||
-t)
|
||||
shift
|
||||
case $1 in *\ *) usage ;; esac
|
||||
case " $os_dltools " in *\ $1\ *) ;; *) usage ;; esac
|
||||
tool=$1 ;;
|
||||
|
||||
-u)
|
||||
shift; selecturl "$1" ;;
|
||||
|
||||
-v)
|
||||
q= ;;
|
||||
|
||||
--dryrun)
|
||||
dryrun=t ;;
|
||||
|
||||
--cacert)
|
||||
shift; test -n "$1" || usage
|
||||
cacert=$1 ;;
|
||||
|
||||
--capath)
|
||||
shift; test -n "$1" || usage
|
||||
capath=$1 ;;
|
||||
|
||||
--insecure)
|
||||
insecure=t ;;
|
||||
|
||||
-*)
|
||||
usage ;;
|
||||
|
||||
*)
|
||||
break ;;
|
||||
esac; shift; done
|
||||
|
||||
case $# in
|
||||
0) DEST=$DRIVEDB ;;
|
||||
1) DEST=$1 ;;
|
||||
*) usage ;;
|
||||
esac
|
||||
|
||||
# Abort if 'which' is not available
|
||||
which which >/dev/null || exit 1
|
||||
|
||||
# Find download tool
|
||||
DOWNLOAD=
|
||||
for t in $os_dltools; do
|
||||
if which $t >/dev/null 2>/dev/null; then
|
||||
case $t in
|
||||
curl) DOWNLOAD="curl ${q:+-s }"'-f -o "$DEST.new" "$SRC"' ;;
|
||||
lynx) DOWNLOAD='lynx -source "$SRC" >"$DEST.new"' ;;
|
||||
wget) DOWNLOAD="wget $q"'-O "$DEST.new" "$SRC"' ;;
|
||||
fetch) DOWNLOAD='fetch -o "$DEST.new" "$SRC"' ;; # FreeBSD
|
||||
ftp) DOWNLOAD='ftp -o "$DEST.new" "$SRC"' ;; # OpenBSD
|
||||
esac
|
||||
break
|
||||
fi
|
||||
done
|
||||
if [ -z "$DOWNLOAD" ]; then
|
||||
echo "$0: found none of: $os_dltools" >&2; exit 1
|
||||
if [ -z "$tool" ]; then
|
||||
# Find download tool in PATH
|
||||
for t in $os_dltools; do
|
||||
if inpath "$t"; then
|
||||
tool=$t
|
||||
break
|
||||
fi
|
||||
done
|
||||
test -n "$tool" || error "found none of: $os_dltools"
|
||||
fi
|
||||
|
||||
test -n "$url" || selecturl "svn"
|
||||
|
||||
# Check option compatibility
|
||||
case "$tool:$url" in
|
||||
svn:http*://svn.code.sf.net*) ;;
|
||||
svn:*) error "'-t svn' requires '-u svn' or '-u svni'" ;;
|
||||
esac
|
||||
case "$tool:${capath:+set}" in
|
||||
svn:set) warning "'--capath' is ignored if '-t svn' is used" ;;
|
||||
esac
|
||||
case "${insecure:-f}:$url" in
|
||||
t:http:*) insecure= ;;
|
||||
?:https:*) ;;
|
||||
*) error "'-u sf' and '-u svni' require '--insecure'" ;;
|
||||
esac
|
||||
case "$tool:$insecure" in
|
||||
lynx:t) warning "'--insecure' is ignored if '-t lynx' is used" ;;
|
||||
esac
|
||||
|
||||
# Try possible branch first, then trunk
|
||||
errmsg=
|
||||
errmsg2=
|
||||
for location in "branches/$BRANCH" "trunk"; do
|
||||
test -n "$q" || echo "Download from $location"
|
||||
test -z "$errmsg" || errmsg2=$errmsg
|
||||
vecho "Download from $location with $tool"
|
||||
|
||||
# Adjust URL
|
||||
case $location in
|
||||
trunk) src=$url ;;
|
||||
*) src=`echo "$url" | sed "s,/trunk/,/$location/,"` ;;
|
||||
esac
|
||||
|
||||
# Download
|
||||
test -n "$dryrun" || rm -f "$DEST.new" || exit 1
|
||||
rc=0
|
||||
download "$src" "$DEST.new" || rc=$?
|
||||
test -z "$dryrun" || continue
|
||||
|
||||
errmsg=
|
||||
rm -f "$DEST.new"
|
||||
SRC="`eval echo "$SRCEXPR"`"
|
||||
|
||||
if (eval $DOWNLOAD); then :; else
|
||||
errmsg="download from $location failed (HTTP error)"
|
||||
if [ $rc != 0 ]; then
|
||||
errmsg="download from $location failed ($tool: exit $rc)"
|
||||
continue
|
||||
fi
|
||||
if grep -i '<title>.*Error has Occurred' "$DEST.new" >/dev/null; then
|
||||
errmsg="download from $location failed (SF code browser error)"
|
||||
|
||||
# Check file contents
|
||||
case `sed 1q "$DEST.new"` in
|
||||
/*) ;;
|
||||
\<*)
|
||||
errmsg="download from $location failed (HTML error message)"
|
||||
continue ;;
|
||||
*)
|
||||
errmsg="download from $location failed (Unknown file contents)"
|
||||
continue ;;
|
||||
esac
|
||||
|
||||
# Check file size
|
||||
size=`wc -c < "$DEST.new"`
|
||||
if [ "$size" -lt 10000 ]; then
|
||||
errmsg="download from $location failed (too small file size $size bytes)"
|
||||
continue
|
||||
fi
|
||||
if [ "$size" -gt 1000000 ]; then
|
||||
errmsg="download from $location failed (too large file size $size bytes)"
|
||||
break
|
||||
fi
|
||||
|
||||
break
|
||||
done
|
||||
|
||||
test -z "$dryrun" || exit 0
|
||||
|
||||
if [ -n "$errmsg" ]; then
|
||||
rm -f "$DEST.new"
|
||||
echo "$0: $errmsg" >&2
|
||||
exit 1
|
||||
test -z "$errmsg2" || echo "$myname: $errmsg2" >&2
|
||||
error "$errmsg"
|
||||
fi
|
||||
|
||||
# Adjust timestamp and permissions
|
||||
touch "$DEST.new"
|
||||
chmod 0644 "$DEST.new"
|
||||
|
||||
# Check syntax
|
||||
rm -f "$DEST.error"
|
||||
if "$SMARTCTL" -B "$DEST.new" -P showall >/dev/null; then :; else
|
||||
mv "$DEST.new" "$DEST.error"
|
||||
echo "$DEST.error: rejected by $SMARTCTL, probably no longer compatible" >&2
|
||||
exit 1
|
||||
if [ "$smtctl" != "-" ]; then
|
||||
# Check syntax
|
||||
rm -f "$DEST.error"
|
||||
if "$smtctl" -B "$DEST.new" -P showall >/dev/null; then
|
||||
test -n "$q" || echo "$smtctl: syntax OK"
|
||||
else
|
||||
mv "$DEST.new" "$DEST.error"
|
||||
echo "$DEST.error: rejected by $smtctl, probably no longer compatible" >&2
|
||||
exit 1
|
||||
fi
|
||||
fi
|
||||
|
||||
# Keep old file if identical
|
||||
# Keep old file if identical, ignore differences in Id string
|
||||
rm -f "$DEST.lastcheck"
|
||||
if [ -f "$DEST" ]; then
|
||||
if cmp "$DEST" "$DEST.new" >/dev/null 2>/dev/null; then
|
||||
if cat "$DEST" | sed 's|\$''Id''[^$]*\$|$''Id''$|' \
|
||||
| cmp - "$DEST.new" >/dev/null 2>/dev/null; then
|
||||
rm -f "$DEST.new"
|
||||
touch "$DEST.lastcheck"
|
||||
echo "$DEST is already up to date"
|
||||
|
15
utility.cpp
15
utility.cpp
@ -1,10 +1,10 @@
|
||||
/*
|
||||
* utility.cpp
|
||||
*
|
||||
* Home page of code is: http://smartmontools.sourceforge.net
|
||||
* Home page of code is: http://www.smartmontools.org
|
||||
*
|
||||
* Copyright (C) 2002-12 Bruce Allen <smartmontools-support@lists.sourceforge.net>
|
||||
* Copyright (C) 2008-15 Christian Franke <smartmontools-support@lists.sourceforge.net>
|
||||
* Copyright (C) 2002-12 Bruce Allen
|
||||
* Copyright (C) 2008-16 Christian Franke
|
||||
* Copyright (C) 2000 Michael Cornwell <cornwell@acm.org>
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
@ -52,7 +52,7 @@
|
||||
#include "atacmds.h"
|
||||
#include "dev_interface.h"
|
||||
|
||||
const char * utility_cpp_cvsid = "$Id: utility.cpp 4031 2015-01-01 10:47:48Z chrfranke $"
|
||||
const char * utility_cpp_cvsid = "$Id: utility.cpp 4194 2016-01-01 13:46:00Z chrfranke $"
|
||||
UTILITY_H_CVSID INT64_H_CVSID;
|
||||
|
||||
const char * packet_types[] = {
|
||||
@ -90,7 +90,7 @@ std::string format_version_info(const char * prog_name, bool full /*= false*/)
|
||||
"(build date " __DATE__ ")" // checkout without expansion of Id keywords
|
||||
#endif
|
||||
" [%s] " BUILD_INFO "\n"
|
||||
"Copyright (C) 2002-15, Bruce Allen, Christian Franke, www.smartmontools.org\n",
|
||||
"Copyright (C) 2002-16, Bruce Allen, Christian Franke, www.smartmontools.org\n",
|
||||
prog_name, smi()->get_os_version_str().c_str()
|
||||
);
|
||||
if (!full)
|
||||
@ -291,9 +291,6 @@ void dateandtimezoneepoch(char *buffer, time_t tval){
|
||||
const char *timezonename;
|
||||
char datebuffer[DATEANDEPOCHLEN];
|
||||
int lenm1;
|
||||
#ifdef _WIN32
|
||||
char tzfixbuf[6+1];
|
||||
#endif
|
||||
|
||||
FixGlibcTimeZoneBug();
|
||||
|
||||
@ -323,6 +320,8 @@ void dateandtimezoneepoch(char *buffer, time_t tval){
|
||||
|
||||
#ifdef _WIN32
|
||||
// Fix long non-ascii timezone names
|
||||
// cppcheck-suppress variableScope
|
||||
char tzfixbuf[6+1] = "";
|
||||
if (!getenv("TZ"))
|
||||
timezonename=fixtzname(tzfixbuf, sizeof(tzfixbuf), timezonename);
|
||||
#endif
|
||||
|
12
utility.h
12
utility.h
@ -1,10 +1,10 @@
|
||||
/*
|
||||
* utility.h
|
||||
*
|
||||
* Home page of code is: http://smartmontools.sourceforge.net
|
||||
* Home page of code is: http://www.smartmontools.org
|
||||
*
|
||||
* Copyright (C) 2002-11 Bruce Allen <smartmontools-support@lists.sourceforge.net>
|
||||
* Copyright (C) 2008-14 Christian Franke <smartmontools-support@lists.sourceforge.net>
|
||||
* Copyright (C) 2002-11 Bruce Allen
|
||||
* Copyright (C) 2008-15 Christian Franke
|
||||
* Copyright (C) 2000 Michael Cornwell <cornwell@acm.org>
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
@ -25,7 +25,7 @@
|
||||
#ifndef UTILITY_H_
|
||||
#define UTILITY_H_
|
||||
|
||||
#define UTILITY_H_CVSID "$Id: utility.h 4028 2014-12-13 14:59:48Z chrfranke $"
|
||||
#define UTILITY_H_CVSID "$Id: utility.h 4145 2015-10-17 12:01:38Z chrfranke $"
|
||||
|
||||
#include <time.h>
|
||||
#include <sys/types.h> // for regex.h (according to POSIX)
|
||||
@ -194,6 +194,8 @@ public:
|
||||
|
||||
bool open(const char * name, const char * mode)
|
||||
{
|
||||
if (m_file && m_owner)
|
||||
fclose(m_file);
|
||||
m_file = fopen(name, mode);
|
||||
m_owner = true;
|
||||
return !!m_file;
|
||||
@ -201,6 +203,8 @@ public:
|
||||
|
||||
void open(FILE * f, bool owner = false)
|
||||
{
|
||||
if (m_file && m_owner)
|
||||
fclose(m_file);
|
||||
m_file = f;
|
||||
m_owner = owner;
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user