aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--NEWS5
-rw-r--r--fetchmail.c20
-rw-r--r--fetchmail.h2
-rw-r--r--options.c18
4 files changed, 35 insertions, 10 deletions
diff --git a/NEWS b/NEWS
index e02a7f0c..bc1f75f3 100644
--- a/NEWS
+++ b/NEWS
@@ -98,6 +98,8 @@ fetchmail-6.4.0 (not yet released):
* Fetchmail now detects if the server hangs up prematurely during SSL_connect()
and reports this condition as such, and not just as SSL connection failure.
(OpenSSL 1.0.2 reported incompatible with pop3.live.com by Jerry Seibert).
+* A foreground fetchmail can now accept a few more options while another copy is
+ running in the background.
## FIXES
* Fix a typo in the FAQ. Submitted by David Lawyer, Debian Bug#706776.
@@ -134,10 +136,11 @@ fetchmail-6.4.0 (not yet released):
messages. This will not be fixed, because the maintainer has no Kerberos 5
server to test against. Use GSSAPI.
+--------------------------------------------------------------------------------
fetchmail-6.3.26 (released 2013-04-23, 26180 LoC):
- CRITICAL BUG FIX for setups using "mimedecode":
+# CRITICAL BUG FIX for setups using "mimedecode":
* The mimedecode feature failed to ship the last line of the body if it was
encoded as quoted-printable and had a MIME soft line break in the very last
line. Reported by Lars Hecking in June 2011.
diff --git a/fetchmail.c b/fetchmail.c
index 22d492ae..8b0a5c3d 100644
--- a/fetchmail.c
+++ b/fetchmail.c
@@ -159,6 +159,8 @@ int main(int argc, char **argv)
{
int bkgd = FALSE;
int implicitmode = FALSE;
+ flag safewithbg = FALSE; /** if parsed options are compatible with a
+ fetchmail copy running in the background */
struct query *ctl;
netrc_entry *netrc_list;
char *netrc_file, *tmpbuf;
@@ -202,7 +204,7 @@ int main(int argc, char **argv)
#define IDFILE_NAME ".fetchids"
run.idfile = prependdir (IDFILE_NAME, fmhome);
-
+
outlevel = O_NORMAL;
/*
@@ -226,7 +228,7 @@ int main(int argc, char **argv)
{
int i;
- i = parsecmdline(argc, argv, &cmd_run, &cmd_opts);
+ i = parsecmdline(argc, argv, &cmd_run, &cmd_opts, &safewithbg);
if (i < 0)
exit(PS_SYNTAX);
@@ -541,17 +543,23 @@ int main(int argc, char **argv)
else if (getpid() == pid)
/* this test enables re-execing on a changed rcfile */
fm_lock_assert();
- else if (argc > 1)
+ else if (argc > 1 && !safewithbg)
{
fprintf(stderr,
GT_("fetchmail: can't accept options while a background fetchmail is running.\n"));
+ {
+ int i;
+ fprintf(stderr, "argc = %d, arg list:\n", argc);
+ for (i = 1; i < argc; i++) fprintf(stderr, "arg %d = \"%s\"\n", i, argv[i]);
+ }
return(PS_EXCLUDE);
}
else if (kill(pid, SIGUSR1) == 0)
{
- fprintf(stderr,
- GT_("fetchmail: background fetchmail at %ld awakened.\n"),
- (long)pid);
+ if (outlevel > O_SILENT)
+ fprintf(stderr,
+ GT_("fetchmail: background fetchmail at %ld awakened.\n"),
+ (long)pid);
return(0);
}
else
diff --git a/fetchmail.h b/fetchmail.h
index 52a1d4b9..f14d51d4 100644
--- a/fetchmail.h
+++ b/fetchmail.h
@@ -679,7 +679,7 @@ int do_otp(int sock, const char *command, struct query *ctl);
extern char currentwd[1024], rcfiledir[1024];
struct query *hostalloc(struct query *);
-int parsecmdline (int, char **, struct runctl *, struct query *);
+int parsecmdline (int, char **, struct runctl *, struct query *, flag *);
char *prependdir (const char *, const char *);
char *MD5Digest (unsigned const char *);
void hmac_md5 (const unsigned char *, size_t, const unsigned char *, size_t, unsigned char *, size_t);
diff --git a/options.c b/options.c
index 86ea4bd2..7058feea 100644
--- a/options.c
+++ b/options.c
@@ -233,7 +233,10 @@ static int xatoi(char *s, int *errflagptr)
int parsecmdline (int argc /** argument count */,
char **argv /** argument strings */,
struct runctl *rctl /** global run controls to modify */,
- struct query *ctl /** option record to initialize */)
+ struct query *ctl /** option record to initialize */,
+ flag *safewithbg /** set to whether options are
+ compatible with another copy
+ running in the background */)
{
/*
* return value: if positive, argv index of last parsed option + 1
@@ -248,9 +251,12 @@ int parsecmdline (int argc /** argument count */,
int errflag = 0; /* TRUE when a syntax error is detected */
int helpflag = 0; /* TRUE when option help was explicitly requested */
int option_index;
+ int option_safe; /* to track if option currently parsed is safe
+ with a background copy */
char *buf, *cp;
rctl->poll_interval = -1;
+ *safewithbg = TRUE;
memset(ctl, '\0', sizeof(struct query)); /* start clean */
ctl->smtp_socket = -1;
@@ -259,21 +265,26 @@ int parsecmdline (int argc /** argument count */,
(c = getopt_long(argc,argv,shortoptions,
longoptions, &option_index)) != -1)
{
+ option_safe = FALSE;
+
switch (c) {
case 'V':
versioninfo = TRUE;
+ option_safe = TRUE;
break;
case 'c':
check_only = TRUE;
break;
case 's':
outlevel = O_SILENT;
+ option_safe = 1;
break;
case 'v':
if (outlevel >= O_VERBOSE)
outlevel = O_DEBUG;
else
outlevel = O_VERBOSE;
+ option_safe = TRUE;
break;
case 'd':
rctl->poll_interval = xatoi(optarg, &errflag);
@@ -600,6 +611,7 @@ int parsecmdline (int argc /** argument count */,
case LA_CONFIGDUMP:
configdump = TRUE;
+ option_safe = TRUE;
break;
case LA_SYSLOG:
@@ -615,9 +627,11 @@ int parsecmdline (int argc /** argument count */,
break;
case '?':
+ helpflag = 1;
default:
- helpflag++;
+ break;
}
+ *safewithbg &= option_safe;
}
if (errflag || ocount > 1 || helpflag) {