File:  [ELWIX - Embedded LightWeight unIX -] / embedaddon / smartmontools / os_generic.cpp
Revision 1.1.1.1 (vendor branch): download - view: text, annotated - select for diffs - revision graph
Tue Feb 21 16:32:16 2012 UTC (12 years, 4 months ago) by misho
Branches: smartmontools, elwix, MAIN
CVS tags: v5_43, v5_42, HEAD
smartmontools

    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,v 1.1.1.1 2012/02/21 16:32:16 misho Exp $" \
   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>