-$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>
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:
## 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@
os_qnxnto.h \
os_solaris.cpp \
os_solaris.h \
- os_solaris_ata.s \
os_win32.cpp \
os_generic.cpp \
os_generic.h \
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
os_qnxnto.h \
os_solaris.cpp \
os_solaris.h \
- os_solaris_ata.s \
os_win32.cpp \
os_generic.cpp \
os_generic.h \
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
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; \
# 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 \
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 \
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 \
$(srcdir)/depcomp \
$(srcdir)/install-sh \
$(srcdir)/missing \
- $(srcdir)/mkinstalldirs \
$(srcdir)/m4/pkg.m4
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' \
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' \
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
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:
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
#
# 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" \
-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 = \
-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
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) $< > $@
$(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
$(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 += \
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
# 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
$(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 $< $@
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
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
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
-----------------------------------------------------------
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.
/*
* 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>
#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]";
* 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
#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. */
/*
* 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>
*
#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?
// 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
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
// 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)))
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++) {
// 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) {
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)
// 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));
}
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;
// 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;
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.
/*
* 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
#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
// 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
/*
* 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
*
#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"
/*
* 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>
*
#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);
/*
* 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
#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;
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) {
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" ));
}
}
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
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);
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
!(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*/);
else
pout("Wt Cache Reorder: Unknown (0x%02x)\n", wcache_reorder);
}
- else
- pout("Wt Cache Reorder: Unavailable\n");
}
// Print remaining drive info
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());
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);
// 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)) {
/*
* 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>
#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>
#!/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
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
;;
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
#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
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,
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;
#
-# $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"
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++])
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"])
[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)
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
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=
*-*-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
*-*-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*)
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,' \
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
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
/*
* 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>
*
#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"
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;
}
/*
* 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>
*
#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
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;}
/*
* 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>
*
#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;
/*
* 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>
*
#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"
/*
* 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>
*
#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;
/////////////////////////////////////////////////////////////////////////////
/*
* 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
#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"
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();
/*
* 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>
*
#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;
/////////////////////////////////////////////////////////////////////////////
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);
/*
* 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>
*
#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"
/*
* 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
/*
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
"-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 "
"-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,
"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
"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,
"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,
// 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
//"-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 "
"-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 "
"-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 "
},
{ "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
//"-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 "
"-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 "
"-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",
"", "",
"-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",
"-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 "
"-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 "
"-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 "
"-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
"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 "
"-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 "
//"-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
},
{ "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-.*",
"", "", ""
},
{ "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
"",
"-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
"",
"",
"-d sat"
},
+ { "USB: LaCie; ",
+ "0x059f:0x106f",
+ "", // 0x0001
+ "",
+ "-d sat"
+ },
// In-System Design
{ "USB: ; In-System/Cypress ISD-300A1",
"0x05ab:0x0060",
"",
"-d sat"
},
+ { "USB: ; Genesys Logic",
+ "0x05e3:0x0735",
+ "", // 0x1003
+ "",
+ "-d sat"
+ },
// Micron
{ "USB: Micron USB SSD; ",
"0x0634:0x0655",
"-d sat"
},
// Freecom
+ { "USB: ; Innostor IS631", // No Name USB3->SATA Enclosure
+ "0x07ab:0x0621",
+ "",
+ "",
+ "-d sat"
+ },
{ "USB: Freecom Mobile Drive XXS; JMicron",
"0x07ab:0xfc88",
"", // 0x0101
"-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"
},
"",
"-d sat"
},
+ // Addonics
+ { "USB: Addonics HDMU3; ", // (ticket #609)
+ "0x0bf6:0x1001",
+ "", // 0x0100
+ "",
+ ""
+ },
// Dura Micro
{ "USB: Dura Micro; Cypress",
"0x0c0b:0xb001",
"",
"-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",
"-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"
"-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
},
"-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
// 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
"",
"-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
"-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"
"",
"-d sat"
},
+ // 0xabcd (?)
+ { "USB: ; ",
+ "0xabcd:0x6103", // LogiLink AU0028A V1.0 USB 3.0 to IDE & SATA Adapter
+ "",
+ "",
+ "-d sat"
+ },
/*
}; // builtin_knowndrives[]
*/
-# 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>
/*
* 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
#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
/*
* 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
#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
#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
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.
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].
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) {
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,
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
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;
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:" : "",
{
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; }
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;
#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();
#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;
+}
/*
* 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
#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 {
// 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
/*
* 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>
#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>
#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
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;
/////////////////////////////////////////////////////////////////////////////
if (strcmp (type, "ATA") != 0)
{
- errno = EINVAL;
- return -1;
+ set_err (EINVAL);
+ return false;
}
// Find a free device number.
break;
if (devnum == sizeof (devices) / sizeof (devices[0]))
{
- errno = EMFILE;
- return -1;
+ set_err (EMFILE);
+ return false;
}
devname = NULL;
if (! disk)
{
- errno = ENOENT;
- return -1;
+ set_err(ENOENT);
+ return false;
}
// Find a SMART-capable driver which is a parent of this device.
err = IORegistryEntryGetParentEntry (disk, kIOServicePlane, &disk);
if (err != kIOReturnSuccess || ! disk)
{
- errno = ENODEV;
+ set_err(ENODEV);
IOObjectRelease (prevdisk);
- return -1;
+ return false;
}
}
CFUUIDGetUUIDBytes ( kIOATASMARTInterfaceID),
(void **)&devices[devnum].smartIf);
}
-
-
+
+
m_fd = devnum;
if (m_fd < 0) {
set_err((errno==ENOENT || errno==ENOTDIR) ? ENODEV : errno);
// 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))
free ((*devlist)[index]);
free (*devlist);
}
+ if(!result) // no devs found
+ return 0;
+
return -1;
}
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);
: 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,
//////////////////////////////////////////////////////////////////////
+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"))
/*
* 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>
*
#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?
# 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>
#
# 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
--- /dev/null
+<?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>
--- /dev/null
+<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>
--- /dev/null
+<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>
--- /dev/null
+#!/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"
/*
* 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
#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"
#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
// 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",
+ if (msgNo >= 0 && msgNo <= MAX_MSG) {
+ static int printed[] = {0,0,0,0};
+ if (!printed[msgNo]) {
- "You must specify a DISK # for 3ware drives with -d 3ware,<n> where <n> begins with 1 for first disk drive\n",
+ 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",
- "ATA support is not provided for this kernel version. Please ugrade to a recent 5-CURRENT kernel (post 09/01/2003 or so)\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) {
- if (!printed[msgNo]) {
printed[msgNo] = 1;
pout("%s", message[msgNo]);
if (extra)
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)
{
}
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);
}
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 */
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;
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++) {
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
// 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, "");
}
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;
/*
* 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>
*
#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
/*
* 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>
// 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
/*
* 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>
// 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
/*
* 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>
#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;
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));
// 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;
// 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
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");
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 */
{
struct megasas_pthru_frame *pthru;
struct megasas_iocpacket uio;
- int rc;
memset(&uio, 0, sizeof(uio));
pthru = &uio.frame.pthru;
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);
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);
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)) {
*/
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);
}
//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));
}
/*
* 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>
*
#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
/*
* 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>
*
#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 */
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;
return 0;
}
- if ((retval = ioctl(fd, ATAIOCCOMMAND, &req))) {
+ retval = ioctl(fd, ATAIOCCOMMAND, &req);
+ if (retval < 0) {
perror("Failed command");
return -1;
}
/*
* 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>
*
#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>
/*
* 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>
*
#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 */
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;
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;
}
/*
* 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>
*
#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... */
/*
* 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>
*
#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
/*
* 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>
*
#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
/*
* 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>
*/
#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
/*
* 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
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
static const char *uscsidrvrs[] = {
"sd",
"ssd",
+ "disk", // SATA devices
"st"
};
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)
{
// 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){
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"
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;
/*
* 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>
#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
/*
* 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
*
#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
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
}
}
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);
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;
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);
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;
}
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, "");
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;
}
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") );
// 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);
/////////////////////////////////////////////////////////////////////////////
// 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);
}
// 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;
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());
close();
return set_err(ENOSYS);
}
- devmap = 0x0f;
}
m_smartver_state = 1;
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) {
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);
/*
* 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>
*
#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>
/*
* 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>
*
#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>
--- /dev/null
+<?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>
;
-; 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
;
; 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 $
;
Name "smartmontools"
OutFile "${OUTFILE}"
+RequestExecutionLevel admin
+
SetCompressor /solid lzma
XPStyle on
; Set in .onInit
;InstallDir "$PROGRAMFILES\smartmontools"
-;InstallDirRegKey HKLM "Software\smartmontools" "Install_Dir"
+;InstallDirRegKey HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\smartmontools" "InstallLocation"
Var EDITOR
LicenseData "${INPDIR}\doc\COPYING.txt"
!include "FileFunc.nsh"
+!include "LogicLib.nsh"
!include "Sections.nsh"
-!insertmacro GetParameters
-!insertmacro GetOptions
-
-RequestExecutionLevel admin
;--------------------------------------------------------------------
; Pages
InstType "Full"
InstType "Extract files only"
InstType "Drive menu"
+!ifdef INPDIR64
+InstType "Full (x64)"
+InstType "Extract files only (x64)"
+InstType "Drive menu (x64)"
+!endif
;--------------------------------------------------------------------
!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"
!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
Section "smartctl" SMARTCTL_SECTION
- SectionIn 1 2
+ SectionIn ${FULL_TYPES} ${EXTRACT_TYPES}
SetOutPath "$INSTDIR\bin"
!insertmacro FileExe "bin\smartctl.exe" ""
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
!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" ""
Section "drivedb.h (Drive Database)" DRIVEDB_SECTION
- SectionIn 1 2
+ SectionIn ${FULL_TYPES} ${EXTRACT_TYPES}
SetOutPath "$INSTDIR\bin"
File "${INPDIR}\bin\drivedb.h"
Section "!Documentation" DOC_SECTION
- SectionIn 1 2
+ SectionIn ${FULL_TYPES} ${EXTRACT_TYPES}
SetOutPath "$INSTDIR\doc"
File "${INPDIR}\doc\AUTHORS.txt"
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
Section "Uninstaller" UNINST_SECTION
- SectionIn 1
+ SectionIn ${FULL_TYPES}
AddSize 40
CreateDirectory "$INSTDIR"
; 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"
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"
Section "Start Menu Shortcuts" MENU_SECTION
- SectionIn 1
+ SectionIn ${FULL_TYPES}
SetShellVarContext all
!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"
!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"
!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"
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
!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}"
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"
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"
!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
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}
; 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
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}
!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
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;"
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
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
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
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
; 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}
${Else}
DetailPrint "Set RunAsAdmin: $9"
${EndIf}
- System::Store L ; push $0-$9, $R0-$R9
+ System::Store L ; pop $R9-$R0, $9-$0
FunctionEnd
/*
* 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>
*
*
*/
-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>
+++ /dev/null
-<?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>
+++ /dev/null
-<?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>
/*
* 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>
*
#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>
/*
* 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
#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
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;
;/*
; * 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>
; *
; *
; */
;
-;// $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
;
; 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>
;
; 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 $
;
/*
* 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.
/*
* 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>
*
#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;
/*
* 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
#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>
{
public:
/// Construct from string.
- com_bstr(const char * str);
+ explicit com_bstr(const char * str);
/// Destructor frees BSTR.
~com_bstr()
/*
* 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>
*
#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>
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"
/*
* 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
#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
}
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",
}
} 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;
/*
* 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
#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?
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);
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;
for(i = 0; i < len; i++)
{
- c = *p++;
+ unsigned char c = *p++;
bpos += 3;
if (bpos == (bpstart + (9 * 3)))
bpos++;
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)
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);
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;
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) {
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 */
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 */
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 */
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) {
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;
UINT8 cdb[10];
UINT8 sense[32];
int pageLen;
- int status, res;
if (known_resp_len > bufLen)
return -EIO;
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 */
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 */
struct scsi_sense_disect sinfo;
UINT8 cdb[6];
UINT8 sense[32];
- int status;
if ((bufLen < 0) || (bufLen > 255))
return -EINVAL;
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();
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));
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();
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));
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];
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];
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];
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];
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
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
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;
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)
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];
}
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");
struct scsi_sense_disect sense_info;
int err;
int temperatureSet = 0;
- unsigned short pagesize;
UINT8 currTemp, trTemp;
*asc = 0;
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;
scsiFetchExtendedSelfTestTime(scsi_device * device, int * durationSec,
int modese_len)
{
- int err, offset, res;
+ int err, offset;
UINT8 buff[64];
memset(buff, 0, sizeof(buff));
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;
}
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:
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];
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;
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];
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];
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];
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];
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)
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;
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)
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])))
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;
/*
* 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
#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>
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;
/*
* 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
#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;
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,
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)
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);
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);
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,
"> 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];
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,
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];
{
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))) {
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]);
}
}
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);
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;
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.
// 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
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;
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) {
static int
scsiPrintSSMedia(scsi_device * device)
{
- int num, err, pc, pl, truncated;
+ int num, err, truncated;
int retval = 0;
UINT8 * ucp;
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) {
int j, m, n, nphys, t, sz, spld_len;
unsigned char * vcp;
uint64_t ull;
- unsigned int ui;
char s[64];
sz = sizeof(s);
}
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];
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];
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)
{
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;
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();
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);
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);
}
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) {
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);
}
int returnval = 0;
int res, durationSec;
struct scsi_sense_disect sense_info;
+ bool is_disk;
+ bool is_tape;
bool any_output = options.drive_info;
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));
+
+ 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;
- // 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;
- }
-
- 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");
- }
- 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");
+ 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");
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 ( 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 (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
// 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");
any_output = true;
}
- if (options.smart_ss_media_log) {
+ if (is_disk && options.smart_ss_media_log) {
if (! checkedSupportedLogPages)
scsiGetSupportedLogPages(device);
res = 0;
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);
}
// 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))
}
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;
}
/*
* 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>
#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
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
.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,
.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 $
/*
* 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
#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
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;
} 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));
if (*path == '+' && path[1])
path++;
else
- no_defaultdb = true;
+ use_default_db = false;
if (!read_drive_database(path))
EXIT(FAILCMD);
}
// 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);
}
// Read or init drive database
- if (!no_defaultdb && !read_default_drive_databases())
+ if (!init_drive_database(use_default_db))
EXIT(FAILCMD);
return type;
/*
* 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>
#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)
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
.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,
.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 $
# 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
/*
- * 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
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
// 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();
};
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...
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));
#else // _WIN32
{
+ char command[2048];
snprintf(command, sizeof(command), "cmd /c \"%s\"", warning_script.c_str());
char stdoutbuf[800]; // < buffer in syslog_win32::vsyslog()
}
}
+ // 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);
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);
// 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];
// 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;
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)
} 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)) {
}
}
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);
}
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);
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
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':
if (scandevice==-2)
return -1;
// the final line is part of a continuation line
- cont=0;
entry+=scandevice;
}
break;
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;
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);
#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;
}
# 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
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
.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
.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
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
.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
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.
.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 $
#
# 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
# 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
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" ;;
-esac
+error()
+{
+ echo "$myname: $*" >&2
+ exit 1
+}
-# 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
+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
-done
-if [ -z "$DOWNLOAD" ]; then
- echo "$0: found none of: $os_dltools" >&2; exit 1
+}
+
+# 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
+
+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"
- errmsg=
- rm -f "$DEST.new"
- SRC="`eval echo "$SRCEXPR"`"
+ # 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
- if (eval $DOWNLOAD); then :; else
- errmsg="download from $location failed (HTTP error)"
+ errmsg=
+ 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"
/*
* 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
#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[] = {
"(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)
const char *timezonename;
char datebuffer[DATEANDEPOCHLEN];
int lenm1;
-#ifdef _WIN32
- char tzfixbuf[6+1];
-#endif
FixGlibcTimeZoneBug();
#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
/*
* 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
#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)
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;
void open(FILE * f, bool owner = false)
{
+ if (m_file && m_owner)
+ fclose(m_file);
m_file = f;
m_owner = owner;
}