Blame winpr/libwinpr/utils/test/TestCmdLine.c

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