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 /ldapaddressbook/abookread.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 'ldapaddressbook/abookread.c')
| -rw-r--r-- | ldapaddressbook/abookread.c | 244 | 
1 files changed, 244 insertions, 0 deletions
| diff --git a/ldapaddressbook/abookread.c b/ldapaddressbook/abookread.c new file mode 100644 index 0000000..63e75e9 --- /dev/null +++ b/ldapaddressbook/abookread.c @@ -0,0 +1,244 @@ +/* +** +** Copyright 2003-2006, Double Precision Inc. +** +** See COPYING for distribution information. +*/ + +#include	"config.h" +#include	"ldapaddressbook.h" + +#include	<stdio.h> +#include	<string.h> +#include	<stdlib.h> + +static void dequote(char *); + +struct ldapabook *ldapabook_read(const char *filename) +{ +char	buf[BUFSIZ]; +FILE	*fp; +struct	ldapabook *list, *last; +char	*s; +char	*name; +char	*host; +char	*port; +char	*suffix; +char	*binddn; +char	*bindpw; + +	if ((fp=fopen(filename, "r")) == 0)	return (0); + +	list=last=0; +	while (fgets(buf, sizeof(buf), fp)) +	{ +	struct	ldapabook *p; + +	struct	ldapabook_opts *opts=NULL, *lastopt=NULL; +	struct ldapabook_opts *nextopt; + +		s=strchr(buf, '\n'); +		if (s)	*s=0; +		if ((s=strchr(buf, '#')) != 0)	*s=0; +		name=buf; +		s=strchr(buf, '\t'); +		if (!s)	continue; +		*s++=0; +		host=s; +		s=strchr(s, '\t'); +		if (s) *s++=0; +		port=s; +		if (s)	s=strchr(s, '\t'); +		if (s)	*s++=0; +		suffix=s; +		if (s)	s=strchr(s, '\t'); +		if (s)	*s++=0; +		binddn=s; +		if (s)	s=strchr(s, '\t'); +		if (s)	*s++=0; +		bindpw=s; +		if (!port || !*port)	port="389"; +		if (!suffix)	suffix=""; +		if (!binddn)	binddn=""; +		if (!bindpw)	bindpw=""; + +		if (s)	s=strchr(s, '\t'); +		if (s)	*s++=0; + +		while (s && *s) +		{ +			char *t; + +			t=strchr(s, ','); +			if (t) +				*t++=0; + +			if ((nextopt=(struct ldapabook_opts *) +			     malloc(sizeof(struct ldapabook_opts))) == NULL +			    || (nextopt->options=strdup(s)) == NULL) +			{ +				if (nextopt) +					free(nextopt); +				ldapabook_free(list); +				fclose(fp); +				return (NULL); +			} + +			dequote(nextopt->options); +			if (!lastopt) +				opts=nextopt; +			else +				lastopt->next=nextopt; +			nextopt->next=NULL; +			lastopt=nextopt; +			s=t; +		} + +		if ((p=malloc(sizeof(struct ldapabook))) == 0) +		{ +			struct ldapabook_opts *nextopt; + +			while ((nextopt=opts) != NULL) +			{ +				opts=nextopt->next; +				free(nextopt->options); +				free(nextopt); +			} + +			ldapabook_free(list); +			fclose(fp); +			return (0); +		} + +		memset(p, 0, sizeof(*p)); +		p->opts=opts; + +		if ( (p->name=strdup(name)) != 0) +		{ +			if ((p->host=strdup(host)) != 0) +			{ +				if ((p->port=strdup(port)) != 0) +				{ +					if ((p->suffix=strdup(suffix)) != 0) +					{ +						if ((p->binddn=strdup(binddn)) +							!= 0) +						{ +							if ((p->bindpw=strdup +								(bindpw)) != 0) +							{ +								if (!list) +								   list=last=p; +								else +								   last->next=p; +								last=p; +								p->next=0; +								continue; +							} +							free(p->binddn); +						} +						free(p->suffix); +					} +					free(p->port); +				} +				free(p->host); +			} +			free(p->name); +		} +		free(p); +		while ((nextopt=opts) != NULL) +		{ +			opts=nextopt->next; +			free(nextopt->options); +			free(nextopt); +		} +		ldapabook_free(list); +		fclose(fp); +		return (0); +	} +	fclose(fp); +	return (list); +} + +void ldapabook_free(struct ldapabook *p) +{ +	while (p) +	{ +		struct ldapabook *n=p->next; +		struct ldapabook_opts *opts; + +		while ((opts=p->opts) != NULL) +		{ +			p->opts=opts->next; +			free(opts->options); +			free(opts); +		} + +		free(p->bindpw); +		free(p->binddn); +		free(p->suffix); +		free(p->port); +		free(p->host); +		free(p->name); +		free(p); +		p=n; +	} +} + +static const char hex[]="0123456789ABCDEF"; + +static int nybble(char c) +{ +	char	*p=strchr(hex, c); + +	if (p)	return (p-hex); +	return (0); +} + +static void dequote(char *p) +{ +	char *q; + +	for (q=p; *q; q++) +	{ +		if (*q == '+' && q[1] && q[2]) +		{ +			*p++=nybble(q[1])*16 + nybble(q[2]); +			q += 2; +			continue; +		} +		*p++=*q; +	} +	*p=0; +} + +void ldapabook_writerec(const struct ldapabook *b, FILE *fp) +{ +	struct	ldapabook_opts *opts; +	char	*sep="\t"; + +	fprintf(fp, "%s\t%s\t%s\t%s\t%s\t%s", b->name, b->host, +		b->port ? b->port:"", b->suffix, +		b->binddn ? b->binddn:"", +		b->bindpw ? b->bindpw:""); + +	for (opts=b->opts; opts; opts=opts->next) +	{ +		char *p; + +		fprintf(fp, "%s", sep); +		sep=","; + +		for (p=opts->options; *p; p++) +		{ +			if (*p <= ' ' || *p >= 127 || +			    *p == ',' || *p == '+') +			{ +				fprintf(fp, "+%02X", (int)(unsigned char)*p); +				continue; +			} +			putc(*p, fp); +		} +	} +	fprintf(fp, "\n"); +} | 
