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