コード例 #1
0
ファイル: vmsjobs.c プロジェクト: Distrotech/make
static void
reEnableAst(void)
{
  lib$enable_ctrl (&oldCtrlMask,0);
}
コード例 #2
0
void iott_close(io_desc *v, mval *pp)	/* exception is the only deviceparameter allowed */
{
	unsigned short		iosb[4];
	uint4			dummy_msk, enable_msk, status;
	d_tt_struct		*tt_ptr;
	t_cap			s_mode;
	params			ch;
	int			p_offset;

	assert(v->type == tt);
	if (v->state != dev_open)
		return;

	assert((v->pair.in == v) || (v->pair.out == v));
	tt_ptr = (d_tt_struct *)(v->dev_sp);

	if (v->pair.out == v)
	{
		status = sys$dclast(iott_wtclose, tt_ptr, 0);
		if (status != SS$_NORMAL)
			rts_error(VARLSTCNT(1) status);
	}

	if (v->pair.in == v && tt_ptr->term_chars_twisted)
	{
		status = sys$qiow(EFN$C_ENF, tt_ptr->channel, IO$_SENSEMODE,
			iosb, 0, 0, &s_mode, 12, 0, 0, 0, 0);
		if (status == SS$_NORMAL)
			status = iosb[0];
		if (status != SS$_NORMAL)
			rts_error(VARLSTCNT(1) status);
		s_mode.ext_cap &= (~TT2$M_PASTHRU & ~TT2$M_EDITING);
		s_mode.ext_cap |= (tt_ptr->ext_cap & (TT2$M_PASTHRU | TT2$M_EDITING));
		s_mode.term_char &= (~TT$M_ESCAPE);
		s_mode.term_char |= (tt_ptr->term_char & TT$M_ESCAPE);
		status = sys$qiow(EFN$C_ENF, tt_ptr->channel, IO$_SETMODE,
			iosb, 0, 0, &s_mode, 12, 0, 0, 0, 0);
		if (status == SS$_NORMAL)
			status = iosb[0];
		if (status != SS$_NORMAL)
			rts_error(VARLSTCNT(1) status);
	}

	if (v->pair.in == io_std_device.in)
	{
		enable_msk = std_dev_outofband_msk & CTRLY_MSK;
		if (enable_msk == CTRLY_MSK)
			status = lib$enable_ctrl(&enable_msk, &dummy_msk);
			if (status != SS$_NORMAL)
				rts_error(VARLSTCNT(1) status);
	}

	status = sys$dassgn(tt_ptr->channel);
	if (status != SS$_NORMAL)
		rts_error(VARLSTCNT(1) status);

	p_offset = 0;
	while (*(pp->str.addr + p_offset) != iop_eol)
	{
		if ((ch = *(pp->str.addr + p_offset++)) == iop_exception)
		{
			v->error_handler.len = *(pp->str.addr + p_offset);
			v->error_handler.addr = pp->str.addr + p_offset + 1;
			s2pool(&v->error_handler);
		}
		p_offset += ((IOP_VAR_SIZE == io_params_size[ch]) ?
			(unsigned char)*(pp->str.addr + p_offset) + 1 : io_params_size[ch]);
	}

	v->state = dev_closed;
	astq_dyn_alloc += TERMINAL_STATIC_ASTS;
	astq_dyn_avail += TERMINAL_STATIC_ASTS;
	free(tt_ptr->sb_buffer);
	free(tt_ptr->io_buffer);

	return;
}