106 lines
4.1 KiB
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;
|
||
|
}
|