]> git.ozlabs.org Git - ppp.git/blobdiff - pppd/plugins/radius/radiusclient/lib/env.c
Added RADIUS suppport.
[ppp.git] / pppd / plugins / radius / radiusclient / lib / env.c
diff --git a/pppd/plugins/radius/radiusclient/lib/env.c b/pppd/plugins/radius/radiusclient/lib/env.c
new file mode 100644 (file)
index 0000000..f3d177b
--- /dev/null
@@ -0,0 +1,144 @@
+/*
+ * $Id: env.c,v 1.1 2002/01/22 16:03:02 dfs Exp $
+ *
+ * Copyright (C) 1995,1996,1997 Lars Fenneberg
+ *
+ * See the file COPYRIGHT for the respective terms and conditions. 
+ * If the file is missing contact me at lf@elemental.net 
+ * and I'll send you a copy.
+ *
+ */
+
+#include <config.h>
+#include <includes.h>
+#include <radiusclient.h>
+
+/*
+ * Function: rc_new_env
+ *
+ * Purpose: allocate space for a new environment
+ *
+ */
+ENV *rc_new_env(int size)
+{
+       ENV *p;
+
+       if (size < 1)
+               return NULL;
+
+       if ((p = malloc(sizeof(*p))) == NULL)
+               return NULL;
+               
+       if ((p->env = malloc(size * sizeof(char *))) == NULL)
+       {
+               rc_log(LOG_CRIT, "rc_new_env: out of memory");
+               free(p);
+               return NULL;
+       } 
+
+       p->env[0] = NULL;
+       
+       p->size = 0;
+       p->maxsize = size;      
+               
+       return p;
+}
+
+/*
+ * Function: rc_free_env
+ *
+ * Purpose: free the space used by an env structure
+ *
+ */
+void rc_free_env(ENV *env)
+{
+       free(env->env);
+       free(env); 
+}
+
+/*
+ * Function: rc_add_env
+ *
+ * Purpose: add an environment entry
+ *
+ */
+int rc_add_env(ENV *env, char *name, char *value)
+{
+       int i;
+       char *new_env;
+
+       for (i = 0; env->env[i] != NULL; i++)
+       {
+               if (strncmp(env->env[i], name, MAX(strchr(env->env[i], '=') - env->env[i],strlen(name))) == 0)
+                       break;  
+       }
+
+       if (env->env[i])
+       {
+               if ((new_env = realloc(env->env[i], strlen(name)+strlen(value)+2)) == NULL)
+                       return (-1);
+
+               env->env[i] = new_env;
+
+               sprintf(env->env[i],"%s=%s", name, value);
+       } else {
+               if (env->size == (env->maxsize-1)) {
+                       rc_log(LOG_CRIT, "rc_add_env: not enough space for environment (increase ENV_SIZE)");
+                       return (-1);
+               }
+       
+               if ((env->env[env->size] = malloc(strlen(name)+strlen(value)+2)) == NULL) {
+                       rc_log(LOG_CRIT, "rc_add_env: out of memory");
+                       return (-1);
+               }
+       
+               sprintf(env->env[env->size],"%s=%s", name, value);
+       
+               env->size++;
+
+               env->env[env->size] = NULL;
+       }
+
+       return 0;               
+}
+
+/*
+ * Function: rc_import_env
+ *
+ * Purpose: imports an array of null-terminated strings
+ *
+ */
+int rc_import_env(ENV *env, char **import)
+{
+       char *es;
+       
+       while (*import)
+       {
+               es = strchr(*import, '=');
+               
+               if (!es)
+               {
+                       import++;
+                       continue;
+               }
+               
+               /* ok, i grant thats not very clean... */
+               *es = '\0';
+
+               if (rc_add_env(env, *import, es+1) < 0)
+               {
+                       *es = '=';
+                       return (-1);
+               }
+       
+               *es = '=';
+       
+               import++;
+       }
+       
+       return 0;
+}