2
* DomainJoinInterface.cpp
5
* Created by Sriram Nambakam on 8/7/07.
6
* Copyright 2007 Centeris Corporation. All rights reserved.
10
#include "DomainJoinInterface.h"
12
DomainJoinInterface* DomainJoinInterface::_instance = NULL;
14
DomainJoinInterface::DomainJoinInterface()
16
_pDJApiFunctionTable(NULL),
17
_pfnShutdownJoinInterface(NULL)
21
DomainJoinInterface::~DomainJoinInterface()
27
DomainJoinInterface::getInstance()
29
if (_instance == NULL)
31
_instance = new DomainJoinInterface();
32
_instance->Initialize();
39
DomainJoinInterface::Initialize()
41
const char* LIBDOMAINJOIN = "/opt/centeris/lib/libdomainjoin-mac.so";
42
std::string szShortError = "Failed to load domain join interface";
43
void* pLibHandle = NULL;
44
PFNInitJoinInterface pfnInitJoinInterface = NULL;
45
PFNShutdownJoinInterface pfnShutdownJoinInterface = NULL;
46
PDJ_API_FUNCTION_TABLE pFunctionTable = NULL;
51
pLibHandle = dlopen(LIBDOMAINJOIN, RTLD_LAZY);
54
std::string errMsg = dlerror();
55
throw DomainJoinException(-1,
60
LoadFunction(pLibHandle, DJ_INITIALIZE_JOIN_INTERFACE, (void**)&pfnInitJoinInterface);
62
if (pfnInitJoinInterface(&pFunctionTable)) {
64
throw DomainJoinException(-1,
66
"Failed to initialize domain join interface");
68
} else if ( !pFunctionTable->pfnJoinDomain ||
69
!pFunctionTable->pfnLeaveDomain ||
70
!pFunctionTable->pfnSetComputerName ||
71
!pFunctionTable->pfnQueryInformation ||
72
!pFunctionTable->pfnIsDomainNameResolvable ||
73
!pFunctionTable->pfnFreeDomainJoinInfo ||
74
!pFunctionTable->pfnFreeDomainJoinError ) {
75
throw DomainJoinException(-1,
77
"The domain join interface is invalid");
80
LoadFunction(pLibHandle, DJ_SHUTDOWN_JOIN_INTERFACE, (void**)&pfnShutdownJoinInterface);
84
_libHandle = pLibHandle;
85
_pDJApiFunctionTable = pFunctionTable;
86
_pfnShutdownJoinInterface = pfnShutdownJoinInterface;
88
catch(std::exception& e)
91
if (pfnShutdownJoinInterface &&
94
pfnShutdownJoinInterface(pFunctionTable);
103
DomainJoinInterface::Cleanup()
107
if (_pfnShutdownJoinInterface) {
108
_pfnShutdownJoinInterface(_pDJApiFunctionTable);
114
_pfnShutdownJoinInterface = NULL;
115
_pDJApiFunctionTable = NULL;
120
DomainJoinInterface::LoadFunction(
122
const char* pszFunctionName,
123
void** functionPointer
130
function = dlsym(pLibHandle, pszFunctionName);
133
std::string errMsg = dlerror();
134
throw DomainJoinException(-1,
135
"Failed to load symbol",
139
*functionPointer = function;
143
DomainJoinInterface::JoinDomain(std::string& pszDomainName,
144
std::string& pszUserName,
145
std::string& pszPassword,
149
PDOMAIN_JOIN_ERROR pError = NULL;
151
int errCode = getInstance()._pDJApiFunctionTable->pfnJoinDomain(
152
const_cast<char*>(pszDomainName.c_str()),
153
const_cast<char*>(pszOU.c_str()),
154
const_cast<char*>(pszUserName.c_str()),
155
const_cast<char*>(pszPassword.c_str()),
159
DomainJoinException exc(pError->code,
160
pError->pszShortError,
161
pError->pszLongError);
163
getInstance()._pDJApiFunctionTable->pfnFreeDomainJoinError(pError);
169
DomainJoinException exc(errCode, "Domain Join Error", "Failed to join domain");
175
DomainJoinInterface::LeaveDomain()
177
PDOMAIN_JOIN_ERROR pError = NULL;
179
int errCode = getInstance()._pDJApiFunctionTable->pfnLeaveDomain(
184
DomainJoinException exc(pError->code,
185
pError->pszShortError,
186
pError->pszLongError);
188
getInstance()._pDJApiFunctionTable->pfnFreeDomainJoinError(pError);
194
DomainJoinException exc(-1, "Domain Join Error", "Failed to leave domain");
200
DomainJoinInterface::IsDomainNameResolvable(const std::string& domainName)
202
PDOMAIN_JOIN_ERROR pError = NULL;
203
short bResolvable = 0;
205
int errCode = getInstance()._pDJApiFunctionTable->pfnIsDomainNameResolvable(
206
const_cast<char*>(domainName.c_str()),
211
DomainJoinException exc(pError->code,
212
pError->pszShortError,
213
pError->pszLongError);
215
getInstance()._pDJApiFunctionTable->pfnFreeDomainJoinError(pError);
221
DomainJoinException exc(errCode, "Domain Join Error", "Failed to determine if domain name is resolvable through DNS");
229
DomainJoinInterface::SetComputerName(std::string& pszComputerName,
230
std::string& pszDomainName)
232
PDOMAIN_JOIN_ERROR pError = NULL;
234
int errCode = getInstance()._pDJApiFunctionTable->pfnSetComputerName(
235
const_cast<char*>(pszComputerName.c_str()),
236
const_cast<char*>(pszDomainName.c_str()),
240
DomainJoinException exc(pError->code,
241
pError->pszShortError,
242
pError->pszLongError);
244
getInstance()._pDJApiFunctionTable->pfnFreeDomainJoinError(pError);
250
DomainJoinException exc(errCode, "Domain Join Error", "Failed to set the computer name");
256
DomainJoinInterface::GetDomainJoinStatus(DomainJoinStatus& joinStatus)
258
PDOMAIN_JOIN_INFO pInfo = NULL;
259
PDOMAIN_JOIN_ERROR pError = NULL;
261
int errCode = getInstance()._pDJApiFunctionTable->pfnQueryInformation(
266
DomainJoinException exc(pError->code,
267
pError->pszShortError,
268
pError->pszLongError);
270
getInstance()._pDJApiFunctionTable->pfnFreeDomainJoinError(pError);
276
DomainJoinException exc(errCode, "Domain Join Error", "Failed to query domain join status");
280
joinStatus.Name = (pInfo->pszName ? pInfo->pszName : "");
281
joinStatus.DnsDomain = (pInfo->pszDnsDomain ? pInfo->pszDnsDomain : "");
282
joinStatus.DomainName = (pInfo->pszDomainName ? pInfo->pszDomainName : "");
283
joinStatus.ShortDomainName = (pInfo->pszDomainShortName ? pInfo->pszDomainShortName : "");
284
joinStatus.LogFilePath = (pInfo->pszLogFilePath ? pInfo->pszLogFilePath : "");
286
getInstance()._pDJApiFunctionTable->pfnFreeDomainJoinInfo(pInfo);