smartmontools  SVN Rev 4115
Utility to control and monitor storage systems with "S.M.A.R.T."
os_generic.cpp
Go to the documentation of this file.
1 /*
2  * os_generic.cpp
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, see <http://www.gnu.org/licenses/>.
17  *
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 "int64.h"
75 #include "atacmds.h"
76 #include "utility.h"
77 
78 // This is to include whatever structures and prototypes you define in
79 // os_generic.h
80 #include "os_generic.h"
81 
82 // Needed by '-V' option (CVS versioning) of smartd/smartctl. You
83 // should have one *_H_CVSID macro appearing below for each file
84 // appearing with #include "*.h" above. Please list these (below) in
85 // alphabetic/dictionary order.
86 const char * os_XXXX_cpp_cvsid="$Id: os_generic.cpp 3579 2012-07-20 17:50:12Z chrfranke $"
88 
89 // This is here to prevent compiler warnings for unused arguments of
90 // functions.
91 #define ARGUSED(x) ((void)(x))
92 
93 // Please eliminate the following block: both the #include and
94 // the 'unsupported()' function. They are only here to warn
95 // unsuspecting users that their Operating System is not supported! If
96 // you wish, you can use a similar warning mechanism for any of the
97 // functions in this file that you can not (or choose not to)
98 // implement.
99 
100 
101 #ifdef HAVE_UNAME
102 #include <sys/utsname.h>
103 #endif
104 
105 static void unsupported(){
106  static int warninggiven;
107 
108  if (!warninggiven) {
109  char *osname;
110 
111 #ifdef HAVE_UNAME
112  struct utsname ostype;
113  uname(&ostype);
114  osname=ostype.sysname;
115 #else
116  osname="host's";
117 #endif
118 
119  pout("\n"
120  "############################################################################\n"
121  "WARNING: smartmontools has not been ported to the %s Operating System.\n"
122  "Please see the files os_generic.cpp and os_generic.h for porting instructions.\n"
123  "############################################################################\n\n",
124  osname);
125  warninggiven=1;
126  }
127 
128  return;
129 }
130 // End of the 'unsupported()' block that you should eliminate.
131 
132 
133 // print examples for smartctl. You should modify this function so
134 // that the device paths are sensible for your OS, and to eliminate
135 // unsupported commands (eg, 3ware controllers).
137  printf("=================================================== SMARTCTL EXAMPLES =====\n\n");
138 #ifdef HAVE_GETOPT_LONG
139  printf(
140  " smartctl -a /dev/hda (Prints all SMART information)\n\n"
141  " smartctl --smart=on --offlineauto=on --saveauto=on /dev/hda\n"
142  " (Enables SMART on first disk)\n\n"
143  " smartctl -t long /dev/hda (Executes extended disk self-test)\n\n"
144  " smartctl --attributes --log=selftest --quietmode=errorsonly /dev/hda\n"
145  " (Prints Self-Test & Attribute errors)\n"
146  " smartctl -a --device=3ware,2 /dev/sda\n"
147  " (Prints all SMART info for 3rd ATA disk on 3ware RAID controller)\n"
148  );
149 #else
150  printf(
151  " smartctl -a /dev/hda (Prints all SMART information)\n"
152  " smartctl -s on -o on -S on /dev/hda (Enables SMART on first disk)\n"
153  " smartctl -t long /dev/hda (Executes extended disk self-test)\n"
154  " smartctl -A -l selftest -q errorsonly /dev/hda\n"
155  " (Prints Self-Test & Attribute errors)\n"
156  " smartctl -a -d 3ware,2 /dev/sda\n"
157  " (Prints all SMART info for 3rd ATA disk on 3ware RAID controller)\n"
158  );
159 #endif
160  return;
161 }
162 
163 /////////////////////////////////////////////////////////////////////////////
164 
165 namespace generic { // No need to publish anything, name provided for Doxygen
166 
168 : public /*implements*/ smart_interface
169 {
170 public:
171 #ifdef HAVE_GET_OS_VERSION_STR
172  virtual const char * get_os_version_str();
173 #endif
174 
175  virtual std::string get_app_examples(const char * appname);
176 
177  virtual bool scan_smart_devices(smart_device_list & devlist, const char * type,
178  const char * pattern = 0);
179 
180 protected:
181  virtual ata_device * get_ata_device(const char * name, const char * type);
182 
183  virtual scsi_device * get_scsi_device(const char * name, const char * type);
184 
185  virtual smart_device * autodetect_smart_device(const char * name);
186 
187  virtual smart_device * get_custom_smart_device(const char * name, const char * type);
188 
189  virtual std::string get_valid_custom_dev_types_str();
190 };
191 
192 
193 //////////////////////////////////////////////////////////////////////
194 
195 #ifdef HAVE_GET_OS_VERSION_STR
196 /// Return build host and OS version as static string
198 {
199  return ::get_os_version_str();
200 }
201 #endif
202 
203 std::string generic_smart_interface::get_app_examples(const char * appname)
204 {
205  if (!strcmp(appname, "smartctl"))
206  ::print_smartctl_examples(); // this prints to stdout ...
207  return ""; // ... so don't print again.
208 }
209 
210 // Return ATA device object for the given device name or NULL
211 // the type is always set to "ata"
212 ata_device * generic_smart_interface::get_ata_device(const char * name, const char * type)
213 {
214  ARGUSED(name);
215  ARGUSED(type);
216 
217  unsupported();
218  return NULL;
219 }
220 
221 // Return SCSI device object for the given device name or NULL
222 // the type is always set to "scsi"
223 scsi_device * generic_smart_interface::get_scsi_device(const char * name, const char * type)
224 {
225  ARGUSED(name);
226  ARGUSED(type);
227 
228  unsupported();
229  return NULL;
230 }
231 
232 
233 // Return device object for the given device name (autodetect the device type)
235 {
236  ARGUSED(name);
237 
238  // for the given name return the apropriate device type
239  unsupported();
240  return NULL;
241 }
242 
243 
244 // Fill devlist with all OS's disk devices of given type that match the pattern
246  const char * type, const char * pattern /*= 0*/)
247 {
248  ARGUSED(devlist);
249  ARGUSED(type);
250  ARGUSED(pattern);
251 
252  unsupported();
253  return false;
254 }
255 
256 
257 // Return device object of the given type with specified name or NULL
258 smart_device * generic_smart_interface::get_custom_smart_device(const char * name, const char * type)
259 {
260  ARGUSED(name);
261  ARGUSED(type);
262 
263  unsupported();
264  return NULL;
265 }
266 
268 {
269  return "";
270 }
271 
272 } // namespace
273 
274 
275 /////////////////////////////////////////////////////////////////////////////
276 /// Initialize platform interface and register with smi()
277 
279 {
280  static generic::generic_smart_interface the_interface;
281  smart_interface::set(&the_interface);
282 }
#define ATACMDS_H_CVSID
Definition: atacmds.h:28
virtual bool scan_smart_devices(smart_device_list &devlist, const char *type, const char *pattern=0)
Fill 'devlist' with devices of some 'type' with device names specified by some optional 'pattern'...
Definition: os_generic.cpp:245
virtual std::string get_app_examples(const char *appname)
Return example string for program 'appname'.
Definition: os_generic.cpp:203
virtual scsi_device * get_scsi_device(const char *name, const char *type)
Return standard SCSI device.
Definition: os_generic.cpp:223
virtual std::string get_valid_custom_dev_types_str()
Return valid 'type' args accepted by above.
Definition: os_generic.cpp:267
const char * os_XXXX_cpp_cvsid
Definition: os_generic.cpp:86
#define INT64_H_CVSID
Definition: int64.h:23
List of devices for DEVICESCAN.
virtual smart_device * get_custom_smart_device(const char *name, const char *type)
Return device for platform specific 'type'.
Definition: os_generic.cpp:258
static void init()
Initialize platform interface and register with smi().
Definition: dev_legacy.cpp:338
The platform interface abstraction.
static void set(smart_interface *intf)
Set interface to use, must be called from init().
virtual ata_device * get_ata_device(const char *name, const char *type)
Return standard ATA device.
Definition: os_generic.cpp:212
virtual smart_device * autodetect_smart_device(const char *name)
Autodetect device if no device type specified.
Definition: os_generic.cpp:234
void pout(const char *fmt,...)
Definition: smartctl.cpp:1095
#define OS_GENERIC_H_CVSID
Definition: os_generic.h:28
SCSI device access.
Base class for all devices.
Definition: dev_interface.h:38
ATA device access.
static void unsupported()
Definition: os_generic.cpp:105
static void print_smartctl_examples()
Definition: os_generic.cpp:136
#define ARGUSED(x)
Definition: os_generic.cpp:91
virtual std::string get_os_version_str()
Return info string about build host and/or OS version.
#define UTILITY_H_CVSID
Definition: utility.h:28