#endif /* NET_SECURITY */
#include "fetchmail.h"
-
+#include "i18n.h"
+
/* parser reads these */
char *rcfile; /* path name of rc file */
struct query cmd_opts; /* where to put command-line info */
}
%token DEFAULTS POLL SKIP VIA AKA LOCALDOMAINS PROTOCOL
-%token PREAUTHENTICATE TIMEOUT KPOP SDPS KERBEROS4 KERBEROS5 KERBEROS
+%token PREAUTHENTICATE TIMEOUT KPOP SDPS KERBEROS4 KERBEROS5 KERBEROS SSH
%token ENVELOPE QVIRTUAL USERNAME PASSWORD FOLDER SMTPHOST MDA BSMTP LMTP
-%token SMTPADDRESS SPAMRESPONSE PRECONNECT POSTCONNECT LIMIT WARNINGS
+%token SMTPADDRESS SMTPNAME SPAMRESPONSE PRECONNECT POSTCONNECT LIMIT WARNINGS
%token NETSEC INTERFACE MONITOR PLUGIN PLUGOUT
%token IS HERE THERE TO MAP WILDCARD
%token BATCHLIMIT FETCHLIMIT EXPUNGE PROPERTIES
-%token SET LOGFILE DAEMON SYSLOG IDFILE INVISIBLE POSTMASTER BOUNCEMAIL
+%token SET LOGFILE DAEMON SYSLOG IDFILE INVISIBLE POSTMASTER BOUNCEMAIL
+%token SPAMBOUNCE SHOWDOTS
%token <proto> PROTO
%token <sval> STRING
%token <number> NUMBER
-%token NO KEEP FLUSH FETCHALL REWRITE FORCECR STRIPCR PASS8BITS DROPSTATUS
-%token DNS SERVICE PORT UIDL INTERVAL MIMEDECODE CHECKALIAS
+%token NO KEEP FLUSH FETCHALL REWRITE FORCECR STRIPCR PASS8BITS
+%token DROPSTATUS DROPDELIVERED
+%token DNS SERVICE PORT UIDL INTERVAL MIMEDECODE IDLE CHECKALIAS
+%token SSL SSLKEY SSLCERT
+%token PRINCIPAL
%%
| SET POSTMASTER optmap STRING {run.postmaster = xstrdup($4);}
| SET BOUNCEMAIL {run.bouncemail = TRUE;}
| SET NO BOUNCEMAIL {run.bouncemail = FALSE;}
+ | SET SPAMBOUNCE {run.spambounce = TRUE;}
+ | SET NO SPAMBOUNCE {run.spambounce = FALSE;}
| SET PROPERTIES optmap STRING {run.properties =xstrdup($4);}
| SET SYSLOG {run.use_syslog = TRUE;}
| SET INVISIBLE {run.invisible = TRUE;}
+ | SET SHOWDOTS {run.showdots = TRUE;}
/*
* The way the next two productions are written depends on the fact that
/* detect and complain about the most common user error */
| define_server serverspecs userspecs serv_option
- {yyerror("server option after user options");}
+ {yyerror(_("server option after user options"));}
;
define_server : POLL STRING {reset_server($2, FALSE);}
#else
current.server.preauthenticate = A_KERBEROS_V4;
#endif /* KERBEROS_V5 */
-#if INET6
+#if INET6_ENABLE
current.server.service = KPOP_PORT;
-#else /* INET6 */
+#else /* INET6_ENABLE */
current.server.port = KPOP_PORT;
-#endif /* INET6 */
+#endif /* INET6_ENABLE */
}
+ | PRINCIPAL STRING {current.server.principal = xstrdup($2);}
| PROTOCOL SDPS {
#ifdef SDPS_ENABLE
current.server.protocol = P_POP3;
current.server.sdps = TRUE;
#else
- yyerror("SDPS not enabled.");
+ yyerror(_("SDPS not enabled."));
#endif /* SDPS_ENABLE */
}
| UIDL {current.server.uidl = FLAG_TRUE;}
| CHECKALIAS {current.server.checkalias = FLAG_TRUE;}
| NO CHECKALIAS {current.server.checkalias = FLAG_FALSE;}
| SERVICE STRING {
-#if INET6
+#if INET6_ENABLE
current.server.service = $2;
-#endif /* INET6 */
+#endif /* INET6_ENABLE */
}
| PORT NUMBER {
-#if !INET6
+#if INET6_ENABLE
+ int port = $2;
+ char buf[10];
+ sprintf(buf, "%d", port);
+ current.server.service = xstrdup(buf);
+#else
current.server.port = $2;
-#endif /* !INET6 */
- }
+#endif /* INET6_ENABLE */
+ }
| INTERVAL NUMBER {current.server.interval = $2;}
| PREAUTHENTICATE PASSWORD {current.server.preauthenticate = A_PASSWORD;}
| PREAUTHENTICATE KERBEROS4 {current.server.preauthenticate = A_KERBEROS_V4;}
current.server.preauthenticate = A_KERBEROS_V4;
#endif /* KERBEROS_V5 */
}
+ | PREAUTHENTICATE SSH {current.server.preauthenticate = A_SSH;}
| TIMEOUT NUMBER {current.server.timeout = $2;}
| ENVELOPE NUMBER STRING
int requestlen;
if (net_security_strtorequest($2, &request, &requestlen))
- yyerror("invalid security request");
+ yyerror(_("invalid security request"));
else {
current.server.netsec = xstrdup($2);
free(request);
}
#else
- yyerror("network-security support disabled");
+ yyerror(_("network-security support disabled"));
#endif /* NET_SECURITY */
}
| INTERFACE STRING {
-#if (defined(linux) && !defined(INET6)) || defined(__FreeBSD__)
+#if (defined(linux) && !defined(INET6_ENABLE)) || defined(__FreeBSD__)
interface_parse($2, ¤t.server);
-#else /* (defined(linux) && !defined(INET6)) || defined(__FreeBSD__) */
- fprintf(stderr, "fetchmail: interface option is only supported under Linux and FreeBSD\n");
-#endif /* (defined(linux) && !defined(INET6)) || defined(__FreeBSD__) */
+#else /* (defined(linux) && !defined(INET6_ENABLE)) || defined(__FreeBSD__) */
+ fprintf(stderr, _("fetchmail: interface option is only supported under Linux and FreeBSD\n"));
+#endif /* (defined(linux) && !defined(INET6_ENABLE)) || defined(__FreeBSD__) */
}
| MONITOR STRING {
-#if (defined(linux) && !defined(INET6)) || defined(__FreeBSD__)
+#if (defined(linux) && !defined(INET6_ENABLE)) || defined(__FreeBSD__)
current.server.monitor = xstrdup($2);
-#else /* (defined(linux) && !defined(INET6)) || defined(__FreeBSD__) */
- fprintf(stderr, "fetchmail: monitor option is only supported under Linux\n");
-#endif /* (defined(linux) && !defined(INET6) || defined(__FreeBSD__)) */
+#else /* (defined(linux) && !defined(INET6_ENABLE)) || defined(__FreeBSD__) */
+ fprintf(stderr, _("fetchmail: monitor option is only supported under Linux\n"));
+#endif /* (defined(linux) && !defined(INET6_ENABLE) || defined(__FreeBSD__)) */
}
| PLUGIN STRING { current.server.plugin = xstrdup($2); }
| PLUGOUT STRING { current.server.plugout = xstrdup($2); }
| FOLDER folder_list
| SMTPHOST smtp_list
| SMTPADDRESS STRING {current.smtpaddress = xstrdup($2);}
+ | SMTPNAME STRING {current.smtpname = xstrdup($2);}
| SPAMRESPONSE num_list
| MDA STRING {current.mda = xstrdup($2);}
| BSMTP STRING {current.bsmtp = xstrdup($2);}
| STRIPCR {current.stripcr = FLAG_TRUE;}
| PASS8BITS {current.pass8bits = FLAG_TRUE;}
| DROPSTATUS {current.dropstatus = FLAG_TRUE;}
+ | DROPDELIVERED {current.dropdelivered = FLAG_TRUE;}
| MIMEDECODE {current.mimedecode = FLAG_TRUE;}
+ | IDLE {current.idle = FLAG_TRUE;}
+
+ | SSL {current.use_ssl = FLAG_TRUE;}
+ | SSLKEY STRING {current.sslkey = xstrdup($2);}
+ | SSLCERT STRING {current.sslcert = xstrdup($2);}
| NO KEEP {current.keep = FLAG_FALSE;}
| NO FLUSH {current.flush = FLAG_FALSE;}
| NO STRIPCR {current.stripcr = FLAG_FALSE;}
| NO PASS8BITS {current.pass8bits = FLAG_FALSE;}
| NO DROPSTATUS {current.dropstatus = FLAG_FALSE;}
+ | NO DROPDELIVERED {current.dropdelivered = FLAG_FALSE;}
| NO MIMEDECODE {current.mimedecode = FLAG_FALSE;}
+ | NO IDLE {current.idle = FLAG_FALSE;}
+
+ | NO SSL {current.use_ssl = FLAG_FALSE;}
| LIMIT NUMBER {current.limit = NUM_VALUE_IN($2);}
| WARNINGS NUMBER {current.warnings = NUM_VALUE_IN($2);}
void yyerror (const char *s)
/* report a syntax error */
{
- report_at_line(stderr, 0, rcfile, prc_lineno, "%s at %s", s,
- (yytext && yytext[0]) ? yytext : "end of input");
+ report_at_line(stderr, 0, rcfile, prc_lineno, _("%s at %s"), s,
+ (yytext && yytext[0]) ? yytext : _("end of input"));
prc_errflag++;
}
}
}
- if (!securecheck) return 0;
+ if (!securecheck) return PS_SUCCESS;
if ((statbuf.st_mode & S_IFLNK) == S_IFLNK)
{
- fprintf(stderr, "File %s must not be a symbolic link.\n", pathname);
+ fprintf(stderr, _("File %s must not be a symbolic link.\n"), pathname);
return(PS_IOERR);
}
+#ifndef __BEOS__
if (statbuf.st_mode & ~(S_IFREG | S_IREAD | S_IWRITE | S_IEXEC | S_IXGRP))
{
- fprintf(stderr, "File %s must have no more than -rwx--x--- (0710) permissions.\n",
+ fprintf(stderr, _("File %s must have no more than -rwx--x--- (0710) permissions.\n"),
pathname);
return(PS_IOERR);
}
+#endif /* __BEOS__ */
#ifdef HAVE_GETEUID
if (statbuf.st_uid != geteuid())
if (statbuf.st_uid != getuid())
#endif /* HAVE_GETEUID */
{
- fprintf(stderr, "File %s must be owned by you.\n", pathname);
+ fprintf(stderr, _("File %s must be owned by you.\n"), pathname);
return(PS_IOERR);
}
#endif
if ( (prc_errflag = prc_filecheck(pathname, securecheck)) != 0 )
return(prc_errflag);
- if (errno == ENOENT)
+ /*
+ * Croak if the configuration directory does not exist.
+ * This probably means an NFS mount failed and we can't
+ * see a configuration file that ought to be there.
+ * Question: is this a portable check? It's not clear
+ * that all implementations of lstat() will return ENOTDIR
+ * rather than plain ENOENT in this case...
+ */
+ if (errno == ENOTDIR)
+ return(PS_IOERR);
+ else if (errno == ENOENT)
return(PS_SUCCESS);
/* Open the configuration file and feed it to the lexer. */
yyparse(); /* parse entire file */
- fclose(yyin);
+ fclose(yyin); /* not checking this should be safe, file mode was r */
if (prc_errflag)
return(PS_SYNTAX);
current.smtp_socket = -1;
current.server.pollname = xstrdup(name);
current.server.skip = skip;
+ current.server.principal = (char *)NULL;
}