1/* 2 * $Id: env.c,v 1.1.1.1 2008/10/15 03:30:50 james26_jang Exp $ 3 * 4 * Copyright (C) 1995,1996,1997 Lars Fenneberg 5 * 6 * See the file COPYRIGHT for the respective terms and conditions. 7 * If the file is missing contact me at lf@elemental.net 8 * and I'll send you a copy. 9 * 10 */ 11 12#include <config.h> 13#include <includes.h> 14#include <radiusclient.h> 15 16/* 17 * Function: rc_new_env 18 * 19 * Purpose: allocate space for a new environment 20 * 21 */ 22 23ENV *rc_new_env(int size) 24{ 25 ENV *p; 26 27 if (size < 1) 28 return NULL; 29 30 if ((p = malloc(sizeof(*p))) == NULL) 31 return NULL; 32 33 if ((p->env = malloc(size * sizeof(char *))) == NULL) 34 { 35 rc_log(LOG_CRIT, "rc_new_env: out of memory"); 36 free(p); 37 return NULL; 38 } 39 40 p->env[0] = NULL; 41 42 p->size = 0; 43 p->maxsize = size; 44 45 return p; 46} 47 48/* 49 * Function: rc_free_env 50 * 51 * Purpose: free the space used by an env structure 52 * 53 */ 54 55void rc_free_env(ENV *env) 56{ 57 free(env->env); 58 free(env); 59} 60 61/* 62 * Function: rc_add_env 63 * 64 * Purpose: add an environment entry 65 * 66 */ 67 68int rc_add_env(ENV *env, char *name, char *value) 69{ 70 int i; 71 char *new_env; 72 73 for (i = 0; env->env[i] != NULL; i++) 74 { 75 if (strncmp(env->env[i], name, MAX(strchr(env->env[i], '=') - env->env[i],strlen(name))) == 0) 76 break; 77 } 78 79 if (env->env[i]) 80 { 81 if ((new_env = realloc(env->env[i], strlen(name)+strlen(value)+2)) == NULL) 82 return (-1); 83 84 env->env[i] = new_env; 85 86 sprintf(env->env[i],"%s=%s", name, value); 87 } else { 88 if (env->size == (env->maxsize-1)) { 89 rc_log(LOG_CRIT, "rc_add_env: not enough space for environment (increase ENV_SIZE)"); 90 return (-1); 91 } 92 93 if ((env->env[env->size] = malloc(strlen(name)+strlen(value)+2)) == NULL) { 94 rc_log(LOG_CRIT, "rc_add_env: out of memory"); 95 return (-1); 96 } 97 98 sprintf(env->env[env->size],"%s=%s", name, value); 99 100 env->size++; 101 102 env->env[env->size] = NULL; 103 } 104 105 return 0; 106} 107 108/* 109 * Function: rc_import_env 110 * 111 * Purpose: imports an array of null-terminated strings 112 * 113 */ 114 115int rc_import_env(ENV *env, char **import) 116{ 117 char *es; 118 119 while (*import) 120 { 121 es = strchr(*import, '='); 122 123 if (!es) 124 { 125 import++; 126 continue; 127 } 128 129 /* ok, i grant thats not very clean... */ 130 *es = '\0'; 131 132 if (rc_add_env(env, *import, es+1) < 0) 133 { 134 *es = '='; 135 return (-1); 136 } 137 138 *es = '='; 139 140 import++; 141 } 142 143 return 0; 144} 145