Example: Saving and restoring system-level environment variables

This two-part example illustrates how to save the current set of system-level environment variables and restore them later.

Note: Read the Code license and disclaimer information for important legal information.

Saving system-level environment variables

This program stores the system-level environment variables and the associated CCSIDs in a file for restoring later.

Use the Create C Module (CRTCMOD) and the Create Program (CRTPGM) commands to create this program.

Call this program with one parameter (the file to store the variable list and the CCSIDs).

/******************************************************************/
/******************************************************************/
/*                                                                */
/* FUNCTION:  Save the system-level environment variable list     */
/*            and the CCSIDs in a file                            */
/*                                                                */
/* LANGUAGE:  ILE C                                               */
/*                                                                */
/* APIs USED: Qp0zGetAllSysEnv()                                  */
/*                                                                */
/******************************************************************/
/******************************************************************/

#include <fcntl.h>
#include <stdio.h>
#include <unistd.h>
#include <sys/stat.h>
#include <stdlib.h>
#include <errno.h>
#include <qp0z1170.h>


int main(int argc, char *argv[])
{

    int fd, bw, rc;
    int listBufSize, ccsidBufSize, *ccsidBuf;
    char *listBuf;
    int numvar, sl, sc;

    if(argc != 2)
    {
      printf("Usage: call %s <filename>\n",argv[0]);
      printf("Example: call %s '/tmp/sev'\n",argv[0]);
      return -1;
    }

    sl = listBufSize = 1000;
    sc = ccsidBufSize = 1000;
    listBuf = (char *)malloc(listBufSize);
    ccsidBuf = (int *)malloc(ccsidBufSize);

    /* Create a file of specified name */
    /* If it exists, it is cleared out */
    /* Opened for writing              */
    fd = open(argv[1], O_CREAT | O_WRONLY | O_TRUNC, S_IRWXU);
    if(fd == -1)
    {
      printf("open() failed. errno = %d\n", errno);
      return -1;
    }


    rc = Qp0zGetAllSysEnv(listBuf, &listBufSize, ccsidBuf,
                          &ccsidBufSize, NULL);
    if(rc != 0)
    {
      /* If there are no variables to save, write a  */
      /* zero into the file and return success       */

      if(rc == ENOENT)
      {
        numvar = 0;
        bw = write(fd, &numvar, sizeof(int));
        close(fd);
        printf("No system-level environment variables to save");
        return 0;
      }

      if(rc != ENOSPC)
      {
        printf("Error using  Qp0zGetAllSysEnv(), errno = %d\n", rc);
        return -1;
      }

      /* rc = ENOSPC. size of buffer is not enough */
      /* change buffer size and try again */

      /* If listBuf is not large enough, */
      /* allocate more space             */
      if(listBufSize > sl)
      {
        listBuf = (char *)realloc(listBuf, listBufSize);
      }

      /* If ccsidBuf is too small, allocate */
      /* more space                         */
      if(ccsidBufSize > sc)
      {
        ccsidBuf = (int *)realloc(ccsidBuf, ccsidBufSize);
      }

      rc = Qp0zGetAllSysEnv(listBuf, &listBufSize,
                            ccsidBuf, &ccsidBufSize, NULL);
      if(rc != 0)
      {
        printf("Error using Qp0zGetAllSysEnv(), errno = %d\n", rc);
        return -1;
      }
    }


    /* Write the contents of the buffer into the file */
    /* First write the total number of ccsid values   */
    /* This is the total number of variables          */

    numvar = ccsidBufSize/sizeof(int);

    bw = write(fd, &numvar, sizeof(int));
    if(bw == -1)
    {
      printf("write() of total number of ccsids failed. errno = %d\n", errno);
      return -1;
    }


    /* Next write the ccsid values */

    bw = write(fd, ccsidBuf, ccsidBufSize);
    if(bw == -1)
    {
      printf("write() of ccsid values failed. errno = %d\n", errno);
      return -1;
    }

    /* Now write the size (in bytes) of the listBuf */

    bw = write(fd, &listBufSize, sizeof(int));
    if(bw == -1)
    {
      printf("write() of listBufSize failed. errno = %d\n", errno);
      return -1;
    }

    /* Finally write the listBuf containing the variable strings*/

    bw = write(fd, listBuf, listBufSize);
    if(bw == -1)
    {
      printf("write() of listBuf failed. errno = %d\n", errno);
      return -1;
    }

    /* Close the file */
    rc = close(fd);
    if(rc != 0)
    {
      printf("close() failed. errno = %d\n", errno);
      return -1;
    }

    printf("System-level environment variables saved\n");
    return 0;
}

Restoring system-level environment variables

This program reads the system-level environment variable list from a file and then sets the system-level environment variables.

Use the Create C Module (CRTCMOD) and the Create Program (CRTPGM) commands to create this program.

Call this program with one parameter (the name of the file in which the system-level environment variables were stored).

/******************************************************************/
/******************************************************************/
/*                                                                */
/* FUNCTION:  Restore the system-level environment variable list  */
/*            and the associated CCSIDs stored in a file          */
/*                                                                */
/* LANGUAGE:  ILE C                                               */
/*                                                                */
/* APIs USED: Qp0zPutSysEnv()                                     */
/*                                                                */
/******************************************************************/
/******************************************************************/
#include <fcntl.h>
#include <stdio.h>
#include <unistd.h>
#include <sys/stat.h>
#include <stdlib.h>
#include <errno.h>
#include <qp0z1170.h>


int main(int argc, char *argv[])
{
    int fd, rc, br, i, numvar;
    int ccsidBufSize = 0, listBufSize = 0, *ccsidBuf;
    char *listBuf;


    if (argc != 2)
    {
      printf("Usage: call %s <filename>\n",argv[0]);
      printf("Example: call %s '/tmp/sev'\n",argv[0]);
      return -1;
    }

    /* Open the file specified */

    fd = open(argv[1], O_RDONLY);
    if(fd == -1)
    {
      printf("open() failed. errno = %d\n", errno);
      return -1;
    }

    /* Get the number of variables */
    br = read(fd, &numvar, sizeof(int));
    if(br == -1)
    {
      printf("read() failed. errno = %d\n", errno);
      return -1;
    }

    /* Could delete the existing system-level environment */
    /* variables and have only the restored values.       */
    /* If so desired, could call Qp0zDltSysEnv() to do so */

    /* If there aren't any elements in the file, skip the rest of */
    /* the reads and go to the end                                */

    if(numvar > 0)
    {
      ccsidBufSize = numvar*sizeof(int);
      ccsidBuf = (int *)malloc(ccsidBufSize);

      /* Read the ccsid values and put it in ccsidBuf */
      br = read(fd, ccsidBuf, ccsidBufSize);
      if(br == -1)
      {
        printf("read() failed. errno = %d\n", errno);
        return -1;
      }


      /* Read the size of the list buffer and put it in listBufSize */
      br = read(fd, &listBufSize, sizeof(int));
      if(br == -1)
      {
        printf("read() failed. errno = %d\n", errno);
        return -1;
      }

      listBuf = (char *)malloc(listBufSize);

      /* Finally read the strings themselves */
      br = read(fd, listBuf, listBufSize);
      if(br == -1)
      {
        printf("read() failed. errno = %d\n", errno);
        return -1;
      }
   }

   /* Walk through the buffer and get the   */
   /* name=value strings one by one         */
   /* Use Qp0zPutSysEnv() to set the values */

   for(i = 0; i < numvar; i++)
   {
     rc = Qp0zPutSysEnv(listBuf, ccsidBuf[i], NULL);
     if(rc != 0)
     {
       printf("Qp0zPutSysEnv() failed. rc=%d\n",rc);
       return -1;
     }

     listBuf += strlen(listBuf) + 1;
   }

   close(fd);
   printf("System-level environment variables restored\n");
   return 0;

}