/* Fill in entire value of argument. */ int fill_arg(char *const dest, const char *argv) { char env_name[MAX_ENVNAME + 1]; char *buf = dest; char *p = NULL; for (; *argv; argv++) { if (isalnum(*argv) || *argv == '_') { if (p) *p++ = *argv; else *buf++ = *argv; } else { /* Symbols. */ if (p) { *p = '\0'; p = find_envvar(env_name); if (p) { strcpy(buf, p); buf += strlen(p); p = NULL; } } if (*argv == '$') p = env_name; else *buf++ = *argv; } } if (p) { *p = '\0'; p = find_envvar(env_name); if (p) { strcpy(buf, p); buf += strlen(p); } } *buf = '\0'; return buf - dest; }
//export void export_envvar(int argc, char *argv[]) { char *found; char *value; int i; for (i = 1; i < argc; i++) { value = argv[i]; while (*value && *value != '=') value++; if (*value) *value++ = '\0'; found = find_envvar(argv[i]); if (found) strcpy(found, value); else if (env_count < MAX_ENVCOUNT) { strcpy(env_var[env_count].name, argv[i]); strcpy(env_var[env_count].value, value); env_count++; } } }
static char * do_replace_envvar (char *path) { char *data = path, *tmp; char *home = getenv ("HOME"); int pos = 0, len, home_len = 0; if (path == NULL) return NULL; if (*path == '\0') return path; len = strlen (path); if (home) home_len = strlen (home); while (*(data + pos)) { char *var; int var_len, end_pos; while (*(data + pos) != '$' && *(data + pos)) { if (*(data + pos) == '~' && *(data + pos + 1) == '/') { if (pos > 0) if (*(data + pos - 1) != ':') { pos += 2; continue; } if (home == NULL) *(data + (pos++)) = '.'; else { len += home_len; tmp = safecalloc (1, len); strncpy (tmp, data, pos); strcpy (tmp + pos, home); strcpy (tmp + pos + home_len, data + pos + 1); if( data != path ) free (data); data = tmp; pos += home_len; } } pos++; } if (*(data + pos) == '\0') break; /* found $ sign - trying to replace var */ if ((var = find_envvar (data + pos + 1, &end_pos)) == NULL) { ++pos; continue; } var_len = strlen (var); len += var_len; tmp = safecalloc (1, len); strncpy (tmp, data, pos); strcpy (tmp + pos, var); strcpy (tmp + pos + var_len, data + pos + end_pos + 1); if( data != path ) free (data); data = tmp; } return data; }