summaryrefslogtreecommitdiffstats
path: root/maildrop/varlist.C
diff options
context:
space:
mode:
authorSam Varshavchik2013-08-19 16:39:41 -0400
committerSam Varshavchik2013-08-25 14:43:51 -0400
commit9c45d9ad13fdf439d44d7443ae75da15ea0223ed (patch)
tree7a81a04cb51efb078ee350859a64be2ebc6b8813 /maildrop/varlist.C
parenta9520698b770168d1f33d6301463bb70a19655ec (diff)
downloadcourier-libs-9c45d9ad13fdf439d44d7443ae75da15ea0223ed.tar.bz2
Initial checkin
Imported from subversion report, converted to git. Updated all paths in scripts and makefiles, reflecting the new directory hierarchy.
Diffstat (limited to 'maildrop/varlist.C')
-rw-r--r--maildrop/varlist.C149
1 files changed, 149 insertions, 0 deletions
diff --git a/maildrop/varlist.C b/maildrop/varlist.C
new file mode 100644
index 0000000..4ec045c
--- /dev/null
+++ b/maildrop/varlist.C
@@ -0,0 +1,149 @@
+#include "config.h"
+#include "varlist.h"
+#include "buffer.h"
+#include "funcs.h"
+#include "maildrop.h"
+
+#include <string.h>
+
+
+class Variable {
+public:
+
+ Variable *next;
+ Buffer name, value;
+ } ;
+
+static Variable *varlist[101];
+
+void UnsetVar(const Buffer &var)
+{
+int varlen=var.Length();
+unsigned n=0;
+int i;
+const char *p=var;
+ for (i=varlen; i; --i)
+ n = (n << 1) ^ (unsigned char)*p++;
+
+ if (var.Length() == 7 &&
+ strncmp( (const char *)var, "VERBOSE", 7) == 0)
+ {
+ maildrop.verbose_level=0;
+ }
+
+ n %= sizeof(varlist)/sizeof(varlist[0]);
+
+Variable **v;
+
+ for (v= &varlist[n]; *v; v= &(*v)->next)
+ if ( (*v)->name == var )
+ {
+ Variable *vv= (*v);
+
+ (*v)= vv->next;
+ delete vv;
+ break;
+ }
+ return;
+}
+
+void SetVar(const Buffer &var, const Buffer &value)
+{
+int varlen=var.Length();
+unsigned n=0;
+int i;
+const char *p=var;
+
+ for (i=varlen; i; --i)
+ n = (n << 1) ^ (unsigned char)*p++;
+
+ if (var.Length() == 7 &&
+ strncmp( (const char *)var, "VERBOSE", 7) == 0)
+ {
+ maildrop.verbose_level= value.Int("0");
+ if (maildrop.isdelivery) maildrop.verbose_level=0;
+ }
+
+ n %= sizeof(varlist)/sizeof(varlist[0]);
+
+Variable *v;
+
+ for (v=varlist[n]; v; v=v->next)
+ if ( v->name == var )
+ {
+ v->value=value;
+ return;
+ }
+
+ v=new Variable;
+ if (!v) outofmem();
+ v->name=var;
+ v->value=value;
+ v->next=varlist[n];
+ varlist[n]=v;
+}
+
+static Buffer zero;
+
+const Buffer *GetVar(const Buffer &var)
+{
+int varlen=var.Length(),i;
+unsigned n=0;
+const char *p=var;
+
+ for (i=varlen; i; --i)
+ n = (n << 1) ^ (unsigned char)*p++;
+ n %= sizeof(varlist)/sizeof(varlist[0]);
+
+Variable *v;
+
+ for (v=varlist[n]; v; v=v->next)
+ if ( v->name == var) return ( &v->value );
+ return (&zero);
+}
+
+const char *GetVarStr(const Buffer &var)
+{
+static Buffer tempbuf;
+
+ tempbuf= *GetVar(var);
+ tempbuf += '\0';
+ return (tempbuf);
+}
+
+// Create environment for a child process.
+
+char **ExportEnv()
+{
+unsigned i,n,l;
+Variable *v;
+char **envp;
+char *envdatap=0;
+
+ for (i=n=l=0; i<sizeof(varlist)/sizeof(varlist[0]); i++)
+ for (v=varlist[i]; v; v=v->next)
+ {
+ l += v->name.Length() + v->value.Length()+2;
+ ++n;
+ }
+
+ if ((envp=new char *[n+1]) == NULL) outofmem();
+ if (l && (envdatap=new char[l]) == NULL) outofmem();
+
+ for (i=n=0; i<sizeof(varlist)/sizeof(varlist[0]); i++)
+ for (v=varlist[i]; v; v=v->next)
+ {
+ envp[n]=envdatap;
+ memcpy(envdatap, (const char *)v->name,
+ v->name.Length());
+ envdatap += v->name.Length();
+ *envdatap++ = '=';
+ memcpy(envdatap, (const char *)v->value,
+ v->value.Length());
+ envdatap += v->value.Length();
+ *envdatap++ = 0;
+ n++;
+ }
+ envp[n]=0;
+ return (envp);
+}