aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorEric S. Raymond <esr@thyrsus.com>1996-12-21 19:17:03 +0000
committerEric S. Raymond <esr@thyrsus.com>1996-12-21 19:17:03 +0000
commite2914b619afd334ae57f10e8af35c9c43088f24b (patch)
treef47ae2095ff142268118c34299f5a373aea54a8b
parent950350966b07d1f121f4cf50a2704f1a65dc4b38 (diff)
downloadfetchmail-e2914b619afd334ae57f10e8af35c9c43088f24b.tar.gz
fetchmail-e2914b619afd334ae57f10e8af35c9c43088f24b.tar.bz2
fetchmail-e2914b619afd334ae57f10e8af35c9c43088f24b.zip
Include test code.
svn path=/trunk/; revision=672
-rw-r--r--Makefile.in11
-rw-r--r--acconfig.h3
-rw-r--r--configure.in2
-rw-r--r--socket.c33
4 files changed, 42 insertions, 7 deletions
diff --git a/Makefile.in b/Makefile.in
index e7dea005..21153574 100644
--- a/Makefile.in
+++ b/Makefile.in
@@ -154,6 +154,7 @@ fetchmail.spec: $(srcdir)/Makefile.in $(srcdir)/specgen.sh
clean:
-rm -f fetchmail *.o core fetchmail.dvi \
rcfile_l.c rcfile_y.h rcfile_y.c fetchmail.tar fetchmail.tar.gz
+ -rm -f linetest[12]
distclean: clean
-rm -f Makefile config.h
@@ -179,6 +180,9 @@ stamp-config: config.status $(srcdir)/config.h.in
configure: configure.in
autoconf $(ACFLAGS)
+config.h.in: acconfig.h
+ autoheader $(ACFLAGS)
+
# This tells versions [3.59,3.63) of GNU make not to export all variables.
.NOEXPORT:
@@ -215,6 +219,13 @@ fetchmail-$(VERS).tar: $(all)
fetchmail-$(VERS).tar.gz: fetchmail-$(VERS).tar
gzip -f fetchmail-$(VERS).tar
+# Test for stdio line-buffering lossage on sockets
+linetest1: socket.c
+ $(CC) -g -I. -DMAIN socket.c -o linetest1 # Use setlinebuf
+linetest2: socket.c
+ $(CC) -g -I. -DMAIN -D__SETVBUF_WORKS_OK__=1 socket.c -o linetest2 # Use setvnbuf
+
+
# The automatically generated dependencies below may omit config.h
# because it is included with ``#include <config.h>'' rather than
# ``#include "config.h"''. So we add the explicit dependency to make sure.
diff --git a/acconfig.h b/acconfig.h
index 54458058..d6a1399b 100644
--- a/acconfig.h
+++ b/acconfig.h
@@ -32,6 +32,9 @@
/* Define if you have GNU's getopt family of functions. */
#undef HAVE_GETOPTLONG
+/* Define if you have setlinebuf(3) */
+#undef HAVE_SETLINEBUF
+
/* Leave that blank line there!! Autoheader needs it.
If you're adding to this file, keep in mind:
diff --git a/configure.in b/configure.in
index 2bda847b..d988c620 100644
--- a/configure.in
+++ b/configure.in
@@ -77,7 +77,7 @@ AC_SUBST(EXTRASRC)
AC_SUBST(EXTRAOBJ)
AC_CHECK_FUNCS(tcsetattr stty setsid seteuid gethostbyname res_search herror \
- strrchr strerror)
+ strrchr strerror setlinebuf)
dnl AC_FUNC_SETVBUF_REVERSED
diff --git a/socket.c b/socket.c
index 9bfc5485..fbe26ef7 100644
--- a/socket.c
+++ b/socket.c
@@ -48,7 +48,6 @@ FILE *sockopen(char *host, int clientPort)
struct sockaddr_in ad;
struct hostent *hp;
FILE *fp;
- static char sbuf[INTERNAL_BUFSIZE];
memset(&ad, 0, sizeof(ad));
ad.sin_family = AF_INET;
@@ -75,17 +74,39 @@ FILE *sockopen(char *host, int clientPort)
}
fp = fdopen(sock, "r+");
-#ifdef FOO
+#ifdef __SETVBUF_WORKS_OK__
/*
- * For unknown reasons, this results in horrible lossage.
+ * For unknown reasons, this results in horrible lossage under Linux.
* To see this, condition in this line, generate a test pattern
* of 8K, fetch it, and watch it garble the test pattern.
- * I think there's a bug in stdio lurking here.
+ * I think there's a bug in Linux stdio lurking here.
*/
- setvbuf(fp, sbuf, _IOLBF, INTERNAL_BUFSIZE);
-#endif /* FOO */
+ {
+ static char sbuf[INTERNAL_BUFSIZE];
+ setvbuf(fp, sbuf, _IOLBF, INTERNAL_BUFSIZE);
+ }
+#endif /* __SETVBUF_WORKS_OK__ */
+
+#if !defined(__SETVBUF_WORKS_OK__) && defined(HAVE_SETLINEBUF)
+ /* this on the other hand works OK under Linux */
+ setlinebuf(fp);
+#endif
return(fp);
}
+#ifdef MAIN
+/*
+ * Use the chargen service to test buffering directly.
+ */
+main()
+{
+ FILE *fp = sockopen("localhost", 19);
+ char buf[80];
+
+ while (fgets(buf, sizeof(buf)-1, fp))
+ fputs(buf, stdout);
+}
+#endif /* MAIN */
+
/* socket.c ends here */
>print; } exit 0; } # Substitute $decltag for every ocurrence of an outer-level boundary # string found in the body of the message. my $usedtag; while (<STDIN>) { if (/^--(.*)$/) { $usedtag = $1 unless defined $usedtag; if ($1 eq $usedtag) { $_ = "--$decltag\n"; } elsif ($1 eq "$usedtag--") { $_ = "--$decltag--\n"; } } print; } =pod This script can be used to bypass a bug in the Domino-5.0.2b IMAP service that manifests itself when you use fetchmail as the IMAP client. The problem is that fetchmail (differently from other IMAP clients) fetches messages in two parts, first the headers and then the body. It seems that Domino converts the messages from its internal format into MIME twice. In doing so, it declared a boundary string in the messages Content-type header and uses another one to separate the parts in the body. This script should be used as a mda option for fetchmail. As arguments to it, pass the former mda you used. I, for example, use the following entry in my .fetchmailrc: poll server ... mda "/usr/bin/procmail -d %T"; To use this filter, I changed the above into the following: poll server ... mda "/home/gustavo/bin/correct-domino-mime-conversion /usr/bin/procmail -d %T"; If you do not use a mda normally, you can try the following to call sendmail directly: poll server ... mda "/home/gustavo/bin/correct-domino-mime-conversion //wherever/is/your/sendmail -oem -f %F %T"; Without argumets this script is a filter that reads from its stdin and outputs the result into its stdout. I should mention that this bug seems to be solved in Domino 5.0.3 (http://www.notes.net/46dom.nsf/434e319a66960d8385256857005cd97b/4499e0db6e43732b852568b2006ef7e9?OpenDocument) but I have not checked it. Gustavo. <gustavo@cpqd.com.br> =cut