diff options
author | Matthias Andree <matthias.andree@gmx.de> | 2009-05-04 21:52:32 +0000 |
---|---|---|
committer | Matthias Andree <matthias.andree@gmx.de> | 2009-05-04 21:52:32 +0000 |
commit | 64c3c5394121ab9f5a93a8c6d2c48511ff720536 (patch) | |
tree | e7fa39c9b88c7928acfa3d476700732958b58051 /driver.c | |
parent | 51ee0c2fb3e59a2d79d68aa27d1e15d16bcbceba (diff) | |
download | fetchmail-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
Diffstat (limited to 'driver.c')
-rw-r--r-- | driver.c | 53 |
1 files changed, 29 insertions, 24 deletions
@@ -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); } } |