summaryrefslogtreecommitdiff
path: root/imap/src/c-client/netmsg.c
diff options
context:
space:
mode:
authorEduardo Chappa <echappa@gmx.com>2013-02-03 00:59:38 -0700
committerEduardo Chappa <echappa@gmx.com>2013-02-03 00:59:38 -0700
commit094ca96844842928810f14844413109fc6cdd890 (patch)
treee60efbb980f38ba9308ccb4fb2b77b87bbc115f3 /imap/src/c-client/netmsg.c
downloadalpine-094ca96844842928810f14844413109fc6cdd890.tar.xz
Initial Alpine Version
Diffstat (limited to 'imap/src/c-client/netmsg.c')
-rw-r--r--imap/src/c-client/netmsg.c104
1 files changed, 104 insertions, 0 deletions
diff --git a/imap/src/c-client/netmsg.c b/imap/src/c-client/netmsg.c
new file mode 100644
index 00000000..187e4ebb
--- /dev/null
+++ b/imap/src/c-client/netmsg.c
@@ -0,0 +1,104 @@
+/* ========================================================================
+ * Copyright 1988-2006 University of Washington
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *
+ * ========================================================================
+ */
+
+/*
+ * Program: Network message (SMTP/NNTP/POP2/POP3) routines
+ *
+ * Author: Mark Crispin
+ * Networks and Distributed Computing
+ * Computing & Communications
+ * University of Washington
+ * Administration Building, AG-44
+ * Seattle, WA 98195
+ * Internet: MRC@CAC.Washington.EDU
+ *
+ * Date: 8 June 1995
+ * Last Edited: 6 December 2006
+ */
+
+
+#include <stdio.h>
+#include <errno.h>
+extern int errno; /* just in case */
+#include "c-client.h"
+#include "netmsg.h"
+#include "flstring.h"
+
+/* Network message read
+ * Accepts: file
+ * number of bytes to read
+ * buffer address
+ * Returns: T if success, NIL otherwise
+ */
+
+long netmsg_read (void *stream,unsigned long count,char *buffer)
+{
+ return (fread (buffer,(size_t) 1,(size_t) count,(FILE *) stream) == count) ?
+ T : NIL;
+}
+
+/* Slurp dot-terminated text from NET
+ * Accepts: NET stream
+ * place to return size
+ * place to return header size
+ * Returns: file descriptor
+ */
+
+FILE *netmsg_slurp (NETSTREAM *stream,unsigned long *size,unsigned long *hsiz)
+{
+ unsigned long i;
+ char *s,*t,tmp[MAILTMPLEN];
+ FILE *f = tmpfile ();
+ if (!f) {
+ sprintf (tmp,".%lx.%lx",(unsigned long) time (0),(unsigned long)getpid ());
+ if (f = fopen (tmp,"wb+")) unlink (tmp);
+ else {
+ sprintf (tmp,"Unable to create scratch file: %.80s",strerror (errno));
+ MM_LOG (tmp,ERROR);
+ return NIL;
+ }
+ }
+ *size = 0; /* initially emtpy */
+ if (hsiz) *hsiz = 0;
+ while (s = net_getline (stream)) {
+ if (*s == '.') { /* possible end of text? */
+ if (s[1]) t = s + 1; /* pointer to true start of line */
+ else {
+ fs_give ((void **) &s); /* free the line */
+ break; /* end of data */
+ }
+ }
+ else t = s; /* want the entire line */
+ if (f) { /* copy it to the file */
+ i = strlen (t); /* size of line */
+ if ((fwrite (t,(size_t) 1,(size_t) i,f) == i) &&
+ (fwrite ("\015\012",(size_t) 1,(size_t) 2,f) == 2)) {
+ *size += i + 2; /* tally up size of data */
+ /* note header position */
+ if (!i && hsiz && !*hsiz) *hsiz = *size;
+ }
+ else {
+ sprintf (tmp,"Error writing scratch file at byte %lu",*size);
+ MM_LOG (tmp,ERROR);
+ fclose (f); /* forget it */
+ f = NIL; /* failure now */
+ }
+ }
+ fs_give ((void **) &s); /* free the line */
+ }
+ /* if making a file, rewind to start of file */
+ if (f) fseek (f,(unsigned long) 0,SEEK_SET);
+ /* header consumes entire message */
+ if (hsiz && !*hsiz) *hsiz = *size;
+ return f; /* return the file descriptor */
+}