/*++
Copyright (c) 1989 Microsoft Corporation
Module Name:
usrv.c
Abstract:
Test program for the LAN Manager server.
Author:
David Treadwell (davidtr) 20-Oct-1989
Chuck Lenzmeier (chuckl)
Revision History:
--*/
#include "usrv.h"
NTSTATUS
main (
IN SHORT argc,
IN PSZ argv[],
IN PSZ envp[]
)
{
NTSTATUS status;
HANDLE redirThreadHandle[MAX_NUMBER_REDIRS];
SHORT i;
SHORT argPtr;
ULONG ActualNumberOfRedirs;
ULONG redirThreadCount = 0;
PDESCRIPTOR Redir = NULL;
envp; // prevent compiler warnings
printf( "LAN Manager Server Test entered\n" );
DebugParameter = 0;
//
// Parse command-line arguments to determine redir threads to start.
//
ActualNumberOfRedirs = 0;
argc--;
argPtr = 1;
while ( (argc > 0) && (*argv[argPtr] == '-') ) {
PSZ arg = argv[argPtr] + 1;
switch ( *arg ) {
case 'b': // set redir's max buffer size
case 'B':
RedirBufferSize = (USHORT)atol( arg + 1 );
break;
case 'd': // set debug flags
case 'D':
DebugParameter = atolx( arg + 1 );
break;
case 'l':
case 'L':
DefaultDialect = (UCHAR)( atol( arg + 1 ) & 0x7 );
break;
case 'n':
case 'N':
DefaultNegotiate = (BOOLEAN)(!DefaultNegotiate);
case 'p':
case 'P':
PromptForNextTest = (BOOLEAN)(!PromptForNextTest);
break;
case 's': // set server name
case 'S':
arg++;
for ( i = 1;
(i <= COMPUTER_NAME_LENGTH) && (*arg != '\0');
i++, arg++ ) {
ServerName[i] = (CHAR)toupper( *arg );
}
if ( *arg != '\0' ) {
printf( "USRV: Server name too long\n" );
goto usage;
}
for ( ; i <= COMPUTER_NAME_LENGTH + 1; i++ ) {
ServerName[i] = ' ';
}
break;
case 'r':
case 'R':
NoUsrvInit = (BOOLEAN)(!NoUsrvInit);
break;
case 't': // set prompting redir count
case 'T':
redirThreadCount = atol( arg + 1 );
break;
case 'x': // set transport name
case 'X':
Transport = arg + 1;
break;
default:
printf( "USRV: Invalid switch\n" );
goto usage;
}
argc--;
argPtr++;
}
if ( (argc == 0) && !PromptForNextTest ) {
//printf( "USRV: No test name given; assuming \"-P\"\n" );
PromptForNextTest = TRUE;
}
if ( (argc != 0) && (redirThreadCount != 0) ) {
printf( "USRV: Must not specify both test name and \"-T\"\n" );
goto usage;
}
if ( (argc == 0) && (redirThreadCount == 0) ) {
redirThreadCount = 1;
}
while ( (argc > 0) || (redirThreadCount > 0) ) {
Redir = malloc( sizeof(DESCRIPTOR) );
Redir->RedirNumber = ActualNumberOfRedirs;
Redir->MaxBufferSize = RedirBufferSize;
if ( argc > 0 ) {
Redir->TestNumber = MatchTestName( argv[argPtr] );
switch ( Redir->TestNumber ) {
case (CLONG)-1:
printf( "Unknown test specified: %s\n", argv[argPtr] );
goto usage;
case (CLONG)-2:
printf( "Test name ambiguous: %s\n", argv[argPtr] );
goto usage;
}
Redir->argc = argPtr;
Redir->argv = &argv[argPtr++];
while( (--argc > 0) && (*argv[argPtr] != '|') ) {
argPtr++;
}
Redir->argc = argPtr - Redir->argc;
argPtr++; // skip over '|'
--argc;
} else {
Redir->TestNumber = -3;
Redir->argc = 0;
--redirThreadCount;
}
//
// Don't create a redir thread if exactly one explicit test, or
// -Tn was specified and this is the last thread to be created.
// Instead, execute the RedirThread routine directly outside of
// the loop.
//
if ( (argc > 0) ||
(ActualNumberOfRedirs > 0) ||
(redirThreadCount > 0) ) {
IF_DEBUG(1) {
printf( "***Starting redir thread #%ld.\n",
Redir->RedirNumber );
}
status = RtlCreateUserThread(
NtCurrentProcess(),
NULL,
FALSE,
0L,
0L,
0L,
(PUSER_THREAD_START_ROUTINE)RedirThreadWrapper,
(PVOID)Redir,
&redirThreadHandle[ActualNumberOfRedirs++],
NULL
);
if ( !NT_SUCCESS(status) ) {
printf( "NtCreateThread (redir thread) failed: %X\n",
status);
status = STATUS_UNSUCCESSFUL;
goto exit;
}
}
}
if ( ActualNumberOfRedirs == 0 ) {
//
// If if exactly one explicit test was specified, run the redir
// thread directly, rather than spawning a thread.
//
status = RedirThread( Redir );
} else {
status = NtWaitForMultipleObjects(
(CHAR)ActualNumberOfRedirs,
redirThreadHandle,
WaitAll,
FALSE,
NULL
);
if ( !NT_SUCCESS(status) ) {
status = STATUS_UNSUCCESSFUL;
printf( "NtWaitForMultipleObjects failed: %X\n", status );
goto exit;
}
}
//
// All done.
//
goto exit;
usage:
printf( "usage: USRV [-Bbuffer-size] [-Ddebug-flags] [-P]\n" );
printf( " [-Tthread-count] [-Sserver-name] "
"[-Xtransport-name] [-N] [-R]\n" );
printf( " test-name [args] [| test-name [args]]...\n" );
printf( "\n" );
printf( " buffer-size, thread-count are in decimal\n" );
printf( " debug-flags is in hex\n" );
printf( " -P reverses state of prompt mode\n" );
printf( " -R indicates that USRVINIT.CMD should not be run\n" );
printf( " -N indicates that no negotiate SMB should be sent\n" );
printf( "\n" );
printf( " -T and \"test-name [args]\" are mutually-exclusive;\n" );
printf( " threads created with -T always prompt for test-name\n" );
printf( "\n" );
printf( " \"USRV\" alone creates one prompting redir thread\n" );
printf( "\n" );
status = STATUS_UNSUCCESSFUL;
exit:
IF_DEBUG(1) printf( "LAN Manager Server Test exiting: %X\n",
status );
return status;
} // main