home *** CD-ROM | disk | FTP | other *** search
/ Unix System Administration Handbook 1997 October / usah_oct97.iso / news / cnews.tar / libfake / putenv.c < prev    next >
C/C++ Source or Header  |  1990-10-25  |  1KB  |  55 lines

  1. /*
  2.  * putenv - add a variable to the environment, as in SysV
  3.  */
  4.  
  5. #include <stdio.h>
  6. #include <string.h>        /* the ANSI one, for memcpy */
  7. #include <sys/types.h>
  8. #include "libc.h"
  9.  
  10. #define YES 1
  11. #define NO 0
  12.  
  13. /* peculiar return values */
  14. #define WORKED 0
  15. #define FAILED 1
  16.  
  17. int
  18. putenv(var)            /* put var in the environment */
  19. char *var;
  20. {
  21.     register char **envp, **newenv;
  22.     register int oldenvcnt;
  23.     extern char **environ;
  24.  
  25.     /* count variables, look for var */
  26.     for (envp = environ; *envp != 0; envp++) {
  27.         register char *varp = var, *ep = *envp;
  28.         register int namesame;
  29.  
  30.         namesame = NO;
  31.         for (; *varp == *ep && *varp != '\0'; ++ep, ++varp)
  32.             if (*varp == '=')
  33.                 namesame = YES;
  34.         if (*varp == *ep && *ep == '\0')
  35.             return WORKED;    /* old & new var's are the same */
  36.         if (namesame) {
  37.             *envp = var;    /* replace var with new value */
  38.             return WORKED;
  39.         }
  40.     }
  41.     oldenvcnt = envp - environ;
  42.  
  43.     /* allocate new environment with room for one more variable */
  44.     newenv = (char **)malloc((unsigned)((oldenvcnt+1+1)*sizeof(*envp)));
  45.     if (newenv == NULL)
  46.         return FAILED;
  47.  
  48.     /* copy old environment pointers, add var, switch environments */
  49.     (void) memcpy((char *)newenv, (char *)environ, oldenvcnt*sizeof(*envp));
  50.     newenv[oldenvcnt] = var;
  51.     newenv[oldenvcnt+1] = NULL;
  52.     environ = newenv;
  53.     return WORKED;
  54. }
  55.