VBoxNetPortForwardString.cpp revision 2050786855059bc194ff2314a212acb91f36a516
/* $Id$ */
/** @file
* VBoxNetPortForwardString - Routines for managing port-forward strings.
*/
/*
* Copyright (C) 2006-2013 Oracle Corporation
*
* This file is part of VirtualBox Open Source Edition (OSE), as
* available from http://www.virtualbox.org. This file is free software;
* General Public License (GPL) as published by the Free Software
* Foundation, in version 2 as it comes in the "COPYING" file of the
* VirtualBox OSE distribution. VirtualBox OSE is distributed in the
* hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
*/
/*******************************************************************************
* Header Files *
*******************************************************************************/
#ifndef RT_OS_WINDOWS
#else
# include <Winsock2.h>
# include <Ws2ipdef.h>
#endif
#define IPv6
#include "VBoxPortForwardString.h"
#define PF_FIELD_SEPARATOR ':'
#define PF_ADDRESS_FIELD_STARTS '['
#define PF_ADDRESS_FIELD_ENDS ']'
#define PF_STR_FIELD_SEPARATOR ":"
#define PF_STR_ADDRESS_FIELD_STARTS "["
#define PF_STR_ADDRESS_FIELD_ENDS "]"
char *pszAddress, int cbAddress,
bool fEmptyAcceptable)
{
int idxRaw = 0;
int cbField = 0;
if (pszRaw[0] == PF_ADDRESS_FIELD_STARTS)
{
/* shift pszRaw to next symbol */
pszRaw++;
cbRaw--;
/* we shouldn't face with ending here */
/* no pair closing sign */
/* field should be less then the rest of the string */
if (cbField != 0)
else if (!fEmptyAcceptable)
return -1;
}
}
{
char *pszEndOfPort = NULL;
int cbRest = 0;
pszRaw++; /* skip line separator */
cbRaw --;
if (!pszEndOfPort)
{
/* XXX: Assumption that if string is too big, it will be reported by
* RTStrToUint16.
*/
if (cbRest > 0)
{
}
else
return -1;
}
else
char aszPort[10];
return -1;
return idxRaw;
}
char *pszAddress, int cbAddress,
bool fEmptyAddressAcceptable,
{
int idxRaw = 0;
int idxRawTotal = 0;
/* XXX: Here we should check 0 - ':' and 1 - '[' */
pszRaw++; /* field separator skip */
cbRaw--;
idxRaw = 0;
if (pszRaw[0] == PF_ADDRESS_FIELD_STARTS)
{
if (idxRaw == -1)
return -1;
}
else return -1;
idxRawTotal += idxRaw;
idxRaw = 0;
if (pszRaw[0] == PF_FIELD_SEPARATOR)
{
if (idxRaw == -1)
return -2;
idxRawTotal += idxRaw;
return idxRawTotal + 1;
}
else return -1; /* trailing garbage in the address */
}
/* XXX: Having fIPv6 we might emprove adress verification comparing address length
* with INET[6]_ADDRLEN
*/
{
char *pszName;
int proto;
char *pszHostAddr;
char *pszGuestAddr;
bool fTcpProto = false;
char *pszRawBegin = NULL;
int idxRaw = 0;
int cbToken = 0;
int cbRaw = 0;
int rc = VINF_SUCCESS;
/* Minimal rule ":tcp:[]:0:[]:0" has got lenght 14 */
/* name */
else
{
if (!pszEndOfName)
goto invalid_parameter;
/* XXX it's unacceptable to have only name entry in PF */
if ( cbToken < 0
goto invalid_parameter;
pszRaw);
}
/* protocol */
pszRaw++; /* skip separator */
idxRaw = 0;
cbRaw--;
{
idxRaw = 3;
}
else
goto invalid_parameter;
idxRaw = 0;
true, &u16HostPort);
if (idxRaw < 0)
return VERR_INVALID_PARAMETER;
idxRaw = 0;
false,
&u16GuestPort);
if (idxRaw < 0)
goto invalid_parameter;
/* XXX: fill the rule */
if (strlen(pszHostAddr))
{
if (!fIPv6)
#if 0 /* No IPv6 yet */
else
#endif
if (RT_FAILURE(rc))
goto invalid_parameter;
}
if (strlen(pszGuestAddr))
{
if (!fIPv6)
#if 0
else
#endif
if (RT_FAILURE(rc))
goto invalid_parameter;
}
else
goto invalid_parameter; /* guest address should be defined */
Log(("name: %s\n"
"proto: %d\n"
"host address: %s\n"
"host port: %d\n"
"guest address: %s\n"
"guest port:%d\n",
return VINF_SUCCESS;
if (pPfr)
return VERR_INVALID_PARAMETER;
}