fis-gtm/sr_unix_cm/gtcm_pkdisp.c

188 lines
4.9 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. *
* *
****************************************************************/
#include "mdef.h"
#include "gtm_string.h"
#undef UNIX /* Cause non-GTM-runtime routines to be used since this is a standalone module */
#include "gtm_stdio.h"
#define UNIX
#include "gtm_stdlib.h" /* for exit() */
/* The use of "open" below involves pulling in gtm_open() (from gtm_fd_trace.c) which in turn pulls in caller_id and the works.
* To avoid all those from bloating this library, we skip the file-descriptor trace in this module.
*/
#undef GTM_FD_TRACE
#include "gtm_unistd.h" /* for read() */
#include "gtm_fcntl.h"
#include <errno.h>
#include "gtm_threadgbl_init.h"
#include "omi.h"
#ifndef lint
static char rcsid[] = "$Header:$";
#endif
GBLREF char *omi_oprlist[];
/* 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_fd fd;
char buff[OMI_BUFSIZ], *bptr, *xptr, *end, *chr;
int cc, blen, bunches, i, n, len, buf[5], j, rdmr;
omi_vi mlen, xlen;
omi_li nx;
omi_si hlen;
omi_req_hdr rh;
DCL_THREADGBL_ACCESS;
GTM_THREADGBL_INIT;
bunches = 0;
if (argc == 3)
{
if (argv[1][0] != '-' || argv[1][1] != 'b' || argv[1][2] != '\0')
{
PRINTF("%s: bad command line arguments\n\t%s [ -b ] filename\n",
argv[0], argv[0]);
exit(-1);
} else if (INV_FD_P((fd = open(argv[argc - 1], O_RDONLY))))
{
PRINTF("%s: open(\"%s\"): %s\n", argv[0], argv[argc - 1],
STRERROR(errno));
exit(-1);
}
} else if (argc == 2)
{
if (argv[1][0] == '-' && argv[1][1] == 'b' && argv[1][2] == '\0')
fd = fileno(stdin);
else if (INV_FD_P((fd = open(argv[argc - 1], O_RDONLY))))
{
PRINTF("%s: open(\"%s\"): %s\n", argv[0], argv[argc - 1],
STRERROR(errno));
exit(-1);
}
}
else if (argc == 1)
fd = fileno(stdin);
else
{
PRINTF("%s: bad command line arguments\n\t%s [ -b ] [ filename ]\n", argv[0], argv[0]);
exit(-1);
}
for (blen = 0, bptr = buff, n = 1, rdmr = 1; ; )
{
if (rdmr)
{
cc = (int)(ARRAYTOP(buff) - &bptr[blen]);
if ((cc = (int)(read(fd, &bptr[blen], cc))) < 0)
{
PRINTF("%s: read(): %s", argv[0], STRERROR(errno));
exit(-1);
} else if (cc == 0)
break;
blen += cc;
if (blen < OMI_VI_SIZ)
{
if (bptr != buff)
{
memmove(buff, bptr, blen);
bptr = buff;
}
continue;
}
}
xptr = bptr;
OMI_VI_READ(&mlen, xptr);
if (blen < mlen.value + 4)
{
if (bptr != buff)
{
memmove(buff, bptr, blen);
bptr = buff;
}
rdmr = 1;
continue;
}
rdmr = 0;
PRINTF("Message %d, %ld bytes", n, (long)mlen.value);
if (argc == 3 && bunches)
{
OMI_LI_READ(&nx, xptr);
PRINTF(", %d transactions in bunch", nx.value);
bptr += OMI_VI_SIZ + OMI_LI_SIZ;
blen -= OMI_VI_SIZ + OMI_LI_SIZ;
} else
{
nx.value = 1;
xlen = mlen;
}
puts("");
for (i = 1; i <= nx.value; i++)
{
if (argc == 3 && bunches)
{
OMI_VI_READ(&xlen, xptr);
}
end = xptr + xlen.value;
OMI_SI_READ(&hlen, xptr);
OMI_LI_READ(&rh.op_class, xptr);
OMI_SI_READ(&rh.op_type, xptr);
OMI_LI_READ(&rh.user, xptr);
OMI_LI_READ(&rh.group, xptr);
OMI_LI_READ(&rh.seq, xptr);
OMI_LI_READ(&rh.ref, xptr);
if (rh.op_class.value == 1)
{
PRINTF(" %s (%ld bytes)", (omi_oprlist[rh.op_type.value])
? omi_oprlist[rh.op_type.value] : "unknown",(long)xlen.value);
if (argc == 3 && bunches)
PRINTF(", transaction #%d in bunch", i);
puts("");
} else
PRINTF(" (%ld bytes)\n", (long)xlen.value);
chr = (char *)buf;
while (xptr < end)
{
fputc('\t', stdout);
if ((len = (int)(end - xptr)) > 20)
len = 20;
memcpy(chr, xptr, len);
xptr += len;
for (j = len; j < 20; j++)
chr[j] = '\0';
for (j = 0; j < 5; j++)
PRINTF("%08x ", buf[j]);
for (j = 0; j < 20; j++)
{
if (j >= len)
chr[j] = ' ';
else if (chr[j] < 32 || chr[j] > 126)
chr[j] = '.';
}
PRINTF("%20s\n", chr);
}
bptr += xlen.value + 4;
blen -= xlen.value + 4;
}
if (argc == 3)
bunches = 1;
n++;
}
return 0;
}