Annotation of embedaddon/smartmontools/os_generic.cpp, revision 1.1
1.1 ! misho 1: /*
! 2: * os_generic.c
! 3: *
! 4: * Home page of code is: http://smartmontools.sourceforge.net
! 5: *
! 6: * Copyright (C) YEAR YOUR_NAME <smartmontools-support@lists.sourceforge.net>
! 7: * Copyright (C) 2003-8 Bruce Allen <smartmontools-support@lists.sourceforge.net>
! 8: * Copyright (C) 2008 Christian Franke <smartmontools-support@lists.sourceforge.net>
! 9: *
! 10: * This program is free software; you can redistribute it and/or modify
! 11: * it under the terms of the GNU General Public License as published by
! 12: * the Free Software Foundation; either version 2, or (at your option)
! 13: * any later version.
! 14: *
! 15: * You should have received a copy of the GNU General Public License
! 16: * (for example COPYING); if not, write to the Free
! 17: * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
! 18: */
! 19:
! 20:
! 21: /*
! 22: NOTE: The code in this file is only called when smartmontools has
! 23: been compiled on an unrecognized/unsupported platform. This file
! 24: can then serve as a "template" to make os_myOS.cpp if you wish to
! 25: build support for that platform.
! 26:
! 27:
! 28: PORTING NOTES AND COMMENTS
! 29: --------------------------
! 30:
! 31: To port smartmontools to the OS of your choice, please:
! 32:
! 33: [0] Contact smartmontools-support@lists.sourceforge.net to check
! 34: that it's not already been done.
! 35:
! 36: [1] Make copies of os_generic.h and os_generic.cpp called os_myOS.h
! 37: and os_myOS.cpp .
! 38:
! 39: [2] Modify configure.in so that case "${host}" includes myOS.
! 40:
! 41: [3] Verify that ./autogen.sh && ./configure && make compiles the
! 42: code. If not, fix any compilation problems. If your OS lacks
! 43: some function that is used elsewhere in the code, then add a
! 44: AC_CHECK_FUNCS([missingfunction]) line to configure.in, and
! 45: surround uses of the function with:
! 46: #ifdef HAVE_MISSINGFUNCTION
! 47: ...
! 48: #endif
! 49: where the macro HAVE_MISSINGFUNCTION is (or is not) defined in
! 50: config.h.
! 51:
! 52: [4] Now that you have a working build environment, you have to
! 53: replace the 'stub' function calls provided in this file.
! 54:
! 55: Provide the functions defined in this file by fleshing out the
! 56: skeletons below. You can entirely eliminate the function
! 57: 'unsupported()'.
! 58:
! 59: [5] Contact smartmontools-support@lists.sourceforge.net to see
! 60: about checking your code into the smartmontools CVS archive.
! 61: */
! 62:
! 63: /*
! 64: Developer's note: for testing this file, use an unsupported system,
! 65: for example: ./configure --build=rs6000-ibm-aix && make
! 66: */
! 67:
! 68:
! 69: // This is needed for the various HAVE_* macros and PROJECT_* macros.
! 70: #include "config.h"
! 71:
! 72: // These are needed to define prototypes and structures for the
! 73: // functions defined below
! 74: #include "atacmds.h"
! 75: #include "utility.h"
! 76:
! 77: // This is to include whatever structures and prototypes you define in
! 78: // os_generic.h
! 79: #include "os_generic.h"
! 80:
! 81: // Needed by '-V' option (CVS versioning) of smartd/smartctl. You
! 82: // should have one *_H_CVSID macro appearing below for each file
! 83: // appearing with #include "*.h" above. Please list these (below) in
! 84: // alphabetic/dictionary order.
! 85: const char *os_XXXX_c_cvsid="$Id: os_generic.cpp 3191 2010-10-27 19:55:33Z chrfranke $" \
! 86: ATACMDS_H_CVSID CONFIG_H_CVSID OS_GENERIC_H_CVSID UTILITY_H_CVSID;
! 87:
! 88: // This is here to prevent compiler warnings for unused arguments of
! 89: // functions.
! 90: #define ARGUSED(x) ((void)(x))
! 91:
! 92: // Please eliminate the following block: both the #include and
! 93: // the 'unsupported()' function. They are only here to warn
! 94: // unsuspecting users that their Operating System is not supported! If
! 95: // you wish, you can use a similar warning mechanism for any of the
! 96: // functions in this file that you can not (or choose not to)
! 97: // implement.
! 98:
! 99:
! 100: #ifdef HAVE_UNAME
! 101: #include <sys/utsname.h>
! 102: #endif
! 103:
! 104: static void unsupported(){
! 105: static int warninggiven;
! 106:
! 107: if (!warninggiven) {
! 108: char *osname;
! 109:
! 110: #ifdef HAVE_UNAME
! 111: struct utsname ostype;
! 112: uname(&ostype);
! 113: osname=ostype.sysname;
! 114: #else
! 115: osname="host's";
! 116: #endif
! 117:
! 118: pout("\n"
! 119: "############################################################################\n"
! 120: "WARNING: smartmontools has not been ported to the %s Operating System.\n"
! 121: "Please see the files os_generic.cpp and os_generic.h for porting instructions.\n"
! 122: "############################################################################\n\n",
! 123: osname);
! 124: warninggiven=1;
! 125: }
! 126:
! 127: return;
! 128: }
! 129: // End of the 'unsupported()' block that you should eliminate.
! 130:
! 131:
! 132: // print examples for smartctl. You should modify this function so
! 133: // that the device paths are sensible for your OS, and to eliminate
! 134: // unsupported commands (eg, 3ware controllers).
! 135: static void print_smartctl_examples(){
! 136: printf("=================================================== SMARTCTL EXAMPLES =====\n\n");
! 137: #ifdef HAVE_GETOPT_LONG
! 138: printf(
! 139: " smartctl -a /dev/hda (Prints all SMART information)\n\n"
! 140: " smartctl --smart=on --offlineauto=on --saveauto=on /dev/hda\n"
! 141: " (Enables SMART on first disk)\n\n"
! 142: " smartctl -t long /dev/hda (Executes extended disk self-test)\n\n"
! 143: " smartctl --attributes --log=selftest --quietmode=errorsonly /dev/hda\n"
! 144: " (Prints Self-Test & Attribute errors)\n"
! 145: " smartctl -a --device=3ware,2 /dev/sda\n"
! 146: " (Prints all SMART info for 3rd ATA disk on 3ware RAID controller)\n"
! 147: );
! 148: #else
! 149: printf(
! 150: " smartctl -a /dev/hda (Prints all SMART information)\n"
! 151: " smartctl -s on -o on -S on /dev/hda (Enables SMART on first disk)\n"
! 152: " smartctl -t long /dev/hda (Executes extended disk self-test)\n"
! 153: " smartctl -A -l selftest -q errorsonly /dev/hda\n"
! 154: " (Prints Self-Test & Attribute errors)\n"
! 155: " smartctl -a -d 3ware,2 /dev/sda\n"
! 156: " (Prints all SMART info for 3rd ATA disk on 3ware RAID controller)\n"
! 157: );
! 158: #endif
! 159: return;
! 160: }
! 161:
! 162: /////////////////////////////////////////////////////////////////////////////
! 163:
! 164: namespace generic { // No need to publish anything, name provided for Doxygen
! 165:
! 166: class generic_smart_interface
! 167: : public /*implements*/ smart_interface
! 168: {
! 169: public:
! 170: #ifdef HAVE_GET_OS_VERSION_STR
! 171: virtual const char * get_os_version_str();
! 172: #endif
! 173:
! 174: virtual std::string get_app_examples(const char * appname);
! 175:
! 176: virtual bool scan_smart_devices(smart_device_list & devlist, const char * type,
! 177: const char * pattern = 0);
! 178:
! 179: protected:
! 180: virtual ata_device * get_ata_device(const char * name, const char * type);
! 181:
! 182: virtual scsi_device * get_scsi_device(const char * name, const char * type);
! 183:
! 184: virtual smart_device * autodetect_smart_device(const char * name);
! 185:
! 186: virtual smart_device * get_custom_smart_device(const char * name, const char * type);
! 187:
! 188: virtual std::string get_valid_custom_dev_types_str();
! 189: };
! 190:
! 191:
! 192: //////////////////////////////////////////////////////////////////////
! 193:
! 194: #ifdef HAVE_GET_OS_VERSION_STR
! 195: /// Return build host and OS version as static string
! 196: const char * generic_smart_interface::get_os_version_str()
! 197: {
! 198: return ::get_os_version_str();
! 199: }
! 200: #endif
! 201:
! 202: std::string generic_smart_interface::get_app_examples(const char * appname)
! 203: {
! 204: if (!strcmp(appname, "smartctl"))
! 205: ::print_smartctl_examples(); // this prints to stdout ...
! 206: return ""; // ... so don't print again.
! 207: }
! 208:
! 209: // Return ATA device object for the given device name or NULL
! 210: // the type is always set to "ata"
! 211: ata_device * generic_smart_interface::get_ata_device(const char * name, const char * type)
! 212: {
! 213: ARGUSED(name);
! 214: ARGUSED(type);
! 215:
! 216: unsupported();
! 217: return NULL;
! 218: }
! 219:
! 220: // Return SCSI device object for the given device name or NULL
! 221: // the type is always set to "scsi"
! 222: scsi_device * generic_smart_interface::get_scsi_device(const char * name, const char * type)
! 223: {
! 224: ARGUSED(name);
! 225: ARGUSED(type);
! 226:
! 227: unsupported();
! 228: return NULL;
! 229: }
! 230:
! 231:
! 232: // Return device object for the given device name (autodetect the device type)
! 233: smart_device * generic_smart_interface::autodetect_smart_device(const char * name)
! 234: {
! 235: ARGUSED(name);
! 236:
! 237: // for the given name return the apropriate device type
! 238: unsupported();
! 239: return NULL;
! 240: }
! 241:
! 242:
! 243: // Fill devlist with all OS's disk devices of given type that match the pattern
! 244: bool generic_smart_interface::scan_smart_devices(smart_device_list & devlist,
! 245: const char * type, const char * pattern /*= 0*/)
! 246: {
! 247: ARGUSED(devlist);
! 248: ARGUSED(type);
! 249: ARGUSED(pattern);
! 250:
! 251: unsupported();
! 252: return false;
! 253: }
! 254:
! 255:
! 256: // Return device object of the given type with specified name or NULL
! 257: smart_device * generic_smart_interface::get_custom_smart_device(const char * name, const char * type)
! 258: {
! 259: ARGUSED(name);
! 260: ARGUSED(type);
! 261:
! 262: unsupported();
! 263: return NULL;
! 264: }
! 265:
! 266: std::string generic_smart_interface::get_valid_custom_dev_types_str()
! 267: {
! 268: return "";
! 269: }
! 270:
! 271: } // namespace
! 272:
! 273:
! 274: /////////////////////////////////////////////////////////////////////////////
! 275: /// Initialize platform interface and register with smi()
! 276:
! 277: void smart_interface::init()
! 278: {
! 279: static generic::generic_smart_interface the_interface;
! 280: smart_interface::set(&the_interface);
! 281: }
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>