Example #1
0
/*
PROGRAM =	iijobdef
**
NEEDLIBS =	UTILLIB MALLOCLIB COMPATLIB GLLIB
**
UNDEFS =	II_copyright
**
DEST =		utility
*/

# endif /* VMS */
main( i4  argc, char **argv)
{
# ifdef VMS
	char *host;
	i4 i;
	PM_SCAN_REC state;
	STATUS status;
	char *lnm_table_name;
	struct dsc$descriptor lnm_table;
	char *regexp;
	char *name, *value;
	PM_CONTEXT *config;
	struct dsc$descriptor lnm_name;
	ILE3 item_list[ 2 ];
	long access_mode = PSL$C_SUPER;

	bool failed_once = FALSE;		/* lib$set_logical works? */
	const match_1 = LIB$_NOCLI;		/* Process has no CLI. */
	const match_2 = LIB$_UNECLIERR;		/* Unexpected CLI error
						 * (non-standard CLI?).
						 */
	const match_3 = SS$_NORMAL;		/* Normal return. */
	const match_4 = SS$_SUPERSEDE;		/* Replaced old value. */
	const match_5 = SS$_NOLOGNAM;		/* Not currently defined. */

	bool delete_logs = FALSE;		/* What are we doing? */
	char *act_str;				/* String for action. */
	char *err_str;				/* String for error exit. */
	char *log_str;				/* String to log action. */
        char tmp_buf[BIG_ENOUGH];

	MEadvise( ME_INGRES_ALLOC );

	if( argc != 1 )
		delete_logs = TRUE;

	(void) PMmInit( &config );

	if( PMmLoad( config, NULL, PMerror ) != OK )
		PCexit( FAIL );

	host = PMmHost( config );

	PMmSetDefault( config, HOST_PM_IDX, host );

	/* get logical table name */ 

	STprintf (tmp_buf , ERx( "%s.$.lnm.table.id" ), SystemCfgPrefix);

	if( PMmGet( config, tmp_buf , &lnm_table_name )
		!= OK )
	{
		F_ERROR( "%s not found.", PMmExpandRequest( config,
			tmp_buf ) );
	}

	/* set logical name table */
	lnm_table_name = ERx( "LNM$JOB" );

	/* compose string descriptor for logical table name */
	lnm_table.dsc$w_length = STlength( lnm_table_name );
	lnm_table.dsc$a_pointer = lnm_table_name; 
	lnm_table.dsc$b_class = DSC$K_CLASS_S;
	lnm_table.dsc$b_dtype = DSC$K_DTYPE_T;

	if ( delete_logs ) {
	    act_str =  ERx( "\nDeleting %s logicals...\n\n(%s)\n\n" );
	    err_str = ERx( "Unable to deassign %s.\n\n" );
	    log_str = ERx( "" );
	} else {
	    act_str = ERx( "\nDeleting %s logicals...\n\n(%s)\n\n" );
	    err_str = ERx( "Unable to set %s to \"%s\".\n\n" );
	    log_str = ERx( "\"%s\" = \"%s\"\n" );
	}

	F_PRINT2( act_str, SystemDBMSName, lnm_table_name );

	/* scan and set node-specific logicals */

	regexp = PMmExpToRegExp( config, ERx( "ii.$.lnm.%") );
	for(
		status = PMmScan( config, regexp, &state, NULL, &name,
		&value ); status == OK; status = PMmScan( config,
		NULL, &state, NULL, &name, &value ) )
	{
		name = PMmGetElem( config, 3, name );

		lnm_name.dsc$w_length = STlength( name );
		lnm_name.dsc$a_pointer = name;
		lnm_name.dsc$b_class = DSC$K_CLASS_S;
		lnm_name.dsc$b_dtype = DSC$K_DTYPE_T;

		item_list[ 0 ].ile3$w_length = STlength( value );
		item_list[ 0 ].ile3$w_code = LNM$_STRING; 
		item_list[ 0 ].ile3$ps_bufaddr = value; 
		item_list[ 0 ].ile3$ps_retlen_addr = NULL; 
		item_list[ 1 ].ile3$w_length = 0;
		item_list[ 1 ].ile3$w_code = 0;

		if ( !failed_once ) {
		    if ( delete_logs )
			status = lib$delete_logical( &lnm_name, &lnm_table );
		    else
			status = lib$set_logical( &lnm_name, NULL, &lnm_table,
						 NULL, item_list );
		    if ( lib$match_cond( &status, &match_1, &match_2 ))
			failed_once = TRUE;
		}
		if ( failed_once ) {
		    if ( delete_logs )
			status = sys$dellnm( &lnm_table, &lnm_name,
					    &access_mode );
		    else
			status = sys$crelnm( NULL, &lnm_table, &lnm_name,
					    &access_mode, item_list );
		}

		if ( !lib$match_cond( &status, &match_3, &match_4, &match_5 ))
		{
			SIfprintf( stderr, err_str, name, value );
			PCexit( FAIL );
		}

		SIprintf( log_str, name, value );
	}

	PCexit( OK );
# else /* VMS */
	SIprintf( "\nThis doesn't do much.\n\n" );
# endif /* VMS */
}
Example #2
0
main()
{
    struct FAB	fab;
    header_struct	*header;
    gd_addr		*addr, *addr1, *addr2, *addr3;
    gd_region	*region;
    gd_segment	*segment;
    int4		*long_ptr, ret_addr;
    short		iosb[4];
    mval		v;
    char		file_name1[] = "dtgbld01.gld", file_name2[] = "dtgbld02.gld", file_name3[] = "dtgbld03.gld";
    char		label[] = GDE_LABEL_LITERAL;
    char		file_name4[]="dtlog1";
    uint4		status, size;
    $DESCRIPTOR(proc_tab, "LNM$PROCESS");
    $DESCRIPTOR(gbldir, "GTM$GBLDIR");
    $DESCRIPTOR(dtlog, "DTLOG1");
    typedef struct
    {   short	buf_len;
        short	item;
        int4	buf_addr;
        int4	ret_addr;
        int4	term;
    } item_list;
    item_list	ilist;
    char		acmo=PSL$C_USER;

    /************************* Create logical names for tests **********************************************************/
    ilist.item = LNM$_STRING;
    ilist.buf_len = SIZEOF(file_name1) - 1;
    ilist.buf_addr = file_name1;
    ilist.term = 0;
    ilist.ret_addr = &ret_addr;
    status = sys$crelnm(0, &proc_tab, &gbldir, &acmo, &ilist);
    if (!(status & 1))
        rts_error(VARLSTCNT(1) status);
    ilist.buf_len = SIZEOF(file_name2) - 1;
    ilist.buf_addr = file_name2;
    status = sys$crelnm(0, &proc_tab, &dtlog, &acmo, &ilist);
    if (!(status & 1))
        rts_error(VARLSTCNT(1) status);

    /************************* Create global directory files for tests *************************************************/
    fab = cc$rms_fab;
    fab.fab$l_alq = 5;
    fab.fab$l_fna = file_name1;
    fab.fab$b_fns = SIZEOF(file_name1) - 1;
    fab.fab$l_fop = (FAB$M_UFO | FAB$M_CBT);
    fab.fab$b_fac = (FAB$M_PUT | FAB$M_GET | FAB$M_BIO);
    fab.fab$b_shr = (FAB$M_SHRPUT | FAB$M_SHRGET | FAB$M_UPI);
    status = sys$create(&fab);
    if (status != RMS$_CREATED && status != RMS$_FILEPURGED && status != RMS$_NORMAL)
        sys$exit(status);
    size = SIZEOF(header_struct) + SIZEOF(gd_addr) + 3 * SIZEOF(gd_binding) + SIZEOF(gd_region) + SIZEOF(gd_segment);
    header = malloc(((size  + 511) / 512) * 512);
    header->filesize = size;
    size = ((size + 511) / 512) * 512;
    memcpy(header->label, label, SIZEOF(label)-1);
    addr = (char*)header + SIZEOF(header_struct);
    addr->maps = SIZEOF(gd_addr);
    addr->n_maps = 3;
    addr->regions = (int4)(addr->maps) + 3 * SIZEOF(gd_binding);
    addr->n_regions = 1;
    addr->segments = (int4)(addr->regions) + SIZEOF(gd_region);
    addr->n_segments = 1;
    addr->link = addr->tab_ptr = addr->id = addr->local_locks = 0;
    addr->max_rec_size = 100;
    addr->end = addr->segments + SIZEOF(gd_segment);
    long_ptr = (char*)addr + (int4)(addr->maps);
    *long_ptr++ = 0xFFFF2F23;
    *long_ptr++ = 0xFFFFFFFF;
    *long_ptr++ = addr->regions;
    *long_ptr++ = 0xFFFFFF24;
    *long_ptr++ = 0xFFFFFFFF;
    *long_ptr++ = addr->regions;
    *long_ptr++ = 0xFFFFFFFF;
    *long_ptr++ = 0xFFFFFFFF;
    *long_ptr++ = addr->regions;
    region = (char*)addr + (int4)(addr->regions);
    segment = (char*)addr + (int4)(addr->segments);
    memset(region, 0, SIZEOF(gd_region));
    region->rname_len = 5;
    memcpy(region->rname,"TEMP1",5);
    region->dyn.offset = addr->segments;
    region->max_rec_size = 100;
    region->max_key_size = 64;
    segment->sname_len = 5;
    memcpy(segment->sname, "TEMP1", 5);
    memcpy(segment->fname, "MUMPS1.DAT", 10);
    segment->fname_len = 10;
    segment->blk_size = 2 * DISK_BLOCK_SIZE;
    segment->allocation = 100;
    segment->ext_blk_count = 100;
    segment->cm_blk = 0;
    segment->lock_space = 20;
    memcpy(segment->defext, ".DAT", 4);
    segment->global_buffers = 64;
    segment->buckets = 0;
    segment->windows = 0;
    segment->acc_meth = dba_bg;
    segment->defer_time = 0;
    segment->file_cntl = 0;
    status = sys$qiow(EFN$C_ENF, fab.fab$l_stv, IO$_WRITEVBLK, &iosb[0], 0, 0, header, size, 1, 0, 0, 0);
    if (!(status & 1))
        rts_error(VARLSTCNT(1) status);
    if (!(iosb[0] & 1))
        rts_error(VARLSTCNT(1) status);
    sys$dassgn(fab.fab$l_stv);
    region->rname_len = 5;
    memcpy(region->rname,"TEMP2",5);
    segment->sname_len = 5;
    memcpy(segment->sname,"TEMP2",5);
    memcpy(segment->fname,"MUMPS2.DAT",10);
    segment->fname_len = 10;
    fab.fab$l_fna = file_name2;
    fab.fab$b_fns = SIZEOF(file_name3) - 1;
    status = sys$create(&fab);
    if (status != RMS$_CREATED && status != RMS$_FILEPURGED && status != RMS$_NORMAL)
        sys$exit(status);
    status = sys$qiow(EFN$C_ENF, fab.fab$l_stv, IO$_WRITEVBLK, &iosb[0], 0, 0, header, size, 1, 0, 0, 0);
    if (!(status & 1))
        rts_error(VARLSTCNT(1) status);
    if (!(iosb[0] & 1))
        rts_error(VARLSTCNT(1) status);
    sys$dassgn(fab.fab$l_stv);
    region->rname_len = 5;
    memcpy(region->rname, "TEMP3", 5);
    segment->sname_len = 5;
    memcpy(segment->sname, "TEMP3", 5);
    memcpy(segment->fname, "MUMPS3.DAT", 10);
    segment->fname_len = 10;
    fab.fab$l_fna = file_name3;
    fab.fab$b_fns = SIZEOF(file_name3) - 1;
    status = sys$create(&fab);
    if (status != RMS$_CREATED && status != RMS$_FILEPURGED && status != RMS$_NORMAL)
        sys$exit(status);
    status = sys$qiow(EFN$C_ENF, fab.fab$l_stv, IO$_WRITEVBLK, &iosb[0], 0, 0, header, size, 1, 0, 0, 0);
    if (!(status & 1))
        rts_error(VARLSTCNT(1) status);
    if (!(iosb[0] & 1))
        rts_error(VARLSTCNT(1) status);
    sys$dassgn(fab.fab$l_stv);

    /*************************** Run tests********************************************/
    v.str.len = SIZEOF(file_name1) - 1;
    v.str.addr = file_name1;
    PRINTF("Open first global directory:  dtgbld01.gld\n");
    addr1 = zgbldir(&v);
    PRINTF("Region name is %s, expected TEMP1\n", addr1->regions->rname);
    PRINTF("Segment name is %s, expected TEMP1\n", addr1->regions->dyn.addr->sname);
    PRINTF("File name is %s, expected MUMPS1.DAT\n", addr1->regions->dyn.addr->fname);
    v.str.len = SIZEOF(file_name2) - 1;
    v.str.addr = file_name2;
    PRINTF("Open second global directory:  dtgbld02.gld\n");
    addr2 = zgbldir(&v);
    PRINTF("Region name is %s, expected TEMP2\n", addr2->regions->rname);
    PRINTF("Segment name is %s, expected TEMP2\n", addr2->regions->dyn.addr->sname);
    PRINTF("File name is %s, expected MUMPS2.DAT\n", addr2->regions->dyn.addr->fname);
    v.str.len = SIZEOF(file_name3) - 1;
    v.str.addr = file_name3;
    PRINTF("Open third global directory:  dtgbld03.gld\n");
    addr3 = zgbldir(&v);
    PRINTF("Region name is %s, expected TEMP3\n", addr3->regions->rname);
    PRINTF("Segment name is %s, expected TEMP3\n", addr3->regions->dyn.addr->sname);
    PRINTF("File name is %s, expected MUMPS3.DAT\n", addr3->regions->dyn.addr->fname);
    PRINTF("Open null string global directory:  dtgbld01.gld\n");
    v.str.len = 0;
    addr = zgbldir(&v);
    if (addr != addr1)
        PRINTF("Expected pointer to previous struct, got new structure\n");
    else
        PRINTF("Got same pointer as expected.\n");
    PRINTF("Open dtlog1 global directory:  dtgbld02.gld\n");
    v.str.len = SIZEOF(file_name4) - 1;
    v.str.addr = file_name4;
    addr = zgbldir(&v);
    if (addr != addr2)
        PRINTF("Expected pointer to previous struct, got new structure\n");
    else
        PRINTF("Got same pointer as expected.\n");
    v.str.len = SIZEOF(file_name3) - 1;
    v.str.addr = file_name3;
    PRINTF("Reopen third global directory:  dtgbld03.gld\n");
    addr = zgbldir(&v);
    if (addr != addr3)
        PRINTF("Expected pointer to previous struct, got new structure\n");
    else
        PRINTF("Got same pointer as expected.\n");
    return;
}
Example #3
0
int
osPutEnv(String eqn)
{
	unsigned long int status;
	String  end_buffer;
	static unsigned long int lnm_attr;
	static String equiv_buffer;	          /* xlation of logical name */
	struct dsc$descriptor_s lognam;	          /* logical name */
	$DESCRIPTOR(tabnam, "LNM$PROCESS_TABLE"); /* logical name table */

	struct item_list_3 itmlst[] = {
		{sizeof lnm_attr, LNM$_ATTRIBUTES, (String) & lnm_attr, 0},
		{0, LNM$_STRING, 0, 0},
		{0, 0, 0, 0}
	};

	for (equiv_buffer = eqn;
		*equiv_buffer && *equiv_buffer != '=';
		equiv_buffer++);

	for (end_buffer = ++equiv_buffer; *end_buffer; end_buffer++);

	lognam.dsc$a_pointer = eqn;		/* logical name string */
	lognam.dsc$w_length = (equiv_buffer - eqn) - 1;	/* string length */
	lognam.dsc$b_class = DSC$K_CLASS_S;	/* string descriptor */
	lognam.dsc$b_dtype = DSC$K_DTYPE_T;	/* ASCII string */

	lnm_attr = 0;		/* use default attributes */
	/* LNM$M_CONCEALED|LNM$M_TERMINAL */

	itmlst[1].buffer_address = equiv_buffer;
	itmlst[1].buffer_length = end_buffer - equiv_buffer;

	/*
	 * A little explanation is required here. The system service routine
	 * $CRELNM creates a new logical name and assigns it a value and
	 * miscellaneous properties. Among the properties is the access mode,
	 * which specifies whether the logical name has USER, SUPERVISOR,
	 * EXECUTIVE, or KERNEL mode. Unfortunately, it cannot define a
	 * logical name with an access mode higher than that of the process
	 * it is running in, and for USER mode processes this means that the
	 * logical name can only be defined with USER mode. This, in turn,
	 * means that the logical name will vanish when the image exits. To
	 * cirumvent this, we may use the RTL routine LIB$SET_LOGICAL, which
	 * requests the shell under which the process is running to define
	 * the logical name for it at SUPERVISOR access mode, which survives
	 * the exit of the current image.
	 */

#ifdef SUPERVISOR_LNM
	status = lib$set_logical(
		&lognam,	/* LNM to be defined */
		NULL,		/* value (specified in itmlst) */
		&tabnam,	/* LNM table to contain new name */
		NULL,		/* attr: default attributes */
		&itmlst);	/* what to do */
#else /* SUPERVISOR_LNM */
	status = sys$crelnm(
		NULL,		/* attr: default attributes */
		&tabnam,	/* LNM table to contain new name */
		&lognam,	/* LNM to be defined */
		NULL,		/* acmode: access mode of LNM */
		&itmlst);	/* what to do */
#endif /* SUPERVISOR_LNM */

	if (!(status & 1))
		lib$signal(status, NULL);	/* report unexpected errors */

	return (status & 1) ? 0 : -1;	/* UNIX-like return code */
}