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