155 lines
4.8 KiB
C
155 lines
4.8 KiB
C
/****************************************************************
|
|
* *
|
|
* Copyright 2001, 2011 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_play.c ---
|
|
*
|
|
* Main routine for the GTCM packet log replayer.
|
|
*
|
|
*/
|
|
|
|
#include "mdef.h"
|
|
|
|
#include "gtm_stdio.h"
|
|
#include "gtm_stdlib.h" /* for exit() */
|
|
#include "gtm_time.h" /* for time() */
|
|
#include "gt_timer.h" /* for set_blocksig() */
|
|
#include "gtm_fcntl.h"
|
|
#include "gtm_string.h" /* for strerror() */
|
|
|
|
#include <sys/types.h>
|
|
#include <signal.h>
|
|
#include <errno.h>
|
|
|
|
#include "gtcm.h"
|
|
#include "error.h"
|
|
#include "gtm_env_init.h" /* for gtm_env_init() prototype */
|
|
#include "gtm_threadgbl_init.h"
|
|
|
|
#ifndef lint
|
|
static char rcsid[] = "$Header:$";
|
|
#endif
|
|
|
|
GBLDEF short gtcm_ast_avail;
|
|
GBLDEF int4 gtcm_exi_condition;
|
|
|
|
GBLDEF char *omi_service = (char *)0;
|
|
GBLDEF FILE *omi_debug = (FILE *)0;
|
|
GBLDEF char *omi_pklog = (char *)0;
|
|
GBLDEF char *omi_pklog_addr = (char *)0;
|
|
GBLDEF int omi_pkdbg = 0;
|
|
GBLDEF omi_conn_ll *omi_conns = (omi_conn_ll *)0;
|
|
GBLDEF int omi_exitp = 0;
|
|
GBLDEF int omi_pid = 0;
|
|
GBLDEF int4 omi_errno = 0;
|
|
GBLDEF int4 omi_nxact = 0;
|
|
GBLDEF int4 omi_nxact2 = 0;
|
|
GBLDEF int4 omi_nerrs = 0;
|
|
GBLDEF int4 omi_brecv = 0;
|
|
GBLDEF int4 omi_bsent = 0;
|
|
GBLDEF int4 gtcm_stime = 0; /* start time for GT.CM */
|
|
GBLDEF int4 gtcm_ltime = 0; /* last time stats were gathered */
|
|
GBLDEF int one_conn_per_inaddr = 0;
|
|
GBLDEF int authenticate = 0; /* authenticate OMI connections */
|
|
GBLDEF int psock = -1; /* pinging socket */
|
|
GBLDEF int ping_keepalive = 0; /* check connections using ping */
|
|
GBLDEF int conn_timeout = TIMEOUT_INTERVAL;
|
|
GBLDEF int history = 0;
|
|
|
|
#ifdef GTCM_RC
|
|
GBLREF int rc_nxact;
|
|
GBLREF int rc_nerrs;
|
|
#endif /* defined(GTCM_RC) */
|
|
|
|
/* 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 main(int argc, char_ptr_t argv[])
|
|
{
|
|
omi_conn *cptr, conn;
|
|
int i;
|
|
char buff[OMI_BUFSIZ];
|
|
DCL_THREADGBL_ACCESS;
|
|
|
|
GTM_THREADGBL_INIT;
|
|
set_blocksig();
|
|
gtm_env_init(); /* read in all environment variables before calling any function particularly malloc (from err_init below)*/
|
|
/* Open the packet log file for playback */
|
|
if (argc == 1)
|
|
conn.fd = fileno(stdin);
|
|
else if (argc == 2) {
|
|
if (INV_FD_P((conn.fd = open(argv[argc - 1], O_RDONLY))))
|
|
{
|
|
PRINTF("%s: open(\"%s\"): %s\n", argv[0], argv[argc - 1],
|
|
STRERROR(errno));
|
|
exit(-1);
|
|
}
|
|
}
|
|
else {
|
|
PRINTF("%s: bad command line arguments\n\t%s [ filename ]\n",
|
|
argv[0], argv[0]);
|
|
exit(-1);
|
|
}
|
|
|
|
/* Initialize everything but the network */
|
|
err_init(gtcm_exit_ch);
|
|
omi_errno = OMI_ER_NO_ERROR;
|
|
ESTABLISH_RET(omi_dbms_ch, -1); /* any return value to signify error return */
|
|
gtcm_init(argc, argv);
|
|
#ifdef GTCM_RC
|
|
rc_create_cpt();
|
|
#endif
|
|
REVERT;
|
|
if (omi_errno != OMI_ER_NO_ERROR)
|
|
exit(omi_errno);
|
|
/* Initialize the connection structure */
|
|
conn.next = (omi_conn *)0;
|
|
conn.bsiz = OMI_BUFSIZ;
|
|
conn.bptr = conn.buff = buff;
|
|
conn.xptr = (char *)0;
|
|
conn.blen = 0;
|
|
conn.exts = 0;
|
|
conn.state = OMI_ST_DISC;
|
|
conn.ga = (ga_struct *)0; /* struct gd_addr_struct */
|
|
conn.of = (oof_struct *)0; /* struct rc_oflow */
|
|
conn.pklog = FD_INVALID;
|
|
/* Initialize the statistics */
|
|
conn.stats.bytes_recv = 0;
|
|
conn.stats.bytes_send = 0;
|
|
conn.stats.start = time((time_t *)0);
|
|
for (i = 0; i < OMI_OP_MAX; i++)
|
|
conn.stats.xact[i] = 0;
|
|
for (i = 0; i < OMI_ER_MAX; i++)
|
|
conn.stats.errs[i] = 0;
|
|
|
|
for (;;)
|
|
if (omi_srvc_xact(&conn) < 0)
|
|
break;
|
|
|
|
PRINTF("%ld seconds connect time\n", time((time_t)0) - conn.stats.start);
|
|
PRINTF("%d OMI transactions\n", omi_nxact);
|
|
PRINTF("%d OMI errors\n", omi_nerrs);
|
|
#ifdef GTCM_RC
|
|
PRINTF("%d RC transactions\n", rc_nxact);
|
|
PRINTF("%d RC errors\n", rc_nerrs);
|
|
#endif /* defined(GTCM_RC) */
|
|
PRINTF("%d bytes recv'd\n", conn.stats.bytes_recv);
|
|
PRINTF("%d bytes sent\n", conn.stats.bytes_send);
|
|
|
|
gtcm_exit();
|
|
|
|
return 0;
|
|
|
|
}
|