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>