]> Pileus Git - ~andy/fetchmail/commitdiff
Add stripcr option.
authorEric S. Raymond <esr@thyrsus.com>
Thu, 30 Jan 1997 17:29:36 +0000 (17:29 -0000)
committerEric S. Raymond <esr@thyrsus.com>
Thu, 30 Jan 1997 17:29:36 +0000 (17:29 -0000)
svn path=/trunk/; revision=842

NEWS
README
driver.c
fetchmail.c
fetchmail.h
fetchmail.man
rcfile_l.l
rcfile_y.y

diff --git a/NEWS b/NEWS
index db980a969a715cb11ad683114256feca7a10cd5d..e78160a46aa3ecdd63fa8dae4e30a76edaacb6a8 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -5,6 +5,9 @@ fetchmail-3.3 ()
 
 features --
 
+* Whether or not carriage returns will be stripped on output is explicitly
+  controllable with stripcr.
+
 bugs --
 
 * Correction to length-extraction code for servers that return (nnn octets).
diff --git a/README b/README
index 8c7688e73f72b6d3f5c4a14808f716125bc6845f..3947f9c1fa06d1f25b1e578940ccd2e8f800b4f9 100644 (file)
--- a/README
+++ b/README
@@ -21,6 +21,9 @@ Since 3.0:
 
        ** Support for ESMTP 8BITMIME and SIZE options.
 
+       ** The stripcr option to explicitly control carriage-return
+          stripping before mail forwarding.
+
 Since 2.0:
 
        ** Support for secure use with ssh.
index d11d8c2a440d2416e151ba8e0b64884f44448f16..aad433320317ea2c6e870f9e31aeb4689ab05065 100644 (file)
--- a/driver.c
+++ b/driver.c
@@ -765,19 +765,22 @@ char *realname;           /* real name of host */
     }
 
     /* write all the headers */
-    if (sinkfp)
+    if (ctl->stripcr)
     {
-       if (ctl->mda)
-       {
-           char        *sp, *tp;
+       char    *sp, *tp;
 
-           for (sp = tp = headers; *sp; sp++)
-               if (*sp != '\r')
-                   *tp++ =  *sp;
-           *tp = '\0';
+       for (sp = tp = headers; *sp; sp++)
+           if (*sp != '\r')
+               *tp++ =  *sp;
+       *tp = '\0';
 
+    }
+
+    /* write all the headers */
+    if (sinkfp)
+    {
+       if (ctl->mda)
            n = fwrite(headers, 1, strlen(headers), sinkfp);
-       }
        else
            n = SockWrite(headers, 1, strlen(headers), sinkfp);
 
@@ -842,18 +845,20 @@ char *realname;           /* real name of host */
        strcat(errmsg, "\n");
 
        /* ship out the error line */
+       if (ctl->stripcr)
+       {
+           char        *sp, *tp;
+
+           for (sp = tp = errmsg; *sp; sp++)
+               if (*sp != '\r')
+                   *tp++ =  *sp;
+           *tp = '\0';
+       }
+
        if (sinkfp)
        {
            if (ctl->mda)
-           {
-               char    *sp, *tp;
-
-               for (sp = tp = errmsg; *sp; sp++)
-                   if (*sp != '\r')
-                       *tp++ =  *sp;
-               *tp = '\0';
                fwrite(errmsg, 1, strlen(errmsg), sinkfp);
-           }
            else
                SockWrite(errmsg, 1, strlen(errmsg), sinkfp);
        }
@@ -909,7 +914,7 @@ char *realname;             /* real name of host */
                else
                    SockWrite(buf, 1, 1, sinkfp);
 
-           if (ctl->mda)
+           if (ctl->stripcr)
            {
                char    *sp, *tp;
 
@@ -917,9 +922,10 @@ char *realname;            /* real name of host */
                    if (*sp != '\r')
                        *tp++ =  *sp;
                *tp = '\0';
+           }
 
+           if (ctl->mda)
                n = fwrite(buf, 1, strlen(buf), sinkfp);
-           }
            else if (sinkfp)
                n = SockWrite(buf, 1, strlen(buf), sinkfp);
 
index 75d9e542a8037d6f4254c50115582740a4ec0d5a..47fcfe72587f0ed375f589e76c0933f1171a7e38 100644 (file)
@@ -630,6 +630,10 @@ static int load_params(int argc, char **argv, int optind)
            ctl->server.lead_server = &(ctl->server);
        no_new_server:;
 
+           /* if stripcr hasn't been set, default it asccording to MDA */
+           if (ctl->stripcr == -1)
+               ctl->stripcr = !ctl->mda;
+
            /* plug in the semi-standard way of indicating a mail address */
            if (ctl->server.envelope == (char *)NULL)
                ctl->server.envelope = "X-Envelope-To:";
@@ -826,6 +830,9 @@ void dump_params (struct query *ctl)
     printf("  Rewrite of server-local addresses is %sabled (--norewrite %s).\n",
           ctl->no_rewrite ? "dis" : "en",
           ctl->no_rewrite ? "on" : "off");
+    printf("  Carriage-return stripping is %sabled (--stripcr %s).\n",
+          ctl->stripcr ? "en" : "dis",
+          ctl->stripcr ? "on" : "off");
     if (ctl->limit)
        printf("  Message size limit is %d bytes (--limit %d).\n", 
               ctl->limit, ctl->limit);
index 18bfbe1f097c3e794df69542223687053c009659..4f974b45346574f0e1fd31adcc970cac3ce5440e 100644 (file)
@@ -106,6 +106,7 @@ struct query
     int fetchall;
     int flush;
     int no_rewrite;
+    int stripcr;
     int limit;
     int fetchlimit;
     int batchlimit;
index 1108103295f7f656a197d0bb52770b778dccfb15..24495d9878c85d96b611948e8f193443045ab2f7 100644 (file)
@@ -594,7 +594,7 @@ Legal user options are
 .PP
 All options correspond to the obvious command-line arguments except
 the following: `aka', `is', `to', `dns'/`no dns', `password',
-`preconnect', and `localdomains'.
+`preconnect', `localdomains', and `stripcr'.
 .PP
 The `is' or `to' keywords associate the following local (client)
 name(s) (or server-name to client-name mappings separated by =) with
@@ -651,6 +651,12 @@ establishes a mailserver connection.  This may be useful if you are
 attempting to set up secure POP connections with the aid of
 .IR ssh (1).
 .PP
+The `stripcr' option controls whether carriage returns are stripped
+out of retrieved mail before it is forwarded.  It is normally not
+necessary to set this, because it defaults to `on' (CR stripping
+enabled) when there is an MDA declared but `off' (CR stripping
+disabled) when forwarding is via SMTP.
+.PP
 Legal protocol identifiers are
 
     auto (or AUTO)
index 8156fd6a930bd146a062f8f9288516fe82d7c089..059b07c238d0503f8ebf1b2a7f8e10880e8f39ac 100644 (file)
@@ -59,18 +59,14 @@ keep                { yylval.flag = FLAG_TRUE; return KEEP; }
 flush          { yylval.flag = FLAG_TRUE; return FLUSH; }
 fetchall       { yylval.flag = FLAG_TRUE; return FETCHALL; }
 rewrite                { yylval.flag = FLAG_TRUE; return REWRITE; }
+stripcr                { yylval.flag = FLAG_TRUE; return STRIPCR; }
 dns            { yylval.flag = FLAG_TRUE; return DNS; }
 
-nokeep         { yylval.flag = FLAG_FALSE; return KEEP; }
-noflush                { yylval.flag = FLAG_FALSE; return FLUSH; }
-nofetchall     { yylval.flag = FLAG_FALSE; return FETCHALL; }
-norewrite      { yylval.flag = FLAG_FALSE; return REWRITE; }
-nodns          { yylval.flag = FLAG_FALSE; return DNS; }
-
 no{WS}keep     { yylval.flag = FLAG_FALSE; return KEEP; }
 no{WS}flush    { yylval.flag = FLAG_FALSE; return FLUSH; }
 no{WS}fetchall { yylval.flag = FLAG_FALSE; return FETCHALL; }
 no{WS}rewrite  { yylval.flag = FLAG_FALSE; return REWRITE; }
+no{WS}stripcr  { yylval.flag = FLAG_FALSE; return REWRITE; }
 no{WS}dns      { yylval.flag = FLAG_FALSE; return DNS; }
 
 limit          { return LIMIT; }
index dfc3dbddc1e81a8c661e5cf4f5912ab60cd653c6..e9a381b022fd283f0320d2f427f0ca839dec5321 100644 (file)
@@ -49,7 +49,7 @@ static void prc_reset();
 %token <proto> PROTO
 %token <sval>  STRING
 %token <number> NUMBER
-%token <flag>  KEEP FLUSH FETCHALL REWRITE DNS PORT
+%token <flag>  KEEP FLUSH FETCHALL REWRITE STRIPCR DNS PORT
 
 /* these are actually used by the lexer */
 %token FLAG_TRUE       2
@@ -76,7 +76,10 @@ statement    : SET LOGFILE MAP STRING        {logfile = xstrdup($4);}
  */
                | define_server serverspecs     {prc_register(); prc_reset();}
                | define_server serverspecs userspecs
-                               {memset(&current,'\0',sizeof(current));}
+                               {
+                                       memset(&current,'\0',sizeof(current));
+                                       current.stripcr = -1;
+                               }
                ;
 
 define_server  : POLL STRING   {current.server.names = (struct idlist *)NULL;
@@ -192,6 +195,7 @@ user_option : TO localnames HERE
                | FLUSH                 {current.flush = ($1==FLAG_TRUE);}
                | FETCHALL              {current.fetchall = ($1==FLAG_TRUE);}
                | REWRITE               {current.no_rewrite =($1==FLAG_FALSE);}
+               | STRIPCR               {current.stripcr = ($1==FLAG_TRUE);}
                | LIMIT NUMBER          {current.limit = $2;}
                | FETCHLIMIT NUMBER     {current.fetchlimit = $2;}
                | BATCHLIMIT NUMBER     {current.batchlimit = $2;}