> Download: http://www.courier-mta.org/download.php
>
> This is a maintenance release.
>
> [ ... ]

Sam,

A couple months ago, you asked to be reminded around now about a patch I
created for Courier.  It adds an "id" field to the initial "Received:"
header that Courier inserts into incoming messages.  This field is
Courier's queue ID for the message.  Its use is consistent with RFC's,
and there is a precedent for the use of such an "id" field in other
mailers.

For example of the results of this patch, see the 4th line of the
following header:

  Received: from localhost (localhost [127.0.0.1])
    (uid 0)
    by asfast.net with local; Fri, 26 Mar 2004 16:19:05 -0500
    id 003396F9.40649E49.000129D8

The reason I created this patch is so a global filter can use this ID as
a key to store state information for an incoming message.  This will
allow a subsequent local filter to retrieve this state information and
then either modify or delete the message based on this saved state.

Therefore, the simple addition of this ID allows for a global filter to
control the modification or deletion of a message without a major
redesign/rewrite of Courier.

I will supply an example for this state management code soon.

I have made a slight change to the original patch that I submitted a
couple months ago.  The current version puts the "id" field at the end
of the "Received:" header.

This patch is attached.

Thank you.

*** courier/submit.h.orig	Mon Sep 22 19:43:24 2003
--- courier/submit.h	Mon Mar 15 19:17:15 2004
***************
*** 117,122 ****
--- 117,123 ----
  	SubmitFile();
  	~SubmitFile();
  
+ 	char* QueueID();
  	void SendingModule(const char *p) {sending_module=p;}
  	void Sender(const char *, const char *, const char *, char);
  	int ChkRecipient(const char *);
*** courier/submit.C.orig	Mon Dec 15 20:51:29 2003
--- courier/submit.C	Wed Mar 24 13:40:51 2004
***************
*** 1096,1101 ****
--- 1096,1106 ----
  	line += mf->module->name;
  	line += "; ";
  	line += rfc822_mkdate(submit_time);
+ 
+ 	// Add unique id here.
+ 	line += "\n  id ";
+ 	line += my_rcptinfo.submitfile.QueueID();
+ 
  	line += "\n";
  
  	for (p=line; *p; p++)
*** courier/submit2.C.orig	Mon Sep 22 19:44:30 2003
--- courier/submit2.C	Mon Mar 15 19:17:15 2004
***************
*** 434,439 ****
--- 434,500 ----
  		) ;
  }
  
+ char *SubmitFile::QueueID()
+ {
+ struct stat stat_buf;
+ char ino_buf[sizeof(ino_t)*2+1];
+ char time_buf[sizeof(time_t)*2+1];
+ char pid_buf[sizeof(time_t)*2+1];
+ static char result[sizeof(ino_buf)+sizeof(time_buf)+sizeof(pid_buf)];
+ 
+ 	char* f = strdup(name1stctlfile());
+ 	if (f == NULL)
+ 	{
+ 		clog_msg_errno();
+ 	}
+ int rc = stat(f, &stat_buf);
+ 	if (rc != 0)
+ 	{
+ 		free(f);
+ 		clog_msg_errno();
+ 	}
+ 	// This code assumes that the result of name1stcltfile() is
+ 	// of the form SOMETHING/tttttt.ppppp.hhhhhh, where
+ 	// SOMETHING is arbitrary (as far as this routine is concerned),
+ 	// where tttttt is the modification time of the control file,
+ 	// where pppppp is the pid of the process which created
+ 	// the control file, and where hhhhhh can contain zero or
+ 	// more dots.
+ char* cp = f;
+ char* slash = f;
+ 	for (; *cp != '\0'; cp++) {
+ 		if (*cp == '/')
+ 		{
+ 			slash = cp;
+ 		}
+ 	}
+ 	cp = slash + 1;
+ char* dot = cp;
+ 	for (; *dot != '.'; dot++) { /* do nothing */ }
+ 	*dot++ = '\0';
+ time_t tm = (time_t) atoi(cp);
+ 	cp = dot;
+ 	for (; *dot != '.'; dot++) { /* do nothing */ }
+ 	*dot++ = '\0';
+ int pid = atoi(cp);
+ 	free(f);
+ 	libmail_strh_ino_t(stat_buf.st_ino, ino_buf);
+ 	libmail_strh_time_t(tm, time_buf);
+ 	libmail_strh_pid_t(pid, pid_buf);
+ 
+ 	strcat(
+ 	strcat(
+ 	strcat(
+ 	strcat(
+ 	strcpy(result, ino_buf)
+ 		, ".")
+ 		, time_buf)
+ 		, ".")
+ 		, pid_buf) ;
+ 
+ 	return (result);
+ }
+ 
  char *SubmitFile::namefile(const char *pfix, unsigned n)
  {
  char	buf[MAXLONGSIZE], *p;

-- 
 Lloyd Zusman
 [EMAIL PROTECTED]

Reply via email to