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