diff options
Diffstat (limited to 'rfc2045/rfc2045_fromfd.c')
| -rw-r--r-- | rfc2045/rfc2045_fromfd.c | 65 | 
1 files changed, 65 insertions, 0 deletions
| diff --git a/rfc2045/rfc2045_fromfd.c b/rfc2045/rfc2045_fromfd.c new file mode 100644 index 0000000..795f833 --- /dev/null +++ b/rfc2045/rfc2045_fromfd.c @@ -0,0 +1,65 @@ +/* +** Copyright 1998 - 2008 Double Precision, Inc.  See COPYING for +** distribution information. +*/ + +/* +*/ +#if	HAVE_CONFIG_H +#include "rfc2045_config.h" +#endif + +#include	<sys/types.h> + +#include	"rfc2045.h" +#if	HAVE_UNISTD_H +#include	<unistd.h> +#endif + +/* Convert a message to the RFC2045 structure */ + +struct rfc2045 *rfc2045_fromfd(int fd) +{ +struct	rfc2045	*rfc; +char	buf[BUFSIZ]; +int	n; +off_t	orig_pos; + +	if ((orig_pos=lseek(fd, 0L, SEEK_CUR)) == (off_t)-1) return (NULL); +	if (lseek(fd, (off_t)0, SEEK_SET) == (off_t)-1)	return (NULL); +	if ((rfc=rfc2045_alloc()) == 0)	return (NULL); + +	while ((n=read(fd, buf, sizeof(buf))) > 0) +		rfc2045_parse(rfc, buf, n); +	rfc2045_parse_partial(rfc); + +	if (lseek(fd, orig_pos, SEEK_SET) == (off_t)-1) +	{ +		rfc2045_free(rfc); +		rfc=0; +	} +	return (rfc); +} + +/* Convert a message to the RFC2045 structure, halting after header */ + +struct rfc2045 *rfc2045header_fromfd(int fd) +{ +struct        rfc2045        *rfc; +char        buf[BUFSIZ]; +int        n; +off_t        orig_pos; + +        if ((orig_pos=lseek(fd, 0L, SEEK_CUR)) == (off_t)-1) return (NULL); +        if (lseek(fd, (off_t)0, SEEK_SET) == (off_t)-1)        return (NULL); +        if ((rfc=rfc2045_alloc()) == 0)        return (NULL); + +        while (rfc->workinheader && (n=read(fd, buf, sizeof(buf))) > 0) +                rfc2045_parse(rfc, buf, n); +        if (lseek(fd, orig_pos, SEEK_SET) == (off_t)-1) +        { +                rfc2045_free(rfc); +                rfc=0; +        } +        return (rfc); +} | 
