{ "heartbeat", COMMAND_LINE_VALUE_BOOL, NULL, BoolValueFalse, NULL, -1, NULL, "Support heartbeat PDUs" },
{ "help", COMMAND_LINE_VALUE_FLAG | COMMAND_LINE_PRINT_HELP, NULL, NULL, NULL, -1, "?", "Print help" },
{ "home-drive", COMMAND_LINE_VALUE_BOOL, NULL, BoolValueFalse, NULL, -1, NULL, "Redirect user home as share" },
+ { "ipv6", COMMAND_LINE_VALUE_FLAG, NULL, NULL, NULL, -1, "6", "Prefer IPv6 AAA record over IPv4 A record"},
#if defined(WITH_JPEG)
{ "jpeg", COMMAND_LINE_VALUE_FLAG, NULL, NULL, NULL, -1, NULL, "Enable JPEG codec" },
{ "jpeg-quality", COMMAND_LINE_VALUE_REQUIRED, "<percentage>", NULL, NULL, -1, NULL, "JPEG quality" },
|| (arg->Flags & COMMAND_LINE_VALUE_OPTIONAL))
{
BOOL overlong = FALSE;
-
printf(" %s", "/");
if (arg->Format)
{
size_t length = (strlen(arg->Name) + strlen(arg->Format) + 2);
+
if (arg->Flags & COMMAND_LINE_VALUE_OPTIONAL)
length += 2;
printf("Multimedia Redirection: /multimedia:sys:alsa\n");
printf("USB Device Redirection: /usb:id,dev:054c:0268\n");
printf("\n");
-
printf("For Gateways, the https_proxy environment variable is respected:\n");
#ifdef _WIN32
printf(" set HTTPS_PROXY=http://proxy.contoso.com:3128/\n");
#endif
printf(" xfreerdp /g:rdp.contoso.com ...\n");
printf("\n");
-
printf("More documentation is coming, in the meantime consult source files\n");
printf("\n");
return TRUE;
if (!(settings->ConnectionFile = _strdup(argv[index])))
return COMMAND_LINE_ERROR_MEMORY;
-
return 1;
}
}
if (!(settings->AssistanceFile = _strdup(argv[index])))
return COMMAND_LINE_ERROR_MEMORY;
-
return 1;
}
}
if ((errno != 0) || (val <= 0) || (val > UINT16_MAX))
return FALSE;
+
*host = (char*) calloc(length + 1UL, sizeof(char));
if (!(*host))
}
else
{
-
if (allowUnknown)
{
flags |= COMMAND_LINE_IGN_UNKNOWN_KEYWORD;
if ((errno != 0) || (val == 0) || (val > UINT16_MAX))
return COMMAND_LINE_ERROR_UNEXPECTED_VALUE;
+
length = (int)(p - arg->Value);
settings->ServerPort = val;
settings->PercentScreenUseWidth = 1;
partial = TRUE;
}
+
if (strchr(p, 'h'))
{
settings->PercentScreenUseHeight = 1;
if ((errno != 0) || (val == 0) || (val > UINT16_MAX))
return COMMAND_LINE_ERROR_UNEXPECTED_VALUE;
+
length = (int)(p - arg->Value);
settings->GatewayPort = val;
long type;
char* pEnd;
type = strtol(arg->Value, &pEnd, 10);
+
if (errno != 0)
return COMMAND_LINE_ERROR_UNEXPECTED_VALUE;
{
settings->RedirectHomeDrive = arg->Value ? TRUE : FALSE;
}
+ CommandLineSwitchCase(arg, "ipv6")
+ {
+ settings->PreferIPv6OverIPv4 = TRUE;
+ }
CommandLineSwitchCase(arg, "clipboard")
{
settings->RedirectClipboard = arg->Value ? TRUE : FALSE;
long type;
char* pEnd;
type = strtol(arg->Value, &pEnd, 10);
+
if (errno != 0)
return COMMAND_LINE_ERROR_UNEXPECTED_VALUE;
if (arg->Value)
{
#ifdef WITH_GFX_H264
+
if (_strnicmp("AVC444", arg->Value, 6) == 0)
{
settings->GfxH264 = TRUE;
CommandLineSwitchCase(arg, "gfx-thin-client")
{
settings->GfxThinClient = arg->Value ? TRUE : FALSE;
+
if (settings->GfxThinClient)
settings->GfxSmallCache = TRUE;
+
settings->SupportGraphicsPipeline = TRUE;
}
CommandLineSwitchCase(arg, "gfx-small-cache")
if ((errno != 0) || (val > UINT32_MAX))
return COMMAND_LINE_ERROR_UNEXPECTED_VALUE;
+
settings->SendPreconnectionPdu = TRUE;
settings->PreconnectionId = val;
}
CommandLineSwitchCase(arg, "from-stdin")
{
settings->CredentialsFromStdin = TRUE;
+
if (arg->Flags & COMMAND_LINE_VALUE_PRESENT)
{
promptForPassword = (strncmp(arg->Value, "force", 6) == 0);
{
settings->NSCodec = TRUE;
}
+
#if defined(WITH_JPEG)
else if (strcmp(arg->Value, "jpeg") == 0)
{
if (settings->JpegQuality == 0)
settings->JpegQuality = 75;
}
+
#endif
}
CommandLineSwitchCase(arg, "fast-path")
int count;
count = 1;
p[0] = "echo";
+
if (!freerdp_client_add_dynamic_channel(settings, count, p))
return FALSE;
}
return bio_methods;
}
-char* freerdp_tcp_get_ip_address(int sockfd)
+static char* freerdp_tcp_get_ip_address(int sockfd, BOOL* pIPv6)
{
- BYTE* ip;
socklen_t length;
- char ipAddress[32];
+ char ipAddress[INET6_ADDRSTRLEN + 1];
struct sockaddr_in sockaddr;
length = sizeof(sockaddr);
ZeroMemory(&sockaddr, length);
- if (getsockname(sockfd, (struct sockaddr*) &sockaddr, &length) == 0)
- {
- ip = (BYTE*)(&sockaddr.sin_addr);
- sprintf_s(ipAddress, sizeof(ipAddress), "%"PRIu8".%"PRIu8".%"PRIu8".%"PRIu8"", ip[0], ip[1], ip[2],
- ip[3]);
- }
- else
+ if (getsockname(sockfd, (struct sockaddr*) &sockaddr, &length) != 0)
+ return NULL;
+
+ switch (sockaddr.sin_family)
{
- strcpy(ipAddress, "127.0.0.1");
+ case AF_INET:
+ case AF_INET6:
+ if (!inet_ntop(sockaddr.sin_family, &sockaddr.sin_addr, ipAddress, sizeof(ipAddress)))
+ return NULL;
+
+ break;
+
+ case AF_UNIX:
+ strcpy(ipAddress, "127.0.0.1");
+ break;
+
+ default:
+ return NULL;
}
+ if (pIPv6)
+ *pIPv6 = (sockaddr.sin_family == AF_INET6);
+
return _strdup(ipAddress);
}
}
static int freerdp_tcp_connect_multi(rdpContext* context, char** hostnames,
- UINT32* ports, int count, int port,
+ UINT32* ports, UINT32 count, int port,
int timeout)
{
int index;
#endif
#ifndef SOL_TCP
-/* "tcp" from /etc/protocols as getprotobyname(3C) */
+ /* "tcp" from /etc/protocols as getprotobyname(3C) */
#define SOL_TCP 6
#endif
#ifdef TCP_KEEPCNT
addr = result;
- if ((addr->ai_family == AF_INET6) && (addr->ai_next != 0))
+ if ((addr->ai_family == AF_INET6) && (addr->ai_next != 0) && !settings->PreferIPv6OverIPv4)
{
while ((addr = addr->ai_next))
{
}
}
- settings->IPv6Enabled = FALSE;
free(settings->ClientAddress);
- settings->ClientAddress = freerdp_tcp_get_ip_address(sockfd);
+ settings->ClientAddress = freerdp_tcp_get_ip_address(sockfd, &settings->IPv6Enabled);
if (!settings->ClientAddress)
{