fis-gtm/sr_port_cm/gtcmtr_initproc.c

106 lines
4.1 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. *
* *
****************************************************************/
#include "mdef.h"
#include "copy.h"
#include "gtm_string.h"
#include "gdsroot.h"
#include "gtm_facility.h"
#include "fileinfo.h"
#include "gdsbt.h"
#include "gdsfhead.h"
#include "gdsblk.h"
#include "filestruct.h"
#include "jnl.h"
#include "cmidef.h"
#include "hashtab_mname.h" /* needed for cmmdef.h */
#include "cmmdef.h"
#include "gtcm_find_proc.h"
#include "gtcmtr_protos.h"
#include "gtcm_protocol.h"
#include "gtcm_is_query_queryget.h"
#include "gtcm_err_compat.h" /* for gtcm_err_compat() prototype */
#ifdef VMS
#include "jpv_v10to12.h"
#endif
GBLREF connection_struct *curr_entry;
GBLREF unsigned short procnum;
GBLDEF unsigned int total_process_init = 0; /* so can look at w/ debugger */
GBLREF struct NTD *ntd_root;
GBLREF struct CLB *proc_to_clb[]; /* USHRT_MAX + 1 so procnum can wrap */
GBLREF jnl_process_vector *originator_prc_vec;
bool gtcmtr_initproc(void)
{
unsigned char *reply;
unsigned short beginprocnum;
size_t jpv_size;
protocol_msg myproto;
error_def(CMERR_INVPROT);
error_def(ERR_TOOMANYCLIENTS);
reply = curr_entry->clb_ptr->mbf;
assert(*reply == CMMS_S_INITPROC);
reply++;
gtcm_protocol(&myproto);
if (!gtcm_protocol_match((protocol_msg *)reply, &myproto))
rts_error(VARLSTCNT(1) CMERR_INVPROT);
curr_entry->query_is_queryget = gtcm_is_query_queryget((protocol_msg *)reply, &myproto);
curr_entry->err_compat = gtcm_err_compat((protocol_msg *)reply, &myproto);
curr_entry->cli_supp_allowexisting_stdnullcoll = (0 <= memcmp(reply + CM_LEVEL_OFFSET, CMM_STDNULLCOLL_MIN_LEVEL, 3));
curr_entry->client_supports_long_names = (0 <= memcmp(reply + CM_LEVEL_OFFSET, CMM_LONGNAMES_MIN_LEVEL, 3));
originator_prc_vec = curr_entry->pvec = (jnl_process_vector *)malloc(SIZEOF(jnl_process_vector));
jpv_size = SIZEOF(jnl_process_vector);
assert(jpv_size >= curr_entry->clb_ptr->cbl - S_HDRSIZE - S_PROTSIZE &&
S_HDRSIZE + S_PROTSIZE < curr_entry->clb_ptr->cbl);
if (jpv_size > (curr_entry->clb_ptr->cbl - S_HDRSIZE - S_PROTSIZE))
{ /* our jpv is larger than client so limit copy and pad */
jpv_size = curr_entry->clb_ptr->cbl - S_HDRSIZE - S_PROTSIZE;
memset((char *)originator_prc_vec + jpv_size, 0, SIZEOF(jnl_process_vector) - jpv_size);
}
reply = curr_entry->clb_ptr->mbf;
memcpy((unsigned char *)originator_prc_vec, reply + S_HDRSIZE + S_PROTSIZE, jpv_size);
*reply = CMMS_T_INITPROC;
reply += S_HDRSIZE;
if (UNIX_ONLY(TRUE) VMS_ONLY(0 < memcmp(&((protocol_msg *)reply)->msg[CM_LEVEL_OFFSET], CMM_MIN_PEER_LEVEL, 3)))
{ /* note, protocol string in mbf hasn't been overwritten yet */
memcpy(reply, &myproto, S_PROTSIZE);
#ifdef BIGENDIAN
originator_prc_vec->jpv_pid = GTM_BYTESWAP_32(originator_prc_vec->jpv_pid);
originator_prc_vec->jpv_image_count = GTM_BYTESWAP_32(originator_prc_vec->jpv_image_count);
originator_prc_vec->jpv_time = GTM_BYTESWAP_64(originator_prc_vec->jpv_time);
originator_prc_vec->jpv_login_time = GTM_BYTESWAP_64(originator_prc_vec->jpv_login_time);
#endif
} else
{ /* VMS client is "old" version, send "old" version protocol string */
memcpy(reply, S_PROTOCOL, S_PROTSIZE);
VMS_ONLY(jpv_v10to12((char *)originator_prc_vec, originator_prc_vec);)
}
reply += S_PROTSIZE;
total_process_init++; /* count attempts */
beginprocnum = procnum; /* so stop on wrap around */
while (NULL != proc_to_clb[procnum])
{
procnum++; /* OK to wrap since proc_to_clb is proper size */
if (beginprocnum == procnum)
rts_error(VARLSTCNT(1) ERR_TOOMANYCLIENTS);
}
curr_entry->procnum = procnum;
proc_to_clb[procnum] = curr_entry->clb_ptr;
PUT_SHORT(reply, procnum);
procnum++;
curr_entry->clb_ptr->cbl = S_HDRSIZE + S_PROTSIZE + 2;
return CM_WRITE;
}