setenv.c - vx32 - Local 9vx git repository for patches.
 (HTM) git clone git://r-36.net/vx32
 (DIR) Log
 (DIR) Files
 (DIR) Refs
       ---
       setenv.c (3752B)
       ---
            1 /*
            2  * Copyright (c) 1987, 1993
            3  *        The Regents of the University of California.  All rights reserved.
            4  *
            5  * Redistribution and use in source and binary forms, with or without
            6  * modification, are permitted provided that the following conditions
            7  * are met:
            8  * 1. Redistributions of source code must retain the above copyright
            9  *    notice, this list of conditions and the following disclaimer.
           10  * 2. Redistributions in binary form must reproduce the above copyright
           11  *    notice, this list of conditions and the following disclaimer in the
           12  *    documentation and/or other materials provided with the distribution.
           13  * 3. All advertising materials mentioning features or use of this software
           14  *    must display the following acknowledgement:
           15  *        This product includes software developed by the University of
           16  *        California, Berkeley and its contributors.
           17  * 4. Neither the name of the University nor the names of its contributors
           18  *    may be used to endorse or promote products derived from this software
           19  *    without specific prior written permission.
           20  *
           21  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
           22  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
           23  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
           24  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
           25  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
           26  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
           27  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
           28  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
           29  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
           30  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
           31  * SUCH DAMAGE.
           32  */
           33 
           34 #include <stddef.h>
           35 #include <stdlib.h>
           36 #include <string.h>
           37 
           38 char *__findenv(const char *, int *);
           39 
           40 /*
           41  * setenv --
           42  *        Set the value of the environmental variable "name" to be
           43  *        "value".  If rewrite is set, replace any current value.
           44  */
           45 int
           46 setenv(name, value, rewrite)
           47         const char *name;
           48         const char *value;
           49         int rewrite;
           50 {
           51         extern char **environ;
           52         static char **alloced;                        /* if allocated space before */
           53         char *c;
           54         int l_value, offset;
           55 
           56         if (*value == '=')                        /* no `=' in value */
           57                 ++value;
           58         l_value = strlen(value);
           59         if ((c = __findenv(name, &offset))) {        /* find if already exists */
           60                 if (!rewrite)
           61                         return (0);
           62                 if (strlen(c) >= l_value) {        /* old larger; copy over */
           63                         while ( (*c++ = *value++) );
           64                         return (0);
           65                 }
           66         } else {                                        /* create new slot */
           67                 int cnt;
           68                 char **p;
           69 
           70                 for (p = environ, cnt = 0; *p; ++p, ++cnt);
           71                 if (alloced == environ) {                        /* just increase size */
           72                         p = (char **)realloc((char *)environ,
           73                             (size_t)(sizeof(char *) * (cnt + 2)));
           74                         if (!p)
           75                                 return (-1);
           76                         alloced = environ = p;
           77                 }
           78                 else {                                /* get new space */
           79                                                 /* copy old entries into it */
           80                         p = malloc((size_t)(sizeof(char *) * (cnt + 2)));
           81                         if (!p)
           82                                 return (-1);
           83                         memcpy(p, environ, cnt * sizeof(char *));
           84                         alloced = environ = p;
           85                 }
           86                 environ[cnt + 1] = NULL;
           87                 offset = cnt;
           88         }
           89         for (c = (char *)name; *c && *c != '='; ++c);        /* no `=' in name */
           90         if (!(environ[offset] =                        /* name + `=' + value */
           91             malloc((size_t)((int)(c - name) + l_value + 2))))
           92                 return (-1);
           93         for (c = environ[offset]; (*c = *name++) && *c != '='; ++c);
           94         for (*c++ = '='; (*c++ = *value++); );
           95         return (0);
           96 }
           97 
           98 /*
           99  * unsetenv(name) --
          100  *        Delete environmental variable "name".
          101  */
          102 int
          103 unsetenv(name)
          104         const char *name;
          105 {
          106         extern char **environ;
          107         char **p;
          108         int offset;
          109 
          110         while (__findenv(name, &offset))        /* if set multiple times */
          111                 for (p = &environ[offset];; ++p)
          112                         if (!(*p = *(p + 1)))
          113                                 break;
          114         return 0;
          115 }