summaryrefslogtreecommitdiffstats
path: root/rfc2045/rfc2045_fromfd.c
diff options
context:
space:
mode:
Diffstat (limited to 'rfc2045/rfc2045_fromfd.c')
-rw-r--r--rfc2045/rfc2045_fromfd.c65
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);
+}