This two-part example illustrates how to save the current set of system-level environment variables and restore them later.
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; }
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; }