FreeRDP/client/test/freerdp.c

209 lines
4.8 KiB
C

/**
* FreeRDP: A Remote Desktop Protocol Client
* FreeRDP Test UI
*
* Copyright 2010 Marc-Andre Moreau <marcandre.moreau@gmail.com>
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#include <stdio.h>
#include <string.h>
#include "connection.h"
#include <freerdp/settings.h>
#include <freerdp/utils/memory.h>
#define PARAM_EQUALS(_param) (strcmp(_param, argv[*i]) == 0)
#define CHECK_VALUE_PRESENT(_msg) do { \
*i = *i + 1; \
if (*i == argc) \
{ printf(_msg "\n"); return False; } \
} while(0)
#define STRING_COPY(_str) do { \
settings->_str = xmalloc(strlen(argv[*i])); \
memcpy(settings->_str, argv[*i], strlen(argv[*i])); \
settings->_str[strlen(argv[*i])] = '\0'; \
} while(0)
boolean freerdp_process_params(int argc, char* argv[], rdpSettings* settings, int* i)
{
char* p;
if (argc < *i + 1)
{
if (*i == 1)
printf("no parameters specified.\n");
return False;
}
while (*i < argc)
{
if (PARAM_EQUALS("-a"))
{
CHECK_VALUE_PRESENT("missing server depth");
settings->color_depth = atoi(argv[*i]);
}
else if (strcmp("-u", argv[*i]) == 0)
{
CHECK_VALUE_PRESENT("missing username");
STRING_COPY(username);
}
else if (PARAM_EQUALS("-p"))
{
CHECK_VALUE_PRESENT("missing password");
STRING_COPY(password);
}
else if (PARAM_EQUALS("-d"))
{
CHECK_VALUE_PRESENT("missing domain");
STRING_COPY(domain);
}
else if (PARAM_EQUALS("-g"))
{
CHECK_VALUE_PRESENT("missing screen dimensions");
settings->width = strtol(argv[*i], &p, 10);
if (*p == 'x')
settings->height = strtol(p + 1, &p, 10);
if ((settings->width < 16) || (settings->height < 16) ||
(settings->width > 4096) || (settings->height > 4096))
{
printf("invalid screen dimensions\n");
return False;
}
}
else if (PARAM_EQUALS("-n"))
{
CHECK_VALUE_PRESENT("missing hostname");
STRING_COPY(hostname);
}
else if (PARAM_EQUALS("-o"))
{
settings->console_audio = True;
}
else if (PARAM_EQUALS("-0"))
{
settings->console_session = True;
}
else if (PARAM_EQUALS("-z"))
{
settings->compression = True;
}
else if (PARAM_EQUALS("--sec"))
{
CHECK_VALUE_PRESENT("missing protocol security");
if (PARAM_EQUALS("rdp")) /* Standard RDP */
{
settings->rdp_security = 1;
settings->tls_security = 0;
settings->nla_security = 0;
}
else if (PARAM_EQUALS("tls")) /* TLS */
{
settings->rdp_security = 0;
settings->tls_security = 1;
settings->nla_security = 0;
}
else if (PARAM_EQUALS("nla")) /* NLA */
{
settings->rdp_security = 0;
settings->tls_security = 0;
settings->nla_security = 1;
}
else
{
printf("unknown protocol security\n");
return False;
}
}
else if (PARAM_EQUALS("-h") || PARAM_EQUALS("--help"))
{
printf("help\n");
return False;
}
else if (argv[*i][0] != '-')
{
if (argv[*i][0] == '[' && (p = strchr(argv[*i], ']'))
&& (p[1] == 0 || (p[1] == ':' && !strchr(p + 2, ':'))))
{
/* Either "[...]" or "[...]:..." with at most one : after the brackets */
settings->hostname = (char*) xmalloc(strlen(argv[*i] + 1));
strncpy(settings->hostname, argv[*i] + 1, strlen(argv[*i] + 1));
if ((p = strchr((const char*)settings->hostname, ']')))
{
*p = 0;
if (p[1] == ':')
settings->port = (uint16) atoi(p + 2);
}
}
else
{
/* Port number is cut off and used if exactly one : in the string */
settings->hostname = (char*) xmalloc(strlen(argv[*i]));
strncpy(settings->hostname, argv[*i], strlen(argv[*i]));
if ((p = strchr((const char*)settings->hostname, ':')) && !strchr(p + 1, ':'))
{
*p = 0;
settings->port = (uint16) atoi(p + 1);
}
}
/*
* server hostname is the last argument for the current session.
* arguments followed will be parsed for the next session.
*/
*i = *i + 1;
return True;
}
*i = *i + 1;
}
return True;
}
int main(int argc, char* argv[])
{
rdpRdp* rdp;
int index = 1;
rdpSettings* settings;
rdp = rdp_new();
settings = rdp->settings;
if (freerdp_process_params(argc, argv, settings, &index) != True)
{
printf("failed to process parameters.\n");
return 0;
}
printf("hostname:%s username:%s password:%s\n",
settings->hostname, settings->username, settings->password);
rdp_client_connect(rdp);
return 0;
}