* tar xzf utvpn-src-unix-v101-7101-public-2010.06.27.tar.gz
[lab.git] / utvpn / utvpn-unix-v101-7101-public / src / Cedar / Command.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 // Command.c\r
79 // vpncmd コマンドライン管理ユーティリティ\r
80 \r
81 #include "CedarPch.h"\r
82 \r
83 // システムチェッカ定義\r
84 typedef bool (CHECKER_PROC_DEF)();\r
85 typedef struct CHECKER_PROC\r
86 {\r
87         char *Title;\r
88         CHECKER_PROC_DEF *Proc;\r
89 } CHECKER_PROC;\r
90 \r
91 static CHECKER_PROC checker_procs[] =\r
92 {\r
93         {"CHECK_PROC_KERNEL", CheckKernel},\r
94         {"CHECK_PROC_MEMORY", CheckMemory},\r
95         {"CHECK_PROC_STRINGS", CheckStrings},\r
96         {"CHECK_PROC_FILESYSTEM", CheckFileSystem},\r
97         {"CHECK_PROC_THREAD", CheckThread},\r
98         {"CHECK_PROC_NETWORK", CheckNetwork},\r
99 };\r
100 \r
101 typedef struct CHECK_NETWORK_1\r
102 {\r
103         SOCK *ListenSocket;\r
104 } CHECK_NETWORK_1;\r
105 \r
106 typedef struct CHECK_NETWORK_2\r
107 {\r
108         SOCK *s;\r
109         X *x;\r
110         K *k;\r
111 } CHECK_NETWORK_2;\r
112 \r
113 \r
114 // TT_RESULT を RPC に変換\r
115 void OutRpcTtResult(PACK *p, TT_RESULT *t)\r
116 {\r
117         if (p == NULL || t == NULL)\r
118         {\r
119                 return;\r
120         }\r
121 \r
122         PackAddBool(p, "Raw", t->Raw);\r
123         PackAddBool(p, "Double", t->Double);\r
124         PackAddInt64(p, "NumBytesUpload", t->NumBytesUpload);\r
125         PackAddInt64(p, "NumBytesDownload", t->NumBytesDownload);\r
126         PackAddInt64(p, "NumBytesTotal", t->NumBytesTotal);\r
127         PackAddInt64(p, "Span", t->Span);\r
128         PackAddInt64(p, "BpsUpload", t->BpsUpload);\r
129         PackAddInt64(p, "BpsDownload", t->BpsDownload);\r
130         PackAddInt64(p, "BpsTotal", t->BpsTotal);\r
131 }\r
132 \r
133 // RPC を TT_RESULT に変換\r
134 void InRpcTtResult(PACK *p, TT_RESULT *t)\r
135 {\r
136         if (p == NULL || t == NULL)\r
137         {\r
138                 return;\r
139         }\r
140 \r
141         Zero(t, sizeof(TT_RESULT));\r
142 \r
143         t->Raw = PackGetBool(p, "Raw");\r
144         t->Double = PackGetBool(p, "Double");\r
145         t->NumBytesUpload = PackGetInt64(p, "NumBytesUpload");\r
146         t->NumBytesDownload = PackGetInt64(p, "NumBytesDownload");\r
147         t->NumBytesTotal = PackGetInt64(p, "NumBytesTotal");\r
148         t->Span = PackGetInt64(p, "Span");\r
149         t->BpsUpload = PackGetInt64(p, "BpsUpload");\r
150         t->BpsDownload = PackGetInt64(p, "BpsDownload");\r
151         t->BpsTotal = PackGetInt64(p, "BpsTotal");\r
152 }\r
153 \r
154 // Accept スレッド\r
155 void CheckNetworkAcceptThread(THREAD *thread, void *param)\r
156 {\r
157         CHECK_NETWORK_2 *c = (CHECK_NETWORK_2 *)param;\r
158         SOCK *s = c->s;\r
159         UINT i = 0;\r
160 \r
161         if (StartSSL(s, c->x, c->k))\r
162         {\r
163                 while (true)\r
164                 {\r
165                         i++;\r
166                         if (Send(s, &i, sizeof(UINT), true) == 0)\r
167                         {\r
168                                 break;\r
169                         }\r
170                 }\r
171         }\r
172 \r
173         Disconnect(s);\r
174         ReleaseSock(s);\r
175 }\r
176 \r
177 \r
178 // Listen スレッド\r
179 void CheckNetworkListenThread(THREAD *thread, void *param)\r
180 {\r
181         CHECK_NETWORK_1 *c = (CHECK_NETWORK_1 *)param;\r
182         SOCK *s;\r
183         UINT i;\r
184         K *pub, *pri;\r
185         X *x;\r
186         LIST *o = NewList(NULL);\r
187         NAME *name = NewName(L"Test", L"Test", L"Test", L"JP", L"Ibaraki", L"Tsukuba");\r
188 \r
189         RsaGen(&pri, &pub, 1024);\r
190         x = NewRootX(pub, pri, name, 1000, NULL);\r
191 \r
192         FreeName(name);\r
193 \r
194         for (i = 1025;;i++)\r
195         {\r
196                 s = Listen(i);\r
197                 if (s != NULL)\r
198                 {\r
199                         break;\r
200                 }\r
201         }\r
202 \r
203         c->ListenSocket = s;\r
204         AddRef(s->ref);\r
205 \r
206         NoticeThreadInit(thread);\r
207 \r
208         while (true)\r
209         {\r
210                 SOCK *new_sock = Accept(s);\r
211 \r
212                 if (new_sock == NULL)\r
213                 {\r
214                         break;\r
215                 }\r
216                 else\r
217                 {\r
218                         CHECK_NETWORK_2 c;\r
219                         THREAD *t;\r
220 \r
221                         Zero(&c, sizeof(c));\r
222                         c.s = new_sock;\r
223                         c.k = pri;\r
224                         c.x = x;\r
225 \r
226                         t = NewThread(CheckNetworkAcceptThread, &c);\r
227                         Insert(o, t);\r
228                 }\r
229         }\r
230 \r
231         for (i = 0;i < LIST_NUM(o);i++)\r
232         {\r
233                 THREAD *t = LIST_DATA(o, i);\r
234                 WaitThread(t, INFINITE);\r
235                 ReleaseThread(t);\r
236         }\r
237 \r
238         FreeK(pri);\r
239         FreeK(pub);\r
240 \r
241         FreeX(x);\r
242 \r
243         ReleaseSock(s);\r
244         ReleaseList(o);\r
245 }\r
246 \r
247 // ネットワーク機能チェック\r
248 bool CheckNetwork()\r
249 {\r
250         CHECK_NETWORK_1 c;\r
251         THREAD *t;\r
252         SOCK *listen_socket;\r
253         UINT port;\r
254         UINT i, num;\r
255         bool ok = true;\r
256         SOCK **socks;\r
257         SOCK_EVENT *se = NewSockEvent();\r
258 \r
259         Zero(&c, sizeof(c));\r
260         t = NewThread(CheckNetworkListenThread, &c);\r
261         WaitThreadInit(t);\r
262 \r
263         listen_socket = c.ListenSocket;\r
264 \r
265         port = listen_socket->LocalPort;\r
266 \r
267         num = 8;\r
268         socks = ZeroMalloc(sizeof(SOCK *) * num);\r
269         for (i = 0;i < num;i++)\r
270         {\r
271                 socks[i] = Connect("localhost", port);\r
272                 if (socks[i] == NULL)\r
273                 {\r
274                         Print("Connect Failed. (%u)\n", i);\r
275                         ok = false;\r
276                         num = i;\r
277                         break;\r
278                 }\r
279                 if (StartSSL(socks[i], NULL, NULL) == false)\r
280                 {\r
281                         ReleaseSock(socks[i]);\r
282                         Print("Connect Failed. (%u)\n", i);\r
283                         ok = false;\r
284                         num = i;\r
285                         break;\r
286                 }\r
287 \r
288                 JoinSockToSockEvent(socks[i], se);\r
289         }\r
290 \r
291         if (ok)\r
292         {\r
293                 while (true)\r
294                 {\r
295                         UINT i;\r
296                         bool end = false;\r
297                         bool all_blocked = true;\r
298 \r
299                         for (i = 0;i < num;i++)\r
300                         {\r
301                                 UINT n;\r
302                                 UINT ret;\r
303 \r
304                                 n = 0;\r
305                                 ret = Recv(socks[i], &n, sizeof(UINT), true);\r
306                                 if (ret == 0)\r
307                                 {\r
308                                         Print("Recv Failed (Disconnected).\n", ret);\r
309                                         end = true;\r
310                                         ok = false;\r
311                                 }\r
312                                 if (ret != SOCK_LATER)\r
313                                 {\r
314                                         all_blocked = false;\r
315                                 }\r
316 \r
317                                 if (n >= 128)\r
318                                 {\r
319                                         end = true;\r
320                                 }\r
321                         }\r
322 \r
323                         if (end)\r
324                         {\r
325                                 break;\r
326                         }\r
327 \r
328                         if (all_blocked)\r
329                         {\r
330                                 WaitSockEvent(se, INFINITE);\r
331                         }\r
332                 }\r
333         }\r
334 \r
335         for (i = 0;i < num;i++)\r
336         {\r
337                 Disconnect(socks[i]);\r
338                 ReleaseSock(socks[i]);\r
339         }\r
340         Free(socks);\r
341 \r
342         Disconnect(listen_socket);\r
343 \r
344         WaitThread(t, INFINITE);\r
345         ReleaseThread(t);\r
346 \r
347         ReleaseSock(listen_socket);\r
348 \r
349         ReleaseSockEvent(se);\r
350 \r
351         return ok;\r
352 }\r
353 \r
354 typedef struct CHECK_THREAD_1\r
355 {\r
356         UINT num;\r
357         LOCK *lock;\r
358         THREAD *wait_thread;\r
359 } CHECK_THREAD_1;\r
360 \r
361 static UINT check_thread_global_1 = 0;\r
362 \r
363 #define CHECK_THREAD_INCREMENT_COUNT            32\r
364 \r
365 // テストスレッド 1\r
366 void CheckThread1(THREAD *thread, void *param)\r
367 {\r
368         CHECK_THREAD_1 *ct1 = (CHECK_THREAD_1 *)param;\r
369         UINT i;\r
370         UINT num = CHECK_THREAD_INCREMENT_COUNT;\r
371 \r
372         WaitThread(ct1->wait_thread, INFINITE);\r
373 \r
374         for (i = 0;i < num;i++)\r
375         {\r
376                 Lock(ct1->lock);\r
377                 check_thread_global_1 = ct1->num;\r
378                 InputToNull((void *)check_thread_global_1);\r
379                 check_thread_global_1 = check_thread_global_1 + 1 + RetZero();\r
380                 ct1->num = check_thread_global_1;\r
381                 Unlock(ct1->lock);\r
382         }\r
383 }\r
384 \r
385 // テストスレッド 2\r
386 void CheckThread2(THREAD *thread, void *param)\r
387 {\r
388         EVENT *e = (EVENT *)param;\r
389         Wait(e, INFINITE);\r
390 }\r
391 \r
392 typedef struct CHECK_THREAD_3\r
393 {\r
394         UINT num, a;\r
395 } CHECK_THREAD_3;\r
396 \r
397 // テストスレッド 3\r
398 void CheckThread3(THREAD *thread, void *param)\r
399 {\r
400         CHECK_THREAD_3 *c = (CHECK_THREAD_3 *)param;\r
401         THREAD *t;\r
402 \r
403         if (c->num == 0)\r
404         {\r
405                 return;\r
406         }\r
407         c->num--;\r
408         c->a++;\r
409 \r
410         t = NewThread(CheckThread3, c);\r
411         WaitThread(t, INFINITE);\r
412         ReleaseThread(t);\r
413 }\r
414 \r
415 // スレッドチェック\r
416 bool CheckThread()\r
417 {\r
418         bool ok = true;\r
419         CHECK_THREAD_1 ct1;\r
420         UINT num = 32;\r
421         UINT i;\r
422         THREAD **threads;\r
423         EVENT *e;\r
424         THREAD *t2;\r
425         THREAD *t;\r
426         CHECK_THREAD_3 c;\r
427 \r
428         e = NewEvent();\r
429 \r
430         Zero(&ct1, sizeof(ct1));\r
431         ct1.lock = NewLock();\r
432 \r
433         t2 = NewThread(CheckThread2, e);\r
434         ct1.wait_thread = t2;\r
435 \r
436         threads = ZeroMalloc(sizeof(THREAD *) * num);\r
437         for (i = 0;i < num;i++)\r
438         {\r
439                 threads[i] = NewThread(CheckThread1, &ct1);\r
440                 if (threads[i] == NULL)\r
441                 {\r
442                         Print("Thread %u Create Failed.\n", i);\r
443                         ok = false;\r
444                 }\r
445         }\r
446 \r
447         Set(e);\r
448 \r
449         for (i = 0;i < num;i++)\r
450         {\r
451                 WaitThread(threads[i], INFINITE);\r
452                 ReleaseThread(threads[i]);\r
453         }\r
454 \r
455         Free(threads);\r
456 \r
457         if (ct1.num != (num * CHECK_THREAD_INCREMENT_COUNT))\r
458         {\r
459                 Print("Threading: %u != %u\n", ct1.num, num * CHECK_THREAD_INCREMENT_COUNT);\r
460                 ok = false;\r
461         }\r
462 \r
463         DeleteLock(ct1.lock);\r
464 \r
465         WaitThread(t2, INFINITE);\r
466         ReleaseThread(t2);\r
467 \r
468         ReleaseEvent(e);\r
469 \r
470         num = 32;\r
471 \r
472         Zero(&c, sizeof(c));\r
473         c.num = num;\r
474         t = NewThread(CheckThread3, &c);\r
475         WaitThread(t, INFINITE);\r
476         ReleaseThread(t);\r
477 \r
478         if (c.a != num)\r
479         {\r
480                 Print("Threading: %u != %u\n", c.a, num);\r
481                 ok = false;\r
482         }\r
483 \r
484         return ok;\r
485 }\r
486 \r
487 // ファイルシステムチェック\r
488 bool CheckFileSystem()\r
489 {\r
490         bool ok = true;\r
491         char exe[MAX_PATH];\r
492         char exe_dir[MAX_PATH];\r
493         DIRLIST *dirs;\r
494         UINT i;\r
495 \r
496         GetExeName(exe, sizeof(exe));\r
497         GetExeDir(exe_dir, sizeof(exe_dir));\r
498 \r
499         ok = false;\r
500         dirs = EnumDir(exe_dir);\r
501         for (i = 0;i < dirs->NumFiles;i++)\r
502         {\r
503                 if (EndWith(exe, dirs->File[i]->FileName))\r
504                 {\r
505                         ok = true;\r
506                         break;\r
507                 }\r
508         }\r
509         FreeDir(dirs);\r
510 \r
511         if (ok == false)\r
512         {\r
513                 Print("EnumDir Failed.\n");\r
514                 return false;\r
515         }\r
516         else\r
517         {\r
518                 UINT size = 1234567;\r
519                 UCHAR *buf;\r
520                 IO *io;\r
521 #ifndef OS_WIN32\r
522                 wchar_t *filename = L"/tmp/vpn_checker_tmp";\r
523 #else   // OS_WIN32\r
524                 wchar_t filename[MAX_PATH];\r
525                 CombinePathW(filename, sizeof(filename), MsGetMyTempDirW(), L"vpn_checker_tmp");\r
526 #endif  // OS_WIN32\r
527 \r
528                 buf = Malloc(size);\r
529                 for (i = 0;i < size;i++)\r
530                 {\r
531                         buf[i] = i % 256;\r
532                 }\r
533 \r
534                 io = FileCreateW(filename);\r
535                 if (io == NULL)\r
536                 {\r
537                         Print("FileCreate Failed.\n");\r
538                         Free(buf);\r
539                         return false;\r
540                 }\r
541                 else\r
542                 {\r
543                         FileWrite(io, buf, size);\r
544                         Free(buf);\r
545                         FileClose(io);\r
546 \r
547                         io = FileOpenW(filename, false);\r
548                         if (FileSize(io) != 1234567)\r
549                         {\r
550                                 Print("FileSize Failed.\n");\r
551                                 FileClose(io);\r
552                                 return false;\r
553                         }\r
554                         else\r
555                         {\r
556                                 BUF *b;\r
557 \r
558                                 FileClose(io);\r
559                                 b = ReadDumpW(filename);\r
560 \r
561                                 for (i = 0;i < b->Size;i++)\r
562                                 {\r
563                                         UCHAR c = ((UCHAR *)b->Buf)[i];\r
564 \r
565                                         if (c != (i % 256))\r
566                                         {\r
567                                                 Print("FileToBuf Failed.\n");\r
568                                                 FreeBuf(b);\r
569                                                 return false;\r
570                                         }\r
571                                 }\r
572 \r
573                                 FreeBuf(b);\r
574                         }\r
575                 }\r
576 \r
577                 FileDeleteW(filename);\r
578         }\r
579 \r
580         return ok;\r
581 }\r
582 \r
583 // 文字列チェック\r
584 bool CheckStrings()\r
585 {\r
586         wchar_t *numstr = _UU("CHECK_TEST_123456789");\r
587         char tmp[MAX_SIZE];\r
588         wchar_t tmp2[MAX_SIZE];\r
589         UINT i;\r
590         UINT sum, sum2;\r
591         UNI_TOKEN_LIST *t;\r
592 \r
593         UniStrCpy(tmp2, sizeof(tmp2), L"");\r
594 \r
595         sum2 = 0;\r
596         for (i = 0;i < 64;i++)\r
597         {\r
598                 sum2 += i;\r
599                 UniFormat(tmp2, sizeof(tmp2), L"%s,%u", tmp2, i);\r
600         }\r
601 \r
602         t = UniParseToken(tmp2, L",");\r
603 \r
604         sum = 0;\r
605 \r
606         for (i = 0;i < t->NumTokens;i++)\r
607         {\r
608                 wchar_t *s = t->Token[i];\r
609                 UINT n = UniToInt(s);\r
610 \r
611                 sum += n;\r
612         }\r
613 \r
614         UniFreeToken(t);\r
615 \r
616         if (sum != sum2)\r
617         {\r
618                 Print("UniParseToken Failed.\n");\r
619                 return false;\r
620         }\r
621 \r
622         if (UniToInt(numstr) != 123456789)\r
623         {\r
624                 Print("UniToInt Failed.\n");\r
625                 return false;\r
626         }\r
627 \r
628         UniToStr(tmp, sizeof(tmp), numstr);\r
629         if (ToInt(tmp) != 123456789)\r
630         {\r
631                 Print("UniToStr Failed.\n");\r
632                 return false;\r
633         }\r
634 \r
635         StrToUni(tmp2, sizeof(tmp2), _SS("CHECK_TEST_TESTSTR"));\r
636         if (UniStrCmp(_UU("CHECK_TEST_TESTSTR"), tmp2) != 0)\r
637         {\r
638                 Print("StrToUni Failed.\n");\r
639                 printf("[%S] [%S]\n", tmp2, _UU("CHECK_TEST_TESTSTR"));\r
640                 return false;\r
641         }\r
642 \r
643         ReplaceStrEx(tmp, sizeof(tmp), _SS("CHECK_TEST_REPLACE1"), _SS("CHECK_TEST_REPLACE3"),\r
644                 _SS("CHECK_TEST_REPLACE4"), false);\r
645 \r
646         if (StrCmp(tmp, _SS("CHECK_TEST_REPLACE2")) != 0)\r
647         {\r
648                 Print("ReplaceStrEx Failed.\n");\r
649                 return false;\r
650         }\r
651 \r
652         UniReplaceStrEx(tmp2, sizeof(tmp2), _UU("CHECK_TEST_REPLACE1"), _UU("CHECK_TEST_REPLACE3"),\r
653                 _UU("CHECK_TEST_REPLACE4"), false);\r
654 \r
655         if (UniStrCmp(tmp2, _UU("CHECK_TEST_REPLACE2")) != 0)\r
656         {\r
657                 Print("UniReplaceStrEx Failed.\n");\r
658                 return false;\r
659         }\r
660 \r
661         return true;\r
662 }\r
663 \r
664 // メモリチェック\r
665 bool CheckMemory()\r
666 {\r
667         UINT i, num, size, j;\r
668         void **pp;\r
669         bool ok = true;\r
670         UINT old_size;\r
671 \r
672         num = 2000;\r
673         size = 1000;\r
674         pp = ZeroMalloc(sizeof(void *) * num);\r
675         for (i = 0;i < num;i++)\r
676         {\r
677                 pp[i] = ZeroMalloc(size);\r
678                 InputToNull(pp[i]);\r
679                 for (j = 0;j < size;j++)\r
680                 {\r
681                         ((UCHAR *)pp[i])[j] = j % 256;\r
682                 }\r
683         }\r
684         old_size = size;\r
685         size = size * 3;\r
686         for (i = 0;i < num;i++)\r
687         {\r
688                 pp[i] = ReAlloc(pp[i], size);\r
689                 for (j = old_size;j < size;j++)\r
690                 {\r
691                         InputToNull((void *)(UINT)(((UCHAR *)pp[i])[j] = j % 256));\r
692                 }\r
693         }\r
694         for (i = 0;i < num;i++)\r
695         {\r
696                 for (j = 0;j < size;j++)\r
697                 {\r
698                         if (((UCHAR *)pp[i])[j] != (j % 256))\r
699                         {\r
700                                 ok = false;\r
701                         }\r
702                 }\r
703                 Free(pp[i]);\r
704         }\r
705         Free(pp);\r
706 \r
707         return ok;\r
708 }\r
709 \r
710 // 何もしない関数\r
711 void InputToNull(void *p)\r
712 {\r
713         // 意味不明!\r
714         if (RetZero() == 1)\r
715         {\r
716                 UCHAR *c = (UCHAR *)p;\r
717                 c[0] = 0x32;\r
718         }\r
719 }\r
720 \r
721 // 0 を返す関数\r
722 UINT RetZero()\r
723 {\r
724         // 意味不明!\r
725         if (g_debug == 0x123455)\r
726         {\r
727                 return 1;\r
728         }\r
729         else\r
730         {\r
731                 return 0;\r
732         }\r
733 }\r
734 \r
735 \r
736 // カーネルチェック\r
737 bool CheckKernel()\r
738 {\r
739         UINT num = 10, i;\r
740         UINT64 s = Tick64();\r
741         UINT64 t = Tick64();\r
742 \r
743         for (i = 0;i < num;i++)\r
744         {\r
745                 UINT64 q = Tick64();\r
746                 if (t > q)\r
747                 {\r
748                         Print("Tick64 #1 Failed.\n");\r
749                         return false;\r
750                 }\r
751 \r
752                 t = q;\r
753 \r
754                 SleepThread(100);\r
755         }\r
756 \r
757         t = (Tick64() - s);\r
758         if (t <= 500 || t >= 2000)\r
759         {\r
760                 Print("Tick64 #2 Failed.\n");\r
761                 return false;\r
762         }\r
763         else if (false)\r
764         {\r
765                 UINT64 tick1 = Tick64();\r
766                 UINT64 time1;\r
767                 UINT64 tick2, time2;\r
768 \r
769                 SleepThread(1000);\r
770 \r
771                 tick2 = Tick64();\r
772                 time2 = LocalTime64();\r
773                 time1 = SystemToLocal64(TickToTime(tick1));\r
774 \r
775                 if (time2 > time1)\r
776                 {\r
777                         s = time2 - time1;\r
778                 }\r
779                 else\r
780                 {\r
781                         s = time1 - time2;\r
782                 }\r
783 \r
784                 if (s <= 500 || s >= 2000)\r
785                 {\r
786                         Print("TickToTime Failed.\n");\r
787                         return false;\r
788                 }\r
789         }\r
790 \r
791 #ifdef  OS_UNIX\r
792         {\r
793                 // 子プロセスのテスト\r
794                 UINT pid;\r
795                 char exe[MAX_SIZE];\r
796 \r
797                 GetExeName(exe, sizeof(exe));\r
798 \r
799                 pid = fork();\r
800 \r
801                 if (pid == -1)\r
802                 {\r
803                         Print("fork Failed.\n");\r
804                         return false;\r
805                 }\r
806 \r
807                 if (pid == 0)\r
808                 {\r
809                         char *param = UNIX_ARG_EXIT;\r
810                         char **args;\r
811 \r
812                         args = ZeroMalloc(sizeof(char *) * 3);\r
813                         args[0] = exe;\r
814                         args[1] = param;\r
815                         args[2] = NULL;\r
816 \r
817                         setsid();\r
818 \r
819                         // 標準入出力をクローズする\r
820                         UnixCloseIO();\r
821 \r
822                         // 不要なシグナルを停止する\r
823                         signal(SIGHUP, SIG_IGN);\r
824 \r
825                         execvp(exe, args);\r
826                         AbortExit();\r
827                 }\r
828                 else\r
829                 {\r
830                         int status = 0, ret;\r
831 \r
832                         // 子プロセスの終了を待機する\r
833                         ret = waitpid(pid, &status, 0);\r
834 \r
835                         if (WIFEXITED(status) == 0)\r
836                         {\r
837                                 // 異常終了した\r
838                                 Print("waitpid Failed: 0x%x\n", ret);\r
839                                 return false;\r
840                         }\r
841                 }\r
842         }\r
843 #endif  // OS_UNIX\r
844 \r
845         return true;\r
846 }\r
847 \r
848 // システムチェッカ\r
849 bool SystemCheck()\r
850 {\r
851         UINT i;\r
852         bool ng = false;\r
853 \r
854         UniPrint(_UU("CHECK_TITLE"));\r
855         UniPrint(_UU("CHECK_NOTE"));\r
856         for (i = 0;i < sizeof(checker_procs) / sizeof(checker_procs[0]);i++)\r
857         {\r
858                 wchar_t *title;\r
859                 bool ret = false;\r
860                 CHECKER_PROC *p = &checker_procs[i];\r
861 \r
862                 title = _UU(p->Title);\r
863 \r
864                 UniPrint(_UU("CHECK_EXEC_TAG"), title);\r
865 \r
866                 ret = p->Proc();\r
867 \r
868                 if (ret == false)\r
869                 {\r
870                         ng = true;\r
871                 }\r
872 \r
873                 UniPrint(L"              %s\n", ret ? _UU("CHECK_PASS") : _UU("CHECK_FAIL"));\r
874         }\r
875 \r
876         UniPrint(L"\n");\r
877         if (ng == false)\r
878         {\r
879                 UniPrint(L"%s\n\n", _UU("CHECK_RESULT_1"));\r
880         }\r
881         else\r
882         {\r
883                 UniPrint(L"%s\n\n", _UU("CHECK_RESULT_2"));\r
884         }\r
885 \r
886         return true;\r
887 }\r
888 \r
889 \r
890 // 動作チェッカ\r
891 UINT PtCheck(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)\r
892 {\r
893         LIST *o;\r
894         UINT ret = ERR_NO_ERROR;\r
895         // パラメータリストの取得\r
896         o = ParseCommandList(c, cmd_name, str, NULL, 0);\r
897         if (o == NULL)\r
898         {\r
899                 return ERR_INVALID_PARAMETER;\r
900         }\r
901 \r
902         if (SystemCheck() == false)\r
903         {\r
904                 ret = ERR_INTERNAL_ERROR;\r
905         }\r
906 \r
907         FreeParamValueList(o);\r
908 \r
909         return ret;\r
910 }\r
911 \r
912 // VPN Tools メイン関数\r
913 void PtMain(PT *pt)\r
914 {\r
915         char prompt[MAX_SIZE];\r
916         wchar_t tmp[MAX_SIZE];\r
917         // 引数チェック\r
918         if (pt == NULL)\r
919         {\r
920                 return;\r
921         }\r
922 \r
923         // 起動が完了したメッセージを表示する\r
924         UniFormat(tmp, sizeof(tmp), _UU("CMD_UTVPNCMD_TOOLS_CONNECTED"));\r
925         pt->Console->Write(pt->Console, tmp);\r
926         pt->Console->Write(pt->Console, L"");\r
927 \r
928         while (true)\r
929         {\r
930                 // コマンドの定義\r
931                 CMD cmd[] =\r
932                 {\r
933                         {"About", PsAbout},\r
934                         {"MakeCert", PtMakeCert},\r
935                         {"TrafficClient", PtTrafficClient},\r
936                         {"TrafficServer", PtTrafficServer},\r
937                         {"Check", PtCheck},\r
938                 };\r
939 \r
940                 // プロンプトの生成\r
941                 StrCpy(prompt, sizeof(prompt), "VPN Tools>");\r
942 \r
943                 if (DispatchNextCmdEx(pt->Console, pt->CmdLine, prompt, cmd, sizeof(cmd) / sizeof(cmd[0]), pt) == false)\r
944                 {\r
945                         break;\r
946                 }\r
947                 pt->LastError = pt->Console->RetCode;\r
948 \r
949                 if (pt->LastError == ERR_NO_ERROR && pt->Console->ConsoleType != CONSOLE_CSV)\r
950                 {\r
951                         pt->Console->Write(pt->Console, _UU("CMD_MSG_OK"));\r
952                         pt->Console->Write(pt->Console, L"");\r
953                 }\r
954 \r
955                 if (pt->CmdLine != NULL)\r
956                 {\r
957                         break;\r
958                 }\r
959         }\r
960 }\r
961 \r
962 // VPN Tools コンテキストの作成\r
963 PT *NewPt(CONSOLE *c, wchar_t *cmdline)\r
964 {\r
965         PT *pt;\r
966         // 引数チェック\r
967         if (c == NULL)\r
968         {\r
969                 return NULL;\r
970         }\r
971 \r
972         if (UniIsEmptyStr(cmdline))\r
973         {\r
974                 cmdline = NULL;\r
975         }\r
976 \r
977         pt = ZeroMalloc(sizeof(PT));\r
978         pt->Console = c;\r
979         pt->CmdLine = CopyUniStr(cmdline);\r
980 \r
981         return pt;\r
982 }\r
983 \r
984 // VPN Tools コンテキストの解放\r
985 void FreePt(PT *pt)\r
986 {\r
987         // 引数チェック\r
988         if (pt == NULL)\r
989         {\r
990                 return;\r
991         }\r
992 \r
993         Free(pt->CmdLine);\r
994         Free(pt);\r
995 }\r
996 \r
997 // VPN Tools 開始\r
998 UINT PtConnect(CONSOLE *c, wchar_t *cmdline)\r
999 {\r
1000         PT *pt;\r
1001         UINT ret = 0;\r
1002         // 引数チェック\r
1003         if (c == NULL)\r
1004         {\r
1005                 return ERR_INTERNAL_ERROR;\r
1006         }\r
1007 \r
1008         pt = NewPt(c, cmdline);\r
1009 \r
1010         PtMain(pt);\r
1011 \r
1012         ret = pt->LastError;\r
1013 \r
1014         FreePt(pt);\r
1015 \r
1016         return ret;\r
1017 }\r
1018 \r
1019 // vpncmd コマンドの起動パス情報の初期化\r
1020 void VpnCmdInitBootPath()\r
1021 {\r
1022 #ifdef  OS_WIN32\r
1023         char exe_path[MAX_PATH];\r
1024         char tmp[MAX_PATH];\r
1025         GetExeName(exe_path, sizeof(exe_path));\r
1026 \r
1027         if (SearchStrEx(exe_path, "ham.exe", 0, false) != INFINITE || SearchStrEx(exe_path, "ham_x64.exe", 0, false) != INFINITE || SearchStrEx(exe_path, "ham_ia64.exe", 0, false) != INFINITE)\r
1028         {\r
1029                 return;\r
1030         }\r
1031 \r
1032         if (MsIsAdmin())\r
1033         {\r
1034                 UINT current_ver;\r
1035 \r
1036                 // 現在インストールされている vpncmd のバージョンの取得\r
1037                 current_ver = MsRegReadInt(REG_LOCAL_MACHINE, VPNCMD_BOOTSTRAP_REG_KEYNAME, VPNCMD_BOOTSTRAP_REG_VALUENAME_VER);\r
1038 \r
1039                 if ((CEDAR_BUILD >= current_ver) ||\r
1040                         MsRegIsValue(REG_LOCAL_MACHINE, VPNCMD_BOOTSTRAP_REG_KEYNAME, VPNCMD_BOOTSTRAP_REG_VALUENAME_PATH) == false)\r
1041                 {\r
1042                         char *src_filename;\r
1043                         bool b = false;\r
1044                         // vpncmdsys.exe を system32 にコピーする\r
1045                         if (MsIsNt())\r
1046                         {\r
1047                                 Format(tmp, sizeof(tmp), "%s\\utvpncmd.exe", MsGetSystem32Dir());\r
1048                         }\r
1049                         else\r
1050                         {\r
1051                                 Format(tmp, sizeof(tmp), "%s\\utvpncmd.exe", MsGetWindowsDir());\r
1052                         }\r
1053 \r
1054                         src_filename = VPNCMD_BOOTSTRAP_FILENAME;\r
1055 \r
1056                         if (IsX64())\r
1057                         {\r
1058                                 src_filename = VPNCMD_BOOTSTRAP_FILENAME_X64;\r
1059                         }\r
1060 \r
1061                         if (IsIA64())\r
1062                         {\r
1063                                 src_filename = VPNCMD_BOOTSTRAP_FILENAME_IA64;\r
1064                         }\r
1065 \r
1066                         b = true;\r
1067 \r
1068                         if (MsIs64BitWindows() == false || Is64())\r
1069                         {\r
1070                                 if (IsFile(tmp) == false || (CEDAR_BUILD > current_ver) || MsRegIsValue(REG_LOCAL_MACHINE, VPNCMD_BOOTSTRAP_REG_KEYNAME, VPNCMD_BOOTSTRAP_REG_VALUENAME_PATH) == false)\r
1071                                 {\r
1072                                         b = FileCopy(src_filename, tmp);\r
1073                                 }\r
1074                         }\r
1075                         else\r
1076                         {\r
1077                                 void *wow;\r
1078 \r
1079                                 wow = MsDisableWow64FileSystemRedirection();\r
1080 \r
1081                                 if (true)\r
1082                                 {\r
1083                                         if (IsFile(tmp) == false || (CEDAR_BUILD > current_ver) || MsRegIsValue(REG_LOCAL_MACHINE, VPNCMD_BOOTSTRAP_REG_KEYNAME, VPNCMD_BOOTSTRAP_REG_VALUENAME_PATH) == false)\r
1084                                         {\r
1085                                                 b = FileCopy(src_filename, tmp);\r
1086                                         }\r
1087                                 }\r
1088 \r
1089                                 MsRestoreWow64FileSystemRedirection(wow);\r
1090 \r
1091                                 if (true)\r
1092                                 {\r
1093                                         if (IsFile(tmp) == false || (CEDAR_BUILD > current_ver) || MsRegIsValue(REG_LOCAL_MACHINE, VPNCMD_BOOTSTRAP_REG_KEYNAME, VPNCMD_BOOTSTRAP_REG_VALUENAME_PATH) == false)\r
1094                                         {\r
1095                                                 b = FileCopy(src_filename, tmp);\r
1096                                         }\r
1097                                 }\r
1098                         }\r
1099 \r
1100                         // 現在実行しているプロンプトのほうがバージョンが新しいのでレジストリを上書きする\r
1101                         if (MsIs64BitWindows() == false)\r
1102                         {\r
1103                                 MsRegWriteStr(REG_LOCAL_MACHINE, VPNCMD_BOOTSTRAP_REG_KEYNAME, VPNCMD_BOOTSTRAP_REG_VALUENAME_PATH, exe_path);\r
1104                                 MsRegWriteInt(REG_LOCAL_MACHINE, VPNCMD_BOOTSTRAP_REG_KEYNAME, VPNCMD_BOOTSTRAP_REG_VALUENAME_VER, CEDAR_BUILD);\r
1105                         }\r
1106                         else\r
1107                         {\r
1108                                 MsRegWriteStrEx2(REG_LOCAL_MACHINE, VPNCMD_BOOTSTRAP_REG_KEYNAME, VPNCMD_BOOTSTRAP_REG_VALUENAME_PATH, exe_path, true, false);\r
1109                                 MsRegWriteIntEx2(REG_LOCAL_MACHINE, VPNCMD_BOOTSTRAP_REG_KEYNAME, VPNCMD_BOOTSTRAP_REG_VALUENAME_VER, CEDAR_BUILD, true, false);\r
1110 \r
1111                                 MsRegWriteStrEx2(REG_LOCAL_MACHINE, VPNCMD_BOOTSTRAP_REG_KEYNAME, VPNCMD_BOOTSTRAP_REG_VALUENAME_PATH, exe_path, false, true);\r
1112                                 MsRegWriteIntEx2(REG_LOCAL_MACHINE, VPNCMD_BOOTSTRAP_REG_KEYNAME, VPNCMD_BOOTSTRAP_REG_VALUENAME_VER, CEDAR_BUILD, false, true);\r
1113                         }\r
1114                 }\r
1115         }\r
1116 #endif  // OS_WIN32\r
1117 }\r
1118 \r
1119 // 文字列の表示\r
1120 void TtPrint(void *param, TT_PRINT_PROC *print_proc, wchar_t *str)\r
1121 {\r
1122         // 引数チェック\r
1123         if (print_proc == NULL || str == NULL)\r
1124         {\r
1125                 return;\r
1126         }\r
1127 \r
1128         print_proc(param, str);\r
1129 }\r
1130 \r
1131 // 新しいランダムデータの生成\r
1132 void TtGenerateRandomData(UCHAR **buf, UINT *size)\r
1133 {\r
1134         UCHAR *tmp;\r
1135         UINT sz;\r
1136         UINT i;\r
1137         // 引数チェック\r
1138         if (buf == NULL || size == NULL)\r
1139         {\r
1140                 return;\r
1141         }\r
1142 \r
1143         sz = TRAFFIC_BUF_SIZE;\r
1144         tmp = Malloc(sz);\r
1145         for (i = 0;i < sz;i++)\r
1146         {\r
1147                 tmp[i] = rand() % 256;\r
1148 \r
1149                 if (tmp[i] == '!')\r
1150                 {\r
1151                         tmp[i] = '_';\r
1152                 }\r
1153         }\r
1154 \r
1155         *buf = tmp;\r
1156         *size = sz;\r
1157 }\r
1158 \r
1159 // 通信スループット測定サーバーワーカースレッド\r
1160 void TtsWorkerThread(THREAD *thread, void *param)\r
1161 {\r
1162         TTS *tts;\r
1163         UINT buf_size;\r
1164         UCHAR *send_buf_data, *recv_buf_data;\r
1165         bool all_sockets_blocked = false;\r
1166         UINT64 tmp64;\r
1167         LIST *o;\r
1168         UINT i;\r
1169         wchar_t tmp[MAX_SIZE];\r
1170         bool dont_block_next_time = false;\r
1171         char *ver_str = TRAFFIC_VER_STR;\r
1172         // 引数チェック\r
1173         if (thread == NULL || param == NULL)\r
1174         {\r
1175                 return;\r
1176         }\r
1177 \r
1178         // データ領域の確保\r
1179         TtGenerateRandomData(&send_buf_data, &buf_size);\r
1180         TtGenerateRandomData(&recv_buf_data, &buf_size);\r
1181 \r
1182         tts = (TTS *)param;\r
1183 \r
1184         // ソケットイベントの準備\r
1185         tts->SockEvent = NewSockEvent();\r
1186         AddRef(tts->SockEvent->ref);\r
1187 \r
1188         // サーバーソケットリストの準備\r
1189         tts->TtsSockList = NewList(NULL);\r
1190 \r
1191         // 親スレッドに準備完了を伝える\r
1192         NoticeThreadInit(thread);\r
1193 \r
1194         o = NewList(NULL);\r
1195 \r
1196         while (tts->Halt == false)\r
1197         {\r
1198                 // すべてのソケットを待機する\r
1199                 if (dont_block_next_time == false)\r
1200                 {\r
1201                         WaitSockEvent(tts->SockEvent, 50);\r
1202                 }\r
1203                 dont_block_next_time = false;\r
1204 \r
1205                 // 現在登録されているソケットについて処理する\r
1206                 LockList(tts->TtsSockList);\r
1207                 {\r
1208                         UINT i;\r
1209 \r
1210                         all_sockets_blocked = false;\r
1211 \r
1212                         // すべてのソケットがブロック状態にならない限り\r
1213                         // データの送受信を続ける\r
1214                         while (all_sockets_blocked == false)\r
1215                         {\r
1216                                 all_sockets_blocked = true;\r
1217 \r
1218                                 for (i = 0;i < LIST_NUM(tts->TtsSockList);i++)\r
1219                                 {\r
1220                                         UINT ret = SOCK_LATER;\r
1221                                         UCHAR *send_data = NULL, *recv_data = NULL;\r
1222                                         UINT send_size = 0, recv_size = 0;\r
1223                                         TTS_SOCK *ts = LIST_DATA(tts->TtsSockList, i);\r
1224                                         bool blocked_for_this_socket = false;\r
1225 \r
1226                                         if (ts->SockJoined == false)\r
1227                                         {\r
1228                                                 JoinSockToSockEvent(ts->Sock, tts->SockEvent);\r
1229                                                 ts->SockJoined = true;\r
1230                                         }\r
1231 \r
1232                                         switch (ts->State)\r
1233                                         {\r
1234                                         case 0:\r
1235                                                 // バージョン文字列を返す\r
1236                                                 ret = Send(ts->Sock, ver_str, TRAFFIC_VER_STR_SIZE, false);\r
1237                                                 if (ret != 0 && ret != SOCK_LATER)\r
1238                                                 {\r
1239                                                         ts->State = 5;\r
1240                                                 }\r
1241                                                 break;\r
1242 \r
1243                                         case 5:\r
1244                                                 // クライアントから方向を受信する\r
1245                                                 ret = Recv(ts->Sock, recv_buf_data, buf_size, false);\r
1246                                                 if (ret != 0 && ret != SOCK_LATER)\r
1247                                                 {\r
1248                                                         UCHAR c;\r
1249 \r
1250                                                         // 受信した 1 バイト目にデータの方向が入っている\r
1251                                                         c = recv_buf_data[0];\r
1252 \r
1253                                                         if (c == 0)\r
1254                                                         {\r
1255                                                                 // 0 の場合はクライアント -> サーバー\r
1256                                                                 ts->State = 1;\r
1257                                                         }\r
1258                                                         else\r
1259                                                         {\r
1260                                                                 // それ以外の場合はサーバー -> クライアント\r
1261                                                                 ts->State = 2;\r
1262                                                         }\r
1263                                                 }\r
1264                                                 break;\r
1265 \r
1266                                         case 1:\r
1267                                                 // クライアント -> サーバー\r
1268                                                 ret = Recv(ts->Sock, recv_buf_data, buf_size, false);\r
1269 \r
1270                                                 if (ret != 0 && ret != SOCK_LATER)\r
1271                                                 {\r
1272                                                         // 受信した 1 バイト目を検査する\r
1273                                                         UCHAR c = recv_buf_data[0];\r
1274 \r
1275                                                         if (c == '!')\r
1276                                                         {\r
1277                                                                 // サーバーからクライアントにサイズ情報を通知\r
1278                                                                 ts->State = 3;\r
1279                                                                 Debug("!");\r
1280                                                         }\r
1281                                                 }\r
1282                                                 break;\r
1283 \r
1284                                         case 2:\r
1285                                                 // サーバー -> クライアント\r
1286                                                 ret = Send(ts->Sock, send_buf_data, buf_size, false);\r
1287                                                 break;\r
1288 \r
1289                                         case 3:\r
1290                                                 // サーバー -> クライアントにサイズ情報を通知する\r
1291                                                 tmp64 = Endian64(ts->NumBytes);\r
1292 \r
1293                                                 Recv(ts->Sock, recv_buf_data, buf_size, false);\r
1294 \r
1295                                                 if (ts->LastWaitTick == 0 || ts->LastWaitTick <= Tick64())\r
1296                                                 {\r
1297                                                         ret = Send(ts->Sock, &tmp64, sizeof(tmp64), false);\r
1298 \r
1299                                                         if (ret != SOCK_LATER)\r
1300                                                         {\r
1301                                                                 ts->LastWaitTick = Tick64() + 100;\r
1302                                                         }\r
1303                                                 }\r
1304                                                 break;\r
1305                                         }\r
1306 \r
1307                                         if (ret == 0)\r
1308                                         {\r
1309                                                 // 切断されたのでこのソケットを削除としてマークする\r
1310                                                 Insert(o, ts);\r
1311                                         }\r
1312                                         else if (ret == SOCK_LATER)\r
1313                                         {\r
1314                                                 // 遅延が発生した\r
1315                                                 blocked_for_this_socket = true;\r
1316                                                 dont_block_next_time = false;\r
1317                                         }\r
1318                                         else\r
1319                                         {\r
1320                                                 if (ts->State == 1)\r
1321                                                 {\r
1322                                                         ts->NumBytes += (UINT64)ret;\r
1323                                                 }\r
1324                                         }\r
1325 \r
1326                                         if (blocked_for_this_socket == false)\r
1327                                         {\r
1328                                                 all_sockets_blocked = false;\r
1329                                         }\r
1330                                 }\r
1331 \r
1332                                 if (LIST_NUM(o) != 0)\r
1333                                 {\r
1334                                         UINT i;\r
1335                                         // 1 つ以上のソケットが切断された\r
1336                                         for (i = 0;i < LIST_NUM(o);i++)\r
1337                                         {\r
1338                                                 TTS_SOCK *ts = LIST_DATA(o, i);\r
1339 \r
1340                                                 UniFormat(tmp, sizeof(tmp), _UU("TTS_DISCONNECTED"), ts->Id, ts->Sock->RemoteHostname);\r
1341                                                 TtPrint(tts->Param, tts->Print, tmp);\r
1342 \r
1343                                                 Disconnect(ts->Sock);\r
1344                                                 ReleaseSock(ts->Sock);\r
1345 \r
1346                                                 Delete(tts->TtsSockList, ts);\r
1347 \r
1348                                                 Free(ts);\r
1349                                         }\r
1350 \r
1351                                         DeleteAll(o);\r
1352                                 }\r
1353 \r
1354                                 if (tts->NewSocketArrived || tts->Halt)\r
1355                                 {\r
1356                                         tts->NewSocketArrived = false;\r
1357                                         all_sockets_blocked = true;\r
1358                                         dont_block_next_time = true;\r
1359                                 }\r
1360                         }\r
1361                 }\r
1362                 UnlockList(tts->TtsSockList);\r
1363         }\r
1364 \r
1365         LockList(tts->TtsSockList);\r
1366         {\r
1367                 // 残留しているすべてのソケットを解放する\r
1368                 for (i = 0;i < LIST_NUM(tts->TtsSockList);i++)\r
1369                 {\r
1370                         TTS_SOCK *ts = LIST_DATA(tts->TtsSockList, i);\r
1371 \r
1372                         UniFormat(tmp, sizeof(tmp), _UU("TTS_DISCONNECT"), ts->Id, ts->Sock->RemoteHostname);\r
1373                         TtPrint(tts->Param, tts->Print, tmp);\r
1374 \r
1375                         Disconnect(ts->Sock);\r
1376                         ReleaseSock(ts->Sock);\r
1377 \r
1378                         Free(ts);\r
1379                 }\r
1380         }\r
1381         UnlockList(tts->TtsSockList);\r
1382 \r
1383         // クリーンアップ\r
1384         ReleaseList(o);\r
1385         ReleaseList(tts->TtsSockList);\r
1386         ReleaseSockEvent(tts->SockEvent);\r
1387         Free(send_buf_data);\r
1388         Free(recv_buf_data);\r
1389 }\r
1390 \r
1391 // IPv6 用 Accept スレッド\r
1392 void TtsIPv6AcceptThread(THREAD *thread, void *param)\r
1393 {\r
1394         TTS *tts = (TTS *)param;\r
1395         // 引数チェック\r
1396         if (tts == NULL || param == NULL)\r
1397         {\r
1398                 return;\r
1399         }\r
1400 \r
1401         TtsAcceptProc(tts, tts->ListenSocketV6);\r
1402 }\r
1403 \r
1404 // Accept プロシージャ\r
1405 void TtsAcceptProc(TTS *tts, SOCK *listen_socket)\r
1406 {\r
1407         wchar_t tmp[MAX_SIZE];\r
1408         // 引数チェック\r
1409         if (tts == NULL || listen_socket == NULL)\r
1410         {\r
1411                 return;\r
1412         }\r
1413 \r
1414         while (tts->Halt == false)\r
1415         {\r
1416                 SOCK *s;\r
1417                 // Accept する\r
1418                 s = Accept(listen_socket);\r
1419 \r
1420                 if (s == NULL)\r
1421                 {\r
1422                         if (tts->Halt == false)\r
1423                         {\r
1424                                 SleepThread(10);\r
1425                         }\r
1426                         continue;\r
1427                 }\r
1428                 else\r
1429                 {\r
1430                         // クライアントから接続された\r
1431                         AcceptInit(s);\r
1432                         tts->NewSocketArrived = true;\r
1433                         LockList(tts->TtsSockList);\r
1434                         {\r
1435                                 TTS_SOCK *ts = ZeroMalloc(sizeof(TTS_SOCK));\r
1436 \r
1437                                 ts->Id = (++tts->IdSeed);\r
1438                                 ts->Sock = s;\r
1439 \r
1440                                 UniFormat(tmp, sizeof(tmp), _UU("TTS_ACCEPTED"), ts->Id,\r
1441                                         s->RemoteHostname, s->RemotePort);\r
1442                                 TtPrint(tts->Param, tts->Print, tmp);\r
1443 \r
1444                                 Insert(tts->TtsSockList, ts);\r
1445                                 tts->NewSocketArrived = true;\r
1446                         }\r
1447                         UnlockList(tts->TtsSockList);\r
1448                 }\r
1449         }\r
1450 }\r
1451 \r
1452 // 通信スループット測定サーバー待機スレッド\r
1453 void TtsListenThread(THREAD *thread, void *param)\r
1454 {\r
1455         TTS *tts;\r
1456         wchar_t tmp[MAX_SIZE];\r
1457         // 引数チェック\r
1458         if (thread == NULL || param == NULL)\r
1459         {\r
1460                 return;\r
1461         }\r
1462 \r
1463         tts = (TTS *)param;\r
1464 \r
1465         tts->ListenSocket = NULL;\r
1466         tts->ListenSocket = Listen(tts->Port);\r
1467         tts->ListenSocketV6 = Listen6(tts->Port);\r
1468 \r
1469         if (tts->ListenSocket == NULL && tts->ListenSocketV6 == NULL)\r
1470         {\r
1471                 // Listen に失敗した\r
1472                 UniFormat(tmp, sizeof(tmp), _UU("TT_LISTEN_FAILED"), tts->Port);\r
1473                 TtPrint(tts->Param, tts->Print, tmp);\r
1474 \r
1475                 // 親スレッドに準備完了を伝える\r
1476                 NoticeThreadInit(thread);\r
1477 \r
1478                 tts->ErrorCode = ERR_INTERNAL_ERROR;\r
1479         }\r
1480         else\r
1481         {\r
1482                 UniFormat(tmp, sizeof(tmp), _UU("TTS_LISTEN_STARTED"), tts->Port);\r
1483                 TtPrint(tts->Param, tts->Print, tmp);\r
1484 \r
1485                 if (tts->ListenSocketV6 != NULL)\r
1486                 {\r
1487                         UniFormat(tmp, sizeof(tmp), _UU("TTS_LISTEN_STARTED_V6"), tts->Port);\r
1488                         TtPrint(tts->Param, tts->Print, tmp);\r
1489                 }\r
1490                 else\r
1491                 {\r
1492                         UniFormat(tmp, sizeof(tmp), _UU("TTS_LISTEN_FAILED_V6"), tts->Port);\r
1493                         TtPrint(tts->Param, tts->Print, tmp);\r
1494                 }\r
1495 \r
1496                 if (tts->ListenSocket != NULL)\r
1497                 {\r
1498                         AddRef(tts->ListenSocket->ref);\r
1499                 }\r
1500                 if (tts->ListenSocketV6 != NULL)\r
1501                 {\r
1502                         AddRef(tts->ListenSocketV6->ref);\r
1503                 }\r
1504 \r
1505                 // ワーカースレッドを開始する\r
1506                 tts->WorkThread = NewThread(TtsWorkerThread, tts);\r
1507                 WaitThreadInit(tts->WorkThread);\r
1508 \r
1509                 // 親スレッドに準備完了を伝える\r
1510                 NoticeThreadInit(thread);\r
1511 \r
1512                 // IPv6 用 Accept スレッドを準備\r
1513                 tts->IPv6AcceptThread = NULL;\r
1514                 if (tts->ListenSocketV6 != NULL)\r
1515                 {\r
1516                         tts->IPv6AcceptThread = NewThread(TtsIPv6AcceptThread, tts);\r
1517                 }\r
1518 \r
1519                 TtsAcceptProc(tts, tts->ListenSocket);\r
1520 \r
1521                 if (tts->IPv6AcceptThread != NULL)\r
1522                 {\r
1523                         WaitThread(tts->IPv6AcceptThread, INFINITE);\r
1524                         ReleaseThread(tts->IPv6AcceptThread);\r
1525                 }\r
1526 \r
1527                 TtPrint(tts->Param, tts->Print, _UU("TTS_LISTEN_STOP"));\r
1528 \r
1529                 ReleaseSock(tts->ListenSocket);\r
1530                 ReleaseSock(tts->ListenSocketV6);\r
1531                 SetSockEvent(tts->SockEvent);\r
1532 \r
1533                 // ワーカースレッドの停止を待機する\r
1534                 WaitThread(tts->WorkThread, INFINITE);\r
1535                 ReleaseThread(tts->WorkThread);\r
1536                 ReleaseSockEvent(tts->SockEvent);\r
1537         }\r
1538 }\r
1539 \r
1540 // データが流れる方向の文字列\r
1541 wchar_t *GetTtcTypeStr(UINT type)\r
1542 {\r
1543         switch (type)\r
1544         {\r
1545         case TRAFFIC_TYPE_DOWNLOAD:\r
1546                 return _UU("TTC_TYPE_DOWNLOAD");\r
1547 \r
1548         case TRAFFIC_TYPE_UPLOAD:\r
1549                 return _UU("TTC_TYPE_UPLOAD");\r
1550 \r
1551         default:\r
1552                 return _UU("TTC_TYPE_FULL");\r
1553         }\r
1554 }\r
1555 \r
1556 // サマリーの表示\r
1557 void TtcPrintSummary(TTC *ttc)\r
1558 {\r
1559         wchar_t tmp[MAX_SIZE];\r
1560         wchar_t tmp2[MAX_SIZE];\r
1561         wchar_t *tag = L"%-35s %s";\r
1562         // 引数チェック\r
1563         if (ttc == NULL)\r
1564         {\r
1565                 return;\r
1566         }\r
1567 \r
1568         TtPrint(ttc->Param, ttc->Print, L"");\r
1569         TtPrint(ttc->Param, ttc->Print, _UU("TTC_SUMMARY_BAR"));\r
1570         TtPrint(ttc->Param, ttc->Print, _UU("TTC_SUMMARY_TITLE"));\r
1571         TtPrint(ttc->Param, ttc->Print, L"");\r
1572 \r
1573         // 接続先のホスト名\r
1574         StrToUni(tmp2, sizeof(tmp2), ttc->Host);\r
1575         UniFormat(tmp, sizeof(tmp), tag, _UU("TTC_SUMMARY_HOST"), tmp2);\r
1576         TtPrint(ttc->Param, ttc->Print, tmp);\r
1577 \r
1578         // 接続先の TCP ポート番号\r
1579         UniToStru(tmp2, ttc->Port);\r
1580         UniFormat(tmp, sizeof(tmp), tag, _UU("TTC_SUMMARY_PORT"), tmp2);\r
1581         TtPrint(ttc->Param, ttc->Print, tmp);\r
1582 \r
1583         // 確立する TCP コネクション数\r
1584         UniToStru(tmp2, ttc->NumTcp);\r
1585         UniFormat(tmp, sizeof(tmp), tag, _UU("TTC_SUMMARY_NUMTCP"), tmp2);\r
1586         TtPrint(ttc->Param, ttc->Print, tmp);\r
1587 \r
1588         // データ伝送方向\r
1589         UniFormat(tmp, sizeof(tmp), tag, _UU("TTC_SUMMARY_TYPE"), GetTtcTypeStr(ttc->Type));\r
1590         TtPrint(ttc->Param, ttc->Print, tmp);\r
1591 \r
1592         // データ伝送時間\r
1593         UniFormat(tmp2, sizeof(tmp2), _UU("TTC_SPAN_STR"), (double)(ttc->Span) / 1000.0);\r
1594         UniFormat(tmp, sizeof(tmp), tag, _UU("TTC_SUMMARY_SPAN"), tmp2);\r
1595         TtPrint(ttc->Param, ttc->Print, tmp);\r
1596 \r
1597         // Ethernet フレーム用にデータ補正\r
1598         UniFormat(tmp, sizeof(tmp), tag, _UU("TTC_SUMMARY_ETHER"), ttc->Raw ? _UU("SEC_NO") : _UU("SEC_YES"));\r
1599         TtPrint(ttc->Param, ttc->Print, tmp);\r
1600 \r
1601         // 中継機器の入出力合計スループット計測\r
1602         UniFormat(tmp, sizeof(tmp), tag, _UU("TTC_SUMMARY_DOUBLE"), ttc->Double ? _UU("SEC_YES") : _UU("SEC_NO"));\r
1603         TtPrint(ttc->Param, ttc->Print, tmp);\r
1604 \r
1605         TtPrint(ttc->Param, ttc->Print, _UU("TTC_SUMMARY_BAR"));\r
1606         TtPrint(ttc->Param, ttc->Print, L"");\r
1607 }\r
1608 \r
1609 // 通信スループット測定クライアントの停止\r
1610 void StopTtc(TTC *ttc)\r
1611 {\r
1612         // 引数チェック\r
1613         if (ttc == NULL)\r
1614         {\r
1615                 return;\r
1616         }\r
1617 \r
1618         TtPrint(ttc->Param, ttc->Print, _UU("TTC_STOPPING"));\r
1619 \r
1620         ttc->Halt = true;\r
1621         SetSockEvent(ttc->SockEvent);\r
1622 }\r
1623 \r
1624 // 結果を生成\r
1625 void TtcGenerateResult(TTC *ttc)\r
1626 {\r
1627         TT_RESULT *res;\r
1628         UINT i;\r
1629         // 引数チェック\r
1630         if (ttc == NULL)\r
1631         {\r
1632                 return;\r
1633         }\r
1634 \r
1635         res = &ttc->Result;\r
1636 \r
1637         Zero(res, sizeof(TT_RESULT));\r
1638 \r
1639         res->Raw = ttc->Raw;\r
1640         res->Double = ttc->Double;\r
1641         res->Span = ttc->RealSpan;\r
1642 \r
1643         for (i = 0;i < LIST_NUM(ttc->ItcSockList);i++)\r
1644         {\r
1645                 TTC_SOCK *ts = LIST_DATA(ttc->ItcSockList, i);\r
1646 \r
1647                 if (ts->Download == false)\r
1648                 {\r
1649                         // アップロード\r
1650                         res->NumBytesUpload += ts->NumBytes;\r
1651                 }\r
1652                 else\r
1653                 {\r
1654                         // ダウンロード\r
1655                         res->NumBytesDownload += ts->NumBytes;\r
1656                 }\r
1657         }\r
1658 \r
1659         if (res->Raw == false)\r
1660         {\r
1661                 // Ethernet に合わせて補正する\r
1662                 // (1 個の Ethernet フレーム中の最大の TCP ペイロードサイズは 1460 である。)\r
1663                 res->NumBytesDownload = (UINT64)((double)res->NumBytesDownload * 1514.0 / 1460.0);\r
1664                 res->NumBytesUpload = (UINT64)((double)res->NumBytesUpload * 1514.0 / 1460.0);\r
1665         }\r
1666 \r
1667         res->NumBytesTotal = res->NumBytesDownload + res->NumBytesUpload;\r
1668 \r
1669         // スループットを計測する\r
1670         if (res->Span != 0)\r
1671         {\r
1672                 res->BpsUpload = (UINT64)((double)res->NumBytesUpload * 8.0 / ((double)res->Span / 1000.0));\r
1673                 res->BpsDownload = (UINT64)((double)res->NumBytesDownload * 8.0 / ((double)res->Span / 1000.0));\r
1674         }\r
1675 \r
1676         if (res->Double)\r
1677         {\r
1678                 res->BpsUpload *= 2ULL;\r
1679                 res->BpsDownload *= 2ULL;\r
1680         }\r
1681 \r
1682         res->BpsTotal = res->BpsUpload + res->BpsDownload;\r
1683 }\r
1684 \r
1685 // クライアントスレッド\r
1686 void TtcThread(THREAD *thread, void *param)\r
1687 {\r
1688         TTC *ttc;\r
1689         UINT i;\r
1690         wchar_t tmp[MAX_SIZE];\r
1691         bool ok = false;\r
1692         UINT buf_size;\r
1693         UCHAR *send_buf_data, *recv_buf_data;\r
1694         // 引数チェック\r
1695         if (thread == NULL || param == NULL)\r
1696         {\r
1697                 return;\r
1698         }\r
1699 \r
1700         // データ領域の確保\r
1701         TtGenerateRandomData(&send_buf_data, &buf_size);\r
1702         TtGenerateRandomData(&recv_buf_data, &buf_size);\r
1703 \r
1704         ttc = (TTC *)param;\r
1705 \r
1706         ttc->SockEvent = NewSockEvent();\r
1707         AddRef(ttc->SockEvent->ref);\r
1708 \r
1709         // 準備完了\r
1710         NoticeThreadInit(thread);\r
1711 \r
1712         TtcPrintSummary(ttc);\r
1713 \r
1714         UniFormat(tmp, sizeof(tmp), _UU("TTC_CONNECT_START"),\r
1715                 ttc->Host, ttc->Port, ttc->NumTcp);\r
1716         TtPrint(ttc->Param, ttc->Print, tmp);\r
1717 \r
1718         // クライアントへのすべてのコネクションを確立する\r
1719         ttc->ItcSockList = NewList(NULL);\r
1720 \r
1721         ok = true;\r
1722 \r
1723         for (i = 0;i < ttc->NumTcp;i++)\r
1724         {\r
1725                 SOCK *s;\r
1726                 TTC_SOCK *ts = ZeroMalloc(sizeof(TTC_SOCK));\r
1727 \r
1728                 ts->Id = i + 1;\r
1729 \r
1730                 if (ttc->Type == TRAFFIC_TYPE_DOWNLOAD)\r
1731                 {\r
1732                         ts->Download = true;\r
1733                 }\r
1734                 else if (ttc->Type == TRAFFIC_TYPE_UPLOAD)\r
1735                 {\r
1736                         ts->Download = false;\r
1737                 }\r
1738                 else\r
1739                 {\r
1740                         ts->Download = ((i % 2) == 0) ? true : false;\r
1741                 }\r
1742 \r
1743                 s = Connect(ttc->Host, ttc->Port);\r
1744 \r
1745                 if (s == NULL)\r
1746                 {\r
1747                         UniFormat(tmp, sizeof(tmp), _UU("TTC_CONNECT_FAILED"), i + 1);\r
1748                         TtPrint(ttc->Param, ttc->Print, tmp);\r
1749                         ok = false;\r
1750                         Free(ts);\r
1751                         break;\r
1752                 }\r
1753                 else\r
1754                 {\r
1755                         char buffer[TRAFFIC_VER_STR_SIZE];\r
1756 \r
1757                         SetTimeout(s, 5000);\r
1758 \r
1759                         Zero(buffer, sizeof(buffer));\r
1760                         if (Recv(s, buffer, sizeof(buffer), false) != sizeof(buffer) || Cmp(buffer, TRAFFIC_VER_STR, TRAFFIC_VER_STR_SIZE) != 0)\r
1761                         {\r
1762                                 TtPrint(ttc->Param, ttc->Print, _UU("TTC_CONNECT_NOT_SERVER"));\r
1763                                 ok = false;\r
1764                                 ReleaseSock(s);\r
1765                                 Free(ts);\r
1766                                 break;\r
1767                         }\r
1768 \r
1769                         UniFormat(tmp, sizeof(tmp), _UU("TTC_CONNECT_OK"), i + 1);\r
1770                         TtPrint(ttc->Param, ttc->Print, tmp);\r
1771 \r
1772                         UniFormat(tmp, sizeof(tmp), _UU("TTC_CONNECT_OK_2"), GetTtcTypeStr(ts->Download ? TRAFFIC_TYPE_DOWNLOAD : TRAFFIC_TYPE_UPLOAD));\r
1773                         TtPrint(ttc->Param, ttc->Print, tmp);\r
1774 \r
1775                         ts->Sock = s;\r
1776 \r
1777                         SetTimeout(s, TIMEOUT_INFINITE);\r
1778 \r
1779                         JoinSockToSockEvent(s, ttc->SockEvent);\r
1780                 }\r
1781 \r
1782                 Insert(ttc->ItcSockList, ts);\r
1783         }\r
1784 \r
1785         Set(ttc->InitedEvent);\r
1786 \r
1787         if (ttc->StartEvent != NULL)\r
1788         {\r
1789                 Wait(ttc->StartEvent, INFINITE);\r
1790                 SleepThread(500);\r
1791         }\r
1792 \r
1793         if (ok)\r
1794         {\r
1795                 bool all_sockets_blocked;\r
1796                 bool dont_block_next_time = false;\r
1797                 bool halt_flag = false;\r
1798                 UINT64 start_tick, end_tick;\r
1799                 UINT64 halt_timeout = 0;\r
1800                 wchar_t tmp1[MAX_SIZE], tmp2[MAX_SIZE];\r
1801                 UINT check_clock_seed = 0;\r
1802                 bool halting = false;\r
1803                 UINT64 tmp64;\r
1804 \r
1805                 // 現在時刻を記録\r
1806                 start_tick = Tick64();\r
1807                 end_tick = start_tick + ttc->Span;\r
1808 \r
1809                 // 開始メッセージを表示\r
1810                 GetDateTimeStrEx64(tmp1, sizeof(tmp1), SystemToLocal64(TickToTime(start_tick)), NULL);\r
1811                 GetDateTimeStrEx64(tmp2, sizeof(tmp2), SystemToLocal64(TickToTime(end_tick)), NULL);\r
1812                 UniFormat(tmp, sizeof(tmp), _UU("TTC_COMM_START"), tmp1, tmp2);\r
1813                 TtPrint(ttc->Param, ttc->Print, tmp);\r
1814 \r
1815                 // メインループ\r
1816                 while (true)\r
1817                 {\r
1818                         UINT i;\r
1819 \r
1820                         if (dont_block_next_time == false)\r
1821                         {\r
1822                                 WaitSockEvent(ttc->SockEvent, 50);\r
1823                         }\r
1824 \r
1825                         dont_block_next_time = false;\r
1826 \r
1827                         if (ttc->AbnormalTerminated)\r
1828                         {\r
1829                                 // 異常終了が発生した\r
1830                                 break;\r
1831                         }\r
1832 \r
1833                         if (ttc->Halt || end_tick <= Tick64())\r
1834                         {\r
1835                                 // 計測終了\r
1836                                 if (halting == false)\r
1837                                 {\r
1838                                         if (ttc->Halt)\r
1839                                         {\r
1840                                                 // ユーザーキャンセル\r
1841                                                 TtPrint(ttc->Param, ttc->Print, _UU("TTC_COMM_USER_CANCEL"));\r
1842                                         }\r
1843                                         else\r
1844                                         {\r
1845                                                 // 時間経過\r
1846                                                 UniFormat(tmp, sizeof(tmp), _UU("TTC_COMM_END"),\r
1847                                                         (double)ttc->Span / 1000.0);\r
1848                                                 TtPrint(ttc->Param, ttc->Print, tmp);\r
1849                                         }\r
1850 \r
1851                                         ttc->RealSpan = Tick64() - start_tick;\r
1852 \r
1853                                         halting = true;\r
1854 \r
1855                                         // サーバーからの報告データを待つ\r
1856                                         halt_timeout = Tick64() + 60000ULL;\r
1857                                 }\r
1858                         }\r
1859 \r
1860                         if (halt_timeout != 0)\r
1861                         {\r
1862                                 bool ok = true;\r
1863 \r
1864                                 // すべての TCP コネクションが処理を完了するまで待機する\r
1865                                 for (i = 0;i < LIST_NUM(ttc->ItcSockList);i++)\r
1866                                 {\r
1867                                         TTC_SOCK *ts = LIST_DATA(ttc->ItcSockList, i);\r
1868 \r
1869                                         if (ts->Download == false)\r
1870                                         {\r
1871                                                 if (ts->ServerUploadReportReceived == false)\r
1872                                                 {\r
1873                                                         ok = false;\r
1874                                                 }\r
1875                                         }\r
1876                                 }\r
1877 \r
1878                                 if (ok)\r
1879                                 {\r
1880                                         // 測定完了\r
1881                                         // 結果を表示する\r
1882                                         TtcGenerateResult(ttc);\r
1883                                         break;\r
1884                                 }\r
1885                                 else\r
1886                                 {\r
1887                                         if (halt_timeout <= Tick64())\r
1888                                         {\r
1889                                                 // 異常発生\r
1890                                                 ttc->AbnormalTerminated = true;\r
1891                                                 ttc->ErrorCode = ERR_PROTOCOL_ERROR;\r
1892                                                 break;\r
1893                                         }\r
1894                                 }\r
1895                         }\r
1896 \r
1897                         all_sockets_blocked = false;\r
1898 \r
1899                         // すべてのソケットがブロック状態にならない限り\r
1900                         // データの送受信を続ける\r
1901                         while (all_sockets_blocked == false)\r
1902                         {\r
1903                                 all_sockets_blocked = true;\r
1904 \r
1905                                 for (i = 0;i < LIST_NUM(ttc->ItcSockList);i++)\r
1906                                 {\r
1907                                         UINT ret = SOCK_LATER;\r
1908                                         TTC_SOCK *ts = LIST_DATA(ttc->ItcSockList, i);\r
1909                                         bool blocked_for_this_socket = false;\r
1910                                         UCHAR c = 0;\r
1911 \r
1912                                         if (halt_timeout != 0)\r
1913                                         {\r
1914                                                 if (ts->State != 3 && ts->State != 4)\r
1915                                                 {\r
1916                                                         if (ts->Download == false)\r
1917                                                         {\r
1918                                                                 if (ts->State != 0)\r
1919                                                                 {\r
1920                                                                         ts->State = 3;\r
1921                                                                 }\r
1922                                                                 else\r
1923                                                                 {\r
1924                                                                         ts->ServerUploadReportReceived = true;\r
1925                                                                         ts->State = 4;\r
1926                                                                 }\r
1927                                                         }\r
1928                                                         else\r
1929                                                         {\r
1930                                                                 ts->State = 4;\r
1931                                                         }\r
1932                                                 }\r
1933                                         }\r
1934 \r
1935                                         switch (ts->State)\r
1936                                         {\r
1937                                         case 0:\r
1938                                                 // 初期状態: クライアント/サーバー間のデータの流れの\r
1939                                                 // 方向を指定する\r
1940                                                 if (ts->Download)\r
1941                                                 {\r
1942                                                         c = 1;\r
1943                                                 }\r
1944                                                 else\r
1945                                                 {\r
1946                                                         c = 0;\r
1947                                                 }\r
1948 \r
1949                                                 ret = Send(ts->Sock, &c, 1, false);\r
1950 \r
1951                                                 if (ret != 0 && ret != SOCK_LATER)\r
1952                                                 {\r
1953                                                         if (ts->Download)\r
1954                                                         {\r
1955                                                                 ts->State = 1;\r
1956                                                         }\r
1957                                                         else\r
1958                                                         {\r
1959                                                                 ts->State = 2;\r
1960                                                         }\r
1961                                                 }\r
1962                                                 break;\r
1963 \r
1964                                         case 1:\r
1965                                                 // サーバー -> クライアント (ダウンロード)\r
1966                                                 ret = Recv(ts->Sock, recv_buf_data, buf_size, false);\r
1967                                                 break;\r
1968 \r
1969                                         case 2:\r
1970                                                 // クライアント -> サーバー (アップロード)\r
1971                                                 ret = Send(ts->Sock, send_buf_data, buf_size, false);\r
1972                                                 break;\r
1973 \r
1974                                         case 3:\r
1975                                                 // クライアント -> サーバー (アップロード) の送信完了\r
1976                                                 // データサイズの要求処理\r
1977                                                 if (ts->NextSendRequestReportTick == 0 ||\r
1978                                                         (Tick64() >= ts->NextSendRequestReportTick))\r
1979                                                 {\r
1980                                                         UCHAR suprise[MAX_SIZE];\r
1981                                                         UINT i;\r
1982 \r
1983                                                         ts->NextSendRequestReportTick = Tick64() + 200ULL;\r
1984 \r
1985                                                         for (i = 0;i < sizeof(suprise);i++)\r
1986                                                         {\r
1987                                                                 suprise[i] = '!';\r
1988                                                         }\r
1989 \r
1990                                                         ret = Send(ts->Sock, suprise, sizeof(suprise), false);\r
1991                                                 }\r
1992 \r
1993                                                 ret = Recv(ts->Sock, &tmp64, sizeof(tmp64), false);\r
1994                                                 if (ret != 0 && ret != SOCK_LATER && ret == sizeof(tmp64))\r
1995                                                 {\r
1996                                                         ts->NumBytes = Endian64(tmp64);\r
1997 \r
1998                                                         ts->ServerUploadReportReceived = true;\r
1999 \r
2000                                                         ts->State = 4;\r
2001                                                 }\r
2002                                                 break;\r
2003 \r
2004                                         case 4:\r
2005                                                 // 何もしない\r
2006                                                 if (Recv(ts->Sock, recv_buf_data, buf_size, false) == SOCK_LATER)\r
2007                                                 {\r
2008                                                         ret = SOCK_LATER;\r
2009                                                 }\r
2010                                                 break;\r
2011                                         }\r
2012 \r
2013                                         if (ret == 0)\r
2014                                         {\r
2015                                                 // ソケットが切断された\r
2016                                                 ttc->AbnormalTerminated = true;\r
2017                                                 ttc->ErrorCode = ERR_PROTOCOL_ERROR;\r
2018                                                 blocked_for_this_socket = true;\r
2019                                                 dont_block_next_time = false;\r
2020 \r
2021                                                 UniFormat(tmp, sizeof(tmp), _UU("TTC_COMM_DISCONNECTED"), ts->Id);\r
2022                                                 TtPrint(ttc->Param, ttc->Print, tmp);\r
2023                                         }\r
2024                                         else if (ret == SOCK_LATER)\r
2025                                         {\r
2026                                                 // 遅延が発生した\r
2027                                                 blocked_for_this_socket = true;\r
2028                                                 dont_block_next_time = false;\r
2029                                         }\r
2030                                         else\r
2031                                         {\r
2032                                                 if (ts->Download)\r
2033                                                 {\r
2034                                                         ts->NumBytes += (UINT64)ret;\r
2035                                                 }\r
2036                                         }\r
2037 \r
2038                                         if (blocked_for_this_socket == false)\r
2039                                         {\r
2040                                                 all_sockets_blocked = false;\r
2041                                         }\r
2042                                 }\r
2043 \r
2044                                 if (ttc->Halt)\r
2045                                 {\r
2046                                         all_sockets_blocked = true;\r
2047                                         dont_block_next_time = true;\r
2048                                 }\r
2049 \r
2050                                 if (end_tick <= Tick64())\r
2051                                 {\r
2052                                         all_sockets_blocked = true;\r
2053                                         dont_block_next_time = true;\r
2054                                 }\r
2055                         }\r
2056                 }\r
2057         }\r
2058         else\r
2059         {\r
2060                 // 中止\r
2061                 TtPrint(ttc->Param, ttc->Print, _UU("TTC_ERROR_ABORTED"));\r
2062                 ttc->ErrorCode = ERR_CONNECT_FAILED;\r
2063         }\r
2064 \r
2065         // クリーンアップ\r
2066         for (i = 0;i < LIST_NUM(ttc->ItcSockList);i++)\r
2067         {\r
2068                 TTC_SOCK *ts = LIST_DATA(ttc->ItcSockList, i);\r
2069 \r
2070                 Disconnect(ts->Sock);\r
2071                 ReleaseSock(ts->Sock);\r
2072                 Free(ts);\r
2073         }\r
2074 \r
2075         ReleaseSockEvent(ttc->SockEvent);\r
2076         ReleaseList(ttc->ItcSockList);\r
2077         Free(send_buf_data);\r
2078         Free(recv_buf_data);\r
2079 }\r
2080 \r
2081 // 通信スループット測定クライアントの開始\r
2082 TTC *NewTtc(char *host, UINT port, UINT numtcp, UINT type, UINT64 span, bool dbl, bool raw, TT_PRINT_PROC *print_proc, void *param)\r
2083 {\r
2084         return NewTtcEx(host, port, numtcp, type, span, dbl, raw, print_proc, param, NULL);\r
2085 }\r
2086 TTC *NewTtcEx(char *host, UINT port, UINT numtcp, UINT type, UINT64 span, bool dbl, bool raw, TT_PRINT_PROC *print_proc, void *param, EVENT *start_event)\r
2087 {\r
2088         TTC *ttc;\r
2089 \r
2090         ttc = ZeroMalloc(sizeof(TTC));\r
2091         ttc->InitedEvent = NewEvent();\r
2092         ttc->Port = port;\r
2093         StrCpy(ttc->Host, sizeof(ttc->Host), host);\r
2094         ttc->NumTcp = numtcp;\r
2095         ttc->Type = type;\r
2096         ttc->Span = span;\r
2097         ttc->Double = dbl;\r
2098         ttc->Raw = raw;\r
2099         ttc->StartEvent = start_event;\r
2100 \r
2101         if (ttc->Type == TRAFFIC_TYPE_FULL && ttc->NumTcp < 2)\r
2102         {\r
2103                 ttc->NumTcp = 2;\r
2104         }\r
2105 \r
2106         ttc->Print = print_proc;\r
2107         ttc->Param = param;\r
2108         ttc->ErrorCode = ERR_NO_ERROR;\r
2109 \r
2110         TtPrint(ttc->Param, ttc->Print, _UU("TTC_INIT"));\r
2111 \r
2112         ttc->Thread = NewThread(TtcThread, ttc);\r
2113         WaitThreadInit(ttc->Thread);\r
2114 \r
2115         return ttc;\r
2116 }\r
2117 \r
2118 // 通信スループット測定クライアントの終了を待機\r
2119 UINT FreeTtc(TTC *ttc, TT_RESULT *result)\r
2120 {\r
2121         UINT ret;\r
2122         // 引数チェック\r
2123         if (ttc == NULL)\r
2124         {\r
2125                 return ERR_INVALID_PARAMETER;\r
2126         }\r
2127 \r
2128         WaitThread(ttc->Thread, INFINITE);\r
2129         ReleaseThread(ttc->Thread);\r
2130 \r
2131         TtPrint(ttc->Param, ttc->Print, _UU("TTC_FREE"));\r
2132 \r
2133         ret = ttc->ErrorCode;\r
2134 \r
2135         if (ret == ERR_NO_ERROR)\r
2136         {\r
2137                 if (result != NULL)\r
2138                 {\r
2139                         Copy(result, &ttc->Result, sizeof(TT_RESULT));\r
2140                 }\r
2141         }\r
2142 \r
2143         ReleaseSockEvent(ttc->SockEvent);\r
2144         ReleaseEvent(ttc->InitedEvent);\r
2145 \r
2146         Free(ttc);\r
2147 \r
2148         return ret;\r
2149 }\r
2150 \r
2151 // 通信スループット測定サーバーの開始\r
2152 TTS *NewTts(UINT port, void *param, TT_PRINT_PROC *print_proc)\r
2153 {\r
2154         TTS *tts;\r
2155         THREAD *t;\r
2156 \r
2157         tts = ZeroMalloc(sizeof(TTS));\r
2158         tts->Port = port;\r
2159         tts->Param = param;\r
2160         tts->Print = print_proc;\r
2161 \r
2162         TtPrint(param, print_proc, _UU("TTS_INIT"));\r
2163 \r
2164         // スレッドの作成\r
2165         t = NewThread(TtsListenThread, tts);\r
2166         WaitThreadInit(t);\r
2167 \r
2168         tts->Thread = t;\r
2169 \r
2170         return tts;\r
2171 }\r
2172 \r
2173 // 通信スループット測定サーバーの終了を待機\r
2174 UINT FreeTts(TTS *tts)\r
2175 {\r
2176         UINT ret;\r
2177         // 引数チェック\r
2178         if (tts == NULL)\r
2179         {\r
2180                 return ERR_INVALID_PARAMETER;\r
2181         }\r
2182 \r
2183         TtPrint(tts->Param, tts->Print, _UU("TTS_STOP_INIT"));\r
2184 \r
2185         tts->Halt = true;\r
2186         Disconnect(tts->ListenSocket);\r
2187         ReleaseSock(tts->ListenSocket);\r
2188         Disconnect(tts->ListenSocketV6);\r
2189         ReleaseSock(tts->ListenSocketV6);\r
2190 \r
2191         // スレッドの終了を待機\r
2192         WaitThread(tts->Thread, INFINITE);\r
2193 \r
2194         ReleaseThread(tts->Thread);\r
2195 \r
2196         TtPrint(tts->Param, tts->Print, _UU("TTS_STOP_FINISHED"));\r
2197 \r
2198         ret = tts->ErrorCode;\r
2199 \r
2200         Free(tts);\r
2201 \r
2202         return ret;\r
2203 }\r
2204 \r
2205 // 測定ツールプロンプトの表示\r
2206 void PtTrafficPrintProc(void *param, wchar_t *str)\r
2207 {\r
2208         CONSOLE *c;\r
2209         // 引数チェック\r
2210         if (param == NULL || str == NULL)\r
2211         {\r
2212                 return;\r
2213         }\r
2214 \r
2215         c = (CONSOLE *)param;\r
2216 \r
2217         if (c->ConsoleType == CONSOLE_LOCAL)\r
2218         {\r
2219                 wchar_t tmp[MAX_SIZE];\r
2220 \r
2221                 // ローカルコンソールの場合のみ表示する (それ以外の場合はマルチスレッドの同期\r
2222                 //  がとれないので表示できない?)\r
2223                 UniStrCpy(tmp, sizeof(tmp), str);\r
2224                 if (UniEndWith(str, L"\n") == false)\r
2225                 {\r
2226                         UniStrCat(tmp, sizeof(tmp), L"\n");\r
2227                 }\r
2228                 UniPrint(L"%s", tmp);\r
2229         }\r
2230 }\r
2231 \r
2232 // 通信スループット結果の表示\r
2233 void TtcPrintResult(CONSOLE *c, TT_RESULT *res)\r
2234 {\r
2235         CT *ct;\r
2236         wchar_t tmp[MAX_SIZE];\r
2237         wchar_t tmp1[MAX_SIZE];\r
2238         wchar_t tmp2[MAX_SIZE];\r
2239         char str[MAX_SIZE];\r
2240         // 引数チェック\r
2241         if (c == NULL || res == NULL)\r
2242         {\r
2243                 return;\r
2244         }\r
2245 \r
2246         c->Write(c, _UU("TTC_RES_TITLE"));\r
2247 \r
2248         ct = CtNew();\r
2249         CtInsertColumn(ct, _UU("TTC_RES_COLUMN_1"), false);\r
2250         CtInsertColumn(ct, _UU("TTC_RES_COLUMN_2"), true);\r
2251         CtInsertColumn(ct, _UU("TTC_RES_COLUMN_3"), true);\r
2252 \r
2253         // 測定に使用した時間\r
2254         GetSpanStrMilli(str, sizeof(str), res->Span);\r
2255         StrToUni(tmp, sizeof(tmp), str);\r
2256         CtInsert(ct, _UU("TTC_RES_SPAN"), tmp, L"");\r
2257 \r
2258         // Ethernet フレーム用にデータ補正\r
2259         CtInsert(ct, _UU("TTC_RES_ETHER"), res->Raw ? _UU("SEC_NO") : _UU("SEC_YES"), L"");\r
2260 \r
2261         // ダウンロード方向の通信データ量\r
2262         ToStr3(str, sizeof(str), res->NumBytesDownload);\r
2263         UniFormat(tmp1, sizeof(tmp1), L"%S Bytes", str);\r
2264         ToStrByte1000(str, sizeof(str), res->NumBytesDownload);\r
2265         StrToUni(tmp2, sizeof(tmp2), str);\r
2266         CtInsert(ct, _UU("TTC_RES_BYTES_DOWNLOAD"), tmp1, tmp2);\r
2267 \r
2268         // アップロード方向の通信データ量\r
2269         ToStr3(str, sizeof(str), res->NumBytesUpload);\r
2270         UniFormat(tmp1, sizeof(tmp1), L"%S Bytes", str);\r
2271         ToStrByte1000(str, sizeof(str), res->NumBytesUpload);\r
2272         StrToUni(tmp2, sizeof(tmp2), str);\r
2273         CtInsert(ct, _UU("TTC_RES_BYTES_UPLOAD"), tmp1, tmp2);\r
2274 \r
2275         // 合計通信データ量\r
2276         ToStr3(str, sizeof(str), res->NumBytesTotal);\r
2277         UniFormat(tmp1, sizeof(tmp1), L"%S Bytes", str);\r
2278         ToStrByte1000(str, sizeof(str), res->NumBytesTotal);\r
2279         StrToUni(tmp2, sizeof(tmp2), str);\r
2280         CtInsert(ct, _UU("TTC_RES_BYTES_TOTAL"), tmp1, tmp2);\r
2281 \r
2282         // 中継機器入出力合計スループット算出\r
2283         CtInsert(ct, _UU("TTC_RES_DOUBLE"), (res->Double == false) ? _UU("SEC_NO") : _UU("SEC_YES"), L"");\r
2284 \r
2285         // ダウンロード方向の平均スループット\r
2286         ToStr3(str, sizeof(str), res->BpsDownload);\r
2287         UniFormat(tmp1, sizeof(tmp1), L"%S bps", str);\r
2288         ToStrByte1000(str, sizeof(str), res->BpsDownload);\r
2289         ReplaceStr(str, sizeof(str), str, "Bytes", "bps");\r
2290         StrToUni(tmp2, sizeof(tmp2), str);\r
2291         CtInsert(ct, _UU("TTC_RES_BPS_DOWNLOAD"), tmp1, tmp2);\r
2292 \r
2293         // アップロード方向の平均スループット\r
2294         ToStr3(str, sizeof(str), res->BpsUpload);\r
2295         UniFormat(tmp1, sizeof(tmp1), L"%S bps", str);\r
2296         ToStrByte1000(str, sizeof(str), res->BpsUpload);\r
2297         ReplaceStr(str, sizeof(str), str, "Bytes", "bps");\r
2298         StrToUni(tmp2, sizeof(tmp2), str);\r
2299         CtInsert(ct, _UU("TTC_RES_BPS_UPLOAD"), tmp1, tmp2);\r
2300 \r
2301         // 合計平均スループット\r
2302         ToStr3(str, sizeof(str), res->BpsTotal);\r
2303         UniFormat(tmp1, sizeof(tmp1), L"%S bps", str);\r
2304         ToStrByte1000(str, sizeof(str), res->BpsTotal);\r
2305         ReplaceStr(str, sizeof(str), str, "Bytes", "bps");\r
2306         StrToUni(tmp2, sizeof(tmp2), str);\r
2307         CtInsert(ct, _UU("TTC_RES_BPS_TOTAL"), tmp1, tmp2);\r
2308 \r
2309         CtFree(ct, c);\r
2310 }\r
2311 \r
2312 // 通信スループット測定ツールサーバーの実行\r
2313 UINT PtTrafficServer(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)\r
2314 {\r
2315         LIST *o;\r
2316         UINT ret = ERR_NO_ERROR;\r
2317         UINT port;\r
2318         TTS *tts;\r
2319         PARAM args[] =\r
2320         {\r
2321                 {"[port]", NULL, NULL, NULL, NULL},\r
2322         };\r
2323 \r
2324         // パラメータリストの取得\r
2325         o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));\r
2326         if (o == NULL)\r
2327         {\r
2328                 return ERR_INVALID_PARAMETER;\r
2329         }\r
2330 \r
2331         port = GetParamInt(o, "[port]");\r
2332         if (port == 0)\r
2333         {\r
2334                 port = TRAFFIC_DEFAULT_PORT;\r
2335         }\r
2336 \r
2337         tts = NewTts(port, c, PtTrafficPrintProc);\r
2338 \r
2339         c->Write(c, _UU("TTS_ENTER_TO_EXIT"));\r
2340 \r
2341         Free(c->ReadLine(c, L"", true));\r
2342 \r
2343         ret = tts->ErrorCode;\r
2344 \r
2345         FreeTts(tts);\r
2346 \r
2347         if (ret != ERR_NO_ERROR)\r
2348         {\r
2349                 CmdPrintError(c, ret);\r
2350         }\r
2351 \r
2352         // パラメータリストの解放\r
2353         FreeParamValueList(o);\r
2354 \r
2355         return ret;\r
2356 }\r
2357 \r
2358 // 通信スループット測定ツールクライアントの実行\r
2359 UINT PtTrafficClient(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)\r
2360 {\r
2361         TTC *ttc;\r
2362         LIST *o;\r
2363         UINT ret = ERR_NO_ERROR;\r
2364         char *host = NULL;\r
2365         UINT port;\r
2366         UINT num, type;\r
2367         bool dbl = false, raw = false;\r
2368         UINT64 span;\r
2369         // 指定できるパラメータ リスト\r
2370         CMD_EVAL_MIN_MAX minmax =\r
2371         {\r
2372                 "CMD_TrafficClient_EVAL_NUMTCP",\r
2373                 0, TRAFFIC_NUMTCP_MAX,\r
2374         };\r
2375         PARAM args[] =\r
2376         {\r
2377                 {"[host:port]", CmdPrompt, _UU("CMD_TrafficClient_PROMPT_HOST"), CmdEvalNotEmpty, NULL},\r
2378                 {"NUMTCP", NULL, NULL, CmdEvalMinMax, &minmax},\r
2379                 {"TYPE", NULL, NULL, NULL, NULL},\r
2380                 {"SPAN", NULL, NULL, NULL, NULL},\r
2381                 {"DOUBLE", NULL, NULL, NULL, NULL},\r
2382                 {"RAW", NULL, NULL, NULL, NULL},\r
2383         };\r
2384 \r
2385         // パラメータリストの取得\r
2386         o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));\r
2387         if (o == NULL)\r
2388         {\r
2389                 return ERR_INVALID_PARAMETER;\r
2390         }\r
2391 \r
2392         if (ParseHostPort(GetParamStr(o, "[host:port]"), &host, &port, TRAFFIC_DEFAULT_PORT) == false)\r
2393         {\r
2394                 c->Write(c, _UU("CMD_TrafficClient_ERROR_HOSTPORT"));\r
2395                 ret = ERR_INVALID_PARAMETER;\r
2396         }\r
2397         else\r
2398         {\r
2399                 char *s;\r
2400                 UINT i;\r
2401 \r
2402                 Trim(host);\r
2403 \r
2404                 num = GetParamInt(o, "NUMTCP");\r
2405                 if (num == 0)\r
2406                 {\r
2407                         num = TRAFFIC_NUMTCP_DEFAULT;\r
2408                 }\r
2409                 s = GetParamStr(o, "TYPE");\r
2410 \r
2411                 if (StartWith("download", s))\r
2412                 {\r
2413                         type = TRAFFIC_TYPE_DOWNLOAD;\r
2414                 }\r
2415                 else if (StartWith("upload", s))\r
2416                 {\r
2417                         type = TRAFFIC_TYPE_UPLOAD;\r
2418                 }\r
2419                 else\r
2420                 {\r
2421                         type = TRAFFIC_TYPE_FULL;\r
2422                 }\r
2423 \r
2424                 i = GetParamInt(o, "SPAN");\r
2425 \r
2426                 if (i == 0)\r
2427                 {\r
2428                         i = TRAFFIC_SPAN_DEFAULT;\r
2429                 }\r
2430 \r
2431                 span = (UINT64)i * 1000ULL;\r
2432 \r
2433                 dbl = GetParamYes(o, "DOUBLE");\r
2434                 raw = GetParamYes(o, "RAW");\r
2435 \r
2436                 if (type == TRAFFIC_TYPE_FULL)\r
2437                 {\r
2438                         if ((num % 2) != 0)\r
2439                         {\r
2440                                 ret = ERR_INVALID_PARAMETER;\r
2441                                 c->Write(c, _UU("CMD_TrafficClient_ERROR_NUMTCP"));\r
2442                         }\r
2443                 }\r
2444 \r
2445                 if (ret == ERR_NO_ERROR)\r
2446                 {\r
2447                         TT_RESULT result;\r
2448                         ttc = NewTtc(host, port, num, type, span, dbl, raw, PtTrafficPrintProc, c);\r
2449 \r
2450                         if (c->ConsoleType == CONSOLE_LOCAL)\r
2451                         {\r
2452                                 if (c->Param != NULL && (((LOCAL_CONSOLE_PARAM *)c->Param)->InBuf == NULL))\r
2453                                 {\r
2454 //                                      c->Write(c, _UU("TTC_ENTER_TO_EXIT"));\r
2455 //                                      GetLine(NULL, 0);\r
2456 //                                      StopTtc(ttc);\r
2457                                 }\r
2458                         }\r
2459 \r
2460 \r
2461                         Zero(&result, sizeof(result));\r
2462                         ret = FreeTtc(ttc, &result);\r
2463 \r
2464                         if (ret == ERR_NO_ERROR)\r
2465                         {\r
2466                                 TtcPrintResult(c, &result);\r
2467                         }\r
2468                 }\r
2469         }\r
2470 \r
2471         if (ret != ERR_NO_ERROR)\r
2472         {\r
2473                 CmdPrintError(c, ret);\r
2474         }\r
2475 \r
2476         // パラメータリストの解放\r
2477         FreeParamValueList(o);\r
2478 \r
2479         Free(host);\r
2480 \r
2481         return ret;\r
2482 }\r
2483 \r
2484 // 証明書簡易作成ツール\r
2485 UINT PtMakeCert(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)\r
2486 {\r
2487         LIST *o;\r
2488         UINT ret = ERR_NO_ERROR;\r
2489         X *x = NULL;\r
2490         K *pub = NULL;\r
2491         K *pri = NULL;\r
2492         NAME *n;\r
2493         X_SERIAL *x_serial = NULL;\r
2494         BUF *buf;\r
2495         UINT days;\r
2496         X *root_x = NULL;\r
2497         K *root_k = NULL;\r
2498         // 指定できるパラメータ リスト\r
2499         CMD_EVAL_MIN_MAX minmax =\r
2500         {\r
2501                 "CMD_MakeCert_EVAL_EXPIRES",\r
2502                 0,\r
2503                 10950,\r
2504         };\r
2505         PARAM args[] =\r
2506         {\r
2507                 {"CN", CmdPrompt, _UU("CMD_MakeCert_PROMPT_CN"), NULL, NULL},\r
2508                 {"O", CmdPrompt, _UU("CMD_MakeCert_PROMPT_O"), NULL, NULL},\r
2509                 {"OU", CmdPrompt, _UU("CMD_MakeCert_PROMPT_OU"), NULL, NULL},\r
2510                 {"C", CmdPrompt, _UU("CMD_MakeCert_PROMPT_C"), NULL, NULL},\r
2511                 {"ST", CmdPrompt, _UU("CMD_MakeCert_PROMPT_ST"), NULL, NULL},\r
2512                 {"L", CmdPrompt, _UU("CMD_MakeCert_PROMPT_L"), NULL, NULL},\r
2513                 {"SERIAL", CmdPrompt, _UU("CMD_MakeCert_PROMPT_SERIAL"), NULL, NULL},\r
2514                 {"EXPIRES", CmdPrompt, _UU("CMD_MakeCert_PROMPT_EXPIRES"), CmdEvalMinMax, &minmax},\r
2515                 {"SIGNCERT", NULL, NULL, CmdEvalIsFile, NULL},\r
2516                 {"SIGNKEY", NULL, NULL, CmdEvalIsFile, NULL},\r
2517                 {"SAVECERT", CmdPrompt, _UU("CMD_MakeCert_PROMPT_SAVECERT"), CmdEvalNotEmpty, NULL},\r
2518                 {"SAVEKEY", CmdPrompt, _UU("CMD_MakeCert_PROMPT_SAVEKEY"), CmdEvalNotEmpty, NULL},\r
2519         };\r
2520 \r
2521         // パラメータリストの取得\r
2522         o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));\r
2523         if (o == NULL)\r
2524         {\r
2525                 return ERR_INVALID_PARAMETER;\r
2526         }\r
2527 \r
2528         if (IsEmptyStr(GetParamStr(o, "SIGNCERT")) == false && IsEmptyStr(GetParamStr(o, "SIGNKEY")) == false)\r
2529         {\r
2530                 root_x = FileToX(GetParamStr(o, "SIGNCERT"));\r
2531                 root_k = FileToK(GetParamStr(o, "SIGNKEY"), true, NULL);\r
2532 \r
2533                 if (root_x == NULL || root_k == NULL || CheckXandK(root_x, root_k) == false)\r
2534                 {\r
2535                         ret = ERR_INTERNAL_ERROR;\r
2536 \r
2537                         c->Write(c, _UU("CMD_MakeCert_ERROR_SIGNKEY"));\r
2538                 }\r
2539         }\r
2540 \r
2541         if (ret == ERR_NO_ERROR)\r
2542         {\r
2543                 buf = StrToBin(GetParamStr(o, "SERIAL"));\r
2544                 if (buf != NULL && buf->Size >= 1)\r
2545                 {\r
2546                         x_serial = NewXSerial(buf->Buf, buf->Size);\r
2547                 }\r
2548                 FreeBuf(buf);\r
2549 \r
2550                 n = NewName(GetParamUniStr(o, "CN"), GetParamUniStr(o, "O"), GetParamUniStr(o, "OU"), \r
2551                         GetParamUniStr(o, "C"), GetParamUniStr(o, "ST"), GetParamUniStr(o, "L"));\r
2552 \r
2553                 days = GetParamInt(o, "EXPIRES");\r
2554                 if (days == 0)\r
2555                 {\r
2556                         days = 3650;\r
2557                 }\r
2558 \r
2559                 RsaGen(&pri, &pub, 1024);\r
2560 \r
2561                 if (root_x == NULL)\r
2562                 {\r
2563                         x = NewRootX(pub, pri, n, days, x_serial);\r
2564                 }\r
2565                 else\r
2566                 {\r
2567                         x = NewX(pub, root_k, root_x, n, days, x_serial);\r
2568                 }\r
2569 \r
2570                 FreeXSerial(x_serial);\r
2571                 FreeName(n);\r
2572 \r
2573                 if (x == NULL)\r
2574                 {\r
2575                         ret = ERR_INTERNAL_ERROR;\r
2576                         c->Write(c, _UU("CMD_MakeCert_ERROR_GEN_FAILED"));\r
2577                 }\r
2578                 else\r
2579                 {\r
2580                         if (XToFile(x, GetParamStr(o, "SAVECERT"), true) == false)\r
2581                         {\r
2582                                 c->Write(c, _UU("CMD_SAVECERT_FAILED"));\r
2583                         }\r
2584                         else if (KToFile(pri, GetParamStr(o, "SAVEKEY"), true, NULL) == false)\r
2585                         {\r
2586                                 c->Write(c, _UU("CMD_SAVEKEY_FAILED"));\r
2587                         }\r
2588                 }\r
2589         }\r
2590 \r
2591         if (ret != ERR_NO_ERROR)\r
2592         {\r
2593                 // エラーが発生した\r
2594                 CmdPrintError(c, ret);\r
2595         }\r
2596 \r
2597         // パラメータリストの解放\r
2598         FreeParamValueList(o);\r
2599 \r
2600         FreeX(root_x);\r
2601         FreeK(root_k);\r
2602 \r
2603         FreeX(x);\r
2604         FreeK(pri);\r
2605         FreeK(pub);\r
2606 \r
2607         return ret;\r
2608 }\r
2609 \r
2610 \r
2611 // クライアント管理ツールメイン\r
2612 void PcMain(PC *pc)\r
2613 {\r
2614         char prompt[MAX_SIZE];\r
2615         wchar_t tmp[MAX_SIZE];\r
2616         // 引数チェック\r
2617         if (pc == NULL)\r
2618         {\r
2619                 return;\r
2620         }\r
2621 \r
2622         // 接続が完了したメッセージを表示する\r
2623         UniFormat(tmp, sizeof(tmp), _UU("CMD_UTVPNCMD_CLIENT_CONNECTED"),\r
2624                 pc->ServerName);\r
2625         pc->Console->Write(pc->Console, tmp);\r
2626         pc->Console->Write(pc->Console, L"");\r
2627 \r
2628         while (true)\r
2629         {\r
2630                 // コマンドの定義\r
2631                 CMD cmd[] =\r
2632                 {\r
2633                         {"About", PsAbout},\r
2634                         {"Check", PtCheck},\r
2635                         {"VersionGet", PcVersionGet},\r
2636                         {"PasswordSet", PcPasswordSet},\r
2637                         {"PasswordGet", PcPasswordGet},\r
2638                         {"CertList", PcCertList},\r
2639                         {"CertAdd", PcCertAdd},\r
2640                         {"CertDelete", PcCertDelete},\r
2641                         {"CertGet", PcCertGet},\r
2642                         {"SecureList", PcSecureList},\r
2643                         {"SecureSelect", PcSecureSelect},\r
2644                         {"SecureGet", PcSecureGet},\r
2645                         {"NicCreate", PcNicCreate},\r
2646                         {"NicDelete", PcNicDelete},\r
2647                         {"NicUpgrade", PcNicUpgrade},\r
2648                         {"NicGetSetting", PcNicGetSetting},\r
2649                         {"NicSetSetting", PcNicSetSetting},\r
2650                         {"NicEnable", PcNicEnable},\r
2651                         {"NicDisable", PcNicDisable},\r
2652                         {"NicList", PcNicList},\r
2653                         {"AccountList", PcAccountList},\r
2654                         {"AccountCreate", PcAccountCreate},\r
2655                         {"AccountSet", PcAccountSet},\r
2656                         {"AccountGet", PcAccountGet},\r
2657                         {"AccountDelete", PcAccountDelete},\r
2658                         {"AccountUsernameSet", PcAccountUsernameSet},\r
2659                         {"AccountAnonymousSet", PcAccountAnonymousSet},\r
2660                         {"AccountPasswordSet", PcAccountPasswordSet},\r
2661                         {"AccountCertSet", PcAccountCertSet},\r
2662                         {"AccountCertGet", PcAccountCertGet},\r
2663                         {"AccountEncryptDisable", PcAccountEncryptDisable},\r
2664                         {"AccountEncryptEnable", PcAccountEncryptEnable},\r
2665                         {"AccountCompressEnable", PcAccountCompressEnable},\r
2666                         {"AccountCompressDisable", PcAccountCompressDisable},\r
2667                         {"AccountProxyNone", PcAccountProxyNone},\r
2668                         {"AccountProxyHttp", PcAccountProxyHttp},\r
2669                         {"AccountProxySocks", PcAccountProxySocks},\r
2670                         {"AccountServerCertEnable", PcAccountServerCertEnable},\r
2671                         {"AccountServerCertDisable", PcAccountServerCertDisable},\r
2672                         {"AccountServerCertSet", PcAccountServerCertSet},\r
2673                         {"AccountServerCertDelete", PcAccountServerCertDelete},\r
2674                         {"AccountServerCertGet", PcAccountServerCertGet},\r
2675                         {"AccountDetailSet", PcAccountDetailSet},\r
2676                         {"AccountRename", PcAccountRename},\r
2677                         {"AccountConnect", PcAccountConnect},\r
2678                         {"AccountDisconnect", PcAccountDisconnect},\r
2679                         {"AccountStatusGet", PcAccountStatusGet},\r
2680                         {"AccountNicSet", PcAccountNicSet},\r
2681                         {"AccountStatusShow", PcAccountStatusShow},\r
2682                         {"AccountStatusHide", PcAccountStatusHide},\r
2683                         {"AccountSecureCertSet", PcAccountSecureCertSet},\r
2684                         {"AccountRetrySet", PcAccountRetrySet},\r
2685                         {"AccountStartupSet", PcAccountStartupSet},\r
2686                         {"AccountStartupRemove", PcAccountStartupRemove},\r
2687                         {"AccountExport", PcAccountExport},\r
2688                         {"AccountImport", PcAccountImport},\r
2689                         {"RemoteEnable", PcRemoteEnable},\r
2690                         {"RemoteDisable", PcRemoteDisable},\r
2691                         {"KeepEnable", PcKeepEnable},\r
2692                         {"KeepDisable", PcKeepDisable},\r
2693                         {"KeepSet", PcKeepSet},\r
2694                         {"KeepGet", PcKeepGet},\r
2695                         {"MakeCert", PtMakeCert},\r
2696                         {"TrafficClient", PtTrafficClient},\r
2697                         {"TrafficServer", PtTrafficServer},\r
2698                 };\r
2699 \r
2700                 // プロンプトの生成\r
2701                 StrCpy(prompt, sizeof(prompt), "VPN Client>");\r
2702 \r
2703                 if (DispatchNextCmdEx(pc->Console, pc->CmdLine, prompt, cmd, sizeof(cmd) / sizeof(cmd[0]), pc) == false)\r
2704                 {\r
2705                         break;\r
2706                 }\r
2707                 pc->LastError = pc->Console->RetCode;\r
2708 \r
2709                 if (pc->LastError == ERR_NO_ERROR && pc->Console->ConsoleType != CONSOLE_CSV)\r
2710                 {\r
2711                         pc->Console->Write(pc->Console, _UU("CMD_MSG_OK"));\r
2712                         pc->Console->Write(pc->Console, L"");\r
2713                 }\r
2714 \r
2715                 if (pc->CmdLine != NULL)\r
2716                 {\r
2717                         break;\r
2718                 }\r
2719         }\r
2720 }\r
2721 \r
2722 // VPN Client サービスのバージョン情報の取得\r
2723 UINT PcVersionGet(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)\r
2724 {\r
2725         LIST *o;\r
2726         PC *pc = (PC *)param;\r
2727         UINT ret = ERR_NO_ERROR;\r
2728         RPC_CLIENT_VERSION t;\r
2729 \r
2730         // パラメータリストの取得\r
2731         o = ParseCommandList(c, cmd_name, str, NULL, 0);\r
2732         if (o == NULL)\r
2733         {\r
2734                 return ERR_INVALID_PARAMETER;\r
2735         }\r
2736 \r
2737         // RPC 呼び出し\r
2738         Zero(&t, sizeof(t));\r
2739 \r
2740         ret = CcGetClientVersion(pc->RemoteClient, &t);\r
2741 \r
2742         if (ret == ERR_NO_ERROR)\r
2743         {\r
2744                 wchar_t tmp[MAX_SIZE];\r
2745                 CT *ct;\r
2746 \r
2747                 // 成功\r
2748                 ct = CtNewStandard();\r
2749 \r
2750                 StrToUni(tmp, sizeof(tmp), t.ClientProductName);\r
2751                 CtInsert(ct, _UU("CMD_VersionGet_1"), tmp);\r
2752 \r
2753                 StrToUni(tmp, sizeof(tmp), t.ClientVersionString);\r
2754                 CtInsert(ct, _UU("CMD_VersionGet_2"), tmp);\r
2755 \r
2756                 StrToUni(tmp, sizeof(tmp), t.ClientBuildInfoString);\r
2757                 CtInsert(ct, _UU("CMD_VersionGet_3"), tmp);\r
2758 \r
2759                 UniToStru(tmp, t.ProcessId);\r
2760                 CtInsert(ct, _UU("CMD_VersionGet_4"), tmp);\r
2761 \r
2762                 StrToUni(tmp, sizeof(tmp), OsTypeToStr(t.OsType));\r
2763                 CtInsert(ct, _UU("CMD_VersionGet_5"), tmp);\r
2764 \r
2765                 CtFree(ct, c);\r
2766         }\r
2767 \r
2768         if (ret != ERR_NO_ERROR)\r
2769         {\r
2770                 // エラーが発生した\r
2771                 CmdPrintError(c, ret);\r
2772         }\r
2773 \r
2774         // パラメータリストの解放\r
2775         FreeParamValueList(o);\r
2776 \r
2777         return ret;\r
2778 }\r
2779 \r
2780 // VPN Client サービスに接続するためのパスワードの設定\r
2781 UINT PcPasswordSet(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)\r
2782 {\r
2783         LIST *o;\r
2784         PC *pc = (PC *)param;\r
2785         UINT ret = ERR_NO_ERROR;\r
2786         RPC_CLIENT_PASSWORD t;\r
2787         // 指定できるパラメータ リスト\r
2788         PARAM args[] =\r
2789         {\r
2790                 {"[password]", CmdPromptChoosePassword, NULL, NULL, NULL},\r
2791                 {"REMOTEONLY", NULL, NULL, NULL, NULL},\r
2792         };\r
2793 \r
2794         // パラメータリストの取得\r
2795         o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));\r
2796         if (o == NULL)\r
2797         {\r
2798                 return ERR_INVALID_PARAMETER;\r
2799         }\r
2800 \r
2801         // RPC 呼び出し\r
2802         Zero(&t, sizeof(t));\r
2803         StrCpy(t.Password, sizeof(t.Password), GetParamStr(o, "[password]"));\r
2804         t.PasswordRemoteOnly = GetParamYes(o, "REMOTEONLY");\r
2805 \r
2806         ret = CcSetPassword(pc->RemoteClient, &t);\r
2807 \r
2808         if (ret == ERR_NO_ERROR)\r
2809         {\r
2810                 // 成功\r
2811         }\r
2812 \r
2813         if (ret != ERR_NO_ERROR)\r
2814         {\r
2815                 // エラーが発生した\r
2816                 CmdPrintError(c, ret);\r
2817         }\r
2818 \r
2819         // パラメータリストの解放\r
2820         FreeParamValueList(o);\r
2821 \r
2822         return ret;\r
2823 }\r
2824 \r
2825 // VPN Client サービスに接続するためのパスワードの設定の取得\r
2826 UINT PcPasswordGet(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)\r
2827 {\r
2828         LIST *o;\r
2829         PC *pc = (PC *)param;\r
2830         UINT ret = ERR_NO_ERROR;\r
2831         RPC_CLIENT_PASSWORD_SETTING t;\r
2832 \r
2833         // パラメータリストの取得\r
2834         o = ParseCommandList(c, cmd_name, str, NULL, 0);\r
2835         if (o == NULL)\r
2836         {\r
2837                 return ERR_INVALID_PARAMETER;\r
2838         }\r
2839 \r
2840         // RPC 呼び出し\r
2841         Zero(&t, sizeof(t));\r
2842 \r
2843         ret = CcGetPasswordSetting(pc->RemoteClient, &t);\r
2844 \r
2845         if (ret == ERR_NO_ERROR)\r
2846         {\r
2847                 // 成功\r
2848                 CT *ct = CtNewStandard();\r
2849 \r
2850                 CtInsert(ct, _UU("CMD_PasswordGet_1"),\r
2851                         t.IsPasswordPresented ? _UU("CMD_MSG_ENABLE") : _UU("CMD_MSG_DISABLE"));\r
2852 \r
2853                 CtInsert(ct, _UU("CMD_PasswordGet_2"),\r
2854                         t.PasswordRemoteOnly ? _UU("CMD_MSG_ENABLE") : _UU("CMD_MSG_DISABLE"));\r
2855 \r
2856                 CtFree(ct, c);\r
2857         }\r
2858 \r
2859         if (ret != ERR_NO_ERROR)\r
2860         {\r
2861                 // エラーが発生した\r
2862                 CmdPrintError(c, ret);\r
2863         }\r
2864 \r
2865         // パラメータリストの解放\r
2866         FreeParamValueList(o);\r
2867 \r
2868         return ret;\r
2869 }\r
2870 \r
2871 // 信頼する証明機関の証明書一覧の取得\r
2872 UINT PcCertList(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)\r
2873 {\r
2874         LIST *o;\r
2875         PC *pc = (PC *)param;\r
2876         UINT ret = ERR_NO_ERROR;\r
2877         RPC_CLIENT_ENUM_CA t;\r
2878 \r
2879         // パラメータリストの取得\r
2880         o = ParseCommandList(c, cmd_name, str, NULL, 0);\r
2881         if (o == NULL)\r
2882         {\r
2883                 return ERR_INVALID_PARAMETER;\r
2884         }\r
2885 \r
2886         // RPC 呼び出し\r
2887         Zero(&t, sizeof(t));\r
2888 \r
2889         ret = CcEnumCa(pc->RemoteClient, &t);\r
2890 \r
2891         if (ret == ERR_NO_ERROR)\r
2892         {\r
2893                 // 成功\r
2894                 UINT i;\r
2895                 CT *ct = CtNewStandard();\r
2896 \r
2897                 for (i = 0;i < t.NumItem;i++)\r
2898                 {\r
2899                         wchar_t tmp[MAX_SIZE];\r
2900                         wchar_t tmp2[64];\r
2901                         RPC_CLIENT_ENUM_CA_ITEM *e = t.Items[i];\r
2902 \r
2903                         GetDateStrEx64(tmp, sizeof(tmp), SystemToLocal64(e->Expires), NULL);\r
2904 \r
2905                         UniToStru(tmp2, e->Key);\r
2906 \r
2907                         CtInsert(ct, _UU("CMD_CAList_COLUMN_ID"), tmp2);\r
2908                         CtInsert(ct, _UU("CM_CERT_COLUMN_1"), e->SubjectName);\r
2909                         CtInsert(ct, _UU("CM_CERT_COLUMN_2"), e->IssuerName);\r
2910                         CtInsert(ct, _UU("CM_CERT_COLUMN_3"), tmp);\r
2911 \r
2912                         if (i != (t.NumItem - 1))\r
2913                         {\r
2914                                 CtInsert(ct, L"---", L"---");\r
2915                         }\r
2916                 }\r
2917 \r
2918                 CtFree(ct, c);\r
2919 \r
2920                 CiFreeClientEnumCa(&t);\r
2921         }\r
2922 \r
2923         if (ret != ERR_NO_ERROR)\r
2924         {\r
2925                 // エラーが発生した\r
2926                 CmdPrintError(c, ret);\r
2927         }\r
2928 \r
2929 \r
2930         // パラメータリストの解放\r
2931         FreeParamValueList(o);\r
2932 \r
2933         return ret;\r
2934 }\r
2935 \r
2936 // 信頼する証明機関の証明書の追加\r
2937 UINT PcCertAdd(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)\r
2938 {\r
2939         LIST *o;\r
2940         PC *pc = (PC *)param;\r
2941         UINT ret = ERR_NO_ERROR;\r
2942         RPC_CERT t;\r
2943         X *x;\r
2944         // 指定できるパラメータ リスト\r
2945         PARAM args[] =\r
2946         {\r
2947                 {"[path]", CmdPrompt, _UU("CMD_CAAdd_PROMPT_PATH"), CmdEvalIsFile, NULL},\r
2948         };\r
2949 \r
2950         // パラメータリストの取得\r
2951         o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));\r
2952         if (o == NULL)\r
2953         {\r
2954                 return ERR_INVALID_PARAMETER;\r
2955         }\r
2956 \r
2957 \r
2958         x = FileToX(GetParamStr(o, "[path]"));\r
2959 \r
2960         if (x == NULL)\r
2961         {\r
2962                 FreeParamValueList(o);\r
2963                 c->Write(c, _UU("CMD_MSG_LOAD_CERT_FAILED"));\r
2964                 return ERR_INVALID_PARAMETER;\r
2965         }\r
2966 \r
2967         // RPC 呼び出し\r
2968         Zero(&t, sizeof(t));\r
2969         t.x = x;\r
2970 \r
2971         ret = CcAddCa(pc->RemoteClient, &t);\r
2972 \r
2973         if (ret == ERR_NO_ERROR)\r
2974         {\r
2975                 // 成功\r
2976         }\r
2977 \r
2978         if (ret != ERR_NO_ERROR)\r
2979         {\r
2980                 // エラーが発生した\r
2981                 CmdPrintError(c, ret);\r
2982         }\r
2983 \r
2984         FreeX(x);\r
2985 \r
2986         // パラメータリストの解放\r
2987         FreeParamValueList(o);\r
2988 \r
2989         return ret;\r
2990 }\r
2991 \r
2992 // 信頼する証明機関の証明書の削除\r
2993 UINT PcCertDelete(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)\r
2994 {\r
2995         LIST *o;\r
2996         PC *pc = (PC *)param;\r
2997         UINT ret = ERR_NO_ERROR;\r
2998         RPC_CLIENT_DELETE_CA t;\r
2999         // 指定できるパラメータ リスト\r
3000         PARAM args[] =\r
3001         {\r
3002                 {"[id]", CmdPrompt, _UU("CMD_CADelete_PROMPT_ID"), CmdEvalNotEmpty, NULL},\r
3003         };\r
3004 \r
3005         // パラメータリストの取得\r
3006         o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));\r
3007         if (o == NULL)\r
3008         {\r
3009                 return ERR_INVALID_PARAMETER;\r
3010         }\r
3011 \r
3012         // RPC 呼び出し\r
3013         Zero(&t, sizeof(t));\r
3014         t.Key = GetParamInt(o, "[id]");\r
3015 \r
3016         ret = CcDeleteCa(pc->RemoteClient, &t);\r
3017 \r
3018         if (ret == ERR_NO_ERROR)\r
3019         {\r
3020                 // 成功\r
3021         }\r
3022 \r
3023         if (ret != ERR_NO_ERROR)\r
3024         {\r
3025                 // エラーが発生した\r
3026                 CmdPrintError(c, ret);\r
3027         }\r
3028 \r
3029         // パラメータリストの解放\r
3030         FreeParamValueList(o);\r
3031 \r
3032         return ret;\r
3033 }\r
3034 \r
3035 // 信頼する証明機関の証明書の取得\r
3036 UINT PcCertGet(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)\r
3037 {\r
3038         LIST *o;\r
3039         PC *pc = (PC *)param;\r
3040         UINT ret = ERR_NO_ERROR;\r
3041         RPC_GET_CA t;\r
3042         // 指定できるパラメータ リスト\r
3043         PARAM args[] =\r
3044         {\r
3045                 {"[id]", CmdPrompt, _UU("CMD_CAGet_PROMPT_ID"), CmdEvalNotEmpty, NULL},\r
3046                 {"SAVECERT", CmdPrompt, _UU("CMD_CAGet_PROMPT_SAVECERT"), CmdEvalNotEmpty, NULL},\r
3047         };\r
3048 \r
3049         // パラメータリストの取得\r
3050         o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));\r
3051         if (o == NULL)\r
3052         {\r
3053                 return ERR_INVALID_PARAMETER;\r
3054         }\r
3055 \r
3056         // RPC 呼び出し\r
3057         Zero(&t, sizeof(t));\r
3058         t.Key = GetParamInt(o, "[id]");\r
3059 \r
3060         ret = CcGetCa(pc->RemoteClient, &t);\r
3061 \r
3062         if (ret == ERR_NO_ERROR)\r
3063         {\r
3064                 // 成功\r
3065                 if (XToFile(t.x, GetParamStr(o, "SAVECERT"), true))\r
3066                 {\r
3067                         // 成功\r
3068                 }\r
3069                 else\r
3070                 {\r
3071                         // 失敗\r
3072                         ret = ERR_INTERNAL_ERROR;\r
3073                         c->Write(c, _UU("CMD_MSG_SAVE_CERT_FAILED"));\r
3074                 }\r
3075 \r
3076                 CiFreeGetCa(&t);\r
3077         }\r
3078 \r
3079         if (ret != ERR_NO_ERROR)\r
3080         {\r
3081                 // エラーが発生した\r
3082                 CmdPrintError(c, ret);\r
3083         }\r
3084 \r
3085         // パラメータリストの解放\r
3086         FreeParamValueList(o);\r
3087 \r
3088         return ret;\r
3089 }\r
3090 \r
3091 // 使用できるスマートカードの種類の一覧の取得\r
3092 UINT PcSecureList(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)\r
3093 {\r
3094         LIST *o;\r
3095         PC *pc = (PC *)param;\r
3096         UINT ret = ERR_NO_ERROR;\r
3097         RPC_CLIENT_ENUM_SECURE t;\r
3098 \r
3099         // パラメータリストの取得\r
3100         o = ParseCommandList(c, cmd_name, str, NULL, 0);\r
3101         if (o == NULL)\r
3102         {\r
3103                 return ERR_INVALID_PARAMETER;\r
3104         }\r
3105 \r
3106         // RPC 呼び出し\r
3107         Zero(&t, sizeof(t));\r
3108 \r
3109         ret = CcEnumSecure(pc->RemoteClient, &t);\r
3110 \r
3111         if (ret == ERR_NO_ERROR)\r
3112         {\r
3113                 CT *ct;\r
3114                 UINT i;\r
3115                 wchar_t tmp1[MAX_SIZE];\r
3116                 wchar_t tmp2[MAX_SIZE];\r
3117                 wchar_t tmp4[MAX_SIZE];\r
3118                 wchar_t *tmp3;\r
3119 \r
3120                 // 成功\r
3121                 ct = CtNew();\r
3122                 CtInsertColumn(ct, _UU("SEC_COLUMN1"), false);\r
3123                 CtInsertColumn(ct, _UU("SEC_COLUMN2"), false);\r
3124                 CtInsertColumn(ct, _UU("SEC_COLUMN3"), false);\r
3125                 CtInsertColumn(ct, _UU("SEC_COLUMN4"), false);\r
3126 \r
3127                 for (i = 0;i < t.NumItem;i++)\r
3128                 {\r
3129                         RPC_CLIENT_ENUM_SECURE_ITEM *e = t.Items[i];\r
3130 \r
3131                         // ID\r
3132                         UniToStru(tmp1, e->DeviceId);\r
3133 \r
3134                         // デバイス名\r
3135                         StrToUni(tmp2, sizeof(tmp2), e->DeviceName);\r
3136 \r
3137                         // 種類\r
3138                         tmp3 = (e->Type == SECURE_IC_CARD) ? _UU("SEC_SMART_CARD") : _UU("SEC_USB_TOKEN");\r
3139 \r
3140                         // 製造元\r
3141                         StrToUni(tmp4, sizeof(tmp4), e->Manufacturer);\r
3142 \r
3143                         CtInsert(ct, tmp1, tmp2, tmp3, tmp4);\r
3144                 }\r
3145 \r
3146                 CtFreeEx(ct, c, true);\r
3147 \r
3148                 CiFreeClientEnumSecure(&t);\r
3149         }\r
3150 \r
3151         if (ret != ERR_NO_ERROR)\r
3152         {\r
3153                 // エラーが発生した\r
3154                 CmdPrintError(c, ret);\r
3155         }\r
3156 \r
3157         // パラメータリストの解放\r
3158         FreeParamValueList(o);\r
3159 \r
3160         return ret;\r
3161 }\r
3162 \r
3163 // 使用するスマートカードの種類の選択\r
3164 UINT PcSecureSelect(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)\r
3165 {\r
3166         LIST *o;\r
3167         PC *pc = (PC *)param;\r
3168         UINT ret = ERR_NO_ERROR;\r
3169         RPC_USE_SECURE t;\r
3170         // 指定できるパラメータ リスト\r
3171         PARAM args[] =\r
3172         {\r
3173                 {"[id]", CmdPrompt, _UU("CMD_SecureSelect_PROMPT_ID"), NULL, NULL},\r
3174         };\r
3175 \r
3176         // パラメータリストの取得\r
3177         o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));\r
3178         if (o == NULL)\r
3179         {\r
3180                 return ERR_INVALID_PARAMETER;\r
3181         }\r
3182 \r
3183         // RPC 呼び出し\r
3184         Zero(&t, sizeof(t));\r
3185         t.DeviceId = GetParamInt(o, "[id]");\r
3186 \r
3187         ret = CcUseSecure(pc->RemoteClient, &t);\r
3188 \r
3189         if (ret == ERR_NO_ERROR)\r
3190         {\r
3191                 // 成功\r
3192         }\r
3193 \r
3194         if (ret != ERR_NO_ERROR)\r
3195         {\r
3196                 // エラーが発生した\r
3197                 CmdPrintError(c, ret);\r
3198         }\r
3199 \r
3200         // パラメータリストの解放\r
3201         FreeParamValueList(o);\r
3202 \r
3203         return ret;\r
3204 }\r
3205 \r
3206 // 使用するスマートカードの種類の ID の取得\r
3207 UINT PcSecureGet(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)\r
3208 {\r
3209         LIST *o;\r
3210         PC *pc = (PC *)param;\r
3211         UINT ret = ERR_NO_ERROR;\r
3212         RPC_USE_SECURE t;\r
3213 \r
3214         // パラメータリストの取得\r
3215         o = ParseCommandList(c, cmd_name, str, NULL, 0);\r
3216         if (o == NULL)\r
3217         {\r
3218                 return ERR_INVALID_PARAMETER;\r
3219         }\r
3220 \r
3221         // RPC 呼び出し\r
3222         Zero(&t, sizeof(t));\r
3223 \r
3224         ret = CcGetUseSecure(pc->RemoteClient, &t);\r
3225 \r
3226         if (ret == ERR_NO_ERROR)\r
3227         {\r
3228                 // 成功\r
3229                 wchar_t tmp[MAX_SIZE];\r
3230 \r
3231                 if (t.DeviceId != 0)\r
3232                 {\r
3233                         UniFormat(tmp, sizeof(tmp), _UU("CMD_SecureGet_Print"), t.DeviceId);\r
3234                 }\r
3235                 else\r
3236                 {\r
3237                         UniStrCpy(tmp, sizeof(tmp), _UU("CMD_SecureGet_NoPrint"));\r
3238                 }\r
3239                 c->Write(c, tmp);\r
3240         }\r
3241 \r
3242         if (ret != ERR_NO_ERROR)\r
3243         {\r
3244                 // エラーが発生した\r
3245                 CmdPrintError(c, ret);\r
3246         }\r
3247 \r
3248         // パラメータリストの解放\r
3249         FreeParamValueList(o);\r
3250 \r
3251         return ret;\r
3252 }\r
3253 \r
3254 // 新規仮想 LAN カードの作成\r
3255 UINT PcNicCreate(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)\r
3256 {\r
3257         LIST *o;\r
3258         PC *pc = (PC *)param;\r
3259         UINT ret = ERR_NO_ERROR;\r
3260         RPC_CLIENT_CREATE_VLAN t;\r
3261         // 指定できるパラメータ リスト\r
3262         PARAM args[] =\r
3263         {\r
3264                 {"[name]", CmdPrompt, _UU("CMD_NicCreate_PROMPT_NAME"), CmdEvalNotEmpty, NULL},\r
3265         };\r
3266 \r
3267         // パラメータリストの取得\r
3268         o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));\r
3269         if (o == NULL)\r
3270         {\r
3271                 return ERR_INVALID_PARAMETER;\r
3272         }\r
3273 \r
3274         // RPC 呼び出し\r
3275         Zero(&t, sizeof(t));\r
3276         StrCpy(t.DeviceName, sizeof(t.DeviceName), GetParamStr(o, "[name]"));\r
3277 \r
3278         ret = CcCreateVLan(pc->RemoteClient, &t);\r
3279 \r
3280         if (ret == ERR_NO_ERROR)\r
3281         {\r
3282                 // 成功\r
3283         }\r
3284 \r
3285         if (ret != ERR_NO_ERROR)\r
3286         {\r
3287                 // エラーが発生した\r
3288                 CmdPrintError(c, ret);\r
3289         }\r
3290 \r
3291         // パラメータリストの解放\r
3292         FreeParamValueList(o);\r
3293 \r
3294         return ret;\r
3295 }\r
3296 \r
3297 // 仮想 LAN カードの削除\r
3298 UINT PcNicDelete(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)\r
3299 {\r
3300         LIST *o;\r
3301         PC *pc = (PC *)param;\r
3302         UINT ret = ERR_NO_ERROR;\r
3303         RPC_CLIENT_CREATE_VLAN t;\r
3304         // 指定できるパラメータ リスト\r
3305         PARAM args[] =\r
3306         {\r
3307                 {"[name]", CmdPrompt, _UU("CMD_NicCreate_PROMPT_NAME"), CmdEvalNotEmpty, NULL},\r
3308         };\r
3309 \r
3310         // パラメータリストの取得\r
3311         o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));\r
3312         if (o == NULL)\r
3313         {\r
3314                 return ERR_INVALID_PARAMETER;\r
3315         }\r
3316 \r
3317         // RPC 呼び出し\r
3318         Zero(&t, sizeof(t));\r
3319         StrCpy(t.DeviceName, sizeof(t.DeviceName), GetParamStr(o, "[name]"));\r
3320 \r
3321         ret = CcDeleteVLan(pc->RemoteClient, &t);\r
3322 \r
3323         if (ret == ERR_NO_ERROR)\r
3324         {\r
3325                 // 成功\r
3326         }\r
3327 \r
3328         if (ret != ERR_NO_ERROR)\r
3329         {\r
3330                 // エラーが発生した\r
3331                 CmdPrintError(c, ret);\r
3332         }\r
3333 \r
3334         // パラメータリストの解放\r
3335         FreeParamValueList(o);\r
3336 \r
3337         return ret;\r
3338 }\r
3339 \r
3340 // 仮想 LAN カードのデバイスドライバのアップグレード\r
3341 UINT PcNicUpgrade(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)\r
3342 {\r
3343         LIST *o;\r
3344         PC *pc = (PC *)param;\r
3345         UINT ret = ERR_NO_ERROR;\r
3346         RPC_CLIENT_CREATE_VLAN t;\r
3347         // 指定できるパラメータ リスト\r
3348         PARAM args[] =\r
3349         {\r
3350                 {"[name]", CmdPrompt, _UU("CMD_NicCreate_PROMPT_NAME"), CmdEvalNotEmpty, NULL},\r
3351         };\r
3352 \r
3353         // パラメータリストの取得\r
3354         o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));\r
3355         if (o == NULL)\r
3356         {\r
3357                 return ERR_INVALID_PARAMETER;\r
3358         }\r
3359 \r
3360         // RPC 呼び出し\r
3361         Zero(&t, sizeof(t));\r
3362         StrCpy(t.DeviceName, sizeof(t.DeviceName), GetParamStr(o, "[name]"));\r
3363 \r
3364         ret = CcUpgradeVLan(pc->RemoteClient, &t);\r
3365 \r
3366         if (ret == ERR_NO_ERROR)\r
3367         {\r
3368                 // 成功\r
3369         }\r
3370 \r
3371         if (ret != ERR_NO_ERROR)\r
3372         {\r
3373                 // エラーが発生した\r
3374                 CmdPrintError(c, ret);\r
3375         }\r
3376 \r
3377         // パラメータリストの解放\r
3378         FreeParamValueList(o);\r
3379 \r
3380         return ret;\r
3381 }\r
3382 \r
3383 // 仮想 LAN カードの設定の取得\r
3384 UINT PcNicGetSetting(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)\r
3385 {\r
3386         LIST *o;\r
3387         PC *pc = (PC *)param;\r
3388         UINT ret = ERR_NO_ERROR;\r
3389         RPC_CLIENT_GET_VLAN t;\r
3390         // 指定できるパラメータ リスト\r
3391         PARAM args[] =\r
3392         {\r
3393                 {"[name]", CmdPrompt, _UU("CMD_NicCreate_PROMPT_NAME"), CmdEvalNotEmpty, NULL},\r
3394         };\r
3395 \r
3396         // パラメータリストの取得\r
3397         o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));\r
3398         if (o == NULL)\r
3399         {\r
3400                 return ERR_INVALID_PARAMETER;\r
3401         }\r
3402 \r
3403         // RPC 呼び出し\r
3404         Zero(&t, sizeof(t));\r
3405         StrCpy(t.DeviceName, sizeof(t.DeviceName), GetParamStr(o, "[name]"));\r
3406 \r
3407         ret = CcGetVLan(pc->RemoteClient, &t);\r
3408 \r
3409         if (ret == ERR_NO_ERROR)\r
3410         {\r
3411                 // 成功\r
3412                 CT *ct = CtNewStandard();\r
3413                 wchar_t tmp[MAX_SIZE];\r
3414 \r
3415                 StrToUni(tmp, sizeof(tmp), t.DeviceName);\r
3416                 CtInsert(ct, _UU("CMD_NicGetSetting_1"), tmp);\r
3417 \r
3418                 CtInsert(ct, _UU("CMD_NicGetSetting_2"), t.Enabled ? _UU("CMD_MSG_ENABLE") : _UU("CMD_MSG_DISABLE"));\r
3419 \r
3420                 StrToUni(tmp, sizeof(tmp), t.MacAddress);\r
3421                 CtInsert(ct, _UU("CMD_NicGetSetting_3"), tmp);\r
3422 \r
3423                 StrToUni(tmp, sizeof(tmp), t.Version);\r
3424                 CtInsert(ct, _UU("CMD_NicGetSetting_4"), tmp);\r
3425 \r
3426                 StrToUni(tmp, sizeof(tmp), t.FileName);\r
3427                 CtInsert(ct, _UU("CMD_NicGetSetting_5"), tmp);\r
3428 \r
3429                 StrToUni(tmp, sizeof(tmp), t.Guid);\r
3430                 CtInsert(ct, _UU("CMD_NicGetSetting_6"), tmp);\r
3431 \r
3432                 CtFree(ct, c);\r
3433         }\r
3434 \r
3435         if (ret != ERR_NO_ERROR)\r
3436         {\r
3437                 // エラーが発生した\r
3438                 CmdPrintError(c, ret);\r
3439         }\r
3440 \r
3441         // パラメータリストの解放\r
3442         FreeParamValueList(o);\r
3443 \r
3444         return ret;\r
3445 }\r
3446 \r
3447 // 仮想 LAN カードの設定の変更\r
3448 UINT PcNicSetSetting(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)\r
3449 {\r
3450         LIST *o;\r
3451         PC *pc = (PC *)param;\r
3452         UINT ret = ERR_NO_ERROR;\r
3453         RPC_CLIENT_SET_VLAN t;\r
3454         UCHAR mac_address[6];\r
3455         BUF *b;\r
3456         // 指定できるパラメータ リスト\r
3457         PARAM args[] =\r
3458         {\r
3459                 {"[name]", CmdPrompt, _UU("CMD_NicCreate_PROMPT_NAME"), CmdEvalNotEmpty, NULL},\r
3460                 {"MAC", CmdPrompt, _UU("CMD_NicSetSetting_PROMPT_MAC"), CmdEvalNotEmpty, NULL},\r
3461         };\r
3462 \r
3463         // パラメータリストの取得\r
3464         o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));\r
3465         if (o == NULL)\r
3466         {\r
3467                 return ERR_INVALID_PARAMETER;\r
3468         }\r
3469 \r
3470         // MAC アドレスの検査\r
3471         Zero(mac_address, sizeof(mac_address));\r
3472         b = StrToBin(GetParamStr(o, "MAC"));\r
3473         if (b != NULL && b->Size == 6)\r
3474         {\r
3475                 Copy(mac_address, b->Buf, 6);\r
3476         }\r
3477         FreeBuf(b);\r
3478 \r
3479         if (IsZero(mac_address, 6))\r
3480         {\r
3481                 // MAC アドレスが不正\r
3482                 FreeParamValueList(o);\r
3483 \r
3484                 CmdPrintError(c, ERR_INVALID_PARAMETER);\r
3485                 return ERR_INVALID_PARAMETER;\r
3486         }\r
3487 \r
3488         // RPC 呼び出し\r
3489         Zero(&t, sizeof(t));\r
3490         StrCpy(t.DeviceName, sizeof(t.DeviceName), GetParamStr(o, "[name]"));\r
3491         NormalizeMacAddress(t.MacAddress, sizeof(t.MacAddress), GetParamStr(o, "MAC"));\r
3492 \r
3493         ret = CcSetVLan(pc->RemoteClient, &t);\r
3494 \r
3495         if (ret == ERR_NO_ERROR)\r
3496         {\r
3497                 // 成功\r
3498         }\r
3499 \r
3500         if (ret != ERR_NO_ERROR)\r
3501         {\r
3502                 // エラーが発生した\r
3503                 CmdPrintError(c, ret);\r
3504         }\r
3505 \r
3506         // パラメータリストの解放\r
3507         FreeParamValueList(o);\r
3508 \r
3509         return ret;\r
3510 }\r
3511 \r
3512 // 仮想 LAN カードの有効化\r
3513 UINT PcNicEnable(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)\r
3514 {\r
3515         LIST *o;\r
3516         PC *pc = (PC *)param;\r
3517         UINT ret = ERR_NO_ERROR;\r
3518         RPC_CLIENT_CREATE_VLAN t;\r
3519         // 指定できるパラメータ リスト\r
3520         PARAM args[] =\r
3521         {\r
3522                 {"[name]", CmdPrompt, _UU("CMD_NicCreate_PROMPT_NAME"), CmdEvalNotEmpty, NULL},\r
3523         };\r
3524 \r
3525         // パラメータリストの取得\r
3526         o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));\r
3527         if (o == NULL)\r
3528         {\r
3529                 return ERR_INVALID_PARAMETER;\r
3530         }\r
3531 \r
3532         // RPC 呼び出し\r
3533         Zero(&t, sizeof(t));\r
3534         StrCpy(t.DeviceName, sizeof(t.DeviceName), GetParamStr(o, "[name]"));\r
3535 \r
3536         ret = CcEnableVLan(pc->RemoteClient, &t);\r
3537 \r
3538         if (ret == ERR_NO_ERROR)\r
3539         {\r
3540                 // 成功\r
3541         }\r
3542 \r
3543         if (ret != ERR_NO_ERROR)\r
3544         {\r
3545                 // エラーが発生した\r
3546                 CmdPrintError(c, ret);\r
3547         }\r
3548 \r
3549         // パラメータリストの解放\r
3550         FreeParamValueList(o);\r
3551 \r
3552         return ret;\r
3553 }\r
3554 \r
3555 // 仮想 LAN カードの無効化\r
3556 UINT PcNicDisable(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)\r
3557 {\r
3558         LIST *o;\r
3559         PC *pc = (PC *)param;\r
3560         UINT ret = ERR_NO_ERROR;\r
3561         RPC_CLIENT_CREATE_VLAN t;\r
3562         // 指定できるパラメータ リスト\r
3563         PARAM args[] =\r
3564         {\r
3565                 {"[name]", CmdPrompt, _UU("CMD_NicCreate_PROMPT_NAME"), CmdEvalNotEmpty, NULL},\r
3566         };\r
3567 \r
3568         // パラメータリストの取得\r
3569         o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));\r
3570         if (o == NULL)\r
3571         {\r
3572                 return ERR_INVALID_PARAMETER;\r
3573         }\r
3574 \r
3575         // RPC 呼び出し\r
3576         Zero(&t, sizeof(t));\r
3577         StrCpy(t.DeviceName, sizeof(t.DeviceName), GetParamStr(o, "[name]"));\r
3578 \r
3579         ret = CcDisableVLan(pc->RemoteClient, &t);\r
3580 \r
3581         if (ret == ERR_NO_ERROR)\r
3582         {\r
3583                 // 成功\r
3584         }\r
3585 \r
3586         if (ret != ERR_NO_ERROR)\r
3587         {\r
3588                 // エラーが発生した\r
3589                 CmdPrintError(c, ret);\r
3590         }\r
3591 \r
3592         // パラメータリストの解放\r
3593         FreeParamValueList(o);\r
3594 \r
3595         return ret;\r
3596 }\r
3597 \r
3598 // 仮想 LAN カード一覧の取得\r
3599 UINT PcNicList(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)\r
3600 {\r
3601         LIST *o;\r
3602         PC *pc = (PC *)param;\r
3603         UINT ret = ERR_NO_ERROR;\r
3604         RPC_CLIENT_ENUM_VLAN t;\r
3605 \r
3606         // パラメータリストの取得\r
3607         o = ParseCommandList(c, cmd_name, str, NULL, 0);\r
3608         if (o == NULL)\r
3609         {\r
3610                 return ERR_INVALID_PARAMETER;\r
3611         }\r
3612 \r
3613         // RPC 呼び出し\r
3614         Zero(&t, sizeof(t));\r
3615 \r
3616         ret = CcEnumVLan(pc->RemoteClient, &t);\r
3617 \r
3618         if (ret == ERR_NO_ERROR)\r
3619         {\r
3620                 CT *ct;\r
3621                 UINT i;\r
3622 \r
3623                 // 成功\r
3624                 ct = CtNew();\r
3625                 CtInsertColumn(ct, _UU("CM_VLAN_COLUMN_1"), false);\r
3626                 CtInsertColumn(ct, _UU("CM_VLAN_COLUMN_2"), false);\r
3627                 CtInsertColumn(ct, _UU("CM_VLAN_COLUMN_3"), false);\r
3628                 CtInsertColumn(ct, _UU("CM_VLAN_COLUMN_4"), false);\r
3629 \r
3630                 for (i = 0;i < t.NumItem;i++)\r
3631                 {\r
3632                         wchar_t name[MAX_SIZE];\r
3633                         wchar_t mac[MAX_SIZE];\r
3634                         wchar_t ver[MAX_SIZE];\r
3635                         wchar_t *status;\r
3636                         RPC_CLIENT_ENUM_VLAN_ITEM *v = t.Items[i];\r
3637 \r
3638                         // デバイス名\r
3639                         StrToUni(name, sizeof(name), v->DeviceName);\r
3640 \r
3641                         // 状態\r
3642                         status = v->Enabled ? _UU("CM_VLAN_ENABLED") : _UU("CM_VLAN_DISABLED");\r
3643 \r
3644                         // MAC アドレス\r
3645                         StrToUni(mac, sizeof(mac), v->MacAddress);\r
3646 \r
3647                         // バージョン\r
3648                         StrToUni(ver, sizeof(ver), v->Version);\r
3649 \r
3650                         CtInsert(ct,\r
3651                                 name, status, mac, ver);\r
3652                 }\r
3653 \r
3654                 CtFreeEx(ct, c, true);\r
3655         }\r
3656 \r
3657         if (ret != ERR_NO_ERROR)\r
3658         {\r
3659                 // エラーが発生した\r
3660                 CmdPrintError(c, ret);\r
3661         }\r
3662 \r
3663         CiFreeClientEnumVLan(&t);\r
3664 \r
3665         // パラメータリストの解放\r
3666         FreeParamValueList(o);\r
3667 \r
3668         return ret;\r
3669 }\r
3670 \r
3671 // プロトコル名文字列を取得\r
3672 wchar_t *GetProtocolName(UINT n)\r
3673 {\r
3674         switch (n)\r
3675         {\r
3676         case PROXY_DIRECT:\r
3677                 return _UU("PROTO_DIRECT_TCP");\r
3678         case PROXY_HTTP:\r
3679                 return _UU("PROTO_HTTP_PROXY");\r
3680         case PROXY_SOCKS:\r
3681                 return _UU("PROTO_SOCKS_PROXY");\r
3682         }\r
3683 \r
3684         return _UU("PROTO_UNKNOWN");\r
3685 }\r
3686 \r
3687 // 接続設定一覧の取得\r
3688 UINT PcAccountList(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)\r
3689 {\r
3690         LIST *o;\r
3691         PC *pc = (PC *)param;\r
3692         UINT ret = ERR_NO_ERROR;\r
3693         RPC_CLIENT_ENUM_ACCOUNT t;\r
3694 \r
3695         // パラメータリストの取得\r
3696         o = ParseCommandList(c, cmd_name, str, NULL, 0);\r
3697         if (o == NULL)\r
3698         {\r
3699                 return ERR_INVALID_PARAMETER;\r
3700         }\r
3701 \r
3702         // RPC 呼び出し\r
3703         Zero(&t, sizeof(t));\r
3704 \r
3705         ret = CcEnumAccount(pc->RemoteClient, &t);\r
3706 \r
3707         if (ret == ERR_NO_ERROR)\r
3708         {\r
3709                 UINT i;\r
3710                 CT *ct;\r
3711 \r
3712                 // 成功\r
3713                 ct = CtNew();\r
3714                 CtInsertColumn(ct, _UU("CM_ACCOUNT_COLUMN_1"), false);\r
3715                 CtInsertColumn(ct, _UU("CM_ACCOUNT_COLUMN_2"), false);\r
3716                 CtInsertColumn(ct, _UU("CM_ACCOUNT_COLUMN_3"), false);\r
3717                 CtInsertColumn(ct, _UU("CM_ACCOUNT_COLUMN_3_2"), false);\r
3718                 CtInsertColumn(ct, _UU("CM_ACCOUNT_COLUMN_4"), false);\r
3719 \r
3720                 for (i = 0;i < t.NumItem;i++)\r
3721                 {\r
3722                         RPC_CLIENT_ENUM_ACCOUNT_ITEM *e = t.Items[i];\r
3723                         wchar_t tmp[MAX_SIZE];\r
3724                         wchar_t tmp2[MAX_SIZE];\r
3725                         wchar_t tmp4[MAX_SIZE];\r
3726                         IP ip;\r
3727                         char ip_str[MAX_SIZE];\r
3728 \r
3729                         // IPv6 アドレスの場合の特別処理\r
3730                         if (StrToIP6(&ip, e->ServerName) && StartWith(e->ServerName, "[") == false)\r
3731                         {\r
3732                                 Format(ip_str, sizeof(ip_str),\r
3733                                         "[%s]", e->ServerName);\r
3734                         }\r
3735                         else\r
3736                         {\r
3737                                 StrCpy(ip_str, sizeof(ip_str), e->ServerName);\r
3738                         }\r
3739 \r
3740                         if (e->Port == 0)\r
3741                         {\r
3742                                 // ポート番号不明\r
3743                                 UniFormat(tmp2, sizeof(tmp2), L"%S (%s)", ip_str, GetProtocolName(e->ProxyType));\r
3744                         }\r
3745                         else\r
3746                         {\r
3747                                 // ポート番号併記\r
3748                                 UniFormat(tmp2, sizeof(tmp2), L"%S:%u (%s)", ip_str, e->Port, GetProtocolName(e->ProxyType));\r
3749                         }\r
3750 \r
3751                         // 仮想 HUB 名\r
3752                         StrToUni(tmp4, sizeof(tmp4), e->HubName);\r
3753 \r
3754                         // 追加\r
3755                         StrToUni(tmp, sizeof(tmp), e->DeviceName);\r
3756 \r
3757                         CtInsert(ct,\r
3758                                 e->AccountName,\r
3759                                 e->Active == false ? _UU("CM_ACCOUNT_OFFLINE") :\r
3760                                 (e->Connected ? _UU("CM_ACCOUNT_ONLINE") : _UU("CM_ACCOUNT_CONNECTING")),\r
3761                                 tmp2, tmp4,\r
3762                                 tmp);\r
3763                 }\r
3764 \r
3765                 CtFreeEx(ct, c, true);\r
3766         }\r
3767 \r
3768         CiFreeClientEnumAccount(&t);\r
3769 \r
3770         if (ret != ERR_NO_ERROR)\r
3771         {\r
3772                 // エラーが発生した\r
3773                 CmdPrintError(c, ret);\r
3774         }\r
3775 \r
3776         // パラメータリストの解放\r
3777         FreeParamValueList(o);\r
3778 \r
3779         return ret;\r
3780 }\r
3781 \r
3782 // 新しい接続設定の作成\r
3783 UINT PcAccountCreate(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)\r
3784 {\r
3785         LIST *o;\r
3786         PC *pc = (PC *)param;\r
3787         UINT ret = ERR_NO_ERROR;\r
3788         RPC_CLIENT_CREATE_ACCOUNT t;\r
3789         UINT port = 443;\r
3790         char *host = NULL;\r
3791         // 指定できるパラメータ リスト\r
3792         PARAM args[] =\r
3793         {\r
3794                 {"[name]", CmdPrompt, _UU("CMD_AccountCreate_Prompt_Name"), CmdEvalNotEmpty, NULL},\r
3795                 {"SERVER", CmdPrompt, _UU("CMD_AccountCreate_Prompt_Server"), CmdEvalHostAndPort, NULL},\r
3796                 {"HUB", CmdPrompt, _UU("CMD_AccountCreate_Prompt_Hub"), CmdEvalSafe, NULL},\r
3797                 {"USERNAME", CmdPrompt, _UU("CMD_AccountCreate_Prompt_Username"), CmdEvalNotEmpty, NULL},\r
3798                 {"NICNAME", CmdPrompt, _UU("CMD_AccountCreate_Prompt_Nicname"), CmdEvalNotEmpty, NULL},\r
3799         };\r
3800 \r
3801         // パラメータリストの取得\r
3802         o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));\r
3803         if (o == NULL)\r
3804         {\r
3805                 return ERR_INVALID_PARAMETER;\r
3806         }\r
3807 \r
3808         ParseHostPort(GetParamStr(o, "SERVER"), &host, &port, 443);\r
3809 \r
3810         // RPC 呼び出し\r
3811         Zero(&t, sizeof(t));\r
3812 \r
3813         t.ClientOption = ZeroMalloc(sizeof(CLIENT_OPTION));\r
3814         UniStrCpy(t.ClientOption->AccountName, sizeof(t.ClientOption->AccountName), GetParamUniStr(o, "[name]"));\r
3815         t.ClientOption->Port = port;\r
3816         StrCpy(t.ClientOption->Hostname, sizeof(t.ClientOption->Hostname), host);\r
3817         StrCpy(t.ClientOption->HubName, sizeof(t.ClientOption->HubName), GetParamStr(o, "HUB"));\r
3818         t.ClientOption->NumRetry = INFINITE;\r
3819         t.ClientOption->RetryInterval = 15;\r
3820         t.ClientOption->MaxConnection = 1;\r
3821         t.ClientOption->UseEncrypt = true;\r
3822         t.ClientOption->AdditionalConnectionInterval = 1;\r
3823         StrCpy(t.ClientOption->DeviceName, sizeof(t.ClientOption->DeviceName), GetParamStr(o, "NICNAME"));\r
3824 \r
3825         t.ClientAuth = ZeroMalloc(sizeof(CLIENT_AUTH));\r
3826         t.ClientAuth->AuthType = CLIENT_AUTHTYPE_ANONYMOUS;\r
3827         StrCpy(t.ClientAuth->Username, sizeof(t.ClientAuth->Username), GetParamStr(o, "USERNAME"));\r
3828 \r
3829         Free(host);\r
3830 \r
3831         ret = CcCreateAccount(pc->RemoteClient, &t);\r
3832 \r
3833         if (ret == ERR_NO_ERROR)\r
3834         {\r
3835                 // 成功\r
3836         }\r
3837 \r
3838         CiFreeClientCreateAccount(&t);\r
3839 \r
3840         if (ret != ERR_NO_ERROR)\r
3841         {\r
3842                 // エラーが発生した\r
3843                 CmdPrintError(c, ret);\r
3844         }\r
3845 \r
3846         // パラメータリストの解放\r
3847         FreeParamValueList(o);\r
3848 \r
3849         return ret;\r
3850 }\r
3851 \r
3852 // 接続設定の接続先の設定\r
3853 UINT PcAccountSet(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)\r
3854 {\r
3855         LIST *o;\r
3856         PC *pc = (PC *)param;\r
3857         UINT ret = ERR_NO_ERROR;\r
3858         RPC_CLIENT_GET_ACCOUNT t;\r
3859         char *host = NULL;\r
3860         UINT port = 443;\r
3861         // 指定できるパラメータ リスト\r
3862         PARAM args[] =\r
3863         {\r
3864                 {"[name]", CmdPrompt, _UU("CMD_AccountCreate_Prompt_Name"), CmdEvalNotEmpty, NULL},\r
3865                 {"SERVER", CmdPrompt, _UU("CMD_AccountCreate_Prompt_Server"), CmdEvalHostAndPort, NULL},\r
3866                 {"HUB", CmdPrompt, _UU("CMD_AccountCreate_Prompt_Hub"), CmdEvalSafe, NULL},\r
3867         };\r
3868 \r
3869         // パラメータリストの取得\r
3870         o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));\r
3871         if (o == NULL)\r
3872         {\r
3873                 return ERR_INVALID_PARAMETER;\r
3874         }\r
3875 \r
3876         // RPC 呼び出し\r
3877         Zero(&t, sizeof(t));\r
3878 \r
3879         ParseHostPort(GetParamStr(o, "SERVER"), &host, &port, 443);\r
3880 \r
3881         Zero(&t, sizeof(t));\r
3882         UniStrCpy(t.AccountName, sizeof(t.AccountName), GetParamUniStr(o, "[name]"));\r
3883 \r
3884         ret = CcGetAccount(pc->RemoteClient, &t);\r
3885 \r
3886         if (ret == ERR_NO_ERROR)\r
3887         {\r
3888                 RPC_CLIENT_CREATE_ACCOUNT c;\r
3889                 // 成功\r
3890                 t.ClientOption->Port = port;\r
3891                 StrCpy(t.ClientOption->Hostname, sizeof(t.ClientOption->Hostname), host);\r
3892                 StrCpy(t.ClientOption->HubName, sizeof(t.ClientOption->HubName), GetParamStr(o, "HUB"));\r
3893 \r
3894                 Zero(&c, sizeof(c));\r
3895 \r
3896                 c.ClientAuth = t.ClientAuth;\r
3897                 c.ClientOption = t.ClientOption;\r
3898                 c.CheckServerCert = t.CheckServerCert;\r
3899                 c.ServerCert = t.ServerCert;\r
3900                 c.StartupAccount = t.StartupAccount;\r
3901 \r
3902                 ret = CcSetAccount(pc->RemoteClient, &c);\r
3903         }\r
3904 \r
3905         if (ret != ERR_NO_ERROR)\r
3906         {\r
3907                 // エラーが発生した\r
3908                 CmdPrintError(c, ret);\r
3909         }\r
3910 \r
3911         CiFreeClientGetAccount(&t);\r
3912 \r
3913         // パラメータリストの解放\r
3914         FreeParamValueList(o);\r
3915 \r
3916         Free(host);\r
3917 \r
3918         return ret;\r
3919 }\r
3920 \r
3921 // 接続設定の設定の取得\r
3922 UINT PcAccountGet(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)\r
3923 {\r
3924         LIST *o;\r
3925         PC *pc = (PC *)param;\r
3926         UINT ret = ERR_NO_ERROR;\r
3927         RPC_CLIENT_GET_ACCOUNT t;\r
3928         // 指定できるパラメータ リスト\r
3929         PARAM args[] =\r
3930         {\r
3931                 {"[name]", CmdPrompt, _UU("CMD_AccountCreate_Prompt_Name"), CmdEvalNotEmpty, NULL},\r
3932         };\r
3933 \r
3934         // パラメータリストの取得\r
3935         o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));\r
3936         if (o == NULL)\r
3937         {\r
3938                 return ERR_INVALID_PARAMETER;\r
3939         }\r
3940 \r
3941         // RPC 呼び出し\r
3942         Zero(&t, sizeof(t));\r
3943         UniStrCpy(t.AccountName, sizeof(t.AccountName), GetParamUniStr(o, "[name]"));\r
3944 \r
3945         ret = CcGetAccount(pc->RemoteClient, &t);\r
3946 \r
3947         if (ret == ERR_NO_ERROR)\r
3948         {\r
3949                 // 接続設定の内容を表示\r
3950                 wchar_t tmp[MAX_SIZE];\r
3951 \r
3952                 CT *ct = CtNewStandard();\r
3953 \r
3954                 // 接続設定名\r
3955                 CtInsert(ct, _UU("CMD_ACCOUNT_COLUMN_NAME"), t.ClientOption->AccountName);\r
3956 \r
3957                 // 接続先 VPN Server のホスト名\r
3958                 StrToUni(tmp, sizeof(tmp), t.ClientOption->Hostname);\r
3959                 CtInsert(ct, _UU("CMD_ACCOUNT_COLUMN_HOSTNAME"), tmp);\r
3960 \r
3961                 // 接続先 VPN Server のポート番号\r
3962                 UniToStru(tmp, t.ClientOption->Port);\r
3963                 CtInsert(ct, _UU("CMD_ACCOUNT_COLUMN_PORT"), tmp);\r
3964 \r
3965                 // 接続先 VPN Server の仮想 HUB 名\r
3966                 StrToUni(tmp, sizeof(tmp), t.ClientOption->HubName);\r
3967                 CtInsert(ct, _UU("CMD_ACCOUNT_COLUMN_HUBNAME"), tmp);\r
3968 \r
3969                 // 経由するプロキシ サーバーの種類\r
3970                 CtInsert(ct, _UU("CMD_ACCOUNT_COLUMN_PROXY_TYPE"), GetProxyTypeStr(t.ClientOption->ProxyType));\r
3971 \r
3972                 if (t.ClientOption->ProxyType != PROXY_DIRECT)\r
3973                 {\r
3974                         // プロキシ サーバーのホスト名\r
3975                         StrToUni(tmp, sizeof(tmp), t.ClientOption->ProxyName);\r
3976                         CtInsert(ct, _UU("CMD_ACCOUNT_COLUMN_PROXY_HOSTNAME"), tmp);\r
3977 \r
3978                         // プロキシ サーバーのポート番号\r
3979                         UniToStru(tmp, t.ClientOption->ProxyPort);\r
3980                         CtInsert(ct, _UU("CMD_ACCOUNT_COLUMN_PROXY_PORT"), tmp);\r
3981 \r
3982                         // プロキシ サーバーのユーザー名\r
3983                         StrToUni(tmp, sizeof(tmp), t.ClientOption->ProxyUsername);\r
3984                         CtInsert(ct, _UU("CMD_ACCOUNT_COLUMN_PROXY_USERNAME"), tmp);\r
3985                 }\r
3986 \r
3987                 // サーバー証明書の検証\r
3988                 CtInsert(ct, _UU("CMD_ACCOUNT_COLUMN_SERVER_CERT_USE"),\r
3989                         t.CheckServerCert ? _UU("CMD_MSG_ENABLE") : _UU("CMD_MSG_DISABLE"));\r
3990 \r
3991                 // 登録されている固有証明書\r
3992                 if (t.ServerCert != NULL)\r
3993                 {\r
3994                         GetAllNameFromX(tmp, sizeof(tmp), t.ServerCert);\r
3995                         CtInsert(ct, _UU("CMD_ACCOUNT_COLUMN_SERVER_CERT_NAME"), tmp);\r
3996                 }\r
3997 \r
3998                 // 接続に使用するデバイス名\r
3999                 StrToUni(tmp, sizeof(tmp), t.ClientOption->DeviceName);\r
4000                 CtInsert(ct, _UU("CMD_ACCOUNT_COLUMN_DEVICE_NAME"), tmp);\r
4001 \r
4002                 // 認証の種類\r
4003                 CtInsert(ct, _UU("CMD_ACCOUNT_COLUMN_AUTH_TYPE"), GetClientAuthTypeStr(t.ClientAuth->AuthType));\r
4004 \r
4005                 // ユーザー名\r
4006                 StrToUni(tmp, sizeof(tmp), t.ClientAuth->Username);\r
4007                 CtInsert(ct, _UU("CMD_ACCOUNT_COLUMN_AUTH_USERNAME"), tmp);\r
4008 \r
4009                 if (t.ClientAuth->AuthType == CLIENT_AUTHTYPE_CERT)\r
4010                 {\r
4011                         if (t.ClientAuth->ClientX != NULL)\r
4012                         {\r
4013                                 // クライアント証明書名\r
4014                                 GetAllNameFromX(tmp, sizeof(tmp), t.ClientAuth->ClientX);\r
4015                                 CtInsert(ct, _UU("CMD_ACCOUNT_COLUMN_AUTH_CERT_NAME"), tmp);\r
4016                         }\r
4017                 }\r
4018 \r
4019                 // VPN 通信に使用する TCP コネクション数\r
4020                 UniToStru(tmp, t.ClientOption->MaxConnection);\r
4021                 CtInsert(ct, _UU("CMD_ACCOUNT_COLUMN_NUMTCP"), tmp);\r
4022 \r
4023                 // 各 TCP コネクションの確立間隔\r
4024                 UniToStru(tmp, t.ClientOption->AdditionalConnectionInterval);\r
4025                 CtInsert(ct, _UU("CMD_ACCOUNT_COLUMN_TCP_INTERVAL"), tmp);\r
4026 \r
4027                 // 各 TCP コネクションの寿命\r
4028                 if (t.ClientOption->ConnectionDisconnectSpan != 0)\r
4029                 {\r
4030                         UniToStru(tmp, t.ClientOption->ConnectionDisconnectSpan);\r
4031                 }\r
4032                 else\r
4033                 {\r
4034                         UniStrCpy(tmp, sizeof(tmp), _UU("CMD_MSG_INFINITE"));\r
4035                 }\r
4036                 CtInsert(ct, _UU("CMD_ACCOUNT_COLUMN_TCP_TTL"), tmp);\r
4037 \r
4038                 // 半二重モードの使用\r
4039                 CtInsert(ct, _UU("CMD_ACCOUNT_COLUMN_TCP_HALF"),\r
4040                         t.ClientOption->HalfConnection ? _UU("CMD_MSG_ENABLE") : _UU("CMD_MSG_DISABLE"));\r
4041 \r
4042                 // SSL による暗号化\r
4043                 CtInsert(ct, _UU("CMD_ACCOUNT_COLUMN_ENCRYPT"),\r
4044                         t.ClientOption->UseEncrypt ? _UU("CMD_MSG_ENABLE") : _UU("CMD_MSG_DISABLE"));\r
4045 \r
4046                 // データ圧縮\r
4047                 CtInsert(ct, _UU("CMD_ACCOUNT_COLUMN_COMPRESS"),\r
4048                         t.ClientOption->UseCompress ? _UU("CMD_MSG_ENABLE") : _UU("CMD_MSG_DISABLE"));\r
4049 \r
4050                 // ブリッジ / ルータモードで接続\r
4051                 CtInsert(ct, _UU("CMD_ACCOUNT_COLUMN_BRIDGE_ROUTER"),\r
4052                         t.ClientOption->RequireBridgeRoutingMode ? _UU("CMD_MSG_ENABLE") : _UU("CMD_MSG_DISABLE"));\r
4053 \r
4054                 // モニタリングモードで接続\r
4055                 CtInsert(ct, _UU("CMD_ACCOUNT_COLUMN_MONITOR"),\r
4056                         t.ClientOption->RequireMonitorMode ? _UU("CMD_MSG_ENABLE") : _UU("CMD_MSG_DISABLE"));\r
4057 \r
4058                 // ルーティング テーブルを書き換えない\r
4059                 CtInsert(ct, _UU("CMD_ACCOUNT_COLUMN_NO_TRACKING"),\r
4060                         t.ClientOption->NoRoutingTracking ? _UU("CMD_MSG_ENABLE") : _UU("CMD_MSG_DISABLE"));\r
4061 \r
4062                 // QoS制御を無効化する\r
4063                 CtInsert(ct, _UU("CMD_ACCOUNT_COLUMN_QOS_DISABLE"),\r
4064                         t.ClientOption->DisableQoS ? _UU("CMD_MSG_ENABLE") : _UU("CMD_MSG_DISABLE"));\r
4065 \r
4066                 CtFree(ct, c);\r
4067         }\r
4068 \r
4069         if (ret != ERR_NO_ERROR)\r
4070         {\r
4071                 // エラーが発生した\r
4072                 CmdPrintError(c, ret);\r
4073         }\r
4074 \r
4075         CiFreeClientGetAccount(&t);\r
4076 \r
4077         // パラメータリストの解放\r
4078         FreeParamValueList(o);\r
4079 \r
4080         return ret;\r
4081 }\r
4082 \r
4083 // 接続設定の削除\r
4084 UINT PcAccountDelete(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)\r
4085 {\r
4086         LIST *o;\r
4087         PC *pc = (PC *)param;\r
4088         UINT ret = ERR_NO_ERROR;\r
4089         RPC_CLIENT_DELETE_ACCOUNT t;\r
4090         // 指定できるパラメータ リスト\r
4091         PARAM args[] =\r
4092         {\r
4093                 {"[name]", CmdPrompt, _UU("CMD_AccountCreate_Prompt_Name"), CmdEvalNotEmpty, NULL},\r
4094         };\r
4095 \r
4096         // パラメータリストの取得\r
4097         o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));\r
4098         if (o == NULL)\r
4099         {\r
4100                 return ERR_INVALID_PARAMETER;\r
4101         }\r
4102 \r
4103         // RPC 呼び出し\r
4104         Zero(&t, sizeof(t));\r
4105 \r
4106         UniStrCpy(t.AccountName, sizeof(t.AccountName), GetParamUniStr(o, "[name]"));\r
4107 \r
4108         ret = CcDeleteAccount(pc->RemoteClient, &t);\r
4109 \r
4110         if (ret == ERR_NO_ERROR)\r
4111         {\r
4112                 // 成功\r
4113         }\r
4114 \r
4115         if (ret != ERR_NO_ERROR)\r
4116         {\r
4117                 // エラーが発生した\r
4118                 CmdPrintError(c, ret);\r
4119         }\r
4120 \r
4121         // パラメータリストの解放\r
4122         FreeParamValueList(o);\r
4123 \r
4124         return ret;\r
4125 }\r
4126 \r
4127 // 接続設定の接続に使用するユーザー名の設定\r
4128 UINT PcAccountUsernameSet(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)\r
4129 {\r
4130         LIST *o;\r
4131         PC *pc = (PC *)param;\r
4132         UINT ret = ERR_NO_ERROR;\r
4133         RPC_CLIENT_GET_ACCOUNT t;\r
4134         // 指定できるパラメータ リスト\r
4135         PARAM args[] =\r
4136         {\r
4137                 {"[name]", CmdPrompt, _UU("CMD_AccountCreate_Prompt_Name"), CmdEvalNotEmpty, NULL},\r
4138                 {"USERNAME", CmdPrompt, _UU("CMD_AccountCreate_Prompt_Username"), CmdEvalNotEmpty, NULL},\r
4139         };\r
4140 \r
4141         // パラメータリストの取得\r
4142         o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));\r
4143         if (o == NULL)\r
4144         {\r
4145                 return ERR_INVALID_PARAMETER;\r
4146         }\r
4147 \r
4148         // RPC 呼び出し\r
4149         Zero(&t, sizeof(t));\r
4150 \r
4151         UniStrCpy(t.AccountName, sizeof(t.AccountName), GetParamUniStr(o, "[name]"));\r
4152 \r
4153         ret = CcGetAccount(pc->RemoteClient, &t);\r
4154 \r
4155         if (ret == ERR_NO_ERROR)\r
4156         {\r
4157                 RPC_CLIENT_CREATE_ACCOUNT z;\r
4158                 // 設定変更\r
4159                 StrCpy(t.ClientAuth->Username, sizeof(t.ClientAuth->Username), GetParamStr(o, "USERNAME"));\r
4160 \r
4161                 if (t.ClientAuth->AuthType == CLIENT_AUTHTYPE_PASSWORD)\r
4162                 {\r
4163                         c->Write(c, _UU("CMD_AccountUsername_Notice"));\r
4164                 }\r
4165 \r
4166                 Zero(&z, sizeof(z));\r
4167                 z.CheckServerCert = t.CheckServerCert;\r
4168                 z.ClientAuth = t.ClientAuth;\r
4169                 z.ClientOption = t.ClientOption;\r
4170                 z.ServerCert = t.ServerCert;\r
4171                 z.StartupAccount = t.StartupAccount;\r
4172 \r
4173                 ret = CcSetAccount(pc->RemoteClient, &z);\r
4174         }\r
4175 \r
4176         if (ret != ERR_NO_ERROR)\r
4177         {\r
4178                 // エラーが発生した\r
4179                 CmdPrintError(c, ret);\r
4180         }\r
4181 \r
4182         CiFreeClientGetAccount(&t);\r
4183 \r
4184         // パラメータリストの解放\r
4185         FreeParamValueList(o);\r
4186 \r
4187         return ret;\r
4188 }\r
4189 \r
4190 // 接続設定のユーザー認証の種類を匿名認証に設定\r
4191 UINT PcAccountAnonymousSet(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)\r
4192 {\r
4193         LIST *o;\r
4194         PC *pc = (PC *)param;\r
4195         UINT ret = ERR_NO_ERROR;\r
4196         RPC_CLIENT_GET_ACCOUNT t;\r
4197         // 指定できるパラメータ リスト\r
4198         PARAM args[] =\r
4199         {\r
4200                 {"[name]", CmdPrompt, _UU("CMD_AccountCreate_Prompt_Name"), CmdEvalNotEmpty, NULL},\r
4201         };\r
4202 \r
4203         // パラメータリストの取得\r
4204         o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));\r
4205         if (o == NULL)\r
4206         {\r
4207                 return ERR_INVALID_PARAMETER;\r
4208         }\r
4209 \r
4210         // RPC 呼び出し\r
4211         Zero(&t, sizeof(t));\r
4212 \r
4213         UniStrCpy(t.AccountName, sizeof(t.AccountName), GetParamUniStr(o, "[name]"));\r
4214 \r
4215         ret = CcGetAccount(pc->RemoteClient, &t);\r
4216 \r
4217         if (ret == ERR_NO_ERROR)\r
4218         {\r
4219                 RPC_CLIENT_CREATE_ACCOUNT z;\r
4220                 // 設定変更\r
4221                 t.ClientAuth->AuthType = CLIENT_AUTHTYPE_ANONYMOUS;\r
4222 \r
4223                 Zero(&z, sizeof(z));\r
4224                 z.CheckServerCert = t.CheckServerCert;\r
4225                 z.ClientAuth = t.ClientAuth;\r
4226                 z.ClientOption = t.ClientOption;\r
4227                 z.ServerCert = t.ServerCert;\r
4228                 z.StartupAccount = t.StartupAccount;\r
4229 \r
4230                 ret = CcSetAccount(pc->RemoteClient, &z);\r
4231         }\r
4232 \r
4233         if (ret != ERR_NO_ERROR)\r
4234         {\r
4235                 // エラーが発生した\r
4236                 CmdPrintError(c, ret);\r
4237         }\r
4238 \r
4239         CiFreeClientGetAccount(&t);\r
4240 \r
4241         // パラメータリストの解放\r
4242         FreeParamValueList(o);\r
4243 \r
4244         return ret;\r
4245 }\r
4246 \r
4247 // 接続設定のユーザー認証の種類をパスワード認証に設定\r
4248 UINT PcAccountPasswordSet(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)\r
4249 {\r
4250         LIST *o;\r
4251         PC *pc = (PC *)param;\r
4252         UINT ret = ERR_NO_ERROR;\r
4253         RPC_CLIENT_GET_ACCOUNT t;\r
4254         // 指定できるパラメータ リスト\r
4255         PARAM args[] =\r
4256         {\r
4257                 {"[name]", CmdPrompt, _UU("CMD_AccountCreate_Prompt_Name"), CmdEvalNotEmpty, NULL},\r
4258                 {"PASSWORD", CmdPromptChoosePassword, NULL, NULL, NULL},\r
4259                 {"TYPE", CmdPrompt, _UU("CMD_CascadePasswordSet_Prompt_Type"), CmdEvalNotEmpty, NULL},\r
4260         };\r
4261 \r
4262         // パラメータリストの取得\r
4263         o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));\r
4264         if (o == NULL)\r
4265         {\r
4266                 return ERR_INVALID_PARAMETER;\r
4267         }\r
4268 \r
4269         // RPC 呼び出し\r
4270         Zero(&t, sizeof(t));\r
4271 \r
4272         UniStrCpy(t.AccountName, sizeof(t.AccountName), GetParamUniStr(o, "[name]"));\r
4273 \r
4274         ret = CcGetAccount(pc->RemoteClient, &t);\r
4275 \r
4276         if (ret == ERR_NO_ERROR)\r
4277         {\r
4278                 char *typestr = GetParamStr(o, "TYPE");\r
4279                 RPC_CLIENT_CREATE_ACCOUNT z;\r
4280 \r
4281                 // 設定変更\r
4282                 if (StartWith("standard", typestr))\r
4283                 {\r
4284                         t.ClientAuth->AuthType = CLIENT_AUTHTYPE_PASSWORD;\r
4285                         HashPassword(t.ClientAuth->HashedPassword, t.ClientAuth->Username,\r
4286                                 GetParamStr(o, "PASSWORD"));\r
4287                 }\r
4288                 else if (StartWith("radius", typestr) || StartWith("ntdomain", typestr))\r
4289                 {\r
4290                         t.ClientAuth->AuthType = CLIENT_AUTHTYPE_PLAIN_PASSWORD;\r
4291 \r
4292                         StrCpy(t.ClientAuth->PlainPassword, sizeof(t.ClientAuth->PlainPassword),\r
4293                                 GetParamStr(o, "PASSWORD"));\r
4294                 }\r
4295                 else\r
4296                 {\r
4297                         // エラー発生\r
4298                         c->Write(c, _UU("CMD_CascadePasswordSet_Type_Invalid"));\r
4299                         ret = ERR_INVALID_PARAMETER;\r
4300                 }\r
4301 \r
4302                 if (ret == ERR_NO_ERROR)\r
4303                 {\r
4304                         Zero(&z, sizeof(z));\r
4305                         z.CheckServerCert = t.CheckServerCert;\r
4306                         z.ClientAuth = t.ClientAuth;\r
4307                         z.ClientOption = t.ClientOption;\r
4308                         z.ServerCert = t.ServerCert;\r
4309                         z.StartupAccount = t.StartupAccount;\r
4310 \r
4311                         ret = CcSetAccount(pc->RemoteClient, &z);\r
4312                 }\r
4313         }\r
4314 \r
4315         if (ret != ERR_NO_ERROR)\r
4316         {\r
4317                 // エラーが発生した\r
4318                 CmdPrintError(c, ret);\r
4319         }\r
4320 \r
4321         CiFreeClientGetAccount(&t);\r
4322 \r
4323         // パラメータリストの解放\r
4324         FreeParamValueList(o);\r
4325 \r
4326         return ret;\r
4327 }\r
4328 \r
4329 // 接続設定のユーザー認証の種類をクライアント証明書認証に設定\r
4330 UINT PcAccountCertSet(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)\r
4331 {\r
4332         LIST *o;\r
4333         PC *pc = (PC *)param;\r
4334         UINT ret = ERR_NO_ERROR;\r
4335         RPC_CLIENT_GET_ACCOUNT t;\r
4336         X *x;\r
4337         K *k;\r
4338         // 指定できるパラメータ リスト\r
4339         PARAM args[] =\r
4340         {\r
4341                 {"[name]", CmdPrompt, _UU("CMD_CascadeCreate_Prompt_Name"), CmdEvalNotEmpty, NULL},\r
4342                 {"LOADCERT", CmdPrompt, _UU("CMD_LOADCERTPATH"), CmdEvalIsFile, NULL},\r
4343                 {"LOADKEY", CmdPrompt, _UU("CMD_LOADKEYPATH"), CmdEvalIsFile, NULL},\r
4344         };\r
4345 \r
4346         // パラメータリストの取得\r
4347         o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));\r
4348         if (o == NULL)\r
4349         {\r
4350                 return ERR_INVALID_PARAMETER;\r
4351         }\r
4352 \r
4353         if (CmdLoadCertAndKey(c, &x, &k, GetParamStr(o, "LOADCERT"), GetParamStr(o, "LOADKEY")) == false)\r
4354         {\r
4355                 return ERR_INTERNAL_ERROR;\r
4356         }\r
4357 \r
4358         // RPC 呼び出し\r
4359         Zero(&t, sizeof(t));\r
4360 \r
4361         UniStrCpy(t.AccountName, sizeof(t.AccountName), GetParamUniStr(o, "[name]"));\r
4362 \r
4363         ret = CcGetAccount(pc->RemoteClient, &t);\r
4364 \r
4365         if (ret == ERR_NO_ERROR)\r
4366         {\r
4367                 RPC_CLIENT_CREATE_ACCOUNT z;\r
4368 \r
4369                 t.ClientAuth->AuthType = CLIENT_AUTHTYPE_CERT;\r
4370                 if (t.ClientAuth->ClientX != NULL)\r
4371                 {\r
4372                         FreeX(t.ClientAuth->ClientX);\r
4373                 }\r
4374                 if (t.ClientAuth->ClientK != NULL)\r
4375                 {\r
4376                         FreeK(t.ClientAuth->ClientK);\r
4377                 }\r
4378 \r
4379                 t.ClientAuth->ClientX = CloneX(x);\r
4380                 t.ClientAuth->ClientK = CloneK(k);\r
4381 \r
4382                 Zero(&z, sizeof(z));\r
4383                 z.CheckServerCert = t.CheckServerCert;\r
4384                 z.ClientAuth = t.ClientAuth;\r
4385                 z.ClientOption = t.ClientOption;\r
4386                 z.ServerCert = t.ServerCert;\r
4387                 z.StartupAccount = t.StartupAccount;\r
4388 \r
4389                 ret = CcSetAccount(pc->RemoteClient, &z);\r
4390         }\r
4391 \r
4392         if (ret != ERR_NO_ERROR)\r
4393         {\r
4394                 // エラーが発生した\r
4395                 CmdPrintError(c, ret);\r
4396         }\r
4397 \r
4398         FreeX(x);\r
4399         FreeK(k);\r
4400 \r
4401         CiFreeClientGetAccount(&t);\r
4402 \r
4403         // パラメータリストの解放\r
4404         FreeParamValueList(o);\r
4405 \r
4406         return ret;\r
4407 }\r
4408 \r
4409 // 接続設定に用いるクライアント証明書の取得\r
4410 UINT PcAccountCertGet(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)\r
4411 {\r
4412         LIST *o;\r
4413         PC *pc = (PC *)param;\r
4414         UINT ret = ERR_NO_ERROR;\r
4415         RPC_CLIENT_GET_ACCOUNT t;\r
4416         // 指定できるパラメータ リスト\r
4417         PARAM args[] =\r
4418         {\r
4419                 {"[name]", CmdPrompt, _UU("CMD_CascadeCreate_Prompt_Name"), CmdEvalNotEmpty, NULL},\r
4420                 {"SAVECERT", CmdPrompt, _UU("CMD_SAVECERTPATH"), CmdEvalNotEmpty, NULL},\r
4421         };\r
4422 \r
4423         // パラメータリストの取得\r
4424         o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));\r
4425         if (o == NULL)\r
4426         {\r
4427                 return ERR_INVALID_PARAMETER;\r
4428         }\r
4429 \r
4430         // RPC 呼び出し\r
4431         Zero(&t, sizeof(t));\r
4432 \r
4433         UniStrCpy(t.AccountName, sizeof(t.AccountName), GetParamUniStr(o, "[name]"));\r
4434 \r
4435         ret = CcGetAccount(pc->RemoteClient, &t);\r
4436 \r
4437         if (ret == ERR_NO_ERROR)\r
4438         {\r
4439                 if (t.ClientAuth->AuthType != CLIENT_AUTHTYPE_CERT)\r
4440                 {\r
4441                         c->Write(c, _UU("CMD_CascadeCertSet_Not_Auth_Cert"));\r
4442                         ret = ERR_INTERNAL_ERROR;\r
4443                 }\r
4444                 else if (t.ClientAuth->ClientX == NULL)\r
4445                 {\r
4446                         c->Write(c, _UU("CMD_CascadeCertSet_Cert_Not_Exists"));\r
4447                         ret = ERR_INTERNAL_ERROR;\r
4448                 }\r
4449                 else\r
4450                 {\r
4451                         XToFile(t.ClientAuth->ClientX, GetParamStr(o, "SAVECERT"), true);\r
4452                 }\r
4453         }\r
4454 \r
4455         CiFreeClientGetAccount(&t);\r
4456 \r
4457         if (ret != ERR_NO_ERROR)\r
4458         {\r
4459                 // エラーが発生した\r
4460                 CmdPrintError(c, ret);\r
4461         }\r
4462 \r
4463         // パラメータリストの解放\r
4464         FreeParamValueList(o);\r
4465 \r
4466         return ret;\r
4467 }\r
4468 \r
4469 // 接続設定の通信時の暗号化の無効化\r
4470 UINT PcAccountEncryptDisable(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)\r
4471 {\r
4472         LIST *o;\r
4473         PC *pc = (PC *)param;\r
4474         UINT ret = ERR_NO_ERROR;\r
4475         RPC_CLIENT_GET_ACCOUNT t;\r
4476         // 指定できるパラメータ リスト\r
4477         PARAM args[] =\r
4478         {\r
4479                 {"[name]", CmdPrompt, _UU("CMD_AccountCreate_Prompt_Name"), CmdEvalNotEmpty, NULL},\r
4480         };\r
4481 \r
4482         // パラメータリストの取得\r
4483         o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));\r
4484         if (o == NULL)\r
4485         {\r
4486                 return ERR_INVALID_PARAMETER;\r
4487         }\r
4488 \r
4489         // RPC 呼び出し\r
4490         Zero(&t, sizeof(t));\r
4491 \r
4492         UniStrCpy(t.AccountName, sizeof(t.AccountName), GetParamUniStr(o, "[name]"));\r
4493 \r
4494         ret = CcGetAccount(pc->RemoteClient, &t);\r
4495 \r
4496         if (ret == ERR_NO_ERROR)\r
4497         {\r
4498                 RPC_CLIENT_CREATE_ACCOUNT z;\r
4499                 // 設定変更\r
4500                 t.ClientOption->UseEncrypt = false;\r
4501 \r
4502                 Zero(&z, sizeof(z));\r
4503                 z.CheckServerCert = t.CheckServerCert;\r
4504                 z.ClientAuth = t.ClientAuth;\r
4505                 z.ClientOption = t.ClientOption;\r
4506                 z.ServerCert = t.ServerCert;\r
4507                 z.StartupAccount = t.StartupAccount;\r
4508 \r
4509                 ret = CcSetAccount(pc->RemoteClient, &z);\r
4510         }\r
4511 \r
4512         if (ret != ERR_NO_ERROR)\r
4513         {\r
4514                 // エラーが発生した\r
4515                 CmdPrintError(c, ret);\r
4516         }\r
4517 \r
4518         CiFreeClientGetAccount(&t);\r
4519 \r
4520         // パラメータリストの解放\r
4521         FreeParamValueList(o);\r
4522 \r
4523         return ret;\r
4524 }\r
4525 \r
4526 // 接続設定の通信時の暗号化の有効化\r
4527 UINT PcAccountEncryptEnable(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)\r
4528 {\r
4529         LIST *o;\r
4530         PC *pc = (PC *)param;\r
4531         UINT ret = ERR_NO_ERROR;\r
4532         RPC_CLIENT_GET_ACCOUNT t;\r
4533         // 指定できるパラメータ リスト\r
4534         PARAM args[] =\r
4535         {\r
4536                 {"[name]", CmdPrompt, _UU("CMD_AccountCreate_Prompt_Name"), CmdEvalNotEmpty, NULL},\r
4537         };\r
4538 \r
4539         // パラメータリストの取得\r
4540         o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));\r
4541         if (o == NULL)\r
4542         {\r
4543                 return ERR_INVALID_PARAMETER;\r
4544         }\r
4545 \r
4546         // RPC 呼び出し\r
4547         Zero(&t, sizeof(t));\r
4548 \r
4549         UniStrCpy(t.AccountName, sizeof(t.AccountName), GetParamUniStr(o, "[name]"));\r
4550 \r
4551         ret = CcGetAccount(pc->RemoteClient, &t);\r
4552 \r
4553         if (ret == ERR_NO_ERROR)\r
4554         {\r
4555                 RPC_CLIENT_CREATE_ACCOUNT z;\r
4556                 // 設定変更\r
4557                 t.ClientOption->UseEncrypt = true;\r
4558 \r
4559                 Zero(&z, sizeof(z));\r
4560                 z.CheckServerCert = t.CheckServerCert;\r
4561                 z.ClientAuth = t.ClientAuth;\r
4562                 z.ClientOption = t.ClientOption;\r
4563                 z.ServerCert = t.ServerCert;\r
4564                 z.StartupAccount = t.StartupAccount;\r
4565 \r
4566                 ret = CcSetAccount(pc->RemoteClient, &z);\r
4567         }\r
4568 \r
4569         if (ret != ERR_NO_ERROR)\r
4570         {\r
4571                 // エラーが発生した\r
4572                 CmdPrintError(c, ret);\r
4573         }\r
4574 \r
4575         CiFreeClientGetAccount(&t);\r
4576 \r
4577         // パラメータリストの解放\r
4578         FreeParamValueList(o);\r
4579 \r
4580         return ret;\r
4581 }\r
4582 \r
4583 // 接続設定の通信時のデータ圧縮の有効化\r
4584 UINT PcAccountCompressEnable(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)\r
4585 {\r
4586         LIST *o;\r
4587         PC *pc = (PC *)param;\r
4588         UINT ret = ERR_NO_ERROR;\r
4589         RPC_CLIENT_GET_ACCOUNT t;\r
4590         // 指定できるパラメータ リスト\r
4591         PARAM args[] =\r
4592         {\r
4593                 {"[name]", CmdPrompt, _UU("CMD_AccountCreate_Prompt_Name"), CmdEvalNotEmpty, NULL},\r
4594         };\r
4595 \r
4596         // パラメータリストの取得\r
4597         o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));\r
4598         if (o == NULL)\r
4599         {\r
4600                 return ERR_INVALID_PARAMETER;\r
4601         }\r
4602 \r
4603         // RPC 呼び出し\r
4604         Zero(&t, sizeof(t));\r
4605 \r
4606         UniStrCpy(t.AccountName, sizeof(t.AccountName), GetParamUniStr(o, "[name]"));\r
4607 \r
4608         ret = CcGetAccount(pc->RemoteClient, &t);\r
4609 \r
4610         if (ret == ERR_NO_ERROR)\r
4611         {\r
4612                 RPC_CLIENT_CREATE_ACCOUNT z;\r
4613                 // 設定変更\r
4614                 t.ClientOption->UseCompress = true;\r
4615 \r
4616                 Zero(&z, sizeof(z));\r
4617                 z.CheckServerCert = t.CheckServerCert;\r
4618                 z.ClientAuth = t.ClientAuth;\r
4619                 z.ClientOption = t.ClientOption;\r
4620                 z.ServerCert = t.ServerCert;\r
4621                 z.StartupAccount = t.StartupAccount;\r
4622 \r
4623                 ret = CcSetAccount(pc->RemoteClient, &z);\r
4624         }\r
4625 \r
4626         if (ret != ERR_NO_ERROR)\r
4627         {\r
4628                 // エラーが発生した\r
4629                 CmdPrintError(c, ret);\r
4630         }\r
4631 \r
4632         CiFreeClientGetAccount(&t);\r
4633 \r
4634         // パラメータリストの解放\r
4635         FreeParamValueList(o);\r
4636 \r
4637         return ret;\r
4638 }\r
4639 \r
4640 // 接続設定の通信時のデータ圧縮の無効化\r
4641 UINT PcAccountCompressDisable(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)\r
4642 {\r
4643         LIST *o;\r
4644         PC *pc = (PC *)param;\r
4645         UINT ret = ERR_NO_ERROR;\r
4646         RPC_CLIENT_GET_ACCOUNT t;\r
4647         // 指定できるパラメータ リスト\r
4648         PARAM args[] =\r
4649         {\r
4650                 {"[name]", CmdPrompt, _UU("CMD_AccountCreate_Prompt_Name"), CmdEvalNotEmpty, NULL},\r
4651         };\r
4652 \r
4653         // パラメータリストの取得\r
4654         o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));\r
4655         if (o == NULL)\r
4656         {\r
4657                 return ERR_INVALID_PARAMETER;\r
4658         }\r
4659 \r
4660         // RPC 呼び出し\r
4661         Zero(&t, sizeof(t));\r
4662 \r
4663         UniStrCpy(t.AccountName, sizeof(t.AccountName), GetParamUniStr(o, "[name]"));\r
4664 \r
4665         ret = CcGetAccount(pc->RemoteClient, &t);\r
4666 \r
4667         if (ret == ERR_NO_ERROR)\r
4668         {\r
4669                 RPC_CLIENT_CREATE_ACCOUNT z;\r
4670                 // 設定変更\r
4671                 t.ClientOption->UseCompress = false;\r
4672 \r
4673                 Zero(&z, sizeof(z));\r
4674                 z.CheckServerCert = t.CheckServerCert;\r
4675                 z.ClientAuth = t.ClientAuth;\r
4676                 z.ClientOption = t.ClientOption;\r
4677                 z.ServerCert = t.ServerCert;\r
4678                 z.StartupAccount = t.StartupAccount;\r
4679 \r
4680                 ret = CcSetAccount(pc->RemoteClient, &z);\r
4681         }\r
4682 \r
4683         if (ret != ERR_NO_ERROR)\r
4684         {\r
4685                 // エラーが発生した\r
4686                 CmdPrintError(c, ret);\r
4687         }\r
4688 \r
4689         CiFreeClientGetAccount(&t);\r
4690 \r
4691         // パラメータリストの解放\r
4692         FreeParamValueList(o);\r
4693 \r
4694         return ret;\r
4695 }\r
4696 \r
4697 // 接続設定の接続方法を直接 TCP/IP 接続に設定\r
4698 UINT PcAccountProxyNone(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)\r
4699 {\r
4700         LIST *o;\r
4701         PC *pc = (PC *)param;\r
4702         UINT ret = ERR_NO_ERROR;\r
4703         RPC_CLIENT_GET_ACCOUNT t;\r
4704         // 指定できるパラメータ リスト\r
4705         PARAM args[] =\r
4706         {\r
4707                 {"[name]", CmdPrompt, _UU("CMD_AccountCreate_Prompt_Name"), CmdEvalNotEmpty, NULL},\r
4708         };\r
4709 \r
4710         // パラメータリストの取得\r
4711         o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));\r
4712         if (o == NULL)\r
4713         {\r
4714                 return ERR_INVALID_PARAMETER;\r
4715         }\r
4716 \r
4717         // RPC 呼び出し\r
4718         Zero(&t, sizeof(t));\r
4719 \r
4720         UniStrCpy(t.AccountName, sizeof(t.AccountName), GetParamUniStr(o, "[name]"));\r
4721 \r
4722         ret = CcGetAccount(pc->RemoteClient, &t);\r
4723 \r
4724         if (ret == ERR_NO_ERROR)\r
4725         {\r
4726                 RPC_CLIENT_CREATE_ACCOUNT z;\r
4727                 // 設定変更\r
4728                 t.ClientOption->ProxyType = PROXY_DIRECT;\r
4729 \r
4730                 Zero(&z, sizeof(z));\r
4731                 z.CheckServerCert = t.CheckServerCert;\r
4732                 z.ClientAuth = t.ClientAuth;\r
4733                 z.ClientOption = t.ClientOption;\r
4734                 z.ServerCert = t.ServerCert;\r
4735                 z.StartupAccount = t.StartupAccount;\r
4736 \r
4737                 ret = CcSetAccount(pc->RemoteClient, &z);\r
4738         }\r
4739 \r
4740         if (ret != ERR_NO_ERROR)\r
4741         {\r
4742                 // エラーが発生した\r
4743                 CmdPrintError(c, ret);\r
4744         }\r
4745 \r
4746         CiFreeClientGetAccount(&t);\r
4747 \r
4748         // パラメータリストの解放\r
4749         FreeParamValueList(o);\r
4750 \r
4751         return ret;\r
4752 }\r
4753 \r
4754 // 接続設定の接続方法を HTTP プロキシサーバー経由接続に設定\r
4755 UINT PcAccountProxyHttp(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)\r
4756 {\r
4757         LIST *o;\r
4758         PC *pc = (PC *)param;\r
4759         UINT ret = ERR_NO_ERROR;\r
4760         RPC_CLIENT_GET_ACCOUNT t;\r
4761         // 指定できるパラメータ リスト\r
4762         PARAM args[] =\r
4763         {\r
4764                 {"[name]", CmdPrompt, _UU("CMD_AccountCreate_Prompt_Name"), CmdEvalNotEmpty, NULL},\r
4765                 {"SERVER", CmdPrompt, _UU("CMD_AccountProxyHttp_Prompt_Server"), CmdEvalHostAndPort, NULL},\r
4766                 {"USERNAME", NULL, NULL, NULL, NULL},\r
4767                 {"PASSWORD", NULL, NULL, NULL, NULL},\r
4768         };\r
4769 \r
4770         // パラメータリストの取得\r
4771         o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));\r
4772         if (o == NULL)\r
4773         {\r
4774                 return ERR_INVALID_PARAMETER;\r
4775         }\r
4776 \r
4777         // RPC 呼び出し\r
4778         Zero(&t, sizeof(t));\r
4779 \r
4780         UniStrCpy(t.AccountName, sizeof(t.AccountName), GetParamUniStr(o, "[name]"));\r
4781 \r
4782         ret = CcGetAccount(pc->RemoteClient, &t);\r
4783 \r
4784         if (ret == ERR_NO_ERROR)\r
4785         {\r
4786                 RPC_CLIENT_CREATE_ACCOUNT z;\r
4787                 char *host;\r
4788                 UINT port;\r
4789 \r
4790                 // データ変更\r
4791                 if (ParseHostPort(GetParamStr(o, "SERVER"), &host, &port, 8080))\r
4792                 {\r
4793                         t.ClientOption->ProxyType = PROXY_HTTP;\r
4794                         StrCpy(t.ClientOption->ProxyName, sizeof(t.ClientOption->ProxyName), host);\r
4795                         t.ClientOption->ProxyPort = port;\r
4796                         StrCpy(t.ClientOption->ProxyUsername, sizeof(t.ClientOption->ProxyName), GetParamStr(o, "USERNAME"));\r
4797                         StrCpy(t.ClientOption->ProxyPassword, sizeof(t.ClientOption->ProxyName), GetParamStr(o, "PASSWORD"));\r
4798                         Free(host);\r
4799                 }\r
4800 \r
4801                 Zero(&z, sizeof(z));\r
4802                 z.CheckServerCert = t.CheckServerCert;\r
4803                 z.ClientAuth = t.ClientAuth;\r
4804                 z.ClientOption = t.ClientOption;\r
4805                 z.ServerCert = t.ServerCert;\r
4806                 z.StartupAccount = t.StartupAccount;\r
4807 \r
4808                 ret = CcSetAccount(pc->RemoteClient, &z);\r
4809         }\r
4810 \r
4811         if (ret != ERR_NO_ERROR)\r
4812         {\r
4813                 // エラーが発生した\r
4814                 CmdPrintError(c, ret);\r
4815         }\r
4816 \r
4817         CiFreeClientGetAccount(&t);\r
4818 \r
4819         // パラメータリストの解放\r
4820         FreeParamValueList(o);\r
4821 \r
4822         return ret;\r
4823 }\r
4824 \r
4825 // 接続設定の接続方法を SOCKS プロキシサーバー経由接続に設定\r
4826 UINT PcAccountProxySocks(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)\r
4827 {\r
4828         LIST *o;\r
4829         PC *pc = (PC *)param;\r
4830         UINT ret = ERR_NO_ERROR;\r
4831         RPC_CLIENT_GET_ACCOUNT t;\r
4832         // 指定できるパラメータ リスト\r
4833         PARAM args[] =\r
4834         {\r
4835                 {"[name]", CmdPrompt, _UU("CMD_AccountCreate_Prompt_Name"), CmdEvalNotEmpty, NULL},\r
4836                 {"SERVER", CmdPrompt, _UU("CMD_AccountProxyHttp_Prompt_Server"), CmdEvalHostAndPort, NULL},\r
4837                 {"USERNAME", NULL, NULL, NULL, NULL},\r
4838                 {"PASSWORD", NULL, NULL, NULL, NULL},\r
4839         };\r
4840 \r
4841         // パラメータリストの取得\r
4842         o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));\r
4843         if (o == NULL)\r
4844         {\r
4845                 return ERR_INVALID_PARAMETER;\r
4846         }\r
4847 \r
4848         // RPC 呼び出し\r
4849         Zero(&t, sizeof(t));\r
4850 \r
4851         UniStrCpy(t.AccountName, sizeof(t.AccountName), GetParamUniStr(o, "[name]"));\r
4852 \r
4853         ret = CcGetAccount(pc->RemoteClient, &t);\r
4854 \r
4855         if (ret == ERR_NO_ERROR)\r
4856         {\r
4857                 RPC_CLIENT_CREATE_ACCOUNT z;\r
4858                 char *host;\r
4859                 UINT port;\r
4860 \r
4861                 // データ変更\r
4862                 if (ParseHostPort(GetParamStr(o, "SERVER"), &host, &port, 8080))\r
4863                 {\r
4864                         t.ClientOption->ProxyType = PROXY_SOCKS;\r
4865                         StrCpy(t.ClientOption->ProxyName, sizeof(t.ClientOption->ProxyName), host);\r
4866                         t.ClientOption->ProxyPort = port;\r
4867                         StrCpy(t.ClientOption->ProxyUsername, sizeof(t.ClientOption->ProxyName), GetParamStr(o, "USERNAME"));\r
4868                         StrCpy(t.ClientOption->ProxyPassword, sizeof(t.ClientOption->ProxyName), GetParamStr(o, "PASSWORD"));\r
4869                         Free(host);\r
4870                 }\r
4871 \r
4872                 Zero(&z, sizeof(z));\r
4873                 z.CheckServerCert = t.CheckServerCert;\r
4874                 z.ClientAuth = t.ClientAuth;\r
4875                 z.ClientOption = t.ClientOption;\r
4876                 z.ServerCert = t.ServerCert;\r
4877                 z.StartupAccount = t.StartupAccount;\r
4878 \r
4879                 ret = CcSetAccount(pc->RemoteClient, &z);\r
4880         }\r
4881 \r
4882         if (ret != ERR_NO_ERROR)\r
4883         {\r
4884                 // エラーが発生した\r
4885                 CmdPrintError(c, ret);\r
4886         }\r
4887 \r
4888         CiFreeClientGetAccount(&t);\r
4889 \r
4890         // パラメータリストの解放\r
4891         FreeParamValueList(o);\r
4892 \r
4893         return ret;\r
4894 }\r
4895 \r
4896 // 接続設定のサーバー証明書の検証オプションの有効化\r
4897 UINT PcAccountServerCertEnable(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)\r
4898 {\r
4899         LIST *o;\r
4900         PC *pc = (PC *)param;\r
4901         UINT ret = ERR_NO_ERROR;\r
4902         RPC_CLIENT_GET_ACCOUNT t;\r
4903         // 指定できるパラメータ リスト\r
4904         PARAM args[] =\r
4905         {\r
4906                 {"[name]", CmdPrompt, _UU("CMD_AccountCreate_Prompt_Name"), CmdEvalNotEmpty, NULL},\r
4907         };\r
4908 \r
4909         // パラメータリストの取得\r
4910         o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));\r
4911         if (o == NULL)\r
4912         {\r
4913                 return ERR_INVALID_PARAMETER;\r
4914         }\r
4915 \r
4916         // RPC 呼び出し\r
4917         Zero(&t, sizeof(t));\r
4918 \r
4919         UniStrCpy(t.AccountName, sizeof(t.AccountName), GetParamUniStr(o, "[name]"));\r
4920 \r
4921         ret = CcGetAccount(pc->RemoteClient, &t);\r
4922 \r
4923         if (ret == ERR_NO_ERROR)\r
4924         {\r
4925                 RPC_CLIENT_CREATE_ACCOUNT z;\r
4926                 // 設定変更\r
4927                 t.CheckServerCert = true;\r
4928 \r
4929                 Zero(&z, sizeof(z));\r
4930                 z.CheckServerCert = t.CheckServerCert;\r
4931                 z.ClientAuth = t.ClientAuth;\r
4932                 z.ClientOption = t.ClientOption;\r
4933                 z.ServerCert = t.ServerCert;\r
4934                 z.StartupAccount = t.StartupAccount;\r
4935 \r
4936                 ret = CcSetAccount(pc->RemoteClient, &z);\r
4937         }\r
4938 \r
4939         if (ret != ERR_NO_ERROR)\r
4940         {\r
4941                 // エラーが発生した\r
4942                 CmdPrintError(c, ret);\r
4943         }\r
4944 \r
4945         CiFreeClientGetAccount(&t);\r
4946 \r
4947         // パラメータリストの解放\r
4948         FreeParamValueList(o);\r
4949 \r
4950         return ret;\r
4951 }\r
4952 \r
4953 // 接続設定のサーバー証明書の検証オプションの無効化\r
4954 UINT PcAccountServerCertDisable(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)\r
4955 {\r
4956         LIST *o;\r
4957         PC *pc = (PC *)param;\r
4958         UINT ret = ERR_NO_ERROR;\r
4959         RPC_CLIENT_GET_ACCOUNT t;\r
4960         // 指定できるパラメータ リスト\r
4961         PARAM args[] =\r
4962         {\r
4963                 {"[name]", CmdPrompt, _UU("CMD_AccountCreate_Prompt_Name"), CmdEvalNotEmpty, NULL},\r
4964         };\r
4965 \r
4966         // パラメータリストの取得\r
4967         o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));\r
4968         if (o == NULL)\r
4969         {\r
4970                 return ERR_INVALID_PARAMETER;\r
4971         }\r
4972 \r
4973         // RPC 呼び出し\r
4974         Zero(&t, sizeof(t));\r
4975 \r
4976         UniStrCpy(t.AccountName, sizeof(t.AccountName), GetParamUniStr(o, "[name]"));\r
4977 \r
4978         ret = CcGetAccount(pc->RemoteClient, &t);\r
4979 \r
4980         if (ret == ERR_NO_ERROR)\r
4981         {\r
4982                 RPC_CLIENT_CREATE_ACCOUNT z;\r
4983                 // 設定変更\r
4984                 t.CheckServerCert = false;\r
4985 \r
4986                 Zero(&z, sizeof(z));\r
4987                 z.CheckServerCert = t.CheckServerCert;\r
4988                 z.ClientAuth = t.ClientAuth;\r
4989                 z.ClientOption = t.ClientOption;\r
4990                 z.ServerCert = t.ServerCert;\r
4991                 z.StartupAccount = t.StartupAccount;\r
4992 \r
4993                 ret = CcSetAccount(pc->RemoteClient, &z);\r
4994         }\r
4995 \r
4996         if (ret != ERR_NO_ERROR)\r
4997         {\r
4998                 // エラーが発生した\r
4999                 CmdPrintError(c, ret);\r
5000         }\r
5001 \r
5002         CiFreeClientGetAccount(&t);\r
5003 \r
5004         // パラメータリストの解放\r
5005         FreeParamValueList(o);\r
5006 \r
5007         return ret;\r
5008 }\r
5009 \r
5010 // 接続設定のサーバー固有証明書の設定\r
5011 UINT PcAccountServerCertSet(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)\r
5012 {\r
5013         LIST *o;\r
5014         PC *pc = (PC *)param;\r
5015         UINT ret = ERR_NO_ERROR;\r
5016         RPC_CLIENT_GET_ACCOUNT t;\r
5017         X *x;\r
5018         // 指定できるパラメータ リスト\r
5019         PARAM args[] =\r
5020         {\r
5021                 {"[name]", CmdPrompt, _UU("CMD_AccountCreate_Prompt_Name"), CmdEvalNotEmpty, NULL},\r
5022                 {"LOADCERT", CmdPrompt, _UU("CMD_LOADCERTPATH"), CmdEvalIsFile, NULL},\r
5023         };\r
5024 \r
5025         // パラメータリストの取得\r
5026         o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));\r
5027         if (o == NULL)\r
5028         {\r
5029                 return ERR_INVALID_PARAMETER;\r
5030         }\r
5031 \r
5032         x = FileToX(GetParamStr(o, "LOADCERT"));\r
5033         if (x == NULL)\r
5034         {\r
5035                 FreeParamValueList(o);\r
5036                 c->Write(c, _UU("CMD_LOADCERT_FAILED"));\r
5037                 return ERR_INTERNAL_ERROR;\r
5038         }\r
5039 \r
5040         // RPC 呼び出し\r
5041         Zero(&t, sizeof(t));\r
5042 \r
5043         UniStrCpy(t.AccountName, sizeof(t.AccountName), GetParamUniStr(o, "[name]"));\r
5044 \r
5045         ret = CcGetAccount(pc->RemoteClient, &t);\r
5046 \r
5047         if (ret == ERR_NO_ERROR)\r
5048         {\r
5049                 RPC_CLIENT_CREATE_ACCOUNT z;\r
5050                 // 設定変更\r
5051                 if (t.ServerCert != NULL)\r
5052                 {\r
5053                         FreeX(t.ServerCert);\r
5054                 }\r
5055                 t.ServerCert = CloneX(x);\r
5056 \r
5057                 Zero(&z, sizeof(z));\r
5058                 z.CheckServerCert = t.CheckServerCert;\r
5059                 z.ClientAuth = t.ClientAuth;\r
5060                 z.ClientOption = t.ClientOption;\r
5061                 z.ServerCert = t.ServerCert;\r
5062                 z.StartupAccount = t.StartupAccount;\r
5063 \r
5064                 ret = CcSetAccount(pc->RemoteClient, &z);\r
5065         }\r
5066 \r
5067         if (ret != ERR_NO_ERROR)\r
5068         {\r
5069                 // エラーが発生した\r
5070                 CmdPrintError(c, ret);\r
5071         }\r
5072 \r
5073         CiFreeClientGetAccount(&t);\r
5074 \r
5075         // パラメータリストの解放\r
5076         FreeParamValueList(o);\r
5077 \r
5078         FreeX(x);\r
5079 \r
5080         return ret;\r
5081 }\r
5082 \r
5083 // 接続設定のサーバー固有証明書の削除\r
5084 UINT PcAccountServerCertDelete(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)\r
5085 {\r
5086         LIST *o;\r
5087         PC *pc = (PC *)param;\r
5088         UINT ret = ERR_NO_ERROR;\r
5089         RPC_CLIENT_GET_ACCOUNT t;\r
5090         // 指定できるパラメータ リスト\r
5091         PARAM args[] =\r
5092         {\r
5093                 {"[name]", CmdPrompt, _UU("CMD_AccountCreate_Prompt_Name"), CmdEvalNotEmpty, NULL},\r
5094         };\r
5095 \r
5096         // パラメータリストの取得\r
5097         o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));\r
5098         if (o == NULL)\r
5099         {\r
5100                 return ERR_INVALID_PARAMETER;\r
5101         }\r
5102 \r
5103         // RPC 呼び出し\r
5104         Zero(&t, sizeof(t));\r
5105 \r
5106         UniStrCpy(t.AccountName, sizeof(t.AccountName), GetParamUniStr(o, "[name]"));\r
5107 \r
5108         ret = CcGetAccount(pc->RemoteClient, &t);\r
5109 \r
5110         if (ret == ERR_NO_ERROR)\r
5111         {\r
5112                 RPC_CLIENT_CREATE_ACCOUNT z;\r
5113                 // 設定変更\r
5114                 if (t.ServerCert != NULL)\r
5115                 {\r
5116                         FreeX(t.ServerCert);\r
5117                 }\r
5118                 t.ServerCert = NULL;\r
5119 \r
5120                 Zero(&z, sizeof(z));\r
5121                 z.CheckServerCert = t.CheckServerCert;\r
5122                 z.ClientAuth = t.ClientAuth;\r
5123                 z.ClientOption = t.ClientOption;\r
5124                 z.ServerCert = t.ServerCert;\r
5125                 z.StartupAccount = t.StartupAccount;\r
5126 \r
5127                 ret = CcSetAccount(pc->RemoteClient, &z);\r
5128         }\r
5129 \r
5130         if (ret != ERR_NO_ERROR)\r
5131         {\r
5132                 // エラーが発生した\r
5133                 CmdPrintError(c, ret);\r
5134         }\r
5135 \r
5136         CiFreeClientGetAccount(&t);\r
5137 \r
5138         // パラメータリストの解放\r
5139         FreeParamValueList(o);\r
5140 \r
5141         return ret;\r
5142 }\r
5143 \r
5144 // 接続設定のサーバー固有証明書の取得\r
5145 UINT PcAccountServerCertGet(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)\r
5146 {\r
5147         LIST *o;\r
5148         PC *pc = (PC *)param;\r
5149         UINT ret = ERR_NO_ERROR;\r
5150         RPC_CLIENT_GET_ACCOUNT t;\r
5151         // 指定できるパラメータ リスト\r
5152         PARAM args[] =\r
5153         {\r
5154                 {"[name]", CmdPrompt, _UU("CMD_AccountCreate_Prompt_Name"), CmdEvalNotEmpty, NULL},\r
5155                 {"SAVECERT", CmdPrompt, _UU("CMD_SAVECERTPATH"), CmdEvalNotEmpty, NULL},\r
5156         };\r
5157 \r
5158         // パラメータリストの取得\r
5159         o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));\r
5160         if (o == NULL)\r
5161         {\r
5162                 return ERR_INVALID_PARAMETER;\r
5163         }\r
5164 \r
5165         // RPC 呼び出し\r
5166         Zero(&t, sizeof(t));\r
5167 \r
5168         UniStrCpy(t.AccountName, sizeof(t.AccountName), GetParamUniStr(o, "[name]"));\r
5169 \r
5170         ret = CcGetAccount(pc->RemoteClient, &t);\r
5171 \r
5172         if (ret == ERR_NO_ERROR)\r
5173         {\r
5174                 RPC_CLIENT_CREATE_ACCOUNT z;\r
5175                 // 設定変更\r
5176                 if (t.ServerCert != NULL)\r
5177                 {\r
5178                         FreeX(t.ServerCert);\r
5179                 }\r
5180                 t.ServerCert = NULL;\r
5181 \r
5182                 Zero(&z, sizeof(z));\r
5183                 z.CheckServerCert = t.CheckServerCert;\r
5184                 z.ClientAuth = t.ClientAuth;\r
5185                 z.ClientOption = t.ClientOption;\r
5186                 z.ServerCert = t.ServerCert;\r
5187                 z.StartupAccount = t.StartupAccount;\r
5188 \r
5189                 ret = CcSetAccount(pc->RemoteClient, &z);\r
5190         }\r
5191 \r
5192         if (ret != ERR_NO_ERROR)\r
5193         {\r
5194                 // エラーが発生した\r
5195                 CmdPrintError(c, ret);\r
5196         }\r
5197 \r
5198         CiFreeClientGetAccount(&t);\r
5199 \r
5200         // パラメータリストの解放\r
5201         FreeParamValueList(o);\r
5202 \r
5203         return ret;\r
5204 }\r
5205 \r
5206 // 接続設定の高度な通信設定の設定\r
5207 UINT PcAccountDetailSet(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)\r
5208 {\r
5209         LIST *o;\r
5210         PC *pc = (PC *)param;\r
5211         UINT ret = ERR_NO_ERROR;\r
5212         RPC_CLIENT_GET_ACCOUNT t;\r
5213         CMD_EVAL_MIN_MAX mm_maxtcp =\r
5214         {\r
5215                 "CMD_CascadeDetailSet_Eval_MaxTcp", 1, 32\r
5216         };\r
5217         CMD_EVAL_MIN_MAX mm_interval =\r
5218         {\r
5219                 "CMD_CascadeDetailSet_Eval_Interval", 1, 4294967295UL\r
5220         };\r
5221         // 指定できるパラメータ リスト\r
5222         PARAM args[] =\r
5223         {\r
5224                 {"[name]", CmdPrompt, _UU("CMD_AccountCreate_Prompt_Name"), CmdEvalNotEmpty, NULL},\r
5225                 {"MAXTCP", CmdPrompt, _UU("CMD_AccountDetailSet_Prompt_MaxTcp"), CmdEvalMinMax, &mm_maxtcp},\r
5226                 {"INTERVAL", CmdPrompt, _UU("CMD_AccountDetailSet_Prompt_Interval"), CmdEvalMinMax, &mm_interval},\r
5227                 {"TTL", CmdPrompt, _UU("CMD_AccountDetailSet_Prompt_TTL"), NULL, NULL},\r
5228                 {"HALF", CmdPrompt, _UU("CMD_AccountDetailSet_Prompt_HALF"), NULL, NULL},\r
5229                 {"BRIDGE", CmdPrompt, _UU("CMD_AccountDetailSet_Prompt_BRIDGE"), NULL, NULL},\r
5230                 {"MONITOR", CmdPrompt, _UU("CMD_AccountDetailSet_Prompt_MONITOR"), NULL, NULL},\r
5231                 {"NOTRACK", CmdPrompt, _UU("CMD_AccountDetailSet_Prompt_NOTRACK"), NULL, NULL},\r
5232                 {"NOQOS", CmdPrompt, _UU("CMD_AccountDetailSet_Prompt_NOQOS"), NULL, NULL},\r
5233         };\r
5234 \r
5235         // パラメータリストの取得\r
5236         o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));\r
5237         if (o == NULL)\r
5238         {\r
5239                 return ERR_INVALID_PARAMETER;\r
5240         }\r
5241 \r
5242         // RPC 呼び出し\r
5243         Zero(&t, sizeof(t));\r
5244 \r
5245         UniStrCpy(t.AccountName, sizeof(t.AccountName), GetParamUniStr(o, "[name]"));\r
5246 \r
5247         ret = CcGetAccount(pc->RemoteClient, &t);\r
5248 \r
5249         if (ret == ERR_NO_ERROR)\r
5250         {\r
5251                 RPC_CLIENT_CREATE_ACCOUNT z;\r
5252                 // データ変更\r
5253                 t.ClientOption->MaxConnection = GetParamInt(o, "MAXTCP");\r
5254                 t.ClientOption->AdditionalConnectionInterval = GetParamInt(o, "INTERVAL");\r
5255                 t.ClientOption->ConnectionDisconnectSpan = GetParamInt(o, "TTL");\r
5256                 t.ClientOption->HalfConnection = GetParamYes(o, "HALF");\r
5257                 t.ClientOption->RequireBridgeRoutingMode = GetParamYes(o, "BRIDGE");\r
5258                 t.ClientOption->RequireMonitorMode = GetParamYes(o, "MONITOR");\r
5259                 t.ClientOption->NoRoutingTracking = GetParamYes(o, "NOTRACK");\r
5260                 t.ClientOption->DisableQoS = GetParamYes(o, "NOQOS");\r
5261 \r
5262                 Zero(&z, sizeof(z));\r
5263                 z.CheckServerCert = t.CheckServerCert;\r
5264                 z.ClientAuth = t.ClientAuth;\r
5265                 z.ClientOption = t.ClientOption;\r
5266                 z.ServerCert = t.ServerCert;\r
5267                 z.StartupAccount = t.StartupAccount;\r
5268 \r
5269                 ret = CcSetAccount(pc->RemoteClient, &z);\r
5270         }\r
5271 \r
5272         if (ret != ERR_NO_ERROR)\r
5273         {\r
5274                 // エラーが発生した\r
5275                 CmdPrintError(c, ret);\r
5276         }\r
5277 \r
5278         CiFreeClientGetAccount(&t);\r
5279 \r
5280         // パラメータリストの解放\r
5281         FreeParamValueList(o);\r
5282 \r
5283         return ret;\r
5284 }\r
5285 \r
5286 // 接続設定の名前の変更\r
5287 UINT PcAccountRename(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)\r
5288 {\r
5289         LIST *o;\r
5290         PC *pc = (PC *)param;\r
5291         UINT ret = ERR_NO_ERROR;\r
5292         RPC_RENAME_ACCOUNT t;\r
5293         // 指定できるパラメータ リスト\r
5294         PARAM args[] =\r
5295         {\r
5296                 {"[name]", CmdPrompt, _UU("CMD_AccountRename_PROMPT_OLD"), CmdEvalNotEmpty, NULL},\r
5297                 {"NEW", CmdPrompt, _UU("CMD_AccountRename_PROMPT_NEW"), CmdEvalNotEmpty, NULL},\r
5298         };\r
5299 \r
5300         // パラメータリストの取得\r
5301         o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));\r
5302         if (o == NULL)\r
5303         {\r
5304                 return ERR_INVALID_PARAMETER;\r
5305         }\r
5306 \r
5307         // RPC 呼び出し\r
5308         Zero(&t, sizeof(t));\r
5309         UniStrCpy(t.NewName, sizeof(t.NewName), GetParamUniStr(o, "NEW"));\r
5310         UniStrCpy(t.OldName, sizeof(t.OldName), GetParamUniStr(o, "[name]"));\r
5311 \r
5312         ret = CcRenameAccount(pc->RemoteClient, &t);\r
5313 \r
5314         if (ret == ERR_NO_ERROR)\r
5315         {\r
5316                 // 成功\r
5317         }\r
5318 \r
5319         if (ret != ERR_NO_ERROR)\r
5320         {\r
5321                 // エラーが発生した\r
5322                 CmdPrintError(c, ret);\r
5323         }\r
5324 \r
5325         // パラメータリストの解放\r
5326         FreeParamValueList(o);\r
5327 \r
5328         return ret;\r
5329 }\r
5330 \r
5331 // 接続設定を使用して VPN Server へ接続を開始\r
5332 UINT PcAccountConnect(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)\r
5333 {\r
5334         LIST *o;\r
5335         PC *pc = (PC *)param;\r
5336         UINT ret = ERR_NO_ERROR;\r
5337         RPC_CLIENT_CONNECT t;\r
5338         // 指定できるパラメータ リスト\r
5339         PARAM args[] =\r
5340         {\r
5341                 {"[name]", CmdPrompt, _UU("CMD_AccountCreate_Prompt_Name"), CmdEvalNotEmpty, NULL},\r
5342         };\r
5343 \r
5344         // パラメータリストの取得\r
5345         o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));\r
5346         if (o == NULL)\r
5347         {\r
5348                 return ERR_INVALID_PARAMETER;\r
5349         }\r
5350 \r
5351         // RPC 呼び出し\r
5352         Zero(&t, sizeof(t));\r
5353         UniStrCpy(t.AccountName, sizeof(t.AccountName), GetParamUniStr(o, "[name]"));\r
5354 \r
5355         ret = CcConnect(pc->RemoteClient, &t);\r
5356 \r
5357         if (ret == ERR_NO_ERROR)\r
5358         {\r
5359                 // 成功\r
5360         }\r
5361 \r
5362         if (ret != ERR_NO_ERROR)\r
5363         {\r
5364                 // エラーが発生した\r
5365                 CmdPrintError(c, ret);\r
5366         }\r
5367 \r
5368         // パラメータリストの解放\r
5369         FreeParamValueList(o);\r
5370 \r
5371         return ret;\r
5372 }\r
5373 \r
5374 // 接続中の接続設定の切断\r
5375 UINT PcAccountDisconnect(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)\r
5376 {\r
5377         LIST *o;\r
5378         PC *pc = (PC *)param;\r
5379         UINT ret = ERR_NO_ERROR;\r
5380         RPC_CLIENT_CONNECT t;\r
5381         // 指定できるパラメータ リスト\r
5382         PARAM args[] =\r
5383         {\r
5384                 {"[name]", CmdPrompt, _UU("CMD_AccountCreate_Prompt_Name"), CmdEvalNotEmpty, NULL},\r
5385         };\r
5386 \r
5387         // パラメータリストの取得\r
5388         o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));\r
5389         if (o == NULL)\r
5390         {\r
5391                 return ERR_INVALID_PARAMETER;\r
5392         }\r
5393 \r
5394         // RPC 呼び出し\r
5395         Zero(&t, sizeof(t));\r
5396         UniStrCpy(t.AccountName, sizeof(t.AccountName), GetParamUniStr(o, "[name]"));\r
5397 \r
5398         ret = CcDisconnect(pc->RemoteClient, &t);\r
5399 \r
5400         if (ret == ERR_NO_ERROR)\r
5401         {\r
5402                 // 成功\r
5403         }\r
5404 \r
5405         if (ret != ERR_NO_ERROR)\r
5406         {\r
5407                 // エラーが発生した\r
5408                 CmdPrintError(c, ret);\r
5409         }\r
5410 \r
5411         // パラメータリストの解放\r
5412         FreeParamValueList(o);\r
5413 \r
5414         return ret;\r
5415 }\r
5416 \r
5417 // 接続設定の現在の状態の取得\r
5418 UINT PcAccountStatusGet(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)\r
5419 {\r
5420         LIST *o;\r
5421         PC *pc = (PC *)param;\r
5422         UINT ret = ERR_NO_ERROR;\r
5423         RPC_CLIENT_GET_CONNECTION_STATUS t;\r
5424         // 指定できるパラメータ リスト\r
5425         PARAM args[] =\r
5426         {\r
5427                 {"[name]", CmdPrompt, _UU("CMD_AccountCreate_Prompt_Name"), CmdEvalNotEmpty, NULL},\r
5428         };\r
5429 \r
5430         // パラメータリストの取得\r
5431         o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));\r
5432         if (o == NULL)\r
5433         {\r
5434                 return ERR_INVALID_PARAMETER;\r
5435         }\r
5436 \r
5437         // RPC 呼び出し\r
5438         Zero(&t, sizeof(t));\r
5439         UniStrCpy(t.AccountName, sizeof(t.AccountName), GetParamUniStr(o, "[name]"));\r
5440 \r
5441         ret = CcGetAccountStatus(pc->RemoteClient, &t);\r
5442 \r
5443         if (ret == ERR_NO_ERROR)\r
5444         {\r
5445                 if (t.Active == false)\r
5446                 {\r
5447                         // 切断されている\r
5448                         ret = ERR_ACCOUNT_INACTIVE;\r
5449                 }\r
5450                 else\r
5451                 {\r
5452                         CT *ct = CtNewStandard();\r
5453 \r
5454                         CmdPrintStatusToListView(ct, &t);\r
5455 \r
5456                         CtFree(ct, c);\r
5457                 }\r
5458         }\r
5459 \r
5460         if (ret != ERR_NO_ERROR)\r
5461         {\r
5462                 // エラーが発生した\r
5463                 CmdPrintError(c, ret);\r
5464         }\r
5465 \r
5466         CiFreeClientGetConnectionStatus(&t);\r
5467 \r
5468         // パラメータリストの解放\r
5469         FreeParamValueList(o);\r
5470 \r
5471         return ret;\r
5472 }\r
5473 \r
5474 // 接続設定で使用する仮想 LAN カードの設定\r
5475 UINT PcAccountNicSet(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)\r
5476 {\r
5477         LIST *o;\r
5478         PC *pc = (PC *)param;\r
5479         UINT ret = ERR_NO_ERROR;\r
5480         RPC_CLIENT_GET_ACCOUNT t;\r
5481         // 指定できるパラメータ リスト\r
5482         PARAM args[] =\r
5483         {\r
5484                 {"[name]", CmdPrompt, _UU("CMD_AccountCreate_Prompt_Name"), CmdEvalNotEmpty, NULL},\r
5485                 {"NICNAME", CmdPrompt, _UU("CMD_AccountCreate_Prompt_Nicname"), CmdEvalNotEmpty, NULL},\r
5486         };\r
5487 \r
5488         // パラメータリストの取得\r
5489         o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));\r
5490         if (o == NULL)\r
5491         {\r
5492                 return ERR_INVALID_PARAMETER;\r
5493         }\r
5494 \r
5495         // RPC 呼び出し\r
5496         Zero(&t, sizeof(t));\r
5497 \r
5498         Zero(&t, sizeof(t));\r
5499         UniStrCpy(t.AccountName, sizeof(t.AccountName), GetParamUniStr(o, "[name]"));\r
5500 \r
5501         ret = CcGetAccount(pc->RemoteClient, &t);\r
5502 \r
5503         if (ret == ERR_NO_ERROR)\r
5504         {\r
5505                 RPC_CLIENT_CREATE_ACCOUNT c;\r
5506                 // 成功\r
5507                 StrCpy(t.ClientOption->DeviceName, sizeof(t.ClientOption->DeviceName),\r
5508                         GetParamStr(o, "NICNAME"));\r
5509 \r
5510                 Zero(&c, sizeof(c));\r
5511 \r
5512                 c.ClientAuth = t.ClientAuth;\r
5513                 c.ClientOption = t.ClientOption;\r
5514                 c.CheckServerCert = t.CheckServerCert;\r
5515                 c.ServerCert = t.ServerCert;\r
5516                 c.StartupAccount = t.StartupAccount;\r
5517 \r
5518                 ret = CcSetAccount(pc->RemoteClient, &c);\r
5519         }\r
5520 \r
5521         if (ret != ERR_NO_ERROR)\r
5522         {\r
5523                 // エラーが発生した\r
5524                 CmdPrintError(c, ret);\r
5525         }\r
5526 \r
5527         CiFreeClientGetAccount(&t);\r
5528 \r
5529         // パラメータリストの解放\r
5530         FreeParamValueList(o);\r
5531 \r
5532         return ret;\r
5533 }\r
5534 \r
5535 // VPN Server への接続中に接続状況やエラー画面を表示するように設定\r
5536 UINT PcAccountStatusShow(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)\r
5537 {\r
5538         LIST *o;\r
5539         PC *pc = (PC *)param;\r
5540         UINT ret = ERR_NO_ERROR;\r
5541         RPC_CLIENT_GET_ACCOUNT t;\r
5542         // 指定できるパラメータ リスト\r
5543         PARAM args[] =\r
5544         {\r
5545                 {"[name]", CmdPrompt, _UU("CMD_AccountCreate_Prompt_Name"), CmdEvalNotEmpty, NULL},\r
5546         };\r
5547 \r
5548         // パラメータリストの取得\r
5549         o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));\r
5550         if (o == NULL)\r
5551         {\r
5552                 return ERR_INVALID_PARAMETER;\r
5553         }\r
5554 \r
5555         // RPC 呼び出し\r
5556         Zero(&t, sizeof(t));\r
5557 \r
5558         UniStrCpy(t.AccountName, sizeof(t.AccountName), GetParamUniStr(o, "[name]"));\r
5559 \r
5560         ret = CcGetAccount(pc->RemoteClient, &t);\r
5561 \r
5562         if (ret == ERR_NO_ERROR)\r
5563         {\r
5564                 RPC_CLIENT_CREATE_ACCOUNT z;\r
5565                 // 設定変更\r
5566                 t.ClientOption->HideStatusWindow = false;\r
5567 \r
5568                 Zero(&z, sizeof(z));\r
5569                 z.CheckServerCert = t.CheckServerCert;\r
5570                 z.ClientAuth = t.ClientAuth;\r
5571                 z.ClientOption = t.ClientOption;\r
5572                 z.ServerCert = t.ServerCert;\r
5573                 z.StartupAccount = t.StartupAccount;\r
5574 \r
5575                 ret = CcSetAccount(pc->RemoteClient, &z);\r
5576         }\r
5577 \r
5578         if (ret != ERR_NO_ERROR)\r
5579         {\r
5580                 // エラーが発生した\r
5581                 CmdPrintError(c, ret);\r
5582         }\r
5583 \r
5584         CiFreeClientGetAccount(&t);\r
5585 \r
5586         // パラメータリストの解放\r
5587         FreeParamValueList(o);\r
5588 \r
5589         return ret;\r
5590 }\r
5591 \r
5592 // VPN Server への接続中に接続状況やエラー画面を表示しないように設定\r
5593 UINT PcAccountStatusHide(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)\r
5594 {\r
5595         LIST *o;\r
5596         PC *pc = (PC *)param;\r
5597         UINT ret = ERR_NO_ERROR;\r
5598         RPC_CLIENT_GET_ACCOUNT t;\r
5599         // 指定できるパラメータ リスト\r
5600         PARAM args[] =\r
5601         {\r
5602                 {"[name]", CmdPrompt, _UU("CMD_AccountCreate_Prompt_Name"), CmdEvalNotEmpty, NULL},\r
5603         };\r
5604 \r
5605         // パラメータリストの取得\r
5606         o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));\r
5607         if (o == NULL)\r
5608         {\r
5609                 return ERR_INVALID_PARAMETER;\r
5610         }\r
5611 \r
5612         // RPC 呼び出し\r
5613         Zero(&t, sizeof(t));\r
5614 \r
5615         UniStrCpy(t.AccountName, sizeof(t.AccountName), GetParamUniStr(o, "[name]"));\r
5616 \r
5617         ret = CcGetAccount(pc->RemoteClient, &t);\r
5618 \r
5619         if (ret == ERR_NO_ERROR)\r
5620         {\r
5621                 RPC_CLIENT_CREATE_ACCOUNT z;\r
5622                 // 設定変更\r
5623                 t.ClientOption->HideStatusWindow = true;\r
5624 \r
5625                 Zero(&z, sizeof(z));\r
5626                 z.CheckServerCert = t.CheckServerCert;\r
5627                 z.ClientAuth = t.ClientAuth;\r
5628                 z.ClientOption = t.ClientOption;\r
5629                 z.ServerCert = t.ServerCert;\r
5630                 z.StartupAccount = t.StartupAccount;\r
5631 \r
5632                 ret = CcSetAccount(pc->RemoteClient, &z);\r
5633         }\r
5634 \r
5635         if (ret != ERR_NO_ERROR)\r
5636         {\r
5637                 // エラーが発生した\r
5638                 CmdPrintError(c, ret);\r
5639         }\r
5640 \r
5641         CiFreeClientGetAccount(&t);\r
5642 \r
5643         // パラメータリストの解放\r
5644         FreeParamValueList(o);\r
5645 \r
5646         return ret;\r
5647 }\r
5648 \r
5649 // 接続設定のユーザー認証の種類をスマートカード認証に設定\r
5650 UINT PcAccountSecureCertSet(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)\r
5651 {\r
5652         LIST *o;\r
5653         PC *pc = (PC *)param;\r
5654         UINT ret = ERR_NO_ERROR;\r
5655         RPC_CLIENT_GET_ACCOUNT t;\r
5656         // 指定できるパラメータ リスト\r
5657         PARAM args[] =\r
5658         {\r
5659                 {"[name]", CmdPrompt, _UU("CMD_AccountCreate_Prompt_Name"), CmdEvalNotEmpty, NULL},\r
5660                 {"CERTNAME", CmdPrompt, _UU("CMD_AccountSecureCertSet_PROMPT_CERTNAME"), CmdEvalNotEmpty, NULL},\r
5661                 {"KEYNAME", CmdPrompt, _UU("CMD_AccountSecureCertSet_PROMPT_KEYNAME"), CmdEvalNotEmpty, NULL},\r
5662         };\r
5663 \r
5664         // パラメータリストの取得\r
5665         o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));\r
5666         if (o == NULL)\r
5667         {\r
5668                 return ERR_INVALID_PARAMETER;\r
5669         }\r
5670 \r
5671         // RPC 呼び出し\r
5672         Zero(&t, sizeof(t));\r
5673 \r
5674         UniStrCpy(t.AccountName, sizeof(t.AccountName), GetParamUniStr(o, "[name]"));\r
5675 \r
5676         ret = CcGetAccount(pc->RemoteClient, &t);\r
5677 \r
5678         if (ret == ERR_NO_ERROR)\r
5679         {\r
5680                 RPC_CLIENT_CREATE_ACCOUNT z;\r
5681                 // 設定変更\r
5682                 t.ClientAuth->AuthType = CLIENT_AUTHTYPE_SECURE;\r
5683                 StrCpy(t.ClientAuth->SecurePublicCertName, sizeof(t.ClientAuth->SecurePublicCertName),\r
5684                         GetParamStr(o, "CERTNAME"));\r
5685                 StrCpy(t.ClientAuth->SecurePrivateKeyName, sizeof(t.ClientAuth->SecurePrivateKeyName),\r
5686                         GetParamStr(o, "KEYNAME"));\r
5687 \r
5688                 Zero(&z, sizeof(z));\r
5689                 z.CheckServerCert = t.CheckServerCert;\r
5690                 z.ClientAuth = t.ClientAuth;\r
5691                 z.ClientOption = t.ClientOption;\r
5692                 z.ServerCert = t.ServerCert;\r
5693                 z.StartupAccount = t.StartupAccount;\r
5694 \r
5695                 ret = CcSetAccount(pc->RemoteClient, &z);\r
5696         }\r
5697 \r
5698         if (ret != ERR_NO_ERROR)\r
5699         {\r
5700                 // エラーが発生した\r
5701                 CmdPrintError(c, ret);\r
5702         }\r
5703 \r
5704         CiFreeClientGetAccount(&t);\r
5705 \r
5706         // パラメータリストの解放\r
5707         FreeParamValueList(o);\r
5708 \r
5709         return ret;\r
5710 }\r
5711 \r
5712 // 接続設定の接続失敗または切断時の再試行回数と間隔の設定\r
5713 UINT PcAccountRetrySet(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)\r
5714 {\r
5715         LIST *o;\r
5716         PC *pc = (PC *)param;\r
5717         UINT ret = ERR_NO_ERROR;\r
5718         RPC_CLIENT_GET_ACCOUNT t;\r
5719         // 指定できるパラメータ リスト\r
5720         CMD_EVAL_MIN_MAX minmax =\r
5721         {\r
5722                 "CMD_AccountRetrySet_EVAL_INTERVAL",\r
5723                 5,\r
5724                 4294967295UL,\r
5725         };\r
5726         PARAM args[] =\r
5727         {\r
5728                 {"[name]", CmdPrompt, _UU("CMD_AccountCreate_Prompt_Name"), CmdEvalNotEmpty, NULL},\r
5729                 {"NUM", CmdPrompt, _UU("CMD_AccountRetrySet_PROMPT_NUM"), CmdEvalNotEmpty, NULL},\r
5730                 {"INTERVAL", CmdPrompt, _UU("CMD_AccountRetrySet_PROMPY_INTERVAL"), CmdEvalMinMax, &minmax},\r
5731         };\r
5732 \r
5733         // パラメータリストの取得\r
5734         o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));\r
5735         if (o == NULL)\r
5736         {\r
5737                 return ERR_INVALID_PARAMETER;\r
5738         }\r
5739 \r
5740         // RPC 呼び出し\r
5741         Zero(&t, sizeof(t));\r
5742 \r
5743         UniStrCpy(t.AccountName, sizeof(t.AccountName), GetParamUniStr(o, "[name]"));\r
5744 \r
5745         ret = CcGetAccount(pc->RemoteClient, &t);\r
5746 \r
5747         if (ret == ERR_NO_ERROR)\r
5748         {\r
5749                 RPC_CLIENT_CREATE_ACCOUNT z;\r
5750                 // 設定変更\r
5751                 UINT num = GetParamInt(o, "NUM");\r
5752                 UINT interval = GetParamInt(o, "INTERVAL");\r
5753 \r
5754                 t.ClientOption->NumRetry = (num == 999) ? INFINITE : num;\r
5755                 t.ClientOption->RetryInterval = interval;\r
5756 \r
5757                 Zero(&z, sizeof(z));\r
5758                 z.CheckServerCert = t.CheckServerCert;\r
5759                 z.ClientAuth = t.ClientAuth;\r
5760                 z.ClientOption = t.ClientOption;\r
5761                 z.ServerCert = t.ServerCert;\r
5762                 z.StartupAccount = t.StartupAccount;\r
5763 \r
5764                 ret = CcSetAccount(pc->RemoteClient, &z);\r
5765         }\r
5766 \r
5767         if (ret != ERR_NO_ERROR)\r
5768         {\r
5769                 // エラーが発生した\r
5770                 CmdPrintError(c, ret);\r
5771         }\r
5772 \r
5773         CiFreeClientGetAccount(&t);\r
5774 \r
5775         // パラメータリストの解放\r
5776         FreeParamValueList(o);\r
5777 \r
5778         return ret;\r
5779 }\r
5780 \r
5781 \r
5782 // 接続設定をスタートアップ接続に設定\r
5783 UINT PcAccountStartupSet(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)\r
5784 {\r
5785         LIST *o;\r
5786         PC *pc = (PC *)param;\r
5787         UINT ret = ERR_NO_ERROR;\r
5788         RPC_CLIENT_GET_ACCOUNT t;\r
5789         // 指定できるパラメータ リスト\r
5790         PARAM args[] =\r
5791         {\r
5792                 {"[name]", CmdPrompt, _UU("CMD_AccountCreate_Prompt_Name"), CmdEvalNotEmpty, NULL},\r
5793         };\r
5794 \r
5795         // パラメータリストの取得\r
5796         o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));\r
5797         if (o == NULL)\r
5798         {\r
5799                 return ERR_INVALID_PARAMETER;\r
5800         }\r
5801 \r
5802         // RPC 呼び出し\r
5803         Zero(&t, sizeof(t));\r
5804 \r
5805         UniStrCpy(t.AccountName, sizeof(t.AccountName), GetParamUniStr(o, "[name]"));\r
5806 \r
5807         ret = CcGetAccount(pc->RemoteClient, &t);\r
5808 \r
5809         if (ret == ERR_NO_ERROR)\r
5810         {\r
5811                 RPC_CLIENT_CREATE_ACCOUNT z;\r
5812                 // 設定変更\r
5813                 t.StartupAccount = true;\r
5814 \r
5815                 Zero(&z, sizeof(z));\r
5816                 z.CheckServerCert = t.CheckServerCert;\r
5817                 z.ClientAuth = t.ClientAuth;\r
5818                 z.ClientOption = t.ClientOption;\r
5819                 z.ServerCert = t.ServerCert;\r
5820                 z.StartupAccount = t.StartupAccount;\r
5821 \r
5822                 ret = CcSetAccount(pc->RemoteClient, &z);\r
5823         }\r
5824 \r
5825         if (ret != ERR_NO_ERROR)\r
5826         {\r
5827                 // エラーが発生した\r
5828                 CmdPrintError(c, ret);\r
5829         }\r
5830 \r
5831         CiFreeClientGetAccount(&t);\r
5832 \r
5833         // パラメータリストの解放\r
5834         FreeParamValueList(o);\r
5835 \r
5836         return ret;\r
5837 }\r
5838 \r
5839 // 接続設定のスタートアップ接続を解除\r
5840 UINT PcAccountStartupRemove(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)\r
5841 {\r
5842         LIST *o;\r
5843         PC *pc = (PC *)param;\r
5844         UINT ret = ERR_NO_ERROR;\r
5845         RPC_CLIENT_GET_ACCOUNT t;\r
5846         // 指定できるパラメータ リスト\r
5847         PARAM args[] =\r
5848         {\r
5849                 {"[name]", CmdPrompt, _UU("CMD_AccountCreate_Prompt_Name"), CmdEvalNotEmpty, NULL},\r
5850         };\r
5851 \r
5852         // パラメータリストの取得\r
5853         o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));\r
5854         if (o == NULL)\r
5855         {\r
5856                 return ERR_INVALID_PARAMETER;\r
5857         }\r
5858 \r
5859         // RPC 呼び出し\r
5860         Zero(&t, sizeof(t));\r
5861 \r
5862         UniStrCpy(t.AccountName, sizeof(t.AccountName), GetParamUniStr(o, "[name]"));\r
5863 \r
5864         ret = CcGetAccount(pc->RemoteClient, &t);\r
5865 \r
5866         if (ret == ERR_NO_ERROR)\r
5867         {\r
5868                 RPC_CLIENT_CREATE_ACCOUNT z;\r
5869                 // 設定変更\r
5870                 t.StartupAccount = false;\r
5871 \r
5872                 Zero(&z, sizeof(z));\r
5873                 z.CheckServerCert = t.CheckServerCert;\r
5874                 z.ClientAuth = t.ClientAuth;\r
5875                 z.ClientOption = t.ClientOption;\r
5876                 z.ServerCert = t.ServerCert;\r
5877                 z.StartupAccount = t.StartupAccount;\r
5878 \r
5879                 ret = CcSetAccount(pc->RemoteClient, &z);\r
5880         }\r
5881 \r
5882         if (ret != ERR_NO_ERROR)\r
5883         {\r
5884                 // エラーが発生した\r
5885                 CmdPrintError(c, ret);\r
5886         }\r
5887 \r
5888         CiFreeClientGetAccount(&t);\r
5889 \r
5890         // パラメータリストの解放\r
5891         FreeParamValueList(o);\r
5892 \r
5893         return ret;\r
5894 }\r
5895 \r
5896 // 接続設定のエクスポート\r
5897 UINT PcAccountExport(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)\r
5898 {\r
5899         LIST *o;\r
5900         PC *pc = (PC *)param;\r
5901         UINT ret = ERR_NO_ERROR;\r
5902         RPC_CLIENT_GET_ACCOUNT t;\r
5903         // 指定できるパラメータ リスト\r
5904         PARAM args[] =\r
5905         {\r
5906                 {"[name]", CmdPrompt, _UU("CMD_AccountCreate_Prompt_Name"), CmdEvalNotEmpty, NULL},\r
5907                 {"SAVEPATH", CmdPrompt, _UU("CMD_AccountExport_PROMPT_SAVEPATH"), CmdEvalNotEmpty, NULL},\r
5908         };\r
5909 \r
5910         // パラメータリストの取得\r
5911         o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));\r
5912         if (o == NULL)\r
5913         {\r
5914                 return ERR_INVALID_PARAMETER;\r
5915         }\r
5916 \r
5917         // RPC 呼び出し\r
5918         Zero(&t, sizeof(t));\r
5919 \r
5920         UniStrCpy(t.AccountName, sizeof(t.AccountName), GetParamUniStr(o, "[name]"));\r
5921 \r
5922         ret = CcGetAccount(pc->RemoteClient, &t);\r
5923 \r
5924         if (ret == ERR_NO_ERROR)\r
5925         {\r
5926                 RPC_CLIENT_CREATE_ACCOUNT z;\r
5927                 BUF *b;\r
5928                 BUF *b2;\r
5929                 char tmp[MAX_SIZE];\r
5930                 UCHAR *buf;\r
5931                 UINT buf_size;\r
5932                 UCHAR bom[] = {0xef, 0xbb, 0xbf, };\r
5933 \r
5934                 Zero(&z, sizeof(z));\r
5935                 z.CheckServerCert = t.CheckServerCert;\r
5936                 z.ClientAuth = t.ClientAuth;\r
5937                 z.ClientOption = t.ClientOption;\r
5938                 z.ServerCert = t.ServerCert;\r
5939                 z.StartupAccount = t.StartupAccount;\r
5940 \r
5941                 b = CiAccountToCfg(&z);\r
5942 \r
5943                 StrCpy(tmp, sizeof(tmp), GetParamStr(o, "SAVEPATH"));\r
5944                 b2 = NewBuf();\r
5945 \r
5946                 WriteBuf(b2, bom, sizeof(bom));\r
5947 \r
5948                 // ヘッダ部分を付加する\r
5949                 buf_size = CalcUniToUtf8(_UU("CM_ACCOUNT_FILE_BANNER"));\r
5950                 buf = ZeroMalloc(buf_size + 32);\r
5951                 UniToUtf8(buf, buf_size, _UU("CM_ACCOUNT_FILE_BANNER"));\r
5952 \r
5953                 WriteBuf(b2, buf, StrLen((char *)buf));\r
5954                 WriteBuf(b2, b->Buf, b->Size);\r
5955                 SeekBuf(b2, 0, 0);\r
5956 \r
5957                 FreeBuf(b);\r
5958 \r
5959                 if (DumpBuf(b2, tmp) == false)\r
5960                 {\r
5961                         c->Write(c, _UU("CMD_SAVEFILE_FAILED"));\r
5962                         ret = ERR_INTERNAL_ERROR;\r
5963                 }\r
5964 \r
5965                 FreeBuf(b2);\r
5966                 Free(buf);\r
5967         }\r
5968 \r
5969         if (ret != ERR_NO_ERROR)\r
5970         {\r
5971                 // エラーが発生した\r
5972                 CmdPrintError(c, ret);\r
5973         }\r
5974 \r
5975         CiFreeClientGetAccount(&t);\r
5976 \r
5977         // パラメータリストの解放\r
5978         FreeParamValueList(o);\r
5979 \r
5980         return ret;\r
5981 }\r
5982 \r
5983 // 指定されたアカウント名が存在するかチェックする\r
5984 bool CmdIsAccountName(REMOTE_CLIENT *r, wchar_t *name)\r
5985 {\r
5986         UINT i;\r
5987         RPC_CLIENT_ENUM_ACCOUNT t;\r
5988         wchar_t tmp[MAX_SIZE];\r
5989         bool b = false;\r
5990         // 引数チェック\r
5991         if (r == NULL || name == NULL)\r
5992         {\r
5993                 return false;\r
5994         }\r
5995 \r
5996         if (CcEnumAccount(r, &t) != ERR_NO_ERROR)\r
5997         {\r
5998                 return false;\r
5999         }\r
6000 \r
6001         UniStrCpy(tmp, sizeof(tmp), name);\r
6002         UniTrim(tmp);\r
6003 \r
6004         for (i = 0;i < t.NumItem;i++)\r
6005         {\r
6006                 if (UniStrCmpi(t.Items[i]->AccountName, tmp) == 0)\r
6007                 {\r
6008                         b = true;\r
6009                         break;\r
6010                 }\r
6011         }\r
6012 \r
6013         CiFreeClientEnumAccount(&t);\r
6014 \r
6015         return b;\r
6016 }\r
6017 \r
6018 // インポート名の生成\r
6019 void CmdGenerateImportName(REMOTE_CLIENT *r, wchar_t *name, UINT size, wchar_t *old_name)\r
6020 {\r
6021         UINT i;\r
6022         // 引数チェック\r
6023         if (r == NULL || name == NULL || old_name == NULL)\r
6024         {\r
6025                 return;\r
6026         }\r
6027 \r
6028         for (i = 1;;i++)\r
6029         {\r
6030                 wchar_t tmp[MAX_SIZE];\r
6031                 if (i == 1)\r
6032                 {\r
6033                         UniFormat(tmp, sizeof(tmp), _UU("CM_IMPORT_NAME_1"), old_name);\r
6034                 }\r
6035                 else\r
6036                 {\r
6037                         UniFormat(tmp, sizeof(tmp), _UU("CM_IMPORT_NAME_2"), old_name, i);\r
6038                 }\r
6039 \r
6040                 if (CmdIsAccountName(r, tmp) == false)\r
6041                 {\r
6042                         UniStrCpy(name, size, tmp);\r
6043                         return;\r
6044                 }\r
6045         }\r
6046 }\r
6047 \r
6048 // 接続設定のインポート\r
6049 UINT PcAccountImport(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)\r
6050 {\r
6051         LIST *o;\r
6052         PC *pc = (PC *)param;\r
6053         UINT ret = ERR_NO_ERROR;\r
6054         BUF *b;\r
6055         wchar_t name[MAX_SIZE];\r
6056         // 指定できるパラメータ リスト\r
6057         PARAM args[] =\r
6058         {\r
6059                 {"[path]", CmdPrompt, _UU("CMD_AccountImport_PROMPT_PATH"), CmdEvalIsFile, NULL},\r
6060         };\r
6061 \r
6062         // パラメータリストの取得\r
6063         o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));\r
6064         if (o == NULL)\r
6065         {\r
6066                 return ERR_INVALID_PARAMETER;\r
6067         }\r
6068 \r
6069         // ファイルを読み込む\r
6070         b = ReadDump(GetParamStr(o, "[path]"));\r
6071 \r
6072         if (b == NULL)\r
6073         {\r
6074                 // 読み込み失敗\r
6075                 c->Write(c, _UU("CMD_LOADFILE_FAILED"));\r
6076                 ret = ERR_INTERNAL_ERROR;\r
6077         }\r
6078         else\r
6079         {\r
6080                 RPC_CLIENT_CREATE_ACCOUNT *t;\r
6081 \r
6082                 t = CiCfgToAccount(b);\r
6083 \r
6084                 if (t == NULL)\r
6085                 {\r
6086                         // パースに失敗\r
6087                         c->Write(c, _UU("CMD_AccountImport_FAILED_PARSE"));\r
6088                         ret = ERR_INTERNAL_ERROR;\r
6089                 }\r
6090                 else\r
6091                 {\r
6092                         CmdGenerateImportName(pc->RemoteClient, name, sizeof(name), t->ClientOption->AccountName);\r
6093                         UniStrCpy(t->ClientOption->AccountName, sizeof(t->ClientOption->AccountName), name);\r
6094 \r
6095                         ret = CcCreateAccount(pc->RemoteClient, t);\r
6096 \r
6097                         if (ret == ERR_NO_ERROR)\r
6098                         {\r
6099                                 wchar_t tmp[MAX_SIZE];\r
6100 \r
6101                                 UniFormat(tmp, sizeof(tmp), _UU("CMD_AccountImport_OK"), name);\r
6102                                 c->Write(c, tmp);\r
6103                         }\r
6104 \r
6105                         CiFreeClientCreateAccount(t);\r
6106                         Free(t);\r
6107                 }\r
6108 \r
6109                 FreeBuf(b);\r
6110         }\r
6111 \r
6112         if (ret != ERR_NO_ERROR)\r
6113         {\r
6114                 // エラーが発生した\r
6115                 CmdPrintError(c, ret);\r
6116         }\r
6117 \r
6118         // パラメータリストの解放\r
6119         FreeParamValueList(o);\r
6120 \r
6121         return ret;\r
6122 }\r
6123 \r
6124 // VPN Client サービスのリモート管理の許可\r
6125 UINT PcRemoteEnable(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)\r
6126 {\r
6127         LIST *o;\r
6128         PC *pc = (PC *)param;\r
6129         UINT ret = ERR_NO_ERROR;\r
6130         CLIENT_CONFIG t;\r
6131 \r
6132         // パラメータリストの取得\r
6133         o = ParseCommandList(c, cmd_name, str, NULL, 0);\r
6134         if (o == NULL)\r
6135         {\r
6136                 return ERR_INVALID_PARAMETER;\r
6137         }\r
6138 \r
6139         // RPC 呼び出し\r
6140         Zero(&t, sizeof(t));\r
6141 \r
6142         ret = CcGetClientConfig(pc->RemoteClient, &t);\r
6143 \r
6144         if (ret == ERR_NO_ERROR)\r
6145         {\r
6146                 t.AllowRemoteConfig = true;\r
6147                 ret = CcSetClientConfig(pc->RemoteClient, &t);\r
6148         }\r
6149 \r
6150         if (ret == ERR_NO_ERROR)\r
6151         {\r
6152                 // 成功\r
6153         }\r
6154 \r
6155         if (ret != ERR_NO_ERROR)\r
6156         {\r
6157                 // エラーが発生した\r
6158                 CmdPrintError(c, ret);\r
6159         }\r
6160 \r
6161         // パラメータリストの解放\r
6162         FreeParamValueList(o);\r
6163 \r
6164         return ret;\r
6165 }\r
6166 \r
6167 // VPN Client サービスのリモート管理の禁止\r
6168 UINT PcRemoteDisable(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)\r
6169 {\r
6170         LIST *o;\r
6171         PC *pc = (PC *)param;\r
6172         UINT ret = ERR_NO_ERROR;\r
6173         CLIENT_CONFIG t;\r
6174 \r
6175         // パラメータリストの取得\r
6176         o = ParseCommandList(c, cmd_name, str, NULL, 0);\r
6177         if (o == NULL)\r
6178         {\r
6179                 return ERR_INVALID_PARAMETER;\r
6180         }\r
6181 \r
6182         // RPC 呼び出し\r
6183         Zero(&t, sizeof(t));\r
6184 \r
6185         ret = CcGetClientConfig(pc->RemoteClient, &t);\r
6186 \r
6187         if (ret == ERR_NO_ERROR)\r
6188         {\r
6189                 t.AllowRemoteConfig = false;\r
6190                 ret = CcSetClientConfig(pc->RemoteClient, &t);\r
6191         }\r
6192 \r
6193         if (ret == ERR_NO_ERROR)\r
6194         {\r
6195                 // 成功\r
6196         }\r
6197 \r
6198         if (ret != ERR_NO_ERROR)\r
6199         {\r
6200                 // エラーが発生した\r
6201                 CmdPrintError(c, ret);\r
6202         }\r
6203 \r
6204         // パラメータリストの解放\r
6205         FreeParamValueList(o);\r
6206 \r
6207         return ret;\r
6208 }\r
6209 \r
6210 // インターネット接続の維持機能の有効化\r
6211 UINT PcKeepEnable(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)\r
6212 {\r
6213         LIST *o;\r
6214         PC *pc = (PC *)param;\r
6215         UINT ret = ERR_NO_ERROR;\r
6216         CLIENT_CONFIG t;\r
6217 \r
6218         // パラメータリストの取得\r
6219         o = ParseCommandList(c, cmd_name, str, NULL, 0);\r
6220         if (o == NULL)\r
6221         {\r
6222                 return ERR_INVALID_PARAMETER;\r
6223         }\r
6224 \r
6225         // RPC 呼び出し\r
6226         Zero(&t, sizeof(t));\r
6227 \r
6228         ret = CcGetClientConfig(pc->RemoteClient, &t);\r
6229 \r
6230         if (ret == ERR_NO_ERROR)\r
6231         {\r
6232                 // 設定変更\r
6233                 t.UseKeepConnect = true;\r
6234                 ret = CcSetClientConfig(pc->RemoteClient, &t);\r
6235         }\r
6236 \r
6237         if (ret == ERR_NO_ERROR)\r
6238         {\r
6239                 // 成功\r
6240         }\r
6241 \r
6242         if (ret != ERR_NO_ERROR)\r
6243         {\r
6244                 // エラーが発生した\r
6245                 CmdPrintError(c, ret);\r
6246         }\r
6247 \r
6248         // パラメータリストの解放\r
6249         FreeParamValueList(o);\r
6250 \r
6251         return ret;\r
6252 }\r
6253 \r
6254 // インターネット接続の維持機能の無効化\r
6255 UINT PcKeepDisable(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)\r
6256 {\r
6257         LIST *o;\r
6258         PC *pc = (PC *)param;\r
6259         UINT ret = ERR_NO_ERROR;\r
6260         CLIENT_CONFIG t;\r
6261 \r
6262         // パラメータリストの取得\r
6263         o = ParseCommandList(c, cmd_name, str, NULL, 0);\r
6264         if (o == NULL)\r
6265         {\r
6266                 return ERR_INVALID_PARAMETER;\r
6267         }\r
6268 \r
6269         // RPC 呼び出し\r
6270         Zero(&t, sizeof(t));\r
6271 \r
6272         ret = CcGetClientConfig(pc->RemoteClient, &t);\r
6273 \r
6274         if (ret == ERR_NO_ERROR)\r
6275         {\r
6276                 // 設定変更\r
6277                 t.UseKeepConnect = false;\r
6278                 ret = CcSetClientConfig(pc->RemoteClient, &t);\r
6279         }\r
6280 \r
6281         if (ret == ERR_NO_ERROR)\r
6282         {\r
6283                 // 成功\r
6284         }\r
6285 \r
6286         if (ret != ERR_NO_ERROR)\r
6287         {\r
6288                 // エラーが発生した\r
6289                 CmdPrintError(c, ret);\r
6290         }\r
6291 \r
6292         // パラメータリストの解放\r
6293         FreeParamValueList(o);\r
6294 \r
6295         return ret;\r
6296 }\r
6297 \r
6298 // インターネット接続の維持機能の設定\r
6299 UINT PcKeepSet(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)\r
6300 {\r
6301         LIST *o;\r
6302         PC *pc = (PC *)param;\r
6303         UINT ret = ERR_NO_ERROR;\r
6304         CLIENT_CONFIG t;\r
6305         char *host;\r
6306         UINT port;\r
6307         // 指定できるパラメータ リスト\r
6308         PARAM args[] =\r
6309         {\r
6310                 // "name", prompt_proc, prompt_param, eval_proc, eval_param\r
6311                 {"HOST", CmdPrompt, _UU("CMD_KeepSet_PROMPT_HOST"), CmdEvalHostAndPort, NULL},\r
6312                 {"PROTOCOL", CmdPrompt, _UU("CMD_KeepSet_PROMPT_PROTOCOL"), CmdEvalTcpOrUdp, NULL},\r
6313                 {"INTERVAL", CmdPrompt, _UU("CMD_KeepSet_PROMPT_INTERVAL"), NULL, NULL},\r
6314         };\r
6315 \r
6316         o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));\r
6317         if (o == NULL)\r
6318         {\r
6319                 return ERR_INVALID_PARAMETER;\r
6320         }\r
6321 \r
6322         // RPC 呼び出し\r
6323         Zero(&t, sizeof(t));\r
6324 \r
6325         ret = CcGetClientConfig(pc->RemoteClient, &t);\r
6326 \r
6327         if (ret == ERR_NO_ERROR)\r
6328         {\r
6329                 if (ParseHostPort(GetParamStr(o, "HOST"), &host, &port, 0))\r
6330                 {\r
6331                         StrCpy(t.KeepConnectHost, sizeof(t.KeepConnectHost), host);\r
6332                         t.KeepConnectPort = port;\r
6333                         t.KeepConnectInterval = GetParamInt(o, "INTERVAL");\r
6334                         t.KeepConnectProtocol = (StrCmpi(GetParamStr(o, "PROTOCOL"), "tcp") == 0) ? 0 : 1;\r
6335                         Free(host);\r
6336 \r
6337                         ret = CcSetClientConfig(pc->RemoteClient, &t);\r
6338                 }\r
6339         }\r
6340 \r
6341         if (ret != ERR_NO_ERROR)\r
6342         {\r
6343                 // エラーが発生した\r
6344                 CmdPrintError(c, ret);\r
6345         }\r
6346 \r
6347         // パラメータリストの解放\r
6348         FreeParamValueList(o);\r
6349 \r
6350         return ret;\r
6351 }\r
6352 \r
6353 // インターネット接続の維持機能の取得\r
6354 UINT PcKeepGet(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)\r
6355 {\r
6356         LIST *o;\r
6357         PC *pc = (PC *)param;\r
6358         UINT ret = ERR_NO_ERROR;\r
6359         CLIENT_CONFIG t;\r
6360 \r
6361         o = ParseCommandList(c, cmd_name, str, NULL, 0);\r
6362         if (o == NULL)\r
6363         {\r
6364                 return ERR_INVALID_PARAMETER;\r
6365         }\r
6366 \r
6367         // RPC 呼び出し\r
6368         Zero(&t, sizeof(t));\r
6369 \r
6370         ret = CcGetClientConfig(pc->RemoteClient, &t);\r
6371 \r
6372         if (ret == ERR_NO_ERROR)\r
6373         {\r
6374                 wchar_t tmp[MAX_SIZE];\r
6375                 CT *ct = CtNewStandard();\r
6376 \r
6377                 StrToUni(tmp, sizeof(tmp), t.KeepConnectHost);\r
6378                 CtInsert(ct, _UU("CMD_KeepGet_COLUMN_1"), tmp);\r
6379 \r
6380                 UniToStru(tmp, t.KeepConnectPort);\r
6381                 CtInsert(ct, _UU("CMD_KeepGet_COLUMN_2"), tmp);\r
6382 \r
6383                 UniToStru(tmp, t.KeepConnectInterval);\r
6384                 CtInsert(ct, _UU("CMD_KeepGet_COLUMN_3"), tmp);\r
6385 \r
6386                 CtInsert(ct, _UU("CMD_KeepGet_COLUMN_4"),\r
6387                         t.KeepConnectProtocol == 0 ? L"TCP/IP" : L"UDP/IP");\r
6388 \r
6389                 CtInsert(ct, _UU("CMD_KeepGet_COLUMN_5"),\r
6390                         t.UseKeepConnect ? _UU("SM_ACCESS_ENABLE") : _UU("SM_ACCESS_DISABLE"));\r
6391 \r
6392                 CtFree(ct, c);\r
6393         }\r
6394 \r
6395         if (ret != ERR_NO_ERROR)\r
6396         {\r
6397                 // エラーが発生した\r
6398                 CmdPrintError(c, ret);\r
6399         }\r
6400 \r
6401         // パラメータリストの解放\r
6402         FreeParamValueList(o);\r
6403 \r
6404         return ret;\r
6405 }\r
6406 \r
6407 \r
6408 // 新しいクライアント管理ツールコンテキストの作成\r
6409 PC *NewPc(CONSOLE *c, REMOTE_CLIENT *remote_client, char *servername, wchar_t *cmdline)\r
6410 {\r
6411         PC *pc;\r
6412         // 引数チェック\r
6413         if (c == NULL || remote_client == NULL || servername == NULL)\r
6414         {\r
6415                 return NULL;\r
6416         }\r
6417         if (UniIsEmptyStr(cmdline))\r
6418         {\r
6419                 cmdline = NULL;\r
6420         }\r
6421 \r
6422         pc = ZeroMalloc(sizeof(PC));\r
6423         pc->ConsoleForServer = false;\r
6424         pc->ServerName = CopyStr(servername);\r
6425         pc->Console = c;\r
6426         pc->LastError = 0;\r
6427         pc->RemoteClient = remote_client;\r
6428         pc->CmdLine = CopyUniStr(cmdline);\r
6429 \r
6430         return pc;\r
6431 }\r
6432 \r
6433 // クライアント管理ツールコンテキストの解放\r
6434 void FreePc(PC *pc)\r
6435 {\r
6436         // 引数チェック\r
6437         if (pc == NULL)\r
6438         {\r
6439                 return;\r
6440         }\r
6441 \r
6442         Free(pc->ServerName);\r
6443         Free(pc->CmdLine);\r
6444         Free(pc);\r
6445 }\r
6446 \r
6447 // クライアント管理ツール\r
6448 UINT PcConnect(CONSOLE *c, char *target, wchar_t *cmdline, char *password)\r
6449 {\r
6450         CEDAR *cedar;\r
6451         REMOTE_CLIENT *client;\r
6452         bool bad_pass;\r
6453         bool no_remote;\r
6454         char pass[MAX_SIZE];\r
6455         UINT ret = 0;\r
6456         // 引数チェック\r
6457         if (c == NULL || target == NULL)\r
6458         {\r
6459                 return ERR_INTERNAL_ERROR;\r
6460         }\r
6461 \r
6462         StrCpy(pass, sizeof(pass), password);\r
6463 \r
6464         cedar = NewCedar(NULL, NULL);\r
6465 \r
6466 RETRY:\r
6467         client = CcConnectRpc(target, pass, &bad_pass, &no_remote, 0);\r
6468 \r
6469         if (client == NULL)\r
6470         {\r
6471                 if (no_remote)\r
6472                 {\r
6473                         // リモート接続拒否\r
6474                         c->Write(c, _UU("CMD_UTVPNCMD_CLIENT_NO_REMODE"));\r
6475                         ReleaseCedar(cedar);\r
6476                         return ERR_INTERNAL_ERROR;\r
6477                 }\r
6478                 else if (bad_pass)\r
6479                 {\r
6480                         char *tmp;\r
6481                         // パスワード違い\r
6482                         c->Write(c, _UU("CMD_UTVPNCMD_PASSWORD_1"));\r
6483                         tmp = c->ReadPassword(c, _UU("CMD_UTVPNCMD_PASSWORD_2"));\r
6484                         c->Write(c, L"");\r
6485 \r
6486                         if (tmp == NULL)\r
6487                         {\r
6488                                 // キャンセル\r
6489                                 ReleaseCedar(cedar);\r
6490                                 return ERR_ACCESS_DENIED;\r
6491                         }\r
6492                         else\r
6493                         {\r
6494                                 StrCpy(pass, sizeof(pass), tmp);\r
6495                                 Free(tmp);\r
6496                         }\r
6497 \r
6498                         goto RETRY;\r
6499                 }\r
6500                 else\r
6501                 {\r
6502                         // 接続失敗\r
6503                         CmdPrintError(c, ERR_CONNECT_FAILED);\r
6504                         ReleaseCedar(cedar);\r
6505                         return ERR_CONNECT_FAILED;\r
6506                 }\r
6507         }\r
6508         else\r
6509         {\r
6510                 // 接続完了\r
6511                 PC *pc = NewPc(c, client, target, cmdline);\r
6512                 PcMain(pc);\r
6513                 ret = pc->LastError;\r
6514                 FreePc(pc);\r
6515         }\r
6516 \r
6517         CcDisconnectRpc(client);\r
6518 \r
6519         ReleaseCedar(cedar);\r
6520 \r
6521         return ret;\r
6522 }\r
6523 \r
6524 \r
6525 // サーバー管理ツールプロセッサメイン\r
6526 void PsMain(PS *ps)\r
6527 {\r
6528         char prompt[MAX_SIZE];\r
6529         wchar_t tmp[MAX_SIZE];\r
6530         // 引数チェック\r
6531         if (ps == NULL)\r
6532         {\r
6533                 return;\r
6534         }\r
6535 \r
6536         // CSV モードでなければ、接続が完了したメッセージを表示する\r
6537         if(ps->Console->ConsoleType != CONSOLE_CSV)\r
6538         {\r
6539                 UniFormat(tmp, sizeof(tmp), _UU("CMD_UTVPNCMD_SERVER_CONNECTED"),\r
6540                         ps->ServerName, ps->ServerPort);\r
6541                 ps->Console->Write(ps->Console, tmp);\r
6542                 ps->Console->Write(ps->Console, L"");\r
6543 \r
6544                 if (ps->HubName == NULL)\r
6545                 {\r
6546                         // サーバー管理モード\r
6547                         ps->Console->Write(ps->Console, _UU("CMD_UTVPNCMD_SERVER_CONNECTED_1"));\r
6548                 }\r
6549                 else\r
6550                 {\r
6551                         // 仮想 HUB 管理モード\r
6552                         UniFormat(tmp, sizeof(tmp), _UU("CMD_UTVPNCMD_SERVER_CONNECTED_2"),\r
6553                                 ps->HubName);\r
6554                         ps->Console->Write(ps->Console, tmp);\r
6555                 }\r
6556                 ps->Console->Write(ps->Console, L"");\r
6557         }\r
6558 \r
6559         // Caps を取得\r
6560         ps->CapsList = ScGetCapsEx(ps->Rpc);\r
6561 \r
6562         if (ps->AdminHub != NULL)\r
6563         {\r
6564                 RPC_HUB_STATUS t;\r
6565                 UINT ret;\r
6566                 wchar_t tmp[MAX_SIZE];\r
6567 \r
6568                 // ADMINHUB で指定された仮想 HUB を選択する\r
6569                 Zero(&t, sizeof(t));\r
6570 \r
6571                 StrCpy(t.HubName, sizeof(t.HubName), ps->AdminHub);\r
6572 \r
6573                 ret = ScGetHubStatus(ps->Rpc, &t);\r
6574                 if (ret == ERR_NO_ERROR)\r
6575                 {\r
6576                         // 成功\r
6577                         UniFormat(tmp, sizeof(tmp), _UU("CMD_Hub_Selected"), t.HubName);\r
6578 \r
6579                         if (ps->HubName != NULL)\r
6580                         {\r
6581                                 Free(ps->HubName);\r
6582                         }\r
6583                         ps->HubName = CopyStr(t.HubName);\r
6584 \r
6585                         if( ps->Console->ConsoleType != CONSOLE_CSV)\r
6586                         {\r
6587                                 ps->Console->Write(ps->Console, tmp);\r
6588                         }\r
6589                 }\r
6590                 else\r
6591                 {\r
6592                         // 失敗\r
6593                         UniFormat(tmp, sizeof(tmp), _UU("CMD_Hub_Select_Failed"), ps->AdminHub);\r
6594 \r
6595                         ps->Console->Write(ps->Console, tmp);\r
6596                         CmdPrintError(ps->Console, ret);\r
6597                 }\r
6598         }\r
6599 \r
6600         while (true)\r
6601         {\r
6602                 // コマンドの定義\r
6603                 CMD cmd[] =\r
6604                 {\r
6605                         {"About", PsAbout},\r
6606                         {"Check", PtCheck},\r
6607                         {"Crash", PsCrash},\r
6608                         {"Flush", PsFlush},\r
6609                         {"Debug", PsDebug},\r
6610                         {"ServerInfoGet", PsServerInfoGet},\r
6611                         {"ServerStatusGet", PsServerStatusGet},\r
6612                         {"ListenerCreate", PsListenerCreate},\r
6613                         {"ListenerDelete", PsListenerDelete},\r
6614                         {"ListenerList", PsListenerList},\r
6615                         {"ListenerEnable", PsListenerEnable},\r
6616                         {"ListenerDisable", PsListenerDisable},\r
6617                         {"ServerPasswordSet", PsServerPasswordSet},\r
6618                         {"ClusterSettingGet", PsClusterSettingGet},\r
6619                         {"ClusterSettingStandalone", PsClusterSettingStandalone},\r
6620                         {"ClusterSettingController", PsClusterSettingController},\r
6621                         {"ClusterSettingMember", PsClusterSettingMember},\r
6622                         {"ClusterMemberList", PsClusterMemberList},\r
6623                         {"ClusterMemberInfoGet", PsClusterMemberInfoGet},\r
6624                         {"ClusterMemberCertGet", PsClusterMemberCertGet},\r
6625                         {"ClusterConnectionStatusGet", PsClusterConnectionStatusGet},\r
6626                         {"ServerCertGet", PsServerCertGet},\r
6627                         {"ServerKeyGet", PsServerKeyGet},\r
6628                         {"ServerCertSet", PsServerCertSet},\r
6629                         {"ServerCipherGet", PsServerCipherGet},\r
6630                         {"ServerCipherSet", PsServerCipherSet},\r
6631                         {"KeepEnable", PsKeepEnable},\r
6632                         {"KeepDisable", PsKeepDisable},\r
6633                         {"KeepSet", PsKeepSet},\r
6634                         {"KeepGet", PsKeepGet},\r
6635                         {"SyslogGet", PsSyslogGet},\r
6636                         {"SyslogDisable", PsSyslogDisable},\r
6637                         {"SyslogEnable", PsSyslogEnable},\r
6638                         {"ConnectionList", PsConnectionList},\r
6639                         {"ConnectionGet", PsConnectionGet},\r
6640                         {"ConnectionDisconnect", PsConnectionDisconnect},\r
6641                         {"BridgeDeviceList", PsBridgeDeviceList},\r
6642                         {"BridgeList", PsBridgeList},\r
6643                         {"BridgeCreate", PsBridgeCreate},\r
6644                         {"BridgeDelete", PsBridgeDelete},\r
6645                         {"Caps", PsCaps},\r
6646                         {"Reboot", PsReboot},\r
6647                         {"ConfigGet", PsConfigGet},\r
6648                         {"ConfigSet", PsConfigSet},\r
6649                         {"RouterList", PsRouterList},\r
6650                         {"RouterAdd", PsRouterAdd},\r
6651                         {"RouterDelete", PsRouterDelete},\r
6652                         {"RouterStart", PsRouterStart},\r
6653                         {"RouterStop", PsRouterStop},\r
6654                         {"RouterIfList", PsRouterIfList},\r
6655                         {"RouterIfAdd", PsRouterIfAdd},\r
6656                         {"RouterIfDel", PsRouterIfDel},\r
6657                         {"RouterTableList", PsRouterTableList},\r
6658                         {"RouterTableAdd", PsRouterTableAdd},\r
6659                         {"RouterTableDel", PsRouterTableDel},\r
6660                         {"LogFileList", PsLogFileList},\r
6661                         {"LogFileGet", PsLogFileGet},\r
6662                         {"HubCreate", PsHubCreate},\r
6663                         {"HubCreateDynamic", PsHubCreateDynamic},\r
6664                         {"HubCreateStatic", PsHubCreateStatic},\r
6665                         {"HubDelete", PsHubDelete},\r
6666                         {"HubSetStatic", PsHubSetStatic},\r
6667                         {"HubSetDynamic", PsHubSetDynamic},\r
6668                         {"HubList", PsHubList},\r
6669                         {"Hub", PsHub},\r
6670                         {"Online", PsOnline},\r
6671                         {"Offline", PsOffline},\r
6672                         {"SetMaxSession", PsSetMaxSession},\r
6673                         {"SetHubPassword", PsSetHubPassword},\r
6674                         {"SetEnumAllow", PsSetEnumAllow},\r
6675                         {"SetEnumDeny", PsSetEnumDeny},\r
6676                         {"OptionsGet", PsOptionsGet},\r
6677                         {"RadiusServerSet", PsRadiusServerSet},\r
6678                         {"RadiusServerDelete", PsRadiusServerDelete},\r
6679                         {"RadiusServerGet", PsRadiusServerGet},\r
6680                         {"StatusGet", PsStatusGet},\r
6681                         {"LogGet", PsLogGet},\r
6682                         {"LogEnable", PsLogEnable},\r
6683                         {"LogDisable", PsLogDisable},\r
6684                         {"LogSwitchSet", PsLogSwitchSet},\r
6685                         {"LogPacketSaveType", PsLogPacketSaveType},\r
6686                         {"CAList", PsCAList},\r
6687                         {"CAAdd", PsCAAdd},\r
6688                         {"CADelete", PsCADelete},\r
6689                         {"CAGet", PsCAGet},\r
6690                         {"CascadeList", PsCascadeList},\r
6691                         {"CascadeCreate", PsCascadeCreate},\r
6692                         {"CascadeSet", PsCascadeSet},\r
6693                         {"CascadeGet", PsCascadeGet},\r
6694                         {"CascadeDelete", PsCascadeDelete},\r
6695                         {"CascadeUsernameSet", PsCascadeUsernameSet},\r
6696                         {"CascadeAnonymousSet", PsCascadeAnonymousSet},\r
6697                         {"CascadePasswordSet", PsCascadePasswordSet},\r
6698                         {"CascadeCertSet", PsCascadeCertSet},\r
6699                         {"CascadeCertGet", PsCascadeCertGet},\r
6700                         {"CascadeEncryptEnable", PsCascadeEncryptEnable},\r
6701                         {"CascadeEncryptDisable", PsCascadeEncryptDisable},\r
6702                         {"CascadeCompressEnable", PsCascadeCompressEnable},\r
6703                         {"CascadeCompressDisable", PsCascadeCompressDisable},\r
6704                         {"CascadeProxyNone", PsCascadeProxyNone},\r
6705                         {"CascadeProxyHttp", PsCascadeProxyHttp},\r
6706                         {"CascadeProxySocks", PsCascadeProxySocks},\r
6707                         {"CascadeServerCertEnable", PsCascadeServerCertEnable},\r
6708                         {"CascadeServerCertDisable", PsCascadeServerCertDisable},\r
6709                         {"CascadeServerCertSet", PsCascadeServerCertSet},\r
6710                         {"CascadeServerCertDelete", PsCascadeServerCertDelete},\r
6711                         {"CascadeServerCertGet", PsCascadeServerCertGet},\r
6712                         {"CascadeDetailSet", PsCascadeDetailSet},\r
6713                         {"CascadePolicySet", PsCascadePolicySet},\r
6714                         {"PolicyList", PsPolicyList},\r
6715                         {"CascadeStatusGet", PsCascadeStatusGet},\r
6716                         {"CascadeRename", PsCascadeRename},\r
6717                         {"CascadeOnline", PsCascadeOnline},\r
6718                         {"CascadeOffline", PsCascadeOffline},\r
6719                         {"AccessAdd", PsAccessAdd},\r
6720                         {"AccessAddEx", PsAccessAddEx},\r
6721                         {"AccessAdd6", PsAccessAdd6},\r
6722                         {"AccessAddEx6", PsAccessAddEx6},\r
6723                         {"AccessList", PsAccessList},\r
6724                         {"AccessDelete", PsAccessDelete},\r
6725                         {"AccessEnable", PsAccessEnable},\r
6726                         {"AccessDisable", PsAccessDisable},\r
6727                         {"UserList", PsUserList},\r
6728                         {"UserCreate", PsUserCreate},\r
6729                         {"UserSet", PsUserSet},\r
6730                         {"UserDelete", PsUserDelete},\r
6731                         {"UserGet", PsUserGet},\r
6732                         {"UserAnonymousSet", PsUserAnonymousSet},\r
6733                         {"UserPasswordSet", PsUserPasswordSet},\r
6734                         {"UserCertSet", PsUserCertSet},\r
6735                         {"UserCertGet", PsUserCertGet},\r
6736                         {"UserSignedSet", PsUserSignedSet},\r
6737                         {"UserRadiusSet", PsUserRadiusSet},\r
6738                         {"UserNTLMSet", PsUserNTLMSet},\r
6739                         {"UserPolicyRemove", PsUserPolicyRemove},\r
6740                         {"UserPolicySet", PsUserPolicySet},\r
6741                         {"UserExpiresSet", PsUserExpiresSet},\r
6742                         {"GroupList", PsGroupList},\r
6743                         {"GroupCreate", PsGroupCreate},\r
6744                         {"GroupSet", PsGroupSet},\r
6745                         {"GroupDelete", PsGroupDelete},\r
6746                         {"GroupGet", PsGroupGet},\r
6747                         {"GroupJoin", PsGroupJoin},\r
6748                         {"GroupUnjoin", PsGroupUnjoin},\r
6749                         {"GroupPolicyRemove", PsGroupPolicyRemove},\r
6750                         {"GroupPolicySet", PsGroupPolicySet},\r
6751                         {"SessionList", PsSessionList},\r
6752                         {"SessionGet", PsSessionGet},\r
6753                         {"SessionDisconnect", PsSessionDisconnect},\r
6754                         {"MacTable", PsMacTable},\r
6755                         {"MacDelete", PsMacDelete},\r
6756                         {"IpTable", PsIpTable},\r
6757                         {"IpDelete", PsIpDelete},\r
6758                         {"SecureNatEnable", PsSecureNatEnable},\r
6759                         {"SecureNatDisable", PsSecureNatDisable},\r
6760                         {"SecureNatStatusGet", PsSecureNatStatusGet},\r
6761                         {"SecureNatHostGet", PsSecureNatHostGet},\r
6762                         {"SecureNatHostSet", PsSecureNatHostSet},\r
6763                         {"NatGet", PsNatGet},\r
6764                         {"NatEnable", PsNatEnable},\r
6765                         {"NatDisable", PsNatDisable},\r
6766                         {"NatSet", PsNatSet},\r
6767                         {"NatTable", PsNatTable},\r
6768                         {"DhcpGet", PsDhcpGet},\r
6769                         {"DhcpEnable", PsDhcpEnable},\r
6770                         {"DhcpDisable", PsDhcpDisable},\r
6771                         {"DhcpSet", PsDhcpSet},\r
6772                         {"DhcpTable", PsDhcpTable},\r
6773                         {"AdminOptionList", PsAdminOptionList},\r
6774                         {"AdminOptionSet", PsAdminOptionSet},\r
6775                         {"ExtOptionList", PsExtOptionList},\r
6776                         {"ExtOptionSet", PsExtOptionSet},\r
6777                         {"CrlList", PsCrlList},\r
6778                         {"CrlAdd", PsCrlAdd},\r
6779                         {"CrlDel", PsCrlDel},\r
6780                         {"CrlGet", PsCrlGet},\r
6781                         {"AcList", PsAcList},\r
6782                         {"AcAdd", PsAcAdd},\r
6783                         {"AcAdd6", PsAcAdd6},\r
6784                         {"AcDel", PsAcDel},\r
6785                         {"MakeCert", PtMakeCert},\r
6786                         {"TrafficClient", PtTrafficClient},\r
6787                         {"TrafficServer", PtTrafficServer},\r
6788                         {"LicenseAdd", PsLicenseAdd},\r
6789                         {"LicenseDel", PsLicenseDel},\r
6790                         {"LicenseList", PsLicenseList},\r
6791                         {"LicenseStatus", PsLicenseStatus},\r
6792                 };\r
6793 \r
6794                 // プロンプトの生成\r
6795                 if (ps->HubName == NULL)\r
6796                 {\r
6797                         Format(prompt, sizeof(prompt), "VPN Server>");\r
6798                 }\r
6799                 else\r
6800                 {\r
6801                         Format(prompt, sizeof(prompt), "VPN Server/%s>", ps->HubName);\r
6802                 }\r
6803 \r
6804                 if (DispatchNextCmdEx(ps->Console, ps->CmdLine, prompt, cmd, sizeof(cmd) / sizeof(cmd[0]), ps) == false)\r
6805                 {\r
6806                         break;\r
6807                 }\r
6808                 ps->LastError = ps->Console->RetCode;\r
6809 \r
6810                 if (ps->LastError == ERR_NO_ERROR && ps->Console->ConsoleType != CONSOLE_CSV)\r
6811                 {\r
6812                         ps->Console->Write(ps->Console, _UU("CMD_MSG_OK"));\r
6813                         ps->Console->Write(ps->Console, L"");\r
6814                 }\r
6815 \r
6816                 if (ps->CmdLine != NULL)\r
6817                 {\r
6818                         break;\r
6819                 }\r
6820         }\r
6821 \r
6822         // Caps を解放\r
6823         FreeCapsList(ps->CapsList);\r
6824         ps->CapsList = NULL;\r
6825 }\r
6826 \r
6827 // 新しいコマンド関数のテンプレート\r
6828 UINT PsXxx(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)\r
6829 {\r
6830         LIST *o;\r
6831         PS *ps = (PS *)param;\r
6832         UINT ret;\r
6833         RPC_LISTENER t;\r
6834         PARAM args[] =\r
6835         {\r
6836                 {"[port]", CmdPromptPort, _UU("CMD_ListenerCreate_PortPrompt"), CmdEvalPort, NULL},\r
6837         };\r
6838 \r
6839         o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));\r
6840         if (o == NULL)\r
6841         {\r
6842                 return ERR_INVALID_PARAMETER;\r
6843         }\r
6844 \r
6845         Zero(&t, sizeof(t));\r
6846         t.Enable = true;\r
6847         t.Port = ToInt(GetParamStr(o, "[port]"));\r
6848 \r
6849         ret = ScCreateListener(ps->Rpc, &t);\r
6850 \r
6851         if (ret != ERR_NO_ERROR)\r
6852         {\r
6853                 CmdPrintError(c, ret);\r
6854                 FreeParamValueList(o);\r
6855                 return ret;\r
6856         }\r
6857 \r
6858         FreeParamValueList(o);\r
6859 \r
6860         return 0;\r
6861 }\r
6862 \r
6863 // スタンドアロンモードに設定\r
6864 UINT PsClusterSettingStandalone(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)\r
6865 {\r
6866         LIST *o;\r
6867         PS *ps = (PS *)param;\r
6868         UINT ret = 0;\r
6869         RPC_FARM t;\r
6870 \r
6871         o = ParseCommandList(c, cmd_name, str, NULL, 0);\r
6872         if (o == NULL)\r
6873         {\r
6874                 return ERR_INVALID_PARAMETER;\r
6875         }\r
6876 \r
6877         Zero(&t, sizeof(t));\r
6878         t.ServerType = SERVER_TYPE_STANDALONE;\r
6879 \r
6880         // RPC 呼び出し\r
6881         ret = ScSetFarmSetting(ps->Rpc, &t);\r
6882 \r
6883         if (ret != ERR_NO_ERROR)\r
6884         {\r
6885                 // エラー発生\r
6886                 CmdPrintError(c, ret);\r
6887                 FreeParamValueList(o);\r
6888                 return ret;\r
6889         }\r
6890 \r
6891         FreeParamValueList(o);\r
6892 \r
6893         return 0;\r
6894 }\r
6895 \r
6896 // クラスタコントローラモードに設定\r
6897 UINT PsClusterSettingController(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)\r
6898 {\r
6899         LIST *o;\r
6900         PS *ps = (PS *)param;\r
6901         UINT ret = 0;\r
6902         RPC_FARM t;\r
6903         UINT weight;\r
6904         PARAM args[] =\r
6905         {\r
6906                 {"WEIGHT", NULL, NULL, NULL, NULL},\r
6907                 {"ONLY", NULL, NULL, NULL, NULL},\r
6908         };\r
6909 \r
6910         o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));\r
6911         if (o == NULL)\r
6912         {\r
6913                 return ERR_INVALID_PARAMETER;\r
6914         }\r
6915 \r
6916         weight = GetParamInt(o, "WEIGHT");\r
6917         if (weight == 0)\r
6918         {\r
6919                 weight = FARM_DEFAULT_WEIGHT;\r
6920         }\r
6921 \r
6922         Zero(&t, sizeof(t));\r
6923         t.ServerType = SERVER_TYPE_FARM_CONTROLLER;\r
6924         t.Weight = weight;\r
6925         t.ControllerOnly = GetParamYes(o, "ONLY");\r
6926 \r
6927         // RPC 呼び出し\r
6928         ret = ScSetFarmSetting(ps->Rpc, &t);\r
6929 \r
6930         if (ret != ERR_NO_ERROR)\r
6931         {\r
6932                 // エラー発生\r
6933                 CmdPrintError(c, ret);\r
6934                 FreeParamValueList(o);\r
6935                 return ret;\r
6936         }\r
6937 \r
6938         FreeParamValueList(o);\r
6939 \r
6940         return 0;\r
6941 }\r
6942 \r
6943 // IP アドレスの評価\r
6944 bool CmdEvalIp(CONSOLE *c, wchar_t *str, void *param)\r
6945 {\r
6946         // 引数チェック\r
6947         if (c == NULL || str == NULL)\r
6948         {\r
6949                 return false;\r
6950         }\r
6951 \r
6952         if (UniIsEmptyStr(str))\r
6953         {\r
6954                 return true;\r
6955         }\r
6956 \r
6957         if (UniStrToIP32(str) == 0 && UniStrCmpi(str, L"0.0.0.0") != 0)\r
6958         {\r
6959                 wchar_t *msg = (param == NULL) ? _UU("CMD_IP_EVAL_FAILED") : (wchar_t *)param;\r
6960                 c->Write(c, msg);\r
6961                 return false;\r
6962         }\r
6963 \r
6964         return true;\r
6965 }\r
6966 \r
6967 // 文字列をポートリストに変換\r
6968 LIST *StrToPortList(char *str)\r
6969 {\r
6970         LIST *o;\r
6971         TOKEN_LIST *t;\r
6972         UINT i;\r
6973         if (str == NULL)\r
6974         {\r
6975                 return NULL;\r
6976         }\r
6977 \r
6978         // トークンに変換\r
6979         t = ParseToken(str, ", ");\r
6980         if (t == NULL)\r
6981         {\r
6982                 return NULL;\r
6983         }\r
6984         if (t->NumTokens == 0)\r
6985         {\r
6986                 FreeToken(t);\r
6987                 return NULL;\r
6988         }\r
6989 \r
6990         o = NewListFast(NULL);\r
6991 \r
6992         for (i = 0;i < t->NumTokens;i++)\r
6993         {\r
6994                 char *s = t->Token[i];\r
6995                 UINT n;\r
6996                 if (IsNum(s) == false)\r
6997                 {\r
6998                         ReleaseList(o);\r
6999                         FreeToken(t);\r
7000                         return NULL;\r
7001                 }\r
7002                 n = ToInt(s);\r
7003                 if (n == 0 || n >= 65536)\r
7004                 {\r
7005                         ReleaseList(o);\r
7006                         FreeToken(t);\r
7007                         return NULL;\r
7008                 }\r
7009                 if (IsInList(o, (void *)n))\r
7010                 {\r
7011                         ReleaseList(o);\r
7012                         FreeToken(t);\r
7013                         return NULL;\r
7014                 }\r
7015                 Add(o, (void *)n);\r
7016         }\r
7017 \r
7018         FreeToken(t);\r
7019 \r
7020         if (LIST_NUM(o) > MAX_PUBLIC_PORT_NUM)\r
7021         {\r
7022                 ReleaseList(o);\r
7023                 return NULL;\r
7024         }\r
7025 \r
7026         return o;\r
7027 }\r
7028 \r
7029 // クラスタメンバモードに設定\r
7030 UINT PsClusterSettingMember(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)\r
7031 {\r
7032         LIST *o;\r
7033         PS *ps = (PS *)param;\r
7034         UINT ret = 0;\r
7035         RPC_FARM t;\r
7036         char *host_and_port;\r
7037         char *host;\r
7038         UINT port;\r
7039         UINT weight;\r
7040         // 指定できるパラメータ リスト\r
7041         PARAM args[] =\r
7042         {\r
7043                 // "name", prompt_proc, prompt_param, eval_proc, eval_param\r
7044                 {"[server:port]", CmdPrompt, _UU("CMD_ClusterSettingMember_Prompt_HOST_1"), CmdEvalHostAndPort, NULL},\r
7045                 {"IP", PsClusterSettingMemberPromptIp, NULL, CmdEvalIp, NULL},\r
7046                 {"PORTS", PsClusterSettingMemberPromptPorts, NULL, CmdEvalPortList, NULL},\r
7047                 {"PASSWORD", CmdPromptChoosePassword, NULL, NULL, NULL},\r
7048                 {"WEIGHT", NULL, NULL, NULL, NULL},\r
7049         };\r
7050 \r
7051         o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));\r
7052         if (o == NULL)\r
7053         {\r
7054                 return ERR_INVALID_PARAMETER;\r
7055         }\r
7056 \r
7057         weight = GetParamInt(o, "WEIGHT");\r
7058 \r
7059         if (weight == 0)\r
7060         {\r
7061                 weight = FARM_DEFAULT_WEIGHT;\r
7062         }\r
7063 \r
7064         Zero(&t, sizeof(t));\r
7065         host_and_port = GetParamStr(o, "[server:port]");\r
7066         if (ParseHostPort(host_and_port, &host, &port, 0))\r
7067         {\r
7068                 char *pw;\r
7069                 char *ports_str;\r
7070                 LIST *ports;\r
7071                 UINT i;\r
7072 \r
7073                 StrCpy(t.ControllerName, sizeof(t.ControllerName), host);\r
7074                 t.ControllerPort = port;\r
7075                 Free(host);\r
7076 \r
7077                 pw = GetParamStr(o, "PASSWORD");\r
7078 \r
7079                 Hash(t.MemberPassword, pw, StrLen(pw), true);\r
7080                 t.PublicIp = StrToIP32(GetParamStr(o, "IP"));\r
7081                 t.ServerType = SERVER_TYPE_FARM_MEMBER;\r
7082 \r
7083                 ports_str = GetParamStr(o, "PORTS");\r
7084 \r
7085                 ports = StrToPortList(ports_str);\r
7086 \r
7087                 t.NumPort = LIST_NUM(ports);\r
7088                 t.Ports = ZeroMalloc(sizeof(UINT) * t.NumPort);\r
7089 \r
7090                 for (i = 0;i < t.NumPort;i++)\r
7091                 {\r
7092                         t.Ports[i] = (UINT)LIST_DATA(ports, i);\r
7093                 }\r
7094 \r
7095                 t.Weight = weight;\r
7096 \r
7097                 ReleaseList(ports);\r
7098 \r
7099                 // RPC 呼び出し\r
7100                 ret = ScSetFarmSetting(ps->Rpc, &t);\r
7101 \r
7102                 if (ret != ERR_NO_ERROR)\r
7103                 {\r
7104                         // エラー発生\r
7105                         CmdPrintError(c, ret);\r
7106                         FreeParamValueList(o);\r
7107                         return ret;\r
7108                 }\r
7109 \r
7110                 FreeRpcFarm(&t);\r
7111         }\r
7112 \r
7113         FreeParamValueList(o);\r
7114 \r
7115         return 0;\r
7116 }\r
7117 \r
7118 // ポート一覧の評価\r
7119 bool CmdEvalPortList(CONSOLE *c, wchar_t *str, void *param)\r
7120 {\r
7121         char *s;\r
7122         bool ret = false;\r
7123         LIST *o;\r
7124         // 引数チェック\r
7125         if (c == NULL || str == NULL)\r
7126         {\r
7127                 return false;\r
7128         }\r
7129 \r
7130         s = CopyUniToStr(str);\r
7131 \r
7132         o = StrToPortList(s);\r
7133 \r
7134         if (o != NULL)\r
7135         {\r
7136                 ret = true;\r
7137         }\r
7138 \r
7139         ReleaseList(o);\r
7140 \r
7141         Free(s);\r
7142 \r
7143         if (ret == false)\r
7144         {\r
7145                 c->Write(c, _UU("CMD_PORTLIST_EVAL_FAILED"));\r
7146         }\r
7147 \r
7148         return ret;\r
7149 }\r
7150 \r
7151 // ホスト名とポート番号の形式の文字列のチェック\r
7152 bool CmdEvalHostAndPort(CONSOLE *c, wchar_t *str, void *param)\r
7153 {\r
7154         char *tmp;\r
7155         bool ret = false;\r
7156         // 引数チェック\r
7157         if (c == NULL || str == NULL)\r
7158         {\r
7159                 return false;\r
7160         }\r
7161 \r
7162         tmp = CopyUniToStr(str);\r
7163 \r
7164         ret = ParseHostPort(tmp, NULL, NULL, (UINT)param);\r
7165 \r
7166         if (ret == false)\r
7167         {\r
7168                 c->Write(c, param == NULL ? _UU("CMD_HOSTPORT_EVAL_FAILED") : (wchar_t *)param);\r
7169         }\r
7170 \r
7171         Free(tmp);\r
7172 \r
7173         return ret;\r
7174 }\r
7175 \r
7176 // 公開 ポート番号の入力\r
7177 wchar_t *PsClusterSettingMemberPromptPorts(CONSOLE *c, void *param)\r
7178 {\r
7179         wchar_t *ret;\r
7180         // 引数チェック\r
7181         if (c == NULL)\r
7182         {\r
7183                 return NULL;\r
7184         }\r
7185 \r
7186         c->Write(c, _UU("CMD_ClusterSettingMember_Prompt_PORT_1"));\r
7187         c->Write(c, L"");\r
7188 \r
7189         ret = c->ReadLine(c, _UU("CMD_ClusterSettingMember_Prompt_PORT_2"), true);\r
7190 \r
7191         return ret;\r
7192 }\r
7193 \r
7194 // 公開 IP アドレスの入力\r
7195 wchar_t *PsClusterSettingMemberPromptIp(CONSOLE *c, void *param)\r
7196 {\r
7197         wchar_t *ret;\r
7198         // 引数チェック\r
7199         if (c == NULL)\r
7200         {\r
7201                 return NULL;\r
7202         }\r
7203 \r
7204         c->Write(c, _UU("CMD_ClusterSettingMember_Prompt_IP_1"));\r
7205         c->Write(c, L"");\r
7206 \r
7207         ret = c->ReadLine(c, _UU("CMD_ClusterSettingMember_Prompt_IP_2"), true);\r
7208 \r
7209         return ret;\r
7210 }\r
7211 \r
7212 // クラスタメンバリストの表示\r
7213 UINT PsClusterMemberList(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)\r
7214 {\r
7215         LIST *o;\r
7216         PS *ps = (PS *)param;\r
7217         UINT ret = 0;\r
7218         RPC_ENUM_FARM t;\r
7219         CT *ct;\r
7220         UINT i;\r
7221 \r
7222         o = ParseCommandList(c, cmd_name, str, NULL, 0);\r
7223         if (o == NULL)\r
7224         {\r
7225                 return ERR_INVALID_PARAMETER;\r
7226         }\r
7227 \r
7228         Zero(&t, sizeof(t));\r
7229 \r
7230         // RPC 呼び出し\r
7231         ret = ScEnumFarmMember(ps->Rpc, &t);\r
7232 \r
7233         if (ret != ERR_NO_ERROR)\r
7234         {\r
7235                 // エラー発生\r
7236                 CmdPrintError(c, ret);\r
7237                 FreeParamValueList(o);\r
7238                 return ret;\r
7239         }\r
7240 \r
7241         ct = CtNew();\r
7242 \r
7243         CtInsertColumn(ct, _UU("CMD_ID"), true);\r
7244         CtInsertColumn(ct, _UU("SM_FM_COLUMN_1"), false);\r
7245         CtInsertColumn(ct, _UU("SM_FM_COLUMN_2"), false);\r
7246         CtInsertColumn(ct, _UU("SM_FM_COLUMN_3"), false);\r
7247         CtInsertColumn(ct, _UU("SM_FM_COLUMN_4"), true);\r
7248         CtInsertColumn(ct, _UU("SM_FM_COLUMN_5"), true);\r
7249         CtInsertColumn(ct, _UU("SM_FM_COLUMN_6"), true);\r
7250         CtInsertColumn(ct, _UU("SM_FM_COLUMN_7"), true);\r
7251         CtInsertColumn(ct, _UU("SM_FM_COLUMN_8"), true);\r
7252         CtInsertColumn(ct, _UU("SM_FM_COLUMN_9"), true);\r
7253 \r
7254         for (i = 0;i < t.NumFarm;i++)\r
7255         {\r
7256                 RPC_ENUM_FARM_ITEM *e = &t.Farms[i];\r
7257                 wchar_t tmp0[64];\r
7258                 wchar_t tmp1[MAX_SIZE];\r
7259                 wchar_t tmp2[MAX_SIZE];\r
7260                 wchar_t tmp3[64];\r
7261                 wchar_t tmp4[64];\r
7262                 wchar_t tmp5[64];\r
7263                 wchar_t tmp6[64];\r
7264                 wchar_t tmp7[64];\r
7265                 wchar_t tmp8[64];\r
7266 \r
7267                 GetDateTimeStrEx64(tmp1, sizeof(tmp1), SystemToLocal64(e->ConnectedTime), NULL);\r
7268                 StrToUni(tmp2, sizeof(tmp2), e->Hostname);\r
7269                 UniToStru(tmp3, e->Point);\r
7270                 UniToStru(tmp4, e->NumSessions);\r
7271                 UniToStru(tmp5, e->NumTcpConnections);\r
7272                 UniToStru(tmp6, e->NumHubs);\r
7273                 UniToStru(tmp7, e->AssignedClientLicense);\r
7274                 UniToStru(tmp8, e->AssignedBridgeLicense);\r
7275 \r
7276                 UniToStru(tmp0, e->Id);\r
7277 \r
7278                 CtInsert(ct, tmp0,\r
7279                         e->Controller ? _UU("SM_FM_CONTROLLER") : _UU("SM_FM_MEMBER"),\r
7280                         tmp1, tmp2, tmp3, tmp4, tmp5, tmp6, tmp7, tmp8);\r
7281         }\r
7282 \r
7283         CtFree(ct, c);\r
7284 \r
7285         FreeRpcEnumFarm(&t);\r
7286 \r
7287         FreeParamValueList(o);\r
7288 \r
7289         return 0;\r
7290 }\r
7291 \r
7292 // クラスタ メンバの情報の取得\r
7293 UINT PsClusterMemberInfoGet(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)\r
7294 {\r
7295         LIST *o;\r
7296         PS *ps = (PS *)param;\r
7297         UINT ret = 0;\r
7298         RPC_FARM_INFO t;\r
7299         CT *ct;\r
7300         // 指定できるパラメータ リスト\r
7301         PARAM args[] =\r
7302         {\r
7303                 // "name", prompt_proc, prompt_param, eval_proc, eval_param\r
7304                 {"[id]", CmdPrompt, _UU("CMD_ClusterMemberInfoGet_PROMPT_ID"), NULL, NULL},\r
7305         };\r
7306 \r
7307         o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));\r
7308         if (o == NULL)\r
7309         {\r
7310                 return ERR_INVALID_PARAMETER;\r
7311         }\r
7312 \r
7313         Zero(&t, sizeof(t));\r
7314         t.Id = UniToInt(GetParamUniStr(o, "[id]"));\r
7315 \r
7316         // RPC 呼び出し\r
7317         ret = ScGetFarmInfo(ps->Rpc, &t);\r
7318 \r
7319         if (ret != ERR_NO_ERROR)\r
7320         {\r
7321                 // エラー発生\r
7322                 CmdPrintError(c, ret);\r
7323                 FreeParamValueList(o);\r
7324                 return ret;\r
7325         }\r
7326 \r
7327         ct = CtNewStandard();\r
7328 \r
7329         {\r
7330                 wchar_t tmp[MAX_SIZE];\r
7331                 char str[MAX_SIZE];\r
7332                 UINT i;\r
7333 \r
7334                 CtInsert(ct, _UU("SM_FMINFO_TYPE"),\r
7335                         t.Controller ? _UU("SM_FARM_CONTROLLER") : _UU("SM_FARM_MEMBER"));\r
7336 \r
7337                 GetDateTimeStrEx64(tmp, sizeof(tmp), SystemToLocal64(t.ConnectedTime), NULL);\r
7338                 CtInsert(ct, _UU("SM_FMINFO_CONNECT_TIME"), tmp);\r
7339 \r
7340                 IPToStr32(str, sizeof(str), t.Ip);\r
7341                 StrToUni(tmp, sizeof(tmp), str);\r
7342                 CtInsert(ct, _UU("SM_FMINFO_IP"), tmp);\r
7343 \r
7344                 StrToUni(tmp, sizeof(tmp), t.Hostname);\r
7345                 CtInsert(ct, _UU("SM_FMINFO_HOSTNAME"), tmp);\r
7346 \r
7347                 UniToStru(tmp, t.Point);\r
7348                 CtInsert(ct, _UU("SM_FMINFO_POINT"), tmp);\r
7349 \r
7350                 UniToStru(tmp, t.Weight);\r
7351                 CtInsert(ct, _UU("SM_FMINFO_WEIGHT"), tmp);\r
7352 \r
7353                 UniToStru(tmp, t.NumPort);\r
7354                 CtInsert(ct, _UU("SM_FMINFO_NUM_PORT"), tmp);\r
7355 \r
7356                 for (i = 0;i < t.NumPort;i++)\r
7357                 {\r
7358                         wchar_t tmp2[MAX_SIZE];\r
7359                         UniFormat(tmp, sizeof(tmp), _UU("SM_FMINFO_PORT"), i + 1);\r
7360                         UniToStru(tmp2, t.Ports[i]);\r
7361                         CtInsert(ct, tmp, tmp2);\r
7362                 }\r
7363 \r
7364                 UniToStru(tmp, t.NumFarmHub);\r
7365                 CtInsert(ct, _UU("SM_FMINFO_NUM_HUB"), tmp);\r
7366 \r
7367                 for (i = 0;i < t.NumFarmHub;i++)\r
7368                 {\r
7369                         wchar_t tmp2[MAX_SIZE];\r
7370                         UniFormat(tmp, sizeof(tmp), _UU("SM_FMINFO_HUB"), i + 1);\r
7371                         UniFormat(tmp2, sizeof(tmp2),\r
7372                                 t.FarmHubs[i].DynamicHub ? _UU("SM_FMINFO_HUB_TAG_2") : _UU("SM_FMINFO_HUB_TAG_1"),\r
7373                                 t.FarmHubs[i].HubName);\r
7374                         CtInsert(ct, tmp, tmp2);\r
7375                 }\r
7376 \r
7377                 UniToStru(tmp, t.NumSessions);\r
7378                 CtInsert(ct, _UU("SM_FMINFO_NUM_SESSION"), tmp);\r
7379 \r
7380                 UniToStru(tmp, t.NumTcpConnections);\r
7381                 CtInsert(ct, _UU("SM_FMINFO_NUN_CONNECTION"), tmp);\r
7382         }\r
7383 \r
7384         CtFree(ct, c);\r
7385 \r
7386         FreeRpcFarmInfo(&t);\r
7387 \r
7388         FreeParamValueList(o);\r
7389 \r
7390         return 0;\r
7391 }\r
7392 \r
7393 // クラスタ メンバの証明書の取得\r
7394 UINT PsClusterMemberCertGet(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)\r
7395 {\r
7396         LIST *o;\r
7397         PS *ps = (PS *)param;\r
7398         UINT ret = 0;\r
7399         RPC_FARM_INFO t;\r
7400         // 指定できるパラメータ リスト\r
7401         PARAM args[] =\r
7402         {\r
7403                 // "name", prompt_proc, prompt_param, eval_proc, eval_param\r
7404                 {"[id]", CmdPrompt, _UU("CMD_ClusterMemberCertGet_PROMPT_ID"), NULL, NULL},\r
7405                 {"SAVECERT", CmdPrompt, _UU("CMD_SAVECERTPATH"), CmdEvalNotEmpty, NULL},\r
7406         };\r
7407 \r
7408         o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));\r
7409         if (o == NULL)\r
7410         {\r
7411                 return ERR_INVALID_PARAMETER;\r
7412         }\r
7413 \r
7414         Zero(&t, sizeof(t));\r
7415 \r
7416         t.Id = UniToInt(GetParamUniStr(o, "[id]"));\r
7417 \r
7418         // RPC 呼び出し\r
7419         ret = ScGetFarmInfo(ps->Rpc, &t);\r
7420 \r
7421         if (ret != ERR_NO_ERROR)\r
7422         {\r
7423                 // エラー発生\r
7424                 CmdPrintError(c, ret);\r
7425                 FreeParamValueList(o);\r
7426                 return ret;\r
7427         }\r
7428         else\r
7429         {\r
7430                 X *x = t.ServerCert;\r
7431                 char *filename = GetParamStr(o, "SAVECERT");\r
7432 \r
7433                 if (XToFile(x, filename, true) == false)\r
7434                 {\r
7435                         c->Write(c, _UU("CMD_SAVECERT_FAILED"));\r
7436 \r
7437                         ret = ERR_INTERNAL_ERROR;\r
7438                 }\r
7439         }\r
7440 \r
7441         FreeRpcFarmInfo(&t);\r
7442 \r
7443         FreeParamValueList(o);\r
7444 \r
7445         return ret;\r
7446 }\r
7447 \r
7448 // クラスタ コントローラへの接続状態の取得\r
7449 UINT PsClusterConnectionStatusGet(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)\r
7450 {\r
7451         LIST *o;\r
7452         PS *ps = (PS *)param;\r
7453         UINT ret = 0;\r
7454         RPC_FARM_CONNECTION_STATUS t;\r
7455         wchar_t tmp[MAX_SIZE];\r
7456 \r
7457         o = ParseCommandList(c, cmd_name, str, NULL, 0);\r
7458         if (o == NULL)\r
7459         {\r
7460                 return ERR_INVALID_PARAMETER;\r
7461         }\r
7462 \r
7463         Zero(&t, sizeof(t));\r
7464 \r
7465         // RPC 呼び出し\r
7466         ret = ScGetFarmConnectionStatus(ps->Rpc, &t);\r
7467 \r
7468         if (ret != ERR_NO_ERROR)\r
7469         {\r
7470                 // エラー発生\r
7471                 CmdPrintError(c, ret);\r
7472                 FreeParamValueList(o);\r
7473                 return ret;\r
7474         }\r
7475         else\r
7476         {\r
7477                 CT *ct = CtNewStandard();\r
7478                 char str[MAX_SIZE];\r
7479 \r
7480                 if (t.Online == false)\r
7481                 {\r
7482                         CtInsert(ct, _UU("SM_FC_IP"), _UU("SM_FC_NOT_CONNECTED"));\r
7483 \r
7484                         CtInsert(ct, _UU("SM_FC_PORT"), _UU("SM_FC_NOT_CONNECTED"));\r
7485                 }\r
7486                 else\r
7487                 {\r
7488                         IPToStr32(str, sizeof(str), t.Ip);\r
7489                         StrToUni(tmp, sizeof(tmp), str);\r
7490                         CtInsert(ct, _UU("SM_FC_IP"), tmp);\r
7491 \r
7492                         UniToStru(tmp, t.Port);\r
7493                         CtInsert(ct, _UU("SM_FC_PORT"), tmp);\r
7494                 }\r
7495 \r
7496                 CtInsert(ct,\r
7497                         _UU("SM_FC_STATUS"),\r
7498                         t.Online ? _UU("SM_FC_ONLINE") : _UU("SM_FC_OFFLINE"));\r
7499 \r
7500                 if (t.Online == false)\r
7501                 {\r
7502                         UniFormat(tmp, sizeof(tmp), _UU("SM_FC_ERROR_TAG"), _E(t.LastError), t.LastError);\r
7503                         CtInsert(ct,\r
7504                                 _UU("SM_FC_LAST_ERROR"), tmp);\r
7505                 }\r
7506 \r
7507                 GetDateTimeStrEx64(tmp, sizeof(tmp), SystemToLocal64(t.StartedTime), NULL);\r
7508                 CtInsert(ct, _UU("SM_FC_START_TIME"), tmp);\r
7509 \r
7510                 GetDateTimeStrEx64(tmp, sizeof(tmp), SystemToLocal64(t.FirstConnectedTime), NULL);\r
7511                 CtInsert(ct, _UU("SM_FC_FIRST_TIME"), tmp);\r
7512 \r
7513                 //if (t.Online == false)\r
7514                 {\r
7515                         GetDateTimeStrEx64(tmp, sizeof(tmp), SystemToLocal64(t.CurrentConnectedTime), NULL);\r
7516                         CtInsert(ct, _UU("SM_FC_CURRENT_TIME"), tmp);\r
7517                 }\r
7518 \r
7519                 UniToStru(tmp, t.NumTry);\r
7520                 CtInsert(ct, _UU("SM_FC_NUM_TRY"), tmp);\r
7521 \r
7522                 UniToStru(tmp, t.NumConnected);\r
7523                 CtInsert(ct, _UU("SM_FC_NUM_CONNECTED"), tmp);\r
7524 \r
7525                 UniToStru(tmp, t.NumFailed);\r
7526                 CtInsert(ct, _UU("SM_FC_NUM_FAILED"), tmp);\r
7527 \r
7528                 CtFree(ct, c);\r
7529         }\r
7530 \r
7531         FreeParamValueList(o);\r
7532 \r
7533         return 0;\r
7534 }\r
7535 \r
7536 // VPN Server の SSL 証明書の取得\r
7537 UINT PsServerCertGet(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)\r
7538 {\r
7539         LIST *o;\r
7540         PS *ps = (PS *)param;\r
7541         UINT ret = 0;\r
7542         RPC_KEY_PAIR t;\r
7543         // 指定できるパラメータ リスト\r
7544         PARAM args[] =\r
7545         {\r
7546                 {"[cert]", CmdPrompt, _UU("CMD_SAVECERTPATH"), CmdEvalNotEmpty, NULL},\r
7547         };\r
7548 \r
7549         o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));\r
7550         if (o == NULL)\r
7551         {\r
7552                 return ERR_INVALID_PARAMETER;\r
7553         }\r
7554 \r
7555         Zero(&t, sizeof(t));\r
7556 \r
7557         // RPC 呼び出し\r
7558         ret = ScGetServerCert(ps->Rpc, &t);\r
7559 \r
7560         if (ret != ERR_NO_ERROR)\r
7561         {\r
7562                 // エラー発生\r
7563                 CmdPrintError(c, ret);\r
7564                 FreeParamValueList(o);\r
7565                 return ret;\r
7566         }\r
7567 \r
7568         if (XToFile(t.Cert, GetParamStr(o, "[cert]"), true) == false)\r
7569         {\r
7570                 c->Write(c, _UU("CMD_SAVECERT_FAILED"));\r
7571         }\r
7572 \r
7573         FreeRpcKeyPair(&t);\r
7574 \r
7575         FreeParamValueList(o);\r
7576 \r
7577         return 0;\r
7578 }\r
7579 \r
7580 // VPN Server の SSL 証明書の秘密鍵の取得\r
7581 UINT PsServerKeyGet(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)\r
7582 {\r
7583         LIST *o;\r
7584         PS *ps = (PS *)param;\r
7585         UINT ret = 0;\r
7586         RPC_KEY_PAIR t;\r
7587         // 指定できるパラメータ リスト\r
7588         PARAM args[] =\r
7589         {\r
7590                 {"[key]", CmdPrompt, _UU("CMD_SAVEKEYPATH"), CmdEvalNotEmpty, NULL},\r
7591         };\r
7592 \r
7593         o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));\r
7594         if (o == NULL)\r
7595         {\r
7596                 return ERR_INVALID_PARAMETER;\r
7597         }\r
7598 \r
7599         Zero(&t, sizeof(t));\r
7600 \r
7601         // RPC 呼び出し\r
7602         ret = ScGetServerCert(ps->Rpc, &t);\r
7603 \r
7604         if (ret != ERR_NO_ERROR)\r
7605         {\r
7606                 // エラー発生\r
7607                 CmdPrintError(c, ret);\r
7608                 FreeParamValueList(o);\r
7609                 return ret;\r
7610         }\r
7611 \r
7612         if (t.Key != NULL)\r
7613         {\r
7614                 if (KToFile(t.Key, GetParamStr(o, "[key]"), true, NULL) == false)\r
7615                 {\r
7616                         c->Write(c, _UU("CMD_SAVEKEY_FAILED"));\r
7617                 }\r
7618         }\r
7619         else\r
7620         {\r
7621                 ret = ERR_NOT_ENOUGH_RIGHT;\r
7622                 CmdPrintError(c, ret);\r
7623         }\r
7624 \r
7625         FreeRpcKeyPair(&t);\r
7626 \r
7627         FreeParamValueList(o);\r
7628 \r
7629         return ret;\r
7630 }\r
7631 \r
7632 // 証明書と秘密鍵の読み込み\r
7633 bool CmdLoadCertAndKey(CONSOLE *c, X **xx, K **kk, char *cert_filename, char *key_filename)\r
7634 {\r
7635         X *x;\r
7636         K *k;\r
7637         // 引数チェック\r
7638         if (c == NULL || cert_filename == NULL || key_filename == NULL || xx == NULL || kk == NULL)\r
7639         {\r
7640                 return false;\r
7641         }\r
7642 \r
7643         x = FileToX(cert_filename);\r
7644         if (x == NULL)\r
7645         {\r
7646                 c->Write(c, _UU("CMD_LOADCERT_FAILED"));\r
7647                 return false;\r
7648         }\r
7649 \r
7650         k = CmdLoadKey(c, key_filename);\r
7651         if (k == NULL)\r
7652         {\r
7653                 c->Write(c, _UU("CMD_LOADKEY_FAILED"));\r
7654                 FreeX(x);\r
7655                 return false;\r
7656         }\r
7657 \r
7658         if (CheckXandK(x, k) == false)\r
7659         {\r
7660                 c->Write(c, _UU("CMD_KEYPAIR_FAILED"));\r
7661                 FreeX(x);\r
7662                 FreeK(k);\r
7663 \r
7664                 return false;\r
7665         }\r
7666 \r
7667         *xx = x;\r
7668         *kk = k;\r
7669 \r
7670         return true;\r
7671 }\r
7672 \r
7673 // 秘密鍵の読み込み\r
7674 K *CmdLoadKey(CONSOLE *c, char *filename)\r
7675 {\r
7676         BUF *b;\r
7677         // 引数チェック\r
7678         if (c == NULL || filename == NULL)\r
7679         {\r
7680                 return NULL;\r
7681         }\r
7682 \r
7683         b = ReadDump(filename);\r
7684         if (b == NULL)\r
7685         {\r
7686                 c->Write(c, _UU("CMD_LOADCERT_FAILED"));\r
7687                 return NULL;\r
7688         }\r
7689         else\r
7690         {\r
7691                 K *key;\r
7692                 if (IsEncryptedK(b, true) == false)\r
7693                 {\r
7694                         key = BufToK(b, true, IsBase64(b), NULL);\r
7695                 }\r
7696                 else\r
7697                 {\r
7698                         c->Write(c, _UU("CMD_LOADKEY_ENCRYPTED_1"));\r
7699 \r
7700                         while (true)\r
7701                         {\r
7702                                 char *pass = c->ReadPassword(c, _UU("CMD_LOADKEY_ENCRYPTED_2"));\r
7703 \r
7704                                 if (pass == NULL)\r
7705                                 {\r
7706                                         FreeBuf(b);\r
7707                                         return NULL;\r
7708                                 }\r
7709 \r
7710                                 key = BufToK(b, true, IsBase64(b), pass);\r
7711                                 Free(pass);\r
7712 \r
7713                                 if (key != NULL)\r
7714                                 {\r
7715                                         break;\r
7716                                 }\r
7717 \r
7718                                 c->Write(c, _UU("CMD_LOADKEY_ENCRYPTED_3"));\r
7719                         }\r
7720                 }\r
7721 \r
7722                 FreeBuf(b);\r
7723 \r
7724                 return key;\r
7725         }\r
7726 }\r
7727 \r
7728 // VPN Server の SSL 証明書と秘密鍵の設定\r
7729 UINT PsServerCertSet(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)\r
7730 {\r
7731         LIST *o;\r
7732         PS *ps = (PS *)param;\r
7733         UINT ret = 0;\r
7734         RPC_KEY_PAIR t;\r
7735         // 指定できるパラメータ リスト\r
7736         PARAM args[] =\r
7737         {\r
7738                 // "name", prompt_proc, prompt_param, eval_proc, eval_param\r
7739                 {"LOADCERT", CmdPrompt, _UU("CMD_LOADCERTPATH"), CmdEvalIsFile, NULL},\r
7740                 {"LOADKEY", CmdPrompt, _UU("CMD_LOADKEYPATH"), CmdEvalIsFile, NULL},\r
7741         };\r
7742 \r
7743         o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));\r
7744         if (o == NULL)\r
7745         {\r
7746                 return ERR_INVALID_PARAMETER;\r
7747         }\r
7748 \r
7749         Zero(&t, sizeof(t));\r
7750 \r
7751         if (CmdLoadCertAndKey(c, &t.Cert, &t.Key,\r
7752                 GetParamStr(o, "LOADCERT"),\r
7753                 GetParamStr(o, "LOADKEY")))\r
7754         {\r
7755                 // RPC 呼び出し\r
7756                 ret = ScSetServerCert(ps->Rpc, &t);\r
7757 \r
7758                 if (ret != ERR_NO_ERROR)\r
7759                 {\r
7760                         // エラー発生\r
7761                         CmdPrintError(c, ret);\r
7762                         FreeParamValueList(o);\r
7763                         return ret;\r
7764                 }\r
7765 \r
7766                 FreeRpcKeyPair(&t);\r
7767         }\r
7768         else\r
7769         {\r
7770                 ret = ERR_INTERNAL_ERROR;\r
7771         }\r
7772 \r
7773         FreeParamValueList(o);\r
7774 \r
7775         return ret;\r
7776 }\r
7777 \r
7778 // VPN 通信で使用される暗号化アルゴリズムの取得\r
7779 UINT PsServerCipherGet(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)\r
7780 {\r
7781         LIST *o;\r
7782         PS *ps = (PS *)param;\r
7783         UINT ret = 0;\r
7784         RPC_STR t;\r
7785         TOKEN_LIST *ciphers;\r
7786         UINT i;\r
7787         wchar_t tmp[MAX_SIZE];\r
7788 \r
7789         o = ParseCommandList(c, cmd_name, str, NULL, 0);\r
7790         if (o == NULL)\r
7791         {\r
7792                 return ERR_INVALID_PARAMETER;\r
7793         }\r
7794 \r
7795         Zero(&t, sizeof(t));\r
7796 \r
7797         // RPC 呼び出し\r
7798         ret = ScGetServerCipher(ps->Rpc, &t);\r
7799 \r
7800         if (ret != ERR_NO_ERROR)\r
7801         {\r
7802                 // エラー発生\r
7803                 CmdPrintError(c, ret);\r
7804                 FreeParamValueList(o);\r
7805                 return ret;\r
7806         }\r
7807 \r
7808         ciphers = GetCipherList();\r
7809 \r
7810         c->Write(c, _UU("CMD_ServerCipherGet_SERVER"));\r
7811 \r
7812         UniFormat(tmp, sizeof(tmp), L" %S", t.String);\r
7813         c->Write(c, tmp);\r
7814 \r
7815         c->Write(c, L"");\r
7816         c->Write(c, _UU("CMD_ServerCipherGet_CIPHERS"));\r
7817 \r
7818         for (i = 0;i < ciphers->NumTokens;i++)\r
7819         {\r
7820                 UniFormat(tmp, sizeof(tmp), L" %S", ciphers->Token[i]);\r
7821                 c->Write(c, tmp);\r
7822         }\r
7823 \r
7824         FreeRpcStr(&t);\r
7825 \r
7826         FreeParamValueList(o);\r
7827 \r
7828         return 0;\r
7829 }\r
7830 \r
7831 // VPN 通信で使用される暗号化アルゴリズムの設定\r
7832 UINT PsServerCipherSet(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)\r
7833 {\r
7834         LIST *o;\r
7835         PS *ps = (PS *)param;\r
7836         UINT ret = 0;\r
7837         RPC_STR t;\r
7838         // 指定できるパラメータ リスト\r
7839         PARAM args[] =\r
7840         {\r
7841                 {"[name]", CmdPrompt, _UU("CMD_ServerCipherSet_PROMPT_NAME"), CmdEvalNotEmpty, NULL},\r
7842         };\r
7843 \r
7844         o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));\r
7845         if (o == NULL)\r
7846         {\r
7847                 return ERR_INVALID_PARAMETER;\r
7848         }\r
7849 \r
7850         Zero(&t, sizeof(t));\r
7851         t.String = CopyStr(GetParamStr(o, "[name]"));\r
7852 \r
7853         // RPC 呼び出し\r
7854         ret = ScSetServerCipher(ps->Rpc, &t);\r
7855 \r
7856         if (ret != ERR_NO_ERROR)\r
7857         {\r
7858                 // エラー発生\r
7859                 CmdPrintError(c, ret);\r
7860                 FreeParamValueList(o);\r
7861                 return ret;\r
7862         }\r
7863 \r
7864         FreeRpcStr(&t);\r
7865 \r
7866         FreeParamValueList(o);\r
7867 \r
7868         return 0;\r
7869 }\r
7870 \r
7871 // インターネット接続の維持機能の有効化\r
7872 UINT PsKeepEnable(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)\r
7873 {\r
7874         LIST *o;\r
7875         PS *ps = (PS *)param;\r
7876         UINT ret = 0;\r
7877         RPC_KEEP t;\r
7878 \r
7879         o = ParseCommandList(c, cmd_name, str, NULL, 0);\r
7880         if (o == NULL)\r
7881         {\r
7882                 return ERR_INVALID_PARAMETER;\r
7883         }\r
7884 \r
7885         Zero(&t, sizeof(t));\r
7886 \r
7887         // RPC 呼び出し\r
7888         ret = ScGetKeep(ps->Rpc, &t);\r
7889 \r
7890         if (ret != ERR_NO_ERROR)\r
7891         {\r
7892                 // エラー発生\r
7893                 CmdPrintError(c, ret);\r
7894                 FreeParamValueList(o);\r
7895                 return ret;\r
7896         }\r
7897 \r
7898         t.UseKeepConnect = true;\r
7899 \r
7900         ret = ScSetKeep(ps->Rpc, &t);\r
7901 \r
7902         if (ret != ERR_NO_ERROR)\r
7903         {\r
7904                 // エラー発生\r
7905                 CmdPrintError(c, ret);\r
7906                 FreeParamValueList(o);\r
7907                 return ret;\r
7908         }\r
7909 \r
7910         FreeParamValueList(o);\r
7911 \r
7912         return 0;\r
7913 }\r
7914 \r
7915 // インターネット接続の維持機能の無効化\r
7916 UINT PsKeepDisable(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)\r
7917 {\r
7918         LIST *o;\r
7919         PS *ps = (PS *)param;\r
7920         UINT ret = 0;\r
7921         RPC_KEEP t;\r
7922 \r
7923         o = ParseCommandList(c, cmd_name, str, NULL, 0);\r
7924         if (o == NULL)\r
7925         {\r
7926                 return ERR_INVALID_PARAMETER;\r
7927         }\r
7928 \r
7929         Zero(&t, sizeof(t));\r
7930 \r
7931         // RPC 呼び出し\r
7932         ret = ScGetKeep(ps->Rpc, &t);\r
7933 \r
7934         if (ret != ERR_NO_ERROR)\r
7935         {\r
7936                 // エラー発生\r
7937                 CmdPrintError(c, ret);\r
7938                 FreeParamValueList(o);\r
7939                 return ret;\r
7940         }\r
7941 \r
7942         t.UseKeepConnect = false;\r
7943 \r
7944         ret = ScSetKeep(ps->Rpc, &t);\r
7945 \r
7946         if (ret != ERR_NO_ERROR)\r
7947         {\r
7948                 // エラー発生\r
7949                 CmdPrintError(c, ret);\r
7950                 FreeParamValueList(o);\r
7951                 return ret;\r
7952         }\r
7953 \r
7954         FreeParamValueList(o);\r
7955 \r
7956         return 0;\r
7957 }\r
7958 \r
7959 // tcp または udp の評価\r
7960 bool CmdEvalTcpOrUdp(CONSOLE *c, wchar_t *str, void *param)\r
7961 {\r
7962         // 引数チェック\r
7963         if (c == NULL || str == NULL)\r
7964         {\r
7965                 return false;\r
7966         }\r
7967 \r
7968         if (UniStrCmpi(str, L"tcp") == 0 || UniStrCmpi(str, L"udp") == 0)\r
7969         {\r
7970                 return true;\r
7971         }\r
7972 \r
7973         c->Write(c, _UU("CMD_KeepSet_EVAL_TCP_UDP"));\r
7974 \r
7975         return false;\r
7976 }\r
7977 \r
7978 // syslog 設定の有効化\r
7979 UINT PsSyslogEnable(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)\r
7980 {\r
7981         LIST *o;\r
7982         PS *ps = (PS *)param;\r
7983         UINT ret = 0;\r
7984         SYSLOG_SETTING t;\r
7985         CMD_EVAL_MIN_MAX minmax = {"CMD_SyslogEnable_MINMAX", 1, 3};\r
7986         char *host;\r
7987         UINT port;\r
7988 \r
7989         // 指定できるパラメータ リスト\r
7990         PARAM args[] =\r
7991         {\r
7992                 // "name", prompt_proc, prompt_param, eval_proc, eval_param\r
7993                 {"[1|2|3]", CmdPrompt, _UU("CMD_SyslogEnable_Prompt_123"), CmdEvalMinMax, &minmax},\r
7994                 {"HOST", CmdPrompt, _UU("CMD_SyslogEnable_Prompt_HOST"), CmdEvalHostAndPort, (void *)SYSLOG_PORT},\r
7995         };\r
7996 \r
7997         o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));\r
7998         if (o == NULL)\r
7999         {\r
8000                 return ERR_INVALID_PARAMETER;\r
8001         }\r
8002 \r
8003         Zero(&t, sizeof(t));\r
8004 \r
8005         if (ParseHostPort(GetParamStr(o, "HOST"), &host, &port, SYSLOG_PORT))\r
8006         {\r
8007                 StrCpy(t.Hostname, sizeof(t.Hostname), host);\r
8008                 t.Port = port;\r
8009                 t.SaveType = GetParamInt(o, "[1|2|3]");\r
8010 \r
8011                 Free(host);\r
8012 \r
8013                 // RPC 呼び出し\r
8014                 ret = ScSetSysLog(ps->Rpc, &t);\r
8015 \r
8016                 if (ret != ERR_NO_ERROR)\r
8017                 {\r
8018                         // エラー発生\r
8019                         CmdPrintError(c, ret);\r
8020                         FreeParamValueList(o);\r
8021                         return ret;\r
8022                 }\r
8023         }\r
8024 \r
8025         FreeParamValueList(o);\r
8026 \r
8027         return 0;\r
8028 }\r
8029 \r
8030 // syslog 設定の無効化\r
8031 UINT PsSyslogDisable(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)\r
8032 {\r
8033         LIST *o;\r
8034         PS *ps = (PS *)param;\r
8035         UINT ret = 0;\r
8036         SYSLOG_SETTING t;\r
8037 \r
8038         o = ParseCommandList(c, cmd_name, str, NULL, 0);\r
8039         if (o == NULL)\r
8040         {\r
8041                 return ERR_INVALID_PARAMETER;\r
8042         }\r
8043 \r
8044         Zero(&t, sizeof(t));\r
8045 \r
8046         // RPC 呼び出し\r
8047         ret = ScGetSysLog(ps->Rpc, &t);\r
8048 \r
8049         if (ret != ERR_NO_ERROR)\r
8050         {\r
8051                 // エラー発生\r
8052                 CmdPrintError(c, ret);\r
8053                 FreeParamValueList(o);\r
8054                 return ret;\r
8055         }\r
8056 \r
8057         t.SaveType = SYSLOG_NONE;\r
8058 \r
8059         // RPC 呼び出し\r
8060         ret = ScSetSysLog(ps->Rpc, &t);\r
8061 \r
8062         if (ret != ERR_NO_ERROR)\r
8063         {\r
8064                 // エラー発生\r
8065                 CmdPrintError(c, ret);\r
8066                 FreeParamValueList(o);\r
8067                 return ret;\r
8068         }\r
8069 \r
8070         FreeParamValueList(o);\r
8071 \r
8072         return 0;\r
8073 }\r
8074 \r
8075 // syslog 設定の取得\r
8076 UINT PsSyslogGet(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)\r
8077 {\r
8078         LIST *o;\r
8079         PS *ps = (PS *)param;\r
8080         UINT ret = 0;\r
8081         SYSLOG_SETTING t;\r
8082 \r
8083         o = ParseCommandList(c, cmd_name, str, NULL, 0);\r
8084         if (o == NULL)\r
8085         {\r
8086                 return ERR_INVALID_PARAMETER;\r
8087         }\r
8088 \r
8089         Zero(&t, sizeof(t));\r
8090 \r
8091         // RPC 呼び出し\r
8092         ret = ScGetSysLog(ps->Rpc, &t);\r
8093 \r
8094         if (ret != ERR_NO_ERROR)\r
8095         {\r
8096                 // エラー発生\r
8097                 CmdPrintError(c, ret);\r
8098                 FreeParamValueList(o);\r
8099                 return ret;\r
8100         }\r
8101         else\r
8102         {\r
8103                 wchar_t tmp[MAX_SIZE];\r
8104                 CT *ct = CtNewStandard();\r
8105 \r
8106                 CtInsert(ct, _UU("CMD_SyslogGet_COLUMN_1"), GetSyslogSettingName(t.SaveType));\r
8107 \r
8108                 if (t.SaveType != SYSLOG_NONE)\r
8109                 {\r
8110                         StrToUni(tmp, sizeof(tmp), t.Hostname);\r
8111                         CtInsert(ct, _UU("CMD_SyslogGet_COLUMN_2"), tmp);\r
8112 \r
8113                         UniToStru(tmp, t.Port);\r
8114                         CtInsert(ct, _UU("CMD_SyslogGet_COLUMN_3"), tmp);\r
8115                 }\r
8116 \r
8117                 CtFree(ct, c);\r
8118         }\r
8119 \r
8120         FreeParamValueList(o);\r
8121 \r
8122         return 0;\r
8123 }\r
8124 \r
8125 // syslog 設定名を取得\r
8126 wchar_t *GetSyslogSettingName(UINT n)\r
8127 {\r
8128         char tmp[MAX_PATH];\r
8129 \r
8130         Format(tmp, sizeof(tmp), "SM_SYSLOG_%u", n);\r
8131 \r
8132         return _UU(tmp);\r
8133 }\r
8134 \r
8135 // インターネット接続の維持機能の設定\r
8136 UINT PsKeepSet(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)\r
8137 {\r
8138         LIST *o;\r
8139         PS *ps = (PS *)param;\r
8140         UINT ret = 0;\r
8141         RPC_KEEP t;\r
8142         char *host;\r
8143         UINT port;\r
8144         // 指定できるパラメータ リスト\r
8145         PARAM args[] =\r
8146         {\r
8147                 // "name", prompt_proc, prompt_param, eval_proc, eval_param\r
8148                 {"HOST", CmdPrompt, _UU("CMD_KeepSet_PROMPT_HOST"), CmdEvalHostAndPort, NULL},\r
8149                 {"PROTOCOL", CmdPrompt, _UU("CMD_KeepSet_PROMPT_PROTOCOL"), CmdEvalTcpOrUdp, NULL},\r
8150                 {"INTERVAL", CmdPrompt, _UU("CMD_KeepSet_PROMPT_INTERVAL"), NULL, NULL},\r
8151         };\r
8152 \r
8153         o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));\r
8154         if (o == NULL)\r
8155         {\r
8156                 return ERR_INVALID_PARAMETER;\r
8157         }\r
8158 \r
8159         Zero(&t, sizeof(t));\r
8160 \r
8161         // RPC 呼び出し\r
8162         ret = ScGetKeep(ps->Rpc, &t);\r
8163 \r
8164         if (ret != ERR_NO_ERROR)\r
8165         {\r
8166                 // エラー発生\r
8167                 CmdPrintError(c, ret);\r
8168                 FreeParamValueList(o);\r
8169                 return ret;\r
8170         }\r
8171 \r
8172         if (ParseHostPort(GetParamStr(o, "HOST"), &host, &port, 0))\r
8173         {\r
8174                 StrCpy(t.KeepConnectHost, sizeof(t.KeepConnectHost), host);\r
8175                 t.KeepConnectPort = port;\r
8176                 t.KeepConnectInterval = GetParamInt(o, "INTERVAL");\r
8177                 t.KeepConnectProtocol = (StrCmpi(GetParamStr(o, "PROTOCOL"), "tcp") == 0) ? 0 : 1;\r
8178                 Free(host);\r
8179 \r
8180                 // RPC 呼び出し\r
8181                 ret = ScSetKeep(ps->Rpc, &t);\r
8182 \r
8183                 if (ret != ERR_NO_ERROR)\r
8184                 {\r
8185                         // エラー発生\r
8186                         CmdPrintError(c, ret);\r
8187                         FreeParamValueList(o);\r
8188                         return ret;\r
8189                 }\r
8190         }\r
8191 \r
8192         FreeParamValueList(o);\r
8193 \r
8194         return 0;\r
8195 }\r
8196 \r
8197 // インターネット接続の維持機能の取得\r
8198 UINT PsKeepGet(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)\r
8199 {\r
8200         LIST *o;\r
8201         PS *ps = (PS *)param;\r
8202         UINT ret = 0;\r
8203         RPC_KEEP t;\r
8204 \r
8205         o = ParseCommandList(c, cmd_name, str, NULL, 0);\r
8206         if (o == NULL)\r
8207         {\r
8208                 return ERR_INVALID_PARAMETER;\r
8209         }\r
8210 \r
8211         Zero(&t, sizeof(t));\r
8212 \r
8213         // RPC 呼び出し\r
8214         ret = ScGetKeep(ps->Rpc, &t);\r
8215 \r
8216         if (ret != ERR_NO_ERROR)\r
8217         {\r
8218                 // エラー発生\r
8219                 CmdPrintError(c, ret);\r
8220                 FreeParamValueList(o);\r
8221                 return ret;\r
8222         }\r
8223         else\r
8224         {\r
8225                 wchar_t tmp[MAX_SIZE];\r
8226                 CT *ct = CtNewStandard();\r
8227 \r
8228                 StrToUni(tmp, sizeof(tmp), t.KeepConnectHost);\r
8229                 CtInsert(ct, _UU("CMD_KeepGet_COLUMN_1"), tmp);\r
8230 \r
8231                 UniToStru(tmp, t.KeepConnectPort);\r
8232                 CtInsert(ct, _UU("CMD_KeepGet_COLUMN_2"), tmp);\r
8233 \r
8234                 UniToStru(tmp, t.KeepConnectInterval);\r
8235                 CtInsert(ct, _UU("CMD_KeepGet_COLUMN_3"), tmp);\r
8236 \r
8237                 CtInsert(ct, _UU("CMD_KeepGet_COLUMN_4"),\r
8238                         t.KeepConnectProtocol == 0 ? L"TCP/IP" : L"UDP/IP");\r
8239 \r
8240                 CtInsert(ct, _UU("CMD_KeepGet_COLUMN_5"),\r
8241                         t.UseKeepConnect ? _UU("SM_ACCESS_ENABLE") : _UU("SM_ACCESS_DISABLE"));\r
8242 \r
8243                 CtFree(ct, c);\r
8244         }\r
8245 \r
8246         FreeParamValueList(o);\r
8247 \r
8248         return 0;\r
8249 }\r
8250 \r
8251 // コネクション種類文字列の取得\r
8252 wchar_t *GetConnectionTypeStr(UINT type)\r
8253 {\r
8254         char tmp[MAX_SIZE];\r
8255         Format(tmp, sizeof(tmp), "SM_CONNECTION_TYPE_%u", type);\r
8256 \r
8257         return _UU(tmp);\r
8258 }\r
8259 \r
8260 // VPN Server に接続中の TCP コネクション一覧の取得\r
8261 UINT PsConnectionList(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)\r
8262 {\r
8263         LIST *o;\r
8264         PS *ps = (PS *)param;\r
8265         UINT ret = 0;\r
8266         RPC_ENUM_CONNECTION t;\r
8267         UINT i;\r
8268         CT *ct;\r
8269 \r
8270         o = ParseCommandList(c, cmd_name, str, NULL, 0);\r
8271         if (o == NULL)\r
8272         {\r
8273                 return ERR_INVALID_PARAMETER;\r
8274         }\r
8275 \r
8276         Zero(&t, sizeof(t));\r
8277 \r
8278         // RPC 呼び出し\r
8279         ret = ScEnumConnection(ps->Rpc, &t);\r
8280 \r
8281         if (ret != ERR_NO_ERROR)\r
8282         {\r
8283                 // エラー発生\r
8284                 CmdPrintError(c, ret);\r
8285                 FreeParamValueList(o);\r
8286                 return ret;\r
8287         }\r
8288 \r
8289         ct = CtNew();\r
8290         CtInsertColumn(ct, _UU("SM_CONN_COLUMN_1"), false);\r
8291         CtInsertColumn(ct, _UU("SM_CONN_COLUMN_2"), false);\r
8292         CtInsertColumn(ct, _UU("SM_CONN_COLUMN_3"), false);\r
8293         CtInsertColumn(ct, _UU("SM_CONN_COLUMN_4"), false);\r
8294 \r
8295         for (i = 0;i < t.NumConnection;i++)\r
8296         {\r
8297                 wchar_t tmp[MAX_SIZE];\r
8298                 wchar_t name[MAX_SIZE];\r
8299                 wchar_t datetime[MAX_SIZE];\r
8300                 RPC_ENUM_CONNECTION_ITEM *e = &t.Connections[i];\r
8301 \r
8302                 StrToUni(name, sizeof(name), e->Name);\r
8303                 UniFormat(tmp, sizeof(tmp), _UU("SM_HOSTNAME_AND_PORT"), e->Hostname, e->Port);\r
8304                 GetDateTimeStrEx64(datetime, sizeof(datetime), SystemToLocal64(e->ConnectedTime), NULL);\r
8305 \r
8306                 CtInsert(ct, name, tmp, datetime,\r
8307                         GetConnectionTypeStr(e->Type));\r
8308         }\r
8309 \r
8310         CtFree(ct, c);\r
8311 \r
8312         FreeRpcEnumConnetion(&t);\r
8313 \r
8314         FreeParamValueList(o);\r
8315 \r
8316         return 0;\r
8317 }\r
8318 \r
8319 // VPN Server に接続中の TCP コネクションの情報の取得\r
8320 UINT PsConnectionGet(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)\r
8321 {\r
8322         LIST *o;\r
8323         PS *ps = (PS *)param;\r
8324         UINT ret = 0;\r
8325         RPC_CONNECTION_INFO t;\r
8326         CT *ct;\r
8327         wchar_t tmp[MAX_SIZE];\r
8328         // 指定できるパラメータ リスト\r
8329         PARAM args[] =\r
8330         {\r
8331                 {"[name]", CmdPrompt, _UU("CMD_ConnectionGet_PROMPT_NAME"), CmdEvalNotEmpty, NULL},\r
8332         };\r
8333 \r
8334         o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));\r
8335         if (o == NULL)\r
8336         {\r
8337                 return ERR_INVALID_PARAMETER;\r
8338         }\r
8339 \r
8340         Zero(&t, sizeof(t));\r
8341 \r
8342         StrCpy(t.Name, sizeof(t.Name), GetParamStr(o, "[name]"));\r
8343 \r
8344         // RPC 呼び出し\r
8345         ret = ScGetConnectionInfo(ps->Rpc, &t);\r
8346 \r
8347         if (ret != ERR_NO_ERROR)\r
8348         {\r
8349                 // エラー発生\r
8350                 CmdPrintError(c, ret);\r
8351                 FreeParamValueList(o);\r
8352                 return ret;\r
8353         }\r
8354         else\r
8355         {\r
8356                 ct = CtNewStandard();\r
8357 \r
8358                 StrToUni(tmp, sizeof(tmp), t.Name);\r
8359                 CtInsert(ct, _UU("SM_CONNINFO_NAME"), tmp);\r
8360 \r
8361                 CtInsert(ct, _UU("SM_CONNINFO_TYPE"), GetConnectionTypeStr(t.Type));\r
8362 \r
8363                 StrToUni(tmp, sizeof(tmp), t.Hostname);\r
8364                 CtInsert(ct, _UU("SM_CONNINFO_HOSTNAME"), tmp);\r
8365 \r
8366                 UniToStru(tmp, t.Port);\r
8367                 CtInsert(ct, _UU("SM_CONNINFO_PORT"), tmp);\r
8368 \r
8369                 GetDateTimeStrEx64(tmp, sizeof(tmp), SystemToLocal64(t.ConnectedTime), NULL);\r
8370                 CtInsert(ct, _UU("SM_CONNINFO_TIME"), tmp);\r
8371 \r
8372                 StrToUni(tmp, sizeof(tmp), t.ServerStr);\r
8373                 CtInsert(ct, _UU("SM_CONNINFO_SERVER_STR"), tmp);\r
8374 \r
8375                 UniFormat(tmp, sizeof(tmp), L"%u.%02u", t.ServerVer / 100, t.ServerVer % 100);\r
8376                 CtInsert(ct, _UU("SM_CONNINFO_SERVER_VER"), tmp);\r
8377 \r
8378                 UniToStru(tmp, t.ServerBuild);\r
8379                 CtInsert(ct, _UU("SM_CONNINFO_SERVER_BUILD"), tmp);\r
8380 \r
8381                 if (StrLen(t.ClientStr) != 0)\r
8382                 {\r
8383                         StrToUni(tmp, sizeof(tmp), t.ClientStr);\r
8384                         CtInsert(ct, _UU("SM_CONNINFO_CLIENT_STR"), tmp);\r
8385 \r
8386                         UniFormat(tmp, sizeof(tmp), L"%u.%02u", t.ClientVer / 100, t.ClientVer % 100);\r
8387                         CtInsert(ct, _UU("SM_CONNINFO_CLIENT_VER"), tmp);\r
8388 \r
8389                         UniToStru(tmp, t.ClientBuild);\r
8390                         CtInsert(ct, _UU("SM_CONNINFO_CLIENT_BUILD"), tmp);\r
8391                 }\r
8392 \r
8393                 CtFree(ct, c);\r
8394         }\r
8395 \r
8396         FreeParamValueList(o);\r
8397 \r
8398         return 0;\r
8399 }\r
8400 \r
8401 // VPN Server に接続中の TCP コネクションの切断\r
8402 UINT PsConnectionDisconnect(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)\r
8403 {\r
8404         LIST *o;\r
8405         PS *ps = (PS *)param;\r
8406         UINT ret = 0;\r
8407         RPC_DISCONNECT_CONNECTION t;\r
8408         // 指定できるパラメータ リスト\r
8409         PARAM args[] =\r
8410         {\r
8411                 {"[name]", CmdPrompt, _UU("CMD_ConnectionDisconnect_PROMPT_NAME"), CmdEvalNotEmpty, NULL},\r
8412         };\r
8413 \r
8414         o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));\r
8415         if (o == NULL)\r
8416         {\r
8417                 return ERR_INVALID_PARAMETER;\r
8418         }\r
8419 \r
8420         Zero(&t, sizeof(t));\r
8421 \r
8422         StrCpy(t.Name, sizeof(t.Name), GetParamStr(o, "[name]"));\r
8423 \r
8424         // RPC 呼び出し\r
8425         ret = ScDisconnectConnection(ps->Rpc, &t);\r
8426 \r
8427         if (ret != ERR_NO_ERROR)\r
8428         {\r
8429                 // エラー発生\r
8430                 CmdPrintError(c, ret);\r
8431                 FreeParamValueList(o);\r
8432                 return ret;\r
8433         }\r
8434 \r
8435         FreeParamValueList(o);\r
8436 \r
8437         return 0;\r
8438 }\r
8439 \r
8440 // ローカル ブリッジに使用できる LAN カード一覧の取得\r
8441 UINT PsBridgeDeviceList(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)\r
8442 {\r
8443         LIST *o;\r
8444         PS *ps = (PS *)param;\r
8445         UINT ret = 0;\r
8446         RPC_ENUM_ETH t;\r
8447         UINT i;\r
8448 \r
8449         o = ParseCommandList(c, cmd_name, str, NULL, 0);\r
8450         if (o == NULL)\r
8451         {\r
8452                 return ERR_INVALID_PARAMETER;\r
8453         }\r
8454 \r
8455         Zero(&t, sizeof(t));\r
8456 \r
8457         // RPC 呼び出し\r
8458         ret = ScEnumEthernet(ps->Rpc, &t);\r
8459 \r
8460         if (ret != ERR_NO_ERROR)\r
8461         {\r
8462                 // エラー発生\r
8463                 CmdPrintError(c, ret);\r
8464                 FreeParamValueList(o);\r
8465                 return ret;\r
8466         }\r
8467 \r
8468         for (i = 0;i < t.NumItem;i++)\r
8469         {\r
8470                 RPC_ENUM_ETH_ITEM *item = &t.Items[i];\r
8471                 wchar_t tmp[MAX_SIZE * 2];\r
8472 \r
8473                 if(UniIsEmptyStr(item->NetworkConnectionName) == false)\r
8474                 {\r
8475                         UniFormat(tmp, sizeof(tmp), BRIDGE_NETWORK_CONNECTION_STR, item->NetworkConnectionName, item->DeviceName);\r
8476                 }\r
8477                 else\r
8478                 {\r
8479                         StrToUni(tmp, sizeof(tmp), item->DeviceName);\r
8480                 }\r
8481                 c->Write(c, tmp);\r
8482         }\r
8483 \r
8484         FreeRpcEnumEth(&t);\r
8485 \r
8486         FreeParamValueList(o);\r
8487 \r
8488         return 0;\r
8489 }\r
8490 \r
8491 // ローカル ブリッジ接続の一覧の取得\r
8492 UINT PsBridgeList(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)\r
8493 {\r
8494         LIST *o;\r
8495         PS *ps = (PS *)param;\r
8496         UINT ret = 0;\r
8497         RPC_ENUM_LOCALBRIDGE t;\r
8498         UINT i;\r
8499         CT *ct;\r
8500 \r
8501         o = ParseCommandList(c, cmd_name, str, NULL, 0);\r
8502         if (o == NULL)\r
8503         {\r
8504                 return ERR_INVALID_PARAMETER;\r
8505         }\r
8506 \r
8507         Zero(&t, sizeof(t));\r
8508 \r
8509         // RPC 呼び出し\r
8510         ret = ScEnumLocalBridge(ps->Rpc, &t);\r
8511 \r
8512         if (ret != ERR_NO_ERROR)\r
8513         {\r
8514                 // エラー発生\r
8515                 CmdPrintError(c, ret);\r
8516                 FreeParamValueList(o);\r
8517                 return ret;\r
8518         }\r
8519 \r
8520         ct = CtNew();\r
8521 \r
8522         CtInsertColumn(ct, _UU("SM_BRIDGE_COLUMN_1"), false);\r
8523         CtInsertColumn(ct, _UU("SM_BRIDGE_COLUMN_2"), false);\r
8524         CtInsertColumn(ct, _UU("SM_BRIDGE_COLUMN_3"), false);\r
8525         CtInsertColumn(ct, _UU("SM_BRIDGE_COLUMN_4"), false);\r
8526 \r
8527         for (i = 0;i < t.NumItem;i++)\r
8528         {\r
8529                 RPC_LOCALBRIDGE *e = &t.Items[i];\r
8530                 wchar_t name[MAX_SIZE];\r
8531                 wchar_t nic[MAX_SIZE];\r
8532                 wchar_t hub[MAX_SIZE];\r
8533                 wchar_t *status = _UU("SM_BRIDGE_OFFLINE");\r
8534 \r
8535                 UniToStru(name, i + 1);\r
8536                 StrToUni(nic, sizeof(nic), e->DeviceName);\r
8537                 StrToUni(hub, sizeof(hub), e->HubName);\r
8538 \r
8539                 if (e->Online)\r
8540                 {\r
8541                         status = e->Active ? _UU("SM_BRIDGE_ONLINE") : _UU("SM_BRIDGE_ERROR");\r
8542                 }\r
8543 \r
8544                 CtInsert(ct, name, hub, nic, status);\r
8545         }\r
8546 \r
8547         CtFree(ct, c);\r
8548 \r
8549         FreeRpcEnumLocalBridge(&t);\r
8550 \r
8551         FreeParamValueList(o);\r
8552 \r
8553         return 0;\r
8554 }\r
8555 \r
8556 // ローカル ブリッジ接続の作成\r
8557 UINT PsBridgeCreate(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)\r
8558 {\r
8559         LIST *o;\r
8560         PS *ps = (PS *)param;\r
8561         UINT ret = 0;\r
8562         RPC_LOCALBRIDGE t;\r
8563         // 指定できるパラメータ リスト\r
8564         PARAM args[] =\r
8565         {\r
8566                 // "name", prompt_proc, prompt_param, eval_proc, eval_param\r
8567                 {"[hubname]", CmdPrompt, _UU("CMD_BridgeCreate_PROMPT_HUBNAME"), CmdEvalNotEmpty, NULL},\r
8568                 {"DEVICE", CmdPrompt, _UU("CMD_BridgeCreate_PROMPT_DEVICE"), CmdEvalNotEmpty, NULL},\r
8569                 {"TAP", NULL, NULL, NULL, NULL},\r
8570         };\r
8571 \r
8572         o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));\r
8573         if (o == NULL)\r
8574         {\r
8575                 return ERR_INVALID_PARAMETER;\r
8576         }\r
8577 \r
8578         Zero(&t, sizeof(t));\r
8579 \r
8580         t.Active = true;\r
8581         StrCpy(t.DeviceName, sizeof(t.DeviceName), GetParamStr(o, "DEVICE"));\r
8582         StrCpy(t.HubName, sizeof(t.HubName), GetParamStr(o, "[hubname]"));\r
8583         t.Online = true;\r
8584         t.TapMode = GetParamYes(o, "TAP");\r
8585 \r
8586         // RPC 呼び出し\r
8587         ret = ScAddLocalBridge(ps->Rpc, &t);\r
8588 \r
8589         if (ret != ERR_NO_ERROR)\r
8590         {\r
8591                 // エラー発生\r
8592                 CmdPrintError(c, ret);\r
8593                 FreeParamValueList(o);\r
8594                 return ret;\r
8595         }\r
8596         else\r
8597         {\r
8598                 c->Write(c, _UU("SM_BRIDGE_INTEL"));\r
8599                 c->Write(c, L"");\r
8600         }\r
8601 \r
8602         FreeParamValueList(o);\r
8603 \r
8604         return 0;\r
8605 }\r
8606 \r
8607 // ローカル ブリッジ接続の削除\r
8608 UINT PsBridgeDelete(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)\r
8609 {\r
8610         LIST *o;\r
8611         PS *ps = (PS *)param;\r
8612         UINT ret = 0;\r
8613         RPC_LOCALBRIDGE t;\r
8614         // 指定できるパラメータ リスト\r
8615         PARAM args[] =\r
8616         {\r
8617                 // "name", prompt_proc, prompt_param, eval_proc, eval_param\r
8618                 {"[hubname]", CmdPrompt, _UU("CMD_BridgeDelete_PROMPT_HUBNAME"), CmdEvalNotEmpty, NULL},\r
8619                 {"DEVICE", CmdPrompt, _UU("CMD_BridgeDelete_PROMPT_DEVICE"), CmdEvalNotEmpty, NULL},\r
8620         };\r
8621 \r
8622         o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));\r
8623         if (o == NULL)\r
8624         {\r
8625                 return ERR_INVALID_PARAMETER;\r
8626         }\r
8627 \r
8628         Zero(&t, sizeof(t));\r
8629 \r
8630         StrCpy(t.DeviceName, sizeof(t.DeviceName), GetParamStr(o, "DEVICE"));\r
8631         StrCpy(t.HubName, sizeof(t.HubName), GetParamStr(o, "[hubname]"));\r
8632 \r
8633         // RPC 呼び出し\r
8634         ret = ScDeleteLocalBridge(ps->Rpc, &t);\r
8635 \r
8636         if (ret != ERR_NO_ERROR)\r
8637         {\r
8638                 // エラー発生\r
8639                 CmdPrintError(c, ret);\r
8640                 FreeParamValueList(o);\r
8641                 return ret;\r
8642         }\r
8643 \r
8644         FreeParamValueList(o);\r
8645 \r
8646         return 0;\r
8647 }\r
8648 \r
8649 // サーバーの機能・能力一覧の取得\r
8650 UINT PsCaps(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)\r
8651 {\r
8652         LIST *o;\r
8653         PS *ps = (PS *)param;\r
8654         UINT ret = 0;\r
8655         CAPSLIST *t;\r
8656 \r
8657         o = ParseCommandList(c, cmd_name, str, NULL, 0);\r
8658         if (o == NULL)\r
8659         {\r
8660                 return ERR_INVALID_PARAMETER;\r
8661         }\r
8662 \r
8663         // RPC 呼び出し\r
8664         t = ScGetCapsEx(ps->Rpc);\r
8665 \r
8666         if (ret != ERR_NO_ERROR)\r
8667         {\r
8668                 // エラー発生\r
8669                 CmdPrintError(c, ret);\r
8670                 FreeParamValueList(o);\r
8671                 return ret;\r
8672         }\r
8673         else\r
8674         {\r
8675                 UINT i;\r
8676                 CT *ct;\r
8677 \r
8678                 ct = CtNewStandard();\r
8679 \r
8680                 for (i = 0;i < LIST_NUM(t->CapsList);i++)\r
8681                 {\r
8682                         CAPS *c = LIST_DATA(t->CapsList, i);\r
8683                         wchar_t title[MAX_SIZE];\r
8684                         char name[256];\r
8685 \r
8686                         Format(name, sizeof(name), "CT_%s", c->Name);\r
8687 \r
8688                         UniStrCpy(title, sizeof(title), _UU(name));\r
8689 \r
8690                         if (UniIsEmptyStr(title))\r
8691                         {\r
8692                                 UniFormat(title, sizeof(title), L"%S", (StrLen(c->Name) >= 2) ? c->Name + 2 : c->Name);\r
8693                         }\r
8694 \r
8695                         if (StartWith(c->Name, "b_"))\r
8696                         {\r
8697                                 bool icon_pass = c->Value == 0 ? false : true;\r
8698                                 if (StrCmpi(c->Name, "b_must_install_pcap") == 0)\r
8699                                 {\r
8700                                         // WinPcap の項目のみ反転する\r
8701                                         icon_pass = !icon_pass;\r
8702                                 }\r
8703                                 CtInsert(ct, title, c->Value == 0 ? _UU("CAPS_NO") : _UU("CAPS_YES"));\r
8704                         }\r
8705                         else\r
8706                         {\r
8707                                 wchar_t str[64];\r
8708                                 UniToStru(str, c->Value);\r
8709                                 CtInsert(ct, title, str);\r
8710                         }\r
8711                 }\r
8712 \r
8713                 CtFree(ct, c);\r
8714         }\r
8715 \r
8716         FreeCapsList(t);\r
8717 \r
8718         FreeParamValueList(o);\r
8719 \r
8720         return 0;\r
8721 }\r
8722 \r
8723 // VPN Server サービスの再起動\r
8724 UINT PsReboot(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)\r
8725 {\r
8726         LIST *o;\r
8727         PS *ps = (PS *)param;\r
8728         UINT ret = 0;\r
8729         RPC_TEST t;\r
8730         // 指定できるパラメータ リスト\r
8731         PARAM args[] =\r
8732         {\r
8733                 {"RESETCONFIG", NULL, NULL, NULL, NULL},\r
8734         };\r
8735 \r
8736         o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));\r
8737         if (o == NULL)\r
8738         {\r
8739                 return ERR_INVALID_PARAMETER;\r
8740         }\r
8741 \r
8742         Zero(&t, sizeof(t));\r
8743 \r
8744         t.IntValue = GetParamYes(o, "RESETCONFIG") ? 1 : 0;\r
8745 \r
8746         // RPC 呼び出し\r
8747         ret = ScRebootServer(ps->Rpc, &t);\r
8748 \r
8749         if (ret != ERR_NO_ERROR)\r
8750         {\r
8751                 // エラー発生\r
8752                 CmdPrintError(c, ret);\r
8753                 FreeParamValueList(o);\r
8754                 return ret;\r
8755         }\r
8756 \r
8757         FreeRpcTest(&t);\r
8758 \r
8759         FreeParamValueList(o);\r
8760 \r
8761         return 0;\r
8762 }\r
8763 \r
8764 // VPN Server の現在のコンフィグレーションの取得\r
8765 UINT PsConfigGet(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)\r
8766 {\r
8767         LIST *o;\r
8768         PS *ps = (PS *)param;\r
8769         UINT ret = 0;\r
8770         RPC_CONFIG t;\r
8771         // 指定できるパラメータ リスト\r
8772         PARAM args[] =\r
8773         {\r
8774                 // "name", prompt_proc, prompt_param, eval_proc, eval_param\r
8775                 {"[path]", NULL, NULL, NULL, NULL},\r
8776         };\r
8777 \r
8778         o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));\r
8779         if (o == NULL)\r
8780         {\r
8781                 return ERR_INVALID_PARAMETER;\r
8782         }\r
8783 \r
8784         Zero(&t, sizeof(t));\r
8785 \r
8786         // RPC 呼び出し\r
8787         ret = ScGetConfig(ps->Rpc, &t);\r
8788 \r
8789         if (ret != ERR_NO_ERROR)\r
8790         {\r
8791                 // エラー発生\r
8792                 CmdPrintError(c, ret);\r
8793                 FreeParamValueList(o);\r
8794                 return ret;\r
8795         }\r
8796         else\r
8797         {\r
8798                 char *filename = GetParamStr(o, "[path]");\r
8799 \r
8800                 if (IsEmptyStr(filename))\r
8801                 {\r
8802                         // 画面に表示\r
8803                         wchar_t tmp[MAX_SIZE];\r
8804                         UINT buf_size;\r
8805                         wchar_t *buf;\r
8806 \r
8807                         UniFormat(tmp, sizeof(tmp), _UU("CMD_ConfigGet_FILENAME"), t.FileName,\r
8808                                 StrLen(t.FileData));\r
8809                         c->Write(c, tmp);\r
8810                         c->Write(c, L"");\r
8811 \r
8812                         buf_size = CalcUtf8ToUni((BYTE *)t.FileData, StrLen(t.FileData));\r
8813                         buf = ZeroMalloc(buf_size + 32);\r
8814 \r
8815                         Utf8ToUni(buf, buf_size, (BYTE *)t.FileData, StrLen(t.FileData));\r
8816 \r
8817                         c->Write(c, buf);\r
8818                         c->Write(c, L"");\r
8819 \r
8820                         Free(buf);\r
8821                 }\r
8822                 else\r
8823                 {\r
8824                         // ファイルに保存\r
8825                         IO *io = FileCreate(filename);\r
8826 \r
8827                         if (io == NULL)\r
8828                         {\r
8829                                 c->Write(c, _UU("CMD_ConfigGet_FILE_SAVE_FAILED"));\r
8830 \r
8831                                 ret = ERR_INTERNAL_ERROR;\r
8832                         }\r
8833                         else\r
8834                         {\r
8835                                 FileWrite(io, t.FileData, StrLen(t.FileData));\r
8836                                 FileClose(io);\r
8837                         }\r
8838                 }\r
8839         }\r
8840 \r
8841         FreeRpcConfig(&t);\r
8842 \r
8843         FreeParamValueList(o);\r
8844 \r
8845         return ret;\r
8846 }\r
8847 \r
8848 // VPN Server へのコンフィグレーションの書き込み\r
8849 UINT PsConfigSet(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)\r
8850 {\r
8851         LIST *o;\r
8852         PS *ps = (PS *)param;\r
8853         UINT ret = 0;\r
8854         RPC_CONFIG t;\r
8855         char *filename;\r
8856         BUF *buf;\r
8857         // 指定できるパラメータ リスト\r
8858         PARAM args[] =\r
8859         {\r
8860                 // "name", prompt_proc, prompt_param, eval_proc, eval_param\r
8861                 {"[path]", CmdPrompt, _UU("CMD_ConfigSet_PROMPT_PATH"), CmdEvalIsFile, NULL},\r
8862         };\r
8863 \r
8864         o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));\r
8865         if (o == NULL)\r
8866         {\r
8867                 return ERR_INVALID_PARAMETER;\r
8868         }\r
8869 \r
8870         filename = GetParamStr(o, "[path]");\r
8871 \r
8872         buf = ReadDump(filename);\r
8873         if (buf == NULL)\r
8874         {\r
8875                 c->Write(c, _UU("CMD_ConfigSet_FILE_LOAD_FAILED"));\r
8876         }\r
8877         else\r
8878         {\r
8879                 Zero(&t, sizeof(t));\r
8880 \r
8881                 t.FileData = ZeroMalloc(buf->Size + 1);\r
8882                 Copy(t.FileData, buf->Buf, buf->Size);\r
8883                 FreeBuf(buf);\r
8884 \r
8885                 // RPC 呼び出し\r
8886                 ret = ScSetConfig(ps->Rpc, &t);\r
8887 \r
8888                 if (ret != ERR_NO_ERROR)\r
8889                 {\r
8890                         // エラー発生\r
8891                         CmdPrintError(c, ret);\r
8892                         FreeParamValueList(o);\r
8893                         return ret;\r
8894                 }\r
8895 \r
8896                 FreeRpcConfig(&t);\r
8897         }\r
8898 \r
8899         FreeParamValueList(o);\r
8900 \r
8901         return 0;\r
8902 }\r
8903 \r
8904 // 仮想レイヤ 3 スイッチ一覧の取得\r
8905 UINT PsRouterList(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)\r
8906 {\r
8907         LIST *o;\r
8908         PS *ps = (PS *)param;\r
8909         UINT ret = 0;\r
8910         RPC_ENUM_L3SW t;\r
8911 \r
8912         o = ParseCommandList(c, cmd_name, str, NULL, 0);\r
8913         if (o == NULL)\r
8914         {\r
8915                 return ERR_INVALID_PARAMETER;\r
8916         }\r
8917 \r
8918         Zero(&t, sizeof(t));\r
8919 \r
8920         // RPC 呼び出し\r
8921         ret = ScEnumL3Switch(ps->Rpc, &t);\r
8922 \r
8923         if (ret != ERR_NO_ERROR)\r
8924         {\r
8925                 // エラー発生\r
8926                 CmdPrintError(c, ret);\r
8927                 FreeParamValueList(o);\r
8928                 return ret;\r
8929         }\r
8930         else\r
8931         {\r
8932                 CT *ct = CtNew();\r
8933                 UINT i;\r
8934 \r
8935                 CtInsertColumn(ct, _UU("SM_L3_SW_COLUMN1"), false);\r
8936                 CtInsertColumn(ct, _UU("SM_L3_SW_COLUMN2"), false);\r
8937                 CtInsertColumn(ct, _UU("SM_L3_SW_COLUMN3"), true);\r
8938                 CtInsertColumn(ct, _UU("SM_L3_SW_COLUMN4"), true);\r
8939 \r
8940                 for (i = 0;i < t.NumItem;i++)\r
8941                 {\r
8942                         RPC_ENUM_L3SW_ITEM *e = &t.Items[i];\r
8943                         wchar_t tmp1[MAX_SIZE], *tmp2, tmp3[64], tmp4[64];\r
8944 \r
8945                         StrToUni(tmp1, sizeof(tmp1), e->Name);\r
8946                         if (e->Active == false)\r
8947                         {\r
8948                                 tmp2 = _UU("SM_L3_SW_ST_F_F");\r
8949                         }\r
8950                         else if (e->Online == false)\r
8951                         {\r
8952                                 tmp2 = _UU("SM_L3_SW_ST_T_F");\r
8953                         }\r
8954                         else\r
8955                         {\r
8956                                 tmp2 = _UU("SM_L3_SW_ST_T_T");\r
8957                         }\r
8958                         UniToStru(tmp3, e->NumInterfaces);\r
8959                         UniToStru(tmp4, e->NumTables);\r
8960 \r
8961                         CtInsert(ct,\r
8962                                 tmp1, tmp2, tmp3, tmp4);\r
8963                 }\r
8964 \r
8965                 CtFree(ct, c);\r
8966         }\r
8967 \r
8968         FreeRpcEnumL3Sw(&t);\r
8969 \r
8970         FreeParamValueList(o);\r
8971 \r
8972         return 0;\r
8973 }\r
8974 \r
8975 // 新しい仮想レイヤ 3 スイッチの定義\r
8976 UINT PsRouterAdd(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)\r
8977 {\r
8978         LIST *o;\r
8979         PS *ps = (PS *)param;\r
8980         UINT ret = 0;\r
8981         RPC_L3SW t;\r
8982         // 指定できるパラメータ リスト\r
8983         PARAM args[] =\r
8984         {\r
8985                 // "name", prompt_proc, prompt_param, eval_proc, eval_param\r
8986                 {"[name]", CmdPrompt, _UU("CMD_RouterAdd_PROMPT_NAME"), CmdEvalNotEmpty, NULL},\r
8987         };\r
8988 \r
8989         o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));\r
8990         if (o == NULL)\r
8991         {\r
8992                 return ERR_INVALID_PARAMETER;\r
8993         }\r
8994 \r
8995         Zero(&t, sizeof(t));\r
8996 \r
8997         StrCpy(t.Name, sizeof(t.Name), GetParamStr(o, "[name]"));\r
8998 \r
8999         // RPC 呼び出し\r
9000         ret = ScAddL3Switch(ps->Rpc, &t);\r
9001 \r
9002         if (ret != ERR_NO_ERROR)\r
9003         {\r
9004                 // エラー発生\r
9005                 CmdPrintError(c, ret);\r
9006                 FreeParamValueList(o);\r
9007                 return ret;\r
9008         }\r
9009 \r
9010         FreeParamValueList(o);\r
9011 \r
9012         return 0;\r
9013 }\r
9014 \r
9015 // 仮想レイヤ 3 スイッチの削除\r
9016 UINT PsRouterDelete(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)\r
9017 {\r
9018         LIST *o;\r
9019         PS *ps = (PS *)param;\r
9020         UINT ret = 0;\r
9021         RPC_L3SW t;\r
9022         // 指定できるパラメータ リスト\r
9023         PARAM args[] =\r
9024         {\r
9025                 // "name", prompt_proc, prompt_param, eval_proc, eval_param\r
9026                 {"[name]", CmdPrompt, _UU("CMD_RouterDelete_PROMPT_NAME"), CmdEvalNotEmpty, NULL},\r
9027         };\r
9028 \r
9029         o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));\r
9030         if (o == NULL)\r
9031         {\r
9032                 return ERR_INVALID_PARAMETER;\r
9033         }\r
9034 \r
9035         Zero(&t, sizeof(t));\r
9036 \r
9037         StrCpy(t.Name, sizeof(t.Name), GetParamStr(o, "[name]"));\r
9038 \r
9039         // RPC 呼び出し\r
9040         ret = ScDelL3Switch(ps->Rpc, &t);\r
9041 \r
9042         if (ret != ERR_NO_ERROR)\r
9043         {\r
9044                 // エラー発生\r
9045                 CmdPrintError(c, ret);\r
9046                 FreeParamValueList(o);\r
9047                 return ret;\r
9048         }\r
9049 \r
9050         FreeParamValueList(o);\r
9051 \r
9052         return 0;\r
9053 }\r
9054 \r
9055 // 仮想レイヤ 3 スイッチの動作の開始\r
9056 UINT PsRouterStart(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)\r
9057 {\r
9058         LIST *o;\r
9059         PS *ps = (PS *)param;\r
9060         UINT ret = 0;\r
9061         RPC_L3SW t;\r
9062         // 指定できるパラメータ リスト\r
9063         PARAM args[] =\r
9064         {\r
9065                 // "name", prompt_proc, prompt_param, eval_proc, eval_param\r
9066                 {"[name]", CmdPrompt, _UU("CMD_RouterStart_PROMPT_NAME"), CmdEvalNotEmpty, NULL},\r
9067         };\r
9068 \r
9069         o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));\r
9070         if (o == NULL)\r
9071         {\r
9072                 return ERR_INVALID_PARAMETER;\r
9073         }\r
9074 \r
9075         Zero(&t, sizeof(t));\r
9076 \r
9077         StrCpy(t.Name, sizeof(t.Name), GetParamStr(o, "[name]"));\r
9078 \r
9079         // RPC 呼び出し\r
9080         ret = ScStartL3Switch(ps->Rpc, &t);\r
9081 \r
9082         if (ret != ERR_NO_ERROR)\r
9083         {\r
9084                 // エラー発生\r
9085                 CmdPrintError(c, ret);\r
9086                 FreeParamValueList(o);\r
9087                 return ret;\r
9088         }\r
9089 \r
9090         FreeParamValueList(o);\r
9091 \r
9092         return 0;\r
9093 }\r
9094 \r
9095 // 仮想レイヤ 3 スイッチの動作の停止\r
9096 UINT PsRouterStop(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)\r
9097 {\r
9098         LIST *o;\r
9099         PS *ps = (PS *)param;\r
9100         UINT ret = 0;\r
9101         RPC_L3SW t;\r
9102         // 指定できるパラメータ リスト\r
9103         PARAM args[] =\r
9104         {\r
9105                 // "name", prompt_proc, prompt_param, eval_proc, eval_param\r
9106                 {"[name]", CmdPrompt, _UU("CMD_RouterStop_PROMPT_NAME"), CmdEvalNotEmpty, NULL},\r
9107         };\r
9108 \r
9109         o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));\r
9110         if (o == NULL)\r
9111         {\r
9112                 return ERR_INVALID_PARAMETER;\r
9113         }\r
9114 \r
9115         Zero(&t, sizeof(t));\r
9116 \r
9117         StrCpy(t.Name, sizeof(t.Name), GetParamStr(o, "[name]"));\r
9118 \r
9119         // RPC 呼び出し\r
9120         ret = ScStopL3Switch(ps->Rpc, &t);\r
9121 \r
9122         if (ret != ERR_NO_ERROR)\r
9123         {\r
9124                 // エラー発生\r
9125                 CmdPrintError(c, ret);\r
9126                 FreeParamValueList(o);\r
9127                 return ret;\r
9128         }\r
9129 \r
9130         FreeParamValueList(o);\r
9131 \r
9132         return 0;\r
9133 }\r
9134 \r
9135 // 仮想レイヤ 3 スイッチに登録されているインターフェイス一覧の取得\r
9136 UINT PsRouterIfList(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)\r
9137 {\r
9138         LIST *o;\r
9139         PS *ps = (PS *)param;\r
9140         UINT ret = 0;\r
9141         RPC_ENUM_L3IF t;\r
9142         // 指定できるパラメータ リスト\r
9143         PARAM args[] =\r
9144         {\r
9145                 // "name", prompt_proc, prompt_param, eval_proc, eval_param\r
9146                 {"[name]", CmdPrompt, _UU("CMD_RouterIfList_PROMPT_NAME"), CmdEvalNotEmpty, NULL},\r
9147         };\r
9148 \r
9149         o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));\r
9150         if (o == NULL)\r
9151         {\r
9152                 return ERR_INVALID_PARAMETER;\r
9153         }\r
9154 \r
9155         Zero(&t, sizeof(t));\r
9156 \r
9157         StrCpy(t.Name, sizeof(t.Name), GetParamStr(o, "[name]"));\r
9158 \r
9159         // RPC 呼び出し\r
9160         ret = ScEnumL3If(ps->Rpc, &t);\r
9161 \r
9162         if (ret != ERR_NO_ERROR)\r
9163         {\r
9164                 // エラー発生\r
9165                 CmdPrintError(c, ret);\r
9166                 FreeParamValueList(o);\r
9167                 return ret;\r
9168         }\r
9169         else\r
9170         {\r
9171                 UINT i;\r
9172                 wchar_t tmp1[MAX_SIZE];\r
9173                 wchar_t tmp2[MAX_SIZE];\r
9174                 wchar_t tmp3[MAX_SIZE];\r
9175                 CT *ct = CtNew();\r
9176 \r
9177                 CtInsertColumn(ct, _UU("SM_L3_SW_IF_COLUMN1"), false);\r
9178                 CtInsertColumn(ct, _UU("SM_L3_SW_IF_COLUMN2"), false);\r
9179                 CtInsertColumn(ct, _UU("SM_L3_SW_IF_COLUMN3"), false);\r
9180 \r
9181                 for (i = 0;i < t.NumItem;i++)\r
9182                 {\r
9183                         RPC_L3IF *e = &t.Items[i];\r
9184 \r
9185                         IPToUniStr32(tmp1, sizeof(tmp1), e->IpAddress);\r
9186                         IPToUniStr32(tmp2, sizeof(tmp2), e->SubnetMask);\r
9187                         StrToUni(tmp3, sizeof(tmp3), e->HubName);\r
9188 \r
9189                         CtInsert(ct, tmp1, tmp2, tmp3);\r
9190                 }\r
9191 \r
9192 \r
9193                 CtFree(ct, c);\r
9194         }\r
9195 \r
9196         FreeRpcEnumL3If(&t);\r
9197 \r
9198         FreeParamValueList(o);\r
9199 \r
9200         return 0;\r
9201 }\r
9202 \r
9203 // IP アドレスとマスクの評価\r
9204 bool CmdEvalIpAndMask4(CONSOLE *c, wchar_t *str, void *param)\r
9205 {\r
9206         char tmp[MAX_SIZE];\r
9207         UINT ip, mask;\r
9208         // 引数チェック\r
9209         if (c == NULL || str == NULL)\r
9210         {\r
9211                 return false;\r
9212         }\r
9213 \r
9214         UniToStr(tmp, sizeof(tmp), str);\r
9215 \r
9216         if (ParseIpAndMask4(tmp, &ip, &mask) == false)\r
9217         {\r
9218                 c->Write(c, _UU("CMD_PARSE_IP_MASK_ERROR_1"));\r
9219                 return false;\r
9220         }\r
9221 \r
9222         return true;\r
9223 }\r
9224 bool CmdEvalIpAndMask6(CONSOLE *c, wchar_t *str, void *param)\r
9225 {\r
9226         char tmp[MAX_SIZE];\r
9227         IP ip, mask;\r
9228         // 引数チェック\r
9229         if (c == NULL || str == NULL)\r
9230         {\r
9231                 return false;\r
9232         }\r
9233 \r
9234         UniToStr(tmp, sizeof(tmp), str);\r
9235 \r
9236         if (ParseIpAndMask6(tmp, &ip, &mask) == false)\r
9237         {\r
9238                 c->Write(c, _UU("CMD_PARSE_IP_MASK_ERROR_1_6"));\r
9239                 return false;\r
9240         }\r
9241 \r
9242         return true;\r
9243 }\r
9244 bool CmdEvalIpAndMask46(CONSOLE *c, wchar_t *str, void *param)\r
9245 {\r
9246         char tmp[MAX_SIZE];\r
9247         TOKEN_LIST *t;\r
9248         bool ret = false;\r
9249 \r
9250         Zero(tmp, sizeof(tmp));\r
9251         UniToStr(tmp, sizeof(tmp), str);\r
9252 \r
9253         t = ParseToken(tmp, "/");\r
9254         if (t == NULL)\r
9255         {\r
9256                 return false;\r
9257         }\r
9258 \r
9259         if (t->NumTokens >= 1)\r
9260         {\r
9261                 Trim(t->Token[0]);\r
9262 \r
9263                 if (IsIpStr4(t->Token[0]))\r
9264                 {\r
9265                         ret = CmdEvalIpAndMask4(c, str, param);\r
9266                 }\r
9267                 else\r
9268                 {\r
9269                         ret = CmdEvalIpAndMask6(c, str, param);\r
9270                 }\r
9271         }\r
9272 \r
9273         FreeToken(t);\r
9274 \r
9275         return ret;\r
9276 }\r
9277 \r
9278 // ネットワークアドレスとサブネットマスクの評価\r
9279 bool CmdEvalNetworkAndSubnetMask4(CONSOLE *c, wchar_t *str, void *param)\r
9280 {\r
9281         char tmp[MAX_SIZE];\r
9282         UINT ip, mask;\r
9283         // 引数チェック\r
9284         if (c == NULL || str == NULL)\r
9285         {\r
9286                 return false;\r
9287         }\r
9288 \r
9289         UniToStr(tmp, sizeof(tmp), str);\r
9290 \r
9291         if (ParseIpAndSubnetMask4(tmp, &ip, &mask) == false)\r
9292         {\r
9293                 c->Write(c, _UU("CMD_PARSE_IP_SUBNET_ERROR_1"));\r
9294                 return false;\r
9295         }\r
9296 \r
9297         if (IsNetworkAddress32(ip, mask) == false)\r
9298         {\r
9299                 c->Write(c, _UU("CMD_PARSE_IP_SUBNET_ERROR_2"));\r
9300                 return false;\r
9301         }\r
9302 \r
9303         return true;\r
9304 }\r
9305 bool CmdEvalNetworkAndSubnetMask6(CONSOLE *c, wchar_t *str, void *param)\r
9306 {\r
9307         char tmp[MAX_SIZE];\r
9308         IP ip, mask;\r
9309         // 引数チェック\r
9310         if (c == NULL || str == NULL)\r
9311         {\r
9312                 return false;\r
9313         }\r
9314 \r
9315         UniToStr(tmp, sizeof(tmp), str);\r
9316 \r
9317         if (ParseIpAndSubnetMask6(tmp, &ip, &mask) == false)\r
9318         {\r
9319                 c->Write(c, _UU("CMD_PARSE_IP_SUBNET_ERROR_1_6"));\r
9320                 return false;\r
9321         }\r
9322 \r
9323         if (IsNetworkPrefixAddress6(&ip, &mask) == false)\r
9324         {\r
9325                 c->Write(c, _UU("CMD_PARSE_IP_SUBNET_ERROR_3"));\r
9326                 return false;\r
9327         }\r
9328 \r
9329         return true;\r
9330 }\r
9331 bool CmdEvalNetworkAndSubnetMask46(CONSOLE *c, wchar_t *str, void *param)\r
9332 {\r
9333         char tmp[MAX_SIZE];\r
9334         TOKEN_LIST *t;\r
9335         bool ret = false;\r
9336 \r
9337         Zero(tmp, sizeof(tmp));\r
9338         UniToStr(tmp, sizeof(tmp), str);\r
9339 \r
9340         t = ParseToken(tmp, "/");\r
9341         if (t == NULL)\r
9342         {\r
9343                 return false;\r
9344         }\r
9345 \r
9346         if (t->NumTokens >= 1)\r
9347         {\r
9348                 Trim(t->Token[0]);\r
9349 \r
9350                 if (IsIpStr4(t->Token[0]))\r
9351                 {\r
9352                         ret = CmdEvalNetworkAndSubnetMask4(c, str, param);\r
9353                 }\r
9354                 else\r
9355                 {\r
9356                         ret = CmdEvalNetworkAndSubnetMask6(c, str, param);\r
9357                 }\r
9358         }\r
9359 \r
9360         FreeToken(t);\r
9361 \r
9362         return ret;\r
9363 }\r
9364 \r
9365 // IP アドレスとサブネットマスクの評価\r
9366 bool CmdEvalHostAndSubnetMask4(CONSOLE *c, wchar_t *str, void *param)\r
9367 {\r
9368         char tmp[MAX_SIZE];\r
9369         // 引数チェック\r
9370         if (c == NULL || str == NULL)\r
9371         {\r
9372                 return false;\r
9373         }\r
9374 \r
9375         UniToStr(tmp, sizeof(tmp), str);\r
9376 \r
9377         if (ParseIpAndSubnetMask4(tmp, NULL, NULL) == false)\r
9378         {\r
9379                 c->Write(c, _UU("CMD_PARSE_IP_SUBNET_ERROR_1"));\r
9380                 return false;\r
9381         }\r
9382 \r
9383         return true;\r
9384 }\r
9385 \r
9386 // 仮想レイヤ 3 スイッチへの仮想インターフェイスの追加\r
9387 UINT PsRouterIfAdd(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)\r
9388 {\r
9389         LIST *o;\r
9390         PS *ps = (PS *)param;\r
9391         UINT ret = 0;\r
9392         RPC_L3IF t;\r
9393         // 指定できるパラメータ リスト\r
9394         PARAM args[] =\r
9395         {\r
9396                 // "name", prompt_proc, prompt_param, eval_proc, eval_param\r
9397                 {"[name]", CmdPrompt, _UU("CMD_RouterIfAdd_PROMPT_NAME"), CmdEvalNotEmpty, NULL},\r
9398                 {"HUB", CmdPrompt, _UU("CMD_RouterIfAdd_PROMPT_HUB"), CmdEvalNotEmpty, NULL},\r
9399                 {"IP", CmdPrompt, _UU("CMD_RouterIfAdd_PROMPT_IP"), CmdEvalHostAndSubnetMask4, NULL},\r
9400         };\r
9401 \r
9402         o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));\r
9403         if (o == NULL)\r
9404         {\r
9405                 return ERR_INVALID_PARAMETER;\r
9406         }\r
9407 \r
9408         Zero(&t, sizeof(t));\r
9409 \r
9410         StrCpy(t.Name, sizeof(t.Name), GetParamStr(o, "[name]"));\r
9411         ParseIpAndSubnetMask4(GetParamStr(o, "IP"), &t.IpAddress, &t.SubnetMask);\r
9412         StrCpy(t.HubName, sizeof(t.HubName), GetParamStr(o, "HUB"));\r
9413 \r
9414         // RPC 呼び出し\r
9415         ret = ScAddL3If(ps->Rpc, &t);\r
9416 \r
9417         if (ret != ERR_NO_ERROR)\r
9418         {\r
9419                 // エラー発生\r
9420                 CmdPrintError(c, ret);\r
9421                 FreeParamValueList(o);\r
9422                 return ret;\r
9423         }\r
9424 \r
9425         FreeParamValueList(o);\r
9426 \r
9427         return 0;\r
9428 }\r
9429 \r
9430 // 仮想レイヤ 3 スイッチの仮想インターフェイスの削除\r
9431 UINT PsRouterIfDel(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)\r
9432 {\r
9433         LIST *o;\r
9434         PS *ps = (PS *)param;\r
9435         UINT ret = 0;\r
9436         RPC_L3IF t;\r
9437         // 指定できるパラメータ リスト\r
9438         PARAM args[] =\r
9439         {\r
9440                 // "name", prompt_proc, prompt_param, eval_proc, eval_param\r
9441                 {"[name]", CmdPrompt, _UU("CMD_RouterIfAdd_PROMPT_NAME"), CmdEvalNotEmpty, NULL},\r
9442                 {"HUB", CmdPrompt, _UU("CMD_RouterIfAdd_PROMPT_HUB"), CmdEvalNotEmpty, NULL},\r
9443         };\r
9444 \r
9445         o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));\r
9446         if (o == NULL)\r
9447         {\r
9448                 return ERR_INVALID_PARAMETER;\r
9449         }\r
9450 \r
9451         Zero(&t, sizeof(t));\r
9452 \r
9453         StrCpy(t.Name, sizeof(t.Name), GetParamStr(o, "[name]"));\r
9454         StrCpy(t.HubName, sizeof(t.HubName), GetParamStr(o, "HUB"));\r
9455 \r
9456         // RPC 呼び出し\r
9457         ret = ScDelL3If(ps->Rpc, &t);\r
9458 \r
9459         if (ret != ERR_NO_ERROR)\r
9460         {\r
9461                 // エラー発生\r
9462                 CmdPrintError(c, ret);\r
9463                 FreeParamValueList(o);\r
9464                 return ret;\r
9465         }\r
9466 \r
9467         FreeParamValueList(o);\r
9468 \r
9469         return 0;\r
9470 }\r
9471 \r
9472 // 仮想レイヤ 3 スイッチのルーティング テーブル一覧の取得\r
9473 UINT PsRouterTableList(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)\r
9474 {\r
9475         LIST *o;\r
9476         PS *ps = (PS *)param;\r
9477         UINT ret = 0;\r
9478         RPC_ENUM_L3TABLE t;\r
9479         CT *ct;\r
9480         wchar_t tmp1[MAX_SIZE];\r
9481         wchar_t tmp2[MAX_SIZE];\r
9482         wchar_t tmp3[MAX_SIZE];\r
9483         wchar_t tmp4[MAX_SIZE];\r
9484         // 指定できるパラメータ リスト\r
9485         PARAM args[] =\r
9486         {\r
9487                 {"[name]", CmdPrompt, _UU("CMD_RouterTableList_PROMPT_NAME"), CmdEvalNotEmpty, NULL},\r
9488         };\r
9489 \r
9490         o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));\r
9491         if (o == NULL)\r
9492         {\r
9493                 return ERR_INVALID_PARAMETER;\r
9494         }\r
9495 \r
9496         Zero(&t, sizeof(t));\r
9497 \r
9498         StrCpy(t.Name, sizeof(t.Name), GetParamStr(o, "[name]"));\r
9499 \r
9500         // RPC 呼び出し\r
9501         ret = ScEnumL3Table(ps->Rpc, &t);\r
9502 \r
9503         if (ret != ERR_NO_ERROR)\r
9504         {\r
9505                 // エラー発生\r
9506                 CmdPrintError(c, ret);\r
9507                 FreeParamValueList(o);\r
9508                 return ret;\r
9509         }\r
9510         else\r
9511         {\r
9512                 UINT i;\r
9513 \r
9514                 ct = CtNew();\r
9515 \r
9516                 CtInsertColumn(ct, _UU("SM_L3_SW_TABLE_COLUMN1"), false);\r
9517                 CtInsertColumn(ct, _UU("SM_L3_SW_TABLE_COLUMN2"), false);\r
9518                 CtInsertColumn(ct, _UU("SM_L3_SW_TABLE_COLUMN3"), false);\r
9519                 CtInsertColumn(ct, _UU("SM_L3_SW_TABLE_COLUMN4"), true);\r
9520 \r
9521                 for (i = 0;i < t.NumItem;i++)\r
9522                 {\r
9523                         RPC_L3TABLE *e = &t.Items[i];\r
9524 \r
9525                         IPToUniStr32(tmp1, sizeof(tmp1), e->NetworkAddress);\r
9526                         IPToUniStr32(tmp2, sizeof(tmp2), e->SubnetMask);\r
9527                         IPToUniStr32(tmp3, sizeof(tmp3), e->GatewayAddress);\r
9528                         UniToStru(tmp4, e->Metric);\r
9529 \r
9530                         CtInsert(ct, tmp1, tmp2, tmp3, tmp4);\r
9531                 }\r
9532 \r
9533                 CtFree(ct, c);\r
9534         }\r
9535 \r
9536         FreeRpcEnumL3Table(&t);\r
9537 \r
9538         FreeParamValueList(o);\r
9539 \r
9540         return 0;\r
9541 }\r
9542 \r
9543 // 仮想レイヤ 3 スイッチへのルーティング テーブル エントリの追加\r
9544 UINT PsRouterTableAdd(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)\r
9545 {\r
9546         LIST *o;\r
9547         PS *ps = (PS *)param;\r
9548         UINT ret = 0;\r
9549         RPC_L3TABLE t;\r
9550         // 指定できるパラメータ リスト\r
9551         PARAM args[] =\r
9552         {\r
9553                 // "name", prompt_proc, prompt_param, eval_proc, eval_param\r
9554                 {"[name]", CmdPrompt, _UU("CMD_RouterTableAdd_PROMPT_NAME"), CmdEvalNotEmpty, NULL},\r
9555                 {"NETWORK", CmdPrompt, _UU("CMD_RouterTableAdd_PROMPT_NETWORK"), CmdEvalNetworkAndSubnetMask4, NULL},\r
9556                 {"GATEWAY", CmdPrompt, _UU("CMD_RouterTableAdd_PROMPT_GATEWAY"), CmdEvalIp, NULL},\r
9557                 {"METRIC", CmdPrompt, _UU("CMD_RouterTableAdd_PROMPT_METRIC"), CmdEvalInt1, NULL},\r
9558         };\r
9559 \r
9560         o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));\r
9561         if (o == NULL)\r
9562         {\r
9563                 return ERR_INVALID_PARAMETER;\r
9564         }\r
9565 \r
9566         Zero(&t, sizeof(t));\r
9567 \r
9568         StrCpy(t.Name, sizeof(t.Name), GetParamStr(o, "[name]"));\r
9569         ParseIpAndSubnetMask4(GetParamStr(o, "NETWORK"), &t.NetworkAddress, &t.SubnetMask);\r
9570         t.Metric = GetParamInt(o, "METRIC");\r
9571         t.GatewayAddress = StrToIP32(GetParamStr(o, "GATEWAY"));\r
9572 \r
9573         // RPC 呼び出し\r
9574         ret = ScAddL3Table(ps->Rpc, &t);\r
9575 \r
9576         if (ret != ERR_NO_ERROR)\r
9577         {\r
9578                 // エラー発生\r
9579                 CmdPrintError(c, ret);\r
9580                 FreeParamValueList(o);\r
9581                 return ret;\r
9582         }\r
9583 \r
9584         FreeParamValueList(o);\r
9585 \r
9586         return 0;\r
9587 }\r
9588 \r
9589 // 仮想レイヤ 3 スイッチのルーティング テーブル エントリの削除\r
9590 UINT PsRouterTableDel(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)\r
9591 {\r
9592         LIST *o;\r
9593         PS *ps = (PS *)param;\r
9594         UINT ret = 0;\r
9595         RPC_L3TABLE t;\r
9596         // 指定できるパラメータ リスト\r
9597         PARAM args[] =\r
9598         {\r
9599                 // "name", prompt_proc, prompt_param, eval_proc, eval_param\r
9600                 {"[name]", CmdPrompt, _UU("CMD_RouterTableAdd_PROMPT_NAME"), CmdEvalNotEmpty, NULL},\r
9601                 {"NETWORK", CmdPrompt, _UU("CMD_RouterTableAdd_PROMPT_NETWORK"), CmdEvalNetworkAndSubnetMask4, NULL},\r
9602                 {"GATEWAY", CmdPrompt, _UU("CMD_RouterTableAdd_PROMPT_GATEWAY"), CmdEvalIp, NULL},\r
9603                 {"METRIC", CmdPrompt, _UU("CMD_RouterTableAdd_PROMPT_METRIC"), CmdEvalInt1, NULL},\r
9604         };\r
9605 \r
9606         o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));\r
9607         if (o == NULL)\r
9608         {\r
9609                 return ERR_INVALID_PARAMETER;\r
9610         }\r
9611 \r
9612         Zero(&t, sizeof(t));\r
9613 \r
9614         StrCpy(t.Name, sizeof(t.Name), GetParamStr(o, "[name]"));\r
9615         ParseIpAndSubnetMask4(GetParamStr(o, "NETWORK"), &t.NetworkAddress, &t.SubnetMask);\r
9616         t.Metric = GetParamInt(o, "METRIC");\r
9617         t.GatewayAddress = StrToIP32(GetParamStr(o, "GATEWAY"));\r
9618 \r
9619         // RPC 呼び出し\r
9620         ret = ScDelL3Table(ps->Rpc, &t);\r
9621 \r
9622         if (ret != ERR_NO_ERROR)\r
9623         {\r
9624                 // エラー発生\r
9625                 CmdPrintError(c, ret);\r
9626                 FreeParamValueList(o);\r
9627                 return ret;\r
9628         }\r
9629 \r
9630         FreeParamValueList(o);\r
9631 \r
9632         return 0;\r
9633 }\r
9634 \r
9635 // ログ ファイル一覧の取得\r
9636 UINT PsLogFileList(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)\r
9637 {\r
9638         LIST *o;\r
9639         PS *ps = (PS *)param;\r
9640         UINT ret = 0;\r
9641         RPC_ENUM_LOG_FILE t;\r
9642 \r
9643         o = ParseCommandList(c, cmd_name, str, NULL, 0);\r
9644         if (o == NULL)\r
9645         {\r
9646                 return ERR_INVALID_PARAMETER;\r
9647         }\r
9648 \r
9649         Zero(&t, sizeof(t));\r
9650 \r
9651         c->Write(c, _UU("CMD_LogFileList_START"));\r
9652         c->Write(c, L"");\r
9653 \r
9654         // RPC 呼び出し\r
9655         ret = ScEnumLogFile(ps->Rpc, &t);\r
9656 \r
9657         if (ret != ERR_NO_ERROR)\r
9658         {\r
9659                 // エラー発生\r
9660                 CmdPrintError(c, ret);\r
9661                 FreeParamValueList(o);\r
9662                 return ret;\r
9663         }\r
9664         else\r
9665         {\r
9666                 UINT i;\r
9667                 wchar_t tmp[MAX_SIZE];\r
9668                 CT *ct;\r
9669 \r
9670                 UniFormat(tmp, sizeof(tmp), _UU("CMD_LogFileList_NUM_LOGS"), t.NumItem);\r
9671                 c->Write(c, tmp);\r
9672 \r
9673                 ct = CtNew();\r
9674 \r
9675                 CtInsertColumn(ct, _UU("SM_LOG_FILE_COLUMN_1"), false);\r
9676                 CtInsertColumn(ct, _UU("SM_LOG_FILE_COLUMN_2"), true);\r
9677                 CtInsertColumn(ct, _UU("SM_LOG_FILE_COLUMN_3"), false);\r
9678                 CtInsertColumn(ct, _UU("SM_LOG_FILE_COLUMN_4"), false);\r
9679 \r
9680                 for (i = 0;i < t.NumItem;i++)\r
9681                 {\r
9682                         RPC_ENUM_LOG_FILE_ITEM *e = &t.Items[i];\r
9683                         wchar_t tmp1[MAX_PATH], tmp2[128], tmp3[128], tmp4[MAX_HOST_NAME_LEN + 1];\r
9684                         char tmp[MAX_SIZE];\r
9685 \r
9686                         StrToUni(tmp1, sizeof(tmp1), e->FilePath);\r
9687 \r
9688                         ToStrByte(tmp, sizeof(tmp), e->FileSize);\r
9689                         StrToUni(tmp2, sizeof(tmp2), tmp);\r
9690 \r
9691                         GetDateTimeStr64Uni(tmp3, sizeof(tmp3), SystemToLocal64(e->UpdatedTime));\r
9692 \r
9693                         StrToUni(tmp4, sizeof(tmp4), e->ServerName);\r
9694 \r
9695                         CtInsert(ct, tmp1, tmp2, tmp3, tmp4);\r
9696                 }\r
9697 \r
9698                 CtFreeEx(ct, c, true);\r
9699         }\r
9700 \r
9701         FreeRpcEnumLogFile(&t);\r
9702 \r
9703         FreeParamValueList(o);\r
9704 \r
9705         return 0;\r
9706 }\r
9707 \r
9708 // ログ ファイルのダウンロード\r
9709 UINT PsLogFileGet(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)\r
9710 {\r
9711         LIST *o;\r
9712         PS *ps = (PS *)param;\r
9713         UINT ret = 0;\r
9714         BUF *buf;\r
9715         char *filename = NULL;\r
9716         char *server_name;\r
9717         // 指定できるパラメータ リスト\r
9718         PARAM args[] =\r
9719         {\r
9720                 // "name", prompt_proc, prompt_param, eval_proc, eval_param\r
9721                 {"[name]", CmdPrompt, _UU("CMD_LogFileGet_PROMPT_NAME"), CmdEvalNotEmpty, NULL},\r
9722                 {"SERVER", NULL, NULL, NULL, NULL},\r
9723                 {"SAVEPATH", NULL, NULL, NULL, NULL},\r
9724         };\r
9725 \r
9726         o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));\r
9727         if (o == NULL)\r
9728         {\r
9729                 return ERR_INVALID_PARAMETER;\r
9730         }\r
9731 \r
9732         filename = GetParamStr(o, "SAVE");\r
9733 \r
9734         c->Write(c, _UU("CMD_LogFileGet_START"));\r
9735 \r
9736         server_name = GetParamStr(o, "SERVER");\r
9737 \r
9738         buf = DownloadFileFromServer(ps->Rpc, server_name,\r
9739                 GetParamStr(o, "[name]"), 0, NULL, NULL);\r
9740 \r
9741         if (buf == NULL)\r
9742         {\r
9743                 c->Write(c, _UU("CMD_LogFileGet_FAILED"));\r
9744 \r
9745                 ret = ERR_INTERNAL_ERROR;\r
9746         }\r
9747         else\r
9748         {\r
9749                 if (IsEmptyStr(filename) == false)\r
9750                 {\r
9751                         // ファイルに保存\r
9752                         if (DumpBuf(buf, filename) == false)\r
9753                         {\r
9754                                 ret = ERR_INTERNAL_ERROR;\r
9755                                 c->Write(c, _UU("CMD_LogFileGet_SAVE_FAILED"));\r
9756                         }\r
9757                 }\r
9758                 else\r
9759                 {\r
9760                         // 画面に表示\r
9761                         wchar_t tmp[MAX_SIZE];\r
9762                         UINT buf_size;\r
9763                         wchar_t *uni_buf;\r
9764 \r
9765                         UniFormat(tmp, sizeof(tmp), _UU("CMD_LogFileGet_FILESIZE"),\r
9766                                 buf->Size);\r
9767                         c->Write(c, tmp);\r
9768                         c->Write(c, L"");\r
9769 \r
9770                         buf_size = CalcUtf8ToUni((BYTE *)buf->Buf, buf->Size);\r
9771                         uni_buf = ZeroMalloc(buf_size + 32);\r
9772 \r
9773                         Utf8ToUni(uni_buf, buf_size, (BYTE *)buf->Buf, buf->Size);\r
9774 \r
9775                         c->Write(c, uni_buf);\r
9776                         c->Write(c, L"");\r
9777 \r
9778                         Free(uni_buf);\r
9779                 }\r
9780 \r
9781                 FreeBuf(buf);\r
9782         }\r
9783 \r
9784         FreeParamValueList(o);\r
9785 \r
9786         return ret;\r
9787 }\r
9788 \r
9789 // 新しい仮想 HUB の作成\r
9790 UINT PsHubCreate(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)\r
9791 {\r
9792         LIST *o;\r
9793         PS *ps = (PS *)param;\r
9794         UINT ret = 0;\r
9795         RPC_CREATE_HUB t;\r
9796         char *pass = "";\r
9797         UINT hub_type = HUB_TYPE_STANDALONE;\r
9798         // 指定できるパラメータ リスト\r
9799         PARAM args[] =\r
9800         {\r
9801                 {"[name]", CmdPrompt, _UU("CMD_HubCreate_PROMPT_NAME"), CmdEvalNotEmpty, NULL},\r
9802                 {"PASSWORD", CmdPromptChoosePassword, NULL, NULL, NULL},\r
9803         };\r
9804 \r
9805         o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));\r
9806         if (o == NULL)\r
9807         {\r
9808                 return ERR_INVALID_PARAMETER;\r
9809         }\r
9810         else\r
9811         {\r
9812                 RPC_SERVER_INFO t;\r
9813                 Zero(&t, sizeof(t));\r
9814                 if (ScGetServerInfo(ps->Rpc, &t) == ERR_NO_ERROR)\r
9815                 {\r
9816                         if (t.ServerType == SERVER_TYPE_FARM_CONTROLLER)\r
9817                         {\r
9818                                 hub_type = HUB_TYPE_FARM_DYNAMIC;\r
9819                         }\r
9820                         FreeRpcServerInfo(&t);\r
9821                 }\r
9822         }\r
9823 \r
9824         Zero(&t, sizeof(t));\r
9825 \r
9826         StrCpy(t.HubName, sizeof(t.HubName), GetParamStr(o, "[name]"));\r
9827         t.HubType = hub_type;\r
9828 \r
9829         if (IsEmptyStr(GetParamStr(o, "PASSWORD")) == false)\r
9830         {\r
9831                 pass = GetParamStr(o, "PASSWORD");\r
9832         }\r
9833 \r
9834         Hash(t.HashedPassword, pass, StrLen(pass), true);\r
9835         HashPassword(t.SecurePassword, ADMINISTRATOR_USERNAME, pass);\r
9836         t.Online = true;\r
9837 \r
9838         // RPC 呼び出し\r
9839         ret = ScCreateHub(ps->Rpc, &t);\r
9840 \r
9841         if (ret != ERR_NO_ERROR)\r
9842         {\r
9843                 // エラー発生\r
9844                 CmdPrintError(c, ret);\r
9845                 FreeParamValueList(o);\r
9846                 return ret;\r
9847         }\r
9848 \r
9849         FreeParamValueList(o);\r
9850 \r
9851         return 0;\r
9852 }\r
9853 \r
9854 // 新しい仮想 HUB の作成 (ダイナミックモード)\r
9855 UINT PsHubCreateDynamic(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)\r
9856 {\r
9857         LIST *o;\r
9858         PS *ps = (PS *)param;\r
9859         UINT ret = 0;\r
9860         RPC_CREATE_HUB t;\r
9861         char *pass = "";\r
9862         UINT hub_type = HUB_TYPE_FARM_DYNAMIC;\r
9863         // 指定できるパラメータ リスト\r
9864         PARAM args[] =\r
9865         {\r
9866                 {"[name]", CmdPrompt, _UU("CMD_HubCreate_PROMPT_NAME"), CmdEvalNotEmpty, NULL},\r
9867                 {"PASSWORD", CmdPromptChoosePassword, NULL, NULL, NULL},\r
9868         };\r
9869 \r
9870         o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));\r
9871         if (o == NULL)\r
9872         {\r
9873                 return ERR_INVALID_PARAMETER;\r
9874         }\r
9875 \r
9876         Zero(&t, sizeof(t));\r
9877 \r
9878         StrCpy(t.HubName, sizeof(t.HubName), GetParamStr(o, "[name]"));\r
9879         t.HubType = hub_type;\r
9880 \r
9881         if (IsEmptyStr(GetParamStr(o, "PASSWORD")) == false)\r
9882         {\r
9883                 pass = GetParamStr(o, "PASSWORD");\r
9884         }\r
9885 \r
9886         Hash(t.HashedPassword, pass, StrLen(pass), true);\r
9887         HashPassword(t.SecurePassword, ADMINISTRATOR_USERNAME, pass);\r
9888         t.Online = true;\r
9889 \r
9890         // RPC 呼び出し\r
9891         ret = ScCreateHub(ps->Rpc, &t);\r
9892 \r
9893         if (ret != ERR_NO_ERROR)\r
9894         {\r
9895                 // エラー発生\r
9896                 CmdPrintError(c, ret);\r
9897                 FreeParamValueList(o);\r
9898                 return ret;\r
9899         }\r
9900 \r
9901         FreeParamValueList(o);\r
9902 \r
9903         return 0;\r
9904 }\r
9905 \r
9906 // 新しい仮想 HUB の作成 (スタティックモード)\r
9907 UINT PsHubCreateStatic(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)\r
9908 {\r
9909         LIST *o;\r
9910         PS *ps = (PS *)param;\r
9911         UINT ret = 0;\r
9912         RPC_CREATE_HUB t;\r
9913         char *pass = "";\r
9914         UINT hub_type = HUB_TYPE_FARM_STATIC;\r
9915         // 指定できるパラメータ リスト\r
9916         PARAM args[] =\r
9917         {\r
9918                 {"[name]", CmdPrompt, _UU("CMD_HubCreate_PROMPT_NAME"), CmdEvalNotEmpty, NULL},\r
9919                 {"PASSWORD", CmdPromptChoosePassword, NULL, NULL, NULL},\r
9920         };\r
9921 \r
9922         o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));\r
9923         if (o == NULL)\r
9924         {\r
9925                 return ERR_INVALID_PARAMETER;\r
9926         }\r
9927 \r
9928         Zero(&t, sizeof(t));\r
9929 \r
9930         StrCpy(t.HubName, sizeof(t.HubName), GetParamStr(o, "[name]"));\r
9931         t.HubType = hub_type;\r
9932 \r
9933         if (IsEmptyStr(GetParamStr(o, "PASSWORD")) == false)\r
9934         {\r
9935                 pass = GetParamStr(o, "PASSWORD");\r
9936         }\r
9937 \r
9938         Hash(t.HashedPassword, pass, StrLen(pass), true);\r
9939         HashPassword(t.SecurePassword, ADMINISTRATOR_USERNAME, pass);\r
9940         t.Online = true;\r
9941 \r
9942         // RPC 呼び出し\r
9943         ret = ScCreateHub(ps->Rpc, &t);\r
9944 \r
9945         if (ret != ERR_NO_ERROR)\r
9946         {\r
9947                 // エラー発生\r
9948                 CmdPrintError(c, ret);\r
9949                 FreeParamValueList(o);\r
9950                 return ret;\r
9951         }\r
9952 \r
9953         FreeParamValueList(o);\r
9954 \r
9955         return 0;\r
9956 }\r
9957 \r
9958 // 仮想 HUB の削除\r
9959 UINT PsHubDelete(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)\r
9960 {\r
9961         LIST *o;\r
9962         PS *ps = (PS *)param;\r
9963         UINT ret = 0;\r
9964         RPC_DELETE_HUB t;\r
9965         // 指定できるパラメータ リスト\r
9966         PARAM args[] =\r
9967         {\r
9968                 // "name", prompt_proc, prompt_param, eval_proc, eval_param\r
9969                 {"[name]", CmdPrompt, _UU("CMD_HubDelete_PROMPT_NAME"), CmdEvalNotEmpty, NULL},\r
9970         };\r
9971 \r
9972         o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));\r
9973         if (o == NULL)\r
9974         {\r
9975                 return ERR_INVALID_PARAMETER;\r
9976         }\r
9977 \r
9978         Zero(&t, sizeof(t));\r
9979 \r
9980         StrCpy(t.HubName, sizeof(t.HubName), GetParamStr(o, "[name]"));\r
9981 \r
9982         // RPC 呼び出し\r
9983         ret = ScDeleteHub(ps->Rpc, &t);\r
9984 \r
9985         if (ret != ERR_NO_ERROR)\r
9986         {\r
9987                 // エラー発生\r
9988                 CmdPrintError(c, ret);\r
9989                 FreeParamValueList(o);\r
9990                 return ret;\r
9991         }\r
9992 \r
9993         FreeParamValueList(o);\r
9994 \r
9995         return 0;\r
9996 }\r
9997 \r
9998 // 仮想 HUB をスタティックにする\r
9999 UINT PsHubSetStatic(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)\r
10000 {\r
10001         LIST *o;\r
10002         PS *ps = (PS *)param;\r
10003         UINT ret = 0;\r
10004         RPC_CREATE_HUB t;\r
10005         // 指定できるパラメータ リスト\r
10006         PARAM args[] =\r
10007         {\r
10008                 // "name", prompt_proc, prompt_param, eval_proc, eval_param\r
10009                 {"[name]", CmdPrompt, _UU("CMD_HubChange_PROMPT_NAME"), CmdEvalNotEmpty, NULL},\r
10010         };\r
10011 \r
10012         o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));\r
10013         if (o == NULL)\r
10014         {\r
10015                 return ERR_INVALID_PARAMETER;\r
10016         }\r
10017 \r
10018         Zero(&t, sizeof(t));\r
10019 \r
10020         StrCpy(t.HubName, sizeof(t.HubName), GetParamStr(o, "[name]"));\r
10021 \r
10022         // まず現在の設定を取得する\r
10023         ret = ScGetHub(ps->Rpc, &t);\r
10024 \r
10025         if (ret != ERR_NO_ERROR)\r
10026         {\r
10027                 // エラー発生\r
10028                 CmdPrintError(c, ret);\r
10029                 FreeParamValueList(o);\r
10030                 return ret;\r
10031         }\r
10032 \r
10033         // 設定を変更する\r
10034         StrCpy(t.HubName, sizeof(t.HubName), GetParamStr(o, "[name]"));\r
10035         t.HubType = HUB_TYPE_FARM_STATIC;\r
10036 \r
10037         // 書き込む\r
10038         ret = ScSetHub(ps->Rpc, &t);\r
10039 \r
10040         if (ret != ERR_NO_ERROR)\r
10041         {\r
10042                 // エラー発生\r
10043                 CmdPrintError(c, ret);\r
10044                 FreeParamValueList(o);\r
10045                 return ret;\r
10046         }\r
10047 \r
10048         FreeParamValueList(o);\r
10049 \r
10050         return 0;\r
10051 }\r
10052 \r
10053 // 仮想 HUB の種類をダイナミック仮想 HUB に変更\r
10054 UINT PsHubSetDynamic(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)\r
10055 {\r
10056         LIST *o;\r
10057         PS *ps = (PS *)param;\r
10058         UINT ret = 0;\r
10059         RPC_CREATE_HUB t;\r
10060         // 指定できるパラメータ リスト\r
10061         PARAM args[] =\r
10062         {\r
10063                 // "name", prompt_proc, prompt_param, eval_proc, eval_param\r
10064                 {"[name]", CmdPrompt, _UU("CMD_HubChange_PROMPT_NAME"), CmdEvalNotEmpty, NULL},\r
10065         };\r
10066 \r
10067         o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));\r
10068         if (o == NULL)\r
10069         {\r
10070                 return ERR_INVALID_PARAMETER;\r
10071         }\r
10072 \r
10073         Zero(&t, sizeof(t));\r
10074 \r
10075         StrCpy(t.HubName, sizeof(t.HubName), GetParamStr(o, "[name]"));\r
10076 \r
10077         // まず現在の設定を取得する\r
10078         ret = ScGetHub(ps->Rpc, &t);\r
10079 \r
10080         if (ret != ERR_NO_ERROR)\r
10081         {\r
10082                 // エラー発生\r
10083                 CmdPrintError(c, ret);\r
10084                 FreeParamValueList(o);\r
10085                 return ret;\r
10086         }\r
10087 \r
10088         // 設定を変更する\r
10089         StrCpy(t.HubName, sizeof(t.HubName), GetParamStr(o, "[name]"));\r
10090         t.HubType = HUB_TYPE_FARM_DYNAMIC;\r
10091 \r
10092         // 書き込む\r
10093         ret = ScSetHub(ps->Rpc, &t);\r
10094 \r
10095         if (ret != ERR_NO_ERROR)\r
10096         {\r
10097                 // エラー発生\r
10098                 CmdPrintError(c, ret);\r
10099                 FreeParamValueList(o);\r
10100                 return ret;\r
10101         }\r
10102 \r
10103         FreeParamValueList(o);\r
10104 \r
10105         return 0;\r
10106 }\r
10107 \r
10108 // 仮想 HUB の一覧の取得\r
10109 UINT PsHubList(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)\r
10110 {\r
10111         LIST *o;\r
10112         PS *ps = (PS *)param;\r
10113         UINT ret = 0;\r
10114         RPC_ENUM_HUB t;\r
10115         UINT i;\r
10116 \r
10117         o = ParseCommandList(c, cmd_name, str, NULL, 0);\r
10118         if (o == NULL)\r
10119         {\r
10120                 return ERR_INVALID_PARAMETER;\r
10121         }\r
10122 \r
10123         Zero(&t, sizeof(t));\r
10124 \r
10125         // RPC 呼び出し\r
10126         ret = ScEnumHub(ps->Rpc, &t);\r
10127 \r
10128         if (ret != ERR_NO_ERROR)\r
10129         {\r
10130                 // エラー発生\r
10131                 CmdPrintError(c, ret);\r
10132                 FreeParamValueList(o);\r
10133                 return ret;\r
10134         }\r
10135         else\r
10136         {\r
10137                 CT *ct = CtNew();\r
10138 \r
10139                 CtInsertColumn(ct, _UU("SM_HUB_COLUMN_1"), false);\r
10140                 CtInsertColumn(ct, _UU("SM_HUB_COLUMN_2"), false);\r
10141                 CtInsertColumn(ct, _UU("SM_HUB_COLUMN_3"), false);\r
10142                 CtInsertColumn(ct, _UU("SM_HUB_COLUMN_4"), false);\r
10143                 CtInsertColumn(ct, _UU("SM_HUB_COLUMN_5"), false);\r
10144                 CtInsertColumn(ct, _UU("SM_HUB_COLUMN_6"), false);\r
10145                 CtInsertColumn(ct, _UU("SM_HUB_COLUMN_7"), false);\r
10146                 CtInsertColumn(ct, _UU("SM_HUB_COLUMN_8"), false);\r
10147                 CtInsertColumn(ct, _UU("SM_HUB_COLUMN_9"), false);\r
10148                 CtInsertColumn(ct, _UU("SM_HUB_COLUMN_10"), false);\r
10149                 CtInsertColumn(ct, _UU("SM_HUB_COLUMN_11"), false);\r
10150 \r
10151                 for (i = 0;i < t.NumHub;i++)\r
10152                 {\r
10153                         RPC_ENUM_HUB_ITEM *e = &t.Hubs[i];\r
10154                         wchar_t name[MAX_HUBNAME_LEN + 1];\r
10155                         wchar_t s1[64], s2[64], s3[64], s4[64], s5[64];\r
10156                         wchar_t s6[64], s7[128], s8[128];\r
10157                         UniToStru(s1, e->NumUsers);\r
10158                         UniToStru(s2, e->NumGroups);\r
10159                         UniToStru(s3, e->NumSessions);\r
10160                         UniToStru(s4, e->NumMacTables);\r
10161                         UniToStru(s5, e->NumIpTables);\r
10162 \r
10163                         UniToStru(s6, e->NumLogin);\r
10164 \r
10165                         if (e->LastLoginTime != 0)\r
10166                         {\r
10167                                 GetDateTimeStr64Uni(s7, sizeof(s7), SystemToLocal64(e->LastLoginTime));\r
10168                         }\r
10169                         else\r
10170                         {\r
10171                                 UniStrCpy(s7, sizeof(s7), _UU("COMMON_UNKNOWN"));\r
10172                         }\r
10173 \r
10174                         if (e->LastCommTime != 0)\r
10175                         {\r
10176                                 GetDateTimeStr64Uni(s8, sizeof(s8), SystemToLocal64(e->LastCommTime));\r
10177                         }\r
10178                         else\r
10179                         {\r
10180                                 UniStrCpy(s8, sizeof(s8), _UU("COMMON_UNKNOWN"));\r
10181                         }\r
10182 \r
10183                         StrToUni(name, sizeof(name), e->HubName);\r
10184 \r
10185                         CtInsert(ct,\r
10186                                 name,\r
10187                                 e->Online ? _UU("SM_HUB_ONLINE") : _UU("SM_HUB_OFFLINE"),\r
10188                                 GetHubTypeStr(e->HubType),\r
10189                                 s1, s2, s3, s4, s5, s6, s7, s8);\r
10190                 }\r
10191 \r
10192                 CtFreeEx(ct, c, true);\r
10193         }\r
10194 \r
10195         FreeRpcEnumHub(&t);\r
10196 \r
10197         FreeParamValueList(o);\r
10198 \r
10199         return 0;\r
10200 }\r
10201 \r
10202 // 管理する仮想 HUB の選択\r
10203 UINT PsHub(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)\r
10204 {\r
10205         LIST *o;\r
10206         PS *ps = (PS *)param;\r
10207         UINT ret = 0;\r
10208         RPC_HUB_STATUS t;\r
10209         // 指定できるパラメータ リスト\r
10210         PARAM args[] =\r
10211         {\r
10212                 // "name", prompt_proc, prompt_param, eval_proc, eval_param\r
10213                 {"[name]", NULL, NULL, NULL, NULL},\r
10214         };\r
10215 \r
10216         o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));\r
10217         if (o == NULL)\r
10218         {\r
10219                 return ERR_INVALID_PARAMETER;\r
10220         }\r
10221 \r
10222         if (IsEmptyStr(GetParamStr(o, "[name]")) == false)\r
10223         {\r
10224                 wchar_t tmp[MAX_SIZE];\r
10225                 Zero(&t, sizeof(t));\r
10226 \r
10227                 // 指定した仮想 HUB にアクセスできるかどうか調べる\r
10228                 StrCpy(t.HubName, sizeof(t.HubName), GetParamStr(o, "[name]"));\r
10229 \r
10230                 // RPC 呼び出し\r
10231                 ret = ScGetHubStatus(ps->Rpc, &t);\r
10232 \r
10233                 if (ret != ERR_NO_ERROR)\r
10234                 {\r
10235                         // エラー発生\r
10236                         CmdPrintError(c, ret);\r
10237                         FreeParamValueList(o);\r
10238                         return ret;\r
10239                 }\r
10240 \r
10241                 // 選択を変更する\r
10242                 if (ps->HubName != NULL)\r
10243                 {\r
10244                         Free(ps->HubName);\r
10245                 }\r
10246                 ps->HubName = CopyStr(t.HubName);\r
10247 \r
10248                 UniFormat(tmp, sizeof(tmp), _UU("CMD_Hub_Selected"), t.HubName);\r
10249                 c->Write(c, tmp);\r
10250         }\r
10251         else\r
10252         {\r
10253                 // 選択を解除する\r
10254                 if (ps->HubName != NULL)\r
10255                 {\r
10256                         c->Write(c, _UU("CMD_Hub_Unselected"));\r
10257                         Free(ps->HubName);\r
10258                 }\r
10259                 ps->HubName = NULL;\r
10260         }\r
10261 \r
10262         FreeParamValueList(o);\r
10263 \r
10264         return 0;\r
10265 }\r
10266 \r
10267 // 仮想 HUB をオンラインにする\r
10268 UINT PsOnline(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)\r
10269 {\r
10270         LIST *o;\r
10271         PS *ps = (PS *)param;\r
10272         UINT ret = 0;\r
10273         RPC_SET_HUB_ONLINE t;\r
10274 \r
10275         // 仮想 HUB が選択されていない場合はエラー\r
10276         if (ps->HubName == NULL)\r
10277         {\r
10278                 c->Write(c, _UU("CMD_Hub_Not_Selected"));\r
10279                 return ERR_INVALID_PARAMETER;\r
10280         }\r
10281 \r
10282         o = ParseCommandList(c, cmd_name, str, NULL, 0);\r
10283         if (o == NULL)\r
10284         {\r
10285                 return ERR_INVALID_PARAMETER;\r
10286         }\r
10287 \r
10288         Zero(&t, sizeof(t));\r
10289 \r
10290         StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);\r
10291         t.Online = true;\r
10292 \r
10293         // RPC 呼び出し\r
10294         ret = ScSetHubOnline(ps->Rpc, &t);\r
10295 \r
10296         if (ret != ERR_NO_ERROR)\r
10297         {\r
10298                 // エラー発生\r
10299                 CmdPrintError(c, ret);\r
10300                 FreeParamValueList(o);\r
10301                 return ret;\r
10302         }\r
10303 \r
10304         FreeParamValueList(o);\r
10305 \r
10306         return 0;\r
10307 }\r
10308 \r
10309 // 仮想 HUB をオフラインにする\r
10310 UINT PsOffline(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)\r
10311 {\r
10312         LIST *o;\r
10313         PS *ps = (PS *)param;\r
10314         UINT ret = 0;\r
10315         RPC_SET_HUB_ONLINE t;\r
10316 \r
10317         // 仮想 HUB が選択されていない場合はエラー\r
10318         if (ps->HubName == NULL)\r
10319         {\r
10320                 c->Write(c, _UU("CMD_Hub_Not_Selected"));\r
10321                 return ERR_INVALID_PARAMETER;\r
10322         }\r
10323 \r
10324         o = ParseCommandList(c, cmd_name, str, NULL, 0);\r
10325         if (o == NULL)\r
10326         {\r
10327                 return ERR_INVALID_PARAMETER;\r
10328         }\r
10329 \r
10330         Zero(&t, sizeof(t));\r
10331 \r
10332         StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);\r
10333         t.Online = false;\r
10334 \r
10335         // RPC 呼び出し\r
10336         ret = ScSetHubOnline(ps->Rpc, &t);\r
10337 \r
10338         if (ret != ERR_NO_ERROR)\r
10339         {\r
10340                 // エラー発生\r
10341                 CmdPrintError(c, ret);\r
10342                 FreeParamValueList(o);\r
10343                 return ret;\r
10344         }\r
10345 \r
10346         FreeParamValueList(o);\r
10347 \r
10348         return 0;\r
10349 }\r
10350 \r
10351 // 仮想 HUB の最大同時接続セッション数を設定する\r
10352 UINT PsSetMaxSession(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)\r
10353 {\r
10354         LIST *o;\r
10355         PS *ps = (PS *)param;\r
10356         UINT ret = 0;\r
10357         RPC_CREATE_HUB t;\r
10358         // 指定できるパラメータ リスト\r
10359         PARAM args[] =\r
10360         {\r
10361                 {"[max_session]", CmdPrompt, _UU("CMD_SetMaxSession_Prompt"), CmdEvalNotEmpty, NULL},\r
10362         };\r
10363 \r
10364         // 仮想 HUB が選択されていない場合はエラー\r
10365         if (ps->HubName == NULL)\r
10366         {\r
10367                 c->Write(c, _UU("CMD_Hub_Not_Selected"));\r
10368                 return ERR_INVALID_PARAMETER;\r
10369         }\r
10370 \r
10371         o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));\r
10372         if (o == NULL)\r
10373         {\r
10374                 return ERR_INVALID_PARAMETER;\r
10375         }\r
10376 \r
10377         // 現在の仮想 HUB の設定を取得\r
10378         Zero(&t, sizeof(t));\r
10379         StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);\r
10380         ret = ScGetHub(ps->Rpc, &t);\r
10381         if (ret != ERR_NO_ERROR)\r
10382         {\r
10383                 // エラー発生\r
10384                 CmdPrintError(c, ret);\r
10385                 FreeParamValueList(o);\r
10386                 return ret;\r
10387         }\r
10388 \r
10389         t.HubOption.MaxSession = GetParamInt(o, "[max_session]");\r
10390 \r
10391         // 仮想 HUB の設定を書き込み\r
10392         ret = ScSetHub(ps->Rpc, &t);\r
10393         if (ret != ERR_NO_ERROR)\r
10394         {\r
10395                 // エラー発生\r
10396                 CmdPrintError(c, ret);\r
10397                 FreeParamValueList(o);\r
10398                 return ret;\r
10399         }\r
10400 \r
10401         FreeParamValueList(o);\r
10402 \r
10403         return 0;\r
10404 }\r
10405 \r
10406 // 仮想 HUB の管理パスワードを設定する\r
10407 UINT PsSetHubPassword(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)\r
10408 {\r
10409         LIST *o;\r
10410         PS *ps = (PS *)param;\r
10411         UINT ret = 0;\r
10412         RPC_CREATE_HUB t;\r
10413         char *pw;\r
10414         // 指定できるパラメータ リスト\r
10415         PARAM args[] =\r
10416         {\r
10417                 {"[password]", CmdPromptChoosePassword, NULL, NULL, NULL},\r
10418         };\r
10419 \r
10420         // 仮想 HUB が選択されていない場合はエラー\r
10421         if (ps->HubName == NULL)\r
10422         {\r
10423                 c->Write(c, _UU("CMD_Hub_Not_Selected"));\r
10424                 return ERR_INVALID_PARAMETER;\r
10425         }\r
10426 \r
10427         o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));\r
10428         if (o == NULL)\r
10429         {\r
10430                 return ERR_INVALID_PARAMETER;\r
10431         }\r
10432 \r
10433         // 現在の仮想 HUB の設定を取得\r
10434         Zero(&t, sizeof(t));\r
10435         StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);\r
10436         ret = ScGetHub(ps->Rpc, &t);\r
10437         if (ret != ERR_NO_ERROR)\r
10438         {\r
10439                 // エラー発生\r
10440                 CmdPrintError(c, ret);\r
10441                 FreeParamValueList(o);\r
10442                 return ret;\r
10443         }\r
10444 \r
10445         // 設定の変更\r
10446         pw = GetParamStr(o, "[password]");\r
10447         HashPassword(t.SecurePassword, ADMINISTRATOR_USERNAME, pw);\r
10448         Hash(t.HashedPassword, pw, StrLen(pw), true);\r
10449 \r
10450         // 仮想 HUB の設定を書き込み\r
10451         ret = ScSetHub(ps->Rpc, &t);\r
10452         if (ret != ERR_NO_ERROR)\r
10453         {\r
10454                 // エラー発生\r
10455                 CmdPrintError(c, ret);\r
10456                 FreeParamValueList(o);\r
10457                 return ret;\r
10458         }\r
10459 \r
10460         FreeParamValueList(o);\r
10461 \r
10462         return 0;\r
10463 }\r
10464 \r
10465 // 仮想 HUB の匿名ユーザーへの列挙の許可設定\r
10466 UINT PsSetEnumAllow(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)\r
10467 {\r
10468         LIST *o;\r
10469         PS *ps = (PS *)param;\r
10470         UINT ret = 0;\r
10471         RPC_CREATE_HUB t;\r
10472 \r
10473         // 仮想 HUB が選択されていない場合はエラー\r
10474         if (ps->HubName == NULL)\r
10475         {\r
10476                 c->Write(c, _UU("CMD_Hub_Not_Selected"));\r
10477                 return ERR_INVALID_PARAMETER;\r
10478         }\r
10479 \r
10480         o = ParseCommandList(c, cmd_name, str, NULL, 0);\r
10481         if (o == NULL)\r
10482         {\r
10483                 return ERR_INVALID_PARAMETER;\r
10484         }\r
10485 \r
10486         // 現在の仮想 HUB の設定を取得\r
10487         Zero(&t, sizeof(t));\r
10488         StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);\r
10489         ret = ScGetHub(ps->Rpc, &t);\r
10490         if (ret != ERR_NO_ERROR)\r
10491         {\r
10492                 // エラー発生\r
10493                 CmdPrintError(c, ret);\r
10494                 FreeParamValueList(o);\r
10495                 return ret;\r
10496         }\r
10497 \r
10498         t.HubOption.NoEnum = false;\r
10499 \r
10500         // 仮想 HUB の設定を書き込み\r
10501         ret = ScSetHub(ps->Rpc, &t);\r
10502         if (ret != ERR_NO_ERROR)\r
10503         {\r
10504                 // エラー発生\r
10505                 CmdPrintError(c, ret);\r
10506                 FreeParamValueList(o);\r
10507                 return ret;\r
10508         }\r
10509 \r
10510         FreeParamValueList(o);\r
10511 \r
10512         return 0;\r
10513 }\r
10514 \r
10515 // 仮想 HUB の匿名ユーザーへの列挙の禁止設定\r
10516 UINT PsSetEnumDeny(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)\r
10517 {\r
10518         LIST *o;\r
10519         PS *ps = (PS *)param;\r
10520         UINT ret = 0;\r
10521         RPC_CREATE_HUB t;\r
10522 \r
10523         // 仮想 HUB が選択されていない場合はエラー\r
10524         if (ps->HubName == NULL)\r
10525         {\r
10526                 c->Write(c, _UU("CMD_Hub_Not_Selected"));\r
10527                 return ERR_INVALID_PARAMETER;\r
10528         }\r
10529 \r
10530         o = ParseCommandList(c, cmd_name, str, NULL, 0);\r
10531         if (o == NULL)\r
10532         {\r
10533                 return ERR_INVALID_PARAMETER;\r
10534         }\r
10535 \r
10536         // 現在の仮想 HUB の設定を取得\r
10537         Zero(&t, sizeof(t));\r
10538         StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);\r
10539         ret = ScGetHub(ps->Rpc, &t);\r
10540         if (ret != ERR_NO_ERROR)\r
10541         {\r
10542                 // エラー発生\r
10543                 CmdPrintError(c, ret);\r
10544                 FreeParamValueList(o);\r
10545                 return ret;\r
10546         }\r
10547 \r
10548         t.HubOption.NoEnum = true;\r
10549 \r
10550         // 仮想 HUB の設定を書き込み\r
10551         ret = ScSetHub(ps->Rpc, &t);\r
10552         if (ret != ERR_NO_ERROR)\r
10553         {\r
10554                 // エラー発生\r
10555                 CmdPrintError(c, ret);\r
10556                 FreeParamValueList(o);\r
10557                 return ret;\r
10558         }\r
10559 \r
10560         FreeParamValueList(o);\r
10561 \r
10562         return 0;\r
10563 }\r
10564 \r
10565 // 仮想 HUB のオプション設定の取得\r
10566 UINT PsOptionsGet(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)\r
10567 {\r
10568         LIST *o;\r
10569         PS *ps = (PS *)param;\r
10570         UINT ret = 0;\r
10571         RPC_CREATE_HUB t;\r
10572 \r
10573         // 仮想 HUB が選択されていない場合はエラー\r
10574         if (ps->HubName == NULL)\r
10575         {\r
10576                 c->Write(c, _UU("CMD_Hub_Not_Selected"));\r
10577                 return ERR_INVALID_PARAMETER;\r
10578         }\r
10579 \r
10580         o = ParseCommandList(c, cmd_name, str, NULL, 0);\r
10581         if (o == NULL)\r
10582         {\r
10583                 return ERR_INVALID_PARAMETER;\r
10584         }\r
10585 \r
10586         Zero(&t, sizeof(t));\r
10587 \r
10588         StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);\r
10589 \r
10590         // RPC 呼び出し\r
10591         ret = ScGetHub(ps->Rpc, &t);\r
10592 \r
10593         if (ret != ERR_NO_ERROR)\r
10594         {\r
10595                 // エラー発生\r
10596                 CmdPrintError(c, ret);\r
10597                 FreeParamValueList(o);\r
10598                 return ret;\r
10599         }\r
10600         else\r
10601         {\r
10602                 CT *ct;\r
10603                 wchar_t tmp[MAX_SIZE];\r
10604 \r
10605                 UniFormat(tmp, sizeof(tmp), _UU("CMD_OptionsGet_TITLE"), ps->HubName);\r
10606                 c->Write(c, tmp);\r
10607 \r
10608                 // 設定の表示\r
10609                 ct = CtNewStandard();\r
10610 \r
10611                 CtInsert(ct, _UU("CMD_OptionsGet_ENUM"),\r
10612                         t.HubOption.NoEnum ? _UU("CMD_MSG_DENY") : _UU("CMD_MSG_ALLOW"));\r
10613 \r
10614                 if (t.HubOption.MaxSession == 0)\r
10615                 {\r
10616                         UniStrCpy(tmp, sizeof(tmp), _UU("CMD_MSG_INFINITE"));\r
10617                 }\r
10618                 else\r
10619                 {\r
10620                         UniToStru(tmp, t.HubOption.MaxSession);\r
10621                 }\r
10622                 CtInsert(ct, _UU("CMD_OptionsGet_MAXSESSIONS"), tmp);\r
10623 \r
10624                 CtInsert(ct, _UU("CMD_OptionsGet_STATUS"), t.Online ? _UU("SM_HUB_ONLINE") : _UU("SM_HUB_OFFLINE"));\r
10625 \r
10626                 CtInsert(ct, _UU("CMD_OptionsGet_TYPE"), GetHubTypeStr(t.HubType));\r
10627 \r
10628                 CtFree(ct, c);\r
10629         }\r
10630 \r
10631         FreeParamValueList(o);\r
10632 \r
10633         return 0;\r
10634 }\r
10635 \r
10636 // ユーザー認証に使用する Radius サーバーの設定\r
10637 UINT PsRadiusServerSet(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)\r
10638 {\r
10639         LIST *o;\r
10640         PS *ps = (PS *)param;\r
10641         UINT ret = 0;\r
10642         RPC_RADIUS t;\r
10643         char *host;\r
10644         UINT port;\r
10645         // 指定できるパラメータ リスト\r
10646         CMD_EVAL_MIN_MAX minmax =\r
10647         {\r
10648                 "CMD_RadiusServerSet_EVAL_NUMINTERVAL", RADIUS_RETRY_INTERVAL, RADIUS_RETRY_TIMEOUT,\r
10649         };\r
10650         PARAM args[] =\r
10651         {\r
10652                 // "name", prompt_proc, prompt_param, eval_proc, eval_param\r
10653                 {"[server_name:port]", CmdPrompt, _UU("CMD_RadiusServerSet_Prompt_Host"), CmdEvalNotEmpty, NULL},\r
10654                 {"SECRET", CmdPromptChoosePassword, _UU("CMD_RadiusServerSet_Prompt_Secret"), NULL, NULL},\r
10655                 {"RETRY_INTERVAL", CmdPrompt, _UU("CMD_RadiusServerSet_Prompt_RetryInterval"), CmdEvalMinMax, &minmax},\r
10656         };\r
10657 \r
10658         // 仮想 HUB が選択されていない場合はエラー\r
10659         if (ps->HubName == NULL)\r
10660         {\r
10661                 c->Write(c, _UU("CMD_Hub_Not_Selected"));\r
10662                 return ERR_INVALID_PARAMETER;\r
10663         }\r
10664 \r
10665         o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));\r
10666         if (o == NULL)\r
10667         {\r
10668                 return ERR_INVALID_PARAMETER;\r
10669         }\r
10670 \r
10671         if (ParseHostPort(GetParamStr(o, "[server_name:port]"), &host, &port, 1812))\r
10672         {\r
10673                 Zero(&t, sizeof(t));\r
10674 \r
10675                 StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);\r
10676                 t.RadiusPort = port;\r
10677                 StrCpy(t.RadiusServerName, sizeof(t.RadiusServerName), host);\r
10678                 StrCpy(t.RadiusSecret, sizeof(t.RadiusSecret), GetParamStr(o, "SECRET"));\r
10679                 t.RadiusRetryInterval = GetParamInt(o, "RETRY_INTERVAL");\r
10680 \r
10681                 Free(host);\r
10682 \r
10683                 // RPC 呼び出し\r
10684                 ret = ScSetHubRadius(ps->Rpc, &t);\r
10685 \r
10686                 if (ret != ERR_NO_ERROR)\r
10687                 {\r
10688                         // エラー発生\r
10689                         CmdPrintError(c, ret);\r
10690                         FreeParamValueList(o);\r
10691                         return ret;\r
10692                 }\r
10693         }\r
10694 \r
10695         FreeParamValueList(o);\r
10696 \r
10697         return 0;\r
10698 }\r
10699 \r
10700 // ユーザー認証に使用する Radius サーバー設定の削除\r
10701 UINT PsRadiusServerDelete(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)\r
10702 {\r
10703         LIST *o;\r
10704         PS *ps = (PS *)param;\r
10705         UINT ret = 0;\r
10706         RPC_RADIUS t;\r
10707 \r
10708         // 仮想 HUB が選択されていない場合はエラー\r
10709         if (ps->HubName == NULL)\r
10710         {\r
10711                 c->Write(c, _UU("CMD_Hub_Not_Selected"));\r
10712                 return ERR_INVALID_PARAMETER;\r
10713         }\r
10714 \r
10715         o = ParseCommandList(c, cmd_name, str, NULL, 0);\r
10716         if (o == NULL)\r
10717         {\r
10718                 return ERR_INVALID_PARAMETER;\r
10719         }\r
10720 \r
10721         Zero(&t, sizeof(t));\r
10722 \r
10723         StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);\r
10724         t.RadiusPort = 1812;\r
10725 \r
10726         // RPC 呼び出し\r
10727         ret = ScSetHubRadius(ps->Rpc, &t);\r
10728 \r
10729         if (ret != ERR_NO_ERROR)\r
10730         {\r
10731                 // エラー発生\r
10732                 CmdPrintError(c, ret);\r
10733                 FreeParamValueList(o);\r
10734                 return ret;\r
10735         }\r
10736 \r
10737         FreeParamValueList(o);\r
10738 \r
10739         return 0;\r
10740 }\r
10741 \r
10742 // ユーザー認証に使用する Radius サーバー設定の取得\r
10743 UINT PsRadiusServerGet(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)\r
10744 {\r
10745         LIST *o;\r
10746         PS *ps = (PS *)param;\r
10747         UINT ret = 0;\r
10748         RPC_RADIUS t;\r
10749 \r
10750         // 仮想 HUB が選択されていない場合はエラー\r
10751         if (ps->HubName == NULL)\r
10752         {\r
10753                 c->Write(c, _UU("CMD_Hub_Not_Selected"));\r
10754                 return ERR_INVALID_PARAMETER;\r
10755         }\r
10756 \r
10757         o = ParseCommandList(c, cmd_name, str, NULL, 0);\r
10758         if (o == NULL)\r
10759         {\r
10760                 return ERR_INVALID_PARAMETER;\r
10761         }\r
10762 \r
10763         Zero(&t, sizeof(t));\r
10764 \r
10765         StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);\r
10766 \r
10767         // RPC 呼び出し\r
10768         ret = ScGetHubRadius(ps->Rpc, &t);\r
10769 \r
10770         if (ret != ERR_NO_ERROR)\r
10771         {\r
10772                 // エラー発生\r
10773                 CmdPrintError(c, ret);\r
10774                 FreeParamValueList(o);\r
10775                 return ret;\r
10776         }\r
10777         else\r
10778         {\r
10779                 CT *ct;\r
10780                 wchar_t tmp[MAX_SIZE];\r
10781 \r
10782                 ct = CtNewStandard();\r
10783 \r
10784                 if (IsEmptyStr(t.RadiusServerName))\r
10785                 {\r
10786                         CtInsert(ct, _UU("CMD_RadiusServerGet_STATUS"), _UU("CMD_MSG_DISABLE"));\r
10787                 }\r
10788                 else\r
10789                 {\r
10790                         CtInsert(ct, _UU("CMD_RadiusServerGet_STATUS"), _UU("CMD_MSG_ENABLE"));\r
10791 \r
10792                         StrToUni(tmp, sizeof(tmp), t.RadiusServerName);\r
10793                         CtInsert(ct, _UU("CMD_RadiusServerGet_HOST"), tmp);\r
10794 \r
10795                         UniToStri(tmp, t.RadiusPort);\r
10796                         CtInsert(ct, _UU("CMD_RadiusServerGet_PORT"), tmp);\r
10797 \r
10798                         StrToUni(tmp, sizeof(tmp), t.RadiusSecret);\r
10799                         CtInsert(ct, _UU("CMD_RadiusServerGet_SECRET"), tmp);\r
10800 \r
10801                         UniToStri(tmp, t.RadiusRetryInterval);\r
10802                         CtInsert(ct, _UU("CMD_RadiusServerGet_RetryInterval"), tmp);\r
10803                 }\r
10804 \r
10805                 CtFree(ct, c);\r
10806         }\r
10807 \r
10808         FreeParamValueList(o);\r
10809 \r
10810         return 0;\r
10811 }\r
10812 \r
10813 // 仮想 HUB の現在の状況の取得\r
10814 UINT PsStatusGet(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)\r
10815 {\r
10816         LIST *o;\r
10817         PS *ps = (PS *)param;\r
10818         UINT ret = 0;\r
10819         RPC_HUB_STATUS t;\r
10820 \r
10821         o = ParseCommandList(c, cmd_name, str, NULL, 0);\r
10822         if (o == NULL)\r
10823         {\r
10824                 return ERR_INVALID_PARAMETER;\r
10825         }\r
10826 \r
10827         // 仮想 HUB が選択されていない場合はエラー\r
10828         if (ps->HubName == NULL)\r
10829         {\r
10830                 c->Write(c, _UU("CMD_Hub_Not_Selected"));\r
10831                 return ERR_INVALID_PARAMETER;\r
10832         }\r
10833 \r
10834         Zero(&t, sizeof(t));\r
10835 \r
10836         StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);\r
10837 \r
10838         // RPC 呼び出し\r
10839         ret = ScGetHubStatus(ps->Rpc, &t);\r
10840 \r
10841         if (ret != ERR_NO_ERROR)\r
10842         {\r
10843                 // エラー発生\r
10844                 CmdPrintError(c, ret);\r
10845                 FreeParamValueList(o);\r
10846                 return ret;\r
10847         }\r
10848         else\r
10849         {\r
10850                 CT *ct = CtNewStandard();\r
10851                 wchar_t *s;\r
10852                 wchar_t tmp[MAX_SIZE];\r
10853 \r
10854                 // HUB 名\r
10855                 s = CopyStrToUni(t.HubName);\r
10856                 CtInsert(ct, _UU("SM_HUB_STATUS_HUBNAME"), s);\r
10857                 Free(s);\r
10858 \r
10859                 // オンライン\r
10860                 CtInsert(ct, _UU("SM_HUB_STATUS_ONLINE"),\r
10861                         t.Online ? _UU("SM_HUB_ONLINE") : _UU("SM_HUB_OFFLINE"));\r
10862 \r
10863                 // HUB の種類\r
10864                 CtInsert(ct, _UU("SM_HUB_TYPE"),\r
10865                         GetHubTypeStr(t.HubType));\r
10866 \r
10867                 if (t.HubType == HUB_TYPE_STANDALONE)\r
10868                 {\r
10869                         // SecureNAT の有効/無効\r
10870                         CtInsert(ct, _UU("SM_HUB_SECURE_NAT"),\r
10871                                 t.SecureNATEnabled ? _UU("SM_HUB_SECURE_NAT_YES") : _UU("SM_HUB_SECURE_NAT_NO"));\r
10872                 }\r
10873 \r
10874                 // その他の値\r
10875                 UniToStru(tmp, t.NumSessions);\r
10876                 CtInsert(ct, _UU("SM_HUB_NUM_SESSIONS"), tmp);\r
10877 \r
10878                 if (t.NumSessionsClient != 0 || t.NumSessionsBridge != 0)\r
10879                 {\r
10880                         UniToStru(tmp, t.NumSessionsClient);\r
10881                         CtInsert(ct, _UU("SM_HUB_NUM_SESSIONS_CLIENT"), tmp);\r
10882                         UniToStru(tmp, t.NumSessionsBridge);\r
10883                         CtInsert(ct, _UU("SM_HUB_NUM_SESSIONS_BRIDGE"), tmp);\r
10884                 }\r
10885 \r
10886                 UniToStru(tmp, t.NumAccessLists);\r
10887                 CtInsert(ct, _UU("SM_HUB_NUM_ACCESSES"), tmp);\r
10888 \r
10889                 UniToStru(tmp, t.NumUsers);\r
10890                 CtInsert(ct, _UU("SM_HUB_NUM_USERS"), tmp);\r
10891                 UniToStru(tmp, t.NumGroups);\r
10892                 CtInsert(ct, _UU("SM_HUB_NUM_GROUPS"), tmp);\r
10893 \r
10894                 UniToStru(tmp, t.NumMacTables);\r
10895                 CtInsert(ct, _UU("SM_HUB_NUM_MAC_TABLES"), tmp);\r
10896                 UniToStru(tmp, t.NumIpTables);\r
10897                 CtInsert(ct, _UU("SM_HUB_NUM_IP_TABLES"), tmp);\r
10898 \r
10899                 // 利用状況\r
10900                 UniToStru(tmp, t.NumLogin);\r
10901                 CtInsert(ct, _UU("SM_HUB_NUM_LOGIN"), tmp);\r
10902 \r
10903                 if (t.LastLoginTime != 0)\r
10904                 {\r
10905                         GetDateTimeStr64Uni(tmp, sizeof(tmp), SystemToLocal64(t.LastLoginTime));\r
10906                 }\r
10907                 else\r
10908                 {\r
10909                         UniStrCpy(tmp, sizeof(tmp), _UU("COMMON_UNKNOWN"));\r
10910                 }\r
10911                 CtInsert(ct, _UU("SM_HUB_LAST_LOGIN_TIME"), tmp);\r
10912 \r
10913                 if (t.LastCommTime != 0)\r
10914                 {\r
10915                         GetDateTimeStr64Uni(tmp, sizeof(tmp), SystemToLocal64(t.LastCommTime));\r
10916                 }\r
10917                 else\r
10918                 {\r
10919                         UniStrCpy(tmp, sizeof(tmp), _UU("COMMON_UNKNOWN"));\r
10920                 }\r
10921                 CtInsert(ct, _UU("SM_HUB_LAST_COMM_TIME"), tmp);\r
10922 \r
10923                 if (t.CreatedTime != 0)\r
10924                 {\r
10925                         GetDateTimeStr64Uni(tmp, sizeof(tmp), SystemToLocal64(t.CreatedTime));\r
10926                 }\r
10927                 else\r
10928                 {\r
10929                         UniStrCpy(tmp, sizeof(tmp), _UU("COMMON_UNKNOWN"));\r
10930                 }\r
10931                 CtInsert(ct, _UU("SM_HUB_CREATED_TIME"), tmp);\r
10932 \r
10933                 // トラフィック情報\r
10934                 CmdInsertTrafficInfo(ct, &t.Traffic);\r
10935 \r
10936                 CtFree(ct, c);\r
10937         }\r
10938 \r
10939         FreeParamValueList(o);\r
10940 \r
10941         return 0;\r
10942 }\r
10943 \r
10944 // ログ切り替え文字列の取得\r
10945 wchar_t *GetLogSwitchStr(UINT i)\r
10946 {\r
10947         char tmp[64];\r
10948 \r
10949         Format(tmp, sizeof(tmp), "SM_LOG_SWITCH_%u", i);\r
10950 \r
10951         return _UU(tmp);\r
10952 }\r
10953 \r
10954 // パケットログ名文字列の取得\r
10955 wchar_t *GetPacketLogNameStr(UINT i)\r
10956 {\r
10957         char tmp[64];\r
10958 \r
10959         Format(tmp, sizeof(tmp), "CMD_Log_%u", i);\r
10960 \r
10961         return _UU(tmp);\r
10962 }\r
10963 \r
10964 // 仮想 HUB のログ保存設定の取得\r
10965 UINT PsLogGet(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)\r
10966 {\r
10967         LIST *o;\r
10968         PS *ps = (PS *)param;\r
10969         UINT ret = 0;\r
10970         RPC_HUB_LOG t;\r
10971 \r
10972         // 仮想 HUB が選択されていない場合はエラー\r
10973         if (ps->HubName == NULL)\r
10974         {\r
10975                 c->Write(c, _UU("CMD_Hub_Not_Selected"));\r
10976                 return ERR_INVALID_PARAMETER;\r
10977         }\r
10978 \r
10979         o = ParseCommandList(c, cmd_name, str, NULL, 0);\r
10980         if (o == NULL)\r
10981         {\r
10982                 return ERR_INVALID_PARAMETER;\r
10983         }\r
10984 \r
10985         Zero(&t, sizeof(t));\r
10986 \r
10987         StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);\r
10988 \r
10989         // RPC 呼び出し\r
10990         ret = ScGetHubLog(ps->Rpc, &t);\r
10991 \r
10992         if (ret != ERR_NO_ERROR)\r
10993         {\r
10994                 // エラー発生\r
10995                 CmdPrintError(c, ret);\r
10996                 FreeParamValueList(o);\r
10997                 return ret;\r
10998         }\r
10999         else\r
11000         {\r
11001                 CT *ct = CtNewStandard();\r
11002 \r
11003                 CtInsert(ct, _UU("CMD_Log_SecurityLog"),\r
11004                         t.LogSetting.SaveSecurityLog ? _UU("CMD_MSG_ENABLE") : _UU("CMD_MSG_DISABLE"));\r
11005                 if (t.LogSetting.SaveSecurityLog)\r
11006                 {\r
11007                         CtInsert(ct, _UU("CMD_Log_SwitchType"), GetLogSwitchStr(t.LogSetting.SecurityLogSwitchType));\r
11008                 }\r
11009 \r
11010                 CtInsert(ct, L"", L"");\r
11011 \r
11012                 CtInsert(ct, _UU("CMD_Log_PacketLog"),\r
11013                         t.LogSetting.SavePacketLog ? _UU("CMD_MSG_ENABLE") : _UU("CMD_MSG_DISABLE"));\r
11014                 if (t.LogSetting.SavePacketLog)\r
11015                 {\r
11016                         UINT i;\r
11017 \r
11018                         CtInsert(ct, _UU("CMD_Log_SwitchType"), GetLogSwitchStr(t.LogSetting.PacketLogSwitchType));\r
11019 \r
11020                         for (i = 0;i <= 7;i++)\r
11021                         {\r
11022                                 wchar_t *tmp = NULL;\r
11023 \r
11024                                 switch (t.LogSetting.PacketLogConfig[i])\r
11025                                 {\r
11026                                 case PACKET_LOG_NONE:\r
11027                                         tmp = _UU("D_SM_LOG@B_PACKET_0_0");\r
11028                                         break;\r
11029 \r
11030                                 case PACKET_LOG_HEADER:\r
11031                                         tmp = _UU("D_SM_LOG@B_PACKET_0_1");\r
11032                                         break;\r
11033 \r
11034                                 case PACKET_LOG_ALL:\r
11035                                         tmp = _UU("D_SM_LOG@B_PACKET_0_2");\r
11036                                         break;\r
11037                                 }\r
11038 \r
11039                                 CtInsert(ct, GetPacketLogNameStr(i),\r
11040                                         tmp);\r
11041                         }\r
11042                 }\r
11043 \r
11044                 CtFree(ct, c);\r
11045         }\r
11046 \r
11047         FreeParamValueList(o);\r
11048 \r
11049         return 0;\r
11050 }\r
11051 \r
11052 // LogEnable コマンド\r
11053 UINT PsLogEnable(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)\r
11054 {\r
11055         LIST *o;\r
11056         PS *ps = (PS *)param;\r
11057         UINT ret = 0;\r
11058         RPC_HUB_LOG t;\r
11059         bool packet_log = false;\r
11060         char *tmp;\r
11061         // 指定できるパラメータ リスト\r
11062         PARAM args[] =\r
11063         {\r
11064                 {"[security|packet]", CmdPrompt, _UU("CMD_LogEnable_Prompt"), CmdEvalNotEmpty, NULL},\r
11065         };\r
11066 \r
11067         // 仮想 HUB が選択されていない場合はエラー\r
11068         if (ps->HubName == NULL)\r
11069         {\r
11070                 c->Write(c, _UU("CMD_Hub_Not_Selected"));\r
11071                 return ERR_INVALID_PARAMETER;\r
11072         }\r
11073 \r
11074         o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));\r
11075         if (o == NULL)\r
11076         {\r
11077                 return ERR_INVALID_PARAMETER;\r
11078         }\r
11079 \r
11080         tmp = GetParamStr(o, "[security|packet]");\r
11081 \r
11082         if (StartWith(tmp, "p"))\r
11083         {\r
11084                 packet_log = true;\r
11085         }\r
11086         else if (StartWith(tmp, "s") == false)\r
11087         {\r
11088                 c->Write(c, _UU("CMD_LogEnable_Prompt_Error"));\r
11089                 FreeParamValueList(o);\r
11090                 return ret;\r
11091         }\r
11092 \r
11093         Zero(&t, sizeof(t));\r
11094 \r
11095         StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);\r
11096 \r
11097         // RPC 呼び出し\r
11098         ret = ScGetHubLog(ps->Rpc, &t);\r
11099         if (ret != ERR_NO_ERROR)\r
11100         {\r
11101                 // エラー発生\r
11102                 CmdPrintError(c, ret);\r
11103                 FreeParamValueList(o);\r
11104                 return ret;\r
11105         }\r
11106 \r
11107         if (packet_log == false)\r
11108         {\r
11109                 t.LogSetting.SaveSecurityLog = true;\r
11110         }\r
11111         else\r
11112         {\r
11113                 t.LogSetting.SavePacketLog = true;\r
11114         }\r
11115 \r
11116         // RPC 呼び出し\r
11117         ret = ScSetHubLog(ps->Rpc, &t);\r
11118         if (ret != ERR_NO_ERROR)\r
11119         {\r
11120                 // エラー発生\r
11121                 CmdPrintError(c, ret);\r
11122                 FreeParamValueList(o);\r
11123                 return ret;\r
11124         }\r
11125 \r
11126         FreeParamValueList(o);\r
11127 \r
11128         return 0;\r
11129 }\r
11130 \r
11131 // セキュリティ ログまたはパケット ログの無効化\r
11132 UINT PsLogDisable(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)\r
11133 {\r
11134         LIST *o;\r
11135         PS *ps = (PS *)param;\r
11136         UINT ret = 0;\r
11137         RPC_HUB_LOG t;\r
11138         bool packet_log = false;\r
11139         char *tmp;\r
11140         // 指定できるパラメータ リスト\r
11141         PARAM args[] =\r
11142         {\r
11143                 {"[security|packet]", CmdPrompt, _UU("CMD_LogEnable_Prompt"), CmdEvalNotEmpty, NULL},\r
11144         };\r
11145 \r
11146         // 仮想 HUB が選択されていない場合はエラー\r
11147         if (ps->HubName == NULL)\r
11148         {\r
11149                 c->Write(c, _UU("CMD_Hub_Not_Selected"));\r
11150                 return ERR_INVALID_PARAMETER;\r
11151         }\r
11152 \r
11153         o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));\r
11154         if (o == NULL)\r
11155         {\r
11156                 return ERR_INVALID_PARAMETER;\r
11157         }\r
11158 \r
11159         tmp = GetParamStr(o, "[security|packet]");\r
11160 \r
11161         if (StartWith(tmp, "p"))\r
11162         {\r
11163                 packet_log = true;\r
11164         }\r
11165         else if (StartWith(tmp, "s") == false)\r
11166         {\r
11167                 c->Write(c, _UU("CMD_LogEnable_Prompt_Error"));\r
11168                 FreeParamValueList(o);\r
11169                 return ERR_INVALID_PARAMETER;\r
11170         }\r
11171 \r
11172         Zero(&t, sizeof(t));\r
11173 \r
11174         StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);\r
11175 \r
11176         // RPC 呼び出し\r
11177         ret = ScGetHubLog(ps->Rpc, &t);\r
11178         if (ret != ERR_NO_ERROR)\r
11179         {\r
11180                 // エラー発生\r
11181                 CmdPrintError(c, ret);\r
11182                 FreeParamValueList(o);\r
11183                 return ret;\r
11184         }\r
11185 \r
11186         if (packet_log == false)\r
11187         {\r
11188                 t.LogSetting.SaveSecurityLog = false;\r
11189         }\r
11190         else\r
11191         {\r
11192                 t.LogSetting.SavePacketLog = false;\r
11193         }\r
11194 \r
11195         // RPC 呼び出し\r
11196         ret = ScSetHubLog(ps->Rpc, &t);\r
11197         if (ret != ERR_NO_ERROR)\r
11198         {\r
11199                 // エラー発生\r
11200                 CmdPrintError(c, ret);\r
11201                 FreeParamValueList(o);\r
11202                 return ret;\r
11203         }\r
11204 \r
11205         FreeParamValueList(o);\r
11206 \r
11207         return 0;\r
11208 }\r
11209 \r
11210 // 文字列をログ切り替え種類に変換\r
11211 UINT StrToLogSwitchType(char *str)\r
11212 {\r
11213         UINT ret = INFINITE;\r
11214         // 引数チェック\r
11215         if (str == NULL)\r
11216         {\r
11217                 return INFINITE;\r
11218         }\r
11219 \r
11220         if (IsEmptyStr(str) || StartWith("none", str))\r
11221         {\r
11222                 ret = LOG_SWITCH_NO;\r
11223         }\r
11224         else if (StartWith("second", str))\r
11225         {\r
11226                 ret = LOG_SWITCH_SECOND;\r
11227         }\r
11228         else if (StartWith("minute", str))\r
11229         {\r
11230                 ret = LOG_SWITCH_MINUTE;\r
11231         }\r
11232         else if (StartWith("hour", str))\r
11233         {\r
11234                 ret = LOG_SWITCH_HOUR;\r
11235         }\r
11236         else if (StartWith("day", str))\r
11237         {\r
11238                 ret = LOG_SWITCH_DAY;\r
11239         }\r
11240         else if (StartWith("month", str))\r
11241         {\r
11242                 ret = LOG_SWITCH_MONTH;\r
11243         }\r
11244 \r
11245         return ret;\r
11246 }\r
11247 \r
11248 // ログ ファイルの切り替え周期の設定\r
11249 UINT PsLogSwitchSet(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)\r
11250 {\r
11251         LIST *o;\r
11252         PS *ps = (PS *)param;\r
11253         UINT ret = 0;\r
11254         RPC_HUB_LOG t;\r
11255         bool packet_log = false;\r
11256         char *tmp;\r
11257         UINT new_switch_type = 0;\r
11258         // 指定できるパラメータ リスト\r
11259         PARAM args[] =\r
11260         {\r
11261                 {"[security|packet]", CmdPrompt, _UU("CMD_LogEnable_Prompt"), CmdEvalNotEmpty, NULL},\r
11262                 {"SWITCH", CmdPrompt, _UU("CMD_LogSwitchSet_Prompt"), NULL, NULL},\r
11263         };\r
11264 \r
11265         // 仮想 HUB が選択されていない場合はエラー\r
11266         if (ps->HubName == NULL)\r
11267         {\r
11268                 c->Write(c, _UU("CMD_Hub_Not_Selected"));\r
11269                 return ERR_INVALID_PARAMETER;\r
11270         }\r
11271 \r
11272         o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));\r
11273         if (o == NULL)\r
11274         {\r
11275                 return ERR_INVALID_PARAMETER;\r
11276         }\r
11277 \r
11278         tmp = GetParamStr(o, "[security|packet]");\r
11279 \r
11280         if (StartWith(tmp, "p"))\r
11281         {\r
11282                 packet_log = true;\r
11283         }\r
11284         else if (StartWith(tmp, "s") == false)\r
11285         {\r
11286                 c->Write(c, _UU("CMD_LogEnable_Prompt_Error"));\r
11287                 FreeParamValueList(o);\r
11288                 return ERR_INVALID_PARAMETER;\r
11289         }\r
11290         \r
11291         new_switch_type = StrToLogSwitchType(GetParamStr(o, "SWITCH"));\r
11292 \r
11293         if (new_switch_type == INFINITE)\r
11294         {\r
11295                 c->Write(c, _UU("CMD_LogEnable_Prompt_Error"));\r
11296                 FreeParamValueList(o);\r
11297                 return ERR_INVALID_PARAMETER;\r
11298         }\r
11299 \r
11300         Zero(&t, sizeof(t));\r
11301 \r
11302         StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);\r
11303 \r
11304         // RPC 呼び出し\r
11305         ret = ScGetHubLog(ps->Rpc, &t);\r
11306         if (ret != ERR_NO_ERROR)\r
11307         {\r
11308                 // エラー発生\r
11309                 CmdPrintError(c, ret);\r
11310                 FreeParamValueList(o);\r
11311                 return ret;\r
11312         }\r
11313 \r
11314         if (packet_log == false)\r
11315         {\r
11316                 t.LogSetting.SecurityLogSwitchType = new_switch_type;\r
11317         }\r
11318         else\r
11319         {\r
11320                 t.LogSetting.PacketLogSwitchType = new_switch_type;\r
11321         }\r
11322 \r
11323         // RPC 呼び出し\r
11324         ret = ScSetHubLog(ps->Rpc, &t);\r
11325         if (ret != ERR_NO_ERROR)\r
11326         {\r
11327                 // エラー発生\r
11328                 CmdPrintError(c, ret);\r
11329                 FreeParamValueList(o);\r
11330                 return ret;\r
11331         }\r
11332 \r
11333         FreeParamValueList(o);\r
11334 \r
11335         return 0;\r
11336 }\r
11337 \r
11338 // パケットログのパケットの保存内容の文字列を整数に変換\r
11339 UINT StrToPacketLogSaveInfoType(char *str)\r
11340 {\r
11341         UINT ret = INFINITE;\r
11342         if (str == NULL)\r
11343         {\r
11344                 return INFINITE;\r
11345         }\r
11346 \r
11347         if (StartWith("none", str) || IsEmptyStr(str))\r
11348         {\r
11349                 ret = PACKET_LOG_NONE;\r
11350         }\r
11351         else if (StartWith("header", str))\r
11352         {\r
11353                 ret = PACKET_LOG_HEADER;\r
11354         }\r
11355         else if (StartWith("full", str) || StartWith("all", str))\r
11356         {\r
11357                 ret = PACKET_LOG_ALL;\r
11358         }\r
11359 \r
11360         return ret;\r
11361 }\r
11362 \r
11363 // パケットログのパケットの種類の文字列を整数に変換\r
11364 UINT StrToPacketLogType(char *str)\r
11365 {\r
11366         UINT ret = INFINITE;\r
11367         if (str == NULL || IsEmptyStr(str))\r
11368         {\r
11369                 return INFINITE;\r
11370         }\r
11371 \r
11372         if (StartWith("tcpconn", str))\r
11373         {\r
11374                 ret = PACKET_LOG_TCP_CONN;\r
11375         }\r
11376         else if (StartWith("tcpdata", str))\r
11377         {\r
11378                 ret = PACKET_LOG_TCP;\r
11379         }\r
11380         else if (StartWith("dhcp", str))\r
11381         {\r
11382                 ret = PACKET_LOG_DHCP;\r
11383         }\r
11384         else if (StartWith("udp", str))\r
11385         {\r
11386                 ret = PACKET_LOG_UDP;\r
11387         }\r
11388         else if (StartWith("icmp", str))\r
11389         {\r
11390                 ret = PACKET_LOG_ICMP;\r
11391         }\r
11392         else if (StartWith("ip", str))\r
11393         {\r
11394                 ret = PACKET_LOG_IP;\r
11395         }\r
11396         else if (StartWith("arp", str))\r
11397         {\r
11398                 ret = PACKET_LOG_ARP;\r
11399         }\r
11400         else if (StartWith("ethernet", str))\r
11401         {\r
11402                 ret = PACKET_LOG_ETHERNET;\r
11403         }\r
11404 \r
11405         return ret;\r
11406 }\r
11407 \r
11408 // パケット ログに保存するパケットの種類と保存内容の設定\r
11409 UINT PsLogPacketSaveType(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)\r
11410 {\r
11411         LIST *o;\r
11412         PS *ps = (PS *)param;\r
11413         UINT ret = 0;\r
11414         RPC_HUB_LOG t;\r
11415         bool packet_log = false;\r
11416         UINT packet_type = INFINITE;\r
11417         UINT packet_save_info_type = INFINITE;\r
11418         // 指定できるパラメータ リスト\r
11419         PARAM args[] =\r
11420         {\r
11421                 {"TYPE", CmdPrompt, _UU("CMD_LogPacketSaveType_Prompt_TYPE"), NULL, NULL},\r
11422                 {"SAVE", CmdPrompt, _UU("CMD_LogPacketSaveType_Prompt_SAVE"), NULL, NULL},\r
11423         };\r
11424 \r
11425         // 仮想 HUB が選択されていない場合はエラー\r
11426         if (ps->HubName == NULL)\r
11427         {\r
11428                 c->Write(c, _UU("CMD_Hub_Not_Selected"));\r
11429                 return ERR_INVALID_PARAMETER;\r
11430         }\r
11431 \r
11432         o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));\r
11433         if (o == NULL)\r
11434         {\r
11435                 return ERR_INVALID_PARAMETER;\r
11436         }\r
11437         \r
11438         packet_type = StrToPacketLogType(GetParamStr(o, "TYPE"));\r
11439         packet_save_info_type = StrToPacketLogSaveInfoType(GetParamStr(o, "SAVE"));\r
11440 \r
11441         if (packet_type == INFINITE || packet_save_info_type == INFINITE)\r
11442         {\r
11443                 c->Write(c, _UU("CMD_LogEnable_Prompt_Error"));\r
11444                 FreeParamValueList(o);\r
11445                 return ERR_INVALID_PARAMETER;\r
11446         }\r
11447 \r
11448         Zero(&t, sizeof(t));\r
11449 \r
11450         StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);\r
11451 \r
11452         // RPC 呼び出し\r
11453         ret = ScGetHubLog(ps->Rpc, &t);\r
11454         if (ret != ERR_NO_ERROR)\r
11455         {\r
11456                 // エラー発生\r
11457                 CmdPrintError(c, ret);\r
11458                 FreeParamValueList(o);\r
11459                 return ret;\r
11460         }\r
11461 \r
11462         t.LogSetting.PacketLogConfig[packet_type] = packet_save_info_type;\r
11463 \r
11464         // RPC 呼び出し\r
11465         ret = ScSetHubLog(ps->Rpc, &t);\r
11466         if (ret != ERR_NO_ERROR)\r
11467         {\r
11468                 // エラー発生\r
11469                 CmdPrintError(c, ret);\r
11470                 FreeParamValueList(o);\r
11471                 return ret;\r
11472         }\r
11473 \r
11474         FreeParamValueList(o);\r
11475 \r
11476         return 0;\r
11477 }\r
11478 \r
11479 // 信頼する証明機関の証明書一覧の取得\r
11480 UINT PsCAList(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)\r
11481 {\r
11482         LIST *o;\r
11483         PS *ps = (PS *)param;\r
11484         UINT ret = 0;\r
11485         RPC_HUB_ENUM_CA t;\r
11486         \r
11487         // 仮想 HUB が選択されていない場合はエラー\r
11488         if (ps->HubName == NULL)\r
11489         {\r
11490                 c->Write(c, _UU("CMD_Hub_Not_Selected"));\r
11491                 return ERR_INVALID_PARAMETER;\r
11492         }\r
11493 \r
11494         o = ParseCommandList(c, cmd_name, str, NULL, 0);\r
11495         if (o == NULL)\r
11496         {\r
11497                 return ERR_INVALID_PARAMETER;\r
11498         }\r
11499 \r
11500         Zero(&t, sizeof(t));\r
11501 \r
11502         StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);\r
11503 \r
11504         // RPC 呼び出し\r
11505         ret = ScEnumCa(ps->Rpc, &t);\r
11506 \r
11507         if (ret != ERR_NO_ERROR)\r
11508         {\r
11509                 // エラー発生\r
11510                 CmdPrintError(c, ret);\r
11511                 FreeParamValueList(o);\r
11512                 return ret;\r
11513         }\r
11514         else\r
11515         {\r
11516                 UINT i;\r
11517                 CT *ct = CtNewStandard();\r
11518 \r
11519                 for (i = 0;i < t.NumCa;i++)\r
11520                 {\r
11521                         wchar_t tmp[MAX_SIZE];\r
11522                         wchar_t tmp2[64];\r
11523                         RPC_HUB_ENUM_CA_ITEM *e = &t.Ca[i];\r
11524 \r
11525                         GetDateStrEx64(tmp, sizeof(tmp), SystemToLocal64(e->Expires), NULL);\r
11526 \r
11527                         UniToStru(tmp2, e->Key);\r
11528 \r
11529                         CtInsert(ct, _UU("CMD_CAList_COLUMN_ID"), tmp2);\r
11530                         CtInsert(ct, _UU("CM_CERT_COLUMN_1"), e->SubjectName);\r
11531                         CtInsert(ct, _UU("CM_CERT_COLUMN_2"), e->IssuerName);\r
11532                         CtInsert(ct, _UU("CM_CERT_COLUMN_3"), tmp);\r
11533 \r
11534                         if (i != (t.NumCa - 1))\r
11535                         {\r
11536                                 CtInsert(ct, L"---", L"---");\r
11537                         }\r
11538                 }\r
11539 \r
11540                 CtFree(ct, c);\r
11541         }\r
11542 \r
11543         FreeRpcHubEnumCa(&t);\r
11544 \r
11545         FreeParamValueList(o);\r
11546 \r
11547         return 0;\r
11548 }\r
11549 \r
11550 // 信頼する証明機関の証明書の追加\r
11551 UINT PsCAAdd(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)\r
11552 {\r
11553         LIST *o;\r
11554         PS *ps = (PS *)param;\r
11555         UINT ret = 0;\r
11556         RPC_HUB_ADD_CA t;\r
11557         X *x;\r
11558         // 指定できるパラメータ リスト\r
11559         PARAM args[] =\r
11560         {\r
11561                 // "name", prompt_proc, prompt_param, eval_proc, eval_param\r
11562                 {"[path]", CmdPrompt, _UU("CMD_CAAdd_PROMPT_PATH"), CmdEvalIsFile, NULL},\r
11563         };\r
11564         \r
11565         // 仮想 HUB が選択されていない場合はエラー\r
11566         if (ps->HubName == NULL)\r
11567         {\r
11568                 c->Write(c, _UU("CMD_Hub_Not_Selected"));\r
11569                 return ERR_INVALID_PARAMETER;\r
11570         }\r
11571 \r
11572         o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));\r
11573         if (o == NULL)\r
11574         {\r
11575                 return ERR_INVALID_PARAMETER;\r
11576         }\r
11577 \r
11578         x = FileToX(GetParamStr(o, "[path]"));\r
11579 \r
11580         if (x == NULL)\r
11581         {\r
11582                 FreeParamValueList(o);\r
11583                 c->Write(c, _UU("CMD_MSG_LOAD_CERT_FAILED"));\r
11584                 return ERR_INVALID_PARAMETER;\r
11585         }\r
11586 \r
11587         Zero(&t, sizeof(t));\r
11588         StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);\r
11589         t.Cert = x;\r
11590 \r
11591         // RPC 呼び出し\r
11592         ret = ScAddCa(ps->Rpc, &t);\r
11593 \r
11594         if (ret != ERR_NO_ERROR)\r
11595         {\r
11596                 // エラー発生\r
11597                 CmdPrintError(c, ret);\r
11598                 FreeParamValueList(o);\r
11599                 return ret;\r
11600         }\r
11601 \r
11602         FreeRpcHubAddCa(&t);\r
11603 \r
11604         FreeParamValueList(o);\r
11605 \r
11606         return 0;\r
11607 }\r
11608 \r
11609 // 信頼する証明機関の証明書の削除\r
11610 UINT PsCADelete(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)\r
11611 {\r
11612         LIST *o;\r
11613         PS *ps = (PS *)param;\r
11614         UINT ret = 0;\r
11615         RPC_HUB_DELETE_CA t;\r
11616         // 指定できるパラメータ リスト\r
11617         PARAM args[] =\r
11618         {\r
11619                 // "name", prompt_proc, prompt_param, eval_proc, eval_param\r
11620                 {"[id]", CmdPrompt, _UU("CMD_CADelete_PROMPT_ID"), CmdEvalNotEmpty, NULL},\r
11621         };\r
11622         \r
11623         // 仮想 HUB が選択されていない場合はエラー\r
11624         if (ps->HubName == NULL)\r
11625         {\r
11626                 c->Write(c, _UU("CMD_Hub_Not_Selected"));\r
11627                 return ERR_INVALID_PARAMETER;\r
11628         }\r
11629 \r
11630         o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));\r
11631         if (o == NULL)\r
11632         {\r
11633                 return ERR_INVALID_PARAMETER;\r
11634         }\r
11635 \r
11636         Zero(&t, sizeof(t));\r
11637         StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);\r
11638         t.Key = GetParamInt(o, "[id]");\r
11639 \r
11640         // RPC 呼び出し\r
11641         ret = ScDeleteCa(ps->Rpc, &t);\r
11642 \r
11643         if (ret != ERR_NO_ERROR)\r
11644         {\r
11645                 // エラー発生\r
11646                 CmdPrintError(c, ret);\r
11647                 FreeParamValueList(o);\r
11648                 return ret;\r
11649         }\r
11650 \r
11651         FreeParamValueList(o);\r
11652 \r
11653         return 0;\r
11654 }\r
11655 \r
11656 // 信頼する証明機関の証明書の取得\r
11657 UINT PsCAGet(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)\r
11658 {\r
11659         LIST *o;\r
11660         PS *ps = (PS *)param;\r
11661         UINT ret = 0;\r
11662         RPC_HUB_GET_CA t;\r
11663         // 指定できるパラメータ リスト\r
11664         PARAM args[] =\r
11665         {\r
11666                 // "name", prompt_proc, prompt_param, eval_proc, eval_param\r
11667                 {"[id]", CmdPrompt, _UU("CMD_CAGet_PROMPT_ID"), CmdEvalNotEmpty, NULL},\r
11668                 {"SAVECERT", CmdPrompt, _UU("CMD_CAGet_PROMPT_SAVECERT"), CmdEvalNotEmpty, NULL},\r
11669         };\r
11670         \r
11671         // 仮想 HUB が選択されていない場合はエラー\r
11672         if (ps->HubName == NULL)\r
11673         {\r
11674                 c->Write(c, _UU("CMD_Hub_Not_Selected"));\r
11675                 return ERR_INVALID_PARAMETER;\r
11676         }\r
11677 \r
11678         o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));\r
11679         if (o == NULL)\r
11680         {\r
11681                 return ERR_INVALID_PARAMETER;\r
11682         }\r
11683 \r
11684         Zero(&t, sizeof(t));\r
11685         StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);\r
11686         t.Key = GetParamInt(o, "[id]");\r
11687 \r
11688         // RPC 呼び出し\r
11689         ret = ScGetCa(ps->Rpc, &t);\r
11690 \r
11691         if (ret != ERR_NO_ERROR)\r
11692         {\r
11693                 // エラー発生\r
11694                 CmdPrintError(c, ret);\r
11695                 FreeParamValueList(o);\r
11696                 return ret;\r
11697         }\r
11698         else\r
11699         {\r
11700                 if (XToFile(t.Cert, GetParamStr(o, "SAVECERT"), true))\r
11701                 {\r
11702                         // 成功\r
11703                 }\r
11704                 else\r
11705                 {\r
11706                         ret = ERR_INTERNAL_ERROR;\r
11707                         c->Write(c, _UU("CMD_MSG_SAVE_CERT_FAILED"));\r
11708                 }\r
11709         }\r
11710 \r
11711         FreeRpcHubGetCa(&t);\r
11712 \r
11713         FreeParamValueList(o);\r
11714 \r
11715         return ret;\r
11716 }\r
11717 \r
11718 // カスケード接続一覧の取得\r
11719 UINT PsCascadeList(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)\r
11720 {\r
11721         LIST *o;\r
11722         PS *ps = (PS *)param;\r
11723         UINT ret = 0;\r
11724         RPC_ENUM_LINK t;\r
11725         \r
11726         // 仮想 HUB が選択されていない場合はエラー\r
11727         if (ps->HubName == NULL)\r
11728         {\r
11729                 c->Write(c, _UU("CMD_Hub_Not_Selected"));\r
11730                 return ERR_INVALID_PARAMETER;\r
11731         }\r
11732 \r
11733         o = ParseCommandList(c, cmd_name, str, NULL, 0);\r
11734         if (o == NULL)\r
11735         {\r
11736                 return ERR_INVALID_PARAMETER;\r
11737         }\r
11738 \r
11739         Zero(&t, sizeof(t));\r
11740         StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);\r
11741 \r
11742         // RPC 呼び出し\r
11743         ret = ScEnumLink(ps->Rpc, &t);\r
11744 \r
11745         if (ret != ERR_NO_ERROR)\r
11746         {\r
11747                 // エラー発生\r
11748                 CmdPrintError(c, ret);\r
11749                 FreeParamValueList(o);\r
11750                 return ret;\r
11751         }\r
11752         else\r
11753         {\r
11754                 CT *ct = CtNew();\r
11755                 UINT i;\r
11756 \r
11757                 CtInsertColumn(ct, _UU("SM_LINK_COLUMN_1"), false);\r
11758                 CtInsertColumn(ct, _UU("SM_LINK_COLUMN_2"), false);\r
11759                 CtInsertColumn(ct, _UU("SM_LINK_COLUMN_3"), false);\r
11760                 CtInsertColumn(ct, _UU("SM_LINK_COLUMN_4"), false);\r
11761                 CtInsertColumn(ct, _UU("SM_LINK_COLUMN_5"), false);\r
11762 \r
11763                 for (i = 0;i < t.NumLink;i++)\r
11764                 {\r
11765                         RPC_ENUM_LINK_ITEM *e = &t.Links[i];\r
11766                         wchar_t tmp1[MAX_SIZE];\r
11767                         wchar_t tmp2[MAX_SIZE];\r
11768                         wchar_t tmp3[MAX_SIZE];\r
11769                         wchar_t tmp4[MAX_SIZE];\r
11770 \r
11771                         GetDateTimeStrEx64(tmp1, sizeof(tmp1), SystemToLocal64(e->ConnectedTime), NULL);\r
11772                         StrToUni(tmp2, sizeof(tmp2), e->Hostname);\r
11773                         StrToUni(tmp3, sizeof(tmp3), e->HubName);\r
11774 \r
11775                         if (e->Online == false)\r
11776                         {\r
11777                                 UniStrCpy(tmp4, sizeof(tmp4), _UU("SM_LINK_STATUS_OFFLINE"));\r
11778                         }\r
11779                         else\r
11780                         {\r
11781                                 if (e->Connected)\r
11782                                 {\r
11783                                         UniStrCpy(tmp4, sizeof(tmp4), _UU("SM_LINK_STATUS_ONLINE"));\r
11784                                 }\r
11785                                 else\r
11786                                 {\r
11787                                         if (e->LastError != 0)\r
11788                                         {\r
11789                                                 UniFormat(tmp4, sizeof(tmp4), _UU("SM_LINK_STATUS_ERROR"), e->LastError, _E(e->LastError));\r
11790                                         }\r
11791                                         else\r
11792                                         {\r
11793                                                 UniStrCpy(tmp4, sizeof(tmp4), _UU("SM_LINK_CONNECTING"));\r
11794                                         }\r
11795                                 }\r
11796                         }\r
11797 \r
11798                         CtInsert(ct, e->AccountName, tmp4, tmp1, tmp2, tmp3);\r
11799                 }\r
11800 \r
11801                 CtFreeEx(ct, c, true);\r
11802         }\r
11803 \r
11804         FreeRpcEnumLink(&t);\r
11805 \r
11806         FreeParamValueList(o);\r
11807 \r
11808         return 0;\r
11809 }\r
11810 \r
11811 // 新しいカスケード接続の作成\r
11812 UINT PsCascadeCreate(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)\r
11813 {\r
11814         LIST *o;\r
11815         PS *ps = (PS *)param;\r
11816         UINT ret = 0;\r
11817         RPC_CREATE_LINK t;\r
11818         char *host = NULL;\r
11819         UINT port = 443;\r
11820         // 指定できるパラメータ リスト\r
11821         PARAM args[] =\r
11822         {\r
11823                 // "name", prompt_proc, prompt_param, eval_proc, eval_param\r
11824                 {"[name]", CmdPrompt, _UU("CMD_CascadeCreate_Prompt_Name"), CmdEvalNotEmpty, NULL},\r
11825                 {"SERVER", CmdPrompt, _UU("CMD_CascadeCreate_Prompt_Server"), CmdEvalHostAndPort, NULL},\r
11826                 {"HUB", CmdPrompt, _UU("CMD_CascadeCreate_Prompt_Hub"), CmdEvalSafe, NULL},\r
11827                 {"USERNAME", CmdPrompt, _UU("CMD_CascadeCreate_Prompt_Username"), CmdEvalNotEmpty, NULL},\r
11828         };\r
11829         \r
11830         // 仮想 HUB が選択されていない場合はエラー\r
11831         if (ps->HubName == NULL)\r
11832         {\r
11833                 c->Write(c, _UU("CMD_Hub_Not_Selected"));\r
11834                 return ERR_INVALID_PARAMETER;\r
11835         }\r
11836 \r
11837         o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));\r
11838         if (o == NULL)\r
11839         {\r
11840                 return ERR_INVALID_PARAMETER;\r
11841         }\r
11842 \r
11843         ParseHostPort(GetParamStr(o, "SERVER"), &host, &port, 443);\r
11844 \r
11845         Zero(&t, sizeof(t));\r
11846         StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);\r
11847 \r
11848         t.Online = false;\r
11849 \r
11850         Copy(&t.Policy, GetDefaultPolicy(), sizeof(POLICY));\r
11851 \r
11852         t.ClientOption = ZeroMalloc(sizeof(CLIENT_OPTION));\r
11853         UniStrCpy(t.ClientOption->AccountName, sizeof(t.ClientOption->AccountName), GetParamUniStr(o, "[name]"));\r
11854         t.ClientOption->Port = port;\r
11855         StrCpy(t.ClientOption->Hostname, sizeof(t.ClientOption->Hostname), host);\r
11856         StrCpy(t.ClientOption->HubName, sizeof(t.ClientOption->HubName), GetParamStr(o, "HUB"));\r
11857         t.ClientOption->NumRetry = INFINITE;\r
11858         t.ClientOption->RetryInterval = 15;\r
11859         t.ClientOption->MaxConnection = 8;\r
11860         t.ClientOption->UseEncrypt = true;\r
11861         t.ClientOption->AdditionalConnectionInterval = 1;\r
11862         t.ClientOption->RequireBridgeRoutingMode = true;\r
11863 \r
11864         t.ClientAuth = ZeroMalloc(sizeof(CLIENT_AUTH));\r
11865         t.ClientAuth->AuthType = CLIENT_AUTHTYPE_ANONYMOUS;\r
11866         StrCpy(t.ClientAuth->Username, sizeof(t.ClientAuth->Username), GetParamStr(o, "USERNAME"));\r
11867 \r
11868         Free(host);\r
11869 \r
11870         // RPC 呼び出し\r
11871         ret = ScCreateLink(ps->Rpc, &t);\r
11872 \r
11873         if (ret != ERR_NO_ERROR)\r
11874         {\r
11875                 // エラー発生\r
11876                 CmdPrintError(c, ret);\r
11877                 FreeParamValueList(o);\r
11878                 return ret;\r
11879         }\r
11880 \r
11881         FreeRpcCreateLink(&t);\r
11882 \r
11883         FreeParamValueList(o);\r
11884 \r
11885         return 0;\r
11886 }\r
11887 \r
11888 // カスケード接続の接続先とユーザー名の設定\r
11889 UINT PsCascadeSet(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)\r
11890 {\r
11891         LIST *o;\r
11892         PS *ps = (PS *)param;\r
11893         UINT ret = 0;\r
11894         RPC_CREATE_LINK t;\r
11895         char *host = NULL;\r
11896         UINT port = 443;\r
11897         // 指定できるパラメータ リスト\r
11898         PARAM args[] =\r
11899         {\r
11900                 // "name", prompt_proc, prompt_param, eval_proc, eval_param\r
11901                 {"[name]", CmdPrompt, _UU("CMD_CascadeCreate_Prompt_Name"), CmdEvalNotEmpty, NULL},\r
11902                 {"SERVER", CmdPrompt, _UU("CMD_CascadeCreate_Prompt_Server"), CmdEvalHostAndPort, NULL},\r
11903                 {"HUB", CmdPrompt, _UU("CMD_CascadeCreate_Prompt_Hub"), CmdEvalSafe, NULL},\r
11904         };\r
11905         \r
11906         // 仮想 HUB が選択されていない場合はエラー\r
11907         if (ps->HubName == NULL)\r
11908         {\r
11909                 c->Write(c, _UU("CMD_Hub_Not_Selected"));\r
11910                 return ERR_INVALID_PARAMETER;\r
11911         }\r
11912 \r
11913         o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));\r
11914         if (o == NULL)\r
11915         {\r
11916                 return ERR_INVALID_PARAMETER;\r
11917         }\r
11918 \r
11919         ParseHostPort(GetParamStr(o, "SERVER"), &host, &port, 443);\r
11920 \r
11921         Zero(&t, sizeof(t));\r
11922         StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);\r
11923 \r
11924         t.ClientOption = ZeroMalloc(sizeof(CLIENT_OPTION));\r
11925         UniStrCpy(t.ClientOption->AccountName, sizeof(t.ClientOption->AccountName), GetParamUniStr(o, "[name]"));\r
11926 \r
11927         ret = ScGetLink(ps->Rpc, &t);\r
11928         if (ret != ERR_NO_ERROR)\r
11929         {\r
11930                 // エラー発生\r
11931                 CmdPrintError(c, ret);\r
11932                 FreeParamValueList(o);\r
11933                 Free(host);\r
11934                 return ret;\r
11935         }\r
11936 \r
11937         t.ClientOption->Port = port;\r
11938         StrCpy(t.ClientOption->Hostname, sizeof(t.ClientOption->Hostname), host);\r
11939         StrCpy(t.ClientOption->HubName, sizeof(t.ClientOption->HubName), GetParamStr(o, "HUB"));\r
11940 \r
11941         Free(host);\r
11942 \r
11943         // RPC 呼び出し\r
11944         ret = ScSetLink(ps->Rpc, &t);\r
11945 \r
11946         if (ret != ERR_NO_ERROR)\r
11947         {\r
11948                 // エラー発生\r
11949                 CmdPrintError(c, ret);\r
11950                 FreeParamValueList(o);\r
11951                 return ret;\r
11952         }\r
11953 \r
11954         FreeRpcCreateLink(&t);\r
11955 \r
11956         FreeParamValueList(o);\r
11957 \r
11958         return 0;\r
11959 }\r
11960 \r
11961 // プロキシの種類文字列の取得\r
11962 wchar_t *GetProxyTypeStr(UINT i)\r
11963 {\r
11964         switch (i)\r
11965         {\r
11966         case PROXY_DIRECT:\r
11967 \r
11968                 return _UU("PROTO_DIRECT_TCP");\r
11969 \r
11970         case PROXY_HTTP:\r
11971                 return _UU("PROTO_HTTP_PROXY");\r
11972 \r
11973         case PROXY_SOCKS:\r
11974                 return _UU("PROTO_SOCKS_PROXY");\r
11975 \r
11976         default:\r
11977                 return _UU("PROTO_UNKNOWN");\r
11978         }\r
11979 }\r
11980 \r
11981 // クライアントのユーザー認証の種類文字列の取得\r
11982 wchar_t *GetClientAuthTypeStr(UINT i)\r
11983 {\r
11984         char tmp[MAX_SIZE];\r
11985 \r
11986         Format(tmp, sizeof(tmp), "PW_TYPE_%u", i);\r
11987 \r
11988         return _UU(tmp);\r
11989 }\r
11990 \r
11991 // カスケード接続の設定の取得\r
11992 UINT PsCascadeGet(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)\r
11993 {\r
11994         LIST *o;\r
11995         PS *ps = (PS *)param;\r
11996         UINT ret = 0;\r
11997         RPC_CREATE_LINK t;\r
11998         // 指定できるパラメータ リスト\r
11999         PARAM args[] =\r
12000         {\r
12001                 // "name", prompt_proc, prompt_param, eval_proc, eval_param\r
12002                 {"[name]", CmdPrompt, _UU("CMD_CascadeCreate_Prompt_Name"), CmdEvalNotEmpty, NULL},\r
12003         };\r
12004         \r
12005         // 仮想 HUB が選択されていない場合はエラー\r
12006         if (ps->HubName == NULL)\r
12007         {\r
12008                 c->Write(c, _UU("CMD_Hub_Not_Selected"));\r
12009                 return ERR_INVALID_PARAMETER;\r
12010         }\r
12011 \r
12012         o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));\r
12013         if (o == NULL)\r
12014         {\r
12015                 return ERR_INVALID_PARAMETER;\r
12016         }\r
12017 \r
12018         Zero(&t, sizeof(t));\r
12019         StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);\r
12020         t.ClientOption = ZeroMalloc(sizeof(CLIENT_OPTION));\r
12021         UniStrCpy(t.ClientOption->AccountName, sizeof(t.ClientOption->AccountName),\r
12022                 GetParamUniStr(o, "[name]"));\r
12023 \r
12024         // RPC 呼び出し\r
12025         ret = ScGetLink(ps->Rpc, &t);\r
12026 \r
12027         if (ret != ERR_NO_ERROR)\r
12028         {\r
12029                 // エラー発生\r
12030                 CmdPrintError(c, ret);\r
12031                 FreeParamValueList(o);\r
12032                 return ret;\r
12033         }\r
12034         else\r
12035         {\r
12036                 // 接続設定の内容を表示\r
12037                 wchar_t tmp[MAX_SIZE];\r
12038 \r
12039                 CT *ct = CtNewStandard();\r
12040 \r
12041                 // 接続設定名\r
12042                 CtInsert(ct, _UU("CMD_ACCOUNT_COLUMN_NAME"), t.ClientOption->AccountName);\r
12043 \r
12044                 // 接続先 VPN Server のホスト名\r
12045                 StrToUni(tmp, sizeof(tmp), t.ClientOption->Hostname);\r
12046                 CtInsert(ct, _UU("CMD_ACCOUNT_COLUMN_HOSTNAME"), tmp);\r
12047 \r
12048                 // 接続先 VPN Server のポート番号\r
12049                 UniToStru(tmp, t.ClientOption->Port);\r
12050                 CtInsert(ct, _UU("CMD_ACCOUNT_COLUMN_PORT"), tmp);\r
12051 \r
12052                 // 接続先 VPN Server の仮想 HUB 名\r
12053                 StrToUni(tmp, sizeof(tmp), t.ClientOption->HubName);\r
12054                 CtInsert(ct, _UU("CMD_ACCOUNT_COLUMN_HUBNAME"), tmp);\r
12055 \r
12056                 // 経由するプロキシ サーバーの種類\r
12057                 CtInsert(ct, _UU("CMD_ACCOUNT_COLUMN_PROXY_TYPE"), GetProxyTypeStr(t.ClientOption->ProxyType));\r
12058 \r
12059                 if (t.ClientOption->ProxyType != PROXY_DIRECT)\r
12060                 {\r
12061                         // プロキシ サーバーのホスト名\r
12062                         StrToUni(tmp, sizeof(tmp), t.ClientOption->ProxyName);\r
12063                         CtInsert(ct, _UU("CMD_ACCOUNT_COLUMN_PROXY_HOSTNAME"), tmp);\r
12064 \r
12065                         // プロキシ サーバーのポート番号\r
12066                         UniToStru(tmp, t.ClientOption->ProxyPort);\r
12067                         CtInsert(ct, _UU("CMD_ACCOUNT_COLUMN_PROXY_PORT"), tmp);\r
12068 \r
12069                         // プロキシ サーバーのユーザー名\r
12070                         StrToUni(tmp, sizeof(tmp), t.ClientOption->ProxyUsername);\r
12071                         CtInsert(ct, _UU("CMD_ACCOUNT_COLUMN_PROXY_USERNAME"), tmp);\r
12072                 }\r
12073 \r
12074                 // サーバー証明書の検証\r
12075                 CtInsert(ct, _UU("CMD_ACCOUNT_COLUMN_SERVER_CERT_USE"),\r
12076                         t.CheckServerCert ? _UU("CMD_MSG_ENABLE") : _UU("CMD_MSG_DISABLE"));\r
12077 \r
12078                 // 登録されている固有証明書\r
12079                 if (t.ServerCert != NULL)\r
12080                 {\r
12081                         GetAllNameFromX(tmp, sizeof(tmp), t.ServerCert);\r
12082                         CtInsert(ct, _UU("CMD_ACCOUNT_COLUMN_SERVER_CERT_NAME"), tmp);\r
12083                 }\r
12084 \r
12085                 // 接続に使用するデバイス名\r
12086                 StrToUni(tmp, sizeof(tmp), t.ClientOption->DeviceName);\r
12087                 CtInsert(ct, _UU("CMD_ACCOUNT_COLUMN_DEVICE_NAME"), tmp);\r
12088 \r
12089                 // 認証の種類\r
12090                 CtInsert(ct, _UU("CMD_ACCOUNT_COLUMN_AUTH_TYPE"), GetClientAuthTypeStr(t.ClientAuth->AuthType));\r
12091 \r
12092                 // ユーザー名\r
12093                 StrToUni(tmp, sizeof(tmp), t.ClientAuth->Username);\r
12094                 CtInsert(ct, _UU("CMD_ACCOUNT_COLUMN_AUTH_USERNAME"), tmp);\r
12095 \r
12096                 if (t.ClientAuth->AuthType == CLIENT_AUTHTYPE_CERT)\r
12097                 {\r
12098                         if (t.ClientAuth->ClientX != NULL)\r
12099                         {\r
12100                                 // クライアント証明書名\r
12101                                 GetAllNameFromX(tmp, sizeof(tmp), t.ClientAuth->ClientX);\r
12102                                 CtInsert(ct, _UU("CMD_ACCOUNT_COLUMN_AUTH_CERT_NAME"), tmp);\r
12103                         }\r
12104                 }\r
12105 \r
12106                 // VPN 通信に使用する TCP コネクション数\r
12107                 UniToStru(tmp, t.ClientOption->MaxConnection);\r
12108                 CtInsert(ct, _UU("CMD_ACCOUNT_COLUMN_NUMTCP"), tmp);\r
12109 \r
12110                 // 各 TCP コネクションの確立間隔\r
12111                 UniToStru(tmp, t.ClientOption->AdditionalConnectionInterval);\r
12112                 CtInsert(ct, _UU("CMD_ACCOUNT_COLUMN_TCP_INTERVAL"), tmp);\r
12113 \r
12114                 // 各 TCP コネクションの寿命\r
12115                 if (t.ClientOption->ConnectionDisconnectSpan != 0)\r
12116                 {\r
12117                         UniToStru(tmp, t.ClientOption->ConnectionDisconnectSpan);\r
12118                 }\r
12119                 else\r
12120                 {\r
12121                         UniStrCpy(tmp, sizeof(tmp), _UU("CMD_MSG_INFINITE"));\r
12122                 }\r
12123                 CtInsert(ct, _UU("CMD_ACCOUNT_COLUMN_TCP_TTL"), tmp);\r
12124 \r
12125                 // 半二重モードの使用\r
12126                 CtInsert(ct, _UU("CMD_ACCOUNT_COLUMN_TCP_HALF"),\r
12127                         t.ClientOption->HalfConnection ? _UU("CMD_MSG_ENABLE") : _UU("CMD_MSG_DISABLE"));\r
12128 \r
12129                 // SSL による暗号化\r
12130                 CtInsert(ct, _UU("CMD_ACCOUNT_COLUMN_ENCRYPT"),\r
12131                         t.ClientOption->UseEncrypt ? _UU("CMD_MSG_ENABLE") : _UU("CMD_MSG_DISABLE"));\r
12132 \r
12133                 // データ圧縮\r
12134                 CtInsert(ct, _UU("CMD_ACCOUNT_COLUMN_COMPRESS"),\r
12135                         t.ClientOption->UseCompress ? _UU("CMD_MSG_ENABLE") : _UU("CMD_MSG_DISABLE"));\r
12136 \r
12137                 // ブリッジ / ルータモードで接続\r
12138                 CtInsert(ct, _UU("CMD_ACCOUNT_COLUMN_BRIDGE_ROUTER"),\r
12139                         t.ClientOption->RequireBridgeRoutingMode ? _UU("CMD_MSG_ENABLE") : _UU("CMD_MSG_DISABLE"));\r
12140 \r
12141                 // モニタリングモードで接続\r
12142                 CtInsert(ct, _UU("CMD_ACCOUNT_COLUMN_MONITOR"),\r
12143                         t.ClientOption->RequireMonitorMode ? _UU("CMD_MSG_ENABLE") : _UU("CMD_MSG_DISABLE"));\r
12144 \r
12145                 // ルーティング テーブルを書き換えない\r
12146                 CtInsert(ct, _UU("CMD_ACCOUNT_COLUMN_NO_TRACKING"),\r
12147                         t.ClientOption->NoRoutingTracking ? _UU("CMD_MSG_ENABLE") : _UU("CMD_MSG_DISABLE"));\r
12148 \r
12149                 // QoS制御を無効化する\r
12150                 CtInsert(ct, _UU("CMD_ACCOUNT_COLUMN_QOS_DISABLE"),\r
12151                         t.ClientOption->DisableQoS ? _UU("CMD_MSG_ENABLE") : _UU("CMD_MSG_DISABLE"));\r
12152 \r
12153                 CtFree(ct, c);\r
12154 \r
12155                 // セキュリティ ポリシー\r
12156                 c->Write(c, L"");\r
12157                 c->Write(c, _UU("CMD_CascadeGet_Policy"));\r
12158                 PrintPolicy(c, &t.Policy, true);\r
12159         }\r
12160 \r
12161         FreeRpcCreateLink(&t);\r
12162 \r
12163         FreeParamValueList(o);\r
12164 \r
12165         return 0;\r
12166 }\r
12167 \r
12168 // カスケード接続の削除\r
12169 UINT PsCascadeDelete(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)\r
12170 {\r
12171         LIST *o;\r
12172         PS *ps = (PS *)param;\r
12173         UINT ret = 0;\r
12174         RPC_LINK t;\r
12175         // 指定できるパラメータ リスト\r
12176         PARAM args[] =\r
12177         {\r
12178                 {"[name]", CmdPrompt, _UU("CMD_CascadeCreate_Prompt_Name"), CmdEvalNotEmpty, NULL},\r
12179         };\r
12180         \r
12181         // 仮想 HUB が選択されていない場合はエラー\r
12182         if (ps->HubName == NULL)\r
12183         {\r
12184                 c->Write(c, _UU("CMD_Hub_Not_Selected"));\r
12185                 return ERR_INVALID_PARAMETER;\r
12186         }\r
12187 \r
12188         o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));\r
12189         if (o == NULL)\r
12190         {\r
12191                 return ERR_INVALID_PARAMETER;\r
12192         }\r
12193 \r
12194         Zero(&t, sizeof(t));\r
12195         UniStrCpy(t.AccountName, sizeof(t.AccountName), GetParamUniStr(o, "[name]"));\r
12196         StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);\r
12197 \r
12198         // RPC 呼び出し\r
12199         ret = ScDeleteLink(ps->Rpc, &t);\r
12200 \r
12201         if (ret != ERR_NO_ERROR)\r
12202         {\r
12203                 // エラー発生\r
12204                 CmdPrintError(c, ret);\r
12205                 FreeParamValueList(o);\r
12206                 return ret;\r
12207         }\r
12208 \r
12209         FreeParamValueList(o);\r
12210 \r
12211         return 0;\r
12212 }\r
12213 \r
12214 // カスケード接続の接続に使用するユーザー名の設定\r
12215 UINT PsCascadeUsernameSet(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)\r
12216 {\r
12217         LIST *o;\r
12218         PS *ps = (PS *)param;\r
12219         UINT ret = 0;\r
12220         RPC_CREATE_LINK t;\r
12221         // 指定できるパラメータ リスト\r
12222         PARAM args[] =\r
12223         {\r
12224                 {"[name]", CmdPrompt, _UU("CMD_CascadeCreate_Prompt_Name"), CmdEvalNotEmpty, NULL},\r
12225                 {"USERNAME", CmdPrompt, _UU("CMD_CascadeCreate_Prompt_Username"), CmdEvalNotEmpty, NULL},\r
12226         };\r
12227         \r
12228         // 仮想 HUB が選択されていない場合はエラー\r
12229         if (ps->HubName == NULL)\r
12230         {\r
12231                 c->Write(c, _UU("CMD_Hub_Not_Selected"));\r
12232                 return ERR_INVALID_PARAMETER;\r
12233         }\r
12234 \r
12235         o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));\r
12236         if (o == NULL)\r
12237         {\r
12238                 return ERR_INVALID_PARAMETER;\r
12239         }\r
12240 \r
12241         Zero(&t, sizeof(t));\r
12242         StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);\r
12243         t.ClientOption = ZeroMalloc(sizeof(CLIENT_OPTION));\r
12244         UniStrCpy(t.ClientOption->AccountName, sizeof(t.ClientOption->AccountName), GetParamUniStr(o, "[name]"));\r
12245 \r
12246         // RPC 呼び出し\r
12247         ret = ScGetLink(ps->Rpc, &t);\r
12248 \r
12249         if (ret != ERR_NO_ERROR)\r
12250         {\r
12251                 // エラー発生\r
12252                 CmdPrintError(c, ret);\r
12253                 FreeParamValueList(o);\r
12254                 return ret;\r
12255         }\r
12256         else\r
12257         {\r
12258                 // カスケード接続の設定の変更\r
12259                 StrCpy(t.ClientAuth->Username, sizeof(t.ClientAuth->Username),\r
12260                         GetParamStr(o, "USERNAME"));\r
12261 \r
12262                 if (t.ClientAuth->AuthType == CLIENT_AUTHTYPE_PASSWORD)\r
12263                 {\r
12264                         c->Write(c, _UU("CMD_CascadeUsername_Notice"));\r
12265                 }\r
12266 \r
12267                 ret = ScSetLink(ps->Rpc, &t);\r
12268                 if (ret != ERR_NO_ERROR)\r
12269                 {\r
12270                         // エラー発生\r
12271                         CmdPrintError(c, ret);\r
12272                         FreeParamValueList(o);\r
12273                         return ret;\r
12274                 }\r
12275 \r
12276                 FreeRpcCreateLink(&t);\r
12277         }\r
12278 \r
12279         FreeParamValueList(o);\r
12280 \r
12281         return 0;\r
12282 }\r
12283 \r
12284 //カスケード接続のユーザー認証の種類を匿名認証に設定\r
12285 UINT PsCascadeAnonymousSet(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)\r
12286 {\r
12287         LIST *o;\r
12288         PS *ps = (PS *)param;\r
12289         UINT ret = 0;\r
12290         RPC_CREATE_LINK t;\r
12291         // 指定できるパラメータ リスト\r
12292         PARAM args[] =\r
12293         {\r
12294                 {"[name]", CmdPrompt, _UU("CMD_CascadeCreate_Prompt_Name"), CmdEvalNotEmpty, NULL},\r
12295         };\r
12296         \r
12297         // 仮想 HUB が選択されていない場合はエラー\r
12298         if (ps->HubName == NULL)\r
12299         {\r
12300                 c->Write(c, _UU("CMD_Hub_Not_Selected"));\r
12301                 return ERR_INVALID_PARAMETER;\r
12302         }\r
12303 \r
12304         o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));\r
12305         if (o == NULL)\r
12306         {\r
12307                 return ERR_INVALID_PARAMETER;\r
12308         }\r
12309 \r
12310         Zero(&t, sizeof(t));\r
12311         StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);\r
12312         t.ClientOption = ZeroMalloc(sizeof(CLIENT_OPTION));\r
12313         UniStrCpy(t.ClientOption->AccountName, sizeof(t.ClientOption->AccountName), GetParamUniStr(o, "[name]"));\r
12314 \r
12315         // RPC 呼び出し\r
12316         ret = ScGetLink(ps->Rpc, &t);\r
12317 \r
12318         if (ret != ERR_NO_ERROR)\r
12319         {\r
12320                 // エラー発生\r
12321                 CmdPrintError(c, ret);\r
12322                 FreeParamValueList(o);\r
12323                 return ret;\r
12324         }\r
12325         else\r
12326         {\r
12327                 // カスケード接続の設定の変更\r
12328                 t.ClientAuth->AuthType = CLIENT_AUTHTYPE_ANONYMOUS;\r
12329 \r
12330                 ret = ScSetLink(ps->Rpc, &t);\r
12331                 if (ret != ERR_NO_ERROR)\r
12332                 {\r
12333                         // エラー発生\r
12334                         CmdPrintError(c, ret);\r
12335                         FreeParamValueList(o);\r
12336                         return ret;\r
12337                 }\r
12338 \r
12339                 FreeRpcCreateLink(&t);\r
12340         }\r
12341 \r
12342         FreeParamValueList(o);\r
12343 \r
12344         return 0;\r
12345 }\r
12346 \r
12347 // カスケード接続のユーザー認証の種類をパスワード認証に設定\r
12348 UINT PsCascadePasswordSet(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)\r
12349 {\r
12350         LIST *o;\r
12351         PS *ps = (PS *)param;\r
12352         UINT ret = 0;\r
12353         RPC_CREATE_LINK t;\r
12354         // 指定できるパラメータ リスト\r
12355         PARAM args[] =\r
12356         {\r
12357                 {"[name]", CmdPrompt, _UU("CMD_CascadeCreate_Prompt_Name"), CmdEvalNotEmpty, NULL},\r
12358                 {"PASSWORD", CmdPromptChoosePassword, NULL, NULL, NULL},\r
12359                 {"TYPE", CmdPrompt, _UU("CMD_CascadePasswordSet_Prompt_Type"), CmdEvalNotEmpty, NULL},\r
12360         };\r
12361         \r
12362         // 仮想 HUB が選択されていない場合はエラー\r
12363         if (ps->HubName == NULL)\r
12364         {\r
12365                 c->Write(c, _UU("CMD_Hub_Not_Selected"));\r
12366                 return ERR_INVALID_PARAMETER;\r
12367         }\r
12368 \r
12369         o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));\r
12370         if (o == NULL)\r
12371         {\r
12372                 return ERR_INVALID_PARAMETER;\r
12373         }\r
12374 \r
12375         Zero(&t, sizeof(t));\r
12376         StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);\r
12377         t.ClientOption = ZeroMalloc(sizeof(CLIENT_OPTION));\r
12378         UniStrCpy(t.ClientOption->AccountName, sizeof(t.ClientOption->AccountName), GetParamUniStr(o, "[name]"));\r
12379 \r
12380         // RPC 呼び出し\r
12381         ret = ScGetLink(ps->Rpc, &t);\r
12382 \r
12383         if (ret != ERR_NO_ERROR)\r
12384         {\r
12385                 // エラー発生\r
12386                 CmdPrintError(c, ret);\r
12387                 FreeParamValueList(o);\r
12388                 return ret;\r
12389         }\r
12390         else\r
12391         {\r
12392                 // カスケード接続の設定の変更\r
12393                 char *typestr = GetParamStr(o, "TYPE");\r
12394 \r
12395                 if (StartWith("standard", typestr))\r
12396                 {\r
12397                         t.ClientAuth->AuthType = CLIENT_AUTHTYPE_PASSWORD;\r
12398                         HashPassword(t.ClientAuth->HashedPassword, t.ClientAuth->Username,\r
12399                                 GetParamStr(o, "PASSWORD"));\r
12400                 }\r
12401                 else if (StartWith("radius", typestr) || StartWith("ntdomain", typestr))\r
12402                 {\r
12403                         t.ClientAuth->AuthType = CLIENT_AUTHTYPE_PLAIN_PASSWORD;\r
12404 \r
12405                         StrCpy(t.ClientAuth->PlainPassword, sizeof(t.ClientAuth->PlainPassword),\r
12406                                 GetParamStr(o, "PASSWORD"));\r
12407                 }\r
12408                 else\r
12409                 {\r
12410                         // エラー発生\r
12411                         c->Write(c, _UU("CMD_CascadePasswordSet_Type_Invalid"));\r
12412                         FreeRpcCreateLink(&t);\r
12413                         ret = ERR_INVALID_PARAMETER;\r
12414                         CmdPrintError(c, ret);\r
12415                         FreeParamValueList(o);\r
12416                         return ERR_INTERNAL_ERROR;\r
12417                 }\r
12418 \r
12419                 ret = ScSetLink(ps->Rpc, &t);\r
12420                 if (ret != ERR_NO_ERROR)\r
12421                 {\r
12422                         // エラー発生\r
12423                         CmdPrintError(c, ret);\r
12424                         FreeParamValueList(o);\r
12425                         return ret;\r
12426                 }\r
12427 \r
12428                 FreeRpcCreateLink(&t);\r
12429         }\r
12430 \r
12431         FreeParamValueList(o);\r
12432 \r
12433         return 0;\r
12434 }\r
12435 \r
12436 // カスケード接続のユーザー認証の種類をクライアント証明書認証に設定\r
12437 UINT PsCascadeCertSet(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)\r
12438 {\r
12439         LIST *o;\r
12440         PS *ps = (PS *)param;\r
12441         UINT ret = 0;\r
12442         RPC_CREATE_LINK t;\r
12443         X *x;\r
12444         K *k;\r
12445         // 指定できるパラメータ リスト\r
12446         PARAM args[] =\r
12447         {\r
12448                 // "name", prompt_proc, prompt_param, eval_proc, eval_param\r
12449                 {"[name]", CmdPrompt, _UU("CMD_CascadeCreate_Prompt_Name"), CmdEvalNotEmpty, NULL},\r
12450                 {"LOADCERT", CmdPrompt, _UU("CMD_LOADCERTPATH"), CmdEvalIsFile, NULL},\r
12451                 {"LOADKEY", CmdPrompt, _UU("CMD_LOADKEYPATH"), CmdEvalIsFile, NULL},\r
12452         };\r
12453         \r
12454         // 仮想 HUB が選択されていない場合はエラー\r
12455         if (ps->HubName == NULL)\r
12456         {\r
12457                 c->Write(c, _UU("CMD_Hub_Not_Selected"));\r
12458                 return ERR_INVALID_PARAMETER;\r
12459         }\r
12460 \r
12461         o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));\r
12462         if (o == NULL)\r
12463         {\r
12464                 return ERR_INVALID_PARAMETER;\r
12465         }\r
12466 \r
12467         if (CmdLoadCertAndKey(c, &x, &k, GetParamStr(o, "LOADCERT"), GetParamStr(o, "LOADKEY")) == false)\r
12468         {\r
12469                 return ERR_INTERNAL_ERROR;\r
12470         }\r
12471 \r
12472         Zero(&t, sizeof(t));\r
12473         StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);\r
12474         t.ClientOption = ZeroMalloc(sizeof(CLIENT_OPTION));\r
12475         UniStrCpy(t.ClientOption->AccountName, sizeof(t.ClientOption->AccountName), GetParamUniStr(o, "[name]"));\r
12476 \r
12477         // RPC 呼び出し\r
12478         ret = ScGetLink(ps->Rpc, &t);\r
12479 \r
12480         if (ret != ERR_NO_ERROR)\r
12481         {\r
12482                 // エラー発生\r
12483                 FreeX(x);\r
12484                 FreeK(k);\r
12485                 CmdPrintError(c, ret);\r
12486                 FreeParamValueList(o);\r
12487                 return ret;\r
12488         }\r
12489         else\r
12490         {\r
12491                 // 認証データ変更\r
12492                 t.ClientAuth->AuthType = CLIENT_AUTHTYPE_CERT;\r
12493                 if (t.ClientAuth->ClientX != NULL)\r
12494                 {\r
12495                         FreeX(t.ClientAuth->ClientX);\r
12496                 }\r
12497                 if (t.ClientAuth->ClientK != NULL)\r
12498                 {\r
12499                         FreeK(t.ClientAuth->ClientK);\r
12500                 }\r
12501 \r
12502                 t.ClientAuth->ClientX = x;\r
12503                 t.ClientAuth->ClientK = k;\r
12504 \r
12505                 ret = ScSetLink(ps->Rpc, &t);\r
12506                 if (ret != ERR_NO_ERROR)\r
12507                 {\r
12508                         // エラー発生\r
12509                         CmdPrintError(c, ret);\r
12510                         FreeParamValueList(o);\r
12511                         return ret;\r
12512                 }\r
12513 \r
12514                 FreeRpcCreateLink(&t);\r
12515         }\r
12516 \r
12517         FreeParamValueList(o);\r
12518 \r
12519         return 0;\r
12520 }\r
12521 \r
12522 // カスケード接続に用いるクライアント証明書の取得\r
12523 UINT PsCascadeCertGet(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)\r
12524 {\r
12525         LIST *o;\r
12526         PS *ps = (PS *)param;\r
12527         UINT ret = 0;\r
12528         RPC_CREATE_LINK t;\r
12529         // 指定できるパラメータ リスト\r
12530         PARAM args[] =\r
12531         {\r
12532                 // "name", prompt_proc, prompt_param, eval_proc, eval_param\r
12533                 {"[name]", CmdPrompt, _UU("CMD_CascadeCreate_Prompt_Name"), CmdEvalNotEmpty, NULL},\r
12534                 {"SAVECERT", CmdPrompt, _UU("CMD_SAVECERTPATH"), CmdEvalNotEmpty, NULL},\r
12535         };\r
12536         \r
12537         // 仮想 HUB が選択されていない場合はエラー\r
12538         if (ps->HubName == NULL)\r
12539         {\r
12540                 c->Write(c, _UU("CMD_Hub_Not_Selected"));\r
12541                 return ERR_INVALID_PARAMETER;\r
12542         }\r
12543 \r
12544         o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));\r
12545         if (o == NULL)\r
12546         {\r
12547                 return ERR_INVALID_PARAMETER;\r
12548         }\r
12549 \r
12550         Zero(&t, sizeof(t));\r
12551         StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);\r
12552         t.ClientOption = ZeroMalloc(sizeof(CLIENT_OPTION));\r
12553         UniStrCpy(t.ClientOption->AccountName, sizeof(t.ClientOption->AccountName), GetParamUniStr(o, "[name]"));\r
12554 \r
12555         // RPC 呼び出し\r
12556         ret = ScGetLink(ps->Rpc, &t);\r
12557 \r
12558         if (ret != ERR_NO_ERROR)\r
12559         {\r
12560                 // エラー発生\r
12561                 CmdPrintError(c, ret);\r
12562                 FreeParamValueList(o);\r
12563                 return ret;\r
12564         }\r
12565         else\r
12566         {\r
12567                 if (t.ClientAuth->AuthType != CLIENT_AUTHTYPE_CERT)\r
12568                 {\r
12569                         c->Write(c, _UU("CMD_CascadeCertSet_Not_Auth_Cert"));\r
12570                         ret = ERR_INTERNAL_ERROR;\r
12571                 }\r
12572                 else if (t.ClientAuth->ClientX == NULL)\r
12573                 {\r
12574                         c->Write(c, _UU("CMD_CascadeCertSet_Cert_Not_Exists"));\r
12575                         ret = ERR_INTERNAL_ERROR;\r
12576                 }\r
12577                 else\r
12578                 {\r
12579                         XToFile(t.ClientAuth->ClientX, GetParamStr(o, "SAVECERT"), true);\r
12580                 }\r
12581                 FreeRpcCreateLink(&t);\r
12582         }\r
12583 \r
12584         FreeParamValueList(o);\r
12585 \r
12586         return ret;\r
12587 }\r
12588 \r
12589 // カスケード接続の通信時の暗号化の有効化\r
12590 UINT PsCascadeEncryptEnable(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)\r
12591 {\r
12592         LIST *o;\r
12593         PS *ps = (PS *)param;\r
12594         UINT ret = 0;\r
12595         RPC_CREATE_LINK t;\r
12596         // 指定できるパラメータ リスト\r
12597         PARAM args[] =\r
12598         {\r
12599                 // "name", prompt_proc, prompt_param, eval_proc, eval_param\r
12600                 {"[name]", CmdPrompt, _UU("CMD_CascadeCreate_Prompt_Name"), CmdEvalNotEmpty, NULL},\r
12601         };\r
12602         \r
12603         // 仮想 HUB が選択されていない場合はエラー\r
12604         if (ps->HubName == NULL)\r
12605         {\r
12606                 c->Write(c, _UU("CMD_Hub_Not_Selected"));\r
12607                 return ERR_INVALID_PARAMETER;\r
12608         }\r
12609 \r
12610         o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));\r
12611         if (o == NULL)\r
12612         {\r
12613                 return ERR_INVALID_PARAMETER;\r
12614         }\r
12615 \r
12616         Zero(&t, sizeof(t));\r
12617         StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);\r
12618         t.ClientOption = ZeroMalloc(sizeof(CLIENT_OPTION));\r
12619         UniStrCpy(t.ClientOption->AccountName, sizeof(t.ClientOption->AccountName), GetParamUniStr(o, "[name]"));\r
12620 \r
12621         // RPC 呼び出し\r
12622         ret = ScGetLink(ps->Rpc, &t);\r
12623 \r
12624         if (ret != ERR_NO_ERROR)\r
12625         {\r
12626                 // エラー発生\r
12627                 CmdPrintError(c, ret);\r
12628                 FreeParamValueList(o);\r
12629                 return ret;\r
12630         }\r
12631         else\r
12632         {\r
12633                 // データ変更\r
12634                 t.ClientOption->UseEncrypt = true;\r
12635 \r
12636                 ret = ScSetLink(ps->Rpc, &t);\r
12637                 if (ret != ERR_NO_ERROR)\r
12638                 {\r
12639                         // エラー発生\r
12640                         CmdPrintError(c, ret);\r
12641                         FreeParamValueList(o);\r
12642                         return ret;\r
12643                 }\r
12644 \r
12645                 FreeRpcCreateLink(&t);\r
12646         }\r
12647 \r
12648         FreeParamValueList(o);\r
12649 \r
12650         return 0;\r
12651 }\r
12652 \r
12653 // カスケード接続の通信時の暗号化の無効化\r
12654 UINT PsCascadeEncryptDisable(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)\r
12655 {\r
12656         LIST *o;\r
12657         PS *ps = (PS *)param;\r
12658         UINT ret = 0;\r
12659         RPC_CREATE_LINK t;\r
12660         // 指定できるパラメータ リスト\r
12661         PARAM args[] =\r
12662         {\r
12663                 // "name", prompt_proc, prompt_param, eval_proc, eval_param\r
12664                 {"[name]", CmdPrompt, _UU("CMD_CascadeCreate_Prompt_Name"), CmdEvalNotEmpty, NULL},\r
12665         };\r
12666         \r
12667         // 仮想 HUB が選択されていない場合はエラー\r
12668         if (ps->HubName == NULL)\r
12669         {\r
12670                 c->Write(c, _UU("CMD_Hub_Not_Selected"));\r
12671                 return ERR_INVALID_PARAMETER;\r
12672         }\r
12673 \r
12674         o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));\r
12675         if (o == NULL)\r
12676         {\r
12677                 return ERR_INVALID_PARAMETER;\r
12678         }\r
12679 \r
12680         Zero(&t, sizeof(t));\r
12681         StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);\r
12682         t.ClientOption = ZeroMalloc(sizeof(CLIENT_OPTION));\r
12683         UniStrCpy(t.ClientOption->AccountName, sizeof(t.ClientOption->AccountName), GetParamUniStr(o, "[name]"));\r
12684 \r
12685         // RPC 呼び出し\r
12686         ret = ScGetLink(ps->Rpc, &t);\r
12687 \r
12688         if (ret != ERR_NO_ERROR)\r
12689         {\r
12690                 // エラー発生\r
12691                 CmdPrintError(c, ret);\r
12692                 FreeParamValueList(o);\r
12693                 return ret;\r
12694         }\r
12695         else\r
12696         {\r
12697                 // データ変更\r
12698                 t.ClientOption->UseEncrypt = false;\r
12699 \r
12700                 ret = ScSetLink(ps->Rpc, &t);\r
12701                 if (ret != ERR_NO_ERROR)\r
12702                 {\r
12703                         // エラー発生\r
12704                         CmdPrintError(c, ret);\r
12705                         FreeParamValueList(o);\r
12706                         return ret;\r
12707                 }\r
12708 \r
12709                 FreeRpcCreateLink(&t);\r
12710         }\r
12711 \r
12712         FreeParamValueList(o);\r
12713 \r
12714         return 0;\r
12715 }\r
12716 \r
12717 // カスケード接続の通信時のデータ圧縮の有効化\r
12718 UINT PsCascadeCompressEnable(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)\r
12719 {\r
12720         LIST *o;\r
12721         PS *ps = (PS *)param;\r
12722         UINT ret = 0;\r
12723         RPC_CREATE_LINK t;\r
12724         // 指定できるパラメータ リスト\r
12725         PARAM args[] =\r
12726         {\r
12727                 // "name", prompt_proc, prompt_param, eval_proc, eval_param\r
12728                 {"[name]", CmdPrompt, _UU("CMD_CascadeCreate_Prompt_Name"), CmdEvalNotEmpty, NULL},\r
12729         };\r
12730         \r
12731         // 仮想 HUB が選択されていない場合はエラー\r
12732         if (ps->HubName == NULL)\r
12733         {\r
12734                 c->Write(c, _UU("CMD_Hub_Not_Selected"));\r
12735                 return ERR_INVALID_PARAMETER;\r
12736         }\r
12737 \r
12738         o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));\r
12739         if (o == NULL)\r
12740         {\r
12741                 return ERR_INVALID_PARAMETER;\r
12742         }\r
12743 \r
12744         Zero(&t, sizeof(t));\r
12745         StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);\r
12746         t.ClientOption = ZeroMalloc(sizeof(CLIENT_OPTION));\r
12747         UniStrCpy(t.ClientOption->AccountName, sizeof(t.ClientOption->AccountName), GetParamUniStr(o, "[name]"));\r
12748 \r
12749         // RPC 呼び出し\r
12750         ret = ScGetLink(ps->Rpc, &t);\r
12751 \r
12752         if (ret != ERR_NO_ERROR)\r
12753         {\r
12754                 // エラー発生\r
12755                 CmdPrintError(c, ret);\r
12756                 FreeParamValueList(o);\r
12757                 return ret;\r
12758         }\r
12759         else\r
12760         {\r
12761                 // データ変更\r
12762                 t.ClientOption->UseCompress = true;\r
12763 \r
12764                 ret = ScSetLink(ps->Rpc, &t);\r
12765                 if (ret != ERR_NO_ERROR)\r
12766                 {\r
12767                         // エラー発生\r
12768                         CmdPrintError(c, ret);\r
12769                         FreeParamValueList(o);\r
12770                         return ret;\r
12771                 }\r
12772 \r
12773                 FreeRpcCreateLink(&t);\r
12774         }\r
12775 \r
12776         FreeParamValueList(o);\r
12777 \r
12778         return 0;\r
12779 }\r
12780 \r
12781 // カスケード接続の通信時のデータ圧縮の無効化\r
12782 UINT PsCascadeCompressDisable(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)\r
12783 {\r
12784         LIST *o;\r
12785         PS *ps = (PS *)param;\r
12786         UINT ret = 0;\r
12787         RPC_CREATE_LINK t;\r
12788         // 指定できるパラメータ リスト\r
12789         PARAM args[] =\r
12790         {\r
12791                 // "name", prompt_proc, prompt_param, eval_proc, eval_param\r
12792                 {"[name]", CmdPrompt, _UU("CMD_CascadeCreate_Prompt_Name"), CmdEvalNotEmpty, NULL},\r
12793         };\r
12794         \r
12795         // 仮想 HUB が選択されていない場合はエラー\r
12796         if (ps->HubName == NULL)\r
12797         {\r
12798                 c->Write(c, _UU("CMD_Hub_Not_Selected"));\r
12799                 return ERR_INVALID_PARAMETER;\r
12800         }\r
12801 \r
12802         o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));\r
12803         if (o == NULL)\r
12804         {\r
12805                 return ERR_INVALID_PARAMETER;\r
12806         }\r
12807 \r
12808         Zero(&t, sizeof(t));\r
12809         StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);\r
12810         t.ClientOption = ZeroMalloc(sizeof(CLIENT_OPTION));\r
12811         UniStrCpy(t.ClientOption->AccountName, sizeof(t.ClientOption->AccountName), GetParamUniStr(o, "[name]"));\r
12812 \r
12813         // RPC 呼び出し\r
12814         ret = ScGetLink(ps->Rpc, &t);\r
12815 \r
12816         if (ret != ERR_NO_ERROR)\r
12817         {\r
12818                 // エラー発生\r
12819                 CmdPrintError(c, ret);\r
12820                 FreeParamValueList(o);\r
12821                 return ret;\r
12822         }\r
12823         else\r
12824         {\r
12825                 // データ変更\r
12826                 t.ClientOption->UseCompress = false;\r
12827 \r
12828                 ret = ScSetLink(ps->Rpc, &t);\r
12829                 if (ret != ERR_NO_ERROR)\r
12830                 {\r
12831                         // エラー発生\r
12832                         CmdPrintError(c, ret);\r
12833                         FreeParamValueList(o);\r
12834                         return ret;\r
12835                 }\r
12836 \r
12837                 FreeRpcCreateLink(&t);\r
12838         }\r
12839 \r
12840         FreeParamValueList(o);\r
12841 \r
12842         return 0;\r
12843 }\r
12844 \r
12845 // カスケード接続の接続方法を直接 TCP/IP 接続に設定\r
12846 UINT PsCascadeProxyNone(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)\r
12847 {\r
12848         LIST *o;\r
12849         PS *ps = (PS *)param;\r
12850         UINT ret = 0;\r
12851         RPC_CREATE_LINK t;\r
12852         // 指定できるパラメータ リスト\r
12853         PARAM args[] =\r
12854         {\r
12855                 // "name", prompt_proc, prompt_param, eval_proc, eval_param\r
12856                 {"[name]", CmdPrompt, _UU("CMD_CascadeCreate_Prompt_Name"), CmdEvalNotEmpty, NULL},\r
12857         };\r
12858         \r
12859         // 仮想 HUB が選択されていない場合はエラー\r
12860         if (ps->HubName == NULL)\r
12861         {\r
12862                 c->Write(c, _UU("CMD_Hub_Not_Selected"));\r
12863                 return ERR_INVALID_PARAMETER;\r
12864         }\r
12865 \r
12866         o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));\r
12867         if (o == NULL)\r
12868         {\r
12869                 return ERR_INVALID_PARAMETER;\r
12870         }\r
12871 \r
12872         Zero(&t, sizeof(t));\r
12873         StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);\r
12874         t.ClientOption = ZeroMalloc(sizeof(CLIENT_OPTION));\r
12875         UniStrCpy(t.ClientOption->AccountName, sizeof(t.ClientOption->AccountName), GetParamUniStr(o, "[name]"));\r
12876 \r
12877         // RPC 呼び出し\r
12878         ret = ScGetLink(ps->Rpc, &t);\r
12879 \r
12880         if (ret != ERR_NO_ERROR)\r
12881         {\r
12882                 // エラー発生\r
12883                 CmdPrintError(c, ret);\r
12884                 FreeParamValueList(o);\r
12885                 return ret;\r
12886         }\r
12887         else\r
12888         {\r
12889                 // データ変更\r
12890                 t.ClientOption->ProxyType = PROXY_DIRECT;\r
12891 \r
12892                 ret = ScSetLink(ps->Rpc, &t);\r
12893                 if (ret != ERR_NO_ERROR)\r
12894                 {\r
12895                         // エラー発生\r
12896                         CmdPrintError(c, ret);\r
12897                         FreeParamValueList(o);\r
12898                         return ret;\r
12899                 }\r
12900 \r
12901                 FreeRpcCreateLink(&t);\r
12902         }\r
12903 \r
12904         FreeParamValueList(o);\r
12905 \r
12906         return 0;\r
12907 }\r
12908 \r
12909 // カスケード接続の接続方法を HTTP プロキシサーバー経由接続に設定\r
12910 UINT PsCascadeProxyHttp(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)\r
12911 {\r
12912         LIST *o;\r
12913         PS *ps = (PS *)param;\r
12914         UINT ret = 0;\r
12915         RPC_CREATE_LINK t;\r
12916         // 指定できるパラメータ リスト\r
12917         PARAM args[] =\r
12918         {\r
12919                 // "name", prompt_proc, prompt_param, eval_proc, eval_param\r
12920                 {"[name]", CmdPrompt, _UU("CMD_CascadeCreate_Prompt_Name"), CmdEvalNotEmpty, NULL},\r
12921                 {"SERVER", CmdPrompt, _UU("CMD_CascadeProxyHttp_Prompt_Server"), CmdEvalHostAndPort, NULL},\r
12922                 {"USERNAME", NULL, NULL, NULL, NULL},\r
12923                 {"PASSWORD", NULL, NULL, NULL, NULL},\r
12924         };\r
12925 \r
12926         // 仮想 HUB が選択されていない場合はエラー\r
12927         if (ps->HubName == NULL)\r
12928         {\r
12929                 c->Write(c, _UU("CMD_Hub_Not_Selected"));\r
12930                 return ERR_INVALID_PARAMETER;\r
12931         }\r
12932 \r
12933         o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));\r
12934         if (o == NULL)\r
12935         {\r
12936                 return ERR_INVALID_PARAMETER;\r
12937         }\r
12938 \r
12939         Zero(&t, sizeof(t));\r
12940         StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);\r
12941         t.ClientOption = ZeroMalloc(sizeof(CLIENT_OPTION));\r
12942         UniStrCpy(t.ClientOption->AccountName, sizeof(t.ClientOption->AccountName), GetParamUniStr(o, "[name]"));\r
12943 \r
12944         // RPC 呼び出し\r
12945         ret = ScGetLink(ps->Rpc, &t);\r
12946 \r
12947         if (ret != ERR_NO_ERROR)\r
12948         {\r
12949                 // エラー発生\r
12950                 CmdPrintError(c, ret);\r
12951                 FreeParamValueList(o);\r
12952                 return ret;\r
12953         }\r
12954         else\r
12955         {\r
12956                 char *host;\r
12957                 UINT port;\r
12958 \r
12959                 // データ変更\r
12960                 if (ParseHostPort(GetParamStr(o, "SERVER"), &host, &port, 8080))\r
12961                 {\r
12962                         t.ClientOption->ProxyType = PROXY_HTTP;\r
12963                         StrCpy(t.ClientOption->ProxyName, sizeof(t.ClientOption->ProxyName), host);\r
12964                         t.ClientOption->ProxyPort = port;\r
12965                         StrCpy(t.ClientOption->ProxyUsername, sizeof(t.ClientOption->ProxyName), GetParamStr(o, "USERNAME"));\r
12966                         StrCpy(t.ClientOption->ProxyPassword, sizeof(t.ClientOption->ProxyName), GetParamStr(o, "PASSWORD"));\r
12967                         Free(host);\r
12968                 }\r
12969 \r
12970                 ret = ScSetLink(ps->Rpc, &t);\r
12971                 if (ret != ERR_NO_ERROR)\r
12972                 {\r
12973                         // エラー発生\r
12974                         CmdPrintError(c, ret);\r
12975                         FreeParamValueList(o);\r
12976                         return ret;\r
12977                 }\r
12978 \r
12979                 FreeRpcCreateLink(&t);\r
12980         }\r
12981 \r
12982         FreeParamValueList(o);\r
12983 \r
12984         return 0;\r
12985 }\r
12986 \r
12987 // カスケード接続の接続方法を SOCKS プロキシサーバー経由接続に設定\r
12988 UINT PsCascadeProxySocks(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)\r
12989 {\r
12990         LIST *o;\r
12991         PS *ps = (PS *)param;\r
12992         UINT ret = 0;\r
12993         RPC_CREATE_LINK t;\r
12994         // 指定できるパラメータ リスト\r
12995         PARAM args[] =\r
12996         {\r
12997                 // "name", prompt_proc, prompt_param, eval_proc, eval_param\r
12998                 {"[name]", CmdPrompt, _UU("CMD_CascadeCreate_Prompt_Name"), CmdEvalNotEmpty, NULL},\r
12999                 {"SERVER", CmdPrompt, _UU("CMD_CascadeProxyHttp_Prompt_Server"), CmdEvalHostAndPort, NULL},\r
13000                 {"USERNAME", NULL, NULL, NULL, NULL},\r
13001                 {"PASSWORD", NULL, NULL, NULL, NULL},\r
13002         };\r
13003 \r
13004         // 仮想 HUB が選択されていない場合はエラー\r
13005         if (ps->HubName == NULL)\r
13006         {\r
13007                 c->Write(c, _UU("CMD_Hub_Not_Selected"));\r
13008                 return ERR_INVALID_PARAMETER;\r
13009         }\r
13010 \r
13011         o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));\r
13012         if (o == NULL)\r
13013         {\r
13014                 return ERR_INVALID_PARAMETER;\r
13015         }\r
13016 \r
13017         Zero(&t, sizeof(t));\r
13018         StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);\r
13019         t.ClientOption = ZeroMalloc(sizeof(CLIENT_OPTION));\r
13020         UniStrCpy(t.ClientOption->AccountName, sizeof(t.ClientOption->AccountName), GetParamUniStr(o, "[name]"));\r
13021 \r
13022         // RPC 呼び出し\r
13023         ret = ScGetLink(ps->Rpc, &t);\r
13024 \r
13025         if (ret != ERR_NO_ERROR)\r
13026         {\r
13027                 // エラー発生\r
13028                 CmdPrintError(c, ret);\r
13029                 FreeParamValueList(o);\r
13030                 return ret;\r
13031         }\r
13032         else\r
13033         {\r
13034                 char *host;\r
13035                 UINT port;\r
13036 \r
13037                 // データ変更\r
13038                 if (ParseHostPort(GetParamStr(o, "SERVER"), &host, &port, 8080))\r
13039                 {\r
13040                         t.ClientOption->ProxyType = PROXY_SOCKS;\r
13041                         StrCpy(t.ClientOption->ProxyName, sizeof(t.ClientOption->ProxyName), host);\r
13042                         t.ClientOption->ProxyPort = port;\r
13043                         StrCpy(t.ClientOption->ProxyUsername, sizeof(t.ClientOption->ProxyName), GetParamStr(o, "USERNAME"));\r
13044                         StrCpy(t.ClientOption->ProxyPassword, sizeof(t.ClientOption->ProxyName), GetParamStr(o, "PASSWORD"));\r
13045                         Free(host);\r
13046                 }\r
13047 \r
13048                 ret = ScSetLink(ps->Rpc, &t);\r
13049                 if (ret != ERR_NO_ERROR)\r
13050                 {\r
13051                         // エラー発生\r
13052                         CmdPrintError(c, ret);\r
13053                         FreeParamValueList(o);\r
13054                         return ret;\r
13055                 }\r
13056 \r
13057                 FreeRpcCreateLink(&t);\r
13058         }\r
13059 \r
13060         FreeParamValueList(o);\r
13061 \r
13062         return 0;\r
13063 }\r
13064 \r
13065 // カスケード接続のサーバー証明書の検証オプションの有効化\r
13066 UINT PsCascadeServerCertEnable(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)\r
13067 {\r
13068         LIST *o;\r
13069         PS *ps = (PS *)param;\r
13070         UINT ret = 0;\r
13071         RPC_CREATE_LINK t;\r
13072         // 指定できるパラメータ リスト\r
13073         PARAM args[] =\r
13074         {\r
13075                 // "name", prompt_proc, prompt_param, eval_proc, eval_param\r
13076                 {"[name]", CmdPrompt, _UU("CMD_CascadeCreate_Prompt_Name"), CmdEvalNotEmpty, NULL},\r
13077         };\r
13078         \r
13079         // 仮想 HUB が選択されていない場合はエラー\r
13080         if (ps->HubName == NULL)\r
13081         {\r
13082                 c->Write(c, _UU("CMD_Hub_Not_Selected"));\r
13083                 return ERR_INVALID_PARAMETER;\r
13084         }\r
13085 \r
13086         o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));\r
13087         if (o == NULL)\r
13088         {\r
13089                 return ERR_INVALID_PARAMETER;\r
13090         }\r
13091 \r
13092         Zero(&t, sizeof(t));\r
13093         StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);\r
13094         t.ClientOption = ZeroMalloc(sizeof(CLIENT_OPTION));\r
13095         UniStrCpy(t.ClientOption->AccountName, sizeof(t.ClientOption->AccountName), GetParamUniStr(o, "[name]"));\r
13096 \r
13097         // RPC 呼び出し\r
13098         ret = ScGetLink(ps->Rpc, &t);\r
13099 \r
13100         if (ret != ERR_NO_ERROR)\r
13101         {\r
13102                 // エラー発生\r
13103                 CmdPrintError(c, ret);\r
13104                 FreeParamValueList(o);\r
13105                 return ret;\r
13106         }\r
13107         else\r
13108         {\r
13109                 // データ変更\r
13110                 t.CheckServerCert = true;\r
13111 \r
13112                 ret = ScSetLink(ps->Rpc, &t);\r
13113                 if (ret != ERR_NO_ERROR)\r
13114                 {\r
13115                         // エラー発生\r
13116                         CmdPrintError(c, ret);\r
13117                         FreeParamValueList(o);\r
13118                         return ret;\r
13119                 }\r
13120 \r
13121                 FreeRpcCreateLink(&t);\r
13122         }\r
13123 \r
13124         FreeParamValueList(o);\r
13125 \r
13126         return 0;\r
13127 }\r
13128 \r
13129 // カスケード接続のサーバー証明書の検証オプションの無効化\r
13130 UINT PsCascadeServerCertDisable(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)\r
13131 {\r
13132         LIST *o;\r
13133         PS *ps = (PS *)param;\r
13134         UINT ret = 0;\r
13135         RPC_CREATE_LINK t;\r
13136         // 指定できるパラメータ リスト\r
13137         PARAM args[] =\r
13138         {\r
13139                 // "name", prompt_proc, prompt_param, eval_proc, eval_param\r
13140                 {"[name]", CmdPrompt, _UU("CMD_CascadeCreate_Prompt_Name"), CmdEvalNotEmpty, NULL},\r
13141         };\r
13142         \r
13143         // 仮想 HUB が選択されていない場合はエラー\r
13144         if (ps->HubName == NULL)\r
13145         {\r
13146                 c->Write(c, _UU("CMD_Hub_Not_Selected"));\r
13147                 return ERR_INVALID_PARAMETER;\r
13148         }\r
13149 \r
13150         o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));\r
13151         if (o == NULL)\r
13152         {\r
13153                 return ERR_INVALID_PARAMETER;\r
13154         }\r
13155 \r
13156         Zero(&t, sizeof(t));\r
13157         StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);\r
13158         t.ClientOption = ZeroMalloc(sizeof(CLIENT_OPTION));\r
13159         UniStrCpy(t.ClientOption->AccountName, sizeof(t.ClientOption->AccountName), GetParamUniStr(o, "[name]"));\r
13160 \r
13161         // RPC 呼び出し\r
13162         ret = ScGetLink(ps->Rpc, &t);\r
13163 \r
13164         if (ret != ERR_NO_ERROR)\r
13165         {\r
13166                 // エラー発生\r
13167                 CmdPrintError(c, ret);\r
13168                 FreeParamValueList(o);\r
13169                 return ret;\r
13170         }\r
13171         else\r
13172         {\r
13173                 // データ変更\r
13174                 t.CheckServerCert = false;\r
13175 \r
13176                 ret = ScSetLink(ps->Rpc, &t);\r
13177                 if (ret != ERR_NO_ERROR)\r
13178                 {\r
13179                         // エラー発生\r
13180                         CmdPrintError(c, ret);\r
13181                         FreeParamValueList(o);\r
13182                         return ret;\r
13183                 }\r
13184 \r
13185                 FreeRpcCreateLink(&t);\r
13186         }\r
13187 \r
13188         FreeParamValueList(o);\r
13189 \r
13190         return 0;\r
13191 }\r
13192 \r
13193 // カスケード接続のサーバー固有証明書の設定\r
13194 UINT PsCascadeServerCertSet(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)\r
13195 {\r
13196         LIST *o;\r
13197         PS *ps = (PS *)param;\r
13198         UINT ret = 0;\r
13199         RPC_CREATE_LINK t;\r
13200         X *x;\r
13201         // 指定できるパラメータ リスト\r
13202         PARAM args[] =\r
13203         {\r
13204                 // "name", prompt_proc, prompt_param, eval_proc, eval_param\r
13205                 {"[name]", CmdPrompt, _UU("CMD_CascadeCreate_Prompt_Name"), CmdEvalNotEmpty, NULL},\r
13206                 {"LOADCERT", CmdPrompt, _UU("CMD_LOADCERTPATH"), CmdEvalIsFile, NULL},\r
13207         };\r
13208         \r
13209         // 仮想 HUB が選択されていない場合はエラー\r
13210         if (ps->HubName == NULL)\r
13211         {\r
13212                 c->Write(c, _UU("CMD_Hub_Not_Selected"));\r
13213                 return ERR_INVALID_PARAMETER;\r
13214         }\r
13215 \r
13216         o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));\r
13217         if (o == NULL)\r
13218         {\r
13219                 return ERR_INVALID_PARAMETER;\r
13220         }\r
13221 \r
13222         x = FileToX(GetParamStr(o, "LOADCERT"));\r
13223         if (x == NULL)\r
13224         {\r
13225                 FreeParamValueList(o);\r
13226                 c->Write(c, _UU("CMD_LOADCERT_FAILED"));\r
13227                 return ERR_INTERNAL_ERROR;\r
13228         }\r
13229 \r
13230         Zero(&t, sizeof(t));\r
13231         StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);\r
13232         t.ClientOption = ZeroMalloc(sizeof(CLIENT_OPTION));\r
13233         UniStrCpy(t.ClientOption->AccountName, sizeof(t.ClientOption->AccountName), GetParamUniStr(o, "[name]"));\r
13234 \r
13235         // RPC 呼び出し\r
13236         ret = ScGetLink(ps->Rpc, &t);\r
13237 \r
13238         if (ret != ERR_NO_ERROR)\r
13239         {\r
13240                 // エラー発生\r
13241                 CmdPrintError(c, ret);\r
13242                 FreeParamValueList(o);\r
13243                 FreeX(x);\r
13244                 return ret;\r
13245         }\r
13246         else\r
13247         {\r
13248                 // データ変更\r
13249                 if (t.ServerCert != NULL)\r
13250                 {\r
13251                         FreeX(t.ServerCert);\r
13252                 }\r
13253                 t.ServerCert = x;\r
13254 \r
13255                 ret = ScSetLink(ps->Rpc, &t);\r
13256                 if (ret != ERR_NO_ERROR)\r
13257                 {\r
13258                         // エラー発生\r
13259                         CmdPrintError(c, ret);\r
13260                         FreeParamValueList(o);\r
13261                         return ret;\r
13262                 }\r
13263 \r
13264                 FreeRpcCreateLink(&t);\r
13265         }\r
13266 \r
13267         FreeParamValueList(o);\r
13268 \r
13269         return 0;\r
13270 }\r
13271 \r
13272 // カスケード接続のサーバー固有証明書の削除\r
13273 UINT PsCascadeServerCertDelete(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)\r
13274 {\r
13275         LIST *o;\r
13276         PS *ps = (PS *)param;\r
13277         UINT ret = 0;\r
13278         RPC_CREATE_LINK t;\r
13279         // 指定できるパラメータ リスト\r
13280         PARAM args[] =\r
13281         {\r
13282                 // "name", prompt_proc, prompt_param, eval_proc, eval_param\r
13283                 {"[name]", CmdPrompt, _UU("CMD_CascadeCreate_Prompt_Name"), CmdEvalNotEmpty, NULL},\r
13284         };\r
13285         \r
13286         // 仮想 HUB が選択されていない場合はエラー\r
13287         if (ps->HubName == NULL)\r
13288         {\r
13289                 c->Write(c, _UU("CMD_Hub_Not_Selected"));\r
13290                 return ERR_INVALID_PARAMETER;\r
13291         }\r
13292 \r
13293         o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));\r
13294         if (o == NULL)\r
13295         {\r
13296                 return ERR_INVALID_PARAMETER;\r
13297         }\r
13298 \r
13299         Zero(&t, sizeof(t));\r
13300         StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);\r
13301         t.ClientOption = ZeroMalloc(sizeof(CLIENT_OPTION));\r
13302         UniStrCpy(t.ClientOption->AccountName, sizeof(t.ClientOption->AccountName), GetParamUniStr(o, "[name]"));\r
13303 \r
13304         // RPC 呼び出し\r
13305         ret = ScGetLink(ps->Rpc, &t);\r
13306 \r
13307         if (ret != ERR_NO_ERROR)\r
13308         {\r
13309                 // エラー発生\r
13310                 CmdPrintError(c, ret);\r
13311                 FreeParamValueList(o);\r
13312                 return ret;\r
13313         }\r
13314         else\r
13315         {\r
13316                 // データ変更\r
13317                 if (t.ServerCert != NULL)\r
13318                 {\r
13319                         FreeX(t.ServerCert);\r
13320                 }\r
13321                 t.ServerCert = NULL;\r
13322 \r
13323                 ret = ScSetLink(ps->Rpc, &t);\r
13324                 if (ret != ERR_NO_ERROR)\r
13325                 {\r
13326                         // エラー発生\r
13327                         CmdPrintError(c, ret);\r
13328                         FreeParamValueList(o);\r
13329                         return ret;\r
13330                 }\r
13331 \r
13332                 FreeRpcCreateLink(&t);\r
13333         }\r
13334 \r
13335         FreeParamValueList(o);\r
13336 \r
13337         return 0;\r
13338 }\r
13339 \r
13340 // カスケード接続のサーバー固有証明書の取得\r
13341 UINT PsCascadeServerCertGet(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)\r
13342 {\r
13343         LIST *o;\r
13344         PS *ps = (PS *)param;\r
13345         UINT ret = 0;\r
13346         RPC_CREATE_LINK t;\r
13347         // 指定できるパラメータ リスト\r
13348         PARAM args[] =\r
13349         {\r
13350                 // "name", prompt_proc, prompt_param, eval_proc, eval_param\r
13351                 {"[name]", CmdPrompt, _UU("CMD_CascadeCreate_Prompt_Name"), CmdEvalNotEmpty, NULL},\r
13352                 {"SAVECERT", CmdPrompt, _UU("CMD_SAVECERTPATH"), CmdEvalNotEmpty, NULL},\r
13353         };\r
13354         \r
13355         // 仮想 HUB が選択されていない場合はエラー\r
13356         if (ps->HubName == NULL)\r
13357         {\r
13358                 c->Write(c, _UU("CMD_Hub_Not_Selected"));\r
13359                 return ERR_INVALID_PARAMETER;\r
13360         }\r
13361 \r
13362         o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));\r
13363         if (o == NULL)\r
13364         {\r
13365                 return ERR_INVALID_PARAMETER;\r
13366         }\r
13367 \r
13368         Zero(&t, sizeof(t));\r
13369         StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);\r
13370         t.ClientOption = ZeroMalloc(sizeof(CLIENT_OPTION));\r
13371         UniStrCpy(t.ClientOption->AccountName, sizeof(t.ClientOption->AccountName), GetParamUniStr(o, "[name]"));\r
13372 \r
13373         // RPC 呼び出し\r
13374         ret = ScGetLink(ps->Rpc, &t);\r
13375 \r
13376         if (ret != ERR_NO_ERROR)\r
13377         {\r
13378                 // エラー発生\r
13379                 CmdPrintError(c, ret);\r
13380                 FreeParamValueList(o);\r
13381                 return ret;\r
13382         }\r
13383         else\r
13384         {\r
13385                 // 証明書保存\r
13386                 if (t.ServerCert == NULL)\r
13387                 {\r
13388                         c->Write(c, _UU("CMD_CERT_NOT_EXISTS"));\r
13389                         ret = ERR_INTERNAL_ERROR;\r
13390                 }\r
13391                 else\r
13392                 {\r
13393                         if (XToFile(t.ServerCert, GetParamStr(o, "SAVECERT"), true) == false)\r
13394                         {\r
13395                                 c->Write(c, _UU("CMD_SAVECERT_FAILED"));\r
13396                                 ret = ERR_INTERNAL_ERROR;\r
13397                         }\r
13398                 }\r
13399 \r
13400                 FreeRpcCreateLink(&t);\r
13401         }\r
13402 \r
13403         FreeParamValueList(o);\r
13404 \r
13405         return ret;\r
13406 }\r
13407 \r
13408 // カスケード接続の高度な通信設定の設定\r
13409 UINT PsCascadeDetailSet(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)\r
13410 {\r
13411         LIST *o;\r
13412         PS *ps = (PS *)param;\r
13413         UINT ret = 0;\r
13414         RPC_CREATE_LINK t;\r
13415         CMD_EVAL_MIN_MAX mm_maxtcp =\r
13416         {\r
13417                 "CMD_CascadeDetailSet_Eval_MaxTcp", 1, 32\r
13418         };\r
13419         CMD_EVAL_MIN_MAX mm_interval =\r
13420         {\r
13421                 "CMD_CascadeDetailSet_Eval_Interval", 1, 4294967295UL\r
13422         };\r
13423         // 指定できるパラメータ リスト\r
13424         PARAM args[] =\r
13425         {\r
13426                 // "name", prompt_proc, prompt_param, eval_proc, eval_param\r
13427                 {"[name]", CmdPrompt, _UU("CMD_CascadeCreate_Prompt_Name"), CmdEvalNotEmpty, NULL},\r
13428                 {"MAXTCP", CmdPrompt, _UU("CMD_CascadeDetailSet_Prompt_MaxTcp"), CmdEvalMinMax, &mm_maxtcp},\r
13429                 {"INTERVAL", CmdPrompt, _UU("CMD_CascadeDetailSet_Prompt_Interval"), CmdEvalMinMax, &mm_interval},\r
13430                 {"TTL", CmdPrompt, _UU("CMD_CascadeDetailSet_Prompt_TTL"), NULL, NULL},\r
13431                 {"HALF", CmdPrompt, _UU("CMD_CascadeDetailSet_Prompt_HALF"), NULL, NULL},\r
13432                 {"NOQOS", CmdPrompt, _UU("CMD_AccountDetailSet_Prompt_NOQOS"), NULL, NULL},\r
13433         };\r
13434 \r
13435         // 仮想 HUB が選択されていない場合はエラー\r
13436         if (ps->HubName == NULL)\r
13437         {\r
13438                 c->Write(c, _UU("CMD_Hub_Not_Selected"));\r
13439                 return ERR_INVALID_PARAMETER;\r
13440         }\r
13441 \r
13442         o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));\r
13443         if (o == NULL)\r
13444         {\r
13445                 return ERR_INVALID_PARAMETER;\r
13446         }\r
13447 \r
13448         Zero(&t, sizeof(t));\r
13449         StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);\r
13450         t.ClientOption = ZeroMalloc(sizeof(CLIENT_OPTION));\r
13451         UniStrCpy(t.ClientOption->AccountName, sizeof(t.ClientOption->AccountName), GetParamUniStr(o, "[name]"));\r
13452 \r
13453         // RPC 呼び出し\r
13454         ret = ScGetLink(ps->Rpc, &t);\r
13455 \r
13456         if (ret != ERR_NO_ERROR)\r
13457         {\r
13458                 // エラー発生\r
13459                 CmdPrintError(c, ret);\r
13460                 FreeParamValueList(o);\r
13461                 return ret;\r
13462         }\r
13463         else\r
13464         {\r
13465                 // データ変更\r
13466                 t.ClientOption->MaxConnection = GetParamInt(o, "MAXTCP");\r
13467                 t.ClientOption->AdditionalConnectionInterval = GetParamInt(o, "INTERVAL");\r
13468                 t.ClientOption->ConnectionDisconnectSpan = GetParamInt(o, "TTL");\r
13469                 t.ClientOption->HalfConnection = GetParamYes(o, "HALF");\r
13470                 t.ClientOption->DisableQoS = GetParamYes(o, "NOQOS");\r
13471 \r
13472                 ret = ScSetLink(ps->Rpc, &t);\r
13473                 if (ret != ERR_NO_ERROR)\r
13474                 {\r
13475                         // エラー発生\r
13476                         CmdPrintError(c, ret);\r
13477                         FreeParamValueList(o);\r
13478                         return ret;\r
13479                 }\r
13480 \r
13481                 FreeRpcCreateLink(&t);\r
13482         }\r
13483 \r
13484         FreeParamValueList(o);\r
13485 \r
13486         return 0;\r
13487 }\r
13488 \r
13489 // セキュリティ ポリシーを表示\r
13490 void PrintPolicy(CONSOLE *c, POLICY *pol, bool cascade_mode)\r
13491 {\r
13492         UINT i;\r
13493         CT *ct;\r
13494         PACK *p;\r
13495         // 引数チェック\r
13496         if (c == NULL || pol == NULL)\r
13497         {\r
13498                 return;\r
13499         }\r
13500 \r
13501         ct = CtNew();\r
13502         CtInsertColumn(ct, _UU("CMD_PolicyList_Column_1"), false);\r
13503         CtInsertColumn(ct, _UU("CMD_PolicyList_Column_2"), false);\r
13504         CtInsertColumn(ct, _UU("CMD_PolicyList_Column_3"), false);\r
13505 \r
13506         p = NewPack();\r
13507         OutRpcPolicy(p, pol);\r
13508 \r
13509         // すべてのポリシー一覧を表示する\r
13510         for (i = 0; i < PolicyNum();i++)\r
13511         {\r
13512                 char name[64];\r
13513                 wchar_t *tmp;\r
13514 \r
13515                 if (cascade_mode == false || PolicyIsSupportedForCascade(i))\r
13516                 {\r
13517                         wchar_t value_str[256];\r
13518                         UINT value;\r
13519                         char tmp2[256];\r
13520 \r
13521                         Format(tmp2, sizeof(tmp2), "policy:%s", PolicyIdToStr(i));\r
13522                         value = PackGetInt(p, tmp2);\r
13523 \r
13524                         tmp = CopyStrToUni(PolicyIdToStr(i));\r
13525 \r
13526                         FormatPolicyValue(value_str, sizeof(value_str),\r
13527                                 i, value);\r
13528 \r
13529                         Format(name, sizeof(name), "POL_%u", i);\r
13530                         CtInsert(ct, tmp, _UU(name), value_str);\r
13531 \r
13532                         Free(tmp);\r
13533                 }\r
13534         }\r
13535 \r
13536         FreePack(p);\r
13537 \r
13538         CtFree(ct, c);\r
13539 }\r
13540 \r
13541 // セキュリティ ポリシー リストを表示\r
13542 void PrintPolicyList(CONSOLE *c, char *name)\r
13543 {\r
13544         UINT id;\r
13545         // 引数チェック\r
13546         if (c == NULL)\r
13547         {\r
13548                 return;\r
13549         }\r
13550         if (IsEmptyStr(name))\r
13551         {\r
13552                 name = NULL;\r
13553         }\r
13554 \r
13555         if (name != NULL)\r
13556         {\r
13557                 id = PolicyStrToId(name);\r
13558                 if (id == INFINITE)\r
13559                 {\r
13560                         // 不正な ID\r
13561                         c->Write(c, _UU("CMD_PolicyList_Invalid_Name"));\r
13562                 }\r
13563                 else\r
13564                 {\r
13565                         wchar_t tmp[MAX_SIZE];\r
13566                         wchar_t tmp2[MAX_SIZE];\r
13567                         char name1[64], name2[64];\r
13568                         wchar_t *title, *descript;\r
13569                         wchar_t policy_name[MAX_SIZE];\r
13570 \r
13571                         Format(name1, sizeof(name1), "POL_%u", id);\r
13572                         Format(name2, sizeof(name2), "POL_EX_%u", id);\r
13573 \r
13574                         title = _UU(name1);\r
13575                         descript = _UU(name2);\r
13576 \r
13577                         StrToUni(policy_name, sizeof(policy_name), PolicyIdToStr(id));\r
13578 \r
13579                         // ポリシー名\r
13580                         c->Write(c, _UU("CMD_PolicyList_Help_1"));\r
13581                         UniFormat(tmp2, sizeof(tmp2), L" %s", policy_name);\r
13582                         c->Write(c, tmp2);\r
13583                         c->Write(c, L"");\r
13584 \r
13585                         // ポリシーの簡易説明\r
13586                         c->Write(c, _UU("CMD_PolicyList_Help_2"));\r
13587                         UniFormat(tmp2, sizeof(tmp2), L" %s", title);\r
13588                         c->Write(c, tmp2);\r
13589                         c->Write(c, L"");\r
13590 \r
13591                         // 設定できる値の範囲\r
13592                         GetPolicyValueRangeStr(tmp, sizeof(tmp), id);\r
13593                         c->Write(c, _UU("CMD_PolicyList_Help_3"));\r
13594                         UniFormat(tmp2, sizeof(tmp2), L" %s", tmp);\r
13595                         c->Write(c, tmp2);\r
13596                         c->Write(c, L"");\r
13597 \r
13598                         // デフォルト値\r
13599                         FormatPolicyValue(tmp, sizeof(tmp), id, GetPolicyItem(id)->DefaultValue);\r
13600                         c->Write(c, _UU("CMD_PolicyList_Help_4"));\r
13601                         UniFormat(tmp2, sizeof(tmp2), L" %s", tmp);\r
13602                         c->Write(c, tmp2);\r
13603                         c->Write(c, L"");\r
13604 \r
13605                         // ポリシーの詳細説明\r
13606                         c->Write(c, _UU("CMD_PolicyList_Help_5"));\r
13607                         c->Write(c, descript);\r
13608                         c->Write(c, L"");\r
13609                 }\r
13610         }\r
13611         else\r
13612         {\r
13613                 UINT i;\r
13614                 CT *ct = CtNew();\r
13615                 CtInsertColumn(ct, _UU("CMD_PolicyList_Column_1"), false);\r
13616                 CtInsertColumn(ct, _UU("CMD_PolicyList_Column_2"), false);\r
13617 \r
13618                 // すべてのポリシー一覧を表示する\r
13619                 for (i = 0; i < PolicyNum();i++)\r
13620                 {\r
13621                         char name[64];\r
13622                         wchar_t *tmp;\r
13623 \r
13624                         tmp = CopyStrToUni(PolicyIdToStr(i));\r
13625 \r
13626                         Format(name, sizeof(name), "POL_%u", i);\r
13627                         CtInsert(ct, tmp, _UU(name));\r
13628 \r
13629                         Free(tmp);\r
13630                 }\r
13631 \r
13632                 CtFree(ct, c);\r
13633         }\r
13634 }\r
13635 \r
13636 // ポリシーの内容の編集\r
13637 bool EditPolicy(CONSOLE *c, POLICY *pol, char *name, char *value, bool cascade_mode)\r
13638 {\r
13639         PACK *p;\r
13640         ELEMENT *e;\r
13641         POLICY_ITEM *item;\r
13642         UINT id;\r
13643         wchar_t tmp[MAX_SIZE];\r
13644         wchar_t tmp2[MAX_SIZE];\r
13645         char pack_name[128];\r
13646         // 引数チェック\r
13647         if (c == NULL || pol == NULL || name == NULL || value == NULL)\r
13648         {\r
13649                 return false;\r
13650         }\r
13651 \r
13652         p = NewPack();\r
13653 \r
13654         OutRpcPolicy(p, pol);\r
13655 \r
13656         Format(pack_name, sizeof(pack_name), "policy:%s", PolicyIdToStr(PolicyStrToId(name)));\r
13657 \r
13658         if ((e = GetElement(p, pack_name, VALUE_INT)) == NULL || (id = PolicyStrToId(name)) == INFINITE)\r
13659         {\r
13660                 UniFormat(tmp, sizeof(tmp), _UU("CMD_CascadePolicySet_Invalid_Name"), name);\r
13661                 c->Write(c, tmp);\r
13662                 FreePack(p);\r
13663                 return false;\r
13664         }\r
13665 \r
13666         if (cascade_mode && (PolicyIsSupportedForCascade(id) == false))\r
13667         {\r
13668                 UniFormat(tmp, sizeof(tmp), _UU("CMD_CascadePolicySet_Invalid_Name_For_Cadcade"), name);\r
13669                 c->Write(c, tmp);\r
13670                 FreePack(p);\r
13671                 return false;\r
13672         }\r
13673 \r
13674         item = GetPolicyItem(id);\r
13675 \r
13676         if (item->TypeInt == false)\r
13677         {\r
13678                 // bool 型\r
13679                 e->values[0]->IntValue = (\r
13680                         StartWith(value, "y") || StartWith(value, "t") ||\r
13681                         ToInt(value) != 0) ? 1 : 0;\r
13682         }\r
13683         else\r
13684         {\r
13685                 UINT n = ToInt(value);\r
13686                 bool b = true;\r
13687 \r
13688                 // int 型\r
13689                 GetPolicyValueRangeStr(tmp, sizeof(tmp), id);\r
13690 \r
13691                 if (item->AllowZero == false)\r
13692                 {\r
13693                         if (n == 0)\r
13694                         {\r
13695                                 b = false;\r
13696                         }\r
13697                 }\r
13698 \r
13699                 if (n != 0 && (n < item->MinValue || n > item->MaxValue))\r
13700                 {\r
13701                         b = false;\r
13702                 }\r
13703 \r
13704                 if (b == false)\r
13705                 {\r
13706                         UniFormat(tmp2, sizeof(tmp2), _UU("CMD_CascadePolicySet_Invalid_Range"), PolicyIdToStr(id), tmp);\r
13707                         c->Write(c, tmp2);\r
13708                         FreePack(p);\r
13709                         return false;\r
13710                 }\r
13711 \r
13712                 e->values[0]->IntValue = n;\r
13713         }\r
13714 \r
13715         Zero(pol, sizeof(POLICY));\r
13716 \r
13717         InRpcPolicy(pol, p);\r
13718 \r
13719         FreePack(p);\r
13720 \r
13721         return true;\r
13722 }\r
13723 \r
13724 // セキュリティ ポリシーの種類と設定可能値の一覧を表示\r
13725 UINT PsPolicyList(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)\r
13726 {\r
13727         LIST *o;\r
13728         PARAM args[] =\r
13729         {\r
13730                 // "name", prompt_proc, prompt_param, eval_proc, eval_param\r
13731                 {"[name]", NULL, NULL, NULL, NULL}\r
13732         };\r
13733 \r
13734         o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));\r
13735         if (o == NULL)\r
13736         {\r
13737                 return ERR_INVALID_PARAMETER;\r
13738         }\r
13739 \r
13740         PrintPolicyList(c, GetParamStr(o, "[name]"));\r
13741 \r
13742         FreeParamValueList(o);\r
13743 \r
13744         return ERR_NO_ERROR;\r
13745 }\r
13746 \r
13747 // カスケード接続セッションのセキュリティ ポリシーの設定\r
13748 UINT PsCascadePolicySet(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)\r
13749 {\r
13750         LIST *o;\r
13751         PS *ps = (PS *)param;\r
13752         UINT ret = 0;\r
13753         RPC_CREATE_LINK t;\r
13754         // 指定できるパラメータ リスト\r
13755         PARAM args[] =\r
13756         {\r
13757                 // "name", prompt_proc, prompt_param, eval_proc, eval_param\r
13758                 {"[name]", CmdPrompt, _UU("CMD_CascadeCreate_Prompt_Name"), CmdEvalNotEmpty, NULL},\r
13759                 {"NAME", CmdPrompt, _UU("CMD_CascadePolicySet_PROMPT_POLNAME"), CmdEvalNotEmpty, NULL},\r
13760                 {"VALUE", CmdPrompt, _UU("CMD_CascadePolicySet_PROMPT_POLVALUE"), CmdEvalNotEmpty, NULL},\r
13761         };\r
13762 \r
13763         // 仮想 HUB が選択されていない場合はエラー\r
13764         if (ps->HubName == NULL)\r
13765         {\r
13766                 c->Write(c, _UU("CMD_Hub_Not_Selected"));\r
13767                 return ERR_INVALID_PARAMETER;\r
13768         }\r
13769 \r
13770         o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));\r
13771         if (o == NULL)\r
13772         {\r
13773                 return ERR_INVALID_PARAMETER;\r
13774         }\r
13775 \r
13776         Zero(&t, sizeof(t));\r
13777         StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);\r
13778         t.ClientOption = ZeroMalloc(sizeof(CLIENT_OPTION));\r
13779         UniStrCpy(t.ClientOption->AccountName, sizeof(t.ClientOption->AccountName), GetParamUniStr(o, "[name]"));\r
13780 \r
13781         // RPC 呼び出し\r
13782         ret = ScGetLink(ps->Rpc, &t);\r
13783 \r
13784         if (ret != ERR_NO_ERROR)\r
13785         {\r
13786                 // エラー発生\r
13787                 CmdPrintError(c, ret);\r
13788                 FreeParamValueList(o);\r
13789                 return ret;\r
13790         }\r
13791         else\r
13792         {\r
13793                 if (EditPolicy(c, &t.Policy, GetParamStr(o, "NAME"), GetParamStr(o, "VALUE"), true) == false)\r
13794                 {\r
13795                         // エラー発生\r
13796                         FreeRpcCreateLink(&t);\r
13797                         FreeParamValueList(o);\r
13798                         return ERR_INTERNAL_ERROR;\r
13799                 }\r
13800 \r
13801                 ret = ScSetLink(ps->Rpc, &t);\r
13802                 if (ret != ERR_NO_ERROR)\r
13803                 {\r
13804                         // エラー発生\r
13805                         CmdPrintError(c, ret);\r
13806                         FreeParamValueList(o);\r
13807                         return ret;\r
13808                 }\r
13809 \r
13810                 FreeRpcCreateLink(&t);\r
13811         }\r
13812 \r
13813         FreeParamValueList(o);\r
13814 \r
13815         return 0;\r
13816 }\r
13817 \r
13818 // セッションのステータス情報の表示\r
13819 void CmdPrintStatusToListView(CT *ct, RPC_CLIENT_GET_CONNECTION_STATUS *s)\r
13820 {\r
13821         CmdPrintStatusToListViewEx(ct, s, false);\r
13822 }\r
13823 void CmdPrintStatusToListViewEx(CT *ct, RPC_CLIENT_GET_CONNECTION_STATUS *s, bool server_mode)\r
13824 {\r
13825         wchar_t tmp[MAX_SIZE];\r
13826         char str[MAX_SIZE];\r
13827         char vv[128];\r
13828         // 引数チェック\r
13829         if (s == NULL)\r
13830         {\r
13831                 return;\r
13832         }\r
13833 \r
13834         if (server_mode == false)\r
13835         {\r
13836                 CtInsert(ct, _UU("CM_ST_ACCOUNT_NAME"), s->AccountName);\r
13837 \r
13838                 if (s->Connected == false)\r
13839                 {\r
13840                         wchar_t *st = _UU("CM_ST_CONNECTED_FALSE");\r
13841                         switch (s->SessionStatus)\r
13842                         {\r
13843                         case CLIENT_STATUS_CONNECTING:\r
13844                                 st = _UU("CM_ST_CONNECTING");\r
13845                                 break;\r
13846                         case CLIENT_STATUS_NEGOTIATION:\r
13847                                 st = _UU("CM_ST_NEGOTIATION");\r
13848                                 break;\r
13849                         case CLIENT_STATUS_AUTH:\r
13850                                 st = _UU("CM_ST_AUTH");\r
13851                                 break;\r
13852                         case CLIENT_STATUS_ESTABLISHED:\r
13853                                 st = _UU("CM_ST_ESTABLISHED");\r
13854                                 break;\r
13855                         case CLIENT_STATUS_RETRY:\r
13856                                 st = _UU("CM_ST_RETRY");\r
13857                                 break;\r
13858                         case CLIENT_STATUS_IDLE:\r
13859                                 st = _UU("CM_ST_IDLE");\r
13860                                 break;\r
13861                         }\r
13862                         CtInsert(ct, _UU("CM_ST_CONNECTED"), st);\r
13863                 }\r
13864                 else\r
13865                 {\r
13866                         CtInsert(ct, _UU("CM_ST_CONNECTED"), _UU("CM_ST_CONNECTED_TRUE"));\r
13867                 }\r
13868         }\r
13869 \r
13870         if (s->Connected)\r
13871         {\r
13872                 if (s->VLanId == 0)\r
13873                 {\r
13874                         UniStrCpy(tmp, sizeof(tmp), _UU("CM_ST_NO_VLAN"));\r
13875                 }\r
13876                 else\r
13877                 {\r
13878                         UniToStru(tmp, s->VLanId);\r
13879                 }\r
13880 \r
13881                 CtInsert(ct, _UU("CM_ST_VLAN_ID"), tmp);\r
13882 \r
13883                 if (server_mode == false)\r
13884                 {\r
13885                         StrToUni(tmp, sizeof(tmp), s->ServerName);\r
13886                         CtInsert(ct, _UU("CM_ST_SERVER_NAME"), tmp);\r
13887 \r
13888                         UniFormat(tmp, sizeof(tmp), _UU("CM_ST_PORT_TCP"), s->ServerPort);\r
13889                         CtInsert(ct, _UU("CM_ST_SERVER_PORT"), tmp);\r
13890                 }\r
13891 \r
13892                 StrToUni(tmp, sizeof(tmp), s->ServerProductName);\r
13893                 CtInsert(ct, _UU("CM_ST_SERVER_P_NAME"), tmp);\r
13894 \r
13895                 UniFormat(tmp, sizeof(tmp), L"%u.%02u", s->ServerProductVer / 100, s->ServerProductVer % 100);\r
13896                 CtInsert(ct, _UU("CM_ST_SERVER_P_VER"), tmp);\r
13897                 UniFormat(tmp, sizeof(tmp), L"Build %u", s->ServerProductBuild);\r
13898                 CtInsert(ct, _UU("CM_ST_SERVER_P_BUILD"), tmp);\r
13899         }\r
13900 \r
13901         GetDateTimeStrEx64(tmp, sizeof(tmp), SystemToLocal64(s->StartTime), NULL);\r
13902         CtInsert(ct, _UU("CM_ST_START_TIME"), tmp);\r
13903         GetDateTimeStrEx64(tmp, sizeof(tmp), SystemToLocal64(s->FirstConnectionEstablisiedTime), NULL);\r
13904         CtInsert(ct, _UU("CM_ST_FIRST_ESTAB_TIME"), s->FirstConnectionEstablisiedTime == 0 ? _UU("CM_ST_NONE") : tmp);\r
13905 \r
13906         if (s->Connected)\r
13907         {\r
13908                 GetDateTimeStrEx64(tmp, sizeof(tmp), SystemToLocal64(s->CurrentConnectionEstablishTime), NULL);\r
13909                 CtInsert(ct, _UU("CM_ST_CURR_ESTAB_TIME"), tmp);\r
13910         }\r
13911 \r
13912         if (server_mode == false)\r
13913         {\r
13914                 UniFormat(tmp, sizeof(tmp), _UU("CM_ST_NUM_STR"), s->NumConnectionsEatablished);\r
13915                 CtInsert(ct, _UU("CM_ST_NUM_ESTABLISHED"), tmp);\r
13916         }\r
13917 \r
13918         if (s->Connected)\r
13919         {\r
13920                 CtInsert(ct, _UU("CM_ST_HALF_CONNECTION"), s->HalfConnection ? _UU("CM_ST_HALF_TRUE") : _UU("CM_ST_HALF_FALSE"));\r
13921 \r
13922                 CtInsert(ct, _UU("CM_ST_QOS"), s->QoS ? _UU("CM_ST_QOS_TRUE") : _UU("CM_ST_QOS_FALSE"));\r
13923 \r
13924                 UniFormat(tmp, sizeof(tmp), L"%u", s->NumTcpConnections);\r
13925                 CtInsert(ct, _UU("CM_ST_NUM_TCP"), tmp);\r
13926 \r
13927                 if (s->HalfConnection)\r
13928                 {\r
13929                         UniFormat(tmp, sizeof(tmp), L"%u", s->NumTcpConnectionsUpload);\r
13930                         CtInsert(ct, _UU("CM_ST_NUM_TCP_UPLOAD"), tmp);\r
13931                         UniFormat(tmp, sizeof(tmp), L"%u", s->NumTcpConnectionsDownload);\r
13932                         CtInsert(ct, _UU("CM_ST_NUM_TCP_DOWNLOAD"), tmp);\r
13933                 }\r
13934 \r
13935                 UniFormat(tmp, sizeof(tmp), L"%u", s->MaxTcpConnections);\r
13936                 CtInsert(ct, _UU("CM_ST_MAX_TCP"), tmp);\r
13937 \r
13938                 if (s->UseEncrypt == false)\r
13939                 {\r
13940                         UniStrCpy(tmp, sizeof(tmp), _UU("CM_ST_USE_ENCRYPT_FALSE"));\r
13941                 }\r
13942                 else\r
13943                 {\r
13944                         if (StrLen(s->CipherName) != 0)\r
13945                         {\r
13946                                 UniFormat(tmp, sizeof(tmp), _UU("CM_ST_USE_ENCRYPT_TRUE"), s->CipherName);\r
13947                         }\r
13948                         else\r
13949                         {\r
13950                                 UniFormat(tmp, sizeof(tmp), _UU("CM_ST_USE_ENCRYPT_TRUE2"));\r
13951                         }\r
13952                 }\r
13953                 CtInsert(ct, _UU("CM_ST_USE_ENCRYPT"), tmp);\r
13954 \r
13955                 if (s->UseCompress)\r
13956                 {\r
13957                         UINT percent = 0;\r
13958                         if ((s->TotalRecvSize + s->TotalSendSize) > 0)\r
13959                         {\r
13960                                 percent = (UINT)((UINT64)100 - (UINT64)(s->TotalRecvSizeReal + s->TotalSendSizeReal) * (UINT64)100 /\r
13961                                         (s->TotalRecvSize + s->TotalSendSize));\r
13962                                 percent = MAKESURE(percent, 0, 100);\r
13963                         }\r
13964 \r
13965                         UniFormat(tmp, sizeof(tmp), _UU("CM_ST_COMPRESS_TRUE"), percent);\r
13966                 }\r
13967                 else\r
13968                 {\r
13969                         UniStrCpy(tmp, sizeof(tmp), _UU("CM_ST_COMPRESS_FALSE"));\r
13970                 }\r
13971                 CtInsert(ct, _UU("CM_ST_USE_COMPRESS"), tmp);\r
13972 \r
13973                 StrToUni(tmp, sizeof(tmp), s->SessionName);\r
13974                 CtInsert(ct, _UU("CM_ST_SESSION_NAME"), tmp);\r
13975 \r
13976                 StrToUni(tmp, sizeof(tmp), s->ConnectionName);\r
13977                 if (UniStrCmpi(tmp, L"INITING") != 0)\r
13978                 {\r
13979                         CtInsert(ct, _UU("CM_ST_CONNECTION_NAME"), tmp);\r
13980                 }\r
13981 \r
13982                 BinToStr(str, sizeof(str), s->SessionKey, sizeof(s->SessionKey));\r
13983                 StrToUni(tmp, sizeof(tmp), str);\r
13984                 CtInsert(ct, _UU("CM_ST_SESSION_KEY"), tmp);\r
13985 \r
13986                 CtInsert(ct, _UU("CM_ST_BRIDGE_MODE"), s->IsBridgeMode ? _UU("CM_ST_YES") : _UU("CM_ST_NO"));\r
13987 \r
13988                 CtInsert(ct, _UU("CM_ST_MONITOR_MODE"), s->IsMonitorMode ? _UU("CM_ST_YES") : _UU("CM_ST_NO"));\r
13989 \r
13990                 ToStr3(vv, sizeof(vv), s->TotalSendSize);\r
13991                 UniFormat(tmp, sizeof(tmp), _UU("CM_ST_SIZE_BYTE_STR"), vv);\r
13992                 CtInsert(ct, _UU("CM_ST_SEND_SIZE"), tmp);\r
13993 \r
13994                 ToStr3(vv, sizeof(vv), s->TotalRecvSize);\r
13995                 UniFormat(tmp, sizeof(tmp), _UU("CM_ST_SIZE_BYTE_STR"), vv);\r
13996                 CtInsert(ct, _UU("CM_ST_RECV_SIZE"), tmp);\r
13997 \r
13998                 ToStr3(vv, sizeof(vv), s->Traffic.Send.UnicastCount);\r
13999                 UniFormat(tmp, sizeof(tmp), _UU("CM_ST_NUM_PACKET_STR"), vv);\r
14000                 CtInsert(ct, _UU("CM_ST_SEND_UCAST_NUM"), tmp);\r
14001 \r
14002                 ToStr3(vv, sizeof(vv), s->Traffic.Send.UnicastBytes);\r
14003                 UniFormat(tmp, sizeof(tmp), _UU("CM_ST_SIZE_BYTE_STR"), vv);\r
14004                 CtInsert(ct, _UU("CM_ST_SEND_UCAST_SIZE"), tmp);\r
14005 \r
14006                 ToStr3(vv, sizeof(vv), s->Traffic.Send.BroadcastCount);\r
14007                 UniFormat(tmp, sizeof(tmp), _UU("CM_ST_NUM_PACKET_STR"), vv);\r
14008                 CtInsert(ct, _UU("CM_ST_SEND_BCAST_NUM"), tmp);\r
14009 \r
14010                 ToStr3(vv, sizeof(vv), s->Traffic.Send.BroadcastBytes);\r
14011                 UniFormat(tmp, sizeof(tmp), _UU("CM_ST_SIZE_BYTE_STR"), vv);\r
14012                 CtInsert(ct, _UU("CM_ST_SEND_BCAST_SIZE"), tmp);\r
14013 \r
14014                 ToStr3(vv, sizeof(vv), s->Traffic.Recv.UnicastCount);\r
14015                 UniFormat(tmp, sizeof(tmp), _UU("CM_ST_NUM_PACKET_STR"), vv);\r
14016                 CtInsert(ct, _UU("CM_ST_RECV_UCAST_NUM"), tmp);\r
14017 \r
14018                 ToStr3(vv, sizeof(vv), s->Traffic.Recv.UnicastBytes);\r
14019                 UniFormat(tmp, sizeof(tmp), _UU("CM_ST_SIZE_BYTE_STR"), vv);\r
14020                 CtInsert(ct, _UU("CM_ST_RECV_UCAST_SIZE"), tmp);\r
14021 \r
14022                 ToStr3(vv, sizeof(vv), s->Traffic.Recv.BroadcastCount);\r
14023                 UniFormat(tmp, sizeof(tmp), _UU("CM_ST_NUM_PACKET_STR"), vv);\r
14024                 CtInsert(ct, _UU("CM_ST_RECV_BCAST_NUM"), tmp);\r
14025 \r
14026                 ToStr3(vv, sizeof(vv), s->Traffic.Recv.BroadcastBytes);\r
14027                 UniFormat(tmp, sizeof(tmp), _UU("CM_ST_SIZE_BYTE_STR"), vv);\r
14028                 CtInsert(ct, _UU("CM_ST_RECV_BCAST_SIZE"), tmp);\r
14029         }\r
14030 }\r
14031 \r
14032 // カスケード接続の現在の状態の取得\r
14033 UINT PsCascadeStatusGet(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)\r
14034 {\r
14035         LIST *o;\r
14036         PS *ps = (PS *)param;\r
14037         UINT ret = 0;\r
14038         RPC_LINK_STATUS t;\r
14039         // 指定できるパラメータ リスト\r
14040         PARAM args[] =\r
14041         {\r
14042                 // "name", prompt_proc, prompt_param, eval_proc, eval_param\r
14043                 {"[name]", CmdPrompt, _UU("CMD_CascadeCreate_Prompt_Name"), CmdEvalNotEmpty, NULL},\r
14044         };\r
14045         \r
14046         // 仮想 HUB が選択されていない場合はエラー\r
14047         if (ps->HubName == NULL)\r
14048         {\r
14049                 c->Write(c, _UU("CMD_Hub_Not_Selected"));\r
14050                 return ERR_INVALID_PARAMETER;\r
14051         }\r
14052 \r
14053         o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));\r
14054         if (o == NULL)\r
14055         {\r
14056                 return ERR_INVALID_PARAMETER;\r
14057         }\r
14058 \r
14059         Zero(&t, sizeof(t));\r
14060         StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);\r
14061         UniStrCpy(t.AccountName, sizeof(t.AccountName), GetParamUniStr(o, "[name]"));\r
14062 \r
14063         // RPC 呼び出し\r
14064         ret = ScGetLinkStatus(ps->Rpc, &t);\r
14065 \r
14066         if (ret != ERR_NO_ERROR)\r
14067         {\r
14068                 // エラー発生\r
14069                 CmdPrintError(c, ret);\r
14070                 FreeParamValueList(o);\r
14071                 return ret;\r
14072         }\r
14073         else\r
14074         {\r
14075                 // カスケード接続状態の取得\r
14076                 CT *ct = CtNewStandard();\r
14077 \r
14078                 CmdPrintStatusToListView(ct, &t.Status);\r
14079 \r
14080                 CtFree(ct, c);\r
14081 \r
14082                 FreeRpcLinkStatus(&t);\r
14083         }\r
14084 \r
14085         FreeParamValueList(o);\r
14086 \r
14087         return 0;\r
14088 }\r
14089 \r
14090 // カスケード接続の名前の変更\r
14091 UINT PsCascadeRename(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)\r
14092 {\r
14093         LIST *o;\r
14094         PS *ps = (PS *)param;\r
14095         UINT ret = 0;\r
14096         RPC_RENAME_LINK t;\r
14097         // 指定できるパラメータ リスト\r
14098         PARAM args[] =\r
14099         {\r
14100                 // "name", prompt_proc, prompt_param, eval_proc, eval_param\r
14101                 {"[name]", CmdPrompt, _UU("CMD_CascadeRename_PROMPT_OLD"), CmdEvalNotEmpty, NULL},\r
14102                 {"NEW", CmdPrompt, _UU("CMD_CascadeRename_PROMPT_NEW"), CmdEvalNotEmpty, NULL},\r
14103         };\r
14104         \r
14105         // 仮想 HUB が選択されていない場合はエラー\r
14106         if (ps->HubName == NULL)\r
14107         {\r
14108                 c->Write(c, _UU("CMD_Hub_Not_Selected"));\r
14109                 return ERR_INVALID_PARAMETER;\r
14110         }\r
14111 \r
14112         o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));\r
14113         if (o == NULL)\r
14114         {\r
14115                 return ERR_INVALID_PARAMETER;\r
14116         }\r
14117 \r
14118         Zero(&t, sizeof(t));\r
14119         StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);\r
14120 \r
14121         UniStrCpy(t.NewAccountName, sizeof(t.NewAccountName), GetParamUniStr(o, "NEW"));\r
14122         UniStrCpy(t.OldAccountName, sizeof(t.OldAccountName), GetParamUniStr(o, "[name]"));\r
14123 \r
14124         // RPC 呼び出し\r
14125         ret = ScRenameLink(ps->Rpc, &t);\r
14126 \r
14127         if (ret != ERR_NO_ERROR)\r
14128         {\r
14129                 // エラー発生\r
14130                 CmdPrintError(c, ret);\r
14131                 FreeParamValueList(o);\r
14132                 return ret;\r
14133         }\r
14134 \r
14135         FreeParamValueList(o);\r
14136 \r
14137         return 0;\r
14138 }\r
14139 \r
14140 // カスケード接続のオンライン状態への設定\r
14141 UINT PsCascadeOnline(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)\r
14142 {\r
14143         LIST *o;\r
14144         PS *ps = (PS *)param;\r
14145         UINT ret = 0;\r
14146         RPC_LINK t;\r
14147         // 指定できるパラメータ リスト\r
14148         PARAM args[] =\r
14149         {\r
14150                 // "name", prompt_proc, prompt_param, eval_proc, eval_param\r
14151                 {"[name]", CmdPrompt, _UU("CMD_CascadeCreate_Prompt_Name"), CmdEvalNotEmpty, NULL},\r
14152         };\r
14153         \r
14154         // 仮想 HUB が選択されていない場合はエラー\r
14155         if (ps->HubName == NULL)\r
14156         {\r
14157                 c->Write(c, _UU("CMD_Hub_Not_Selected"));\r
14158                 return ERR_INVALID_PARAMETER;\r
14159         }\r
14160 \r
14161         o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));\r
14162         if (o == NULL)\r
14163         {\r
14164                 return ERR_INVALID_PARAMETER;\r
14165         }\r
14166 \r
14167         Zero(&t, sizeof(t));\r
14168         StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);\r
14169         UniStrCpy(t.AccountName, sizeof(t.AccountName), GetParamUniStr(o, "[name]"));\r
14170 \r
14171         // RPC 呼び出し\r
14172         ret = ScSetLinkOnline(ps->Rpc, &t);\r
14173 \r
14174         if (ret != ERR_NO_ERROR)\r
14175         {\r
14176                 // エラー発生\r
14177                 CmdPrintError(c, ret);\r
14178                 FreeParamValueList(o);\r
14179                 return ret;\r
14180         }\r
14181 \r
14182         FreeParamValueList(o);\r
14183 \r
14184         return 0;\r
14185 }\r
14186 \r
14187 // カスケード接続のオフライン状態への設定\r
14188 UINT PsCascadeOffline(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)\r
14189 {\r
14190         LIST *o;\r
14191         PS *ps = (PS *)param;\r
14192         UINT ret = 0;\r
14193         RPC_LINK t;\r
14194         // 指定できるパラメータ リスト\r
14195         PARAM args[] =\r
14196         {\r
14197                 // "name", prompt_proc, prompt_param, eval_proc, eval_param\r
14198                 {"[name]", CmdPrompt, _UU("CMD_CascadeCreate_Prompt_Name"), CmdEvalNotEmpty, NULL},\r
14199         };\r
14200         \r
14201         // 仮想 HUB が選択されていない場合はエラー\r
14202         if (ps->HubName == NULL)\r
14203         {\r
14204                 c->Write(c, _UU("CMD_Hub_Not_Selected"));\r
14205                 return ERR_INVALID_PARAMETER;\r
14206         }\r
14207 \r
14208         o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));\r
14209         if (o == NULL)\r
14210         {\r
14211                 return ERR_INVALID_PARAMETER;\r
14212         }\r
14213 \r
14214         Zero(&t, sizeof(t));\r
14215         StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);\r
14216         UniStrCpy(t.AccountName, sizeof(t.AccountName), GetParamUniStr(o, "[name]"));\r
14217 \r
14218         // RPC 呼び出し\r
14219         ret = ScSetLinkOffline(ps->Rpc, &t);\r
14220 \r
14221         if (ret != ERR_NO_ERROR)\r
14222         {\r
14223                 // エラー発生\r
14224                 CmdPrintError(c, ret);\r
14225                 FreeParamValueList(o);\r
14226                 return ret;\r
14227         }\r
14228 \r
14229         FreeParamValueList(o);\r
14230 \r
14231         return 0;\r
14232 }\r
14233 \r
14234 // 文字列を pass/discard に変換\r
14235 bool StrToPassOrDiscard(char *str)\r
14236 {\r
14237         // 引数チェック\r
14238         if (str == NULL)\r
14239         {\r
14240                 return false;\r
14241         }\r
14242 \r
14243         if (ToInt(str) != 0)\r
14244         {\r
14245                 return true;\r
14246         }\r
14247 \r
14248         if (StartWith(str, "p") || StartWith(str, "y") || StartWith(str, "t"))\r
14249         {\r
14250                 return true;\r
14251         }\r
14252 \r
14253         return false;\r
14254 }\r
14255 \r
14256 // 文字列をプロトコルに変換\r
14257 UINT StrToProtocol(char *str)\r
14258 {\r
14259         if (IsEmptyStr(str))\r
14260         {\r
14261                 return 0;\r
14262         }\r
14263 \r
14264         if (StartWith("ip", str))\r
14265         {\r
14266                 return 0;\r
14267         }\r
14268         else if (StartWith("tcp", str))\r
14269         {\r
14270                 return IP_PROTO_TCP;\r
14271         }\r
14272         else if (StartWith("udp", str))\r
14273         {\r
14274                 return IP_PROTO_UDP;\r
14275         }\r
14276         else if (StartWith("icmpv4", str))\r
14277         {\r
14278                 return IP_PROTO_ICMPV4;\r
14279         }\r
14280         else if (StartWith("icmpv6", str))\r
14281         {\r
14282                 return IP_PROTO_ICMPV6;\r
14283         }\r
14284 \r
14285         if (ToInt(str) == 0)\r
14286         {\r
14287                 if (StrCmpi(str, "0") == 0)\r
14288                 {\r
14289                         return 0;\r
14290                 }\r
14291                 else\r
14292                 {\r
14293                         return INFINITE;\r
14294                 }\r
14295         }\r
14296 \r
14297         if (ToInt(str) >= 256)\r
14298         {\r
14299                 return INFINITE;\r
14300         }\r
14301 \r
14302         return ToInt(str);\r
14303 }\r
14304 \r
14305 // プロトコル名のチェック\r
14306 bool CmdEvalProtocol(CONSOLE *c, wchar_t *str, void *param)\r
14307 {\r
14308         char tmp[64];\r
14309         // 引数チェック\r
14310         if (c == NULL || str == NULL)\r
14311         {\r
14312                 return false;\r
14313         }\r
14314 \r
14315         UniToStr(tmp, sizeof(tmp), str);\r
14316 \r
14317         if (StrToProtocol(tmp) == INFINITE)\r
14318         {\r
14319                 c->Write(c, _UU("CMD_PROTOCOL_EVAL_FAILED"));\r
14320                 return false;\r
14321         }\r
14322 \r
14323         return true;\r
14324 }\r
14325 \r
14326 // ポート範囲のパース\r
14327 bool ParsePortRange(char *str, UINT *start, UINT *end)\r
14328 {\r
14329         UINT a = 0, b = 0;\r
14330         TOKEN_LIST *t;\r
14331         // 引数チェック\r
14332         if (str == NULL)\r
14333         {\r
14334                 return false;\r
14335         }\r
14336 \r
14337         if (IsEmptyStr(str) == false)\r
14338         {\r
14339 \r
14340                 t = ParseToken(str, "\t -");\r
14341 \r
14342                 if (t->NumTokens == 1)\r
14343                 {\r
14344                         a = b = ToInt(t->Token[0]);\r
14345                 }\r
14346                 else if (t->NumTokens == 2)\r
14347                 {\r
14348                         a = ToInt(t->Token[0]);\r
14349                         b = ToInt(t->Token[1]);\r
14350                 }\r
14351 \r
14352                 FreeToken(t);\r
14353 \r
14354                 if (a > b)\r
14355                 {\r
14356                         return false;\r
14357                 }\r
14358 \r
14359                 if (a >= 65536 || b >= 65536)\r
14360                 {\r
14361                         return false;\r
14362                 }\r
14363 \r
14364                 if (a == 0 && b != 0)\r
14365                 {\r
14366                         return false;\r
14367                 }\r
14368         }\r
14369 \r
14370         if (start != NULL)\r
14371         {\r
14372                 *start = a;\r
14373         }\r
14374         if (end != NULL)\r
14375         {\r
14376                 *end = b;\r
14377         }\r
14378 \r
14379         return true;\r
14380 }\r
14381 \r
14382 // ポート範囲のチェック\r
14383 bool CmdEvalPortRange(CONSOLE *c, wchar_t *str, void *param)\r
14384 {\r
14385         char tmp[64];\r
14386         // 引数チェック\r
14387         if (c == NULL || str == NULL)\r
14388         {\r
14389                 return false;\r
14390         }\r
14391 \r
14392         UniToStr(tmp, sizeof(tmp), str);\r
14393 \r
14394         if (ParsePortRange(tmp, NULL, NULL) == false)\r
14395         {\r
14396                 c->Write(c, _UU("CMD_PORT_RANGE_EVAL_FAILED"));\r
14397                 return false;\r
14398         }\r
14399 \r
14400         return true;\r
14401 }\r
14402 \r
14403 // MAC アドレスとマスクのパース\r
14404 bool ParseMacAddressAndMask(char *src, bool *check_mac, UCHAR *mac_bin, UCHAR *mask_bin)\r
14405 {\r
14406         TOKEN_LIST *t;\r
14407         char *macstr, *maskstr;\r
14408         UCHAR mac[6], mask[6];\r
14409         bool ok = false;\r
14410 \r
14411         // 引数チェック\r
14412         if (src == NULL)\r
14413         {\r
14414                 return false;\r
14415         }\r
14416 \r
14417         //Zero(mac, sizeof(mac));\r
14418         //Zero(mask, sizeof(mask));\r
14419 \r
14420         if(check_mac != NULL && mac_bin != NULL && mask_bin != NULL)\r
14421         {\r
14422                 ok = true;\r
14423         }\r
14424         if(IsEmptyStr(src) != false)\r
14425         {\r
14426                 if(ok != false)\r
14427                 {\r
14428                         *check_mac = false;\r
14429                         Zero(mac_bin, 6);\r
14430                         Zero(mask_bin, 6);\r
14431                 }\r
14432                 return true;\r
14433         }\r
14434 \r
14435         t = ParseToken(src, "/");\r
14436         if(t->NumTokens != 2)\r
14437         {\r
14438                 FreeToken(t);\r
14439                 return false;\r
14440         }\r
14441 \r
14442         macstr = t->Token[0];\r
14443         maskstr = t->Token[1];\r
14444 \r
14445         Trim(macstr);\r
14446         Trim(maskstr);\r
14447 \r
14448         if(StrToMac(mac, macstr) == false || StrToMac(mask, maskstr) == false)\r
14449         {\r
14450                 FreeToken(t);\r
14451                 return false;\r
14452         }\r
14453         else\r
14454         {\r
14455                 if(ok != false)\r
14456                 {\r
14457                         Copy(mac_bin, mac, 6);\r
14458                         Copy(mask_bin, mask, 6);\r
14459                         *check_mac = true;\r
14460                 }\r
14461         }\r
14462         FreeToken(t);\r
14463 \r
14464         return true;\r
14465 }\r
14466 \r
14467 // MAC アドレスとマスクのチェック\r
14468 bool CmdEvalMacAddressAndMask(CONSOLE *c, wchar_t *str, void *param)\r
14469 {\r
14470         char tmp[64];\r
14471         // 引数チェック\r
14472         if(c == NULL || str == NULL)\r
14473         {\r
14474                 return false;\r
14475         }\r
14476 \r
14477         UniToStr(tmp, sizeof(tmp), str);\r
14478 \r
14479 \r
14480         if(ParseMacAddressAndMask(tmp, NULL, NULL, NULL) == false)\r
14481         {\r
14482                 c->Write(c, _UU("CMD_MAC_ADDRESS_AND_MASK_EVAL_FAILED"));\r
14483                 return false;\r
14484         }\r
14485 \r
14486         return true;\r
14487 }\r
14488 // TCP コネクションの状態パース\r
14489 bool ParseTcpState(char *src, bool *check_tcp_state, bool *established)\r
14490 {\r
14491         bool ok = false;\r
14492         // 引数チェック\r
14493         if(src == NULL)\r
14494         {\r
14495                 return false;\r
14496         }\r
14497 \r
14498         if(check_tcp_state != NULL && established != NULL)\r
14499         {\r
14500                 ok = true;\r
14501         }\r
14502 \r
14503         if (IsEmptyStr(src) == false)\r
14504         {\r
14505                 if (StartWith("Established", src) == 0)\r
14506                 {\r
14507                         if(ok != false)\r
14508                         {\r
14509                                 *check_tcp_state = true;\r
14510                                 *established = true;\r
14511                         }\r
14512                 }\r
14513                 else if (StartWith("Unestablished", src) == 0)\r
14514                 {\r
14515                         if(ok != false)\r
14516                         {\r
14517                                 *check_tcp_state = true;\r
14518                                 *established = false;\r
14519                         }\r
14520                 }\r
14521                 else\r
14522                 {\r
14523                         // 不正な文字列\r
14524                         return false;\r
14525                 }\r
14526         }\r
14527         else\r
14528         {\r
14529                 if(ok != false)\r
14530                 {\r
14531                         *check_tcp_state = false;\r
14532                         *established = false;\r
14533                 }\r
14534         }\r
14535 \r
14536         return true;\r
14537 }\r
14538 // TCP コネクションの状態チェック\r
14539 bool CmdEvalTcpState(CONSOLE *c, wchar_t *str, void *param)\r
14540 {\r
14541         char tmp[64];\r
14542         // 引数チェック\r
14543         if(c == NULL || str == NULL)\r
14544         {\r
14545                 return false;\r
14546         }\r
14547 \r
14548         UniToStr(tmp, sizeof(tmp), str);\r
14549 \r
14550         if(ParseTcpState(tmp, NULL, NULL) == false)\r
14551         {\r
14552                 c->Write(c, _UU("CMD_TCP_CONNECTION_STATE_EVAL_FAILED"));\r
14553                 return false;\r
14554         }\r
14555 \r
14556         return true;\r
14557 }\r
14558 \r
14559 // アクセス リストへのルールの追加 (標準、IPv4)\r
14560 UINT PsAccessAdd(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)\r
14561 {\r
14562         LIST *o;\r
14563         PS *ps = (PS *)param;\r
14564         UINT ret = 0;\r
14565         RPC_ADD_ACCESS t;\r
14566         ACCESS *a;\r
14567         // 指定できるパラメータ リスト\r
14568         CMD_EVAL_MIN_MAX minmax =\r
14569         {\r
14570                 "CMD_AccessAdd_Eval_PRIORITY", 1, 4294967295UL,\r
14571         };\r
14572         PARAM args[] =\r
14573         {\r
14574                 // "name", prompt_proc, prompt_param, eval_proc, eval_param\r
14575                 {"[pass|discard]", CmdPrompt, _UU("CMD_AccessAdd_Prompt_TYPE"), CmdEvalNotEmpty, NULL},\r
14576                 {"MEMO", CmdPrompt, _UU("CMD_AccessAdd_Prompt_MEMO"), NULL, NULL},\r
14577                 {"PRIORITY", CmdPrompt, _UU("CMD_AccessAdd_Prompt_PRIORITY"), CmdEvalMinMax, &minmax},\r
14578                 {"SRCUSERNAME", CmdPrompt, _UU("CMD_AccessAdd_Prompt_SRCUSERNAME"), NULL, NULL},\r
14579                 {"DESTUSERNAME", CmdPrompt, _UU("CMD_AccessAdd_Prompt_DESTUSERNAME"), NULL, NULL},\r
14580                 {"SRCMAC", CmdPrompt, _UU("CMD_AccessAdd_Prompt_SRCMAC"), CmdEvalMacAddressAndMask, NULL},\r
14581                 {"DESTMAC", CmdPrompt, _UU("CMD_AccessAdd_Prompt_DESTMAC"), CmdEvalMacAddressAndMask, NULL},\r
14582                 {"SRCIP", CmdPrompt, _UU("CMD_AccessAdd_Prompt_SRCIP"), CmdEvalIpAndMask4, NULL},\r
14583                 {"DESTIP", CmdPrompt, _UU("CMD_AccessAdd_Prompt_DESTIP"), CmdEvalIpAndMask4, NULL},\r
14584                 {"PROTOCOL", CmdPrompt, _UU("CMD_AccessAdd_Prompt_PROTOCOL"), CmdEvalProtocol, NULL},\r
14585                 {"SRCPORT", CmdPrompt, _UU("CMD_AccessAdd_Prompt_SRCPORT"), CmdEvalPortRange, NULL},\r
14586                 {"DESTPORT", CmdPrompt, _UU("CMD_AccessAdd_Prompt_DESTPORT"), CmdEvalPortRange, NULL},\r
14587                 {"TCPSTATE", CmdPrompt, _UU("CMD_AccessAdd_Prompt_TCPSTATE"), CmdEvalTcpState, NULL},\r
14588         };\r
14589 \r
14590         // 仮想 HUB が選択されていない場合はエラー\r
14591         if (ps->HubName == NULL)\r
14592         {\r
14593                 c->Write(c, _UU("CMD_Hub_Not_Selected"));\r
14594                 return ERR_INVALID_PARAMETER;\r
14595         }\r
14596 \r
14597         o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));\r
14598         if (o == NULL)\r
14599         {\r
14600                 return ERR_INVALID_PARAMETER;\r
14601         }\r
14602 \r
14603         Zero(&t, sizeof(t));\r
14604         a = &t.Access;\r
14605 \r
14606         StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);\r
14607         UniStrCpy(a->Note, sizeof(a->Note), GetParamUniStr(o, "MEMO"));\r
14608         a->Active = true;\r
14609         a->Priority = GetParamInt(o, "PRIORITY");\r
14610         a->Discard = StrToPassOrDiscard(GetParamStr(o, "[pass|discard]")) ? false : true;\r
14611         StrCpy(a->SrcUsername, sizeof(a->SrcUsername), GetParamStr(o, "SRCUSERNAME"));\r
14612         StrCpy(a->DestUsername, sizeof(a->DestUsername), GetParamStr(o, "DESTUSERNAME"));\r
14613         ParseMacAddressAndMask(GetParamStr(o, "SRCMAC"), &a->CheckSrcMac, a->SrcMacAddress, a->SrcMacMask);\r
14614         ParseMacAddressAndMask(GetParamStr(o, "DESTMAC"), &a->CheckDstMac, a->DstMacAddress, a->DstMacMask);\r
14615         ParseIpAndMask4(GetParamStr(o, "SRCIP"), &a->SrcIpAddress, &a->SrcSubnetMask);\r
14616         ParseIpAndMask4(GetParamStr(o, "DESTIP"), &a->DestIpAddress, &a->DestSubnetMask);\r
14617         a->Protocol = StrToProtocol(GetParamStr(o, "PROTOCOL"));\r
14618         ParsePortRange(GetParamStr(o, "SRCPORT"), &a->SrcPortStart, &a->SrcPortEnd);\r
14619         ParsePortRange(GetParamStr(o, "DESTPORT"), &a->DestPortStart, &a->DestPortEnd);\r
14620         ParseTcpState(GetParamStr(o, "TCPSTATE"), &a->CheckTcpState, &a->Established);\r
14621 \r
14622         // RPC 呼び出し\r
14623         ret = ScAddAccess(ps->Rpc, &t);\r
14624 \r
14625         if (ret != ERR_NO_ERROR)\r
14626         {\r
14627                 // エラー発生\r
14628                 CmdPrintError(c, ret);\r
14629                 FreeParamValueList(o);\r
14630                 return ret;\r
14631         }\r
14632 \r
14633         FreeParamValueList(o);\r
14634 \r
14635         return 0;\r
14636 }\r
14637 \r
14638 // アクセス リストへのルールの追加 (拡張、IPv4)\r
14639 UINT PsAccessAddEx(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)\r
14640 {\r
14641         LIST *o;\r
14642         PS *ps = (PS *)param;\r
14643         UINT ret = 0;\r
14644         RPC_ADD_ACCESS t;\r
14645         ACCESS *a;\r
14646         // 指定できるパラメータ リスト\r
14647         CMD_EVAL_MIN_MAX minmax =\r
14648         {\r
14649                 "CMD_AccessAdd_Eval_PRIORITY", 1, 4294967295UL,\r
14650         };\r
14651         CMD_EVAL_MIN_MAX minmax_delay =\r
14652         {\r
14653                 "CMD_AccessAddEx_Eval_DELAY", 0, HUB_ACCESSLIST_DELAY_MAX,\r
14654         };\r
14655         CMD_EVAL_MIN_MAX minmax_jitter =\r
14656         {\r
14657                 "CMD_AccessAddEx_Eval_JITTER", 0, HUB_ACCESSLIST_JITTER_MAX,\r
14658         };\r
14659         CMD_EVAL_MIN_MAX minmax_loss =\r
14660         {\r
14661                 "CMD_AccessAddEx_Eval_LOSS", 0, HUB_ACCESSLIST_LOSS_MAX,\r
14662         };\r
14663         PARAM args[] =\r
14664         {\r
14665                 // "name", prompt_proc, prompt_param, eval_proc, eval_param\r
14666                 {"[pass|discard]", CmdPrompt, _UU("CMD_AccessAdd_Prompt_TYPE"), CmdEvalNotEmpty, NULL},\r
14667                 {"MEMO", CmdPrompt, _UU("CMD_AccessAdd_Prompt_MEMO"), NULL, NULL},\r
14668                 {"PRIORITY", CmdPrompt, _UU("CMD_AccessAdd_Prompt_PRIORITY"), CmdEvalMinMax, &minmax},\r
14669                 {"SRCUSERNAME", CmdPrompt, _UU("CMD_AccessAdd_Prompt_SRCUSERNAME"), NULL, NULL},\r
14670                 {"DESTUSERNAME", CmdPrompt, _UU("CMD_AccessAdd_Prompt_DESTUSERNAME"), NULL, NULL},\r
14671                 {"SRCMAC", CmdPrompt, _UU("CMD_AccessAdd_Prompt_SRCMAC"), CmdEvalMacAddressAndMask, NULL},\r
14672                 {"DESTMAC", CmdPrompt, _UU("CMD_AccessAdd_Prompt_DESTMAC"), CmdEvalMacAddressAndMask, NULL},\r
14673                 {"SRCIP", CmdPrompt, _UU("CMD_AccessAdd_Prompt_SRCIP"), CmdEvalIpAndMask4, NULL},\r
14674                 {"DESTIP", CmdPrompt, _UU("CMD_AccessAdd_Prompt_DESTIP"), CmdEvalIpAndMask4, NULL},\r
14675                 {"PROTOCOL", CmdPrompt, _UU("CMD_AccessAdd_Prompt_PROTOCOL"), CmdEvalProtocol, NULL},\r
14676                 {"SRCPORT", CmdPrompt, _UU("CMD_AccessAdd_Prompt_SRCPORT"), CmdEvalPortRange, NULL},\r
14677                 {"DESTPORT", CmdPrompt, _UU("CMD_AccessAdd_Prompt_DESTPORT"), CmdEvalPortRange, NULL},\r
14678                 {"TCPSTATE", CmdPrompt, _UU("CMD_AccessAdd_Prompt_TCPSTATE"), CmdEvalTcpState, NULL},\r
14679                 {"DELAY", CmdPrompt, _UU("CMD_AccessAddEx_Prompt_DELAY"), CmdEvalMinMax, &minmax_delay},\r
14680                 {"JITTER", CmdPrompt, _UU("CMD_AccessAddEx_Prompt_JITTER"), CmdEvalMinMax, &minmax_jitter},\r
14681                 {"LOSS", CmdPrompt, _UU("CMD_AccessAddEx_Prompt_LOSS"), CmdEvalMinMax, &minmax_loss},\r
14682         };\r
14683 \r
14684         // 仮想 HUB が選択されていない場合はエラー\r
14685         if (ps->HubName == NULL)\r
14686         {\r
14687                 c->Write(c, _UU("CMD_Hub_Not_Selected"));\r
14688                 return ERR_INVALID_PARAMETER;\r
14689         }\r
14690 \r
14691         // サポートしているかどうかチェック\r
14692         if (GetCapsBool(ps->CapsList, "b_support_ex_acl") == false)\r
14693         {\r
14694                 c->Write(c, _E(ERR_NOT_SUPPORTED));\r
14695                 return ERR_NOT_SUPPORTED;\r
14696         }\r
14697 \r
14698         o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));\r
14699         if (o == NULL)\r
14700         {\r
14701                 return ERR_INVALID_PARAMETER;\r
14702         }\r
14703 \r
14704         Zero(&t, sizeof(t));\r
14705         a = &t.Access;\r
14706 \r
14707         StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);\r
14708         UniStrCpy(a->Note, sizeof(a->Note), GetParamUniStr(o, "MEMO"));\r
14709         a->Active = true;\r
14710         a->Priority = GetParamInt(o, "PRIORITY");\r
14711         a->Discard = StrToPassOrDiscard(GetParamStr(o, "[pass|discard]")) ? false : true;\r
14712         StrCpy(a->SrcUsername, sizeof(a->SrcUsername), GetParamStr(o, "SRCUSERNAME"));\r
14713         StrCpy(a->DestUsername, sizeof(a->DestUsername), GetParamStr(o, "DESTUSERNAME"));\r
14714         ParseMacAddressAndMask(GetParamStr(o, "SRCMAC"), &a->CheckSrcMac, a->SrcMacAddress, a->SrcMacMask);\r
14715         ParseMacAddressAndMask(GetParamStr(o, "DESTMAC"), &a->CheckDstMac, a->DstMacAddress, a->DstMacMask);\r
14716         ParseIpAndMask4(GetParamStr(o, "SRCIP"), &a->SrcIpAddress, &a->SrcSubnetMask);\r
14717         ParseIpAndMask4(GetParamStr(o, "DESTIP"), &a->DestIpAddress, &a->DestSubnetMask);\r
14718         a->Protocol = StrToProtocol(GetParamStr(o, "PROTOCOL"));\r
14719         ParsePortRange(GetParamStr(o, "SRCPORT"), &a->SrcPortStart, &a->SrcPortEnd);\r
14720         ParsePortRange(GetParamStr(o, "DESTPORT"), &a->DestPortStart, &a->DestPortEnd);\r
14721         ParseTcpState(GetParamStr(o, "TCPSTATE"), &a->CheckTcpState, &a->Established);\r
14722         a->Delay = GetParamInt(o, "DELAY");\r
14723         a->Jitter = GetParamInt(o, "JITTER");\r
14724         a->Loss = GetParamInt(o, "LOSS");\r
14725 \r
14726         // RPC 呼び出し\r
14727         ret = ScAddAccess(ps->Rpc, &t);\r
14728 \r
14729         if (ret != ERR_NO_ERROR)\r
14730         {\r
14731                 // エラー発生\r
14732                 CmdPrintError(c, ret);\r
14733                 FreeParamValueList(o);\r
14734                 return ret;\r
14735         }\r
14736 \r
14737         FreeParamValueList(o);\r
14738 \r
14739         return 0;\r
14740 }\r
14741 \r
14742 // アクセス リストへのルールの追加 (標準、IPv6)\r
14743 UINT PsAccessAdd6(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)\r
14744 {\r
14745         LIST *o;\r
14746         PS *ps = (PS *)param;\r
14747         UINT ret = 0;\r
14748         RPC_ADD_ACCESS t;\r
14749         ACCESS *a;\r
14750         IP ip, mask;\r
14751         // 指定できるパラメータ リスト\r
14752         CMD_EVAL_MIN_MAX minmax =\r
14753         {\r
14754                 "CMD_AccessAdd6_Eval_PRIORITY", 1, 4294967295UL,\r
14755         };\r
14756         PARAM args[] =\r
14757         {\r
14758                 // "name", prompt_proc, prompt_param, eval_proc, eval_param\r
14759                 {"[pass|discard]", CmdPrompt, _UU("CMD_AccessAdd6_Prompt_TYPE"), CmdEvalNotEmpty, NULL},\r
14760                 {"MEMO", CmdPrompt, _UU("CMD_AccessAdd6_Prompt_MEMO"), NULL, NULL},\r
14761                 {"PRIORITY", CmdPrompt, _UU("CMD_AccessAdd6_Prompt_PRIORITY"), CmdEvalMinMax, &minmax},\r
14762                 {"SRCUSERNAME", CmdPrompt, _UU("CMD_AccessAdd6_Prompt_SRCUSERNAME"), NULL, NULL},\r
14763                 {"DESTUSERNAME", CmdPrompt, _UU("CMD_AccessAdd6_Prompt_DESTUSERNAME"), NULL, NULL},\r
14764                 {"SRCMAC", CmdPrompt, _UU("CMD_AccessAdd6_Prompt_SRCMAC"), CmdEvalMacAddressAndMask, NULL},\r
14765                 {"DESTMAC", CmdPrompt, _UU("CMD_AccessAdd6_Prompt_DESTMAC"), CmdEvalMacAddressAndMask, NULL},\r
14766                 {"SRCIP", CmdPrompt, _UU("CMD_AccessAdd6_Prompt_SRCIP"), CmdEvalIpAndMask6, NULL},\r
14767                 {"DESTIP", CmdPrompt, _UU("CMD_AccessAdd6_Prompt_DESTIP"), CmdEvalIpAndMask6, NULL},\r
14768                 {"PROTOCOL", CmdPrompt, _UU("CMD_AccessAdd6_Prompt_PROTOCOL"), CmdEvalProtocol, NULL},\r
14769                 {"SRCPORT", CmdPrompt, _UU("CMD_AccessAdd6_Prompt_SRCPORT"), CmdEvalPortRange, NULL},\r
14770                 {"DESTPORT", CmdPrompt, _UU("CMD_AccessAdd6_Prompt_DESTPORT"), CmdEvalPortRange, NULL},\r
14771                 {"TCPSTATE", CmdPrompt, _UU("CMD_AccessAdd6_Prompt_TCPSTATE"), CmdEvalTcpState, NULL},\r
14772         };\r
14773 \r
14774         // 仮想 HUB が選択されていない場合はエラー\r
14775         if (ps->HubName == NULL)\r
14776         {\r
14777                 c->Write(c, _UU("CMD_Hub_Not_Selected"));\r
14778                 return ERR_INVALID_PARAMETER;\r
14779         }\r
14780 \r
14781         // サポートしているかどうかチェック\r
14782         if (GetCapsBool(ps->CapsList, "b_support_ex_acl") == false)\r
14783         {\r
14784                 c->Write(c, _E(ERR_NOT_SUPPORTED));\r
14785                 return ERR_NOT_SUPPORTED;\r
14786         }\r
14787 \r
14788         o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));\r
14789         if (o == NULL)\r
14790         {\r
14791                 return ERR_INVALID_PARAMETER;\r
14792         }\r
14793 \r
14794         Zero(&t, sizeof(t));\r
14795         a = &t.Access;\r
14796 \r
14797         a->IsIPv6 = true;\r
14798 \r
14799         StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);\r
14800         UniStrCpy(a->Note, sizeof(a->Note), GetParamUniStr(o, "MEMO"));\r
14801         a->Active = true;\r
14802         a->Priority = GetParamInt(o, "PRIORITY");\r
14803         a->Discard = StrToPassOrDiscard(GetParamStr(o, "[pass|discard]")) ? false : true;\r
14804         StrCpy(a->SrcUsername, sizeof(a->SrcUsername), GetParamStr(o, "SRCUSERNAME"));\r
14805         StrCpy(a->DestUsername, sizeof(a->DestUsername), GetParamStr(o, "DESTUSERNAME"));\r
14806         ParseMacAddressAndMask(GetParamStr(o, "SRCMAC"), &a->CheckSrcMac, a->SrcMacAddress, a->SrcMacMask);\r
14807         ParseMacAddressAndMask(GetParamStr(o, "DESTMAC"), &a->CheckDstMac, a->DstMacAddress, a->DstMacMask);\r
14808 \r
14809         Zero(&ip, sizeof(ip));\r
14810         Zero(&mask, sizeof(mask));\r
14811 \r
14812         ParseIpAndMask6(GetParamStr(o, "SRCIP"), &ip, &mask);\r
14813         IPToIPv6Addr(&a->SrcIpAddress6, &ip);\r
14814         IPToIPv6Addr(&a->SrcSubnetMask6, &mask);\r
14815 \r
14816         ParseIpAndMask6(GetParamStr(o, "DESTIP"), &ip, &mask);\r
14817         IPToIPv6Addr(&a->DestIpAddress6, &ip);\r
14818         IPToIPv6Addr(&a->DestSubnetMask6, &mask);\r
14819 \r
14820         a->Protocol = StrToProtocol(GetParamStr(o, "PROTOCOL"));\r
14821         ParsePortRange(GetParamStr(o, "SRCPORT"), &a->SrcPortStart, &a->SrcPortEnd);\r
14822         ParsePortRange(GetParamStr(o, "DESTPORT"), &a->DestPortStart, &a->DestPortEnd);\r
14823         ParseTcpState(GetParamStr(o, "TCPSTATE"), &a->CheckTcpState, &a->Established);\r
14824 \r
14825         // RPC 呼び出し\r
14826         ret = ScAddAccess(ps->Rpc, &t);\r
14827 \r
14828         if (ret != ERR_NO_ERROR)\r
14829         {\r
14830                 // エラー発生\r
14831                 CmdPrintError(c, ret);\r
14832                 FreeParamValueList(o);\r
14833                 return ret;\r
14834         }\r
14835 \r
14836         FreeParamValueList(o);\r
14837 \r
14838         return 0;\r
14839 }\r
14840 \r
14841 // アクセス リストへのルールの追加 (拡張、IPv6)\r
14842 UINT PsAccessAddEx6(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)\r
14843 {\r
14844         LIST *o;\r
14845         PS *ps = (PS *)param;\r
14846         UINT ret = 0;\r
14847         RPC_ADD_ACCESS t;\r
14848         ACCESS *a;\r
14849         IP ip, mask;\r
14850         // 指定できるパラメータ リスト\r
14851         CMD_EVAL_MIN_MAX minmax =\r
14852         {\r
14853                 "CMD_AccessAdd6_Eval_PRIORITY", 1, 4294967295UL,\r
14854         };\r
14855         CMD_EVAL_MIN_MAX minmax_delay =\r
14856         {\r
14857                 "CMD_AccessAddEx6_Eval_DELAY", 0, HUB_ACCESSLIST_DELAY_MAX,\r
14858         };\r
14859         CMD_EVAL_MIN_MAX minmax_jitter =\r
14860         {\r
14861                 "CMD_AccessAddEx6_Eval_JITTER", 0, HUB_ACCESSLIST_JITTER_MAX,\r
14862         };\r
14863         CMD_EVAL_MIN_MAX minmax_loss =\r
14864         {\r
14865                 "CMD_AccessAddEx6_Eval_LOSS", 0, HUB_ACCESSLIST_LOSS_MAX,\r
14866         };\r
14867         PARAM args[] =\r
14868         {\r
14869                 // "name", prompt_proc, prompt_param, eval_proc, eval_param\r
14870                 {"[pass|discard]", CmdPrompt, _UU("CMD_AccessAdd6_Prompt_TYPE"), CmdEvalNotEmpty, NULL},\r
14871                 {"MEMO", CmdPrompt, _UU("CMD_AccessAdd6_Prompt_MEMO"), NULL, NULL},\r
14872                 {"PRIORITY", CmdPrompt, _UU("CMD_AccessAdd6_Prompt_PRIORITY"), CmdEvalMinMax, &minmax},\r
14873                 {"SRCUSERNAME", CmdPrompt, _UU("CMD_AccessAdd6_Prompt_SRCUSERNAME"), NULL, NULL},\r
14874                 {"DESTUSERNAME", CmdPrompt, _UU("CMD_AccessAdd6_Prompt_DESTUSERNAME"), NULL, NULL},\r
14875                 {"SRCMAC", CmdPrompt, _UU("CMD_AccessAdd6_Prompt_SRCMAC"), CmdEvalMacAddressAndMask, NULL},\r
14876                 {"DESTMAC", CmdPrompt, _UU("CMD_AccessAdd6_Prompt_DESTMAC"), CmdEvalMacAddressAndMask, NULL},\r
14877                 {"SRCIP", CmdPrompt, _UU("CMD_AccessAdd6_Prompt_SRCIP"), CmdEvalIpAndMask6, NULL},\r
14878                 {"DESTIP", CmdPrompt, _UU("CMD_AccessAdd6_Prompt_DESTIP"), CmdEvalIpAndMask6, NULL},\r
14879                 {"PROTOCOL", CmdPrompt, _UU("CMD_AccessAdd6_Prompt_PROTOCOL"), CmdEvalProtocol, NULL},\r
14880                 {"SRCPORT", CmdPrompt, _UU("CMD_AccessAdd6_Prompt_SRCPORT"), CmdEvalPortRange, NULL},\r
14881                 {"DESTPORT", CmdPrompt, _UU("CMD_AccessAdd6_Prompt_DESTPORT"), CmdEvalPortRange, NULL},\r
14882                 {"TCPSTATE", CmdPrompt, _UU("CMD_AccessAdd6_Prompt_TCPSTATE"), CmdEvalTcpState, NULL},\r
14883                 {"DELAY", CmdPrompt, _UU("CMD_AccessAddEx6_Prompt_DELAY"), CmdEvalMinMax, &minmax_delay},\r
14884                 {"JITTER", CmdPrompt, _UU("CMD_AccessAddEx6_Prompt_JITTER"), CmdEvalMinMax, &minmax_jitter},\r
14885                 {"LOSS", CmdPrompt, _UU("CMD_AccessAddEx6_Prompt_LOSS"), CmdEvalMinMax, &minmax_loss},\r
14886         };\r
14887 \r
14888         // 仮想 HUB が選択されていない場合はエラー\r
14889         if (ps->HubName == NULL)\r
14890         {\r
14891                 c->Write(c, _UU("CMD_Hub_Not_Selected"));\r
14892                 return ERR_INVALID_PARAMETER;\r
14893         }\r
14894 \r
14895         // サポートしているかどうかチェック\r
14896         if (GetCapsBool(ps->CapsList, "b_support_ex_acl") == false)\r
14897         {\r
14898                 c->Write(c, _E(ERR_NOT_SUPPORTED));\r
14899                 return ERR_NOT_SUPPORTED;\r
14900         }\r
14901 \r
14902         o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));\r
14903         if (o == NULL)\r
14904         {\r
14905                 return ERR_INVALID_PARAMETER;\r
14906         }\r
14907 \r
14908         Zero(&t, sizeof(t));\r
14909         a = &t.Access;\r
14910 \r
14911         a->IsIPv6 = true;\r
14912 \r
14913         StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);\r
14914         UniStrCpy(a->Note, sizeof(a->Note), GetParamUniStr(o, "MEMO"));\r
14915         a->Active = true;\r
14916         a->Priority = GetParamInt(o, "PRIORITY");\r
14917         a->Discard = StrToPassOrDiscard(GetParamStr(o, "[pass|discard]")) ? false : true;\r
14918         StrCpy(a->SrcUsername, sizeof(a->SrcUsername), GetParamStr(o, "SRCUSERNAME"));\r
14919         StrCpy(a->DestUsername, sizeof(a->DestUsername), GetParamStr(o, "DESTUSERNAME"));\r
14920         ParseMacAddressAndMask(GetParamStr(o, "SRCMAC"), &a->CheckSrcMac, a->SrcMacAddress, a->SrcMacMask);\r
14921         ParseMacAddressAndMask(GetParamStr(o, "DESTMAC"), &a->CheckDstMac, a->DstMacAddress, a->DstMacMask);\r
14922 \r
14923         Zero(&ip, sizeof(ip));\r
14924         Zero(&mask, sizeof(mask));\r
14925 \r
14926         ParseIpAndMask6(GetParamStr(o, "SRCIP"), &ip, &mask);\r
14927         IPToIPv6Addr(&a->SrcIpAddress6, &ip);\r
14928         IPToIPv6Addr(&a->SrcSubnetMask6, &mask);\r
14929 \r
14930         ParseIpAndMask6(GetParamStr(o, "DESTIP"), &ip, &mask);\r
14931         IPToIPv6Addr(&a->DestIpAddress6, &ip);\r
14932         IPToIPv6Addr(&a->DestSubnetMask6, &mask);\r
14933 \r
14934         a->Protocol = StrToProtocol(GetParamStr(o, "PROTOCOL"));\r
14935         ParsePortRange(GetParamStr(o, "SRCPORT"), &a->SrcPortStart, &a->SrcPortEnd);\r
14936         ParsePortRange(GetParamStr(o, "DESTPORT"), &a->DestPortStart, &a->DestPortEnd);\r
14937         ParseTcpState(GetParamStr(o, "TCPSTATE"), &a->CheckTcpState, &a->Established);\r
14938         a->Delay = GetParamInt(o, "DELAY");\r
14939         a->Jitter = GetParamInt(o, "JITTER");\r
14940         a->Loss = GetParamInt(o, "LOSS");\r
14941 \r
14942         // RPC 呼び出し\r
14943         ret = ScAddAccess(ps->Rpc, &t);\r
14944 \r
14945         if (ret != ERR_NO_ERROR)\r
14946         {\r
14947                 // エラー発生\r
14948                 CmdPrintError(c, ret);\r
14949                 FreeParamValueList(o);\r
14950                 return ret;\r
14951         }\r
14952 \r
14953         FreeParamValueList(o);\r
14954 \r
14955         return 0;\r
14956 }\r
14957 \r
14958 \r
14959 // アクセス リストのルール一覧の取得\r
14960 UINT PsAccessList(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)\r
14961 {\r
14962         LIST *o;\r
14963         PS *ps = (PS *)param;\r
14964         UINT ret = 0;\r
14965         RPC_ENUM_ACCESS_LIST t;\r
14966         CT *ct;\r
14967         UINT i;\r
14968         \r
14969         // 仮想 HUB が選択されていない場合はエラー\r
14970         if (ps->HubName == NULL)\r
14971         {\r
14972                 c->Write(c, _UU("CMD_Hub_Not_Selected"));\r
14973                 return ERR_INVALID_PARAMETER;\r
14974         }\r
14975 \r
14976         o = ParseCommandList(c, cmd_name, str, NULL, 0);\r
14977         if (o == NULL)\r
14978         {\r
14979                 return ERR_INVALID_PARAMETER;\r
14980         }\r
14981 \r
14982         Zero(&t, sizeof(t));\r
14983         StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);\r
14984 \r
14985         // RPC 呼び出し\r
14986         ret = ScEnumAccess(ps->Rpc, &t);\r
14987 \r
14988         if (ret != ERR_NO_ERROR)\r
14989         {\r
14990                 // エラー発生\r
14991                 CmdPrintError(c, ret);\r
14992                 FreeParamValueList(o);\r
14993                 return ret;\r
14994         }\r
14995 \r
14996         ct = CtNew();\r
14997         CtInsertColumn(ct, _UU("SM_ACCESS_COLUMN_0"), true);\r
14998         CtInsertColumn(ct, _UU("SM_ACCESS_COLUMN_1"), true);\r
14999         CtInsertColumn(ct, _UU("SM_ACCESS_COLUMN_2"), true);\r
15000         CtInsertColumn(ct, _UU("SM_ACCESS_COLUMN_3"), true);\r
15001         CtInsertColumn(ct, _UU("SM_ACCESS_COLUMN_5"), false);\r
15002         CtInsertColumn(ct, _UU("SM_ACCESS_COLUMN_4"), false);\r
15003 \r
15004         for (i = 0;i < t.NumAccess;i++)\r
15005         {\r
15006                 ACCESS *a = &t.Accesses[i];\r
15007                 char tmp[MAX_SIZE];\r
15008                 wchar_t tmp3[MAX_SIZE];\r
15009                 wchar_t tmp1[MAX_SIZE];\r
15010                 wchar_t tmp2[MAX_SIZE];\r
15011 \r
15012                 GetAccessListStr(tmp, sizeof(tmp), a);\r
15013                 UniToStru(tmp1, a->Priority);\r
15014                 StrToUni(tmp2, sizeof(tmp2), tmp);\r
15015 \r
15016                 UniToStru(tmp3, a->Id);\r
15017 \r
15018                 CtInsert(ct,\r
15019                         tmp3,\r
15020                         a->Discard ? _UU("SM_ACCESS_DISCARD") : _UU("SM_ACCESS_PASS"),\r
15021                         a->Active ? _UU("SM_ACCESS_ENABLE") : _UU("SM_ACCESS_DISABLE"),\r
15022                         tmp1,\r
15023                         tmp2,\r
15024                         a->Note);\r
15025         }\r
15026 \r
15027         CtFreeEx(ct, c, true);\r
15028 \r
15029         FreeRpcEnumAccessList(&t);\r
15030 \r
15031         FreeParamValueList(o);\r
15032 \r
15033         return 0;\r
15034 }\r
15035 \r
15036 // アクセス リストからルールを削除\r
15037 UINT PsAccessDelete(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)\r
15038 {\r
15039         LIST *o;\r
15040         PS *ps = (PS *)param;\r
15041         UINT ret = 0;\r
15042         RPC_DELETE_ACCESS t;\r
15043         // 指定できるパラメータ リスト\r
15044         PARAM args[] =\r
15045         {\r
15046                 // "name", prompt_proc, prompt_param, eval_proc, eval_param\r
15047                 {"[id]", CmdPrompt, _UU("CMD_Access_Prompt_ID"), CmdEvalNotEmpty, NULL},\r
15048         };\r
15049 \r
15050         // 仮想 HUB が選択されていない場合はエラー\r
15051         if (ps->HubName == NULL)\r
15052         {\r
15053                 c->Write(c, _UU("CMD_Hub_Not_Selected"));\r
15054                 return ERR_INVALID_PARAMETER;\r
15055         }\r
15056 \r
15057         o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));\r
15058         if (o == NULL)\r
15059         {\r
15060                 return ERR_INVALID_PARAMETER;\r
15061         }\r
15062 \r
15063         Zero(&t, sizeof(t));\r
15064         StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);\r
15065         t.Id = GetParamInt(o, "[id]");\r
15066 \r
15067         // RPC 呼び出し\r
15068         ret = ScDeleteAccess(ps->Rpc, &t);\r
15069 \r
15070         if (ret != ERR_NO_ERROR)\r
15071         {\r
15072                 // エラー発生\r
15073                 CmdPrintError(c, ret);\r
15074                 FreeParamValueList(o);\r
15075                 return ret;\r
15076         }\r
15077 \r
15078         FreeParamValueList(o);\r
15079 \r
15080         return 0;\r
15081 }\r
15082 \r
15083 // アクセス リストのルールの有効化\r
15084 UINT PsAccessEnable(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)\r
15085 {\r
15086         LIST *o;\r
15087         PS *ps = (PS *)param;\r
15088         UINT ret = 0;\r
15089         RPC_ENUM_ACCESS_LIST t;\r
15090         // 指定できるパラメータ リスト\r
15091         PARAM args[] =\r
15092         {\r
15093                 // "name", prompt_proc, prompt_param, eval_proc, eval_param\r
15094                 {"[id]", CmdPrompt, _UU("CMD_Access_Prompt_ID"), CmdEvalNotEmpty, NULL},\r
15095         };\r
15096 \r
15097         // 仮想 HUB が選択されていない場合はエラー\r
15098         if (ps->HubName == NULL)\r
15099         {\r
15100                 c->Write(c, _UU("CMD_Hub_Not_Selected"));\r
15101                 return ERR_INVALID_PARAMETER;\r
15102         }\r
15103 \r
15104         o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));\r
15105         if (o == NULL)\r
15106         {\r
15107                 return ERR_INVALID_PARAMETER;\r
15108         }\r
15109 \r
15110         Zero(&t, sizeof(t));\r
15111         StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);\r
15112 \r
15113         // RPC 呼び出し\r
15114         ret = ScEnumAccess(ps->Rpc, &t);\r
15115 \r
15116         if (ret != ERR_NO_ERROR)\r
15117         {\r
15118                 // エラー発生\r
15119                 CmdPrintError(c, ret);\r
15120                 FreeParamValueList(o);\r
15121                 return ret;\r
15122         }\r
15123         else\r
15124         {\r
15125                 UINT i;\r
15126                 bool b = false;\r
15127                 for (i = 0;i < t.NumAccess;i++)\r
15128                 {\r
15129                         ACCESS *a = &t.Accesses[i];\r
15130 \r
15131                         if (a->Id == GetParamInt(o, "[id]"))\r
15132                         {\r
15133                                 b = true;\r
15134 \r
15135                                 a->Active = true;\r
15136                         }\r
15137                 }\r
15138 \r
15139                 if (b == false)\r
15140                 {\r
15141                         // 指定した ID が見つからない\r
15142                         ret = ERR_OBJECT_NOT_FOUND;\r
15143                         CmdPrintError(c, ret);\r
15144                         FreeParamValueList(o);\r
15145                         FreeRpcEnumAccessList(&t);\r
15146                         return ret;\r
15147                 }\r
15148 \r
15149                 ret = ScSetAccessList(ps->Rpc, &t);\r
15150                 if (ret != ERR_NO_ERROR)\r
15151                 {\r
15152                         // エラー発生\r
15153                         CmdPrintError(c, ret);\r
15154                         FreeParamValueList(o);\r
15155                         return ret;\r
15156                 }\r
15157 \r
15158                 FreeRpcEnumAccessList(&t);\r
15159         }\r
15160 \r
15161         FreeParamValueList(o);\r
15162 \r
15163         return ret;\r
15164 }\r
15165 \r
15166 // アクセス リストのルールの無効化\r
15167 UINT PsAccessDisable(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)\r
15168 {\r
15169         LIST *o;\r
15170         PS *ps = (PS *)param;\r
15171         UINT ret = 0;\r
15172         RPC_ENUM_ACCESS_LIST t;\r
15173         // 指定できるパラメータ リスト\r
15174         PARAM args[] =\r
15175         {\r
15176                 // "name", prompt_proc, prompt_param, eval_proc, eval_param\r
15177                 {"[id]", CmdPrompt, _UU("CMD_Access_Prompt_ID"), CmdEvalNotEmpty, NULL},\r
15178         };\r
15179 \r
15180         // 仮想 HUB が選択されていない場合はエラー\r
15181         if (ps->HubName == NULL)\r
15182         {\r
15183                 c->Write(c, _UU("CMD_Hub_Not_Selected"));\r
15184                 return ERR_INVALID_PARAMETER;\r
15185         }\r
15186 \r
15187         o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));\r
15188         if (o == NULL)\r
15189         {\r
15190                 return ERR_INVALID_PARAMETER;\r
15191         }\r
15192 \r
15193         Zero(&t, sizeof(t));\r
15194         StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);\r
15195 \r
15196         // RPC 呼び出し\r
15197         ret = ScEnumAccess(ps->Rpc, &t);\r
15198 \r
15199         if (ret != ERR_NO_ERROR)\r
15200         {\r
15201                 // エラー発生\r
15202                 CmdPrintError(c, ret);\r
15203                 FreeParamValueList(o);\r
15204                 return ret;\r
15205         }\r
15206         else\r
15207         {\r
15208                 UINT i;\r
15209                 bool b = false;\r
15210                 for (i = 0;i < t.NumAccess;i++)\r
15211                 {\r
15212                         ACCESS *a = &t.Accesses[i];\r
15213 \r
15214                         if (a->Id == GetParamInt(o, "[id]"))\r
15215                         {\r
15216                                 b = true;\r
15217 \r
15218                                 a->Active = false;\r
15219                         }\r
15220                 }\r
15221 \r
15222                 if (b == false)\r
15223                 {\r
15224                         // 指定した ID が見つからない\r
15225                         ret = ERR_OBJECT_NOT_FOUND;\r
15226                         CmdPrintError(c, ret);\r
15227                         FreeParamValueList(o);\r
15228                         FreeRpcEnumAccessList(&t);\r
15229                         return ret;\r
15230                 }\r
15231 \r
15232                 ret = ScSetAccessList(ps->Rpc, &t);\r
15233                 if (ret != ERR_NO_ERROR)\r
15234                 {\r
15235                         // エラー発生\r
15236                         CmdPrintError(c, ret);\r
15237                         FreeParamValueList(o);\r
15238                         return ret;\r
15239                 }\r
15240 \r
15241                 FreeRpcEnumAccessList(&t);\r
15242         }\r
15243 \r
15244         FreeParamValueList(o);\r
15245 \r
15246         return ret;\r
15247 }\r
15248 \r
15249 // ユーザー一覧の取得\r
15250 UINT PsUserList(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)\r
15251 {\r
15252         LIST *o;\r
15253         PS *ps = (PS *)param;\r
15254         UINT ret = 0;\r
15255         RPC_ENUM_USER t;\r
15256 \r
15257         // 仮想 HUB が選択されていない場合はエラー\r
15258         if (ps->HubName == NULL)\r
15259         {\r
15260                 c->Write(c, _UU("CMD_Hub_Not_Selected"));\r
15261                 return ERR_INVALID_PARAMETER;\r
15262         }\r
15263 \r
15264         o = ParseCommandList(c, cmd_name, str, NULL, 0);\r
15265         if (o == NULL)\r
15266         {\r
15267                 return ERR_INVALID_PARAMETER;\r
15268         }\r
15269 \r
15270         Zero(&t, sizeof(t));\r
15271         StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);\r
15272 \r
15273         // RPC 呼び出し\r
15274         ret = ScEnumUser(ps->Rpc, &t);\r
15275 \r
15276         if (ret != ERR_NO_ERROR)\r
15277         {\r
15278                 // エラー発生\r
15279                 CmdPrintError(c, ret);\r
15280                 FreeParamValueList(o);\r
15281                 return ret;\r
15282         }\r
15283         else\r
15284         {\r
15285                 UINT i;\r
15286                 CT *ct = CtNew();\r
15287 \r
15288                 CtInsertColumn(ct, _UU("SM_USER_COLUMN_1"), false);\r
15289                 CtInsertColumn(ct, _UU("SM_USER_COLUMN_2"), false);\r
15290                 CtInsertColumn(ct, _UU("SM_USER_COLUMN_3"), false);\r
15291                 CtInsertColumn(ct, _UU("SM_USER_COLUMN_4"), false);\r
15292                 CtInsertColumn(ct, _UU("SM_USER_COLUMN_5"), false);\r
15293                 CtInsertColumn(ct, _UU("SM_USER_COLUMN_6"), false);\r
15294                 CtInsertColumn(ct, _UU("SM_USER_COLUMN_7"), false);\r
15295 \r
15296                 for (i = 0;i < t.NumUser;i++)\r
15297                 {\r
15298                         RPC_ENUM_USER_ITEM *e = &t.Users[i];\r
15299                         wchar_t name[MAX_SIZE];\r
15300                         wchar_t group[MAX_SIZE];\r
15301                         wchar_t num[MAX_SIZE];\r
15302                         wchar_t time[MAX_SIZE];\r
15303 \r
15304                         StrToUni(name, sizeof(name), e->Name);\r
15305 \r
15306                         if (StrLen(e->GroupName) != 0)\r
15307                         {\r
15308                                 StrToUni(group, sizeof(group), e->GroupName);\r
15309                         }\r
15310                         else\r
15311                         {\r
15312                                 UniStrCpy(group, sizeof(group), _UU("SM_NO_GROUP"));\r
15313                         }\r
15314 \r
15315                         UniToStru(num, e->NumLogin);\r
15316 \r
15317                         GetDateTimeStrEx64(time, sizeof(time), SystemToLocal64(e->LastLoginTime), NULL);\r
15318 \r
15319                         CtInsert(ct,\r
15320                                 name, e->Realname, group, e->Note, GetAuthTypeStr(e->AuthType),\r
15321                                 num, time);\r
15322                 }\r
15323 \r
15324                 CtFreeEx(ct, c, true);\r
15325         }\r
15326 \r
15327         FreeRpcEnumUser(&t);\r
15328 \r
15329         FreeParamValueList(o);\r
15330 \r
15331         return 0;\r
15332 }\r
15333 \r
15334 // ユーザー認証方法の文字列の取得\r
15335 wchar_t *GetAuthTypeStr(UINT id)\r
15336 {\r
15337         char tmp[MAX_SIZE];\r
15338         Format(tmp, sizeof(tmp), "SM_AUTHTYPE_%u", id);\r
15339 \r
15340         return _UU(tmp);\r
15341 }\r
15342 \r
15343 // ユーザーの作成\r
15344 UINT PsUserCreate(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)\r
15345 {\r
15346         LIST *o;\r
15347         PS *ps = (PS *)param;\r
15348         UINT ret = 0;\r
15349         RPC_SET_USER t;\r
15350         // 指定できるパラメータ リスト\r
15351         PARAM args[] =\r
15352         {\r
15353                 // "name", prompt_proc, prompt_param, eval_proc, eval_param\r
15354                 {"[name]", CmdPrompt, _UU("CMD_UserCreate_Prompt_NAME"), CmdEvalNotEmpty, NULL},\r
15355                 {"GROUP", CmdPrompt, _UU("CMD_UserCreate_Prompt_GROUP"), NULL, NULL},\r
15356                 {"REALNAME", CmdPrompt, _UU("CMD_UserCreate_Prompt_REALNAME"), NULL, NULL},\r
15357                 {"NOTE", CmdPrompt, _UU("CMD_UserCreate_Prompt_NOTE"), NULL, NULL},\r
15358         };\r
15359 \r
15360         // 仮想 HUB が選択されていない場合はエラー\r
15361         if (ps->HubName == NULL)\r
15362         {\r
15363                 c->Write(c, _UU("CMD_Hub_Not_Selected"));\r
15364                 return ERR_INVALID_PARAMETER;\r
15365         }\r
15366 \r
15367         o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));\r
15368         if (o == NULL)\r
15369         {\r
15370                 return ERR_INVALID_PARAMETER;\r
15371         }\r
15372 \r
15373         Zero(&t, sizeof(t));\r
15374         StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);\r
15375         StrCpy(t.Name, sizeof(t.Name), GetParamStr(o, "[name]"));\r
15376         StrCpy(t.GroupName, sizeof(t.GroupName), GetParamStr(o, "GROUP"));\r
15377         UniStrCpy(t.Realname, sizeof(t.Realname), GetParamUniStr(o, "REALNAME"));\r
15378         UniStrCpy(t.Note, sizeof(t.Note), GetParamUniStr(o, "NOTE"));\r
15379 \r
15380         Trim(t.Name);\r
15381         if (StrCmpi(t.Name, "*") == 0)\r
15382         {\r
15383                 t.AuthType = AUTHTYPE_RADIUS;\r
15384                 t.AuthData = NewRadiusAuthData(NULL);\r
15385         }\r
15386         else\r
15387         {\r
15388                 UCHAR random_pass[SHA1_SIZE];\r
15389 \r
15390                 Rand(random_pass, sizeof(random_pass));\r
15391                 t.AuthType = AUTHTYPE_PASSWORD;\r
15392                 t.AuthData = NewPasswordAuthDataRaw(random_pass);\r
15393         }\r
15394 \r
15395         // RPC 呼び出し\r
15396         ret = ScCreateUser(ps->Rpc, &t);\r
15397 \r
15398         if (ret != ERR_NO_ERROR)\r
15399         {\r
15400                 // エラー発生\r
15401                 CmdPrintError(c, ret);\r
15402                 FreeParamValueList(o);\r
15403                 return ret;\r
15404         }\r
15405 \r
15406         FreeRpcSetUser(&t);\r
15407 \r
15408         FreeParamValueList(o);\r
15409 \r
15410         return 0;\r
15411 }\r
15412 \r
15413 // ユーザー情報の変更\r
15414 UINT PsUserSet(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)\r
15415 {\r
15416         LIST *o;\r
15417         PS *ps = (PS *)param;\r
15418         UINT ret = 0;\r
15419         RPC_SET_USER t;\r
15420         // 指定できるパラメータ リスト\r
15421         PARAM args[] =\r
15422         {\r
15423                 // "name", prompt_proc, prompt_param, eval_proc, eval_param\r
15424                 {"[name]", CmdPrompt, _UU("CMD_UserCreate_Prompt_NAME"), CmdEvalNotEmpty, NULL},\r
15425                 {"GROUP", CmdPrompt, _UU("CMD_UserCreate_Prompt_GROUP"), NULL, NULL},\r
15426                 {"REALNAME", CmdPrompt, _UU("CMD_UserCreate_Prompt_REALNAME"), NULL, NULL},\r
15427                 {"NOTE", CmdPrompt, _UU("CMD_UserCreate_Prompt_NOTE"), NULL, NULL},\r
15428         };\r
15429 \r
15430         // 仮想 HUB が選択されていない場合はエラー\r
15431         if (ps->HubName == NULL)\r
15432         {\r
15433                 c->Write(c, _UU("CMD_Hub_Not_Selected"));\r
15434                 return ERR_INVALID_PARAMETER;\r
15435         }\r
15436 \r
15437         o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));\r
15438         if (o == NULL)\r
15439         {\r
15440                 return ERR_INVALID_PARAMETER;\r
15441         }\r
15442 \r
15443         Zero(&t, sizeof(t));\r
15444         // ユーザーオブジェクトを取得\r
15445         StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);\r
15446         StrCpy(t.Name, sizeof(t.Name), GetParamStr(o, "[name]"));\r
15447 \r
15448         ret = ScGetUser(ps->Rpc, &t);\r
15449         if (ret != ERR_NO_ERROR)\r
15450         {\r
15451                 // エラー発生\r
15452                 CmdPrintError(c, ret);\r
15453                 FreeParamValueList(o);\r
15454                 return ret;\r
15455         }\r
15456 \r
15457         // 情報を更新する\r
15458         StrCpy(t.GroupName, sizeof(t.GroupName), GetParamStr(o, "GROUP"));\r
15459         UniStrCpy(t.Realname, sizeof(t.Realname), GetParamUniStr(o, "REALNAME"));\r
15460         UniStrCpy(t.Note, sizeof(t.Note), GetParamUniStr(o, "NOTE"));\r
15461 \r
15462         // ユーザーオブジェクトを書き込み\r
15463         ret = ScSetUser(ps->Rpc, &t);\r
15464 \r
15465         if (ret != ERR_NO_ERROR)\r
15466         {\r
15467                 // エラー発生\r
15468                 CmdPrintError(c, ret);\r
15469                 FreeParamValueList(o);\r
15470                 return ret;\r
15471         }\r
15472 \r
15473         FreeRpcSetUser(&t);\r
15474 \r
15475         FreeParamValueList(o);\r
15476 \r
15477         return 0;\r
15478 }\r
15479 \r
15480 // ユーザーの削除\r
15481 UINT PsUserDelete(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)\r
15482 {\r
15483         LIST *o;\r
15484         PS *ps = (PS *)param;\r
15485         UINT ret = 0;\r
15486         RPC_DELETE_USER t;\r
15487         // 指定できるパラメータ リスト\r
15488         PARAM args[] =\r
15489         {\r
15490                 {"[name]", CmdPrompt, _UU("CMD_UserCreate_Prompt_NAME"), CmdEvalNotEmpty, NULL},\r
15491         };\r
15492 \r
15493         // 仮想 HUB が選択されていない場合はエラー\r
15494         if (ps->HubName == NULL)\r
15495         {\r
15496                 c->Write(c, _UU("CMD_Hub_Not_Selected"));\r
15497                 return ERR_INVALID_PARAMETER;\r
15498         }\r
15499 \r
15500         o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));\r
15501         if (o == NULL)\r
15502         {\r
15503                 return ERR_INVALID_PARAMETER;\r
15504         }\r
15505 \r
15506         Zero(&t, sizeof(t));\r
15507         StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);\r
15508         StrCpy(t.Name, sizeof(t.Name), GetParamStr(o, "[name]"));\r
15509 \r
15510         // RPC 呼び出し\r
15511         ret = ScDeleteUser(ps->Rpc, &t);\r
15512 \r
15513         if (ret != ERR_NO_ERROR)\r
15514         {\r
15515                 // エラー発生\r
15516                 CmdPrintError(c, ret);\r
15517                 FreeParamValueList(o);\r
15518                 return ret;\r
15519         }\r
15520 \r
15521         FreeParamValueList(o);\r
15522 \r
15523         return 0;\r
15524 }\r
15525 \r
15526 // ユーザー情報の取得\r
15527 UINT PsUserGet(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)\r
15528 {\r
15529         LIST *o;\r
15530         PS *ps = (PS *)param;\r
15531         UINT ret = 0;\r
15532         RPC_SET_USER t;\r
15533         // 指定できるパラメータ リスト\r
15534         PARAM args[] =\r
15535         {\r
15536                 // "name", prompt_proc, prompt_param, eval_proc, eval_param\r
15537                 {"[name]", CmdPrompt, _UU("CMD_UserCreate_Prompt_NAME"), CmdEvalNotEmpty, NULL},\r
15538         };\r
15539 \r
15540         // 仮想 HUB が選択されていない場合はエラー\r
15541         if (ps->HubName == NULL)\r
15542         {\r
15543                 c->Write(c, _UU("CMD_Hub_Not_Selected"));\r
15544                 return ERR_INVALID_PARAMETER;\r
15545         }\r
15546 \r
15547         o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));\r
15548         if (o == NULL)\r
15549         {\r
15550                 return ERR_INVALID_PARAMETER;\r
15551         }\r
15552 \r
15553         Zero(&t, sizeof(t));\r
15554         // ユーザーオブジェクトを取得\r
15555         StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);\r
15556         StrCpy(t.Name, sizeof(t.Name), GetParamStr(o, "[name]"));\r
15557 \r
15558         ret = ScGetUser(ps->Rpc, &t);\r
15559         if (ret != ERR_NO_ERROR)\r
15560         {\r
15561                 // エラー発生\r
15562                 CmdPrintError(c, ret);\r
15563                 FreeParamValueList(o);\r
15564                 return ret;\r
15565         }\r
15566         else\r
15567         {\r
15568                 wchar_t tmp[MAX_SIZE];\r
15569                 CT *ct;\r
15570 \r
15571                 // ユーザーデータを表示\r
15572                 ct = CtNewStandard();\r
15573 \r
15574                 // ユーザー名\r
15575                 StrToUni(tmp, sizeof(tmp), t.Name);\r
15576                 CtInsert(ct, _UU("CMD_UserGet_Column_Name"), tmp);\r
15577 \r
15578                 // 本名\r
15579                 CtInsert(ct, _UU("CMD_UserGet_Column_RealName"), t.Realname);\r
15580 \r
15581                 // 説明\r
15582                 CtInsert(ct, _UU("CMD_UserGet_Column_Note"), t.Note);\r
15583 \r
15584                 // グループ名\r
15585                 if (IsEmptyStr(t.GroupName) == false)\r
15586                 {\r
15587                         StrToUni(tmp, sizeof(tmp), t.GroupName);\r
15588                         CtInsert(ct, _UU("CMD_UserGet_Column_Group"), tmp);\r
15589                 }\r
15590 \r
15591                 // 有効期限\r
15592                 GetDateTimeStrEx64(tmp, sizeof(tmp), SystemToLocal64(t.ExpireTime), NULL);\r
15593                 CtInsert(ct, _UU("CMD_UserGet_Column_Expires"), tmp);\r
15594 \r
15595                 // 認証方法\r
15596                 CtInsert(ct, _UU("CMD_UserGet_Column_AuthType"), GetAuthTypeStr(t.AuthType));\r
15597 \r
15598                 switch (t.AuthType)\r
15599                 {\r
15600                 case AUTHTYPE_USERCERT:\r
15601                         if (t.AuthData != NULL)\r
15602                         {\r
15603                                 AUTHUSERCERT *auc = (AUTHUSERCERT *)t.AuthData;\r
15604 \r
15605                                 if (auc != NULL && auc->UserX != NULL)\r
15606                                 {\r
15607                                         // 登録済みユーザー固有証明書\r
15608                                         GetAllNameFromX(tmp, sizeof(tmp), auc->UserX);\r
15609                                         CtInsert(ct, _UU("CMD_UserGet_Column_UserCert"), tmp);\r
15610                                 }\r
15611                         }\r
15612                         break;\r
15613 \r
15614                 case AUTHTYPE_ROOTCERT:\r
15615                         if (t.AuthData != NULL)\r
15616                         {\r
15617                                 AUTHROOTCERT *arc = (AUTHROOTCERT *)t.AuthData;\r
15618 \r
15619                                 if (IsEmptyUniStr(arc->CommonName) == false)\r
15620                                 {\r
15621                                         // 証明書の CN の値の限定\r
15622                                         CtInsert(ct, _UU("CMD_UserGet_Column_RootCert_CN"), arc->CommonName);\r
15623                                 }\r
15624 \r
15625                                 if (arc->Serial != NULL && arc->Serial->size >= 1)\r
15626                                 {\r
15627                                         char tmp2[MAX_SIZE];\r
15628 \r
15629                                         // 証明書のシリアル番号の限定\r
15630                                         BinToStrEx(tmp2, sizeof(tmp2), arc->Serial->data, arc->Serial->size);\r
15631                                         StrToUni(tmp, sizeof(tmp), tmp2);\r
15632                                         CtInsert(ct, _UU("CMD_UserGet_Column_RootCert_SERIAL"), tmp);\r
15633                                 }\r
15634                         }\r
15635                         break;\r
15636 \r
15637                 case AUTHTYPE_RADIUS:\r
15638                 case AUTHTYPE_NT:\r
15639                         if (t.AuthData != NULL)\r
15640                         {\r
15641                                 AUTHRADIUS *ar = (AUTHRADIUS *)t.AuthData;\r
15642 \r
15643                                 // 外部認証サーバーの認証ユーザー名\r
15644                                 if (IsEmptyUniStr(ar->RadiusUsername) == false)\r
15645                                 {\r
15646                                         CtInsert(ct, _UU("CMD_UserGet_Column_RadiusAlias"), ar->RadiusUsername);\r
15647                                 }\r
15648                         }\r
15649                         break;\r
15650                 }\r
15651 \r
15652                 CtInsert(ct, L"---", L"---");\r
15653 \r
15654                 GetDateTimeStrEx64(tmp, sizeof(tmp), SystemToLocal64(t.CreatedTime), NULL);\r
15655                 CtInsert(ct, _UU("SM_USERINFO_CREATE"), tmp);\r
15656 \r
15657                 GetDateTimeStrEx64(tmp, sizeof(tmp), SystemToLocal64(t.UpdatedTime), NULL);\r
15658                 CtInsert(ct, _UU("SM_USERINFO_UPDATE"), tmp);\r
15659 \r
15660                 CmdInsertTrafficInfo(ct, &t.Traffic);\r
15661 \r
15662                 UniToStru(tmp, t.NumLogin);\r
15663                 CtInsert(ct, _UU("SM_USERINFO_NUMLOGIN"), tmp);\r
15664 \r
15665 \r
15666                 CtFree(ct, c);\r
15667 \r
15668                 if (t.Policy != NULL)\r
15669                 {\r
15670                         c->Write(c, L"");\r
15671                         c->Write(c, _UU("CMD_UserGet_Policy"));\r
15672                         PrintPolicy(c, t.Policy, false);\r
15673                 }\r
15674         }\r
15675 \r
15676         FreeRpcSetUser(&t);\r
15677 \r
15678         FreeParamValueList(o);\r
15679 \r
15680         return 0;\r
15681 }\r
15682 \r
15683 // ユーザーの認証方法を匿名認証に設定\r
15684 UINT PsUserAnonymousSet(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)\r
15685 {\r
15686         LIST *o;\r
15687         PS *ps = (PS *)param;\r
15688         UINT ret = 0;\r
15689         RPC_SET_USER t;\r
15690         // 指定できるパラメータ リスト\r
15691         PARAM args[] =\r
15692         {\r
15693                 // "name", prompt_proc, prompt_param, eval_proc, eval_param\r
15694                 {"[name]", CmdPrompt, _UU("CMD_UserCreate_Prompt_NAME"), CmdEvalNotEmpty, NULL},\r
15695         };\r
15696 \r
15697         // 仮想 HUB が選択されていない場合はエラー\r
15698         if (ps->HubName == NULL)\r
15699         {\r
15700                 c->Write(c, _UU("CMD_Hub_Not_Selected"));\r
15701                 return ERR_INVALID_PARAMETER;\r
15702         }\r
15703 \r
15704         o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));\r
15705         if (o == NULL)\r
15706         {\r
15707                 return ERR_INVALID_PARAMETER;\r
15708         }\r
15709 \r
15710         Zero(&t, sizeof(t));\r
15711         // ユーザーオブジェクトを取得\r
15712         StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);\r
15713         StrCpy(t.Name, sizeof(t.Name), GetParamStr(o, "[name]"));\r
15714 \r
15715         ret = ScGetUser(ps->Rpc, &t);\r
15716         if (ret != ERR_NO_ERROR)\r
15717         {\r
15718                 // エラー発生\r
15719                 CmdPrintError(c, ret);\r
15720                 FreeParamValueList(o);\r
15721                 return ret;\r
15722         }\r
15723 \r
15724         // 情報を更新する\r
15725         FreeAuthData(t.AuthType, t.AuthData);\r
15726 \r
15727         // 匿名認証に設定する\r
15728         t.AuthType = AUTHTYPE_ANONYMOUS;\r
15729         t.AuthData = NULL;\r
15730 \r
15731         // ユーザーオブジェクトを書き込み\r
15732         ret = ScSetUser(ps->Rpc, &t);\r
15733 \r
15734         if (ret != ERR_NO_ERROR)\r
15735         {\r
15736                 // エラー発生\r
15737                 CmdPrintError(c, ret);\r
15738                 FreeParamValueList(o);\r
15739                 return ret;\r
15740         }\r
15741 \r
15742         FreeRpcSetUser(&t);\r
15743 \r
15744         FreeParamValueList(o);\r
15745 \r
15746         return 0;\r
15747 }\r
15748 \r
15749 // ユーザーの認証方法をパスワード認証に設定しパスワードを設定\r
15750 UINT PsUserPasswordSet(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)\r
15751 {\r
15752         LIST *o;\r
15753         PS *ps = (PS *)param;\r
15754         UINT ret = 0;\r
15755         RPC_SET_USER t;\r
15756         // 指定できるパラメータ リスト\r
15757         PARAM args[] =\r
15758         {\r
15759                 // "name", prompt_proc, prompt_param, eval_proc, eval_param\r
15760                 {"[name]", CmdPrompt, _UU("CMD_UserCreate_Prompt_NAME"), CmdEvalNotEmpty, NULL},\r
15761                 {"PASSWORD", CmdPromptChoosePassword, NULL, NULL, NULL},\r
15762         };\r
15763 \r
15764         // 仮想 HUB が選択されていない場合はエラー\r
15765         if (ps->HubName == NULL)\r
15766         {\r
15767                 c->Write(c, _UU("CMD_Hub_Not_Selected"));\r
15768                 return ERR_INVALID_PARAMETER;\r
15769         }\r
15770 \r
15771         o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));\r
15772         if (o == NULL)\r
15773         {\r
15774                 return ERR_INVALID_PARAMETER;\r
15775         }\r
15776 \r
15777         Zero(&t, sizeof(t));\r
15778         // ユーザーオブジェクトを取得\r
15779         StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);\r
15780         StrCpy(t.Name, sizeof(t.Name), GetParamStr(o, "[name]"));\r
15781 \r
15782         ret = ScGetUser(ps->Rpc, &t);\r
15783         if (ret != ERR_NO_ERROR)\r
15784         {\r
15785                 // エラー発生\r
15786                 CmdPrintError(c, ret);\r
15787                 FreeParamValueList(o);\r
15788                 return ret;\r
15789         }\r
15790 \r
15791         // 情報を更新する\r
15792         FreeAuthData(t.AuthType, t.AuthData);\r
15793 \r
15794         {\r
15795                 AUTHPASSWORD *pw;\r
15796 \r
15797                 pw = NewPasswordAuthData(t.Name, GetParamStr(o, "PASSWORD"));\r
15798 \r
15799                 // パスワード認証に設定する\r
15800                 t.AuthType = AUTHTYPE_PASSWORD;\r
15801                 t.AuthData = pw;\r
15802         }\r
15803 \r
15804         // ユーザーオブジェクトを書き込み\r
15805         ret = ScSetUser(ps->Rpc, &t);\r
15806 \r
15807         if (ret != ERR_NO_ERROR)\r
15808         {\r
15809                 // エラー発生\r
15810                 CmdPrintError(c, ret);\r
15811                 FreeParamValueList(o);\r
15812                 return ret;\r
15813         }\r
15814 \r
15815         FreeRpcSetUser(&t);\r
15816 \r
15817         FreeParamValueList(o);\r
15818 \r
15819         return 0;\r
15820 }\r
15821 \r
15822 // ユーザーの認証方法を固有証明書認証に設定し証明書を設定\r
15823 UINT PsUserCertSet(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)\r
15824 {\r
15825         LIST *o;\r
15826         PS *ps = (PS *)param;\r
15827         UINT ret = 0;\r
15828         RPC_SET_USER t;\r
15829         X *x;\r
15830         // 指定できるパラメータ リスト\r
15831         PARAM args[] =\r
15832         {\r
15833                 // "name", prompt_proc, prompt_param, eval_proc, eval_param\r
15834                 {"[name]", CmdPrompt, _UU("CMD_UserCreate_Prompt_NAME"), CmdEvalNotEmpty, NULL},\r
15835                 {"LOADCERT", CmdPrompt, _UU("CMD_LOADCERTPATH"), CmdEvalIsFile, NULL},\r
15836         };\r
15837 \r
15838         // 仮想 HUB が選択されていない場合はエラー\r
15839         if (ps->HubName == NULL)\r
15840         {\r
15841                 c->Write(c, _UU("CMD_Hub_Not_Selected"));\r
15842                 return ERR_INVALID_PARAMETER;\r
15843         }\r
15844 \r
15845         o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));\r
15846         if (o == NULL)\r
15847         {\r
15848                 return ERR_INVALID_PARAMETER;\r
15849         }\r
15850 \r
15851         // 証明書を読み込む\r
15852         x = FileToX(GetParamStr(o, "LOADCERT"));\r
15853         if (x == NULL)\r
15854         {\r
15855                 c->Write(c, _UU("CMD_LOADCERT_FAILED"));\r
15856 \r
15857                 FreeParamValueList(o);\r
15858 \r
15859                 return ERR_INTERNAL_ERROR;\r
15860         }\r
15861 \r
15862         Zero(&t, sizeof(t));\r
15863         // ユーザーオブジェクトを取得\r
15864         StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);\r
15865         StrCpy(t.Name, sizeof(t.Name), GetParamStr(o, "[name]"));\r
15866 \r
15867         ret = ScGetUser(ps->Rpc, &t);\r
15868         if (ret != ERR_NO_ERROR)\r
15869         {\r
15870                 // エラー発生\r
15871                 CmdPrintError(c, ret);\r
15872                 FreeParamValueList(o);\r
15873                 FreeX(x);\r
15874                 return ret;\r
15875         }\r
15876 \r
15877         // 情報を更新する\r
15878         FreeAuthData(t.AuthType, t.AuthData);\r
15879 \r
15880         {\r
15881                 AUTHUSERCERT *c;\r
15882 \r
15883                 c = NewUserCertAuthData(x);\r
15884 \r
15885                 FreeX(x);\r
15886 \r
15887                 // パスワード認証に設定する\r
15888                 t.AuthType = AUTHTYPE_USERCERT;\r
15889                 t.AuthData = c;\r
15890         }\r
15891 \r
15892         // ユーザーオブジェクトを書き込み\r
15893         ret = ScSetUser(ps->Rpc, &t);\r
15894 \r
15895         if (ret != ERR_NO_ERROR)\r
15896         {\r
15897                 // エラー発生\r
15898                 CmdPrintError(c, ret);\r
15899                 FreeParamValueList(o);\r
15900                 return ret;\r
15901         }\r
15902 \r
15903         FreeRpcSetUser(&t);\r
15904 \r
15905         FreeParamValueList(o);\r
15906 \r
15907         return 0;\r
15908 }\r
15909 \r
15910 // 固有証明書認証のユーザーの登録されている証明書の取得\r
15911 UINT PsUserCertGet(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)\r
15912 {\r
15913         LIST *o;\r
15914         PS *ps = (PS *)param;\r
15915         UINT ret = 0;\r
15916         RPC_SET_USER t;\r
15917         AUTHUSERCERT *a;\r
15918         // 指定できるパラメータ リスト\r
15919         PARAM args[] =\r
15920         {\r
15921                 // "name", prompt_proc, prompt_param, eval_proc, eval_param\r
15922                 {"[name]", CmdPrompt, _UU("CMD_UserCreate_Prompt_NAME"), CmdEvalNotEmpty, NULL},\r
15923                 {"SAVECERT", CmdPrompt, _UU("CMD_SAVECERTPATH"), NULL, NULL},\r
15924         };\r
15925 \r
15926         // 仮想 HUB が選択されていない場合はエラー\r
15927         if (ps->HubName == NULL)\r
15928         {\r
15929                 c->Write(c, _UU("CMD_Hub_Not_Selected"));\r
15930                 return ERR_INVALID_PARAMETER;\r
15931         }\r
15932 \r
15933         o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));\r
15934         if (o == NULL)\r
15935         {\r
15936                 return ERR_INVALID_PARAMETER;\r
15937         }\r
15938 \r
15939         Zero(&t, sizeof(t));\r
15940         // ユーザーオブジェクトを取得\r
15941         StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);\r
15942         StrCpy(t.Name, sizeof(t.Name), GetParamStr(o, "[name]"));\r
15943 \r
15944         ret = ScGetUser(ps->Rpc, &t);\r
15945         if (ret != ERR_NO_ERROR)\r
15946         {\r
15947                 // エラー発生\r
15948                 CmdPrintError(c, ret);\r
15949                 FreeParamValueList(o);\r
15950                 return ret;\r
15951         }\r
15952 \r
15953         a = (AUTHUSERCERT *)t.AuthData;\r
15954 \r
15955         if (t.AuthType != AUTHTYPE_USERCERT || a == NULL || a->UserX == NULL)\r
15956         {\r
15957                 // ユーザーは固有証明書認証ではない\r
15958                 ret = ERR_INVALID_PARAMETER;\r
15959 \r
15960                 c->Write(c, _UU("CMD_UserCertGet_Not_Cert"));\r
15961         }\r
15962         else\r
15963         {\r
15964                 if (XToFile(a->UserX, GetParamStr(o, "SAVECERT"), true) == false)\r
15965                 {\r
15966                         c->Write(c, _UU("CMD_SAVECERT_FAILED"));\r
15967                 }\r
15968         }\r
15969 \r
15970         FreeRpcSetUser(&t);\r
15971 \r
15972         FreeParamValueList(o);\r
15973 \r
15974         return ret;\r
15975 }\r
15976 \r
15977 // ユーザーの認証方法を署名済み証明書認証に設定\r
15978 UINT PsUserSignedSet(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)\r
15979 {\r
15980         LIST *o;\r
15981         PS *ps = (PS *)param;\r
15982         UINT ret = 0;\r
15983         RPC_SET_USER t;\r
15984         // 指定できるパラメータ リスト\r
15985         PARAM args[] =\r
15986         {\r
15987                 // "name", prompt_proc, prompt_param, eval_proc, eval_param\r
15988                 {"[name]", CmdPrompt, _UU("CMD_UserCreate_Prompt_NAME"), CmdEvalNotEmpty, NULL},\r
15989                 {"CN", CmdPrompt, _UU("CMD_UserSignedSet_Prompt_CN"), NULL, NULL},\r
15990                 {"SERIAL", CmdPrompt, _UU("CMD_UserSignedSet_Prompt_SERIAL"), NULL, NULL},\r
15991         };\r
15992 \r
15993         // 仮想 HUB が選択されていない場合はエラー\r
15994         if (ps->HubName == NULL)\r
15995         {\r
15996                 c->Write(c, _UU("CMD_Hub_Not_Selected"));\r
15997                 return ERR_INVALID_PARAMETER;\r
15998         }\r
15999 \r
16000         o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));\r
16001         if (o == NULL)\r
16002         {\r
16003                 return ERR_INVALID_PARAMETER;\r
16004         }\r
16005 \r
16006         Zero(&t, sizeof(t));\r
16007         // ユーザーオブジェクトを取得\r
16008         StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);\r
16009         StrCpy(t.Name, sizeof(t.Name), GetParamStr(o, "[name]"));\r
16010 \r
16011         ret = ScGetUser(ps->Rpc, &t);\r
16012         if (ret != ERR_NO_ERROR)\r
16013         {\r
16014                 // エラー発生\r
16015                 CmdPrintError(c, ret);\r
16016                 FreeParamValueList(o);\r
16017                 return ret;\r
16018         }\r
16019 \r
16020         // 情報を更新する\r
16021         FreeAuthData(t.AuthType, t.AuthData);\r
16022 \r
16023         {\r
16024                 AUTHROOTCERT *c;\r
16025                 BUF *b;\r
16026                 X_SERIAL *serial = NULL;\r
16027 \r
16028                 b = StrToBin(GetParamStr(o, "SERIAL"));\r
16029 \r
16030                 if (b != NULL && b->Size >= 1)\r
16031                 {\r
16032                         serial = NewXSerial(b->Buf, b->Size);\r
16033                 }\r
16034 \r
16035                 FreeBuf(b);\r
16036 \r
16037                 c = NewRootCertAuthData(serial, GetParamUniStr(o, "CN"));\r
16038 \r
16039                 FreeXSerial(serial);\r
16040 \r
16041                 // パスワード認証に設定する\r
16042                 t.AuthType = AUTHTYPE_ROOTCERT;\r
16043                 t.AuthData = c;\r
16044         }\r
16045 \r
16046         // ユーザーオブジェクトを書き込み\r
16047         ret = ScSetUser(ps->Rpc, &t);\r
16048 \r
16049         if (ret != ERR_NO_ERROR)\r
16050         {\r
16051                 // エラー発生\r
16052                 CmdPrintError(c, ret);\r
16053                 FreeParamValueList(o);\r
16054                 return ret;\r
16055         }\r
16056 \r
16057         FreeRpcSetUser(&t);\r
16058 \r
16059         FreeParamValueList(o);\r
16060 \r
16061         return 0;\r
16062 }\r
16063 \r
16064 // ユーザーの認証方法を Radius 認証に設定\r
16065 UINT PsUserRadiusSet(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)\r
16066 {\r
16067         LIST *o;\r
16068         PS *ps = (PS *)param;\r
16069         UINT ret = 0;\r
16070         RPC_SET_USER t;\r
16071         // 指定できるパラメータ リスト\r
16072         PARAM args[] =\r
16073         {\r
16074                 // "name", prompt_proc, prompt_param, eval_proc, eval_param\r
16075                 {"[name]", CmdPrompt, _UU("CMD_UserCreate_Prompt_NAME"), CmdEvalNotEmpty, NULL},\r
16076                 {"ALIAS", CmdPrompt, _UU("CMD_UserRadiusSet_Prompt_ALIAS"), NULL, NULL},\r
16077         };\r
16078 \r
16079         // 仮想 HUB が選択されていない場合はエラー\r
16080         if (ps->HubName == NULL)\r
16081         {\r
16082                 c->Write(c, _UU("CMD_Hub_Not_Selected"));\r
16083                 return ERR_INVALID_PARAMETER;\r
16084         }\r
16085 \r
16086         o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));\r
16087         if (o == NULL)\r
16088         {\r
16089                 return ERR_INVALID_PARAMETER;\r
16090         }\r
16091 \r
16092         Zero(&t, sizeof(t));\r
16093         // ユーザーオブジェクトを取得\r
16094         StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);\r
16095         StrCpy(t.Name, sizeof(t.Name), GetParamStr(o, "[name]"));\r
16096 \r
16097         ret = ScGetUser(ps->Rpc, &t);\r
16098         if (ret != ERR_NO_ERROR)\r
16099         {\r
16100                 // エラー発生\r
16101                 CmdPrintError(c, ret);\r
16102                 FreeParamValueList(o);\r
16103                 return ret;\r
16104         }\r
16105 \r
16106         // 情報を更新する\r
16107         FreeAuthData(t.AuthType, t.AuthData);\r
16108 \r
16109         {\r
16110                 AUTHRADIUS *a;\r
16111 \r
16112                 a = NewRadiusAuthData(GetParamUniStr(o, "ALIAS"));\r
16113 \r
16114                 // Radius 認証に設定する\r
16115                 t.AuthType = AUTHTYPE_RADIUS;\r
16116                 t.AuthData = a;\r
16117         }\r
16118 \r
16119         // ユーザーオブジェクトを書き込み\r
16120         ret = ScSetUser(ps->Rpc, &t);\r
16121 \r
16122         if (ret != ERR_NO_ERROR)\r
16123         {\r
16124                 // エラー発生\r
16125                 CmdPrintError(c, ret);\r
16126                 FreeParamValueList(o);\r
16127                 return ret;\r
16128         }\r
16129 \r
16130         FreeRpcSetUser(&t);\r
16131 \r
16132         FreeParamValueList(o);\r
16133 \r
16134         return 0;\r
16135 }\r
16136 \r
16137 // ユーザーの認証方法を NT ドメイン認証に設定\r
16138 UINT PsUserNTLMSet(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)\r
16139 {\r
16140         LIST *o;\r
16141         PS *ps = (PS *)param;\r
16142         UINT ret = 0;\r
16143         RPC_SET_USER t;\r
16144         // 指定できるパラメータ リスト\r
16145         PARAM args[] =\r
16146         {\r
16147                 // "name", prompt_proc, prompt_param, eval_proc, eval_param\r
16148                 {"[name]", CmdPrompt, _UU("CMD_UserCreate_Prompt_NAME"), CmdEvalNotEmpty, NULL},\r
16149                 {"ALIAS", CmdPrompt, _UU("CMD_UserRadiusSet_Prompt_ALIAS"), NULL, NULL},\r
16150         };\r
16151 \r
16152         // 仮想 HUB が選択されていない場合はエラー\r
16153         if (ps->HubName == NULL)\r
16154         {\r
16155                 c->Write(c, _UU("CMD_Hub_Not_Selected"));\r
16156                 return ERR_INVALID_PARAMETER;\r
16157         }\r
16158 \r
16159         o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));\r
16160         if (o == NULL)\r
16161         {\r
16162                 return ERR_INVALID_PARAMETER;\r
16163         }\r
16164 \r
16165         Zero(&t, sizeof(t));\r
16166         // ユーザーオブジェクトを取得\r
16167         StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);\r
16168         StrCpy(t.Name, sizeof(t.Name), GetParamStr(o, "[name]"));\r
16169 \r
16170         ret = ScGetUser(ps->Rpc, &t);\r
16171         if (ret != ERR_NO_ERROR)\r
16172         {\r
16173                 // エラー発生\r
16174                 CmdPrintError(c, ret);\r
16175                 FreeParamValueList(o);\r
16176                 return ret;\r
16177         }\r
16178 \r
16179         // 情報を更新する\r
16180         FreeAuthData(t.AuthType, t.AuthData);\r
16181 \r
16182         {\r
16183                 AUTHRADIUS *a;\r
16184 \r
16185                 a = NewRadiusAuthData(GetParamUniStr(o, "ALIAS"));\r
16186 \r
16187                 // NT ドメイン認証に設定する\r
16188                 t.AuthType = AUTHTYPE_NT;\r
16189                 t.AuthData = a;\r
16190         }\r
16191 \r
16192         // ユーザーオブジェクトを書き込み\r
16193         ret = ScSetUser(ps->Rpc, &t);\r
16194 \r
16195         if (ret != ERR_NO_ERROR)\r
16196         {\r
16197                 // エラー発生\r
16198                 CmdPrintError(c, ret);\r
16199                 FreeParamValueList(o);\r
16200                 return ret;\r
16201         }\r
16202 \r
16203         FreeRpcSetUser(&t);\r
16204 \r
16205         FreeParamValueList(o);\r
16206 \r
16207         return 0;\r
16208 }\r
16209 \r
16210 // ユーザーのセキュリティ ポリシーの削除\r
16211 UINT PsUserPolicyRemove(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)\r
16212 {\r
16213         LIST *o;\r
16214         PS *ps = (PS *)param;\r
16215         UINT ret = 0;\r
16216         RPC_SET_USER t;\r
16217         // 指定できるパラメータ リスト\r
16218         PARAM args[] =\r
16219         {\r
16220                 // "name", prompt_proc, prompt_param, eval_proc, eval_param\r
16221                 {"[name]", CmdPrompt, _UU("CMD_UserCreate_Prompt_NAME"), CmdEvalNotEmpty, NULL},\r
16222         };\r
16223 \r
16224         // 仮想 HUB が選択されていない場合はエラー\r
16225         if (ps->HubName == NULL)\r
16226         {\r
16227                 c->Write(c, _UU("CMD_Hub_Not_Selected"));\r
16228                 return ERR_INVALID_PARAMETER;\r
16229         }\r
16230 \r
16231         o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));\r
16232         if (o == NULL)\r
16233         {\r
16234                 return ERR_INVALID_PARAMETER;\r
16235         }\r
16236 \r
16237         Zero(&t, sizeof(t));\r
16238         // ユーザーオブジェクトを取得\r
16239         StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);\r
16240         StrCpy(t.Name, sizeof(t.Name), GetParamStr(o, "[name]"));\r
16241 \r
16242         ret = ScGetUser(ps->Rpc, &t);\r
16243         if (ret != ERR_NO_ERROR)\r
16244         {\r
16245                 // エラー発生\r
16246                 CmdPrintError(c, ret);\r
16247                 FreeParamValueList(o);\r
16248                 return ret;\r
16249         }\r
16250 \r
16251         // 更新\r
16252         if (t.Policy != NULL)\r
16253         {\r
16254                 Free(t.Policy);\r
16255                 t.Policy = NULL;\r
16256         }\r
16257 \r
16258         // ユーザーオブジェクトを書き込み\r
16259         ret = ScSetUser(ps->Rpc, &t);\r
16260 \r
16261         if (ret != ERR_NO_ERROR)\r
16262         {\r
16263                 // エラー発生\r
16264                 CmdPrintError(c, ret);\r
16265                 FreeParamValueList(o);\r
16266                 return ret;\r
16267         }\r
16268 \r
16269         FreeRpcSetUser(&t);\r
16270 \r
16271         FreeParamValueList(o);\r
16272 \r
16273         return 0;\r
16274 }\r
16275 \r
16276 // ユーザーのセキュリティ ポリシーの設定\r
16277 UINT PsUserPolicySet(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)\r
16278 {\r
16279         LIST *o;\r
16280         PS *ps = (PS *)param;\r
16281         UINT ret = 0;\r
16282         RPC_SET_USER t;\r
16283         // 指定できるパラメータ リスト\r
16284         PARAM args[] =\r
16285         {\r
16286                 // "name", prompt_proc, prompt_param, eval_proc, eval_param\r
16287                 {"[name]", CmdPrompt, _UU("CMD_UserCreate_Prompt_NAME"), CmdEvalNotEmpty, NULL},\r
16288                 {"NAME", CmdPrompt, _UU("CMD_CascadePolicySet_PROMPT_POLNAME"), CmdEvalNotEmpty, NULL},\r
16289                 {"VALUE", CmdPrompt, _UU("CMD_CascadePolicySet_PROMPT_POLVALUE"), CmdEvalNotEmpty, NULL},\r
16290         };\r
16291 \r
16292         // 仮想 HUB が選択されていない場合はエラー\r
16293         if (ps->HubName == NULL)\r
16294         {\r
16295                 c->Write(c, _UU("CMD_Hub_Not_Selected"));\r
16296                 return ERR_INVALID_PARAMETER;\r
16297         }\r
16298 \r
16299         o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));\r
16300         if (o == NULL)\r
16301         {\r
16302                 return ERR_INVALID_PARAMETER;\r
16303         }\r
16304 \r
16305         Zero(&t, sizeof(t));\r
16306         // ユーザーオブジェクトを取得\r
16307         StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);\r
16308         StrCpy(t.Name, sizeof(t.Name), GetParamStr(o, "[name]"));\r
16309 \r
16310         ret = ScGetUser(ps->Rpc, &t);\r
16311         if (ret != ERR_NO_ERROR)\r
16312         {\r
16313                 // エラー発生\r
16314                 CmdPrintError(c, ret);\r
16315                 FreeParamValueList(o);\r
16316                 return ret;\r
16317         }\r
16318 \r
16319         // 更新\r
16320         if (t.Policy == NULL)\r
16321         {\r
16322                 t.Policy = ClonePolicy(GetDefaultPolicy());\r
16323         }\r
16324 \r
16325         // 編集\r
16326         if (EditPolicy(c, t.Policy, GetParamStr(o, "NAME"), GetParamStr(o, "VALUE"), false) == false)\r
16327         {\r
16328                 ret = ERR_INVALID_PARAMETER;\r
16329         }\r
16330         else\r
16331         {\r
16332                 // ユーザーオブジェクトを書き込み\r
16333                 ret = ScSetUser(ps->Rpc, &t);\r
16334 \r
16335                 if (ret != ERR_NO_ERROR)\r
16336                 {\r
16337                         // エラー発生\r
16338                         CmdPrintError(c, ret);\r
16339                         FreeParamValueList(o);\r
16340                         return ret;\r
16341                 }\r
16342         }\r
16343 \r
16344         FreeRpcSetUser(&t);\r
16345 \r
16346         FreeParamValueList(o);\r
16347 \r
16348         return ret;\r
16349 }\r
16350 \r
16351 // 文字列を日時に変換\r
16352 UINT64 StrToDateTime64(char *str)\r
16353 {\r
16354         UINT64 ret = 0;\r
16355         TOKEN_LIST *t;\r
16356         UINT a, b, c, d, e, f;\r
16357         // 引数チェック\r
16358         if (str == NULL)\r
16359         {\r
16360                 return INFINITE;\r
16361         }\r
16362 \r
16363         if (IsEmptyStr(str) || StrCmpi(str, "none") == 0)\r
16364         {\r
16365                 return 0;\r
16366         }\r
16367 \r
16368         t = ParseToken(str, ":/,. \"");\r
16369         if (t->NumTokens != 6)\r
16370         {\r
16371                 FreeToken(t);\r
16372                 return INFINITE;\r
16373         }\r
16374 \r
16375         a = ToInt(t->Token[0]);\r
16376         b = ToInt(t->Token[1]);\r
16377         c = ToInt(t->Token[2]);\r
16378         d = ToInt(t->Token[3]);\r
16379         e = ToInt(t->Token[4]);\r
16380         f = ToInt(t->Token[5]);\r
16381 \r
16382         ret = INFINITE;\r
16383 \r
16384         if (a >= 1000 && a <= 9999 && b >= 1 && b <= 12 && c >= 1 && c <= 31 &&\r
16385                 d >= 0 && d <= 23 && e >= 0 && e <= 59 && f >= 0 && f <= 59)\r
16386         {\r
16387                 SYSTEMTIME t;\r
16388 \r
16389                 Zero(&t, sizeof(t));\r
16390                 t.wYear = a;\r
16391                 t.wMonth = b;\r
16392                 t.wDay = c;\r
16393                 t.wHour = d;\r
16394                 t.wMinute = e;\r
16395                 t.wSecond = f;\r
16396 \r
16397                 ret = SystemToUINT64(&t);\r
16398         }\r
16399 \r
16400         FreeToken(t);\r
16401 \r
16402         return ret;\r
16403 }\r
16404 \r
16405 // 日時文字列の評価\r
16406 bool CmdEvalDateTime(CONSOLE *c, wchar_t *str, void *param)\r
16407 {\r
16408         UINT64 ret;\r
16409         char tmp[MAX_SIZE];\r
16410         // 引数チェック\r
16411         if (c == NULL || str == NULL)\r
16412         {\r
16413                 return false;\r
16414         }\r
16415 \r
16416         UniToStr(tmp, sizeof(tmp), str);\r
16417 \r
16418         ret = StrToDateTime64(tmp);\r
16419 \r
16420         if (ret == INFINITE)\r
16421         {\r
16422                 c->Write(c, _UU("CMD_EVAL_DATE_TIME_FAILED"));\r
16423                 return false;\r
16424         }\r
16425 \r
16426         return true;\r
16427 }\r
16428 \r
16429 // ユーザーの有効期限の設定\r
16430 UINT PsUserExpiresSet(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)\r
16431 {\r
16432         LIST *o;\r
16433         PS *ps = (PS *)param;\r
16434         UINT ret = 0;\r
16435         RPC_SET_USER t;\r
16436         UINT64 expires;\r
16437         // 指定できるパラメータ リスト\r
16438         PARAM args[] =\r
16439         {\r
16440                 // "name", prompt_proc, prompt_param, eval_proc, eval_param\r
16441                 {"[name]", CmdPrompt, _UU("CMD_UserCreate_Prompt_NAME"), CmdEvalNotEmpty, NULL},\r
16442                 {"EXPIRES", CmdPrompt, _UU("CMD_UserExpiresSet_Prompt_EXPIRES"), CmdEvalDateTime, NULL},\r
16443         };\r
16444 \r
16445         // 仮想 HUB が選択されていない場合はエラー\r
16446         if (ps->HubName == NULL)\r
16447         {\r
16448                 c->Write(c, _UU("CMD_Hub_Not_Selected"));\r
16449                 return ERR_INVALID_PARAMETER;\r
16450         }\r
16451 \r
16452         o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));\r
16453         if (o == NULL)\r
16454         {\r
16455                 return ERR_INVALID_PARAMETER;\r
16456         }\r
16457 \r
16458         Zero(&t, sizeof(t));\r
16459         // ユーザーオブジェクトを取得\r
16460         StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);\r
16461         StrCpy(t.Name, sizeof(t.Name), GetParamStr(o, "[name]"));\r
16462 \r
16463         ret = ScGetUser(ps->Rpc, &t);\r
16464         if (ret != ERR_NO_ERROR)\r
16465         {\r
16466                 // エラー発生\r
16467                 CmdPrintError(c, ret);\r
16468                 FreeParamValueList(o);\r
16469                 return ret;\r
16470         }\r
16471 \r
16472         // 情報を更新する\r
16473         expires = StrToDateTime64(GetParamStr(o, "EXPIRES"));\r
16474 \r
16475         if (expires != 0)\r
16476         {\r
16477                 expires = LocalToSystem64(expires);\r
16478         }\r
16479 \r
16480         t.ExpireTime = expires;\r
16481 \r
16482         // ユーザーオブジェクトを書き込み\r
16483         ret = ScSetUser(ps->Rpc, &t);\r
16484 \r
16485         if (ret != ERR_NO_ERROR)\r
16486         {\r
16487                 // エラー発生\r
16488                 CmdPrintError(c, ret);\r
16489                 FreeParamValueList(o);\r
16490                 return ret;\r
16491         }\r
16492 \r
16493         FreeRpcSetUser(&t);\r
16494 \r
16495         FreeParamValueList(o);\r
16496 \r
16497         return 0;\r
16498 }\r
16499 \r
16500 // グループ一覧の取得\r
16501 UINT PsGroupList(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)\r
16502 {\r
16503         LIST *o;\r
16504         PS *ps = (PS *)param;\r
16505         UINT ret = 0;\r
16506         RPC_ENUM_GROUP t;\r
16507 \r
16508         o = ParseCommandList(c, cmd_name, str, NULL, 0);\r
16509         if (o == NULL)\r
16510         {\r
16511                 return ERR_INVALID_PARAMETER;\r
16512         }\r
16513 \r
16514         // 仮想 HUB が選択されていない場合はエラー\r
16515         if (ps->HubName == NULL)\r
16516         {\r
16517                 c->Write(c, _UU("CMD_Hub_Not_Selected"));\r
16518                 return ERR_INVALID_PARAMETER;\r
16519         }\r
16520 \r
16521         Zero(&t, sizeof(t));\r
16522         StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);\r
16523 \r
16524         // RPC 呼び出し\r
16525         ret = ScEnumGroup(ps->Rpc, &t);\r
16526 \r
16527         if (ret != ERR_NO_ERROR)\r
16528         {\r
16529                 // エラー発生\r
16530                 CmdPrintError(c, ret);\r
16531                 FreeParamValueList(o);\r
16532                 return ret;\r
16533         }\r
16534         else\r
16535         {\r
16536                 CT *ct = CtNew();\r
16537                 UINT i;\r
16538 \r
16539                 CtInsertColumn(ct, _UU("SM_GROUPLIST_NAME"), false);\r
16540                 CtInsertColumn(ct, _UU("SM_GROUPLIST_REALNAME"), false);\r
16541                 CtInsertColumn(ct, _UU("SM_GROUPLIST_NOTE"), false);\r
16542                 CtInsertColumn(ct, _UU("SM_GROUPLIST_NUMUSERS"), false);\r
16543 \r
16544                 for (i = 0;i < t.NumGroup;i++)\r
16545                 {\r
16546                         wchar_t tmp1[MAX_SIZE];\r
16547                         wchar_t tmp2[MAX_SIZE];\r
16548                         RPC_ENUM_GROUP_ITEM *e = &t.Groups[i];\r
16549 \r
16550                         StrToUni(tmp1, sizeof(tmp1), e->Name);\r
16551                         UniToStru(tmp2, e->NumUsers);\r
16552 \r
16553                         CtInsert(ct, tmp1, e->Realname, e->Note, tmp2);\r
16554                 }\r
16555 \r
16556                 CtFreeEx(ct, c, true);\r
16557         }\r
16558 \r
16559         FreeRpcEnumGroup(&t);\r
16560 \r
16561         FreeParamValueList(o);\r
16562 \r
16563         return 0;\r
16564 }\r
16565 \r
16566 // グループの作成\r
16567 UINT PsGroupCreate(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)\r
16568 {\r
16569         LIST *o;\r
16570         PS *ps = (PS *)param;\r
16571         UINT ret = 0;\r
16572         RPC_SET_GROUP t;\r
16573         // 指定できるパラメータ リスト\r
16574         PARAM args[] =\r
16575         {\r
16576                 // "name", prompt_proc, prompt_param, eval_proc, eval_param\r
16577                 {"[name]", CmdPrompt, _UU("CMD_GroupCreate_Prompt_NAME"), CmdEvalNotEmpty, NULL},\r
16578                 {"REALNAME", CmdPrompt, _UU("CMD_GroupCreate_Prompt_REALNAME"), NULL, NULL},\r
16579                 {"NOTE", CmdPrompt, _UU("CMD_GroupCreate_Prompt_NOTE"), NULL, NULL},\r
16580         };\r
16581 \r
16582         // 仮想 HUB が選択されていない場合はエラー\r
16583         if (ps->HubName == NULL)\r
16584         {\r
16585                 c->Write(c, _UU("CMD_Hub_Not_Selected"));\r
16586                 return ERR_INVALID_PARAMETER;\r
16587         }\r
16588 \r
16589         o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));\r
16590         if (o == NULL)\r
16591         {\r
16592                 return ERR_INVALID_PARAMETER;\r
16593         }\r
16594 \r
16595         Zero(&t, sizeof(t));\r
16596         StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);\r
16597         StrCpy(t.Name, sizeof(t.Name), GetParamStr(o, "[name]"));\r
16598         UniStrCpy(t.Realname, sizeof(t.Realname), GetParamUniStr(o, "REALNAME"));\r
16599         UniStrCpy(t.Note, sizeof(t.Note), GetParamUniStr(o, "NOTE"));\r
16600 \r
16601         // RPC 呼び出し\r
16602         ret = ScCreateGroup(ps->Rpc, &t);\r
16603 \r
16604         if (ret != ERR_NO_ERROR)\r
16605         {\r
16606                 // エラー発生\r
16607                 CmdPrintError(c, ret);\r
16608                 FreeParamValueList(o);\r
16609                 return ret;\r
16610         }\r
16611 \r
16612         FreeRpcSetGroup(&t);\r
16613 \r
16614         FreeParamValueList(o);\r
16615 \r
16616         return 0;\r
16617 }\r
16618 \r
16619 // グループ情報の設定\r
16620 UINT PsGroupSet(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)\r
16621 {\r
16622         LIST *o;\r
16623         PS *ps = (PS *)param;\r
16624         UINT ret = 0;\r
16625         RPC_SET_GROUP t;\r
16626         // 指定できるパラメータ リスト\r
16627         PARAM args[] =\r
16628         {\r
16629                 // "name", prompt_proc, prompt_param, eval_proc, eval_param\r
16630                 {"[name]", CmdPrompt, _UU("CMD_GroupCreate_Prompt_NAME"), CmdEvalNotEmpty, NULL},\r
16631                 {"REALNAME", CmdPrompt, _UU("CMD_GroupCreate_Prompt_REALNAME"), NULL, NULL},\r
16632                 {"NOTE", CmdPrompt, _UU("CMD_GroupCreate_Prompt_NOTE"), NULL, NULL},\r
16633         };\r
16634 \r
16635         // 仮想 HUB が選択されていない場合はエラー\r
16636         if (ps->HubName == NULL)\r
16637         {\r
16638                 c->Write(c, _UU("CMD_Hub_Not_Selected"));\r
16639                 return ERR_INVALID_PARAMETER;\r
16640         }\r
16641 \r
16642         o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));\r
16643         if (o == NULL)\r
16644         {\r
16645                 return ERR_INVALID_PARAMETER;\r
16646         }\r
16647 \r
16648         Zero(&t, sizeof(t));\r
16649         StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);\r
16650         StrCpy(t.Name, sizeof(t.Name), GetParamStr(o, "[name]"));\r
16651 \r
16652         // RPC 呼び出し\r
16653         ret = ScGetGroup(ps->Rpc, &t);\r
16654 \r
16655         if (ret != ERR_NO_ERROR)\r
16656         {\r
16657                 // エラー発生\r
16658                 CmdPrintError(c, ret);\r
16659                 FreeParamValueList(o);\r
16660                 return ret;\r
16661         }\r
16662 \r
16663         // 情報更新\r
16664         UniStrCpy(t.Realname, sizeof(t.Realname), GetParamUniStr(o, "REALNAME"));\r
16665         UniStrCpy(t.Note, sizeof(t.Note), GetParamUniStr(o, "NOTE"));\r
16666 \r
16667         // RPC 呼び出し\r
16668         ret = ScSetGroup(ps->Rpc, &t);\r
16669 \r
16670         if (ret != ERR_NO_ERROR)\r
16671         {\r
16672                 // エラー発生\r
16673                 CmdPrintError(c, ret);\r
16674                 FreeParamValueList(o);\r
16675                 return ret;\r
16676         }\r
16677 \r
16678         FreeRpcSetGroup(&t);\r
16679 \r
16680         FreeParamValueList(o);\r
16681 \r
16682         return 0;\r
16683 }\r
16684 \r
16685 // グループの削除\r
16686 UINT PsGroupDelete(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)\r
16687 {\r
16688         LIST *o;\r
16689         PS *ps = (PS *)param;\r
16690         UINT ret = 0;\r
16691         RPC_DELETE_USER t;\r
16692         // 指定できるパラメータ リスト\r
16693         PARAM args[] =\r
16694         {\r
16695                 // "name", prompt_proc, prompt_param, eval_proc, eval_param\r
16696                 {"[name]", CmdPrompt, _UU("CMD_GroupCreate_Prompt_NAME"), CmdEvalNotEmpty, NULL},\r
16697         };\r
16698 \r
16699         // 仮想 HUB が選択されていない場合はエラー\r
16700         if (ps->HubName == NULL)\r
16701         {\r
16702                 c->Write(c, _UU("CMD_Hub_Not_Selected"));\r
16703                 return ERR_INVALID_PARAMETER;\r
16704         }\r
16705 \r
16706         o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));\r
16707         if (o == NULL)\r
16708         {\r
16709                 return ERR_INVALID_PARAMETER;\r
16710         }\r
16711 \r
16712         Zero(&t, sizeof(t));\r
16713         StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);\r
16714         StrCpy(t.Name, sizeof(t.Name), GetParamStr(o, "[name]"));\r
16715 \r
16716         // RPC 呼び出し\r
16717         ret = ScDeleteGroup(ps->Rpc, &t);\r
16718 \r
16719         if (ret != ERR_NO_ERROR)\r
16720         {\r
16721                 // エラー発生\r
16722                 CmdPrintError(c, ret);\r
16723                 FreeParamValueList(o);\r
16724                 return ret;\r
16725         }\r
16726 \r
16727         FreeParamValueList(o);\r
16728 \r
16729         return 0;\r
16730 }\r
16731 \r
16732 // グループ情報と所属しているユーザー一覧の取得\r
16733 UINT PsGroupGet(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)\r
16734 {\r
16735         LIST *o;\r
16736         PS *ps = (PS *)param;\r
16737         UINT ret = 0;\r
16738         RPC_SET_GROUP t;\r
16739         // 指定できるパラメータ リスト\r
16740         PARAM args[] =\r
16741         {\r
16742                 // "name", prompt_proc, prompt_param, eval_proc, eval_param\r
16743                 {"[name]", CmdPrompt, _UU("CMD_GroupCreate_Prompt_NAME"), CmdEvalNotEmpty, NULL},\r
16744         };\r
16745 \r
16746         // 仮想 HUB が選択されていない場合はエラー\r
16747         if (ps->HubName == NULL)\r
16748         {\r
16749                 c->Write(c, _UU("CMD_Hub_Not_Selected"));\r
16750                 return ERR_INVALID_PARAMETER;\r
16751         }\r
16752 \r
16753         o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));\r
16754         if (o == NULL)\r
16755         {\r
16756                 return ERR_INVALID_PARAMETER;\r
16757         }\r
16758 \r
16759         Zero(&t, sizeof(t));\r
16760         StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);\r
16761         StrCpy(t.Name, sizeof(t.Name), GetParamStr(o, "[name]"));\r
16762 \r
16763         // RPC 呼び出し\r
16764         ret = ScGetGroup(ps->Rpc, &t);\r
16765 \r
16766         if (ret != ERR_NO_ERROR)\r
16767         {\r
16768                 // エラー発生\r
16769                 CmdPrintError(c, ret);\r
16770                 FreeParamValueList(o);\r
16771                 return ret;\r
16772         }\r
16773         else\r
16774         {\r
16775                 wchar_t tmp[MAX_SIZE];\r
16776                 char groupname[MAX_USERNAME_LEN + 1];\r
16777                 CT *ct = CtNewStandard();\r
16778 \r
16779                 StrCpy(groupname, sizeof(groupname), t.Name);\r
16780 \r
16781                 StrToUni(tmp, sizeof(tmp), t.Name);\r
16782                 CtInsert(ct, _UU("CMD_GroupGet_Column_NAME"), tmp);\r
16783                 CtInsert(ct, _UU("CMD_GroupGet_Column_REALNAME"), t.Realname);\r
16784                 CtInsert(ct, _UU("CMD_GroupGet_Column_NOTE"), t.Note);\r
16785 \r
16786                 CtFree(ct, c);\r
16787 \r
16788                 if (t.Policy != NULL)\r
16789                 {\r
16790                         c->Write(c, L"");\r
16791                         c->Write(c, _UU("CMD_GroupGet_Column_POLICY"));\r
16792 \r
16793                         PrintPolicy(c, t.Policy, false);\r
16794                 }\r
16795 \r
16796                 {\r
16797                         RPC_ENUM_USER t;\r
16798                         bool b = false;\r
16799 \r
16800                         Zero(&t, sizeof(t));\r
16801 \r
16802                         StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);\r
16803 \r
16804                         if (ScEnumUser(ps->Rpc, &t) == ERR_NO_ERROR)\r
16805                         {\r
16806                                 UINT i;\r
16807 \r
16808                                 for (i = 0;i < t.NumUser;i++)\r
16809                                 {\r
16810                                         RPC_ENUM_USER_ITEM *u = &t.Users[i];\r
16811 \r
16812                                         if (StrCmpi(u->GroupName, groupname) == 0)\r
16813                                         {\r
16814                                                 if (b == false)\r
16815                                                 {\r
16816                                                         b = true;\r
16817                                                         c->Write(c, L"");\r
16818                                                         c->Write(c, _UU("CMD_GroupGet_Column_MEMBERS"));\r
16819                                                 }\r
16820 \r
16821                                                 UniFormat(tmp, sizeof(tmp), L" %S", u->Name);\r
16822                                                 c->Write(c, tmp);\r
16823                                         }\r
16824                                 }\r
16825                                 FreeRpcEnumUser(&t);\r
16826 \r
16827                                 if (b)\r
16828                                 {\r
16829                                         c->Write(c, L"");\r
16830                                 }\r
16831                         }\r
16832                 }\r
16833 \r
16834         }\r
16835 \r
16836         FreeRpcSetGroup(&t);\r
16837 \r
16838         FreeParamValueList(o);\r
16839 \r
16840         return 0;\r
16841 }\r
16842 \r
16843 // グループにユーザーを追加\r
16844 UINT PsGroupJoin(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)\r
16845 {\r
16846         LIST *o;\r
16847         PS *ps = (PS *)param;\r
16848         UINT ret = 0;\r
16849         RPC_SET_USER t;\r
16850         // 指定できるパラメータ リスト\r
16851         PARAM args[] =\r
16852         {\r
16853                 // "name", prompt_proc, prompt_param, eval_proc, eval_param\r
16854                 {"[name]", CmdPrompt, _UU("CMD_GroupCreate_Prompt_NAME"), CmdEvalNotEmpty, NULL},\r
16855                 {"USERNAME", CmdPrompt, _UU("CMD_GroupJoin_Prompt_USERNAME"), CmdEvalNotEmpty, NULL},\r
16856         };\r
16857 \r
16858         // 仮想 HUB が選択されていない場合はエラー\r
16859         if (ps->HubName == NULL)\r
16860         {\r
16861                 c->Write(c, _UU("CMD_Hub_Not_Selected"));\r
16862                 return ERR_INVALID_PARAMETER;\r
16863         }\r
16864 \r
16865         o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));\r
16866         if (o == NULL)\r
16867         {\r
16868                 return ERR_INVALID_PARAMETER;\r
16869         }\r
16870 \r
16871         Zero(&t, sizeof(t));\r
16872         StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);\r
16873         StrCpy(t.Name, sizeof(t.Name), GetParamStr(o, "USERNAME"));\r
16874 \r
16875         // RPC 呼び出し\r
16876         ret = ScGetUser(ps->Rpc, &t);\r
16877 \r
16878         if (ret != ERR_NO_ERROR)\r
16879         {\r
16880                 // エラー発生\r
16881                 CmdPrintError(c, ret);\r
16882                 FreeParamValueList(o);\r
16883                 return ret;\r
16884         }\r
16885         else\r
16886         {\r
16887                 // グループの更新\r
16888                 StrCpy(t.GroupName, sizeof(t.GroupName), GetParamStr(o, "[name]"));\r
16889 \r
16890                 ret = ScSetUser(ps->Rpc, &t);\r
16891 \r
16892                 if (ret != ERR_NO_ERROR)\r
16893                 {\r
16894                         // エラー発生\r
16895                         CmdPrintError(c, ret);\r
16896                         FreeParamValueList(o);\r
16897                         return ret;\r
16898                 }\r
16899         }\r
16900 \r
16901         FreeRpcSetUser(&t);\r
16902 \r
16903         FreeParamValueList(o);\r
16904 \r
16905         return 0;\r
16906 }\r
16907 \r
16908 // グループからユーザーを削除\r
16909 UINT PsGroupUnjoin(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)\r
16910 {\r
16911         LIST *o;\r
16912         PS *ps = (PS *)param;\r
16913         UINT ret = 0;\r
16914         RPC_SET_USER t;\r
16915         // 指定できるパラメータ リスト\r
16916         PARAM args[] =\r
16917         {\r
16918                 // "name", prompt_proc, prompt_param, eval_proc, eval_param\r
16919                 {"[name]", CmdPrompt, _UU("CMD_GroupUnjoin_Prompt_name"), CmdEvalNotEmpty, NULL},\r
16920         };\r
16921 \r
16922         // 仮想 HUB が選択されていない場合はエラー\r
16923         if (ps->HubName == NULL)\r
16924         {\r
16925                 c->Write(c, _UU("CMD_Hub_Not_Selected"));\r
16926                 return ERR_INVALID_PARAMETER;\r
16927         }\r
16928 \r
16929         o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));\r
16930         if (o == NULL)\r
16931         {\r
16932                 return ERR_INVALID_PARAMETER;\r
16933         }\r
16934 \r
16935         Zero(&t, sizeof(t));\r
16936         StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);\r
16937         StrCpy(t.Name, sizeof(t.Name), GetParamStr(o, "[name]"));\r
16938 \r
16939         // RPC 呼び出し\r
16940         ret = ScGetUser(ps->Rpc, &t);\r
16941 \r
16942         if (ret != ERR_NO_ERROR)\r
16943         {\r
16944                 // エラー発生\r
16945                 CmdPrintError(c, ret);\r
16946                 FreeParamValueList(o);\r
16947                 return ret;\r
16948         }\r
16949         else\r
16950         {\r
16951                 // グループの更新\r
16952                 StrCpy(t.GroupName, sizeof(t.GroupName), "");\r
16953 \r
16954                 ret = ScSetUser(ps->Rpc, &t);\r
16955 \r
16956                 if (ret != ERR_NO_ERROR)\r
16957                 {\r
16958                         // エラー発生\r
16959                         CmdPrintError(c, ret);\r
16960                         FreeParamValueList(o);\r
16961                         return ret;\r
16962                 }\r
16963         }\r
16964 \r
16965         FreeRpcSetUser(&t);\r
16966 \r
16967         FreeParamValueList(o);\r
16968 \r
16969         return 0;\r
16970 }\r
16971 \r
16972 // グループのセキュリティ ポリシーの削除\r
16973 UINT PsGroupPolicyRemove(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)\r
16974 {\r
16975         LIST *o;\r
16976         PS *ps = (PS *)param;\r
16977         UINT ret = 0;\r
16978         RPC_SET_GROUP t;\r
16979         // 指定できるパラメータ リスト\r
16980         PARAM args[] =\r
16981         {\r
16982                 // "name", prompt_proc, prompt_param, eval_proc, eval_param\r
16983                 {"[name]", CmdPrompt, _UU("CMD_GroupCreate_Prompt_NAME"), CmdEvalNotEmpty, NULL},\r
16984         };\r
16985 \r
16986         // 仮想 HUB が選択されていない場合はエラー\r
16987         if (ps->HubName == NULL)\r
16988         {\r
16989                 c->Write(c, _UU("CMD_Hub_Not_Selected"));\r
16990                 return ERR_INVALID_PARAMETER;\r
16991         }\r
16992 \r
16993         o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));\r
16994         if (o == NULL)\r
16995         {\r
16996                 return ERR_INVALID_PARAMETER;\r
16997         }\r
16998 \r
16999         Zero(&t, sizeof(t));\r
17000         StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);\r
17001         StrCpy(t.Name, sizeof(t.Name), GetParamStr(o, "[name]"));\r
17002 \r
17003         // RPC 呼び出し\r
17004         ret = ScGetGroup(ps->Rpc, &t);\r
17005 \r
17006         if (ret != ERR_NO_ERROR)\r
17007         {\r
17008                 // エラー発生\r
17009                 CmdPrintError(c, ret);\r
17010                 FreeParamValueList(o);\r
17011                 return ret;\r
17012         }\r
17013         else\r
17014         {\r
17015                 // 更新\r
17016                 if (t.Policy != NULL)\r
17017                 {\r
17018                         Free(t.Policy);\r
17019                         t.Policy = NULL;\r
17020                 }\r
17021 \r
17022                 ret = ScSetGroup(ps->Rpc, &t);\r
17023 \r
17024                 if (ret != ERR_NO_ERROR)\r
17025                 {\r
17026                         // エラー発生\r
17027                         CmdPrintError(c, ret);\r
17028                         FreeParamValueList(o);\r
17029                         return ret;\r
17030                 }\r
17031         }\r
17032 \r
17033         FreeRpcSetGroup(&t);\r
17034 \r
17035         FreeParamValueList(o);\r
17036 \r
17037         return 0;\r
17038 }\r
17039 \r
17040 // グループのセキュリティ ポリシーの設定\r
17041 UINT PsGroupPolicySet(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)\r
17042 {\r
17043         LIST *o;\r
17044         PS *ps = (PS *)param;\r
17045         UINT ret = 0;\r
17046         RPC_SET_GROUP t;\r
17047         // 指定できるパラメータ リスト\r
17048         PARAM args[] =\r
17049         {\r
17050                 // "name", prompt_proc, prompt_param, eval_proc, eval_param\r
17051                 {"[name]", CmdPrompt, _UU("CMD_GroupCreate_Prompt_NAME"), CmdEvalNotEmpty, NULL},\r
17052                 {"NAME", CmdPrompt, _UU("CMD_CascadePolicySet_PROMPT_POLNAME"), CmdEvalNotEmpty, NULL},\r
17053                 {"VALUE", CmdPrompt, _UU("CMD_CascadePolicySet_PROMPT_POLVALUE"), CmdEvalNotEmpty, NULL},\r
17054         };\r
17055 \r
17056         // 仮想 HUB が選択されていない場合はエラー\r
17057         if (ps->HubName == NULL)\r
17058         {\r
17059                 c->Write(c, _UU("CMD_Hub_Not_Selected"));\r
17060                 return ERR_INVALID_PARAMETER;\r
17061         }\r
17062 \r
17063         o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));\r
17064         if (o == NULL)\r
17065         {\r
17066                 return ERR_INVALID_PARAMETER;\r
17067         }\r
17068 \r
17069         Zero(&t, sizeof(t));\r
17070         StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);\r
17071         StrCpy(t.Name, sizeof(t.Name), GetParamStr(o, "[name]"));\r
17072 \r
17073         // RPC 呼び出し\r
17074         ret = ScGetGroup(ps->Rpc, &t);\r
17075 \r
17076         if (ret != ERR_NO_ERROR)\r
17077         {\r
17078                 // エラー発生\r
17079                 CmdPrintError(c, ret);\r
17080                 FreeParamValueList(o);\r
17081                 return ret;\r
17082         }\r
17083         else\r
17084         {\r
17085                 // 更新\r
17086                 if (t.Policy == NULL)\r
17087                 {\r
17088                         t.Policy = ClonePolicy(GetDefaultPolicy());\r
17089                 }\r
17090 \r
17091                 if (EditPolicy(c, t.Policy, GetParamStr(o, "NAME"), GetParamStr(o, "VALUE"), false) == false)\r
17092                 {\r
17093                         // エラー発生\r
17094                         FreeRpcSetGroup(&t);\r
17095                         CmdPrintError(c, ret);\r
17096                         FreeParamValueList(o);\r
17097                         return ERR_INTERNAL_ERROR;\r
17098                 }\r
17099 \r
17100                 ret = ScSetGroup(ps->Rpc, &t);\r
17101 \r
17102                 if (ret != ERR_NO_ERROR)\r
17103                 {\r
17104                         // エラー発生\r
17105                         CmdPrintError(c, ret);\r
17106                         FreeParamValueList(o);\r
17107                         return ret;\r
17108                 }\r
17109         }\r
17110 \r
17111         FreeRpcSetGroup(&t);\r
17112 \r
17113         FreeParamValueList(o);\r
17114 \r
17115         return 0;\r
17116 }\r
17117 \r
17118 // 接続中のセッション一覧の取得\r
17119 UINT PsSessionList(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)\r
17120 {\r
17121         LIST *o;\r
17122         PS *ps = (PS *)param;\r
17123         UINT ret = 0;\r
17124         RPC_ENUM_SESSION t;\r
17125         UINT server_type = 0;\r
17126 \r
17127         o = ParseCommandList(c, cmd_name, str, NULL, 0);\r
17128         if (o == NULL)\r
17129         {\r
17130                 return ERR_INVALID_PARAMETER;\r
17131         }\r
17132 \r
17133         // 仮想 HUB が選択されていない場合はエラー\r
17134         if (ps->HubName == NULL)\r
17135         {\r
17136                 c->Write(c, _UU("CMD_Hub_Not_Selected"));\r
17137                 return ERR_INVALID_PARAMETER;\r
17138         }\r
17139 \r
17140         {\r
17141                 // サーバー種類の取得\r
17142                 RPC_SERVER_INFO t;\r
17143 \r
17144                 Zero(&t, sizeof(t));\r
17145 \r
17146                 if (ScGetServerInfo(ps->Rpc, &t) == ERR_NO_ERROR)\r
17147                 {\r
17148                         server_type = t.ServerType;\r
17149 \r
17150                         FreeRpcServerInfo(&t);\r
17151                 }\r
17152         }\r
17153 \r
17154         Zero(&t, sizeof(t));\r
17155         StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);\r
17156 \r
17157         // RPC 呼び出し\r
17158         ret = ScEnumSession(ps->Rpc, &t);\r
17159 \r
17160         if (ret != ERR_NO_ERROR)\r
17161         {\r
17162                 // エラー発生\r
17163                 CmdPrintError(c, ret);\r
17164                 FreeParamValueList(o);\r
17165                 return ret;\r
17166         }\r
17167         else\r
17168         {\r
17169                 CT *ct = CtNew();\r
17170                 UINT i;\r
17171 \r
17172                 CtInsertColumn(ct, _UU("SM_SESS_COLUMN_1"), false);\r
17173                 CtInsertColumn(ct, _UU("SM_SESS_COLUMN_8"), false);\r
17174                 CtInsertColumn(ct, _UU("SM_SESS_COLUMN_2"), false);\r
17175                 CtInsertColumn(ct, _UU("SM_SESS_COLUMN_3"), false);\r
17176                 CtInsertColumn(ct, _UU("SM_SESS_COLUMN_4"), false);\r
17177                 CtInsertColumn(ct, _UU("SM_SESS_COLUMN_5"), true);\r
17178                 CtInsertColumn(ct, _UU("SM_SESS_COLUMN_6"), true);\r
17179                 CtInsertColumn(ct, _UU("SM_SESS_COLUMN_7"), true);\r
17180 \r
17181                 for (i = 0;i < t.NumSession;i++)\r
17182                 {\r
17183                         RPC_ENUM_SESSION_ITEM *e = &t.Sessions[i];\r
17184                         wchar_t tmp1[MAX_SIZE];\r
17185                         wchar_t *tmp2;\r
17186                         wchar_t tmp3[MAX_SIZE];\r
17187                         wchar_t tmp4[MAX_SIZE];\r
17188                         wchar_t tmp5[MAX_SIZE];\r
17189                         wchar_t tmp6[MAX_SIZE];\r
17190                         wchar_t tmp7[MAX_SIZE];\r
17191                         wchar_t tmp8[MAX_SIZE];\r
17192                         bool free_tmp2 = false;\r
17193 \r
17194                         StrToUni(tmp1, sizeof(tmp1), e->Name);\r
17195 \r
17196                         tmp2 = _UU("SM_SESS_NORMAL");\r
17197                         if (server_type != SERVER_TYPE_STANDALONE)\r
17198                         {\r
17199                                 if (e->RemoteSession)\r
17200                                 {\r
17201                                         tmp2 = ZeroMalloc(MAX_SIZE);\r
17202                                         UniFormat(tmp2, MAX_SIZE, _UU("SM_SESS_REMOTE"), e->RemoteHostname);\r
17203                                         free_tmp2 = true;\r
17204                                 }\r
17205                                 else\r
17206                                 {\r
17207                                         if (StrLen(e->RemoteHostname) == 0)\r
17208                                         {\r
17209                                                 tmp2 = _UU("SM_SESS_LOCAL");\r
17210                                         }\r
17211                                         else\r
17212                                         {\r
17213                                                 tmp2 = ZeroMalloc(MAX_SIZE);\r
17214                                                 UniFormat(tmp2, MAX_SIZE, _UU("SM_SESS_LOCAL_2"), e->RemoteHostname);\r
17215                                                 free_tmp2 = true;\r
17216                                         }\r
17217                                 }\r
17218                         }\r
17219                         if (e->LinkMode)\r
17220                         {\r
17221                                 if (free_tmp2)\r
17222                                 {\r
17223                                         Free(tmp2);\r
17224                                         free_tmp2 = false;\r
17225                                 }\r
17226                                 tmp2 = _UU("SM_SESS_LINK");\r
17227                         }\r
17228                         else if (e->SecureNATMode)\r
17229                         {\r
17230                                 /*if (free_tmp2)\r
17231                                 {\r
17232                                         Free(tmp2);\r
17233                                         free_tmp2 = false;\r
17234                                 }*/\r
17235                                 tmp2 = _UU("SM_SESS_SNAT");\r
17236                         }\r
17237 \r
17238                         StrToUni(tmp3, sizeof(tmp3), e->Username);\r
17239 \r
17240                         StrToUni(tmp4, sizeof(tmp4), e->Hostname);\r
17241                         if (e->LinkMode)\r
17242                         {\r
17243                                 UniStrCpy(tmp4, sizeof(tmp4), _UU("SM_SESS_LINK_HOSTNAME"));\r
17244                         }\r
17245                         else if (e->SecureNATMode)\r
17246                         {\r
17247                                 UniStrCpy(tmp4, sizeof(tmp4), _UU("SM_SESS_SNAT_HOSTNAME"));\r
17248                         }\r
17249                         else if (e->BridgeMode)\r
17250                         {\r
17251                                 UniStrCpy(tmp4, sizeof(tmp4), _UU("SM_SESS_BRIDGE_HOSTNAME"));\r
17252                         }\r
17253                         else if (StartWith(e->Username, L3_USERNAME))\r
17254                         {\r
17255                                 UniStrCpy(tmp4, sizeof(tmp4), _UU("SM_SESS_LAYER3_HOSTNAME"));\r
17256                         }\r
17257 \r
17258                         UniFormat(tmp5, sizeof(tmp5), L"%u / %u", e->CurrentNumTcp, e->MaxNumTcp);\r
17259                         if (e->LinkMode)\r
17260                         {\r
17261                                 UniStrCpy(tmp5, sizeof(tmp5), _UU("SM_SESS_LINK_TCP"));\r
17262                         }\r
17263                         else if (e->SecureNATMode)\r
17264                         {\r
17265                                 UniStrCpy(tmp5, sizeof(tmp5), _UU("SM_SESS_SNAT_TCP"));\r
17266                         }\r
17267                         else if (e->BridgeMode)\r
17268                         {\r
17269                                 UniStrCpy(tmp5, sizeof(tmp5), _UU("SM_SESS_BRIDGE_TCP"));\r
17270                         }\r
17271 \r
17272                         UniToStr3(tmp6, sizeof(tmp6), e->PacketSize);\r
17273                         UniToStr3(tmp7, sizeof(tmp7), e->PacketNum);\r
17274 \r
17275                         if (e->VLanId == 0)\r
17276                         {\r
17277                                 UniStrCpy(tmp8, sizeof(tmp8), _UU("CM_ST_NO_VLAN"));\r
17278                         }\r
17279                         else\r
17280                         {\r
17281                                 UniToStru(tmp8, e->VLanId);\r
17282                         }\r
17283 \r
17284                         CtInsert(ct, tmp1, tmp8, tmp2, tmp3, tmp4, tmp5, tmp6, tmp7);\r
17285 \r
17286                         if (free_tmp2)\r
17287                         {\r
17288                                 Free(tmp2);\r
17289                         }\r
17290                 }\r
17291 \r
17292 \r
17293                 CtFreeEx(ct, c, true);\r
17294         }\r
17295 \r
17296         FreeRpcEnumSession(&t);\r
17297 \r
17298         FreeParamValueList(o);\r
17299 \r
17300         return 0;\r
17301 }\r
17302 \r
17303 // NODE_INFO の表示\r
17304 void CmdPrintNodeInfo(CT *ct, NODE_INFO *info)\r
17305 {\r
17306         wchar_t tmp[MAX_SIZE];\r
17307         char str[MAX_SIZE];\r
17308         // 引数チェック\r
17309         if (ct == NULL || info == NULL)\r
17310         {\r
17311                 return;\r
17312         }\r
17313 \r
17314         StrToUni(tmp, sizeof(tmp), info->ClientProductName);\r
17315         CtInsert(ct, _UU("SM_NODE_CLIENT_NAME"), tmp);\r
17316 \r
17317         UniFormat(tmp, sizeof(tmp), L"%u.%02u", Endian32(info->ClientProductVer) / 100, Endian32(info->ClientProductVer) % 100);\r
17318         CtInsert(ct, _UU("SM_NODE_CLIENT_VER"), tmp);\r
17319 \r
17320         UniFormat(tmp, sizeof(tmp), L"Build %u", Endian32(info->ClientProductBuild));\r
17321         CtInsert(ct, _UU("SM_NODE_CLIENT_BUILD"), tmp);\r
17322 \r
17323         StrToUni(tmp, sizeof(tmp), info->ClientOsName);\r
17324         CtInsert(ct, _UU("SM_NODE_CLIENT_OS_NAME"), tmp);\r
17325 \r
17326         StrToUni(tmp, sizeof(tmp), info->ClientOsVer);\r
17327         CtInsert(ct, _UU("SM_NODE_CLIENT_OS_VER"), tmp);\r
17328 \r
17329         StrToUni(tmp, sizeof(tmp), info->ClientOsProductId);\r
17330         CtInsert(ct, _UU("SM_NODE_CLIENT_OS_PID"), tmp);\r
17331 \r
17332         StrToUni(tmp, sizeof(tmp), info->ClientHostname);\r
17333         CtInsert(ct, _UU("SM_NODE_CLIENT_HOST"), tmp);\r
17334 \r
17335         IPToStr4or6(str, sizeof(str), info->ClientIpAddress, info->ClientIpAddress6);\r
17336         StrToUni(tmp, sizeof(tmp), str);\r
17337         CtInsert(ct, _UU("SM_NODE_CLIENT_IP"), tmp);\r
17338 \r
17339         UniToStru(tmp, Endian32(info->ClientPort));\r
17340         CtInsert(ct, _UU("SM_NODE_CLIENT_PORT"), tmp);\r
17341 \r
17342         StrToUni(tmp, sizeof(tmp), info->ServerHostname);\r
17343         CtInsert(ct, _UU("SM_NODE_SERVER_HOST"), tmp);\r
17344 \r
17345         IPToStr4or6(str, sizeof(str), info->ServerIpAddress, info->ServerIpAddress6);\r
17346         StrToUni(tmp, sizeof(tmp), str);\r
17347         CtInsert(ct, _UU("SM_NODE_SERVER_IP"), tmp);\r
17348 \r
17349         UniToStru(tmp, Endian32(info->ServerPort));\r
17350         CtInsert(ct, _UU("SM_NODE_SERVER_PORT"), tmp);\r
17351 \r
17352         if (StrLen(info->ProxyHostname) != 0)\r
17353         {\r
17354                 StrToUni(tmp, sizeof(tmp), info->ProxyHostname);\r
17355                 CtInsert(ct, _UU("SM_NODE_PROXY_HOSTNAME"), tmp);\r
17356 \r
17357                 IPToStr4or6(str, sizeof(str), info->ProxyIpAddress, info->ProxyIpAddress6);\r
17358                 StrToUni(tmp, sizeof(tmp), str);\r
17359                 CtInsert(ct, _UU("SM_NODE_PROXY_IP"), tmp);\r
17360 \r
17361                 UniToStru(tmp, Endian32(info->ProxyPort));\r
17362                 CtInsert(ct, _UU("SM_NODE_PROXY_PORT"), tmp);\r
17363         }\r
17364 }\r
17365 \r
17366 // セッション情報の取得\r
17367 UINT PsSessionGet(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)\r
17368 {\r
17369         LIST *o;\r
17370         PS *ps = (PS *)param;\r
17371         UINT ret = 0;\r
17372         RPC_SESSION_STATUS t;\r
17373         // 指定できるパラメータ リスト\r
17374         PARAM args[] =\r
17375         {\r
17376                 // "name", prompt_proc, prompt_param, eval_proc, eval_param\r
17377                 {"[name]", CmdPrompt, _UU("CMD_SessionGet_Prompt_NAME"), CmdEvalNotEmpty, NULL},\r
17378         };\r
17379 \r
17380         // 仮想 HUB が選択されていない場合はエラー\r
17381         if (ps->HubName == NULL)\r
17382         {\r
17383                 c->Write(c, _UU("CMD_Hub_Not_Selected"));\r
17384                 return ERR_INVALID_PARAMETER;\r
17385         }\r
17386 \r
17387         o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));\r
17388         if (o == NULL)\r
17389         {\r
17390                 return ERR_INVALID_PARAMETER;\r
17391         }\r
17392 \r
17393         Zero(&t, sizeof(t));\r
17394         StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);\r
17395         StrCpy(t.Name, sizeof(t.Name), GetParamStr(o, "[name]"));\r
17396 \r
17397         // RPC 呼び出し\r
17398         ret = ScGetSessionStatus(ps->Rpc, &t);\r
17399 \r
17400         if (ret != ERR_NO_ERROR)\r
17401         {\r
17402                 // エラー発生\r
17403                 CmdPrintError(c, ret);\r
17404                 FreeParamValueList(o);\r
17405                 return ret;\r
17406         }\r
17407         else\r
17408         {\r
17409                 wchar_t tmp[MAX_SIZE];\r
17410                 char str[MAX_SIZE];\r
17411                 CT *ct = CtNewStandard();\r
17412 \r
17413                 if (t.ClientIp != 0)\r
17414                 {\r
17415                         IPToStr4or6(str, sizeof(str), t.ClientIp, t.ClientIp6);\r
17416                         StrToUni(tmp, sizeof(tmp), str);\r
17417                         CtInsert(ct, _UU("SM_CLIENT_IP"), tmp);\r
17418                 }\r
17419 \r
17420                 if (StrLen(t.ClientHostName) != 0)\r
17421                 {\r
17422                         StrToUni(tmp, sizeof(tmp), t.ClientHostName);\r
17423                         CtInsert(ct, _UU("SM_CLIENT_HOSTNAME"), tmp);\r
17424                 }\r
17425 \r
17426                 StrToUni(tmp, sizeof(tmp), t.Username);\r
17427                 CtInsert(ct, _UU("SM_SESS_STATUS_USERNAME"), tmp);\r
17428 \r
17429                 if (StrCmpi(t.Username, LINK_USER_NAME_PRINT) != 0 && StrCmpi(t.Username, SNAT_USER_NAME_PRINT) != 0 && StrCmpi(t.Username, BRIDGE_USER_NAME_PRINT) != 0)\r
17430                 {\r
17431                         StrToUni(tmp, sizeof(tmp), t.RealUsername);\r
17432                         CtInsert(ct, _UU("SM_SESS_STATUS_REALUSER"), tmp);\r
17433                 }\r
17434 \r
17435                 if (IsEmptyStr(t.GroupName) == false)\r
17436                 {\r
17437                         StrToUni(tmp, sizeof(tmp), t.GroupName);\r
17438                         CtInsert(ct, _UU("SM_SESS_STATUS_GROUPNAME"), tmp);\r
17439                 }\r
17440 \r
17441 \r
17442                 CmdPrintStatusToListViewEx(ct, &t.Status, true);\r
17443 \r
17444                 if (StrCmpi(t.Username, LINK_USER_NAME_PRINT) != 0 && StrCmpi(t.Username, SNAT_USER_NAME_PRINT) != 0 && StrCmpi(t.Username, BRIDGE_USER_NAME_PRINT) != 0 &&\r
17445                         StartWith(t.Username, L3_USERNAME) == false)\r
17446                 {\r
17447                         CmdPrintNodeInfo(ct, &t.NodeInfo);\r
17448                 }\r
17449 \r
17450                 CtFree(ct, c);\r
17451         }\r
17452 \r
17453         FreeRpcSessionStatus(&t);\r
17454 \r
17455         FreeParamValueList(o);\r
17456 \r
17457         return 0;\r
17458 }\r
17459 \r
17460 // セッションの切断\r
17461 UINT PsSessionDisconnect(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)\r
17462 {\r
17463         LIST *o;\r
17464         PS *ps = (PS *)param;\r
17465         UINT ret = 0;\r
17466         RPC_DELETE_SESSION t;\r
17467         // 指定できるパラメータ リスト\r
17468         PARAM args[] =\r
17469         {\r
17470                 // "name", prompt_proc, prompt_param, eval_proc, eval_param\r
17471                 {"[name]", CmdPrompt, _UU("CMD_SessionGet_Prompt_NAME"), CmdEvalNotEmpty, NULL},\r
17472         };\r
17473 \r
17474         // 仮想 HUB が選択されていない場合はエラー\r
17475         if (ps->HubName == NULL)\r
17476         {\r
17477                 c->Write(c, _UU("CMD_Hub_Not_Selected"));\r
17478                 return ERR_INVALID_PARAMETER;\r
17479         }\r
17480 \r
17481         o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));\r
17482         if (o == NULL)\r
17483         {\r
17484                 return ERR_INVALID_PARAMETER;\r
17485         }\r
17486 \r
17487         Zero(&t, sizeof(t));\r
17488         StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);\r
17489         StrCpy(t.Name, sizeof(t.Name), GetParamStr(o, "[name]"));\r
17490 \r
17491         // RPC 呼び出し\r
17492         ret = ScDeleteSession(ps->Rpc, &t);\r
17493 \r
17494         if (ret != ERR_NO_ERROR)\r
17495         {\r
17496                 // エラー発生\r
17497                 CmdPrintError(c, ret);\r
17498                 FreeParamValueList(o);\r
17499                 return ret;\r
17500         }\r
17501 \r
17502         FreeParamValueList(o);\r
17503 \r
17504         return 0;\r
17505 }\r
17506 \r
17507 // MAC アドレス テーブル データベースの取得\r
17508 UINT PsMacTable(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)\r
17509 {\r
17510         LIST *o;\r
17511         PS *ps = (PS *)param;\r
17512         UINT ret = 0;\r
17513         RPC_ENUM_MAC_TABLE t;\r
17514         UINT i;\r
17515 \r
17516         // 指定できるパラメータ リスト\r
17517         PARAM args[] =\r
17518         {\r
17519                 // "name", prompt_proc, prompt_param, eval_proc, eval_param\r
17520                 {"[session_name]", NULL, NULL, NULL, NULL,}\r
17521         };\r
17522 \r
17523         // 仮想 HUB が選択されていない場合はエラー\r
17524         if (ps->HubName == NULL)\r
17525         {\r
17526                 c->Write(c, _UU("CMD_Hub_Not_Selected"));\r
17527                 return ERR_INVALID_PARAMETER;\r
17528         }\r
17529 \r
17530         o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));\r
17531         if (o == NULL)\r
17532         {\r
17533                 return ERR_INVALID_PARAMETER;\r
17534         }\r
17535 \r
17536         Zero(&t, sizeof(t));\r
17537         StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);\r
17538 \r
17539         // RPC 呼び出し\r
17540         ret = ScEnumMacTable(ps->Rpc, &t);\r
17541 \r
17542         if (ret != ERR_NO_ERROR)\r
17543         {\r
17544                 // エラー発生\r
17545                 CmdPrintError(c, ret);\r
17546                 FreeParamValueList(o);\r
17547                 return ret;\r
17548         }\r
17549         else\r
17550         {\r
17551                 CT *ct = CtNew();\r
17552                 char *session_name = GetParamStr(o, "[session_name]");\r
17553 \r
17554                 if (IsEmptyStr(session_name))\r
17555                 {\r
17556                         session_name = NULL;\r
17557                 }\r
17558 \r
17559                 CtInsertColumn(ct, _UU("CMD_ID"), false);\r
17560                 CtInsertColumn(ct, _UU("SM_MAC_COLUMN_1"), false);\r
17561                 CtInsertColumn(ct, _UU("SM_MAC_COLUMN_1A"), false);\r
17562                 CtInsertColumn(ct, _UU("SM_MAC_COLUMN_2"), false);\r
17563                 CtInsertColumn(ct, _UU("SM_MAC_COLUMN_3"), false);\r
17564                 CtInsertColumn(ct, _UU("SM_MAC_COLUMN_4"), false);\r
17565                 CtInsertColumn(ct, _UU("SM_MAC_COLUMN_5"), false);\r
17566 \r
17567                 for (i = 0;i < t.NumMacTable;i++)\r
17568                 {\r
17569                         char str[MAX_SIZE];\r
17570                         wchar_t tmp0[128];\r
17571                         wchar_t tmp1[MAX_SIZE];\r
17572                         wchar_t tmp2[MAX_SIZE];\r
17573                         wchar_t tmp3[MAX_SIZE];\r
17574                         wchar_t tmp4[MAX_SIZE];\r
17575                         wchar_t tmp5[MAX_SIZE];\r
17576                         wchar_t tmp6[MAX_SIZE];\r
17577 \r
17578                         RPC_ENUM_MAC_TABLE_ITEM *e = &t.MacTables[i];\r
17579 \r
17580                         if (session_name == NULL || StrCmpi(e->SessionName, session_name) == 0)\r
17581                         {\r
17582                                 UniToStru(tmp0, e->Key);\r
17583 \r
17584                                 StrToUni(tmp1, sizeof(tmp1), e->SessionName);\r
17585 \r
17586                                 MacToStr(str, sizeof(str), e->MacAddress);\r
17587                                 StrToUni(tmp2, sizeof(tmp2), str);\r
17588 \r
17589                                 GetDateTimeStr64Uni(tmp3, sizeof(tmp3), SystemToLocal64(e->CreatedTime));\r
17590 \r
17591                                 GetDateTimeStr64Uni(tmp4, sizeof(tmp4), SystemToLocal64(e->UpdatedTime));\r
17592 \r
17593                                 if (StrLen(e->RemoteHostname) == 0)\r
17594                                 {\r
17595                                         UniStrCpy(tmp5, sizeof(tmp5), _UU("SM_MACIP_LOCAL"));\r
17596                                 }\r
17597                                 else\r
17598                                 {\r
17599                                         UniFormat(tmp5, sizeof(tmp5), _UU("SM_MACIP_SERVER"), e->RemoteHostname);\r
17600                                 }\r
17601 \r
17602                                 UniToStru(tmp6, e->VlanId);\r
17603                                 if (e->VlanId == 0)\r
17604                                 {\r
17605                                         UniStrCpy(tmp6, sizeof(tmp6), _UU("CM_ST_NONE"));\r
17606                                 }\r
17607 \r
17608                                 CtInsert(ct,\r
17609                                         tmp0, tmp1, tmp6, tmp2, tmp3, tmp4, tmp5);\r
17610                         }\r
17611                 }\r
17612 \r
17613                 CtFreeEx(ct, c, true);\r
17614         }\r
17615 \r
17616         FreeRpcEnumMacTable(&t);\r
17617 \r
17618         FreeParamValueList(o);\r
17619 \r
17620         return 0;\r
17621 }\r
17622 \r
17623 // MAC アドレス テーブル エントリの削除\r
17624 UINT PsMacDelete(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)\r
17625 {\r
17626         LIST *o;\r
17627         PS *ps = (PS *)param;\r
17628         UINT ret = 0;\r
17629         RPC_DELETE_TABLE t;\r
17630         // 指定できるパラメータ リスト\r
17631         PARAM args[] =\r
17632         {\r
17633                 // "name", prompt_proc, prompt_param, eval_proc, eval_param\r
17634                 {"[id]", CmdPrompt, _UU("CMD_MacDelete_Prompt"), CmdEvalNotEmpty, NULL},\r
17635         };\r
17636 \r
17637         // 仮想 HUB が選択されていない場合はエラー\r
17638         if (ps->HubName == NULL)\r
17639         {\r
17640                 c->Write(c, _UU("CMD_Hub_Not_Selected"));\r
17641                 return ERR_INVALID_PARAMETER;\r
17642         }\r
17643 \r
17644         o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));\r
17645         if (o == NULL)\r
17646         {\r
17647                 return ERR_INVALID_PARAMETER;\r
17648         }\r
17649 \r
17650         Zero(&t, sizeof(t));\r
17651         StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);\r
17652         t.Key = GetParamInt(o, "[id]");\r
17653 \r
17654         // RPC 呼び出し\r
17655         ret = ScDeleteMacTable(ps->Rpc, &t);\r
17656 \r
17657         if (ret != ERR_NO_ERROR)\r
17658         {\r
17659                 // エラー発生\r
17660                 CmdPrintError(c, ret);\r
17661                 FreeParamValueList(o);\r
17662                 return ret;\r
17663         }\r
17664 \r
17665         FreeParamValueList(o);\r
17666 \r
17667         return 0;\r
17668 }\r
17669 \r
17670 // IP アドレス テーブル データベースの取得\r
17671 UINT PsIpTable(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)\r
17672 {\r
17673         LIST *o;\r
17674         PS *ps = (PS *)param;\r
17675         UINT ret = 0;\r
17676         RPC_ENUM_IP_TABLE t;\r
17677         UINT i;\r
17678 \r
17679         // 指定できるパラメータ リスト\r
17680         PARAM args[] =\r
17681         {\r
17682                 // "name", prompt_proc, prompt_param, eval_proc, eval_param\r
17683                 {"[session_name]", NULL, NULL, NULL, NULL,}\r
17684         };\r
17685 \r
17686         // 仮想 HUB が選択されていない場合はエラー\r
17687         if (ps->HubName == NULL)\r
17688         {\r
17689                 c->Write(c, _UU("CMD_Hub_Not_Selected"));\r
17690                 return ERR_INVALID_PARAMETER;\r
17691         }\r
17692 \r
17693         o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));\r
17694         if (o == NULL)\r
17695         {\r
17696                 return ERR_INVALID_PARAMETER;\r
17697         }\r
17698 \r
17699         Zero(&t, sizeof(t));\r
17700         StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);\r
17701 \r
17702         // RPC 呼び出し\r
17703         ret = ScEnumIpTable(ps->Rpc, &t);\r
17704 \r
17705         if (ret != ERR_NO_ERROR)\r
17706         {\r
17707                 // エラー発生\r
17708                 CmdPrintError(c, ret);\r
17709                 FreeParamValueList(o);\r
17710                 return ret;\r
17711         }\r
17712         else\r
17713         {\r
17714                 CT *ct = CtNew();\r
17715                 char *session_name = GetParamStr(o, "[session_name]");\r
17716 \r
17717                 if (IsEmptyStr(session_name))\r
17718                 {\r
17719                         session_name = NULL;\r
17720                 }\r
17721 \r
17722                 CtInsertColumn(ct, _UU("CMD_ID"), false);\r
17723                 CtInsertColumn(ct, _UU("SM_IP_COLUMN_1"), false);\r
17724                 CtInsertColumn(ct, _UU("SM_IP_COLUMN_2"), false);\r
17725                 CtInsertColumn(ct, _UU("SM_IP_COLUMN_3"), false);\r
17726                 CtInsertColumn(ct, _UU("SM_IP_COLUMN_4"), false);\r
17727                 CtInsertColumn(ct, _UU("SM_IP_COLUMN_5"), false);\r
17728 \r
17729                 for (i = 0;i < t.NumIpTable;i++)\r
17730                 {\r
17731                         char str[MAX_SIZE];\r
17732                         wchar_t tmp0[128];\r
17733                         wchar_t tmp1[MAX_SIZE];\r
17734                         wchar_t tmp2[MAX_SIZE];\r
17735                         wchar_t tmp3[MAX_SIZE];\r
17736                         wchar_t tmp4[MAX_SIZE];\r
17737                         wchar_t tmp5[MAX_SIZE];\r
17738                         RPC_ENUM_IP_TABLE_ITEM *e = &t.IpTables[i];\r
17739 \r
17740                         if (session_name == NULL || StrCmpi(e->SessionName, session_name) == 0)\r
17741                         {\r
17742                                 UniToStru(tmp0, e->Key);\r
17743 \r
17744                                 StrToUni(tmp1, sizeof(tmp1), e->SessionName);\r
17745 \r
17746                                 if (e->DhcpAllocated == false)\r
17747                                 {\r
17748                                         IPToStr(str, sizeof(str), &e->IpV6);\r
17749                                         StrToUni(tmp2, sizeof(tmp2), str);\r
17750                                 }\r
17751                                 else\r
17752                                 {\r
17753                                         IPToStr(str, sizeof(str), &e->IpV6);\r
17754                                         UniFormat(tmp2, sizeof(tmp2), _UU("SM_MAC_IP_DHCP"), str);\r
17755                                 }\r
17756 \r
17757                                 GetDateTimeStr64Uni(tmp3, sizeof(tmp3), SystemToLocal64(e->CreatedTime));\r
17758 \r
17759                                 GetDateTimeStr64Uni(tmp4, sizeof(tmp4), SystemToLocal64(e->UpdatedTime));\r
17760 \r
17761                                 if (StrLen(e->RemoteHostname) == 0)\r
17762                                 {\r
17763                                         UniStrCpy(tmp5, sizeof(tmp5), _UU("SM_MACIP_LOCAL"));\r
17764                                 }\r
17765                                 else\r
17766                                 {\r
17767                                         UniFormat(tmp5, sizeof(tmp5), _UU("SM_MACIP_SERVER"), e->RemoteHostname);\r
17768                                 }\r
17769 \r
17770                                 CtInsert(ct,\r
17771                                         tmp0, tmp1, tmp2, tmp3, tmp4, tmp5);\r
17772                         }\r
17773                 }\r
17774 \r
17775                 CtFreeEx(ct, c, true);\r
17776         }\r
17777 \r
17778         FreeRpcEnumIpTable(&t);\r
17779 \r
17780         FreeParamValueList(o);\r
17781 \r
17782         return 0;\r
17783 }\r
17784 \r
17785 // IP アドレス テーブル エントリの削除\r
17786 UINT PsIpDelete(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)\r
17787 {\r
17788         LIST *o;\r
17789         PS *ps = (PS *)param;\r
17790         UINT ret = 0;\r
17791         RPC_DELETE_TABLE t;\r
17792         // 指定できるパラメータ リスト\r
17793         PARAM args[] =\r
17794         {\r
17795                 // "name", prompt_proc, prompt_param, eval_proc, eval_param\r
17796                 {"[id]", CmdPrompt, _UU("CMD_MacDelete_Prompt"), CmdEvalNotEmpty, NULL},\r
17797         };\r
17798 \r
17799         // 仮想 HUB が選択されていない場合はエラー\r
17800         if (ps->HubName == NULL)\r
17801         {\r
17802                 c->Write(c, _UU("CMD_Hub_Not_Selected"));\r
17803                 return ERR_INVALID_PARAMETER;\r
17804         }\r
17805 \r
17806         o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));\r
17807         if (o == NULL)\r
17808         {\r
17809                 return ERR_INVALID_PARAMETER;\r
17810         }\r
17811 \r
17812         Zero(&t, sizeof(t));\r
17813         StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);\r
17814         t.Key = GetParamInt(o, "[id]");\r
17815 \r
17816         // RPC 呼び出し\r
17817         ret = ScDeleteIpTable(ps->Rpc, &t);\r
17818 \r
17819         if (ret != ERR_NO_ERROR)\r
17820         {\r
17821                 // エラー発生\r
17822                 CmdPrintError(c, ret);\r
17823                 FreeParamValueList(o);\r
17824                 return ret;\r
17825         }\r
17826 \r
17827         FreeParamValueList(o);\r
17828 \r
17829         return 0;\r
17830 }\r
17831 \r
17832 // 仮想 NAT および DHCP サーバー機能 (SecureNAT 機能) の有効化\r
17833 UINT PsSecureNatEnable(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)\r
17834 {\r
17835         LIST *o;\r
17836         PS *ps = (PS *)param;\r
17837         UINT ret = 0;\r
17838         RPC_HUB t;\r
17839 \r
17840         // 仮想 HUB が選択されていない場合はエラー\r
17841         if (ps->HubName == NULL)\r
17842         {\r
17843                 c->Write(c, _UU("CMD_Hub_Not_Selected"));\r
17844                 return ERR_INVALID_PARAMETER;\r
17845         }\r
17846 \r
17847         o = ParseCommandList(c, cmd_name, str, NULL, 0);\r
17848         if (o == NULL)\r
17849         {\r
17850                 return ERR_INVALID_PARAMETER;\r
17851         }\r
17852 \r
17853         Zero(&t, sizeof(t));\r
17854         StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);\r
17855 \r
17856         // RPC 呼び出し\r
17857         ret = ScEnableSecureNAT(ps->Rpc, &t);\r
17858 \r
17859         if (ret != ERR_NO_ERROR)\r
17860         {\r
17861                 // エラー発生\r
17862                 CmdPrintError(c, ret);\r
17863                 FreeParamValueList(o);\r
17864                 return ret;\r
17865         }\r
17866 \r
17867         FreeParamValueList(o);\r
17868 \r
17869         return 0;\r
17870 }\r
17871 \r
17872 // 仮想 NAT および DHCP サーバー機能 (SecureNAT 機能) の無効化\r
17873 UINT PsSecureNatDisable(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)\r
17874 {\r
17875         LIST *o;\r
17876         PS *ps = (PS *)param;\r
17877         UINT ret = 0;\r
17878         RPC_HUB t;\r
17879 \r
17880         // 仮想 HUB が選択されていない場合はエラー\r
17881         if (ps->HubName == NULL)\r
17882         {\r
17883                 c->Write(c, _UU("CMD_Hub_Not_Selected"));\r
17884                 return ERR_INVALID_PARAMETER;\r
17885         }\r
17886 \r
17887         o = ParseCommandList(c, cmd_name, str, NULL, 0);\r
17888         if (o == NULL)\r
17889         {\r
17890                 return ERR_INVALID_PARAMETER;\r
17891         }\r
17892 \r
17893         Zero(&t, sizeof(t));\r
17894         StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);\r
17895 \r
17896         // RPC 呼び出し\r
17897         ret = ScDisableSecureNAT(ps->Rpc, &t);\r
17898 \r
17899         if (ret != ERR_NO_ERROR)\r
17900         {\r
17901                 // エラー発生\r
17902                 CmdPrintError(c, ret);\r
17903                 FreeParamValueList(o);\r
17904                 return ret;\r
17905         }\r
17906 \r
17907         FreeParamValueList(o);\r
17908 \r
17909         return 0;\r
17910 }\r
17911 \r
17912 // 仮想 NAT および DHCP サーバー機能 (SecureNAT 機能) の動作状況の取得\r
17913 UINT PsSecureNatStatusGet(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)\r
17914 {\r
17915         LIST *o;\r
17916         PS *ps = (PS *)param;\r
17917         UINT ret = 0;\r
17918         RPC_NAT_STATUS t;\r
17919 \r
17920         // 仮想 HUB が選択されていない場合はエラー\r
17921         if (ps->HubName == NULL)\r
17922         {\r
17923                 c->Write(c, _UU("CMD_Hub_Not_Selected"));\r
17924                 return ERR_INVALID_PARAMETER;\r
17925         }\r
17926 \r
17927         o = ParseCommandList(c, cmd_name, str, NULL, 0);\r
17928         if (o == NULL)\r
17929         {\r
17930                 return ERR_INVALID_PARAMETER;\r
17931         }\r
17932 \r
17933         Zero(&t, sizeof(t));\r
17934         StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);\r
17935 \r
17936         // RPC 呼び出し\r
17937         ret = ScGetSecureNATStatus(ps->Rpc, &t);\r
17938 \r
17939         if (ret != ERR_NO_ERROR)\r
17940         {\r
17941                 // エラー発生\r
17942                 CmdPrintError(c, ret);\r
17943                 FreeParamValueList(o);\r
17944                 return ret;\r
17945         }\r
17946         else\r
17947         {\r
17948                 wchar_t tmp[MAX_SIZE];\r
17949                 CT *ct = CtNewStandard();\r
17950 \r
17951                 StrToUni(tmp, sizeof(tmp), ps->HubName);\r
17952                 CtInsert(ct, _UU("SM_HUB_COLUMN_1"), tmp);\r
17953 \r
17954                 UniFormat(tmp, sizeof(tmp), _UU("SM_SNAT_NUM_SESSION"), t.NumTcpSessions);\r
17955                 CtInsert(ct, _UU("NM_STATUS_TCP"), tmp);\r
17956 \r
17957                 UniFormat(tmp, sizeof(tmp), _UU("SM_SNAT_NUM_SESSION"), t.NumUdpSessions);\r
17958                 CtInsert(ct, _UU("NM_STATUS_UDP"), tmp);\r
17959 \r
17960                 UniFormat(tmp, sizeof(tmp), _UU("SM_SNAT_NUM_CLIENT"), t.NumDhcpClients);\r
17961                 CtInsert(ct, _UU("NM_STATUS_DHCP"), tmp);\r
17962 \r
17963                 CtFree(ct, c);\r
17964         }\r
17965 \r
17966         FreeRpcNatStatus(&t);\r
17967 \r
17968         FreeParamValueList(o);\r
17969 \r
17970         return 0;\r
17971 }\r
17972 \r
17973 // SecureNAT 機能の仮想ホストのネットワーク インターフェイス設定の取得\r
17974 UINT PsSecureNatHostGet(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)\r
17975 {\r
17976         LIST *o;\r
17977         PS *ps = (PS *)param;\r
17978         UINT ret = 0;\r
17979         VH_OPTION t;\r
17980 \r
17981         // 仮想 HUB が選択されていない場合はエラー\r
17982         if (ps->HubName == NULL)\r
17983         {\r
17984                 c->Write(c, _UU("CMD_Hub_Not_Selected"));\r
17985                 return ERR_INVALID_PARAMETER;\r
17986         }\r
17987 \r
17988         o = ParseCommandList(c, cmd_name, str, NULL, 0);\r
17989         if (o == NULL)\r
17990         {\r
17991                 return ERR_INVALID_PARAMETER;\r
17992         }\r
17993 \r
17994         Zero(&t, sizeof(t));\r
17995         StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);\r
17996 \r
17997         // RPC 呼び出し\r
17998         ret = ScGetSecureNATOption(ps->Rpc, &t);\r
17999 \r
18000         if (ret != ERR_NO_ERROR)\r
18001         {\r
18002                 // エラー発生\r
18003                 CmdPrintError(c, ret);\r
18004                 FreeParamValueList(o);\r
18005                 return ret;\r
18006         }\r
18007         else\r
18008         {\r
18009                 wchar_t tmp[MAX_SIZE];\r
18010                 char str[MAX_SIZE];\r
18011                 CT *ct = CtNewStandard();\r
18012 \r
18013                 // 使用フラグ\r
18014                 // MAC アドレス\r
18015                 MacToStr(str, sizeof(str), t.MacAddress);\r
18016                 StrToUni(tmp, sizeof(tmp), str);\r
18017                 CtInsert(ct, _UU("CMD_SecureNatHostGet_Column_MAC"), tmp);\r
18018 \r
18019                 // IP アドレス\r
18020                 IPToUniStr(tmp, sizeof(tmp), &t.Ip);\r
18021                 CtInsert(ct, _UU("CMD_SecureNatHostGet_Column_IP"), tmp);\r
18022 \r
18023                 // サブネット マスク\r
18024                 IPToUniStr(tmp, sizeof(tmp), &t.Mask);\r
18025                 CtInsert(ct, _UU("CMD_SecureNatHostGet_Column_MASK"), tmp);\r
18026 \r
18027                 CtFree(ct, c);\r
18028         }\r
18029 \r
18030         FreeParamValueList(o);\r
18031 \r
18032         return 0;\r
18033 }\r
18034 \r
18035 // SecureNAT 機能の仮想ホストのネットワーク インターフェイス設定の変更\r
18036 UINT PsSecureNatHostSet(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)\r
18037 {\r
18038         LIST *o;\r
18039         PS *ps = (PS *)param;\r
18040         UINT ret = 0;\r
18041         VH_OPTION t;\r
18042         // 指定できるパラメータ リスト\r
18043         PARAM args[] =\r
18044         {\r
18045                 // "name", prompt_proc, prompt_param, eval_proc, eval_param\r
18046                 {"MAC", CmdPrompt, _UU("CMD_SecureNatHostSet_Prompt_MAC"), NULL, NULL},\r
18047                 {"IP", CmdPrompt, _UU("CMD_SecureNatHostSet_Prompt_IP"), CmdEvalIp, NULL},\r
18048                 {"MASK", CmdPrompt, _UU("CMD_SecureNatHostSet_Prompt_MASK"), CmdEvalIp, NULL},\r
18049         };\r
18050 \r
18051         // 仮想 HUB が選択されていない場合はエラー\r
18052         if (ps->HubName == NULL)\r
18053         {\r
18054                 c->Write(c, _UU("CMD_Hub_Not_Selected"));\r
18055                 return ERR_INVALID_PARAMETER;\r
18056         }\r
18057 \r
18058         o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));\r
18059         if (o == NULL)\r
18060         {\r
18061                 return ERR_INVALID_PARAMETER;\r
18062         }\r
18063 \r
18064         Zero(&t, sizeof(t));\r
18065         StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);\r
18066 \r
18067         // RPC 呼び出し\r
18068         ret = ScGetSecureNATOption(ps->Rpc, &t);\r
18069 \r
18070         if (ret != ERR_NO_ERROR)\r
18071         {\r
18072                 // エラー発生\r
18073                 CmdPrintError(c, ret);\r
18074                 FreeParamValueList(o);\r
18075                 return ret;\r
18076         }\r
18077         else\r
18078         {\r
18079                 char *mac, *ip, *mask;\r
18080                 bool ok = true;\r
18081 \r
18082                 StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);\r
18083 \r
18084                 mac = GetParamStr(o, "MAC");\r
18085                 ip = GetParamStr(o, "IP");\r
18086                 mask = GetParamStr(o, "MASK");\r
18087 \r
18088                 if (IsEmptyStr(mac) == false)\r
18089                 {\r
18090                         BUF *b = StrToBin(mac);\r
18091 \r
18092                         if (b == NULL || b->Size != 6)\r
18093                         {\r
18094                                 ok = false;\r
18095                         }\r
18096                         else\r
18097                         {\r
18098                                 Copy(t.MacAddress, b->Buf, 6);\r
18099                         }\r
18100 \r
18101                         FreeBuf(b);\r
18102                 }\r
18103 \r
18104                 if (IsEmptyStr(ip) == false)\r
18105                 {\r
18106                         if (IsIpStr4(ip) == false)\r
18107                         {\r
18108                                 ok = false;\r
18109                         }\r
18110                         else\r
18111                         {\r
18112                                 UINT u = StrToIP32(ip);\r
18113 \r
18114                                 if (u == 0 || u == 0xffffffff)\r
18115                                 {\r
18116                                         ok = false;\r
18117                                 }\r
18118                                 else\r
18119                                 {\r
18120                                         UINTToIP(&t.Ip, u);\r
18121                                 }\r
18122                         }\r
18123                 }\r
18124 \r
18125                 if (IsEmptyStr(mask) == false)\r
18126                 {\r
18127                         if (IsIpStr4(mask) == false)\r
18128                         {\r
18129                                 ok = false;\r
18130                         }\r
18131                         else\r
18132                         {\r
18133                                 StrToIP(&t.Mask, mask);\r
18134                         }\r
18135                 }\r
18136 \r
18137                 if (ok == false)\r
18138                 {\r
18139                         // パラメータが不正\r
18140                         ret = ERR_INVALID_PARAMETER;\r
18141                         CmdPrintError(c, ret);\r
18142                         FreeParamValueList(o);\r
18143                         return ret;\r
18144                 }\r
18145                 else\r
18146                 {\r
18147                         ret = ScSetSecureNATOption(ps->Rpc, &t);\r
18148 \r
18149                         if (ret != ERR_NO_ERROR)\r
18150                         {\r
18151                                 // エラー発生\r
18152                                 CmdPrintError(c, ret);\r
18153                                 FreeParamValueList(o);\r
18154                                 return ret;\r
18155                         }\r
18156                 }\r
18157         }\r
18158 \r
18159         FreeParamValueList(o);\r
18160 \r
18161         return 0;\r
18162 }\r
18163 \r
18164 // SecureNAT 機能の仮想 NAT 機能の設定の取得\r
18165 UINT PsNatGet(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)\r
18166 {\r
18167         LIST *o;\r
18168         PS *ps = (PS *)param;\r
18169         UINT ret = 0;\r
18170         VH_OPTION t;\r
18171 \r
18172         // 仮想 HUB が選択されていない場合はエラー\r
18173         if (ps->HubName == NULL)\r
18174         {\r
18175                 c->Write(c, _UU("CMD_Hub_Not_Selected"));\r
18176                 return ERR_INVALID_PARAMETER;\r
18177         }\r
18178 \r
18179         o = ParseCommandList(c, cmd_name, str, NULL, 0);\r
18180         if (o == NULL)\r
18181         {\r
18182                 return ERR_INVALID_PARAMETER;\r
18183         }\r
18184 \r
18185         Zero(&t, sizeof(t));\r
18186         StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);\r
18187 \r
18188         // RPC 呼び出し\r
18189         ret = ScGetSecureNATOption(ps->Rpc, &t);\r
18190 \r
18191         if (ret != ERR_NO_ERROR)\r
18192         {\r
18193                 // エラー発生\r
18194                 CmdPrintError(c, ret);\r
18195                 FreeParamValueList(o);\r
18196                 return ret;\r
18197         }\r
18198         else\r
18199         {\r
18200                 wchar_t tmp[MAX_SIZE];\r
18201                 CT *ct = CtNewStandard();\r
18202 \r
18203                 // 仮想 NAT 機能を使用する\r
18204                 CtInsert(ct, _UU("CMD_NatGet_Column_USE"), t.UseNat ? _UU("SEC_YES") : _UU("SEC_NO"));\r
18205 \r
18206                 // MTU 値\r
18207                 UniToStru(tmp, t.Mtu);\r
18208                 CtInsert(ct, _UU("CMD_NetGet_Column_MTU"), tmp);\r
18209 \r
18210                 // TCP セッションのタイムアウト (秒)\r
18211                 UniToStru(tmp, t.NatTcpTimeout);\r
18212                 CtInsert(ct, _UU("CMD_NatGet_Column_TCP"), tmp);\r
18213 \r
18214                 // UDP セッションのタイムアウト (秒)\r
18215                 UniToStru(tmp, t.NatUdpTimeout);\r
18216                 CtInsert(ct, _UU("CMD_NatGet_Column_UDP"), tmp);\r
18217 \r
18218                 // ログ保存\r
18219                 CtInsert(ct, _UU("CMD_SecureNatHostGet_Column_LOG"), t.SaveLog ? _UU("SEC_YES") : _UU("SEC_NO"));\r
18220 \r
18221                 CtFree(ct, c);\r
18222         }\r
18223 \r
18224         FreeParamValueList(o);\r
18225 \r
18226         return 0;\r
18227 }\r
18228 \r
18229 // SecureNAT 機能の仮想 NAT 機能の有効化\r
18230 UINT PsNatEnable(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)\r
18231 {\r
18232         LIST *o;\r
18233         PS *ps = (PS *)param;\r
18234         UINT ret = 0;\r
18235         VH_OPTION t;\r
18236 \r
18237         // 仮想 HUB が選択されていない場合はエラー\r
18238         if (ps->HubName == NULL)\r
18239         {\r
18240                 c->Write(c, _UU("CMD_Hub_Not_Selected"));\r
18241                 return ERR_INVALID_PARAMETER;\r
18242         }\r
18243 \r
18244         o = ParseCommandList(c, cmd_name, str, NULL, 0);\r
18245         if (o == NULL)\r
18246         {\r
18247                 return ERR_INVALID_PARAMETER;\r
18248         }\r
18249 \r
18250         Zero(&t, sizeof(t));\r
18251         StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);\r
18252 \r
18253         // RPC 呼び出し\r
18254         ret = ScGetSecureNATOption(ps->Rpc, &t);\r
18255 \r
18256         if (ret != ERR_NO_ERROR)\r
18257         {\r
18258                 // エラー発生\r
18259                 CmdPrintError(c, ret);\r
18260                 FreeParamValueList(o);\r
18261                 return ret;\r
18262         }\r
18263         else\r
18264         {\r
18265                 bool ok = true;\r
18266 \r
18267                 t.UseNat = true;\r
18268 \r
18269                 if (ok == false)\r
18270                 {\r
18271                         // パラメータが不正\r
18272                         ret = ERR_INVALID_PARAMETER;\r
18273                         CmdPrintError(c, ret);\r
18274                         FreeParamValueList(o);\r
18275                         return ret;\r
18276                 }\r
18277                 else\r
18278                 {\r
18279                         StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);\r
18280                         ret = ScSetSecureNATOption(ps->Rpc, &t);\r
18281 \r
18282                         if (ret != ERR_NO_ERROR)\r
18283                         {\r
18284                                 // エラー発生\r
18285                                 CmdPrintError(c, ret);\r
18286                                 FreeParamValueList(o);\r
18287                                 return ret;\r
18288                         }\r
18289                 }\r
18290         }\r
18291 \r
18292         FreeParamValueList(o);\r
18293 \r
18294         return 0;\r
18295 }\r
18296 \r
18297 // SecureNAT 機能の仮想 NAT 機能の無効化\r
18298 UINT PsNatDisable(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)\r
18299 {\r
18300         LIST *o;\r
18301         PS *ps = (PS *)param;\r
18302         UINT ret = 0;\r
18303         VH_OPTION t;\r
18304 \r
18305         // 仮想 HUB が選択されていない場合はエラー\r
18306         if (ps->HubName == NULL)\r
18307         {\r
18308                 c->Write(c, _UU("CMD_Hub_Not_Selected"));\r
18309                 return ERR_INVALID_PARAMETER;\r
18310         }\r
18311 \r
18312         o = ParseCommandList(c, cmd_name, str, NULL, 0);\r
18313         if (o == NULL)\r
18314         {\r
18315                 return ERR_INVALID_PARAMETER;\r
18316         }\r
18317 \r
18318         Zero(&t, sizeof(t));\r
18319         StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);\r
18320 \r
18321         // RPC 呼び出し\r
18322         ret = ScGetSecureNATOption(ps->Rpc, &t);\r
18323 \r
18324         if (ret != ERR_NO_ERROR)\r
18325         {\r
18326                 // エラー発生\r
18327                 CmdPrintError(c, ret);\r
18328                 FreeParamValueList(o);\r
18329                 return ret;\r
18330         }\r
18331         else\r
18332         {\r
18333                 bool ok = true;\r
18334 \r
18335                 t.UseNat = false;\r
18336 \r
18337                 if (ok == false)\r
18338                 {\r
18339                         // パラメータが不正\r
18340                         ret = ERR_INVALID_PARAMETER;\r
18341                         CmdPrintError(c, ret);\r
18342                         FreeParamValueList(o);\r
18343                         return ret;\r
18344                 }\r
18345                 else\r
18346                 {\r
18347                         StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);\r
18348                         ret = ScSetSecureNATOption(ps->Rpc, &t);\r
18349 \r
18350                         if (ret != ERR_NO_ERROR)\r
18351                         {\r
18352                                 // エラー発生\r
18353                                 CmdPrintError(c, ret);\r
18354                                 FreeParamValueList(o);\r
18355                                 return ret;\r
18356                         }\r
18357                 }\r
18358         }\r
18359 \r
18360         FreeParamValueList(o);\r
18361 \r
18362         return 0;\r
18363 }\r
18364 \r
18365 // SecureNAT 機能の仮想 NAT 機能の設定の変更\r
18366 UINT PsNatSet(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)\r
18367 {\r
18368         LIST *o;\r
18369         PS *ps = (PS *)param;\r
18370         UINT ret = 0;\r
18371         VH_OPTION t;\r
18372         // 指定できるパラメータ リスト\r
18373         CMD_EVAL_MIN_MAX mtu_mm =\r
18374         {\r
18375                 "CMD_NatSet_Eval_MTU", TCP_HEADER_SIZE + IP_HEADER_SIZE + MAC_HEADER_SIZE + 8, MAX_L3_DATA_SIZE,\r
18376         };\r
18377         CMD_EVAL_MIN_MAX tcp_mm =\r
18378         {\r
18379                 "CMD_NatSet_Eval_TCP", NAT_TCP_MIN_TIMEOUT / 1000, NAT_TCP_MAX_TIMEOUT / 1000,\r
18380         };\r
18381         CMD_EVAL_MIN_MAX udp_mm =\r
18382         {\r
18383                 "CMD_NatSet_Eval_UDP", NAT_UDP_MIN_TIMEOUT / 1000, NAT_UDP_MAX_TIMEOUT / 1000,\r
18384         };\r
18385         PARAM args[] =\r
18386         {\r
18387                 // "name", prompt_proc, prompt_param, eval_proc, eval_param\r
18388                 {"MTU", CmdPrompt, _UU("CMD_NatSet_Prompt_MTU"), CmdEvalMinMax, &mtu_mm},\r
18389                 {"TCPTIMEOUT", CmdPrompt, _UU("CMD_NatSet_Prompt_TCPTIMEOUT"), CmdEvalMinMax, &tcp_mm},\r
18390                 {"UDPTIMEOUT", CmdPrompt, _UU("CMD_NatSet_Prompt_UDPTIMEOUT"), CmdEvalMinMax, &udp_mm},\r
18391                 {"LOG", CmdPrompt, _UU("CMD_NatSet_Prompt_LOG"), CmdEvalNotEmpty, NULL},\r
18392         };\r
18393 \r
18394         // 仮想 HUB が選択されていない場合はエラー\r
18395         if (ps->HubName == NULL)\r
18396         {\r
18397                 c->Write(c, _UU("CMD_Hub_Not_Selected"));\r
18398                 return ERR_INVALID_PARAMETER;\r
18399         }\r
18400 \r
18401         o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));\r
18402         if (o == NULL)\r
18403         {\r
18404                 return ERR_INVALID_PARAMETER;\r
18405         }\r
18406 \r
18407         Zero(&t, sizeof(t));\r
18408         StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);\r
18409 \r
18410         // RPC 呼び出し\r
18411         ret = ScGetSecureNATOption(ps->Rpc, &t);\r
18412 \r
18413         if (ret != ERR_NO_ERROR)\r
18414         {\r
18415                 // エラー発生\r
18416                 CmdPrintError(c, ret);\r
18417                 FreeParamValueList(o);\r
18418                 return ret;\r
18419         }\r
18420         else\r
18421         {\r
18422                 bool ok = true;\r
18423 \r
18424                 t.Mtu = GetParamInt(o, "MTU");\r
18425                 t.NatTcpTimeout = GetParamInt(o, "TCPTIMEOUT");\r
18426                 t.NatUdpTimeout = GetParamInt(o, "UDPTIMEOUT");\r
18427                 t.SaveLog = GetParamYes(o, "LOG");\r
18428 \r
18429                 if (ok == false)\r
18430                 {\r
18431                         // パラメータが不正\r
18432                         ret = ERR_INVALID_PARAMETER;\r
18433                         CmdPrintError(c, ret);\r
18434                         FreeParamValueList(o);\r
18435                         return ret;\r
18436                 }\r
18437                 else\r
18438                 {\r
18439                         StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);\r
18440                         ret = ScSetSecureNATOption(ps->Rpc, &t);\r
18441 \r
18442                         if (ret != ERR_NO_ERROR)\r
18443                         {\r
18444                                 // エラー発生\r
18445                                 CmdPrintError(c, ret);\r
18446                                 FreeParamValueList(o);\r
18447                                 return ret;\r
18448                         }\r
18449                 }\r
18450         }\r
18451 \r
18452         FreeParamValueList(o);\r
18453 \r
18454         return 0;\r
18455 }\r
18456 \r
18457 // SecureNAT 機能の仮想 NAT 機能のセッション テーブルの取得\r
18458 UINT PsNatTable(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)\r
18459 {\r
18460         LIST *o;\r
18461         PS *ps = (PS *)param;\r
18462         UINT ret = 0;\r
18463         RPC_ENUM_NAT t;\r
18464 \r
18465         // 仮想 HUB が選択されていない場合はエラー\r
18466         if (ps->HubName == NULL)\r
18467         {\r
18468                 c->Write(c, _UU("CMD_Hub_Not_Selected"));\r
18469                 return ERR_INVALID_PARAMETER;\r
18470         }\r
18471 \r
18472         o = ParseCommandList(c, cmd_name, str, NULL, 0);\r
18473         if (o == NULL)\r
18474         {\r
18475                 return ERR_INVALID_PARAMETER;\r
18476         }\r
18477 \r
18478         Zero(&t, sizeof(t));\r
18479         StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);\r
18480 \r
18481         // RPC 呼び出し\r
18482         ret = ScEnumNAT(ps->Rpc, &t);\r
18483 \r
18484         if (ret != ERR_NO_ERROR)\r
18485         {\r
18486                 // エラー発生\r
18487                 CmdPrintError(c, ret);\r
18488                 FreeParamValueList(o);\r
18489                 return ret;\r
18490         }\r
18491         else\r
18492         {\r
18493                 CT *ct = CtNew();\r
18494                 UINT i;\r
18495 \r
18496                 CtInsertColumn(ct, _UU("NM_NAT_ID"), false);\r
18497                 CtInsertColumn(ct, _UU("NM_NAT_PROTOCOL"), false);\r
18498                 CtInsertColumn(ct, _UU("NM_NAT_SRC_HOST"), false);\r
18499                 CtInsertColumn(ct, _UU("NM_NAT_SRC_PORT"), false);\r
18500                 CtInsertColumn(ct, _UU("NM_NAT_DST_HOST"), false);\r
18501                 CtInsertColumn(ct, _UU("NM_NAT_DST_PORT"), false);\r
18502                 CtInsertColumn(ct, _UU("NM_NAT_CREATED"), false);\r
18503                 CtInsertColumn(ct, _UU("NM_NAT_LAST_COMM"), false);\r
18504                 CtInsertColumn(ct, _UU("NM_NAT_SIZE"), false);\r
18505                 CtInsertColumn(ct, _UU("NM_NAT_TCP_STATUS"), false);\r
18506 \r
18507                 for (i = 0;i < t.NumItem;i++)\r
18508                 {\r
18509                         RPC_ENUM_NAT_ITEM *e = &t.Items[i];\r
18510                         wchar_t tmp0[MAX_SIZE];\r
18511                         wchar_t *tmp1 = L"";\r
18512                         wchar_t tmp2[MAX_SIZE];\r
18513                         wchar_t tmp3[MAX_SIZE];\r
18514                         wchar_t tmp4[MAX_SIZE];\r
18515                         wchar_t tmp5[MAX_SIZE];\r
18516                         wchar_t tmp6[MAX_SIZE];\r
18517                         wchar_t tmp7[MAX_SIZE];\r
18518                         wchar_t tmp8[MAX_SIZE];\r
18519                         wchar_t *tmp9 = L"";\r
18520                         char v1[128], v2[128];\r
18521 \r
18522                         // ID\r
18523                         UniToStru(tmp0, e->Id);\r
18524 \r
18525                         // プロトコル\r
18526                         switch (e->Protocol)\r
18527                         {\r
18528                         case NAT_TCP:\r
18529                                 tmp1 = _UU("NM_NAT_PROTO_TCP");\r
18530                                 break;\r
18531                         case NAT_UDP:\r
18532                                 tmp1 = _UU("NM_NAT_PROTO_UDP");\r
18533                                 break;\r
18534                         case NAT_DNS:\r
18535                                 tmp1 = _UU("NM_NAT_PROTO_DNS");\r
18536                                 break;\r
18537                         }\r
18538 \r
18539                         // 接続元ホスト\r
18540                         StrToUni(tmp2, sizeof(tmp2), e->SrcHost);\r
18541 \r
18542                         // 接続元ポート\r
18543                         UniToStru(tmp3, e->SrcPort);\r
18544 \r
18545                         // 接続先ホスト\r
18546                         StrToUni(tmp4, sizeof(tmp4), e->DestHost);\r
18547 \r
18548                         // 接続先ポート\r
18549                         UniToStru(tmp5, e->DestPort);\r
18550 \r
18551                         // セッション作成日時\r
18552                         GetDateTimeStrEx64(tmp6, sizeof(tmp6), SystemToLocal64(e->CreatedTime), NULL);\r
18553 \r
18554                         // 最終通信日時\r
18555                         GetDateTimeStrEx64(tmp7, sizeof(tmp7), SystemToLocal64(e->LastCommTime), NULL);\r
18556 \r
18557                         // 通信量\r
18558                         ToStr3(v1, sizeof(v1), e->RecvSize);\r
18559                         ToStr3(v2, sizeof(v2), e->SendSize);\r
18560                         UniFormat(tmp8, sizeof(tmp8), L"%S / %S", v1, v2);\r
18561 \r
18562                         // TCP 状態\r
18563                         if (e->Protocol == NAT_TCP)\r
18564                         {\r
18565                                 switch (e->TcpStatus)\r
18566                                 {\r
18567                                 case NAT_TCP_CONNECTING:\r
18568                                         tmp9 = _UU("NAT_TCP_CONNECTING");\r
18569                                         break;\r
18570                                 case NAT_TCP_SEND_RESET:\r
18571                                         tmp9 = _UU("NAT_TCP_SEND_RESET");\r
18572                                         break;\r
18573                                 case NAT_TCP_CONNECTED:\r
18574                                         tmp9 = _UU("NAT_TCP_CONNECTED");\r
18575                                         break;\r
18576                                 case NAT_TCP_ESTABLISHED:\r
18577                                         tmp9 = _UU("NAT_TCP_ESTABLISHED");\r
18578                                         break;\r
18579                                 case NAT_TCP_WAIT_DISCONNECT:\r
18580                                         tmp9 = _UU("NAT_TCP_WAIT_DISCONNECT");\r
18581                                         break;\r
18582                                 }\r
18583                         }\r
18584 \r
18585                         CtInsert(ct,\r
18586                                 tmp0, tmp1, tmp2, tmp3, tmp4, tmp5, tmp6, tmp7, tmp8, tmp9);\r
18587                 }\r
18588 \r
18589                 CtFreeEx(ct, c, true);\r
18590         }\r
18591 \r
18592         FreeRpcEnumNat(&t);\r
18593 \r
18594         FreeParamValueList(o);\r
18595 \r
18596         return 0;\r
18597 }\r
18598 \r
18599 // SecureNAT 機能の仮想 DHCP サーバー機能の設定の取得\r
18600 UINT PsDhcpGet(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)\r
18601 {\r
18602         LIST *o;\r
18603         PS *ps = (PS *)param;\r
18604         UINT ret = 0;\r
18605         VH_OPTION t;\r
18606 \r
18607         // 仮想 HUB が選択されていない場合はエラー\r
18608         if (ps->HubName == NULL)\r
18609         {\r
18610                 c->Write(c, _UU("CMD_Hub_Not_Selected"));\r
18611                 return ERR_INVALID_PARAMETER;\r
18612         }\r
18613 \r
18614         o = ParseCommandList(c, cmd_name, str, NULL, 0);\r
18615         if (o == NULL)\r
18616         {\r
18617                 return ERR_INVALID_PARAMETER;\r
18618         }\r
18619 \r
18620         Zero(&t, sizeof(t));\r
18621         StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);\r
18622 \r
18623         // RPC 呼び出し\r
18624         ret = ScGetSecureNATOption(ps->Rpc, &t);\r
18625 \r
18626         if (ret != ERR_NO_ERROR)\r
18627         {\r
18628                 // エラー発生\r
18629                 CmdPrintError(c, ret);\r
18630                 FreeParamValueList(o);\r
18631                 return ret;\r
18632         }\r
18633         else\r
18634         {\r
18635                 wchar_t tmp[MAX_SIZE];\r
18636                 CT *ct = CtNewStandard();\r
18637 \r
18638                 // 仮想 DHCP 機能を使用する\r
18639                 CtInsert(ct, _UU("CMD_DhcpGet_Column_USE"), t.UseDhcp ? _UU("SEC_YES") : _UU("SEC_NO"));\r
18640 \r
18641                 // 配布アドレス帯の開始\r
18642                 IPToUniStr(tmp, sizeof(tmp), &t.DhcpLeaseIPStart);\r
18643                 CtInsert(ct, _UU("CMD_DhcpGet_Column_IP1"), tmp);\r
18644 \r
18645                 // 配布アドレス帯の終了\r
18646                 IPToUniStr(tmp, sizeof(tmp), &t.DhcpLeaseIPEnd);\r
18647                 CtInsert(ct, _UU("CMD_DhcpGet_Column_IP2"), tmp);\r
18648 \r
18649                 // サブネット マスク\r
18650                 IPToUniStr(tmp, sizeof(tmp), &t.DhcpSubnetMask);\r
18651                 CtInsert(ct, _UU("CMD_DhcpGet_Column_MASK"), tmp);\r
18652 \r
18653                 // リース期限 (秒)\r
18654                 UniToStru(tmp, t.DhcpExpireTimeSpan);\r
18655                 CtInsert(ct, _UU("CMD_DhcpGet_Column_LEASE"), tmp);\r
18656 \r
18657                 // デフォルトゲートウェイアドレス\r
18658                 UniStrCpy(tmp, sizeof(tmp), _UU("SEC_NONE"));\r
18659                 if (IPToUINT(&t.DhcpGatewayAddress) != 0)\r
18660                 {\r
18661                         IPToUniStr(tmp, sizeof(tmp), &t.DhcpGatewayAddress);\r
18662                 }\r
18663                 CtInsert(ct, _UU("CMD_DhcpGet_Column_GW"), tmp);\r
18664 \r
18665                 // DNS サーバー アドレス\r
18666                 UniStrCpy(tmp, sizeof(tmp), _UU("SEC_NONE"));\r
18667                 if (IPToUINT(&t.DhcpDnsServerAddress) != 0)\r
18668                 {\r
18669                         IPToUniStr(tmp, sizeof(tmp), &t.DhcpDnsServerAddress);\r
18670                 }\r
18671                 CtInsert(ct, _UU("CMD_DhcpGet_Column_DNS"), tmp);\r
18672 \r
18673                 // ドメイン名\r
18674                 StrToUni(tmp, sizeof(tmp), t.DhcpDomainName);\r
18675                 CtInsert(ct, _UU("CMD_DhcpGet_Column_DOMAIN"), tmp);\r
18676 \r
18677                 // ログ保存\r
18678                 CtInsert(ct, _UU("CMD_SecureNatHostGet_Column_LOG"), t.SaveLog ? _UU("SEC_YES") : _UU("SEC_NO"));\r
18679 \r
18680                 CtFree(ct, c);\r
18681         }\r
18682 \r
18683         FreeParamValueList(o);\r
18684 \r
18685         return 0;\r
18686 }\r
18687 \r
18688 // SecureNAT 機能の仮想 DHCP サーバー機能の有効化\r
18689 UINT PsDhcpEnable(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)\r
18690 {\r
18691         LIST *o;\r
18692         PS *ps = (PS *)param;\r
18693         UINT ret = 0;\r
18694         VH_OPTION t;\r
18695 \r
18696         // 仮想 HUB が選択されていない場合はエラー\r
18697         if (ps->HubName == NULL)\r
18698         {\r
18699                 c->Write(c, _UU("CMD_Hub_Not_Selected"));\r
18700                 return ERR_INVALID_PARAMETER;\r
18701         }\r
18702 \r
18703         o = ParseCommandList(c, cmd_name, str, NULL, 0);\r
18704         if (o == NULL)\r
18705         {\r
18706                 return ERR_INVALID_PARAMETER;\r
18707         }\r
18708 \r
18709         Zero(&t, sizeof(t));\r
18710         StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);\r
18711 \r
18712         // RPC 呼び出し\r
18713         ret = ScGetSecureNATOption(ps->Rpc, &t);\r
18714 \r
18715         if (ret != ERR_NO_ERROR)\r
18716         {\r
18717                 // エラー発生\r
18718                 CmdPrintError(c, ret);\r
18719                 FreeParamValueList(o);\r
18720                 return ret;\r
18721         }\r
18722         else\r
18723         {\r
18724                 bool ok = true;\r
18725 \r
18726                 t.UseDhcp = true;\r
18727 \r
18728                 if (ok == false)\r
18729                 {\r
18730                         // パラメータが不正\r
18731                         ret = ERR_INVALID_PARAMETER;\r
18732                         CmdPrintError(c, ret);\r
18733                         FreeParamValueList(o);\r
18734                         return ret;\r
18735                 }\r
18736                 else\r
18737                 {\r
18738                         StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);\r
18739                         ret = ScSetSecureNATOption(ps->Rpc, &t);\r
18740 \r
18741                         if (ret != ERR_NO_ERROR)\r
18742                         {\r
18743                                 // エラー発生\r
18744                                 CmdPrintError(c, ret);\r
18745                                 FreeParamValueList(o);\r
18746                                 return ret;\r
18747                         }\r
18748                 }\r
18749         }\r
18750 \r
18751         FreeParamValueList(o);\r
18752 \r
18753         return 0;\r
18754 }\r
18755 \r
18756 // SecureNAT 機能の仮想 DHCP サーバー機能の無効化\r
18757 UINT PsDhcpDisable(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)\r
18758 {\r
18759         LIST *o;\r
18760         PS *ps = (PS *)param;\r
18761         UINT ret = 0;\r
18762         VH_OPTION t;\r
18763 \r
18764         // 仮想 HUB が選択されていない場合はエラー\r
18765         if (ps->HubName == NULL)\r
18766         {\r
18767                 c->Write(c, _UU("CMD_Hub_Not_Selected"));\r
18768                 return ERR_INVALID_PARAMETER;\r
18769         }\r
18770 \r
18771         o = ParseCommandList(c, cmd_name, str, NULL, 0);\r
18772         if (o == NULL)\r
18773         {\r
18774                 return ERR_INVALID_PARAMETER;\r
18775         }\r
18776 \r
18777         Zero(&t, sizeof(t));\r
18778         StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);\r
18779 \r
18780         // RPC 呼び出し\r
18781         ret = ScGetSecureNATOption(ps->Rpc, &t);\r
18782 \r
18783         if (ret != ERR_NO_ERROR)\r
18784         {\r
18785                 // エラー発生\r
18786                 CmdPrintError(c, ret);\r
18787                 FreeParamValueList(o);\r
18788                 return ret;\r
18789         }\r
18790         else\r
18791         {\r
18792                 bool ok = true;\r
18793 \r
18794                 t.UseDhcp = false;\r
18795 \r
18796                 if (ok == false)\r
18797                 {\r
18798                         // パラメータが不正\r
18799                         ret = ERR_INVALID_PARAMETER;\r
18800                         CmdPrintError(c, ret);\r
18801                         FreeParamValueList(o);\r
18802                         return ret;\r
18803                 }\r
18804                 else\r
18805                 {\r
18806                         ret = ScSetSecureNATOption(ps->Rpc, &t);\r
18807 \r
18808                         if (ret != ERR_NO_ERROR)\r
18809                         {\r
18810                                 // エラー発生\r
18811                                 CmdPrintError(c, ret);\r
18812                                 FreeParamValueList(o);\r
18813                                 return ret;\r
18814                         }\r
18815                 }\r
18816         }\r
18817 \r
18818         FreeParamValueList(o);\r
18819 \r
18820         return 0;\r
18821 }\r
18822 \r
18823 // SecureNAT 機能の仮想 DHCP サーバー機能の設定の変更\r
18824 UINT PsDhcpSet(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)\r
18825 {\r
18826         LIST *o;\r
18827         PS *ps = (PS *)param;\r
18828         UINT ret = 0;\r
18829         VH_OPTION t;\r
18830         // 指定できるパラメータ リスト\r
18831         CMD_EVAL_MIN_MAX mm =\r
18832         {\r
18833                 "CMD_NatSet_Eval_UDP", NAT_UDP_MIN_TIMEOUT / 1000, NAT_UDP_MAX_TIMEOUT / 1000,\r
18834         };\r
18835         PARAM args[] =\r
18836         {\r
18837                 // "name", prompt_proc, prompt_param, eval_proc, eval_param\r
18838                 {"START", CmdPrompt, _UU("CMD_DhcpSet_Prompt_START"), CmdEvalIp, NULL},\r
18839                 {"END", CmdPrompt, _UU("CMD_DhcpSet_Prompt_END"), CmdEvalIp, NULL},\r
18840                 {"MASK", CmdPrompt, _UU("CMD_DhcpSet_Prompt_MASK"), CmdEvalIp, NULL},\r
18841                 {"EXPIRE", CmdPrompt, _UU("CMD_DhcpSet_Prompt_EXPIRE"), CmdEvalMinMax, &mm},\r
18842                 {"GW", CmdPrompt, _UU("CMD_DhcpSet_Prompt_GW"), CmdEvalIp, NULL},\r
18843                 {"DNS", CmdPrompt, _UU("CMD_DhcpSet_Prompt_DNS"), CmdEvalIp, NULL},\r
18844                 {"DOMAIN", CmdPrompt, _UU("CMD_DhcpSet_Prompt_DOMAIN"), NULL, NULL},\r
18845                 {"LOG", CmdPrompt, _UU("CMD_NatSet_Prompt_LOG"), CmdEvalNotEmpty, NULL},\r
18846         };\r
18847 \r
18848         // 仮想 HUB が選択されていない場合はエラー\r
18849         if (ps->HubName == NULL)\r
18850         {\r
18851                 c->Write(c, _UU("CMD_Hub_Not_Selected"));\r
18852                 return ERR_INVALID_PARAMETER;\r
18853         }\r
18854 \r
18855         o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));\r
18856         if (o == NULL)\r
18857         {\r
18858                 return ERR_INVALID_PARAMETER;\r
18859         }\r
18860 \r
18861         Zero(&t, sizeof(t));\r
18862         StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);\r
18863 \r
18864         // RPC 呼び出し\r
18865         ret = ScGetSecureNATOption(ps->Rpc, &t);\r
18866 \r
18867         if (ret != ERR_NO_ERROR)\r
18868         {\r
18869                 // エラー発生\r
18870                 CmdPrintError(c, ret);\r
18871                 FreeParamValueList(o);\r
18872                 return ret;\r
18873         }\r
18874         else\r
18875         {\r
18876                 bool ok = true;\r
18877 \r
18878                 StrToIP(&t.DhcpLeaseIPStart, GetParamStr(o, "START"));\r
18879                 StrToIP(&t.DhcpLeaseIPEnd, GetParamStr(o, "END"));\r
18880                 StrToIP(&t.DhcpSubnetMask, GetParamStr(o, "MASK"));\r
18881                 t.DhcpExpireTimeSpan = GetParamInt(o, "EXPIRE");\r
18882                 StrToIP(&t.DhcpGatewayAddress, GetParamStr(o, "GW"));\r
18883                 StrToIP(&t.DhcpDnsServerAddress, GetParamStr(o, "DNS"));\r
18884                 StrCpy(t.DhcpDomainName, sizeof(t.DhcpDomainName), GetParamStr(o, "DOMAIN"));\r
18885                 t.SaveLog = GetParamYes(o, "LOG");\r
18886 \r
18887                 if (ok == false)\r
18888                 {\r
18889                         // パラメータが不正\r
18890                         ret = ERR_INVALID_PARAMETER;\r
18891                         CmdPrintError(c, ret);\r
18892                         FreeParamValueList(o);\r
18893                         return ret;\r
18894                 }\r
18895                 else\r
18896                 {\r
18897                         StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);\r
18898                         ret = ScSetSecureNATOption(ps->Rpc, &t);\r
18899 \r
18900                         if (ret != ERR_NO_ERROR)\r
18901                         {\r
18902                                 // エラー発生\r
18903                                 CmdPrintError(c, ret);\r
18904                                 FreeParamValueList(o);\r
18905                                 return ret;\r
18906                         }\r
18907                 }\r
18908         }\r
18909 \r
18910         FreeParamValueList(o);\r
18911 \r
18912         return 0;\r
18913 }\r
18914 \r
18915 // SecureNAT 機能の仮想 DHCP サーバー機能のリース テーブルの取得\r
18916 UINT PsDhcpTable(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)\r
18917 {\r
18918         LIST *o;\r
18919         PS *ps = (PS *)param;\r
18920         UINT ret = 0;\r
18921         RPC_ENUM_DHCP t;\r
18922 \r
18923         // 仮想 HUB が選択されていない場合はエラー\r
18924         if (ps->HubName == NULL)\r
18925         {\r
18926                 c->Write(c, _UU("CMD_Hub_Not_Selected"));\r
18927                 return ERR_INVALID_PARAMETER;\r
18928         }\r
18929 \r
18930         o = ParseCommandList(c, cmd_name, str, NULL, 0);\r
18931         if (o == NULL)\r
18932         {\r
18933                 return ERR_INVALID_PARAMETER;\r
18934         }\r
18935 \r
18936         Zero(&t, sizeof(t));\r
18937         StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);\r
18938 \r
18939         // RPC 呼び出し\r
18940         ret = ScEnumDHCP(ps->Rpc, &t);\r
18941 \r
18942         if (ret != ERR_NO_ERROR)\r
18943         {\r
18944                 // エラー発生\r
18945                 CmdPrintError(c, ret);\r
18946                 FreeParamValueList(o);\r
18947                 return ret;\r
18948         }\r
18949         else\r
18950         {\r
18951                 CT *ct = CtNew();\r
18952                 UINT i;\r
18953 \r
18954                 CtInsertColumn(ct, _UU("DHCP_DHCP_ID"), false);\r
18955                 CtInsertColumn(ct, _UU("DHCP_LEASED_TIME"), false);\r
18956                 CtInsertColumn(ct, _UU("DHCP_EXPIRE_TIME"), false);\r
18957                 CtInsertColumn(ct, _UU("DHCP_MAC_ADDRESS"), false);\r
18958                 CtInsertColumn(ct, _UU("DHCP_IP_ADDRESS"), false);\r
18959                 CtInsertColumn(ct, _UU("DHCP_HOSTNAME"), false);\r
18960 \r
18961                 for (i = 0;i < t.NumItem;i++)\r
18962                 {\r
18963                         RPC_ENUM_DHCP_ITEM *e = &t.Items[i];\r
18964                         wchar_t tmp0[MAX_SIZE];\r
18965                         wchar_t tmp1[MAX_SIZE];\r
18966                         wchar_t tmp2[MAX_SIZE];\r
18967                         wchar_t tmp3[MAX_SIZE];\r
18968                         wchar_t tmp4[MAX_SIZE];\r
18969                         wchar_t tmp5[MAX_SIZE];\r
18970                         char str[MAX_SIZE];\r
18971 \r
18972                         // ID\r
18973                         UniToStru(tmp0, e->Id);\r
18974 \r
18975                         // 時刻\r
18976                         GetDateTimeStrEx64(tmp1, sizeof(tmp1), SystemToLocal64(e->LeasedTime), NULL);\r
18977                         GetDateTimeStrEx64(tmp2, sizeof(tmp2), SystemToLocal64(e->ExpireTime), NULL);\r
18978 \r
18979                         MacToStr(str, sizeof(str), e->MacAddress);\r
18980                         StrToUni(tmp3, sizeof(tmp3), str);\r
18981 \r
18982                         IPToStr32(str, sizeof(str), e->IpAddress);\r
18983                         StrToUni(tmp4, sizeof(tmp4), str);\r
18984 \r
18985                         StrToUni(tmp5, sizeof(tmp5), e->Hostname);\r
18986 \r
18987                         CtInsert(ct,\r
18988                                 tmp0, tmp1, tmp2, tmp3, tmp4, tmp5);\r
18989                 }\r
18990 \r
18991                 CtFreeEx(ct, c, true);\r
18992         }\r
18993 \r
18994         FreeRpcEnumDhcp(&t);\r
18995 \r
18996         FreeParamValueList(o);\r
18997 \r
18998         return 0;\r
18999 }\r
19000 \r
19001 // 仮想 HUB 管理オプションの一覧の取得\r
19002 UINT PsAdminOptionList(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)\r
19003 {\r
19004         LIST *o;\r
19005         PS *ps = (PS *)param;\r
19006         UINT ret = 0;\r
19007         RPC_ADMIN_OPTION t;\r
19008 \r
19009         // 仮想 HUB が選択されていない場合はエラー\r
19010         if (ps->HubName == NULL)\r
19011         {\r
19012                 c->Write(c, _UU("CMD_Hub_Not_Selected"));\r
19013                 return ERR_INVALID_PARAMETER;\r
19014         }\r
19015 \r
19016         o = ParseCommandList(c, cmd_name, str, NULL, 0);\r
19017         if (o == NULL)\r
19018         {\r
19019                 return ERR_INVALID_PARAMETER;\r
19020         }\r
19021 \r
19022         Zero(&t, sizeof(t));\r
19023         StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);\r
19024 \r
19025         // RPC 呼び出し\r
19026         ret = ScGetHubAdminOptions(ps->Rpc, &t);\r
19027 \r
19028         if (ret != ERR_NO_ERROR)\r
19029         {\r
19030                 // エラー発生\r
19031                 CmdPrintError(c, ret);\r
19032                 FreeParamValueList(o);\r
19033                 return ret;\r
19034         }\r
19035         else\r
19036         {\r
19037                 CT *ct = CtNewStandardEx();\r
19038                 UINT i;\r
19039 \r
19040                 for (i = 0;i < t.NumItem;i++)\r
19041                 {\r
19042                         ADMIN_OPTION *e = &t.Items[i];\r
19043                         wchar_t tmp1[MAX_SIZE];\r
19044                         wchar_t tmp2[MAX_SIZE];\r
19045 \r
19046                         StrToUni(tmp1, sizeof(tmp1), e->Name);\r
19047                         UniToStru(tmp2, e->Value);\r
19048 \r
19049                         CtInsert(ct, tmp1, tmp2, GetHubAdminOptionHelpString(e->Name));\r
19050                                 \r
19051                 }\r
19052 \r
19053                 CtFreeEx(ct, c, true);\r
19054         }\r
19055 \r
19056         FreeRpcAdminOption(&t);\r
19057 \r
19058         FreeParamValueList(o);\r
19059 \r
19060         return 0;\r
19061 }\r
19062 \r
19063 // 仮想 HUB 管理オプションの値の設定\r
19064 UINT PsAdminOptionSet(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)\r
19065 {\r
19066         LIST *o;\r
19067         PS *ps = (PS *)param;\r
19068         UINT ret = 0;\r
19069         RPC_ADMIN_OPTION t;\r
19070         // 指定できるパラメータ リスト\r
19071         PARAM args[] =\r
19072         {\r
19073                 // "name", prompt_proc, prompt_param, eval_proc, eval_param\r
19074                 {"[name]", CmdPrompt, _UU("CMD_AdminOptionSet_Prompt_name"), CmdEvalNotEmpty, NULL},\r
19075                 {"VALUE", CmdPrompt, _UU("CMD_AdminOptionSet_Prompt_VALUE"), CmdEvalNotEmpty, NULL},\r
19076         };\r
19077 \r
19078         // 仮想 HUB が選択されていない場合はエラー\r
19079         if (ps->HubName == NULL)\r
19080         {\r
19081                 c->Write(c, _UU("CMD_Hub_Not_Selected"));\r
19082                 return ERR_INVALID_PARAMETER;\r
19083         }\r
19084 \r
19085         o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));\r
19086         if (o == NULL)\r
19087         {\r
19088                 return ERR_INVALID_PARAMETER;\r
19089         }\r
19090 \r
19091         Zero(&t, sizeof(t));\r
19092         StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);\r
19093 \r
19094         // RPC 呼び出し\r
19095         ret = ScGetHubAdminOptions(ps->Rpc, &t);\r
19096 \r
19097         if (ret != ERR_NO_ERROR)\r
19098         {\r
19099                 // エラー発生\r
19100                 CmdPrintError(c, ret);\r
19101                 FreeParamValueList(o);\r
19102                 return ret;\r
19103         }\r
19104         else\r
19105         {\r
19106                 UINT i;\r
19107                 bool b = false;\r
19108 \r
19109                 for (i = 0;i < t.NumItem;i++)\r
19110                 {\r
19111                         if (StrCmpi(t.Items[i].Name, GetParamStr(o, "[name]")) == 0)\r
19112                         {\r
19113                                 t.Items[i].Value = GetParamInt(o, "VALUE");\r
19114                                 b = true;\r
19115                         }\r
19116                 }\r
19117 \r
19118                 if (b == false)\r
19119                 {\r
19120                         // エラー発生\r
19121                         ret = ERR_OBJECT_NOT_FOUND;\r
19122                         CmdPrintError(c, ret);\r
19123                         FreeParamValueList(o);\r
19124                         FreeRpcAdminOption(&t);\r
19125                         return ret;\r
19126                 }\r
19127                 else\r
19128                 {\r
19129                         StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);\r
19130                         ret = ScSetHubAdminOptions(ps->Rpc, &t);\r
19131 \r
19132                         if (ret != ERR_NO_ERROR)\r
19133                         {\r
19134                                 // エラー発生\r
19135                                 CmdPrintError(c, ret);\r
19136                                 FreeParamValueList(o);\r
19137                                 return ret;\r
19138                         }\r
19139                 }\r
19140         }\r
19141 \r
19142         FreeRpcAdminOption(&t);\r
19143 \r
19144         FreeParamValueList(o);\r
19145 \r
19146         return 0;\r
19147 }\r
19148 \r
19149 // 仮想 HUB 拡張オプションの一覧の取得\r
19150 UINT PsExtOptionList(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)\r
19151 {\r
19152         LIST *o;\r
19153         PS *ps = (PS *)param;\r
19154         UINT ret = 0;\r
19155         RPC_ADMIN_OPTION t;\r
19156 \r
19157         // 仮想 HUB が選択されていない場合はエラー\r
19158         if (ps->HubName == NULL)\r
19159         {\r
19160                 c->Write(c, _UU("CMD_Hub_Not_Selected"));\r
19161                 return ERR_INVALID_PARAMETER;\r
19162         }\r
19163 \r
19164         o = ParseCommandList(c, cmd_name, str, NULL, 0);\r
19165         if (o == NULL)\r
19166         {\r
19167                 return ERR_INVALID_PARAMETER;\r
19168         }\r
19169 \r
19170         Zero(&t, sizeof(t));\r
19171         StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);\r
19172 \r
19173         // RPC 呼び出し\r
19174         ret = ScGetHubExtOptions(ps->Rpc, &t);\r
19175 \r
19176         if (ret != ERR_NO_ERROR)\r
19177         {\r
19178                 // エラー発生\r
19179                 CmdPrintError(c, ret);\r
19180                 FreeParamValueList(o);\r
19181                 return ret;\r
19182         }\r
19183         else\r
19184         {\r
19185                 CT *ct = CtNewStandardEx();\r
19186                 UINT i;\r
19187 \r
19188                 for (i = 0;i < t.NumItem;i++)\r
19189                 {\r
19190                         ADMIN_OPTION *e = &t.Items[i];\r
19191                         wchar_t tmp1[MAX_SIZE];\r
19192                         wchar_t tmp2[MAX_SIZE];\r
19193 \r
19194                         StrToUni(tmp1, sizeof(tmp1), e->Name);\r
19195                         UniToStru(tmp2, e->Value);\r
19196 \r
19197                         CtInsert(ct, tmp1, tmp2, GetHubAdminOptionHelpString(e->Name));\r
19198 \r
19199                 }\r
19200 \r
19201                 CtFreeEx(ct, c, true);\r
19202         }\r
19203 \r
19204         FreeRpcAdminOption(&t);\r
19205 \r
19206         FreeParamValueList(o);\r
19207 \r
19208         return 0;\r
19209 }\r
19210 \r
19211 // 仮想 HUB 拡張オプションの値の設定\r
19212 UINT PsExtOptionSet(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)\r
19213 {\r
19214         LIST *o;\r
19215         PS *ps = (PS *)param;\r
19216         UINT ret = 0;\r
19217         RPC_ADMIN_OPTION t;\r
19218         // 指定できるパラメータ リスト\r
19219         PARAM args[] =\r
19220         {\r
19221                 // "name", prompt_proc, prompt_param, eval_proc, eval_param\r
19222                 {"[name]", CmdPrompt, _UU("CMD_AdminOptionSet_Prompt_name"), CmdEvalNotEmpty, NULL},\r
19223                 {"VALUE", CmdPrompt, _UU("CMD_AdminOptionSet_Prompt_VALUE"), CmdEvalNotEmpty, NULL},\r
19224         };\r
19225 \r
19226         // 仮想 HUB が選択されていない場合はエラー\r
19227         if (ps->HubName == NULL)\r
19228         {\r
19229                 c->Write(c, _UU("CMD_Hub_Not_Selected"));\r
19230                 return ERR_INVALID_PARAMETER;\r
19231         }\r
19232 \r
19233         o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));\r
19234         if (o == NULL)\r
19235         {\r
19236                 return ERR_INVALID_PARAMETER;\r
19237         }\r
19238 \r
19239         Zero(&t, sizeof(t));\r
19240         StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);\r
19241 \r
19242         // RPC 呼び出し\r
19243         ret = ScGetHubExtOptions(ps->Rpc, &t);\r
19244 \r
19245         if (ret != ERR_NO_ERROR)\r
19246         {\r
19247                 // エラー発生\r
19248                 CmdPrintError(c, ret);\r
19249                 FreeParamValueList(o);\r
19250                 return ret;\r
19251         }\r
19252         else\r
19253         {\r
19254                 UINT i;\r
19255                 bool b = false;\r
19256 \r
19257                 for (i = 0;i < t.NumItem;i++)\r
19258                 {\r
19259                         if (StrCmpi(t.Items[i].Name, GetParamStr(o, "[name]")) == 0)\r
19260                         {\r
19261                                 t.Items[i].Value = GetParamInt(o, "VALUE");\r
19262                                 b = true;\r
19263                         }\r
19264                 }\r
19265 \r
19266                 if (b == false)\r
19267                 {\r
19268                         // エラー発生\r
19269                         ret = ERR_OBJECT_NOT_FOUND;\r
19270                         CmdPrintError(c, ret);\r
19271                         FreeParamValueList(o);\r
19272                         FreeRpcAdminOption(&t);\r
19273                         return ret;\r
19274                 }\r
19275                 else\r
19276                 {\r
19277                         StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);\r
19278                         ret = ScSetHubExtOptions(ps->Rpc, &t);\r
19279 \r
19280                         if (ret != ERR_NO_ERROR)\r
19281                         {\r
19282                                 // エラー発生\r
19283                                 CmdPrintError(c, ret);\r
19284                                 FreeParamValueList(o);\r
19285                                 return ret;\r
19286                         }\r
19287                 }\r
19288         }\r
19289 \r
19290         FreeRpcAdminOption(&t);\r
19291 \r
19292         FreeParamValueList(o);\r
19293 \r
19294         return 0;\r
19295 }\r
19296 \r
19297 // 無効な証明書リストの一覧の取得\r
19298 UINT PsCrlList(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)\r
19299 {\r
19300         LIST *o;\r
19301         PS *ps = (PS *)param;\r
19302         UINT ret = 0;\r
19303         RPC_ENUM_CRL t;\r
19304 \r
19305         // 仮想 HUB が選択されていない場合はエラー\r
19306         if (ps->HubName == NULL)\r
19307         {\r
19308                 c->Write(c, _UU("CMD_Hub_Not_Selected"));\r
19309                 return ERR_INVALID_PARAMETER;\r
19310         }\r
19311 \r
19312         o = ParseCommandList(c, cmd_name, str, NULL, 0);\r
19313         if (o == NULL)\r
19314         {\r
19315                 return ERR_INVALID_PARAMETER;\r
19316         }\r
19317 \r
19318         Zero(&t, sizeof(t));\r
19319         StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);\r
19320 \r
19321         // RPC 呼び出し\r
19322         ret = ScEnumCrl(ps->Rpc, &t);\r
19323 \r
19324         if (ret != ERR_NO_ERROR)\r
19325         {\r
19326                 // エラー発生\r
19327                 CmdPrintError(c, ret);\r
19328                 FreeParamValueList(o);\r
19329                 return ret;\r
19330         }\r
19331         else\r
19332         {\r
19333                 UINT i;\r
19334                 CT *ct = CtNew();\r
19335 \r
19336                 CtInsertColumn(ct, _UU("CMD_ID"), false);\r
19337                 CtInsertColumn(ct, _UU("SM_CRL_COLUMN_1"), false);\r
19338 \r
19339                 for (i = 0;i < t.NumItem;i++)\r
19340                 {\r
19341                         wchar_t tmp[64];\r
19342                         RPC_ENUM_CRL_ITEM *e = &t.Items[i];\r
19343 \r
19344                         UniToStru(tmp, e->Key);\r
19345                         CtInsert(ct, tmp, e->CrlInfo);\r
19346                 }\r
19347 \r
19348                 CtFreeEx(ct, c, true);\r
19349         }\r
19350 \r
19351         FreeRpcEnumCrl(&t);\r
19352 \r
19353         FreeParamValueList(o);\r
19354 \r
19355         return 0;\r
19356 }\r
19357 \r
19358 // 無効な証明書の追加\r
19359 UINT PsCrlAdd(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)\r
19360 {\r
19361         LIST *o;\r
19362         PS *ps = (PS *)param;\r
19363         UINT ret = 0;\r
19364         RPC_CRL t;\r
19365         // 指定できるパラメータ リスト\r
19366         PARAM args[] =\r
19367         {\r
19368                 {"SERIAL", NULL, NULL, NULL, NULL},\r
19369                 {"MD5", NULL, NULL, NULL, NULL},\r
19370                 {"SHA1", NULL, NULL, NULL, NULL},\r
19371                 {"CN", NULL, NULL, NULL, NULL},\r
19372                 {"O", NULL, NULL, NULL, NULL},\r
19373                 {"OU", NULL, NULL, NULL, NULL},\r
19374                 {"C", NULL, NULL, NULL, NULL},\r
19375                 {"ST", NULL, NULL, NULL, NULL},\r
19376                 {"L", NULL, NULL, NULL, NULL},\r
19377         };\r
19378 \r
19379         // 仮想 HUB が選択されていない場合はエラー\r
19380         if (ps->HubName == NULL)\r
19381         {\r
19382                 c->Write(c, _UU("CMD_Hub_Not_Selected"));\r
19383                 return ERR_INVALID_PARAMETER;\r
19384         }\r
19385 \r
19386         o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));\r
19387         if (o == NULL)\r
19388         {\r
19389                 return ERR_INVALID_PARAMETER;\r
19390         }\r
19391 \r
19392         Zero(&t, sizeof(t));\r
19393         StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);\r
19394 \r
19395         {\r
19396                 bool param_exists = false;\r
19397                 CRL *crl = ZeroMalloc(sizeof(CRL));\r
19398                 NAME *n;\r
19399                 n = crl->Name = ZeroMalloc(sizeof(NAME));\r
19400 \r
19401                 if (IsEmptyStr(GetParamStr(o, "CN")) == false)\r
19402                 {\r
19403                         n->CommonName = CopyUniStr(GetParamUniStr(o, "CN"));\r
19404                         param_exists = true;\r
19405                 }\r
19406 \r
19407                 if (IsEmptyStr(GetParamStr(o, "O")) == false)\r
19408                 {\r
19409                         n->CommonName = CopyUniStr(GetParamUniStr(o, "O"));\r
19410                         param_exists = true;\r
19411                 }\r
19412 \r
19413                 if (IsEmptyStr(GetParamStr(o, "OU")) == false)\r
19414                 {\r
19415                         n->CommonName = CopyUniStr(GetParamUniStr(o, "OU"));\r
19416                         param_exists = true;\r
19417                 }\r
19418 \r
19419                 if (IsEmptyStr(GetParamStr(o, "C")) == false)\r
19420                 {\r
19421                         n->CommonName = CopyUniStr(GetParamUniStr(o, "C"));\r
19422                         param_exists = true;\r
19423                 }\r
19424 \r
19425                 if (IsEmptyStr(GetParamStr(o, "ST")) == false)\r
19426                 {\r
19427                         n->CommonName = CopyUniStr(GetParamUniStr(o, "ST"));\r
19428                         param_exists = true;\r
19429                 }\r
19430 \r
19431                 if (IsEmptyStr(GetParamStr(o, "L")) == false)\r
19432                 {\r
19433                         n->CommonName = CopyUniStr(GetParamUniStr(o, "L"));\r
19434                         param_exists = true;\r
19435                 }\r
19436 \r
19437                 if (IsEmptyStr(GetParamStr(o, "SERIAL")) == false)\r
19438                 {\r
19439                         BUF *b;\r
19440 \r
19441                         b = StrToBin(GetParamStr(o, "SERIAL"));\r
19442 \r
19443                         if (b != NULL && b->Size >= 1)\r
19444                         {\r
19445                                 crl->Serial = NewXSerial(b->Buf, b->Size);\r
19446                                 param_exists = true;\r
19447                         }\r
19448 \r
19449                         FreeBuf(b);\r
19450                 }\r
19451 \r
19452                 if (IsEmptyStr(GetParamStr(o, "MD5")) == false)\r
19453                 {\r
19454                         BUF *b;\r
19455 \r
19456                         b = StrToBin(GetParamStr(o, "MD5"));\r
19457 \r
19458                         if (b != NULL && b->Size == MD5_SIZE)\r
19459                         {\r
19460                                 Copy(crl->DigestMD5, b->Buf, MD5_SIZE);\r
19461                                 param_exists = true;\r
19462                         }\r
19463 \r
19464                         FreeBuf(b);\r
19465                 }\r
19466 \r
19467                 if (IsEmptyStr(GetParamStr(o, "SHA1")) == false)\r
19468                 {\r
19469                         BUF *b;\r
19470 \r
19471                         b = StrToBin(GetParamStr(o, "SHA1"));\r
19472 \r
19473                         if (b != NULL && b->Size == SHA1_SIZE)\r
19474                         {\r
19475                                 Copy(crl->DigestSHA1, b->Buf, SHA1_SIZE);\r
19476                                 param_exists = true;\r
19477                         }\r
19478 \r
19479                         FreeBuf(b);\r
19480                 }\r
19481 \r
19482                 t.Crl = crl;\r
19483 \r
19484                 if (param_exists == false)\r
19485                 {\r
19486                         FreeRpcCrl(&t);\r
19487                         ret = ERR_INVALID_PARAMETER;\r
19488                         CmdPrintError(c, ret);\r
19489                         FreeParamValueList(o);\r
19490                         return ret;\r
19491                 }\r
19492         }\r
19493 \r
19494         // RPC 呼び出し\r
19495         ret = ScAddCrl(ps->Rpc, &t);\r
19496 \r
19497         if (ret != ERR_NO_ERROR)\r
19498         {\r
19499                 // エラー発生\r
19500                 CmdPrintError(c, ret);\r
19501                 FreeParamValueList(o);\r
19502                 return ret;\r
19503         }\r
19504 \r
19505         FreeRpcCrl(&t);\r
19506 \r
19507         FreeParamValueList(o);\r
19508 \r
19509         return 0;\r
19510 }\r
19511 \r
19512 // 無効な証明書の削除\r
19513 UINT PsCrlDel(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)\r
19514 {\r
19515         LIST *o;\r
19516         PS *ps = (PS *)param;\r
19517         UINT ret = 0;\r
19518         RPC_CRL t;\r
19519         // 指定できるパラメータ リスト\r
19520         PARAM args[] =\r
19521         {\r
19522                 // "name", prompt_proc, prompt_param, eval_proc, eval_param\r
19523                 {"[id]", CmdPrompt, _UU("CMD_CrlDel_Prompt_ID"), CmdEvalNotEmpty, NULL},\r
19524         };\r
19525 \r
19526         // 仮想 HUB が選択されていない場合はエラー\r
19527         if (ps->HubName == NULL)\r
19528         {\r
19529                 c->Write(c, _UU("CMD_Hub_Not_Selected"));\r
19530                 return ERR_INVALID_PARAMETER;\r
19531         }\r
19532 \r
19533         o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));\r
19534         if (o == NULL)\r
19535         {\r
19536                 return ERR_INVALID_PARAMETER;\r
19537         }\r
19538 \r
19539         Zero(&t, sizeof(t));\r
19540         StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);\r
19541         t.Key = GetParamInt(o, "[id]");\r
19542 \r
19543         // RPC 呼び出し\r
19544         ret = ScDelCrl(ps->Rpc, &t);\r
19545 \r
19546         if (ret != ERR_NO_ERROR)\r
19547         {\r
19548                 // エラー発生\r
19549                 CmdPrintError(c, ret);\r
19550                 FreeParamValueList(o);\r
19551                 return ret;\r
19552         }\r
19553 \r
19554         FreeRpcCrl(&t);\r
19555 \r
19556         FreeParamValueList(o);\r
19557 \r
19558         return 0;\r
19559 }\r
19560 \r
19561 // 無効な証明書の取得\r
19562 UINT PsCrlGet(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)\r
19563 {\r
19564         LIST *o;\r
19565         PS *ps = (PS *)param;\r
19566         UINT ret = 0;\r
19567         RPC_CRL t;\r
19568         // 指定できるパラメータ リスト\r
19569         PARAM args[] =\r
19570         {\r
19571                 // "name", prompt_proc, prompt_param, eval_proc, eval_param\r
19572                 {"[id]", CmdPrompt, _UU("CMD_CrlGet_Prompt_ID"), CmdEvalNotEmpty, NULL},\r
19573         };\r
19574 \r
19575         // 仮想 HUB が選択されていない場合はエラー\r
19576         if (ps->HubName == NULL)\r
19577         {\r
19578                 c->Write(c, _UU("CMD_Hub_Not_Selected"));\r
19579                 return ERR_INVALID_PARAMETER;\r
19580         }\r
19581 \r
19582         o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));\r
19583         if (o == NULL)\r
19584         {\r
19585                 return ERR_INVALID_PARAMETER;\r
19586         }\r
19587 \r
19588         Zero(&t, sizeof(t));\r
19589         StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);\r
19590         t.Key = GetParamInt(o, "[id]");\r
19591 \r
19592         // RPC 呼び出し\r
19593         ret = ScGetCrl(ps->Rpc, &t);\r
19594 \r
19595         if (ret != ERR_NO_ERROR)\r
19596         {\r
19597                 // エラー発生\r
19598                 CmdPrintError(c, ret);\r
19599                 FreeParamValueList(o);\r
19600                 return ret;\r
19601         }\r
19602         else\r
19603         {\r
19604                 // 内容の表示\r
19605                 CT *ct = CtNewStandard();\r
19606                 CRL *crl = t.Crl;\r
19607                 NAME *n;\r
19608 \r
19609                 if (crl != NULL)\r
19610                 {\r
19611                         n = crl->Name;\r
19612 \r
19613                         if (n != NULL)\r
19614                         {\r
19615                                 if (UniIsEmptyStr(n->CommonName) == false)\r
19616                                 {\r
19617                                         CtInsert(ct, _UU("CMD_CrlGet_CN"), n->CommonName);\r
19618                                 }\r
19619                                 if (UniIsEmptyStr(n->Organization) == false)\r
19620                                 {\r
19621                                         CtInsert(ct, _UU("CMD_CrlGet_O"), n->Organization);\r
19622                                 }\r
19623                                 if (UniIsEmptyStr(n->Unit) == false)\r
19624                                 {\r
19625                                         CtInsert(ct, _UU("CMD_CrlGet_OU"), n->Unit);\r
19626                                 }\r
19627                                 if (UniIsEmptyStr(n->Country) == false)\r
19628                                 {\r
19629                                         CtInsert(ct, _UU("CMD_CrlGet_C"), n->Country);\r
19630                                 }\r
19631                                 if (UniIsEmptyStr(n->State) == false)\r
19632                                 {\r
19633                                         CtInsert(ct, _UU("CMD_CrlGet_ST"), n->State);\r
19634                                 }\r
19635                                 if (UniIsEmptyStr(n->Local) == false)\r
19636                                 {\r
19637                                         CtInsert(ct, _UU("CMD_CrlGet_L"), n->Local);\r
19638                                 }\r
19639                         }\r
19640 \r
19641                         if (crl->Serial != NULL && crl->Serial->size >= 1)\r
19642                         {\r
19643                                 wchar_t tmp[MAX_SIZE];\r
19644                                 char str[MAX_SIZE];\r
19645 \r
19646                                 BinToStrEx(str, sizeof(str), crl->Serial->data, crl->Serial->size);\r
19647                                 StrToUni(tmp, sizeof(tmp), str);\r
19648 \r
19649                                 CtInsert(ct, _UU("CMD_CrlGet_SERI"), tmp);\r
19650                         }\r
19651 \r
19652                         if (IsZero(crl->DigestMD5, MD5_SIZE) == false)\r
19653                         {\r
19654                                 wchar_t tmp[MAX_SIZE];\r
19655                                 char str[MAX_SIZE];\r
19656 \r
19657                                 BinToStrEx(str, sizeof(str), crl->DigestMD5, MD5_SIZE);\r
19658                                 StrToUni(tmp, sizeof(tmp), str);\r
19659 \r
19660                                 CtInsert(ct, _UU("CMD_CrlGet_MD5_HASH"), tmp);\r
19661                         }\r
19662 \r
19663                         if (IsZero(crl->DigestSHA1, SHA1_SIZE) == false)\r
19664                         {\r
19665                                 wchar_t tmp[MAX_SIZE];\r
19666                                 char str[MAX_SIZE];\r
19667 \r
19668                                 BinToStrEx(str, sizeof(str), crl->DigestSHA1, SHA1_SIZE);\r
19669                                 StrToUni(tmp, sizeof(tmp), str);\r
19670 \r
19671                                 CtInsert(ct, _UU("CMD_CrlGet_SHA1_HASH"), tmp);\r
19672                         }\r
19673                 }\r
19674                 CtFree(ct, c);\r
19675         }\r
19676 \r
19677         FreeRpcCrl(&t);\r
19678 \r
19679         FreeParamValueList(o);\r
19680 \r
19681         return 0;\r
19682 }\r
19683 \r
19684 // IP アクセス制御リストのルール一覧の取得\r
19685 UINT PsAcList(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)\r
19686 {\r
19687         LIST *o;\r
19688         PS *ps = (PS *)param;\r
19689         UINT ret = 0;\r
19690         RPC_AC_LIST t;\r
19691 \r
19692         // 仮想 HUB が選択されていない場合はエラー\r
19693         if (ps->HubName == NULL)\r
19694         {\r
19695                 c->Write(c, _UU("CMD_Hub_Not_Selected"));\r
19696                 return ERR_INVALID_PARAMETER;\r
19697         }\r
19698 \r
19699         o = ParseCommandList(c, cmd_name, str, NULL, 0);\r
19700         if (o == NULL)\r
19701         {\r
19702                 return ERR_INVALID_PARAMETER;\r
19703         }\r
19704 \r
19705         Zero(&t, sizeof(t));\r
19706         StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);\r
19707 \r
19708         // RPC 呼び出し\r
19709         ret = ScGetAcList(ps->Rpc, &t);\r
19710 \r
19711         if (ret != ERR_NO_ERROR)\r
19712         {\r
19713                 // エラー発生\r
19714                 CmdPrintError(c, ret);\r
19715                 FreeParamValueList(o);\r
19716                 return ret;\r
19717         }\r
19718         else\r
19719         {\r
19720                 UINT i;\r
19721                 CT *ct;\r
19722 \r
19723                 ct = CtNew();\r
19724                 CtInsertColumn(ct, _UU("SM_AC_COLUMN_1"), true);\r
19725                 CtInsertColumn(ct, _UU("SM_AC_COLUMN_2"), true);\r
19726                 CtInsertColumn(ct, _UU("SM_AC_COLUMN_3"), false);\r
19727                 CtInsertColumn(ct, _UU("SM_AC_COLUMN_4"), false);\r
19728 \r
19729                 for (i = 0;i < LIST_NUM(t.o);i++)\r
19730                 {\r
19731                         wchar_t tmp1[32], *tmp2, tmp3[MAX_SIZE], tmp4[32];\r
19732                         char *tmp_str;\r
19733                         AC *ac = LIST_DATA(t.o, i);\r
19734 \r
19735                         UniToStru(tmp1, ac->Id);\r
19736                         tmp2 = ac->Deny ? _UU("SM_AC_DENY") : _UU("SM_AC_PASS");\r
19737                         tmp_str = GenerateAcStr(ac);\r
19738                         StrToUni(tmp3, sizeof(tmp3), tmp_str);\r
19739 \r
19740                         Free(tmp_str);\r
19741 \r
19742                         UniToStru(tmp4, ac->Priority);\r
19743 \r
19744                         CtInsert(ct, tmp1, tmp4, tmp2, tmp3);\r
19745                 }\r
19746 \r
19747                 CtFree(ct, c);\r
19748         }\r
19749 \r
19750         FreeRpcAcList(&t);\r
19751 \r
19752         FreeParamValueList(o);\r
19753 \r
19754         return 0;\r
19755 }\r
19756 \r
19757 // IP アクセス制御リストにルールを追加 (IPv4)\r
19758 UINT PsAcAdd(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)\r
19759 {\r
19760         LIST *o;\r
19761         PS *ps = (PS *)param;\r
19762         UINT ret = 0;\r
19763         RPC_AC_LIST t;\r
19764         // 指定できるパラメータ リスト\r
19765         CMD_EVAL_MIN_MAX mm =\r
19766         {\r
19767                 "CMD_AcAdd_Eval_PRIORITY", 1, 4294967295UL,\r
19768         };\r
19769         PARAM args[] =\r
19770         {\r
19771                 // "name", prompt_proc, prompt_param, eval_proc, eval_param\r
19772                 {"[allow|deny]", CmdPrompt, _UU("CMD_AcAdd_Prompt_AD"), CmdEvalNotEmpty, NULL},\r
19773                 {"PRIORITY", CmdPrompt, _UU("CMD_AcAdd_Prompt_PRIORITY"), CmdEvalMinMax, &mm},\r
19774                 {"IP", CmdPrompt, _UU("CMD_AcAdd_Prompt_IP"), CmdEvalIpAndMask4, NULL},\r
19775         };\r
19776 \r
19777         // 仮想 HUB が選択されていない場合はエラー\r
19778         if (ps->HubName == NULL)\r
19779         {\r
19780                 c->Write(c, _UU("CMD_Hub_Not_Selected"));\r
19781                 return ERR_INVALID_PARAMETER;\r
19782         }\r
19783 \r
19784         o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));\r
19785         if (o == NULL)\r
19786         {\r
19787                 return ERR_INVALID_PARAMETER;\r
19788         }\r
19789 \r
19790         Zero(&t, sizeof(t));\r
19791         StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);\r
19792 \r
19793         // RPC 呼び出し\r
19794         ret = ScGetAcList(ps->Rpc, &t);\r
19795 \r
19796         if (ret != ERR_NO_ERROR)\r
19797         {\r
19798                 // エラー発生\r
19799                 CmdPrintError(c, ret);\r
19800                 FreeParamValueList(o);\r
19801                 return ret;\r
19802         }\r
19803         else\r
19804         {\r
19805                 // リストに新しい項目を追加する\r
19806                 AC *ac = ZeroMalloc(sizeof(AC));\r
19807                 char *test = GetParamStr(o, "[allow|deny]");\r
19808                 UINT u_ip, u_mask;\r
19809 \r
19810                 if (StartWith("deny", test))\r
19811                 {\r
19812                         ac->Deny = true;\r
19813                 }\r
19814 \r
19815                 ParseIpAndMask4(GetParamStr(o, "IP"), &u_ip, &u_mask);\r
19816                 UINTToIP(&ac->IpAddress, u_ip);\r
19817 \r
19818                 if (u_mask == 0xffffffff)\r
19819                 {\r
19820                         ac->Masked = false;\r
19821                 }\r
19822                 else\r
19823                 {\r
19824                         ac->Masked = true;\r
19825                         UINTToIP(&ac->SubnetMask, u_mask);\r
19826                 }\r
19827 \r
19828                 ac->Priority = GetParamInt(o, "PRIORITY");\r
19829 \r
19830                 Insert(t.o, ac);\r
19831 \r
19832                 ret = ScSetAcList(ps->Rpc, &t);\r
19833                 if (ret != ERR_NO_ERROR)\r
19834                 {\r
19835                         // エラー発生\r
19836                         CmdPrintError(c, ret);\r
19837                         FreeParamValueList(o);\r
19838                         return ret;\r
19839                 }\r
19840         }\r
19841 \r
19842         FreeRpcAcList(&t);\r
19843 \r
19844         FreeParamValueList(o);\r
19845 \r
19846         return 0;\r
19847 }\r
19848 \r
19849 // IP アクセス制御リストにルールを追加 (IPv6)\r
19850 UINT PsAcAdd6(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)\r
19851 {\r
19852         LIST *o;\r
19853         PS *ps = (PS *)param;\r
19854         UINT ret = 0;\r
19855         RPC_AC_LIST t;\r
19856         // 指定できるパラメータ リスト\r
19857         CMD_EVAL_MIN_MAX mm =\r
19858         {\r
19859                 "CMD_AcAdd6_Eval_PRIORITY", 1, 4294967295UL,\r
19860         };\r
19861         PARAM args[] =\r
19862         {\r
19863                 // "name", prompt_proc, prompt_param, eval_proc, eval_param\r
19864                 {"[allow|deny]", CmdPrompt, _UU("CMD_AcAdd6_Prompt_AD"), CmdEvalNotEmpty, NULL},\r
19865                 {"PRIORITY", CmdPrompt, _UU("CMD_AcAdd6_Prompt_PRIORITY"), CmdEvalMinMax, &mm},\r
19866                 {"IP", CmdPrompt, _UU("CMD_AcAdd6_Prompt_IP"), CmdEvalIpAndMask6, NULL},\r
19867         };\r
19868 \r
19869         // 仮想 HUB が選択されていない場合はエラー\r
19870         if (ps->HubName == NULL)\r
19871         {\r
19872                 c->Write(c, _UU("CMD_Hub_Not_Selected"));\r
19873                 return ERR_INVALID_PARAMETER;\r
19874         }\r
19875 \r
19876         o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));\r
19877         if (o == NULL)\r
19878         {\r
19879                 return ERR_INVALID_PARAMETER;\r
19880         }\r
19881 \r
19882         Zero(&t, sizeof(t));\r
19883         StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);\r
19884 \r
19885         // RPC 呼び出し\r
19886         ret = ScGetAcList(ps->Rpc, &t);\r
19887 \r
19888         if (ret != ERR_NO_ERROR)\r
19889         {\r
19890                 // エラー発生\r
19891                 CmdPrintError(c, ret);\r
19892                 FreeParamValueList(o);\r
19893                 return ret;\r
19894         }\r
19895         else\r
19896         {\r
19897                 // リストに新しい項目を追加する\r
19898                 AC *ac = ZeroMalloc(sizeof(AC));\r
19899                 char *test = GetParamStr(o, "[allow|deny]");\r
19900                 IP u_ip, u_mask;\r
19901 \r
19902                 if (StartWith("deny", test))\r
19903                 {\r
19904                         ac->Deny = true;\r
19905                 }\r
19906 \r
19907                 ParseIpAndMask6(GetParamStr(o, "IP"), &u_ip, &u_mask);\r
19908                 Copy(&ac->IpAddress, &u_ip, sizeof(IP));\r
19909 \r
19910                 if (SubnetMaskToInt6(&u_mask) == 128)\r
19911                 {\r
19912                         ac->Masked = false;\r
19913                 }\r
19914                 else\r
19915                 {\r
19916                         ac->Masked = true;\r
19917                         Copy(&ac->SubnetMask, &u_mask, sizeof(IP));\r
19918                 }\r
19919 \r
19920                 ac->Priority = GetParamInt(o, "PRIORITY");\r
19921 \r
19922                 Insert(t.o, ac);\r
19923 \r
19924                 ret = ScSetAcList(ps->Rpc, &t);\r
19925                 if (ret != ERR_NO_ERROR)\r
19926                 {\r
19927                         // エラー発生\r
19928                         CmdPrintError(c, ret);\r
19929                         FreeParamValueList(o);\r
19930                         return ret;\r
19931                 }\r
19932         }\r
19933 \r
19934         FreeRpcAcList(&t);\r
19935 \r
19936         FreeParamValueList(o);\r
19937 \r
19938         return 0;\r
19939 }\r
19940 \r
19941 // デバッグコマンドを実行する\r
19942 UINT PsDebug(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)\r
19943 {\r
19944         LIST *o;\r
19945         PS *ps = (PS *)param;\r
19946         UINT ret = 0;\r
19947         UINT id;\r
19948         // 指定できるパラメータ リスト\r
19949         PARAM args[] =\r
19950         {\r
19951                 // "name", prompt_proc, prompt_param, eval_proc, eval_param\r
19952                 {"[id]", NULL, NULL, NULL, NULL},\r
19953                 {"ARG", NULL, NULL, NULL, NULL},\r
19954         };\r
19955 \r
19956         o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));\r
19957         if (o == NULL)\r
19958         {\r
19959                 return ERR_INVALID_PARAMETER;\r
19960         }\r
19961 \r
19962         id = GetParamInt(o, "[id]");\r
19963 \r
19964         if (true)\r
19965         {\r
19966                 RPC_TEST t;\r
19967                 UINT ret;\r
19968 \r
19969                 c->Write(c, _UU("CMD_Debug_Msg1"));\r
19970 \r
19971                 Zero(&t, sizeof(t));\r
19972 \r
19973                 t.IntValue = id;\r
19974                 StrCpy(t.StrValue, sizeof(t.StrValue), GetParamStr(o, "ARG"));\r
19975 \r
19976                 ret = ScDebug(ps->Rpc, &t);\r
19977 \r
19978                 if (ret != ERR_NO_ERROR)\r
19979                 {\r
19980                         // エラー発生\r
19981                         CmdPrintError(c, ret);\r
19982                         FreeParamValueList(o);\r
19983                         return ret;\r
19984                 }\r
19985                 else\r
19986                 {\r
19987                         wchar_t tmp[sizeof(t.StrValue)];\r
19988 \r
19989                         UniFormat(tmp, sizeof(tmp), _UU("CMD_Debug_Msg2"), t.StrValue);\r
19990                         c->Write(c, tmp);\r
19991                 }\r
19992         }\r
19993 \r
19994         FreeParamValueList(o);\r
19995 \r
19996         return 0;\r
19997 }\r
19998 \r
19999 // サーバーの設定ファイルをフラッシュする\r
20000 UINT PsFlush(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)\r
20001 {\r
20002         LIST *o;\r
20003         PS *ps = (PS *)param;\r
20004         UINT ret = 0;\r
20005 \r
20006         o = ParseCommandList(c, cmd_name, str, NULL, 0);\r
20007         if (o == NULL)\r
20008         {\r
20009                 return ERR_INVALID_PARAMETER;\r
20010         }\r
20011 \r
20012         if (true)\r
20013         {\r
20014                 RPC_TEST t;\r
20015                 UINT ret;\r
20016                 wchar_t tmp[MAX_SIZE];\r
20017                 char sizestr[MAX_SIZE];\r
20018 \r
20019                 c->Write(c, _UU("CMD_Flush_Msg1"));\r
20020 \r
20021                 Zero(&t, sizeof(t));\r
20022 \r
20023                 ret = ScFlush(ps->Rpc, &t);\r
20024 \r
20025                 if (ret != ERR_NO_ERROR)\r
20026                 {\r
20027                         // エラー発生\r
20028                         CmdPrintError(c, ret);\r
20029                         FreeParamValueList(o);\r
20030                         return ret;\r
20031                 }\r
20032 \r
20033                 ToStr3(sizestr, sizeof(sizestr), (UINT64)t.IntValue);\r
20034                 UniFormat(tmp, sizeof(tmp), _UU("CMD_Flush_Msg2"), sizestr);\r
20035                 c->Write(c, tmp);\r
20036         }\r
20037 \r
20038         FreeParamValueList(o);\r
20039 \r
20040         return 0;\r
20041 }\r
20042 \r
20043 // クラッシュさせる\r
20044 UINT PsCrash(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)\r
20045 {\r
20046         LIST *o;\r
20047         PS *ps = (PS *)param;\r
20048         UINT ret = 0;\r
20049         char *yes;\r
20050         // 指定できるパラメータ リスト\r
20051         PARAM args[] =\r
20052         {\r
20053                 // "name", prompt_proc, prompt_param, eval_proc, eval_param\r
20054                 {"[yes]", CmdPrompt, _UU("CMD_Crash_Confirm"), NULL, NULL},\r
20055         };\r
20056 \r
20057         o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));\r
20058         if (o == NULL)\r
20059         {\r
20060                 return ERR_INVALID_PARAMETER;\r
20061         }\r
20062 \r
20063         yes = GetParamStr(o, "[yes]");\r
20064 \r
20065         if (StrCmpi(yes, "yes") != 0)\r
20066         {\r
20067                 c->Write(c, _UU("CMD_Crash_Aborted"));\r
20068         }\r
20069         else\r
20070         {\r
20071                 RPC_TEST t;\r
20072                 UINT ret;\r
20073 \r
20074                 c->Write(c, _UU("CMD_Crash_Msg"));\r
20075 \r
20076                 Zero(&t, sizeof(t));\r
20077 \r
20078                 ret = ScCrash(ps->Rpc, &t);\r
20079 \r
20080                 if (ret != ERR_NO_ERROR)\r
20081                 {\r
20082                         // エラー発生\r
20083                         CmdPrintError(c, ret);\r
20084                         FreeParamValueList(o);\r
20085                         return ret;\r
20086                 }\r
20087         }\r
20088 \r
20089         FreeParamValueList(o);\r
20090 \r
20091         return 0;\r
20092 }\r
20093 \r
20094 // IP アクセス制御リスト内のルールの削除\r
20095 UINT PsAcDel(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)\r
20096 {\r
20097         LIST *o;\r
20098         PS *ps = (PS *)param;\r
20099         UINT ret = 0;\r
20100         RPC_AC_LIST t;\r
20101         // 指定できるパラメータ リスト\r
20102         PARAM args[] =\r
20103         {\r
20104                 // "name", prompt_proc, prompt_param, eval_proc, eval_param\r
20105                 {"[id]", CmdPrompt, _UU("CMD_AcDel_Prompt_ID"), CmdEvalNotEmpty, NULL},\r
20106         };\r
20107 \r
20108         // 仮想 HUB が選択されていない場合はエラー\r
20109         if (ps->HubName == NULL)\r
20110         {\r
20111                 c->Write(c, _UU("CMD_Hub_Not_Selected"));\r
20112                 return ERR_INVALID_PARAMETER;\r
20113         }\r
20114 \r
20115         o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));\r
20116         if (o == NULL)\r
20117         {\r
20118                 return ERR_INVALID_PARAMETER;\r
20119         }\r
20120 \r
20121         Zero(&t, sizeof(t));\r
20122         StrCpy(t.HubName, sizeof(t.HubName), ps->HubName);\r
20123 \r
20124         // RPC 呼び出し\r
20125         ret = ScGetAcList(ps->Rpc, &t);\r
20126 \r
20127         if (ret != ERR_NO_ERROR)\r
20128         {\r
20129                 // エラー発生\r
20130                 CmdPrintError(c, ret);\r
20131                 FreeParamValueList(o);\r
20132                 return ret;\r
20133         }\r
20134         else\r
20135         {\r
20136                 // ID 一致を削除\r
20137                 UINT i;\r
20138                 bool b = false;\r
20139 \r
20140                 for (i = 0;i < LIST_NUM(t.o);i++)\r
20141                 {\r
20142                         AC *ac = LIST_DATA(t.o, i);\r
20143 \r
20144                         if (ac->Id == GetParamInt(o, "[id]"))\r
20145                         {\r
20146                                 Delete(t.o, ac);\r
20147                                 Free(ac);\r
20148                                 b = true;\r
20149                                 break;\r
20150                         }\r
20151                 }\r
20152 \r
20153                 if (b == false)\r
20154                 {\r
20155                         ret = ERR_OBJECT_NOT_FOUND;\r
20156                         FreeRpcAcList(&t);\r
20157                 }\r
20158                 else\r
20159                 {\r
20160                         ret = ScSetAcList(ps->Rpc, &t);\r
20161                 }\r
20162                 if (ret != ERR_NO_ERROR)\r
20163                 {\r
20164                         // エラー発生\r
20165                         CmdPrintError(c, ret);\r
20166                         FreeParamValueList(o);\r
20167                         return ret;\r
20168                 }\r
20169         }\r
20170 \r
20171         FreeRpcAcList(&t);\r
20172         FreeParamValueList(o);\r
20173 \r
20174         return 0;\r
20175 }\r
20176 \r
20177 // 新しいライセンスキーの登録\r
20178 UINT PsLicenseAdd(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)\r
20179 {\r
20180         LIST *o;\r
20181         PS *ps = (PS *)param;\r
20182         UINT ret = 0;\r
20183         RPC_TEST t;\r
20184         // 指定できるパラメータ リスト\r
20185         PARAM args[] =\r
20186         {\r
20187                 // "name", prompt_proc, prompt_param, eval_proc, eval_param\r
20188                 {"[key]", CmdPrompt, _UU("CMD_LicenseAdd_Prompt_Key"), CmdEvalNotEmpty, NULL},\r
20189         };\r
20190 \r
20191         o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));\r
20192         if (o == NULL)\r
20193         {\r
20194                 return ERR_INVALID_PARAMETER;\r
20195         }\r
20196 \r
20197         Zero(&t, sizeof(t));\r
20198         StrCpy(t.StrValue, sizeof(t.StrValue), GetParamStr(o, "[key]"));\r
20199 \r
20200         // RPC 呼び出し\r
20201         ret = ScAddLicenseKey(ps->Rpc, &t);\r
20202 \r
20203         if (ret != ERR_NO_ERROR)\r
20204         {\r
20205                 // エラー発生\r
20206                 CmdPrintError(c, ret);\r
20207                 FreeParamValueList(o);\r
20208                 return ret;\r
20209         }\r
20210 \r
20211         FreeParamValueList(o);\r
20212 \r
20213         return 0;\r
20214 }\r
20215 \r
20216 // 登録されているライセンスの削除\r
20217 UINT PsLicenseDel(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)\r
20218 {\r
20219         LIST *o;\r
20220         PS *ps = (PS *)param;\r
20221         UINT ret = 0;\r
20222         RPC_TEST t;\r
20223         // 指定できるパラメータ リスト\r
20224         PARAM args[] =\r
20225         {\r
20226                 // "name", prompt_proc, prompt_param, eval_proc, eval_param\r
20227                 {"[id]", CmdPrompt, _UU("CMD_LicenseDel_Prompt_ID"), CmdEvalNotEmpty, NULL},\r
20228         };\r
20229 \r
20230         o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));\r
20231         if (o == NULL)\r
20232         {\r
20233                 return ERR_INVALID_PARAMETER;\r
20234         }\r
20235 \r
20236         Zero(&t, sizeof(t));\r
20237         t.IntValue = GetParamInt(o, "[id]");\r
20238 \r
20239         // RPC 呼び出し\r
20240         ret = ScDelLicenseKey(ps->Rpc, &t);\r
20241 \r
20242         if (ret != ERR_NO_ERROR)\r
20243         {\r
20244                 // エラー発生\r
20245                 CmdPrintError(c, ret);\r
20246                 FreeParamValueList(o);\r
20247                 return ret;\r
20248         }\r
20249 \r
20250         FreeParamValueList(o);\r
20251 \r
20252         return 0;\r
20253 }\r
20254 \r
20255 // 登録されているライセンス一覧の取得\r
20256 UINT PsLicenseList(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)\r
20257 {\r
20258         LIST *o;\r
20259         PS *ps = (PS *)param;\r
20260         UINT ret = 0;\r
20261         RPC_ENUM_LICENSE_KEY t;\r
20262         CT *ct;\r
20263         UINT i;\r
20264 \r
20265         o = ParseCommandList(c, cmd_name, str, NULL, 0);\r
20266         if (o == NULL)\r
20267         {\r
20268                 return ERR_INVALID_PARAMETER;\r
20269         }\r
20270 \r
20271         Zero(&t, sizeof(t));\r
20272 \r
20273         // RPC 呼び出し\r
20274         ret = ScEnumLicenseKey(ps->Rpc, &t);\r
20275 \r
20276         if (ret != ERR_NO_ERROR)\r
20277         {\r
20278                 // エラー発生\r
20279                 CmdPrintError(c, ret);\r
20280                 FreeParamValueList(o);\r
20281                 return ret;\r
20282         }\r
20283 \r
20284         ct = CtNew();\r
20285         CtInsertColumn(ct, _UU("SM_LICENSE_COLUMN_1"), false);\r
20286         CtInsertColumn(ct, _UU("SM_LICENSE_COLUMN_2"), false);\r
20287         CtInsertColumn(ct, _UU("SM_LICENSE_COLUMN_3"), false);\r
20288         CtInsertColumn(ct, _UU("SM_LICENSE_COLUMN_4"), false);\r
20289         CtInsertColumn(ct, _UU("SM_LICENSE_COLUMN_5"), false);\r
20290         CtInsertColumn(ct, _UU("SM_LICENSE_COLUMN_6"), false);\r
20291         CtInsertColumn(ct, _UU("SM_LICENSE_COLUMN_7"), false);\r
20292         CtInsertColumn(ct, _UU("SM_LICENSE_COLUMN_8"), false);\r
20293         CtInsertColumn(ct, _UU("SM_LICENSE_COLUMN_9"), false);\r
20294 \r
20295         for (i = 0;i < t.NumItem;i++)\r
20296         {\r
20297                 wchar_t tmp1[32], tmp2[LICENSE_KEYSTR_LEN + 1], tmp3[LICENSE_MAX_PRODUCT_NAME_LEN + 1],\r
20298                         *tmp4, tmp5[128], tmp6[LICENSE_LICENSEID_STR_LEN + 1], tmp7[64],\r
20299                         tmp8[64], tmp9[64];\r
20300                 RPC_ENUM_LICENSE_KEY_ITEM *e = &t.Items[i];\r
20301 \r
20302                 UniToStru(tmp1, e->Id);\r
20303                 StrToUni(tmp2, sizeof(tmp2), e->LicenseKey);\r
20304                 StrToUni(tmp3, sizeof(tmp3), e->LicenseName);\r
20305                 tmp4 = LiGetLicenseStatusStr(e->Status);\r
20306                 if (e->Expires == 0)\r
20307                 {\r
20308                         UniStrCpy(tmp5, sizeof(tmp5), _UU("SM_LICENSE_NO_EXPIRES"));\r
20309                 }\r
20310                 else\r
20311                 {\r
20312                         GetDateStrEx64(tmp5, sizeof(tmp5), e->Expires, NULL);\r
20313                 }\r
20314                 StrToUni(tmp6, sizeof(tmp6), e->LicenseId);\r
20315                 UniToStru(tmp7, e->ProductId);\r
20316                 UniFormat(tmp8, sizeof(tmp8), L"%I64u", e->SystemId);\r
20317                 UniToStru(tmp9, e->SerialId);\r
20318 \r
20319                 CtInsert(ct,\r
20320                         tmp1, tmp2, tmp3, tmp4, tmp5, tmp6, tmp7, tmp8, tmp9);\r
20321         }\r
20322 \r
20323         CtFreeEx(ct, c, true);\r
20324 \r
20325         FreeRpcEnumLicenseKey(&t);\r
20326 \r
20327         FreeParamValueList(o);\r
20328 \r
20329         return 0;\r
20330 }\r
20331 \r
20332 // 現在の VPN Server のライセンス状態の取得\r
20333 UINT PsLicenseStatus(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)\r
20334 {\r
20335         LIST *o;\r
20336         PS *ps = (PS *)param;\r
20337         UINT ret = 0;\r
20338         RPC_LICENSE_STATUS st;\r
20339         CT *ct;\r
20340         wchar_t tmp[MAX_SIZE];\r
20341 \r
20342         o = ParseCommandList(c, cmd_name, str, NULL, 0);\r
20343         if (o == NULL)\r
20344         {\r
20345                 return ERR_INVALID_PARAMETER;\r
20346         }\r
20347 \r
20348         Zero(&st, sizeof(st));\r
20349 \r
20350         // RPC 呼び出し\r
20351         ret = ScGetLicenseStatus(ps->Rpc, &st);\r
20352 \r
20353         if (ret != ERR_NO_ERROR)\r
20354         {\r
20355                 // エラー発生\r
20356                 CmdPrintError(c, ret);\r
20357                 FreeParamValueList(o);\r
20358                 return ret;\r
20359         }\r
20360 \r
20361         ct = CtNewStandard();\r
20362 \r
20363         if (st.EditionId == LICENSE_EDITION_VPN3_NO_LICENSE)\r
20364         {\r
20365                 CtInsert(ct, _UU("SM_NO_LICENSE_COLUMN"), _UU("SM_NO_LICENSE"));\r
20366         }\r
20367         else\r
20368         {\r
20369                 // 製品エディション名\r
20370                 StrToUni(tmp, sizeof(tmp), st.EditionStr);\r
20371                 CtInsert(ct, _UU("SM_LICENSE_STATUS_EDITION"), tmp);\r
20372 \r
20373                 // リリース日付\r
20374                 if (st.ReleaseDate != 0)\r
20375                 {\r
20376                         GetDateStrEx64(tmp, sizeof(tmp), st.ReleaseDate, NULL);\r
20377                         CtInsert(ct, _UU("SM_LICENSE_STATUS_RELEASE"), tmp);\r
20378                 }\r
20379 \r
20380                 // 現在のシステム ID\r
20381                 UniFormat(tmp, sizeof(tmp), L"%I64u", st.SystemId);\r
20382                 CtInsert(ct, _UU("SM_LICENSE_STATUS_SYSTEM_ID"), tmp);\r
20383 \r
20384                 // 現在の製品ライセンスの有効期限\r
20385                 if (st.SystemExpires == 0)\r
20386                 {\r
20387                         UniStrCpy(tmp, sizeof(tmp), _UU("SM_LICENSE_NO_EXPIRES"));\r
20388                 }\r
20389                 else\r
20390                 {\r
20391                         GetDateStrEx64(tmp, sizeof(tmp), st.SystemExpires, NULL);\r
20392                 }\r
20393                 CtInsert(ct,  _UU("SM_LICENSE_STATUS_EXPIRES"), tmp);\r
20394 \r
20395                 // サブスクリプション (サポート) 契約\r
20396                 if (st.NeedSubscription == false)\r
20397                 {\r
20398                         UniStrCpy(tmp, sizeof(tmp), _UU("SM_LICENSE_STATUS_SUBSCRIPTION_NONEED"));\r
20399                 }\r
20400                 else\r
20401                 {\r
20402                         if (st.SubscriptionExpires == 0)\r
20403                         {\r
20404                                 UniStrCpy(tmp, sizeof(tmp), _UU("SM_LICENSE_STATUS_SUBSCRIPTION_NONE"));\r
20405                         }\r
20406                         else\r
20407                         {\r
20408                                 wchar_t dtstr[MAX_PATH];\r
20409 \r
20410                                 GetDateStrEx64(dtstr, sizeof(dtstr), st.SubscriptionExpires, NULL);\r
20411 \r
20412                                 UniFormat(tmp, sizeof(tmp),\r
20413                                         st.IsSubscriptionExpired ? _UU("SM_LICENSE_STATUS_SUBSCRIPTION_EXPIRED") :  _UU("SM_LICENSE_STATUS_SUBSCRIPTION_VALID"),\r
20414                                         dtstr);\r
20415                         }\r
20416                 }\r
20417                 CtInsert(ct, _UU("SM_LICENSE_STATUS_SUBSCRIPTION"), tmp);\r
20418 \r
20419                 if (st.NeedSubscription == false && st.SubscriptionExpires != 0)\r
20420                 {\r
20421                         wchar_t dtstr[MAX_PATH];\r
20422 \r
20423                         GetDateStrEx64(dtstr, sizeof(dtstr), st.SubscriptionExpires, NULL);\r
20424 \r
20425                         CtInsert(ct, _UU("SM_LICENSE_STATUS_SUBSCRIPTION_BUILD_STR"), tmp);\r
20426                 }\r
20427 \r
20428                 if (GetCapsBool(ps->CapsList, "b_vpn3"))\r
20429                 {\r
20430                         // ユーザー作成可能数\r
20431                         if (st.NumClientConnectLicense == INFINITE)\r
20432                         {\r
20433                                 UniStrCpy(tmp, sizeof(tmp), _UU("SM_LICENSE_INFINITE"));\r
20434                         }\r
20435                         else\r
20436                         {\r
20437                                 UniToStru(tmp, st.NumClientConnectLicense);\r
20438                         }\r
20439                         CtInsert(ct, _UU("SM_LICENSE_NUM_CLIENT"), tmp);\r
20440                 }\r
20441 \r
20442                 // クライアント同時接続可能数\r
20443                 if (st.NumBridgeConnectLicense == INFINITE)\r
20444                 {\r
20445                         UniStrCpy(tmp, sizeof(tmp), _UU("SM_LICENSE_INFINITE"));\r
20446                 }\r
20447                 else\r
20448                 {\r
20449                         UniToStru(tmp, st.NumBridgeConnectLicense);\r
20450                 }\r
20451                 CtInsert(ct, _UU("SM_LICENSE_NUM_BRIDGE"), tmp);\r
20452 \r
20453                 // エンタープライズ機能の利用可否\r
20454                 CtInsert(ct, _UU("SM_LICENSE_STATUS_ENTERPRISE"),\r
20455                         st.AllowEnterpriseFunction ? _UU("SM_LICENSE_STATUS_ENTERPRISE_YES") : _UU("SM_LICENSE_STATUS_ENTERPRISE_NO"));\r
20456         }\r
20457 \r
20458         CtFreeEx(ct, c, false);\r
20459 \r
20460         FreeParamValueList(o);\r
20461 \r
20462         return 0;\r
20463 }\r
20464 \r
20465 \r
20466 // クラスタ設定の取得\r
20467 UINT PsClusterSettingGet(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)\r
20468 {\r
20469         LIST *o;\r
20470         PS *ps = (PS *)param;\r
20471         UINT ret;\r
20472         RPC_FARM t;\r
20473         CT *ct;\r
20474 \r
20475         o = ParseCommandList(c, cmd_name, str, NULL, 0);\r
20476         if (o == NULL)\r
20477         {\r
20478                 return ERR_INVALID_PARAMETER;\r
20479         }\r
20480 \r
20481         Zero(&t, sizeof(t));\r
20482 \r
20483         ret = ScGetFarmSetting(ps->Rpc, &t);\r
20484 \r
20485         if (ret != ERR_NO_ERROR)\r
20486         {\r
20487                 CmdPrintError(c, ret);\r
20488                 FreeParamValueList(o);\r
20489                 return ret;\r
20490         }\r
20491 \r
20492         if (t.Weight == 0)\r
20493         {\r
20494                 t.Weight = FARM_DEFAULT_WEIGHT;\r
20495         }\r
20496 \r
20497         // クラスタ設定の表示\r
20498         ct = CtNewStandard();\r
20499 \r
20500         CtInsert(ct, _UU("CMD_ClusterSettingGet_Current"),\r
20501                 GetServerTypeStr(t.ServerType));\r
20502 \r
20503         if (t.ServerType == SERVER_TYPE_FARM_CONTROLLER)\r
20504         {\r
20505                 CtInsert(ct, _UU("CMD_ClusterSettingGet_ControllerOnly"), t.ControllerOnly ? _UU("SEC_YES") : _UU("SEC_NO"));\r
20506         }\r
20507 \r
20508         if (t.ServerType != SERVER_TYPE_STANDALONE)\r
20509         {\r
20510                 wchar_t tmp[MAX_SIZE];\r
20511 \r
20512                 UniToStru(tmp, t.Weight);\r
20513 \r
20514                 CtInsert(ct, _UU("CMD_ClusterSettingGet_Weight"), tmp);\r
20515         }\r
20516 \r
20517         if (t.ServerType == SERVER_TYPE_FARM_MEMBER)\r
20518         {\r
20519                 wchar_t tmp[MAX_SIZE];\r
20520                 UINT i;\r
20521 \r
20522                 // 公開 IP アドレス\r
20523                 if (t.PublicIp != 0)\r
20524                 {\r
20525                         IPToUniStr32(tmp, sizeof(tmp), t.PublicIp);\r
20526                 }\r
20527                 else\r
20528                 {\r
20529                         UniStrCpy(tmp, sizeof(tmp), _UU("CMD_ClusterSettingGet_None"));\r
20530                 }\r
20531 \r
20532                 CtInsert(ct, _UU("CMD_ClusterSettingGet_PublicIp"), tmp);\r
20533 \r
20534                 // 公開ポート一覧\r
20535                 tmp[0] = 0;\r
20536                 for (i = 0;i < t.NumPort;i++)\r
20537                 {\r
20538                         wchar_t tmp2[64];\r
20539 \r
20540                         UniFormat(tmp2, sizeof(tmp2), L"%u, ", t.Ports[i]);\r
20541 \r
20542                         UniStrCat(tmp, sizeof(tmp), tmp2);\r
20543                 }\r
20544 \r
20545                 if (UniEndWith(tmp, L", "))\r
20546                 {\r
20547                         tmp[UniStrLen(tmp) - 2] = 0;\r
20548                 }\r
20549 \r
20550                 CtInsert(ct, _UU("CMD_ClusterSettingGet_PublicPorts"), tmp);\r
20551 \r
20552                 // 接続先コントローラ\r
20553                 UniFormat(tmp, sizeof(tmp), L"%S:%u", t.ControllerName, t.ControllerPort);\r
20554                 CtInsert(ct, _UU("CMD_ClusterSettingGet_Controller"), tmp);\r
20555         }\r
20556 \r
20557         CtFree(ct, c);\r
20558 \r
20559         FreeRpcFarm(&t);\r
20560         FreeParamValueList(o);\r
20561 \r
20562         return 0;\r
20563 }\r
20564 \r
20565 // サーバーパスワードの設定\r
20566 UINT PsServerPasswordSet(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)\r
20567 {\r
20568         LIST *o;\r
20569         PS *ps = (PS *)param;\r
20570         UINT ret;\r
20571         RPC_SET_PASSWORD t;\r
20572         char *pw;\r
20573         PARAM args[] =\r
20574         {\r
20575                 {"[password]", CmdPromptChoosePassword, NULL, NULL, NULL},\r
20576         };\r
20577 \r
20578         o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));\r
20579         if (o == NULL)\r
20580         {\r
20581                 return ERR_INVALID_PARAMETER;\r
20582         }\r
20583 \r
20584         pw = GetParamStr(o, "[password]");\r
20585 \r
20586         Zero(&t, sizeof(t));\r
20587         Hash(t.HashedPassword, pw, StrLen(pw), true);\r
20588 \r
20589         ret = ScSetServerPassword(ps->Rpc, &t);\r
20590 \r
20591         if (ret != ERR_NO_ERROR)\r
20592         {\r
20593                 CmdPrintError(c, ret);\r
20594                 FreeParamValueList(o);\r
20595                 return ret;\r
20596         }\r
20597 \r
20598         FreeParamValueList(o);\r
20599 \r
20600         return 0;\r
20601 }\r
20602 \r
20603 // パスワード決定プロンプト (プロンプト関数用)\r
20604 wchar_t *CmdPromptChoosePassword(CONSOLE *c, void *param)\r
20605 {\r
20606         char *s;\r
20607         // 引数チェック\r
20608         if (c == NULL)\r
20609         {\r
20610                 return NULL;\r
20611         }\r
20612 \r
20613         s = CmdPasswordPrompt(c);\r
20614 \r
20615         if (s == NULL)\r
20616         {\r
20617                 return NULL;\r
20618         }\r
20619         else\r
20620         {\r
20621                 wchar_t *ret = CopyStrToUni(s);\r
20622 \r
20623                 Free(s);\r
20624 \r
20625                 return ret;\r
20626         }\r
20627 }\r
20628 \r
20629 // パスワード入力用プロンプト (汎用)\r
20630 char *CmdPasswordPrompt(CONSOLE *c)\r
20631 {\r
20632         char *pw1, *pw2;\r
20633         // 引数チェック\r
20634         if (c == NULL)\r
20635         {\r
20636                 return NULL;\r
20637         }\r
20638 \r
20639         c->Write(c, _UU("CMD_UTVPNCMD_PWPROMPT_0"));\r
20640 \r
20641 RETRY:\r
20642         c->Write(c, L"");\r
20643 \r
20644 \r
20645         pw1 = c->ReadPassword(c, _UU("CMD_UTVPNCMD_PWPROMPT_1"));\r
20646         if (pw1 == NULL)\r
20647         {\r
20648                 return NULL;\r
20649         }\r
20650 \r
20651         pw2 = c->ReadPassword(c, _UU("CMD_UTVPNCMD_PWPROMPT_2"));\r
20652         if (pw2 == NULL)\r
20653         {\r
20654                 Free(pw1);\r
20655                 return NULL;\r
20656         }\r
20657 \r
20658         c->Write(c, L"");\r
20659 \r
20660         if (StrCmp(pw1, pw2) != 0)\r
20661         {\r
20662                 Free(pw1);\r
20663                 Free(pw2);\r
20664                 c->Write(c, _UU("CMD_UTVPNCMD_PWPROMPT_3"));\r
20665                 goto RETRY;\r
20666         }\r
20667 \r
20668         Free(pw1);\r
20669 \r
20670         return pw2;\r
20671 }\r
20672 \r
20673 // リスナー無効化\r
20674 UINT PsListenerDisable(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)\r
20675 {\r
20676         LIST *o;\r
20677         PS *ps = (PS *)param;\r
20678         UINT ret;\r
20679         RPC_LISTENER t;\r
20680         PARAM args[] =\r
20681         {\r
20682                 {"[port]", CmdPromptPort, _UU("CMD_ListenerDisable_PortPrompt"), CmdEvalPort, NULL},\r
20683         };\r
20684 \r
20685         o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));\r
20686         if (o == NULL)\r
20687         {\r
20688                 return ERR_INVALID_PARAMETER;\r
20689         }\r
20690 \r
20691         Zero(&t, sizeof(t));\r
20692         t.Enable = false;\r
20693         t.Port = ToInt(GetParamStr(o, "[port]"));\r
20694 \r
20695         ret = ScEnableListener(ps->Rpc, &t);\r
20696 \r
20697         if (ret != ERR_NO_ERROR)\r
20698         {\r
20699                 CmdPrintError(c, ret);\r
20700                 FreeParamValueList(o);\r
20701                 return ret;\r
20702         }\r
20703 \r
20704         FreeParamValueList(o);\r
20705 \r
20706         return 0;\r
20707 }\r
20708 \r
20709 // リスナー有効化\r
20710 UINT PsListenerEnable(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)\r
20711 {\r
20712         LIST *o;\r
20713         PS *ps = (PS *)param;\r
20714         UINT ret;\r
20715         RPC_LISTENER t;\r
20716         PARAM args[] =\r
20717         {\r
20718                 {"[port]", CmdPromptPort, _UU("CMD_ListenerEnable_PortPrompt"), CmdEvalPort, NULL},\r
20719         };\r
20720 \r
20721         o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));\r
20722         if (o == NULL)\r
20723         {\r
20724                 return ERR_INVALID_PARAMETER;\r
20725         }\r
20726 \r
20727         Zero(&t, sizeof(t));\r
20728         t.Enable = true;\r
20729         t.Port = ToInt(GetParamStr(o, "[port]"));\r
20730 \r
20731         ret = ScEnableListener(ps->Rpc, &t);\r
20732 \r
20733         if (ret != ERR_NO_ERROR)\r
20734         {\r
20735                 CmdPrintError(c, ret);\r
20736                 FreeParamValueList(o);\r
20737                 return ret;\r
20738         }\r
20739 \r
20740         FreeParamValueList(o);\r
20741 \r
20742         return 0;\r
20743 }\r
20744 \r
20745 // コンソールテーブルの 1 行を描画\r
20746 void CtPrintRow(CONSOLE *c, UINT num, UINT *widths, wchar_t **strings, bool *rights, char separate_char)\r
20747 {\r
20748         UINT i;\r
20749         wchar_t *buf;\r
20750         UINT buf_size;\r
20751         bool is_sep_line = true;\r
20752         // 引数チェック\r
20753         if (c == NULL || num == 0 || widths == NULL || strings == NULL || rights == NULL)\r
20754         {\r
20755                 return;\r
20756         }\r
20757 \r
20758         buf_size = 32;\r
20759         for (i = 0;i < num;i++)\r
20760         {\r
20761                 buf_size += sizeof(wchar_t) * widths[i] + 6;\r
20762         }\r
20763 \r
20764         buf = ZeroMalloc(buf_size);\r
20765 \r
20766         for (i = 0;i < num;i++)\r
20767         {\r
20768                 char *tmp;\r
20769                 wchar_t *space_string;\r
20770                 UINT w;\r
20771                 UINT space = 0;\r
20772                 wchar_t *string = strings[i];\r
20773                 wchar_t *tmp_line = NULL;\r
20774 \r
20775                 if (UniStrCmpi(string, L"---") == 0)\r
20776                 {\r
20777                         char *s = MakeCharArray('-', widths[i]);\r
20778                         tmp_line = string = CopyStrToUni(s);\r
20779 \r
20780                         Free(s);\r
20781                 }\r
20782                 else\r
20783                 {\r
20784                         is_sep_line = false;\r
20785                 }\r
20786 \r
20787                 w = UniStrWidth(string);\r
20788 \r
20789                 if (widths[i] >= w)\r
20790                 {\r
20791                         space = widths[i] - w;\r
20792                 }\r
20793 \r
20794                 tmp = MakeCharArray(' ', space);\r
20795                 space_string = CopyStrToUni(tmp);\r
20796 \r
20797                 if (rights[i] != false)\r
20798                 {\r
20799                         UniStrCat(buf, buf_size, space_string);\r
20800                 }\r
20801 \r
20802                 UniStrCat(buf, buf_size, string);\r
20803 \r
20804                 if (rights[i] == false)\r
20805                 {\r
20806                         UniStrCat(buf, buf_size, space_string);\r
20807                 }\r
20808 \r
20809                 Free(space_string);\r
20810                 Free(tmp);\r
20811 \r
20812                 if (i < (num - 1))\r
20813                 {\r
20814                         wchar_t tmp[4];\r
20815                         char str[2];\r
20816 \r
20817                         if (UniStrCmpi(strings[i], L"---") == 0)\r
20818                         {\r
20819                                 str[0] = '+';\r
20820                         }\r
20821                         else\r
20822                         {\r
20823                                 str[0] = separate_char;\r
20824                         }\r
20825                         str[1] = 0;\r
20826 \r
20827                         StrToUni(tmp, sizeof(tmp), str);\r
20828 \r
20829                         UniStrCat(buf, buf_size, tmp);\r
20830                 }\r
20831 \r
20832                 if (tmp_line != NULL)\r
20833                 {\r
20834                         Free(tmp_line);\r
20835                 }\r
20836         }\r
20837 \r
20838         UniTrimRight(buf);\r
20839 \r
20840         if (is_sep_line)\r
20841         {\r
20842                 if (UniStrLen(buf) > (c->GetWidth(c) - 1))\r
20843                 {\r
20844                         buf[c->GetWidth(c) - 1] = 0;\r
20845                 }\r
20846         }\r
20847 \r
20848         c->Write(c, buf);\r
20849 \r
20850         Free(buf);\r
20851 }\r
20852 \r
20853 // コンソール テーブルを標準形式で描画\r
20854 void CtPrintStandard(CT *ct, CONSOLE *c)\r
20855 {\r
20856         CT *t;\r
20857         UINT i, j;\r
20858         // 引数チェック\r
20859         if (ct == NULL || c == NULL)\r
20860         {\r
20861                 return;\r
20862         }\r
20863 \r
20864         t = CtNewStandard();\r
20865         for (i = 0;i < LIST_NUM(ct->Rows);i++)\r
20866         {\r
20867                 CTR *row = LIST_DATA(ct->Rows, i);\r
20868 \r
20869                 for (j = 0;j < LIST_NUM(ct->Columns);j++)\r
20870                 {\r
20871                         CTC *column = LIST_DATA(ct->Columns, j);\r
20872 \r
20873                         CtInsert(t, column->String, row->Strings[j]);\r
20874                 }\r
20875 \r
20876                 if (i != (LIST_NUM(ct->Rows) - 1))\r
20877                 {\r
20878                         CtInsert(t, L"---", L"---");\r
20879                 }\r
20880         }\r
20881 \r
20882         CtFree(t, c);\r
20883 }\r
20884 \r
20885 // コンソールテーブルの描画\r
20886 void CtPrint(CT *ct, CONSOLE *c)\r
20887 {\r
20888         UINT *widths;\r
20889         UINT num;\r
20890         UINT i, j;\r
20891         wchar_t **header_strings;\r
20892         bool *rights;\r
20893         // 引数チェック\r
20894         if (ct == NULL || c == NULL)\r
20895         {\r
20896                 return;\r
20897         }\r
20898 \r
20899         num = LIST_NUM(ct->Columns);\r
20900         widths = ZeroMalloc(sizeof(UINT) * num);\r
20901 \r
20902         // 各列の最大文字幅を計算する\r
20903         for (i = 0;i < num;i++)\r
20904         {\r
20905                 CTC *ctc = LIST_DATA(ct->Columns, i);\r
20906                 UINT w;\r
20907 \r
20908                 w = UniStrWidth(ctc->String);\r
20909                 widths[i] = MAX(widths[i], w);\r
20910         }\r
20911         for (j = 0;j < LIST_NUM(ct->Rows);j++)\r
20912         {\r
20913                 CTR *ctr = LIST_DATA(ct->Rows, j);\r
20914 \r
20915                 for (i = 0;i < num;i++)\r
20916                 {\r
20917                         UINT w;\r
20918 \r
20919                         w = UniStrWidth(ctr->Strings[i]);\r
20920                         widths[i] = MAX(widths[i], w);\r
20921                 }\r
20922         }\r
20923 \r
20924         // ヘッダ部分を表示する\r
20925         header_strings = ZeroMalloc(sizeof(wchar_t *) * num);\r
20926         rights = ZeroMalloc(sizeof(bool) * num);\r
20927 \r
20928         for (i = 0;i < num;i++)\r
20929         {\r
20930                 CTC *ctc = LIST_DATA(ct->Columns, i);\r
20931 \r
20932                 header_strings[i] = ctc->String;\r
20933                 rights[i] = ctc->Right;\r
20934         }\r
20935 \r
20936         CtPrintRow(c, num, widths, header_strings, rights, '|');\r
20937 \r
20938         for (i = 0;i < num;i++)\r
20939         {\r
20940                 char *s;\r
20941 \r
20942                 s = MakeCharArray('-', widths[i]);\r
20943                 header_strings[i] = CopyStrToUni(s);\r
20944                 Free(s);\r
20945         }\r
20946 \r
20947         CtPrintRow(c, num, widths, header_strings, rights, '+');\r
20948 \r
20949         for (i = 0;i < num;i++)\r
20950         {\r
20951                 Free(header_strings[i]);\r
20952         }\r
20953 \r
20954         // データ部を表示する\r
20955         for (j = 0;j < LIST_NUM(ct->Rows);j++)\r
20956         {\r
20957                 CTR *ctr = LIST_DATA(ct->Rows, j);\r
20958 \r
20959                 CtPrintRow(c, num, widths, ctr->Strings, rights, '|');\r
20960         }\r
20961 \r
20962         Free(rights);\r
20963         Free(header_strings);\r
20964         Free(widths);\r
20965 }\r
20966 \r
20967 // CSV でのメタ文字をエスケープする\r
20968 void CtEscapeCsv(wchar_t *dst, UINT size, wchar_t *src){\r
20969         UINT i;\r
20970         UINT len = UniStrLen(src);\r
20971         UINT idx;\r
20972         BOOL need_to_escape = false;\r
20973         wchar_t tmp[2]=L"*";\r
20974 \r
20975         // 入力値のチェック\r
20976         if (src==NULL || dst==NULL)\r
20977         {\r
20978                 return;\r
20979         }\r
20980 \r
20981         // 入力文字中にエスケープする必要のある文字が無ければそのまま出力にコピー\r
20982         len = UniStrLen(src);\r
20983         for (i=0; i<len; i++)\r
20984         {\r
20985                 tmp[0] = src[i];\r
20986                 if (tmp[0] == L","[0] || tmp[0] == L"\n"[0] || tmp[0] == L"\""[0])\r
20987                 {\r
20988                         need_to_escape = true;\r
20989                 }\r
20990         }\r
20991         if (need_to_escape == false)\r
20992         {\r
20993                 UniStrCpy(dst,size,src);\r
20994                 return;\r
20995         }\r
20996 \r
20997         // メタ文字(改行、コンマ、ダブルクオート)を含んでいる場合は”で囲む\r
20998         UniStrCpy(dst, size, L"\"");\r
20999         idx = UniStrLen(dst);\r
21000         if(idx<size-1)\r
21001         {\r
21002                 for (i=0; i<len; i++)\r
21003                 {\r
21004                         tmp[0] = src[i];\r
21005                         // ”は””に変換する(MS-Excel方式)\r
21006                         if (tmp[0] == L"\""[0])\r
21007                         {\r
21008                                 UniStrCat(dst, size, tmp);\r
21009                         }\r
21010                         UniStrCat(dst, size, tmp);\r
21011                 }\r
21012         }\r
21013         UniStrCat(dst, size, L"\"");\r
21014         return;\r
21015 }\r
21016 \r
21017 // コンソールテーブルの CSV 形式の表示\r
21018 void CtPrintCsv(CT *ct, CONSOLE *c)\r
21019 {\r
21020         UINT i, j;\r
21021         UINT num_columns = LIST_NUM(ct->Columns);\r
21022         wchar_t buf[MAX_SIZE];\r
21023         wchar_t fmtbuf[MAX_SIZE];\r
21024 \r
21025         // 見出しの行を表示\r
21026         buf[0] = 0;\r
21027         for(i=0; i<num_columns; i++)\r
21028         {\r
21029                 CTC *ctc = LIST_DATA(ct->Columns, i);\r
21030                 CtEscapeCsv(fmtbuf, MAX_SIZE, ctc->String);\r
21031                 UniStrCat(buf, MAX_SIZE, fmtbuf);\r
21032                 if(i != num_columns-1)\r
21033                         UniStrCat(buf, MAX_SIZE, L",");\r
21034         }\r
21035         c->Write(c, buf);\r
21036 \r
21037         // 表の本体を表示\r
21038         for(j=0; j<LIST_NUM(ct->Rows); j++)\r
21039         {\r
21040                 CTR *ctr = LIST_DATA(ct->Rows, j);\r
21041                 buf[0] = 0;\r
21042                 for(i=0; i<num_columns; i++)\r
21043                 {\r
21044                         CtEscapeCsv(fmtbuf, MAX_SIZE, ctr->Strings[i]);\r
21045                         UniStrCat(buf, MAX_SIZE, fmtbuf);\r
21046                         if(i != num_columns-1)\r
21047                                 UniStrCat(buf, MAX_SIZE, L",");\r
21048                 }\r
21049                 c->Write(c, buf);\r
21050         }\r
21051 }\r
21052 \r
21053 // コンソールテーブルの削除\r
21054 void CtFreeEx(CT *ct, CONSOLE *c, bool standard_view)\r
21055 {\r
21056         UINT i, num;\r
21057         // 引数チェック\r
21058         if (ct == NULL)\r
21059         {\r
21060                 return;\r
21061         }\r
21062 \r
21063         if (c != NULL)\r
21064         {\r
21065                 if (c->ConsoleType == CONSOLE_CSV)\r
21066                 {\r
21067                         CtPrintCsv(ct, c);\r
21068                 }\r
21069                 else\r
21070                 {\r
21071                         if (standard_view == false)\r
21072                         {\r
21073                                 CtPrint(ct, c);\r
21074                         }\r
21075                         else\r
21076                         {\r
21077                                 CtPrintStandard(ct, c);\r
21078                         }\r
21079                 }\r
21080         }\r
21081 \r
21082         num = LIST_NUM(ct->Columns);\r
21083 \r
21084         for (i = 0;i < LIST_NUM(ct->Rows);i++)\r
21085         {\r
21086                 UINT j;\r
21087                 CTR *ctr = LIST_DATA(ct->Rows, i);\r
21088 \r
21089                 for (j = 0;j < num;j++)\r
21090                 {\r
21091                         Free(ctr->Strings[j]);\r
21092                 }\r
21093 \r
21094                 Free(ctr->Strings);\r
21095                 Free(ctr);\r
21096         }\r
21097 \r
21098         for (i = 0;i < LIST_NUM(ct->Columns);i++)\r
21099         {\r
21100                 CTC *ctc = LIST_DATA(ct->Columns, i);\r
21101 \r
21102                 Free(ctc->String);\r
21103                 Free(ctc);\r
21104         }\r
21105 \r
21106         ReleaseList(ct->Columns);\r
21107         ReleaseList(ct->Rows);\r
21108 \r
21109         Free(ct);\r
21110 }\r
21111 void CtFree(CT *ct, CONSOLE *c)\r
21112 {\r
21113         CtFreeEx(ct, c, false);\r
21114 }\r
21115 \r
21116 // テーブルに行を追加\r
21117 void CtInsert(CT *ct, ...)\r
21118 {\r
21119         CTR *ctr;\r
21120         UINT num, i;\r
21121         va_list va;\r
21122         // 引数チェック\r
21123         if (ct == NULL)\r
21124         {\r
21125                 return;\r
21126         }\r
21127 \r
21128         num = LIST_NUM(ct->Columns);\r
21129 \r
21130         va_start(va, ct);\r
21131 \r
21132         ctr = ZeroMalloc(sizeof(CTR));\r
21133         ctr->Strings = ZeroMalloc(sizeof(wchar_t *) * num);\r
21134 \r
21135         for (i = 0;i < num;i++)\r
21136         {\r
21137                 wchar_t *s = va_arg(va, wchar_t *);\r
21138 \r
21139                 ctr->Strings[i] = CopyUniStr(s);\r
21140         }\r
21141 \r
21142         va_end(va);\r
21143 \r
21144         Insert(ct->Rows, ctr);\r
21145 }\r
21146 \r
21147 // テーブルにカラムを追加\r
21148 void CtInsertColumn(CT *ct, wchar_t *str, bool right)\r
21149 {\r
21150         CTC *ctc;\r
21151         // 引数チェック\r
21152         if (ct == NULL)\r
21153         {\r
21154                 return;\r
21155         }\r
21156         if (str == NULL)\r
21157         {\r
21158                 str = L"";\r
21159         }\r
21160 \r
21161         ctc = ZeroMalloc(sizeof(CTC));\r
21162         ctc->String = CopyUniStr(str);\r
21163         ctc->Right = right;\r
21164 \r
21165         Insert(ct->Columns, ctc);\r
21166 }\r
21167 \r
21168 // 新規コンソールテーブルの作成\r
21169 CT *CtNew()\r
21170 {\r
21171         CT *ct;\r
21172 \r
21173         ct = ZeroMalloc(sizeof(CT));\r
21174         ct->Columns = NewList(NULL);\r
21175         ct->Rows = NewList(NULL);\r
21176 \r
21177         return ct;\r
21178 }\r
21179 \r
21180 // テーブルのカラムに標準的なカラムを追加する\r
21181 CT *CtNewStandard()\r
21182 {\r
21183         CT *ct = CtNew();\r
21184 \r
21185         CtInsertColumn(ct, _UU("CMD_CT_STD_COLUMN_1"), false);\r
21186         CtInsertColumn(ct, _UU("CMD_CT_STD_COLUMN_2"), false);\r
21187 \r
21188         return ct;\r
21189 }\r
21190 CT *CtNewStandardEx()\r
21191 {\r
21192         CT *ct = CtNew();\r
21193 \r
21194         CtInsertColumn(ct, _UU("CMD_CT_STD_COLUMN_1"), false);\r
21195         CtInsertColumn(ct, _UU("CMD_CT_STD_COLUMN_2"), false);\r
21196         CtInsertColumn(ct, _UU("CMD_CT_STD_COLUMN_3"), false);\r
21197 \r
21198         return ct;\r
21199 }\r
21200 \r
21201 // TCP リスナー一覧の取得\r
21202 UINT PsListenerList(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)\r
21203 {\r
21204         LIST *o;\r
21205         PS *ps = (PS *)param;\r
21206         UINT ret;\r
21207         RPC_LISTENER_LIST t;\r
21208         UINT i;\r
21209         CT *ct;\r
21210 \r
21211         o = ParseCommandList(c, cmd_name, str, NULL, 0);\r
21212         if (o == NULL)\r
21213         {\r
21214                 return ERR_INVALID_PARAMETER;\r
21215         }\r
21216 \r
21217         Zero(&t, sizeof(t));\r
21218 \r
21219         ret = ScEnumListener(ps->Rpc, &t);\r
21220 \r
21221         if (ret != ERR_NO_ERROR)\r
21222         {\r
21223                 CmdPrintError(c, ret);\r
21224                 FreeParamValueList(o);\r
21225                 return ret;\r
21226         }\r
21227 \r
21228         ct = CtNew();\r
21229 \r
21230         CtInsertColumn(ct, _UU("CM_LISTENER_COLUMN_1"), false);\r
21231         CtInsertColumn(ct, _UU("CM_LISTENER_COLUMN_2"), false);\r
21232 \r
21233         for (i = 0;i < t.NumPort;i++)\r
21234         {\r
21235                 wchar_t *status = _UU("CM_LISTENER_OFFLINE");\r
21236                 wchar_t tmp[128];\r
21237 \r
21238                 if (t.Errors[i])\r
21239                 {\r
21240                         status = _UU("CM_LISTENER_ERROR");\r
21241                 }\r
21242                 else if (t.Enables[i])\r
21243                 {\r
21244                         status = _UU("CM_LISTENER_ONLINE");\r
21245                 }\r
21246 \r
21247                 UniFormat(tmp, sizeof(tmp), _UU("CM_LISTENER_TCP_PORT"), t.Ports[i]);\r
21248 \r
21249                 CtInsert(ct, tmp, status);\r
21250         }\r
21251 \r
21252         CtFree(ct, c);\r
21253 \r
21254         FreeRpcListenerList(&t);\r
21255 \r
21256         FreeParamValueList(o);\r
21257 \r
21258         return 0;\r
21259 }\r
21260 \r
21261 // TCP リスナーの削除\r
21262 UINT PsListenerDelete(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)\r
21263 {\r
21264         LIST *o;\r
21265         PS *ps = (PS *)param;\r
21266         UINT ret;\r
21267         RPC_LISTENER t;\r
21268         PARAM args[] =\r
21269         {\r
21270                 {"[port]", CmdPromptPort, _UU("CMD_ListenerDelete_PortPrompt"), CmdEvalPort, NULL},\r
21271         };\r
21272 \r
21273         o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));\r
21274         if (o == NULL)\r
21275         {\r
21276                 return ERR_INVALID_PARAMETER;\r
21277         }\r
21278 \r
21279         Zero(&t, sizeof(t));\r
21280         t.Enable = true;\r
21281         t.Port = ToInt(GetParamStr(o, "[port]"));\r
21282 \r
21283         ret = ScDeleteListener(ps->Rpc, &t);\r
21284 \r
21285         if (ret != ERR_NO_ERROR)\r
21286         {\r
21287                 CmdPrintError(c, ret);\r
21288                 FreeParamValueList(o);\r
21289                 return ret;\r
21290         }\r
21291 \r
21292         FreeParamValueList(o);\r
21293 \r
21294         return 0;\r
21295 }\r
21296 \r
21297 // 行を描画\r
21298 void CmdPrintRow(CONSOLE *c, wchar_t *title, wchar_t *tag, ...)\r
21299 {\r
21300         wchar_t buf[MAX_SIZE * 2];\r
21301         wchar_t buf2[MAX_SIZE * 2];\r
21302         va_list args;\r
21303         // 引数チェック\r
21304         if (title == NULL || c == NULL || tag == NULL)\r
21305         {\r
21306                 return;\r
21307         }\r
21308 \r
21309         va_start(args, tag);\r
21310         UniFormatArgs(buf, sizeof(buf), tag, args);\r
21311 \r
21312         UniFormat(buf2, sizeof(buf2), L"[%s] %s", title, buf);\r
21313 \r
21314         va_end(args);\r
21315 \r
21316         c->Write(c, buf2);\r
21317 }\r
21318 \r
21319 // ServerInfoGet コマンド\r
21320 UINT PsServerInfoGet(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)\r
21321 {\r
21322         LIST *o;\r
21323         PS *ps = (PS *)param;\r
21324         UINT ret;\r
21325         RPC_SERVER_INFO t;\r
21326         CT *ct;\r
21327         wchar_t tmp[MAX_SIZE];\r
21328 \r
21329         o = ParseCommandList(c, cmd_name, str, NULL, 0);\r
21330         if (o == NULL)\r
21331         {\r
21332                 return ERR_INVALID_PARAMETER;\r
21333         }\r
21334 \r
21335         Zero(&t, sizeof(t));\r
21336         ret = ScGetServerInfo(ps->Rpc, &t);\r
21337         if (ret != ERR_NO_ERROR)\r
21338         {\r
21339                 CmdPrintError(c, ret);\r
21340                 FreeParamValueList(o);\r
21341                 return ret;\r
21342         }\r
21343 \r
21344         ct = CtNew();\r
21345 \r
21346         CtInsertColumn(ct, _UU("SM_STATUS_COLUMN_1"), false);\r
21347         CtInsertColumn(ct, _UU("SM_STATUS_COLUMN_2"), false);\r
21348 \r
21349         // 製品名\r
21350         StrToUni(tmp, sizeof(tmp), t.ServerProductName);\r
21351         CtInsert(ct, _UU("SM_INFO_PRODUCT_NAME"), tmp);\r
21352 \r
21353         // バージョン\r
21354         StrToUni(tmp, sizeof(tmp), t.ServerVersionString);\r
21355         CtInsert(ct, _UU("SM_INFO_VERSION"), tmp);\r
21356 \r
21357         // ビルド\r
21358         StrToUni(tmp, sizeof(tmp), t.ServerBuildInfoString);\r
21359         CtInsert(ct, _UU("SM_INFO_BUILD"), tmp);\r
21360 \r
21361         // ホスト名\r
21362         StrToUni(tmp, sizeof(tmp), t.ServerHostName);\r
21363         CtInsert(ct, _UU("SM_INFO_HOSTNAME"), tmp);\r
21364 \r
21365         // 種類\r
21366         CtInsert(ct, _UU("SM_ST_SERVER_TYPE"), GetServerTypeStr(t.ServerType));\r
21367 \r
21368         // OS\r
21369         StrToUni(tmp, sizeof(tmp), t.OsInfo.OsSystemName);\r
21370         CtInsert(ct, _UU("SM_OS_SYSTEM_NAME"), tmp);\r
21371 \r
21372         StrToUni(tmp, sizeof(tmp), t.OsInfo.OsProductName);\r
21373         CtInsert(ct, _UU("SM_OS_PRODUCT_NAME"), tmp);\r
21374 \r
21375         if (t.OsInfo.OsServicePack != 0)\r
21376         {\r
21377                 UniFormat(tmp, sizeof(tmp), _UU("SM_OS_SP_TAG"), t.OsInfo.OsServicePack);\r
21378                 CtInsert(ct, _UU("SM_OS_SERVICE_PACK"), tmp);\r
21379         }\r
21380 \r
21381         StrToUni(tmp, sizeof(tmp), t.OsInfo.OsVendorName);\r
21382         CtInsert(ct, _UU("SM_OS_VENDER_NAME"), tmp);\r
21383 \r
21384         StrToUni(tmp, sizeof(tmp), t.OsInfo.OsVersion);\r
21385         CtInsert(ct, _UU("SM_OS_VERSION"), tmp);\r
21386 \r
21387         StrToUni(tmp, sizeof(tmp), t.OsInfo.KernelName);\r
21388         CtInsert(ct, _UU("SM_OS_KERNEL_NAME"), tmp);\r
21389 \r
21390         StrToUni(tmp, sizeof(tmp), t.OsInfo.KernelVersion);\r
21391         CtInsert(ct, _UU("SM_OS_KERNEL_VERSION"), tmp);\r
21392 \r
21393         CtFree(ct, c);\r
21394 \r
21395         FreeRpcServerInfo(&t);\r
21396 \r
21397         FreeParamValueList(o);\r
21398 \r
21399         return 0;\r
21400 }\r
21401 \r
21402 // HUB の種類の文字列を取得\r
21403 wchar_t *GetHubTypeStr(UINT type)\r
21404 {\r
21405         if (type == HUB_TYPE_FARM_STATIC)\r
21406         {\r
21407                 return _UU("SM_HUB_STATIC");\r
21408         }\r
21409         else if (type == HUB_TYPE_FARM_DYNAMIC)\r
21410         {\r
21411                 return _UU("SM_HUB_DYNAMIC");\r
21412         }\r
21413         return _UU("SM_HUB_STANDALONE");\r
21414 }\r
21415 \r
21416 // サーバーの種類の文字列を取得\r
21417 wchar_t *GetServerTypeStr(UINT type)\r
21418 {\r
21419         if (type == SERVER_TYPE_FARM_CONTROLLER)\r
21420         {\r
21421                 return _UU("SM_FARM_CONTROLLER");\r
21422         }\r
21423         else if (type == SERVER_TYPE_FARM_MEMBER)\r
21424         {\r
21425                 return _UU("SM_FARM_MEMBER");\r
21426         }\r
21427         return _UU("SM_SERVER_STANDALONE");\r
21428 }\r
21429 \r
21430 // ServerStatusGet コマンド\r
21431 UINT PsServerStatusGet(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)\r
21432 {\r
21433         LIST *o;\r
21434         PS *ps = (PS *)param;\r
21435         UINT ret;\r
21436         RPC_SERVER_STATUS t;\r
21437         wchar_t tmp[MAX_PATH];\r
21438         char tmp2[MAX_PATH];\r
21439         CT *ct;\r
21440 \r
21441         o = ParseCommandList(c, cmd_name, str, NULL, 0);\r
21442         if (o == NULL)\r
21443         {\r
21444                 return ERR_INVALID_PARAMETER;\r
21445         }\r
21446 \r
21447         Zero(&t, sizeof(t));\r
21448         ret = ScGetServerStatus(ps->Rpc, &t);\r
21449         if (ret != ERR_NO_ERROR)\r
21450         {\r
21451                 CmdPrintError(c, ret);\r
21452                 FreeParamValueList(o);\r
21453                 return ret;\r
21454         }\r
21455 \r
21456         ct = CtNew();\r
21457 \r
21458         CtInsertColumn(ct, _UU("SM_STATUS_COLUMN_1"), false);\r
21459         CtInsertColumn(ct, _UU("SM_STATUS_COLUMN_2"), false);\r
21460 \r
21461         // サーバーの種類\r
21462         CtInsert(ct, _UU("SM_ST_SERVER_TYPE"),\r
21463                 t.ServerType == SERVER_TYPE_STANDALONE ? _UU("SM_SERVER_STANDALONE") :\r
21464                 t.ServerType == SERVER_TYPE_FARM_MEMBER ? _UU("SM_FARM_MEMBER") : _UU("SM_FARM_CONTROLLER"));\r
21465 \r
21466         // TCP コネクション数\r
21467         UniToStru(tmp, t.NumTcpConnections);\r
21468         CtInsert(ct, _UU("SM_ST_NUM_TCP"), tmp);\r
21469 \r
21470         if (t.ServerType == SERVER_TYPE_FARM_CONTROLLER)\r
21471         {\r
21472                 // ローカル TCP コネクション数\r
21473                 UniToStru(tmp, t.NumTcpConnectionsLocal);\r
21474                 CtInsert(ct, _UU("SM_ST_NUM_TCP_LOCAL"), tmp);\r
21475 \r
21476                 // リモート TCP コネクション数\r
21477                 UniToStru(tmp, t.NumTcpConnectionsRemote);\r
21478                 CtInsert(ct, _UU("SM_ST_NUM_TCP_REMOTE"), tmp);\r
21479         }\r
21480 \r
21481         // 仮想 HUB 数\r
21482         UniToStru(tmp, t.NumHubTotal);\r
21483         CtInsert(ct, _UU("SM_ST_NUM_HUB_TOTAL"), tmp);\r
21484 \r
21485         if (t.ServerType != SERVER_TYPE_STANDALONE)\r
21486         {\r
21487                 // スタティック HUB 数\r
21488                 UniToStru(tmp, t.NumHubStatic);\r
21489                 CtInsert(ct, _UU("SM_ST_NUM_HUB_STATIC"), tmp);\r
21490 \r
21491                 // ダイナミック HUB 数\r
21492                 UniToStru(tmp, t.NumHubDynamic);\r
21493                 CtInsert(ct, _UU("SM_ST_NUM_HUB_DYNAMIC"), tmp);\r
21494         }\r
21495 \r
21496         // セッション数\r
21497         UniToStru(tmp, t.NumSessionsTotal);\r
21498         CtInsert(ct, _UU("SM_ST_NUM_SESSION_TOTAL"), tmp);\r
21499 \r
21500         if (t.ServerType == SERVER_TYPE_FARM_CONTROLLER)\r
21501         {\r
21502                 // ローカルセッション数\r
21503                 UniToStru(tmp, t.NumSessionsLocal);\r
21504                 CtInsert(ct, _UU("SM_ST_NUM_SESSION_LOCAL"), tmp);\r
21505 \r
21506                 // ローカルセッション数\r
21507                 UniToStru(tmp, t.NumSessionsRemote);\r
21508                 CtInsert(ct, _UU("SM_ST_NUM_SESSION_REMOTE"), tmp);\r
21509         }\r
21510 \r
21511         // MAC テーブル数\r
21512         UniToStru(tmp, t.NumMacTables);\r
21513         CtInsert(ct, _UU("SM_ST_NUM_MAC_TABLE"), tmp);\r
21514 \r
21515         // IP テーブル数\r
21516         UniToStru(tmp, t.NumIpTables);\r
21517         CtInsert(ct, _UU("SM_ST_NUM_IP_TABLE"), tmp);\r
21518 \r
21519         // ユーザー数\r
21520         UniToStru(tmp, t.NumUsers);\r
21521         CtInsert(ct, _UU("SM_ST_NUM_USERS"), tmp);\r
21522 \r
21523         // グループ数\r
21524         UniToStru(tmp, t.NumGroups);\r
21525         CtInsert(ct, _UU("SM_ST_NUM_GROUPS"), tmp);\r
21526 \r
21527         // 割り当て済みライセンス数\r
21528         UniToStru(tmp, t.AssignedClientLicenses);\r
21529         CtInsert(ct, _UU("SM_ST_CLIENT_LICENSE"), tmp);\r
21530 \r
21531         UniToStru(tmp, t.AssignedBridgeLicenses);\r
21532         CtInsert(ct, _UU("SM_ST_BRIDGE_LICENSE"), tmp);\r
21533 \r
21534         if (t.ServerType == SERVER_TYPE_FARM_CONTROLLER)\r
21535         {\r
21536                 UniToStru(tmp, t.AssignedClientLicensesTotal);\r
21537                 CtInsert(ct, _UU("SM_ST_CLIENT_LICENSE_EX"), tmp);\r
21538 \r
21539                 UniToStru(tmp, t.AssignedBridgeLicensesTotal);\r
21540                 CtInsert(ct, _UU("SM_ST_BRIDGE_LICENSE_EX"), tmp);\r
21541         }\r
21542 \r
21543         // トラフィック\r
21544         CmdInsertTrafficInfo(ct, &t.Traffic);\r
21545 \r
21546         // サーバー起動時刻\r
21547         GetDateTimeStrEx64(tmp, sizeof(tmp), SystemToLocal64(t.StartTime), NULL);\r
21548         CtInsert(ct, _UU("SM_ST_START_TIME"), tmp);\r
21549 \r
21550         // 現在時刻\r
21551         GetDateTimeStrMilli64(tmp2, sizeof(tmp2), SystemToLocal64(t.CurrentTime));\r
21552         StrToUni(tmp, sizeof(tmp), tmp2);\r
21553         CtInsert(ct, _UU("SM_ST_CURRENT_TIME"), tmp);\r
21554 \r
21555         // Tick 値\r
21556         UniFormat(tmp, sizeof(tmp), L"%I64u", t.CurrentTick);\r
21557         CtInsert(ct, _UU("SM_ST_CURRENT_TICK"), tmp);\r
21558 \r
21559         // メモリ情報\r
21560         if (t.MemInfo.TotalMemory != 0)\r
21561         {\r
21562                 char vv[128];\r
21563 \r
21564                 ToStr3(vv, sizeof(vv), t.MemInfo.TotalMemory);\r
21565                 UniFormat(tmp, sizeof(tmp), _UU("SM_ST_RAM_SIZE_KB"), vv);\r
21566                 CtInsert(ct, _UU("SM_ST_TOTAL_MEMORY"), tmp);\r
21567 \r
21568                 ToStr3(vv, sizeof(vv), t.MemInfo.UsedMemory);\r
21569                 UniFormat(tmp, sizeof(tmp), _UU("SM_ST_RAM_SIZE_KB"), vv);\r
21570                 CtInsert(ct, _UU("SM_ST_USED_MEMORY"), tmp);\r
21571 \r
21572                 ToStr3(vv, sizeof(vv), t.MemInfo.FreeMemory);\r
21573                 UniFormat(tmp, sizeof(tmp), _UU("SM_ST_RAM_SIZE_KB"), vv);\r
21574                 CtInsert(ct, _UU("SM_ST_FREE_MEMORY"), tmp);\r
21575 \r
21576                 ToStr3(vv, sizeof(vv), t.MemInfo.TotalPhys);\r
21577                 UniFormat(tmp, sizeof(tmp), _UU("SM_ST_RAM_SIZE_KB"), vv);\r
21578                 CtInsert(ct, _UU("SM_ST_TOTAL_PHYS"), tmp);\r
21579 \r
21580                 ToStr3(vv, sizeof(vv), t.MemInfo.UsedPhys);\r
21581                 UniFormat(tmp, sizeof(tmp), _UU("SM_ST_RAM_SIZE_KB"), vv);\r
21582                 CtInsert(ct, _UU("SM_ST_USED_PHYS"), tmp);\r
21583 \r
21584                 ToStr3(vv, sizeof(vv), t.MemInfo.FreePhys);\r
21585                 UniFormat(tmp, sizeof(tmp), _UU("SM_ST_RAM_SIZE_KB"), vv);\r
21586                 CtInsert(ct, _UU("SM_ST_FREE_PHYS"), tmp);\r
21587         }\r
21588 \r
21589         CtFree(ct, c);\r
21590 \r
21591         FreeParamValueList(o);\r
21592 \r
21593         return 0;\r
21594 }\r
21595 \r
21596 // トラフィック情報を LVB に追加\r
21597 void CmdInsertTrafficInfo(CT *ct, TRAFFIC *t)\r
21598 {\r
21599         wchar_t tmp[MAX_SIZE];\r
21600         char vv[128];\r
21601         // 引数チェック\r
21602         if (ct == NULL || t == NULL)\r
21603         {\r
21604                 return;\r
21605         }\r
21606 \r
21607         // 送信情報\r
21608         ToStr3(vv, sizeof(vv), t->Send.UnicastCount);\r
21609         UniFormat(tmp, sizeof(tmp), _UU("SM_ST_NUM_PACKET_STR"), vv);\r
21610         CtInsert(ct, _UU("SM_ST_SEND_UCAST_NUM"), tmp);\r
21611 \r
21612         ToStr3(vv, sizeof(vv), t->Send.UnicastBytes);\r
21613         UniFormat(tmp, sizeof(tmp), _UU("SM_ST_SIZE_BYTE_STR"), vv);\r
21614         CtInsert(ct, _UU("SM_ST_SEND_UCAST_SIZE"), tmp);\r
21615 \r
21616         ToStr3(vv, sizeof(vv), t->Send.BroadcastCount);\r
21617         UniFormat(tmp, sizeof(tmp), _UU("SM_ST_NUM_PACKET_STR"), vv);\r
21618         CtInsert(ct, _UU("SM_ST_SEND_BCAST_NUM"), tmp);\r
21619 \r
21620         ToStr3(vv, sizeof(vv), t->Send.BroadcastBytes);\r
21621         UniFormat(tmp, sizeof(tmp), _UU("SM_ST_SIZE_BYTE_STR"), vv);\r
21622         CtInsert(ct, _UU("SM_ST_SEND_BCAST_SIZE"), tmp);\r
21623 \r
21624         // 受信情報\r
21625         ToStr3(vv, sizeof(vv), t->Recv.UnicastCount);\r
21626         UniFormat(tmp, sizeof(tmp), _UU("SM_ST_NUM_PACKET_STR"), vv);\r
21627         CtInsert(ct, _UU("SM_ST_RECV_UCAST_NUM"), tmp);\r
21628 \r
21629         ToStr3(vv, sizeof(vv), t->Recv.UnicastBytes);\r
21630         UniFormat(tmp, sizeof(tmp), _UU("SM_ST_SIZE_BYTE_STR"), vv);\r
21631         CtInsert(ct, _UU("SM_ST_RECV_UCAST_SIZE"), tmp);\r
21632 \r
21633         ToStr3(vv, sizeof(vv), t->Recv.BroadcastCount);\r
21634         UniFormat(tmp, sizeof(tmp), _UU("SM_ST_NUM_PACKET_STR"), vv);\r
21635         CtInsert(ct, _UU("SM_ST_RECV_BCAST_NUM"), tmp);\r
21636 \r
21637         ToStr3(vv, sizeof(vv), t->Recv.BroadcastBytes);\r
21638         UniFormat(tmp, sizeof(tmp), _UU("SM_ST_SIZE_BYTE_STR"), vv);\r
21639         CtInsert(ct, _UU("SM_ST_RECV_BCAST_SIZE"), tmp);\r
21640 }\r
21641 \r
21642 // ポート番号の入力\r
21643 wchar_t *CmdPromptPort(CONSOLE *c, void *param)\r
21644 {\r
21645         wchar_t *prompt_str;\r
21646 \r
21647         if (param != NULL)\r
21648         {\r
21649                 prompt_str = (wchar_t *)param;\r
21650         }\r
21651         else\r
21652         {\r
21653                 prompt_str = _UU("CMD_PROPMT_PORT");\r
21654         }\r
21655 \r
21656         return c->ReadLine(c, prompt_str, true);\r
21657 }\r
21658 \r
21659 // ポート番号の検証\r
21660 bool CmdEvalPort(CONSOLE *c, wchar_t *str, void *param)\r
21661 {\r
21662         UINT i;\r
21663         // 引数チェック\r
21664         if (c == NULL || str == NULL)\r
21665         {\r
21666                 return false;\r
21667         }\r
21668 \r
21669         i = UniToInt(str);\r
21670 \r
21671         if (i >= 1 && i <= 65535)\r
21672         {\r
21673                 return true;\r
21674         }\r
21675 \r
21676         c->Write(c, _UU("CMD_EVAL_PORT"));\r
21677 \r
21678         return false;\r
21679 }\r
21680 \r
21681 // ListenerCreate コマンド\r
21682 UINT PsListenerCreate(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)\r
21683 {\r
21684         LIST *o;\r
21685         PS *ps = (PS *)param;\r
21686         UINT ret;\r
21687         RPC_LISTENER t;\r
21688         PARAM args[] =\r
21689         {\r
21690                 {"[port]", CmdPromptPort, _UU("CMD_ListenerCreate_PortPrompt"), CmdEvalPort, NULL},\r
21691         };\r
21692 \r
21693         o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));\r
21694         if (o == NULL)\r
21695         {\r
21696                 return ERR_INVALID_PARAMETER;\r
21697         }\r
21698 \r
21699         Zero(&t, sizeof(t));\r
21700         t.Enable = true;\r
21701         t.Port = ToInt(GetParamStr(o, "[port]"));\r
21702 \r
21703         ret = ScCreateListener(ps->Rpc, &t);\r
21704 \r
21705         if (ret != ERR_NO_ERROR)\r
21706         {\r
21707                 CmdPrintError(c, ret);\r
21708                 FreeParamValueList(o);\r
21709                 return ret;\r
21710         }\r
21711 \r
21712         FreeParamValueList(o);\r
21713 \r
21714         return 0;\r
21715 }\r
21716 \r
21717 // About コマンド\r
21718 UINT PsAbout(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)\r
21719 {\r
21720         LIST *o;\r
21721 \r
21722         o = ParseCommandList(c, cmd_name, str, NULL, 0);\r
21723         if (o == NULL)\r
21724         {\r
21725                 return ERR_INVALID_PARAMETER;\r
21726         }\r
21727 \r
21728         // バージョン情報を表示する\r
21729         CmdPrintAbout(c);\r
21730 \r
21731         FreeParamValueList(o);\r
21732 \r
21733         return 0;\r
21734 }\r
21735 \r
21736 // 新しいサーバー管理コンテキストの作成\r
21737 PS *NewPs(CONSOLE *c, RPC *rpc, char *servername, UINT serverport, char *hubname, char *adminhub, wchar_t *cmdline)\r
21738 {\r
21739         PS *ps;\r
21740         // 引数チェック\r
21741         if (c == NULL || rpc == NULL || servername == NULL)\r
21742         {\r
21743                 return NULL;\r
21744         }\r
21745 \r
21746         if (IsEmptyStr(hubname))\r
21747         {\r
21748                 hubname = NULL;\r
21749         }\r
21750         if (IsEmptyStr(adminhub))\r
21751         {\r
21752                 adminhub = NULL;\r
21753         }\r
21754         if (UniIsEmptyStr(cmdline))\r
21755         {\r
21756                 cmdline = NULL;\r
21757         }\r
21758 \r
21759         ps = ZeroMalloc(sizeof(PS));\r
21760         ps->ConsoleForServer = true;\r
21761         ps->ServerPort = serverport;\r
21762         ps->ServerName = CopyStr(servername);\r
21763         ps->Console = c;\r
21764         ps->Rpc = rpc;\r
21765         ps->HubName = CopyStr(hubname);\r
21766         ps->LastError = 0;\r
21767         ps->AdminHub = CopyStr(adminhub);\r
21768         ps->CmdLine = CopyUniStr(cmdline);\r
21769 \r
21770         return ps;\r
21771 }\r
21772 \r
21773 // サーバー管理コンテキストの解放\r
21774 void FreePs(PS *ps)\r
21775 {\r
21776         // 引数チェック\r
21777         if (ps == NULL)\r
21778         {\r
21779                 return;\r
21780         }\r
21781 \r
21782         Free(ps->HubName);\r
21783         Free(ps->AdminHub);\r
21784         Free(ps->CmdLine);\r
21785         Free(ps->ServerName);\r
21786 \r
21787         Free(ps);\r
21788 }\r
21789 \r
21790 // サーバー管理ツール\r
21791 UINT PsConnect(CONSOLE *c, char *host, UINT port, char *hub, char *adminhub, wchar_t *cmdline, char *password)\r
21792 {\r
21793         UINT retcode = 0;\r
21794         RPC *rpc = NULL;\r
21795         CEDAR *cedar;\r
21796         CLIENT_OPTION o;\r
21797         UCHAR hashed_password[SHA1_SIZE];\r
21798         bool b = false;\r
21799         // 引数チェック\r
21800         if (c == NULL || host == NULL)\r
21801         {\r
21802                 return ERR_INVALID_PARAMETER;\r
21803         }\r
21804         if (port == 0)\r
21805         {\r
21806                 port = 443;\r
21807         }\r
21808         if (hub != NULL)\r
21809         {\r
21810                 adminhub = NULL;\r
21811         }\r
21812 \r
21813         cedar = NewCedar(NULL, NULL);\r
21814 \r
21815         Zero(&o, sizeof(o));\r
21816         UniStrCpy(o.AccountName, sizeof(o.AccountName), L"VPNCMD");\r
21817         StrCpy(o.Hostname, sizeof(o.Hostname), host);\r
21818         o.Port = port;\r
21819         o.ProxyType = PROXY_DIRECT;\r
21820 \r
21821         Hash(hashed_password, password, StrLen(password), true);\r
21822 \r
21823         if (IsEmptyStr(password) == false)\r
21824         {\r
21825                 b = true;\r
21826         }\r
21827 \r
21828         // 接続\r
21829         while (true)\r
21830         {\r
21831                 UINT err;\r
21832 \r
21833                 rpc = AdminConnectEx(cedar, &o, hub, hashed_password, &err, CEDAR_CUI_STR);\r
21834                 if (rpc == NULL)\r
21835                 {\r
21836                         // 失敗\r
21837                         retcode = err;\r
21838 \r
21839                         if (err == ERR_ACCESS_DENIED)\r
21840                         {\r
21841                                 char *pass;\r
21842                                 // パスワード違い\r
21843                                 if (b)\r
21844                                 {\r
21845                                         // パスワードを入力させる\r
21846                                         c->Write(c, _UU("CMD_UTVPNCMD_PASSWORD_1"));\r
21847                                 }\r
21848 \r
21849                                 b = true;\r
21850 \r
21851                                 pass = c->ReadPassword(c, _UU("CMD_UTVPNCMD_PASSWORD_2"));\r
21852                                 c->Write(c, L"");\r
21853 \r
21854                                 if (pass != NULL)\r
21855                                 {\r
21856                                         Hash(hashed_password, pass, StrLen(pass), true);\r
21857                                         Free(pass);\r
21858                                 }\r
21859                                 else\r
21860                                 {\r
21861                                         break;\r
21862                                 }\r
21863                         }\r
21864                         else\r
21865                         {\r
21866                                 // その他のエラー\r
21867                                 CmdPrintError(c, err);\r
21868                                 break;\r
21869                         }\r
21870                 }\r
21871                 else\r
21872                 {\r
21873                         PS *ps;\r
21874 \r
21875                         // 成功\r
21876                         ps = NewPs(c, rpc, host, port, hub, adminhub, cmdline);\r
21877                         PsMain(ps);\r
21878                         retcode = ps->LastError;\r
21879                         FreePs(ps);\r
21880                         AdminDisconnect(rpc);\r
21881                         break;\r
21882                 }\r
21883         }\r
21884 \r
21885         ReleaseCedar(cedar);\r
21886 \r
21887         return retcode;\r
21888 }\r
21889 \r
21890 // エラーを表示する\r
21891 void CmdPrintError(CONSOLE *c, UINT err)\r
21892 {\r
21893         wchar_t tmp[MAX_SIZE];\r
21894         // 引数チェック\r
21895         if (c == NULL)\r
21896         {\r
21897                 return;\r
21898         }\r
21899 \r
21900         UniFormat(tmp, sizeof(tmp), _UU("CMD_UTVPNCMD_ERROR"),\r
21901                 err, GetUniErrorStr(err));\r
21902         c->Write(c, tmp);\r
21903 \r
21904         if (err == ERR_DISCONNECTED)\r
21905         {\r
21906                 c->Write(c, _UU("CMD_DISCONNECTED_MSG"));\r
21907         }\r
21908 }\r
21909 \r
21910 // バージョン情報を表示する\r
21911 void CmdPrintAbout(CONSOLE *c)\r
21912 {\r
21913         CEDAR *cedar;\r
21914         wchar_t tmp[MAX_SIZE];\r
21915         char exe[MAX_PATH];\r
21916         // 引数チェック\r
21917         if (c == NULL)\r
21918         {\r
21919                 return;\r
21920         }\r
21921 \r
21922         cedar = NewCedar(NULL, NULL);\r
21923 \r
21924         GetExeName(exe, sizeof(exe));\r
21925 \r
21926         UniFormat(tmp, sizeof(tmp), _UU("CMD_UTVPNCMD_ABOUT"),\r
21927                 cedar->VerString, cedar->BuildInfo);\r
21928 \r
21929         c->Write(c, tmp);\r
21930 \r
21931         ReleaseCedar(cedar);\r
21932 }\r
21933 \r
21934 // ホスト名とポート番号をパースする (@ で区切る)\r
21935 bool ParseHostPortAtmark(char *src, char **host, UINT *port, UINT default_port)\r
21936 {\r
21937         TOKEN_LIST *t;\r
21938         bool ret = false;\r
21939         // 引数チェック\r
21940         if (src == NULL)\r
21941         {\r
21942                 return false;\r
21943         }\r
21944 \r
21945         t = ParseToken(src, "@");\r
21946         if (t == NULL)\r
21947         {\r
21948                 return false;\r
21949         }\r
21950 \r
21951         if (port != NULL)\r
21952         {\r
21953                 *port = 0;\r
21954         }\r
21955 \r
21956         if (default_port == 0)\r
21957         {\r
21958                 if (t->NumTokens < 2)\r
21959                 {\r
21960                         FreeToken(t);\r
21961                         return false;\r
21962                 }\r
21963 \r
21964                 if (ToInt(t->Token[1]) == 0)\r
21965                 {\r
21966                         FreeToken(t);\r
21967                         return false;\r
21968                 }\r
21969         }\r
21970 \r
21971         if (t->NumTokens >= 2 && ToInt(t->Token[1]) == 0)\r
21972         {\r
21973                 FreeToken(t);\r
21974                 return false;\r
21975         }\r
21976 \r
21977         if (t->NumTokens >= 1 && IsEmptyStr(t->Token[0]) == false)\r
21978         {\r
21979                 ret = true;\r
21980 \r
21981                 if (host != NULL)\r
21982                 {\r
21983                         *host = CopyStr(t->Token[0]);\r
21984                         Trim(*host);\r
21985                 }\r
21986 \r
21987                 if (t->NumTokens >= 2)\r
21988                 {\r
21989                         if (port != NULL)\r
21990                         {\r
21991                                 *port = ToInt(t->Token[1]);\r
21992                         }\r
21993                 }\r
21994         }\r
21995 \r
21996         if (port != NULL)\r
21997         {\r
21998                 if (*port == 0)\r
21999                 {\r
22000                         *port = default_port;\r
22001                 }\r
22002         }\r
22003 \r
22004         FreeToken(t);\r
22005 \r
22006         return ret;\r
22007 }\r
22008 \r
22009 // ホスト名とポート番号をパースする\r
22010 bool ParseHostPort(char *src, char **host, UINT *port, UINT default_port)\r
22011 {\r
22012         TOKEN_LIST *t;\r
22013         bool ret = false;\r
22014         // 引数チェック\r
22015         if (src == NULL)\r
22016         {\r
22017                 return false;\r
22018         }\r
22019 \r
22020         if (StartWith(src, "["))\r
22021         {\r
22022                 if (InStr(src, "]"))\r
22023                 {\r
22024                         // [target]:port の形式\r
22025                         UINT i, n;\r
22026                         char tmp[MAX_SIZE];\r
22027 \r
22028                         StrCpy(tmp, sizeof(tmp), src);\r
22029 \r
22030                         n = SearchStrEx(tmp, "]", 0, false);\r
22031                         if (n != INFINITE)\r
22032                         {\r
22033                                 UINT len = StrLen(tmp);\r
22034 \r
22035                                 for (i = n;i < len;i++)\r
22036                                 {\r
22037                                         if (tmp[i] == ':')\r
22038                                         {\r
22039                                                 tmp[i] = '@';\r
22040                                         }\r
22041                                 }\r
22042                         }\r
22043 \r
22044                         return ParseHostPortAtmark(tmp, host, port, default_port);\r
22045                 }\r
22046         }\r
22047 \r
22048         if (InStr(src, "@"))\r
22049         {\r
22050                 // @ で区切られている\r
22051                 return ParseHostPortAtmark(src, host, port, default_port);\r
22052         }\r
22053 \r
22054         t = ParseToken(src, ":");\r
22055         if (t == NULL)\r
22056         {\r
22057                 return false;\r
22058         }\r
22059 \r
22060         if (port != NULL)\r
22061         {\r
22062                 *port = 0;\r
22063         }\r
22064 \r
22065         if (default_port == 0)\r
22066         {\r
22067                 if (t->NumTokens < 2)\r
22068                 {\r
22069                         FreeToken(t);\r
22070                         return false;\r
22071                 }\r
22072 \r
22073                 if (ToInt(t->Token[1]) == 0)\r
22074                 {\r
22075                         FreeToken(t);\r
22076                         return false;\r
22077                 }\r
22078         }\r
22079 \r
22080         if (t->NumTokens >= 2 && ToInt(t->Token[1]) == 0)\r
22081         {\r
22082                 FreeToken(t);\r
22083                 return false;\r
22084         }\r
22085 \r
22086         if (t->NumTokens >= 1 && IsEmptyStr(t->Token[0]) == false)\r
22087         {\r
22088                 ret = true;\r
22089 \r
22090                 if (host != NULL)\r
22091                 {\r
22092                         *host = CopyStr(t->Token[0]);\r
22093                         Trim(*host);\r
22094                 }\r
22095 \r
22096                 if (t->NumTokens >= 2)\r
22097                 {\r
22098                         if (port != NULL)\r
22099                         {\r
22100                                 *port = ToInt(t->Token[1]);\r
22101                         }\r
22102                 }\r
22103         }\r
22104 \r
22105         if (port != NULL)\r
22106         {\r
22107                 if (*port == 0)\r
22108                 {\r
22109                         *port = default_port;\r
22110                 }\r
22111         }\r
22112 \r
22113         FreeToken(t);\r
22114 \r
22115         return ret;\r
22116 }\r
22117 \r
22118 // vpncmd コマンドプロシージャ\r
22119 UINT VpnCmdProc(CONSOLE *c, char *cmd_name, wchar_t *str, void *param)\r
22120 {\r
22121         LIST *o;\r
22122         char *target;\r
22123         bool server = false;\r
22124         bool client = false;\r
22125         bool tools = false;\r
22126         char *hostname = NULL;\r
22127         char *password;\r
22128         wchar_t *cmdline;\r
22129         bool host_inputted = false;\r
22130         UINT port = 0;\r
22131         UINT retcode = 0;\r
22132         PARAM args[] =\r
22133         {\r
22134                 {"[host:port]", NULL, NULL, NULL, NULL},\r
22135                 {"CLIENT", NULL, NULL, NULL, NULL},\r
22136                 {"SERVER", NULL, NULL, NULL, NULL},\r
22137                 {"TOOLS", NULL, NULL, NULL, NULL},\r
22138                 {"HUB", NULL, NULL, NULL, NULL},\r
22139                 {"ADMINHUB", NULL, NULL, NULL, NULL},\r
22140                 {"PASSWORD", NULL, NULL, NULL, NULL},\r
22141                 {"IN", NULL, NULL, NULL, NULL},\r
22142                 {"OUT", NULL, NULL, NULL, NULL},\r
22143                 {"CMD", NULL, NULL, NULL, NULL},\r
22144                 {"CSV", NULL, NULL, NULL, NULL},\r
22145         };\r
22146 \r
22147         if (c->ConsoleType == CONSOLE_LOCAL)\r
22148         {\r
22149                 // 起動パス情報の初期化\r
22150                 VpnCmdInitBootPath();\r
22151         }\r
22152 \r
22153         if(c->ConsoleType != CONSOLE_CSV)\r
22154         {\r
22155                 CmdPrintAbout(c);\r
22156                 c->Write(c, L"");\r
22157         }\r
22158 \r
22159         o = ParseCommandList(c, cmd_name, str, args, sizeof(args) / sizeof(args[0]));\r
22160 \r
22161         if (o == NULL)\r
22162         {\r
22163                 return ERR_INVALID_PARAMETER;\r
22164         }\r
22165 \r
22166         // Client か Server か Tools かの指定\r
22167         if ((GetParamStr(o, "CLIENT") == NULL && GetParamStr(o, "SERVER") == NULL && GetParamStr(o, "TOOLS") == NULL) ||\r
22168                 (GetParamStr(o, "CLIENT") != NULL && GetParamStr(o, "SERVER") != NULL && GetParamStr(o, "TOOLS") != NULL))\r
22169         {\r
22170                 wchar_t *ret;\r
22171                 UINT code;\r
22172                 // Client か Server か Tools かが指定されていない\r
22173                 c->Write(c, _UU("CMD_UTVPNCMD_CS_1"));\r
22174 \r
22175                 ret = c->ReadLine(c, _UU("CMD_UTVPNCMD_CS_2"), true);\r
22176 \r
22177                 code = UniToInt(ret);\r
22178                 Free(ret);\r
22179 \r
22180                 switch (code)\r
22181                 {\r
22182                 case 1:\r
22183                         // Server\r
22184                         server = true;\r
22185                         break;\r
22186 \r
22187                 case 2:\r
22188                         // Client\r
22189                         client = true;\r
22190                         break;\r
22191 \r
22192                 case 3:\r
22193                         // Tools\r
22194                         tools = true;\r
22195                         break;\r
22196 \r
22197                 default:\r
22198                         // 指定無し\r
22199                         FreeParamValueList(o);\r
22200                         return ERR_USER_CANCEL;\r
22201                 }\r
22202 \r
22203                 c->Write(c, L"");\r
22204         }\r
22205         else\r
22206         {\r
22207                 if (GetParamStr(o, "SERVER") != NULL)\r
22208                 {\r
22209                         server = true;\r
22210                 }\r
22211                 else if (GetParamStr(o, "CLIENT") != NULL)\r
22212                 {\r
22213                         client = true;\r
22214                 }\r
22215                 else\r
22216                 {\r
22217                         tools = true;\r
22218                 }\r
22219         }\r
22220 \r
22221         // 接続先ホスト名\r
22222         target = CopyStr(GetParamStr(o, "[host:port]"));\r
22223 \r
22224         if (target == NULL && tools == false)\r
22225         {\r
22226                 wchar_t *str;\r
22227                 // ホスト名を入力させる\r
22228                 if (server)\r
22229                 {\r
22230                         c->Write(c, _UU("CMD_UTVPNCMD_HOST_1"));\r
22231                 }\r
22232                 else if (client)\r
22233                 {\r
22234                         c->Write(c, _UU("CMD_UTVPNCMD_HOST_2"));\r
22235                 }\r
22236 \r
22237                 str = c->ReadLine(c, _UU("CMD_UTVPNCMD_HOST_3"), true);\r
22238                 c->Write(c, L"");\r
22239                 target = CopyUniToStr(str);\r
22240                 Free(str);\r
22241 \r
22242                 if (target == NULL)\r
22243                 {\r
22244                         // キャンセル\r
22245                         FreeParamValueList(o);\r
22246                         return ERR_USER_CANCEL;\r
22247                 }\r
22248 \r
22249                 if (IsEmptyStr(target))\r
22250                 {\r
22251                         Free(target);\r
22252                         target = CopyStr("localhost");\r
22253                 }\r
22254         }\r
22255         else\r
22256         {\r
22257                 // ユーザーがホスト名を指定した\r
22258                 host_inputted = true;\r
22259         }\r
22260 \r
22261         if (tools == false)\r
22262         {\r
22263                 if (ParseHostPort(target, &hostname, &port, 443) == false)\r
22264                 {\r
22265                         c->Write(c, _UU("CMD_MSG_INVALID_HOSTNAME"));\r
22266                         Free(target);\r
22267                         FreeParamValueList(o);\r
22268                         return ERR_INVALID_PARAMETER;\r
22269                 }\r
22270         }\r
22271 \r
22272         // パスワード\r
22273         password = GetParamStr(o, "PASSWORD");\r
22274         if (password == NULL)\r
22275         {\r
22276                 password = "";\r
22277         }\r
22278 \r
22279         // コマンドライン\r
22280         cmdline = GetParamUniStr(o, "CMD");\r
22281 \r
22282         if (server)\r
22283         {\r
22284                 // サーバーとしての処理\r
22285                 char *hub;\r
22286                 char *adminhub = NULL;\r
22287 \r
22288                 hub = CopyStr(GetParamStr(o, "HUB"));\r
22289                 adminhub = GetParamStr(o, "ADMINHUB");\r
22290 \r
22291                 // 仮想 HUB 管理モードで指定する仮想 HUB を決定する\r
22292                 if (hub == NULL)\r
22293                 {\r
22294                         if (host_inputted == false)\r
22295                         {\r
22296                                 wchar_t *s;\r
22297                                 // ユーザーがホスト名をコマンドラインで指定していない場合は\r
22298                                 // プロンプトを表示して仮想 HUB 名も取得する\r
22299                                 c->Write(c, _UU("CMD_UTVPNCMD_HUB_1"));\r
22300 \r
22301                                 s = c->ReadLine(c, _UU("CMD_UTVPNCMD_HUB_2"), true);\r
22302 \r
22303                                 hub = CopyUniToStr(s);\r
22304                                 Free(s);\r
22305                         }\r
22306                 }\r
22307 \r
22308                 if (IsEmptyStr(hub))\r
22309                 {\r
22310                         Free(hub);\r
22311                         hub = NULL;\r
22312                 }\r
22313                 if (IsEmptyStr(adminhub))\r
22314                 {\r
22315                         adminhub = NULL;\r
22316                 }\r
22317 \r
22318                 retcode = PsConnect(c, hostname, port, hub, adminhub, cmdline, password);\r
22319 \r
22320                 Free(hub);\r
22321         }\r
22322         else if (client)\r
22323         {\r
22324                 // クライアントとしての処理\r
22325                 Trim(target);\r
22326 \r
22327                 retcode = PcConnect(c, target, cmdline, password);\r
22328         }\r
22329         else if (tools)\r
22330         {\r
22331                 // VPN Tools として処理\r
22332                 retcode = PtConnect(c, cmdline);\r
22333         }\r
22334 \r
22335         Free(hostname);\r
22336         Free(target);\r
22337         FreeParamValueList(o);\r
22338 \r
22339         return retcode;\r
22340 }\r
22341 \r
22342 // vpncmd のエントリポイント\r
22343 UINT CommandMain(wchar_t *command_line)\r
22344 {\r
22345         UINT ret = 0;\r
22346         wchar_t *infile, *outfile;\r
22347         char *a_infile, *a_outfile;\r
22348         wchar_t *csvmode;\r
22349         CONSOLE *c;\r
22350 \r
22351         // 引数チェック\r
22352         if (command_line == NULL)\r
22353         {\r
22354                 return ERR_INVALID_PARAMETER;\r
22355         }\r
22356 \r
22357         // /in と /out の項目だけ先読みする\r
22358         infile = ParseCommand(command_line, L"in");\r
22359         outfile = ParseCommand(command_line, L"out");\r
22360         if (UniIsEmptyStr(infile))\r
22361         {\r
22362                 Free(infile);\r
22363                 infile = NULL;\r
22364         }\r
22365         if (UniIsEmptyStr(outfile))\r
22366         {\r
22367                 Free(outfile);\r
22368                 outfile = NULL;\r
22369         }\r
22370 \r
22371         a_infile = CopyUniToStr(infile);\r
22372         a_outfile = CopyUniToStr(outfile);\r
22373 \r
22374         // ローカルコンソールの確保\r
22375         c = NewLocalConsole(infile, outfile);\r
22376         if (c != NULL)\r
22377         {\r
22378                 // vpncmd コマンドの定義\r
22379                 CMD cmd[] =\r
22380                 {\r
22381                         {"utvpncmd", VpnCmdProc},\r
22382                 };\r
22383 \r
22384                 // CSV モードを先読みしてチェック\r
22385                 csvmode = ParseCommand(command_line, L"csv");\r
22386                 if(csvmode != NULL)\r
22387                 {\r
22388                         Free(csvmode);\r
22389                         c->ConsoleType = CONSOLE_CSV;\r
22390                 }\r
22391 \r
22392                 if (DispatchNextCmdEx(c, command_line, ">", cmd, sizeof(cmd) / sizeof(cmd[0]), NULL) == false)\r
22393                 {\r
22394                         ret = ERR_INVALID_PARAMETER;\r
22395                 }\r
22396                 else\r
22397                 {\r
22398                         ret = c->RetCode;\r
22399                 }\r
22400 \r
22401                 // ローカルコンソールの解放\r
22402                 c->Free(c);\r
22403         }\r
22404         else\r
22405         {\r
22406                 Print("Error: Couldn't open local console.\n");\r
22407         }\r
22408 \r
22409         Free(a_infile);\r
22410         Free(a_outfile);\r
22411         Free(infile);\r
22412         Free(outfile);\r
22413 \r
22414         return ret;\r
22415 }\r
22416 \r