* copy vendor drop to trunk
[lab.git] / Dev / utvpn / utvpn-unix-v101-7101-public / src / Mayaqua / OS.c
1 // SoftEther UT-VPN SourceCode\r
2 // \r
3 // Copyright (C) 2004-2010 SoftEther Corporation.\r
4 // Copyright (C) 2004-2010 University of Tsukuba, Japan.\r
5 // Copyright (C) 2003-2010 Daiyuu Nobori.\r
6 // All Rights Reserved.\r
7 // \r
8 // http://utvpn.tsukuba.ac.jp/\r
9 // \r
10 // This program is free software; you can redistribute it and/or\r
11 // modify it under the terms of the GNU General Public License\r
12 // version 2 as published by the Free Software Foundation.\r
13 // \r
14 // This program is distributed in the hope that it will be useful,\r
15 // but WITHOUT ANY WARRANTY; without even the implied warranty of\r
16 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\r
17 // GNU General Public License for more details.\r
18 // \r
19 // You should have received a copy of the GNU General Public License version 2\r
20 // along with this program; if not, write to the Free Software\r
21 // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.\r
22 // \r
23 // このファイルは GPL バージョン 2 ライセンスで公開されています。\r
24 // 誰でもこのファイルの内容を複製、改変したり、改変したバージョンを再配布\r
25 // することができます。ただし、原著作物を改変した場合は、原著作物の著作権表示\r
26 // を除去することはできません。改変した著作物を配布する場合は、改変実施者の\r
27 // 著作権表示を原著作物の著作権表示に付随して記載するようにしてください。\r
28 // \r
29 // この SoftEther UT-VPN オープンソース・プロジェクトは、日本国の\r
30 // ソフトイーサ株式会社 (SoftEther Corporation, http://www.softether.co.jp/ )\r
31 // および筑波大学 (University of Tsukuba, http://www.tsukuba.ac.jp/ ) によって\r
32 // ホストされています。\r
33 // 本プログラムの配布者は、本プログラムを、業としての利用以外のため、\r
34 // および、試験または研究のために利用が行われることを想定して配布\r
35 // しています。\r
36 // SoftEther UT-VPN プロジェクトの Web サイトは http://utvpn.tsukuba.ac.jp/ に\r
37 // あります。\r
38 // 本ソフトウェアの不具合の修正、機能改良、セキュリティホールの修復などのコード\r
39 // の改変を行った場合で、その成果物を SoftEther UT-VPN プロジェクトに提出して\r
40 // いただける場合は、 http://utvpn.tsukuba.ac.jp/ までソースコードを送付して\r
41 // ください。SoftEther UT-VPN プロジェクトの本体リリースまたはブランチリリース\r
42 // に組み込みさせていただきます。\r
43 // \r
44 // GPL に基づいて原著作物が提供される本ソフトウェアの改良版を配布、販売する\r
45 // 場合は、そのソースコードを GPL に基づいて誰にでも開示する義務が生じます。\r
46 // \r
47 // 本ソフトウェアに関連する著作権、特許権、商標権はソフトイーサ株式会社\r
48 // (SoftEther Corporation) およびその他の著作権保持者が保有しています。\r
49 // ソフトイーサ株式会社等はこれらの権利を放棄していません。本ソフトウェアの\r
50 // 二次著作物を配布、販売する場合は、これらの権利を侵害しないようにご注意\r
51 // ください。\r
52 // \r
53 // お願い: どのような通信ソフトウェアにも通常は必ず未発見の\r
54 // セキュリティホールが潜んでいます。本ソースコードをご覧いただいた結果、\r
55 // UT-VPN にセキュリティホールを発見された場合は、当該セキュリティホールの\r
56 // 情報を不特定多数に開示される前に、必ず、ソフトイーサ株式会社\r
57 // および脆弱性情報の届出を受け付ける公的機関まで通報いただき、\r
58 // 公益保護にご協力いただきますようお願い申し上げます。\r
59 // \r
60 // ソフトイーサ株式会社は、当該セキュリティホールについて迅速に対処を\r
61 // 行い、UT-VPN および UT-VPN に関連するソフトウェアのユーザー・顧客\r
62 // を保護するための努力を行います。\r
63 // \r
64 // ソフトイーサへの届出先: http://www.softether.co.jp/jp/contact/\r
65 // 日本国内の脆弱性情報届出受付公的機関:\r
66 //         独立行政法人 情報処理推進機構\r
67 //         http://www.ipa.go.jp/security/vuln/report/\r
68 // \r
69 // 上記各事項について不明な点は、ソフトイーサ株式会社までご連絡ください。\r
70 // 連絡先: http://www.softether.co.jp/jp/contact/\r
71 \r
72 // -----------------------------------------------\r
73 // [ChangeLog]\r
74 // 2010.05.20\r
75 //  新規リリース by SoftEther\r
76 // -----------------------------------------------\r
77 \r
78 // OS.c\r
79 // オペレーティングシステム依存コード\r
80 \r
81 #include <stdio.h>\r
82 #include <stdlib.h>\r
83 #include <string.h>\r
84 #include <wchar.h>\r
85 #include <stdarg.h>\r
86 #include <time.h>\r
87 #include <errno.h>\r
88 #include <Mayaqua/Mayaqua.h>\r
89 \r
90 #undef  Lock\r
91 #undef  Unlock\r
92 \r
93 // ディスパッチテーブル\r
94 static OS_DISPATCH_TABLE *os = NULL;\r
95 \r
96 // OS 種類を文字列に変換\r
97 char *OsTypeToStr(UINT type)\r
98 {\r
99         switch (type)\r
100         {\r
101         case 0:\r
102                 return "Unsupported OS by SoftEther Corporation\0\n";\r
103         case OSTYPE_WINDOWS_95:\r
104                 return "Windows 95\0\n";\r
105         case OSTYPE_WINDOWS_98:\r
106                 return "Windows 98\0\n";\r
107         case OSTYPE_WINDOWS_ME:\r
108                 return "Windows Millennium Edition\0\n";\r
109         case OSTYPE_WINDOWS_UNKNOWN:\r
110                 return "Windows 9x Unknown Version\0\n";\r
111         case OSTYPE_WINDOWS_NT_4_WORKSTATION:\r
112                 return "Windows NT 4.0 Workstation\0\n";\r
113         case OSTYPE_WINDOWS_NT_4_SERVER:\r
114                 return "Windows NT 4.0 Server\0\n";\r
115         case OSTYPE_WINDOWS_NT_4_SERVER_ENTERPRISE:\r
116                 return "Windows NT 4.0 Server, Enterprise Edition\0\n";\r
117         case OSTYPE_WINDOWS_NT_4_BACKOFFICE:\r
118                 return "BackOffice Server 4.5\0\n";\r
119         case OSTYPE_WINDOWS_NT_4_SMS:\r
120                 return "Small Business Server 4.5\0\n";\r
121         case OSTYPE_WINDOWS_2000_PROFESSIONAL:\r
122                 return "Windows 2000 Professional\0\n";\r
123         case OSTYPE_WINDOWS_2000_SERVER:\r
124                 return "Windows 2000 Server\0\n";\r
125         case OSTYPE_WINDOWS_2000_ADVANCED_SERVER:\r
126                 return "Windows 2000 Advanced Server\0\n";\r
127         case OSTYPE_WINDOWS_2000_DATACENTER_SERVER:\r
128                 return "Windows 2000 Datacenter Server\0\n";\r
129         case OSTYPE_WINDOWS_2000_BACKOFFICE:\r
130                 return "BackOffice Server 2000\0\n";\r
131         case OSTYPE_WINDOWS_2000_SBS:\r
132                 return "Small Business Server 2000\0\n";\r
133         case OSTYPE_WINDOWS_XP_HOME:\r
134                 return "Windows XP Home Edition\0\n";\r
135         case OSTYPE_WINDOWS_XP_PROFESSIONAL:\r
136                 return "Windows XP Professional\0\n";\r
137         case OSTYPE_WINDOWS_2003_WEB:\r
138                 return "Windows Server 2003 Web Edition\0\n";\r
139         case OSTYPE_WINDOWS_2003_STANDARD:\r
140                 return "Windows Server 2003 Standard Edition\0\n";\r
141         case OSTYPE_WINDOWS_2003_ENTERPRISE:\r
142                 return "Windows Server 2003 Enterprise Edition\0\n";\r
143         case OSTYPE_WINDOWS_2003_DATACENTER:\r
144                 return "Windows Server 2003 Datacenter Edition\0\n";\r
145         case OSTYPE_WINDOWS_2003_BACKOFFICE:\r
146                 return "BackOffice Server 2003\0\n";\r
147         case OSTYPE_WINDOWS_2003_SBS:\r
148                 return "Small Business Server 2003\0\n";\r
149         case OSTYPE_WINDOWS_LONGHORN_PROFESSIONAL:\r
150                 return "Windows Vista\0\n";\r
151         case OSTYPE_WINDOWS_LONGHORN_SERVER:\r
152                 return "Windows Server 2008\0\n";\r
153         case OSTYPE_WINDOWS_7:\r
154                 return "Windows 7\0\n";\r
155         case OSTYPE_WINDOWS_SERVER_2008_R2:\r
156                 return "Windows Server 2008 R2\0\n";\r
157         case OSTYPE_WINDOWS_8:\r
158                 return "Windows 8 or greater\0\n";\r
159         case OSTYPE_WINDOWS_SERVER_8:\r
160                 return "Windows Server 8 or greater\0\n";\r
161         case OSTYPE_UNIX_UNKNOWN:\r
162                 return "UNIX System\0\n";\r
163         case OSTYPE_LINUX:\r
164                 return "Linux\0\n";\r
165         case OSTYPE_SOLARIS:\r
166                 return "Sun Solaris\0\n";\r
167         case OSTYPE_CYGWIN:\r
168                 return "Gnu Sygwin\0\n";\r
169         case OSTYPE_BSD:\r
170                 return "BSD System\0\n";\r
171         case OSTYPE_MACOS_X:\r
172                 return "Mac OS X\0\n";\r
173         }\r
174 \r
175         return "Unknown OS";\r
176 }\r
177 \r
178 // 初期化\r
179 void OSInit()\r
180 {\r
181         // ディスパッチテーブルの取得\r
182 #ifdef  OS_WIN32\r
183         os = Win32GetDispatchTable();\r
184 #else   // OS_WIN32\r
185         os = UnixGetDispatchTable();\r
186 #endif  // OS_WIN32\r
187 \r
188         // OS 固有の初期化関数の呼び出し\r
189         os->Init();\r
190 }\r
191 \r
192 // 解放\r
193 void OSFree()\r
194 {\r
195         os->Free();\r
196 }\r
197 \r
198 // メモリ情報取得\r
199 void OSGetMemInfo(MEMINFO *info)\r
200 {\r
201         // 引数チェック\r
202         if (info == NULL)\r
203         {\r
204                 return;\r
205         }\r
206 \r
207         os->GetMemInfo(info);\r
208 }\r
209 \r
210 // イールド\r
211 void OSYield()\r
212 {\r
213         os->Yield();\r
214 }\r
215 \r
216 // シングルインスタンス開始\r
217 void *OSNewSingleInstance(char *instance_name)\r
218 {\r
219         return os->NewSingleInstance(instance_name);\r
220 }\r
221 \r
222 void OSFreeSingleInstance(void *data)\r
223 {\r
224         os->FreeSingleInstance(data);\r
225 }\r
226 \r
227 // 優先順位を上げる\r
228 void OSSetHighPriority()\r
229 {\r
230         os->SetHighPriority();\r
231 }\r
232 \r
233 // 優先順位を戻す\r
234 void OSRestorePriority()\r
235 {\r
236         os->RestorePriority();\r
237 }\r
238 \r
239 // プロダクト ID の取得\r
240 char* OSGetProductId()\r
241 {\r
242         return os->GetProductId();\r
243 }\r
244 \r
245 // OS がサポートされているかどうかチェックする\r
246 bool OSIsSupportedOs()\r
247 {\r
248         return os->IsSupportedOs();\r
249 }\r
250 \r
251 // OS 情報の取得\r
252 void OSGetOsInfo(OS_INFO *info)\r
253 {\r
254         os->GetOsInfo(info);\r
255 }\r
256 \r
257 // アラートの表示\r
258 void OSAlert(char *msg, char *caption)\r
259 {\r
260         os->Alert(msg, caption);\r
261 }\r
262 void OSAlertW(wchar_t *msg, wchar_t *caption)\r
263 {\r
264         os->AlertW(msg, caption);\r
265 }\r
266 \r
267 // プロセス起動\r
268 bool OSRun(char *filename, char *arg, bool hide, bool wait)\r
269 {\r
270         return os->Run(filename, arg, hide, wait);\r
271 }\r
272 bool OSRunW(wchar_t *filename, wchar_t *arg, bool hide, bool wait)\r
273 {\r
274         return os->RunW(filename, arg, hide, wait);\r
275 }\r
276 \r
277 // スレッド ID の取得\r
278 UINT OSThreadId()\r
279 {\r
280         return os->ThreadId();\r
281 }\r
282 \r
283 // リネーム\r
284 bool OSFileRename(char *old_name, char *new_name)\r
285 {\r
286         return os->FileRename(old_name, new_name);\r
287 }\r
288 bool OSFileRenameW(wchar_t *old_name, wchar_t *new_name)\r
289 {\r
290         return os->FileRenameW(old_name, new_name);\r
291 }\r
292 \r
293 // ファイルサイズを取得する\r
294 UINT64 OSFileSize(void *pData)\r
295 {\r
296         return os->FileSize(pData);\r
297 }\r
298 \r
299 // ファイルをシークする\r
300 bool OSFileSeek(void *pData, UINT mode, int offset)\r
301 {\r
302         return os->FileSeek(pData, mode, offset);\r
303 }\r
304 \r
305 // ファイルを削除する\r
306 bool OSFileDelete(char *name)\r
307 {\r
308         return os->FileDelete(name);\r
309 }\r
310 bool OSFileDeleteW(wchar_t *name)\r
311 {\r
312         return os->FileDeleteW(name);\r
313 }\r
314 \r
315 // ディレクトリを作成する\r
316 bool OSMakeDir(char *name)\r
317 {\r
318         return os->MakeDir(name);\r
319 }\r
320 bool OSMakeDirW(wchar_t *name)\r
321 {\r
322         return os->MakeDirW(name);\r
323 }\r
324 \r
325 // ディレクトリを削除する\r
326 bool OSDeleteDir(char *name)\r
327 {\r
328         return os->DeleteDir(name);\r
329 }\r
330 bool OSDeleteDirW(wchar_t *name)\r
331 {\r
332         return os->DeleteDirW(name);\r
333 }\r
334 \r
335 // ファイルを開く\r
336 void *OSFileOpen(char *name, bool write_mode, bool read_lock)\r
337 {\r
338         return os->FileOpen(name, write_mode, read_lock);\r
339 }\r
340 void *OSFileOpenW(wchar_t *name, bool write_mode, bool read_lock)\r
341 {\r
342         return os->FileOpenW(name, write_mode, read_lock);\r
343 }\r
344 \r
345 // ファイルを作成する\r
346 void *OSFileCreate(char *name)\r
347 {\r
348         return os->FileCreate(name);\r
349 }\r
350 void *OSFileCreateW(wchar_t *name)\r
351 {\r
352         return os->FileCreateW(name);\r
353 }\r
354 \r
355 // ファイルに書き込む\r
356 bool OSFileWrite(void *pData, void *buf, UINT size)\r
357 {\r
358         return os->FileWrite(pData, buf, size);\r
359 }\r
360 \r
361 // ファイルから読み込む\r
362 bool OSFileRead(void *pData, void *buf, UINT size)\r
363 {\r
364         return os->FileRead(pData, buf, size);\r
365 }\r
366 \r
367 // ファイルを閉じる\r
368 void OSFileClose(void *pData, bool no_flush)\r
369 {\r
370         os->FileClose(pData, no_flush);\r
371 }\r
372 \r
373 // ファイルのフラッシュ\r
374 void OSFileFlush(void *pData)\r
375 {\r
376         os->FileFlush(pData);\r
377 }\r
378 \r
379 // コールスタックの取得\r
380 CALLSTACK_DATA *OSGetCallStack()\r
381 {\r
382         return os->GetCallStack();\r
383 }\r
384 \r
385 // シンボル情報の取得\r
386 bool OSGetCallStackSymbolInfo(CALLSTACK_DATA *s)\r
387 {\r
388         return os->GetCallStackSymbolInfo(s);\r
389 }\r
390 \r
391 // スレッドの終了を待機\r
392 bool OSWaitThread(THREAD *t)\r
393 {\r
394         return os->WaitThread(t);\r
395 }\r
396 \r
397 // スレッドの解放\r
398 void OSFreeThread(THREAD *t)\r
399 {\r
400         os->FreeThread(t);\r
401 }\r
402 \r
403 // スレッドの初期化\r
404 bool OSInitThread(THREAD *t)\r
405 {\r
406         return os->InitThread(t);\r
407 }\r
408 \r
409 // メモリ確保\r
410 void *OSMemoryAlloc(UINT size)\r
411 {\r
412         return os->MemoryAlloc(size);\r
413 }\r
414 \r
415 // メモリ再確保\r
416 void *OSMemoryReAlloc(void *addr, UINT size)\r
417 {\r
418         return os->MemoryReAlloc(addr, size);\r
419 }\r
420 \r
421 // メモリ解放\r
422 void OSMemoryFree(void *addr)\r
423 {\r
424         os->MemoryFree(addr);\r
425 }\r
426 \r
427 // システムタイマの取得\r
428 UINT OSGetTick()\r
429 {\r
430         return os->GetTick();\r
431 }\r
432 \r
433 // システム時刻の取得\r
434 void OSGetSystemTime(SYSTEMTIME *system_time)\r
435 {\r
436         os->GetSystemTime(system_time);\r
437 }\r
438 \r
439 // 32bit インクリメント\r
440 void OSInc32(UINT *value)\r
441 {\r
442         os->Inc32(value);\r
443 }\r
444 \r
445 // 32bit デクリメント\r
446 void OSDec32(UINT *value)\r
447 {\r
448         os->Dec32(value);\r
449 }\r
450 \r
451 // スレッドの休止\r
452 void OSSleep(UINT time)\r
453 {\r
454         os->Sleep(time);\r
455 }\r
456 \r
457 // ロック作成\r
458 LOCK *OSNewLock()\r
459 {\r
460         return os->NewLock();\r
461 }\r
462 \r
463 // ロック\r
464 bool OSLock(LOCK *lock)\r
465 {\r
466         return os->Lock(lock);\r
467 }\r
468 \r
469 // ロック解除\r
470 void OSUnlock(LOCK *lock)\r
471 {\r
472         os->Unlock(lock);\r
473 }\r
474 \r
475 // ロック削除\r
476 void OSDeleteLock(LOCK *lock)\r
477 {\r
478         os->DeleteLock(lock);\r
479 }\r
480 \r
481 // イベント初期化\r
482 void OSInitEvent(EVENT *event)\r
483 {\r
484         os->InitEvent(event);\r
485 }\r
486 \r
487 // イベントのセット\r
488 void OSSetEvent(EVENT *event)\r
489 {\r
490         os->SetEvent(event);\r
491 }\r
492 \r
493 // イベントのリセット\r
494 void OSResetEvent(EVENT *event)\r
495 {\r
496         os->ResetEvent(event);\r
497 }\r
498 \r
499 // イベントの待機\r
500 bool OSWaitEvent(EVENT *event, UINT timeout)\r
501 {\r
502         return os->WaitEvent(event, timeout);\r
503 }\r
504 \r
505 // イベントの解放\r
506 void OSFreeEvent(EVENT *event)\r
507 {\r
508         os->FreeEvent(event);\r
509 }\r
510 \r