diff options
Diffstat (limited to 'rfc2045/rfc2045mkboundary.c')
| -rw-r--r-- | rfc2045/rfc2045mkboundary.c | 72 | 
1 files changed, 72 insertions, 0 deletions
| diff --git a/rfc2045/rfc2045mkboundary.c b/rfc2045/rfc2045mkboundary.c new file mode 100644 index 0000000..2d7c159 --- /dev/null +++ b/rfc2045/rfc2045mkboundary.c @@ -0,0 +1,72 @@ +/* +** Copyright 1998 - 2011 Double Precision, Inc.  See COPYING for +** distribution information. +*/ + +#if	HAVE_CONFIG_H +#include "rfc2045_config.h" +#endif +#include	"rfc2045.h" +#if	HAVE_UNISTD_H +#include	<unistd.h> +#endif +#include	<stdio.h> +#include	<stdlib.h> +#include	<time.h> +#include	"numlib/numlib.h" + + +#if	HAS_GETHOSTNAME + +#else + +extern int gethostname(char *, size_t); +#endif + +extern void rfc2045_enomem(); + +char *rfc2045_mk_boundary(struct rfc2045 *s, struct rfc2045src *src) +{ +char	hostnamebuf[256]; +pid_t	mypid; +char	pidbuf[NUMBUFSIZE]; +time_t	mytime; +char	timebuf[NUMBUFSIZE]; +static size_t	cnt=0; +char	cntbuf[NUMBUFSIZE]; +char	*p; +int	rc; + +	hostnamebuf[sizeof(hostnamebuf)-1]=0; +	if (gethostname(hostnamebuf, sizeof(hostnamebuf)-1)) +		hostnamebuf[0]=0; +	mypid=getpid(); +	time(&mytime); +	libmail_str_pid_t(mypid, pidbuf); +	libmail_str_time_t(mytime, timebuf); +	for (;;) +	{ +		char tempbuf[NUMBUFSIZE]; + +		libmail_str_size_t(++cnt, tempbuf); +		sprintf(cntbuf, "%4s", tempbuf); +		for (p=cntbuf; *p == ' '; *p++ = '0') +			; +		p=malloc(strlen(hostnamebuf)+strlen(pidbuf) +			 +strlen(timebuf)+strlen(cntbuf)+11); +		if (!p) +		{ +			rfc2045_enomem(); +			return (NULL); +		} + +		sprintf(p, "=_%-1.30s-%s-%s-%s", hostnamebuf, +			pidbuf, timebuf, cntbuf); +		if ((rc=rfc2045_try_boundary(s, src, p)) == 0) +			break; +		free(p); +		if (rc < 0) +			return (NULL); +	} +	return (p); +} | 
