]> Pileus Git - ~andy/fetchmail/blobdiff - rcfile_y.y
Fix typo in 'Idle after poll is disabled' (used to be 'diabled'), reported by
[~andy/fetchmail] / rcfile_y.y
index dfe8ec877f9f50d515513f0f72f5e32153e44259..e11a3687c6072bfa9d6a9eb44f7c384c36da4b3d 100644 (file)
 #include <net/security.h>
 #endif /* NET_SECURITY */
 
+#if defined(__CYGWIN__)
+#include <sys/cygwin.h>
+#endif /* __CYGWIN__ */
+
 #include "fetchmail.h"
 #include "i18n.h"
   
@@ -47,6 +51,9 @@ static void record_current(void);
 static void user_reset(void);
 static void reset_server(const char *name, int skip);
 
+/* these should be of size PATH_MAX */
+char currentwd[1024] = "", rcfiledir[1024] = "";
+
 /* using Bison, this arranges that yydebug messages will show actual tokens */
 extern char * yytext;
 #define YYPRINT(fp, type, val) fprintf(fp, " = \"%s\"", yytext)
@@ -59,12 +66,12 @@ extern char * yytext;
 }
 
 %token DEFAULTS POLL SKIP VIA AKA LOCALDOMAINS PROTOCOL
-%token AUTHENTICATE TIMEOUT KPOP SDPS
-%token ENVELOPE QVIRTUAL USERNAME PASSWORD FOLDER SMTPHOST MDA BSMTP LMTP
+%token AUTHENTICATE TIMEOUT KPOP SDPS ENVELOPE QVIRTUAL
+%token USERNAME PASSWORD FOLDER SMTPHOST FETCHDOMAINS MDA BSMTP LMTP
 %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 BATCHLIMIT FETCHLIMIT FETCHSIZELIMIT FASTUIDL EXPUNGE PROPERTIES
 %token SET LOGFILE DAEMON SYSLOG IDFILE INVISIBLE POSTMASTER BOUNCEMAIL 
 %token SPAMBOUNCE SHOWDOTS
 %token <proto> PROTO AUTHTYPE
@@ -73,8 +80,9 @@ extern char * yytext;
 %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 SSLPROTO
-%token PRINCIPAL
+%token SSL SSLKEY SSLCERT SSLPROTO SSLCERTCK SSLCERTPATH SSLFINGERPRINT
+%token PRINCIPAL ESMTPNAME ESMTPPASSWORD
+%token TRACEPOLLS
 
 %%
 
@@ -89,8 +97,8 @@ statement_list        : statement
 optmap         : MAP | /* EMPTY */;
 
 /* future global options should also have the form SET <name> optmap <value> */
-statement      : SET LOGFILE optmap STRING     {run.logfile = xstrdup($4);}
-               | SET IDFILE optmap STRING      {run.idfile = xstrdup($4);}
+statement      : SET LOGFILE optmap STRING     {run.logfile = prependdir ($4, rcfiledir);}
+               | SET IDFILE optmap STRING      {run.idfile = prependdir ($4, rcfiledir);}
                | SET DAEMON optmap NUMBER      {run.poll_interval = $4;}
                | SET POSTMASTER optmap STRING  {run.postmaster = xstrdup($4);}
                | SET BOUNCEMAIL                {run.bouncemail = TRUE;}
@@ -99,8 +107,11 @@ statement   : SET LOGFILE optmap STRING     {run.logfile = xstrdup($4);}
                | SET NO SPAMBOUNCE             {run.spambounce = FALSE;}
                | SET PROPERTIES optmap STRING  {run.properties =xstrdup($4);}
                | SET SYSLOG                    {run.use_syslog = TRUE;}
+               | SET NO SYSLOG                 {run.use_syslog = FALSE;}
                | SET INVISIBLE                 {run.invisible = TRUE;}
-               | SET SHOWDOTS                  {run.showdots = TRUE;}
+               | SET NO INVISIBLE              {run.invisible = FALSE;}
+               | SET SHOWDOTS                  {run.showdots = FLAG_TRUE;}
+               | SET NO SHOWDOTS               {run.showdots = FLAG_FALSE;}
 
 /* 
  * The way the next two productions are written depends on the fact that
@@ -113,7 +124,7 @@ statement   : SET LOGFILE optmap STRING     {run.logfile = xstrdup($4);}
 
 /* detect and complain about the most common user error */
                | define_server serverspecs userspecs serv_option
-                       {yyerror(_("server option after user options"));}
+                       {yyerror(GT_("server option after user options"));}
                ;
 
 define_server  : POLL STRING           {reset_server($2, FALSE);}
@@ -146,19 +157,21 @@ serv_option       : AKA alias_list
 #else
                                                current.server.authenticate = A_KERBEROS_V4;
 #endif /* KERBEROS_V5 */
-#if INET6_ENABLE
+#ifdef INET6_ENABLE
                                            current.server.service = KPOP_PORT;
 #else /* INET6_ENABLE */
                                            current.server.port = KPOP_PORT;
 #endif /* INET6_ENABLE */
                                        }
                | PRINCIPAL STRING      {current.server.principal = xstrdup($2);}
+               | ESMTPNAME STRING      {current.server.esmtp_name = xstrdup($2);}
+               | ESMTPPASSWORD STRING  {current.server.esmtp_password = xstrdup($2);}
                | PROTOCOL SDPS         {
 #ifdef SDPS_ENABLE
                                            current.server.protocol = P_POP3;
                                            current.server.sdps = TRUE;
 #else
-                                           yyerror(_("SDPS not enabled."));
+                                           yyerror(GT_("SDPS not enabled."));
 #endif /* SDPS_ENABLE */
                                        }
                | UIDL                  {current.server.uidl = FLAG_TRUE;}
@@ -166,12 +179,12 @@ serv_option       : AKA alias_list
                | CHECKALIAS            {current.server.checkalias = FLAG_TRUE;}
                | NO CHECKALIAS         {current.server.checkalias  = FLAG_FALSE;}
                | SERVICE STRING        {
-#if INET6_ENABLE
+#ifdef INET6_ENABLE
                                        current.server.service = $2;
 #endif /* INET6_ENABLE */
                                        }
                | PORT NUMBER           {
-#if INET6_ENABLE
+#ifdef INET6_ENABLE
                                        int port = $2;
                                        char buf[10];
                                        sprintf(buf, "%d", port);
@@ -206,27 +219,27 @@ serv_option       : AKA alias_list
                                            int requestlen;
 
                                            if (net_security_strtorequest($2, &request, &requestlen))
-                                               yyerror(_("invalid security request"));
+                                               yyerror(GT_("invalid security request"));
                                            else {
                                                current.server.netsec = xstrdup($2);
                                                free(request);
                                            }
 #else
-                                           yyerror(_("network-security support disabled"));
+                                           yyerror(GT_("network-security support disabled"));
 #endif /* NET_SECURITY */
                                        }
                | INTERFACE STRING      {
 #if (defined(linux) && !defined(INET6_ENABLE)) || defined(__FreeBSD__)
                                        interface_parse($2, &current.server);
 #else /* (defined(linux) && !defined(INET6_ENABLE)) || defined(__FreeBSD__) */
-                                       fprintf(stderr, _("fetchmail: interface option is only supported under Linux (without IPv6) and FreeBSD\n"));
+                                       fprintf(stderr, GT_("fetchmail: interface option is only supported under Linux (without IPv6) and FreeBSD\n"));
 #endif /* (defined(linux) && !defined(INET6_ENABLE)) || defined(__FreeBSD__) */
                                        }
                | MONITOR STRING        {
 #if (defined(linux) && !defined(INET6_ENABLE)) || defined(__FreeBSD__)
                                        current.server.monitor = xstrdup($2);
 #else /* (defined(linux) && !defined(INET6_ENABLE)) || defined(__FreeBSD__) */
-                                       fprintf(stderr, _("fetchmail: monitor option is only supported under Linux (without IPv6) and FreeBSD\n"));
+                                       fprintf(stderr, GT_("fetchmail: monitor option is only supported under Linux (without IPv6) and FreeBSD\n"));
 #endif /* (defined(linux) && !defined(INET6_ENABLE) || defined(__FreeBSD__)) */
                                        }
                | PLUGIN STRING         { current.server.plugin = xstrdup($2); }
@@ -234,6 +247,8 @@ serv_option : AKA alias_list
                | DNS                   {current.server.dns = FLAG_TRUE;}
                | NO DNS                {current.server.dns = FLAG_FALSE;}
                | NO ENVELOPE           {current.server.envelope = STRING_DISABLED;}
+               | TRACEPOLLS            {current.tracepolls = FLAG_TRUE;}
+               | NO TRACEPOLLS         {current.tracepolls = FLAG_FALSE;}
                ;
 
 userspecs      : user1opts             {record_current(); user_reset();}
@@ -283,6 +298,10 @@ smtp_list  : STRING                {save_str(&current.smtphunt, $1,TRUE);}
                | smtp_list STRING      {save_str(&current.smtphunt, $2,TRUE);}
                ;
 
+fetch_list     : STRING                {save_str(&current.domainlist, $1,TRUE);}
+               | fetch_list STRING     {save_str(&current.domainlist, $2,TRUE);}
+               ;
+
 num_list       : NUMBER
                        {
                            struct idlist *id;
@@ -306,11 +325,12 @@ user_option       : TO localnames HERE
                | PASSWORD STRING       {current.password    = xstrdup($2);}
                | FOLDER folder_list
                | SMTPHOST smtp_list
+               | FETCHDOMAINS fetch_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);}
+               | BSMTP STRING          {current.bsmtp       = prependdir ($2, rcfiledir);}
                | LMTP                  {current.listener    = LMTP_MODE;}
                | PRECONNECT STRING     {current.preconnect  = xstrdup($2);}
                | POSTCONNECT STRING    {current.postconnect = xstrdup($2);}
@@ -327,10 +347,19 @@ user_option       : TO localnames HERE
                | 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);}
+               | SSL                   {
+#ifdef SSL_ENABLE
+                   current.use_ssl = FLAG_TRUE;
+#else
+                   yyerror(GT_("SSL is not enabled"));
+#endif 
+               }
+               | SSLKEY STRING         {current.sslkey = prependdir ($2, rcfiledir);}
+               | SSLCERT STRING        {current.sslcert = prependdir ($2, rcfiledir);}
                | SSLPROTO STRING       {current.sslproto = xstrdup($2);}
+               | SSLCERTCK             {current.sslcertck = FLAG_TRUE;}
+               | SSLCERTPATH STRING    {current.sslcertpath = prependdir($2, rcfiledir);}
+               | SSLFINGERPRINT STRING {current.sslfingerprint = xstrdup($2);}
 
                | NO KEEP               {current.keep        = FLAG_FALSE;}
                | NO FLUSH              {current.flush       = FLAG_FALSE;}
@@ -344,11 +373,13 @@ user_option       : TO localnames HERE
                | NO MIMEDECODE         {current.mimedecode  = FLAG_FALSE;}
                | NO IDLE               {current.idle        = FLAG_FALSE;}
 
-               | NO SSL                {current.use_ssl = 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);}
                | FETCHLIMIT NUMBER     {current.fetchlimit  = NUM_VALUE_IN($2);}
+               | FETCHSIZELIMIT NUMBER {current.fetchsizelimit = NUM_VALUE_IN($2);}
+               | FASTUIDL NUMBER       {current.fastuidl    = NUM_VALUE_IN($2);}
                | BATCHLIMIT NUMBER     {current.batchlimit  = NUM_VALUE_IN($2);}
                | EXPUNGE NUMBER        {current.expunge     = NUM_VALUE_IN($2);}
 
@@ -367,8 +398,8 @@ static struct query *hosttail;      /* where to add new elements */
 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, GT_("%s at %s"), s, 
+                  (yytext && yytext[0]) ? yytext : GT_("end of input"));
     prc_errflag++;
 }
 
@@ -403,16 +434,19 @@ int prc_filecheck(const char *pathname, const flag securecheck)
 
     if (!securecheck)  return PS_SUCCESS;
 
-    if ((statbuf.st_mode & S_IFLNK) == S_IFLNK)
+    if (!S_ISREG(statbuf.st_mode))
     {
-       fprintf(stderr, _("File %s must not be a symbolic link.\n"), pathname);
+       fprintf(stderr, GT_("File %s must be a regular file.\n"), pathname);
        return(PS_IOERR);
     }
 
 #ifndef __BEOS__
-    if (statbuf.st_mode & ~(S_IFREG | S_IREAD | S_IWRITE | S_IEXEC | S_IXGRP))
+#ifdef __CYGWIN__
+    if (cygwin_internal(CW_CHECK_NTSEC, pathname))
+#endif /* __CYGWIN__ */
+    if (statbuf.st_mode & (S_IRGRP | S_IWGRP | S_IROTH | S_IWOTH | S_IXOTH))
     {
-       fprintf(stderr, _("File %s must have no more than -rwx--x--- (0710) permissions.\n"), 
+       fprintf(stderr, GT_("File %s must have no more than -rwx--x--- (0710) permissions.\n"), 
                pathname);
        return(PS_IOERR);
     }
@@ -424,7 +458,7 @@ int prc_filecheck(const char *pathname, const flag securecheck)
     if (statbuf.st_uid != getuid())
 #endif /* HAVE_GETEUID */
     {
-       fprintf(stderr, _("File %s must be owned by you.\n"), pathname);
+       fprintf(stderr, GT_("File %s must be owned by you.\n"), pathname);
        return(PS_IOERR);
     }
 #endif
@@ -548,9 +582,24 @@ static void record_current(void)
     trailer = TRUE;
 }
 
+char *prependdir (const char *file, const char *dir)
+/* if a filename is relative to dir, convert it to an absolute path */
+{
+    char *newfile;
+    if (!file[0] ||                    /* null path */
+       file[0] == '/' ||               /* absolute path */
+       strcmp(file, "-") == 0 ||       /* stdin/stdout */
+       !dir[0])                        /* we don't HAVE_GETCWD */
+       return xstrdup (file);
+    newfile = xmalloc (strlen (dir) + 1 + strlen (file) + 1);
+    if (dir[strlen(dir) - 1] != '/')
+       sprintf (newfile, "%s/%s", dir, file);
+    else
+       sprintf (newfile, "%s%s", dir, file);
+    return newfile;
+}
+
 /* easier to do this than cope with variations in where the library lives */
 int yywrap(void) {return 1;}
 
 /* rcfile_y.y ends here */
-
-