#include <net/security.h>
#endif /* NET_SECURITY */
+#if defined(__CYGWIN__)
+#include <sys/cygwin.h>
+#endif /* __CYGWIN__ */
+
#include "fetchmail.h"
#include "i18n.h"
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)
%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
%token DROPSTATUS DROPDELIVERED
%token DNS SERVICE PORT UIDL INTERVAL MIMEDECODE IDLE CHECKALIAS
%token SSL SSLKEY SSLCERT SSLPROTO SSLCERTCK SSLCERTPATH SSLFINGERPRINT
-%token PRINCIPAL
+%token PRINCIPAL ESMTPNAME ESMTPPASSWORD
%token TRACEPOLLS
%%
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;}
| SET NO SYSLOG {run.use_syslog = FALSE;}
| SET INVISIBLE {run.invisible = TRUE;}
| SET NO INVISIBLE {run.invisible = FALSE;}
- | SET SHOWDOTS {run.showdots = TRUE;}
- | SET NO SHOWDOTS {run.showdots = 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
#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;
| 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);
| 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);}
yyerror(GT_("SSL is not enabled"));
#endif
}
- | SSLKEY STRING {current.sslkey = xstrdup($2);}
- | SSLCERT STRING {current.sslcert = xstrdup($2);}
+ | 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 = xstrdup($2);}
+ | SSLCERTPATH STRING {current.sslcertpath = prependdir($2, rcfiledir);}
| SSLFINGERPRINT STRING {current.sslfingerprint = xstrdup($2);}
| NO KEEP {current.keep = FLAG_FALSE;}
| NO MIMEDECODE {current.mimedecode = FLAG_FALSE;}
| NO IDLE {current.idle = FLAG_FALSE;}
- | NO SSL {
-#ifdef SSL_ENABLE
- current.use_ssl = FLAG_FALSE;
-#else
- yyerror(GT_("SSL is not enabled"))
-#endif
- }
+ | 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);}
if (!securecheck) return PS_SUCCESS;
- if ((statbuf.st_mode & S_IFLNK) == S_IFLNK)
+ if (!S_ISREG(statbuf.st_mode))
{
- fprintf(stderr, GT_("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, GT_("File %s must have no more than -rwx--x--- (0710) permissions.\n"),
pathname);
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 */
-
-