Example #1
0
void mup_bak_mag(void)
{
	int4		item_code;
	$DESCRIPTOR(dir,"");
	uint4	devbufsiz;

	item_code = DVI$_DEVBUFSIZ;
	dir.dsc$a_pointer = directory.addr;
	dir.dsc$w_length =  directory.len;
	devbufsiz = 0;
	lib$getdvi(&item_code, 0, &dir, &devbufsiz, 0, 0);
	if (devbufsiz < mubmaxblk + 8)
	{
		util_out_print("!/Buffer size !UL may not accomodate maximum GDS block size of !UL.", FALSE,
			devbufsiz, mubmaxblk - 4);
		util_out_print("!/4 bytes/GDS block + 8 bytes/tape block in overhead required for device.", FALSE);
		util_out_print("!/MUPIP cannot start backup with above errors!/",TRUE);
		error_mupip = TRUE;
	}
	return;
}
Example #2
0
void cmj_mbx_ast(struct NTD *tsk)
{
	struct CLB *cmu_makclb();
	struct dsc$descriptor_s ncb_desc;
	uint4 status, unit;
	cm_mbx *mp;
	struct CLB *lnk;
	bool newclb;
	void cmj_ast();

	status = 0;
	mp = tsk->mbx.dsc$a_pointer;
	assert(mp->netnum == 3 && mp->netnam[0] == 'N' && mp->netnam[1] == 'E' && mp->netnam[2] == 'T');
	switch(mp->msg)
	{
	case MSG$_CONNECT:
		lnk = cmj_unit2clb(tsk, mp->unit);
		if (lnk == 0)
		{
			newclb = TRUE;
			lnk = cmu_makclb();
			lnk->dch = tsk->dch;
			lnk->ntd = tsk;
		}else
		{
			newclb = FALSE;
			assert(lnk->sta == CM_CLB_IDLE);
		}
		ncb_desc.dsc$w_length = mp->len;
		ncb_desc.dsc$b_dtype = DSC$K_DTYPE_T;
		ncb_desc.dsc$b_class = DSC$K_CLASS_S;
		ncb_desc.dsc$a_pointer = mp->text;
		lnk->mbf = 0;
	/* the statement below and the 3 qio's emulate cmj_iostart which could be used if lnk->clb were a int4 */
		lnk->sta = CM_CLB_WRITE;
		if (tsk->crq == 0)
		{
			lnk->ast = cmj_reject_ast;
                        status = sys$qio(efn_ignore, lnk->dch, IO$_ACCESS | IO$M_ABORT,
				&lnk->ios, cmj_ast, lnk,
				lnk->mbf, &ncb_desc, 0, 0, 0, 0);
		} else
		{	if (tsk->acc && !(*tsk->acc)(lnk))
			{
				lnk->ast = cmj_reject_ast;
                                status = sys$qio(efn_ignore, lnk->dch, IO$_ACCESS | IO$M_ABORT,
					&lnk->ios, cmj_ast, lnk,
					lnk->mbf, &ncb_desc, 0, 0, 0, 0);
			}else
			{
				status = sys$assign(&cm_netname, &lnk->dch, 0, &tsk->mnm);
				if (status & 1)
				{
					status = lib$getdvi(&DVI$_UNIT, &lnk->dch, 0, &unit, 0, 0);
					if (status & 1)
					{
						lnk->mun = (unsigned short)unit;
						lnk->ast = cmj_accept_ast;
                                                status = sys$qio(efn_ignore, lnk->dch, IO$_ACCESS,
							&lnk->ios, cmj_ast, lnk,
							lnk->mbf, &ncb_desc, 0, 0, 0, 0);
					}
				}
			}
		}
		if ((status & 1) == 0)
		{
			if (newclb)
			{
				lib$free_vm(&SIZEOF(*lnk), &lnk, 0);
				lnk = 0;
			}
			cmj_mbx_err(status, tsk, lnk);
			break;
		}
		return;

	case MSG$_INTMSG:
		if (tsk->mbx_ast != 0)
		{	(*tsk->mbx_ast)(tsk);
			break;
		}
	/* CAUTION:  FALLTHROUGH */
	case MSG$_DISCON:
	case MSG$_ABORT:
	case MSG$_EXIT:
	case MSG$_PATHLOST:
	case MSG$_PROTOCOL:
	case MSG$_THIRDPARTY:
	case MSG$_TIMEOUT:
	case MSG$_NETSHUT:
	case MSG$_REJECT:
	case MSG$_CONFIRM:
		if (tsk->err)
		{
			lnk = cmj_unit2clb(tsk, mp->unit);
			(*tsk->err)(tsk, lnk, mp->msg);
		}else
			rts_error(CMI_NETFAIL,0,status);	/* condition handler would need to close the connection */
	/* CAUTION:  FALLTHROUGH */
	default:
		break;
	}

	status = cmj_mbx_read_start(tsk);
	if ((status & 1) == 0)
	{
		lnk = cmj_unit2clb(tsk, mp->unit);
		cmj_mbx_err(status, tsk, lnk);
	}
}
Example #3
0
/*
**++
**  ROUTINE:	sp_open
**
**  FUNCTIONAL DESCRIPTION:
**
**  	Spawns a subprocess, possibly passing it an initial command.
**
**  RETURNS:	cond_value, longword (unsigned), write only, by value
**
**  PROTOTYPE:
**
**  	sp_open(SPHANDLE *ctxpp, struct dsc$descriptor *inicmd,
**  	    	    unsigned int (*rcvast)(void *), void *rcvastprm);
**
**  IMPLICIT INPUTS:	None.
**
**  IMPLICIT OUTPUTS:	None.
**
**  COMPLETION CODES:
**  	    SS$_NORMAL:	    Normal successful completion.
**
**  SIDE EFFECTS:   	None.
**
**--
*/
unsigned int sp_open (SPHANDLE *ctxpp, void *inicmd, unsigned int (*rcvast)(void *), void *rcvastprm) {

    SPHANDLE ctx;
    unsigned int dvi_devnam = DVI$_DEVNAM, dvi_devbufsiz = DVI$_DEVBUFSIZ;
    unsigned int spawn_flags = CLI$M_NOWAIT|CLI$M_NOKEYPAD;
    unsigned int status;
    struct dsc$descriptor inbox, outbox;

    status = lib$get_vm(&spb_size, &ctx);
    if (!OK(status)) return status;

/*
** Assign the SPHANDLE address for the caller immediately to avoid timing issues with
** WRTATTN AST that passes the ctx as rcvastprm (which sp_once does).
*/
    *ctxpp = ctx;
    ctx->sendque.head = ctx->sendque.tail = &ctx->sendque;
    ctx->ok_to_send = 0;

/*
** Create the mailboxes we'll be using for I/O with the subprocess
*/
    status = sys$crembx(0, &ctx->inchn, 1024, 1024, 0xff00, 0, 0, 0);
    if (!OK(status)) {
    	lib$free_vm(&spb_size, &ctx);
    	return status;
    }
    status = sys$crembx(0, &ctx->outchn, 1024, 1024, 0xff00, 0, 0, 0);
    if (!OK(status)) {
    	sys$dassgn(ctx->inchn);
    	lib$free_vm(&spb_size, &ctx);
    	return status;
    }

/*
** Now that they're created, let's find out what they're called so we
** can tell LIB$SPAWN
*/
    INIT_DYNDESC(inbox);
    INIT_DYNDESC(outbox);
    lib$getdvi(&dvi_devnam, &ctx->inchn, 0, 0, &inbox);
    lib$getdvi(&dvi_devnam, &ctx->outchn, 0, 0, &outbox);
    lib$getdvi(&dvi_devbufsiz, &ctx->outchn, 0, &ctx->bufsiz);

/*
** Create the output buffer for the subprocess.
*/
    status = lib$get_vm(&ctx->bufsiz, &ctx->bufptr);
    if (!OK(status)) {
    	sys$dassgn(ctx->outchn);
    	sys$dassgn(ctx->inchn);
    	str$free1_dx(&inbox);
    	str$free1_dx(&outbox);
    	lib$free_vm(&spb_size, &ctx);
    	return status;
    }

/*
** Set the "receive AST" routine to be invoked by SP_WRTATTN_AST
*/
    ctx->rcvast = rcvast;
    ctx->astprm = rcvastprm;
    sys$qiow(0, ctx->outchn, IO$_SETMODE|IO$M_WRTATTN, 0, 0, 0,
    	sp_wrtattn_ast, ctx, 0, 0, 0, 0);
    sys$qiow(0, ctx->inchn, IO$_SETMODE|IO$M_READATTN, 0, 0, 0,
    	sp_readattn_ast, ctx, 0, 0, 0, 0);

/*
** Get us a termination event flag
*/
    status = lib$get_ef(&ctx->termefn);
    if (OK(status)) lib$get_ef(&ctx->inefn);
    if (OK(status)) lib$get_ef(&ctx->outefn);
    if (!OK(status)) {
    	sys$dassgn(ctx->outchn);
    	sys$dassgn(ctx->inchn);
    	str$free1_dx(&inbox);
    	str$free1_dx(&outbox);
    	lib$free_vm(&ctx->bufsiz, &ctx->bufptr);
    	lib$free_vm(&spb_size, &ctx);
    	return status;
    }

/*
** Now create the subprocess
*/
    status = lib$spawn(inicmd, &inbox, &outbox, &spawn_flags, 0, &ctx->pid,
    	    0, &ctx->termefn);
    if (!OK(status)) {
    	lib$free_ef(&ctx->termefn);
    	lib$free_ef(&ctx->outefn);
    	lib$free_ef(&ctx->inefn);
    	sys$dassgn(ctx->outchn);
    	sys$dassgn(ctx->inchn);
    	str$free1_dx(&inbox);
    	str$free1_dx(&outbox);
    	lib$free_vm(&ctx->bufsiz, &ctx->bufptr);
    	lib$free_vm(&spb_size, &ctx);
    	return status;
    }

/*
** Set up the exit handler, if we haven't done so already
*/
    status = sys$setast(0);
    if (!exh_declared) {
    	sys$dclexh(&exhblk);
    	exh_declared = 1;
    }
    if (status == SS$_WASSET) sys$setast(1);

/*
** Save the SPB in our private queue
*/
    queue_insert(ctx, spque.tail);

/*
** Clean up and return
*/
    str$free1_dx(&inbox);
    str$free1_dx(&outbox);

    return SS$_NORMAL;

} /* sp_open */
Example #4
0
void op_fngetdvi(mval *device, mval *keyword, mval *ret)
{
	itmlist_struct	item_list;
	short 		out_len, iosb[4];
	uint4 	status;
	char 		index, slot, last_slot;
	int4 		item_code, out_value;
	unsigned char 	buff[MAX_KEY_LENGTH], *upper_case;
	bool		want_secondary;
	$DESCRIPTOR(device_name,"");
	error_def(ERR_DVIKEYBAD);
	error_def(ERR_INVSTRLEN);

	MV_FORCE_STR(device);
	MV_FORCE_STR(keyword);

	if (MAX_DEV_LENGTH < device->str.len)
		rts_error(VARLSTCNT(1) SS$_IVLOGNAM);
	if (keyword->str.len > MAX_KEY_LENGTH)
		rts_error(VARLSTCNT(4) ERR_INVSTRLEN, 2, keyword->str.len, MAX_KEY_LENGTH);
	if (!keyword->str.len)
	{	rts_error(VARLSTCNT(6) ERR_DVIKEYBAD, 4, device->str.len, device->str.addr, 4, "NULL");
	}

	lower_to_upper(&buff[0], keyword->str.addr, keyword->str.len);
	upper_case = buff;
	if ( device->str.len == 0 || (device->str.len == 1 && *device->str.addr == '0'))
	{	device_name.dsc$a_pointer = "SYS$INPUT";
		device_name.dsc$w_length = SIZEOF("SYS$INPUT")-1;
	}
	else
	{	device_name.dsc$a_pointer = device->str.addr;
		device_name.dsc$w_length = device->str.len;
	}
	item_list.bufflen = VAL_LENGTH;
	item_list.itmcode = SPL_CODE;
	item_list.buffaddr = &out_value;
	item_list.retlen = &out_len;
	item_list.end = NULL;
	status = sys$getdvi( efn_immed_wait, 0, &device_name, &item_list, &iosb[0], 0, 0, 0 );
	if (status != SS$_NORMAL && status != SS$_NONLOCAL)
	{	rts_error(VARLSTCNT(1)  status ) ;
	}
	sys$synch(efn_immed_wait, &iosb[0]);
	if (iosb[0] != SS$_NORMAL && iosb[0] != SS$_NONLOCAL)
	{	rts_error(VARLSTCNT(1)  iosb[0] );
	}
	if (out_value != NULL)
	{	want_secondary = TRUE;
	}
	else
	{	want_secondary = FALSE;
	}

	if ((index = *upper_case - 'A') < MIN_INDEX || index > MAX_INDEX)
	{	rts_error(VARLSTCNT(6) ERR_DVIKEYBAD, 4, device->str.len, device->str.addr, keyword->str.len, keyword->str.addr);
	}
	item_code = 0;
	if ( dvi_index[ index ].len)
	{
		slot = dvi_index[ index ].index;
		last_slot = dvi_index[ index ].len;
		for ( ; slot < last_slot ; slot++ )
		{	if (keyword->str.len == dvi_table[ slot ].len &&
				!memcmp(dvi_table[ slot ].name, upper_case, keyword->str.len))
			{	item_code = dvi_table[ slot ].item_code;
				break;
			}
		}
	}
	if (!item_code)
	{	rts_error(VARLSTCNT(6) ERR_DVIKEYBAD, 4, device->str.len, device->str.addr, keyword->str.len, keyword->str.addr);
	}

	switch( item_code )
	{
	/* **** the following item codes require a string be returned **** */
	case DVI$_ALLDEVNAM:
	case DVI$_DEVLOCKNAM:
	case DVI$_DEVNAM:
	case DVI$_FULLDEVNAM:
	case DVI$_LOGVOLNAM:
	case DVI$_NEXTDEVNAM:
	case DVI$_ROOTDEVNAM:
	case DVI$_TT_ACCPORNAM:
	case DVI$_TT_PHYDEVNAM:
	case DVI$_VOLNAM:
		if (want_secondary)
		{
			if (!((item_code == DVI$_DEVNAM) && (keyword->str.len == 9)))
			{	item_code |= DVI$C_SECONDARY;
			}
		}
		assert(stringpool.free >= stringpool.base);
		assert(stringpool.top >= stringpool.free);
		ENSURE_STP_FREE_SPACE(MAX_DVI_STRLEN);
		item_list.bufflen = MAX_DVI_STRLEN;
		item_list.itmcode = item_code;
		item_list.buffaddr = stringpool.free;
		item_list.retlen = &out_len;
		item_list.end = NULL;
		status = sys$getdvi( efn_immed_wait, 0, &device_name, &item_list, &iosb[0], 0, 0, 0 );
		if (status != SS$_NORMAL && status != SS$_NONLOCAL)
		{		rts_error(VARLSTCNT(1)  status );
		}
		sys$synch(efn_immed_wait, &iosb[0]);
		if (iosb[0] != SS$_NORMAL && iosb[0] != SS$_NONLOCAL)
		{		rts_error(VARLSTCNT(1)  iosb[0] ) ;
		}
		ret->str.addr = stringpool.free;
		ret->str.len = out_len;
		ret->mvtype = MV_STR;
		stringpool.free += out_len;
		assert(stringpool.free >= stringpool.base);
		assert(stringpool.top >= stringpool.free);
		return;

	default:
		if (want_secondary)
			item_code |= DVI$C_SECONDARY;
		item_list.itmcode = item_code;
		item_list.bufflen = VAL_LENGTH;
		item_list.buffaddr = &out_value;
		item_list.retlen = &out_len;
		item_list.end = NULL;
		status = sys$getdvi( efn_immed_wait, 0, &device_name, &item_list, &iosb[0], 0, 0, 0 );
		if (status != SS$_NORMAL && status != SS$_NONLOCAL)
			rts_error(VARLSTCNT(1)  status );
		sys$synch(efn_immed_wait, &iosb[0]);
		if (iosb[0] != SS$_NORMAL && iosb[0] != SS$_NONLOCAL)
			rts_error(VARLSTCNT(1)  iosb[0] );
		if (want_secondary)
			item_code = item_code - 1;
		switch(item_code)
		{	case DVI$_LOCKID:
			case DVI$_ACPPID:
			case DVI$_OWNUIC:
			if (out_value)
			{	assert(stringpool.free >= stringpool.base);
				assert(stringpool.top >= stringpool.free);
				ENSURE_STP_FREE_SPACE(HEX_LEN);
				i2hex(out_value, stringpool.free, HEX_LEN);
				ret->str.addr = stringpool.free;
				ret->str.len = HEX_LEN;
				stringpool.free += HEX_LEN;
				assert(stringpool.free >= stringpool.base);
				assert(stringpool.top >= stringpool.free);
			}
			else
			{	ret->str.addr = "";
				ret->str.len = 0;
			}
			ret->mvtype = MV_STR;
			break;
		case DVI$_ACPTYPE:
			switch(out_value)
			{
			case 0: ret->str.addr = "ILLEGAL";
				ret->str.len = 7;
				break;
			case 1: ret->str.addr = "F11V1";
				ret->str.len = 5;
				break;
			case 2: ret->str.addr = "F11V2";
				ret->str.len = 5;
				break;
			case 3: ret->str.addr = "MTA";
				ret->str.len = 3;
				break;
			case 4: ret->str.addr = "NET";
				ret->str.len = 3;
				break;
			case 5: ret->str.addr = "REM";
				ret->str.len = 3;
			}
			ret->mvtype = MV_STR;
			break;
		default:
			i2mval(ret,out_value) ;
		}
		return;
	}
}