208 lines
6.3 KiB
C
208 lines
6.3 KiB
C
|
#include <errno.h>
|
||
|
#include <winpr/crt.h>
|
||
|
#include <winpr/tchar.h>
|
||
|
#include <winpr/cmdline.h>
|
||
|
#include <winpr/strlst.h>
|
||
|
|
||
|
static const char* testArgv[] = {
|
||
|
"mstsc.exe", "+z", "/w:1024", "/h:768", "/bpp:32", "/admin", "/multimon",
|
||
|
"+fonts", "-wallpaper", "/v:localhost:3389", 0
|
||
|
};
|
||
|
|
||
|
int TestCmdLine(int argc, char* argv[])
|
||
|
{
|
||
|
int status;
|
||
|
int ret = -1;
|
||
|
DWORD flags;
|
||
|
long width = 0;
|
||
|
long height = 0;
|
||
|
COMMAND_LINE_ARGUMENT_A* arg;
|
||
|
int testArgc;
|
||
|
char** command_line;
|
||
|
COMMAND_LINE_ARGUMENT_A args[] = {
|
||
|
{ "v", COMMAND_LINE_VALUE_REQUIRED, NULL, NULL, NULL, -1, NULL, "destination server" },
|
||
|
{ "port", COMMAND_LINE_VALUE_REQUIRED, NULL, NULL, NULL, -1, NULL, "server port" },
|
||
|
{ "w", COMMAND_LINE_VALUE_REQUIRED, NULL, NULL, NULL, -1, NULL, "width" },
|
||
|
{ "h", COMMAND_LINE_VALUE_REQUIRED, NULL, NULL, NULL, -1, NULL, "height" },
|
||
|
{ "f", COMMAND_LINE_VALUE_FLAG, NULL, NULL, NULL, -1, NULL, "fullscreen" },
|
||
|
{ "bpp", COMMAND_LINE_VALUE_REQUIRED, NULL, NULL, NULL, -1, NULL,
|
||
|
"session bpp (color depth)" },
|
||
|
{ "admin", COMMAND_LINE_VALUE_FLAG, NULL, NULL, NULL, -1, "console",
|
||
|
"admin (or console) session" },
|
||
|
{ "multimon", COMMAND_LINE_VALUE_FLAG, NULL, NULL, NULL, -1, NULL, "multi-monitor" },
|
||
|
{ "a", COMMAND_LINE_VALUE_REQUIRED, NULL, NULL, NULL, -1, "addin", "addin" },
|
||
|
{ "u", COMMAND_LINE_VALUE_REQUIRED, NULL, NULL, NULL, -1, NULL, "username" },
|
||
|
{ "p", COMMAND_LINE_VALUE_REQUIRED, NULL, NULL, NULL, -1, NULL, "password" },
|
||
|
{ "d", COMMAND_LINE_VALUE_REQUIRED, NULL, NULL, NULL, -1, NULL, "domain" },
|
||
|
{ "z", COMMAND_LINE_VALUE_BOOL, NULL, BoolValueFalse, NULL, -1, NULL, "compression" },
|
||
|
{ "audio", COMMAND_LINE_VALUE_REQUIRED, NULL, NULL, NULL, -1, NULL, "audio output mode" },
|
||
|
{ "mic", COMMAND_LINE_VALUE_FLAG, NULL, NULL, NULL, -1, NULL, "audio input (microphone)" },
|
||
|
{ "fonts", COMMAND_LINE_VALUE_BOOL, NULL, BoolValueFalse, NULL, -1, NULL,
|
||
|
"smooth fonts (cleartype)" },
|
||
|
{ "aero", COMMAND_LINE_VALUE_BOOL, NULL, NULL, BoolValueFalse, -1, NULL,
|
||
|
"desktop composition" },
|
||
|
{ "window-drag", COMMAND_LINE_VALUE_BOOL, NULL, BoolValueFalse, NULL, -1, NULL,
|
||
|
"full window drag" },
|
||
|
{ "menu-anims", COMMAND_LINE_VALUE_BOOL, NULL, BoolValueFalse, NULL, -1, NULL,
|
||
|
"menu animations" },
|
||
|
{ "themes", COMMAND_LINE_VALUE_BOOL, NULL, BoolValueTrue, NULL, -1, NULL, "themes" },
|
||
|
{ "wallpaper", COMMAND_LINE_VALUE_BOOL, NULL, BoolValueTrue, NULL, -1, NULL, "wallpaper" },
|
||
|
{ "codec", COMMAND_LINE_VALUE_REQUIRED, NULL, NULL, NULL, -1, NULL, "codec" },
|
||
|
{ "nego", COMMAND_LINE_VALUE_BOOL, NULL, BoolValueTrue, NULL, -1, NULL,
|
||
|
"protocol security negotiation" },
|
||
|
{ "sec", COMMAND_LINE_VALUE_REQUIRED, NULL, NULL, NULL, -1, NULL,
|
||
|
"force specific protocol security" },
|
||
|
{ "sec-rdp", COMMAND_LINE_VALUE_BOOL, NULL, BoolValueTrue, NULL, -1, NULL,
|
||
|
"rdp protocol security" },
|
||
|
{ "sec-tls", COMMAND_LINE_VALUE_BOOL, NULL, BoolValueTrue, NULL, -1, NULL,
|
||
|
"tls protocol security" },
|
||
|
{ "sec-nla", COMMAND_LINE_VALUE_BOOL, NULL, BoolValueTrue, NULL, -1, NULL,
|
||
|
"nla protocol security" },
|
||
|
{ "sec-ext", COMMAND_LINE_VALUE_BOOL, NULL, BoolValueFalse, NULL, -1, NULL,
|
||
|
"nla extended protocol security" },
|
||
|
{ "cert-name", COMMAND_LINE_VALUE_REQUIRED, NULL, NULL, NULL, -1, NULL,
|
||
|
"certificate name" },
|
||
|
{ "cert-ignore", COMMAND_LINE_VALUE_FLAG, NULL, NULL, NULL, -1, NULL,
|
||
|
"ignore certificate" },
|
||
|
{ "version", COMMAND_LINE_VALUE_FLAG | COMMAND_LINE_PRINT_VERSION, NULL, NULL, NULL, -1,
|
||
|
NULL, "print version" },
|
||
|
{ "help", COMMAND_LINE_VALUE_FLAG | COMMAND_LINE_PRINT_HELP, NULL, NULL, NULL, -1, "?",
|
||
|
"print help" },
|
||
|
{ NULL, 0, NULL, NULL, NULL, -1, NULL, NULL }
|
||
|
};
|
||
|
|
||
|
flags = COMMAND_LINE_SIGIL_SLASH | COMMAND_LINE_SEPARATOR_COLON | COMMAND_LINE_SIGIL_PLUS_MINUS;
|
||
|
testArgc = string_list_length(testArgv);
|
||
|
command_line = string_list_copy(testArgv);
|
||
|
|
||
|
if (!command_line)
|
||
|
{
|
||
|
printf("Argument duplication failed (not enough memory?)\n");
|
||
|
return ret;
|
||
|
}
|
||
|
|
||
|
status = CommandLineParseArgumentsA(testArgc, command_line, args, flags, NULL, NULL, NULL);
|
||
|
|
||
|
if (status != 0)
|
||
|
{
|
||
|
printf("CommandLineParseArgumentsA failure: %d\n", status);
|
||
|
goto out;
|
||
|
}
|
||
|
|
||
|
arg = CommandLineFindArgumentA(args, "w");
|
||
|
|
||
|
if (strcmp("1024", arg->Value) != 0)
|
||
|
{
|
||
|
printf("CommandLineFindArgumentA: unexpected %s value %s\n", arg->Name, arg->Value);
|
||
|
goto out;
|
||
|
}
|
||
|
|
||
|
arg = CommandLineFindArgumentA(args, "h");
|
||
|
|
||
|
if (strcmp("768", arg->Value) != 0)
|
||
|
{
|
||
|
printf("CommandLineFindArgumentA: unexpected %s value %s\n", arg->Name, arg->Value);
|
||
|
goto out;
|
||
|
}
|
||
|
|
||
|
arg = CommandLineFindArgumentA(args, "f");
|
||
|
|
||
|
if (arg->Value)
|
||
|
{
|
||
|
printf("CommandLineFindArgumentA: unexpected %s value\n", arg->Name);
|
||
|
goto out;
|
||
|
}
|
||
|
|
||
|
arg = CommandLineFindArgumentA(args, "admin");
|
||
|
|
||
|
if (!arg->Value)
|
||
|
{
|
||
|
printf("CommandLineFindArgumentA: unexpected %s value\n", arg->Name);
|
||
|
goto out;
|
||
|
}
|
||
|
|
||
|
arg = CommandLineFindArgumentA(args, "multimon");
|
||
|
|
||
|
if (!arg->Value)
|
||
|
{
|
||
|
printf("CommandLineFindArgumentA: unexpected %s value\n", arg->Name);
|
||
|
goto out;
|
||
|
}
|
||
|
|
||
|
arg = CommandLineFindArgumentA(args, "v");
|
||
|
|
||
|
if (strcmp("localhost:3389", arg->Value) != 0)
|
||
|
{
|
||
|
printf("CommandLineFindArgumentA: unexpected %s value %s\n", arg->Name, arg->Value);
|
||
|
goto out;
|
||
|
}
|
||
|
|
||
|
arg = CommandLineFindArgumentA(args, "fonts");
|
||
|
|
||
|
if (!arg->Value)
|
||
|
{
|
||
|
printf("CommandLineFindArgumentA: unexpected %s value\n", arg->Name);
|
||
|
goto out;
|
||
|
}
|
||
|
|
||
|
arg = CommandLineFindArgumentA(args, "wallpaper");
|
||
|
|
||
|
if (arg->Value)
|
||
|
{
|
||
|
printf("CommandLineFindArgumentA: unexpected %s value\n", arg->Name);
|
||
|
goto out;
|
||
|
}
|
||
|
|
||
|
arg = CommandLineFindArgumentA(args, "help");
|
||
|
|
||
|
if (arg->Value)
|
||
|
{
|
||
|
printf("CommandLineFindArgumentA: unexpected %s value\n", arg->Name);
|
||
|
goto out;
|
||
|
}
|
||
|
|
||
|
arg = args;
|
||
|
errno = 0;
|
||
|
|
||
|
do
|
||
|
{
|
||
|
if (!(arg->Flags & COMMAND_LINE_VALUE_PRESENT))
|
||
|
continue;
|
||
|
|
||
|
printf("Argument: %s\n", arg->Name);
|
||
|
CommandLineSwitchStart(arg) CommandLineSwitchCase(arg, "v")
|
||
|
{
|
||
|
}
|
||
|
CommandLineSwitchCase(arg, "w")
|
||
|
{
|
||
|
width = strtol(arg->Value, NULL, 0);
|
||
|
|
||
|
if (errno != 0)
|
||
|
goto out;
|
||
|
}
|
||
|
CommandLineSwitchCase(arg, "h")
|
||
|
{
|
||
|
height = strtol(arg->Value, NULL, 0);
|
||
|
|
||
|
if (errno != 0)
|
||
|
goto out;
|
||
|
}
|
||
|
CommandLineSwitchDefault(arg)
|
||
|
{
|
||
|
}
|
||
|
CommandLineSwitchEnd(arg)
|
||
|
} while ((arg = CommandLineFindNextArgumentA(arg)) != NULL);
|
||
|
|
||
|
if ((width != 1024) || (height != 768))
|
||
|
{
|
||
|
printf("Unexpected width and height: Actual: (%ldx%ld), Expected: (1024x768)\n", width,
|
||
|
height);
|
||
|
goto out;
|
||
|
}
|
||
|
ret = 0;
|
||
|
|
||
|
out:
|
||
|
string_list_free(command_line);
|
||
|
return ret;
|
||
|
}
|