I felt hacking custom scripts to add the In-Reply-To header in a reply
is a bad solution if there's no reason we can't just make mail do it
automagically. So, here comes the diff.
There are a few additional changes here:
- Names starting with underscores are reserved, so I gave
_respond and _Respond names which also document their
behavior a little better. Now they're replyall and
replyorig.
- Ansify replyall
- Fix up whitespace in a couple relevant places.
If someone insists, I might look into adding a knob, though I don't
really see why anyone should want to turn this behavior off.
Index: src/usr.bin/mail//cmd3.c
===================================================================
RCS file: /cvs/src/usr.bin/mail/cmd3.c,v
retrieving revision 1.25
diff -u -p -r1.25 cmd3.c
--- src/usr.bin/mail//cmd3.c 6 Apr 2011 11:36:26 -0000 1.25
+++ src/usr.bin/mail//cmd3.c 26 Jul 2011 13:15:26 -0000
@@ -176,9 +176,9 @@ respond(void *v)
int *msgvec = v;
if (value("Replyall") == NULL)
- return(_respond(msgvec));
+ return(replyall(msgvec));
else
- return(_Respond(msgvec));
+ return(replyorig(msgvec));
}
/*
@@ -186,8 +186,7 @@ respond(void *v)
* message header and send them off to mail1()
*/
int
-_respond(msgvec)
- int *msgvec;
+replyall(int *msgvec)
{
struct message *mp;
char *cp, *rcv, *replyto;
@@ -239,6 +238,7 @@ _respond(msgvec)
head.h_cc = np;
} else
head.h_cc = NULL;
+ head.h_inreplyto = hfield("message-id", mp);
head.h_bcc = NULL;
head.h_smopts = NULL;
mail1(&head, 1);
@@ -586,9 +586,9 @@ Respond(void *v)
int *msgvec = v;
if (value("Replyall") == NULL)
- return(_Respond(msgvec));
+ return(replyorig(msgvec));
else
- return(_respond(msgvec));
+ return(replyall(msgvec));
}
/*
@@ -597,7 +597,7 @@ Respond(void *v)
* reply.
*/
int
-_Respond(int *msgvec)
+replyorig(int *msgvec)
{
struct header head;
struct message *mp;
@@ -619,6 +619,7 @@ _Respond(int *msgvec)
if ((head.h_subject = hfield("subject", mp)) == NULL)
head.h_subject = hfield("subj", mp);
head.h_subject = reedit(head.h_subject);
+ head.h_inreplyto = hfield("message-id", mp);
head.h_cc = NULL;
head.h_bcc = NULL;
head.h_smopts = NULL;
Index: src/usr.bin/mail//collect.c
===================================================================
RCS file: /cvs/src/usr.bin/mail/collect.c,v
retrieving revision 1.33
diff -u -p -r1.33 collect.c
--- src/usr.bin/mail//collect.c 6 Apr 2011 11:36:26 -0000 1.33
+++ src/usr.bin/mail//collect.c 26 Jul 2011 13:15:26 -0000
@@ -328,7 +328,8 @@ cont:
*/
rewind(collf);
puts("-------\nMessage contains:");
- puthead(hp, stdout, GTO|GSUBJECT|GCC|GBCC|GNL);
+ puthead(hp, stdout,
+ GTO|GSUBJECT|GCC|GBCC|GINREPLYTO|GNL);
while ((t = getc(collf)) != EOF)
(void)putchar(t);
goto cont;
Index: src/usr.bin/mail//def.h
===================================================================
RCS file: /cvs/src/usr.bin/mail/def.h,v
retrieving revision 1.13
diff -u -p -r1.13 def.h
--- src/usr.bin/mail//def.h 25 Jun 2003 15:13:32 -0000 1.13
+++ src/usr.bin/mail//def.h 26 Jul 2011 13:15:26 -0000
@@ -155,11 +155,12 @@ struct headline {
char *l_date; /* The entire date string */
};
-#define GTO 1 /* Grab To: line */
-#define GSUBJECT 2 /* Likewise, Subject: line */
-#define GCC 4 /* And the Cc: line */
-#define GBCC 8 /* And also the Bcc: line */
-#define GMASK (GTO|GSUBJECT|GCC|GBCC)
+#define GTO 1 /* Grab To: line */
+#define GSUBJECT 2 /* Likewise, Subject: line */
+#define GCC 4 /* And the Cc: line */
+#define GBCC 8 /* And also the Bcc: line */
+#define GINREPLYTO 16 /* In-Reply-To: line */
+#define GMASK (GTO|GSUBJECT|GCC|GBCC|GINREPLYTO)
/* Mask of places from whence */
#define GNL 16 /* Print blank line after */
@@ -173,6 +174,7 @@ struct headline {
struct header {
struct name *h_to; /* Dynamic "To:" string */
char *h_subject; /* Subject string */
+ char *h_inreplyto; /* In reply to */
struct name *h_cc; /* Carbon copies string */
struct name *h_bcc; /* Blind carbon copies */
struct name *h_smopts; /* Sendmail options */
Index: src/usr.bin/mail//extern.h
===================================================================
RCS file: /cvs/src/usr.bin/mail/extern.h,v
retrieving revision 1.27
diff -u -p -r1.27 extern.h
--- src/usr.bin/mail//extern.h 28 Jul 2009 16:05:04 -0000 1.27
+++ src/usr.bin/mail//extern.h 26 Jul 2011 13:15:26 -0000
@@ -81,8 +81,6 @@ int More(void *);
int Pclose(FILE *);
int Respond(void *);
int Type(void *);
-int _Respond(int *);
-int _respond(int *);
void alter(char *);
int alternates(void *);
void announce(void);
@@ -201,6 +199,8 @@ int readline(FILE *, char *, int, int *
void register_file(FILE *, int, pid_t);
void regret(int);
void relsesigs(void);
+int replyall(int *);
+int replyorig(int *);
int respond(void *);
int retfield(void *);
int rexit(void *);
Index: src/usr.bin/mail//send.c
===================================================================
RCS file: /cvs/src/usr.bin/mail/send.c,v
retrieving revision 1.22
diff -u -p -r1.22 send.c
--- src/usr.bin/mail//send.c 27 Oct 2009 23:59:40 -0000 1.22
+++ src/usr.bin/mail//send.c 26 Jul 2011 13:15:26 -0000
@@ -286,6 +286,7 @@ mail(struct name *to, struct name *cc, s
head.h_subject = subject;
head.h_cc = cc;
head.h_bcc = bcc;
+ head.h_inreplyto = NULL;
head.h_smopts = smopts;
mail1(&head, 0);
return(0);
@@ -306,6 +307,7 @@ sendmail(void *v)
head.h_subject = NULL;
head.h_cc = NULL;
head.h_bcc = NULL;
+ head.h_inreplyto = NULL;
head.h_smopts = NULL;
mail1(&head, 0);
return(0);
@@ -463,7 +465,7 @@ infix(struct header *hp, FILE *fi)
return(fi);
}
(void)rm(tempname);
- (void)puthead(hp, nfo, GTO|GSUBJECT|GCC|GBCC|GNL|GCOMMA);
+ (void)puthead(hp, nfo, GTO|GSUBJECT|GCC|GBCC|GINREPLYTO|GNL|GCOMMA);
c = getc(fi);
while (c != EOF) {
(void)putc(c, nfo);
@@ -499,13 +501,15 @@ puthead(struct header *hp, FILE *fo, int
gotcha = 0;
if (hp->h_to != NULL && w & GTO)
- fmt("To:", hp->h_to, fo, w&GCOMMA), gotcha++;
+ fmt("To:", hp->h_to, fo, w & GCOMMA), gotcha++;
if (hp->h_subject != NULL && w & GSUBJECT)
fprintf(fo, "Subject: %s\n", hp->h_subject), gotcha++;
if (hp->h_cc != NULL && w & GCC)
- fmt("Cc:", hp->h_cc, fo, w&GCOMMA), gotcha++;
+ fmt("Cc:", hp->h_cc, fo, w & GCOMMA), gotcha++;
if (hp->h_bcc != NULL && w & GBCC)
- fmt("Bcc:", hp->h_bcc, fo, w&GCOMMA), gotcha++;
+ fmt("Bcc:", hp->h_bcc, fo, w & GCOMMA), gotcha++;
+ if (hp->h_inreplyto != NULL && w & GINREPLYTO)
+ fprintf(fo, "In-Reply-To: %s\n", hp->h_inreplyto), gotcha++;
if (gotcha && w & GNL)
(void)putc('\n', fo);
return(0);