diff options
Diffstat (limited to '')
-rw-r--r-- | private/nw/nwscript/attach.c | 235 |
1 files changed, 235 insertions, 0 deletions
diff --git a/private/nw/nwscript/attach.c b/private/nw/nwscript/attach.c new file mode 100644 index 000000000..fa6cacc75 --- /dev/null +++ b/private/nw/nwscript/attach.c @@ -0,0 +1,235 @@ +/************************************************************************* +* +* 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 <stdio.h> +#include <direct.h> +#include <time.h> +#include <stdlib.h> + +#include <nt.h> +#include <ntrtl.h> +#include <nturtl.h> +#include <windows.h> + +#include <nwapi32.h> +#include <ntddnwfs.h> +#include <nwapi.h> +#include <npapi.h> + +#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; +} |