nagy%warner.hepnet@LBL.GOV (Frank J. Nagy, VAX Wizard & Guru) (04/19/88)
Apologies to everyone, I left the .H files out of my recent mailing with CLUSTERNODES.C. We have a number of include files which extend the standard VAX .H files or provide definitions the standard files do not. These are kept in a text library and I have a logical set to automatically search that library when I do a CC (thus treating our local extensions like VAXCDEF.TLB). It always gets me into trouble when I send packages out. So, here is a new VMS_SHAR of Clusternodes.c and the extra .H files it needs. The .C file has had its #include statements modified. = Frank J. Nagy "VAX Guru & Wizard" = Fermilab Research Division EED/Controls = HEPNET: WARNER::NAGY (43198::NAGY) or FNAL::NAGY (43009::NAGY) = BitNet: NAGY@FNAL = USnail: Fermilab POB 500 MS/220 Batavia, IL 60510 ...................... Cut between dotted lines and save ...................... $!.............................................................................. $! VAX/VMS archive file created by VMS_SHAR V-5.01 01-Oct-1987 $! which was written by Michael Bednarek (U3369429@ucsvc.dn.mu.oz.au) $! To unpack, simply save and execute (@) this file. $! $! This archive was created by NAGY $! on Tuesday 19-APR-1988 10:46:45.37 $! $! It contains the following 4 files: $! CLUSTERNODES.C DESCRIP2.H LIBCLIDEF.H VAXTYPES.H $!============================================================================== $ Set Symbol/Scope=(NoLocal,NoGlobal) $ Version=F$GetSYI("VERSION") ! See what VMS version we have here: $ If Version.ges."V4.4" then goto Version_OK $ Write SYS$Output "Sorry, you are running VMS ",Version, - ", but this procedure requires V4.4 or higher." $ Exit 44 $Version_OK: CR[0,8]=13 $ Pass_or_Failed="failed!,passed." $ Goto Start $Convert_File: $ Read/Time_Out=0/Error=No_Error1/Prompt="creating ''File_is'" SYS$Command ddd $No_Error1: Define/User_Mode SYS$Output NL: $ Edit/TPU/NoSection/NoDisplay/Command=SYS$Input/Output='File_is' - VMS_SHAR_DUMMY.DUMMY f:=Get_Info(Command_Line,"File_Name");b:=Create_Buffer("",f); o:=Get_Info(Command_Line,"Output_File");Set(Output_File,b,o); Position(Beginning_of(b));Loop x:=Erase_Character(1);Loop ExitIf x<>"V"; Move_Vertical(1);x:=Erase_Character(1);Append_Line; Move_Horizontal(-Current_Offset);EndLoop;Move_Vertical(1); ExitIf Mark(None)=End_of(b) EndLoop;Position(Beginning_of(b));Loop x:=Search("`",Forward,Exact);ExitIf x=0;Position(x);Erase_Character(1); If Current_Character='`' then Move_Horizontal(1);else Copy_Text(ASCII(INT(Erase_Character(3))));EndIf;EndLoop;Exit; $ Delete VMS_SHAR_DUMMY.DUMMY;* $ Checksum 'File_is $ Success=F$Element(Check_Sum_is.eq.CHECKSUM$CHECKSUM,",",Pass_or_Failed)+CR $ Read/Time_Out=0/Error=No_Error2/Prompt=" CHECKSUM ''Success'" SYS$Command ddd $No_Error2: Return $Start: $ File_is="CLUSTERNODES.C" $ Check_Sum_is=637932950 $ Copy SYS$Input VMS_SHAR_DUMMY.DUMMY X#module ClusterNodes "V1.0" X X/* X ********************************************************************** X ********************************************************************** X ****`009`009`009`009`009`009`009`009 **** X ****`009`009`009`009`009`009`009`009 **** X ****`009 `009EPICURE Beamline Control System`009`009`009 **** X ****`009`009Copyright (c) Fermilab, 1987`009`009`009 **** X ****`009`009`009`009`009`009`009`009 **** X **** `009Get list of VAXCluster nodes for DCL`009 **** X ****`009`009`009`009`009`009`009`009 **** X ****`009`009`009`009`009`009`009`009 **** X ********************************************************************** X ********************************************************************** X X Functional Description: X This program supplements the DCL lexical function F$GETSYI by X returning a list of the node names in the VAXCluster in a DCL X local symbol. X X Environment: X General purpose VMS utility. X X Published Information: X None X X Change Requests: X ============================================================================= X Author: Frank J. Nagy`009`009Fermilab Research Division EED/Controls X Modification History: X X V1.0`00901-May-87 FJN`009Created for MULTISUBMIT.COM to allow removal of the X`009`009`009built-in VAXCluster node name list. X`00919-Apr-88 FJN`009Modified for Info-VAX distribution to include local X`009`009`009.H files as files (not from LCLCDEF.TLB) X*/ X X/****************** X * Include Files: * X ******************/ X#include "vaxtypes.h"`009`009`009/* VAX C Type extensions */ X#include descrip`009`009`009/* VAX Descriptors */ X#include "descrip2.h"`009`009`009/* Additional descriptor defs. */ X#include ssdef`009`009`009`009/* System status codes */ X#include syidef`009`009`009/* System information codes */ X#include "libclidef.h"`009`009`009/* CLI callback definitions */ X X/********************************* X * Global definitions and types: * X *********************************/ Xglobalvalue LIB$_INSVIRMEM;`009`009/* Insufficient virtual memory */ X X/******************************** X * Local definitions and types: * X ********************************/ Xtypedef unsigned long status;`009`009/* Condition code status type */ X X#define`009NODENAME_LEN`00916`009`009/* Length of node name string */ X#define`009MAX_NODES`009256`009`009/* Maximum # of nodes in VAXCluster */ X X/*********************** X * Global Own Storage: * X ***********************/ X X/***************************** X * Module Local Own Storage: * X *****************************/ Xstatic char nodes[MAX_NODES][NODENAME_LEN]; /* Storage for node names */ Xstatic int number_of_nodes;`009`009/* Number of nodes in VAXCluster */ X Xstatic long csid = -1;`009`009`009/* Cluster system id, wildcard */ Xstatic unsigned short returned;`009`009/* Length of returned string */ Xstatic $DESCRIPTOR0( d_proto);`009`009/* Descriptor for node string */ X Xstatic readonly $DESCRIPTOR( d_symbol, "CLUSTER_NODES"); Xstatic readonly $DESCRIPTOR( d_null, ""); X Xstatic struct {`009`009`009`009/* Item list for $GETSYI */ X unsigned short buflen;`009`009/* Buffer length */ X unsigned short itemcode;`009`009/* Item code */ X char *buffer;`009`009`009/* Pointer to return buffer */ X unsigned short *retlen;`009`009/* Pointer to return length */ X int listterm;`009`009`009/* List terminator */ X } items = { NODENAME_LEN, SYI$_NODENAME, NULL, &returned, 0 }; Xstatic status iosb[2];`009`009`009/* $GETSYI I/O status block */ X X/********************************************** X * Global Procedure and Function definitions: * X **********************************************/ Xextern status lib$getsyi();`009`009/* Get system information */ Xextern status sys$getsyiw();`009`009/* .. ditto .. */ Xextern void lib$signal();`009`009/* Signal error */ X Xextern void exit();`009`009`009/* Program exit */ Xextern int strlen();`009`009`009/* Length of NUL-terminated string */ Xextern void strcat();`009`009`009/* String concatenation routine */ Xextern char *malloc();`009`009`009/* Memory allocator */ X X`012 X/* Main Program X This program is executed by a RUN command. It uses a wildcard $GETSYI X to gather the node names of the current members of the VAXCluster. These X are then returned in the local DCL symbol CLUSTER_NODES as a list of X names separated by commas. X X If the current system is not a VAXCluster member, CLUSTER_NODES is set X to the null string. X*/ X Xmain( ) X{ Xregister status sts; Xregister int nnn;`009`009`009/* Node name number */ X X/* X First, a quick check that we are part of a VAXCluster. X*/ Xsts = lib$getsyi( &SYI$_CLUSTER_MEMBER, &csid); XSIGNAL_FAILURE( sts); X Xif ($VMS_FAILURE( csid)) X { X /* X Not part of a VAXCluster, set symbol CLUSTER_NODES to null string and X exit prematurely. X */ X sts = lib$set_symbol( &d_symbol, &d_null, &LIB$K_CLI_LOCAL_SYM); X SIGNAL_FAILURE( sts); X X exit(); X } X X/* X Now get the number of nodes in the VAXCluster (used later). X*/ Xsts = lib$getsyi( &SYI$_CLUSTER_NODES, &number_of_nodes); XSIGNAL_FAILURE( sts); X X/* X Now do wildcard node name look up with $GETSYI and build table of node X names. X*/ X Xitems.buffer = nodes[0];`009`009 /* Initialize buffer pointer */ X Xfor (csid = -1, nnn = 0;;)`009`009 /* Wildcard node scan */ X { X sts = sys$getsyiw( 1, &csid, 0, &items, &iosb, 0, 0); X if ($VMS_SUCCESS( sts)) X`009sts = iosb[0];`009`009`009 /* Use IOSB status */ X if ($VMS_SUCCESS( sts)) X`009{ X`009nodes[nnn][returned] = '\0';`009 /* Add NUL terminator */ X`009items.buffer = nodes[++nnn]; X`009} X else if (sts == SS$_NOMORENODE) X`009break; X else X`009lib$signal( sts); X } X X/* X Get some memory to build the list of node names (separated by commas) X for the DCL symbol value. X*/ Xif ((d_proto.dsc$a_pointer = malloc( number_of_nodes*NODENAME_LEN)) == NULL) X lib$signal( LIB$_INSVIRMEM); X*d_proto.dsc$a_pointer = '\0';`009`009/* Init to empty string */ X Xfor (nnn = 0; nnn < number_of_nodes; nnn++) X { X if (nnn > 0) X`009strcat( d_proto.dsc$a_pointer, ",");`009/* Add "," to previous... */ X X strcat( d_proto.dsc$a_pointer, nodes[nnn]); X } X Xd_proto.dsc$w_length = strlen( d_proto.dsc$a_pointer); X X/* X Set the DCL symbol and exit out end... X*/ Xsts = lib$set_symbol( &d_symbol, &d_proto, &LIB$K_CLI_LOCAL_SYM); XSIGNAL_FAILURE( sts); X X} $ GoSub Convert_File $ File_is="DESCRIP2.H" $ Check_Sum_is=2031178614 $ Copy SYS$Input VMS_SHAR_DUMMY.DUMMY X/*+ DESCRIP2 X Module (DESCRIP2) of SYS$LIBRARY:LCLCDEF.TLB and file DESCRIP2.H. X X This module defines some additions to the standard VAX-11 C include X module (DESCRIP) found in SYS$LIBRARY:CSYSDEF.TLB. X X The following macros are defined: X X $DESCRIPTOR0(name) empty string descriptor (length and X pointer fields initialzed to 0). X X $DESCRIPTOR1(name,string) string descriptor for 1 character X or a whole structure. X X $DESCRIPTORM(name,string) string descriptor for structure X member or non-NUL terminated strings. X X $DESCRIPTORA(name,array,type) array descriptor. X X $LENGTH(descriptor) length field of descriptor. X $POINTER(descriptor) pointer field of descriptor. X-*/ X/* X V1.0`00916-May-83`009FJN`009Created X*/ X X/*`009DESCRIP2 - Extended VMS Descriptor Definitions `009*/ X X/* Invoke standard descriptor definitions if not already done so */ X X#ifndef $DESCRIPTOR X#include descrip X#endif X X/* `009simple macro to construct an empty string descriptor `009*/ X X#define $DESCRIPTOR0(name) \ X`009struct dsc$descriptor_s name = { 0, DSC$K_DTYPE_T, DSC$K_CLASS_S, 0 } X X/* `009simple macro to construct string descriptor for single X`009characters or for complete structures:`009`009`009*/ X X#define $DESCRIPTOR1(name,string) \ V`009struct dsc$descriptor_s name = { sizeof(string), DSC$K_DTYPE_T, DSC$K_CLASS X_S, &string } X X/* `009macro to construct string descriptor for structure X`009members or non-NUL terminated strings:`009`009`009*/ X X#define $DESCRIPTORM(name,string) \ V`009struct dsc$descriptor_s name = { sizeof(string), DSC$K_DTYPE_T, DSC$K_CLASS X_S, string } X X/* `009macro to construct array desciptors:`009`009`009*/ X X#define $DESCRIPTORA(name,array,type) \ V`009struct dsc$descriptor_a name = { sizeof(type), DSC$K_DTYPE_L, DSC$K_CLASS_A X, array, 0, 0, \ X`009`009`009`009`009{ 0, 0, 0, 0, 0 }, 1, sizeof(array) } X X/*`009macros to reference the length or pointer fields of X`009descriptors`009`009`009`009`009`009*/ X X#define $LENGTH(descriptor) descriptor.dsc$w_length X#define $POINTER(descriptor) descriptor.dsc$a_pointer X X/* X End of DESCRIP2 module X*/ $ GoSub Convert_File $ File_is="LIBCLIDEF.H" $ Check_Sum_is=1165506887 $ Copy SYS$Input VMS_SHAR_DUMMY.DUMMY X/*+ LIBCLIDEF X Definitions for LIB$ CLI callback procedures X*/ X/* Extracted from V4.4 SYS$LIBRARY:STARLET.REQ on 10-Jun-1986 */ X/* Added SPAWN definitions from V4.4 SYS$LIBRARY:STARLET.REQ on 05-Jan-1987 */ X#define LIB$K_CLI_LOCAL_SYM`0091 X#define LIB$K_CLI_GLOBAL_SYM`0092 X#define LIB$M_CLI_CTRLT`009`0090X100000 X#define LIB$M_CLI_CTRLY`009`0090X02000000 X/* X Define the constants used for LIB$SPAWN X*/ X#define CLI$M_NOWAIT`009`0090X1 X#define CLI$M_NOCLISYM`009`0090X2 X#define CLI$M_NOLOGNAM`009`0090X4 X#define CLI$M_NOKEYPAD`009`0090X8 X#define CLI$M_NOTIFY`009`0090X10 X#define CLI$M_NOCONTROL`009`0090X20 $ GoSub Convert_File $ File_is="VAXTYPES.H" $ Check_Sum_is=1611877955 $ Copy SYS$Input VMS_SHAR_DUMMY.DUMMY X/*+ VAXTYPES X Module (VAXTYPES) of FERMI$LIB:LCLCDEF.TLB and file VAXTYPES.H. X X This module defines some data types, constants and macros for use X with VAX C under VAX/VMS. Note that using these definitions X renders the program "non-portable". The "vaxtypes" symbol is X defined by this module and can be used to eliminate additional X calls in other #include modules by: X X #ifndef vaxtypes X #include vaxtypes X #endif X X2 Constants X Defined constants for general VAX C usage: X X TRUE conditional true value (1) X FALSE conditional false value (0) X EOF End-of-file flag (for standard I/O) X NULL Undefined pointer value (0) X X MAX_... Maximum value for several data types: X int,ulong,short,uword,char,ubyte X MIN_... Minimum value for several data types which X may take on negative values: X int,short,char X X2 Types X Additional types (or structures) for use with VAX C X X byte / ubyte signed / unsigned 8-bit byte X word / uword signed / unsigned 16-bit word X long / ulong signed / unsigned 32-bit longword X quad / uquad signed / unsigned 64-bit quadword X octa / uocta signed / unsigned 128-bit octaword X X address general address (pointer to byte or char) X queue structure defining a queue header or the queue links X (fields flink and blink). X vmstime VMS-returned system time type (long array of [2]). X X For simplicity, [u]quad, [u]octa and vmstime are defined as X arrays of long's (or unsigned long's). See also $bit, $[u]field X under the "Macros" subtopic. X2 Macros X Macros defined for use with VAX C under VMS X X $VMS_SUCCESS(code) TRUE if the status code has a severity code of X success or informational (success indication). X $VMS_FAILURE(code) TRUE if the status code has a severity code of X warning, error or severe (error indication). X SIGNAL_FAILURE(code) if code has an error indication severity, then X call LIB$SIGNAL to signal the error. X ABORT_ON_FAILURE(code) if code has an error indication severity, then X call LIB$STOP to signal the error and abort. X RETURN_ON_FAILURE(code) if code has an error indication severity, then X exit the routine returning the status code (use X only in routines which return VMS status). X X $bit(name) defines a single bit in a struct (unsigned) X $field(name,size) defines a bit field of "size" bits in a struct X $ufield(name,size) same as $field but for an unsigned field X $align`009`009align to next byte field in struct X $unused(size) unused field of "size" bits X-*/ X/* X V1.0`00908-Feb-83 FJN`009Created X V2.0`00909-Feb-83 FJN`009Corrected and expanded X V3.0`00922-Feb-83 FJN`009Changed names to be similar to VAX PASCAL V2 X V3.1`00917-Apr-83 FJN`009Added $VMS... macros X V3.2`00922-Jul-83 FJN`009Dropped $ from byte/ubyte, etc. types X V3.3`00919-Sep-83 FJN`009Added macros $unused, SIGNAL_FAILURE, and X`009`009`009ABORT_ON_FAILURE X V3.4`00901-Aug-85 FJN`009Added RETURN_ON_FAILURE X V3.5`00919-Jan-87 FJN`009Converted to lowercase lib$signal and lib$stop X*/ X X#ifndef`009vaxtypes X#define`009vaxtypes 1`009/* To invoke this procedure only once! */ X Xtypedef`009char`009`009*address;`009/* General address */ X Xtypedef char`009byte;`009`009`009/* 8-bit signed byte */ Xtypedef short`009word;`009`009`009/* 16-bit signed word */ X/* typedef long`009long; */`009`009/* 32-bit signed longword (already X`009`009`009`009`009 defined by VAX C */ Xtypedef long`009quad[2];`009`009/* 64-bit signed quadword */ Xtypedef long`009octa[4];`009`009/* 128-bit signed octaword */ X Xtypedef`009unsigned char`009ubyte;`009`009/* 8-bit unsigned byte */ Xtypedef`009unsigned short`009uword;`009`009/* 16-bit unsigned word */ Xtypedef`009unsigned long`009ulong;`009`009/* 32-bit unsigned longword */ Xtypedef`009unsigned long`009uquad[2];`009/* 64-bit unsigned quadword */ Xtypedef unsigned long`009uocta[4];`009/* 128-bit unsigned octaword */ X Xtypedef`009long int vmstime[2];`009`009/* Quadword with VMS time */ X Xstruct queue {`009`009`009/* Queue header/links */ X`009unsigned int *flink;`009`009/* Forward link pointer */ X`009unsigned int *blink;`009`009/* Backward link pointer */ X`009}; X X/* X Define shorthands for struct bit fields: X*/ X#define $bit(name) unsigned name : 1`009`009/* Single bit */ X#define $field(name,size) int name : size`009/* Field of "size" bits */ X#define $ufield(name,size) unsigned name : size`009/* Field of "size" bits */ X#define $align unsigned : 0`009`009`009/* Re-align on byte */ X#define $unused(size) unsigned : size`009`009/* Unused "size" bit field */ X X#endif X X/* Some (re-)definitions from STDIO module (used when STDIO is not called) */ X#ifndef`009EOF X#define`009TRUE`0091 X#define`009FALSE`0090 X#define`009EOF`009(-1) X#define`009NULL`0090 X#endif X X/* Define constants giving minimum and maximum values for various types */ X#ifndef`009MAX_INT X#define`009MAX_INT`009`0092147483647`009/* Maximum value in signed longword */ X#define`009MAX_ULONG`0094294967295`009/* Maximum value in unsigned long */ X#define`009MAX_SHORT`00932767`009`009/* Maximum value in signed word */ X#define`009MAX_UWORD`00965535`009`009/* Maximum value in unsigned word */ X#define`009MAX_CHAR`009127`009`009/* Maximum value in signed byte */ X#define`009MAX_UBYTE`009255`009`009/* Maximum value in unsigned byte */ X#define`009MIN_INT`009`009-2147483648`009/* Minimum value in signed longword */ X#define`009MIN_SHORT`009-32768`009`009/* Minimum value in signed word */ X#define`009MIN_CHAR`009-128`009`009/* Minimum value in signed byte */ X#endif X X/* X Define macros used to provide quick test of VMS completion codes X and macros to signal or abort (signal and stop) on failure codes. X*/ X#ifndef $VMS_SUCCESS X#define $VMS_SUCCESS(code) ((code) & 1)`009 /* for success */ X#define $VMS_FAILURE(code) (!$VMS_SUCCESS(code)) /* for failure */ X`009`009`009`009`009/* Signal failure completion code */ X#define SIGNAL_FAILURE(code) if ($VMS_FAILURE(code)) lib$signal(code) X`009`009`009`009`009/* Abort on failure completion code */ X#define ABORT_ON_FAILURE(code) if ($VMS_FAILURE(code)) lib$stop(code) X`009`009`009`009`009/* Return failure completion code */ X#define RETURN_ON_FAILURE(code) if ($VMS_FAILURE(code)) return(code) X#define`009LIB$SIGNAL`009lib$signal X#define`009LIB$STOP`009lib$stop X#endif X X/* X End of VAXTYPES module X*/ $ GoSub Convert_File $ Exit -------