diff options
| author | Sam Varshavchik | 2013-08-19 16:39:41 -0400 | 
|---|---|---|
| committer | Sam Varshavchik | 2013-08-25 14:43:51 -0400 | 
| commit | 9c45d9ad13fdf439d44d7443ae75da15ea0223ed (patch) | |
| tree | 7a81a04cb51efb078ee350859a64be2ebc6b8813 /maildrop/varlist.C | |
| parent | a9520698b770168d1f33d6301463bb70a19655ec (diff) | |
| download | courier-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.C | 149 | 
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); +} | 
