]>
Commit | Line | Data |
---|---|---|
1 | /* | |
2 | * os_generic.cpp | |
3 | * | |
4 | * Home page of code is: http://www.smartmontools.org | |
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 4120 2015-08-27 16:12:21Z samm2 $" | |
87 | ATACMDS_H_CVSID CONFIG_H_CVSID INT64_H_CVSID OS_GENERIC_H_CVSID UTILITY_H_CVSID; | |
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). | |
136 | static void print_smartctl_examples(){ | |
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 | ||
167 | class generic_smart_interface | |
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 | |
197 | const char * generic_smart_interface::get_os_version_str() | |
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) | |
234 | smart_device * generic_smart_interface::autodetect_smart_device(const char * name) | |
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 | |
245 | bool generic_smart_interface::scan_smart_devices(smart_device_list & devlist, | |
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 | ||
267 | std::string generic_smart_interface::get_valid_custom_dev_types_str() | |
268 | { | |
269 | return ""; | |
270 | } | |
271 | ||
272 | } // namespace | |
273 | ||
274 | ||
275 | ///////////////////////////////////////////////////////////////////////////// | |
276 | /// Initialize platform interface and register with smi() | |
277 | ||
278 | void smart_interface::init() | |
279 | { | |
280 | static generic::generic_smart_interface the_interface; | |
281 | smart_interface::set(&the_interface); | |
282 | } |