diff options
-rw-r--r-- | NEWS | 7 | ||||
-rw-r--r-- | fetchmail.c | 52 | ||||
-rw-r--r-- | fetchmail.h | 1 | ||||
-rw-r--r-- | fetchmail.man | 19 | ||||
-rw-r--r-- | options.c | 1 |
5 files changed, 50 insertions, 30 deletions
@@ -240,6 +240,13 @@ fetchmail 6.3.0 (not yet released officially): * fetchmailconf -V now prints the fetchmailconf version. Matthias Andree * Add support for SubjectAltName (RFC-2595 or 2818), to avoid bogus certificate mismatch errors. Patch by Roland Stigge, Debian Bug#201113. (MA) +* make fetchmail --silent --quit really silent, Debian Bug #229014 by Dr. + Andreas Krüger. Matthias Andree +* cleanup --quit handling again (so that --silent --quit just kills the + existing daemon, rather than continue running), and document it more clearly. + Matthias Andree +* Print an error message if multiple "defaults" records are found in the + configuration file. Matthias Andree # INTERNAL CHANGES * Switched to automake. Matthias Andree. diff --git a/fetchmail.c b/fetchmail.c index 57c05f8e..5f442d54 100644 --- a/fetchmail.c +++ b/fetchmail.c @@ -60,6 +60,7 @@ int outlevel; /* see the O_.* constants above */ struct runctl run; /* global controls for this run */ flag nodetach; /* if TRUE, don't detach daemon process */ flag quitmode; /* if --quit was set */ +int quitind; /* optind after position of last --quit option */ flag check_only; /* if --probe was set */ flag versioninfo; /* emit only version info */ char *user; /* the name of the invoking user */ @@ -69,6 +70,8 @@ char *program_name; /* the name to prefix error messages with */ flag configdump; /* dump control blocks for configurator */ char *fetchmailhost; /* either `localhost' or the host's FQDN */ +static int quitonly; /* if we should quit after killing the running daemon */ + static int querystatus; /* status of query */ static int successes; /* count number of successful polls */ static int activecount; /* count number of active entries */ @@ -194,8 +197,16 @@ int main(int argc, char **argv) } #endif - if ((parsecmdline(argc,argv, &cmd_run, &cmd_opts)) < 0) - exit(PS_SYNTAX); + { + int i; + + i = parsecmdline(argc, argv, &cmd_run, &cmd_opts); + if (i < 0) + exit(PS_SYNTAX); + + if (quitmode && quitind == argc) + quitonly = 1; + } if (versioninfo) { @@ -258,8 +269,8 @@ int main(int argc, char **argv) system("uname -a"); } - /* avoid parsing the config file if all we're doing is killing a daemon */ - if (!(quitmode && argc == 2)) + /* avoid parsing the config file if all we're doing is killing a daemon */ + if (!quitonly) implicitmode = load_params(argc, argv, optind); #if defined(HAVE_SYSLOG) @@ -366,7 +377,7 @@ int main(int argc, char **argv) pid = bkgd ? -pid : pid; /* if no mail servers listed and nothing in background, we're done */ - if (!(quitmode && argc == 2) && pid == 0 && querylist == NULL) { + if (!quitonly && pid == 0 && querylist == NULL) { (void)fputs(GT_("fetchmail: no mailservers have been specified.\n"),stderr); exit(PS_SYNTAX); } @@ -374,17 +385,11 @@ int main(int argc, char **argv) /* perhaps user asked us to kill the other fetchmail */ if (quitmode) { - if (pid == 0) + if (pid == 0 || pid == getpid()) + /* this test enables re-execing on a changed rcfile + * for pid == getpid() */ { - fprintf(stderr,GT_("fetchmail: no other fetchmail is running\n")); - if (argc == 2) - exit(PS_EXCLUDE); - } - else if (getpid() == pid) - { - /* this test enables re-execing on a changed rcfile */ - if (argc == 2) - { + if (quitonly) { fprintf(stderr,GT_("fetchmail: no other fetchmail is running\n")); exit(PS_EXCLUDE); } @@ -397,10 +402,11 @@ int main(int argc, char **argv) } else { - fprintf(stderr,GT_("fetchmail: %s fetchmail at %d killed.\n"), - bkgd ? GT_("background") : GT_("foreground"), pid); + if (outlevel > O_SILENT) + fprintf(stderr,GT_("fetchmail: %s fetchmail at %d killed.\n"), + bkgd ? GT_("background") : GT_("foreground"), pid); fm_lock_release(); - if (argc == 2) + if (quitonly) exit(0); else pid = 0; @@ -902,6 +908,9 @@ static void optmerge(struct query *h2, struct query *h1, int force) #undef FLAG_MERGE } +/** Load configuration files. + * \return - true if no servers found on the command line + * - false if servers found on the command line */ static int load_params(int argc, char **argv, int optind) { int implicitmode, st; @@ -1006,9 +1015,12 @@ static int load_params(int argc, char **argv, int optind) } /* don't allow a defaults record after the first */ - for (ctl = querylist; ctl; ctl = ctl->next) - if (ctl != querylist && strcmp(ctl->server.pollname, "defaults") == 0) + for (ctl = querylist; ctl; ctl = ctl->next) { + if (ctl != querylist && strcmp(ctl->server.pollname, "defaults") == 0) { + fprintf(stderr, GT_("fetchmail: Error: multiple \"defaults\" records in config file.\n")); exit(PS_SYNTAX); + } + } /* use localhost if we never fetch the FQDN of this host */ fetchmailhost = "localhost"; diff --git a/fetchmail.h b/fetchmail.h index b3868592..c75d07b0 100644 --- a/fetchmail.h +++ b/fetchmail.h @@ -412,6 +412,7 @@ extern flag peek_capable; /* can we read msgs without setting seen? */ extern struct runctl run; /* global controls for this run */ extern flag nodetach; /* if TRUE, don't detach daemon process */ extern flag quitmode; /* if --quit was set */ +extern int quitind; /* optind after position of last --quit option */ extern flag check_only; /* if --check was set */ extern char *rcfile; /* path name of rc file */ extern int linelimit; /* limit # lines retrieved per site */ diff --git a/fetchmail.man b/fetchmail.man index 5f134f75..9343255f 100644 --- a/fetchmail.man +++ b/fetchmail.man @@ -1021,16 +1021,13 @@ flags indicating that connections have wedged due to failed authentication or multiple timeouts. .PP The option -.B --quit +.B \-\-quit will kill a running daemon process instead of waking it up (if there -is no such process, -.I fetchmail -notifies you). If the --quit option is the only command-line option, -that's all there is to it. -.PP -The quit option may also be mixed with other command-line options; its -effect is to kill any running daemon before doing what the other -options specify in combination with the fetchmailrc file. +is no such process, \fIfetchmail\fP will notify you. +If the \-\-quit option appears last on the command line, \fIfetchmail\fP +will kill the running daemon process and then quit. Otherwise, +\fIfetchmail\fP will first kill a running daemon process and then +continue running with the other options. .PP The .B \-L <filename> @@ -1069,7 +1066,9 @@ option was used. .PP The .B \-N -or --nodetach option suppresses backgrounding and detachment of the +or +.B --nodetach +option suppresses backgrounding and detachment of the daemon process from its control terminal. This is useful for debugging or when fetchmail runs as the child of a supervisor process such as @@ -267,6 +267,7 @@ struct query *ctl; /* option record to be initialized */ break; case 'q': quitmode = TRUE; + quitind = optind; break; case 'L': rctl->logfile = prependdir (optarg, currentwd); |