diff options
Diffstat (limited to 'imap/src/osdep/unix/sslstdio.c')
-rw-r--r-- | imap/src/osdep/unix/sslstdio.c | 48 |
1 files changed, 30 insertions, 18 deletions
diff --git a/imap/src/osdep/unix/sslstdio.c b/imap/src/osdep/unix/sslstdio.c index 4059a859..3d3b1e06 100644 --- a/imap/src/osdep/unix/sslstdio.c +++ b/imap/src/osdep/unix/sslstdio.c @@ -1,13 +1,5 @@ /* ======================================================================== - * 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 - * - * + * Copyright 2008 Mark Crispin * ======================================================================== */ @@ -15,15 +7,20 @@ * Program: SSL standard I/O routines for server use * * 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: 22 September 1998 - * Last Edited: 30 August 2006 + * 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 @@ -32,7 +29,15 @@ int PBIN (void) { - if (!sslstdio) return getchar (); + 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--; @@ -53,7 +58,14 @@ char *PSIN (char *s,int n) ssl_server_init (start_tls);/* enter the mode */ start_tls = NIL; /* don't do this again */ } - if (!sslstdio) return fgets (s,n,stdin); + 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 */ |