356 lines
10 KiB
C
356 lines
10 KiB
C
/****************************************************************
|
|
* *
|
|
* Copyright 2001, 2009 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. *
|
|
* *
|
|
****************************************************************/
|
|
|
|
#define ZAREQUEST_SENT 16
|
|
#define LREQUEST_SENT 8
|
|
#define REQUEST_PENDING 4
|
|
#define REMOTE_ZALLOCATES 2
|
|
#define REMOTE_LOCKS 1
|
|
#define REMOTE_CLR_MASK (ZAREQUEST_SENT + LREQUEST_SENT + REMOTE_ZALLOCATES + REMOTE_LOCKS)
|
|
#define CM_BUFFER_OVERHEAD 20
|
|
#define CM_BLKPASS 40
|
|
|
|
#define CMM_PROTOCOL_TYPE "GCM"
|
|
|
|
#define S_PROTOCOL "VAXVMSGTM023GCM010 "
|
|
#define S_HDRSIZE 1
|
|
#define S_PROTSIZE 33
|
|
#define S_REGINSIZE 6
|
|
#define S_LAFLAGSIZE 1
|
|
#define S_SUBLISTSIZE 1
|
|
#define CM_MINBUFSIZE 512 + CM_BUFFER_OVERHEAD
|
|
|
|
#define CMLCK_REQUEUE 0
|
|
#define CM_LOCKS 0
|
|
#define CM_ZALLOCATES 0x80
|
|
#define CM_NOLKCANCEL 256
|
|
|
|
#define CM_WRITE 1
|
|
#define CM_READ 0
|
|
#define CM_NOOP 2
|
|
|
|
#define CMMS_E_ERROR 1 /* [0x01] */
|
|
#define CMMS_L_LKCANALL 2 /* [0x02] */
|
|
#define CMMS_L_LKCANCEL 3 /* [0x03] */
|
|
#define CMMS_L_LKDELETE 4 /* [0x04] */
|
|
#define CMMS_L_LKREQIMMED 5 /* [0x05] */
|
|
#define CMMS_L_LKREQNODE 6 /* [0x06] */
|
|
#define CMMS_L_LKREQUEST 7 /* [0x07] */
|
|
#define CMMS_L_LKRESUME 8 /* [0x08] */
|
|
#define CMMS_L_LKACQUIRE 9 /* [0x09] */
|
|
#define CMMS_L_LKSUSPEND 10 /* [0x0A] */
|
|
#define CMMS_M_LKABORT 11 /* [0x0B] */
|
|
#define CMMS_M_LKBLOCKED 12 /* [0x0C] */
|
|
#define CMMS_M_LKGRANTED 13 /* [0x0D] */
|
|
#define CMMS_M_LKDELETED 14 /* [0x0E] */
|
|
#define CMMS_M_LKSUSPENDED 15 /* [0x0F] */
|
|
#define CMMS_Q_DATA 16 /* [0x10] */
|
|
#define CMMS_Q_GET 17 /* [0x11] */
|
|
#define CMMS_Q_KILL 18 /* [0x12] */
|
|
#define CMMS_Q_ORDER 19 /* [0x13] */
|
|
#define CMMS_Q_PREV 20 /* [0x14] */
|
|
#define CMMS_Q_PUT 21 /* [0x15] */
|
|
#define CMMS_Q_QUERY 22 /* [0x16] */
|
|
#define CMMS_Q_ZWITHDRAW 23 /* [0x17] */
|
|
#define CMMS_R_DATA 24 /* [0x18] */
|
|
#define CMMS_R_GET 25 /* [0x19] */
|
|
#define CMMS_R_KILL 26 /* [0x1A] */
|
|
#define CMMS_R_ORDER 27 /* [0x1B] */
|
|
#define CMMS_R_PREV 28 /* [0x1C] */
|
|
#define CMMS_R_PUT 29 /* [0x1D] */
|
|
#define CMMS_R_QUERY 30 /* [0x1E] */
|
|
#define CMMS_R_ZWITHDRAW 31 /* [0x1F] */
|
|
#define CMMS_R_UNDEF 32 /* [0x20] */
|
|
#define CMMS_S_INITPROC 33 /* [0x21] */
|
|
#define CMMS_S_INITREG 34 /* [0x22] */
|
|
#define CMMS_S_TERMINATE 35 /* [0x23] */
|
|
#define CMMS_S_INTERRUPT 36 /* [0x24] */
|
|
#define CMMS_T_INITPROC 37 /* [0x25] */
|
|
#define CMMS_T_REGNUM 38 /* [0x26] */
|
|
#define CMMS_X_INQPROC 39 /* [0x27] */
|
|
#define CMMS_X_INQPRRG 40 /* [0x28] */
|
|
#define CMMS_X_INQREG 41 /* [0x29] */
|
|
#define CMMS_Y_STATPROCREC 42 /* [0x2A] */
|
|
#define CMMS_Y_STATPRRGREC 43 /* [0x2B] */
|
|
#define CMMS_Y_STATREGREC 44 /* [0x2C] */
|
|
#define CMMS_U_LKEDELETE 45 /* [0x2D] */
|
|
#define CMMS_U_LKESHOW 46 /* [0x2E] */
|
|
#define CMMS_V_LKESHOW 47 /* [0x2F] */
|
|
#define CMMS_E_TERMINATE 48 /* [0x30] */
|
|
#define CMMS_B_BUFRESIZE 49 /* [0x31] */
|
|
#define CMMS_B_BUFFLUSH 50 /* [0x32] */
|
|
#define CMMS_C_BUFRESIZE 51 /* [0x33] */
|
|
#define CMMS_C_BUFFLUSH 52 /* [0x34] */
|
|
#define CMMS_Q_INCREMENT 53 /* [0x35] */ /* Opcode for message type sent from client (to server) */
|
|
#define CMMS_R_INCREMENT 54 /* [0x36] */ /* Opcode for message type received by client (from server) */
|
|
|
|
#define CMM_QUERYGET_MIN_LEVEL "200" /* $query works as queryget only from version "V200" onwards */
|
|
#define CMM_INCREMENT_MIN_LEVEL "210" /* $INCREMENT works only from version "V210" onwards */
|
|
#define CMM_STDNULLCOLL_MIN_LEVEL "210" /* Standard null collation works only from version "V210" onwards */
|
|
#define CMM_LONGNAMES_MIN_LEVEL "210" /* long name works only from protocol "V210" onwards */
|
|
|
|
typedef struct cm_region_list_struct
|
|
{
|
|
que_ent regque;
|
|
struct cm_region_list_struct *next;
|
|
unsigned char regnum;
|
|
unsigned char oper;
|
|
unsigned short lks_this_cmd;
|
|
bool reqnode;
|
|
char filler[3];
|
|
struct cm_region_head_struct *reghead;
|
|
struct cs_struct *cs;
|
|
struct mlk_pvtblk_struct *blkd;
|
|
struct mlk_pvtblk_struct *lockdata;
|
|
uint4 pini_addr;
|
|
} cm_region_list;
|
|
|
|
typedef struct cs_struct
|
|
{
|
|
que_ent qent;
|
|
cm_region_list *region_root;
|
|
cm_region_list *current_region;
|
|
struct CLB *clb_ptr;
|
|
unsigned char state;
|
|
unsigned char new_msg;
|
|
unsigned char maxregnum;
|
|
bool waiting_in_queue;
|
|
#ifdef UNIX
|
|
struct timeval connect; /* Debugging tool -- time connection was established */
|
|
time_t lastact; /* Debugging tool -- time of last server action */
|
|
#else
|
|
uint4 connect[2]; /* Debugging tool -- time connection was established */
|
|
uint4 lastact[2]; /* Debugging tool -- time of last server action */
|
|
#endif
|
|
uint4 stats;
|
|
unsigned short procnum;
|
|
unsigned short transnum;
|
|
unsigned short lk_cancel;
|
|
unsigned short last_cancelled; /* hold transnum of last cancelled lock request */
|
|
struct /* hold info from interrupt cancel msg */
|
|
{ /* laflag can be 0, x40, x80 */
|
|
unsigned char laflag; /* + 1 if valid */
|
|
unsigned char transnum; /* for lk_cancel */
|
|
} int_cancel;
|
|
struct jnl_process_vector_struct *pvec;
|
|
boolean_t query_is_queryget; /* based on client/server protocol levels, query == queryget */
|
|
boolean_t err_compat; /* based on client/server protocol levels (and platform type),
|
|
* rts_error mechanism b/n client and server might be different */
|
|
boolean_t cli_supp_allowexisting_stdnullcoll;/* decided based on client's protocol levels */
|
|
boolean_t client_supports_long_names; /* based on client's levels */
|
|
cm_region_list *region_array[256]; /* [UCHAR_MAX + 1] speed up gtcm_find_region */
|
|
} connection_struct;
|
|
|
|
typedef struct cm_region_head_struct
|
|
{
|
|
relque head;
|
|
struct cm_region_head_struct *next;
|
|
struct cm_region_head_struct *last;
|
|
connection_struct *connect_ptr;
|
|
struct gd_region_struct *reg;
|
|
uint4 refcnt;
|
|
uint4 wakeup;
|
|
hash_table_mname *reg_hash;
|
|
} cm_region_head;
|
|
|
|
typedef struct cm_lk_response_struct
|
|
{
|
|
struct cm_lk_response_struct *next;
|
|
struct CLB *response;
|
|
} cm_lk_response;
|
|
|
|
typedef struct link_info_struct
|
|
{
|
|
unsigned char neterr;
|
|
unsigned char lck_info;
|
|
unsigned char lnk_active;
|
|
char filler;
|
|
struct mlk_pvtblk_struct *netlocks;
|
|
unsigned short procnum;
|
|
unsigned short buffered_count;
|
|
unsigned short buffer_size;
|
|
unsigned short buffer_used;
|
|
unsigned char *buffer;
|
|
boolean_t convert_byteorder;
|
|
boolean_t query_is_queryget; /* based on client/server protocol levels, query == queryget */
|
|
boolean_t err_compat; /* based on client/server protocol levels (and platform type),
|
|
* rts_error mechanism b/n client and server might be different */
|
|
cm_lk_response lk_response;
|
|
boolean_t server_supports_dollar_incr; /* decided based on server protocol levels */
|
|
boolean_t server_supports_std_null_coll; /* decided based on server protocol levels */
|
|
boolean_t server_supports_long_names; /* decided based on server protocol levels */
|
|
} link_info;
|
|
|
|
typedef struct
|
|
{
|
|
char code;
|
|
char rnum;
|
|
bool all;
|
|
bool interactive;
|
|
int4 pid;
|
|
char nodelength;
|
|
char node[32];
|
|
} clear_request;
|
|
|
|
typedef struct
|
|
{
|
|
char code;
|
|
char filler[3];
|
|
int4 status;
|
|
int4 locknamelength;
|
|
char lockname[256];
|
|
} clear_reply;
|
|
|
|
typedef struct
|
|
{
|
|
char code;
|
|
bool clear;
|
|
} clear_confirm;
|
|
|
|
typedef struct
|
|
{
|
|
char code;
|
|
char rnum;
|
|
bool all;
|
|
bool wait;
|
|
int4 pid;
|
|
char nodelength;
|
|
char node[32];
|
|
} show_request;
|
|
|
|
typedef struct
|
|
{
|
|
char code;
|
|
char line[256];
|
|
} show_reply;
|
|
|
|
#define CM_CPU_OFFSET 0
|
|
#define CM_OS_OFFSET 3
|
|
#define CM_IMPLEMENTATION_OFFSET 6
|
|
#define CM_VERSION_OFFSET 9
|
|
#define CM_TYPE_OFFSET 12
|
|
#define CM_LEVEL_OFFSET 15
|
|
#define CM_ENDIAN_OFFSET 18
|
|
|
|
#define CM_FILLER_SIZE 14
|
|
|
|
typedef struct
|
|
{
|
|
char msg[S_PROTSIZE];
|
|
} protocol_msg;
|
|
|
|
#define CM_PUT_USHORT(PTR, USVAL, CONVFLAG) \
|
|
{ \
|
|
if (CONVFLAG) \
|
|
{ \
|
|
unsigned short val = GTM_BYTESWAP_16(USVAL); \
|
|
PUT_USHORT(PTR, val); \
|
|
} \
|
|
else \
|
|
PUT_USHORT(PTR, USVAL); \
|
|
}
|
|
|
|
#define CM_PUT_SHORT(PTR, SVAL, CONVFLAG) \
|
|
{ \
|
|
if (CONVFLAG) \
|
|
{ \
|
|
short val = GTM_BYTESWAP_16(SVAL); \
|
|
PUT_SHORT(PTR, val); \
|
|
} \
|
|
else \
|
|
PUT_SHORT(PTR, SVAL); \
|
|
}
|
|
|
|
#define CM_PUT_ULONG(PTR, ULVAL, CONVFLAG) \
|
|
{ \
|
|
if (CONVFLAG) \
|
|
{ \
|
|
uint4 val = GTM_BYTESWAP_32(ULVAL); \
|
|
PUT_ULONG(PTR, val); \
|
|
} \
|
|
else \
|
|
PUT_ULONG(PTR, ULVAL); \
|
|
}
|
|
|
|
#define CM_PUT_LONG(PTR, LVAL, CONVFLAG) \
|
|
{ \
|
|
if (CONVFLAG) \
|
|
{ \
|
|
int4 val = GTM_BYTESWAP_32(LVAL); \
|
|
PUT_LONG(PTR, val); \
|
|
} \
|
|
else \
|
|
PUT_LONG(PTR, LVAL); \
|
|
}
|
|
|
|
#define CM_GET_USHORT(USVAR, PTR, CONVFLAG) \
|
|
{ \
|
|
if (CONVFLAG) \
|
|
{ \
|
|
unsigned short val; \
|
|
GET_USHORT(val, (PTR)); \
|
|
USVAR = GTM_BYTESWAP_16(val); \
|
|
} \
|
|
else \
|
|
GET_USHORT((USVAR), (PTR)); \
|
|
}
|
|
|
|
#define CM_GET_SHORT(SVAR, PTR, CONVFLAG) \
|
|
{ \
|
|
if (CONVFLAG) \
|
|
{ \
|
|
short val; \
|
|
GET_SHORT(val, (PTR)); \
|
|
SVAR = GTM_BYTESWAP_16(val); \
|
|
} \
|
|
else \
|
|
GET_SHORT((SVAR), (PTR)); \
|
|
}
|
|
|
|
#define CM_GET_ULONG(ULVAR, PTR, CONVFLAG) \
|
|
{ \
|
|
if (CONVFLAG) \
|
|
{ \
|
|
uint4 val; \
|
|
GET_ULONG(val, (PTR)); \
|
|
ULVAR = GTM_BYTESWAP_32(val); \
|
|
} \
|
|
else \
|
|
GET_ULONG((ULVAR), (PTR)); \
|
|
}
|
|
|
|
#define CM_GET_LONG(LVAR, PTR, CONVFLAG) \
|
|
{ \
|
|
if (CONVFLAG) \
|
|
{ \
|
|
int4 val; \
|
|
GET_LONG(val, (PTR)); \
|
|
LVAR = GTM_BYTESWAP_32(val); \
|
|
} \
|
|
else \
|
|
GET_LONG((LVAR), (PTR)); \
|
|
}
|
|
|
|
#define CM_GET_GVCURRKEY(PTR, LEN) \
|
|
/* fetch gvcurrkey fields from message buffer; side effect : PTR is modified \
|
|
* to point to the byte after gv_currkey */ \
|
|
/* if we want to keep gv_currkey->top, why bother changing it; vinu Jul 17, 2000 */ \
|
|
/* top = gv_currkey->top; */ \
|
|
/* GET_USHORT(gv_currkey->top, ptr); */ \
|
|
(PTR) += SIZEOF(unsigned short); \
|
|
GET_USHORT(gv_currkey->end, (PTR)); \
|
|
(PTR) += SIZEOF(unsigned short); \
|
|
GET_USHORT(gv_currkey->prev, (PTR)); \
|
|
(PTR) += SIZEOF(unsigned short); \
|
|
memcpy(gv_currkey->base, (PTR), (LEN) - 6); \
|
|
(PTR) += ((LEN) - 6); \
|
|
/* gv_currkey->top = top; */
|