X-Git-Url: http://pileus.org/git/?a=blobdiff_plain;f=rcfile_y.y;h=ba17b9b9bdc71bf060f2dea9b15eeb1c8cf29c31;hb=ae8090aa44620da8f6321a0ffac7b663d1429b7f;hp=da9bb9ebd1f94e8ef9b5906b4b28f1cd89918439;hpb=4fe1884292376b223d3dee76b194a47e90323541;p=~andy%2Ffetchmail diff --git a/rcfile_y.y b/rcfile_y.y index da9bb9eb..ba17b9b9 100644 --- a/rcfile_y.y +++ b/rcfile_y.y @@ -9,7 +9,9 @@ #include #include #include +#if defined(HAVE_SYS_WAIT_H) #include +#endif #include #include #if defined(STDC_HEADERS) @@ -20,16 +22,18 @@ #endif #include -#include "fetchmail.h" +#if NET_SECURITY +#include +#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 */ /* parser sets these */ -int poll_interval; /* poll interval in seconds */ -char *logfile; /* log file for daemon mode */ -flag use_syslog; /* if syslog was set */ struct query *querylist; /* head of server list (globally visible) */ int yydebug; /* in case we didn't generate with -- debug */ @@ -39,9 +43,9 @@ static int prc_errflag; static struct hostdata *leadentry; static flag trailer; -static void record_current(); -static void user_reset(); -static int reset_server(char *name, int skip); +static void record_current(void); +static void user_reset(void); +static void reset_server(const char *name, int skip); /* using Bison, this arranges that yydebug messages will show actual tokens */ extern char * yytext; @@ -55,16 +59,22 @@ extern char * yytext; } %token DEFAULTS POLL SKIP VIA AKA LOCALDOMAINS PROTOCOL -%token AUTHENTICATE TIMEOUT KPOP KERBEROS4 -%token ENVELOPE USERNAME PASSWORD FOLDER SMTPHOST MDA -%token PRECONNECT POSTCONNECT LIMIT +%token AUTHENTICATE TIMEOUT KPOP SDPS +%token ENVELOPE QVIRTUAL USERNAME PASSWORD FOLDER SMTPHOST 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 SET BATCHLIMIT FETCHLIMIT LOGFILE DAEMON SYSLOG INTERFACE MONITOR -%token PROTO +%token BATCHLIMIT FETCHLIMIT EXPUNGE PROPERTIES +%token SET LOGFILE DAEMON SYSLOG IDFILE INVISIBLE POSTMASTER BOUNCEMAIL +%token SPAMBOUNCE SHOWDOTS +%token PROTO AUTHTYPE %token STRING %token NUMBER -%token NO KEEP FLUSH FETCHALL REWRITE FORCECR STRIPCR PASS8BITS DROPSTATUS -%token DNS PORT UIDL INTERVAL +%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 SSLCERTCK SSLCERTPATH SSLFINGERPRINT +%token PRINCIPAL %% @@ -76,10 +86,21 @@ statement_list : statement | statement_list statement ; -/* future global options should also have the form SET */ -statement : SET LOGFILE MAP STRING {logfile = xstrdup($4);} - | SET DAEMON NUMBER {poll_interval = $3;} - | SET SYSLOG {use_syslog = TRUE;} +optmap : MAP | /* EMPTY */; + +/* future global options should also have the form SET optmap */ +statement : SET LOGFILE optmap STRING {run.logfile = xstrdup($4);} + | SET IDFILE optmap STRING {run.idfile = xstrdup($4);} + | SET DAEMON optmap NUMBER {run.poll_interval = $4;} + | 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 @@ -89,41 +110,27 @@ statement : SET LOGFILE MAP STRING {logfile = xstrdup($4);} */ | define_server serverspecs {record_current();} | define_server serverspecs userspecs + +/* detect and complain about the most common user error */ + | define_server serverspecs userspecs serv_option + {yyerror(_("server option after user options"));} ; -define_server : POLL STRING { - if (!reset_server($2, FALSE)) - { - yyerror("duplicate entry name not allowed"); - YYERROR; - } - } - | SKIP STRING { - if (!reset_server($2, TRUE)) - { - yyerror("duplicate entry name not allowed"); - YYERROR; - } - } - | DEFAULTS { - if (!reset_server("defaults", FALSE)) - { - yyerror("can't have two default entries"); - YYERROR; - } - } +define_server : POLL STRING {reset_server($2, FALSE);} + | SKIP STRING {reset_server($2, TRUE);} + | DEFAULTS {reset_server("defaults", FALSE);} ; serverspecs : /* EMPTY */ | serverspecs serv_option ; -alias_list : STRING {save_str(¤t.server.akalist,-1,$1);} - | alias_list STRING {save_str(¤t.server.akalist,-1,$2);} +alias_list : STRING {save_str(¤t.server.akalist,$1,0);} + | alias_list STRING {save_str(¤t.server.akalist,$2,0);} ; -domain_list : STRING {save_str(¤t.server.localdomains,-1,$1);} - | domain_list STRING {save_str(¤t.server.localdomains,-1,$2);} +domain_list : STRING {save_str(¤t.server.localdomains,$1,0);} + | domain_list STRING {save_str(¤t.server.localdomains,$2,0);} ; serv_option : AKA alias_list @@ -132,31 +139,98 @@ serv_option : AKA alias_list | PROTOCOL PROTO {current.server.protocol = $2;} | PROTOCOL KPOP { current.server.protocol = P_POP3; - current.server.preauthenticate = A_KERBEROS_V4; + + if (current.server.authenticate == A_PASSWORD) +#ifdef KERBEROS_V5 + current.server.authenticate = A_KERBEROS_V5; +#else + current.server.authenticate = A_KERBEROS_V4; +#endif /* KERBEROS_V5 */ +#if 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);} + | PROTOCOL SDPS { +#ifdef SDPS_ENABLE + current.server.protocol = P_POP3; + current.server.sdps = TRUE; +#else + yyerror(_("SDPS not enabled.")); +#endif /* SDPS_ENABLE */ } | UIDL {current.server.uidl = FLAG_TRUE;} | NO UIDL {current.server.uidl = FLAG_FALSE;} - | PORT NUMBER {current.server.port = $2;} - | INTERVAL NUMBER {current.server.interval = $2;} - | AUTHENTICATE PASSWORD {current.server.preauthenticate = A_PASSWORD;} - | AUTHENTICATE KERBEROS4 {current.server.preauthenticate = A_KERBEROS_V4;} - | TIMEOUT NUMBER {current.server.timeout = $2;} - | ENVELOPE STRING {current.server.envelope = xstrdup($2);} + | CHECKALIAS {current.server.checkalias = FLAG_TRUE;} + | NO CHECKALIAS {current.server.checkalias = FLAG_FALSE;} + | SERVICE STRING { +#if INET6_ENABLE + current.server.service = $2; +#endif /* INET6_ENABLE */ + } + | PORT NUMBER { +#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_ENABLE */ + } + | INTERVAL NUMBER + {current.server.interval = $2;} + | AUTHENTICATE AUTHTYPE + {current.server.authenticate = $2;} + | TIMEOUT NUMBER + {current.server.timeout = $2;} + | ENVELOPE NUMBER STRING + { + current.server.envelope = + xstrdup($3); + current.server.envskip = $2; + } + | ENVELOPE STRING + { + current.server.envelope = + xstrdup($2); + current.server.envskip = 0; + } + + | QVIRTUAL STRING {current.server.qvirtual=xstrdup($2);} + | NETSEC STRING { +#ifdef NET_SECURITY + void *request; + int requestlen; + + if (net_security_strtorequest($2, &request, &requestlen)) + yyerror(_("invalid security request")); + else { + current.server.netsec = xstrdup($2); + free(request); + } +#else + yyerror(_("network-security support disabled")); +#endif /* NET_SECURITY */ + } | INTERFACE STRING { -#ifdef linux +#if (defined(linux) && !defined(INET6_ENABLE)) || defined(__FreeBSD__) interface_parse($2, ¤t.server); -#else - fprintf(stderr, "fetchmail: interface option is only supported under Linux\n"); -#endif /* linux */ +#else /* (defined(linux) && !defined(INET6_ENABLE)) || defined(__FreeBSD__) */ + fprintf(stderr, _("fetchmail: interface option is only supported under Linux (without IPv6) and FreeBSD\n")); +#endif /* (defined(linux) && !defined(INET6_ENABLE)) || defined(__FreeBSD__) */ } | MONITOR STRING { -#ifdef linux +#if (defined(linux) && !defined(INET6_ENABLE)) || defined(__FreeBSD__) current.server.monitor = xstrdup($2); -#else - fprintf(stderr, "fetchmail: monitor option is only supported under Linux\n"); -#endif /* linux */ +#else /* (defined(linux) && !defined(INET6_ENABLE)) || defined(__FreeBSD__) */ + fprintf(stderr, _("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); } + | PLUGOUT STRING { current.server.plugout = xstrdup($2); } | DNS {current.server.dns = FLAG_TRUE;} | NO DNS {current.server.dns = FLAG_FALSE;} | NO ENVELOPE {current.server.envelope = STRING_DISABLED;} @@ -201,12 +275,26 @@ mapping : STRING {save_str_pair(¤t.localnames, $1, $3);} ; -folder_list : STRING {save_str(¤t.mailboxes,-1,$1);} - | folder_list STRING {save_str(¤t.mailboxes,-1,$2);} +folder_list : STRING {save_str(¤t.mailboxes,$1,0);} + | folder_list STRING {save_str(¤t.mailboxes,$2,0);} ; -smtp_list : STRING {save_str(¤t.smtphunt, -1, $1);} - | smtp_list STRING {save_str(¤t.smtphunt, -1, $2);} +smtp_list : STRING {save_str(¤t.smtphunt, $1,TRUE);} + | smtp_list STRING {save_str(¤t.smtphunt, $2,TRUE);} + ; + +num_list : NUMBER + { + struct idlist *id; + id=save_str(¤t.antispam,STRING_DUMMY,0); + id->val.status.num = $1; + } + | num_list NUMBER + { + struct idlist *id; + id=save_str(¤t.antispam,STRING_DUMMY,0); + id->val.status.num = $2; + } ; user_option : TO localnames HERE @@ -214,35 +302,60 @@ user_option : TO localnames HERE | IS localnames HERE | IS localnames - | IS STRING THERE {current.remotename = xstrdup($2);} - | PASSWORD STRING {current.password = xstrdup($2);} + | IS STRING THERE {current.remotename = xstrdup($2);} + | PASSWORD STRING {current.password = xstrdup($2);} | FOLDER folder_list | SMTPHOST smtp_list - | MDA STRING {current.mda = xstrdup($2);} - | PRECONNECT STRING {current.preconnect = xstrdup($2);} + | 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);} + | LMTP {current.listener = LMTP_MODE;} + | PRECONNECT STRING {current.preconnect = xstrdup($2);} | POSTCONNECT STRING {current.postconnect = xstrdup($2);} - | KEEP {current.keep = FLAG_TRUE;} - | FLUSH {current.flush = FLAG_TRUE;} - | FETCHALL {current.fetchall = FLAG_TRUE;} - | REWRITE {current.rewrite = FLAG_TRUE;} - | FORCECR {current.forcecr = FLAG_TRUE;} - | STRIPCR {current.stripcr = FLAG_TRUE;} - | PASS8BITS {current.pass8bits = FLAG_TRUE;} - | DROPSTATUS {current.dropstatus = FLAG_TRUE;} - - | NO KEEP {current.keep = FLAG_FALSE;} - | NO FLUSH {current.flush = FLAG_FALSE;} - | NO FETCHALL {current.fetchall = FLAG_FALSE;} - | NO REWRITE {current.rewrite = FLAG_FALSE;} - | NO FORCECR {current.forcecr = FLAG_FALSE;} - | NO STRIPCR {current.stripcr = FLAG_FALSE;} - | NO PASS8BITS {current.pass8bits = FLAG_FALSE;} - | NO DROPSTATUS {current.dropstatus = FLAG_FALSE;} - - | LIMIT NUMBER {current.limit = $2;} - | FETCHLIMIT NUMBER {current.fetchlimit = $2;} - | BATCHLIMIT NUMBER {current.batchlimit = $2;} + | KEEP {current.keep = FLAG_TRUE;} + | FLUSH {current.flush = FLAG_TRUE;} + | FETCHALL {current.fetchall = FLAG_TRUE;} + | REWRITE {current.rewrite = FLAG_TRUE;} + | FORCECR {current.forcecr = FLAG_TRUE;} + | 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);} + | SSLPROTO STRING {current.sslproto = xstrdup($2);} + | SSLCERTCK {current.sslcertck = FLAG_TRUE;} + | SSLCERTPATH STRING {current.sslcertpath = xstrdup($2);} + | SSLFINGERPRINT STRING {current.sslfingerprint = xstrdup($2);} + + | NO KEEP {current.keep = FLAG_FALSE;} + | NO FLUSH {current.flush = FLAG_FALSE;} + | NO FETCHALL {current.fetchall = FLAG_FALSE;} + | NO REWRITE {current.rewrite = FLAG_FALSE;} + | NO FORCECR {current.forcecr = 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);} + | FETCHLIMIT NUMBER {current.fetchlimit = NUM_VALUE_IN($2);} + | BATCHLIMIT NUMBER {current.batchlimit = NUM_VALUE_IN($2);} + | EXPUNGE NUMBER {current.expunge = NUM_VALUE_IN($2);} + + | PROPERTIES STRING {current.properties = xstrdup($2);} ; %% @@ -257,22 +370,26 @@ static struct query *hosttail; /* where to add new elements */ void yyerror (const char *s) /* report a syntax error */ { - error_at_line( 0, 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++; } -int prc_filecheck(pathname) +int prc_filecheck(const char *pathname, const flag securecheck) /* check that a configuration file is secure */ -const char *pathname; /* pathname for the configuration file */ { +#ifndef __EMX__ struct stat statbuf; errno = 0; - /* special cases useful for debugging purposes */ + /* special case useful for debugging purposes */ if (strcmp("/dev/null", pathname) == 0) - return(0); + return(PS_SUCCESS); + + /* pass through the special name for stdin */ + if (strcmp("-", pathname) == 0) + return(PS_SUCCESS); /* the run control file must have the same uid as the REAL uid of this process, it must have permissions no greater than 600, and it must not @@ -280,36 +397,45 @@ const char *pathname; /* pathname for the configuration file */ if (lstat(pathname, &statbuf) < 0) { if (errno == ENOENT) - return(0); + return(PS_SUCCESS); else { - error(0, errno, "lstat: %s", pathname); + report(stderr, "lstat: %s: %s\n", pathname, strerror(errno)); return(PS_IOERR); } } - if ((statbuf.st_mode & S_IFLNK) == S_IFLNK) { - fprintf(stderr, "File %s must not be a symbolic link.\n", pathname); - return(PS_AUTHFAIL); + 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); + return(PS_IOERR); } - if (statbuf.st_mode & ~(S_IFREG | S_IREAD | S_IWRITE)) { - fprintf(stderr, "File %s must have no more than -rw------ (0600) permissions.\n", +#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"), pathname); - return(PS_AUTHFAIL); + return(PS_IOERR); } +#endif /* __BEOS__ */ - if (statbuf.st_uid != getuid()) { - fprintf(stderr, "File %s must be owned by you.\n", pathname); - return(PS_AUTHFAIL); +#ifdef HAVE_GETEUID + if (statbuf.st_uid != geteuid()) +#else + if (statbuf.st_uid != getuid()) +#endif /* HAVE_GETEUID */ + { + fprintf(stderr, _("File %s must be owned by you.\n"), pathname); + return(PS_IOERR); } - - return(0); +#endif + return(PS_SUCCESS); } -int prc_parse_file (pathname, securecheck) +int prc_parse_file (const char *pathname, const flag securecheck) /* digest the configuration into a linked list of host records */ -const char *pathname; /* pathname for the configuration file */ -const flag securecheck; /* check for a secure rc file? */ { prc_errflag = 0; querylist = hosttail = (struct query *)NULL; @@ -317,29 +443,41 @@ const flag securecheck; /* check for a secure rc file? */ errno = 0; /* Check that the file is secure */ - if (securecheck && (prc_errflag = prc_filecheck(pathname)) != 0) + if ( (prc_errflag = prc_filecheck(pathname, securecheck)) != 0 ) return(prc_errflag); - if (errno == ENOENT) - return(0); - - /* Open the configuration and feed it to the lexer. */ - if ((yyin = fopen(pathname,"r")) == (FILE *)NULL) { - error(0, errno, "open: %s", pathname); + /* + * 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. */ + if (strcmp(pathname, "-") == 0) + yyin = stdin; + else if ((yyin = fopen(pathname,"r")) == (FILE *)NULL) { + report(stderr, "open: %s: %s\n", pathname, strerror(errno)); return(PS_IOERR); } yyparse(); /* parse entire file */ - fclose(yyin); + fclose(yyin); /* not checking this should be safe, file mode was r */ if (prc_errflag) return(PS_SYNTAX); else - return(0); + return(PS_SUCCESS); } -static int reset_server(char *name, int skip) +static void reset_server(const char *name, int skip) /* clear the entire global record and initialize it with a new name */ { trailer = FALSE; @@ -347,7 +485,7 @@ static int reset_server(char *name, int skip) current.smtp_socket = -1; current.server.pollname = xstrdup(name); current.server.skip = skip; - return(TRUE); + current.server.principal = (char *)NULL; } @@ -380,7 +518,13 @@ struct query *init; /* pointer to block containing initial values */ node = (struct query *) xmalloc(sizeof(struct query)); /* initialize it */ - memcpy(node, init, sizeof(struct query)); + if (init) + memcpy(node, init, sizeof(struct query)); + else + { + memset(node, '\0', sizeof(struct query)); + node->smtp_socket = -1; + } /* append to end of list */ if (hosttail != (struct query *) 0) @@ -403,95 +547,13 @@ struct query *init; /* pointer to block containing initial values */ static void record_current(void) /* register current parameters and append to the host list */ { -#define FLAG_FORCE(fld) if (cmd_opts.fld) current.fld = cmd_opts.fld - FLAG_FORCE(server.via); - FLAG_FORCE(server.protocol); - FLAG_FORCE(server.port); - FLAG_FORCE(server.interval); - FLAG_FORCE(server.preauthenticate); - FLAG_FORCE(server.timeout); - FLAG_FORCE(server.envelope); - FLAG_FORCE(server.skip); - FLAG_FORCE(server.dns); - -#ifdef linux - FLAG_FORCE(server.interface); - FLAG_FORCE(server.monitor); - FLAG_FORCE(server.interface_pair); -#endif /* linux */ - - FLAG_FORCE(remotename); - FLAG_FORCE(password); - if (cmd_opts.mailboxes) - save_str(¤t.mailboxes, -1, cmd_opts.mailboxes->id); - if (cmd_opts.smtphunt) - save_str(¤t.smtphunt, -1, cmd_opts.smtphunt->id); - FLAG_FORCE(mda); - FLAG_FORCE(preconnect); - FLAG_FORCE(postconnect); - - FLAG_FORCE(keep); - FLAG_FORCE(flush); - FLAG_FORCE(fetchall); - FLAG_FORCE(rewrite); - FLAG_FORCE(forcecr); - FLAG_FORCE(stripcr); - FLAG_FORCE(pass8bits); - FLAG_FORCE(limit); - FLAG_FORCE(fetchlimit); - FLAG_FORCE(batchlimit); - -#undef FLAG_FORCE - (void) hostalloc(¤t); - trailer = TRUE; } -void optmerge(struct query *h2, struct query *h1) -/* merge two options records; empty fields in h2 are filled in from h1 */ -{ - append_str_list(&h2->server.localdomains, &h1->server.localdomains); - append_str_list(&h2->localnames, &h1->localnames); - append_str_list(&h2->mailboxes, &h1->mailboxes); - append_str_list(&h2->smtphunt, &h1->smtphunt); - -#define FLAG_MERGE(fld) if (!h2->fld) h2->fld = h1->fld - FLAG_MERGE(server.via); - FLAG_MERGE(server.protocol); - FLAG_MERGE(server.port); - FLAG_MERGE(server.interval); - FLAG_MERGE(server.preauthenticate); - FLAG_MERGE(server.timeout); - FLAG_MERGE(server.envelope); - FLAG_MERGE(server.skip); - FLAG_MERGE(server.dns); - -#ifdef linux - FLAG_MERGE(server.interface); - FLAG_MERGE(server.monitor); - FLAG_MERGE(server.interface_pair); -#endif /* linux */ - - FLAG_MERGE(remotename); - FLAG_MERGE(password); - FLAG_MERGE(mda); - FLAG_MERGE(preconnect); - - FLAG_MERGE(keep); - FLAG_MERGE(flush); - FLAG_MERGE(fetchall); - FLAG_MERGE(rewrite); - FLAG_MERGE(forcecr); - FLAG_MERGE(stripcr); - FLAG_MERGE(pass8bits); - FLAG_MERGE(limit); - FLAG_MERGE(fetchlimit); - FLAG_MERGE(batchlimit); -#undef FLAG_MERGE -} - /* easier to do this than cope with variations in where the library lives */ int yywrap(void) {return 1;} /* rcfile_y.y ends here */ + +