Orion Poplawski 5005bc
diff -up FreeRDP-1.2.0-beta1-android9/client/common/cmdline.c.args FreeRDP-1.2.0-beta1-android9/client/common/cmdline.c
Orion Poplawski a8547c
--- FreeRDP-1.2.0-beta1-android9/client/common/cmdline.c.args	2015-01-15 14:38:15.573870682 -0700
Orion Poplawski a8547c
+++ FreeRDP-1.2.0-beta1-android9/client/common/cmdline.c	2015-01-15 14:51:29.640391722 -0700
Orion Poplawski a8547c
@@ -1087,8 +1087,10 @@ BOOL freerdp_client_detect_command_line(
Orion Poplawski 5005bc
 	*flags |= COMMAND_LINE_SIGIL_DASH | COMMAND_LINE_SIGIL_DOUBLE_DASH;
Orion Poplawski 5005bc
 	*flags |= COMMAND_LINE_SIGIL_ENABLE_DISABLE;
Orion Poplawski 5005bc
 
Orion Poplawski 5005bc
-	if (windows_cli_count >= posix_cli_count)
Orion Poplawski a8547c
+	/* Check, if this may be windows style syntax... */
Orion Poplawski a8547c
+	if (windows_cli_count && (windows_cli_count >= posix_cli_count) || (windows_cli_status <= COMMAND_LINE_STATUS_PRINT))
Orion Poplawski 5005bc
 	{
Orion Poplawski a8547c
+		windows_cli_count = 1;
Orion Poplawski 5005bc
 		*flags = COMMAND_LINE_SEPARATOR_COLON;
Orion Poplawski 5005bc
 		*flags |= COMMAND_LINE_SIGIL_SLASH | COMMAND_LINE_SIGIL_PLUS_MINUS;
Orion Poplawski a8547c
 	}
Orion Poplawski 5005bc
diff -up FreeRDP-1.2.0-beta1-android9/client/common/compatibility.c.args FreeRDP-1.2.0-beta1-android9/client/common/compatibility.c
Orion Poplawski 5005bc
--- FreeRDP-1.2.0-beta1-android9/client/common/compatibility.c.args	2014-09-11 16:46:32.000000000 -0600
Orion Poplawski a8547c
+++ FreeRDP-1.2.0-beta1-android9/client/common/compatibility.c	2015-01-15 14:53:19.418773129 -0700
Orion Poplawski a8547c
@@ -119,16 +119,20 @@ void freerdp_client_old_parse_hostname(c
Orion Poplawski 5005bc
 
Orion Poplawski a8547c
 int freerdp_client_old_process_plugin(rdpSettings* settings, ADDIN_ARGV* args)
Orion Poplawski a8547c
 {
Orion Poplawski a8547c
+	int args_handled = 0;
Orion Poplawski a8547c
 	if (strcmp(args->argv[0], "cliprdr") == 0)
Orion Poplawski a8547c
 	{
Orion Poplawski a8547c
+		args_handled++;
Orion Poplawski a8547c
 		settings->RedirectClipboard = TRUE;
Orion Poplawski a8547c
 		DEBUG_WARN( "--plugin cliprdr -> +clipboard\n");
Orion Poplawski a8547c
 	}
Orion Poplawski a8547c
 	else if (strcmp(args->argv[0], "rdpdr") == 0)
Orion Poplawski a8547c
 	{
Orion Poplawski a8547c
+		args_handled++;
Orion Poplawski a8547c
 		if (args->argc < 2)
Orion Poplawski a8547c
-			return -1;
Orion Poplawski a8547c
+			return 1;
Orion Poplawski a8547c
 
Orion Poplawski a8547c
+		args_handled++;
Orion Poplawski a8547c
 		if ((strcmp(args->argv[1], "disk") == 0) ||
Orion Poplawski a8547c
 			(strcmp(args->argv[1], "drive") == 0))
Orion Poplawski a8547c
 		{
Orion Poplawski a8547c
@@ -156,21 +160,26 @@ int freerdp_client_old_process_plugin(rd
Orion Poplawski a8547c
 	}
Orion Poplawski a8547c
 	else if (strcmp(args->argv[0], "drdynvc") == 0)
Orion Poplawski a8547c
 	{
Orion Poplawski a8547c
+		args_handled++;
Orion Poplawski a8547c
 		freerdp_client_add_dynamic_channel(settings, args->argc - 1, &args->argv[1]);
Orion Poplawski a8547c
 	}
Orion Poplawski a8547c
 	else if (strcmp(args->argv[0], "rdpsnd") == 0)
Orion Poplawski a8547c
 	{
Orion Poplawski a8547c
+		args_handled++;
Orion Poplawski a8547c
 		if (args->argc < 2)
Orion Poplawski a8547c
-			return -1;
Orion Poplawski a8547c
+			return 1;
Orion Poplawski a8547c
 
Orion Poplawski a8547c
+		args_handled++;
Orion Poplawski a8547c
 		freerdp_addin_replace_argument_value(args, args->argv[1], "sys", args->argv[1]);
Orion Poplawski a8547c
 		freerdp_client_add_static_channel(settings, args->argc, args->argv);
Orion Poplawski a8547c
 	}
Orion Poplawski a8547c
 	else if (strcmp(args->argv[0], "rail") == 0)
Orion Poplawski a8547c
 	{
Orion Poplawski a8547c
+		args_handled++;
Orion Poplawski a8547c
 		if (args->argc < 2)
Orion Poplawski a8547c
-			return -1;
Orion Poplawski a8547c
+			return 1;
Orion Poplawski a8547c
 
Orion Poplawski a8547c
+		args_handled++;
Orion Poplawski a8547c
 		settings->RemoteApplicationProgram = _strdup(args->argv[1]);
Orion Poplawski a8547c
 	}
Orion Poplawski a8547c
 	else
Orion Poplawski a8547c
@@ -178,14 +187,12 @@ int freerdp_client_old_process_plugin(rd
Orion Poplawski a8547c
 		freerdp_client_add_static_channel(settings, args->argc, args->argv);
Orion Poplawski a8547c
 	}
Orion Poplawski a8547c
 
Orion Poplawski a8547c
-	return 1;
Orion Poplawski a8547c
+	return args_handled;
Orion Poplawski a8547c
 }
Orion Poplawski a8547c
 
Orion Poplawski a8547c
 int freerdp_client_old_command_line_pre_filter(void* context, int index, int argc, LPCSTR* argv)
Orion Poplawski a8547c
 {
Orion Poplawski a8547c
-	rdpSettings* settings;
Orion Poplawski a8547c
-
Orion Poplawski a8547c
-	settings = (rdpSettings*) context;
Orion Poplawski a8547c
+	rdpSettings* settings = (rdpSettings*) context;
Orion Poplawski a8547c
 
Orion Poplawski a8547c
 	if (index == (argc - 1))
Orion Poplawski a8547c
 	{
Orion Poplawski a8547c
@@ -201,11 +208,10 @@ int freerdp_client_old_command_line_pre_
Orion Poplawski a8547c
 				return -1;
Orion Poplawski a8547c
 			}
Orion Poplawski a8547c
 
Orion Poplawski a8547c
-			if (settings)
Orion Poplawski a8547c
-			{
Orion Poplawski a8547c
-				freerdp_client_old_parse_hostname((char*) argv[index],
Orion Poplawski a8547c
-						&settings->ServerHostname, &settings->ServerPort);
Orion Poplawski a8547c
-			}
Orion Poplawski a8547c
+			freerdp_client_old_parse_hostname((char*) argv[index],
Orion Poplawski a8547c
+					&settings->ServerHostname, &settings->ServerPort);
Orion Poplawski a8547c
+
Orion Poplawski a8547c
+			return 2;
Orion Poplawski a8547c
 		}
Orion Poplawski a8547c
 		else
Orion Poplawski a8547c
 		{
Orion Poplawski a8547c
@@ -215,6 +221,7 @@ int freerdp_client_old_command_line_pre_
Orion Poplawski a8547c
 
Orion Poplawski a8547c
 	if (strcmp("--plugin", argv[index]) == 0)
Orion Poplawski a8547c
 	{
Orion Poplawski a8547c
+		int args_handled = 0;
Orion Poplawski a8547c
 		int length;
Orion Poplawski a8547c
 		char *a, *p;
Orion Poplawski a8547c
 		int i, j, t;
Orion Poplawski a8547c
@@ -230,20 +237,19 @@ int freerdp_client_old_command_line_pre_
Orion Poplawski a8547c
 			return -1;
Orion Poplawski a8547c
 
Orion Poplawski a8547c
 		args = (ADDIN_ARGV*) malloc(sizeof(ADDIN_ARGV));
Orion Poplawski a8547c
-		args->argv = (char**) malloc(sizeof(char*) * 5);
Orion Poplawski a8547c
+		args->argv = (char**) calloc(argc, sizeof(char*));
Orion Poplawski a8547c
 		args->argc = 1;
Orion Poplawski a8547c
 
Orion Poplawski a8547c
-		args->argv[0] = _strdup(argv[t]);
Orion Poplawski a8547c
-
Orion Poplawski a8547c
 		if ((index < argc - 1) && strcmp("--data", argv[index + 1]) == 0)
Orion Poplawski a8547c
 		{
Orion Poplawski a8547c
 			i = 0;
Orion Poplawski a8547c
 			index += 2;
Orion Poplawski a8547c
-			args->argc = 1;
Orion Poplawski a8547c
 
Orion Poplawski a8547c
 			while ((index < argc) && (strcmp("--", argv[index]) != 0))
Orion Poplawski a8547c
 			{
Orion Poplawski a8547c
+				args_handled ++;
Orion Poplawski a8547c
 				args->argc = 1;
Orion Poplawski a8547c
+				args->argv[0] = _strdup(argv[t]);
Orion Poplawski a8547c
 
Orion Poplawski a8547c
 				for (j = 0, p = (char*) argv[index]; (j < 4) && (p != NULL); j++)
Orion Poplawski a8547c
 				{
Orion Poplawski a8547c
@@ -264,6 +270,9 @@ int freerdp_client_old_command_line_pre_
Orion Poplawski 5005bc
 					if (p != NULL)
Orion Poplawski a8547c
 					{
Orion Poplawski 5005bc
 						p = strchr(p, ':');
Orion Poplawski a8547c
+					}
Orion Poplawski 5005bc
+					if (p != NULL)
Orion Poplawski 5005bc
+					{
Orion Poplawski 5005bc
 						length = (int) (p - a);
Orion Poplawski 5005bc
 						args->argv[j + 1] = (char*) malloc(length + 1);
Orion Poplawski 5005bc
 						CopyMemory(args->argv[j + 1], a, length);
Orion Poplawski a8547c
@@ -278,11 +287,14 @@ int freerdp_client_old_command_line_pre_
Orion Poplawski a8547c
 					args->argc++;
Orion Poplawski a8547c
 				}
Orion Poplawski a8547c
 
Orion Poplawski a8547c
-				if (settings->instance)
Orion Poplawski a8547c
+				if (settings)
Orion Poplawski a8547c
 				{
Orion Poplawski a8547c
 					freerdp_client_old_process_plugin(settings, args);
Orion Poplawski a8547c
 				}
Orion Poplawski a8547c
 
Orion Poplawski a8547c
+				for (i = 0; i < args->argc; i++)
Orion Poplawski a8547c
+					free(args->argv[i]);
Orion Poplawski a8547c
+				memset(args->argv, 0, argc * sizeof(char*));
Orion Poplawski a8547c
 				index++;
Orion Poplawski a8547c
 				i++;
Orion Poplawski a8547c
 			}
Orion Poplawski a8547c
@@ -291,19 +303,16 @@ int freerdp_client_old_command_line_pre_
Orion Poplawski a8547c
 		{
Orion Poplawski a8547c
 			if (settings)
Orion Poplawski a8547c
 			{
Orion Poplawski a8547c
-				if (settings->instance)
Orion Poplawski a8547c
-				{
Orion Poplawski a8547c
-					freerdp_client_old_process_plugin(settings, args);
Orion Poplawski a8547c
-				}
Orion Poplawski a8547c
+				args->argv[0] = _strdup(argv[t]);
Orion Poplawski a8547c
+				args_handled = freerdp_client_old_process_plugin(settings, args);
Orion Poplawski a8547c
+				free (args->argv[0]);
Orion Poplawski a8547c
 			}
Orion Poplawski a8547c
 		}
Orion Poplawski a8547c
 
Orion Poplawski a8547c
-		for (i = 0; i < args->argc; i++)
Orion Poplawski a8547c
-			free(args->argv[i]);
Orion Poplawski a8547c
 		free(args->argv);
Orion Poplawski a8547c
 		free(args);
Orion Poplawski a8547c
 
Orion Poplawski a8547c
-		return (index - old_index);
Orion Poplawski a8547c
+		return (index - old_index) + args_handled;
Orion Poplawski a8547c
 	}
Orion Poplawski a8547c
 
Orion Poplawski a8547c
 	return 0;