Changeset 1315 for trunk/src/emx/src/lib/app/setenv.c
- Timestamp:
- Mar 17, 2004, 4:59:28 AM (22 years ago)
- File:
-
- 1 edited
-
trunk/src/emx/src/lib/app/setenv.c (modified) (2 diffs, 1 prop)
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/emx/src/lib/app/setenv.c
-
Property cvs2svn:cvs-rev
changed from
1.3to1.4
r1314 r1315 17 17 #include <emx/startup.h> 18 18 #include <emx/time.h> /* _tzset_flag */ 19 20 19 21 20 22 … … 34 36 * @author knut st. osmundsen <[email protected]> 35 37 * @remark We skip the first equal in the environment value like BSD does. 38 36 39 */ 37 int _STD(setenv) (const char *envname, const char *envval, int overwrite)40 int _STD(setenv)(const char *envname, const char *envval, int overwrite) 38 41 { 39 char **p; 40 int lenname; 41 int lenval; 42 int env_size; 42 LIBCLOG_ENTER("envname=%s envval=%s overwrite=%d\n", envname, envval, overwrite); 43 char **p; 44 char *psz; 45 int lenname; 46 int lenval; 47 int env_size; 43 48 44 /* validate */45 if (envname == NULL || *envname == '\0' || strchr(envname, '=') != NULL)49 /* validate */ 50 if (envname == NULL || *envname == '\0' || strchr(envname, '=') != NULL) 46 51 { 47 errno = EINVAL; 48 return -1; 52 LIBC_ASSERTM_FAILED("invalid argument envname(%p='%s')\n", envname, envname); 53 errno = EINVAL; 54 LIBCLOG_RETURN_INT(-1); 49 55 } 50 _tzset_flag = 0; /* Call tzset() */56 _tzset_flag = 0; /* Call tzset() */ 51 57 52 /* BSD Compatability. */53 if (*envval == '=')54 envval++;58 /* BSD Compatability. */ 59 if (*envval == '=') 60 envval++; 55 61 56 /* search for existing variable iinstance */ 57 lenname = strlen (envname); 58 p = environ; 59 env_size = 0; 60 if (p != NULL) 61 while (*p != NULL) 62 { 63 char *s = *p; 64 if (strncmp (s, envname, lenname) == 0 && (s[lenname] == 0 || s[lenname] == '=')) 65 break; 66 ++p; ++env_size; 67 } 62 /* search for existing variable iinstance */ 63 lenname = strlen(envname); 64 p = environ; 65 env_size = 0; 66 if (p != NULL) 67 while (*p != NULL) 68 { 69 char *s = *p; 70 if ( strncmp(s, envname, lenname) == 0 71 && ( s[lenname] == '\0' 72 || s[lenname] == '=')) 73 break; 74 ++p; ++env_size; 75 } 68 76 69 /* found it? */70 lenval = strlen(envval);71 if (p != NULL && *p != NULL)77 /* found it? */ 78 lenval = strlen(envval); 79 if (p != NULL && *p != NULL) 72 80 { 73 if (!overwrite) 74 return 0; 75 /* if the older is larger then overwrite it */ 76 if (strlen(*p + lenname + 1) >= lenval) 81 if (!overwrite) 77 82 { 78 memcpy(*p + lenname + 1, envval, lenval + 1); 79 return 0; 83 LIBCLOG_MSG("exists, requested not to overwrite it\n"); 84 LIBCLOG_RETURN_INT(0); 85 } 86 /* if the older is larger then overwrite it */ 87 LIBCLOG_MSG("exists, overwrite\n"); 88 if (strlen(*p + lenname + 1) >= lenval) 89 { 90 memcpy(*p + lenname + 1, envval, lenval + 1); 91 LIBCLOG_RETURN_INT(0); 80 92 } 81 93 } 82 else94 else 83 95 { 84 /* new variable: reallocate the environment pointer block */85 if (environ == _org_environ)96 /* new variable: reallocate the environment pointer block */ 97 if (environ == _org_environ) 86 98 { 87 p = malloc ((env_size+2) * sizeof (char *)); 88 if (p == NULL) 89 return -1; 90 environ = p; 91 if (env_size != 0) 92 memcpy (environ, _org_environ, env_size * sizeof (char *)); 99 LIBCLOG_MSG("env_size=%d; new, first new\n", env_size); 100 p = malloc((env_size + 2) * sizeof (char *)); 101 if (p == NULL) 102 LIBCLOG_RETURN_INT(-1); 103 environ = p; 104 if (env_size != 0) 105 memcpy(environ, _org_environ, env_size * sizeof (char *)); 93 106 } 94 else107 else 95 108 { 96 p = realloc (environ, (env_size+2) * sizeof (char *)); 97 if (p == NULL) 98 return -1; 99 environ = p; 109 LIBCLOG_MSG("env_size=%d; new, resize environ array\n", env_size); 110 p = realloc(environ, (env_size + 2) * sizeof (char *)); 111 if (p == NULL) 112 LIBCLOG_RETURN_INT(-1); 113 environ = p; 100 114 } 101 115 102 /* Add to end. */103 p = &environ[env_size+0];104 environ[env_size+1] = NULL;116 /* Add to end. */ 117 0]; 118 1] = NULL; 105 119 } 106 120 107 /* Allocate space for new variable and assign it. */ 108 *p = malloc(lenname + lenval + 2); 109 if (!*p) 110 return -1; 111 memcpy(*p, envname, lenname); 112 (*p)[lenname] = '='; 113 memcpy(*p + lenname + 1, envval, lenval + 1); 114 return 0; 121 /* Allocate space for new variable and assign it. */ 122 psz = malloc(lenname + lenval + 2); 123 if (!psz) 124 LIBCLOG_RETURN_INT(-1); 125 memcpy(psz, envname, lenname); 126 psz[lenname] = '='; 127 memcpy(psz + lenname + 1, envval, lenval + 1); 128 *p = psz; 129 LIBCLOG_RETURN_INT(0); 115 130 } 116 131 -
Property cvs2svn:cvs-rev
changed from
Note:
See TracChangeset
for help on using the changeset viewer.
