Initial IBM OpenAFS 1.0 tree
[openafs.git] / src / WINNT / afsadmsvr / TaAfsAdmSvrMain.cpp
1 extern "C" {
2 #include <afs/param.h>
3 #include <afs/stds.h>
4 }
5
6 #include "TaAfsAdmSvrInternal.h"
7
8
9 /*
10  * DEFINITIONS ________________________________________________________________
11  *
12  */
13
14 extern void AfsAdmSvr_Startup (void);
15 extern void AfsAdmSvr_Shutdown (void);
16
17
18 /*
19  * ROUTINES ___________________________________________________________________
20  *
21  */
22
23 #ifdef DEBUG
24 LPARAM CALLBACK AfsAdmSvr_Debug_ThreadProc (PVOID lp)
25 {
26    ShowMemoryManager();
27
28    MSG msg;
29    while (GetMessage (&msg, 0, 0, 0))
30       {
31       if (!IsMemoryManagerMessage (&msg))
32          {
33          TranslateMessage (&msg);
34          DispatchMessage (&msg);
35          }
36       }
37
38    return 0;
39 }
40 #endif
41
42
43 int cdecl main (int argc, char **argv)
44 {
45    BOOL fSuccess = FALSE;
46
47    Print (TEXT("Initializing..."));
48
49    WSADATA Data;
50    WSAStartup (0x0101, &Data);
51
52    // Parse the command-line
53    //
54    DWORD dwAutoScope = AFSADMSVR_SCOPE_VOLUMES | AFSADMSVR_SCOPE_USERS;
55
56    for (--argc,++argv; argc; --argc,++argv)
57       {
58       if (!lstrcmpi (*argv, AFSADMSVR_KEYWORD_TIMED))
59          AfsAdmSvr_EnableAutoShutdown (TRUE);
60       else if (!lstrcmpi (*argv, AFSADMSVR_KEYWORD_MANUAL))
61          dwAutoScope = 0;
62       else if (!lstrcmpi (*argv, AFSADMSVR_KEYWORD_SCOPE_USERS))
63          dwAutoScope &= ~AFSADMSVR_SCOPE_VOLUMES;
64       else if (!lstrcmpi (*argv, AFSADMSVR_KEYWORD_SCOPE_VOLUMES))
65          dwAutoScope &= ~AFSADMSVR_SCOPE_USERS;
66 #ifdef DEBUG
67       else if (!lstrcmpi (*argv, AFSADMSVR_KEYWORD_DEBUG))
68          CreateThread (NULL, 0, (LPTHREAD_START_ROUTINE)AfsAdmSvr_Debug_ThreadProc, 0, 0, 0);
69 #endif
70       }
71
72    // Prepare to listen for RPCs
73    //
74    unsigned char *pszPROTOCOL = (unsigned char *)"ncacn_ip_tcp";
75    unsigned char *pszENTRYNAME = (unsigned char *)AFSADMSVR_ENTRYNAME_DEFAULT;
76    unsigned char *pszANNOTATION = (unsigned char *)"Transarc AFS Administrative Server";
77    unsigned char szEndpoint[ 32 ];
78    wsprintf ((LPTSTR)szEndpoint, "%lu", AFSADMSVR_ENDPOINT_DEFAULT);
79    int cMAX_CALLS = 50;
80
81    // Clean up any broken interface registration
82    //
83    RpcServerUnregisterIf (ITaAfsAdminSvr_v1_0_s_ifspec, 0, FALSE);
84    RpcNsBindingUnexport (RPC_C_NS_SYNTAX_DEFAULT, pszENTRYNAME, ITaAfsAdminSvr_v1_0_s_ifspec, NULL);
85
86    // Register our interface
87    //
88    RPC_STATUS status;
89    if ((status = RpcServerUseProtseq (pszPROTOCOL, cMAX_CALLS, NULL)) != 0)
90       {
91       Print (dlERROR, TEXT("RpcServerUseProtseq failed; error 0x%08lX"), status);
92       }
93    else if ((status = RpcServerRegisterIf (ITaAfsAdminSvr_v1_0_s_ifspec, 0, 0)) != 0)
94       {
95       Print (dlERROR, TEXT("RpcServerRegisterIf failed; error 0x%08lX"), status);
96       }
97    else
98       {
99       // Always try to register on port 1025; that's the easiest thing for
100       // some clients to find. We'll only fail if we (a) can't use 1025, and
101       // (b) can't export our bindings.
102       //
103       BOOL fGotPort = FALSE;
104       if (RpcServerUseProtseqEp (pszPROTOCOL, cMAX_CALLS, szEndpoint, NULL) == 0)
105          fGotPort = TRUE;
106       else
107          Print (dlWARNING, TEXT("RpcServerUseProtseqEp failed (benign); error 0x%08lX"), status);
108
109       RPC_BINDING_VECTOR *pBindingVector;
110       if ((status = RpcServerInqBindings (&pBindingVector)) != 0)
111          {
112          Print (dlERROR, TEXT("RpcServerRegisterIf failed; error 0x%08lX"), status);
113          }
114       else if ((status = RpcEpRegister (ITaAfsAdminSvr_v1_0_s_ifspec, pBindingVector, NULL, pszANNOTATION)) != 0)
115          {
116          Print (dlERROR, TEXT("RpcEpRegister failed; error 0x%08lX"), status);
117          }
118       else
119          {
120          BOOL fExportedBinding = FALSE;
121
122          if ((status = RpcNsBindingExport (RPC_C_NS_SYNTAX_DEFAULT, pszENTRYNAME, ITaAfsAdminSvr_v1_0_s_ifspec, pBindingVector, NULL)) == 0)
123             fExportedBinding = TRUE;
124          else
125             Print (dlWARNING, TEXT("RpcNsBindingExport failed (benign); error 0x%08lX"), status);
126
127          if (!fExportedBinding && !fGotPort)
128             {
129             Print (dlERROR, TEXT("RpcNsBindingExport failed; error 0x%08lX"), status);
130             Print (dlERROR, TEXT("Could not bind to port %s or export bindings; terminating"), szEndpoint);
131             }
132          else
133             {
134             AfsAdmSvr_Startup();
135
136             Print (TEXT("Ready.\n"));
137
138             // If not asked to open cells manually, fork a thread to start opening
139             // the default local cell
140             //
141             if (dwAutoScope)
142                {
143                DWORD dwThreadID;
144                CreateThread (NULL, 0, (LPTHREAD_START_ROUTINE)AfsAdmSvr_AutoOpen_ThreadProc, (PVOID)dwAutoScope, 0, &dwThreadID);
145                }
146
147             // Listen for requests until someone calls StopListen
148             //
149             if ((status = RpcServerListen (1, cMAX_CALLS, FALSE)) != 0)
150                {
151                Print (dlERROR, TEXT("RpcServerListen failed; error 0x%08lX"), status);
152                }
153             else
154                {
155                fSuccess = TRUE;
156                }
157
158             AfsAdmSvr_Shutdown();
159             }
160
161          if (fExportedBinding)
162             {
163             if ((status = RpcNsBindingUnexport (RPC_C_NS_SYNTAX_DEFAULT, pszENTRYNAME, ITaAfsAdminSvr_v1_0_s_ifspec, NULL)) != 0)
164                {
165                Print (dlWARNING, TEXT("RpcNsBindingExport failed; error 0x%08lX"), status);
166                }
167             }
168
169          if ((status = RpcEpUnregister (ITaAfsAdminSvr_v1_0_s_ifspec, pBindingVector, NULL)) != 0)
170             {
171             Print (dlWARNING, TEXT("RpcEpUnregister failed; error 0x%08lX"), status);
172             }
173          }
174       }
175
176    Print (TEXT("Shutting down...\n"));
177
178    if ((status = RpcServerUnregisterIf (0, 0, FALSE)) != 0)
179       {
180       Print (dlWARNING, TEXT("RpcServerUnregisterIf failed; error 0x%08lX"), status);
181       exit (-1);
182       }
183
184    return (fSuccess) ? (0) : (-1);
185 }
186
187
188 void __RPC_FAR * __RPC_USER MIDL_user_allocate (size_t cbAllocate)
189 {
190    return (void __RPC_FAR *)Allocate (cbAllocate);
191 }
192
193
194 void __RPC_USER MIDL_user_free (void __RPC_FAR *pData)
195 {
196    Free (pData);
197 }
198