main function of a C program
executes. L$UENVR returns information about the operating system and
the current environment.
This description of L$UENVR has two objectives:
envlevel, envname,
intractv, syslevel, and sysname) return operating system
and environment information.
See your SAS Software Representative for SAS/C software products for the location of this member.
This sample returns information about the standard systems (MVS and CMS) under which the compiler runs. The sample is included so that L$UENVR can be modified by a site to indicate special environments. Comments in the code describe how to make any necessary modifications.
Your site normally does not need to change L$UENVR unless you are running programs in a nonstandard environment. For example, changes in the L$UENVR source code are needed to run C programs under a system (such as ROSCOE) that is different from the systems for which the compiler was developed. Note that the operation of the library in such special environments is not guaranteed, but if the environment resembles a normal MVS or CMS environment closely enough, execution is possible.
The environment descriptor block is 48 bytes and contains the information shown in the following table.
Table 13.1 Environment Descriptor Block
Offset(decimal) Length(bytes) Description
0 2 halfword length of the block
(48) (decimal)
2 8 environment name (blank padded),
for example, MVS/SP,VM/SP
10 1 environment version number (integer)
11 1 environment release number (integer)
12 1 environment modification level (integer)
13 1 submodification level,if appropriate
14 8 subenvironment name, if applicable;
for example, TSO--a subenvironment of MVS
22 1 subenvironment version number (integer)
23 1 subenvironment release number (integer)
24 1 subenvironment modification level (integer)
25 1 subenvironment submodification level
26 1 environment number (see ENVDB DSECT for codes)
27 1 supported function flags. These flags
are set by L$UENVR to show whether
specific functions are available.
28 1 XA support flags X'80=XA architecture,
X'40'=PSW in XA format
29 1 time sharing flags X'80'= program
executing interactively
30 1 system function flags: X'80' = dynamic
allocation supported X'40' = SPIE
or ESPIE supported X'20'=ESTAE or
ABNEXIT supported
31 18 reserved
0s. If you modify L$UENVR, a new set of
information is created for the special environment in which compiled
programs will run.
Note: If you modify L$UENVR, do not change the information in the descriptor block for the standard systems (MVS and CMS) because the library may malfunction.
Local operating system conventions or modifications may cause these functions to return incorrect or misleading values. Contact your SAS Software Representative for C Compiler products to confirm that L$UENVR provides the information required.

#include <lclib.h> char *envlevel(void);
envlevel gets the subenvironment version number, release number,
modification level, and submodification level. This information is
stored in bytes 22 through 25 of the environment descriptor block. If
no subenvironment is active, envlevel contains the same
information as syslevel.
A null character is stored for any piece of information that is not meaningful on the current system.
envlevel returns a pointer to a character sequence containing four
pieces of information: subenvironment version number, release number,
modification level, and submodification level.
The type of information returned by envlevel is site-dependent.
For example, under TSO/E, the release number field contains the release
of TSO/E. Under CMS, it typically contains the CMS release number.
None of the other bytes are meaningful.
envname/envlevel and
sysname/syslevel information.
#include <stdio.h>
#include <string.h>
#include <ctype.h>
#include <lclib.h>
main()
{
char *sysptr, *envptr, sysstr[16], envstr[16];
envptr = envlevel();
sprintf(envstr, "%02x %02x %02x %02x",
*envptr, *(envptr + 1), *(envptr + 2), *(envptr + 3));
printf("Envname/Envlevel = %-8s %s\n", envname(), envstr);
sysptr = syslevel();
sprintf(sysstr, "%02x %02x %02x %02x",
*sysptr, *(sysptr + 1), *(sysptr + 2), *(sysptr + 3));
printf("Sysname/Syslevel = %-8s %s\n", sysname(), sysstr);
}

#include <lclib.h> char *envname(void);
envname gets the subenvironment name stored in bytes 14 through 21
of the environment descriptor block.
envname returns a pointer to the string containing the subenvironment
name. Under MVS, if the program is running under TSO, envname returns
either "TSO" or "TSO/E". Under CMS, envname returns
"CMS". For an OpenEdition child process, or a
program called with exec-linkage, envname returns
"OpenMVS", even if invoked under TSO.
If no special subenvironment is active, envname returns the same
information as sysname.
#include <lclib.h>
#include <stdlib.h>
#include <lcstring.h>
if (memcmp(envname(), "TSO", 3) == 0)
system("TSO: DELETE TEMP.FILE");
else if (memcmp(envname(),"CMS", 3) == 0)
system("CMS: ERASE TEMP FILE A");
else if (memcmp(envname(), "OpenMVS", 7) == 0)
system("sh: rm temp.file");
.
.
.
envname is also illustrated in the example for envlevel.

#include <lclib.h> int intractv(void);
intractv indicates whether a program is executing interactively. The
time-sharing flag is stored in byte 29 of the environment descriptor block.
Execution under MVS-batch, including execution of the TSO terminal monitor program, is not interactive. TSO executes programs interactively. CMS execution is normally interactive. However, if there is no interactive console associated with the executing program, a C program under CMS is considered noninteractive. Consult the systems programmer at your local site to determine under what conditions a program is considered noninteractive for CMS.
exec-linkage,
intractv returns a nonzero integer if
a program is executing interactively; otherwise, it returns 0.
For a program called with exec-linkage,
intractv returns whether or not a TSO terminal is accessible.
Therefore, in most cases of exec-linkage, intractv returns
0; however, for a program invoked via the oeattach or
oeattache function under TSO, interactive returns nonzero.
#include <lclib.h>
#include <stdio.h>
#include <string.h>
FILE *in_file;
char *sys_file;
/* Issue prompt only if running interactively. */
if (intractv()) {
printf("Enter data:");
fflush(stdout);
/* Perform other functions to read data in interactively.*/
.
.
.
}
/* Otherwise, obtain input from DATA file. */
else {
if (memcmp(sysname(), "CMS", 3) == 0)
sys_file = "DATA FILE A1";
else
sys_file = "SYSIN";
in_file = fopen(sys_file, "r");
}

#include <lclib.h> char *syslevel(void);
syslevel gets the operating system version number, release number,
modification level, and submodification level stored in bytes 10 through 13 of
the environment descriptor block.
A null character is stored for any piece of information that is not meaningful on the current system.
syslevel returns a pointer to the character sequence containing the
operating system version number, release number, modification level, and
submodification level.
The type of information returned by syslevel is site-dependent. An
example of typical information provided under MVS is the version and release
number of MVS. Under CMS, only the release number is meaningful; this is the
release of the VM control program (CP).
syslevel is illustrated in the example for envlevel.

#include <lclib.h> char *sysname(void);
sysname gets the operating system name from bytes 2 through 9 in the
environment descriptor block.
sysname returns a pointer to a string containing the operating system name.
Under MVS, the string returned by sysname is "VS1", "MVS",
or "MVS/SP". Under CMS, "VM/SP", "VM/XA SP",
"VM/HPO", "VM/XA", or "VM/ESA" is returned.
#include <lclib.h>
#include <string.h>
char *pathname;
if (strcmp(sysname(), "VM/SP") == 0)
pathname = "PRINTER";
else
pathname = "SYSPRINT";
.
.
.
sysname is also illustrated in the example for envlevel.
uname
Copyright (c) 1998 SAS Institute Inc. Cary, NC, USA. All rights reserved.