windows-64-bit-type-safety-20051105
[openafs.git] / src / WINNT / afsclass / worker.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 <WINNT/afsclass.h>
16 #include "internal.h"
17 #include <errno.h>
18
19 extern "C" {
20 #include <afs/vlserver.h>
21 }
22
23
24 /*
25  * DEFINITIONS ________________________________________________________________
26  *
27  */
28
29 #if 0
30 static LPCTSTR cszAFSVOSDLL = TCHAR("AfsVosAdmin.dll");
31 static LPCTSTR cszAFSBOSDLL = TCHAR("AfsBosAdmin.dll");
32 static LPCTSTR cszAFSKASDLL = TCHAR("AfsKasAdmin.dll");
33 static LPCTSTR cszAFSPTSDLL = TCHAR("AfsPtsAdmin.dll");
34 static LPCTSTR cszAFSUTILDLL = TCHAR("AfsAdminUtil.dll");
35 static LPCTSTR cszAFSCLIENTDLL = TCHAR("AfsClientAdmin.dll");
36 #else
37 static LPCTSTR cszAFSVOSDLL = __T("AfsVosAdmin.dll");
38 static LPCTSTR cszAFSBOSDLL = __T("AfsBosAdmin.dll");
39 static LPCTSTR cszAFSKASDLL = __T("AfsKasAdmin.dll");
40 static LPCTSTR cszAFSPTSDLL = __T("AfsPtsAdmin.dll");
41 static LPCTSTR cszAFSUTILDLL = __T("AfsAdminUtil.dll");
42 static LPCTSTR cszAFSCLIENTDLL = __T("AfsClientAdmin.dll");
43 #endif
44
45 /*
46  * VARIABLES __________________________________________________________________
47  *
48  */
49
50 static HINSTANCE hiVOS = NULL;
51 static HINSTANCE hiBOS = NULL;
52 static HINSTANCE hiKAS = NULL;
53 static HINSTANCE hiPTS = NULL;
54 static HINSTANCE hiUtil = NULL;
55 static HINSTANCE hiClient = NULL;
56
57
58 /*
59  * .DLL PROTOTYPES ____________________________________________________________
60  *
61  */
62
63 extern "C" {
64
65 typedef int (ADMINAPI *lpVosBackupVolumeCreate_t)(const void *cellHandle, vos_MessageCallBack_t callBack, unsigned int volumeId, afs_status_p st);
66 typedef int (ADMINAPI *lpVosBackupVolumeCreateMultiple_t)(const void *cellHandle, const void *serverHandle, vos_MessageCallBack_t callBack, const unsigned int *partition, const char *volumePrefix, vos_exclude_t excludePrefix, afs_status_p st);
67 typedef int (ADMINAPI *lpVosPartitionGet_t)(const void *cellHandle, const void *serverHandle, vos_MessageCallBack_t callBack, unsigned int partition, vos_partitionEntry_p partitionP, afs_status_p st);
68 typedef int (ADMINAPI *lpVosPartitionGetBegin_t)(const void *cellHandle, const void *serverHandle, vos_MessageCallBack_t callBack, void **iterationIdP, afs_status_p st);
69 typedef int (ADMINAPI *lpVosPartitionGetNext_t)(const void *iterationId, vos_partitionEntry_p partitionP, afs_status_p st);
70 typedef int (ADMINAPI *lpVosPartitionGetDone_t)(const void *iterationId, afs_status_p st);
71 typedef int (ADMINAPI *lpVosServerOpen_t)(const void *cellHandle, const char *serverName, void **serverHandleP, afs_status_p st);
72 typedef int (ADMINAPI *lpVosServerClose_t)(const void *serverHandle, afs_status_p st);
73 typedef int (ADMINAPI *lpVosServerSync_t)(const void *cellHandle, const void *serverHandle, vos_MessageCallBack_t callBack, const unsigned int *partition, vos_force_t force, afs_status_p st);
74 typedef int (ADMINAPI *lpVosFileServerAddressChange_t)(const void *cellHandle, vos_MessageCallBack_t callBack, int oldAddress, int newAddress, afs_status_p st);
75 typedef int (ADMINAPI *lpVosFileServerAddressRemove_t)(const void *cellHandle, vos_MessageCallBack_t callBack, int serverAddress, afs_status_p st);
76 typedef int (ADMINAPI *lpVosFileServerGetBegin_t)(const void *cellHandle, vos_MessageCallBack_t callBack, void **iterationIdP, afs_status_p st);
77 typedef int (ADMINAPI *lpVosFileServerGetNext_t)(void *iterationId, vos_fileServerEntry_p serverEntryP, afs_status_p st);
78 typedef int (ADMINAPI *lpVosFileServerGetDone_t)(void *iterationId, afs_status_p st);
79 typedef int (ADMINAPI *lpVosServerTransactionStatusGetBegin_t)(const void *cellHandle, const void *serverHandle, vos_MessageCallBack_t callBack, void **iterationIdP, afs_status_p st);
80 typedef int (ADMINAPI *lpVosServerTransactionStatusGetNext_t)(const void *iterationId, vos_serverTransactionStatus_p serverTransactionStatusP, afs_status_p st);
81 typedef int (ADMINAPI *lpVosServerTransactionStatusGetDone_t)(const void *iterationId, afs_status_p st);
82 typedef int (ADMINAPI *lpVosVLDBGet_t)(const void *cellHandle, vos_MessageCallBack_t callBack, const unsigned int *volumeId, const char *volumeName, vos_vldbEntry_p vldbEntry, afs_status_p st);
83 typedef int (ADMINAPI *lpVosVLDBGetBegin_t)(const void *cellHandle, const void *serverHandle, vos_MessageCallBack_t callBack, unsigned int *partition, void **iterationIdP, afs_status_p st);
84 typedef int (ADMINAPI *lpVosVLDBGetNext_t)(const void *iterationId, vos_vldbEntry_p vldbEntry, afs_status_p st);
85 typedef int (ADMINAPI *lpVosVLDBGetDone_t)(const void *iterationId, afs_status_p st);
86 typedef int (ADMINAPI *lpVosVLDBEntryRemove_t)(const void *cellHandle, const void *serverHandle, vos_MessageCallBack_t callBack, const unsigned int *partition, unsigned int *volumeId, afs_status_p st);
87 typedef int (ADMINAPI *lpVosVLDBUnlock_t)(const void *cellHandle, const void *serverHandle, vos_MessageCallBack_t callBack, const unsigned int *partition, afs_status_p st);
88 typedef int (ADMINAPI *lpVosVLDBEntryLock_t)(const void *cellHandle, vos_MessageCallBack_t callBack, unsigned int volumeId, afs_status_p st);
89 typedef int (ADMINAPI *lpVosVLDBEntryUnlock_t)(const void *cellHandle, vos_MessageCallBack_t callBack, unsigned int volumeId, afs_status_p st);
90 typedef int (ADMINAPI *lpVosVLDBReadOnlySiteCreate_t)(const void *cellHandle, const void *serverHandle, vos_MessageCallBack_t callBack, unsigned int partition, unsigned int volumeId, afs_status_p st);
91 typedef int (ADMINAPI *lpVosVLDBReadOnlySiteDelete_t)(const void *cellHandle, const void *serverHandle, vos_MessageCallBack_t callBack, unsigned int partition, unsigned int volumeId, afs_status_p st);
92 typedef int (ADMINAPI *lpVosVLDBSync_t)(const void *cellHandle, const void *serverHandle, vos_MessageCallBack_t callBack, const unsigned int *partition, vos_force_t force, afs_status_p st);
93 typedef int (ADMINAPI *lpVosVolumeCreate_t)(const void *cellHandle, const void *serverHandle, vos_MessageCallBack_t callBack, unsigned int partition, const char *volumeName, unsigned int quota, unsigned int *volumeId, afs_status_p st);
94 typedef int (ADMINAPI *lpVosVolumeDelete_t)(const void *cellHandle, const void *serverHandle, vos_MessageCallBack_t callBack, unsigned int partition, unsigned int volumeId, afs_status_p st);
95 typedef int (ADMINAPI *lpVosVolumeRename_t)(const void *cellHandle, vos_MessageCallBack_t callBack, unsigned int readWriteVolumeId, const char *newVolumeName, afs_status_p st);
96 typedef int (ADMINAPI *lpVosVolumeDump_t)(const void *cellHandle, const void *serverHandle, vos_MessageCallBack_t callBack, unsigned int *partition, unsigned int volumeId, unsigned int startTime, const char *dumpFile, afs_status_p st);
97 typedef int (ADMINAPI *lpVosVolumeRestore_t)(const void *cellHandle, const void *serverHandle, vos_MessageCallBack_t callBack, unsigned int partition, unsigned int *volumeId, const char *volumeName, const char *dumpFile, vos_volumeRestoreType_t dumpType, afs_status_p st);
98 typedef int (ADMINAPI *lpVosVolumeOnline_t)(const void *serverHandle, vos_MessageCallBack_t callBack, unsigned int partition, unsigned int volumeId, unsigned int sleepTime, vos_volumeOnlineType_t volumeStatus, afs_status_p st);
99 typedef int (ADMINAPI *lpVosVolumeOffline_t)(const void *serverHandle, vos_MessageCallBack_t callBack, unsigned int partition, unsigned int volumeId, afs_status_p st);
100 typedef int (ADMINAPI *lpVosVolumeGet_t)(const void *cellHandle, const void *serverHandle, vos_MessageCallBack_t callBack, unsigned int partition, unsigned int volumeId, vos_volumeEntry_p volumeP, afs_status_p st);
101 typedef int (ADMINAPI *lpVosVolumeGetBegin_t)(const void *cellHandle, const void *serverHandle, vos_MessageCallBack_t callBack, unsigned int partition, void **iterationIdP, afs_status_p st);
102 typedef int (ADMINAPI *lpVosVolumeGetNext_t)(const void *iterationId, vos_volumeEntry_p volumeP, afs_status_p st);
103 typedef int (ADMINAPI *lpVosVolumeGetDone_t)(const void *iterationId, afs_status_p st);
104 typedef int (ADMINAPI *lpVosVolumeMove_t)(const void *cellHandle, vos_MessageCallBack_t callBack, unsigned int volumeId, const void *fromServer, unsigned int fromPartition, const void *toServer, unsigned int toPartition, afs_status_p st);
105 typedef int (ADMINAPI *lpVosVolumeRelease_t)(const void *cellHandle, vos_MessageCallBack_t callBack, unsigned int volumeId, vos_force_t force, afs_status_p st);
106 typedef int (ADMINAPI *lpVosVolumeZap_t)(const void *cellHandle, const void *serverHandle, vos_MessageCallBack_t callBack, unsigned int partition, unsigned int volumeId, vos_force_t force, afs_status_p st);
107 typedef int (ADMINAPI *lpVosPartitionNameToId_t)(const char *partitionName, unsigned int *partitionId, afs_status_p st);
108 typedef int (ADMINAPI *lpVosPartitionIdToName_t)(unsigned int partitionId, char *partitionName, afs_status_p st);
109 typedef int (ADMINAPI *lpVosVolumeQuotaChange_t)(const void *cellHandle, const void *serverHandle, vos_MessageCallBack_t callBack, unsigned int partition, unsigned int volumeId, unsigned int volumeQuota, afs_status_p st);
110
111 typedef int (ADMINAPI *lpBosServerOpen_t)(const void *cellHandle, const char *hostName, void **hostHandlePP, afs_status_p st);
112 typedef int (ADMINAPI *lpBosServerClose_t)(const void *hostHandleP, afs_status_p st);
113 typedef int (ADMINAPI *lpBosProcessCreate_t)(const void *serverHandle, const char *processName, bos_ProcessType_t processType, const char *process, const char *cronTime, const char *notifier, afs_status_p st);
114 typedef int (ADMINAPI *lpBosProcessDelete_t)(const void *serverHandle, const char *processName, afs_status_p st);
115 typedef int (ADMINAPI *lpBosProcessExecutionStateGet_t)(const void *serverHandle, const char *processName, bos_ProcessExecutionState_p processStatusP, char *auxiliaryProcessStatus, afs_status_p st);
116 typedef int (ADMINAPI *lpBosProcessExecutionStateSet_t)(const void *serverHandle, const char *processName, bos_ProcessExecutionState_t processStatus, afs_status_p st);
117 typedef int (ADMINAPI *lpBosProcessExecutionStateSetTemporary_t)(const void *serverHandle, const char *processName, bos_ProcessExecutionState_t processStatus, afs_status_p st);
118 typedef int (ADMINAPI *lpBosProcessNameGetBegin_t)(const void *serverHandle, void **iterationIdP, afs_status_p st);
119 typedef int (ADMINAPI *lpBosProcessNameGetNext_t)(const void *iterationId, char *processName, afs_status_p st);
120 typedef int (ADMINAPI *lpBosProcessNameGetDone_t)(const void *iterationId, afs_status_p st);
121 typedef int (ADMINAPI *lpBosProcessInfoGet_t)(const void *serverHandle, const char *processName, bos_ProcessType_p processTypeP, bos_ProcessInfo_p processInfoP, afs_status_p st);
122 typedef int (ADMINAPI *lpBosProcessParameterGetBegin_t)(const void *serverHandle, const char *processName, void **iterationIdP, afs_status_p st);
123 typedef int (ADMINAPI *lpBosProcessParameterGetNext_t)(const void *iterationId, char *parameter, afs_status_p st);
124 typedef int (ADMINAPI *lpBosProcessParameterGetDone_t)(const void *iterationId, afs_status_p st);
125 typedef int (ADMINAPI *lpBosProcessNotifierGet_t)(const void *serverHandle, const char *processName, char *notifier, afs_status_p st);
126 typedef int (ADMINAPI *lpBosProcessRestart_t)(const void *serverHandle, const char *processName, afs_status_p st);
127 typedef int (ADMINAPI *lpBosProcessAllStop_t)(const void *serverHandle, afs_status_p st);
128 typedef int (ADMINAPI *lpBosProcessAllStart_t)(const void *serverHandle, afs_status_p st);
129 typedef int (ADMINAPI *lpBosProcessAllWaitStop_t)(const void *serverHandle, afs_status_p st);
130 typedef int (ADMINAPI *lpBosProcessAllStopAndRestart_t)(const void *serverHandle, bos_RestartBosServer_t restartBosServer, afs_status_p st);
131 typedef int (ADMINAPI *lpBosAdminCreate_t)(const void *serverHandle, const char *adminName, afs_status_p st);
132 typedef int (ADMINAPI *lpBosAdminDelete_t)(const void *serverHandle, const char *adminName, afs_status_p st);
133 typedef int (ADMINAPI *lpBosAdminGetBegin_t)(const void *serverHandle, void **iterationIdP, afs_status_p st);
134 typedef int (ADMINAPI *lpBosAdminGetNext_t)(const void *iterationId, char *adminName, afs_status_p st);
135 typedef int (ADMINAPI *lpBosAdminGetDone_t)(const void *iterationId, afs_status_p st);
136 typedef int (ADMINAPI *lpBosKeyCreate_t)(const void *serverHandle, int keyVersionNumber, const kas_encryptionKey_p key, afs_status_p st);
137 typedef int (ADMINAPI *lpBosKeyDelete_t)(const void *serverHandle, int keyVersionNumber, afs_status_p st);
138 typedef int (ADMINAPI *lpBosKeyGetBegin_t)(const void *serverHandle, void **iterationIdP, afs_status_p st);
139 typedef int (ADMINAPI *lpBosKeyGetNext_t)(const void *iterationId, bos_KeyInfo_p keyP, afs_status_p st);
140 typedef int (ADMINAPI *lpBosKeyGetDone_t)(const void *iterationId, afs_status_p st);
141 typedef int (ADMINAPI *lpBosCellSet_t)(const void *serverHandle, const char *cellName, afs_status_p st);
142 typedef int (ADMINAPI *lpBosCellGet_t)(const void *serverHandle, char *cellName, afs_status_p st);
143 typedef int (ADMINAPI *lpBosHostCreate_t)(const void *serverHandle, const char *hostName, afs_status_p st);
144 typedef int (ADMINAPI *lpBosHostDelete_t)(const void *serverHandle, const char *hostName, afs_status_p st);
145 typedef int (ADMINAPI *lpBosHostGetBegin_t)(const void *serverHandle, void **iterationIdP, afs_status_p st);
146 typedef int (ADMINAPI *lpBosHostGetNext_t)(const void *iterationId, char *hostName, afs_status_p st);
147 typedef int (ADMINAPI *lpBosHostGetDone_t)(const void *iterationId, afs_status_p st);
148 typedef int (ADMINAPI *lpBosExecutableCreate_t)(const void *serverHandle, const char *sourceFile, const char *destFile, afs_status_p st);
149 typedef int (ADMINAPI *lpBosExecutableRevert_t)(const void *serverHandle, const char *execFile, afs_status_p st);
150 typedef int (ADMINAPI *lpBosExecutableTimestampGet_t)(const void *serverHandle, const char *execFile, unsigned long *newTime, unsigned long *oldTime, unsigned long *bakTime, afs_status_p st);
151 typedef int (ADMINAPI *lpBosExecutablePrune_t)(const void *serverHandle, bos_Prune_t oldFiles, bos_Prune_t bakFiles, bos_Prune_t coreFiles, afs_status_p st);
152 typedef int (ADMINAPI *lpBosExecutableRestartTimeSet_t)(const void *serverHandle, bos_Restart_t type, bos_RestartTime_t time, afs_status_p st);
153 typedef int (ADMINAPI *lpBosExecutableRestartTimeGet_t)(const void *serverHandle, bos_Restart_t type, bos_RestartTime_p timeP, afs_status_p st);
154 typedef int (ADMINAPI *lpBosLogGet_t)(const void *serverHandle, const char *log, unsigned long *logBufferSizeP, char *logData, afs_status_p st);
155 typedef int (ADMINAPI *lpBosAuthSet_t)(const void *serverHandle, bos_Auth_t auth, afs_status_p st);
156 typedef int (ADMINAPI *lpBosCommandExecute_t)(const void *serverHandle, const char *command, afs_status_p st);
157 typedef int (ADMINAPI *lpBosSalvage_t)(const void *cellHandle, const void *serverHandle, const char *partitionName, const char *volumeName, int numSalvagers, const char *tmpDir, const char *logFile, vos_force_t force, bos_SalvageDamagedVolumes_t salvageDamagedVolumes, bos_WriteInodes_t writeInodes, bos_WriteRootInodes_t writeRootInodes, bos_ForceDirectory_t forceDirectory, bos_ForceBlockRead_t forceBlockRead, afs_status_p st);
158
159 typedef int (ADMINAPI *lpKasServerOpen_t)(const void *cellHandle, const char **serverList, void **serverHandleP, afs_status_p st); typedef int (ADMINAPI *lpKasServerClose_t)(void *serverHandle, afs_status_p st); typedef int (ADMINAPI *lpKasServerStatsGet_t)(const void *cellHandle, const void *serverHandle, kas_serverStats_p stats, afs_status_p st); typedef int (ADMINAPI *lpKasServerDebugGet_t)(const void *cellHandle, const void *serverHandle, kas_serverDebugInfo_p debug, afs_status_p st); typedef int (ADMINAPI *lpKasServerRandomKeyGet_t)(const void *cellHandle, const void *serverHandle, kas_encryptionKey_p key, afs_status_p st); typedef int (ADMINAPI *lpKasStringToKey_t)(const char *cellName, const char *string, kas_encryptionKey_p key, afs_status_p st); typedef int (ADMINAPI *lpKasPrincipalCreate_t)(const void *cellHandle, const void *serverHandle, const kas_identity_p who, const char *password, afs_status_p st);
160 typedef int (ADMINAPI *lpKasPrincipalDelete_t)(const void *cellHandle, const void *serverHandle, const kas_identity_p who, afs_status_p st);
161 typedef int (ADMINAPI *lpKasPrincipalGet_t)(const void *cellHandle, const void *serverHandle, const kas_identity_p who, kas_principalEntry_p principal, afs_status_p st);
162 typedef int (ADMINAPI *lpKasPrincipalGetBegin_t)(const void *cellHandle, const void *serverHandle, void **iterationIdP, afs_status_p st);
163 typedef int (ADMINAPI *lpKasPrincipalGetNext_t)(const void *iterationId, kas_identity_p who, afs_status_p st);
164 typedef int (ADMINAPI *lpKasPrincipalGetDone_t)(void *iterationIdP, afs_status_p st);
165 typedef int (ADMINAPI *lpKasPrincipalKeySet_t)(const void *cellHandle, const void *serverHandle, const kas_identity_p who, int keyVersion, const kas_encryptionKey_p key, afs_status_p st);
166 typedef int (ADMINAPI *lpKasPrincipalLockStatusGet_t)(const void *cellHandle, const void *serverHandle, const kas_identity_p who, unsigned long *lock_end_timeP, afs_status_p st);
167 typedef int (ADMINAPI *lpKasPrincipalUnlock_t)(const void *cellHandle, const void *serverHandle, const kas_identity_p who, afs_status_p st);
168 typedef int (ADMINAPI *lpKasPrincipalFieldsSet_t)(const void *cellHandle, const void *serverHandle, const kas_identity_p who, const kas_admin_p isAdmin, const kas_tgs_p grantTickets, const kas_enc_p canEncrypt, const kas_cpw_p canChangePassword, const unsigned int *expirationDate, const unsigned int *maxTicketLifetime, const unsigned int *passwordExpires, const kas_rpw_p passwordReuse, const unsigned int *failedPasswordAttempts, const unsigned int *failedPasswordLockTime, afs_status_p st);
169
170 typedef int (ADMINAPI *lpPtsGroupMemberAdd_t)(const void *cellHandle, const char *userName, const char *groupName, afs_status_p st);
171 typedef int (ADMINAPI *lpPtsGroupOwnerChange_t)(const void *cellHandle, const char *targetGroup, const char *newOwner, afs_status_p st);
172 typedef int (ADMINAPI *lpPtsGroupCreate_t)(const void *cellHandle, const char *newGroup, const char *newOwner, const int *newGroupIdP, afs_status_p st);
173 typedef int (ADMINAPI *lpPtsGroupGet_t)(const void *cellHandle, const char *groupName, pts_GroupEntry_p groupP, afs_status_p st);
174 typedef int (ADMINAPI *lpPtsGroupDelete_t)(const void *cellHandle, const char *group, afs_status_p st);
175 typedef int (ADMINAPI *lpPtsGroupMaxGet_t)(const void *cellHandle, int *maxGroupId, afs_status_p st);
176 typedef int (ADMINAPI *lpPtsGroupMaxSet_t)(const void *cellHandle, int maxGroupId, afs_status_p st);
177 typedef int (ADMINAPI *lpPtsGroupMemberListBegin_t)(const void *cellHandle, const char *groupName, void **iterationIdP, afs_status_p st);
178 typedef int (ADMINAPI *lpPtsGroupMemberListNext_t)(const void *iterationIdP, char *memberName, afs_status_p st);
179 typedef int (ADMINAPI *lpPtsGroupMemberListDone_t)(const void *iterationIdP, afs_status_p st);
180 typedef int (ADMINAPI *lpPtsGroupMemberRemove_t)(const void *cellHandle, const char *memberName, const char *groupName, afs_status_p st);
181 typedef int (ADMINAPI *lpPtsGroupRename_t)(const void *cellHandle, const char *oldName, const char *newName, afs_status_p st);
182 typedef int (ADMINAPI *lpPtsGroupModify_t)(const void *cellHandle, const char *groupName, pts_GroupUpdateEntry_p newEntryP, afs_status_p st);
183 typedef int (ADMINAPI *lpPtsUserCreate_t)(const void *cellHandle, const char *newUser, const int *newUserIdP, afs_status_p st);
184 typedef int (ADMINAPI *lpPtsUserDelete_t)(const void *cellHandle, const char *user, afs_status_p st);
185 typedef int (ADMINAPI *lpPtsUserGet_t)(const void *cellHandle, const char *userName, pts_UserEntry_p userP, afs_status_p st);
186 typedef int (ADMINAPI *lpPtsUserRename_t)(const void *cellHandle, const char *oldName, const char *newName, afs_status_p st);
187 typedef int (ADMINAPI *lpPtsUserModify_t)(const void *cellHandle, const char *userName, pts_UserUpdateEntry_p newEntryP, afs_status_p st);
188 typedef int (ADMINAPI *lpPtsUserMaxGet_t)(const void *cellHandle, int *maxUserId, afs_status_p st);
189 typedef int (ADMINAPI *lpPtsUserMaxSet_t)(const void *cellHandle, int maxUserId, afs_status_p st);
190 typedef int (ADMINAPI *lpPtsUserMemberListBegin_t)(const void *cellHandle, const char *userName, void **iterationIdP, afs_status_p st);
191 typedef int (ADMINAPI *lpPtsUserMemberListNext_t)(const void *iterationIdP, char *groupName, afs_status_p st);
192 typedef int (ADMINAPI *lpPtsUserMemberListDone_t)(const void *iterationIdP, afs_status_p st);
193 typedef int (ADMINAPI *lpPtsOwnedGroupListBegin_t)(const void *cellHandle, const char *ownerName, void **iterationIdP, afs_status_p st);
194 typedef int (ADMINAPI *lpPtsOwnedGroupListNext_t)(const void *iterationIdP, char *groupName, afs_status_p st);
195 typedef int (ADMINAPI *lpPtsOwnedGroupListDone_t)(const void *iterationIdP, afs_status_p st);
196
197 typedef int (ADMINAPI *lpClientTokenGetExisting_t)(const char *cellName, void **tokenHandle, afs_status_p st);
198 typedef int (ADMINAPI *lpClientCellOpen_t)(const char *cellName, const void *credsHandle, void **cellHandleP, afs_status_p st);
199 typedef int (ADMINAPI *lpClientCellClose_t)(const void *cellHandle, afs_status_p st);
200 typedef int (ADMINAPI *lpClientLocalCellGet_t)(char *cellName, afs_status_p st);
201 typedef int (ADMINAPI *lpClientAFSServerGet_t)(const void *cellHandle, const char *serverName, afs_serverEntry_p serverEntryP, afs_status_p st);
202 typedef int (ADMINAPI *lpClientAFSServerGetBegin_t)(const void *cellHandle, void **iterationIdP, afs_status_p st);
203 typedef int (ADMINAPI *lpClientAFSServerGetNext_t)(const void *iterationId, afs_serverEntry_p serverEntryP, afs_status_p st);
204 typedef int (ADMINAPI *lpClientAFSServerGetDone_t)(const void *iterationId, afs_status_p st);
205 typedef int (ADMINAPI *lpClientInit_t)(afs_status_p st);
206
207 typedef int (ADMINAPI *lpUtilDatabaseServerGetBegin_t)(const char *cellName, void **iterationIdP, afs_status_p st);
208 typedef int (ADMINAPI *lpUtilDatabaseServerGetNext_t)(const void *iterationId, int *serverAddressP, afs_status_p st);
209 typedef int (ADMINAPI *lpUtilDatabaseServerGetDone_t)(const void *iterationId, afs_status_p st);
210
211 // ADD HERE
212
213
214 static lpVosBackupVolumeCreate_t lpVosBackupVolumeCreate = NULL;
215 static lpVosBackupVolumeCreateMultiple_t lpVosBackupVolumeCreateMultiple = NULL;
216 static lpVosPartitionGet_t lpVosPartitionGet = NULL;
217 static lpVosPartitionGetBegin_t lpVosPartitionGetBegin = NULL;
218 static lpVosPartitionGetNext_t lpVosPartitionGetNext = NULL;
219 static lpVosPartitionGetDone_t lpVosPartitionGetDone = NULL;
220 static lpVosServerOpen_t lpVosServerOpen = NULL;
221 static lpVosServerClose_t lpVosServerClose = NULL;
222 static lpVosServerSync_t lpVosServerSync = NULL;
223 static lpVosFileServerAddressChange_t lpVosFileServerAddressChange = NULL;
224 static lpVosFileServerAddressRemove_t lpVosFileServerAddressRemove = NULL;
225 static lpVosFileServerGetBegin_t lpVosFileServerGetBegin = NULL;
226 static lpVosFileServerGetNext_t lpVosFileServerGetNext = NULL;
227 static lpVosFileServerGetDone_t lpVosFileServerGetDone = NULL;
228 static lpVosServerTransactionStatusGetBegin_t lpVosServerTransactionStatusGetBegin = NULL;
229 static lpVosServerTransactionStatusGetNext_t lpVosServerTransactionStatusGetNext = NULL;
230 static lpVosServerTransactionStatusGetDone_t lpVosServerTransactionStatusGetDone = NULL;
231 static lpVosVLDBGet_t lpVosVLDBGet = NULL;
232 static lpVosVLDBGetBegin_t lpVosVLDBGetBegin = NULL;
233 static lpVosVLDBGetNext_t lpVosVLDBGetNext = NULL;
234 static lpVosVLDBGetDone_t lpVosVLDBGetDone = NULL;
235 static lpVosVLDBEntryRemove_t lpVosVLDBEntryRemove = NULL;
236 static lpVosVLDBUnlock_t lpVosVLDBUnlock = NULL;
237 static lpVosVLDBEntryLock_t lpVosVLDBEntryLock = NULL;
238 static lpVosVLDBEntryUnlock_t lpVosVLDBEntryUnlock = NULL;
239 static lpVosVLDBReadOnlySiteCreate_t lpVosVLDBReadOnlySiteCreate = NULL;
240 static lpVosVLDBReadOnlySiteDelete_t lpVosVLDBReadOnlySiteDelete = NULL;
241 static lpVosVLDBSync_t lpVosVLDBSync = NULL;
242 static lpVosVolumeCreate_t lpVosVolumeCreate = NULL;
243 static lpVosVolumeDelete_t lpVosVolumeDelete = NULL;
244 static lpVosVolumeRename_t lpVosVolumeRename = NULL;
245 static lpVosVolumeDump_t lpVosVolumeDump = NULL;
246 static lpVosVolumeRestore_t lpVosVolumeRestore = NULL;
247 static lpVosVolumeOnline_t lpVosVolumeOnline = NULL;
248 static lpVosVolumeOffline_t lpVosVolumeOffline = NULL;
249 static lpVosVolumeGet_t lpVosVolumeGet = NULL;
250 static lpVosVolumeGetBegin_t lpVosVolumeGetBegin = NULL;
251 static lpVosVolumeGetNext_t lpVosVolumeGetNext = NULL;
252 static lpVosVolumeGetDone_t lpVosVolumeGetDone = NULL;
253 static lpVosVolumeMove_t lpVosVolumeMove = NULL;
254 static lpVosVolumeRelease_t lpVosVolumeRelease = NULL;
255 static lpVosVolumeZap_t lpVosVolumeZap = NULL;
256 static lpVosPartitionNameToId_t lpVosPartitionNameToId = NULL;
257 static lpVosPartitionIdToName_t lpVosPartitionIdToName = NULL;
258 static lpVosVolumeQuotaChange_t lpVosVolumeQuotaChange = NULL;
259
260 static lpBosServerOpen_t lpBosServerOpen = NULL;
261 static lpBosServerClose_t lpBosServerClose = NULL;
262 static lpBosProcessCreate_t lpBosProcessCreate = NULL;
263 static lpBosProcessDelete_t lpBosProcessDelete = NULL;
264 static lpBosProcessExecutionStateGet_t lpBosProcessExecutionStateGet = NULL;
265 static lpBosProcessExecutionStateSet_t lpBosProcessExecutionStateSet = NULL;
266 static lpBosProcessExecutionStateSetTemporary_t lpBosProcessExecutionStateSetTemporary = NULL;
267 static lpBosProcessNameGetBegin_t lpBosProcessNameGetBegin = NULL;
268 static lpBosProcessNameGetDone_t lpBosProcessNameGetDone = NULL;
269 static lpBosProcessNameGetNext_t lpBosProcessNameGetNext = NULL;
270 static lpBosProcessInfoGet_t lpBosProcessInfoGet = NULL;
271 static lpBosProcessParameterGetBegin_t lpBosProcessParameterGetBegin = NULL;
272 static lpBosProcessParameterGetDone_t lpBosProcessParameterGetDone = NULL;
273 static lpBosProcessParameterGetNext_t lpBosProcessParameterGetNext = NULL;
274 static lpBosProcessNotifierGet_t lpBosProcessNotifierGet = NULL;
275 static lpBosProcessRestart_t lpBosProcessRestart = NULL;
276 static lpBosProcessAllStop_t lpBosProcessAllStop = NULL;
277 static lpBosProcessAllStart_t lpBosProcessAllStart = NULL;
278 static lpBosProcessAllWaitStop_t lpBosProcessAllWaitStop = NULL;
279 static lpBosProcessAllStopAndRestart_t lpBosProcessAllStopAndRestart = NULL;
280 static lpBosAdminCreate_t lpBosAdminCreate = NULL;
281 static lpBosAdminDelete_t lpBosAdminDelete = NULL;
282 static lpBosAdminGetBegin_t lpBosAdminGetBegin = NULL;
283 static lpBosAdminGetDone_t lpBosAdminGetDone = NULL;
284 static lpBosAdminGetNext_t lpBosAdminGetNext = NULL;
285 static lpBosKeyCreate_t lpBosKeyCreate = NULL;
286 static lpBosKeyDelete_t lpBosKeyDelete = NULL;
287 static lpBosKeyGetBegin_t lpBosKeyGetBegin = NULL;
288 static lpBosKeyGetDone_t lpBosKeyGetDone = NULL;
289 static lpBosKeyGetNext_t lpBosKeyGetNext = NULL;
290 static lpBosCellSet_t lpBosCellSet = NULL;
291 static lpBosCellGet_t lpBosCellGet = NULL;
292 static lpBosHostCreate_t lpBosHostCreate = NULL;
293 static lpBosHostDelete_t lpBosHostDelete = NULL;
294 static lpBosHostGetBegin_t lpBosHostGetBegin = NULL;
295 static lpBosHostGetDone_t lpBosHostGetDone = NULL;
296 static lpBosHostGetNext_t lpBosHostGetNext = NULL;
297 static lpBosExecutableCreate_t lpBosExecutableCreate = NULL;
298 static lpBosExecutableRevert_t lpBosExecutableRevert = NULL;
299 static lpBosExecutableTimestampGet_t lpBosExecutableTimestampGet = NULL;
300 static lpBosExecutablePrune_t lpBosExecutablePrune = NULL;
301 static lpBosExecutableRestartTimeSet_t lpBosExecutableRestartTimeSet = NULL;
302 static lpBosExecutableRestartTimeGet_t lpBosExecutableRestartTimeGet = NULL;
303 static lpBosLogGet_t lpBosLogGet = NULL;
304 static lpBosAuthSet_t lpBosAuthSet = NULL;
305 static lpBosCommandExecute_t lpBosCommandExecute = NULL;
306 static lpBosSalvage_t lpBosSalvage = NULL;
307
308 static lpKasServerOpen_t lpKasServerOpen = NULL;
309 static lpKasServerClose_t lpKasServerClose = NULL;
310 static lpKasServerStatsGet_t lpKasServerStatsGet = NULL;
311 static lpKasServerDebugGet_t lpKasServerDebugGet = NULL;
312 static lpKasServerRandomKeyGet_t lpKasServerRandomKeyGet = NULL;
313 static lpKasStringToKey_t lpKasStringToKey = NULL;
314 static lpKasPrincipalCreate_t lpKasPrincipalCreate = NULL;
315 static lpKasPrincipalDelete_t lpKasPrincipalDelete = NULL;
316 static lpKasPrincipalGet_t lpKasPrincipalGet = NULL;
317 static lpKasPrincipalGetBegin_t lpKasPrincipalGetBegin = NULL;
318 static lpKasPrincipalGetNext_t lpKasPrincipalGetNext = NULL;
319 static lpKasPrincipalGetDone_t lpKasPrincipalGetDone = NULL;
320 static lpKasPrincipalKeySet_t lpKasPrincipalKeySet = NULL;
321 static lpKasPrincipalLockStatusGet_t lpKasPrincipalLockStatusGet = NULL;
322 static lpKasPrincipalUnlock_t lpKasPrincipalUnlock = NULL;
323 static lpKasPrincipalFieldsSet_t lpKasPrincipalFieldsSet = NULL;
324
325 static lpPtsGroupMemberAdd_t lpPtsGroupMemberAdd = NULL;
326 static lpPtsGroupOwnerChange_t lpPtsGroupOwnerChange = NULL;
327 static lpPtsGroupCreate_t lpPtsGroupCreate = NULL;
328 static lpPtsGroupGet_t lpPtsGroupGet = NULL;
329 static lpPtsGroupDelete_t lpPtsGroupDelete = NULL;
330 static lpPtsGroupMaxGet_t lpPtsGroupMaxGet = NULL;
331 static lpPtsGroupMaxSet_t lpPtsGroupMaxSet = NULL;
332 static lpPtsGroupMemberListBegin_t lpPtsGroupMemberListBegin = NULL;
333 static lpPtsGroupMemberListNext_t lpPtsGroupMemberListNext = NULL;
334 static lpPtsGroupMemberListDone_t lpPtsGroupMemberListDone = NULL;
335 static lpPtsGroupMemberRemove_t lpPtsGroupMemberRemove = NULL;
336 static lpPtsGroupRename_t lpPtsGroupRename = NULL;
337 static lpPtsGroupModify_t lpPtsGroupModify = NULL;
338 static lpPtsUserCreate_t lpPtsUserCreate = NULL;
339 static lpPtsUserDelete_t lpPtsUserDelete = NULL;
340 static lpPtsUserGet_t lpPtsUserGet = NULL;
341 static lpPtsUserRename_t lpPtsUserRename = NULL;
342 static lpPtsUserModify_t lpPtsUserModify = NULL;
343 static lpPtsUserMaxGet_t lpPtsUserMaxGet = NULL;
344 static lpPtsUserMaxSet_t lpPtsUserMaxSet = NULL;
345 static lpPtsUserMemberListBegin_t lpPtsUserMemberListBegin = NULL;
346 static lpPtsUserMemberListNext_t lpPtsUserMemberListNext = NULL;
347 static lpPtsUserMemberListDone_t lpPtsUserMemberListDone = NULL;
348 static lpPtsOwnedGroupListBegin_t lpPtsOwnedGroupListBegin = NULL;
349 static lpPtsOwnedGroupListNext_t lpPtsOwnedGroupListNext = NULL;
350 static lpPtsOwnedGroupListDone_t lpPtsOwnedGroupListDone = NULL;
351
352 static lpClientTokenGetExisting_t lpClientTokenGetExisting = NULL;
353 static lpClientCellOpen_t lpClientCellOpen = NULL;
354 static lpClientCellClose_t lpClientCellClose = NULL;
355 static lpClientLocalCellGet_t lpClientLocalCellGet = NULL;
356 static lpClientAFSServerGet_t lpClientAFSServerGet = NULL;
357 static lpClientAFSServerGetBegin_t lpClientAFSServerGetBegin = NULL;
358 static lpClientAFSServerGetNext_t lpClientAFSServerGetNext = NULL;
359 static lpClientAFSServerGetDone_t lpClientAFSServerGetDone = NULL;
360 static lpClientInit_t lpClientInit = NULL;
361
362 static lpUtilDatabaseServerGetBegin_t lpUtilDatabaseServerGetBegin = NULL;
363 static lpUtilDatabaseServerGetNext_t lpUtilDatabaseServerGetNext = NULL;
364 static lpUtilDatabaseServerGetDone_t lpUtilDatabaseServerGetDone = NULL;
365
366 // ADD HERE
367
368 } // extern "C"
369
370
371 /*
372  * PROTOTYPES _________________________________________________________________
373  *
374  */
375
376 BOOL Worker_LoadLibraries (ULONG *pStatus);
377 void Worker_FreeLibraries (void);
378
379 DWORD Worker_PerformTask (WORKERTASK wtask, LPWORKERPACKET lpwp);
380
381
382 /*
383  * ROUTINES ___________________________________________________________________
384  *
385  */
386
387 BOOL Worker_Initialize (ULONG *pStatus)
388 {
389    static BOOL fInitialized = FALSE;
390
391    if (!fInitialized)
392       {
393       fInitialized = Worker_LoadLibraries (pStatus);
394       }
395
396    return fInitialized;
397 }
398
399
400 BOOL Worker_DoTask (WORKERTASK wtask, LPWORKERPACKET lpwp, ULONG *pStatus)
401 {
402    if (!Worker_Initialize (pStatus))
403       return FALSE;
404
405    ULONG status;
406    try {
407       status = Worker_PerformTask (wtask, lpwp);
408    } catch(...) {
409       status = ERROR_UNEXP_NET_ERR;
410    }
411    if (pStatus)
412       *pStatus = status;
413    return (status == 0) ? TRUE : FALSE;
414 }
415
416
417 DWORD Worker_PerformTask (WORKERTASK wtask, LPWORKERPACKET lpwp)
418 {
419    afs_status_t status = 0;
420
421    switch (wtask)
422       {
423       case wtaskVosBackupVolumeCreate:
424          {
425          if ((*lpVosBackupVolumeCreate)(lpwp->wpVosBackupVolumeCreate.hCell, NULL, lpwp->wpVosBackupVolumeCreate.idVolume, &status))
426             status = 0;
427          break;
428          }
429
430       case wtaskVosBackupVolumeCreateMultiple:
431          {
432          LPSTR pszPrefixA = StringToAnsi (lpwp->wpVosBackupVolumeCreateMultiple.pszPrefix);
433
434          unsigned int *pPartition;
435          if (*(pPartition = (unsigned int *)&lpwp->wpVosBackupVolumeCreateMultiple.idPartition) == NO_PARTITION)
436             pPartition = NULL;
437
438          if ((*lpVosBackupVolumeCreateMultiple)(lpwp->wpVosBackupVolumeCreateMultiple.hCell, lpwp->wpVosBackupVolumeCreateMultiple.hServer, NULL, pPartition, pszPrefixA, (lpwp->wpVosBackupVolumeCreateMultiple.fExclude) ? VOS_EXCLUDE : VOS_INCLUDE, &status))
439             status = 0;
440
441          FreeString (pszPrefixA, lpwp->wpVosBackupVolumeCreateMultiple.pszPrefix);
442          break;
443          }
444
445       case wtaskVosPartitionGet:
446          {
447          if ((*lpVosPartitionGet)(lpwp->wpVosPartitionGet.hCell, lpwp->wpVosPartitionGet.hServer, NULL, lpwp->wpVosPartitionGet.idPartition, &lpwp->wpVosPartitionGet.Data, &status))
448             status = 0;
449          break;
450          }
451
452       case wtaskVosPartitionGetBegin:
453          {
454          if ((*lpVosPartitionGetBegin)(lpwp->wpVosPartitionGetBegin.hCell, lpwp->wpVosPartitionGetBegin.hServer, NULL, &lpwp->wpVosPartitionGetBegin.hEnum, &status))
455             status = 0;
456          else
457             lpwp->wpVosPartitionGetBegin.hEnum = NULL;
458          break;
459          }
460
461       case wtaskVosPartitionGetNext:
462          {
463          if ((*lpVosPartitionGetNext)(lpwp->wpVosPartitionGetNext.hEnum, &lpwp->wpVosPartitionGetNext.Data, &status))
464             status = 0;
465          break;
466          }
467
468       case wtaskVosPartitionGetDone:
469          {
470          if ((*lpVosPartitionGetDone)(lpwp->wpVosPartitionGetDone.hEnum, &status))
471             status = 0;
472          break;
473          }
474
475       case wtaskVosServerOpen:
476          {
477          LPSTR pszServerA = StringToAnsi (lpwp->wpVosServerOpen.pszServer);
478
479          if ((*lpVosServerOpen)(lpwp->wpVosServerOpen.hCell, pszServerA, &lpwp->wpVosServerOpen.hServer, &status))
480             status = 0;
481
482          FreeString (pszServerA, lpwp->wpVosServerOpen.pszServer);
483          break;
484          }
485
486       case wtaskVosServerClose:
487          {
488          if ((*lpVosServerClose)(lpwp->wpVosServerClose.hServer, &status))
489             status = 0;
490          break;
491          }
492
493       case wtaskVosServerSync:
494          {
495          unsigned int *pPartition;
496          if (*(pPartition = (unsigned int *)&lpwp->wpVosServerSync.idPartition) == NO_PARTITION)
497             pPartition = NULL;
498
499          if ((*lpVosServerSync)(lpwp->wpVosServerSync.hCell, lpwp->wpVosServerSync.hServer, NULL, pPartition, (lpwp->wpVosServerSync.fForce) ? VOS_FORCE : VOS_NORMAL, &status))
500             status = 0;
501          break;
502          }
503
504       case wtaskVosFileServerAddressChange:
505          {
506          int oldAddress;
507          int newAddress;
508          AfsClass_AddressToInt (&oldAddress, &lpwp->wpVosFileServerAddressChange.addrOld);
509          AfsClass_AddressToInt (&newAddress, &lpwp->wpVosFileServerAddressChange.addrNew);
510
511          if ((*lpVosFileServerAddressChange)(lpwp->wpVosFileServerAddressChange.hCell, NULL, oldAddress, newAddress, &status))
512             status = 0;
513          break;
514          }
515
516       case wtaskVosFileServerAddressRemove:
517          {
518          int oldAddress;
519          AfsClass_AddressToInt (&oldAddress, &lpwp->wpVosFileServerAddressRemove.addr);
520
521          if ((*lpVosFileServerAddressRemove)(lpwp->wpVosFileServerAddressRemove.hCell, NULL, oldAddress, &status))
522             status = 0;
523
524          if (status == VL_NOENT)  // RemoveAddress attempted on pre-AFS3.5?
525             status = ENOSYS;
526          break;
527          }
528
529       case wtaskVosFileServerGetBegin:
530          {
531          if ((*lpVosFileServerGetBegin)(lpwp->wpVosFileServerGetBegin.hCell, NULL, &lpwp->wpVosFileServerGetBegin.hEnum, &status))
532             status = 0;
533          break;
534          }
535
536       case wtaskVosFileServerGetNext:
537          {
538          if ((*lpVosFileServerGetNext)(lpwp->wpVosFileServerGetNext.hEnum, &lpwp->wpVosFileServerGetNext.Entry, &status))
539             status = 0;
540          break;
541          }
542
543       case wtaskVosFileServerGetDone:
544          {
545          if ((*lpVosFileServerGetDone)(lpwp->wpVosFileServerGetDone.hEnum, &status))
546             status = 0;
547          break;
548          }
549
550       case wtaskVosServerTransactionStatusGetBegin:
551          {
552          if ((*lpVosServerTransactionStatusGetBegin)(lpwp->wpVosServerTransactionStatusGetBegin.hCell, lpwp->wpVosServerTransactionStatusGetBegin.hServer, NULL, &lpwp->wpVosServerTransactionStatusGetBegin.hEnum, &status))
553             status = 0;
554          break;
555          }
556
557       case wtaskVosServerTransactionStatusGetNext:
558          {
559          if ((*lpVosServerTransactionStatusGetNext)(lpwp->wpVosServerTransactionStatusGetNext.hEnum, &lpwp->wpVosServerTransactionStatusGetNext.Data, &status))
560             status = 0;
561          break;
562          }
563
564       case wtaskVosServerTransactionStatusGetDone:
565          {
566          if ((*lpVosServerTransactionStatusGetDone)(lpwp->wpVosServerTransactionStatusGetDone.hEnum, &status))
567             status = 0;
568          break;
569          }
570
571       case wtaskVosVLDBGet:
572          {
573          if ((*lpVosVLDBGet)(lpwp->wpVosVLDBGet.hCell, NULL, &lpwp->wpVosVLDBGet.idVolume, NULL, &lpwp->wpVosVLDBGet.Data, &status))
574             status = 0;
575          break;
576          }
577
578       case wtaskVosVLDBGetBegin:
579          {
580          unsigned int *pPartition;
581          if (*(pPartition = (unsigned int *)&lpwp->wpVosVLDBGetBegin.idPartition) == NO_PARTITION)
582             pPartition = NULL;
583
584          if ((*lpVosVLDBGetBegin)(lpwp->wpVosVLDBGetBegin.hCell, lpwp->wpVosVLDBGetBegin.hServer, NULL, pPartition, &lpwp->wpVosVLDBGetBegin.hEnum, &status))
585             status = 0;
586          break;
587          }
588
589       case wtaskVosVLDBGetNext:
590          {
591          if ((*lpVosVLDBGetNext)(lpwp->wpVosVLDBGetNext.hEnum, &lpwp->wpVosVLDBGetNext.Data, &status))
592             status = 0;
593          break;
594          }
595
596       case wtaskVosVLDBGetDone:
597          {
598          if ((*lpVosVLDBGetDone)(lpwp->wpVosVLDBGetDone.hEnum, &status))
599             status = 0;
600          break;
601          }
602
603       case wtaskVosVLDBEntryRemove:
604          {
605          unsigned int *pPartition;
606          if (*(pPartition = (unsigned int *)&lpwp->wpVosVLDBEntryRemove.idPartition) == NO_PARTITION)
607             pPartition = NULL;
608
609          unsigned int *pVolume;
610          if (*(pVolume = (unsigned int *)&lpwp->wpVosVLDBEntryRemove.idVolume) == NO_VOLUME)
611             pVolume = NULL;
612
613          if ((*lpVosVLDBEntryRemove)(lpwp->wpVosVLDBEntryRemove.hCell, lpwp->wpVosVLDBEntryRemove.hServer, NULL, pPartition, pVolume, &status))
614             status = 0;
615          break;
616          }
617
618       case wtaskVosVLDBEntryLock:
619          {
620          if ((*lpVosVLDBEntryLock)(lpwp->wpVosVLDBEntryLock.hCell, NULL, lpwp->wpVosVLDBEntryLock.idVolume, &status))
621             status = 0;
622          break;
623          }
624
625       case wtaskVosVLDBEntryUnlock:
626          {
627          if (lpwp->wpVosVLDBEntryUnlock.idVolume == NO_VOLUME)
628             {
629             unsigned int *pPartition;
630             if (*(pPartition = (unsigned int *)&lpwp->wpVosVLDBEntryUnlock.idPartition) == NO_PARTITION)
631                pPartition = NULL;
632
633             if ((*lpVosVLDBUnlock)(lpwp->wpVosVLDBEntryUnlock.hCell, lpwp->wpVosVLDBEntryUnlock.hServer, NULL, pPartition, &status))
634                status = 0;
635             }
636          else
637             {
638             if ((*lpVosVLDBEntryUnlock)(lpwp->wpVosVLDBEntryUnlock.hCell, NULL, lpwp->wpVosVLDBEntryUnlock.idVolume, &status))
639                status = 0;
640             }
641          break;
642          }
643
644       case wtaskVosVLDBReadOnlySiteCreate:
645          {
646          if ((*lpVosVLDBReadOnlySiteCreate)(lpwp->wpVosVLDBReadOnlySiteCreate.hCell, lpwp->wpVosVLDBReadOnlySiteCreate.hServer, NULL, lpwp->wpVosVLDBReadOnlySiteCreate.idPartition, lpwp->wpVosVLDBReadOnlySiteCreate.idVolume, &status))
647             status = 0;
648          break;
649          }
650
651       case wtaskVosVLDBReadOnlySiteDelete:
652          {
653          if ((*lpVosVLDBReadOnlySiteDelete)(lpwp->wpVosVLDBReadOnlySiteDelete.hCell, lpwp->wpVosVLDBReadOnlySiteDelete.hServer, NULL, lpwp->wpVosVLDBReadOnlySiteDelete.idPartition, lpwp->wpVosVLDBReadOnlySiteDelete.idVolume, &status))
654             status = 0;
655          break;
656          }
657
658       case wtaskVosVLDBSync:
659          {
660          unsigned int *pPartition;
661          if (*(pPartition = (unsigned int *)&lpwp->wpVosVLDBSync.idPartition) == NO_PARTITION)
662             pPartition = NULL;
663
664          if ((*lpVosVLDBSync)(lpwp->wpVosVLDBSync.hCell, lpwp->wpVosVLDBSync.hServer, NULL, pPartition, ((lpwp->wpVosVLDBSync.fForce) ? VOS_FORCE : VOS_NORMAL), &status))
665             status = 0;
666          break;
667          }
668
669       case wtaskVosVolumeCreate:
670          {
671          LPSTR pszVolumeA = StringToAnsi (lpwp->wpVosVolumeCreate.pszVolume);
672
673          if ((*lpVosVolumeCreate)(lpwp->wpVosVolumeCreate.hCell, lpwp->wpVosVolumeCreate.hServer, NULL, lpwp->wpVosVolumeCreate.idPartition, pszVolumeA, (unsigned int)lpwp->wpVosVolumeCreate.ckQuota, (unsigned int *)&lpwp->wpVosVolumeCreate.idVolume, &status))
674             status = 0;
675
676          FreeString (pszVolumeA, lpwp->wpVosVolumeCreate.pszVolume);
677          break;
678          }
679
680       case wtaskVosVolumeDelete:
681          {
682          if ((*lpVosVolumeDelete)(lpwp->wpVosVolumeDelete.hCell, lpwp->wpVosVolumeDelete.hServer, NULL, lpwp->wpVosVolumeDelete.idPartition, lpwp->wpVosVolumeDelete.idVolume, &status))
683             status = 0;
684          break;
685          }
686
687       case wtaskVosVolumeRename:
688          {
689          LPSTR pszVolumeA = StringToAnsi (lpwp->wpVosVolumeRename.pszVolume);
690
691          if ((*lpVosVolumeRename)(lpwp->wpVosVolumeRename.hCell, NULL, lpwp->wpVosVolumeRename.idVolume, pszVolumeA, &status))
692             status = 0;
693
694          FreeString (pszVolumeA, lpwp->wpVosVolumeRename.pszVolume);
695          break;
696          }
697
698       case wtaskVosVolumeDump:
699          {
700          LPSTR pszFilenameA = StringToAnsi (lpwp->wpVosVolumeDump.pszFilename);
701          ULONG timeStart = AfsClass_SystemTimeToUnixTime (&lpwp->wpVosVolumeDump.stStart);
702
703          if ((*lpVosVolumeDump)(lpwp->wpVosVolumeDump.hCell, lpwp->wpVosVolumeDump.hServer, NULL, (unsigned int *)&lpwp->wpVosVolumeDump.idPartition, lpwp->wpVosVolumeDump.idVolume, timeStart, pszFilenameA, &status))
704             status = 0;
705
706          FreeString (pszFilenameA, lpwp->wpVosVolumeDump.pszFilename);
707          break;
708          }
709
710       case wtaskVosVolumeRestore:
711          {
712          LPSTR pszVolumeA = StringToAnsi (lpwp->wpVosVolumeRestore.pszVolume);
713          LPSTR pszFilenameA = StringToAnsi (lpwp->wpVosVolumeRestore.pszFilename);
714          vos_volumeRestoreType_t Type = (lpwp->wpVosVolumeRestore.fIncremental) ? VOS_RESTORE_INCREMENTAL : VOS_RESTORE_FULL;
715
716          unsigned int *pVolume;
717          if (*(pVolume = (unsigned int *)&lpwp->wpVosVolumeRestore.idVolume) == NO_VOLUME)
718             pVolume = NULL;
719
720          if ((*lpVosVolumeRestore)(lpwp->wpVosVolumeRestore.hCell, lpwp->wpVosVolumeRestore.hServer, NULL, lpwp->wpVosVolumeRestore.idPartition, pVolume, pszVolumeA, pszFilenameA, Type, &status))
721             status = 0;
722
723          FreeString (pszFilenameA, lpwp->wpVosVolumeRestore.pszFilename);
724          FreeString (pszVolumeA, lpwp->wpVosVolumeRestore.pszVolume);
725          break;
726          }
727
728       case wtaskVosVolumeOnline:
729          {
730          if ((*lpVosVolumeOnline)(lpwp->wpVosVolumeOnline.hServer, NULL, lpwp->wpVosVolumeOnline.idPartition, lpwp->wpVosVolumeOnline.idVolume, lpwp->wpVosVolumeOnline.csecSleep, lpwp->wpVosVolumeOnline.Status, &status)) 
731             status = 0;
732          break;
733          }
734
735       case wtaskVosVolumeOffline:
736          {
737          if ((*lpVosVolumeOffline)(lpwp->wpVosVolumeOffline.hServer, NULL, lpwp->wpVosVolumeOffline.idPartition, lpwp->wpVosVolumeOffline.idVolume, &status))
738             status = 0;
739          break;
740          }
741
742       case wtaskVosVolumeGet:
743          {
744          if ((*lpVosVolumeGet)(lpwp->wpVosVolumeGet.hCell, lpwp->wpVosVolumeGet.hServer, NULL, lpwp->wpVosVolumeGet.idPartition, lpwp->wpVosVolumeGet.idVolume, &lpwp->wpVosVolumeGet.Data, &status))
745             status = 0;
746          break;
747          }
748
749       case wtaskVosVolumeGetBegin:
750          {
751          if ((lpVosVolumeGetBegin)(lpwp->wpVosVolumeGetBegin.hCell, lpwp->wpVosVolumeGetBegin.hServer, NULL, lpwp->wpVosVolumeGetBegin.idPartition, &lpwp->wpVosVolumeGetBegin.hEnum, &status))
752             status = 0;
753          break;
754          }
755
756       case wtaskVosVolumeGetNext:
757          {
758          if ((*lpVosVolumeGetNext)(lpwp->wpVosVolumeGetNext.hEnum, &lpwp->wpVosVolumeGetNext.Data, &status))
759             status = 0;
760          break;
761          }
762
763       case wtaskVosVolumeGetDone:
764          {
765          if ((*lpVosVolumeGetDone)(lpwp->wpVosVolumeGetDone.hEnum, &status))
766             status = 0;
767          break;
768          }
769
770       case wtaskVosVolumeMove:
771          {
772          if ((lpVosVolumeMove)(lpwp->wpVosVolumeMove.hCell, NULL, lpwp->wpVosVolumeMove.idVolume, lpwp->wpVosVolumeMove.hServerFrom, lpwp->wpVosVolumeMove.idPartitionFrom, lpwp->wpVosVolumeMove.hServerTo, lpwp->wpVosVolumeMove.idPartitionTo, &status))
773             status = 0;
774          break;
775          }
776
777       case wtaskVosVolumeRelease:
778          {
779          if ((*lpVosVolumeRelease)(lpwp->wpVosVolumeRelease.hCell, NULL, lpwp->wpVosVolumeRelease.idVolume, ((lpwp->wpVosVolumeRelease.fForce) ? VOS_FORCE : VOS_NORMAL), &status))
780             status = 0;
781          break;
782          }
783
784       case wtaskVosVolumeZap:
785          {
786          if ((*lpVosVolumeZap)(lpwp->wpVosVolumeZap.hCell, lpwp->wpVosVolumeZap.hServer, NULL, lpwp->wpVosVolumeZap.idPartition, lpwp->wpVosVolumeZap.idVolume, ((lpwp->wpVosVolumeZap.fForce) ? VOS_FORCE : VOS_NORMAL), &status))
787             status = 0;
788          break;
789          }
790
791       case wtaskVosPartitionNameToId:
792          {
793          LPSTR pszPartitionA = StringToAnsi (lpwp->wpVosPartitionNameToId.pszPartition);
794
795          if ((*lpVosPartitionNameToId)(pszPartitionA, (unsigned int *)&lpwp->wpVosPartitionNameToId.idPartition, &status))
796             status = 0;
797
798          FreeString (pszPartitionA, lpwp->wpVosPartitionNameToId.pszPartition);
799          break;
800          }
801
802       case wtaskVosPartitionIdToName:
803          {
804          char szPartitionA[ cchNAME ];
805          if ((*lpVosPartitionIdToName)(lpwp->wpVosPartitionIdToName.idPartition, szPartitionA, &status))
806             {
807             CopyAnsiToString (lpwp->wpVosPartitionIdToName.pszPartition, szPartitionA);
808             status = 0;
809             }
810          break;
811          }
812
813       case wtaskVosVolumeQuotaChange:
814          {
815          if ((*lpVosVolumeQuotaChange)(lpwp->wpVosVolumeQuotaChange.hCell, lpwp->wpVosVolumeQuotaChange.hServer, NULL, lpwp->wpVosVolumeQuotaChange.idPartition, lpwp->wpVosVolumeQuotaChange.idVolume, (unsigned int)lpwp->wpVosVolumeQuotaChange.ckQuota, &status))
816             status = 0;
817          break;
818          }
819
820       case wtaskBosServerOpen:
821          {
822          LPSTR pszServerA = StringToAnsi (lpwp->wpBosServerOpen.pszServer);
823
824          if ((*lpBosServerOpen)(lpwp->wpBosServerOpen.hCell, pszServerA, &lpwp->wpBosServerOpen.hServer, &status))
825             status = 0;
826
827          FreeString (pszServerA, lpwp->wpBosServerOpen.pszServer);
828          break;
829          }
830
831       case wtaskBosServerClose:
832          {
833          if ((*lpBosServerClose)(lpwp->wpBosServerClose.hServer, &status))
834             status = 0;
835          break;
836          }
837
838       case wtaskBosProcessCreate:
839          {
840          LPSTR pszServiceA = StringToAnsi (lpwp->wpBosProcessCreate.pszService);
841          LPSTR pszCommandA = StringToAnsi (lpwp->wpBosProcessCreate.pszCommand);
842          LPSTR pszTimeCronA = StringToAnsi (lpwp->wpBosProcessCreate.pszTimeCron);
843          LPSTR pszNotifierA = StringToAnsi (lpwp->wpBosProcessCreate.pszNotifier);
844
845          bos_ProcessType_t processType;
846          switch (lpwp->wpBosProcessCreate.type)
847             {
848             case SERVICETYPE_FS:
849                processType = BOS_PROCESS_FS;
850                break;
851             case SERVICETYPE_CRON:
852                processType = BOS_PROCESS_CRON;
853                break;
854             default:
855             case SERVICETYPE_SIMPLE:
856                processType = BOS_PROCESS_SIMPLE;
857                break;
858             }
859
860          if ((*lpBosProcessCreate)(lpwp->wpBosProcessCreate.hServer, pszServiceA, processType, pszCommandA, pszTimeCronA, pszNotifierA, &status))
861             status = 0;
862
863          FreeString (pszNotifierA, lpwp->wpBosProcessCreate.pszNotifier);
864          FreeString (pszTimeCronA, lpwp->wpBosProcessCreate.pszTimeCron);
865          FreeString (pszCommandA, lpwp->wpBosProcessCreate.pszCommand);
866          FreeString (pszServiceA, lpwp->wpBosProcessCreate.pszService);
867          break;
868          }
869
870       case wtaskBosProcessDelete:
871          {
872          LPSTR pszServiceA = StringToAnsi (lpwp->wpBosProcessDelete.pszService);
873
874          if ((*lpBosProcessDelete)(lpwp->wpBosProcessDelete.hServer, pszServiceA, &status))
875             status = 0;
876
877          FreeString (pszServiceA, lpwp->wpBosProcessDelete.pszService);
878          break;
879          }
880
881       case wtaskBosProcessExecutionStateGet:
882          {
883          LPSTR pszServiceA = StringToAnsi (lpwp->wpBosProcessExecutionStateGet.pszService);
884          char szAuxStatusA[BOS_MAX_NAME_LEN] = "";
885
886          bos_ProcessExecutionState_t processState = BOS_PROCESS_STOPPED;
887          if ((*lpBosProcessExecutionStateGet)(lpwp->wpBosProcessExecutionStateGet.hServer, pszServiceA, &processState, szAuxStatusA, &status))
888             {
889             status = 0;
890
891             if (lpwp->wpBosProcessExecutionStateGet.pszAuxStatus != NULL)
892                {
893                CopyAnsiToString (lpwp->wpBosProcessExecutionStateGet.pszAuxStatus, szAuxStatusA);
894                }
895
896             switch (processState)
897                {
898                case BOS_PROCESS_RUNNING:
899                   lpwp->wpBosProcessExecutionStateGet.state = SERVICESTATE_RUNNING;
900                   break;
901                case BOS_PROCESS_STARTING:
902                   lpwp->wpBosProcessExecutionStateGet.state = SERVICESTATE_STARTING;
903                   break;
904                case BOS_PROCESS_STOPPING:
905                   lpwp->wpBosProcessExecutionStateGet.state = SERVICESTATE_STOPPING;
906                   break;
907                default:
908                case BOS_PROCESS_STOPPED:
909                   lpwp->wpBosProcessExecutionStateGet.state = SERVICESTATE_STOPPED;
910                   break;
911                }
912             }
913
914          FreeString (pszServiceA, lpwp->wpBosProcessExecutionStateGet.pszService);
915          break;
916          }
917
918       case wtaskBosProcessExecutionStateSet:
919          {
920          LPSTR pszServiceA = StringToAnsi (lpwp->wpBosProcessExecutionStateSet.pszService);
921
922          bos_ProcessExecutionState_t processState;
923          switch (lpwp->wpBosProcessExecutionStateSet.state)
924             {
925             case SERVICESTATE_STOPPING:
926             case SERVICESTATE_STOPPED:
927                processState = BOS_PROCESS_STOPPED;
928                break;
929             default:
930             case SERVICESTATE_STARTING:
931             case SERVICESTATE_RUNNING:
932                processState = BOS_PROCESS_RUNNING;
933                break;
934             }
935
936          if ((*lpBosProcessExecutionStateSet)(lpwp->wpBosProcessExecutionStateSet.hServer, pszServiceA, processState, &status))
937             status = 0;
938
939          FreeString (pszServiceA, lpwp->wpBosProcessExecutionStateSet.pszService);
940          break;
941          }
942
943       case wtaskBosProcessExecutionStateSetTemporary:
944          {
945          LPSTR pszServiceA = StringToAnsi (lpwp->wpBosProcessExecutionStateSetTemporary.pszService);
946
947          bos_ProcessExecutionState_t processState;
948          switch (lpwp->wpBosProcessExecutionStateSetTemporary.state)
949             {
950             case SERVICESTATE_STOPPING:
951             case SERVICESTATE_STOPPED:
952                processState = BOS_PROCESS_STOPPED;
953                break;
954             default:
955             case SERVICESTATE_STARTING:
956             case SERVICESTATE_RUNNING:
957                processState = BOS_PROCESS_RUNNING;
958                break;
959             }
960
961          if ((*lpBosProcessExecutionStateSetTemporary)(lpwp->wpBosProcessExecutionStateSetTemporary.hServer, pszServiceA, processState, &status))
962             status = 0;
963
964          FreeString (pszServiceA, lpwp->wpBosProcessExecutionStateSetTemporary.pszService);
965          break;
966          }
967
968       case wtaskBosProcessNameGetBegin:
969          {
970          if (!(*lpBosProcessNameGetBegin)(lpwp->wpBosProcessNameGetBegin.hServer, &lpwp->wpBosProcessNameGetBegin.hEnum, &status))
971             lpwp->wpBosProcessNameGetBegin.hEnum = 0;
972          else
973             status = 0;
974          break;
975          }
976
977       case wtaskBosProcessNameGetDone:
978          {
979          if ((*lpBosProcessNameGetDone)(lpwp->wpBosProcessNameGetDone.hEnum, &status))
980             status = 0;
981          break;
982          }
983
984       case wtaskBosProcessNameGetNext:
985          {
986          char szServiceA[ 256 ];
987          if (!(*lpBosProcessNameGetNext)(lpwp->wpBosProcessNameGetNext.hEnum, szServiceA, &status))
988             lpwp->wpBosProcessNameGetNext.pszService[0] = TEXT('\0');
989          else
990             {
991             status = 0;
992             CopyAnsiToString (lpwp->wpBosProcessNameGetNext.pszService, szServiceA);
993             }
994          break;
995          }
996
997       case wtaskBosProcessInfoGet:
998          {
999          LPSTR pszServiceA = StringToAnsi (lpwp->wpBosProcessInfoGet.pszService);
1000          memset (&lpwp->wpBosProcessInfoGet.ss, 0x00, sizeof(SERVICESTATUS));
1001
1002          bos_ProcessType_t processType;
1003          bos_ProcessInfo_t processInfo;
1004          if ((*lpBosProcessInfoGet)(lpwp->wpBosProcessInfoGet.hServer, pszServiceA, &processType, &processInfo, &status))
1005             {
1006             status = 0;
1007
1008             switch (processType)
1009                {
1010                case BOS_PROCESS_FS:
1011                   lpwp->wpBosProcessInfoGet.ss.type = SERVICETYPE_FS;
1012                   break;
1013                case BOS_PROCESS_SIMPLE:
1014                   lpwp->wpBosProcessInfoGet.ss.type = SERVICETYPE_SIMPLE;
1015                   break;
1016                case BOS_PROCESS_CRON:
1017                   lpwp->wpBosProcessInfoGet.ss.type = SERVICETYPE_CRON;
1018                   break;
1019                }
1020
1021             AfsClass_UnixTimeToSystemTime (&lpwp->wpBosProcessInfoGet.ss.timeLastStart, processInfo.processStartTime);
1022             AfsClass_UnixTimeToSystemTime (&lpwp->wpBosProcessInfoGet.ss.timeLastStop, processInfo.processExitTime);
1023             AfsClass_UnixTimeToSystemTime (&lpwp->wpBosProcessInfoGet.ss.timeLastFail, processInfo.processExitErrorTime);
1024             lpwp->wpBosProcessInfoGet.ss.nStarts = processInfo.numberProcessStarts;
1025             lpwp->wpBosProcessInfoGet.ss.dwErrLast = processInfo.processErrorCode;
1026             lpwp->wpBosProcessInfoGet.ss.dwSigLast = processInfo.processErrorSignal;
1027             }
1028
1029          FreeString (pszServiceA, lpwp->wpBosProcessInfoGet.pszService);
1030          break;
1031          }
1032
1033       case wtaskBosProcessParameterGetBegin:
1034          {
1035          LPSTR pszServiceA = StringToAnsi (lpwp->wpBosProcessParameterGetBegin.pszService);
1036
1037          if (!(*lpBosProcessParameterGetBegin)(lpwp->wpBosProcessParameterGetBegin.hServer, pszServiceA, &lpwp->wpBosProcessParameterGetBegin.hEnum, &status))
1038             lpwp->wpBosProcessParameterGetBegin.hEnum = 0;
1039          else
1040             status = 0;
1041
1042          FreeString (pszServiceA, lpwp->wpBosProcessParameterGetBegin.pszService);
1043          break;
1044          }
1045
1046       case wtaskBosProcessParameterGetDone:
1047          {
1048          if ((*lpBosProcessParameterGetDone)(lpwp->wpBosProcessParameterGetDone.hEnum, &status))
1049             status = 0;
1050          break;
1051          }
1052
1053       case wtaskBosProcessParameterGetNext:
1054          {
1055          char szParamA[ 1024 ];
1056
1057          if (!(*lpBosProcessParameterGetNext)(lpwp->wpBosProcessParameterGetNext.hEnum, szParamA, &status))
1058             lpwp->wpBosProcessParameterGetNext.pszParam[0] = TEXT('\0');
1059          else
1060             {
1061             status = 0;
1062             CopyAnsiToString (lpwp->wpBosProcessParameterGetNext.pszParam, szParamA);
1063             }
1064          break;
1065          }
1066
1067       case wtaskBosProcessNotifierGet:
1068          {
1069          LPSTR pszServiceA = StringToAnsi (lpwp->wpBosProcessNotifierGet.pszService);
1070          char szNotifierA[ 1024 ];
1071
1072          if ((*lpBosProcessNotifierGet)(lpwp->wpBosProcessNotifierGet.hServer, pszServiceA, szNotifierA, &status))
1073             {
1074             status = 0;
1075             CopyAnsiToString (lpwp->wpBosProcessNotifierGet.pszNotifier, szNotifierA);
1076             }
1077
1078          FreeString (pszServiceA, lpwp->wpBosProcessNotifierGet.pszService);
1079          break;
1080          }
1081
1082       case wtaskBosProcessRestart:
1083          {
1084          LPSTR pszServiceA = StringToAnsi (lpwp->wpBosProcessRestart.pszService);
1085          if ((*lpBosProcessRestart)(lpwp->wpBosProcessRestart.hServer, pszServiceA, &status))
1086             status = 0;
1087
1088          FreeString (pszServiceA, lpwp->wpBosProcessRestart.pszService);
1089          break;
1090          }
1091
1092       case wtaskBosProcessAllStop:
1093          {
1094          if ((*lpBosProcessAllStop)(lpwp->wpBosProcessAllStop.hServer, &status))
1095             status = 0;
1096          break;
1097          }
1098
1099       case wtaskBosProcessAllStart:
1100          {
1101          if ((*lpBosProcessAllStart)(lpwp->wpBosProcessAllStart.hServer, &status))
1102             status = 0;
1103          break;
1104          }
1105
1106       case wtaskBosProcessAllWaitStop:
1107          {
1108          if ((*lpBosProcessAllWaitStop)(lpwp->wpBosProcessAllWaitStop.hServer, &status))
1109             status = 0;
1110          break;
1111          }
1112
1113       case wtaskBosProcessAllStopAndRestart:
1114          {
1115          bos_RestartBosServer_t bBosToo;
1116          bBosToo = (lpwp->wpBosProcessAllStopAndRestart.fRestartBOS) ? BOS_RESTART_BOS_SERVER : BOS_DONT_RESTART_BOS_SERVER;
1117
1118          if ((*lpBosProcessAllStopAndRestart)(lpwp->wpBosProcessAllStopAndRestart.hServer, bBosToo, &status))
1119             status = 0;
1120          break;
1121          }
1122
1123       case wtaskBosAdminCreate:
1124          {
1125          LPSTR pszAdminA = StringToAnsi (lpwp->wpBosAdminCreate.pszAdmin);
1126          if ((*lpBosAdminCreate)(lpwp->wpBosAdminCreate.hServer, pszAdminA, &status))
1127             status = 0;
1128          FreeString (pszAdminA, lpwp->wpBosAdminCreate.pszAdmin);
1129          break;
1130          }
1131
1132       case wtaskBosAdminDelete:
1133          {
1134          LPSTR pszAdminA = StringToAnsi (lpwp->wpBosAdminDelete.pszAdmin);
1135          if ((*lpBosAdminDelete)(lpwp->wpBosAdminDelete.hServer, pszAdminA, &status))
1136             status = 0;
1137          FreeString (pszAdminA, lpwp->wpBosAdminDelete.pszAdmin);
1138          break;
1139          }
1140
1141       case wtaskBosAdminGetBegin:
1142          {
1143          if (!(*lpBosAdminGetBegin)(lpwp->wpBosAdminGetBegin.hServer, &lpwp->wpBosAdminGetBegin.hEnum, &status))
1144             lpwp->wpBosAdminGetBegin.hEnum = 0;
1145          else
1146             status = 0;
1147          break;
1148          }
1149
1150       case wtaskBosAdminGetDone:
1151          {
1152          if ((*lpBosAdminGetDone)(lpwp->wpBosAdminGetDone.hEnum, &status))
1153             status = 0;
1154          break;
1155          }
1156
1157       case wtaskBosAdminGetNext:
1158          {
1159          char szAdminA[ 1024 ];
1160          if (!(*lpBosAdminGetNext)(lpwp->wpBosAdminGetNext.hEnum, szAdminA, &status))
1161             lpwp->wpBosAdminGetNext.pszAdmin[0] = TEXT('\0');
1162          else
1163             {
1164             status = 0;
1165             CopyAnsiToString (lpwp->wpBosAdminGetNext.pszAdmin, szAdminA);
1166             }
1167          break;
1168          }
1169
1170       case wtaskBosKeyCreate:
1171          {
1172          kas_encryptionKey_t key;
1173          memcpy (key.key, lpwp->wpBosKeyCreate.key.key, ENCRYPTIONKEY_LEN);
1174
1175          if ((*lpBosKeyCreate)(lpwp->wpBosKeyCreate.hServer, lpwp->wpBosKeyCreate.keyVersion, &key, &status))
1176             status = 0;
1177          break;
1178          }
1179
1180       case wtaskBosKeyDelete:
1181          {
1182          if ((*lpBosKeyDelete)(lpwp->wpBosKeyDelete.hServer, lpwp->wpBosKeyDelete.keyVersion, &status))
1183             status = 0;
1184          break;
1185          }
1186
1187       case wtaskBosKeyGetBegin:
1188          {
1189          if (!(*lpBosKeyGetBegin)(lpwp->wpBosKeyGetBegin.hServer, &lpwp->wpBosKeyGetBegin.hEnum, &status))
1190             lpwp->wpBosKeyGetBegin.hEnum = 0;
1191          else
1192             status = 0;
1193          break;
1194          }
1195
1196       case wtaskBosKeyGetDone:
1197          {
1198          if ((*lpBosKeyGetDone)(lpwp->wpBosKeyGetDone.hEnum, &status))
1199             status = 0;
1200          break;
1201          }
1202
1203       case wtaskBosKeyGetNext:
1204          {
1205          bos_KeyInfo_t keyInfo;
1206
1207          if ((*lpBosKeyGetNext)(lpwp->wpBosKeyGetNext.hEnum, &keyInfo, &status))
1208             {
1209             status = 0;
1210             lpwp->wpBosKeyGetNext.keyVersion = keyInfo.keyVersionNumber;
1211             memcpy (lpwp->wpBosKeyGetNext.keyData.key, keyInfo.key.key, ENCRYPTIONKEY_LEN);
1212             AfsClass_UnixTimeToSystemTime (&lpwp->wpBosKeyGetNext.keyInfo.timeLastModification, keyInfo.keyStatus.lastModificationDate);
1213             lpwp->wpBosKeyGetNext.keyInfo.timeLastModification.wMilliseconds = keyInfo.keyStatus.lastModificationMicroSeconds;
1214             lpwp->wpBosKeyGetNext.keyInfo.dwChecksum = (DWORD)keyInfo.keyStatus.checkSum;
1215             }
1216          break;
1217          }
1218
1219       case wtaskBosCellSet:
1220          {
1221          LPSTR pszCellA = StringToAnsi (lpwp->wpBosCellSet.pszCell);
1222          if ((*lpBosCellSet)(lpwp->wpBosCellSet.hServer, pszCellA, &status))
1223             status = 0;
1224          FreeString (pszCellA, lpwp->wpBosCellSet.pszCell);
1225          break;
1226          }
1227
1228       case wtaskBosCellGet:
1229          {
1230          char szCellA[ 256 ];
1231          if ((*lpBosCellGet)(lpwp->wpBosCellGet.hServer, szCellA, &status))
1232             {
1233             status = 0;
1234             CopyAnsiToString (lpwp->wpBosCellGet.pszCell, szCellA);
1235             }
1236          break;
1237          }
1238
1239       case wtaskBosHostCreate:
1240          {
1241          LPSTR pszServerA = StringToAnsi (lpwp->wpBosHostCreate.pszServer);
1242          if ((*lpBosHostCreate)(lpwp->wpBosHostCreate.hServer, pszServerA, &status))
1243             status = 0;
1244          FreeString (pszServerA, lpwp->wpBosHostCreate.pszServer);
1245          break;
1246          }
1247
1248       case wtaskBosHostDelete:
1249          {
1250          LPSTR pszServerA = StringToAnsi (lpwp->wpBosHostDelete.pszServer);
1251          if ((*lpBosHostDelete)(lpwp->wpBosHostDelete.hServer, pszServerA, &status))
1252             status = 0;
1253          FreeString (pszServerA, lpwp->wpBosHostDelete.pszServer);
1254          break;
1255          }
1256
1257       case wtaskBosHostGetBegin:
1258          {
1259          if (!(*lpBosHostGetBegin)(lpwp->wpBosHostGetBegin.hServer, &lpwp->wpBosHostGetBegin.hEnum, &status))
1260             lpwp->wpBosHostGetBegin.hEnum = 0;
1261          else
1262             status = 0;
1263          break;
1264          }
1265
1266       case wtaskBosHostGetDone:
1267          {
1268          if ((*lpBosHostGetDone)(lpwp->wpBosHostGetDone.hEnum, &status))
1269             status = 0;
1270          break;
1271          }
1272
1273       case wtaskBosHostGetNext:
1274          {
1275          char szServerA[ 256 ];
1276          if (!(*lpBosHostGetNext)(lpwp->wpBosHostGetNext.hEnum, szServerA, &status))
1277             lpwp->wpBosHostGetNext.pszServer[0] = TEXT('\0');
1278          else
1279             {
1280             status = 0;
1281             CopyAnsiToString (lpwp->wpBosHostGetNext.pszServer, szServerA);
1282             }
1283          break;
1284          }
1285
1286       case wtaskBosExecutableCreate:
1287          {
1288          LPSTR pszLocalA = StringToAnsi (lpwp->wpBosExecutableCreate.pszLocal);
1289          LPSTR pszRemoteDirA = StringToAnsi (lpwp->wpBosExecutableCreate.pszRemoteDir);
1290
1291          if ((*lpBosExecutableCreate)(lpwp->wpBosExecutableCreate.hServer, pszLocalA, pszRemoteDirA, &status))
1292             status = 0;
1293
1294          FreeString (pszRemoteDirA, lpwp->wpBosExecutableCreate.pszRemoteDir);
1295          FreeString (pszLocalA, lpwp->wpBosExecutableCreate.pszLocal);
1296          break;
1297          }
1298
1299       case wtaskBosExecutableRevert:
1300          {
1301          LPSTR pszFilenameA = StringToAnsi (lpwp->wpBosExecutableRevert.pszFilename);
1302
1303          if ((*lpBosExecutableRevert)(lpwp->wpBosExecutableRevert.hServer, pszFilenameA, &status))
1304             status = 0;
1305
1306          FreeString (pszFilenameA, lpwp->wpBosExecutableRevert.pszFilename);
1307          break;
1308          }
1309
1310       case wtaskBosExecutableTimestampGet:
1311          {
1312          LPSTR pszFilenameA = StringToAnsi (lpwp->wpBosExecutableTimestampGet.pszFilename);
1313
1314          unsigned long timeNew = 0;
1315          unsigned long timeOld = 0;
1316          unsigned long timeBak = 0;
1317          if ((*lpBosExecutableTimestampGet)(lpwp->wpBosExecutableTimestampGet.hServer, pszFilenameA, &timeNew, &timeOld, &timeBak, &status))
1318             {
1319             status = 0;
1320             AfsClass_UnixTimeToSystemTime (&lpwp->wpBosExecutableTimestampGet.timeNew, timeNew);
1321             AfsClass_UnixTimeToSystemTime (&lpwp->wpBosExecutableTimestampGet.timeOld, timeOld);
1322             AfsClass_UnixTimeToSystemTime (&lpwp->wpBosExecutableTimestampGet.timeBak, timeBak);
1323             }
1324
1325          FreeString (pszFilenameA, lpwp->wpBosExecutableTimestampGet.pszFilename);
1326          break;
1327          }
1328
1329       case wtaskBosExecutablePrune:
1330          {
1331          bos_Prune_t oldFiles = (lpwp->wpBosExecutablePrune.fPruneOld) ? BOS_PRUNE : BOS_DONT_PRUNE;
1332          bos_Prune_t bakFiles = (lpwp->wpBosExecutablePrune.fPruneBak) ? BOS_PRUNE : BOS_DONT_PRUNE;
1333          bos_Prune_t coreFiles = (lpwp->wpBosExecutablePrune.fPruneCore) ? BOS_PRUNE : BOS_DONT_PRUNE;
1334
1335          if ((*lpBosExecutablePrune)(lpwp->wpBosExecutablePrune.hServer, oldFiles, bakFiles, coreFiles, &status))
1336             status = 0;
1337          break;
1338          }
1339
1340       case wtaskBosExecutableRestartTimeSet:
1341          {
1342          bos_RestartTime_t time;
1343          AfsClass_SystemTimeToRestartTime (&time, lpwp->wpBosExecutableRestartTimeSet.fWeeklyRestart, &lpwp->wpBosExecutableRestartTimeSet.timeWeekly);
1344          if ((*lpBosExecutableRestartTimeSet)(lpwp->wpBosExecutableRestartTimeSet.hServer, BOS_RESTART_WEEKLY, time, &status))
1345             {
1346             AfsClass_SystemTimeToRestartTime (&time, lpwp->wpBosExecutableRestartTimeSet.fDailyRestart, &lpwp->wpBosExecutableRestartTimeSet.timeDaily);
1347             if ((*lpBosExecutableRestartTimeSet)(lpwp->wpBosExecutableRestartTimeSet.hServer, BOS_RESTART_DAILY, time, &status))
1348                status = 0;
1349             }
1350          break;
1351          }
1352
1353       case wtaskBosExecutableRestartTimeGet:
1354          {
1355          lpwp->wpBosExecutableRestartTimeGet.fDailyRestart = FALSE;
1356          lpwp->wpBosExecutableRestartTimeGet.fWeeklyRestart = FALSE;
1357
1358          bos_RestartTime_t time;
1359          if ((*lpBosExecutableRestartTimeGet)(lpwp->wpBosExecutableRestartTimeGet.hServer, BOS_RESTART_WEEKLY, &time, &status))
1360             {
1361             AfsClass_RestartTimeToSystemTime (&lpwp->wpBosExecutableRestartTimeGet.fWeeklyRestart, &lpwp->wpBosExecutableRestartTimeGet.timeWeekly, &time);
1362
1363             if ((*lpBosExecutableRestartTimeGet)(lpwp->wpBosExecutableRestartTimeGet.hServer, BOS_RESTART_DAILY, &time, &status))
1364                {
1365                AfsClass_RestartTimeToSystemTime (&lpwp->wpBosExecutableRestartTimeGet.fDailyRestart, &lpwp->wpBosExecutableRestartTimeGet.timeDaily, &time);
1366                status = 0;
1367                }
1368             }
1369          break;
1370          }
1371
1372       case wtaskBosLogGet:
1373          {
1374          LPSTR pszLogNameA = StringToAnsi (lpwp->wpBosLogGet.pszLogName);
1375
1376          LPSTR pszLogDataA = NULL;
1377          unsigned long cchAllocated = 0;
1378          unsigned long cchRequired = 1024;
1379
1380          do {
1381             if (cchAllocated < cchRequired)
1382                {
1383                if (pszLogDataA)
1384                   {
1385                   FreeString (pszLogDataA);
1386                   pszLogDataA = NULL;
1387                   }
1388                if ((pszLogDataA = AllocateAnsi (cchRequired)) == 0)
1389                   break;
1390                cchAllocated = cchRequired;
1391                }
1392
1393             cchRequired = cchAllocated;
1394             if ((*lpBosLogGet)(lpwp->wpBosLogGet.hServer, pszLogNameA, &cchRequired, pszLogDataA, &status))
1395                {
1396                lpwp->wpBosLogGet.pszLogData = AllocateString (cchRequired+1);
1397                CopyAnsiToString (lpwp->wpBosLogGet.pszLogData, pszLogDataA, cchRequired);
1398                lpwp->wpBosLogGet.pszLogData[ cchRequired ] = TEXT('\0');
1399                status = 0;
1400                break;
1401                }
1402             } while (cchRequired > cchAllocated);
1403
1404          if (pszLogDataA)
1405             FreeString (pszLogDataA);
1406          FreeString (pszLogNameA, lpwp->wpBosLogGet.pszLogName);
1407          break;
1408          }
1409
1410       case wtaskBosAuthSet:
1411          {
1412          bos_Auth_t auth = (lpwp->wpBosAuthSet.fEnableAuth) ? BOS_AUTH_REQUIRED : BOS_NO_AUTH;
1413          if ((*lpBosAuthSet)(lpwp->wpBosAuthSet.hServer, auth, &status))
1414             status = 0;
1415          break;
1416          }
1417
1418       case wtaskBosCommandExecute:
1419          {
1420          LPSTR pszCommandA = StringToAnsi (lpwp->wpBosCommandExecute.pszCommand);
1421          if ((*lpBosCommandExecute)(lpwp->wpBosCommandExecute.hServer, pszCommandA, &status))
1422             status = 0;
1423          FreeString (pszCommandA, lpwp->wpBosCommandExecute.pszCommand);
1424          break;
1425          }
1426
1427       case wtaskBosSalvage:
1428          {
1429          LPSTR pszAggregateA = StringToAnsi (lpwp->wpBosSalvage.pszAggregate);
1430          LPSTR pszFilesetA = StringToAnsi (lpwp->wpBosSalvage.pszFileset);
1431          LPSTR pszTempDirA = StringToAnsi (lpwp->wpBosSalvage.pszTempDir);
1432          LPSTR pszLogFileA = StringToAnsi (lpwp->wpBosSalvage.pszLogFile);
1433
1434          vos_force_t force = (lpwp->wpBosSalvage.fForce) ? VOS_FORCE : VOS_NORMAL;
1435          bos_SalvageDamagedVolumes_t salvageDamagedVolumes = (lpwp->wpBosSalvage.fReadonly) ? BOS_DONT_SALVAGE_DAMAGED_VOLUMES : BOS_SALVAGE_DAMAGED_VOLUMES;
1436          bos_WriteInodes_t writeInodes = (lpwp->wpBosSalvage.fLogInodes) ? BOS_SALVAGE_WRITE_INODES : BOS_SALVAGE_DONT_WRITE_INODES;
1437          bos_WriteRootInodes_t writeRootInodes = (lpwp->wpBosSalvage.fLogRootInodes) ? BOS_SALVAGE_WRITE_ROOT_INODES : BOS_SALVAGE_DONT_WRITE_ROOT_INODES;
1438          bos_ForceDirectory_t forceDirectory = (lpwp->wpBosSalvage.fRebuildDirs) ? BOS_SALVAGE_FORCE_DIRECTORIES : BOS_SALVAGE_DONT_FORCE_DIRECTORIES;
1439          bos_ForceBlockRead_t forceBlockRead = (lpwp->wpBosSalvage.fReadBlocks) ? BOS_SALVAGE_FORCE_BLOCK_READS : BOS_SALVAGE_DONT_FORCE_BLOCK_READS;
1440
1441          if ((*lpBosSalvage)(lpwp->wpBosSalvage.hCell, lpwp->wpBosSalvage.hServer, pszAggregateA, pszFilesetA, max(lpwp->wpBosSalvage.nProcesses,1), pszTempDirA, pszLogFileA, force, salvageDamagedVolumes, writeInodes, writeRootInodes, forceDirectory, forceBlockRead, &status))
1442              status = 0;
1443
1444          FreeString (pszLogFileA, lpwp->wpBosSalvage.pszLogFile);
1445          FreeString (pszTempDirA, lpwp->wpBosSalvage.pszTempDir);
1446          FreeString (pszFilesetA, lpwp->wpBosSalvage.pszFileset);
1447          FreeString (pszAggregateA, lpwp->wpBosSalvage.pszAggregate);
1448          break;
1449          }
1450
1451       case wtaskKasServerOpen:
1452          {
1453          if ((*lpKasServerOpen)(lpwp->wpKasServerOpen.hCell, (const char **)lpwp->wpKasServerOpen.apszServers, &lpwp->wpKasServerOpen.hServer, &status))
1454             status = 0;
1455          break;
1456          }
1457
1458       case wtaskKasServerClose:
1459          {
1460          if ((*lpKasServerClose)(lpwp->wpKasServerClose.hServer, &status))
1461             status = 0;
1462          break;
1463          }
1464
1465       case wtaskKasServerRandomKeyGet:
1466          {
1467          kas_encryptionKey_t key;
1468          if ((*lpKasServerRandomKeyGet)(lpwp->wpKasServerRandomKeyGet.hCell, lpwp->wpKasServerRandomKeyGet.hServer, &key, &status))
1469             {
1470             status = 0;
1471             memcpy (&lpwp->wpKasServerRandomKeyGet.key.key, &key.key, ENCRYPTIONKEY_LEN);
1472             }
1473          break;
1474          }
1475
1476       case wtaskKasStringToKey:
1477          {
1478          LPSTR pszCellA = StringToAnsi (lpwp->wpKasStringToKey.pszCell);
1479          LPSTR pszStringA = StringToAnsi (lpwp->wpKasStringToKey.pszString);
1480
1481          kas_encryptionKey_t key;
1482          if ((*lpKasStringToKey)(pszCellA, pszStringA, &key, &status))
1483             {
1484             status = 0;
1485             memcpy (&lpwp->wpKasStringToKey.key.key, &key.key, ENCRYPTIONKEY_LEN);
1486             }
1487
1488          FreeString (pszStringA, lpwp->wpKasStringToKey.pszString);
1489          FreeString (pszCellA, lpwp->wpKasStringToKey.pszCell);
1490          break;
1491          }
1492
1493       case wtaskKasPrincipalCreate:
1494          {
1495          kas_identity_t Identity;
1496          CopyStringToAnsi (Identity.principal, lpwp->wpKasPrincipalCreate.pszPrincipal);
1497          CopyStringToAnsi (Identity.instance, lpwp->wpKasPrincipalCreate.pszInstance);
1498
1499          LPSTR pszPasswordA = StringToAnsi (lpwp->wpKasPrincipalCreate.pszPassword);
1500
1501          if ((*lpKasPrincipalCreate)(lpwp->wpKasPrincipalCreate.hCell, lpwp->wpKasPrincipalCreate.hServer, &Identity, pszPasswordA, &status))
1502             status = 0;
1503
1504          FreeString (pszPasswordA, lpwp->wpKasPrincipalCreate.pszPassword);
1505          break;
1506          }
1507
1508       case wtaskKasPrincipalDelete:
1509          {
1510          kas_identity_t Identity;
1511          CopyStringToAnsi (Identity.principal, lpwp->wpKasPrincipalDelete.pszPrincipal);
1512          CopyStringToAnsi (Identity.instance, lpwp->wpKasPrincipalDelete.pszInstance);
1513
1514          if ((*lpKasPrincipalDelete)(lpwp->wpKasPrincipalDelete.hCell, lpwp->wpKasPrincipalDelete.hServer, &Identity, &status))
1515             status = 0;
1516          break;
1517          }
1518
1519       case wtaskKasPrincipalGet:
1520          {
1521          kas_identity_t Identity;
1522          CopyStringToAnsi (Identity.principal, lpwp->wpKasPrincipalGet.pszPrincipal);
1523          CopyStringToAnsi (Identity.instance, lpwp->wpKasPrincipalGet.pszInstance);
1524
1525          if ((*lpKasPrincipalGet)(lpwp->wpKasPrincipalGet.hCell, lpwp->wpKasPrincipalGet.hServer, &Identity, &lpwp->wpKasPrincipalGet.Data, &status))
1526             status = 0;
1527          break;
1528          }
1529
1530       case wtaskKasPrincipalGetBegin:
1531          {
1532          if ((*lpKasPrincipalGetBegin)(lpwp->wpKasPrincipalGetBegin.hCell, lpwp->wpKasPrincipalGetBegin.hServer, &lpwp->wpKasPrincipalGetBegin.hEnum, &status))
1533             status = 0;
1534          break;
1535          }
1536
1537       case wtaskKasPrincipalGetNext:
1538          {
1539          kas_identity_t Identity;
1540          if ((*lpKasPrincipalGetNext)(lpwp->wpKasPrincipalGetNext.hEnum, &Identity, &status))
1541             {
1542             CopyAnsiToString (lpwp->wpKasPrincipalGetNext.pszPrincipal, Identity.principal);
1543             CopyAnsiToString (lpwp->wpKasPrincipalGetNext.pszInstance, Identity.instance);
1544             status = 0;
1545             }
1546          break;
1547          }
1548
1549       case wtaskKasPrincipalGetDone:
1550          {
1551          if ((*lpKasPrincipalGetDone)(lpwp->wpKasPrincipalGetDone.hEnum, &status))
1552             status = 0;
1553          break;
1554          }
1555
1556       case wtaskKasPrincipalKeySet:
1557          {
1558          kas_identity_t Identity;
1559          CopyStringToAnsi (Identity.principal, lpwp->wpKasPrincipalKeySet.pszPrincipal);
1560          CopyStringToAnsi (Identity.instance, lpwp->wpKasPrincipalKeySet.pszInstance);
1561
1562          kas_encryptionKey_t Key;
1563          memcpy (&Key.key, &lpwp->wpKasPrincipalKeySet.key, ENCRYPTIONKEY_LEN);
1564
1565          if ((*lpKasPrincipalKeySet)(lpwp->wpKasPrincipalKeySet.hCell, lpwp->wpKasPrincipalKeySet.hServer, &Identity, lpwp->wpKasPrincipalKeySet.keyVersion, &Key, &status))
1566             status = 0;
1567          break;
1568          }
1569
1570       case wtaskKasPrincipalLockStatusGet:
1571          {
1572          kas_identity_t Identity;
1573          CopyStringToAnsi (Identity.principal, lpwp->wpKasPrincipalLockStatusGet.pszPrincipal);
1574          CopyStringToAnsi (Identity.instance, lpwp->wpKasPrincipalLockStatusGet.pszInstance);
1575
1576          unsigned long date;
1577          if ((*lpKasPrincipalLockStatusGet)(lpwp->wpKasPrincipalLockStatusGet.hCell, lpwp->wpKasPrincipalLockStatusGet.hServer, &Identity, &date, &status))
1578             {
1579             AfsClass_UnixTimeToSystemTime (&lpwp->wpKasPrincipalLockStatusGet.timeUnlocked, date);
1580             status = 0;
1581             }
1582          break;
1583          }
1584
1585       case wtaskKasPrincipalUnlock:
1586          {
1587          kas_identity_t Identity;
1588          CopyStringToAnsi (Identity.principal, lpwp->wpKasPrincipalUnlock.pszPrincipal);
1589          CopyStringToAnsi (Identity.instance, lpwp->wpKasPrincipalUnlock.pszInstance);
1590
1591          if ((*lpKasPrincipalUnlock)(lpwp->wpKasPrincipalUnlock.hCell, lpwp->wpKasPrincipalUnlock.hServer, &Identity, &status))
1592             status = 0;
1593          break;
1594          }
1595
1596       case wtaskKasPrincipalFieldsSet:
1597          {
1598          kas_identity_t Identity;
1599          CopyStringToAnsi (Identity.principal, lpwp->wpKasPrincipalFieldsSet.pszPrincipal);
1600          CopyStringToAnsi (Identity.instance, lpwp->wpKasPrincipalFieldsSet.pszInstance);
1601
1602          ULONG timeExpires = AfsClass_SystemTimeToUnixTime (&lpwp->wpKasPrincipalFieldsSet.timeExpires);
1603          if (!timeExpires) // account never expires?
1604             timeExpires = (ULONG)-1;
1605
1606          kas_admin_t isAdmin = (lpwp->wpKasPrincipalFieldsSet.fIsAdmin) ? KAS_ADMIN : NO_KAS_ADMIN;
1607          kas_tgs_t grantTickets = (lpwp->wpKasPrincipalFieldsSet.fGrantTickets) ? TGS : NO_TGS;
1608          kas_enc_t canEncrypt = (lpwp->wpKasPrincipalFieldsSet.fCanEncrypt) ? ENCRYPT : NO_ENCRYPT;
1609          kas_cpw_t canChangePassword = (lpwp->wpKasPrincipalFieldsSet.fCanChangePassword) ? CHANGE_PASSWORD : NO_CHANGE_PASSWORD;
1610          kas_rpw_t passwordReuse = (lpwp->wpKasPrincipalFieldsSet.fCanReusePasswords) ? REUSE_PASSWORD : NO_REUSE_PASSWORD;
1611
1612          if ((*lpKasPrincipalFieldsSet)(lpwp->wpKasPrincipalFieldsSet.hCell, lpwp->wpKasPrincipalFieldsSet.hServer, &Identity,
1613                 &isAdmin,
1614                 &grantTickets,
1615                 &canEncrypt,
1616                 &canChangePassword,
1617                 (unsigned int *)&timeExpires,
1618                 (unsigned int *)&lpwp->wpKasPrincipalFieldsSet.csecTicketLifetime,
1619                 (unsigned int *)&lpwp->wpKasPrincipalFieldsSet.cdayPwExpires,
1620                 &passwordReuse,
1621                 (unsigned int *)&lpwp->wpKasPrincipalFieldsSet.nFailureAttempts,
1622                 (unsigned int *)&lpwp->wpKasPrincipalFieldsSet.csecFailedLoginLockTime,
1623                 &status))
1624             {
1625             status = 0;
1626             }
1627          break;
1628          }
1629
1630       case wtaskPtsGroupMemberAdd:
1631          {
1632          LPSTR pszGroupA = StringToAnsi (lpwp->wpPtsGroupMemberAdd.pszGroup);
1633          LPSTR pszUserA = StringToAnsi (lpwp->wpPtsGroupMemberAdd.pszUser);
1634
1635          if ((*lpPtsGroupMemberAdd)(lpwp->wpPtsGroupMemberAdd.hCell, pszUserA, pszGroupA, &status))
1636             status = 0;
1637
1638          FreeString (pszGroupA, lpwp->wpPtsGroupMemberAdd.pszGroup);
1639          FreeString (pszUserA, lpwp->wpPtsGroupMemberAdd.pszUser);
1640          break;
1641          }
1642
1643       case wtaskPtsGroupOwnerChange:
1644          {
1645          LPSTR pszGroupA = StringToAnsi (lpwp->wpPtsGroupOwnerChange.pszGroup);
1646          LPSTR pszOwnerA = StringToAnsi (lpwp->wpPtsGroupOwnerChange.pszOwner);
1647
1648          if ((*lpPtsGroupOwnerChange)(lpwp->wpPtsGroupOwnerChange.hCell, pszGroupA, pszOwnerA, &status))
1649             status = 0;
1650
1651          FreeString (pszOwnerA, lpwp->wpPtsGroupOwnerChange.pszOwner);
1652          FreeString (pszGroupA, lpwp->wpPtsGroupOwnerChange.pszGroup);
1653          break;
1654          }
1655
1656       case wtaskPtsGroupCreate:
1657          {
1658          LPSTR pszGroupA = StringToAnsi (lpwp->wpPtsGroupCreate.pszGroup);
1659          LPSTR pszOwnerA = StringToAnsi (lpwp->wpPtsGroupCreate.pszOwner);
1660
1661          if ((*lpPtsGroupCreate)(lpwp->wpPtsGroupCreate.hCell, pszGroupA, pszOwnerA, &lpwp->wpPtsGroupCreate.idGroup, &status))
1662             status = 0;
1663
1664          FreeString (pszOwnerA, lpwp->wpPtsGroupCreate.pszOwner);
1665          FreeString (pszGroupA, lpwp->wpPtsGroupCreate.pszGroup);
1666          break;
1667          }
1668
1669       case wtaskPtsGroupGet:
1670          {
1671          LPSTR pszGroupA = StringToAnsi (lpwp->wpPtsGroupGet.pszGroup);
1672
1673          if ((*lpPtsGroupGet)(lpwp->wpPtsGroupGet.hCell, pszGroupA, &lpwp->wpPtsGroupGet.Entry, &status))
1674             status = 0;
1675
1676          FreeString (pszGroupA, lpwp->wpPtsGroupGet.pszGroup);
1677          break;
1678          }
1679
1680       case wtaskPtsGroupDelete:
1681          {
1682          LPSTR pszGroupA = StringToAnsi (lpwp->wpPtsGroupDelete.pszGroup);
1683
1684          if ((*lpPtsGroupDelete)(lpwp->wpPtsGroupDelete.hCell, pszGroupA, &status))
1685             status = 0;
1686
1687          FreeString (pszGroupA, lpwp->wpPtsGroupDelete.pszGroup);
1688          break;
1689          }
1690
1691       case wtaskPtsGroupMaxGet:
1692          {
1693          if ((*lpPtsGroupMaxGet)(lpwp->wpPtsGroupMaxGet.hCell, &lpwp->wpPtsGroupMaxGet.idGroupMax, &status))
1694             status = 0;
1695          break;
1696          }
1697
1698       case wtaskPtsGroupMaxSet:
1699          {
1700          if ((*lpPtsGroupMaxSet)(lpwp->wpPtsGroupMaxSet.hCell, lpwp->wpPtsGroupMaxSet.idGroupMax, &status))
1701             status = 0;
1702          break;
1703          }
1704
1705       case wtaskPtsGroupMemberListBegin:
1706          {
1707          LPSTR pszGroupA = StringToAnsi (lpwp->wpPtsGroupMemberListBegin.pszGroup);
1708
1709          if ((*lpPtsGroupMemberListBegin)(lpwp->wpPtsGroupMemberListBegin.hCell, pszGroupA, &lpwp->wpPtsGroupMemberListBegin.hEnum, &status))
1710             status = 0;
1711
1712          FreeString (pszGroupA, lpwp->wpPtsGroupMemberListBegin.pszGroup);
1713          break;
1714          }
1715
1716       case wtaskPtsGroupMemberListNext:
1717          {
1718          char szMemberA[ cchNAME ];
1719          if ((*lpPtsGroupMemberListNext)(lpwp->wpPtsGroupMemberListNext.hEnum, szMemberA, &status))
1720             {
1721             CopyAnsiToString (lpwp->wpPtsGroupMemberListNext.pszMember, szMemberA);
1722             status = 0;
1723             }
1724          break;
1725          }
1726
1727       case wtaskPtsGroupMemberListDone:
1728          {
1729          if ((*lpPtsGroupMemberListDone)(lpwp->wpPtsGroupMemberListDone.hEnum, &status))
1730             status = 0;
1731          break;
1732          }
1733
1734       case wtaskPtsGroupMemberRemove:
1735          {
1736          LPSTR pszGroupA = StringToAnsi (lpwp->wpPtsGroupMemberRemove.pszGroup);
1737          LPSTR pszUserA = StringToAnsi (lpwp->wpPtsGroupMemberRemove.pszUser);
1738
1739          if ((*lpPtsGroupMemberRemove)(lpwp->wpPtsGroupMemberRemove.hCell, pszUserA, pszGroupA, &status))
1740             status = 0;
1741
1742          FreeString (pszUserA, lpwp->wpPtsGroupMemberRemove.pszUser);
1743          FreeString (pszGroupA, lpwp->wpPtsGroupMemberRemove.pszGroup);
1744          break;
1745          }
1746
1747       case wtaskPtsGroupRename:
1748          {
1749          LPSTR pszGroupA = StringToAnsi (lpwp->wpPtsGroupRename.pszGroup);
1750          LPSTR pszNewNameA = StringToAnsi (lpwp->wpPtsGroupRename.pszNewName);
1751
1752          if ((*lpPtsGroupRename)(lpwp->wpPtsGroupRename.hCell, pszGroupA, pszNewNameA, &status))
1753             status = 0;
1754
1755          FreeString (pszNewNameA, lpwp->wpPtsGroupRename.pszNewName);
1756          FreeString (pszGroupA, lpwp->wpPtsGroupRename.pszGroup);
1757          break;
1758          }
1759
1760       case wtaskPtsGroupModify:
1761          {
1762          LPSTR pszGroupA = StringToAnsi (lpwp->wpPtsGroupModify.pszGroup);
1763
1764          if ((*lpPtsGroupModify)(lpwp->wpPtsGroupModify.hCell, pszGroupA, &lpwp->wpPtsGroupModify.Delta, &status))
1765             status = 0;
1766
1767          FreeString (pszGroupA, lpwp->wpPtsGroupModify.pszGroup);
1768          break;
1769          }
1770
1771       case wtaskPtsUserCreate:
1772          {
1773          LPSTR pszUserA = StringToAnsi (lpwp->wpPtsUserCreate.pszUser);
1774
1775          if ((*lpPtsUserCreate)(lpwp->wpPtsUserCreate.hCell, pszUserA, &lpwp->wpPtsUserCreate.idUser, &status))
1776             status = 0;
1777
1778          FreeString (pszUserA, lpwp->wpPtsUserCreate.pszUser);
1779          break;
1780          }
1781
1782       case wtaskPtsUserDelete:
1783          {
1784          LPSTR pszUserA = StringToAnsi (lpwp->wpPtsUserDelete.pszUser);
1785
1786          if ((*lpPtsUserDelete)(lpwp->wpPtsUserDelete.hCell, pszUserA, &status))
1787             status = 0;
1788
1789          FreeString (pszUserA, lpwp->wpPtsUserDelete.pszUser);
1790          break;
1791          }
1792
1793       case wtaskPtsUserGet:
1794          {
1795          LPSTR pszUserA = StringToAnsi (lpwp->wpPtsUserGet.pszUser);
1796
1797          if ((*lpPtsUserGet)(lpwp->wpPtsUserGet.hCell, pszUserA, &lpwp->wpPtsUserGet.Entry, &status))
1798             status = 0;
1799
1800          FreeString (pszUserA, lpwp->wpPtsUserGet.pszUser);
1801          break;
1802          }
1803
1804       case wtaskPtsUserRename:
1805          {
1806          LPSTR pszUserA = StringToAnsi (lpwp->wpPtsUserRename.pszUser);
1807          LPSTR pszNewNameA = StringToAnsi (lpwp->wpPtsUserRename.pszNewName);
1808
1809          if ((*lpPtsUserRename)(lpwp->wpPtsUserRename.hCell, pszUserA, pszNewNameA, &status))
1810             status = 0;
1811
1812          FreeString (pszNewNameA, lpwp->wpPtsUserRename.pszNewName);
1813          FreeString (pszUserA, lpwp->wpPtsUserRename.pszUser);
1814          break;
1815          }
1816
1817       case wtaskPtsUserModify:
1818          {
1819          LPSTR pszUserA = StringToAnsi (lpwp->wpPtsUserModify.pszUser);
1820
1821          if ((*lpPtsUserModify)(lpwp->wpPtsUserModify.hCell, pszUserA, &lpwp->wpPtsUserModify.Delta, &status))
1822             status = 0;
1823
1824          FreeString (pszUserA, lpwp->wpPtsUserModify.pszUser);
1825          break;
1826          }
1827
1828       case wtaskPtsUserMaxGet:
1829          {
1830          if ((*lpPtsUserMaxGet)(lpwp->wpPtsUserMaxGet.hCell, &lpwp->wpPtsUserMaxGet.idUserMax, &status))
1831             status = 0;
1832          break;
1833          }
1834
1835       case wtaskPtsUserMaxSet:
1836          {
1837          if ((*lpPtsUserMaxSet)(lpwp->wpPtsUserMaxSet.hCell, lpwp->wpPtsUserMaxSet.idUserMax, &status))
1838             status = 0;
1839          break;
1840          }
1841
1842       case wtaskPtsUserMemberListBegin:
1843          {
1844          LPSTR pszUserA = StringToAnsi (lpwp->wpPtsUserMemberListBegin.pszUser);
1845
1846          if ((*lpPtsUserMemberListBegin)(lpwp->wpPtsUserMemberListBegin.hCell, pszUserA, &lpwp->wpPtsUserMemberListBegin.hEnum, &status))
1847             status = 0;
1848
1849          FreeString (pszUserA, lpwp->wpPtsUserMemberListBegin.pszUser);
1850          break;
1851          }
1852
1853       case wtaskPtsUserMemberListNext:
1854          {
1855          char szGroupA[ cchNAME ];
1856          if ((*lpPtsUserMemberListNext)(lpwp->wpPtsUserMemberListNext.hEnum, szGroupA, &status))
1857             {
1858             CopyAnsiToString (lpwp->wpPtsUserMemberListNext.pszGroup, szGroupA);
1859             status = 0;
1860             }
1861          break;
1862          }
1863
1864       case wtaskPtsUserMemberListDone:
1865          {
1866          if ((*lpPtsUserMemberListDone)(lpwp->wpPtsUserMemberListDone.hEnum, &status))
1867             status = 0;
1868          break;
1869          }
1870
1871       case wtaskPtsOwnedGroupListBegin:
1872          {
1873          LPSTR pszOwnerA = StringToAnsi (lpwp->wpPtsOwnedGroupListBegin.pszOwner);
1874
1875          if ((*lpPtsOwnedGroupListBegin)(lpwp->wpPtsOwnedGroupListBegin.hCell, pszOwnerA, &lpwp->wpPtsOwnedGroupListBegin.hEnum, &status))
1876             status = 0;
1877
1878          FreeString (pszOwnerA, lpwp->wpPtsOwnedGroupListBegin.pszOwner);
1879          break;
1880          }
1881
1882       case wtaskPtsOwnedGroupListNext:
1883          {
1884          LPSTR pszGroupA = StringToAnsi (lpwp->wpPtsOwnedGroupListNext.pszGroup);
1885
1886          if ((*lpPtsOwnedGroupListNext)(lpwp->wpPtsOwnedGroupListNext.hEnum, pszGroupA, &status))
1887             status = 0;
1888
1889          FreeString (pszGroupA, lpwp->wpPtsOwnedGroupListNext.pszGroup);
1890          break;
1891          }
1892
1893       case wtaskPtsOwnedGroupListDone:
1894          {
1895          if ((*lpPtsOwnedGroupListDone)(lpwp->wpPtsOwnedGroupListDone.hEnum, &status))
1896             status = 0;
1897          break;
1898          }
1899
1900       case wtaskClientTokenGetExisting:
1901          {
1902          LPTSTR pszCellA = StringToAnsi (lpwp->wpClientTokenGetExisting.pszCell);
1903
1904          if ((*lpClientTokenGetExisting)(pszCellA, &lpwp->wpClientTokenGetExisting.hCreds, &status))
1905             status = 0;
1906
1907          FreeString (pszCellA, lpwp->wpClientTokenGetExisting.pszCell);
1908          break;
1909          }
1910
1911       case wtaskClientCellOpen:
1912          {
1913          LPTSTR pszCellA = StringToAnsi (lpwp->wpClientCellOpen.pszCell);
1914
1915          if ((*lpClientCellOpen)(pszCellA, lpwp->wpClientCellOpen.hCreds, &lpwp->wpClientCellOpen.hCell, &status))
1916             status = 0;
1917
1918          FreeString (pszCellA, lpwp->wpClientCellOpen.pszCell);
1919          break;
1920          }
1921
1922       case wtaskClientCellClose:
1923          {
1924          if ((*lpClientCellClose)(lpwp->wpClientCellClose.hCell, &status))
1925             status = 0;
1926          break;
1927          }
1928
1929       case wtaskClientLocalCellGet:
1930          {
1931          char szCellA[ cchNAME ];
1932          if ((*lpClientLocalCellGet)(szCellA, &status))
1933             {
1934             status = 0;
1935             CopyAnsiToString (lpwp->wpClientLocalCellGet.pszCell, szCellA);
1936             }
1937          break;
1938          }
1939
1940       case wtaskClientAFSServerGet:
1941          {
1942          LPTSTR pszServerA = StringToAnsi (lpwp->wpClientAFSServerGet.pszServer);
1943
1944          if ((*lpClientAFSServerGet)(lpwp->wpClientAFSServerGet.hCell, pszServerA, &lpwp->wpClientAFSServerGet.Entry, &status))
1945             status = 0;
1946
1947          FreeString (pszServerA, lpwp->wpClientAFSServerGet.pszServer);
1948          break;
1949          }
1950
1951       case wtaskClientAFSServerGetBegin:
1952          {
1953          if ((*lpClientAFSServerGetBegin)(lpwp->wpClientAFSServerGetBegin.hCell, &lpwp->wpClientAFSServerGetBegin.hEnum, &status))
1954             status = 0;
1955          break;
1956          }
1957
1958       case wtaskClientAFSServerGetNext:
1959          {
1960          if ((*lpClientAFSServerGetNext)(lpwp->wpClientAFSServerGetNext.hEnum, &lpwp->wpClientAFSServerGetNext.Entry, &status))
1961             status = 0;
1962          break;
1963          }
1964
1965       case wtaskClientAFSServerGetDone:
1966          {
1967          if ((*lpClientAFSServerGetDone)(lpwp->wpClientAFSServerGetDone.hEnum, &status))
1968             status = 0;
1969          break;
1970          }
1971
1972       case wtaskUtilDatabaseServerGetBegin:
1973          {
1974          LPSTR pszCellA = StringToAnsi (lpwp->wpUtilDatabaseServerGetBegin.pszCell);
1975
1976          if ((*lpUtilDatabaseServerGetBegin)(pszCellA, &lpwp->wpUtilDatabaseServerGetBegin.hEnum, &status))
1977             status = 0;
1978
1979          FreeString (pszCellA, lpwp->wpUtilDatabaseServerGetBegin.pszCell);
1980          break;
1981          }
1982
1983       case wtaskUtilDatabaseServerGetNext:
1984          {
1985          int Address;
1986          if ((*lpUtilDatabaseServerGetNext)(lpwp->wpUtilDatabaseServerGetNext.hEnum, &Address, &status))
1987             {
1988             AfsClass_IntToAddress (&lpwp->wpUtilDatabaseServerGetNext.Address, Address);
1989             status = 0;
1990             }
1991          break;
1992          }
1993
1994       case wtaskUtilDatabaseServerGetDone:
1995          {
1996          if ((*lpUtilDatabaseServerGetDone)(lpwp->wpUtilDatabaseServerGetDone.hEnum, &status))
1997             status = 0;
1998          break;
1999          }
2000
2001       // ADD HERE
2002       }
2003
2004    return (DWORD)status;
2005 }
2006
2007
2008 BOOL Worker_LoadLibraries (ULONG *pStatus)
2009 {
2010    if ((hiVOS = LoadLibrary (cszAFSVOSDLL)) == NULL)
2011       {
2012       if (pStatus)
2013          *pStatus = GetLastError();
2014       return FALSE;
2015       }
2016    if ((hiBOS = LoadLibrary (cszAFSBOSDLL)) == NULL)
2017       {
2018       if (pStatus)
2019          *pStatus = GetLastError();
2020       return FALSE;
2021       }
2022    if ((hiKAS = LoadLibrary (cszAFSKASDLL)) == NULL)
2023       {
2024       if (pStatus)
2025          *pStatus = GetLastError();
2026       return FALSE;
2027       }
2028    if ((hiPTS = LoadLibrary (cszAFSPTSDLL)) == NULL)
2029       {
2030       if (pStatus)
2031          *pStatus = GetLastError();
2032       return FALSE;
2033       }
2034    if ((hiUtil = LoadLibrary (cszAFSUTILDLL)) == NULL)
2035       {
2036       if (pStatus)
2037          *pStatus = GetLastError();
2038       return FALSE;
2039       }
2040    if ((hiClient = LoadLibrary (cszAFSCLIENTDLL)) == NULL)
2041       {
2042       if (pStatus)
2043          *pStatus = GetLastError();
2044       return FALSE;
2045       }
2046
2047    lpVosBackupVolumeCreate = (lpVosBackupVolumeCreate_t)GetProcAddress (hiVOS, "vos_BackupVolumeCreate");
2048    lpVosBackupVolumeCreateMultiple = (lpVosBackupVolumeCreateMultiple_t)GetProcAddress (hiVOS, "vos_BackupVolumeCreateMultiple");
2049    lpVosPartitionGet = (lpVosPartitionGet_t)GetProcAddress (hiVOS, "vos_PartitionGet");
2050    lpVosPartitionGetBegin = (lpVosPartitionGetBegin_t)GetProcAddress (hiVOS, "vos_PartitionGetBegin");
2051    lpVosPartitionGetNext = (lpVosPartitionGetNext_t)GetProcAddress (hiVOS, "vos_PartitionGetNext");
2052    lpVosPartitionGetDone = (lpVosPartitionGetDone_t)GetProcAddress (hiVOS, "vos_PartitionGetDone");
2053    lpVosServerOpen = (lpVosServerOpen_t)GetProcAddress (hiVOS, "vos_ServerOpen");
2054    lpVosServerClose = (lpVosServerClose_t)GetProcAddress (hiVOS, "vos_ServerClose");
2055    lpVosServerSync = (lpVosServerSync_t)GetProcAddress (hiVOS, "vos_ServerSync");
2056    lpVosFileServerAddressChange = (lpVosFileServerAddressChange_t)GetProcAddress (hiVOS, "vos_FileServerAddressChange");
2057    lpVosFileServerAddressRemove = (lpVosFileServerAddressRemove_t)GetProcAddress (hiVOS, "vos_FileServerAddressRemove");
2058    lpVosFileServerGetBegin = (lpVosFileServerGetBegin_t)GetProcAddress (hiVOS, "vos_FileServerGetBegin");
2059    lpVosFileServerGetNext = (lpVosFileServerGetNext_t)GetProcAddress (hiVOS, "vos_FileServerGetNext");
2060    lpVosFileServerGetDone = (lpVosFileServerGetDone_t)GetProcAddress (hiVOS, "vos_FileServerGetDone");
2061    lpVosServerTransactionStatusGetBegin = (lpVosServerTransactionStatusGetBegin_t)GetProcAddress (hiVOS, "vos_ServerTransactionStatusGetBegin");
2062    lpVosServerTransactionStatusGetNext = (lpVosServerTransactionStatusGetNext_t)GetProcAddress (hiVOS, "vos_ServerTransactionStatusGetNext");
2063    lpVosServerTransactionStatusGetDone = (lpVosServerTransactionStatusGetDone_t)GetProcAddress (hiVOS, "vos_ServerTransactionStatusGetDone");
2064    lpVosVLDBGet = (lpVosVLDBGet_t)GetProcAddress (hiVOS, "vos_VLDBGet");
2065    lpVosVLDBGetBegin = (lpVosVLDBGetBegin_t)GetProcAddress (hiVOS, "vos_VLDBGetBegin");
2066    lpVosVLDBGetNext = (lpVosVLDBGetNext_t)GetProcAddress (hiVOS, "vos_VLDBGetNext");
2067    lpVosVLDBGetDone = (lpVosVLDBGetDone_t)GetProcAddress (hiVOS, "vos_VLDBGetDone");
2068    lpVosVLDBEntryRemove = (lpVosVLDBEntryRemove_t)GetProcAddress (hiVOS, "vos_VLDBEntryRemove");
2069    lpVosVLDBUnlock = (lpVosVLDBUnlock_t)GetProcAddress (hiVOS, "vos_VLDBUnlock");
2070    lpVosVLDBEntryLock = (lpVosVLDBEntryLock_t)GetProcAddress (hiVOS, "vos_VLDBEntryLock");
2071    lpVosVLDBEntryUnlock = (lpVosVLDBEntryUnlock_t)GetProcAddress (hiVOS, "vos_VLDBEntryUnlock");
2072    lpVosVLDBReadOnlySiteCreate = (lpVosVLDBReadOnlySiteCreate_t)GetProcAddress (hiVOS, "vos_VLDBReadOnlySiteCreate");
2073    lpVosVLDBReadOnlySiteDelete = (lpVosVLDBReadOnlySiteDelete_t)GetProcAddress (hiVOS, "vos_VLDBReadOnlySiteDelete");
2074    lpVosVLDBSync = (lpVosVLDBSync_t)GetProcAddress (hiVOS, "vos_VLDBSync");
2075    lpVosVolumeCreate = (lpVosVolumeCreate_t)GetProcAddress (hiVOS, "vos_VolumeCreate");
2076    lpVosVolumeDelete = (lpVosVolumeDelete_t)GetProcAddress (hiVOS, "vos_VolumeDelete");
2077    lpVosVolumeRename = (lpVosVolumeRename_t)GetProcAddress (hiVOS, "vos_VolumeRename");
2078    lpVosVolumeDump = (lpVosVolumeDump_t)GetProcAddress (hiVOS, "vos_VolumeDump");
2079    lpVosVolumeRestore = (lpVosVolumeRestore_t)GetProcAddress (hiVOS, "vos_VolumeRestore");
2080    lpVosVolumeOnline = (lpVosVolumeOnline_t)GetProcAddress (hiVOS, "vos_VolumeOnline");
2081    lpVosVolumeOffline = (lpVosVolumeOffline_t)GetProcAddress (hiVOS, "vos_VolumeOffline");
2082    lpVosVolumeGet = (lpVosVolumeGet_t)GetProcAddress (hiVOS, "vos_VolumeGet");
2083    lpVosVolumeGetBegin = (lpVosVolumeGetBegin_t)GetProcAddress (hiVOS, "vos_VolumeGetBegin");
2084    lpVosVolumeGetNext = (lpVosVolumeGetNext_t)GetProcAddress (hiVOS, "vos_VolumeGetNext");
2085    lpVosVolumeGetDone = (lpVosVolumeGetDone_t)GetProcAddress (hiVOS, "vos_VolumeGetDone");
2086    lpVosVolumeMove = (lpVosVolumeMove_t)GetProcAddress (hiVOS, "vos_VolumeMove");
2087    lpVosVolumeRelease = (lpVosVolumeRelease_t)GetProcAddress (hiVOS, "vos_VolumeRelease");
2088    lpVosVolumeZap = (lpVosVolumeZap_t)GetProcAddress (hiVOS, "vos_VolumeZap");
2089    lpVosPartitionNameToId = (lpVosPartitionNameToId_t)GetProcAddress (hiVOS, "vos_PartitionNameToId");
2090    lpVosPartitionIdToName = (lpVosPartitionIdToName_t)GetProcAddress (hiVOS, "vos_PartitionIdToName");
2091    lpVosVolumeQuotaChange = (lpVosVolumeQuotaChange_t)GetProcAddress (hiVOS, "vos_VolumeQuotaChange");
2092
2093    lpBosServerOpen = (lpBosServerOpen_t)GetProcAddress (hiBOS, "bos_ServerOpen");
2094    lpBosServerClose = (lpBosServerClose_t)GetProcAddress (hiBOS, "bos_ServerClose");
2095    lpBosProcessCreate = (lpBosProcessCreate_t)GetProcAddress (hiBOS, "bos_ProcessCreate");
2096    lpBosProcessDelete = (lpBosProcessDelete_t)GetProcAddress (hiBOS, "bos_ProcessDelete");
2097    lpBosProcessExecutionStateGet = (lpBosProcessExecutionStateGet_t)GetProcAddress (hiBOS, "bos_ProcessExecutionStateGet");
2098    lpBosProcessExecutionStateSet = (lpBosProcessExecutionStateSet_t)GetProcAddress (hiBOS, "bos_ProcessExecutionStateSet");
2099    lpBosProcessExecutionStateSetTemporary = (lpBosProcessExecutionStateSetTemporary_t)GetProcAddress (hiBOS, "bos_ProcessExecutionStateSetTemporary");
2100    lpBosProcessNameGetBegin = (lpBosProcessNameGetBegin_t)GetProcAddress (hiBOS, "bos_ProcessNameGetBegin");
2101    lpBosProcessNameGetDone = (lpBosProcessNameGetDone_t)GetProcAddress (hiBOS, "bos_ProcessNameGetDone");
2102    lpBosProcessNameGetNext = (lpBosProcessNameGetNext_t)GetProcAddress (hiBOS, "bos_ProcessNameGetNext");
2103    lpBosProcessInfoGet = (lpBosProcessInfoGet_t)GetProcAddress (hiBOS, "bos_ProcessInfoGet");
2104    lpBosProcessParameterGetBegin = (lpBosProcessParameterGetBegin_t)GetProcAddress (hiBOS, "bos_ProcessParameterGetBegin");
2105    lpBosProcessParameterGetDone = (lpBosProcessParameterGetDone_t)GetProcAddress (hiBOS, "bos_ProcessParameterGetDone");
2106    lpBosProcessParameterGetNext = (lpBosProcessParameterGetNext_t)GetProcAddress (hiBOS, "bos_ProcessParameterGetNext");
2107    lpBosProcessNotifierGet = (lpBosProcessNotifierGet_t)GetProcAddress (hiBOS, "bos_ProcessNotifierGet");
2108    lpBosProcessRestart = (lpBosProcessRestart_t)GetProcAddress (hiBOS, "bos_ProcessRestart");
2109    lpBosProcessAllStop = (lpBosProcessAllStop_t)GetProcAddress (hiBOS, "bos_ProcessAllStop");
2110    lpBosProcessAllStart = (lpBosProcessAllStart_t)GetProcAddress (hiBOS, "bos_ProcessAllStart");
2111    lpBosProcessAllWaitStop = (lpBosProcessAllWaitStop_t)GetProcAddress (hiBOS, "bos_ProcessAllWaitStop");
2112    lpBosProcessAllStopAndRestart = (lpBosProcessAllStopAndRestart_t)GetProcAddress (hiBOS, "bos_ProcessAllStopAndRestart");
2113    lpBosAdminCreate = (lpBosAdminCreate_t)GetProcAddress (hiBOS, "bos_AdminCreate");
2114    lpBosAdminDelete = (lpBosAdminDelete_t)GetProcAddress (hiBOS, "bos_AdminDelete");
2115    lpBosAdminGetBegin = (lpBosAdminGetBegin_t)GetProcAddress (hiBOS, "bos_AdminGetBegin");
2116    lpBosAdminGetDone = (lpBosAdminGetDone_t)GetProcAddress (hiBOS, "bos_AdminGetDone");
2117    lpBosAdminGetNext = (lpBosAdminGetNext_t)GetProcAddress (hiBOS, "bos_AdminGetNext");
2118    lpBosKeyCreate = (lpBosKeyCreate_t)GetProcAddress (hiBOS, "bos_KeyCreate");
2119    lpBosKeyDelete = (lpBosKeyDelete_t)GetProcAddress (hiBOS, "bos_KeyDelete");
2120    lpBosKeyGetBegin = (lpBosKeyGetBegin_t)GetProcAddress (hiBOS, "bos_KeyGetBegin");
2121    lpBosKeyGetDone = (lpBosKeyGetDone_t)GetProcAddress (hiBOS, "bos_KeyGetDone");
2122    lpBosKeyGetNext = (lpBosKeyGetNext_t)GetProcAddress (hiBOS, "bos_KeyGetNext");
2123    lpBosCellSet = (lpBosCellSet_t)GetProcAddress (hiBOS, "bos_CellSet");
2124    lpBosCellGet = (lpBosCellGet_t)GetProcAddress (hiBOS, "bos_CellGet");
2125    lpBosHostCreate = (lpBosHostCreate_t)GetProcAddress (hiBOS, "bos_HostCreate");
2126    lpBosHostDelete = (lpBosHostDelete_t)GetProcAddress (hiBOS, "bos_HostDelete");
2127    lpBosHostGetBegin = (lpBosHostGetBegin_t)GetProcAddress (hiBOS, "bos_HostGetBegin");
2128    lpBosHostGetDone = (lpBosHostGetDone_t)GetProcAddress (hiBOS, "bos_HostGetDone");
2129    lpBosHostGetNext = (lpBosHostGetNext_t)GetProcAddress (hiBOS, "bos_HostGetNext");
2130    lpBosExecutableCreate = (lpBosExecutableCreate_t)GetProcAddress (hiBOS, "bos_ExecutableCreate");
2131    lpBosExecutableRevert = (lpBosExecutableRevert_t)GetProcAddress (hiBOS, "bos_ExecutableRevert");
2132    lpBosExecutableTimestampGet = (lpBosExecutableTimestampGet_t)GetProcAddress (hiBOS, "bos_ExecutableTimestampGet");
2133    lpBosExecutablePrune = (lpBosExecutablePrune_t)GetProcAddress (hiBOS, "bos_ExecutablePrune");
2134    lpBosExecutableRestartTimeSet = (lpBosExecutableRestartTimeSet_t)GetProcAddress (hiBOS, "bos_ExecutableRestartTimeSet");
2135    lpBosExecutableRestartTimeGet = (lpBosExecutableRestartTimeGet_t)GetProcAddress (hiBOS, "bos_ExecutableRestartTimeGet");
2136    lpBosLogGet = (lpBosLogGet_t)GetProcAddress (hiBOS, "bos_LogGet");
2137    lpBosAuthSet = (lpBosAuthSet_t)GetProcAddress (hiBOS, "bos_AuthSet");
2138    lpBosCommandExecute = (lpBosCommandExecute_t)GetProcAddress (hiBOS, "bos_CommandExecute");
2139    lpBosSalvage = (lpBosSalvage_t)GetProcAddress (hiBOS, "bos_Salvage");
2140
2141    lpKasServerOpen = (lpKasServerOpen_t)GetProcAddress (hiKAS, "kas_ServerOpen");
2142    lpKasServerClose = (lpKasServerClose_t)GetProcAddress (hiKAS, "kas_ServerClose");
2143    lpKasServerStatsGet = (lpKasServerStatsGet_t)GetProcAddress (hiKAS, "kas_ServerStatsGet");
2144    lpKasServerDebugGet = (lpKasServerDebugGet_t)GetProcAddress (hiKAS, "kas_ServerDebugGet");
2145    lpKasServerRandomKeyGet = (lpKasServerRandomKeyGet_t)GetProcAddress (hiKAS, "kas_ServerRandomKeyGet");
2146    lpKasStringToKey = (lpKasStringToKey_t)GetProcAddress (hiKAS, "kas_StringToKey");
2147    lpKasPrincipalCreate = (lpKasPrincipalCreate_t)GetProcAddress (hiKAS, "kas_PrincipalCreate");
2148    lpKasPrincipalDelete = (lpKasPrincipalDelete_t)GetProcAddress (hiKAS, "kas_PrincipalDelete");
2149    lpKasPrincipalGet = (lpKasPrincipalGet_t)GetProcAddress (hiKAS, "kas_PrincipalGet");
2150    lpKasPrincipalGetBegin = (lpKasPrincipalGetBegin_t)GetProcAddress (hiKAS, "kas_PrincipalGetBegin");
2151    lpKasPrincipalGetNext = (lpKasPrincipalGetNext_t)GetProcAddress (hiKAS, "kas_PrincipalGetNext");
2152    lpKasPrincipalGetDone = (lpKasPrincipalGetDone_t)GetProcAddress (hiKAS, "kas_PrincipalGetDone");
2153    lpKasPrincipalKeySet = (lpKasPrincipalKeySet_t)GetProcAddress (hiKAS, "kas_PrincipalKeySet");
2154    lpKasPrincipalLockStatusGet = (lpKasPrincipalLockStatusGet_t)GetProcAddress (hiKAS, "kas_PrincipalLockStatusGet");
2155    lpKasPrincipalUnlock = (lpKasPrincipalUnlock_t)GetProcAddress (hiKAS, "kas_PrincipalUnlock");
2156    lpKasPrincipalFieldsSet = (lpKasPrincipalFieldsSet_t)GetProcAddress (hiKAS, "kas_PrincipalFieldsSet");
2157
2158    lpPtsGroupMemberAdd = (lpPtsGroupMemberAdd_t)GetProcAddress (hiPTS, "pts_GroupMemberAdd");
2159    lpPtsGroupOwnerChange = (lpPtsGroupOwnerChange_t)GetProcAddress (hiPTS, "pts_GroupOwnerChange");
2160    lpPtsGroupCreate = (lpPtsGroupCreate_t)GetProcAddress (hiPTS, "pts_GroupCreate");
2161    lpPtsGroupGet = (lpPtsGroupGet_t)GetProcAddress (hiPTS, "pts_GroupGet");
2162    lpPtsGroupDelete = (lpPtsGroupDelete_t)GetProcAddress (hiPTS, "pts_GroupDelete");
2163    lpPtsGroupMaxGet = (lpPtsGroupMaxGet_t)GetProcAddress (hiPTS, "pts_GroupMaxGet");
2164    lpPtsGroupMaxSet = (lpPtsGroupMaxSet_t)GetProcAddress (hiPTS, "pts_GroupMaxSet");
2165    lpPtsGroupMemberListBegin = (lpPtsGroupMemberListBegin_t)GetProcAddress (hiPTS, "pts_GroupMemberListBegin");
2166    lpPtsGroupMemberListNext = (lpPtsGroupMemberListNext_t)GetProcAddress (hiPTS, "pts_GroupMemberListNext");
2167    lpPtsGroupMemberListDone = (lpPtsGroupMemberListDone_t)GetProcAddress (hiPTS, "pts_GroupMemberListDone");
2168    lpPtsGroupMemberRemove = (lpPtsGroupMemberRemove_t)GetProcAddress (hiPTS, "pts_GroupMemberRemove");
2169    lpPtsGroupRename = (lpPtsGroupRename_t)GetProcAddress (hiPTS, "pts_GroupRename");
2170    lpPtsGroupModify = (lpPtsGroupModify_t)GetProcAddress (hiPTS, "pts_GroupModify");
2171    lpPtsUserCreate = (lpPtsUserCreate_t)GetProcAddress (hiPTS, "pts_UserCreate");
2172    lpPtsUserDelete = (lpPtsUserDelete_t)GetProcAddress (hiPTS, "pts_UserDelete");
2173    lpPtsUserGet = (lpPtsUserGet_t)GetProcAddress (hiPTS, "pts_UserGet");
2174    lpPtsUserRename = (lpPtsUserRename_t)GetProcAddress (hiPTS, "pts_UserRename");
2175    lpPtsUserModify = (lpPtsUserModify_t)GetProcAddress (hiPTS, "pts_UserModify");
2176    lpPtsUserMaxGet = (lpPtsUserMaxGet_t)GetProcAddress (hiPTS, "pts_UserMaxGet");
2177    lpPtsUserMaxSet = (lpPtsUserMaxSet_t)GetProcAddress (hiPTS, "pts_UserMaxSet");
2178    lpPtsUserMemberListBegin = (lpPtsUserMemberListBegin_t)GetProcAddress (hiPTS, "pts_UserMemberListBegin");
2179    lpPtsUserMemberListNext = (lpPtsUserMemberListNext_t)GetProcAddress (hiPTS, "pts_UserMemberListNext");
2180    lpPtsUserMemberListDone = (lpPtsUserMemberListDone_t)GetProcAddress (hiPTS, "pts_UserMemberListDone");
2181    lpPtsOwnedGroupListBegin = (lpPtsOwnedGroupListBegin_t)GetProcAddress (hiPTS, "pts_OwnedGroupListBegin");
2182    lpPtsOwnedGroupListNext = (lpPtsOwnedGroupListNext_t)GetProcAddress (hiPTS, "pts_OwnedGroupListNext");
2183    lpPtsOwnedGroupListDone = (lpPtsOwnedGroupListDone_t)GetProcAddress (hiPTS, "pts_OwnedGroupListDone");
2184
2185    lpClientTokenGetExisting = (lpClientTokenGetExisting_t)GetProcAddress (hiClient, "afsclient_TokenGetExisting");
2186    lpClientCellOpen = (lpClientCellOpen_t)GetProcAddress (hiClient, "afsclient_CellOpen");
2187    lpClientCellClose = (lpClientCellClose_t)GetProcAddress (hiClient, "afsclient_CellClose");
2188    lpClientLocalCellGet = (lpClientLocalCellGet_t)GetProcAddress (hiClient, "afsclient_LocalCellGet");
2189    lpClientAFSServerGet = (lpClientAFSServerGet_t)GetProcAddress (hiClient, "afsclient_AFSServerGet");
2190    lpClientAFSServerGetBegin = (lpClientAFSServerGetBegin_t)GetProcAddress (hiClient, "afsclient_AFSServerGetBegin");
2191    lpClientAFSServerGetNext = (lpClientAFSServerGetNext_t)GetProcAddress (hiClient, "afsclient_AFSServerGetNext");
2192    lpClientAFSServerGetDone = (lpClientAFSServerGetDone_t)GetProcAddress (hiClient, "afsclient_AFSServerGetDone");
2193    lpClientInit = (lpClientInit_t)GetProcAddress (hiClient, "afsclient_Init");
2194
2195    lpUtilDatabaseServerGetBegin = (lpUtilDatabaseServerGetBegin_t)GetProcAddress (hiUtil, "util_DatabaseServerGetBegin");
2196    lpUtilDatabaseServerGetNext = (lpUtilDatabaseServerGetNext_t)GetProcAddress (hiUtil, "util_DatabaseServerGetNext");
2197    lpUtilDatabaseServerGetDone = (lpUtilDatabaseServerGetDone_t)GetProcAddress (hiUtil, "util_DatabaseServerGetDone");
2198
2199    // ADD HERE
2200
2201    if ( (lpVosBackupVolumeCreate == NULL) ||
2202         (lpVosBackupVolumeCreateMultiple == NULL) ||
2203         (lpVosPartitionGet == NULL) ||
2204         (lpVosPartitionGetBegin == NULL) ||
2205         (lpVosPartitionGetNext == NULL) ||
2206         (lpVosPartitionGetDone == NULL) ||
2207         (lpVosServerOpen == NULL) ||
2208         (lpVosServerClose == NULL) ||
2209         (lpVosServerSync == NULL) ||
2210         (lpVosFileServerAddressChange == NULL) ||
2211         (lpVosFileServerAddressRemove == NULL) ||
2212         (lpVosFileServerGetBegin == NULL) ||
2213         (lpVosFileServerGetNext == NULL) ||
2214         (lpVosFileServerGetDone == NULL) ||
2215         (lpVosServerTransactionStatusGetBegin == NULL) ||
2216         (lpVosServerTransactionStatusGetNext == NULL) ||
2217         (lpVosServerTransactionStatusGetDone == NULL) ||
2218         (lpVosVLDBGet == NULL) ||
2219         (lpVosVLDBGetBegin == NULL) ||
2220         (lpVosVLDBGetNext == NULL) ||
2221         (lpVosVLDBGetDone == NULL) ||
2222         (lpVosVLDBEntryRemove == NULL) ||
2223         (lpVosVLDBUnlock == NULL) ||
2224         (lpVosVLDBEntryLock == NULL) ||
2225         (lpVosVLDBEntryUnlock == NULL) ||
2226         (lpVosVLDBReadOnlySiteCreate == NULL) ||
2227         (lpVosVLDBReadOnlySiteDelete == NULL) ||
2228         (lpVosVLDBSync == NULL) ||
2229         (lpVosVolumeCreate == NULL) ||
2230         (lpVosVolumeDelete == NULL) ||
2231         (lpVosVolumeRename == NULL) ||
2232         (lpVosVolumeDump == NULL) ||
2233         (lpVosVolumeRestore == NULL) ||
2234         (lpVosVolumeOnline == NULL) ||
2235         (lpVosVolumeOffline == NULL) ||
2236         (lpVosVolumeGet == NULL) ||
2237         (lpVosVolumeGetBegin == NULL) ||
2238         (lpVosVolumeGetNext == NULL) ||
2239         (lpVosVolumeGetDone == NULL) ||
2240         (lpVosVolumeMove == NULL) ||
2241         (lpVosVolumeRelease == NULL) ||
2242         (lpVosVolumeZap == NULL) ||
2243         (lpVosPartitionNameToId == NULL) ||
2244         (lpVosPartitionIdToName == NULL) ||
2245         (lpVosVolumeQuotaChange == NULL) ||
2246         (lpBosServerOpen == NULL) ||
2247         (lpBosServerClose == NULL) ||
2248         (lpBosProcessCreate == NULL) ||
2249         (lpBosProcessDelete == NULL) ||
2250         (lpBosProcessExecutionStateGet == NULL) ||
2251         (lpBosProcessExecutionStateSet == NULL) ||
2252         (lpBosProcessExecutionStateSetTemporary == NULL) ||
2253         (lpBosProcessNameGetBegin == NULL) ||
2254         (lpBosProcessNameGetDone == NULL) ||
2255         (lpBosProcessNameGetNext == NULL) ||
2256         (lpBosProcessInfoGet == NULL) ||
2257         (lpBosProcessParameterGetBegin == NULL) ||
2258         (lpBosProcessParameterGetDone == NULL) ||
2259         (lpBosProcessParameterGetNext == NULL) ||
2260         (lpBosProcessNotifierGet == NULL) ||
2261         (lpBosProcessRestart == NULL) ||
2262         (lpBosProcessAllStop == NULL) ||
2263         (lpBosProcessAllStart == NULL) ||
2264         (lpBosProcessAllWaitStop == NULL) ||
2265         (lpBosProcessAllStopAndRestart == NULL) ||
2266         (lpBosAdminCreate == NULL) ||
2267         (lpBosAdminDelete == NULL) ||
2268         (lpBosAdminGetBegin == NULL) ||
2269         (lpBosAdminGetDone == NULL) ||
2270         (lpBosAdminGetNext == NULL) ||
2271         (lpBosKeyCreate == NULL) ||
2272         (lpBosKeyDelete == NULL) ||
2273         (lpBosKeyGetBegin == NULL) ||
2274         (lpBosKeyGetDone == NULL) ||
2275         (lpBosKeyGetNext == NULL) ||
2276         (lpBosCellSet == NULL) ||
2277         (lpBosCellGet == NULL) ||
2278         (lpBosHostCreate == NULL) ||
2279         (lpBosHostDelete == NULL) ||
2280         (lpBosHostGetBegin == NULL) ||
2281         (lpBosHostGetDone == NULL) ||
2282         (lpBosHostGetNext == NULL) ||
2283         (lpBosExecutableCreate == NULL) ||
2284         (lpBosExecutableRevert == NULL) ||
2285         (lpBosExecutableTimestampGet == NULL) ||
2286         (lpBosExecutablePrune == NULL) ||
2287         (lpBosExecutableRestartTimeSet == NULL) ||
2288         (lpBosExecutableRestartTimeGet == NULL) ||
2289         (lpBosLogGet == NULL) ||
2290         (lpBosAuthSet == NULL) ||
2291         (lpBosCommandExecute == NULL) ||
2292         (lpBosSalvage == NULL) ||
2293         (lpKasServerOpen == NULL) ||
2294         (lpKasServerClose == NULL) ||
2295         (lpKasServerStatsGet == NULL) ||
2296         (lpKasServerDebugGet == NULL) ||
2297         (lpKasServerRandomKeyGet == NULL) ||
2298         (lpKasStringToKey == NULL) ||
2299         (lpKasPrincipalCreate == NULL) ||
2300         (lpKasPrincipalDelete == NULL) ||
2301         (lpKasPrincipalGet == NULL) ||
2302         (lpKasPrincipalGetBegin == NULL) ||
2303         (lpKasPrincipalGetNext == NULL) ||
2304         (lpKasPrincipalGetDone == NULL) ||
2305         (lpKasPrincipalKeySet == NULL) ||
2306         (lpKasPrincipalLockStatusGet == NULL) ||
2307         (lpKasPrincipalUnlock == NULL) ||
2308         (lpKasPrincipalFieldsSet == NULL) ||
2309         (lpPtsGroupMemberAdd == NULL) ||
2310         (lpPtsGroupOwnerChange == NULL) ||
2311         (lpPtsGroupCreate == NULL) ||
2312         (lpPtsGroupGet == NULL) ||
2313         (lpPtsGroupDelete == NULL) ||
2314         (lpPtsGroupMaxGet == NULL) ||
2315         (lpPtsGroupMaxSet == NULL) ||
2316         (lpPtsGroupMemberListBegin == NULL) ||
2317         (lpPtsGroupMemberListNext == NULL) ||
2318         (lpPtsGroupMemberListDone == NULL) ||
2319         (lpPtsGroupMemberRemove == NULL) ||
2320         (lpPtsGroupRename == NULL) ||
2321         (lpPtsGroupModify == NULL) ||
2322         (lpPtsUserCreate == NULL) ||
2323         (lpPtsUserDelete == NULL) ||
2324         (lpPtsUserGet == NULL) ||
2325         (lpPtsUserRename == NULL) ||
2326         (lpPtsUserModify == NULL) ||
2327         (lpPtsUserMaxGet == NULL) ||
2328         (lpPtsUserMaxSet == NULL) ||
2329         (lpPtsUserMemberListBegin == NULL) ||
2330         (lpPtsUserMemberListNext == NULL) ||
2331         (lpPtsUserMemberListDone == NULL) ||
2332         (lpPtsOwnedGroupListBegin == NULL) ||
2333         (lpPtsOwnedGroupListNext == NULL) ||
2334         (lpPtsOwnedGroupListDone == NULL) ||
2335         (lpClientTokenGetExisting == NULL) ||
2336         (lpClientCellOpen == NULL) ||
2337         (lpClientCellClose == NULL) ||
2338         (lpClientLocalCellGet == NULL) ||
2339         (lpClientInit == NULL) ||
2340         (lpClientAFSServerGet == NULL) ||
2341         (lpClientAFSServerGetBegin == NULL) ||
2342         (lpClientAFSServerGetNext == NULL) ||
2343         (lpClientAFSServerGetDone == NULL) ||
2344         (lpUtilDatabaseServerGetBegin == NULL) ||
2345         (lpUtilDatabaseServerGetNext == NULL) ||
2346         (lpUtilDatabaseServerGetDone == NULL) ||
2347         // ADD HERE
2348         0 )
2349       {
2350       if (pStatus)
2351          *pStatus = ERROR_DLL_INIT_FAILED;
2352       return FALSE;
2353       }
2354
2355    // Initialize the client library
2356    //
2357    afs_status_t status;
2358    if (!(*lpClientInit)(&status))
2359       {
2360       if (pStatus)
2361          *pStatus = (ULONG)status;
2362       return FALSE;
2363       }
2364
2365    return TRUE;
2366 }
2367
2368
2369 void Worker_FreeLibraries (void)
2370 {
2371    if (hiVOS != NULL)
2372       {
2373       FreeLibrary (hiVOS);
2374       hiVOS = NULL;
2375       }
2376    if (hiBOS != NULL)
2377       {
2378       FreeLibrary (hiBOS);
2379       hiBOS = NULL;
2380       }
2381    if (hiKAS != NULL)
2382       {
2383       FreeLibrary (hiKAS);
2384       hiKAS = NULL;
2385       }
2386    if (hiPTS != NULL)
2387       {
2388       FreeLibrary (hiPTS);
2389       hiPTS = NULL;
2390       }
2391    if (hiUtil != NULL)
2392       {
2393       FreeLibrary (hiUtil);
2394       hiUtil = NULL;
2395       }
2396    if (hiClient != NULL)
2397       {
2398       FreeLibrary (hiClient);
2399       hiClient = NULL;
2400       }
2401 }
2402