fis-gtm/sr_unix/iormdef.h

174 lines
6.3 KiB
C

/****************************************************************
* *
* Copyright 2001, 2013 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. *
* *
****************************************************************/
#ifndef IORMDEF_H
#define IORMDEF_H
#define DEF_RM_WIDTH 32767
#define DEF_RM_RECORDSIZE 32767
#define DEF_RM_LENGTH 66
#define CHUNK_SIZE 512
#define ONE_COMMA "1,"
#define ONE_COMMA_UNAVAILABLE "1,Resource temporarily unavailable"
#define ONE_COMMA_DEV_DET_EOF "1,Device detected EOF"
#define DEF_RM_PADCHAR ' ' /* SPACE */
/*#define DEBUG_PIPE*/
#ifdef DEBUG_PIPE
#define PIPE_DEBUG(X) X
#define DEBUGPIPEFLUSH FFLUSH(stdout)
int pid;
#else
# define PIPE_DEBUG(X)
#define DEBUGPIPEFLUSH
#endif
#ifdef UNICODE_SUPPORTED
#define SET_WIDTH_BYTES \
width_bytes = 1; \
width_chset = iod->ichset; \
switch (iod->ichset) \
{ \
case CHSET_UTF16: \
case CHSET_UTF16BE: \
case CHSET_UTF16LE: \
width_bytes = 2; \
width_chset = iod->ichset; \
} \
switch (iod->ochset) \
{ \
case CHSET_UTF16: \
case CHSET_UTF16BE: \
case CHSET_UTF16LE: \
width_bytes = 2; \
width_chset = iod->ochset; \
}
#else
#define SET_WIDTH_BYTES width_bytes = 1;
#endif
/* Operations for this device type */
#define RM_NOOP 0
#define RM_WRITE 1
#define RM_READ 2
enum pipe_which /* which module saved the interrupted info */
{
pipewhich_invalid,
pipewhich_readfl,
};
/* ***************************************************** */
/* *********** structure for RMS driver **************** */
/* ***************************************************** */
/* The Dev_param_pair structure may exist for any device parameter whose definition is a character string, */
/* but it is being added here primarily for the pipe device type. */
/* For instance, a pipe will contain a "command" device parameter like command="/usr/bin/cat" */
/* The name field will be initialized to "COMMAND=" and the definition field will be "/usr/bin/cat" */
/* These will be output when the type is fifo. Other device types may be modified as desired */
typedef struct dev_param_pair{
char *name;
char *definition;
} Dev_param_pair;
typedef struct dev_pairs {
int num_pairs;
Dev_param_pair pairs[3];
} Dev_param_pairs;
typedef struct pipe_interrupt_type
{
ABS_TIME end_time;
enum pipe_which who_saved;
int max_bufflen;
int bytes_read;
int bytes2read;
int char_count;
int bytes_count;
int add_bytes;
boolean_t end_time_valid;
struct d_rm_struct *newpipe;
} pipe_interrupt;
typedef struct
{
boolean_t fixed; /* Fixed format file */
boolean_t noread;
boolean_t write_only; /* WRITEONLY specified */
boolean_t stream;
boolean_t fifo;
boolean_t pipe; /* True if pipe device */
boolean_t independent; /* True if pipe process to live after pipe is closed */
boolean_t parse; /* True if pipe command is to be parsed */
boolean_t done_1st_read; /* If UTF16, we need to know if this is the first read or not to check for BOM */
boolean_t done_1st_write; /* If UTF16, we need to know if this is the first write or not to check for BOM */
boolean_t crlast; /* If not M, the last character seen was a CR so if LF is next, ignore it */
boolean_t def_width; /* WIDTH has not been changed */
boolean_t def_recsize; /* RECORDSIZE has not been changed */
boolean_t bom_read_one_done; /* If pipe/fifo and UTF8, read one byte to check for bom if not set */
boolean_t follow; /* True if disk read with follow - similar to tail -f on a file */
pipe_interrupt pipe_save_state; /* Saved state of interrupted IO */
boolean_t mupintr; /* We were mupip interrupted */
unsigned int lastop; /* Last operation done on file */
int fildes; /* File descriptor */
int read_fildes; /* Read file descriptor if it's a pipe and stdout is returned */
FILE *read_filstr; /* Read FILE pointer if it's a pipe and stdout is returned */
struct io_desc_struct *stderr_child; /* pointer to io descriptor for pipe stderr device */
struct io_desc_struct *stderr_parent; /* pointer to io descriptor for pipe which opened stderr device */
pid_t pipe_pid; /* child process id for reaping on close */
Dev_param_pairs dev_param_pairs;
int bufsize; /* Size of inbuf */
int outbufsize; /* Size of outbuf */
int4 recordsize; /* Size of record in bytes */
int4 padchar; /* Character to use for padding */
int out_bytes; /* Number of bytes output for this fixed record */
uint4 bom_buf_cnt; /* Count of bytes in BOM buffer */
uint4 bom_buf_off; /* Next available byte in BOM buffer */
unsigned char bom_buf[4]; /* Buffer area for BOM assembly */
unsigned char *inbuf; /* Input buffer area */
unsigned char *inbuf_pos; /* Put next char in inbuf here */
unsigned char *inbuf_off; /* Next char to take from inbuf */
unsigned char *inbuf_top; /* Last char (+1) in inbuf */
unsigned char *outbuf; /* Output buffer area */
FILE *filstr;
uint4 file_pos;
long pipe_buff_size;
char utf_tmp_buffer[CHUNK_SIZE]; /* Buffer to store CHUNK bytes */
int utf_tot_bytes_in_buffer; /* Number of bytes read from device, it refers utf_tmp_buffer buffer */
int utf_start_pos; /* Current position in utf_tmp_buffer */
}d_rm_struct; /* rms */
#ifdef KEEP_zOS_EBCDIC
#define NATIVE_NL 0x15 /* EBCDIC */
#else
#define NATIVE_NL '\n' /* ASCII */
#endif
int gtm_utf_bomcheck(io_desc *iod, gtm_chset_t *chset, unsigned char *buffer, int len);
int iorm_get_bom(io_desc *io_ptr, int *blocked_in, boolean_t ispipe, int flags, int4 *tot_bytes_read,
TID timer_id, int4 *msec_timeout, boolean_t colon_zero);
int iorm_get_bom_fol(io_desc *io_ptr, int4 *tot_bytes_read, int4 *msec_timeout, boolean_t timed, boolean_t *bom_timeout);
int iorm_get_fol(io_desc *io_ptr, int4 *tot_bytes_read, int4 *msec_timeout, boolean_t timed, boolean_t zint_restart,
boolean_t *follow_timeout);
int iorm_get(io_desc *io_ptr, int *blocked_in, boolean_t ispipe, int flags, int4 *tot_bytes_read,
TID timer_id, int4 *msec_timeout, boolean_t colon_zero, boolean_t zint_restart);
int iorm_write_utf_ascii(io_desc *iod, char *string, int len);
void iorm_write_utf(mstr *v);
void iorm_readfl_badchar(mval *vmvalptr, int datalen, int delimlen, unsigned char *delimptr, unsigned char *strend);
#endif