summaryrefslogtreecommitdiffstats
path: root/private/nw/nwscript/attach.c
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--private/nw/nwscript/attach.c235
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;
+}