/*++ Copyright (c) 1992-1993 Microsoft Corporation Module Name: ImpRead.c Abstract: ImportDirReadClientList(). Only callable as part of the service itself. Author: John Rogers (JohnRo) 23-Sep-1992 Environment: User Mode - Win32 Revision History: 25-Sep-1992 JohnRo Created as part of RAID 5494: repl svc does not maintain time stamp on import startup. 02-Dec-1992 JohnRo RAID 3844: remote NetReplSetInfo uses local machine type. 02-Apr-1993 JohnRo Use NetpKdPrint() where possible. Made changes suggested by PC-LINT 5.0 15-Jun-1993 JohnRo Multi-masters are ignored. --*/ // These must be included first: #include // IN, DWORD, etc. #include // NET_API_STATUS, etc. // These may be included in any order: #include // LPNET_CONFIG_HANDLE, Netp config routines. #include // SECT_NT_ equates. #include // My prototype. #include // NERR_ and ERROR_ equates, NO_ERROR. #include // RCGlobalClientListLock, etc. #include // NetpAssert(), etc. #include // ACQUIRE_LOCK(), etc. #include // PREFIX_ equates. #include // IF_DEBUG(). #include // STRCPY(), TCHAR_BACKSLASH. NET_API_STATUS ImportDirReadClientList( VOID ) { NET_API_STATUS ApiStatus; LPTSTR DirName = NULL; DWORD EntryCount = 0; BOOL FirstTime; LPNET_CONFIG_HANDLE Handle = NULL; BOOL LockDone = FALSE; IF_DEBUG(CLIENT) { NetpKdPrint(( PREFIX_REPL_CLIENT "ImportDirReadClientList: beginning...\n" )); } ACQUIRE_LOCK( RCGlobalClientListLock ); LockDone = TRUE; // // Open the right section of the config file/whatever. // ApiStatus = NetpOpenConfigDataEx( & Handle, NULL, // local (no server name) (LPTSTR) SECT_NT_REPLICATOR, // service name (LPTSTR) SECT_NT_REPLICATOR_IMPORTS, // area under service TRUE); // read-only if (ApiStatus != NO_ERROR) { goto CleanUp; } // // Count entries in config data. // ApiStatus = NetpNumberOfConfigKeywords ( Handle, & EntryCount ); if (ApiStatus != NO_ERROR) { NetpAssert( FALSE ); // BUGBUG handle unexpected better. goto CleanUp; } else if (EntryCount == 0) { goto CleanUp; } // // Loop for each keyword (relative directory path) in this section. // FirstTime = TRUE; /*lint -save -e716 */ // disable warnings for while(TRUE) while (TRUE) { DWORD State, LockCount; DWORD LastUpdateTime, LockTime; // Seconds since 1970 (GMT). LPTSTR ValueString; TCHAR UncMaster[UNCLEN+1]; ApiStatus = NetpEnumConfigSectionValues ( Handle, & DirName, // Keyword - alloc and set ptr. & ValueString, // Must be freed by NetApiBufferFree(). FirstTime ); FirstTime = FALSE; if (ApiStatus != NO_ERROR) { goto CleanUp; // Handle end of list or an actual error. } NetpAssert( DirName != NULL ); NetpAssert( ValueString != NULL ); // // Parse the value string... // ApiStatus = ImportDirParseConfigData ( NULL, // no server name ValueString, & State, UncMaster, & LastUpdateTime, & LockCount, & LockTime); // Seconds since 1970. NetpMemoryFree( ValueString ); if (ApiStatus == NO_ERROR) { PCLIENT_LIST_REC rec; rec = ReplAddClientRec( DirName, NULL, // no master info record NULL ); // no dir info NetpMemoryFree( DirName ); DirName = NULL; if (rec == NULL) { ApiStatus = ERROR_NOT_ENOUGH_MEMORY; goto CleanUp; } // Override info set by ReplAddClientRecord(). rec->lockcount = LockCount; rec->time_of_first_lock = LockTime; rec->timestamp = LastUpdateTime; rec->state = State; #if 0 // BUGBUG: This used to set the master field in the client // record. However, this prevents other machines from becoming // masters. So, ignore it... if (UncMaster[0] != TCHAR_EOS) { NetpAssert( UncMaster[0] == TCHAR_BACKSLASH ); NetpAssert( UncMaster[1] == TCHAR_BACKSLASH ); (VOID) STRCPY( rec->master, // dest UncMaster+2 ); // src (not UNC name) } #endif } else { // BUGBUG: Log the error! goto CleanUp; } } // while TRUE (exit on error or end of list) /*lint -restore */ // re-enable warnings for while(TRUE) // // All done (error or otherwise). // CleanUp: if (ApiStatus == NERR_CfgParamNotFound) { // Normal end of list. ApiStatus = NO_ERROR; } IF_DEBUG(CLIENT) { NetpKdPrint(( PREFIX_REPL_CLIENT "ImportDirReadClientList: done, status=" FORMAT_API_STATUS ".\n", ApiStatus )); } if (DirName != NULL) { NetpMemoryFree( DirName ); } if (Handle != NULL) { (void) NetpCloseConfigData( Handle ); } if (LockDone) { RELEASE_LOCK( RCGlobalClientListLock ); } return ApiStatus; } // ImportDirReadClientList