e7668566fb8c8659f002fc6b55692bd52a4b3ac4vboxsync * VBoxManage - Implementation of NAT Network command command.
a0a3a26a4065b9401681a8c99a11bd83e08f94ccvboxsync * Copyright (C) 2006-2013 Oracle Corporation
e7668566fb8c8659f002fc6b55692bd52a4b3ac4vboxsync * This file is part of VirtualBox Open Source Edition (OSE), as
e7668566fb8c8659f002fc6b55692bd52a4b3ac4vboxsync * available from http://www.virtualbox.org. This file is free software;
e7668566fb8c8659f002fc6b55692bd52a4b3ac4vboxsync * you can redistribute it and/or modify it under the terms of the GNU
e7668566fb8c8659f002fc6b55692bd52a4b3ac4vboxsync * General Public License (GPL) as published by the Free Software
e7668566fb8c8659f002fc6b55692bd52a4b3ac4vboxsync * Foundation, in version 2 as it comes in the "COPYING" file of the
e7668566fb8c8659f002fc6b55692bd52a4b3ac4vboxsync * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
e7668566fb8c8659f002fc6b55692bd52a4b3ac4vboxsync * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
e7668566fb8c8659f002fc6b55692bd52a4b3ac4vboxsync/*******************************************************************************
e7668566fb8c8659f002fc6b55692bd52a4b3ac4vboxsync* Header Files *
e7668566fb8c8659f002fc6b55692bd52a4b3ac4vboxsync*******************************************************************************/
e7668566fb8c8659f002fc6b55692bd52a4b3ac4vboxsync#endif /* !VBOX_ONLY_DOCS */
e7668566fb8c8659f002fc6b55692bd52a4b3ac4vboxsyncusing namespace com;
6d73c66200a04223ae56a22ff221ec32193717a5vboxsynctypedef VPF2DELETE::const_iterator VPF2DELETEITERATOR;
63754a9ea73e5a586fef56e9085955a296342b4evboxsynctypedef std::vector<std::string> LOOPBACK2DELETEADD;
63754a9ea73e5a586fef56e9085955a296342b4evboxsynctypedef LOOPBACK2DELETEADD::iterator LOOPBACK2DELETEADDITERATOR;
e7668566fb8c8659f002fc6b55692bd52a4b3ac4vboxsyncstatic int handleOp(HandlerArg *a, OPCODE enmCode, int iStart, int *pcProcessed)
e7668566fb8c8659f002fc6b55692bd52a4b3ac4vboxsync return errorSyntax(USAGE_NATNETWORK, "Not enough parameters");
e7668566fb8c8659f002fc6b55692bd52a4b3ac4vboxsync enmCode != OP_REMOVE ? RT_ELEMENTS(g_aNATNetworkIPOptions) : 4, /* we use only --netname and --ifname for remove*/
6eb65b2eefabe4acca6c24bd794075aeb605872fvboxsync return errorSyntax(USAGE_NATNETWORK, "You can only specify --netname only once.");
6eb65b2eefabe4acca6c24bd794075aeb605872fvboxsync return errorSyntax(USAGE_NATNETWORK, "You can only specify --network only once.");
e7668566fb8c8659f002fc6b55692bd52a4b3ac4vboxsync return errorSyntax(USAGE_NATNETWORK, "You can specify either --enable or --disable once.");
e7668566fb8c8659f002fc6b55692bd52a4b3ac4vboxsync return errorSyntax(USAGE_NATNETWORK, "You can specify either --enable or --disable once.");
6eb65b2eefabe4acca6c24bd794075aeb605872fvboxsync return errorSyntax(USAGE_NATNETWORK, "You can specify --dhcp only once.");
6eb65b2eefabe4acca6c24bd794075aeb605872fvboxsync return errorSyntax(USAGE_NATNETWORK, "You can specify --ipv6 only once.");
12cbe990234bb127e4e4d2ab6c98511304193889vboxsync /* deletion */
12cbe990234bb127e4e4d2ab6c98511304193889vboxsync "loopback couldn't be deleted on modified\n");
12cbe990234bb127e4e4d2ab6c98511304193889vboxsync if (c == 'L')
12cbe990234bb127e4e4d2ab6c98511304193889vboxsync "Not enough parmaters\n");
12cbe990234bb127e4e4d2ab6c98511304193889vboxsync vLoopback2Delete.push_back(std::string(Addr2Delete.psz));
12cbe990234bb127e4e4d2ab6c98511304193889vboxsync else /* addition */
12cbe990234bb127e4e4d2ab6c98511304193889vboxsync if (c == 'L')
12cbe990234bb127e4e4d2ab6c98511304193889vboxsync vLoopback2Add.push_back(std::string(ValueUnion.psz));
6d73c66200a04223ae56a22ff221ec32193717a5vboxsync /* netPfStrToPf will clean up the Pfr */
6d73c66200a04223ae56a22ff221ec32193717a5vboxsync int irc = netPfStrToPf(ValueUnion.psz, (c == 'P'), &Pfr);
6d73c66200a04223ae56a22ff221ec32193717a5vboxsync "Invalid port-forward rule %s\n",
6d73c66200a04223ae56a22ff221ec32193717a5vboxsync "Port-forward could be deleted on modify \n");
6d73c66200a04223ae56a22ff221ec32193717a5vboxsync "Not enough parmaters\n");
6d73c66200a04223ae56a22ff221ec32193717a5vboxsync "Port-forward rule name is too long\n");
6c91bb6da5c5e29d15700a6f6da6c88463247a9fvboxsync RTStrCopy(Name2Delete.szName, PF_NAMELEN, NamePf2DeleteUnion.psz);
6eb65b2eefabe4acca6c24bd794075aeb605872fvboxsync "unhandled parameter: %s",
6d73c66200a04223ae56a22ff221ec32193717a5vboxsync "unhandled option: -%c", c);
6d73c66200a04223ae56a22ff221ec32193717a5vboxsync "unhandled option: %i", c);
6eb65b2eefabe4acca6c24bd794075aeb605872fvboxsync "You need to specify the --netname option");
e7668566fb8c8659f002fc6b55692bd52a4b3ac4vboxsync /* verification */
6eb65b2eefabe4acca6c24bd794075aeb605872fvboxsync "You need to specify the --network option");
e7668566fb8c8659f002fc6b55692bd52a4b3ac4vboxsync AssertMsgFailedReturn(("Unknown operation (:%d)", enmCode), VERR_NOT_IMPLEMENTED);
e7668566fb8c8659f002fc6b55692bd52a4b3ac4vboxsync rc = a->virtualBox->FindNATNetworkByName(NetName.mutableRaw(), net.asOutParam());
e7668566fb8c8659f002fc6b55692bd52a4b3ac4vboxsync return errorArgument("NATNetwork server already exists");
e7668566fb8c8659f002fc6b55692bd52a4b3ac4vboxsync CHECK_ERROR(a->virtualBox, CreateNATNetwork(NetName.raw(), net.asOutParam()));
e7668566fb8c8659f002fc6b55692bd52a4b3ac4vboxsync return errorArgument("Failed to create the NAT network service");
e7668566fb8c8659f002fc6b55692bd52a4b3ac4vboxsync return errorArgument("NATNetwork server does not exist");
6eb65b2eefabe4acca6c24bd794075aeb605872fvboxsync CHECK_ERROR(net, COMSETTER(Network)(Bstr(pNetworkCidr).raw()));
6eb65b2eefabe4acca6c24bd794075aeb605872fvboxsync return errorArgument("Failed to set configuration");
6eb65b2eefabe4acca6c24bd794075aeb605872fvboxsync CHECK_ERROR(net, COMSETTER(NeedDhcpServer) ((BOOL)dhcp));
6eb65b2eefabe4acca6c24bd794075aeb605872fvboxsync return errorArgument("Failed to set configuration");
6eb65b2eefabe4acca6c24bd794075aeb605872fvboxsync CHECK_ERROR(net, COMSETTER(IPv6Enabled) ((BOOL)ipv6));
6eb65b2eefabe4acca6c24bd794075aeb605872fvboxsync return errorArgument("Failed to set configuration");
6eb65b2eefabe4acca6c24bd794075aeb605872fvboxsync for (it = vPfName2Delete.begin(); it != vPfName2Delete.end(); ++it)
6eb65b2eefabe4acca6c24bd794075aeb605872fvboxsync CHECK_ERROR(net, RemovePortForwardRule((BOOL)(*it).fIPv6,
6eb65b2eefabe4acca6c24bd794075aeb605872fvboxsync for (it = vPf2Add.begin(); it != vPf2Add.end(); ++it)
6eb65b2eefabe4acca6c24bd794075aeb605872fvboxsync continue; /* XXX: warning here. */
6eb65b2eefabe4acca6c24bd794075aeb605872fvboxsync CHECK_ERROR(net, AddPortForwardRule((BOOL)(*it).fPfrIPv6,
6eb65b2eefabe4acca6c24bd794075aeb605872fvboxsync CHECK_ERROR_RET(net, COMSETTER(LoopbackIp6)(loopback6Offset), rc);
6eb65b2eefabe4acca6c24bd794075aeb605872fvboxsync /* addLocalMapping (hostid, offset) */
d32ee79929c09a2d5c985ed48c93385e9e0ee28avboxsync /* we're expecting stings 127.0.0.1=5 */
613def9d08d016040064cf7ac3033589004f8209vboxsync AssertReturn(pos != std::string::npos, errorArgument("invalid loopback string"));
6eb65b2eefabe4acca6c24bd794075aeb605872fvboxsync AssertReturn(lOffset > 0, errorArgument("invalid loopback string"));
6eb65b2eefabe4acca6c24bd794075aeb605872fvboxsync CHECK_ERROR_RET(net, AddLocalMapping(bstrAddress.raw(), lOffset), rc);
6eb65b2eefabe4acca6c24bd794075aeb605872fvboxsync /* we're expecting stings 127.0.0.1 */
6eb65b2eefabe4acca6c24bd794075aeb605872fvboxsync CHECK_ERROR_RET(net, AddLocalMapping(bstrAddress.raw(), 0), rc);
6eb65b2eefabe4acca6c24bd794075aeb605872fvboxsync CHECK_ERROR(net, COMSETTER(Enabled) ((BOOL)enable));
6eb65b2eefabe4acca6c24bd794075aeb605872fvboxsync return errorArgument("Failed to set configuration");
6eb65b2eefabe4acca6c24bd794075aeb605872fvboxsync return errorArgument("Failed to remove nat network");
e7668566fb8c8659f002fc6b55692bd52a4b3ac4vboxsync return errorSyntax(USAGE_NATNETWORK, "Not enough parameters");
e7668566fb8c8659f002fc6b55692bd52a4b3ac4vboxsync result = errorSyntax(USAGE_NATNETWORK, "Invalid parameter '%s'", Utf8Str(a->argv[0]).c_str());
e7668566fb8c8659f002fc6b55692bd52a4b3ac4vboxsync#endif /* !VBOX_ONLY_DOCS */