/************************************************************************* * * ATTACH.C * * NT Attach routines * * Copyright (c) 1995 Microsoft Corporation * * $Log: N:\NT\PRIVATE\NW4\NWSCRIPT\VCS\ATTACH.C $ * * Rev 1.2 10 Apr 1996 14:21:30 terryt * Hotfix for 21181hq * * Rev 1.2 12 Mar 1996 19:52:08 terryt * Relative NDS names and merge * * Rev 1.1 22 Dec 1995 14:23:32 terryt * Add Microsoft headers * * Rev 1.0 15 Nov 1995 18:06:26 terryt * Initial revision. * * Rev 1.1 23 May 1995 19:36:30 terryt * Spruce up source * * Rev 1.0 15 May 1995 19:10:10 terryt * Initial revision. * *************************************************************************/ #include #include #include #include #include #include #include #include #include #include #include #include #include "inc/common.h" #include "ntnw.h" /******************************************************************** GetDefaultConnectionID Routine Description: Return the default connection ID ( the "preferred server" ) Arguments: phNewConn - pointer to connection number Return Value: 0 = success else NetWare error number *******************************************************************/ unsigned int GetDefaultConnectionID( unsigned int *phNewConn ) { VERSION_INFO VerInfo; unsigned int Result; if ( fNDS ) { Result = NTAttachToFileServer( NDSTREE, phNewConn ); } else { // // "*" is the name for the preferred server // Result = NTAttachToFileServer( "*", phNewConn ); if ( Result ) return Result; Result = NWGetFileServerVersionInfo( (NWCONN_HANDLE)*phNewConn, &VerInfo ); if ( Result ) return Result; NWDetachFromFileServer( (NWCONN_HANDLE)*phNewConn ); Result = NTAttachToFileServer( VerInfo.szName, phNewConn ); } return Result; } /******************************************************************** NTAttachToFileServer Routine Description: Given a server name, return a connection handle. We need our own because NWAPI32 does it's own mapping of errors. Arguments: pszServerName - Ascii server name phNewConn - pointer to connection handle Return Value: 0 = success else NetWare error number *******************************************************************/ unsigned int NTAttachToFileServer( unsigned char *pszServerName, unsigned int *phNewConn ) { return ( NWAttachToFileServer( pszServerName, 0, (NWCONN_HANDLE *)phNewConn ) ); } /******************************************************************** NTIsConnected Routine Description: Given a server name, is there already a connection to it? Arguments: pszServerName - ascii server name Return Value: TRUE - a connection to the server exists FALSE - a connection to the server does not exist *******************************************************************/ unsigned int NTIsConnected( unsigned char * pszServerName ) { LPBYTE Buffer ; DWORD dwErr ; HANDLE EnumHandle ; DWORD Count ; LPWSTR pszServerNameW; INT nSize; DWORD BufferSize = 4096; nSize = (strlen( pszServerName ) + 1 + 2) * sizeof( WCHAR ); // // allocate memory and open the enumeration // if (!(pszServerNameW = LocalAlloc( LPTR, nSize ))) { DisplayMessage(IDR_NOT_ENOUGH_MEMORY); return FALSE; } wcscpy( pszServerNameW, L"\\\\" ); szToWide( pszServerNameW + 2, pszServerName, nSize ); // // allocate memory and open the enumeration // if (!(Buffer = LocalAlloc( LPTR, BufferSize ))) { (void) LocalFree((HLOCAL) pszServerNameW) ; DisplayMessage(IDR_NOT_ENOUGH_MEMORY); return FALSE; } memset( Buffer, 0, BufferSize ); dwErr = NPOpenEnum(RESOURCE_CONNECTED, 0, 0, NULL, &EnumHandle) ; if (dwErr != WN_SUCCESS) { (void) LocalFree((HLOCAL) pszServerNameW) ; (void) LocalFree((HLOCAL) Buffer) ; return FALSE; } do { Count = 0xFFFFFFFF ; BufferSize = 4096; dwErr = NwEnumConnections(EnumHandle, &Count, Buffer, &BufferSize, TRUE) ; if ((dwErr == WN_SUCCESS || dwErr == WN_NO_MORE_ENTRIES) && ( Count != 0xFFFFFFFF) ) { LPNETRESOURCE lpNetResource ; DWORD i ; DWORD ServerLen; ServerLen = wcslen( pszServerNameW ); lpNetResource = (LPNETRESOURCE) Buffer ; // // search for our server // for ( i = 0; i < Count; lpNetResource++, i++ ) { if ( lpNetResource->lpProvider ) if ( _wcsicmp( lpNetResource->lpProvider, NW_PROVIDER ) ) { continue; } if ( lpNetResource->lpRemoteName ) { if ( wcslen(lpNetResource->lpRemoteName) > ServerLen ) { if ( lpNetResource->lpRemoteName[ServerLen] == L'\\' ) lpNetResource->lpRemoteName[ServerLen] = L'\0'; } if ( !_wcsicmp(lpNetResource->lpRemoteName, pszServerNameW )) { (void) WNetCloseEnum(EnumHandle) ; (void) LocalFree((HLOCAL) pszServerNameW) ; (void) LocalFree((HLOCAL) Buffer) ; return TRUE; } } } } } while (dwErr == WN_SUCCESS) ; (void ) WNetCloseEnum(EnumHandle) ; (void) LocalFree((HLOCAL) pszServerNameW) ; (void) LocalFree((HLOCAL) Buffer) ; return FALSE; }