Annotation of embedaddon/smartmontools/os_generic.cpp, revision 1.1.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>