fis-gtm/sr_port/lke_clearlock.c

117 lines
2.7 KiB
C
Raw Permalink Normal View History

/****************************************************************
* *
* Copyright 2001, 2004 Sanchez Computer Associates, 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. *
* *
****************************************************************/
/*
* -----------------------------------------------
* lke_clearlock : removes the qualified lock node
* used in : lke_cleartree.c
* -----------------------------------------------
*/
#include "mdef.h"
#include "gtm_string.h"
#include "gdsroot.h"
#include "gdsblk.h"
#include "gtm_facility.h"
#include "fileinfo.h"
#include "gdsbt.h"
#include "gdsfhead.h"
#include "filestruct.h"
#include "mlkdef.h"
#include "cmidef.h"
#include "hashtab_mname.h" /* needed for cmmdef.h */
#include "cmmdef.h"
#include "util.h"
#include "lke.h"
#include "cmi.h"
#include "gvcmz.h"
#include "lke_clearlock.h"
#define FLUSH 1
error_def(ERR_LCKGONE);
bool lke_clearlock(
gd_region *region,
struct CLB *lnk,
mlk_ctldata_ptr_t ctl,
mlk_shrblk_ptr_t node,
mstr *name,
bool all,
bool interactive,
int4 pid)
{
clear_confirm confirm;
clear_reply reply;
uint4 status;
int len;
bool unlock = FALSE;
sgmnt_addrs *csa;
if (node->owner != 0 && (pid == node->owner || pid == 0))
{
if (interactive)
if (lnk == NULL)
unlock = lke_get_answ("Clear lock ? ");
else
{
lnk->mbl = sizeof confirm;
lnk->mbf = (unsigned char *)&confirm;
lnk->ast = NULL;
status = cmi_read(lnk);
if ((status & 1) == 0)
{
((link_info *)(lnk->usr))->neterr = TRUE;
gvcmz_error(CMMS_U_LKEDELETE, status);
return FALSE;
}
unlock = confirm.clear;
}
else
unlock = TRUE;
if (unlock)
{
csa = &FILE_INFO(region)->s_addrs;
node->owner = 0;
node->sequence = csa->hdr->trans_hist.lock_sequence++;
len = name->len - 1;
if (name->addr[len] != '(')
++len;
if (lnk == NULL)
util_out_print("Lock removed : !AD", FLUSH, len, name->addr);
else
if (!interactive)
{
reply.code = CMMS_V_LKESHOW;
reply.status = ERR_LCKGONE;
reply.locknamelength = len;
memcpy(reply.lockname, name->addr, len);
lnk->cbl = sizeof reply - (sizeof reply.lockname - len);
lnk->mbf = (unsigned char *)&reply;
lnk->ast = NULL;
status = cmi_write(lnk);
if ((status & 1) == 0)
{
((link_info *)(lnk->usr))->neterr = TRUE;
gvcmz_error(CMMS_V_LKESHOW, status);
return FALSE;
}
}
}
}
return unlock;
}