1980 lines
64 KiB
C
1980 lines
64 KiB
C
/* -*- buffer-read-only: t -*- vi: set ro:
|
|
*
|
|
* DO NOT EDIT THIS FILE (tcpbridge_opts.c)
|
|
*
|
|
* It has been AutoGen-ed April 4, 2010 at 05:59:19 PM by AutoGen 5.9.9
|
|
* From the definitions tcpbridge_opts.def
|
|
* and the template file options
|
|
*
|
|
* Generated from AutoOpts 32:2:7 templates.
|
|
*/
|
|
|
|
/*
|
|
* This file was produced by an AutoOpts template. AutoOpts is a
|
|
* copyrighted work. This source file is not encumbered by AutoOpts
|
|
* licensing, but is provided under the licensing terms chosen by the
|
|
* tcpbridge author or copyright holder. AutoOpts is licensed under
|
|
* the terms of the LGPL. The redistributable library (``libopts'') is
|
|
* licensed under the terms of either the LGPL or, at the users discretion,
|
|
* the BSD license. See the AutoOpts and/or libopts sources for details.
|
|
*
|
|
* This source file is copyrighted and licensed under the following terms:
|
|
*
|
|
* tcpbridge copyright (c) 2000-2010 Aaron Turner - all rights reserved
|
|
*
|
|
* tcpbridge is free software copyrighted by Aaron Turner.
|
|
*
|
|
* Redistribution and use in source and binary forms, with or without
|
|
* modification, are permitted provided that the following conditions
|
|
* are met:
|
|
* 1. Redistributions of source code must retain the above copyright
|
|
* notice, this list of conditions and the following disclaimer.
|
|
* 2. Redistributions in binary form must reproduce the above copyright
|
|
* notice, this list of conditions and the following disclaimer in the
|
|
* documentation and/or other materials provided with the distribution.
|
|
* 3. Neither the name ``Aaron Turner'' nor the name of any other
|
|
* contributor may be used to endorse or promote products derived
|
|
* from this software without specific prior written permission.
|
|
*
|
|
* tcpbridge IS PROVIDED BY Aaron Turner ``AS IS'' AND ANY EXPRESS
|
|
* OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
|
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
|
* ARE DISCLAIMED. IN NO EVENT SHALL Aaron Turner OR ANY OTHER CONTRIBUTORS
|
|
* BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
|
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
|
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
|
|
* BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
|
|
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
|
|
* OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
|
|
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
*/
|
|
|
|
#include <sys/types.h>
|
|
#include <limits.h>
|
|
#include <stdio.h>
|
|
#include <stdlib.h>
|
|
#include <errno.h>
|
|
extern FILE * option_usage_fp;
|
|
#define OPTION_CODE_COMPILE 1
|
|
#include "tcpbridge_opts.h"
|
|
|
|
#ifdef __cplusplus
|
|
extern "C" {
|
|
#endif
|
|
|
|
/* TRANSLATORS: choose the translation for option names wisely because you
|
|
cannot ever change your mind. */
|
|
tSCC zCopyright[] =
|
|
"tcpbridge copyright (c) 2000-2010 Aaron Turner, all rights reserved";
|
|
tSCC zCopyrightNotice[1458] =
|
|
"tcpbridge is free software copyrighted by Aaron Turner.\n\n\
|
|
Redistribution and use in source and binary forms, with or without\n\
|
|
modification, are permitted provided that the following conditions are met: 1.\n\
|
|
Redistributions of source code must retain the above copyright notice, this\n\
|
|
list of conditions and the following disclaimer. 2. Redistributions in binary\n\
|
|
form must reproduce the above copyright notice, this list of conditions and the\n\
|
|
following disclaimer in the documentation and/or other materials provided with\n\
|
|
the distribution. 3. Neither the name ``Aaron Turner'' nor the name of any\n\
|
|
other contributor may be used to endorse or promote products derived from this\n\
|
|
software without specific prior written permission.\n\n\
|
|
tcpbridge IS PROVIDED BY Aaron Turner ``AS IS'' AND ANY EXPRESS OR IMPLIED\n\
|
|
WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF\n\
|
|
MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO\n\
|
|
EVENT SHALL Aaron Turner OR ANY OTHER CONTRIBUTORS BE LIABLE FOR ANY DIRECT,\n\
|
|
INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,\n\
|
|
BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n\
|
|
DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF\n\
|
|
LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE\n\
|
|
OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF\n\
|
|
ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.";
|
|
|
|
extern tUsageProc optionUsage;
|
|
|
|
/*
|
|
* global included definitions
|
|
*/
|
|
#include "defines.h"
|
|
#include "tcpbridge.h"
|
|
#include "common.h"
|
|
#include "config.h"
|
|
#include <stdlib.h>
|
|
#include <string.h>
|
|
#include <sys/types.h>
|
|
#include <unistd.h>
|
|
extern tcpbridge_opt_t options;
|
|
|
|
|
|
#ifndef NULL
|
|
# define NULL 0
|
|
#endif
|
|
#ifndef EXIT_SUCCESS
|
|
# define EXIT_SUCCESS 0
|
|
#endif
|
|
#ifndef EXIT_FAILURE
|
|
# define EXIT_FAILURE 1
|
|
#endif
|
|
/*
|
|
* Tcpedit option description:
|
|
*/
|
|
tSCC zTcpeditText[] =
|
|
"";
|
|
#define TCPEDIT_FLAGS (OPTST_DOCUMENT | OPTST_NO_INIT)
|
|
|
|
/*
|
|
* Portmap option description:
|
|
*/
|
|
tSCC zPortmapText[] =
|
|
"Rewrite TCP/UDP ports";
|
|
tSCC zPortmap_NAME[] = "PORTMAP";
|
|
tSCC zPortmap_Name[] = "portmap";
|
|
#define PORTMAP_FLAGS (OPTST_DISABLED | OPTST_STACKED \
|
|
| OPTST_SET_ARGTYPE(OPARG_TYPE_STRING))
|
|
|
|
/*
|
|
* Seed option description:
|
|
*/
|
|
tSCC zSeedText[] =
|
|
"Randomize src/dst IPv4/v6 addresses w/ given seed";
|
|
tSCC zSeed_NAME[] = "SEED";
|
|
tSCC zSeed_Name[] = "seed";
|
|
#define SEED_FLAGS (OPTST_DISABLED \
|
|
| OPTST_SET_ARGTYPE(OPARG_TYPE_NUMERIC))
|
|
|
|
/*
|
|
* Pnat option description with
|
|
* "Must also have options" and "Incompatible options":
|
|
*/
|
|
tSCC zPnatText[] =
|
|
"Rewrite IPv4/v6 addresses using pseudo-NAT";
|
|
tSCC zPnat_NAME[] = "PNAT";
|
|
tSCC zPnat_Name[] = "pnat";
|
|
static const int
|
|
aPnatCantList[] = {
|
|
INDEX_OPT_SRCIPMAP, NO_EQUIVALENT };
|
|
#define PNAT_FLAGS (OPTST_DISABLED | OPTST_STACKED \
|
|
| OPTST_SET_ARGTYPE(OPARG_TYPE_STRING))
|
|
|
|
/*
|
|
* Srcipmap option description with
|
|
* "Must also have options" and "Incompatible options":
|
|
*/
|
|
tSCC zSrcipmapText[] =
|
|
"Rewrite source IPv4/v6 addresses using pseudo-NAT";
|
|
tSCC zSrcipmap_NAME[] = "SRCIPMAP";
|
|
tSCC zSrcipmap_Name[] = "srcipmap";
|
|
static const int
|
|
aSrcipmapCantList[] = {
|
|
INDEX_OPT_PNAT, NO_EQUIVALENT };
|
|
#define SRCIPMAP_FLAGS (OPTST_DISABLED \
|
|
| OPTST_SET_ARGTYPE(OPARG_TYPE_STRING))
|
|
|
|
/*
|
|
* Dstipmap option description with
|
|
* "Must also have options" and "Incompatible options":
|
|
*/
|
|
tSCC zDstipmapText[] =
|
|
"Rewrite destination IPv4/v6 addresses using pseudo-NAT";
|
|
tSCC zDstipmap_NAME[] = "DSTIPMAP";
|
|
tSCC zDstipmap_Name[] = "dstipmap";
|
|
static const int
|
|
aDstipmapCantList[] = {
|
|
INDEX_OPT_PNAT, NO_EQUIVALENT };
|
|
#define DSTIPMAP_FLAGS (OPTST_DISABLED \
|
|
| OPTST_SET_ARGTYPE(OPARG_TYPE_STRING))
|
|
|
|
/*
|
|
* Endpoints option description with
|
|
* "Must also have options" and "Incompatible options":
|
|
*/
|
|
#ifdef HAVE_CACHEFILE_SUPPORT
|
|
tSCC zEndpointsText[] =
|
|
"Rewrite IP addresses to be between two endpoints";
|
|
tSCC zEndpoints_NAME[] = "ENDPOINTS";
|
|
tSCC zEndpoints_Name[] = "endpoints";
|
|
static const int
|
|
aEndpointsMustList[] = {
|
|
INDEX_OPT_CACHEFILE, NO_EQUIVALENT };
|
|
#define ENDPOINTS_FLAGS (OPTST_DISABLED \
|
|
| OPTST_SET_ARGTYPE(OPARG_TYPE_STRING))
|
|
|
|
#else /* disable Endpoints */
|
|
#define VALUE_OPT_ENDPOINTS NO_EQUIVALENT
|
|
#define ENDPOINTS_FLAGS (OPTST_OMITTED | OPTST_NO_INIT)
|
|
#define aEndpointsMustList NULL
|
|
#define zEndpointsText NULL
|
|
#define zEndpoints_NAME NULL
|
|
#define zEndpoints_Name NULL
|
|
#endif /* HAVE_CACHEFILE_SUPPORT */
|
|
|
|
/*
|
|
* Skipbroadcast option description:
|
|
*/
|
|
tSCC zSkipbroadcastText[] =
|
|
"Skip rewriting broadcast/multicast IPv4/v6 addresses";
|
|
tSCC zSkipbroadcast_NAME[] = "SKIPBROADCAST";
|
|
tSCC zSkipbroadcast_Name[] = "skipbroadcast";
|
|
#define SKIPBROADCAST_FLAGS (OPTST_DISABLED)
|
|
|
|
/*
|
|
* Fixcsum option description:
|
|
*/
|
|
tSCC zFixcsumText[] =
|
|
"Force recalculation of IPv4/TCP/UDP header checksums";
|
|
tSCC zFixcsum_NAME[] = "FIXCSUM";
|
|
tSCC zFixcsum_Name[] = "fixcsum";
|
|
#define FIXCSUM_FLAGS (OPTST_DISABLED)
|
|
|
|
/*
|
|
* Mtu option description:
|
|
*/
|
|
tSCC zMtuText[] =
|
|
"Override default MTU length (1500 bytes)";
|
|
tSCC zMtu_NAME[] = "MTU";
|
|
tSCC zMtu_Name[] = "mtu";
|
|
#define MTU_FLAGS (OPTST_DISABLED \
|
|
| OPTST_SET_ARGTYPE(OPARG_TYPE_NUMERIC))
|
|
|
|
/*
|
|
* Mtu_Trunc option description:
|
|
*/
|
|
tSCC zMtu_TruncText[] =
|
|
"Truncate packets larger then specified MTU";
|
|
tSCC zMtu_Trunc_NAME[] = "MTU_TRUNC";
|
|
tSCC zMtu_Trunc_Name[] = "mtu-trunc";
|
|
#define MTU_TRUNC_FLAGS (OPTST_DISABLED)
|
|
|
|
/*
|
|
* Efcs option description:
|
|
*/
|
|
tSCC zEfcsText[] =
|
|
"Remove Ethernet checksums (FCS) from end of frames";
|
|
tSCC zEfcs_NAME[] = "EFCS";
|
|
tSCC zEfcs_Name[] = "efcs";
|
|
#define EFCS_FLAGS (OPTST_DISABLED)
|
|
|
|
/*
|
|
* Ttl option description:
|
|
*/
|
|
tSCC zTtlText[] =
|
|
"Modify the IPv4/v6 TTL/Hop Limit";
|
|
tSCC zTtl_NAME[] = "TTL";
|
|
tSCC zTtl_Name[] = "ttl";
|
|
#define TTL_FLAGS (OPTST_DISABLED \
|
|
| OPTST_SET_ARGTYPE(OPARG_TYPE_STRING))
|
|
|
|
/*
|
|
* Tos option description:
|
|
*/
|
|
tSCC zTosText[] =
|
|
"Set the IPv4 TOS/DiffServ/ECN byte";
|
|
tSCC zTos_NAME[] = "TOS";
|
|
tSCC zTos_Name[] = "tos";
|
|
#define TOS_FLAGS (OPTST_DISABLED \
|
|
| OPTST_SET_ARGTYPE(OPARG_TYPE_NUMERIC))
|
|
|
|
/*
|
|
* Tclass option description:
|
|
*/
|
|
tSCC zTclassText[] =
|
|
"Set the IPv6 Traffic Class byte";
|
|
tSCC zTclass_NAME[] = "TCLASS";
|
|
tSCC zTclass_Name[] = "tclass";
|
|
#define TCLASS_FLAGS (OPTST_DISABLED \
|
|
| OPTST_SET_ARGTYPE(OPARG_TYPE_NUMERIC))
|
|
|
|
/*
|
|
* Flowlabel option description:
|
|
*/
|
|
tSCC zFlowlabelText[] =
|
|
"Set the IPv6 Flow Label";
|
|
tSCC zFlowlabel_NAME[] = "FLOWLABEL";
|
|
tSCC zFlowlabel_Name[] = "flowlabel";
|
|
#define FLOWLABEL_FLAGS (OPTST_DISABLED \
|
|
| OPTST_SET_ARGTYPE(OPARG_TYPE_NUMERIC))
|
|
|
|
/*
|
|
* Fixlen option description:
|
|
*/
|
|
tSCC zFixlenText[] =
|
|
"Pad or truncate packet data to match header length";
|
|
tSCC zFixlen_NAME[] = "FIXLEN";
|
|
tSCC zFixlen_Name[] = "fixlen";
|
|
#define FIXLEN_FLAGS (OPTST_DISABLED \
|
|
| OPTST_SET_ARGTYPE(OPARG_TYPE_STRING))
|
|
|
|
/*
|
|
* Skipl2broadcast option description:
|
|
*/
|
|
tSCC zSkipl2broadcastText[] =
|
|
"Skip rewriting broadcast/multicast Layer 2 addresses";
|
|
tSCC zSkipl2broadcast_NAME[] = "SKIPL2BROADCAST";
|
|
tSCC zSkipl2broadcast_Name[] = "skipl2broadcast";
|
|
#define SKIPL2BROADCAST_FLAGS (OPTST_DISABLED)
|
|
|
|
/*
|
|
* Dlt option description:
|
|
*/
|
|
tSCC zDltText[] =
|
|
"Override output DLT encapsulation";
|
|
tSCC zDlt_NAME[] = "DLT";
|
|
tSCC zDlt_Name[] = "dlt";
|
|
#define DLT_FLAGS (OPTST_DISABLED \
|
|
| OPTST_SET_ARGTYPE(OPARG_TYPE_STRING))
|
|
|
|
/*
|
|
* Enet_Dmac option description:
|
|
*/
|
|
tSCC zEnet_DmacText[] =
|
|
"Override destination ethernet MAC addresses";
|
|
tSCC zEnet_Dmac_NAME[] = "ENET_DMAC";
|
|
tSCC zEnet_Dmac_Name[] = "enet-dmac";
|
|
#define ENET_DMAC_FLAGS (OPTST_DISABLED \
|
|
| OPTST_SET_ARGTYPE(OPARG_TYPE_STRING))
|
|
|
|
/*
|
|
* Enet_Smac option description:
|
|
*/
|
|
tSCC zEnet_SmacText[] =
|
|
"Override source ethernet MAC addresses";
|
|
tSCC zEnet_Smac_NAME[] = "ENET_SMAC";
|
|
tSCC zEnet_Smac_Name[] = "enet-smac";
|
|
#define ENET_SMAC_FLAGS (OPTST_DISABLED \
|
|
| OPTST_SET_ARGTYPE(OPARG_TYPE_STRING))
|
|
|
|
/*
|
|
* Enet_Vlan option description:
|
|
*/
|
|
tSCC zEnet_VlanText[] =
|
|
"Specify ethernet 802.1q VLAN tag mode";
|
|
tSCC zEnet_Vlan_NAME[] = "ENET_VLAN";
|
|
tSCC zEnet_Vlan_Name[] = "enet-vlan";
|
|
#define ENET_VLAN_FLAGS (OPTST_DISABLED \
|
|
| OPTST_SET_ARGTYPE(OPARG_TYPE_STRING))
|
|
|
|
/*
|
|
* Enet_Vlan_Tag option description with
|
|
* "Must also have options" and "Incompatible options":
|
|
*/
|
|
tSCC zEnet_Vlan_TagText[] =
|
|
"Specify the new ethernet 802.1q VLAN tag value";
|
|
tSCC zEnet_Vlan_Tag_NAME[] = "ENET_VLAN_TAG";
|
|
tSCC zEnet_Vlan_Tag_Name[] = "enet-vlan-tag";
|
|
static const int
|
|
aEnet_Vlan_TagMustList[] = {
|
|
INDEX_OPT_ENET_VLAN, NO_EQUIVALENT };
|
|
#define ENET_VLAN_TAG_FLAGS (OPTST_DISABLED \
|
|
| OPTST_SET_ARGTYPE(OPARG_TYPE_NUMERIC))
|
|
|
|
/*
|
|
* Enet_Vlan_Cfi option description with
|
|
* "Must also have options" and "Incompatible options":
|
|
*/
|
|
tSCC zEnet_Vlan_CfiText[] =
|
|
"Specify the ethernet 802.1q VLAN CFI value";
|
|
tSCC zEnet_Vlan_Cfi_NAME[] = "ENET_VLAN_CFI";
|
|
tSCC zEnet_Vlan_Cfi_Name[] = "enet-vlan-cfi";
|
|
static const int
|
|
aEnet_Vlan_CfiMustList[] = {
|
|
INDEX_OPT_ENET_VLAN, NO_EQUIVALENT };
|
|
#define ENET_VLAN_CFI_FLAGS (OPTST_DISABLED \
|
|
| OPTST_SET_ARGTYPE(OPARG_TYPE_NUMERIC))
|
|
|
|
/*
|
|
* Enet_Vlan_Pri option description with
|
|
* "Must also have options" and "Incompatible options":
|
|
*/
|
|
tSCC zEnet_Vlan_PriText[] =
|
|
"Specify the ethernet 802.1q VLAN priority";
|
|
tSCC zEnet_Vlan_Pri_NAME[] = "ENET_VLAN_PRI";
|
|
tSCC zEnet_Vlan_Pri_Name[] = "enet-vlan-pri";
|
|
static const int
|
|
aEnet_Vlan_PriMustList[] = {
|
|
INDEX_OPT_ENET_VLAN, NO_EQUIVALENT };
|
|
#define ENET_VLAN_PRI_FLAGS (OPTST_DISABLED \
|
|
| OPTST_SET_ARGTYPE(OPARG_TYPE_NUMERIC))
|
|
|
|
/*
|
|
* Hdlc_Control option description:
|
|
*/
|
|
tSCC zHdlc_ControlText[] =
|
|
"Specify HDLC control value";
|
|
tSCC zHdlc_Control_NAME[] = "HDLC_CONTROL";
|
|
tSCC zHdlc_Control_Name[] = "hdlc-control";
|
|
#define HDLC_CONTROL_FLAGS (OPTST_DISABLED \
|
|
| OPTST_SET_ARGTYPE(OPARG_TYPE_NUMERIC))
|
|
|
|
/*
|
|
* Hdlc_Address option description:
|
|
*/
|
|
tSCC zHdlc_AddressText[] =
|
|
"Specify HDLC address";
|
|
tSCC zHdlc_Address_NAME[] = "HDLC_ADDRESS";
|
|
tSCC zHdlc_Address_Name[] = "hdlc-address";
|
|
#define HDLC_ADDRESS_FLAGS (OPTST_DISABLED \
|
|
| OPTST_SET_ARGTYPE(OPARG_TYPE_NUMERIC))
|
|
|
|
/*
|
|
* User_Dlt option description:
|
|
*/
|
|
tSCC zUser_DltText[] =
|
|
"Set output file DLT type";
|
|
tSCC zUser_Dlt_NAME[] = "USER_DLT";
|
|
tSCC zUser_Dlt_Name[] = "user-dlt";
|
|
#define USER_DLT_FLAGS (OPTST_DISABLED \
|
|
| OPTST_SET_ARGTYPE(OPARG_TYPE_NUMERIC))
|
|
|
|
/*
|
|
* User_Dlink option description:
|
|
*/
|
|
tSCC zUser_DlinkText[] =
|
|
"Rewrite Data-Link layer with user specified data";
|
|
tSCC zUser_Dlink_NAME[] = "USER_DLINK";
|
|
tSCC zUser_Dlink_Name[] = "user-dlink";
|
|
#define USER_DLINK_FLAGS (OPTST_DISABLED | OPTST_STACKED \
|
|
| OPTST_SET_ARGTYPE(OPARG_TYPE_STRING))
|
|
|
|
/*
|
|
* Dbug option description:
|
|
*/
|
|
#ifdef DEBUG
|
|
tSCC zDbugText[] =
|
|
"Enable debugging output";
|
|
tSCC zDbug_NAME[] = "DBUG";
|
|
tSCC zDbug_Name[] = "dbug";
|
|
#define zDbugDefaultArg ((char const*)0)
|
|
#define DBUG_FLAGS (OPTST_DISABLED | OPTST_IMM \
|
|
| OPTST_SET_ARGTYPE(OPARG_TYPE_NUMERIC))
|
|
|
|
#else /* disable Dbug */
|
|
#define VALUE_OPT_DBUG NO_EQUIVALENT
|
|
#define DBUG_FLAGS (OPTST_OMITTED | OPTST_NO_INIT)
|
|
#define zDbugDefaultArg NULL
|
|
#define zDbugText NULL
|
|
#define zDbug_NAME NULL
|
|
#define zDbug_Name NULL
|
|
#endif /* DEBUG */
|
|
|
|
/*
|
|
* Intf1 option description:
|
|
*/
|
|
tSCC zIntf1Text[] =
|
|
"Primary interface (listen in uni-directional mode)";
|
|
tSCC zIntf1_NAME[] = "INTF1";
|
|
tSCC zIntf1_Name[] = "intf1";
|
|
#define INTF1_FLAGS (OPTST_DISABLED | OPTST_MUST_SET \
|
|
| OPTST_SET_ARGTYPE(OPARG_TYPE_STRING))
|
|
|
|
/*
|
|
* Intf2 option description:
|
|
*/
|
|
tSCC zIntf2Text[] =
|
|
"Secondary interface (send in uni-directional mode)";
|
|
tSCC zIntf2_NAME[] = "INTF2";
|
|
tSCC zIntf2_Name[] = "intf2";
|
|
#define INTF2_FLAGS (OPTST_DISABLED \
|
|
| OPTST_SET_ARGTYPE(OPARG_TYPE_STRING))
|
|
|
|
/*
|
|
* Unidir option description:
|
|
*/
|
|
tSCC zUnidirText[] =
|
|
"Send and receive in only one direction";
|
|
tSCC zUnidir_NAME[] = "UNIDIR";
|
|
tSCC zUnidir_Name[] = "unidir";
|
|
#define UNIDIR_FLAGS (OPTST_DISABLED)
|
|
|
|
/*
|
|
* Listnics option description:
|
|
*/
|
|
#ifdef ENABLE_PCAP_FINDALLDEVS
|
|
tSCC zListnicsText[] =
|
|
"List available network interfaces and exit";
|
|
tSCC zListnics_NAME[] = "LISTNICS";
|
|
tSCC zListnics_Name[] = "listnics";
|
|
#define LISTNICS_FLAGS (OPTST_DISABLED | OPTST_IMM)
|
|
|
|
#else /* disable Listnics */
|
|
#define VALUE_OPT_LISTNICS NO_EQUIVALENT
|
|
#define LISTNICS_FLAGS (OPTST_OMITTED | OPTST_NO_INIT)
|
|
#define zListnicsText NULL
|
|
#define zListnics_NAME NULL
|
|
#define zListnics_Name NULL
|
|
#endif /* ENABLE_PCAP_FINDALLDEVS */
|
|
|
|
/*
|
|
* Limit option description:
|
|
*/
|
|
tSCC zLimitText[] =
|
|
"Limit the number of packets to send";
|
|
tSCC zLimit_NAME[] = "LIMIT";
|
|
tSCC zLimit_Name[] = "limit";
|
|
#define zLimitDefaultArg ((char const*)-1)
|
|
#define LIMIT_FLAGS (OPTST_DISABLED \
|
|
| OPTST_SET_ARGTYPE(OPARG_TYPE_NUMERIC))
|
|
|
|
/*
|
|
* Mac option description:
|
|
*/
|
|
tSCC zMacText[] =
|
|
"MAC addresses of local NIC's";
|
|
tSCC zMac_NAME[] = "MAC";
|
|
tSCC zMac_Name[] = "mac";
|
|
#define MAC_FLAGS (OPTST_DISABLED | OPTST_STACKED \
|
|
| OPTST_SET_ARGTYPE(OPARG_TYPE_STRING))
|
|
|
|
/*
|
|
* Include option description with
|
|
* "Must also have options" and "Incompatible options":
|
|
*/
|
|
tSCC zIncludeText[] =
|
|
"Include only packets matching rule";
|
|
tSCC zInclude_NAME[] = "INCLUDE";
|
|
tSCC zInclude_Name[] = "include";
|
|
static const int
|
|
aIncludeCantList[] = {
|
|
INDEX_OPT_EXCLUDE, NO_EQUIVALENT };
|
|
#define INCLUDE_FLAGS (OPTST_DISABLED \
|
|
| OPTST_SET_ARGTYPE(OPARG_TYPE_STRING))
|
|
|
|
/*
|
|
* Exclude option description with
|
|
* "Must also have options" and "Incompatible options":
|
|
*/
|
|
tSCC zExcludeText[] =
|
|
"Exclude any packet matching this rule";
|
|
tSCC zExclude_NAME[] = "EXCLUDE";
|
|
tSCC zExclude_Name[] = "exclude";
|
|
static const int
|
|
aExcludeCantList[] = {
|
|
INDEX_OPT_INCLUDE, NO_EQUIVALENT };
|
|
#define EXCLUDE_FLAGS (OPTST_DISABLED \
|
|
| OPTST_SET_ARGTYPE(OPARG_TYPE_STRING))
|
|
|
|
/*
|
|
* Pid option description:
|
|
*/
|
|
tSCC zPidText[] =
|
|
"Print the PID of tcpbridge at startup";
|
|
tSCC zPid_NAME[] = "PID";
|
|
tSCC zPid_Name[] = "pid";
|
|
#define PID_FLAGS (OPTST_DISABLED)
|
|
|
|
/*
|
|
* Verbose option description:
|
|
*/
|
|
#ifdef ENABLE_VERBOSE
|
|
tSCC zVerboseText[] =
|
|
"Print decoded packets via tcpdump to STDOUT";
|
|
tSCC zVerbose_NAME[] = "VERBOSE";
|
|
tSCC zVerbose_Name[] = "verbose";
|
|
#define VERBOSE_FLAGS (OPTST_DISABLED | OPTST_IMM)
|
|
|
|
#else /* disable Verbose */
|
|
#define VALUE_OPT_VERBOSE NO_EQUIVALENT
|
|
#define VERBOSE_FLAGS (OPTST_OMITTED | OPTST_NO_INIT)
|
|
#define zVerboseText NULL
|
|
#define zVerbose_NAME NULL
|
|
#define zVerbose_Name NULL
|
|
#endif /* ENABLE_VERBOSE */
|
|
|
|
/*
|
|
* Decode option description with
|
|
* "Must also have options" and "Incompatible options":
|
|
*/
|
|
#ifdef ENABLE_VERBOSE
|
|
tSCC zDecodeText[] =
|
|
"Arguments passed to tcpdump decoder";
|
|
tSCC zDecode_NAME[] = "DECODE";
|
|
tSCC zDecode_Name[] = "decode";
|
|
static const int
|
|
aDecodeMustList[] = {
|
|
INDEX_OPT_VERBOSE, NO_EQUIVALENT };
|
|
#define DECODE_FLAGS (OPTST_DISABLED \
|
|
| OPTST_SET_ARGTYPE(OPARG_TYPE_STRING))
|
|
|
|
#else /* disable Decode */
|
|
#define VALUE_OPT_DECODE NO_EQUIVALENT
|
|
#define DECODE_FLAGS (OPTST_OMITTED | OPTST_NO_INIT)
|
|
#define aDecodeMustList NULL
|
|
#define zDecodeText NULL
|
|
#define zDecode_NAME NULL
|
|
#define zDecode_Name NULL
|
|
#endif /* ENABLE_VERBOSE */
|
|
|
|
/*
|
|
* Version option description:
|
|
*/
|
|
tSCC zVersionText[] =
|
|
"Print version information";
|
|
tSCC zVersion_NAME[] = "VERSION";
|
|
tSCC zVersion_Name[] = "version";
|
|
#define VERSION_FLAGS (OPTST_DISABLED)
|
|
|
|
/*
|
|
* Less_Help option description:
|
|
*/
|
|
tSCC zLess_HelpText[] =
|
|
"Display less usage information and exit";
|
|
tSCC zLess_Help_NAME[] = "LESS_HELP";
|
|
tSCC zLess_Help_Name[] = "less-help";
|
|
#define LESS_HELP_FLAGS (OPTST_DISABLED | OPTST_IMM)
|
|
|
|
/*
|
|
* Help/More_Help option descriptions:
|
|
*/
|
|
tSCC zHelpText[] = "Display usage information and exit";
|
|
tSCC zHelp_Name[] = "help";
|
|
tSCC zMore_HelpText[] = "Extended usage information passed thru pager";
|
|
tSCC zMore_Help_Name[] = "more-help";
|
|
tSCC zSave_OptsText[] = "Save the option state to a config file";
|
|
tSCC zSave_Opts_Name[] = "save-opts";
|
|
tSCC zLoad_OptsText[] = "Load options from a config file";
|
|
tSCC zLoad_Opts_NAME[] = "LOAD_OPTS";
|
|
tSCC zNotLoad_Opts_Name[] = "no-load-opts";
|
|
tSCC zNotLoad_Opts_Pfx[] = "no";
|
|
#define zLoad_Opts_Name (zNotLoad_Opts_Name + 3)
|
|
/*
|
|
* Declare option callback procedures
|
|
*/
|
|
#ifdef DEBUG
|
|
static tOptProc doOptDbug;
|
|
#else /* not DEBUG */
|
|
# define doOptDbug NULL
|
|
#endif /* def/not DEBUG */
|
|
#ifdef ENABLE_PCAP_FINDALLDEVS
|
|
static tOptProc doOptListnics;
|
|
#else /* not ENABLE_PCAP_FINDALLDEVS */
|
|
# define doOptListnics NULL
|
|
#endif /* def/not ENABLE_PCAP_FINDALLDEVS */
|
|
extern tOptProc
|
|
optionNumericVal, optionPagedUsage, optionStackArg;
|
|
static tOptProc
|
|
doOptEnet_Vlan_Cfi, doOptEnet_Vlan_Pri, doOptEnet_Vlan_Tag,
|
|
doOptExclude, doOptFlowlabel, doOptInclude,
|
|
doOptLess_Help, doOptLimit, doOptMtu,
|
|
doOptPid, doOptTclass, doOptTos,
|
|
doOptVersion, doUsageOpt;
|
|
|
|
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
|
|
*
|
|
* Define the Tcpbridge Option Descriptions.
|
|
*/
|
|
static tOptDesc optDesc[ OPTION_CT ] = {
|
|
{ /* entry idx, value */ 0, 0,
|
|
/* equiv idx, value */ 0, 0,
|
|
/* equivalenced to */ NO_EQUIVALENT,
|
|
/* min, max, act ct */ 0, 0, 0,
|
|
/* opt state flags */ TCPEDIT_FLAGS, 0,
|
|
/* last opt argumnt */ { NULL },
|
|
/* arg list/cookie */ NULL,
|
|
/* must/cannot opts */ NULL, NULL,
|
|
/* option proc */ NULL,
|
|
/* desc, NAME, name */ zTcpeditText, NULL, NULL,
|
|
/* disablement strs */ NULL, NULL },
|
|
|
|
{ /* entry idx, value */ 1, VALUE_OPT_PORTMAP,
|
|
/* equiv idx, value */ 1, VALUE_OPT_PORTMAP,
|
|
/* equivalenced to */ NO_EQUIVALENT,
|
|
/* min, max, act ct */ 0, -1, 0,
|
|
/* opt state flags */ PORTMAP_FLAGS, 0,
|
|
/* last opt argumnt */ { NULL },
|
|
/* arg list/cookie */ NULL,
|
|
/* must/cannot opts */ NULL, NULL,
|
|
/* option proc */ optionStackArg,
|
|
/* desc, NAME, name */ zPortmapText, zPortmap_NAME, zPortmap_Name,
|
|
/* disablement strs */ NULL, NULL },
|
|
|
|
{ /* entry idx, value */ 2, VALUE_OPT_SEED,
|
|
/* equiv idx, value */ 2, VALUE_OPT_SEED,
|
|
/* equivalenced to */ NO_EQUIVALENT,
|
|
/* min, max, act ct */ 0, 1, 0,
|
|
/* opt state flags */ SEED_FLAGS, 0,
|
|
/* last opt argumnt */ { NULL },
|
|
/* arg list/cookie */ NULL,
|
|
/* must/cannot opts */ NULL, NULL,
|
|
/* option proc */ optionNumericVal,
|
|
/* desc, NAME, name */ zSeedText, zSeed_NAME, zSeed_Name,
|
|
/* disablement strs */ NULL, NULL },
|
|
|
|
{ /* entry idx, value */ 3, VALUE_OPT_PNAT,
|
|
/* equiv idx, value */ 3, VALUE_OPT_PNAT,
|
|
/* equivalenced to */ NO_EQUIVALENT,
|
|
/* min, max, act ct */ 0, 2, 0,
|
|
/* opt state flags */ PNAT_FLAGS, 0,
|
|
/* last opt argumnt */ { NULL },
|
|
/* arg list/cookie */ NULL,
|
|
/* must/cannot opts */ NULL, aPnatCantList,
|
|
/* option proc */ optionStackArg,
|
|
/* desc, NAME, name */ zPnatText, zPnat_NAME, zPnat_Name,
|
|
/* disablement strs */ NULL, NULL },
|
|
|
|
{ /* entry idx, value */ 4, VALUE_OPT_SRCIPMAP,
|
|
/* equiv idx, value */ 4, VALUE_OPT_SRCIPMAP,
|
|
/* equivalenced to */ NO_EQUIVALENT,
|
|
/* min, max, act ct */ 0, 1, 0,
|
|
/* opt state flags */ SRCIPMAP_FLAGS, 0,
|
|
/* last opt argumnt */ { NULL },
|
|
/* arg list/cookie */ NULL,
|
|
/* must/cannot opts */ NULL, aSrcipmapCantList,
|
|
/* option proc */ NULL,
|
|
/* desc, NAME, name */ zSrcipmapText, zSrcipmap_NAME, zSrcipmap_Name,
|
|
/* disablement strs */ NULL, NULL },
|
|
|
|
{ /* entry idx, value */ 5, VALUE_OPT_DSTIPMAP,
|
|
/* equiv idx, value */ 5, VALUE_OPT_DSTIPMAP,
|
|
/* equivalenced to */ NO_EQUIVALENT,
|
|
/* min, max, act ct */ 0, 1, 0,
|
|
/* opt state flags */ DSTIPMAP_FLAGS, 0,
|
|
/* last opt argumnt */ { NULL },
|
|
/* arg list/cookie */ NULL,
|
|
/* must/cannot opts */ NULL, aDstipmapCantList,
|
|
/* option proc */ NULL,
|
|
/* desc, NAME, name */ zDstipmapText, zDstipmap_NAME, zDstipmap_Name,
|
|
/* disablement strs */ NULL, NULL },
|
|
|
|
{ /* entry idx, value */ 6, VALUE_OPT_ENDPOINTS,
|
|
/* equiv idx, value */ 6, VALUE_OPT_ENDPOINTS,
|
|
/* equivalenced to */ NO_EQUIVALENT,
|
|
/* min, max, act ct */ 0, 1, 0,
|
|
/* opt state flags */ ENDPOINTS_FLAGS, 0,
|
|
/* last opt argumnt */ { NULL },
|
|
/* arg list/cookie */ NULL,
|
|
/* must/cannot opts */ aEndpointsMustList, NULL,
|
|
/* option proc */ NULL,
|
|
/* desc, NAME, name */ zEndpointsText, zEndpoints_NAME, zEndpoints_Name,
|
|
/* disablement strs */ NULL, NULL },
|
|
|
|
{ /* entry idx, value */ 7, VALUE_OPT_SKIPBROADCAST,
|
|
/* equiv idx, value */ 7, VALUE_OPT_SKIPBROADCAST,
|
|
/* equivalenced to */ NO_EQUIVALENT,
|
|
/* min, max, act ct */ 0, 1, 0,
|
|
/* opt state flags */ SKIPBROADCAST_FLAGS, 0,
|
|
/* last opt argumnt */ { NULL },
|
|
/* arg list/cookie */ NULL,
|
|
/* must/cannot opts */ NULL, NULL,
|
|
/* option proc */ NULL,
|
|
/* desc, NAME, name */ zSkipbroadcastText, zSkipbroadcast_NAME, zSkipbroadcast_Name,
|
|
/* disablement strs */ NULL, NULL },
|
|
|
|
{ /* entry idx, value */ 8, VALUE_OPT_FIXCSUM,
|
|
/* equiv idx, value */ 8, VALUE_OPT_FIXCSUM,
|
|
/* equivalenced to */ NO_EQUIVALENT,
|
|
/* min, max, act ct */ 0, 1, 0,
|
|
/* opt state flags */ FIXCSUM_FLAGS, 0,
|
|
/* last opt argumnt */ { NULL },
|
|
/* arg list/cookie */ NULL,
|
|
/* must/cannot opts */ NULL, NULL,
|
|
/* option proc */ NULL,
|
|
/* desc, NAME, name */ zFixcsumText, zFixcsum_NAME, zFixcsum_Name,
|
|
/* disablement strs */ NULL, NULL },
|
|
|
|
{ /* entry idx, value */ 9, VALUE_OPT_MTU,
|
|
/* equiv idx, value */ 9, VALUE_OPT_MTU,
|
|
/* equivalenced to */ NO_EQUIVALENT,
|
|
/* min, max, act ct */ 0, 1, 0,
|
|
/* opt state flags */ MTU_FLAGS, 0,
|
|
/* last opt argumnt */ { NULL },
|
|
/* arg list/cookie */ NULL,
|
|
/* must/cannot opts */ NULL, NULL,
|
|
/* option proc */ doOptMtu,
|
|
/* desc, NAME, name */ zMtuText, zMtu_NAME, zMtu_Name,
|
|
/* disablement strs */ NULL, NULL },
|
|
|
|
{ /* entry idx, value */ 10, VALUE_OPT_MTU_TRUNC,
|
|
/* equiv idx, value */ 10, VALUE_OPT_MTU_TRUNC,
|
|
/* equivalenced to */ NO_EQUIVALENT,
|
|
/* min, max, act ct */ 0, 1, 0,
|
|
/* opt state flags */ MTU_TRUNC_FLAGS, 0,
|
|
/* last opt argumnt */ { NULL },
|
|
/* arg list/cookie */ NULL,
|
|
/* must/cannot opts */ NULL, NULL,
|
|
/* option proc */ NULL,
|
|
/* desc, NAME, name */ zMtu_TruncText, zMtu_Trunc_NAME, zMtu_Trunc_Name,
|
|
/* disablement strs */ NULL, NULL },
|
|
|
|
{ /* entry idx, value */ 11, VALUE_OPT_EFCS,
|
|
/* equiv idx, value */ 11, VALUE_OPT_EFCS,
|
|
/* equivalenced to */ NO_EQUIVALENT,
|
|
/* min, max, act ct */ 0, 1, 0,
|
|
/* opt state flags */ EFCS_FLAGS, 0,
|
|
/* last opt argumnt */ { NULL },
|
|
/* arg list/cookie */ NULL,
|
|
/* must/cannot opts */ NULL, NULL,
|
|
/* option proc */ NULL,
|
|
/* desc, NAME, name */ zEfcsText, zEfcs_NAME, zEfcs_Name,
|
|
/* disablement strs */ NULL, NULL },
|
|
|
|
{ /* entry idx, value */ 12, VALUE_OPT_TTL,
|
|
/* equiv idx, value */ 12, VALUE_OPT_TTL,
|
|
/* equivalenced to */ NO_EQUIVALENT,
|
|
/* min, max, act ct */ 0, 1, 0,
|
|
/* opt state flags */ TTL_FLAGS, 0,
|
|
/* last opt argumnt */ { NULL },
|
|
/* arg list/cookie */ NULL,
|
|
/* must/cannot opts */ NULL, NULL,
|
|
/* option proc */ NULL,
|
|
/* desc, NAME, name */ zTtlText, zTtl_NAME, zTtl_Name,
|
|
/* disablement strs */ NULL, NULL },
|
|
|
|
{ /* entry idx, value */ 13, VALUE_OPT_TOS,
|
|
/* equiv idx, value */ 13, VALUE_OPT_TOS,
|
|
/* equivalenced to */ NO_EQUIVALENT,
|
|
/* min, max, act ct */ 0, 1, 0,
|
|
/* opt state flags */ TOS_FLAGS, 0,
|
|
/* last opt argumnt */ { NULL },
|
|
/* arg list/cookie */ NULL,
|
|
/* must/cannot opts */ NULL, NULL,
|
|
/* option proc */ doOptTos,
|
|
/* desc, NAME, name */ zTosText, zTos_NAME, zTos_Name,
|
|
/* disablement strs */ NULL, NULL },
|
|
|
|
{ /* entry idx, value */ 14, VALUE_OPT_TCLASS,
|
|
/* equiv idx, value */ 14, VALUE_OPT_TCLASS,
|
|
/* equivalenced to */ NO_EQUIVALENT,
|
|
/* min, max, act ct */ 0, 1, 0,
|
|
/* opt state flags */ TCLASS_FLAGS, 0,
|
|
/* last opt argumnt */ { NULL },
|
|
/* arg list/cookie */ NULL,
|
|
/* must/cannot opts */ NULL, NULL,
|
|
/* option proc */ doOptTclass,
|
|
/* desc, NAME, name */ zTclassText, zTclass_NAME, zTclass_Name,
|
|
/* disablement strs */ NULL, NULL },
|
|
|
|
{ /* entry idx, value */ 15, VALUE_OPT_FLOWLABEL,
|
|
/* equiv idx, value */ 15, VALUE_OPT_FLOWLABEL,
|
|
/* equivalenced to */ NO_EQUIVALENT,
|
|
/* min, max, act ct */ 0, 1, 0,
|
|
/* opt state flags */ FLOWLABEL_FLAGS, 0,
|
|
/* last opt argumnt */ { NULL },
|
|
/* arg list/cookie */ NULL,
|
|
/* must/cannot opts */ NULL, NULL,
|
|
/* option proc */ doOptFlowlabel,
|
|
/* desc, NAME, name */ zFlowlabelText, zFlowlabel_NAME, zFlowlabel_Name,
|
|
/* disablement strs */ NULL, NULL },
|
|
|
|
{ /* entry idx, value */ 16, VALUE_OPT_FIXLEN,
|
|
/* equiv idx, value */ 16, VALUE_OPT_FIXLEN,
|
|
/* equivalenced to */ NO_EQUIVALENT,
|
|
/* min, max, act ct */ 0, 1, 0,
|
|
/* opt state flags */ FIXLEN_FLAGS, 0,
|
|
/* last opt argumnt */ { NULL },
|
|
/* arg list/cookie */ NULL,
|
|
/* must/cannot opts */ NULL, NULL,
|
|
/* option proc */ NULL,
|
|
/* desc, NAME, name */ zFixlenText, zFixlen_NAME, zFixlen_Name,
|
|
/* disablement strs */ NULL, NULL },
|
|
|
|
{ /* entry idx, value */ 17, VALUE_OPT_SKIPL2BROADCAST,
|
|
/* equiv idx, value */ 17, VALUE_OPT_SKIPL2BROADCAST,
|
|
/* equivalenced to */ NO_EQUIVALENT,
|
|
/* min, max, act ct */ 0, 1, 0,
|
|
/* opt state flags */ SKIPL2BROADCAST_FLAGS, 0,
|
|
/* last opt argumnt */ { NULL },
|
|
/* arg list/cookie */ NULL,
|
|
/* must/cannot opts */ NULL, NULL,
|
|
/* option proc */ NULL,
|
|
/* desc, NAME, name */ zSkipl2broadcastText, zSkipl2broadcast_NAME, zSkipl2broadcast_Name,
|
|
/* disablement strs */ NULL, NULL },
|
|
|
|
{ /* entry idx, value */ 18, VALUE_OPT_DLT,
|
|
/* equiv idx, value */ 18, VALUE_OPT_DLT,
|
|
/* equivalenced to */ NO_EQUIVALENT,
|
|
/* min, max, act ct */ 0, 1, 0,
|
|
/* opt state flags */ DLT_FLAGS, 0,
|
|
/* last opt argumnt */ { NULL },
|
|
/* arg list/cookie */ NULL,
|
|
/* must/cannot opts */ NULL, NULL,
|
|
/* option proc */ NULL,
|
|
/* desc, NAME, name */ zDltText, zDlt_NAME, zDlt_Name,
|
|
/* disablement strs */ NULL, NULL },
|
|
|
|
{ /* entry idx, value */ 19, VALUE_OPT_ENET_DMAC,
|
|
/* equiv idx, value */ 19, VALUE_OPT_ENET_DMAC,
|
|
/* equivalenced to */ NO_EQUIVALENT,
|
|
/* min, max, act ct */ 0, 1, 0,
|
|
/* opt state flags */ ENET_DMAC_FLAGS, 0,
|
|
/* last opt argumnt */ { NULL },
|
|
/* arg list/cookie */ NULL,
|
|
/* must/cannot opts */ NULL, NULL,
|
|
/* option proc */ NULL,
|
|
/* desc, NAME, name */ zEnet_DmacText, zEnet_Dmac_NAME, zEnet_Dmac_Name,
|
|
/* disablement strs */ NULL, NULL },
|
|
|
|
{ /* entry idx, value */ 20, VALUE_OPT_ENET_SMAC,
|
|
/* equiv idx, value */ 20, VALUE_OPT_ENET_SMAC,
|
|
/* equivalenced to */ NO_EQUIVALENT,
|
|
/* min, max, act ct */ 0, 1, 0,
|
|
/* opt state flags */ ENET_SMAC_FLAGS, 0,
|
|
/* last opt argumnt */ { NULL },
|
|
/* arg list/cookie */ NULL,
|
|
/* must/cannot opts */ NULL, NULL,
|
|
/* option proc */ NULL,
|
|
/* desc, NAME, name */ zEnet_SmacText, zEnet_Smac_NAME, zEnet_Smac_Name,
|
|
/* disablement strs */ NULL, NULL },
|
|
|
|
{ /* entry idx, value */ 21, VALUE_OPT_ENET_VLAN,
|
|
/* equiv idx, value */ 21, VALUE_OPT_ENET_VLAN,
|
|
/* equivalenced to */ NO_EQUIVALENT,
|
|
/* min, max, act ct */ 0, 1, 0,
|
|
/* opt state flags */ ENET_VLAN_FLAGS, 0,
|
|
/* last opt argumnt */ { NULL },
|
|
/* arg list/cookie */ NULL,
|
|
/* must/cannot opts */ NULL, NULL,
|
|
/* option proc */ NULL,
|
|
/* desc, NAME, name */ zEnet_VlanText, zEnet_Vlan_NAME, zEnet_Vlan_Name,
|
|
/* disablement strs */ NULL, NULL },
|
|
|
|
{ /* entry idx, value */ 22, VALUE_OPT_ENET_VLAN_TAG,
|
|
/* equiv idx, value */ 22, VALUE_OPT_ENET_VLAN_TAG,
|
|
/* equivalenced to */ NO_EQUIVALENT,
|
|
/* min, max, act ct */ 0, 1, 0,
|
|
/* opt state flags */ ENET_VLAN_TAG_FLAGS, 0,
|
|
/* last opt argumnt */ { NULL },
|
|
/* arg list/cookie */ NULL,
|
|
/* must/cannot opts */ aEnet_Vlan_TagMustList, NULL,
|
|
/* option proc */ doOptEnet_Vlan_Tag,
|
|
/* desc, NAME, name */ zEnet_Vlan_TagText, zEnet_Vlan_Tag_NAME, zEnet_Vlan_Tag_Name,
|
|
/* disablement strs */ NULL, NULL },
|
|
|
|
{ /* entry idx, value */ 23, VALUE_OPT_ENET_VLAN_CFI,
|
|
/* equiv idx, value */ 23, VALUE_OPT_ENET_VLAN_CFI,
|
|
/* equivalenced to */ NO_EQUIVALENT,
|
|
/* min, max, act ct */ 0, 1, 0,
|
|
/* opt state flags */ ENET_VLAN_CFI_FLAGS, 0,
|
|
/* last opt argumnt */ { NULL },
|
|
/* arg list/cookie */ NULL,
|
|
/* must/cannot opts */ aEnet_Vlan_CfiMustList, NULL,
|
|
/* option proc */ doOptEnet_Vlan_Cfi,
|
|
/* desc, NAME, name */ zEnet_Vlan_CfiText, zEnet_Vlan_Cfi_NAME, zEnet_Vlan_Cfi_Name,
|
|
/* disablement strs */ NULL, NULL },
|
|
|
|
{ /* entry idx, value */ 24, VALUE_OPT_ENET_VLAN_PRI,
|
|
/* equiv idx, value */ 24, VALUE_OPT_ENET_VLAN_PRI,
|
|
/* equivalenced to */ NO_EQUIVALENT,
|
|
/* min, max, act ct */ 0, 1, 0,
|
|
/* opt state flags */ ENET_VLAN_PRI_FLAGS, 0,
|
|
/* last opt argumnt */ { NULL },
|
|
/* arg list/cookie */ NULL,
|
|
/* must/cannot opts */ aEnet_Vlan_PriMustList, NULL,
|
|
/* option proc */ doOptEnet_Vlan_Pri,
|
|
/* desc, NAME, name */ zEnet_Vlan_PriText, zEnet_Vlan_Pri_NAME, zEnet_Vlan_Pri_Name,
|
|
/* disablement strs */ NULL, NULL },
|
|
|
|
{ /* entry idx, value */ 25, VALUE_OPT_HDLC_CONTROL,
|
|
/* equiv idx, value */ 25, VALUE_OPT_HDLC_CONTROL,
|
|
/* equivalenced to */ NO_EQUIVALENT,
|
|
/* min, max, act ct */ 0, 1, 0,
|
|
/* opt state flags */ HDLC_CONTROL_FLAGS, 0,
|
|
/* last opt argumnt */ { NULL },
|
|
/* arg list/cookie */ NULL,
|
|
/* must/cannot opts */ NULL, NULL,
|
|
/* option proc */ optionNumericVal,
|
|
/* desc, NAME, name */ zHdlc_ControlText, zHdlc_Control_NAME, zHdlc_Control_Name,
|
|
/* disablement strs */ NULL, NULL },
|
|
|
|
{ /* entry idx, value */ 26, VALUE_OPT_HDLC_ADDRESS,
|
|
/* equiv idx, value */ 26, VALUE_OPT_HDLC_ADDRESS,
|
|
/* equivalenced to */ NO_EQUIVALENT,
|
|
/* min, max, act ct */ 0, 1, 0,
|
|
/* opt state flags */ HDLC_ADDRESS_FLAGS, 0,
|
|
/* last opt argumnt */ { NULL },
|
|
/* arg list/cookie */ NULL,
|
|
/* must/cannot opts */ NULL, NULL,
|
|
/* option proc */ optionNumericVal,
|
|
/* desc, NAME, name */ zHdlc_AddressText, zHdlc_Address_NAME, zHdlc_Address_Name,
|
|
/* disablement strs */ NULL, NULL },
|
|
|
|
{ /* entry idx, value */ 27, VALUE_OPT_USER_DLT,
|
|
/* equiv idx, value */ 27, VALUE_OPT_USER_DLT,
|
|
/* equivalenced to */ NO_EQUIVALENT,
|
|
/* min, max, act ct */ 0, 1, 0,
|
|
/* opt state flags */ USER_DLT_FLAGS, 0,
|
|
/* last opt argumnt */ { NULL },
|
|
/* arg list/cookie */ NULL,
|
|
/* must/cannot opts */ NULL, NULL,
|
|
/* option proc */ optionNumericVal,
|
|
/* desc, NAME, name */ zUser_DltText, zUser_Dlt_NAME, zUser_Dlt_Name,
|
|
/* disablement strs */ NULL, NULL },
|
|
|
|
{ /* entry idx, value */ 28, VALUE_OPT_USER_DLINK,
|
|
/* equiv idx, value */ 28, VALUE_OPT_USER_DLINK,
|
|
/* equivalenced to */ NO_EQUIVALENT,
|
|
/* min, max, act ct */ 0, 2, 0,
|
|
/* opt state flags */ USER_DLINK_FLAGS, 0,
|
|
/* last opt argumnt */ { NULL },
|
|
/* arg list/cookie */ NULL,
|
|
/* must/cannot opts */ NULL, NULL,
|
|
/* option proc */ optionStackArg,
|
|
/* desc, NAME, name */ zUser_DlinkText, zUser_Dlink_NAME, zUser_Dlink_Name,
|
|
/* disablement strs */ NULL, NULL },
|
|
|
|
{ /* entry idx, value */ 29, VALUE_OPT_DBUG,
|
|
/* equiv idx, value */ 29, VALUE_OPT_DBUG,
|
|
/* equivalenced to */ NO_EQUIVALENT,
|
|
/* min, max, act ct */ 0, 1, 0,
|
|
/* opt state flags */ DBUG_FLAGS, 0,
|
|
/* last opt argumnt */ { zDbugDefaultArg },
|
|
/* arg list/cookie */ NULL,
|
|
/* must/cannot opts */ NULL, NULL,
|
|
/* option proc */ doOptDbug,
|
|
/* desc, NAME, name */ zDbugText, zDbug_NAME, zDbug_Name,
|
|
/* disablement strs */ NULL, NULL },
|
|
|
|
{ /* entry idx, value */ 30, VALUE_OPT_INTF1,
|
|
/* equiv idx, value */ 30, VALUE_OPT_INTF1,
|
|
/* equivalenced to */ NO_EQUIVALENT,
|
|
/* min, max, act ct */ 1, 1, 0,
|
|
/* opt state flags */ INTF1_FLAGS, 0,
|
|
/* last opt argumnt */ { NULL },
|
|
/* arg list/cookie */ NULL,
|
|
/* must/cannot opts */ NULL, NULL,
|
|
/* option proc */ NULL,
|
|
/* desc, NAME, name */ zIntf1Text, zIntf1_NAME, zIntf1_Name,
|
|
/* disablement strs */ NULL, NULL },
|
|
|
|
{ /* entry idx, value */ 31, VALUE_OPT_INTF2,
|
|
/* equiv idx, value */ 31, VALUE_OPT_INTF2,
|
|
/* equivalenced to */ NO_EQUIVALENT,
|
|
/* min, max, act ct */ 0, 1, 0,
|
|
/* opt state flags */ INTF2_FLAGS, 0,
|
|
/* last opt argumnt */ { NULL },
|
|
/* arg list/cookie */ NULL,
|
|
/* must/cannot opts */ NULL, NULL,
|
|
/* option proc */ NULL,
|
|
/* desc, NAME, name */ zIntf2Text, zIntf2_NAME, zIntf2_Name,
|
|
/* disablement strs */ NULL, NULL },
|
|
|
|
{ /* entry idx, value */ 32, VALUE_OPT_UNIDIR,
|
|
/* equiv idx, value */ 32, VALUE_OPT_UNIDIR,
|
|
/* equivalenced to */ NO_EQUIVALENT,
|
|
/* min, max, act ct */ 0, 1, 0,
|
|
/* opt state flags */ UNIDIR_FLAGS, 0,
|
|
/* last opt argumnt */ { NULL },
|
|
/* arg list/cookie */ NULL,
|
|
/* must/cannot opts */ NULL, NULL,
|
|
/* option proc */ NULL,
|
|
/* desc, NAME, name */ zUnidirText, zUnidir_NAME, zUnidir_Name,
|
|
/* disablement strs */ NULL, NULL },
|
|
|
|
{ /* entry idx, value */ 33, VALUE_OPT_LISTNICS,
|
|
/* equiv idx, value */ 33, VALUE_OPT_LISTNICS,
|
|
/* equivalenced to */ NO_EQUIVALENT,
|
|
/* min, max, act ct */ 0, 1, 0,
|
|
/* opt state flags */ LISTNICS_FLAGS, 0,
|
|
/* last opt argumnt */ { NULL },
|
|
/* arg list/cookie */ NULL,
|
|
/* must/cannot opts */ NULL, NULL,
|
|
/* option proc */ doOptListnics,
|
|
/* desc, NAME, name */ zListnicsText, zListnics_NAME, zListnics_Name,
|
|
/* disablement strs */ NULL, NULL },
|
|
|
|
{ /* entry idx, value */ 34, VALUE_OPT_LIMIT,
|
|
/* equiv idx, value */ 34, VALUE_OPT_LIMIT,
|
|
/* equivalenced to */ NO_EQUIVALENT,
|
|
/* min, max, act ct */ 0, 1, 0,
|
|
/* opt state flags */ LIMIT_FLAGS, 0,
|
|
/* last opt argumnt */ { zLimitDefaultArg },
|
|
/* arg list/cookie */ NULL,
|
|
/* must/cannot opts */ NULL, NULL,
|
|
/* option proc */ doOptLimit,
|
|
/* desc, NAME, name */ zLimitText, zLimit_NAME, zLimit_Name,
|
|
/* disablement strs */ NULL, NULL },
|
|
|
|
{ /* entry idx, value */ 35, VALUE_OPT_MAC,
|
|
/* equiv idx, value */ 35, VALUE_OPT_MAC,
|
|
/* equivalenced to */ NO_EQUIVALENT,
|
|
/* min, max, act ct */ 0, 2, 0,
|
|
/* opt state flags */ MAC_FLAGS, 0,
|
|
/* last opt argumnt */ { NULL },
|
|
/* arg list/cookie */ NULL,
|
|
/* must/cannot opts */ NULL, NULL,
|
|
/* option proc */ optionStackArg,
|
|
/* desc, NAME, name */ zMacText, zMac_NAME, zMac_Name,
|
|
/* disablement strs */ NULL, NULL },
|
|
|
|
{ /* entry idx, value */ 36, VALUE_OPT_INCLUDE,
|
|
/* equiv idx, value */ 36, VALUE_OPT_INCLUDE,
|
|
/* equivalenced to */ NO_EQUIVALENT,
|
|
/* min, max, act ct */ 0, 1, 0,
|
|
/* opt state flags */ INCLUDE_FLAGS, 0,
|
|
/* last opt argumnt */ { NULL },
|
|
/* arg list/cookie */ NULL,
|
|
/* must/cannot opts */ NULL, aIncludeCantList,
|
|
/* option proc */ doOptInclude,
|
|
/* desc, NAME, name */ zIncludeText, zInclude_NAME, zInclude_Name,
|
|
/* disablement strs */ NULL, NULL },
|
|
|
|
{ /* entry idx, value */ 37, VALUE_OPT_EXCLUDE,
|
|
/* equiv idx, value */ 37, VALUE_OPT_EXCLUDE,
|
|
/* equivalenced to */ NO_EQUIVALENT,
|
|
/* min, max, act ct */ 0, 1, 0,
|
|
/* opt state flags */ EXCLUDE_FLAGS, 0,
|
|
/* last opt argumnt */ { NULL },
|
|
/* arg list/cookie */ NULL,
|
|
/* must/cannot opts */ NULL, aExcludeCantList,
|
|
/* option proc */ doOptExclude,
|
|
/* desc, NAME, name */ zExcludeText, zExclude_NAME, zExclude_Name,
|
|
/* disablement strs */ NULL, NULL },
|
|
|
|
{ /* entry idx, value */ 38, VALUE_OPT_PID,
|
|
/* equiv idx, value */ 38, VALUE_OPT_PID,
|
|
/* equivalenced to */ NO_EQUIVALENT,
|
|
/* min, max, act ct */ 0, 1, 0,
|
|
/* opt state flags */ PID_FLAGS, 0,
|
|
/* last opt argumnt */ { NULL },
|
|
/* arg list/cookie */ NULL,
|
|
/* must/cannot opts */ NULL, NULL,
|
|
/* option proc */ doOptPid,
|
|
/* desc, NAME, name */ zPidText, zPid_NAME, zPid_Name,
|
|
/* disablement strs */ NULL, NULL },
|
|
|
|
{ /* entry idx, value */ 39, VALUE_OPT_VERBOSE,
|
|
/* equiv idx, value */ 39, VALUE_OPT_VERBOSE,
|
|
/* equivalenced to */ NO_EQUIVALENT,
|
|
/* min, max, act ct */ 0, 1, 0,
|
|
/* opt state flags */ VERBOSE_FLAGS, 0,
|
|
/* last opt argumnt */ { NULL },
|
|
/* arg list/cookie */ NULL,
|
|
/* must/cannot opts */ NULL, NULL,
|
|
/* option proc */ NULL,
|
|
/* desc, NAME, name */ zVerboseText, zVerbose_NAME, zVerbose_Name,
|
|
/* disablement strs */ NULL, NULL },
|
|
|
|
{ /* entry idx, value */ 40, VALUE_OPT_DECODE,
|
|
/* equiv idx, value */ 40, VALUE_OPT_DECODE,
|
|
/* equivalenced to */ NO_EQUIVALENT,
|
|
/* min, max, act ct */ 0, 1, 0,
|
|
/* opt state flags */ DECODE_FLAGS, 0,
|
|
/* last opt argumnt */ { NULL },
|
|
/* arg list/cookie */ NULL,
|
|
/* must/cannot opts */ aDecodeMustList, NULL,
|
|
/* option proc */ NULL,
|
|
/* desc, NAME, name */ zDecodeText, zDecode_NAME, zDecode_Name,
|
|
/* disablement strs */ NULL, NULL },
|
|
|
|
{ /* entry idx, value */ 41, VALUE_OPT_VERSION,
|
|
/* equiv idx, value */ 41, VALUE_OPT_VERSION,
|
|
/* equivalenced to */ NO_EQUIVALENT,
|
|
/* min, max, act ct */ 0, 1, 0,
|
|
/* opt state flags */ VERSION_FLAGS, 0,
|
|
/* last opt argumnt */ { NULL },
|
|
/* arg list/cookie */ NULL,
|
|
/* must/cannot opts */ NULL, NULL,
|
|
/* option proc */ doOptVersion,
|
|
/* desc, NAME, name */ zVersionText, zVersion_NAME, zVersion_Name,
|
|
/* disablement strs */ NULL, NULL },
|
|
|
|
{ /* entry idx, value */ 42, VALUE_OPT_LESS_HELP,
|
|
/* equiv idx, value */ 42, VALUE_OPT_LESS_HELP,
|
|
/* equivalenced to */ NO_EQUIVALENT,
|
|
/* min, max, act ct */ 0, 1, 0,
|
|
/* opt state flags */ LESS_HELP_FLAGS, 0,
|
|
/* last opt argumnt */ { NULL },
|
|
/* arg list/cookie */ NULL,
|
|
/* must/cannot opts */ NULL, NULL,
|
|
/* option proc */ doOptLess_Help,
|
|
/* desc, NAME, name */ zLess_HelpText, zLess_Help_NAME, zLess_Help_Name,
|
|
/* disablement strs */ NULL, NULL },
|
|
|
|
{ /* entry idx, value */ INDEX_OPT_HELP, VALUE_OPT_HELP,
|
|
/* equiv idx value */ NO_EQUIVALENT, 0,
|
|
/* equivalenced to */ NO_EQUIVALENT,
|
|
/* min, max, act ct */ 0, 1, 0,
|
|
/* opt state flags */ OPTST_IMM | OPTST_NO_INIT, 0,
|
|
/* last opt argumnt */ { NULL },
|
|
/* arg list/cookie */ NULL,
|
|
/* must/cannot opts */ NULL, NULL,
|
|
/* option proc */ doUsageOpt,
|
|
/* desc, NAME, name */ zHelpText, NULL, zHelp_Name,
|
|
/* disablement strs */ NULL, NULL },
|
|
|
|
{ /* entry idx, value */ INDEX_OPT_MORE_HELP, VALUE_OPT_MORE_HELP,
|
|
/* equiv idx value */ NO_EQUIVALENT, 0,
|
|
/* equivalenced to */ NO_EQUIVALENT,
|
|
/* min, max, act ct */ 0, 1, 0,
|
|
/* opt state flags */ OPTST_IMM | OPTST_NO_INIT, 0,
|
|
/* last opt argumnt */ { NULL },
|
|
/* arg list/cookie */ NULL,
|
|
/* must/cannot opts */ NULL, NULL,
|
|
/* option proc */ optionPagedUsage,
|
|
/* desc, NAME, name */ zMore_HelpText, NULL, zMore_Help_Name,
|
|
/* disablement strs */ NULL, NULL },
|
|
|
|
{ /* entry idx, value */ INDEX_OPT_SAVE_OPTS, VALUE_OPT_SAVE_OPTS,
|
|
/* equiv idx value */ NO_EQUIVALENT, 0,
|
|
/* equivalenced to */ NO_EQUIVALENT,
|
|
/* min, max, act ct */ 0, 1, 0,
|
|
/* opt state flags */ OPTST_SET_ARGTYPE(OPARG_TYPE_STRING)
|
|
| OPTST_ARG_OPTIONAL | OPTST_NO_INIT, 0,
|
|
/* last opt argumnt */ { NULL },
|
|
/* arg list/cookie */ NULL,
|
|
/* must/cannot opts */ NULL, NULL,
|
|
/* option proc */ NULL,
|
|
/* desc, NAME, name */ zSave_OptsText, NULL, zSave_Opts_Name,
|
|
/* disablement strs */ NULL, NULL },
|
|
|
|
{ /* entry idx, value */ INDEX_OPT_LOAD_OPTS, VALUE_OPT_LOAD_OPTS,
|
|
/* equiv idx value */ NO_EQUIVALENT, 0,
|
|
/* equivalenced to */ NO_EQUIVALENT,
|
|
/* min, max, act ct */ 0, NOLIMIT, 0,
|
|
/* opt state flags */ OPTST_SET_ARGTYPE(OPARG_TYPE_STRING)
|
|
| OPTST_DISABLE_IMM, 0,
|
|
/* last opt argumnt */ { NULL },
|
|
/* arg list/cookie */ NULL,
|
|
/* must/cannot opts */ NULL, NULL,
|
|
/* option proc */ optionLoadOpt,
|
|
/* desc, NAME, name */ zLoad_OptsText, zLoad_Opts_NAME, zLoad_Opts_Name,
|
|
/* disablement strs */ zNotLoad_Opts_Name, zNotLoad_Opts_Pfx }
|
|
};
|
|
tOptDesc * const tcpedit_tcpedit_optDesc_p = optDesc + 0;
|
|
|
|
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
|
|
*
|
|
* Define the Tcpbridge Option Environment
|
|
*/
|
|
tSCC zPROGNAME[] = "TCPBRIDGE";
|
|
tSCC zUsageTitle[] =
|
|
"tcpbridge (tcpbridge) - Bridge network traffic across two interfaces\n\
|
|
USAGE: %s [ -<flag> [<val>] | --<name>[{=| }<val>] ]...\n";
|
|
tSCC zRcName[] = ".tcpbridgerc";
|
|
tSCC* apzHomeList[] = {
|
|
"$$/",
|
|
NULL };
|
|
|
|
#define zBugsAddr NULL
|
|
tSCC zExplain[] = "\n\
|
|
tcpbridge is a tool for selectively briding network traffic across two interfaces\n\
|
|
and optionally modifying the packets in betweeen\n";
|
|
tSCC zDetail[] = "\n\
|
|
The basic operation of tcpbridge is to be a network bridge between two\n\
|
|
subnets. All packets received on one interface are sent via the other.\n\n\
|
|
Optionally, packets can be edited in a variety of ways according to your needs.\n\n\
|
|
For more details, please see the Tcpreplay Manual at:\n\
|
|
http://tcpreplay.synfin.net/trac/wiki/manual\n";
|
|
#define zFullVersion NULL
|
|
/* extracted from /usr/local/share/autogen/optcode.tpl near line 501 */
|
|
|
|
#if defined(ENABLE_NLS)
|
|
# define OPTPROC_BASE OPTPROC_TRANSLATE
|
|
static tOptionXlateProc translate_option_strings;
|
|
#else
|
|
# define OPTPROC_BASE OPTPROC_NONE
|
|
# define translate_option_strings NULL
|
|
#endif /* ENABLE_NLS */
|
|
|
|
|
|
#define tcpbridge_full_usage NULL
|
|
#define tcpbridge_short_usage NULL
|
|
tOptions tcpbridgeOptions = {
|
|
OPTIONS_STRUCT_VERSION,
|
|
0, NULL, /* original argc + argv */
|
|
( OPTPROC_BASE
|
|
+ OPTPROC_ERRSTOP
|
|
+ OPTPROC_SHORTOPT
|
|
+ OPTPROC_LONGOPT
|
|
+ OPTPROC_NO_REQ_OPT
|
|
+ OPTPROC_NO_ARGS
|
|
+ OPTPROC_GNUUSAGE ),
|
|
0, NULL, /* current option index, current option */
|
|
NULL, NULL, zPROGNAME,
|
|
zRcName, zCopyright, zCopyrightNotice,
|
|
zFullVersion, apzHomeList, zUsageTitle,
|
|
zExplain, zDetail, optDesc,
|
|
zBugsAddr, /* address to send bugs to */
|
|
NULL, NULL, /* extensions/saved state */
|
|
optionUsage, /* usage procedure */
|
|
translate_option_strings, /* translation procedure */
|
|
/*
|
|
* Indexes to special options
|
|
*/
|
|
{ INDEX_OPT_MORE_HELP, /* more-help option index */
|
|
INDEX_OPT_SAVE_OPTS, /* save option index */
|
|
NO_EQUIVALENT, /* '-#' option index */
|
|
9 /* index of default opt */
|
|
},
|
|
47 /* full option count */, 43 /* user option count */,
|
|
tcpbridge_full_usage, tcpbridge_short_usage,
|
|
NULL, NULL
|
|
};
|
|
|
|
/*
|
|
* Create the static procedure(s) declared above.
|
|
*/
|
|
static void
|
|
doUsageOpt(
|
|
tOptions* pOptions,
|
|
tOptDesc* pOptDesc )
|
|
{
|
|
(void)pOptions;
|
|
USAGE( EXIT_SUCCESS );
|
|
}
|
|
|
|
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
|
|
*
|
|
* For the mtu option.
|
|
*/
|
|
static void
|
|
doOptMtu(tOptions* pOptions, tOptDesc* pOptDesc)
|
|
{
|
|
static const struct {long const rmin, rmax;} rng[1] = {
|
|
{ 1, MAXPACKET } };
|
|
long val;
|
|
int ix;
|
|
char * pzEnd;
|
|
|
|
if (pOptions <= OPTPROC_EMIT_LIMIT)
|
|
goto emit_ranges;
|
|
|
|
errno = 0;
|
|
val = strtol(pOptDesc->optArg.argString, &pzEnd, 0);
|
|
if ((pOptDesc->optArg.argString == pzEnd) || (errno != 0))
|
|
goto bad_value;
|
|
|
|
if (*pzEnd != '\0')
|
|
goto bad_value;
|
|
for (ix = 0; ix < 1; ix++) {
|
|
if (val < rng[ix].rmin)
|
|
continue; /* ranges need not be ordered. */
|
|
if (val == rng[ix].rmin)
|
|
goto valid_return;
|
|
if (rng[ix].rmax == LONG_MIN)
|
|
continue;
|
|
if (val <= rng[ix].rmax)
|
|
goto valid_return;
|
|
}
|
|
|
|
bad_value:
|
|
|
|
option_usage_fp = stderr;
|
|
|
|
emit_ranges:
|
|
optionShowRange(pOptions, pOptDesc, (void *)rng, 1);
|
|
return;
|
|
|
|
valid_return:
|
|
if ((pOptDesc->fOptState & OPTST_ALLOC_ARG) != 0) {
|
|
free((void *)pOptDesc->optArg.argString);
|
|
pOptDesc->fOptState &= ~OPTST_ALLOC_ARG;
|
|
}
|
|
pOptDesc->optArg.argInt = val;
|
|
}
|
|
|
|
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
|
|
*
|
|
* For the tos option.
|
|
*/
|
|
static void
|
|
doOptTos(tOptions* pOptions, tOptDesc* pOptDesc)
|
|
{
|
|
static const struct {long const rmin, rmax;} rng[1] = {
|
|
{ 0, 255 } };
|
|
long val;
|
|
int ix;
|
|
char * pzEnd;
|
|
|
|
if (pOptions <= OPTPROC_EMIT_LIMIT)
|
|
goto emit_ranges;
|
|
|
|
errno = 0;
|
|
val = strtol(pOptDesc->optArg.argString, &pzEnd, 0);
|
|
if ((pOptDesc->optArg.argString == pzEnd) || (errno != 0))
|
|
goto bad_value;
|
|
|
|
if (*pzEnd != '\0')
|
|
goto bad_value;
|
|
for (ix = 0; ix < 1; ix++) {
|
|
if (val < rng[ix].rmin)
|
|
continue; /* ranges need not be ordered. */
|
|
if (val == rng[ix].rmin)
|
|
goto valid_return;
|
|
if (rng[ix].rmax == LONG_MIN)
|
|
continue;
|
|
if (val <= rng[ix].rmax)
|
|
goto valid_return;
|
|
}
|
|
|
|
bad_value:
|
|
|
|
option_usage_fp = stderr;
|
|
|
|
emit_ranges:
|
|
optionShowRange(pOptions, pOptDesc, (void *)rng, 1);
|
|
return;
|
|
|
|
valid_return:
|
|
if ((pOptDesc->fOptState & OPTST_ALLOC_ARG) != 0) {
|
|
free((void *)pOptDesc->optArg.argString);
|
|
pOptDesc->fOptState &= ~OPTST_ALLOC_ARG;
|
|
}
|
|
pOptDesc->optArg.argInt = val;
|
|
}
|
|
|
|
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
|
|
*
|
|
* For the tclass option.
|
|
*/
|
|
static void
|
|
doOptTclass(tOptions* pOptions, tOptDesc* pOptDesc)
|
|
{
|
|
static const struct {long const rmin, rmax;} rng[1] = {
|
|
{ 0, 255 } };
|
|
long val;
|
|
int ix;
|
|
char * pzEnd;
|
|
|
|
if (pOptions <= OPTPROC_EMIT_LIMIT)
|
|
goto emit_ranges;
|
|
|
|
errno = 0;
|
|
val = strtol(pOptDesc->optArg.argString, &pzEnd, 0);
|
|
if ((pOptDesc->optArg.argString == pzEnd) || (errno != 0))
|
|
goto bad_value;
|
|
|
|
if (*pzEnd != '\0')
|
|
goto bad_value;
|
|
for (ix = 0; ix < 1; ix++) {
|
|
if (val < rng[ix].rmin)
|
|
continue; /* ranges need not be ordered. */
|
|
if (val == rng[ix].rmin)
|
|
goto valid_return;
|
|
if (rng[ix].rmax == LONG_MIN)
|
|
continue;
|
|
if (val <= rng[ix].rmax)
|
|
goto valid_return;
|
|
}
|
|
|
|
bad_value:
|
|
|
|
option_usage_fp = stderr;
|
|
|
|
emit_ranges:
|
|
optionShowRange(pOptions, pOptDesc, (void *)rng, 1);
|
|
return;
|
|
|
|
valid_return:
|
|
if ((pOptDesc->fOptState & OPTST_ALLOC_ARG) != 0) {
|
|
free((void *)pOptDesc->optArg.argString);
|
|
pOptDesc->fOptState &= ~OPTST_ALLOC_ARG;
|
|
}
|
|
pOptDesc->optArg.argInt = val;
|
|
}
|
|
|
|
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
|
|
*
|
|
* For the flowlabel option.
|
|
*/
|
|
static void
|
|
doOptFlowlabel(tOptions* pOptions, tOptDesc* pOptDesc)
|
|
{
|
|
static const struct {long const rmin, rmax;} rng[1] = {
|
|
{ 0, 1048575 } };
|
|
long val;
|
|
int ix;
|
|
char * pzEnd;
|
|
|
|
if (pOptions <= OPTPROC_EMIT_LIMIT)
|
|
goto emit_ranges;
|
|
|
|
errno = 0;
|
|
val = strtol(pOptDesc->optArg.argString, &pzEnd, 0);
|
|
if ((pOptDesc->optArg.argString == pzEnd) || (errno != 0))
|
|
goto bad_value;
|
|
|
|
if (*pzEnd != '\0')
|
|
goto bad_value;
|
|
for (ix = 0; ix < 1; ix++) {
|
|
if (val < rng[ix].rmin)
|
|
continue; /* ranges need not be ordered. */
|
|
if (val == rng[ix].rmin)
|
|
goto valid_return;
|
|
if (rng[ix].rmax == LONG_MIN)
|
|
continue;
|
|
if (val <= rng[ix].rmax)
|
|
goto valid_return;
|
|
}
|
|
|
|
bad_value:
|
|
|
|
option_usage_fp = stderr;
|
|
|
|
emit_ranges:
|
|
optionShowRange(pOptions, pOptDesc, (void *)rng, 1);
|
|
return;
|
|
|
|
valid_return:
|
|
if ((pOptDesc->fOptState & OPTST_ALLOC_ARG) != 0) {
|
|
free((void *)pOptDesc->optArg.argString);
|
|
pOptDesc->fOptState &= ~OPTST_ALLOC_ARG;
|
|
}
|
|
pOptDesc->optArg.argInt = val;
|
|
}
|
|
|
|
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
|
|
*
|
|
* For the enet-vlan-tag option.
|
|
*/
|
|
static void
|
|
doOptEnet_Vlan_Tag(tOptions* pOptions, tOptDesc* pOptDesc)
|
|
{
|
|
static const struct {long const rmin, rmax;} rng[1] = {
|
|
{ 0, 4095 } };
|
|
long val;
|
|
int ix;
|
|
char * pzEnd;
|
|
|
|
if (pOptions <= OPTPROC_EMIT_LIMIT)
|
|
goto emit_ranges;
|
|
|
|
errno = 0;
|
|
val = strtol(pOptDesc->optArg.argString, &pzEnd, 0);
|
|
if ((pOptDesc->optArg.argString == pzEnd) || (errno != 0))
|
|
goto bad_value;
|
|
|
|
if (*pzEnd != '\0')
|
|
goto bad_value;
|
|
for (ix = 0; ix < 1; ix++) {
|
|
if (val < rng[ix].rmin)
|
|
continue; /* ranges need not be ordered. */
|
|
if (val == rng[ix].rmin)
|
|
goto valid_return;
|
|
if (rng[ix].rmax == LONG_MIN)
|
|
continue;
|
|
if (val <= rng[ix].rmax)
|
|
goto valid_return;
|
|
}
|
|
|
|
bad_value:
|
|
|
|
option_usage_fp = stderr;
|
|
|
|
emit_ranges:
|
|
optionShowRange(pOptions, pOptDesc, (void *)rng, 1);
|
|
return;
|
|
|
|
valid_return:
|
|
if ((pOptDesc->fOptState & OPTST_ALLOC_ARG) != 0) {
|
|
free((void *)pOptDesc->optArg.argString);
|
|
pOptDesc->fOptState &= ~OPTST_ALLOC_ARG;
|
|
}
|
|
pOptDesc->optArg.argInt = val;
|
|
}
|
|
|
|
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
|
|
*
|
|
* For the enet-vlan-cfi option.
|
|
*/
|
|
static void
|
|
doOptEnet_Vlan_Cfi(tOptions* pOptions, tOptDesc* pOptDesc)
|
|
{
|
|
static const struct {long const rmin, rmax;} rng[1] = {
|
|
{ 0, 1 } };
|
|
long val;
|
|
int ix;
|
|
char * pzEnd;
|
|
|
|
if (pOptions <= OPTPROC_EMIT_LIMIT)
|
|
goto emit_ranges;
|
|
|
|
errno = 0;
|
|
val = strtol(pOptDesc->optArg.argString, &pzEnd, 0);
|
|
if ((pOptDesc->optArg.argString == pzEnd) || (errno != 0))
|
|
goto bad_value;
|
|
|
|
if (*pzEnd != '\0')
|
|
goto bad_value;
|
|
for (ix = 0; ix < 1; ix++) {
|
|
if (val < rng[ix].rmin)
|
|
continue; /* ranges need not be ordered. */
|
|
if (val == rng[ix].rmin)
|
|
goto valid_return;
|
|
if (rng[ix].rmax == LONG_MIN)
|
|
continue;
|
|
if (val <= rng[ix].rmax)
|
|
goto valid_return;
|
|
}
|
|
|
|
bad_value:
|
|
|
|
option_usage_fp = stderr;
|
|
|
|
emit_ranges:
|
|
optionShowRange(pOptions, pOptDesc, (void *)rng, 1);
|
|
return;
|
|
|
|
valid_return:
|
|
if ((pOptDesc->fOptState & OPTST_ALLOC_ARG) != 0) {
|
|
free((void *)pOptDesc->optArg.argString);
|
|
pOptDesc->fOptState &= ~OPTST_ALLOC_ARG;
|
|
}
|
|
pOptDesc->optArg.argInt = val;
|
|
}
|
|
|
|
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
|
|
*
|
|
* For the enet-vlan-pri option.
|
|
*/
|
|
static void
|
|
doOptEnet_Vlan_Pri(tOptions* pOptions, tOptDesc* pOptDesc)
|
|
{
|
|
static const struct {long const rmin, rmax;} rng[1] = {
|
|
{ 0, 7 } };
|
|
long val;
|
|
int ix;
|
|
char * pzEnd;
|
|
|
|
if (pOptions <= OPTPROC_EMIT_LIMIT)
|
|
goto emit_ranges;
|
|
|
|
errno = 0;
|
|
val = strtol(pOptDesc->optArg.argString, &pzEnd, 0);
|
|
if ((pOptDesc->optArg.argString == pzEnd) || (errno != 0))
|
|
goto bad_value;
|
|
|
|
if (*pzEnd != '\0')
|
|
goto bad_value;
|
|
for (ix = 0; ix < 1; ix++) {
|
|
if (val < rng[ix].rmin)
|
|
continue; /* ranges need not be ordered. */
|
|
if (val == rng[ix].rmin)
|
|
goto valid_return;
|
|
if (rng[ix].rmax == LONG_MIN)
|
|
continue;
|
|
if (val <= rng[ix].rmax)
|
|
goto valid_return;
|
|
}
|
|
|
|
bad_value:
|
|
|
|
option_usage_fp = stderr;
|
|
|
|
emit_ranges:
|
|
optionShowRange(pOptions, pOptDesc, (void *)rng, 1);
|
|
return;
|
|
|
|
valid_return:
|
|
if ((pOptDesc->fOptState & OPTST_ALLOC_ARG) != 0) {
|
|
free((void *)pOptDesc->optArg.argString);
|
|
pOptDesc->fOptState &= ~OPTST_ALLOC_ARG;
|
|
}
|
|
pOptDesc->optArg.argInt = val;
|
|
}
|
|
|
|
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
|
|
*
|
|
* For the dbug option, when DEBUG is #define-d.
|
|
*/
|
|
#ifdef DEBUG
|
|
static void
|
|
doOptDbug(tOptions* pOptions, tOptDesc* pOptDesc)
|
|
{
|
|
static const struct {long const rmin, rmax;} rng[1] = {
|
|
{ 0, 5 } };
|
|
long val;
|
|
int ix;
|
|
char * pzEnd;
|
|
|
|
if (pOptions <= OPTPROC_EMIT_LIMIT)
|
|
goto emit_ranges;
|
|
|
|
errno = 0;
|
|
val = strtol(pOptDesc->optArg.argString, &pzEnd, 0);
|
|
if ((pOptDesc->optArg.argString == pzEnd) || (errno != 0))
|
|
goto bad_value;
|
|
|
|
if (*pzEnd != '\0')
|
|
goto bad_value;
|
|
for (ix = 0; ix < 1; ix++) {
|
|
if (val < rng[ix].rmin)
|
|
continue; /* ranges need not be ordered. */
|
|
if (val == rng[ix].rmin)
|
|
goto valid_return;
|
|
if (rng[ix].rmax == LONG_MIN)
|
|
continue;
|
|
if (val <= rng[ix].rmax)
|
|
goto valid_return;
|
|
}
|
|
|
|
bad_value:
|
|
|
|
option_usage_fp = stderr;
|
|
|
|
emit_ranges:
|
|
optionShowRange(pOptions, pOptDesc, (void *)rng, 1);
|
|
return;
|
|
|
|
valid_return:
|
|
if ((pOptDesc->fOptState & OPTST_ALLOC_ARG) != 0) {
|
|
free((void *)pOptDesc->optArg.argString);
|
|
pOptDesc->fOptState &= ~OPTST_ALLOC_ARG;
|
|
}
|
|
pOptDesc->optArg.argInt = val;
|
|
}
|
|
#endif /* defined DEBUG */
|
|
|
|
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
|
|
*
|
|
* For the listnics option, when ENABLE_PCAP_FINDALLDEVS is #define-d.
|
|
*/
|
|
#ifdef ENABLE_PCAP_FINDALLDEVS
|
|
static void
|
|
doOptListnics(tOptions* pOptions, tOptDesc* pOptDesc)
|
|
{
|
|
/* extracted from tcpbridge_opts.def, line 148 */
|
|
|
|
interface_list_t *list = get_interface_list();
|
|
list_interfaces(list);
|
|
free(list);
|
|
exit(0);
|
|
|
|
}
|
|
#endif /* defined ENABLE_PCAP_FINDALLDEVS */
|
|
|
|
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
|
|
*
|
|
* For the limit option.
|
|
*/
|
|
static void
|
|
doOptLimit(tOptions* pOptions, tOptDesc* pOptDesc)
|
|
{
|
|
static const struct {long const rmin, rmax;} rng[1] = {
|
|
{ 1, LONG_MAX } };
|
|
long val;
|
|
int ix;
|
|
char * pzEnd;
|
|
|
|
if (pOptions <= OPTPROC_EMIT_LIMIT)
|
|
goto emit_ranges;
|
|
|
|
errno = 0;
|
|
val = strtol(pOptDesc->optArg.argString, &pzEnd, 0);
|
|
if ((pOptDesc->optArg.argString == pzEnd) || (errno != 0))
|
|
goto bad_value;
|
|
|
|
if (*pzEnd != '\0')
|
|
goto bad_value;
|
|
for (ix = 0; ix < 1; ix++) {
|
|
if (val < rng[ix].rmin)
|
|
continue; /* ranges need not be ordered. */
|
|
if (val == rng[ix].rmin)
|
|
goto valid_return;
|
|
if (rng[ix].rmax == LONG_MIN)
|
|
continue;
|
|
if (val <= rng[ix].rmax)
|
|
goto valid_return;
|
|
}
|
|
|
|
bad_value:
|
|
|
|
option_usage_fp = stderr;
|
|
|
|
emit_ranges:
|
|
optionShowRange(pOptions, pOptDesc, (void *)rng, 1);
|
|
return;
|
|
|
|
valid_return:
|
|
if ((pOptDesc->fOptState & OPTST_ALLOC_ARG) != 0) {
|
|
free((void *)pOptDesc->optArg.argString);
|
|
pOptDesc->fOptState &= ~OPTST_ALLOC_ARG;
|
|
}
|
|
pOptDesc->optArg.argInt = val;
|
|
}
|
|
|
|
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
|
|
*
|
|
* For the include option.
|
|
*/
|
|
static void
|
|
doOptInclude(tOptions* pOptions, tOptDesc* pOptDesc)
|
|
{
|
|
/* extracted from tcpbridge_opts.def, line 205 */
|
|
|
|
char *include;
|
|
|
|
include = safe_strdup(OPT_ARG(INCLUDE));
|
|
options.xX.mode = xX_MODE_INCLUDE;
|
|
|
|
if ((options.xX.mode = parse_xX_str(&options.xX, include, &options.bpf)) == xXError)
|
|
errx(-1, "Unable to parse include/exclude rule: %s", OPT_ARG(INCLUDE));
|
|
|
|
free(include);
|
|
|
|
}
|
|
|
|
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
|
|
*
|
|
* For the exclude option.
|
|
*/
|
|
static void
|
|
doOptExclude(tOptions* pOptions, tOptDesc* pOptDesc)
|
|
{
|
|
/* extracted from tcpbridge_opts.def, line 252 */
|
|
|
|
char *exclude;
|
|
|
|
exclude = safe_strdup(OPT_ARG(EXCLUDE));
|
|
options.xX.mode = xX_MODE_EXCLUDE;
|
|
|
|
if ((options.xX.mode = parse_xX_str(&options.xX, exclude, &options.bpf)) == xXError)
|
|
errx(-1, "Unable to parse include/exclude rule: %s", OPT_ARG(EXCLUDE));
|
|
|
|
free(exclude);
|
|
|
|
}
|
|
|
|
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
|
|
*
|
|
* For the pid option.
|
|
*/
|
|
static void
|
|
doOptPid(tOptions* pOptions, tOptDesc* pOptDesc)
|
|
{
|
|
/* extracted from tcpbridge_opts.def, line 294 */
|
|
|
|
fprintf(stderr, "PID: %hu\n", getpid());
|
|
|
|
}
|
|
|
|
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
|
|
*
|
|
* For the version option.
|
|
*/
|
|
static void
|
|
doOptVersion(tOptions* pOptions, tOptDesc* pOptDesc)
|
|
{
|
|
/* extracted from tcpbridge_opts.def, line 339 */
|
|
|
|
fprintf(stderr, "tcpbridge version: %s (build %s)", VERSION, svn_version());
|
|
#ifdef DEBUG
|
|
fprintf(stderr, " (debug)");
|
|
#endif
|
|
fprintf(stderr, "\n");
|
|
fprintf(stderr, "Copyright 2000-2010 by Aaron Turner <aturner at synfin dot net>\n");
|
|
#ifdef HAVE_LIBDNET
|
|
fprintf(stderr, "Compiled against libdnet: %s\n", LIBDNET_VERSION);
|
|
#else
|
|
fprintf(stderr, "Not compiled with libdnet.\n");
|
|
#endif
|
|
#ifdef HAVE_WINPCAP
|
|
fprintf(stderr, "Compiled against winpcap: %s\n", get_pcap_version());
|
|
#else
|
|
fprintf(stderr, "Compiled against libpcap: %s\n", get_pcap_version());
|
|
#endif
|
|
#ifdef ENABLE_64BITS
|
|
fprintf(stderr, "64 bit packet counters: enabled\n");
|
|
#else
|
|
fprintf(stderr, "64 bit packet counters: disabled\n");
|
|
#endif
|
|
#ifdef ENABLE_VERBOSE
|
|
fprintf(stderr, "Verbose printing via tcpdump: enabled\n");
|
|
#else
|
|
fprintf(stderr, "Verbose printing via tcpdump: disabled\n");
|
|
#endif
|
|
fprintf(stderr, "Injection method: %s\n", sendpacket_get_method());
|
|
|
|
exit(0);
|
|
|
|
}
|
|
|
|
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
|
|
*
|
|
* For the less-help option.
|
|
*/
|
|
static void
|
|
doOptLess_Help(tOptions* pOptions, tOptDesc* pOptDesc)
|
|
{
|
|
/* extracted from tcpbridge_opts.def, line 380 */
|
|
|
|
USAGE(EXIT_FAILURE);
|
|
|
|
}
|
|
/* extracted from /usr/local/share/autogen/optcode.tpl near line 633 */
|
|
|
|
#if ENABLE_NLS
|
|
#include <stdio.h>
|
|
#include <stdlib.h>
|
|
#include <string.h>
|
|
#include <unistd.h>
|
|
#include <autoopts/usage-txt.h>
|
|
|
|
static char* AO_gettext( char const* pz );
|
|
static void coerce_it(void** s);
|
|
|
|
static char*
|
|
AO_gettext( char const* pz )
|
|
{
|
|
char* pzRes;
|
|
if (pz == NULL)
|
|
return NULL;
|
|
pzRes = _(pz);
|
|
if (pzRes == pz)
|
|
return pzRes;
|
|
pzRes = strdup( pzRes );
|
|
if (pzRes == NULL) {
|
|
fputs( _("No memory for duping translated strings\n"), stderr );
|
|
exit( EXIT_FAILURE );
|
|
}
|
|
return pzRes;
|
|
}
|
|
|
|
static void coerce_it(void** s) { *s = AO_gettext(*s); }
|
|
#define COERSION(_f) \
|
|
coerce_it((void*)&(tcpbridgeOptions._f))
|
|
|
|
/*
|
|
* This invokes the translation code (e.g. gettext(3)).
|
|
*/
|
|
static void
|
|
translate_option_strings( void )
|
|
{
|
|
/*
|
|
* Guard against re-translation. It won't work. The strings will have
|
|
* been changed by the first pass through this code. One shot only.
|
|
*/
|
|
if (option_usage_text.field_ct != 0) {
|
|
|
|
/*
|
|
* Do the translations. The first pointer follows the field count
|
|
* field. The field count field is the size of a pointer.
|
|
*/
|
|
tOptDesc* pOD = tcpbridgeOptions.pOptDesc;
|
|
char** ppz = (char**)(void*)&(option_usage_text);
|
|
int ix = option_usage_text.field_ct;
|
|
|
|
do {
|
|
ppz++;
|
|
*ppz = AO_gettext(*ppz);
|
|
} while (--ix > 0);
|
|
|
|
COERSION(pzCopyright);
|
|
COERSION(pzCopyNotice);
|
|
COERSION(pzFullVersion);
|
|
COERSION(pzUsageTitle);
|
|
COERSION(pzExplain);
|
|
COERSION(pzDetail);
|
|
option_usage_text.field_ct = 0;
|
|
|
|
for (ix = tcpbridgeOptions.optCt; ix > 0; ix--, pOD++)
|
|
coerce_it((void*)&(pOD->pzText));
|
|
}
|
|
|
|
if ((tcpbridgeOptions.fOptSet & OPTPROC_NXLAT_OPT_CFG) == 0) {
|
|
tOptDesc* pOD = tcpbridgeOptions.pOptDesc;
|
|
int ix;
|
|
|
|
for (ix = tcpbridgeOptions.optCt; ix > 0; ix--, pOD++) {
|
|
coerce_it((void*)&(pOD->pz_Name));
|
|
coerce_it((void*)&(pOD->pz_DisableName));
|
|
coerce_it((void*)&(pOD->pz_DisablePfx));
|
|
}
|
|
/* prevent re-translation */
|
|
tcpbridgeOptions.fOptSet |= OPTPROC_NXLAT_OPT_CFG | OPTPROC_NXLAT_OPT;
|
|
}
|
|
}
|
|
|
|
#endif /* ENABLE_NLS */
|
|
|
|
#ifdef __cplusplus
|
|
}
|
|
#endif
|
|
/* tcpbridge_opts.c ends here */
|