2 * Copyright 2000, International Business Machines Corporation and others.
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
11 #include <afs/param.h>
15 #include "TaAfsAdmSvrInternal.h"
19 * DEFINITIONS ________________________________________________________________
23 extern void AfsAdmSvr_Startup (void);
24 extern void AfsAdmSvr_Shutdown (void);
28 * ROUTINES ___________________________________________________________________
33 LPARAM CALLBACK AfsAdmSvr_Debug_ThreadProc (PVOID lp)
38 while (GetMessage (&msg, 0, 0, 0))
40 if (!IsMemoryManagerMessage (&msg))
42 TranslateMessage (&msg);
43 DispatchMessage (&msg);
52 int cdecl main (int argc, char **argv)
54 BOOL fSuccess = FALSE;
56 Print (TEXT("Initializing..."));
59 WSAStartup (0x0101, &Data);
61 // Parse the command-line
63 DWORD dwAutoScope = AFSADMSVR_SCOPE_VOLUMES | AFSADMSVR_SCOPE_USERS;
65 for (--argc,++argv; argc; --argc,++argv)
67 if (!lstrcmpi (*argv, AFSADMSVR_KEYWORD_TIMED))
68 AfsAdmSvr_EnableAutoShutdown (TRUE);
69 else if (!lstrcmpi (*argv, AFSADMSVR_KEYWORD_MANUAL))
71 else if (!lstrcmpi (*argv, AFSADMSVR_KEYWORD_SCOPE_USERS))
72 dwAutoScope &= ~AFSADMSVR_SCOPE_VOLUMES;
73 else if (!lstrcmpi (*argv, AFSADMSVR_KEYWORD_SCOPE_VOLUMES))
74 dwAutoScope &= ~AFSADMSVR_SCOPE_USERS;
76 else if (!lstrcmpi (*argv, AFSADMSVR_KEYWORD_DEBUG))
77 CreateThread (NULL, 0, (LPTHREAD_START_ROUTINE)AfsAdmSvr_Debug_ThreadProc, 0, 0, 0);
81 // Prepare to listen for RPCs
83 unsigned char *pszPROTOCOL = (unsigned char *)"ncacn_ip_tcp";
84 unsigned char *pszENTRYNAME = (unsigned char *)AFSADMSVR_ENTRYNAME_DEFAULT;
85 unsigned char *pszANNOTATION = (unsigned char *)"Transarc AFS Administrative Server";
86 unsigned char szEndpoint[ 32 ];
87 wsprintf ((LPTSTR)szEndpoint, "%lu", AFSADMSVR_ENDPOINT_DEFAULT);
90 // Clean up any broken interface registration
92 RpcServerUnregisterIf (ITaAfsAdminSvr_v1_0_s_ifspec, 0, FALSE);
93 RpcNsBindingUnexport (RPC_C_NS_SYNTAX_DEFAULT, pszENTRYNAME, ITaAfsAdminSvr_v1_0_s_ifspec, NULL);
95 // Register our interface
98 if ((status = RpcServerUseProtseq (pszPROTOCOL, cMAX_CALLS, NULL)) != 0)
100 Print (dlERROR, TEXT("RpcServerUseProtseq failed; error 0x%08lX"), status);
102 else if ((status = RpcServerRegisterIf (ITaAfsAdminSvr_v1_0_s_ifspec, 0, 0)) != 0)
104 Print (dlERROR, TEXT("RpcServerRegisterIf failed; error 0x%08lX"), status);
108 // Always try to register on port 1025; that's the easiest thing for
109 // some clients to find. We'll only fail if we (a) can't use 1025, and
110 // (b) can't export our bindings.
112 BOOL fGotPort = FALSE;
113 if (RpcServerUseProtseqEp (pszPROTOCOL, cMAX_CALLS, szEndpoint, NULL) == 0)
116 Print (dlWARNING, TEXT("RpcServerUseProtseqEp failed (benign); error 0x%08lX"), status);
118 RPC_BINDING_VECTOR *pBindingVector;
119 if ((status = RpcServerInqBindings (&pBindingVector)) != 0)
121 Print (dlERROR, TEXT("RpcServerRegisterIf failed; error 0x%08lX"), status);
123 else if ((status = RpcEpRegister (ITaAfsAdminSvr_v1_0_s_ifspec, pBindingVector, NULL, pszANNOTATION)) != 0)
125 Print (dlERROR, TEXT("RpcEpRegister failed; error 0x%08lX"), status);
129 BOOL fExportedBinding = FALSE;
131 if ((status = RpcNsBindingExport (RPC_C_NS_SYNTAX_DEFAULT, pszENTRYNAME, ITaAfsAdminSvr_v1_0_s_ifspec, pBindingVector, NULL)) == 0)
132 fExportedBinding = TRUE;
134 Print (dlWARNING, TEXT("RpcNsBindingExport failed (benign); error 0x%08lX"), status);
136 if (!fExportedBinding && !fGotPort)
138 Print (dlERROR, TEXT("RpcNsBindingExport failed; error 0x%08lX"), status);
139 Print (dlERROR, TEXT("Could not bind to port %s or export bindings; terminating"), szEndpoint);
145 Print (TEXT("Ready.\n"));
147 // If not asked to open cells manually, fork a thread to start opening
148 // the default local cell
153 CreateThread (NULL, 0, (LPTHREAD_START_ROUTINE)AfsAdmSvr_AutoOpen_ThreadProc, (PVOID)dwAutoScope, 0, &dwThreadID);
156 // Listen for requests until someone calls StopListen
158 if ((status = RpcServerListen (1, cMAX_CALLS, FALSE)) != 0)
160 Print (dlERROR, TEXT("RpcServerListen failed; error 0x%08lX"), status);
167 AfsAdmSvr_Shutdown();
170 if (fExportedBinding)
172 if ((status = RpcNsBindingUnexport (RPC_C_NS_SYNTAX_DEFAULT, pszENTRYNAME, ITaAfsAdminSvr_v1_0_s_ifspec, NULL)) != 0)
174 Print (dlWARNING, TEXT("RpcNsBindingExport failed; error 0x%08lX"), status);
178 if ((status = RpcEpUnregister (ITaAfsAdminSvr_v1_0_s_ifspec, pBindingVector, NULL)) != 0)
180 Print (dlWARNING, TEXT("RpcEpUnregister failed; error 0x%08lX"), status);
185 Print (TEXT("Shutting down...\n"));
187 if ((status = RpcServerUnregisterIf (0, 0, FALSE)) != 0)
189 Print (dlWARNING, TEXT("RpcServerUnregisterIf failed; error 0x%08lX"), status);
193 return (fSuccess) ? (0) : (-1);
197 void __RPC_FAR * __RPC_USER MIDL_user_allocate (size_t cbAllocate)
199 return (void __RPC_FAR *)Allocate (cbAllocate);
203 void __RPC_USER MIDL_user_free (void __RPC_FAR *pData)