winnt-servermgr-use-existing-creds-option-20020401
[openafs.git] / src / WINNT / afssvrmgr / svr_address.cpp
1 /*
2  * Copyright 2000, International Business Machines Corporation and others.
3  * All Rights Reserved.
4  * 
5  * This software has been released under the terms of the IBM Public
6  * License.  For details, see the LICENSE file in the top-level source
7  * directory or online at http://www.openafs.org/dl/license10.html
8  */
9
10 extern "C" {
11 #include <afs/param.h>
12 #include <afs/stds.h>
13 }
14
15 #include "svrmgr.h"
16 #include "svr_address.h"
17 #include <stdlib.h>
18
19 /*
20  * PROTOTYPES _________________________________________________________________
21  *
22  */
23
24 void ChangeAddr_OnInitDialog (HWND hDlg, LPSVR_CHANGEADDR_PARAMS lpp);
25 void ChangeAddr_Enable (HWND hDlg, BOOL fEnable);
26 void ChangeAddr_OnSelect (HWND hDlg);
27 void ChangeAddr_OnEndTask_Init (HWND hDlg, LPSVR_CHANGEADDR_PARAMS lpp, LPTASKPACKET ptp);
28 void ChangeAddr_OnRemove (HWND hDlg, LPSVR_CHANGEADDR_PARAMS lpp);
29 void ChangeAddr_OnChange (HWND hDlg, LPSVR_CHANGEADDR_PARAMS lpp);
30
31 BOOL CALLBACK NewAddr_DlgProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp);
32 void NewAddr_OnInitDialog (HWND hDlg, LPSOCKADDR_IN pAddr);
33 void NewAddr_OnOK (HWND hDlg, LPSOCKADDR_IN pAddr);
34
35
36 /*
37  * SERVER ADDRESSES ___________________________________________________________
38  *
39  */
40
41 void Server_FillAddrList (HWND hDlg, LPSERVERSTATUS lpss, BOOL fCanAddUnspecified)
42 {
43    HWND hList = GetDlgItem (hDlg, IDC_SVR_ADDRESSES);
44
45    LB_StartChange (hList, TRUE);
46
47    if (!lpss || !lpss->nAddresses)
48       {
49       if (fCanAddUnspecified)
50          (void)LB_AddItem (hList, IDS_SVR_NO_ADDR, (LPARAM)-1);
51       }
52    else for (size_t iAddr = 0; iAddr < lpss->nAddresses; ++iAddr)
53       {
54       int AddrInt;
55       AfsClass_AddressToInt (&AddrInt, &lpss->aAddresses[ iAddr ]);
56       if (AddrInt == 0)
57          continue;
58
59       LPTSTR pszAddress = FormatString (TEXT("%1"), TEXT("%a"), &lpss->aAddresses[ iAddr ]);
60       (void)LB_AddItem (hList, pszAddress, (LPARAM)iAddr);
61       FreeString (pszAddress);
62       }
63
64    LB_EndChange (hList, 0);
65 }
66
67
68 void Server_ParseAddress (LPSOCKADDR_IN pAddr, LPTSTR pszText)
69 {
70    int addrNetwork = inet_addr (pszText);
71
72    memset (pAddr, 0x00, sizeof(SOCKADDR_IN));
73    pAddr->sin_family = AF_INET;
74    pAddr->sin_addr.s_addr = addrNetwork;
75 }
76
77
78 BOOL Server_Ping (LPSOCKADDR_IN pAddr, LPCTSTR pszServerName)
79 {
80    BOOL rc = FALSE;
81
82    try {
83       struct hostent *phe;
84       if ((phe = gethostbyname (pszServerName)) == NULL)
85          memset (pAddr, 0x00, sizeof(SOCKADDR_IN));
86       else
87          {
88          memset (pAddr, 0x00, sizeof(SOCKADDR_IN));
89          pAddr->sin_family = 2;
90          pAddr->sin_port = 0;
91          pAddr->sin_addr.s_addr = *(ULONG *)phe->h_addr;
92          rc = TRUE;
93          }
94       }
95    catch (...)
96       {
97       memset (pAddr, 0x00, sizeof(SOCKADDR_IN));
98       }
99
100    return rc;
101 }
102
103
104 BOOL CALLBACK ChangeAddr_DlgProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp)
105 {
106    if (AfsAppLib_HandleHelp (IDD_SVR_ADDRESS, hDlg, msg, wp, lp))
107       return TRUE;
108
109    if (msg == WM_INITDIALOG)
110       SetWindowLong (hDlg, DWL_USER, lp);
111
112    LPSVR_CHANGEADDR_PARAMS lpp;
113    if ((lpp = (LPSVR_CHANGEADDR_PARAMS)GetWindowLong (hDlg, DWL_USER)) != NULL)
114       {
115       switch (msg)
116          {
117          case WM_INITDIALOG:
118             ChangeAddr_OnInitDialog (hDlg, lpp);
119             StartTask (taskSVR_PROP_INIT, hDlg, lpp->lpiServer);
120             break;
121
122          case WM_ENDTASK:
123             LPTASKPACKET ptp;
124             if ((ptp = (LPTASKPACKET)lp) != NULL)
125                {
126                if (ptp->idTask == taskSVR_PROP_INIT)
127                   ChangeAddr_OnEndTask_Init (hDlg, lpp, ptp);
128                FreeTaskPacket (ptp);
129                }
130             break;
131
132          case WM_COMMAND:
133             switch (LOWORD(wp))
134                {
135                case IDC_SVR_ADDRESSES:
136                   if (HIWORD(wp) == LBN_SELCHANGE)
137                      ChangeAddr_OnSelect (hDlg);
138                   break;
139
140                case IDC_ADDR_CHANGE:
141                   ChangeAddr_OnChange (hDlg, lpp);
142                   break;
143
144                case IDC_ADDR_REMOVE:
145                   ChangeAddr_OnRemove (hDlg, lpp);
146                   break;
147
148                case IDOK:
149                   EndDialog (hDlg, IDOK);
150                   break;
151
152                case IDCANCEL:
153                   EndDialog (hDlg, IDCANCEL);
154                   break;
155                }
156             break;
157          }
158       }
159
160    return FALSE;
161 }
162
163
164 void ChangeAddr_OnInitDialog (HWND hDlg, LPSVR_CHANGEADDR_PARAMS lpp)
165 {
166    TCHAR szName[ cchNAME ];
167    lpp->lpiServer->GetServerName (szName);
168
169    TCHAR szText[ cchRESOURCE ];
170    GetDlgItemText (hDlg, IDC_TITLE, szText, cchRESOURCE);
171
172    LPTSTR pszTitle = FormatString (szText, TEXT("%s"), szName);
173    SetDlgItemText (hDlg, IDC_TITLE, pszTitle);
174    FreeString (pszTitle);
175
176    HWND hList = GetDlgItem (hDlg, IDC_SVR_ADDRESSES);
177    LB_StartChange (hList, TRUE);
178    LB_AddItem (hList, IDS_QUERYING, 0);
179    LB_EndChange (hList, 0);
180
181    ChangeAddr_Enable (hDlg, FALSE);
182 }
183
184
185 void ChangeAddr_Enable (HWND hDlg, BOOL fEnable)
186 {
187    EnableWindow (GetDlgItem (hDlg, IDC_SVR_ADDRESSES), fEnable);
188    EnableWindow (GetDlgItem (hDlg, IDC_ADDR_CHANGE), fEnable);
189    EnableWindow (GetDlgItem (hDlg, IDC_ADDR_REMOVE), fEnable);
190
191    if (fEnable)
192       ChangeAddr_OnSelect (hDlg);
193 }
194
195
196 void ChangeAddr_OnSelect (HWND hDlg)
197 {
198    HWND hList = GetDlgItem (hDlg, IDC_SVR_ADDRESSES);
199    BOOL fSelected = (LB_GetSelected (hList) != -1) ? TRUE : FALSE;
200
201    EnableWindow (GetDlgItem (hDlg, IDC_ADDR_CHANGE), fSelected);
202    EnableWindow (GetDlgItem (hDlg, IDC_ADDR_REMOVE), fSelected);
203 }
204
205
206 void ChangeAddr_OnEndTask_Init (HWND hDlg, LPSVR_CHANGEADDR_PARAMS lpp, LPTASKPACKET ptp)
207 {
208    if (!ptp->rc)
209       {
210       TCHAR szName[ cchNAME ];
211       lpp->lpiServer->GetServerName (szName);
212       ErrorDialog (ptp->status, IDS_ERROR_REFRESH_SERVER_STATUS, TEXT("%s"), szName);
213       }
214    else
215       {
216       memcpy (&lpp->ssOld, &TASKDATA(ptp)->ss, sizeof(SERVERSTATUS));
217       memcpy (&lpp->ssNew, &TASKDATA(ptp)->ss, sizeof(SERVERSTATUS));
218       ChangeAddr_Enable (hDlg, TRUE);
219       }
220
221    Server_FillAddrList (hDlg, &lpp->ssNew, FALSE);
222 }
223
224
225 void ChangeAddr_OnRemove (HWND hDlg, LPSVR_CHANGEADDR_PARAMS lpp)
226 {
227    HWND hList = GetDlgItem (hDlg, IDC_SVR_ADDRESSES);
228
229    int iSel;
230    if ((iSel = LB_GetSelected (hList)) != -1)
231       {
232       TCHAR szItem[ cchRESOURCE ] = TEXT("");
233       SendMessage (hList, LB_GETTEXT, iSel, (LPARAM)szItem);
234
235       SOCKADDR_IN AddrSel;
236       Server_ParseAddress (&AddrSel, szItem);
237
238       int AddrSelInt;
239       AfsClass_AddressToInt (&AddrSelInt, &AddrSel);
240
241       if (AddrSelInt != 0)
242          {
243          for (size_t iAddr = 0; iAddr < lpp->ssOld.nAddresses; ++iAddr)
244             {
245             int OldAddrInt;
246             AfsClass_AddressToInt (&OldAddrInt, &lpp->ssOld.aAddresses[iAddr]);
247
248             int NewAddrInt;
249             AfsClass_AddressToInt (&NewAddrInt, &lpp->ssNew.aAddresses[iAddr]);
250
251             if ((OldAddrInt == AddrSelInt) || (NewAddrInt == AddrSelInt))
252                {
253                AfsClass_IntToAddress (&lpp->ssNew.aAddresses[iAddr], 0);
254                }
255             }
256          }
257
258       Server_FillAddrList (hDlg, &lpp->ssNew, FALSE);
259       ChangeAddr_OnSelect (hDlg);
260       }
261 }
262
263
264 void ChangeAddr_OnChange (HWND hDlg, LPSVR_CHANGEADDR_PARAMS lpp)
265 {
266    HWND hList = GetDlgItem (hDlg, IDC_SVR_ADDRESSES);
267
268    int iSel;
269    if ((iSel = LB_GetSelected (hList)) != -1)
270       {
271       TCHAR szItem[ cchRESOURCE ] = TEXT("");
272       SendMessage (hList, LB_GETTEXT, iSel, (LPARAM)szItem);
273
274       SOCKADDR_IN AddrSel;
275       Server_ParseAddress (&AddrSel, szItem);
276
277       int AddrSelInt;
278       AfsClass_AddressToInt (&AddrSelInt, &AddrSel);
279
280       if (AddrSelInt != 0)
281          {
282          SOCKADDR_IN AddrNew = AddrSel;
283          if (ModalDialogParam (IDD_SVR_NEWADDR, hDlg, (DLGPROC)NewAddr_DlgProc, (LPARAM)&AddrNew) != IDOK)
284             return;
285
286          int AddrNewInt;
287          AfsClass_AddressToInt (&AddrNewInt, &AddrNew);
288          if (AddrNewInt && (AddrNewInt != AddrSelInt))
289             {
290
291             // First see if the new IP address is already in the server's
292             // list of IP addresses--if so, just delete the old address.
293             //
294             for (size_t iAddr = 0; iAddr < lpp->ssOld.nAddresses; ++iAddr)
295                {
296                int OldAddrInt;
297                AfsClass_AddressToInt (&OldAddrInt, &lpp->ssOld.aAddresses[iAddr]);
298
299                int NewAddrInt;
300                AfsClass_AddressToInt (&NewAddrInt, &lpp->ssNew.aAddresses[iAddr]);
301
302                if ((OldAddrInt == AddrNewInt) || (NewAddrInt == AddrNewInt))
303                   {
304                   AddrNewInt = 0;
305                   break;
306                   }
307                }
308
309             // Now update the SERVERSTATUS structure.
310             //
311             for (iAddr = 0; iAddr < lpp->ssOld.nAddresses; ++iAddr)
312                {
313                int OldAddrInt;
314                AfsClass_AddressToInt (&OldAddrInt, &lpp->ssOld.aAddresses[iAddr]);
315
316                int NewAddrInt;
317                AfsClass_AddressToInt (&NewAddrInt, &lpp->ssNew.aAddresses[iAddr]);
318
319                if ((OldAddrInt == AddrSelInt) || (NewAddrInt == AddrSelInt))
320                   {
321                   AfsClass_IntToAddress (&lpp->ssNew.aAddresses[iAddr], AddrNewInt);
322                   break;
323                   }
324                }
325             }
326          }
327
328       Server_FillAddrList (hDlg, &lpp->ssNew, FALSE);
329       ChangeAddr_OnSelect (hDlg);
330       }
331 }
332
333
334 BOOL CALLBACK NewAddr_DlgProc (HWND hDlg, UINT msg, WPARAM wp, LPARAM lp)
335 {
336    if (AfsAppLib_HandleHelp (IDD_SVR_NEWADDR, hDlg, msg, wp, lp))
337       return TRUE;
338
339    if (msg == WM_INITDIALOG)
340       SetWindowLong (hDlg, DWL_USER, lp);
341
342    LPSOCKADDR_IN pAddr;
343    if ((pAddr = (LPSOCKADDR_IN)GetWindowLong (hDlg, DWL_USER)) != NULL)
344       {
345       switch (msg)
346          {
347          case WM_INITDIALOG:
348             NewAddr_OnInitDialog (hDlg, pAddr);
349             break;
350
351          case WM_COMMAND:
352             switch (LOWORD(wp))
353                {
354                case IDOK:
355                   NewAddr_OnOK (hDlg, pAddr);
356                   EndDialog (hDlg, IDOK);
357                   break;
358
359                case IDCANCEL:
360                   EndDialog (hDlg, IDCANCEL);
361                   break;
362                }
363             break;
364          }
365       }
366
367    return FALSE;
368 }
369
370
371 void NewAddr_OnInitDialog (HWND hDlg, LPSOCKADDR_IN pAddr)
372 {
373    TCHAR szText[ cchRESOURCE ];
374    GetDlgItemText (hDlg, IDC_TITLE, szText, cchRESOURCE);
375
376    LPTSTR pszTitle = FormatString (szText, TEXT("%a"), pAddr);
377    SetDlgItemText (hDlg, IDC_TITLE, pszTitle);
378    FreeString (pszTitle);
379
380    SA_SetAddr (GetDlgItem (hDlg, IDC_ADDRESS), pAddr);
381 }
382
383
384 void NewAddr_OnOK (HWND hDlg, LPSOCKADDR_IN pAddr)
385 {
386    SA_GetAddr (GetDlgItem (hDlg, IDC_ADDRESS), pAddr);
387 }
388