tcpbridge_opts.c 52 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600
  1. /* -*- buffer-read-only: t -*- vi: set ro:
  2. *
  3. * DO NOT EDIT THIS FILE (tcpbridge_opts.c)
  4. *
  5. * It has been AutoGen-ed Saturday April 21, 2007 at 06:52:23 PM PDT
  6. * From the definitions tcpbridge_opts.def
  7. * and the template file options
  8. *
  9. * Generated from AutoOpts 28:0:3 templates.
  10. */
  11. /*
  12. * This file was produced by an AutoOpts template. AutoOpts is a
  13. * copyrighted work. This source file is not encumbered by AutoOpts
  14. * licensing, but is provided under the licensing terms chosen by the
  15. * tcpbridge author or copyright holder. AutoOpts is licensed under
  16. * the terms of the LGPL. The redistributable library (``libopts'') is
  17. * licensed under the terms of either the LGPL or, at the users discretion,
  18. * the BSD license. See the AutoOpts and/or libopts sources for details.
  19. *
  20. * This source file is copyrighted and licensed under the following terms:
  21. *
  22. * tcpbridge copyright 2005-2007 Aaron Turner - all rights reserved
  23. *
  24. * tcpbridge is free software copyrighted by Aaron Turner.
  25. *
  26. * Redistribution and use in source and binary forms, with or without
  27. * modification, are permitted provided that the following conditions
  28. * are met:
  29. * 1. Redistributions of source code must retain the above copyright
  30. * notice, this list of conditions and the following disclaimer.
  31. * 2. Redistributions in binary form must reproduce the above copyright
  32. * notice, this list of conditions and the following disclaimer in the
  33. * documentation and/or other materials provided with the distribution.
  34. * 3. Neither the name ``Aaron Turner'' nor the name of any other
  35. * contributor may be used to endorse or promote products derived
  36. * from this software without specific prior written permission.
  37. *
  38. * tcpbridge IS PROVIDED BY Aaron Turner ``AS IS'' AND ANY EXPRESS
  39. * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
  40. * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
  41. * ARE DISCLAIMED. IN NO EVENT SHALL Aaron Turner OR ANY OTHER CONTRIBUTORS
  42. * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
  43. * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
  44. * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
  45. * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
  46. * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
  47. * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
  48. * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  49. */
  50. #include <limits.h>
  51. #include <stdio.h>
  52. #define OPTION_CODE_COMPILE 1
  53. #include "tcpbridge_opts.h"
  54. #ifdef __cplusplus
  55. extern "C" {
  56. #endif
  57. tSCC zCopyright[] =
  58. "tcpbridge copyright (c) 2005-2007 Aaron Turner, all rights reserved";
  59. tSCC zCopyrightNotice[] =
  60. "tcpbridge is free software copyrighted by Aaron Turner.\n\n\
  61. Redistribution and use in source and binary forms, with or without\n\
  62. modification, are permitted provided that the following conditions\n\
  63. are met:\n\
  64. 1. Redistributions of source code must retain the above copyright\n\
  65. notice, this list of conditions and the following disclaimer.\n\
  66. 2. Redistributions in binary form must reproduce the above copyright\n\
  67. notice, this list of conditions and the following disclaimer in the\n\
  68. documentation and/or other materials provided with the distribution.\n\
  69. 3. Neither the name ``Aaron Turner'' nor the name of any other\n\
  70. contributor may be used to endorse or promote products derived\n\
  71. from this software without specific prior written permission.\n\n\
  72. tcpbridge IS PROVIDED BY Aaron Turner ``AS IS'' AND ANY EXPRESS\n\
  73. OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED\n\
  74. WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n\
  75. ARE DISCLAIMED. IN NO EVENT SHALL Aaron Turner OR ANY OTHER CONTRIBUTORS\n\
  76. BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR\n\
  77. CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF\n\
  78. SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR\n\
  79. BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n\
  80. WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR\n\
  81. OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF\n\
  82. ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.";
  83. extern tUsageProc optionUsage;
  84. /*
  85. * global included definitions
  86. */
  87. #include "defines.h"
  88. #include "tcpbridge.h"
  89. #include "common.h"
  90. #include "config.h"
  91. #include <stdlib.h>
  92. #include <string.h>
  93. #include <sys/types.h>
  94. #include <unistd.h>
  95. extern tcpbridge_opt_t options;
  96. #ifndef NULL
  97. # define NULL 0
  98. #endif
  99. #ifndef EXIT_SUCCESS
  100. # define EXIT_SUCCESS 0
  101. #endif
  102. #ifndef EXIT_FAILURE
  103. # define EXIT_FAILURE 1
  104. #endif
  105. /*
  106. * Tcpedit option description:
  107. */
  108. tSCC zTcpeditText[] =
  109. "";
  110. #define TCPEDIT_FLAGS (OPTST_DOCUMENT | OPTST_NO_INIT)
  111. /*
  112. * Portmap option description:
  113. */
  114. tSCC zPortmapText[] =
  115. "Rewrite TCP/UDP ports";
  116. tSCC zPortmap_NAME[] = "PORTMAP";
  117. tSCC zPortmap_Name[] = "portmap";
  118. #define PORTMAP_FLAGS (OPTST_DISABLED \
  119. | OPTST_SET_ARGTYPE(OPARG_TYPE_STRING))
  120. /*
  121. * Seed option description:
  122. */
  123. tSCC zSeedText[] =
  124. "Randomize src/dst IP addresses w/ given seed";
  125. tSCC zSeed_NAME[] = "SEED";
  126. tSCC zSeed_Name[] = "seed";
  127. #define SEED_FLAGS (OPTST_DISABLED \
  128. | OPTST_SET_ARGTYPE(OPARG_TYPE_NUMERIC))
  129. /*
  130. * Pnat option description:
  131. */
  132. tSCC zPnatText[] =
  133. "Rewrite IP addresses using pseudo-NAT";
  134. tSCC zPnat_NAME[] = "PNAT";
  135. tSCC zPnat_Name[] = "pnat";
  136. #define PNAT_FLAGS (OPTST_DISABLED | OPTST_STACKED \
  137. | OPTST_SET_ARGTYPE(OPARG_TYPE_STRING))
  138. /*
  139. * Endpoints option description with
  140. * "Must also have options" and "Incompatible options":
  141. */
  142. #ifdef HAVE_CACHEFILE_SUPPORT
  143. tSCC zEndpointsText[] =
  144. "Rewrite IP addresses to be between two endpoints";
  145. tSCC zEndpoints_NAME[] = "ENDPOINTS";
  146. tSCC zEndpoints_Name[] = "endpoints";
  147. static const int
  148. aEndpointsMustList[] = {
  149. INDEX_OPT_CACHEFILE, NO_EQUIVALENT };
  150. #define ENDPOINTS_FLAGS (OPTST_DISABLED \
  151. | OPTST_SET_ARGTYPE(OPARG_TYPE_STRING))
  152. #else /* disable Endpoints */
  153. #define VALUE_OPT_ENDPOINTS NO_EQUIVALENT
  154. #define ENDPOINTS_FLAGS (OPTST_OMITTED | OPTST_NO_INIT)
  155. #define aEndpointsMustList NULL
  156. #define zEndpointsText NULL
  157. #define zEndpoints_NAME NULL
  158. #define zEndpoints_Name NULL
  159. #endif /* HAVE_CACHEFILE_SUPPORT */
  160. /*
  161. * Skipbroadcast option description:
  162. */
  163. tSCC zSkipbroadcastText[] =
  164. "Skip rewriting broadcast/multicast IP's";
  165. tSCC zSkipbroadcast_NAME[] = "SKIPBROADCAST";
  166. tSCC zSkipbroadcast_Name[] = "skipbroadcast";
  167. #define SKIPBROADCAST_FLAGS (OPTST_DISABLED)
  168. /*
  169. * Fixcsum option description:
  170. */
  171. tSCC zFixcsumText[] =
  172. "Force recalculation of IP/TCP/UDP checksums";
  173. tSCC zFixcsum_NAME[] = "FIXCSUM";
  174. tSCC zFixcsum_Name[] = "fixcsum";
  175. #define FIXCSUM_FLAGS (OPTST_DISABLED)
  176. /*
  177. * Mtu option description:
  178. */
  179. tSCC zMtuText[] =
  180. "Override default MTU length (1500 bytes)";
  181. tSCC zMtu_NAME[] = "MTU";
  182. tSCC zMtu_Name[] = "mtu";
  183. #define MTU_FLAGS (OPTST_DISABLED \
  184. | OPTST_SET_ARGTYPE(OPARG_TYPE_NUMERIC))
  185. /*
  186. * Efcs option description:
  187. */
  188. tSCC zEfcsText[] =
  189. "Remove Ethernet checksums (FCS) from end of frames";
  190. tSCC zEfcs_NAME[] = "EFCS";
  191. tSCC zEfcs_Name[] = "efcs";
  192. #define EFCS_FLAGS (OPTST_DISABLED)
  193. /*
  194. * Fixlen option description:
  195. */
  196. tSCC zFixlenText[] =
  197. "Pad or truncate packet data to match header length";
  198. tSCC zFixlen_NAME[] = "FIXLEN";
  199. tSCC zFixlen_Name[] = "fixlen";
  200. #define FIXLEN_FLAGS (OPTST_DISABLED \
  201. | OPTST_SET_ARGTYPE(OPARG_TYPE_STRING))
  202. /*
  203. * Skipl2broadcast option description:
  204. */
  205. tSCC zSkipl2broadcastText[] =
  206. "Skip rewriting broadcast/multicast Layer 2 addresses";
  207. tSCC zSkipl2broadcast_NAME[] = "SKIPL2BROADCAST";
  208. tSCC zSkipl2broadcast_Name[] = "skipl2broadcast";
  209. #define SKIPL2BROADCAST_FLAGS (OPTST_DISABLED)
  210. /*
  211. * Dlt option description:
  212. */
  213. tSCC zDltText[] =
  214. "Override output DLT encapsulation";
  215. tSCC zDlt_NAME[] = "DLT";
  216. tSCC zDlt_Name[] = "dlt";
  217. #define DLT_FLAGS (OPTST_DISABLED \
  218. | OPTST_SET_ARGTYPE(OPARG_TYPE_STRING))
  219. /*
  220. * Enet_Dmac option description:
  221. */
  222. tSCC zEnet_DmacText[] =
  223. "Override destination ethernet MAC addresses";
  224. tSCC zEnet_Dmac_NAME[] = "ENET_DMAC";
  225. tSCC zEnet_Dmac_Name[] = "enet-dmac";
  226. #define ENET_DMAC_FLAGS (OPTST_DISABLED \
  227. | OPTST_SET_ARGTYPE(OPARG_TYPE_STRING))
  228. /*
  229. * Enet_Smac option description:
  230. */
  231. tSCC zEnet_SmacText[] =
  232. "Override source ethernet MAC addresses";
  233. tSCC zEnet_Smac_NAME[] = "ENET_SMAC";
  234. tSCC zEnet_Smac_Name[] = "enet-smac";
  235. #define ENET_SMAC_FLAGS (OPTST_DISABLED \
  236. | OPTST_SET_ARGTYPE(OPARG_TYPE_STRING))
  237. /*
  238. * Enet_Vlan option description:
  239. */
  240. tSCC zEnet_VlanText[] =
  241. "Specify ethernet 802.1q VLAN tag mode";
  242. tSCC zEnet_Vlan_NAME[] = "ENET_VLAN";
  243. tSCC zEnet_Vlan_Name[] = "enet-vlan";
  244. #define ENET_VLAN_FLAGS (OPTST_DISABLED \
  245. | OPTST_SET_ARGTYPE(OPARG_TYPE_STRING))
  246. /*
  247. * Enet_Vlan_Tag option description with
  248. * "Must also have options" and "Incompatible options":
  249. */
  250. tSCC zEnet_Vlan_TagText[] =
  251. "Specify the new ethernet 802.1q VLAN tag value";
  252. tSCC zEnet_Vlan_Tag_NAME[] = "ENET_VLAN_TAG";
  253. tSCC zEnet_Vlan_Tag_Name[] = "enet-vlan-tag";
  254. static const int
  255. aEnet_Vlan_TagMustList[] = {
  256. INDEX_OPT_ENET_VLAN, NO_EQUIVALENT };
  257. #define ENET_VLAN_TAG_FLAGS (OPTST_DISABLED \
  258. | OPTST_SET_ARGTYPE(OPARG_TYPE_NUMERIC))
  259. /*
  260. * Enet_Vlan_Cfi option description with
  261. * "Must also have options" and "Incompatible options":
  262. */
  263. tSCC zEnet_Vlan_CfiText[] =
  264. "Specify the ethernet 802.1q VLAN CFI value";
  265. tSCC zEnet_Vlan_Cfi_NAME[] = "ENET_VLAN_CFI";
  266. tSCC zEnet_Vlan_Cfi_Name[] = "enet-vlan-cfi";
  267. static const int
  268. aEnet_Vlan_CfiMustList[] = {
  269. INDEX_OPT_ENET_VLAN, NO_EQUIVALENT };
  270. #define ENET_VLAN_CFI_FLAGS (OPTST_DISABLED \
  271. | OPTST_SET_ARGTYPE(OPARG_TYPE_NUMERIC))
  272. /*
  273. * Enet_Vlan_Pri option description with
  274. * "Must also have options" and "Incompatible options":
  275. */
  276. tSCC zEnet_Vlan_PriText[] =
  277. "Specify the ethernet 802.1q VLAN priority";
  278. tSCC zEnet_Vlan_Pri_NAME[] = "ENET_VLAN_PRI";
  279. tSCC zEnet_Vlan_Pri_Name[] = "enet-vlan-pri";
  280. static const int
  281. aEnet_Vlan_PriMustList[] = {
  282. INDEX_OPT_ENET_VLAN, NO_EQUIVALENT };
  283. #define ENET_VLAN_PRI_FLAGS (OPTST_DISABLED \
  284. | OPTST_SET_ARGTYPE(OPARG_TYPE_NUMERIC))
  285. /*
  286. * Hdlc_Control option description:
  287. */
  288. tSCC zHdlc_ControlText[] =
  289. "Specify HDLC control value";
  290. tSCC zHdlc_Control_NAME[] = "HDLC_CONTROL";
  291. tSCC zHdlc_Control_Name[] = "hdlc-control";
  292. #define HDLC_CONTROL_FLAGS (OPTST_DISABLED \
  293. | OPTST_SET_ARGTYPE(OPARG_TYPE_NUMERIC))
  294. /*
  295. * Hdlc_Address option description:
  296. */
  297. tSCC zHdlc_AddressText[] =
  298. "Specify HDLC address";
  299. tSCC zHdlc_Address_NAME[] = "HDLC_ADDRESS";
  300. tSCC zHdlc_Address_Name[] = "hdlc-address";
  301. #define HDLC_ADDRESS_FLAGS (OPTST_DISABLED \
  302. | OPTST_SET_ARGTYPE(OPARG_TYPE_NUMERIC))
  303. /*
  304. * User_Dlt option description:
  305. */
  306. tSCC zUser_DltText[] =
  307. "Set output file DLT type";
  308. tSCC zUser_Dlt_NAME[] = "USER_DLT";
  309. tSCC zUser_Dlt_Name[] = "user-dlt";
  310. #define USER_DLT_FLAGS (OPTST_DISABLED \
  311. | OPTST_SET_ARGTYPE(OPARG_TYPE_NUMERIC))
  312. /*
  313. * User_Dlink option description:
  314. */
  315. tSCC zUser_DlinkText[] =
  316. "Rewrite Data-Link layer with user specified data";
  317. tSCC zUser_Dlink_NAME[] = "USER_DLINK";
  318. tSCC zUser_Dlink_Name[] = "user-dlink";
  319. #define USER_DLINK_FLAGS (OPTST_DISABLED | OPTST_STACKED \
  320. | OPTST_SET_ARGTYPE(OPARG_TYPE_STRING))
  321. /*
  322. * Dbug option description:
  323. */
  324. #ifdef DEBUG
  325. tSCC zDbugText[] =
  326. "Enable debugging output";
  327. tSCC zDbug_NAME[] = "DBUG";
  328. tSCC zDbug_Name[] = "dbug";
  329. #define zDbugDefaultArg ((char const*)0)
  330. #define DBUG_FLAGS (OPTST_DISABLED | OPTST_IMM \
  331. | OPTST_SET_ARGTYPE(OPARG_TYPE_NUMERIC))
  332. #else /* disable Dbug */
  333. #define VALUE_OPT_DBUG NO_EQUIVALENT
  334. #define DBUG_FLAGS (OPTST_OMITTED | OPTST_NO_INIT)
  335. #define zDbugDefaultArg NULL
  336. #define zDbugText NULL
  337. #define zDbug_NAME NULL
  338. #define zDbug_Name NULL
  339. #endif /* DEBUG */
  340. /*
  341. * Intf1 option description:
  342. */
  343. tSCC zIntf1Text[] =
  344. "Primary interface (listen in uni-directional mode)";
  345. tSCC zIntf1_NAME[] = "INTF1";
  346. tSCC zIntf1_Name[] = "intf1";
  347. #define INTF1_FLAGS (OPTST_DISABLED | OPTST_MUST_SET \
  348. | OPTST_SET_ARGTYPE(OPARG_TYPE_STRING))
  349. /*
  350. * Intf2 option description:
  351. */
  352. tSCC zIntf2Text[] =
  353. "Secondary interface (send in uni-directional mode)";
  354. tSCC zIntf2_NAME[] = "INTF2";
  355. tSCC zIntf2_Name[] = "intf2";
  356. #define INTF2_FLAGS (OPTST_DISABLED \
  357. | OPTST_SET_ARGTYPE(OPARG_TYPE_STRING))
  358. /*
  359. * Unidir option description:
  360. */
  361. tSCC zUnidirText[] =
  362. "Send and receive in only one direction";
  363. tSCC zUnidir_NAME[] = "UNIDIR";
  364. tSCC zUnidir_Name[] = "unidir";
  365. #define UNIDIR_FLAGS (OPTST_DISABLED)
  366. /*
  367. * Limit option description:
  368. */
  369. tSCC zLimitText[] =
  370. "Limit the number of packets to send";
  371. tSCC zLimit_NAME[] = "LIMIT";
  372. tSCC zLimit_Name[] = "limit";
  373. #define zLimitDefaultArg ((char const*)-1)
  374. #define LIMIT_FLAGS (OPTST_DISABLED \
  375. | OPTST_SET_ARGTYPE(OPARG_TYPE_NUMERIC))
  376. /*
  377. * Include option description with
  378. * "Must also have options" and "Incompatible options":
  379. */
  380. tSCC zIncludeText[] =
  381. "Include only packets matching rule";
  382. tSCC zInclude_NAME[] = "INCLUDE";
  383. tSCC zInclude_Name[] = "include";
  384. static const int
  385. aIncludeCantList[] = {
  386. INDEX_OPT_EXCLUDE, NO_EQUIVALENT };
  387. #define INCLUDE_FLAGS (OPTST_DISABLED \
  388. | OPTST_SET_ARGTYPE(OPARG_TYPE_STRING))
  389. /*
  390. * Exclude option description with
  391. * "Must also have options" and "Incompatible options":
  392. */
  393. tSCC zExcludeText[] =
  394. "Exclude any packet matching this rule";
  395. tSCC zExclude_NAME[] = "EXCLUDE";
  396. tSCC zExclude_Name[] = "exclude";
  397. static const int
  398. aExcludeCantList[] = {
  399. INDEX_OPT_INCLUDE, NO_EQUIVALENT };
  400. #define EXCLUDE_FLAGS (OPTST_DISABLED \
  401. | OPTST_SET_ARGTYPE(OPARG_TYPE_STRING))
  402. /*
  403. * Pid option description:
  404. */
  405. tSCC zPidText[] =
  406. "Print the PID of tcpbridge at startup";
  407. tSCC zPid_NAME[] = "PID";
  408. tSCC zPid_Name[] = "pid";
  409. #define PID_FLAGS (OPTST_DISABLED)
  410. /*
  411. * Verbose option description:
  412. */
  413. #ifdef ENABLE_VERBOSE
  414. tSCC zVerboseText[] =
  415. "Print decoded packets via tcpdump to STDOUT";
  416. tSCC zVerbose_NAME[] = "VERBOSE";
  417. tSCC zVerbose_Name[] = "verbose";
  418. #define VERBOSE_FLAGS (OPTST_DISABLED | OPTST_IMM)
  419. #else /* disable Verbose */
  420. #define VALUE_OPT_VERBOSE NO_EQUIVALENT
  421. #define VERBOSE_FLAGS (OPTST_OMITTED | OPTST_NO_INIT)
  422. #define zVerboseText NULL
  423. #define zVerbose_NAME NULL
  424. #define zVerbose_Name NULL
  425. #endif /* ENABLE_VERBOSE */
  426. /*
  427. * Decode option description with
  428. * "Must also have options" and "Incompatible options":
  429. */
  430. #ifdef ENABLE_VERBOSE
  431. tSCC zDecodeText[] =
  432. "Arguments passed to tcpdump decoder";
  433. tSCC zDecode_NAME[] = "DECODE";
  434. tSCC zDecode_Name[] = "decode";
  435. static const int
  436. aDecodeMustList[] = {
  437. INDEX_OPT_VERBOSE, NO_EQUIVALENT };
  438. #define DECODE_FLAGS (OPTST_DISABLED \
  439. | OPTST_SET_ARGTYPE(OPARG_TYPE_STRING))
  440. #else /* disable Decode */
  441. #define VALUE_OPT_DECODE NO_EQUIVALENT
  442. #define DECODE_FLAGS (OPTST_OMITTED | OPTST_NO_INIT)
  443. #define aDecodeMustList NULL
  444. #define zDecodeText NULL
  445. #define zDecode_NAME NULL
  446. #define zDecode_Name NULL
  447. #endif /* ENABLE_VERBOSE */
  448. /*
  449. * Version option description:
  450. */
  451. tSCC zVersionText[] =
  452. "Print version information";
  453. tSCC zVersion_NAME[] = "VERSION";
  454. tSCC zVersion_Name[] = "version";
  455. #define VERSION_FLAGS (OPTST_DISABLED)
  456. /*
  457. * Less_Help option description:
  458. */
  459. tSCC zLess_HelpText[] =
  460. "Display less usage information and exit";
  461. tSCC zLess_Help_NAME[] = "LESS_HELP";
  462. tSCC zLess_Help_Name[] = "less-help";
  463. #define LESS_HELP_FLAGS (OPTST_DISABLED | OPTST_IMM)
  464. /*
  465. * Help/More_Help option descriptions:
  466. */
  467. tSCC zHelpText[] = "Display usage information and exit";
  468. tSCC zHelp_Name[] = "help";
  469. tSCC zMore_HelpText[] = "Extended usage information passed thru pager";
  470. tSCC zMore_Help_Name[] = "more-help";
  471. /*
  472. * Save/Load_Opts option description:
  473. */
  474. tSCC zSave_OptsText[] = "Save the option state to a config file";
  475. tSCC zSave_Opts_Name[] = "save-opts";
  476. tSCC zLoad_OptsText[] = "Load options from a config file";
  477. tSCC zLoad_Opts_NAME[] = "LOAD_OPTS";
  478. tSCC zNotLoad_Opts_Name[] = "no-load-opts";
  479. tSCC zNotLoad_Opts_Pfx[] = "no";
  480. #define zLoad_Opts_Name (zNotLoad_Opts_Name + 3)
  481. /*
  482. * Declare option callback procedures
  483. */
  484. #ifdef DEBUG
  485. static tOptProc doOptDbug;
  486. #else /* not DEBUG */
  487. # define doOptDbug NULL
  488. #endif /* def/not DEBUG */
  489. extern tOptProc
  490. optionNumericVal, optionPagedUsage, optionStackArg;
  491. static tOptProc
  492. doOptEnet_Vlan_Cfi, doOptEnet_Vlan_Pri, doOptEnet_Vlan_Tag,
  493. doOptExclude, doOptInclude, doOptLess_Help,
  494. doOptLimit, doOptMtu, doOptPid,
  495. doOptVersion, doUsageOpt;
  496. /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
  497. *
  498. * Define the Tcpbridge Option Descriptions.
  499. */
  500. static tOptDesc optDesc[ OPTION_CT ] = {
  501. { /* entry idx, value */ 0, 0,
  502. /* equiv idx, value */ 0, 0,
  503. /* equivalenced to */ NO_EQUIVALENT,
  504. /* min, max, act ct */ 0, 0, 0,
  505. /* opt state flags */ TCPEDIT_FLAGS, 0,
  506. /* last opt argumnt */ { NULL },
  507. /* arg list/cookie */ NULL,
  508. /* must/cannot opts */ NULL, NULL,
  509. /* option proc */ NULL,
  510. /* desc, NAME, name */ zTcpeditText, NULL, NULL,
  511. /* disablement strs */ NULL, NULL },
  512. { /* entry idx, value */ 1, VALUE_OPT_PORTMAP,
  513. /* equiv idx, value */ 1, VALUE_OPT_PORTMAP,
  514. /* equivalenced to */ NO_EQUIVALENT,
  515. /* min, max, act ct */ 0, 1, 0,
  516. /* opt state flags */ PORTMAP_FLAGS, 0,
  517. /* last opt argumnt */ { NULL },
  518. /* arg list/cookie */ NULL,
  519. /* must/cannot opts */ NULL, NULL,
  520. /* option proc */ NULL,
  521. /* desc, NAME, name */ zPortmapText, zPortmap_NAME, zPortmap_Name,
  522. /* disablement strs */ NULL, NULL },
  523. { /* entry idx, value */ 2, VALUE_OPT_SEED,
  524. /* equiv idx, value */ 2, VALUE_OPT_SEED,
  525. /* equivalenced to */ NO_EQUIVALENT,
  526. /* min, max, act ct */ 0, 1, 0,
  527. /* opt state flags */ SEED_FLAGS, 0,
  528. /* last opt argumnt */ { NULL },
  529. /* arg list/cookie */ NULL,
  530. /* must/cannot opts */ NULL, NULL,
  531. /* option proc */ optionNumericVal,
  532. /* desc, NAME, name */ zSeedText, zSeed_NAME, zSeed_Name,
  533. /* disablement strs */ NULL, NULL },
  534. { /* entry idx, value */ 3, VALUE_OPT_PNAT,
  535. /* equiv idx, value */ 3, VALUE_OPT_PNAT,
  536. /* equivalenced to */ NO_EQUIVALENT,
  537. /* min, max, act ct */ 0, 2, 0,
  538. /* opt state flags */ PNAT_FLAGS, 0,
  539. /* last opt argumnt */ { NULL },
  540. /* arg list/cookie */ NULL,
  541. /* must/cannot opts */ NULL, NULL,
  542. /* option proc */ optionStackArg,
  543. /* desc, NAME, name */ zPnatText, zPnat_NAME, zPnat_Name,
  544. /* disablement strs */ NULL, NULL },
  545. { /* entry idx, value */ 4, VALUE_OPT_ENDPOINTS,
  546. /* equiv idx, value */ 4, VALUE_OPT_ENDPOINTS,
  547. /* equivalenced to */ NO_EQUIVALENT,
  548. /* min, max, act ct */ 0, 1, 0,
  549. /* opt state flags */ ENDPOINTS_FLAGS, 0,
  550. /* last opt argumnt */ { NULL },
  551. /* arg list/cookie */ NULL,
  552. /* must/cannot opts */ aEndpointsMustList, NULL,
  553. /* option proc */ NULL,
  554. /* desc, NAME, name */ zEndpointsText, zEndpoints_NAME, zEndpoints_Name,
  555. /* disablement strs */ NULL, NULL },
  556. { /* entry idx, value */ 5, VALUE_OPT_SKIPBROADCAST,
  557. /* equiv idx, value */ 5, VALUE_OPT_SKIPBROADCAST,
  558. /* equivalenced to */ NO_EQUIVALENT,
  559. /* min, max, act ct */ 0, 1, 0,
  560. /* opt state flags */ SKIPBROADCAST_FLAGS, 0,
  561. /* last opt argumnt */ { NULL },
  562. /* arg list/cookie */ NULL,
  563. /* must/cannot opts */ NULL, NULL,
  564. /* option proc */ NULL,
  565. /* desc, NAME, name */ zSkipbroadcastText, zSkipbroadcast_NAME, zSkipbroadcast_Name,
  566. /* disablement strs */ NULL, NULL },
  567. { /* entry idx, value */ 6, VALUE_OPT_FIXCSUM,
  568. /* equiv idx, value */ 6, VALUE_OPT_FIXCSUM,
  569. /* equivalenced to */ NO_EQUIVALENT,
  570. /* min, max, act ct */ 0, 1, 0,
  571. /* opt state flags */ FIXCSUM_FLAGS, 0,
  572. /* last opt argumnt */ { NULL },
  573. /* arg list/cookie */ NULL,
  574. /* must/cannot opts */ NULL, NULL,
  575. /* option proc */ NULL,
  576. /* desc, NAME, name */ zFixcsumText, zFixcsum_NAME, zFixcsum_Name,
  577. /* disablement strs */ NULL, NULL },
  578. { /* entry idx, value */ 7, VALUE_OPT_MTU,
  579. /* equiv idx, value */ 7, VALUE_OPT_MTU,
  580. /* equivalenced to */ NO_EQUIVALENT,
  581. /* min, max, act ct */ 0, 1, 0,
  582. /* opt state flags */ MTU_FLAGS, 0,
  583. /* last opt argumnt */ { NULL },
  584. /* arg list/cookie */ NULL,
  585. /* must/cannot opts */ NULL, NULL,
  586. /* option proc */ doOptMtu,
  587. /* desc, NAME, name */ zMtuText, zMtu_NAME, zMtu_Name,
  588. /* disablement strs */ NULL, NULL },
  589. { /* entry idx, value */ 8, VALUE_OPT_EFCS,
  590. /* equiv idx, value */ 8, VALUE_OPT_EFCS,
  591. /* equivalenced to */ NO_EQUIVALENT,
  592. /* min, max, act ct */ 0, 1, 0,
  593. /* opt state flags */ EFCS_FLAGS, 0,
  594. /* last opt argumnt */ { NULL },
  595. /* arg list/cookie */ NULL,
  596. /* must/cannot opts */ NULL, NULL,
  597. /* option proc */ NULL,
  598. /* desc, NAME, name */ zEfcsText, zEfcs_NAME, zEfcs_Name,
  599. /* disablement strs */ NULL, NULL },
  600. { /* entry idx, value */ 9, VALUE_OPT_FIXLEN,
  601. /* equiv idx, value */ 9, VALUE_OPT_FIXLEN,
  602. /* equivalenced to */ NO_EQUIVALENT,
  603. /* min, max, act ct */ 0, 1, 0,
  604. /* opt state flags */ FIXLEN_FLAGS, 0,
  605. /* last opt argumnt */ { NULL },
  606. /* arg list/cookie */ NULL,
  607. /* must/cannot opts */ NULL, NULL,
  608. /* option proc */ NULL,
  609. /* desc, NAME, name */ zFixlenText, zFixlen_NAME, zFixlen_Name,
  610. /* disablement strs */ NULL, NULL },
  611. { /* entry idx, value */ 10, VALUE_OPT_SKIPL2BROADCAST,
  612. /* equiv idx, value */ 10, VALUE_OPT_SKIPL2BROADCAST,
  613. /* equivalenced to */ NO_EQUIVALENT,
  614. /* min, max, act ct */ 0, 1, 0,
  615. /* opt state flags */ SKIPL2BROADCAST_FLAGS, 0,
  616. /* last opt argumnt */ { NULL },
  617. /* arg list/cookie */ NULL,
  618. /* must/cannot opts */ NULL, NULL,
  619. /* option proc */ NULL,
  620. /* desc, NAME, name */ zSkipl2broadcastText, zSkipl2broadcast_NAME, zSkipl2broadcast_Name,
  621. /* disablement strs */ NULL, NULL },
  622. { /* entry idx, value */ 11, VALUE_OPT_DLT,
  623. /* equiv idx, value */ 11, VALUE_OPT_DLT,
  624. /* equivalenced to */ NO_EQUIVALENT,
  625. /* min, max, act ct */ 0, 1, 0,
  626. /* opt state flags */ DLT_FLAGS, 0,
  627. /* last opt argumnt */ { NULL },
  628. /* arg list/cookie */ NULL,
  629. /* must/cannot opts */ NULL, NULL,
  630. /* option proc */ NULL,
  631. /* desc, NAME, name */ zDltText, zDlt_NAME, zDlt_Name,
  632. /* disablement strs */ NULL, NULL },
  633. { /* entry idx, value */ 12, VALUE_OPT_ENET_DMAC,
  634. /* equiv idx, value */ 12, VALUE_OPT_ENET_DMAC,
  635. /* equivalenced to */ NO_EQUIVALENT,
  636. /* min, max, act ct */ 0, 1, 0,
  637. /* opt state flags */ ENET_DMAC_FLAGS, 0,
  638. /* last opt argumnt */ { NULL },
  639. /* arg list/cookie */ NULL,
  640. /* must/cannot opts */ NULL, NULL,
  641. /* option proc */ NULL,
  642. /* desc, NAME, name */ zEnet_DmacText, zEnet_Dmac_NAME, zEnet_Dmac_Name,
  643. /* disablement strs */ NULL, NULL },
  644. { /* entry idx, value */ 13, VALUE_OPT_ENET_SMAC,
  645. /* equiv idx, value */ 13, VALUE_OPT_ENET_SMAC,
  646. /* equivalenced to */ NO_EQUIVALENT,
  647. /* min, max, act ct */ 0, 1, 0,
  648. /* opt state flags */ ENET_SMAC_FLAGS, 0,
  649. /* last opt argumnt */ { NULL },
  650. /* arg list/cookie */ NULL,
  651. /* must/cannot opts */ NULL, NULL,
  652. /* option proc */ NULL,
  653. /* desc, NAME, name */ zEnet_SmacText, zEnet_Smac_NAME, zEnet_Smac_Name,
  654. /* disablement strs */ NULL, NULL },
  655. { /* entry idx, value */ 14, VALUE_OPT_ENET_VLAN,
  656. /* equiv idx, value */ 14, VALUE_OPT_ENET_VLAN,
  657. /* equivalenced to */ NO_EQUIVALENT,
  658. /* min, max, act ct */ 0, 1, 0,
  659. /* opt state flags */ ENET_VLAN_FLAGS, 0,
  660. /* last opt argumnt */ { NULL },
  661. /* arg list/cookie */ NULL,
  662. /* must/cannot opts */ NULL, NULL,
  663. /* option proc */ NULL,
  664. /* desc, NAME, name */ zEnet_VlanText, zEnet_Vlan_NAME, zEnet_Vlan_Name,
  665. /* disablement strs */ NULL, NULL },
  666. { /* entry idx, value */ 15, VALUE_OPT_ENET_VLAN_TAG,
  667. /* equiv idx, value */ 15, VALUE_OPT_ENET_VLAN_TAG,
  668. /* equivalenced to */ NO_EQUIVALENT,
  669. /* min, max, act ct */ 0, 1, 0,
  670. /* opt state flags */ ENET_VLAN_TAG_FLAGS, 0,
  671. /* last opt argumnt */ { NULL },
  672. /* arg list/cookie */ NULL,
  673. /* must/cannot opts */ aEnet_Vlan_TagMustList, NULL,
  674. /* option proc */ doOptEnet_Vlan_Tag,
  675. /* desc, NAME, name */ zEnet_Vlan_TagText, zEnet_Vlan_Tag_NAME, zEnet_Vlan_Tag_Name,
  676. /* disablement strs */ NULL, NULL },
  677. { /* entry idx, value */ 16, VALUE_OPT_ENET_VLAN_CFI,
  678. /* equiv idx, value */ 16, VALUE_OPT_ENET_VLAN_CFI,
  679. /* equivalenced to */ NO_EQUIVALENT,
  680. /* min, max, act ct */ 0, 1, 0,
  681. /* opt state flags */ ENET_VLAN_CFI_FLAGS, 0,
  682. /* last opt argumnt */ { NULL },
  683. /* arg list/cookie */ NULL,
  684. /* must/cannot opts */ aEnet_Vlan_CfiMustList, NULL,
  685. /* option proc */ doOptEnet_Vlan_Cfi,
  686. /* desc, NAME, name */ zEnet_Vlan_CfiText, zEnet_Vlan_Cfi_NAME, zEnet_Vlan_Cfi_Name,
  687. /* disablement strs */ NULL, NULL },
  688. { /* entry idx, value */ 17, VALUE_OPT_ENET_VLAN_PRI,
  689. /* equiv idx, value */ 17, VALUE_OPT_ENET_VLAN_PRI,
  690. /* equivalenced to */ NO_EQUIVALENT,
  691. /* min, max, act ct */ 0, 1, 0,
  692. /* opt state flags */ ENET_VLAN_PRI_FLAGS, 0,
  693. /* last opt argumnt */ { NULL },
  694. /* arg list/cookie */ NULL,
  695. /* must/cannot opts */ aEnet_Vlan_PriMustList, NULL,
  696. /* option proc */ doOptEnet_Vlan_Pri,
  697. /* desc, NAME, name */ zEnet_Vlan_PriText, zEnet_Vlan_Pri_NAME, zEnet_Vlan_Pri_Name,
  698. /* disablement strs */ NULL, NULL },
  699. { /* entry idx, value */ 18, VALUE_OPT_HDLC_CONTROL,
  700. /* equiv idx, value */ 18, VALUE_OPT_HDLC_CONTROL,
  701. /* equivalenced to */ NO_EQUIVALENT,
  702. /* min, max, act ct */ 0, 1, 0,
  703. /* opt state flags */ HDLC_CONTROL_FLAGS, 0,
  704. /* last opt argumnt */ { NULL },
  705. /* arg list/cookie */ NULL,
  706. /* must/cannot opts */ NULL, NULL,
  707. /* option proc */ optionNumericVal,
  708. /* desc, NAME, name */ zHdlc_ControlText, zHdlc_Control_NAME, zHdlc_Control_Name,
  709. /* disablement strs */ NULL, NULL },
  710. { /* entry idx, value */ 19, VALUE_OPT_HDLC_ADDRESS,
  711. /* equiv idx, value */ 19, VALUE_OPT_HDLC_ADDRESS,
  712. /* equivalenced to */ NO_EQUIVALENT,
  713. /* min, max, act ct */ 0, 1, 0,
  714. /* opt state flags */ HDLC_ADDRESS_FLAGS, 0,
  715. /* last opt argumnt */ { NULL },
  716. /* arg list/cookie */ NULL,
  717. /* must/cannot opts */ NULL, NULL,
  718. /* option proc */ optionNumericVal,
  719. /* desc, NAME, name */ zHdlc_AddressText, zHdlc_Address_NAME, zHdlc_Address_Name,
  720. /* disablement strs */ NULL, NULL },
  721. { /* entry idx, value */ 20, VALUE_OPT_USER_DLT,
  722. /* equiv idx, value */ 20, VALUE_OPT_USER_DLT,
  723. /* equivalenced to */ NO_EQUIVALENT,
  724. /* min, max, act ct */ 0, 1, 0,
  725. /* opt state flags */ USER_DLT_FLAGS, 0,
  726. /* last opt argumnt */ { NULL },
  727. /* arg list/cookie */ NULL,
  728. /* must/cannot opts */ NULL, NULL,
  729. /* option proc */ optionNumericVal,
  730. /* desc, NAME, name */ zUser_DltText, zUser_Dlt_NAME, zUser_Dlt_Name,
  731. /* disablement strs */ NULL, NULL },
  732. { /* entry idx, value */ 21, VALUE_OPT_USER_DLINK,
  733. /* equiv idx, value */ 21, VALUE_OPT_USER_DLINK,
  734. /* equivalenced to */ NO_EQUIVALENT,
  735. /* min, max, act ct */ 0, 2, 0,
  736. /* opt state flags */ USER_DLINK_FLAGS, 0,
  737. /* last opt argumnt */ { NULL },
  738. /* arg list/cookie */ NULL,
  739. /* must/cannot opts */ NULL, NULL,
  740. /* option proc */ optionStackArg,
  741. /* desc, NAME, name */ zUser_DlinkText, zUser_Dlink_NAME, zUser_Dlink_Name,
  742. /* disablement strs */ NULL, NULL },
  743. { /* entry idx, value */ 22, VALUE_OPT_DBUG,
  744. /* equiv idx, value */ 22, VALUE_OPT_DBUG,
  745. /* equivalenced to */ NO_EQUIVALENT,
  746. /* min, max, act ct */ 0, 1, 0,
  747. /* opt state flags */ DBUG_FLAGS, 0,
  748. /* last opt argumnt */ { zDbugDefaultArg },
  749. /* arg list/cookie */ NULL,
  750. /* must/cannot opts */ NULL, NULL,
  751. /* option proc */ doOptDbug,
  752. /* desc, NAME, name */ zDbugText, zDbug_NAME, zDbug_Name,
  753. /* disablement strs */ NULL, NULL },
  754. { /* entry idx, value */ 23, VALUE_OPT_INTF1,
  755. /* equiv idx, value */ 23, VALUE_OPT_INTF1,
  756. /* equivalenced to */ NO_EQUIVALENT,
  757. /* min, max, act ct */ 1, 1, 0,
  758. /* opt state flags */ INTF1_FLAGS, 0,
  759. /* last opt argumnt */ { NULL },
  760. /* arg list/cookie */ NULL,
  761. /* must/cannot opts */ NULL, NULL,
  762. /* option proc */ NULL,
  763. /* desc, NAME, name */ zIntf1Text, zIntf1_NAME, zIntf1_Name,
  764. /* disablement strs */ NULL, NULL },
  765. { /* entry idx, value */ 24, VALUE_OPT_INTF2,
  766. /* equiv idx, value */ 24, VALUE_OPT_INTF2,
  767. /* equivalenced to */ NO_EQUIVALENT,
  768. /* min, max, act ct */ 0, 1, 0,
  769. /* opt state flags */ INTF2_FLAGS, 0,
  770. /* last opt argumnt */ { NULL },
  771. /* arg list/cookie */ NULL,
  772. /* must/cannot opts */ NULL, NULL,
  773. /* option proc */ NULL,
  774. /* desc, NAME, name */ zIntf2Text, zIntf2_NAME, zIntf2_Name,
  775. /* disablement strs */ NULL, NULL },
  776. { /* entry idx, value */ 25, VALUE_OPT_UNIDIR,
  777. /* equiv idx, value */ 25, VALUE_OPT_UNIDIR,
  778. /* equivalenced to */ NO_EQUIVALENT,
  779. /* min, max, act ct */ 0, 1, 0,
  780. /* opt state flags */ UNIDIR_FLAGS, 0,
  781. /* last opt argumnt */ { NULL },
  782. /* arg list/cookie */ NULL,
  783. /* must/cannot opts */ NULL, NULL,
  784. /* option proc */ NULL,
  785. /* desc, NAME, name */ zUnidirText, zUnidir_NAME, zUnidir_Name,
  786. /* disablement strs */ NULL, NULL },
  787. { /* entry idx, value */ 26, VALUE_OPT_LIMIT,
  788. /* equiv idx, value */ 26, VALUE_OPT_LIMIT,
  789. /* equivalenced to */ NO_EQUIVALENT,
  790. /* min, max, act ct */ 0, 1, 0,
  791. /* opt state flags */ LIMIT_FLAGS, 0,
  792. /* last opt argumnt */ { zLimitDefaultArg },
  793. /* arg list/cookie */ NULL,
  794. /* must/cannot opts */ NULL, NULL,
  795. /* option proc */ doOptLimit,
  796. /* desc, NAME, name */ zLimitText, zLimit_NAME, zLimit_Name,
  797. /* disablement strs */ NULL, NULL },
  798. { /* entry idx, value */ 27, VALUE_OPT_INCLUDE,
  799. /* equiv idx, value */ 27, VALUE_OPT_INCLUDE,
  800. /* equivalenced to */ NO_EQUIVALENT,
  801. /* min, max, act ct */ 0, 1, 0,
  802. /* opt state flags */ INCLUDE_FLAGS, 0,
  803. /* last opt argumnt */ { NULL },
  804. /* arg list/cookie */ NULL,
  805. /* must/cannot opts */ NULL, aIncludeCantList,
  806. /* option proc */ doOptInclude,
  807. /* desc, NAME, name */ zIncludeText, zInclude_NAME, zInclude_Name,
  808. /* disablement strs */ NULL, NULL },
  809. { /* entry idx, value */ 28, VALUE_OPT_EXCLUDE,
  810. /* equiv idx, value */ 28, VALUE_OPT_EXCLUDE,
  811. /* equivalenced to */ NO_EQUIVALENT,
  812. /* min, max, act ct */ 0, 1, 0,
  813. /* opt state flags */ EXCLUDE_FLAGS, 0,
  814. /* last opt argumnt */ { NULL },
  815. /* arg list/cookie */ NULL,
  816. /* must/cannot opts */ NULL, aExcludeCantList,
  817. /* option proc */ doOptExclude,
  818. /* desc, NAME, name */ zExcludeText, zExclude_NAME, zExclude_Name,
  819. /* disablement strs */ NULL, NULL },
  820. { /* entry idx, value */ 29, VALUE_OPT_PID,
  821. /* equiv idx, value */ 29, VALUE_OPT_PID,
  822. /* equivalenced to */ NO_EQUIVALENT,
  823. /* min, max, act ct */ 0, 1, 0,
  824. /* opt state flags */ PID_FLAGS, 0,
  825. /* last opt argumnt */ { NULL },
  826. /* arg list/cookie */ NULL,
  827. /* must/cannot opts */ NULL, NULL,
  828. /* option proc */ doOptPid,
  829. /* desc, NAME, name */ zPidText, zPid_NAME, zPid_Name,
  830. /* disablement strs */ NULL, NULL },
  831. { /* entry idx, value */ 30, VALUE_OPT_VERBOSE,
  832. /* equiv idx, value */ 30, VALUE_OPT_VERBOSE,
  833. /* equivalenced to */ NO_EQUIVALENT,
  834. /* min, max, act ct */ 0, 1, 0,
  835. /* opt state flags */ VERBOSE_FLAGS, 0,
  836. /* last opt argumnt */ { NULL },
  837. /* arg list/cookie */ NULL,
  838. /* must/cannot opts */ NULL, NULL,
  839. /* option proc */ NULL,
  840. /* desc, NAME, name */ zVerboseText, zVerbose_NAME, zVerbose_Name,
  841. /* disablement strs */ NULL, NULL },
  842. { /* entry idx, value */ 31, VALUE_OPT_DECODE,
  843. /* equiv idx, value */ 31, VALUE_OPT_DECODE,
  844. /* equivalenced to */ NO_EQUIVALENT,
  845. /* min, max, act ct */ 0, 1, 0,
  846. /* opt state flags */ DECODE_FLAGS, 0,
  847. /* last opt argumnt */ { NULL },
  848. /* arg list/cookie */ NULL,
  849. /* must/cannot opts */ aDecodeMustList, NULL,
  850. /* option proc */ NULL,
  851. /* desc, NAME, name */ zDecodeText, zDecode_NAME, zDecode_Name,
  852. /* disablement strs */ NULL, NULL },
  853. { /* entry idx, value */ 32, VALUE_OPT_VERSION,
  854. /* equiv idx, value */ 32, VALUE_OPT_VERSION,
  855. /* equivalenced to */ NO_EQUIVALENT,
  856. /* min, max, act ct */ 0, 1, 0,
  857. /* opt state flags */ VERSION_FLAGS, 0,
  858. /* last opt argumnt */ { NULL },
  859. /* arg list/cookie */ NULL,
  860. /* must/cannot opts */ NULL, NULL,
  861. /* option proc */ doOptVersion,
  862. /* desc, NAME, name */ zVersionText, zVersion_NAME, zVersion_Name,
  863. /* disablement strs */ NULL, NULL },
  864. { /* entry idx, value */ 33, VALUE_OPT_LESS_HELP,
  865. /* equiv idx, value */ 33, VALUE_OPT_LESS_HELP,
  866. /* equivalenced to */ NO_EQUIVALENT,
  867. /* min, max, act ct */ 0, 1, 0,
  868. /* opt state flags */ LESS_HELP_FLAGS, 0,
  869. /* last opt argumnt */ { NULL },
  870. /* arg list/cookie */ NULL,
  871. /* must/cannot opts */ NULL, NULL,
  872. /* option proc */ doOptLess_Help,
  873. /* desc, NAME, name */ zLess_HelpText, zLess_Help_NAME, zLess_Help_Name,
  874. /* disablement strs */ NULL, NULL },
  875. { /* entry idx, value */ INDEX_OPT_HELP, VALUE_OPT_HELP,
  876. /* equiv idx value */ NO_EQUIVALENT, 0,
  877. /* equivalenced to */ NO_EQUIVALENT,
  878. /* min, max, act ct */ 0, 1, 0,
  879. /* opt state flags */ OPTST_IMM, 0,
  880. /* last opt argumnt */ { NULL },
  881. /* arg list/cookie */ NULL,
  882. /* must/cannot opts */ NULL, NULL,
  883. /* option proc */ doUsageOpt,
  884. /* desc, NAME, name */ zHelpText, NULL, zHelp_Name,
  885. /* disablement strs */ NULL, NULL },
  886. { /* entry idx, value */ INDEX_OPT_MORE_HELP, VALUE_OPT_MORE_HELP,
  887. /* equiv idx value */ NO_EQUIVALENT, 0,
  888. /* equivalenced to */ NO_EQUIVALENT,
  889. /* min, max, act ct */ 0, 1, 0,
  890. /* opt state flags */ OPTST_IMM, 0,
  891. /* last opt argumnt */ { NULL },
  892. /* arg list/cookie */ NULL,
  893. /* must/cannot opts */ NULL, NULL,
  894. /* option proc */ optionPagedUsage,
  895. /* desc, NAME, name */ zMore_HelpText, NULL, zMore_Help_Name,
  896. /* disablement strs */ NULL, NULL },
  897. { /* entry idx, value */ INDEX_OPT_SAVE_OPTS, VALUE_OPT_SAVE_OPTS,
  898. /* equiv idx value */ NO_EQUIVALENT, 0,
  899. /* equivalenced to */ NO_EQUIVALENT,
  900. /* min, max, act ct */ 0, 1, 0,
  901. /* opt state flags */ OPTST_SET_ARGTYPE(OPARG_TYPE_STRING)
  902. | OPTST_ARG_OPTIONAL, 0,
  903. /* last opt argumnt */ { NULL },
  904. /* arg list/cookie */ NULL,
  905. /* must/cannot opts */ NULL, NULL,
  906. /* option proc */ NULL,
  907. /* desc, NAME, name */ zSave_OptsText, NULL, zSave_Opts_Name,
  908. /* disablement strs */ NULL, NULL },
  909. { /* entry idx, value */ INDEX_OPT_LOAD_OPTS, VALUE_OPT_LOAD_OPTS,
  910. /* equiv idx value */ NO_EQUIVALENT, 0,
  911. /* equivalenced to */ NO_EQUIVALENT,
  912. /* min, max, act ct */ 0, NOLIMIT, 0,
  913. /* opt state flags */ OPTST_DISABLE_IMM | \
  914. OPTST_SET_ARGTYPE(OPARG_TYPE_STRING), 0,
  915. /* last opt argumnt */ { NULL },
  916. /* arg list/cookie */ NULL,
  917. /* must/cannot opts */ NULL, NULL,
  918. /* option proc */ optionLoadOpt,
  919. /* desc, NAME, name */ zLoad_OptsText, zLoad_Opts_NAME, zLoad_Opts_Name,
  920. /* disablement strs */ zNotLoad_Opts_Name, zNotLoad_Opts_Pfx }
  921. };
  922. tOptDesc * const tcpedit_tcpedit_optDesc_p = optDesc + 0;
  923. /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
  924. *
  925. * Define the Tcpbridge Option Environment
  926. */
  927. tSCC zPROGNAME[] = "TCPBRIDGE";
  928. tSCC zUsageTitle[] =
  929. "tcpbridge (tcpbridge) - Bridge network traffic across two interfaces\n\
  930. USAGE: %s [ -<flag> [<val>] | --<name>[{=| }<val>] ]...\n";
  931. tSCC zRcName[] = ".tcpbridgerc";
  932. tSCC* apzHomeList[] = {
  933. "$$/",
  934. NULL };
  935. #define zBugsAddr NULL
  936. tSCC zExplain[] = "\n\
  937. tcpbridge is a tool for selectively briding network traffic across two interfaces\n\
  938. and optionally modifying the packets in betweeen\n";
  939. tSCC zDetail[] = "\n\
  940. The basic operation of tcpbridge is to be a network bridge between two\n\
  941. subnets. All packets received on one interface are sent via the other.\n\n\
  942. Optionally, packets can be edited in a variety of ways according to your needs.\n\n\
  943. For more details, please see the Tcpreplay Manual at:\n\
  944. http://tcpreplay.synfin.net/wiki/manual\n";
  945. #define zFullVersion NULL
  946. /* extracted from /opt/local/share/autogen/optcode.tpl near line 378 */
  947. #if defined(ENABLE_NLS)
  948. # define OPTPROC_BASE OPTPROC_TRANSLATE
  949. static tOptionXlateProc translate_option_strings;
  950. #else
  951. # define OPTPROC_BASE OPTPROC_NONE
  952. # define translate_option_strings NULL
  953. #endif /* ENABLE_NLS */
  954. tOptions tcpbridgeOptions = {
  955. OPTIONS_STRUCT_VERSION,
  956. 0, NULL, /* original argc + argv */
  957. ( OPTPROC_BASE
  958. + OPTPROC_ERRSTOP
  959. + OPTPROC_SHORTOPT
  960. + OPTPROC_LONGOPT
  961. + OPTPROC_NO_REQ_OPT
  962. + OPTPROC_NO_ARGS
  963. + OPTPROC_GNUUSAGE
  964. + OPTPROC_HAS_IMMED ),
  965. 0, NULL, /* current option index, current option */
  966. NULL, NULL, zPROGNAME,
  967. zRcName, zCopyright, zCopyrightNotice,
  968. zFullVersion, apzHomeList, zUsageTitle,
  969. zExplain, zDetail, optDesc,
  970. zBugsAddr, /* address to send bugs to */
  971. NULL, NULL, /* extensions/saved state */
  972. optionUsage, /* usage procedure */
  973. translate_option_strings, /* translation procedure */
  974. /*
  975. * Indexes to special options
  976. */
  977. { INDEX_OPT_MORE_HELP,
  978. INDEX_OPT_SAVE_OPTS,
  979. NO_EQUIVALENT /* index of '-#' option */,
  980. 7 /* index of default opt */
  981. },
  982. OPTION_CT, 34 /* user option count */
  983. };
  984. /*
  985. * Create the static procedure(s) declared above.
  986. */
  987. static void
  988. doUsageOpt(
  989. tOptions* pOptions,
  990. tOptDesc* pOptDesc )
  991. {
  992. USAGE( EXIT_SUCCESS );
  993. }
  994. /* * * * * * *
  995. *
  996. * For the mtu option.
  997. */
  998. static void
  999. doOptMtu(
  1000. tOptions* pOptions,
  1001. tOptDesc* pOptDesc )
  1002. {
  1003. static const struct {const int rmin, rmax;} rng[ 1 ] = {
  1004. { 1, MAXPACKET } };
  1005. int val;
  1006. int ix;
  1007. char const* pzIndent = "\t\t\t\t ";
  1008. extern FILE* option_usage_fp;
  1009. if (pOptDesc == NULL) /* usage is requesting range list
  1010. option_usage_fp has already been set */
  1011. goto emit_ranges;
  1012. val = atoi( pOptDesc->optArg.argString );
  1013. for (ix = 0; ix < 1; ix++) {
  1014. if (val < rng[ix].rmin)
  1015. continue; /* ranges need not be ordered. */
  1016. if (val == rng[ix].rmin)
  1017. goto valid_return;
  1018. if (rng[ix].rmax == INT_MIN)
  1019. continue;
  1020. if (val <= rng[ix].rmax)
  1021. goto valid_return;
  1022. }
  1023. option_usage_fp = stderr;
  1024. fprintf(stderr, _("%s error: %s option value ``%s''is out of range.\n"),
  1025. pOptions->pzProgName, pOptDesc->pz_Name, pOptDesc->optArg.argString);
  1026. pzIndent = "\t";
  1027. emit_ranges:
  1028. fprintf( option_usage_fp, _("%sit must lie in the range: %d to %d\n"),
  1029. pzIndent, rng[0].rmin, rng[0].rmax );
  1030. if (pOptDesc == NULL)
  1031. return;
  1032. USAGE( EXIT_FAILURE );
  1033. /* NOTREACHED */
  1034. return;
  1035. valid_return:
  1036. pOptDesc->optArg.argInt = val;
  1037. }
  1038. /* * * * * * *
  1039. *
  1040. * For the enet-vlan-tag option.
  1041. */
  1042. static void
  1043. doOptEnet_Vlan_Tag(
  1044. tOptions* pOptions,
  1045. tOptDesc* pOptDesc )
  1046. {
  1047. static const struct {const int rmin, rmax;} rng[ 1 ] = {
  1048. { 0, 4095 } };
  1049. int val;
  1050. int ix;
  1051. char const* pzIndent = "\t\t\t\t ";
  1052. extern FILE* option_usage_fp;
  1053. if (pOptDesc == NULL) /* usage is requesting range list
  1054. option_usage_fp has already been set */
  1055. goto emit_ranges;
  1056. val = atoi( pOptDesc->optArg.argString );
  1057. for (ix = 0; ix < 1; ix++) {
  1058. if (val < rng[ix].rmin)
  1059. continue; /* ranges need not be ordered. */
  1060. if (val == rng[ix].rmin)
  1061. goto valid_return;
  1062. if (rng[ix].rmax == INT_MIN)
  1063. continue;
  1064. if (val <= rng[ix].rmax)
  1065. goto valid_return;
  1066. }
  1067. option_usage_fp = stderr;
  1068. fprintf(stderr, _("%s error: %s option value ``%s''is out of range.\n"),
  1069. pOptions->pzProgName, pOptDesc->pz_Name, pOptDesc->optArg.argString);
  1070. pzIndent = "\t";
  1071. emit_ranges:
  1072. fprintf( option_usage_fp, _("%sit must lie in the range: %d to %d\n"),
  1073. pzIndent, rng[0].rmin, rng[0].rmax );
  1074. if (pOptDesc == NULL)
  1075. return;
  1076. USAGE( EXIT_FAILURE );
  1077. /* NOTREACHED */
  1078. return;
  1079. valid_return:
  1080. pOptDesc->optArg.argInt = val;
  1081. }
  1082. /* * * * * * *
  1083. *
  1084. * For the enet-vlan-cfi option.
  1085. */
  1086. static void
  1087. doOptEnet_Vlan_Cfi(
  1088. tOptions* pOptions,
  1089. tOptDesc* pOptDesc )
  1090. {
  1091. static const struct {const int rmin, rmax;} rng[ 1 ] = {
  1092. { 0, 1 } };
  1093. int val;
  1094. int ix;
  1095. char const* pzIndent = "\t\t\t\t ";
  1096. extern FILE* option_usage_fp;
  1097. if (pOptDesc == NULL) /* usage is requesting range list
  1098. option_usage_fp has already been set */
  1099. goto emit_ranges;
  1100. val = atoi( pOptDesc->optArg.argString );
  1101. for (ix = 0; ix < 1; ix++) {
  1102. if (val < rng[ix].rmin)
  1103. continue; /* ranges need not be ordered. */
  1104. if (val == rng[ix].rmin)
  1105. goto valid_return;
  1106. if (rng[ix].rmax == INT_MIN)
  1107. continue;
  1108. if (val <= rng[ix].rmax)
  1109. goto valid_return;
  1110. }
  1111. option_usage_fp = stderr;
  1112. fprintf(stderr, _("%s error: %s option value ``%s''is out of range.\n"),
  1113. pOptions->pzProgName, pOptDesc->pz_Name, pOptDesc->optArg.argString);
  1114. pzIndent = "\t";
  1115. emit_ranges:
  1116. fprintf( option_usage_fp, _("%sit must lie in the range: %d to %d\n"),
  1117. pzIndent, rng[0].rmin, rng[0].rmax );
  1118. if (pOptDesc == NULL)
  1119. return;
  1120. USAGE( EXIT_FAILURE );
  1121. /* NOTREACHED */
  1122. return;
  1123. valid_return:
  1124. pOptDesc->optArg.argInt = val;
  1125. }
  1126. /* * * * * * *
  1127. *
  1128. * For the enet-vlan-pri option.
  1129. */
  1130. static void
  1131. doOptEnet_Vlan_Pri(
  1132. tOptions* pOptions,
  1133. tOptDesc* pOptDesc )
  1134. {
  1135. static const struct {const int rmin, rmax;} rng[ 1 ] = {
  1136. { 0, 7 } };
  1137. int val;
  1138. int ix;
  1139. char const* pzIndent = "\t\t\t\t ";
  1140. extern FILE* option_usage_fp;
  1141. if (pOptDesc == NULL) /* usage is requesting range list
  1142. option_usage_fp has already been set */
  1143. goto emit_ranges;
  1144. val = atoi( pOptDesc->optArg.argString );
  1145. for (ix = 0; ix < 1; ix++) {
  1146. if (val < rng[ix].rmin)
  1147. continue; /* ranges need not be ordered. */
  1148. if (val == rng[ix].rmin)
  1149. goto valid_return;
  1150. if (rng[ix].rmax == INT_MIN)
  1151. continue;
  1152. if (val <= rng[ix].rmax)
  1153. goto valid_return;
  1154. }
  1155. option_usage_fp = stderr;
  1156. fprintf(stderr, _("%s error: %s option value ``%s''is out of range.\n"),
  1157. pOptions->pzProgName, pOptDesc->pz_Name, pOptDesc->optArg.argString);
  1158. pzIndent = "\t";
  1159. emit_ranges:
  1160. fprintf( option_usage_fp, _("%sit must lie in the range: %d to %d\n"),
  1161. pzIndent, rng[0].rmin, rng[0].rmax );
  1162. if (pOptDesc == NULL)
  1163. return;
  1164. USAGE( EXIT_FAILURE );
  1165. /* NOTREACHED */
  1166. return;
  1167. valid_return:
  1168. pOptDesc->optArg.argInt = val;
  1169. }
  1170. /* * * * * * *
  1171. *
  1172. * For the dbug option, when DEBUG is #define-d.
  1173. */
  1174. #ifdef DEBUG
  1175. static void
  1176. doOptDbug(
  1177. tOptions* pOptions,
  1178. tOptDesc* pOptDesc )
  1179. {
  1180. static const struct {const int rmin, rmax;} rng[ 1 ] = {
  1181. { 0, 5 } };
  1182. int val;
  1183. int ix;
  1184. char const* pzIndent = "\t\t\t\t ";
  1185. extern FILE* option_usage_fp;
  1186. if (pOptDesc == NULL) /* usage is requesting range list
  1187. option_usage_fp has already been set */
  1188. goto emit_ranges;
  1189. val = atoi( pOptDesc->optArg.argString );
  1190. for (ix = 0; ix < 1; ix++) {
  1191. if (val < rng[ix].rmin)
  1192. continue; /* ranges need not be ordered. */
  1193. if (val == rng[ix].rmin)
  1194. goto valid_return;
  1195. if (rng[ix].rmax == INT_MIN)
  1196. continue;
  1197. if (val <= rng[ix].rmax)
  1198. goto valid_return;
  1199. }
  1200. option_usage_fp = stderr;
  1201. fprintf(stderr, _("%s error: %s option value ``%s''is out of range.\n"),
  1202. pOptions->pzProgName, pOptDesc->pz_Name, pOptDesc->optArg.argString);
  1203. pzIndent = "\t";
  1204. emit_ranges:
  1205. fprintf( option_usage_fp, _("%sit must lie in the range: %d to %d\n"),
  1206. pzIndent, rng[0].rmin, rng[0].rmax );
  1207. if (pOptDesc == NULL)
  1208. return;
  1209. USAGE( EXIT_FAILURE );
  1210. /* NOTREACHED */
  1211. return;
  1212. valid_return:
  1213. pOptDesc->optArg.argInt = val;
  1214. }
  1215. #endif /* defined DEBUG */
  1216. /* * * * * * *
  1217. *
  1218. * For the limit option.
  1219. */
  1220. static void
  1221. doOptLimit(
  1222. tOptions* pOptions,
  1223. tOptDesc* pOptDesc )
  1224. {
  1225. static const struct {const int rmin, rmax;} rng[ 1 ] = {
  1226. { 1, INT_MAX } };
  1227. int val;
  1228. int ix;
  1229. char const* pzIndent = "\t\t\t\t ";
  1230. extern FILE* option_usage_fp;
  1231. if (pOptDesc == NULL) /* usage is requesting range list
  1232. option_usage_fp has already been set */
  1233. goto emit_ranges;
  1234. val = atoi( pOptDesc->optArg.argString );
  1235. for (ix = 0; ix < 1; ix++) {
  1236. if (val < rng[ix].rmin)
  1237. continue; /* ranges need not be ordered. */
  1238. if (val == rng[ix].rmin)
  1239. goto valid_return;
  1240. if (rng[ix].rmax == INT_MIN)
  1241. continue;
  1242. if (val <= rng[ix].rmax)
  1243. goto valid_return;
  1244. }
  1245. option_usage_fp = stderr;
  1246. fprintf(stderr, _("%s error: %s option value ``%s''is out of range.\n"),
  1247. pOptions->pzProgName, pOptDesc->pz_Name, pOptDesc->optArg.argString);
  1248. pzIndent = "\t";
  1249. emit_ranges:
  1250. fprintf( option_usage_fp, _("%sit must lie in the range: %d to %d\n"),
  1251. pzIndent, rng[0].rmin, rng[0].rmax );
  1252. if (pOptDesc == NULL)
  1253. return;
  1254. USAGE( EXIT_FAILURE );
  1255. /* NOTREACHED */
  1256. return;
  1257. valid_return:
  1258. pOptDesc->optArg.argInt = val;
  1259. }
  1260. /* * * * * * *
  1261. *
  1262. * For the include option.
  1263. */
  1264. static void
  1265. doOptInclude(
  1266. tOptions* pOptions,
  1267. tOptDesc* pOptDesc )
  1268. {
  1269. /* extracted from tcpbridge_opts.def, line 169 */
  1270. char *include;
  1271. include = safe_strdup(OPT_ARG(INCLUDE));
  1272. options.xX.mode = xX_MODE_INCLUDE;
  1273. if ((options.xX.mode = parse_xX_str(&options.xX, include, &options.bpf)) == xXError)
  1274. errx(1, "Unable to parse include/exclude rule: %s", OPT_ARG(INCLUDE));
  1275. free(include);
  1276. }
  1277. /* * * * * * *
  1278. *
  1279. * For the exclude option.
  1280. */
  1281. static void
  1282. doOptExclude(
  1283. tOptions* pOptions,
  1284. tOptDesc* pOptDesc )
  1285. {
  1286. /* extracted from tcpbridge_opts.def, line 216 */
  1287. char *exclude;
  1288. exclude = safe_strdup(OPT_ARG(EXCLUDE));
  1289. options.xX.mode = xX_MODE_EXCLUDE;
  1290. if ((options.xX.mode = parse_xX_str(&options.xX, exclude, &options.bpf)) == xXError)
  1291. errx(1, "Unable to parse include/exclude rule: %s", OPT_ARG(EXCLUDE));
  1292. free(exclude);
  1293. }
  1294. /* * * * * * *
  1295. *
  1296. * For the pid option.
  1297. */
  1298. static void
  1299. doOptPid(
  1300. tOptions* pOptions,
  1301. tOptDesc* pOptDesc )
  1302. {
  1303. /* extracted from tcpbridge_opts.def, line 258 */
  1304. fprintf(stderr, "PID: %hu\n", getpid());
  1305. }
  1306. /* * * * * * *
  1307. *
  1308. * For the version option.
  1309. */
  1310. static void
  1311. doOptVersion(
  1312. tOptions* pOptions,
  1313. tOptDesc* pOptDesc )
  1314. {
  1315. /* extracted from tcpbridge_opts.def, line 303 */
  1316. fprintf(stderr, "tcpbridge version: %s (build %s)", VERSION, svn_version());
  1317. #ifdef DEBUG
  1318. fprintf(stderr, " (debug)");
  1319. #endif
  1320. fprintf(stderr, "\n");
  1321. fprintf(stderr, "Copyright 2001-2007 by Aaron Turner <aturner at synfin dot net>\n");
  1322. #ifdef HAVE_LIBNET
  1323. fprintf(stderr, "Compiled against libnet: %s\n", LIBNET_VERSION);
  1324. #else
  1325. fprintf(stderr, "Not compiled with libnet.\n");
  1326. #endif
  1327. #ifdef HAVE_WINPCAP
  1328. fprintf(stderr, "Compiled against winpcap: %s\n", get_pcap_version());
  1329. #else
  1330. fprintf(stderr, "Compiled against libpcap: %s\n", get_pcap_version());
  1331. #endif
  1332. #ifdef ENABLE_64BITS
  1333. fprintf(stderr, "64 bit packet counters: enabled\n");
  1334. #else
  1335. fprintf(stderr, "64 bit packet counters: disabled\n");
  1336. #endif
  1337. #ifdef ENABLE_VERBOSE
  1338. fprintf(stderr, "Verbose printing via tcpdump: enabled\n");
  1339. #else
  1340. fprintf(stderr, "Verbose printing via tcpdump: disabled\n");
  1341. #endif
  1342. exit(0);
  1343. }
  1344. /* * * * * * *
  1345. *
  1346. * For the less-help option.
  1347. */
  1348. static void
  1349. doOptLess_Help(
  1350. tOptions* pOptions,
  1351. tOptDesc* pOptDesc )
  1352. {
  1353. /* extracted from tcpbridge_opts.def, line 342 */
  1354. USAGE(EXIT_FAILURE);
  1355. }
  1356. /* extracted from /opt/local/share/autogen/optcode.tpl near line 475 */
  1357. #if ENABLE_NLS
  1358. #include <stdio.h>
  1359. #include <stdlib.h>
  1360. #include <string.h>
  1361. #include <unistd.h>
  1362. #include <autoopts/usage-txt.h>
  1363. static char* AO_gettext( char const* pz );
  1364. static void coerce_it(void** s);
  1365. static char*
  1366. AO_gettext( char const* pz )
  1367. {
  1368. char* pzRes;
  1369. if (pz == NULL)
  1370. return NULL;
  1371. pzRes = _(pz);
  1372. if (pzRes == pz)
  1373. return pzRes;
  1374. pzRes = strdup( pzRes );
  1375. if (pzRes == NULL) {
  1376. fputs( _("No memory for duping translated strings\n"), stderr );
  1377. exit( EXIT_FAILURE );
  1378. }
  1379. return pzRes;
  1380. }
  1381. static void coerce_it(void** s) { *s = AO_gettext(*s); }
  1382. #define COERSION(_f) \
  1383. coerce_it((void*)&(tcpbridgeOptions._f))
  1384. /*
  1385. * This invokes the translation code (e.g. gettext(3)).
  1386. */
  1387. static void
  1388. translate_option_strings( void )
  1389. {
  1390. /*
  1391. * Guard against re-translation. It won't work. The strings will have
  1392. * been changed by the first pass through this code. One shot only.
  1393. */
  1394. if (option_usage_text.field_ct == 0)
  1395. return;
  1396. /*
  1397. * Do the translations. The first pointer follows the field count field.
  1398. * The field count field is the size of a pointer.
  1399. */
  1400. {
  1401. char** ppz = (char**)(void*)&(option_usage_text);
  1402. int ix = option_usage_text.field_ct;
  1403. do {
  1404. ppz++;
  1405. *ppz = AO_gettext(*ppz);
  1406. } while (--ix > 0);
  1407. }
  1408. option_usage_text.field_ct = 0;
  1409. {
  1410. tOptDesc* pOD = tcpbridgeOptions.pOptDesc;
  1411. int ix = tcpbridgeOptions.optCt;
  1412. for (;;) {
  1413. pOD->pzText = AO_gettext(pOD->pzText);
  1414. pOD->pz_NAME = AO_gettext(pOD->pz_NAME);
  1415. pOD->pz_Name = AO_gettext(pOD->pz_Name);
  1416. pOD->pz_DisableName = AO_gettext(pOD->pz_DisableName);
  1417. pOD->pz_DisablePfx = AO_gettext(pOD->pz_DisablePfx);
  1418. if (--ix <= 0)
  1419. break;
  1420. pOD++;
  1421. }
  1422. }
  1423. COERSION(pzCopyright);
  1424. COERSION(pzCopyNotice);
  1425. COERSION(pzFullVersion);
  1426. COERSION(pzUsageTitle);
  1427. COERSION(pzExplain);
  1428. COERSION(pzDetail);
  1429. }
  1430. #endif /* ENABLE_NLS */
  1431. #ifdef __cplusplus
  1432. }
  1433. #endif
  1434. /* tcpbridge_opts.c ends here */