summaryrefslogtreecommitdiffstats
path: root/os_generic.cpp
diff options
context:
space:
mode:
authorDaniel Baumann <daniel.baumann@progress-linux.org>2024-04-15 17:14:45 +0000
committerDaniel Baumann <daniel.baumann@progress-linux.org>2024-04-15 17:14:45 +0000
commit43e8530e93493bb978c446a2023134bdd4277e50 (patch)
treee8c0d3c0c394b17381f48fb2d288f166b4f22440 /os_generic.cpp
parentInitial commit. (diff)
downloadsmartmontools-43e8530e93493bb978c446a2023134bdd4277e50.tar.xz
smartmontools-43e8530e93493bb978c446a2023134bdd4277e50.zip
Adding upstream version 7.4.upstream/7.4upstream
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to '')
-rw-r--r--os_generic.cpp210
1 files changed, 210 insertions, 0 deletions
diff --git a/os_generic.cpp b/os_generic.cpp
new file mode 100644
index 0000000..c7ae70a
--- /dev/null
+++ b/os_generic.cpp
@@ -0,0 +1,210 @@
+/*
+ * os_generic.cpp
+ *
+ * Home page of code is: http://www.smartmontools.org
+ *
+ * Copyright (C) YEAR YOUR_NAME
+ * Copyright (C) 2003-8 Bruce Allen
+ * Copyright (C) 2008-18 Christian Franke
+ *
+ * SPDX-License-Identifier: GPL-2.0-or-later
+ */
+
+
+/*
+ NOTE: The code in this file is only called when smartmontools has
+ been compiled on an unrecognized/unsupported platform. This file
+ can then serve as a "template" to make os_myOS.cpp if you wish to
+ build support for that platform.
+
+
+ PORTING NOTES AND COMMENTS
+ --------------------------
+
+ To port smartmontools to the OS of your choice, please:
+
+ [0] Contact smartmontools-support@listi.jpberlin.de to check
+ that it's not already been done.
+
+ [1] Make copies of os_generic.h and os_generic.cpp called os_myOS.h
+ and os_myOS.cpp .
+
+ [2] Modify configure.in so that case "${host}" includes myOS.
+
+ [3] Verify that ./autogen.sh && ./configure && make compiles the
+ code. If not, fix any compilation problems. If your OS lacks
+ some function that is used elsewhere in the code, then add a
+ AC_CHECK_FUNCS([missingfunction]) line to configure.in, and
+ surround uses of the function with:
+ #ifdef HAVE_MISSINGFUNCTION
+ ...
+ #endif
+ where the macro HAVE_MISSINGFUNCTION is (or is not) defined in
+ config.h.
+
+ [4] Now that you have a working build environment, you have to
+ replace the 'stub' function calls provided in this file.
+
+ Provide the functions defined in this file by fleshing out the
+ skeletons below.
+
+ [5] Contact smartmontools-support@listi.jpberlin.de to see
+ about checking your code into the smartmontools CVS archive.
+*/
+
+/*
+ Developer's note: for testing this file, use an unsupported system,
+ for example: ./configure --build=rs6000-ibm-aix && make
+*/
+
+
+// This is needed for the various HAVE_* macros and PROJECT_* macros.
+#include "config.h"
+
+// These are needed to define prototypes and structures for the
+// functions defined below
+#include "atacmds.h"
+#include "utility.h"
+
+// This is to include whatever structures and prototypes you define in
+// os_generic.h
+#include "os_generic.h"
+
+// Needed by '-V' option (CVS versioning) of smartd/smartctl. You
+// 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 4842 2018-12-02 16:07:26Z chrfranke $"
+ ATACMDS_H_CVSID CONFIG_H_CVSID OS_GENERIC_H_CVSID UTILITY_H_CVSID;
+
+// This is here to prevent compiler warnings for unused arguments of
+// functions.
+#define ARGUSED(x) ((void)(x))
+
+// print examples for smartctl. You should modify this function so
+// that the device paths are sensible for your OS, and to eliminate
+// unsupported commands (eg, 3ware controllers).
+static void print_smartctl_examples(){
+ printf("=================================================== SMARTCTL EXAMPLES =====\n\n"
+ " smartctl -a /dev/hda (Prints all SMART information)\n\n"
+ " smartctl --smart=on --offlineauto=on --saveauto=on /dev/hda\n"
+ " (Enables SMART on first disk)\n\n"
+ " smartctl -t long /dev/hda (Executes extended disk self-test)\n\n"
+ " smartctl --attributes --log=selftest --quietmode=errorsonly /dev/hda\n"
+ " (Prints Self-Test & Attribute errors)\n"
+ " smartctl -a --device=3ware,2 /dev/sda\n"
+ " (Prints all SMART info for 3rd ATA disk on 3ware RAID controller)\n"
+ );
+ return;
+}
+
+/////////////////////////////////////////////////////////////////////////////
+
+namespace generic { // No need to publish anything, name provided for Doxygen
+
+class generic_smart_interface
+: public /*implements*/ smart_interface
+{
+public:
+#ifdef HAVE_GET_OS_VERSION_STR
+ virtual const char * get_os_version_str();
+#endif
+
+ virtual std::string get_app_examples(const char * appname);
+
+ virtual bool scan_smart_devices(smart_device_list & devlist, const char * type,
+ const char * pattern = 0);
+
+protected:
+ virtual ata_device * get_ata_device(const char * name, const char * type);
+
+ virtual scsi_device * get_scsi_device(const char * name, const char * type);
+
+ virtual smart_device * autodetect_smart_device(const char * name);
+
+ virtual smart_device * get_custom_smart_device(const char * name, const char * type);
+
+ virtual std::string get_valid_custom_dev_types_str();
+};
+
+
+//////////////////////////////////////////////////////////////////////
+
+#ifdef HAVE_GET_OS_VERSION_STR
+/// Return build host and OS version as static string
+const char * generic_smart_interface::get_os_version_str()
+{
+ return ::get_os_version_str();
+}
+#endif
+
+std::string generic_smart_interface::get_app_examples(const char * appname)
+{
+ if (!strcmp(appname, "smartctl"))
+ ::print_smartctl_examples(); // this prints to stdout ...
+ return ""; // ... so don't print again.
+}
+
+// Return ATA device object for the given device name or NULL
+// the type is always set to "ata"
+ata_device * generic_smart_interface::get_ata_device(const char * name, const char * type)
+{
+ ARGUSED(name);
+ ARGUSED(type);
+ return NULL;
+}
+
+// Return SCSI device object for the given device name or NULL
+// the type is always set to "scsi"
+scsi_device * generic_smart_interface::get_scsi_device(const char * name, const char * type)
+{
+ ARGUSED(name);
+ ARGUSED(type);
+ return NULL;
+}
+
+
+// Return device object for the given device name (autodetect the device type)
+smart_device * generic_smart_interface::autodetect_smart_device(const char * name)
+{
+ ARGUSED(name);
+ // for the given name return the appropriate device type
+ return NULL;
+}
+
+
+// Fill devlist with all OS's disk devices of given type that match the pattern
+bool generic_smart_interface::scan_smart_devices(smart_device_list & devlist,
+ const char * type, const char * pattern /*= 0*/)
+{
+ ARGUSED(devlist);
+ ARGUSED(type);
+ ARGUSED(pattern);
+ return false;
+}
+
+
+// Return device object of the given type with specified name or NULL
+smart_device * generic_smart_interface::get_custom_smart_device(const char * name, const char * type)
+{
+ ARGUSED(name);
+ ARGUSED(type);
+ return NULL;
+}
+
+std::string generic_smart_interface::get_valid_custom_dev_types_str()
+{
+ return "";
+}
+
+} // namespace
+
+
+/////////////////////////////////////////////////////////////////////////////
+/// Initialize platform interface and register with smi()
+
+void smart_interface::init()
+{
+ static generic::generic_smart_interface the_interface;
+ smart_interface::set(&the_interface);
+}