Example #1
0
void lvzwr_out_targkey(mstr *one)
{
	int	n, nsubs;

	zshow_output(zwr_output, lvzwrite_block->curr_name);
	nsubs = lvzwrite_block->curr_subsc;
	if (nsubs)
	{
		*one->addr = '(';
		zshow_output(zwr_output, one);
		for (n = 0 ; ; )
		{
			mval_write(zwr_output, ((zwr_sub_lst *)lvzwrite_block->sub)->subsc_list[n].actual, FALSE);
			if (++n < nsubs)
			{
				*one->addr = ',';
				zshow_output(zwr_output, one);
			} else
			{
				*one->addr = ')';
				zshow_output(zwr_output, one);
				break;
			}
		}
	}
}
Example #2
0
void zshow_format_lock(zshow_out *output, mlk_pvtblk *temp)
{
	static readonly char lp[] = "(";
	static readonly char rp[] = ")";
	static readonly char cm[] = ",";

	mval v;
	unsigned short subs;
	unsigned char *ptr,len;

	ptr = temp->value;

	len = v.str.len = *ptr++;
	v.str.addr = (char *)ptr;
	zshow_output(output, &v.str);
	if (temp->subscript_cnt > 1)
	{
		v.mvtype = MV_STR;
		v.str.len = 1;
		v.str.addr = lp;
		zshow_output(output, &v.str);
		for (subs = 1 ; subs < temp->subscript_cnt; subs++)
		{
			if (subs > 1)
			{
				v.str.len = 1;
				v.str.addr = cm;
				zshow_output(output, &v.str);
			}
			ptr += len;
			len = v.str.len = *ptr++;
			v.str.addr = (char *)ptr;
			mval_write(output, &v, FALSE);
		}
		v.str.len = 1;
		v.str.addr = rp;
		zshow_output(output,&v.str);
	}
}
Example #3
0
void zshow_locks(zshow_out *output)
{
	static readonly char zal[] = "ZAL ";
	static readonly char lck[] = "LOCK ";
	static readonly char lvl[] = " LEVEL=";
	mval v;
	mlk_pvtblk *temp;

	for (temp = mlk_pvt_root; temp; temp = temp->next)
	{
		if (!temp->granted)
			continue;

		if (temp->nodptr && (temp->nodptr->owner != process_id
			|| temp->sequence != temp->nodptr->sequence))
			continue;

		output->flush = FALSE;
		if (temp->level && temp->zalloc)
		{
			v.str.addr = &zal[0];
			v.str.len = sizeof(zal) - 1;
			zshow_output(output,&v.str);
			zshow_format_lock(output,temp);
			output->flush = TRUE;
			v.str.len = 0;
			zshow_output(output,&v.str);
			output->flush = FALSE;
			v.str.addr = &lck[0];
			v.str.len = sizeof(lck) - 1;
			zshow_output(output,&v.str);
			zshow_format_lock(output,temp);
			v.str.addr = &lvl[0];
			v.str.len = sizeof(lvl) - 1;
			zshow_output(output,&v.str);
			MV_FORCE_MVAL(&v,temp->level) ;
			mval_write(output,&v,TRUE);
		}
		else if (temp->level)
		{
			v.str.addr = &lck[0];
			v.str.len = sizeof(lck) - 1;
			zshow_output(output,&v.str);
			zshow_format_lock(output,temp);
			v.str.addr = &lvl[0];
			v.str.len = sizeof(lvl) - 1;
			zshow_output(output,&v.str);
			MV_FORCE_MVAL(&v,temp->level) ;
			mval_write(output,&v,TRUE);
		}else if (temp->zalloc)
		{
			v.str.addr = &zal[0];
			v.str.len = sizeof(zal) - 1;
			zshow_output(output,&v.str);
			zshow_format_lock(output,temp);
			output->flush = TRUE;
			v.str.len = 0;
			zshow_output(output,&v.str);
		}
 	}
}
void zshow_devices(zshow_out *output)
{
	static readonly char filchar_text[] = "CHARACTERS";
	static readonly char filesc_text[] = "ESCAPES";
	static readonly char terminal_text[] = "TERMINAL ";
	static readonly char magtape_text[] =  "MAGTAPE ";
	static readonly char rmsfile_text[] =  "RMS ";
	static readonly char mailbox_text[] =  "MAILBOX ";
	static readonly char dollarc_text[] = "$C(";
	static readonly char equal_text[] = {'='};
	static readonly char comma_text[] = {','};
	static readonly char quote_text[] = {'"'};
	static readonly char lparen_text[] = {'('};
	static readonly char rparen_text[] = {')'};
	static readonly char devop[] = "OPEN ";
	static readonly char devcl[] = "CLOSED ";
	static readonly char largerecord[] = "BIGRECORD ";
	static readonly char rfm_tab[][7] = {"UDF   ", "FIXED ", "VAR   ", "VFC   ", "STM   ", "STMLF ", "STMCR "};
	bool		first;
	int4		i, j, ii, jj;
	io_log_name	*l;		/* logical name pointer		*/
	mval		v;
	mval		m;
	struct FAB	*f;
	struct RAB	*r;
	d_mb_struct	*mb_ptr;
	d_mt_struct	*mt_ptr;
	d_rm_struct	*rm_ptr;
	d_tt_struct	*tt_ptr;
	d_socket_struct	*dsocketptr;
	socket_struct	*socketptr;
	io_termmask	*mask_out;
	unsigned char	delim_buff_sm[MAX_DELIM_LEN];
	unsigned short	delim_len_sm;
	char		delim_mstr_buff[(MAX_DELIM_LEN * MAX_ZWR_EXP_RATIO) + 11];
	mstr		delim;
	int		delim_len;
	static readonly char space8_text[] = "        "; 	/* starting from here, for gtmsocket only */
	static readonly char lb_text[] = {'['};
	static readonly char rb_text[] = {']'};
	static readonly char at_text[] = {'@'};
	static readonly char delimiter_text[] = "DELIMITER ";
	static readonly char nodelimiter_text[] = "NODELIMITER ";
	static readonly char local_text[] = "LOCAL=";
	static readonly char remote_text[] = "REMOTE=";
	static readonly char total_text[] = "TOTAL=";
	static readonly char current_text[] = "CURRENT=";
	static readonly char passive_text[] = "PASSIVE ";
	static readonly char active_text[] = "ACTIVE ";
	static readonly char socket_text[] = "SOCKET";
	static readonly char descriptor_text[] = "DESC=";
	static readonly char trap_text[] = "TRAP ";
	static readonly char notrap_text[] = "NOTRAP ";
	static readonly char zdelay_text[] = "ZDELAY ";
	static readonly char znodelay_text[] = "ZNODELAY ";
	static readonly char zbfsize_text[] = "ZBFSIZE=";
	static readonly char zibfsize_text[] = "ZIBFSIZE=";
	static readonly char port_text[] = "PORT=";
	static readonly char zsh_socket_state[][10] =
					{	"CONNECTED"
						,"LISTENING"
						,"BOUND"
						,"CREATED"
					};
	static readonly char morereadtime_text[] = "MOREREADTIME=";

	v.mvtype = MV_STR;
	for (l = io_root_log_name;  l != 0;  l = l->next)
	{
		if (l->dollar_io[0] != IO_ESC && l->iod->trans_name == l)
		{
			v.str.addr = &l->dollar_io[0];
			v.str.len = l->len;
			zshow_output(output, &v.str);
			ZS_ONE_OUT(&v, space_text);
			if (l->iod->state == dev_open)
			{
				ZS_STR_OUT(&v, devop);
				switch(l->iod->type)
				{
				case tt:
					ZS_STR_OUT(&v, terminal_text);
					tt_ptr = (d_tt_struct *)l->iod->dev_sp;
					if (!ctrlc_on && io_std_device->out == l->iod) /* and standard input */
						ZS_PARM_SP(&v, zshow_nocene);
					if ((int4)(tt_ptr->item_list[0].addr) & TRM$M_TM_CVTLOW)
						ZS_PARM_SP(&v, zshow_conv);
					if (tt_ptr->enbld_outofbands.mask)
					{
						ZS_PARM_EQU(&v, zshow_ctra);
						ZS_STR_OUT(&v, dollarc_text);
						first = TRUE;
						for (i = 1, j = 0;  j < 32;  j++, i = i * 2)
						{
							if (i & tt_ptr->enbld_outofbands.mask)
							{
								if (!first)
									ZS_ONE_OUT(&v, comma_text);
								else
									first = FALSE;
								MV_FORCE_MVAL(&m, j);
								mval_write(output, &m, FALSE);
							}
						}
						ZS_ONE_OUT(&v, rparen_text);
						ZS_ONE_OUT(&v, space_text);
					}
					if ((int4)(tt_ptr->term_char) & TT$M_NOECHO)
						ZS_PARM_SP(&v, zshow_noecho);
					if ((int4)(tt_ptr->ext_cap) & TT2$M_EDITING)
						ZS_PARM_SP(&v, zshow_edit);
					else
						ZS_PARM_SP(&v, zshow_noedit);
					if (!((int4)(tt_ptr->term_char) & TT$M_ESCAPE))
						ZS_PARM_SP(&v, zshow_noesca);
					if (tt_ptr->in_buf_sz != TTDEF_BUF_SZ)
					{
						ZS_PARM_EQU(&v, zshow_field);
						MV_FORCE_MVAL(&m, tt_ptr->in_buf_sz);
						mval_write(output, &m, FALSE);
						ZS_ONE_OUT(&v, space_text);
					}
					if (tt_ptr->term_char & TT$M_HOSTSYNC)
						ZS_PARM_SP(&v, zshow_host);
					else
						ZS_PARM_SP(&v, zshow_nohost);
					if (tt_ptr->ext_cap & TT2$M_INSERT)
						ZS_PARM_SP(&v, zshow_inse);
					else
						ZS_PARM_SP(&v, zshow_noinse);
					if (tt_ptr->ext_cap & TT2$M_PASTHRU)
						ZS_PARM_SP(&v, zshow_past);
					else
						ZS_PARM_SP(&v, zshow_nopast);
					if (tt_ptr->term_char & TT$M_READSYNC)
						ZS_PARM_SP(&v, zshow_reads);
					else
						ZS_PARM_SP(&v, zshow_noreads);
					if (tt_ptr->term_char & TT$M_TTSYNC)
						ZS_PARM_SP(&v, zshow_ttsy);
					else
						ZS_PARM_SP(&v, zshow_nottsy);
					if (tt_ptr->term_char & TT$M_NOTYPEAHD)
						ZS_PARM_SP(&v, zshow_notype);
					else
						ZS_PARM_SP(&v, zshow_type);
					if (!l->iod->wrap)
						ZS_PARM_SP(&v, zshow_nowrap);
					mask_out = tt_ptr->item_list[2].addr;
					if (mask_out->mask[0] != TERM_MSK)
					{
						ZS_PARM_EQU(&v, zshow_term);
						ZS_STR_OUT(&v, dollarc_text);
						first = TRUE;
						for (i = 0;  i < 8;  i++)
						{
							for (j = 0;  j < 32;  j++)
								if (mask_out->mask[i] & (1 << j))
								{
									if (!first)
										ZS_ONE_OUT(&v, comma_text);
									else
										first = FALSE;
									MV_FORCE_MVAL(&m, i * 32 + j);
									mval_write(output, &m, FALSE);
								}
						}
						ZS_ONE_OUT(&v, rparen_text);
						ZS_ONE_OUT(&v, space_text);
					}
					ZS_PARM_EQU(&v, zshow_width);
					MV_FORCE_MVAL(&m, l->iod->width);
					mval_write(output, &m, FALSE);
					ZS_ONE_OUT(&v, space_text);
					ZS_PARM_EQU(&v, zshow_leng);
					MV_FORCE_MVAL(&m, l->iod->pair.out->length);
					mval_write(output, &m, FALSE);
					ZS_ONE_OUT(&v, space_text);
					if (l->iod->write_filter)
					{
						bool twoparms = FALSE;

						ZS_PARM_EQU(&v, zshow_fil);
						if (l->iod->write_filter & CHAR_FILTER)
						{
							if (l->iod->write_filter & ESC1)
							{
								twoparms = TRUE;
								ZS_ONE_OUT(&v, lparen_text);
							}
							ZS_STR_OUT(&v, filchar_text);
							if (twoparms)
							{
								ZS_ONE_OUT(&v, comma_text);
								ZS_ONE_OUT(&v, space_text);
							}
						}
						if (l->iod->write_filter & ESC1)
							ZS_STR_OUT(&v, filesc_text);
						if (twoparms)
							ZS_ONE_OUT(&v, rparen_text);
						ZS_ONE_OUT(&v, space_text);
					}
					break;
				case mt:
					ZS_STR_OUT(&v, magtape_text);
					mt_ptr = (d_tt_struct *)l->iod->dev_sp;
					if (mt_ptr->block_sz != MTDEF_BUF_SZ)
					{
						ZS_PARM_EQU(&v, zshow_bloc);
						MV_FORCE_MVAL(&m, mt_ptr->block_sz);
						mval_write(output, &m, FALSE);
						ZS_ONE_OUT(&v, space_text);
					}
					if (mt_ptr->record_sz != MTDEF_REC_SZ)
					{
						ZS_PARM_EQU(&v, zshow_rec);
						MV_FORCE_MVAL(&m, mt_ptr->record_sz);
						mval_write(output, &m, FALSE);
						ZS_ONE_OUT(&v, space_text);
					}
					if (mt_ptr->read_only)
						ZS_PARM_SP(&v, zshow_read);
					if (mt_ptr->ebcdic)
						ZS_PARM_SP(&v, zshow_ebcd);
					if (mt_ptr->fixed)
						ZS_PARM_SP(&v, zshow_fixed);
					if (mt_ptr->read_mask & IO$M_DATACHECK)
						ZS_PARM_SP(&v, zshow_rchk);
					if (mt_ptr->write_mask & IO$M_DATACHECK)
						ZS_PARM_SP(&v, zshow_wchk);
					if (!l->iod->wrap)
						ZS_PARM_SP(&v, zshow_nowrap);
					break;
				case rm:
					ZS_STR_OUT(&v, rmsfile_text);
					rm_ptr = (d_rm_struct *)l->iod->dev_sp;
					f = &rm_ptr->f;
					r = &rm_ptr->r;
					if (r->rab$l_rop & RAB$M_CVT)
						ZS_PARM_SP(&v, zshow_conv);
					if (f->fab$l_alq != 0)
					{
						ZS_PARM_EQU(&v, zshow_allo);
						MV_FORCE_MVAL(&m, f->fab$l_alq);
						mval_write(output, &m, FALSE);
						ZS_ONE_OUT(&v, space_text);
					}
					if (f->fab$l_fop & FAB$M_DLT)
						ZS_PARM_SP(&v, zshow_dele);
					if (f->fab$w_deq != 0)
					{
						ZS_PARM_EQU(&v, zshow_exte);
						MV_FORCE_MVAL(&m, f->fab$w_deq);
						mval_write(output, &m, FALSE);
						ZS_ONE_OUT(&v, space_text);
					}
					assert(FAB$C_MAXRFM == (SIZEOF(rfm_tab)/SIZEOF(rfm_tab[0]) - 1));
					if (FAB$C_MAXRFM >= rm_ptr->b_rfm && FAB$C_RFM_DFLT != rm_ptr->b_rfm)
						ZS_STR_OUT(&v, rfm_tab[rm_ptr->b_rfm]);
					if (rm_ptr->largerecord)
						ZS_STR_OUT(&v, largerecord);
					if (f->fab$b_fac == FAB$M_GET)
						ZS_PARM_SP(&v, zshow_read);
					if (rm_ptr->l_mrs != DEF_RM_WIDTH)
					{
						ZS_PARM_EQU(&v, zshow_rec);
						MV_FORCE_MVAL(&m, rm_ptr->l_mrs);
						mval_write(output, &m, FALSE);
						ZS_ONE_OUT(&v, space_text);
					}
/* smw should we add width aka usz */
					if (f->fab$b_shr & FAB$M_SHRGET)
						ZS_PARM_SP(&v, zshow_shar);
	/*
					if (f->fab$l_fop & FAB$M_SPL)
						ZS_PARM_SP(&v, zshow_spo);
					if (f->fab$l_fop & FAB$M_SCF)
						ZS_PARM_SP(&v, zshow_sub);
	*/
					if (!l->iod->wrap)
						ZS_PARM_SP(&v, zshow_nowrap);
					if (f->fab$l_xab)
					{
/* smw need to handle other XABs and uic as octal */
						struct XABPRO	*xabpro;
						uic_struct uic;

						ZS_PARM_EQU(&v, zshow_uic);
						ZS_ONE_OUT(&v, quote_text);
						xabpro = f->fab$l_xab;
						memcpy(&uic, &xabpro->xab$l_uic, SIZEOF(int4));
						MV_FORCE_MVAL(&m, uic.grp);
						mval_write(output, &m, FALSE);
						ZS_ONE_OUT(&v, comma_text);
						MV_FORCE_MVAL(&m, uic.mem);
						mval_write(output, &m, FALSE);
						ZS_ONE_OUT(&v, quote_text);
						ZS_ONE_OUT(&v, space_text);
					}
					break;
				case mb:
					ZS_STR_OUT(&v, mailbox_text);
					mb_ptr = (d_mb_struct *)l->iod->dev_sp;
					if (!(mb_ptr->write_mask & IO$M_NOW))
						ZS_PARM_SP(&v, zshow_wait);
					if (mb_ptr->prmflg)
						ZS_PARM_SP(&v, zshow_prmmbx);
					if (mb_ptr->maxmsg != DEF_MB_MAXMSG)
					{
						ZS_PARM_EQU(&v, zshow_bloc);
						MV_FORCE_MVAL(&m, mb_ptr->maxmsg);
						mval_write(output, &m, FALSE);
						ZS_ONE_OUT(&v, space_text);
					}
					if (mb_ptr->promsk & IO_RD_ONLY)
						ZS_PARM_SP(&v, zshow_read);
					if (mb_ptr->del_on_close)
						ZS_PARM_SP(&v, zshow_dele);
					if (mb_ptr->promsk & IO_SEQ_WRT)
						ZS_PARM_SP(&v, zshow_write);
					if (l->iod->width != DEF_MB_MAXMSG)
					{
						ZS_PARM_EQU(&v, zshow_width);
						MV_FORCE_MVAL(&m, l->iod->width);
						mval_write(output, &m, FALSE);
						ZS_ONE_OUT(&v, space_text);
					}
					if (!l->iod->wrap)
						ZS_PARM_SP(&v, zshow_nowrap);
					if (l->iod->length != DEF_MB_LENGTH)
					{
						ZS_PARM_EQU(&v, zshow_leng);
						MV_FORCE_MVAL(&m, l->iod->length);
						mval_write(output, &m, FALSE);
						ZS_ONE_OUT(&v, space_text);
					}
					break;
				case gtmsocket:
					delim.addr = delim_mstr_buff;
					delim_len = 0;
					ZS_STR_OUT(&v, socket_text);
					dsocketptr = (d_socket_struct *)l->iod->dev_sp;
					ZS_ONE_OUT(&v, space_text);
					ZS_STR_OUT(&v, total_text);
					MV_FORCE_MVAL(&m, (int)dsocketptr->n_socket);
					mval_write(output, &m, FALSE);
					ZS_ONE_OUT(&v, space_text);
					ZS_STR_OUT(&v, current_text);
					MV_FORCE_MVAL(&m, (int)dsocketptr->current_socket);
					mval_write(output, &m, FALSE);
					output->flush = TRUE;
					zshow_output(output, 0);
					for(ii = 0; ii < dsocketptr->n_socket; ii++)
					{
						/* output each socket */
						socketptr = dsocketptr->socket[ii];
						ZS_STR_OUT(&v, space8_text);
		/* socket handle */		ZS_STR_OUT(&v, socket_text);
						ZS_ONE_OUT(&v, lb_text);
						MV_FORCE_MVAL(&m, ii);
						mval_write(output, &m, FALSE);
						ZS_ONE_OUT(&v, rb_text);
						ZS_ONE_OUT(&v, equal_text);
						v.str.addr = socketptr->handle;
						v.str.len = socketptr->handle_len;
						zshow_output(output, &v.str);
						ZS_ONE_OUT(&v, space_text);
		/* socket descriptor */		ZS_STR_OUT(&v, descriptor_text);
						MV_FORCE_MVAL(&m, socketptr->sd);
						mval_write(output, &m, FALSE);
						ZS_ONE_OUT(&v, space_text);
		/* socket state */		ZS_STR_OUT(&v, zsh_socket_state[socketptr->state]);
						ZS_ONE_OUT(&v, space_text);
		/* socket type */		if (socketptr->passive)
						{
							ZS_STR_OUT(&v, passive_text);
						} else
						{
							ZS_STR_OUT(&v, active_text);
						}
						ZS_ONE_OUT(&v, space_text);
		/* error trapping */		if (socketptr->ioerror)
						{
							ZS_STR_OUT(&v, trap_text);
						} else
						{
							ZS_STR_OUT(&v, notrap_text);
						}
						ZS_ONE_OUT(&v, space_text);
		/* address + port */		if (socketptr->passive)
						{
							ZS_STR_OUT(&v, port_text);
							MV_FORCE_MVAL(&m, (int)socketptr->local.port);
							mval_write(output, &m, FALSE);
						} else
						{
							ZS_STR_OUT(&v, remote_text);
							if (NULL != socketptr->remote.saddr_ip)
							{
								v.str.addr = socketptr->remote.saddr_ip;
								v.str.len = strlen(socketptr->remote.saddr_ip);
							} else
							{
								v.str.addr = "";
								v.str.len = 0;
							}
							zshow_output(output, &v.str);
							ZS_ONE_OUT(&v, at_text);
							MV_FORCE_MVAL(&m, (int)socketptr->remote.port);
							mval_write(output, &m, FALSE);
							ZS_ONE_OUT(&v, space_text);
							/* to be added later ...
								ZS_STR_OUT(&v, local_text);
								v.str.addr = socketptr->local.saddr_ip;
								v.str.len = strlen(socketptr->local.saddr_ip);
								zshow_output(output, &v.str);
								ZS_ONE_OUT(&v, at_text);
								MV_FORCE_MVAL(&m, (int)socketptr->local.port);
								mval_write(output, &m, FALSE);
							*/
						}
						ZS_ONE_OUT(&v, space_text);
						output->flush = TRUE;
						zshow_output(output, 0);
						ZS_STR_OUT(&v, space8_text);
						ZS_STR_OUT(&v, space8_text);
		/* zdelay */			if (socketptr->nodelay)
						{
							ZS_STR_OUT(&v, znodelay_text);
						} else
						{
							ZS_STR_OUT(&v, zdelay_text);
						}
						ZS_ONE_OUT(&v, space_text);
		/* zbfsize */			ZS_STR_OUT(&v, zbfsize_text);
						MV_FORCE_MVAL(&m, socketptr->buffer_size);
						mval_write(output, &m, FALSE);
						ZS_ONE_OUT(&v, space_text);
		/* izbfsize */			ZS_STR_OUT(&v, zibfsize_text);
						MV_FORCE_MVAL(&m, socketptr->bufsiz);
						mval_write(output, &m, FALSE);
						ZS_ONE_OUT(&v, space_text);
		/* delimiters */		if (socketptr->n_delimiter > 0)
						{
							output->flush = TRUE;
							zshow_output(output, 0);
							ZS_STR_OUT(&v, space8_text);
							ZS_STR_OUT(&v, space8_text);
							ZS_STR_OUT(&v, delimiter_text);
							for (jj = 0; jj < socketptr->n_delimiter; jj++)
							{
								delim_len_sm = socketptr->delimiter[jj].len;
								memcpy(delim_buff_sm, socketptr->delimiter[jj].addr, delim_len_sm);
								format2zwr(delim_buff_sm, delim_len_sm, (uchar_ptr_t)delim.addr,
									&delim_len);
								delim.len = (unsigned short) delim_len;
								assert(SIZEOF(delim_mstr_buff) >= delim_len);
								zshow_output(output, &delim);
								ZS_ONE_OUT(&v, space_text);
							}
						} else
						{
							ZS_STR_OUT(&v, nodelimiter_text);
						}
		/* readmoretime */		if (DEFAULT_MOREREAD_TIMEOUT != socketptr->moreread_timeout)
						{
							ZS_STR_OUT(&v, morereadtime_text);
							MV_FORCE_MVAL(&m, socketptr->moreread_timeout);
							mval_write(output, &m, FALSE);
						}
						output->flush = TRUE;
						zshow_output(output, 0);
					}
				default:
					v.str.len = 0;
					break;
				}
				if (l->iod->error_handler.len)
				{
					ZS_PARM_EQU(&v, zshow_exce);
					ZS_ONE_OUT(&v, quote_text);
					v.str = l->iod->error_handler;
					zshow_output(output, &v.str);
					output->flush = TRUE;
					ZS_ONE_OUT(&v, quote_text);
				} else
				{
					output->flush = TRUE;
					zshow_output(output, 0);
				}
			}
			else
			{
				output->flush = TRUE;
				ZS_STR_OUT(&v, devcl);
			}
		}
	}
}
Example #5
0
void lvzwr_out(lv_val *lvp)
{
	char 			buff;
	uchar_ptr_t		lastc;
	int			n, nsubs, sbs_depth;
	lv_val			*dst_lv, *res_lv, *lvpc;
	mstr 			one;
	mval 			*subscp, *val, outindx;
	ht_ent_addr		*tabent_addr;
	ht_ent_mname		*tabent_mname;
	boolean_t		htent_added, dump_container;
	zwr_alias_var		*newzav, *zav;
	mident_fixed		zwrt_varname;
	lvzwrite_datablk	*newzwrb;
	gparam_list		param_list;	/* for op_putindx call through callg */
	gvnh_reg_t		*gvnh_reg;
	DCL_THREADGBL_ACCESS;

	SETUP_THREADGBL_ACCESS;
	val = &lvp->v;
	assert(lvzwrite_block);
	if (!merge_args)
	{	/* The cases that exist here are:
		 * 1) This is a container variable. If the lv_val it refers to has been printed, show that association.
		 *    Else, "create" a $ZWRTACxxx var/index that will define the value. Then before returning, cause
		 *    that container var to be dumped with the appropriate $ZWRTACxxx index as the var name.
		 * 2) This is an alias base variable. If first time seen, we print normally but record it and put a
		 *    ";#" tag on the end to signify it is an alias var (doesn't affect value). If we look it up and it
		 *    is not the first time this lv_val has been printed, then we instead print the statement needed to
		 *    alias it to the first seen var.
		 * 3) This is just a normal var needing to be printed normally.
		 */
		htent_added = FALSE;
		one.addr = &buff;
		one.len = 1;
		lvzwrite_block->zav_added = FALSE;
		if (lvp->v.mvtype & MV_ALIASCONT)
		{	/* Case 1 -- have an alias container */
			assert(curr_symval->alias_activity);
			assert(!LV_IS_BASE_VAR(lvp));	/* verify is subscripted var */
			lvpc = (lv_val *)lvp->v.str.addr;
			assert(lvpc);
			assert(LV_IS_BASE_VAR(lvpc));	/* Verify base var lv_val */
			if (tabent_addr = (ht_ent_addr *)lookup_hashtab_addr(&zwrhtab->h_zwrtab, (char **)&lvpc))
			{	/* The value was found, we have  a reference we can print now */
				assert(HTENT_VALID_ADDR(tabent_addr, zwr_alias_var, zav));
				*one.addr = '*';
				zshow_output(zwr_output, &one);
				lvzwr_out_targkey(&one);
				*one.addr = '=';
				zshow_output(zwr_output, &one);
				zav = (zwr_alias_var *)tabent_addr->value;
				assert(0 < zav->zwr_var.len);
				zwr_output->flush = TRUE;
				zshow_output(zwr_output, (const mstr *)&zav->zwr_var);
				return;
			}
			/* This lv_val isn't known to us yet. Scan the hash curr_symval hash table to see if it is known as a
			 * base variable as we could have a "forward reference" here.
			 */
			tabent_mname = als_lookup_base_lvval(lvpc);
			/* note even though both paths below add a zav, not bothering to set zav_added because that flag is
			 * really only (currently) cared about in reference to processing a basevar so we wouldn't
			 * be in this code path anyway. Comment here to record potential usage if that changes.
			 */
			if (tabent_mname)
			{	/* Found a base var it can reference -- create a zwrhtab entry for it */
				assert(tabent_mname->key.var_name.len);
				newzav = als_getzavslot();
				newzav->zwr_var = tabent_mname->key.var_name;
				htent_added = add_hashtab_addr(&zwrhtab->h_zwrtab, (char **)&lvpc, newzav, &tabent_addr);
				assert(htent_added);
				dump_container = FALSE;
			} else
			{	/* Unable to find lv_val .. must be "orphaned" so we generate a new $ZWRTAC var for it. The first
				 * check however is if this is the first $ZWRTAC var being generated for this $ZWR. If yes, generate
				 * a $ZWRTAC="" line to preceed it. This will be a flag to load to clear out all existing $ZWRTAC
				 * temp vars so there is no pollution between loads of ZWRitten data.
				 */
				if (0 == zwrtacindx++)
				{	/* Put out "dummy" statement that will clear all the $ZWRTAC vars for a clean slate */
					zwr_output->flush = TRUE;
					zshow_output(zwr_output, &dzwrtac_clean);
				}
				MEMCPY_LIT(zwrt_varname.c, DOLLAR_ZWRTAC);
				lastc = i2asc((uchar_ptr_t)zwrt_varname.c + STR_LIT_LEN(DOLLAR_ZWRTAC), zwrtacindx);
				newzav =  als_getzavslot();
				newzav->zwr_var.addr = zwrt_varname.c;
				newzav->zwr_var.len = INTCAST(((char *)lastc - &zwrt_varname.c[0]));
				s2pool(&newzav->zwr_var);
				htent_added = add_hashtab_addr(&zwrhtab->h_zwrtab, (char **)&lvpc, newzav, &tabent_addr);
				assert(htent_added);
				dump_container = TRUE;
			}
			/* Note value_printed flag in newzav not set since we are NOT dumping the value at this point
			 * but only the association. Since the flag is not set, we *will* dump it when we get to that
			 * actual variable.
			 */
			*one.addr = '*';
			zshow_output(zwr_output, &one);
			lvzwr_out_targkey(&one);
			*one.addr = '=';
			zshow_output(zwr_output, &one);
			zwr_output->flush = TRUE;
			zshow_output(zwr_output, (const mstr *)&newzav->zwr_var);
			if (dump_container)
			{	/* We want to dump the entire container variable but the name doesn't match the var we are
				 * currently dumping so push a new lvzwrite_block onto the stack, fill it in for the current var
				 * and call lvzwr_var() to handle it. When done, dismantle the temp lvzwrite_block.
				 */
				newzwrb = (lvzwrite_datablk *)malloc(SIZEOF(lvzwrite_datablk));
				memset(newzwrb, 0, SIZEOF(lvzwrite_datablk));
				newzwrb->sub = (zwr_sub_lst *)malloc(SIZEOF(zwr_sub_lst) * MAX_LVSUBSCRIPTS);
				newzwrb->curr_name = &newzav->zwr_var;
				newzwrb->prev = lvzwrite_block;
				lvzwrite_block = newzwrb;
				lvzwr_var(lvpc, 0);
				assert(newzav->value_printed);
				assert(newzwrb == lvzwrite_block);
				free(newzwrb->sub);
				lvzwrite_block = newzwrb->prev;
				free(newzwrb);
			}
			return;
		} else if (LV_IS_BASE_VAR(lvp) && IS_ALIASLV(lvp))
		{	/* Case 2 -- alias base variable (only base vars have reference counts). Note this can occur with
			 * TP save/restore vars since we increment both trefcnt and crefcnt for these hidden copied references.
			 * Because of that, we can't assert alias_activity but otherwise it shouldn't affect processing.
			 */
			if (!(htent_added = add_hashtab_addr(&zwrhtab->h_zwrtab, (char **)&lvp, NULL, &tabent_addr)))
			{	/* Entry already existed -- need to output association rather than values */
				assert(tabent_addr);
				zav = (zwr_alias_var *)tabent_addr->value;
				assert(zav);
				if (zav->value_printed)
				{	/* Value has already been output -- print association this time */
					*one.addr = '*';	/* Flag as creating an alias */
					zshow_output(zwr_output, &one);
					/* Now for (new) variable name */
					zshow_output(zwr_output, lvzwrite_block->curr_name);
					*one.addr = '=';
					zshow_output(zwr_output, &one);
					/* .. and the var name aliasing to (the first seen with this lv_val) */
					assert(zav->zwr_var.len);
					zwr_output->flush = TRUE;
					zshow_output(zwr_output, &zav->zwr_var);
					return;
				}
				/* Else the value for this entry has not yet been printed so let us fall into case 3
				 * and get that done. Also set the flag so we mark it as an alias. Note this can happen if
				 * a container value for a name is encountered before the base var it points to. We will
				 * properly resolve the entry but its value  won't have been printed until we actually encounter
				 * it in the tree.
				 */
				htent_added = TRUE;		/* to force the ;# tag at end of value printing */
				zav->value_printed = TRUE;	/* value will be output shortly below */
			} else
			{	/* Entry was added so is first appearance -- give it a value to hold onto and print it */
				newzav = als_getzavslot();
				newzav->zwr_var = *lvzwrite_block->curr_name;
				newzav->value_printed = TRUE;		/* or rather it will be shortly.. */
				tabent_addr->value = (void *)newzav;
				lvzwrite_block->zav_added = TRUE;
				/* Note fall into case 3 to print var and value if exists */
			}
		}
		/* Case 3 - everything else */
		if (!MV_DEFINED(val))
			return;
		MV_FORCE_STR(val);
		lvzwr_out_targkey(&one);
		*one.addr = '=';
		zshow_output(zwr_output, &one);
		mval_write(zwr_output, val, !htent_added);
		if (htent_added)
		{	/* output the ";#" tag to indicate this is an alias output */
			zwr_output->flush = TRUE;
			zshow_output(zwr_output, &semi_star);
		}
	} else
	{	/* MERGE assignment from local variable */
		nsubs = lvzwrite_block->curr_subsc;
		if (MARG1_IS_GBL(merge_args))
		{	/* Target is a global var : i.e. MERGE ^gvn1=lcl1.
			 * In this case, mglvnp->gblp[IND1]->gvkey_nsubs would have been initialized in op_merge.c already.
			 * Use that to check if the target node in ^gvn1 exceeds max # of subscripts.
			 */
			if (MAX_GVSUBSCRIPTS <= (mglvnp->gblp[IND1]->gvkey_nsubs + nsubs))
				rts_error_csa(CSA_ARG(NULL) VARLSTCNT(3) ERR_MERGEINCOMPL, 0, ERR_MAXNRSUBSCRIPTS);
			memcpy(gv_currkey->base, mglvnp->gblp[IND1]->s_gv_currkey->base, mglvnp->gblp[IND1]->s_gv_currkey->end + 1);
			gv_currkey->end = mglvnp->gblp[IND1]->s_gv_currkey->end;
			for (n = 0; n < nsubs; n++)
			{
				subscp = ((zwr_sub_lst *)lvzwrite_block->sub)->subsc_list[n].actual;
				MV_FORCE_STR(subscp);
				mval2subsc(subscp, gv_currkey, gv_cur_region->std_null_coll);
				if (!subscp->str.len &&	(ALWAYS != gv_cur_region->null_subs))
					sgnl_gvnulsubsc();
			}
			MV_FORCE_STR(val);
			gvnh_reg = TREF(gd_targ_gvnh_reg);	/* set by op_gvname/op_gvextnam/op_gvnaked done before op_merge */
			/* If gvnh_reg corresponds to a spanning global, then determine
			 * gv_cur_region/gv_target/gd_targ_* variables based on updated gv_currkey.
			 */
			GV_BIND_SUBSNAME_FROM_GVNH_REG_IF_GVSPAN(gvnh_reg, (TREF(gd_targ_addr)), gv_currkey);
			/* For spanning globals, "gv_cur_region" points to the target region for ^gvn1 only now.
			 * So do the GVSUBOFLOW check (both for spanning and non-spanning globals) now.
			 */
			if (gv_currkey->end >= gv_cur_region->max_key_size)
				ISSUE_GVSUBOFLOW_ERROR(gv_currkey, KEY_COMPLETE_TRUE);
			op_gvput(val);
		} else
		{	/* Target is a local var : pre-process target in case it is a container */
			assert(MARG1_IS_LCL(merge_args));
			dst_lv = mglvnp->lclp[IND1];
			if (!LV_IS_BASE_VAR(dst_lv))
			{
				LV_SBS_DEPTH(dst_lv, FALSE, sbs_depth);
				if (MAX_LVSUBSCRIPTS < (sbs_depth + nsubs))
					rts_error_csa(CSA_ARG(NULL) VARLSTCNT(3) ERR_MERGEINCOMPL, 0, ERR_MAXNRSUBSCRIPTS);
			}
			param_list.arg[0] = dst_lv;	/* this is already protected from stp_gcol by op_merge so no need to
							 * push this into the stack for stp_gcol protection. */
			for (n = 0 ; n < nsubs; n++)
			{	/* Note: no need to do push these mvals on the stack before calling op_putindx
				 * as lvzwrite_block->sub is already protected by stp_gcol_src.h.
				 */
				param_list.arg[n+1] = ((zwr_sub_lst *)lvzwrite_block->sub)->subsc_list[n].actual;
			}
			param_list.n = n + 1;
			dst_lv = (lv_val *)callg((callgfnptr)op_putindx, &param_list);
			MV_FORCE_STR(val);
			assert(!(MV_ALIASCONT & dst_lv->v.mvtype));	/* op_putindx would have already done DECR_AC_REF for us */
			dst_lv->v = *val;
			dst_lv->v.mvtype &= ~MV_ALIASCONT;	/* Make sure alias container property does not pass */
		}
	}
}
Example #6
0
void zshow_svn(zshow_out *output)
{
	mstr		x;
	mval		var, zdir;
	io_log_name	*tl;
       	stack_frame	*fp;
	int 		count, save_dollar_zlevel;
	char		*c1, *c2;
	char		zdir_error[3 * GTM_MAX_DIR_LEN + 128]; /* PATH_MAX + "->" + GTM-W-ZDIROUTOFSYNC, <text of ZDIROUTOFSYNC> */

	error_def(ERR_ZDIROUTOFSYNC);

	/* SV_DEVICE */
		get_dlr_device(&var);
		ZS_VAR_EQU(&x, device_text);
		mval_write(output, &var, TRUE);
	/* SV_ECODE */
		ecode_get(-1, &var);
		ZS_VAR_EQU(&x, ecode_text);
		mval_write(output, &var, TRUE);
	/* SV_ESTACK */
		save_dollar_zlevel = dollar_zlevel();
		count = (save_dollar_zlevel - 1) - dollar_estack_delta.m[0];
		MV_FORCE_MVAL(&var, count);
		ZS_VAR_EQU(&x, estack_text);
		mval_write(output, &var, TRUE);
	/* SV_ETRAP */
		var.mvtype = MV_STR;
		var.str = dollar_etrap.str;
		ZS_VAR_EQU(&x, etrap_text);
		mval_write(output, &var, TRUE);
	/* SV_HOROLOG */
		op_horolog(&var);
		ZS_VAR_EQU(&x, horolog_text);
		mval_write(output, &var, TRUE);
	/* SV_IO */
		var.str.addr = io_curr_device.in->name->dollar_io;
		var.str.len = io_curr_device.in->name->len;
		/*** The following should be in the I/O code ***/
		if (ESC == *var.str.addr)
		{
			if (5 > var.str.len)
				var.str.len = 0;
			else
			{
				var.str.addr += ESC_OFFSET;
				var.str.len -= ESC_OFFSET;
			}
		}
		var.mvtype = MV_STR;
		ZS_VAR_EQU(&x, io_text);
		mval_write(output, &var, TRUE);
	/* SV_JOB */
		ZS_VAR_EQU(&x, job_text);
		mval_write(output, &dollar_job, TRUE);
	/* SV_KEY */
		get_dlr_key(&var);
		ZS_VAR_EQU(&x, key_text);
		mval_write(output, &var, TRUE);
	/* SV_PRINCIPAL */
		if (dollar_principal)
			tl = dollar_principal;
		else
			tl = io_root_log_name->iod->trans_name;
		var.str.addr = tl->dollar_io;
		var.str.len = tl->len;
		/*** The following should be in the I/O code ***/
		if (ESC == *var.str.addr)
		{
			if (5 > var.str.len)
				var.str.len = 0;
			else
			{
				var.str.addr += ESC_OFFSET;
				var.str.len -= ESC_OFFSET;
			}
		}
		var.mvtype = MV_STR;
		ZS_VAR_EQU(&x, principal_text);
		mval_write(output, &var, TRUE);
	/* SV_QUIT */
		count = ((NULL == get_ret_targ()) ? 0 : 1);
		MV_FORCE_MVAL(&var, count);
		ZS_VAR_EQU(&x, quit_text);
		mval_write(output, &var, TRUE);
	/* SV_REFERENCE */
		get_reference(&var);
		ZS_VAR_EQU(&x, reference_text);
		mval_write(output, &var, TRUE);
	/* SV_STACK */
		count = (save_dollar_zlevel - 1);
		MV_FORCE_MVAL(&var, count);
		ZS_VAR_EQU(&x, stack_text);
		mval_write(output, &var, TRUE);
	/* SV_STORAGE */
		i2mval(&var, getstorage());
		ZS_VAR_EQU(&x, storage_text);
		mval_write(output, &var, TRUE);
	/* SV_SYSTEM */
		var.mvtype = MV_STR;
		var.str = dollar_system.str;
		ZS_VAR_EQU(&x, system_text);
		mval_write(output, &var, TRUE);
	/* SV_TEST */
		i2mval(&var, (int)op_dt_get());
		ZS_VAR_EQU(&x, test_text);
		mval_write(output, &var, TRUE);
	/* SV_TLEVEL */
		count = (int)dollar_tlevel;
		MV_FORCE_MVAL(&var, count);
		ZS_VAR_EQU(&x, tlevel_text);
		mval_write(output, &var, TRUE);
	/* SV_TRESTART */
		MV_FORCE_MVAL(&var, (int)((MAX_VISIBLE_TRESTART < dollar_trestart) ? MAX_VISIBLE_TRESTART : dollar_trestart));
		ZS_VAR_EQU(&x, trestart_text);
		mval_write(output, &var, TRUE);
	/* SV_X */
		count = (int)io_curr_device.out->dollar.x;
		MV_FORCE_MVAL(&var, count);
		ZS_VAR_EQU(&x, x_text);
		mval_write(output, &var, TRUE);
	/* SV_Y */
		count = (int)io_curr_device.out->dollar.y;
		MV_FORCE_MVAL(&var, count);
		ZS_VAR_EQU(&x, y_text);
		mval_write(output, &var, TRUE);
	/* SV_ZA */
		count = (int)io_curr_device.in->dollar.za;
		MV_FORCE_MVAL(&var, count);
		ZS_VAR_EQU(&x, za_text);
		mval_write(output, &var, TRUE);
	/* SV_ZB */
		c1 = (char *)io_curr_device.in->dollar.zb;
		c2 = c1 + sizeof(io_curr_device.in->dollar.zb);
		var.mvtype = MV_STR;
		var.str.addr = (char *)io_curr_device.in->dollar.zb;
		while (c1 < c2 && *c1)
			c1++;
		var.str.len = (char *)c1 - var.str.addr;
		ZS_VAR_EQU(&x, zb_text);
		mval_write(output, &var, TRUE);
	/* SV_ZCMDLINE */
		get_command_line(&var, TRUE);	/* TRUE to indicate we want $ZCMDLINE (i.e. processed not actual command line) */
		ZS_VAR_EQU(&x, zcmdline_text);
		mval_write(output, &var, TRUE);
	/* SV_ZCOMPILE */
		var.mvtype = MV_STR;
		var.str = dollar_zcompile;
		ZS_VAR_EQU(&x, zcompile_text);
		mval_write(output, &var, TRUE);
	/* SV_ZCSTATUS */
		MV_FORCE_MVAL(&var, dollar_zcstatus);
		ZS_VAR_EQU(&x, zcstatus_text);
		mval_write(output, &var, TRUE);
	/* SV_ZDATEFORM */
		MV_FORCE_MVAL(&var, zdate_form);
		ZS_VAR_EQU(&x, zdate_form_text);
		mval_write(output, &var, TRUE);
	/* SV_ZDIR */
		ZS_VAR_EQU(&x, zdirectory_text);
		setzdir(NULL, &zdir);
		if (zdir.str.len != dollar_zdir.str.len || 0 != memcmp(zdir.str.addr, dollar_zdir.str.addr, zdir.str.len))
		{
			memcpy(zdir_error, zdir.str.addr, zdir.str.len);
			memcpy(&zdir_error[zdir.str.len], arrow_text, STR_LIT_LEN(arrow_text));
			sgtm_putmsg(&zdir_error[zdir.str.len + STR_LIT_LEN(arrow_text)], VARLSTCNT(6) ERR_ZDIROUTOFSYNC, 4,
					zdir.str.len, zdir.str.addr, dollar_zdir.str.len, dollar_zdir.str.addr);
			zdir.str.addr = zdir_error;
			zdir.str.len = strlen(zdir_error) - 1; /* eliminate trailing '\n' */
		}
		SKIP_DEVICE_IF_NOT_NEEDED(&zdir);
		mval_write(output, &zdir, TRUE);
	/* SV_ZEDITOR */
		MV_FORCE_MVAL(&var, dollar_zeditor);
		ZS_VAR_EQU(&x, zeditor_text);
		mval_write(output, &var, TRUE);
	/* SV_ZEOF */
		ZS_VAR_EQU(&x, zeof_text);
		mval_write(output, io_curr_device.in->dollar.zeof ? (mval *)&literal_one : (mval *)&literal_zero, TRUE);
	/* SV_ZERROR */
		var.mvtype = MV_STR;
		var.str = dollar_zerror.str;
		ZS_VAR_EQU(&x, zerror_text);
		mval_write(output, &var, TRUE);
	/* SV_ZGBLDIR */
		ZS_VAR_EQU(&x, zgbldir_text);
		mval_write(output, &dollar_zgbldir, TRUE);
	/* SV_ZININTERRUPT */
		MV_FORCE_MVAL(&var, dollar_zininterrupt);
		ZS_VAR_EQU(&x, zininterrupt_text);
		mval_write(output, &var, TRUE);
	/* SV_ZINTERRUPT */
		var.mvtype = MV_STR;
		var.str = dollar_zinterrupt.str;
		ZS_VAR_EQU(&x, zinterrupt_text);
		mval_write(output, &var, TRUE);
	/* SV_ZIO */
		var.mvtype = MV_STR;
		/* NOTE:	This is **NOT** equivalent to :
		 *		io_curr_log_name->dollar_io
		 */
		var.str.addr = io_curr_device.in->trans_name->dollar_io;
		var.str.len = io_curr_device.in->trans_name->len;
		if (*var.str.addr == ESC)
		{
			if (5 > var.str.len)
				var.str.len = 0;
			else
			{
				var.str.addr += ESC_OFFSET;
				var.str.len -= ESC_OFFSET;
			}
		}
		ZS_VAR_EQU(&x, zio_text);
		mval_write(output, &var, TRUE);
	/* SV_ZJOB */
		MV_FORCE_ULONG_MVAL(&var, dollar_zjob);
		ZS_VAR_EQU(&x, zjob_text);
		mval_write(output, &var, TRUE);
	/* SV_ZLEVEL */
		MV_FORCE_MVAL(&var, save_dollar_zlevel);
		ZS_VAR_EQU(&x, zlevel_text);
		mval_write(output, &var, TRUE);
	/* SV_ZMAXTPTIME */
		MV_FORCE_MVAL(&var, dollar_zmaxtptime);
		ZS_VAR_EQU(&x, zmaxtptime_text);
		mval_write(output, &var, TRUE);
	/* SV_ZMODE */
		ZS_VAR_EQU(&x, zmode_text);
		mval_write(output, &dollar_zmode, TRUE);
	/* SV_ZPOS */
		getzposition(&var);
		ZS_VAR_EQU(&x, zpos_text);
		mval_write(output, &var, TRUE);
	/* SV_ZPROC */
		ZS_VAR_EQU(&x, zproc_text);
		mval_write(output, &dollar_zproc, TRUE);
	/* SV_PROMPT */
		var.mvtype = MV_STR;
		var.str.addr = gtmprompt.addr;
		var.str.len = gtmprompt.len;
		ZS_VAR_EQU(&x, zprompt_text);
		mval_write(output, &var, TRUE);
	/* SV_ZROUTINES */
		if (!zro_root)
			zro_init();
		var.mvtype = MV_STR;
		var.str = dollar_zroutines;
		ZS_VAR_EQU(&x, zroutines_text);
		mval_write(output, &var, TRUE);
	/* SV_ZSOURCE */
		var.mvtype = MV_STR;
		var.str = dollar_zsource;
		ZS_VAR_EQU(&x, zsource_text);
		mval_write(output, &var, TRUE);
	/* SV_ZSTATUS */
		ZS_VAR_EQU(&x, zstatus_text);
		mval_write(output, &dollar_zstatus, TRUE);
	/* SV_ZSTEP   */
		ZS_VAR_EQU(&x, zstep_text);
		mval_write(output, &dollar_zstep, TRUE);
	/* SV_ZSYSTEM */
		MV_FORCE_MVAL(&var, dollar_zsystem);
		ZS_VAR_EQU(&x, zsystem_text);
		mval_write(output, &var, TRUE);
	/* SV_ZTEXIT */
		var.mvtype = MV_STR;
		var.str = dollar_ztexit.str;
		ZS_VAR_EQU(&x, ztexit_text);
		mval_write(output, &var, TRUE);
	/* SV_ZTRAP */
		var.mvtype = MV_STR;
		var.str = dollar_ztrap.str;
		ZS_VAR_EQU(&x, ztrap_text);
		mval_write(output, &var, TRUE);
	/* SV_ZVERSION */
		var.mvtype = MV_STR;
		var.str.addr = (char *)&gtm_release_name[0];
		var.str.len = gtm_release_name_len;
		ZS_VAR_EQU(&x, zversion_text);
		mval_write(output, &var, TRUE);
	/* SV_ZYERROR */
		var.mvtype = MV_STR;
		var.str = dollar_zyerror.str;
		ZS_VAR_EQU(&x, zyerror_text);
		mval_write(output, &var, TRUE);
}
Example #7
0
void zshow_devices(zshow_out *output)
{
	io_log_name	*l;		/* logical name pointer		*/
	mval		v;
	mval		m;
	d_rm_struct	*rm_ptr;
	d_tt_struct	*tt_ptr;
	d_socket_struct *dsocketptr;
	socket_struct	*socketptr;
	io_termmask	*mask_out;
	int4		i, j, ii, jj;
	boolean_t	first;
	unsigned char	delim_buff_sm[MAX_DELIM_LEN];
	unsigned short	delim_len_sm;
	char		delim_mstr_buff[(MAX_DELIM_LEN * MAX_ZWR_EXP_RATIO) + 11];
	mstr		delim;
	int		delim_len, tmpport;
	static readonly char space8_text[] = "        ";
	static readonly char filchar_text[] = "CHARACTERS";
	static readonly char filesc_text[] = "ESCAPES";
	static readonly char terminal_text[] = "TERMINAL ";
	static readonly char magtape_text[] =  "MAGTAPE ";
	static readonly char rmsfile_text[] =  "RMS ";
	static readonly char fifo_text[] =  "FIFO ";
	static readonly char pipe_text[] =  "PIPE ";
	static readonly char mailbox_text[] =  "MAILBOX ";
	static readonly char dollarc_text[] = "$C(";
	static readonly char equal_text[] = {'='};
	static readonly char comma_text[] = {','};
	static readonly char quote_text[] = {'"'};
	static readonly char lparen_text[] = {'('};
	static readonly char rparen_text[] = {')'};
	static readonly char lb_text[] = {'['};
	static readonly char rb_text[] = {']'};
	static readonly char devop[] = "OPEN ";
	static readonly char devcl[] = "CLOSED ";
	static readonly char interrupt_text[] = "ZINTERRUPT ";

	/* gtmsocket specific */
	static readonly char at_text[] = {'@'};
	static readonly char delimiter_text[] = "DELIMITER ";
	static readonly char nodelimiter_text[] = "NODELIMITER ";
	static readonly char local_text[] = "LOCAL=";
	static readonly char remote_text[] = "REMOTE=";
	static readonly char total_text[] = "TOTAL=";
	static readonly char current_text[] = "CURRENT=";
	static readonly char passive_text[] = "PASSIVE ";
	static readonly char active_text[] = "ACTIVE ";
	static readonly char socket_text[] = "SOCKET";
	static readonly char descriptor_text[] = "DESC=";
	static readonly char trap_text[] = "TRAP ";
	static readonly char notrap_text[] = "NOTRAP ";
	static readonly char zdelay_text[] = "ZDELAY ";
	static readonly char znodelay_text[] = "ZNODELAY ";
	static readonly char zbfsize_text[] = "ZBFSIZE=";
	static readonly char zibfsize_text[] = "ZIBFSIZE=";
	static readonly char port_text[] = "PORT=";
	static readonly char ichset_text[] = "ICHSET=";
	static readonly char ochset_text[] = "OCHSET=";
#ifdef __MVS__
	static readonly char filetag_text[] = "FILETAG=";
	static readonly char untagged_text[] = "UNTAGGED";
	static readonly char ebcdic_text[] = "EBCDIC";
	static readonly char binary_text[] = "BINARY";
	static readonly char processchset_text[] = "CHSET=";
	static readonly char text_text[] = " TEXT";
	char   csname[_CSNAME_LEN_MAX + 1], *csptr;
#endif
	static readonly char zsh_socket_state[][10] =
		{	"CONNECTED"
			,"LISTENING"
			,"BOUND"
			,"CREATED"
		};
	static readonly char morereadtime_text[] = "MOREREADTIME=";

	v.mvtype = MV_STR;
	for (l = io_root_log_name;  l != 0;  l = l->next)
	{
		if (l->iod->trans_name == l)
		{
			/* if it is an rm type we don't want to output the device if it is the stderr
			   device for a pipe device */
			if ((rm_ptr = (d_rm_struct*)l->iod->dev_sp) && rm == l->iod->type && rm_ptr->pipe && rm_ptr->stderr_parent)
				continue;
			v.str.addr = &l->dollar_io[0];
			v.str.len = l->len;
			zshow_output(output,&v.str);
			ZS_ONE_OUT(&v, space_text);
			if (l->iod->state == dev_open)
			{
				ZS_STR_OUT(&v, devop);
				switch(l->iod->type)
				{
					case tt:
						ZS_STR_OUT(&v, terminal_text);
						tt_ptr = (d_tt_struct*)l->iod->dev_sp;
						if (!ctrlc_on && io_std_device->out == l->iod) /* and standard input */
						{	ZS_PARM_SP(&v, zshow_nocene);
						}
						if (tt_ptr->enbld_outofbands.mask)
						{	ZS_PARM_EQU(&v, zshow_ctra);
							ZS_STR_OUT(&v,dollarc_text);
							first = TRUE;
							for ( i = 1, j = 0; j < 32  ; j++,i = i * 2)
							{	if (i & tt_ptr->enbld_outofbands.mask)
								{	if (!first)
									{	ZS_ONE_OUT(&v, comma_text);
									}else
									{	first = FALSE;
									}
									MV_FORCE_MVAL(&m,j);
									mval_write(output,&m,FALSE);
								}
							}
							ZS_ONE_OUT(&v, rparen_text);
							ZS_ONE_OUT(&v, space_text);
						}
						if ((int4)(tt_ptr->term_ctrl) & TRM_NOECHO)
						{
							ZS_PARM_SP(&v, zshow_noecho);
						}
						if (tt_ptr->term_ctrl & TRM_PASTHRU)
						{
							ZS_PARM_SP(&v, zshow_past);
						} else
						{
							ZS_PARM_SP(&v, zshow_nopast);
						}
						if (!(tt_ptr->term_ctrl & TRM_ESCAPE))
						{
							ZS_PARM_SP(&v, zshow_noesca);
						}
						if (tt_ptr->term_ctrl & TRM_READSYNC)
						{
							ZS_PARM_SP(&v, zshow_reads);
						} else
						{
							ZS_PARM_SP(&v, zshow_noreads);
						}
						if (tt_ptr->term_ctrl & TRM_NOTYPEAHD)
						{
							ZS_PARM_SP(&v, zshow_notype);
						} else
						{
							ZS_PARM_SP(&v, zshow_type);
						}
						if (!l->iod->wrap)
						{
							ZS_PARM_SP(&v, zshow_nowrap);
						}
						mask_out = &tt_ptr->mask_term;
						if (!tt_ptr->default_mask_term)
						{
							ZS_PARM_EQU(&v, zshow_term);
							ZS_STR_OUT(&v,dollarc_text);
							first = TRUE;
							for ( i = 0; i < 8 ;i++)
							{
								for ( j = 0; j < 32; j++)
									if (mask_out->mask[i] & (1 << j))
									{
										if (!first)
										{
											ZS_ONE_OUT(&v, comma_text);
										} else
											first = FALSE;
										MV_FORCE_MVAL(&m,i * 32 + j);
										mval_write(output,&m,FALSE);
									}
							}
							ZS_ONE_OUT(&v, rparen_text);
							ZS_ONE_OUT(&v, space_text);
						}
						ZS_PARM_EQU(&v, zshow_width);
						MV_FORCE_MVAL(&m,(int)l->iod->width);
						mval_write(output, &m, FALSE);
						ZS_ONE_OUT(&v, space_text);
						ZS_PARM_EQU(&v, zshow_leng);
						MV_FORCE_MVAL(&m,(int)l->iod->pair.out->length);
						mval_write(output, &m, FALSE);
						ZS_ONE_OUT(&v, space_text);
						if (l->iod->write_filter)
						{
							bool twoparms = FALSE;

							ZS_PARM_EQU(&v, zshow_fil);
							if (l->iod->write_filter & CHAR_FILTER)
							{
								if (l->iod->write_filter & ESC1)
								{
									twoparms = TRUE;
									ZS_ONE_OUT(&v,lparen_text);
								}
								ZS_STR_OUT(&v,filchar_text);
								if (twoparms)
								{
									ZS_ONE_OUT(&v, comma_text);
									ZS_ONE_OUT(&v, space_text);
								}
							}
							if (l->iod->write_filter & ESC1)
								ZS_STR_OUT(&v,filesc_text);
							if (twoparms)
								ZS_ONE_OUT(&v,rparen_text);
							ZS_ONE_OUT(&v, space_text);
						}
						if (TT_EDITING & tt_ptr->ext_cap)
							ZS_PARM_SP(&v, zshow_edit);
						if (TT_NOINSERT & tt_ptr->ext_cap)
							ZS_PARM_SP(&v, zshow_noinse);
						if (TT_EMPTERM & tt_ptr->ext_cap)
							ZS_PARM_SP(&v, zshow_empterm);
						if (tt_ptr->canonical)
							ZS_STR_OUT(&v, "CANONICAL ");
						switch(l->iod->ichset)
						{
							case CHSET_M:
								if (gtm_utf8_mode)
								{
									ZS_STR_OUT(&v, ichset_text);
									zshow_output(output, &chset_names[l->iod->ichset]);
									ZS_ONE_OUT(&v, space_text);
								}
								break;
							case CHSET_UTF8:
								assert(gtm_utf8_mode);
								break;
							default:
								GTMASSERT;
						}
						switch(l->iod->ochset)
						{
							case CHSET_M:
								if (gtm_utf8_mode)
								{
									ZS_STR_OUT(&v, ochset_text);
									zshow_output(output, &chset_names[l->iod->ochset]);
									ZS_ONE_OUT(&v, space_text);
								}
								break;
							case CHSET_UTF8:
								assert(gtm_utf8_mode);
								break;
							default:
								GTMASSERT;
						}
						if (tt_ptr->mupintr)
							ZS_STR_OUT(&v, interrupt_text);
						break;
					case rm:
						/* we go to rm_ptr above for the rm type */

						if (rm_ptr->fifo)
							ZS_STR_OUT(&v,fifo_text);
						else if (!rm_ptr->pipe)
						{
							ZS_STR_OUT(&v,rmsfile_text);
							if (rm_ptr->follow)
							{
								ZS_PARM_SP(&v, zshow_follow);
							}
						}
						else
						{
							ZS_STR_OUT(&v,pipe_text);
							if (rm_ptr->dev_param_pairs.num_pairs)
							{
								int ignore_stderr = FALSE;
								/* if one of the dev_param_pairs[i]->name is the
								   STDERR then we don't want to output it if the
								   device is closed.  We'll check them all even though
								   it is currently the last one - just to be safe. */
								if (rm_ptr->stderr_child && (dev_open !=
											     rm_ptr->stderr_child->state))
									ignore_stderr = TRUE;

								for ( i = 0; i < rm_ptr->dev_param_pairs.num_pairs; i++ )
								{
									if (TRUE == ignore_stderr &&
									    0 == STRCMP(rm_ptr->dev_param_pairs.pairs[i].name,
											"STDERR="))
										continue;
									ZS_VAR_STR_OUT(
										&v,rm_ptr->dev_param_pairs.pairs[i].name);
									ZS_VAR_STR_OUT(
										&v,rm_ptr->dev_param_pairs.pairs[i].definition);
									ZS_ONE_OUT(&v, space_text);
								}
							}
							if (rm_ptr->independent)
							{
								ZS_PARM_SP(&v, zshow_independent);
							}
							if (rm_ptr->parse)
							{
								ZS_PARM_SP(&v, zshow_parse);
							}
						}
						if (rm_ptr->fixed)
						{
							ZS_PARM_SP(&v, zshow_fixed);
						}
						if (rm_ptr->noread)
						{
							ZS_PARM_SP(&v, zshow_read);
						}
						if (gtm_utf8_mode && (IS_UTF_CHSET(l->iod->ichset) || IS_UTF_CHSET(l->iod->ochset)))
						{
							if (!rm_ptr->def_recsize)
							{
								ZS_PARM_EQU(&v, zshow_rec);
								MV_FORCE_MVAL(&m, (int)rm_ptr->recordsize);
								mval_write(output, &m, FALSE);
								ZS_ONE_OUT(&v, space_text);
							}
							if (!rm_ptr->def_width)
							{
								ZS_PARM_EQU(&v, zshow_width);
								MV_FORCE_MVAL(&m, (int)l->iod->width);
								mval_write(output, &m, FALSE);
								ZS_ONE_OUT(&v, space_text);
							}
						}
						else if (l->iod->width != DEF_RM_WIDTH)
						{
							ZS_PARM_EQU(&v, zshow_rec);
							MV_FORCE_MVAL(&m,(int)l->iod->width);
							mval_write(output, &m, FALSE);
							ZS_ONE_OUT(&v, space_text);
						}
						if (!l->iod->wrap)
						{
							ZS_PARM_SP(&v, zshow_nowrap);
						}
						switch(l->iod->ichset)
						{
							case CHSET_M:
								if (gtm_utf8_mode)
								{
									ZS_STR_OUT(&v, ichset_text);
									zshow_output(output, &chset_names[l->iod->ichset]);
									ZS_ONE_OUT(&v, space_text);
								}
								break;
							case CHSET_UTF8:
								assert(gtm_utf8_mode);
								break;
							case CHSET_UTF16:
							case CHSET_UTF16BE:
							case CHSET_UTF16LE:
								assert(gtm_utf8_mode);
								ZS_STR_OUT(&v, ichset_text);
								zshow_output(output, &chset_names[l->iod->ichset]);
								ZS_ONE_OUT(&v, space_text);
								break;
							default:
								GTMASSERT;
						}
						switch(l->iod->ochset)
						{
							case CHSET_M:
								if (gtm_utf8_mode)
								{
									ZS_STR_OUT(&v, ochset_text);
									zshow_output(output, &chset_names[l->iod->ochset]);
									ZS_ONE_OUT(&v, space_text);
								}
								break;
							case CHSET_UTF8:
								assert(gtm_utf8_mode);
								break;
							case CHSET_UTF16:
							case CHSET_UTF16BE:
							case CHSET_UTF16LE:
								assert(gtm_utf8_mode);
								ZS_STR_OUT(&v, ochset_text);
								zshow_output(output, &chset_names[l->iod->ochset]);
								ZS_ONE_OUT(&v, space_text);
								break;
							default:
								GTMASSERT;
						}
#ifdef __MVS__
						if (TAG_ASCII != l->iod->file_tag)
						{
							ZS_STR_OUT(&v, filetag_text);
							switch ((unsigned int)l->iod->file_tag)
							{
							case TAG_UNTAGGED:
								ZS_STR_OUT(&v, untagged_text);
								break;
							case TAG_EBCDIC:
								ZS_STR_OUT(&v, ebcdic_text);
								break;
							case TAG_BINARY:
								ZS_STR_OUT(&v, binary_text);
								break;
							default:
								if (-1 == __toCSName((__ccsid_t)l->iod->file_tag, csname))
								{ /* no name so output number */
									csptr = (char *)i2asc((uchar_ptr_t)csname,
										(unsigned int)l->iod->file_tag);
									*csptr = '\0';	/* terminate */
								}
								ZS_VAR_STR_OUT(&v, csname);
							}
							if (l->iod->text_flag)
								ZS_STR_OUT(&v, text_text);
							ZS_ONE_OUT(&v, space_text);
						}
						if (l->iod->file_chset != l->iod->process_chset &&
							(!(0 == l->iod->file_chset && CHSET_ASCII == l->iod->process_chset) &&
							 !(CHSET_ASCII == l->iod->file_chset && CHSET_M == l->iod->process_chset)))
						{	/* suppress default cases */
							ZS_STR_OUT(&v, processchset_text);
							zshow_output(output, &chset_names[l->iod->process_chset]);
							ZS_ONE_OUT(&v, space_text);
						}
#endif
						break;
					case gtmsocket:
						delim.addr = delim_mstr_buff;
						delim_len = 0;
						ZS_STR_OUT(&v, socket_text);
						dsocketptr = (d_socket_struct *)l->iod->dev_sp;
						ZS_ONE_OUT(&v, space_text);
						ZS_STR_OUT(&v, total_text);
						MV_FORCE_MVAL(&m, (int)dsocketptr->n_socket);
						mval_write(output, &m, FALSE);
						ZS_ONE_OUT(&v, space_text);
						ZS_STR_OUT(&v, current_text);
						MV_FORCE_MVAL(&m, (int)dsocketptr->current_socket);
						mval_write(output, &m, FALSE);
						ZS_ONE_OUT(&v, space_text);
						if (dsocketptr->mupintr)
							ZS_STR_OUT(&v, interrupt_text);
						output->flush = TRUE;
						zshow_output(output, 0);
						for(ii = 0; ii < dsocketptr->n_socket; ii++)
						{
							/* output each socket */
							socketptr = dsocketptr->socket[ii];
							ZS_STR_OUT(&v, space8_text);
							/* socket handle */
							ZS_STR_OUT(&v, socket_text);
							ZS_ONE_OUT(&v, lb_text);
							MV_FORCE_MVAL(&m, ii);
							mval_write(output, &m, FALSE);
							ZS_ONE_OUT(&v, rb_text);
							ZS_ONE_OUT(&v, equal_text);
							v.str.addr = socketptr->handle;
							v.str.len = socketptr->handle_len;
							zshow_output(output, &v.str);
							ZS_ONE_OUT(&v, space_text);
							/* socket descriptor */
							ZS_STR_OUT(&v, descriptor_text);
							MV_FORCE_MVAL(&m, socketptr->sd);
							mval_write(output, &m, FALSE);
							ZS_ONE_OUT(&v, space_text);
							/* socket state */
							ZS_STR_OUT(&v, zsh_socket_state[socketptr->state]);
							ZS_ONE_OUT(&v, space_text);
							/* socket IO mode */		switch(l->iod->ichset)
							{
								case CHSET_M:
									if (gtm_utf8_mode)
									{
										ZS_STR_OUT(&v, ichset_text);
										zshow_output(output, &chset_names[l->iod->ichset]);
										ZS_ONE_OUT(&v, space_text);
									}
									break;
								case CHSET_UTF8:
									assert(gtm_utf8_mode);
									break;
								case CHSET_UTF16:
								case CHSET_UTF16BE:
								case CHSET_UTF16LE:
									assert(gtm_utf8_mode);
									ZS_STR_OUT(&v, ichset_text);
									zshow_output(output, &chset_names[l->iod->ichset]);
									ZS_ONE_OUT(&v, space_text);
									break;
								default:
									GTMASSERT;
							}
							switch(l->iod->ochset)
							{
								case CHSET_M:
									if (gtm_utf8_mode)
									{
										ZS_STR_OUT(&v, ochset_text);
										zshow_output(output, &chset_names[l->iod->ochset]);
										ZS_ONE_OUT(&v, space_text);
									}
									break;
								case CHSET_UTF8:
									assert(gtm_utf8_mode);
									break;
								case CHSET_UTF16:
								case CHSET_UTF16BE:
								case CHSET_UTF16LE:
									assert(gtm_utf8_mode);
									ZS_STR_OUT(&v, ochset_text);
									zshow_output(output, &chset_names[l->iod->ochset]);
									ZS_ONE_OUT(&v, space_text);
									break;
								default:
									GTMASSERT;
							}
							/* socket type */
							if (socketptr->passive)
							{
								ZS_STR_OUT(&v, passive_text);
							} else
							{
								ZS_STR_OUT(&v, active_text);
							}
							ZS_ONE_OUT(&v, space_text);
							/* error trapping */
							if (socketptr->ioerror)
							{
								ZS_STR_OUT(&v, trap_text);
							} else
							{
								ZS_STR_OUT(&v, notrap_text);
							}
							ZS_ONE_OUT(&v, space_text);
							/* address + port */
							if (socketptr->passive)
							{
								ZS_STR_OUT(&v, port_text);
								tmpport = (int)socketptr->local.port;
								MV_FORCE_MVAL(&m, tmpport);
								mval_write(output, &m, FALSE);
							} else
							{
								ZS_STR_OUT(&v, remote_text);
								if (NULL != socketptr->remote.saddr_ip)
								{
									v.str.addr = socketptr->remote.saddr_ip;
									v.str.len = STRLEN(socketptr->remote.saddr_ip);
								} else
								{
									v.str.addr = "";
									v.str.len = 0;
								}
								zshow_output(output, &v.str);
								ZS_ONE_OUT(&v, at_text);
								tmpport = (int)socketptr->remote.port;
								MV_FORCE_MVAL(&m, tmpport);
								mval_write(output, &m, FALSE);
								ZS_ONE_OUT(&v, space_text);
								if (NULL != socketptr->local.saddr_ip)
								{
									ZS_STR_OUT(&v, local_text);
									v.str.addr = socketptr->local.saddr_ip;
									v.str.len = STRLEN(socketptr->local.saddr_ip);
									zshow_output(output, &v.str);
									ZS_ONE_OUT(&v, at_text);
									tmpport = (int)socketptr->local.port;
									MV_FORCE_MVAL(&m, tmpport);
									mval_write(output, &m, FALSE);
								}
							}
							ZS_ONE_OUT(&v, space_text);
							output->flush = TRUE;
							zshow_output(output, 0);
							ZS_STR_OUT(&v, space8_text);
							ZS_STR_OUT(&v, space8_text);
							/* zdelay */
							if (socketptr->nodelay)
							{
								ZS_STR_OUT(&v, znodelay_text);
							} else
							{
								ZS_STR_OUT(&v, zdelay_text);
							}
							ZS_ONE_OUT(&v, space_text);
							/* zbfsize */
							ZS_STR_OUT(&v, zbfsize_text);
							MV_FORCE_MVAL(&m, (int4)(socketptr->buffer_size));
							mval_write(output, &m, FALSE);
							ZS_ONE_OUT(&v, space_text);
							/* izbfsize */
							ZS_STR_OUT(&v, zibfsize_text);
							MV_FORCE_MVAL(&m, socketptr->bufsiz);
							mval_write(output, &m, FALSE);
							ZS_ONE_OUT(&v, space_text);
							/* delimiters */
							if (socketptr->n_delimiter > 0)
							{
								output->flush = TRUE;
								zshow_output(output, 0);
								ZS_STR_OUT(&v, space8_text);
								ZS_STR_OUT(&v, space8_text);
								ZS_STR_OUT(&v, delimiter_text);
								for (jj = 0; jj < socketptr->n_delimiter; jj++)
								{
									delim_len_sm = socketptr->delimiter[jj].len;
									memcpy(delim_buff_sm,
									       socketptr->delimiter[jj].addr, delim_len_sm);
									format2zwr(delim_buff_sm, delim_len_sm,
										   (uchar_ptr_t)delim.addr, &delim_len);
									delim.len = (unsigned short)delim_len;
									assert(SIZEOF(delim_mstr_buff) >= delim_len);
									zshow_output(output, &delim);
									ZS_ONE_OUT(&v, space_text);
								}
							} else
							{
								ZS_STR_OUT(&v, nodelimiter_text);
							}
							/* readmoretime */
							if (DEFAULT_MOREREAD_TIMEOUT != socketptr->moreread_timeout)
							{
								ZS_STR_OUT(&v, morereadtime_text);
								MV_FORCE_MVAL(&m, (int)socketptr->moreread_timeout);
								mval_write(output, &m, FALSE);
							}
							output->flush = TRUE;
							zshow_output(output, 0);
						}
					default:
						v.str.len = 0;
						break;
				}
				if (l->iod->error_handler.len)
				{
					ZS_PARM_EQU(&v, zshow_exce);
					ZS_ONE_OUT(&v, quote_text);
					v.str = l->iod->error_handler;
					zshow_output(output, &v.str);
					output->flush = TRUE;
					ZS_ONE_OUT(&v, quote_text);
				} else
				{	output->flush = TRUE;
					zshow_output(output, 0);
				}
			} else
			{	output->flush = TRUE;
				ZS_STR_OUT(&v, devcl);
			}
		}
	}
}