168 lines
5.1 KiB
C
168 lines
5.1 KiB
C
/****************************************************************
|
|
* *
|
|
* Copyright 2001, 2010 Fidelity Information Services Inc *
|
|
* *
|
|
* This source code contains the intellectual property *
|
|
* of its copyright holder(s), and is made available *
|
|
* under a license. If you do not know the terms of *
|
|
* the license, please stop and do not read further. *
|
|
* *
|
|
****************************************************************/
|
|
|
|
/*
|
|
* gtcm_prsopt.c ---
|
|
*
|
|
* This routine parses up the GTCM server's command line and
|
|
* sets various global flags accordingly.
|
|
*
|
|
*/
|
|
|
|
#include "mdef.h"
|
|
|
|
#include "gtm_string.h"
|
|
|
|
|
|
#include "gtm_stdlib.h" /* for exit() */
|
|
#include "gtm_stdio.h"
|
|
#ifdef __MVS__
|
|
#include "eintr_wrappers.h"
|
|
#include "gtm_stat.h"
|
|
#include "gtm_zos_io.h"
|
|
#endif
|
|
#include "gtcm.h"
|
|
|
|
#ifndef lint
|
|
static char rcsid[] = "$Header:$";
|
|
#endif
|
|
|
|
GBLREF FILE *omi_debug;
|
|
GBLREF int omi_pkdbg;
|
|
GBLREF char *omi_pklog;
|
|
GBLREF char *omi_service;
|
|
GBLREF int rc_server_id;
|
|
GBLREF char *omi_pklog_addr;
|
|
GBLREF int one_conn_per_inaddr;
|
|
GBLREF int authenticate;
|
|
GBLREF int ping_keepalive;
|
|
GBLREF int conn_timeout;
|
|
GBLREF int history;
|
|
GBLDEF int per_conn_servtime = MIN_TIMEOUT_INTERVAL;
|
|
|
|
enum opt_enum
|
|
{
|
|
opt_null, opt_debug, opt_pktlog, opt_service, opt_rc_id,
|
|
opt_pktlog_addr, opt_authenticate, opt_multipleconn,
|
|
opt_ping, opt_conn_timeout, opt_history, opt_servtime
|
|
};
|
|
|
|
static struct
|
|
{
|
|
char *name;
|
|
enum opt_enum option;
|
|
int args;
|
|
} optlist[] =
|
|
{
|
|
"-D", opt_debug, 1, /* debugging output */
|
|
"-log", opt_debug, 1,
|
|
"-P", opt_pktlog, 1, /* packet log file template */
|
|
"-pktlog", opt_pktlog, 1,
|
|
"-S", opt_service, 1, /* service name in /etc/services */
|
|
"-service", opt_service, 1,
|
|
"-I", opt_rc_id, 1, /* RC server ID */
|
|
"-id", opt_rc_id, 1,
|
|
"-A", opt_pktlog_addr, 1, /* IP address of DT agent to log */
|
|
"-logaddr", opt_pktlog_addr, 1,
|
|
"-auth", opt_authenticate, 0, /* authenticate connections */
|
|
"-multiple", opt_multipleconn, 0, /* allow multiple conn from same IP address */
|
|
"-ping", opt_ping, 0, /* ping connections to keepalive */
|
|
"-timeout", opt_conn_timeout, 1,
|
|
"-servtime", opt_servtime, 1, /* Used for setup the timer for servicing each connection, default 60 sec */
|
|
"-hist", opt_history, 0, /* flag: keep packet history in mem */
|
|
NULL, opt_null, 0
|
|
};
|
|
|
|
/* On OSF/1 (Digital Unix), pointers are 64 bits wide; the only exception to this is C programs for which one may
|
|
* specify compiler and link editor options in order to use (and allocate) 32-bit pointers. However, since C is
|
|
* the only exception and, in particular because the operating system does not support such an exception, the argv
|
|
* array passed to the main program is an array of 64-bit pointers. Thus the C program needs to declare argv[]
|
|
* as an array of 64-bit pointers and needs to do the same for any pointer it sets to an element of argv[].
|
|
*/
|
|
int gtcm_prsopt(int argc, char_ptr_t argv[])
|
|
{
|
|
enum opt_enum opt;
|
|
int i,j, t;
|
|
boolean_t inv_option = FALSE;
|
|
|
|
for (i = 1, argv++; i < argc; argv += optlist[j].args + 1, i += optlist[j].args + 1)
|
|
{
|
|
for(j = 0; opt = optlist[j].option; j++)
|
|
if (!strcmp(*argv,optlist[j].name))
|
|
break;
|
|
if (i + optlist[j].args >= argc)
|
|
{
|
|
FPRINTF(stderr, "%s option requires an argument - ignored\n", *argv);
|
|
continue;
|
|
}
|
|
switch(opt)
|
|
{
|
|
case opt_debug:
|
|
if ((*(argv + 1))[0] == '-' && (*(argv + 1))[1] == '\0')
|
|
omi_debug = stdout;
|
|
else if ((*(argv + 1))[0] == '=' && (*(argv + 1))[1] == '\0')
|
|
omi_debug = stderr;
|
|
else
|
|
{
|
|
#ifdef __MVS__
|
|
if (-1 == gtm_zos_create_tagged_file(*(argv + 1), TAG_EBCDIC))
|
|
perror("error tagging log file");
|
|
#endif
|
|
if (!(omi_debug = fopen(*(argv + 1), "w+")))
|
|
{
|
|
perror("error opening log file");
|
|
exit(1);
|
|
}
|
|
}
|
|
break;
|
|
case opt_pktlog: omi_pklog = *(argv + 1); break;
|
|
case opt_service: omi_service = *(argv + 1); break;
|
|
case opt_rc_id: rc_server_id = atoi(*(argv + 1)); break;
|
|
case opt_pktlog_addr: omi_pklog_addr = *(argv + 1); break;
|
|
case opt_authenticate: authenticate = 1; break;
|
|
case opt_multipleconn:
|
|
one_conn_per_inaddr = 0;
|
|
break;
|
|
case opt_ping: ping_keepalive = 1; break;
|
|
case opt_null:
|
|
inv_option = TRUE;
|
|
FPRINTF(stderr,"Unknown option: %s\n",*argv);
|
|
break;
|
|
case opt_conn_timeout:
|
|
t = atoi(*(argv + 1));
|
|
if (t < MIN_TIMEOUT_INTERVAL)
|
|
FPRINTF(stderr,"-timeout parameter must be >= %d seconds. The default value %d seconds will be used\n"
|
|
, MIN_TIMEOUT_INTERVAL, TIMEOUT_INTERVAL);
|
|
else
|
|
conn_timeout = t;
|
|
break;
|
|
case opt_servtime:
|
|
t = atoi(*(argv + 1));
|
|
if (t < MIN_TIMEOUT_INTERVAL)
|
|
FPRINTF(stderr, "-servtime parameter must be >= %d seconds. The default value %d seconds will be used\n",
|
|
MIN_TIMEOUT_INTERVAL, MIN_TIMEOUT_INTERVAL);
|
|
else
|
|
per_conn_servtime = t;
|
|
break;
|
|
case opt_history:
|
|
history = 1;
|
|
break;
|
|
default:
|
|
inv_option = TRUE;
|
|
FPRINTF(stderr,"Unsupported option: %s\n",*argv);
|
|
break;
|
|
}
|
|
if (inv_option)
|
|
return -1;
|
|
}
|
|
return 0;
|
|
}
|