aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMatthias Andree <matthias.andree@gmx.de>2009-05-04 21:52:32 +0000
committerMatthias Andree <matthias.andree@gmx.de>2009-05-04 21:52:32 +0000
commit64c3c5394121ab9f5a93a8c6d2c48511ff720536 (patch)
treee7fa39c9b88c7928acfa3d476700732958b58051
parent51ee0c2fb3e59a2d79d68aa27d1e15d16bcbceba (diff)
downloadfetchmail-64c3c5394121ab9f5a93a8c6d2c48511ff720536.tar.gz
fetchmail-64c3c5394121ab9f5a93a8c6d2c48511ff720536.tar.bz2
fetchmail-64c3c5394121ab9f5a93a8c6d2c48511ff720536.zip
Major progress ticker bugfix/overhaul.
Progress tickers had been used inconsistently for a long time, and documentation was outdated, too. Factor out common code to ease maintenance, use the report_flush() function, and add and use a macro (want_progress()) to determine if progress ticker output is desired. This makes for a much more consistent look on screen and in logfiles and should be much easier to fix later on. TODO: test syslog output. svn path=/branches/BRANCH_6-3/; revision=5290
-rw-r--r--NEWS5
-rw-r--r--driver.c53
-rw-r--r--fetchmail.c2
-rw-r--r--fetchmail.h6
-rw-r--r--fetchmail.man6
-rw-r--r--transact.c6
6 files changed, 46 insertions, 32 deletions
diff --git a/NEWS b/NEWS
index 98147a43..9868a4ef 100644
--- a/NEWS
+++ b/NEWS
@@ -64,6 +64,11 @@ fetchmail 6.3.10 (not yet released):
termination signal properly through sys/wait.h macros.
* When acquiring a body, understand NIL ("no such data item"), as returned by
some MS Exchange versions. Fixes BerliOS Bug #11980 by KB Sriram.
+* Make progress tickers (-v/--showdots) consistent, and update documentation
+ accordingly ("." for each 1024 octets read, "#" for a header written, and "*"
+ for each body line written.)
+ The conditions under which these had been printed were inconsistent,
+ illogical, and documentation hadn't matched real behaviour for long.
# CHANGES
* Make the comparison of the SSL fingerprints case insensitive, to
diff --git a/driver.c b/driver.c
index 335da6ac..bf4c7b5c 100644
--- a/driver.c
+++ b/driver.c
@@ -418,6 +418,14 @@ static void mark_oversized(struct query *ctl, int size)
}
}
+static int eat_trailer(int sock, struct query *ctl)
+{
+ /* we only need this LF if we're printing ticker dots
+ * AND we are dumping protocol traces. */
+ if (outlevel >= O_VERBOSE && want_progress()) fputc('\n', stdout);
+ return (ctl->server.base_protocol->trail)(sock, ctl, tag);
+}
+
static int fetch_messages(int mailserver_socket, struct query *ctl,
int count, int **msgsizes, int maxfetch,
int *fetches, int *dispatches, int *deletions)
@@ -615,8 +623,11 @@ static int fetch_messages(int mailserver_socket, struct query *ctl,
if (len > 0)
report_build(stdout, wholesize ? GT_(" (%d octets)")
: GT_(" (%d header octets)"), len);
- if (outlevel >= O_VERBOSE)
- report_complete(stdout, "\n");
+ if (want_progress()) {
+ /* flush and add a blank to append ticker dots */
+ report_flush(stdout);
+ putchar(' ');
+ }
}
/*
@@ -628,6 +639,7 @@ static int fetch_messages(int mailserver_socket, struct query *ctl,
/* pass the suppress_readbody flag only if the underlying
* protocol does not fetch the body separately */
separatefetchbody ? 0 : &suppress_readbody);
+
if (err == PS_RETAINED)
suppress_forward = suppress_delete = retained = TRUE;
else if (err == PS_TRANSIENT)
@@ -640,14 +652,8 @@ static int fetch_messages(int mailserver_socket, struct query *ctl,
/* tell server we got it OK and resynchronize */
if (separatefetchbody && ctl->server.base_protocol->trail)
{
- if (outlevel >= O_VERBOSE && !is_a_file(1) && !run.use_syslog)
- {
- fputc('\n', stdout);
- fflush(stdout);
- }
-
- if ((err = (ctl->server.base_protocol->trail)(mailserver_socket, ctl, tag)))
- return(err);
+ err = eat_trailer(mailserver_socket, ctl);
+ if (err) return(err);
}
/* do not read the body which is not being forwarded only if
@@ -680,9 +686,15 @@ static int fetch_messages(int mailserver_socket, struct query *ctl,
*/
if (len == -1)
len = msgsize - msgblk.msglen;
- if (outlevel > O_SILENT && !wholesize)
- report_build(stdout,
- GT_(" (%d body octets)"), len);
+ if (!wholesize) {
+ if (outlevel > O_SILENT)
+ report_build(stdout,
+ GT_(" (%d body octets)"), len);
+ if (want_progress()) {
+ report_flush(stdout);
+ putchar(' ');
+ }
+ }
}
/* process the body now */
@@ -690,23 +702,16 @@ static int fetch_messages(int mailserver_socket, struct query *ctl,
ctl,
!suppress_forward,
len);
+
if (err == PS_TRANSIENT)
suppress_delete = suppress_forward = TRUE;
else if (err)
return(err);
/* tell server we got it OK and resynchronize */
- if (ctl->server.base_protocol->trail)
- {
- if (outlevel >= O_VERBOSE && !is_a_file(1) && !run.use_syslog)
- {
- fputc('\n', stdout);
- fflush(stdout);
- }
-
- err = (ctl->server.base_protocol->trail)(mailserver_socket, ctl, tag);
- if (err != 0)
- return(err);
+ if (ctl->server.base_protocol->trail) {
+ err = eat_trailer(mailserver_socket, ctl);
+ if (err) return(err);
}
}
diff --git a/fetchmail.c b/fetchmail.c
index e7f48668..aff4877b 100644
--- a/fetchmail.c
+++ b/fetchmail.c
@@ -1150,8 +1150,6 @@ static int load_params(int argc, char **argv, int optind)
flag = FALSE;\
else\
flag = (dflt)
- /* one global gets treated specially */
- DEFAULT(run.showdots, run.poll_interval==0 || nodetach);
/* merge in wired defaults, do sanity checks and prepare internal fields */
for (ctl = querylist; ctl; ctl = ctl->next)
diff --git a/fetchmail.h b/fetchmail.h
index 4b32a889..bb3b09bf 100644
--- a/fetchmail.h
+++ b/fetchmail.h
@@ -764,5 +764,11 @@ int must_tls(struct query *ctl);
/* prototype from rfc822valid.c */
int rfc822_valid_msgid(const unsigned char *);
+/* macro to determine if we want to spam progress to stdout */
+#define want_progress() \
+ ((outlevel >= O_VERBOSE || (outlevel > O_SILENT && run.showdots)) \
+ && !run.use_syslog \
+ && (run.showdots || !is_a_file(1)))
+
#endif
/* fetchmail.h ends here */
diff --git a/fetchmail.man b/fetchmail.man
index e66da7d0..e2e933af 100644
--- a/fetchmail.man
+++ b/fetchmail.man
@@ -1315,9 +1315,9 @@ mailserver host.
The
.B \-\-showdots
option (keyword: set showdots) forces fetchmail to show progress dots
-even if the current tty is not stdout (for example logfiles).
-Fetchmail shows the dots by default when run in nodetach mode or when
-daemon mode is not enabled.
+even if the output goes to a file or fetchmail is not in verbose mode.
+Fetchmail shows the dots by default when run in \-\-verbose mode
+\fIand\fP output goes to console. This option is ignored in \-\-silent mode.
.PP
By specifying the
.B \-\-tracepolls
diff --git a/transact.c b/transact.c
index d66d2758..7f658bc8 100644
--- a/transact.c
+++ b/transact.c
@@ -367,7 +367,7 @@ static void print_ticker(int *tickervar, int bytes)
*tickervar += bytes;
while (*tickervar >= SIZETICKER)
{
- if (outlevel > O_SILENT && run.showdots && !run.use_syslog)
+ if (want_progress())
{
fputc('.', stdout);
fflush(stdout);
@@ -1265,7 +1265,7 @@ int readheaders(int sock,
return(PS_IOERR);
}
- if ((run.poll_interval == 0 || nodetach) && outlevel >= O_VERBOSE && !is_a_file(1) && !run.use_syslog)
+ if (want_progress())
fputc('#', stdout);
/* write error notifications */
@@ -1446,7 +1446,7 @@ int readbody(int sock, struct query *ctl, flag forward, int len)
release_sink(ctl);
return(PS_IOERR);
}
- else if (outlevel >= O_VERBOSE && !is_a_file(1) && !run.use_syslog)
+ else if (want_progress())
{
fputc('*', stdout);
fflush(stdout);