From 43e8530e93493bb978c446a2023134bdd4277e50 Mon Sep 17 00:00:00 2001 From: Daniel Baumann Date: Mon, 15 Apr 2024 19:14:45 +0200 Subject: Adding upstream version 7.4. Signed-off-by: Daniel Baumann --- os_generic.cpp | 210 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 210 insertions(+) create mode 100644 os_generic.cpp (limited to 'os_generic.cpp') 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); +} -- cgit v1.2.3