117 lines
2.7 KiB
C
117 lines
2.7 KiB
C
|
/****************************************************************
|
||
|
* *
|
||
|
* 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;
|
||
|
}
|