summaryrefslogtreecommitdiff
path: root/imap/src/osdep/nt/sslstdio.c
diff options
context:
space:
mode:
Diffstat (limited to 'imap/src/osdep/nt/sslstdio.c')
-rw-r--r--imap/src/osdep/nt/sslstdio.c181
1 files changed, 181 insertions, 0 deletions
diff --git a/imap/src/osdep/nt/sslstdio.c b/imap/src/osdep/nt/sslstdio.c
new file mode 100644
index 00000000..3d3b1e06
--- /dev/null
+++ b/imap/src/osdep/nt/sslstdio.c
@@ -0,0 +1,181 @@
+/* ========================================================================
+ * Copyright 2008 Mark Crispin
+ * ========================================================================
+ */
+
+/*
+ * Program: SSL standard I/O routines for server use
+ *
+ * Author: Mark Crispin
+ *
+ * Date: 22 September 1998
+ * Last Edited: 19 November 2008
+ *
+ * Previous versions of this file were
+ *
+ * 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
+ *
+ */
+
+/* Get character
+ * Returns: character or EOF
+ */
+
+int PBIN (void)
+{
+ if (!sslstdio) {
+ int ret;
+ do {
+ clearerr (stdin);
+ ret = getchar ();
+ } while ((ret == EOF) && !feof (stdin) && ferror (stdin) &&
+ (errno == EINTR));
+ return ret;
+ }
+ if (!ssl_getdata (sslstdio->sslstream)) return EOF;
+ /* one last byte available */
+ sslstdio->sslstream->ictr--;
+ return (int) *(sslstdio->sslstream->iptr)++;
+}
+
+
+/* Get string
+ * Accepts: destination string pointer
+ * number of bytes available
+ * Returns: destination string pointer or NIL if EOF
+ */
+
+char *PSIN (char *s,int n)
+{
+ int i,c;
+ if (start_tls) { /* doing a start TLS? */
+ ssl_server_init (start_tls);/* enter the mode */
+ start_tls = NIL; /* don't do this again */
+ }
+ if (!sslstdio) {
+ char *ret;
+ do {
+ clearerr (stdin);
+ ret = fgets (s,n,stdin);
+ } while (!ret && !feof (stdin) && ferror (stdin) && (errno == EINTR));
+ return ret;
+ }
+ for (i = c = 0, n-- ; (c != '\n') && (i < n); sslstdio->sslstream->ictr--) {
+ if ((sslstdio->sslstream->ictr <= 0) && !ssl_getdata (sslstdio->sslstream))
+ return NIL; /* read error */
+ c = s[i++] = *(sslstdio->sslstream->iptr)++;
+ }
+ s[i] = '\0'; /* tie off string */
+ return s;
+}
+
+
+/* Get record
+ * Accepts: destination string pointer
+ * number of bytes to read
+ * Returns: T if success, NIL otherwise
+ */
+
+long PSINR (char *s,unsigned long n)
+{
+ unsigned long i;
+ if (start_tls) { /* doing a start TLS? */
+ ssl_server_init (start_tls);/* enter the mode */
+ start_tls = NIL; /* don't do this again */
+ }
+ if (sslstdio) return ssl_getbuffer (sslstdio->sslstream,n,s);
+ /* non-SSL case */
+ while (n && ((i = fread (s,1,n,stdin)) || (errno == EINTR))) s += i,n -= i;
+ return n ? NIL : LONGT;
+}
+
+
+/* Wait for stdin input
+ * Accepts: timeout in seconds
+ * Returns: T if have input on stdin, else NIL
+ */
+
+long INWAIT (long seconds)
+{
+ return (sslstdio ? ssl_server_input_wait : server_input_wait) (seconds);
+}
+
+/* Put character
+ * Accepts: character
+ * Returns: character written or EOF
+ */
+
+int PBOUT (int c)
+{
+ if (!sslstdio) return putchar (c);
+ /* flush buffer if full */
+ if (!sslstdio->octr && PFLUSH ()) return EOF;
+ sslstdio->octr--; /* count down one character */
+ *sslstdio->optr++ = c; /* write character */
+ return c; /* return that character */
+}
+
+
+/* Put string
+ * Accepts: destination string pointer
+ * Returns: 0 or EOF if error
+ */
+
+int PSOUT (char *s)
+{
+ if (!sslstdio) return fputs (s,stdout);
+ while (*s) { /* flush buffer if full */
+ if (!sslstdio->octr && PFLUSH ()) return EOF;
+ *sslstdio->optr++ = *s++; /* write one more character */
+ sslstdio->octr--; /* count down one character */
+ }
+ return 0; /* success */
+}
+
+/* Put record
+ * Accepts: source sized text
+ * Returns: 0 or EOF if error
+ */
+
+int PSOUTR (SIZEDTEXT *s)
+{
+ unsigned char *t = s->data;
+ unsigned long i = s->size;
+ unsigned long j;
+ if (sslstdio) while (i) { /* until request satisfied */
+ /* flush buffer if full */
+ if (!sslstdio->octr && PFLUSH ()) break;
+ /* blat as big a chucnk as we can */
+ memcpy (sslstdio->optr,t,j = min (i,sslstdio->octr));
+ sslstdio->optr += j; /* account for chunk */
+ sslstdio->octr -= j;
+ t += j;
+ i -= j;
+ }
+ else while (i && ((j = fwrite (t,1,i,stdout)) || (errno == EINTR)))
+ t += j,i -= j;
+ return i ? EOF : NIL;
+}
+
+
+/* Flush output
+ * Returns: 0 or EOF if error
+ */
+
+int PFLUSH (void)
+{
+ if (!sslstdio) return fflush (stdout);
+ /* force out buffer */
+ if (!ssl_sout (sslstdio->sslstream,sslstdio->obuf,
+ SSLBUFLEN - sslstdio->octr)) return EOF;
+ /* renew output buffer */
+ sslstdio->optr = sslstdio->obuf;
+ sslstdio->octr = SSLBUFLEN;
+ return 0; /* success */
+}