summaryrefslogtreecommitdiffstats
path: root/private/nw/nwscript/common.c
diff options
context:
space:
mode:
Diffstat (limited to 'private/nw/nwscript/common.c')
-rw-r--r--private/nw/nwscript/common.c400
1 files changed, 400 insertions, 0 deletions
diff --git a/private/nw/nwscript/common.c b/private/nw/nwscript/common.c
new file mode 100644
index 000000000..019ff87e5
--- /dev/null
+++ b/private/nw/nwscript/common.c
@@ -0,0 +1,400 @@
+
+/*************************************************************************
+*
+* COMMON.C
+*
+* Miscellaneous routines for scripts, ported from DOS
+*
+* Copyright (c) 1995 Microsoft Corporation
+*
+* $Log: N:\NT\PRIVATE\NW4\NWSCRIPT\VCS\COMMON.C $
+*
+* Rev 1.3 10 Apr 1996 14:21:52 terryt
+* Hotfix for 21181hq
+*
+* Rev 1.3 12 Mar 1996 19:52:40 terryt
+* Relative NDS names and merge
+*
+* Rev 1.2 24 Jan 1996 17:14:54 terryt
+* Common read string routine
+*
+* Rev 1.1 22 Dec 1995 14:23:56 terryt
+* Add Microsoft headers
+*
+* Rev 1.0 15 Nov 1995 18:06:36 terryt
+* Initial revision.
+*
+* Rev 1.2 25 Aug 1995 16:22:18 terryt
+* Capture support
+*
+* Rev 1.1 26 Jul 1995 14:17:06 terryt
+* Clean up comments
+*
+* Rev 1.0 15 May 1995 19:10:18 terryt
+* Initial revision.
+*
+*************************************************************************/
+#include "common.h"
+
+/*
+ Used by DisplayMapping() only.
+ Return search number if the drive is a search drive.
+ Return 0 if the drive is not a search drive.
+ */
+int IsSearchDrive(int driveNum)
+{
+ int searchNum = 1;
+ char *path;
+
+ path = NWGetPath();
+
+ while (*path != 0)
+ {
+ if ((*path - 'A' + 1 == driveNum) &&
+ (*(path+1) == ':'))
+ {
+ return searchNum;
+ }
+
+ if (path = strchr (path, ';'))
+ {
+ path++;
+ searchNum++;
+ }
+ else
+ return(0);
+ }
+
+ return(0);
+}
+
+
+/*
+ Get path enviroment variable. This returns the pointer to the
+ path in the parent enviroment segment.
+ */
+char * NWGetPath(void)
+{
+ //
+ // On NT we can't change or get the parent's environment this way
+ //
+ return( getenv("PATH") );
+}
+
+/*
+ Return TRUE if the memory block is large enough for adding new
+ search path. FALSE otherwise.
+ */
+int MemorySegmentLargeEnough (int nInsertByte)
+{
+ return TRUE;
+}
+
+/*
+ Display drive maps info.
+ */
+void DisplayMapping(void)
+{
+ unsigned int iRet = 0;
+ int i;
+ WORD status;
+ char rootPath[MAX_PATH_LEN], relativePath[MAX_PATH_LEN];
+ char *envPath, *tokenPath;
+ char *path;
+ DWORD LocalDrives;
+ DWORD NonSearchDrives;
+ char sLocalDrives[26*2+5];
+ char * sptr;
+
+ // Don't delete this line. This is for fixing bug 1176.
+ DisplayMessage(IDR_NEWLINE);
+
+ LocalDrives = 0;
+ NonSearchDrives = 0;
+
+ // Collect local drives and search drives
+ for (i = 1; i <= 26; i++) {
+ status = NTNetWareDriveStatus( (unsigned short)(i-1) );
+ if ((status & NETWARE_LOCAL_DRIVE) && !(status & NETWARE_NETWORK_DRIVE))
+ LocalDrives |= ( 1 << (i-1) );
+ else if ((status & NETWARE_NETWORK_DRIVE) && (!IsSearchDrive(i)) )
+ {
+ if (status & NETWARE_NETWARE_DRIVE)
+ NonSearchDrives |= ( 1 << (i-1) );
+ else
+ {
+ //For NetWare compatibility
+ LocalDrives |= ( 1 << (i-1) );
+ }
+ }
+ }
+
+ // Print out local drives
+ if ( LocalDrives ) {
+ sptr = &sLocalDrives[0];
+ for (i = 1; i <= 26; i++)
+ {
+ if ( LocalDrives & ( 1 << (i - 1) ) ) {
+ *sptr++ = 'A' + i - 1;
+ *sptr++ = ',';
+ }
+ }
+ sptr--;
+ *sptr = '\0';
+ DisplayMessage(IDR_ALL_LOCAL_DRIVES, sLocalDrives);
+ }
+
+ // Print out non search drives.
+ for (i = 1; i <= 26; i++)
+ {
+ if ( NonSearchDrives & ( 1 << (i - 1) ) ) {
+
+ if (iRet = GetDriveStatus ((unsigned short)i,
+ NETWARE_FORMAT_SERVER_VOLUME,
+ &status,
+ NULL,
+ rootPath,
+ relativePath,
+ NULL))
+ {
+ DisplayError (iRet, "GetDriveStatus");
+ }
+ else
+ {
+ DisplayMessage(IDR_NETWARE_DRIVE, 'A'+i-1, rootPath, relativePath);
+ }
+ }
+ }
+
+ // Print out dashed line as seperator between non search drives
+ // and search drives.
+ DisplayMessage(IDR_DASHED_LINE);
+
+ // Get the PATH environment variable.
+ path = NWGetPath();
+ if ((envPath = malloc (strlen (path) + 1)) == NULL)
+ {
+ DisplayMessage(IDR_NOT_ENOUGH_MEMORY);
+ return;
+ }
+
+ strcpy (envPath, path);
+
+ tokenPath = strtok (envPath, PATH_SEPERATOR);
+
+ // Print out search drvies.
+ for (i = 1; tokenPath != NULL; i++)
+ {
+ if (tokenPath[1] == ':')
+ {
+ if (iRet = GetDriveStatus ((unsigned short)(toupper(tokenPath[0])-'A'+1),
+ NETWARE_FORMAT_SERVER_VOLUME,
+ &status,
+ NULL,
+ rootPath,
+ relativePath,
+ NULL))
+ {
+ DisplayError (iRet, "GetDriveStatus");
+ }
+ else
+ {
+ if (status & NETWARE_NETWARE_DRIVE)
+ DisplayMessage(IDR_NETWARE_SEARCH, i, tokenPath, rootPath, relativePath);
+ else
+ DisplayMessage(IDR_LOCAL_SEARCH, i, tokenPath);
+ }
+ }
+ else
+ {
+ // Path is specified without drive letter.
+ DisplayMessage(IDR_LOCAL_SEARCH, i, tokenPath);
+ }
+
+ tokenPath = strtok (NULL, PATH_SEPERATOR);
+ }
+
+ free (envPath);
+}
+
+/*****************************************************************************
+ * *
+ * GetString *
+ * *
+ * *
+ * entry: pointer to buffer *
+ * length of buffer *
+ * *
+ * exit: length of string *
+ * *
+ *****************************************************************************/
+
+int
+GetString( char * pBuffer, int ByteCount )
+{
+ char * pString = pBuffer;
+ char ch;
+
+ if ( ByteCount > 0 )
+ ByteCount--;
+
+ for( ;; ) {
+
+ switch ( ch = (char) _getch() ) {
+
+ case '\r' :
+ *pString++ = '\0';
+ putchar( '\n' );
+ return( strlen( pBuffer ) );
+
+ case '\b' :
+ if ( pString != pBuffer ) {
+ ByteCount++;
+ pString--;
+ printf( "\b \b" );
+ }
+ break;
+
+ default :
+ if ( ByteCount > 0 && ch >= 0x20 && ch < 0x80 ) {
+ *pString++ = ch;
+ ByteCount--;
+ putchar( ch );
+ }
+ break;
+ }
+
+ }
+ fflush(stdin);
+}
+
+/*
+ Read user or server name from the keyboard input.
+ Return TRUE if user typed in a username
+ FALSE otherwise.
+ */
+int ReadName (char * Name)
+{
+ memset( Name, 0, MAX_NAME_LEN );
+
+ if ( 0 == GetString( Name, MAX_NAME_LEN ) )
+ return FALSE;
+
+ _strupr(Name);
+ return TRUE;
+}
+
+
+
+/*
+ Try to log the user in.
+ Return error code. 0 is success.
+ */
+int Login( char *UserName,
+ char *ServerName,
+ char *Password,
+ int bReadPassword)
+{
+ unsigned int iRet = 0;
+
+ // Try log the user in with no password first.
+ iRet = NTLoginToFileServer( ServerName,
+ UserName,
+ Password);
+
+ if (iRet == ERROR_INVALID_PASSWORD && bReadPassword)
+ {
+ // wrong password. ask for passowrd. and try login with
+ // the input password.
+ DisplayMessage(IDR_PASSWORD, UserName, ServerName);
+
+ ReadPassword (Password);
+
+ iRet = NTLoginToFileServer( ServerName,
+ UserName,
+ Password);
+ }
+
+ switch(iRet)
+ {
+ case NO_ERROR: // ok
+ DisplayMessage(IDR_ATTACHED, ServerName);
+ break;
+
+ case ERROR_INVALID_PASSWORD: // wrong password.
+ case ERROR_NO_SUCH_USER: // no such user.
+ DisplayMessage(IDR_SERVER_USER, ServerName, UserName);
+ DisplayMessage(IDR_ACCESS_DENIED);
+ break;
+
+ case ERROR_CONNECTION_COUNT_LIMIT: // concurrent connection restriction.
+ DisplayMessage(IDR_SERVER_USER, ServerName, UserName);
+ DisplayMessage(IDR_LOGIN_DENIED_NO_CONNECTION);
+ break;
+
+ case ERROR_LOGIN_TIME_RESTRICTION: // time restriction.
+ DisplayMessage(IDR_SERVER_USER, ServerName, UserName);
+ DisplayMessage(IDR_UNAUTHORIZED_LOGIN_TIME);
+ break;
+
+ case ERROR_LOGIN_WKSTA_RESTRICTION: // station restriction.
+ DisplayMessage(IDR_SERVER_USER, ServerName, UserName);
+ DisplayMessage(IDR_UNAUTHORIZED_LOGIN_STATION);
+ break;
+
+ case ERROR_ACCOUNT_DISABLED:
+ DisplayMessage(IDR_SERVER_USER, ServerName, UserName);
+ DisplayMessage(IDR_ACCOUNT_DISABLED);
+ break;
+
+ case ERROR_PASSWORD_EXPIRED: // password expired and no grace login left.
+ DisplayMessage(IDR_SERVER_USER, ServerName, UserName);
+ DisplayMessage(IDR_PASSWORD_EXPRIED_NO_GRACE);
+ break;
+
+ case ERROR_REMOTE_SESSION_LIMIT_EXCEEDED:
+ // Server rejected access
+ DisplayMessage(IDR_CONNECTION_REFUSED);
+ break;
+
+ case ERROR_EXTENDED_ERROR:
+ NTPrintExtendedError();
+ break;
+
+ default :
+ DisplayError(iRet,"LoginToFileServer");
+ break;
+ }
+
+ return(iRet);
+}
+
+int CAttachToFileServer(char *ServerName, unsigned int *pConn, int * pbAlreadyAttached)
+{
+ unsigned int iRet = 0;
+
+ if (pbAlreadyAttached != NULL)
+ *pbAlreadyAttached = FALSE;
+
+ // Validate the server name.
+ iRet = AttachToFileServer(ServerName,pConn);
+
+ switch (iRet)
+ {
+ case 0: // OK
+ break;
+
+ case 0x8800 : // Already atached.
+ if (pbAlreadyAttached != NULL)
+ *pbAlreadyAttached = TRUE;
+
+ iRet = GetConnectionHandle (ServerName, pConn);
+ break;
+
+ default:
+ DisplayMessage(IDR_NO_RESPONSE, ServerName);
+ break;
+ }
+
+ return(iRet);
+}