In case it helps anyone to have the entire code to look at, attached is 
a patch against mail.c that contains all my changes.

> On Thu, 26 Dec 2002, Ari Pollak wrote:
> 
> > Hi there, I'm trying to hack mail.c to automatically pass a -f argument 
> > to qmail with a return address, so that the Return-path of the message 
> > is not always root@blah. Anyway, I seem to have been successful in this 
> > endeavor, but I have a slight problem - whenever my code gets executed, 
> > I get two errors output:
> > 
> > /home/ari/php-4.3.0RC4/ext/standard/mail.c(235) :  Freeing 0x088F6524 
> > (51 bytes), script=/home/ari/public_html/mail.php
> > /home/ari/php-4.3.0RC4/ext/standard/mail.c(229) :  Freeing 0x088F647C 
> > (23 bytes), script=/home/ari/public_html/mail.php
> > 
> > Line 229 and 235 are the following, respectively:
> > qmail_from = emalloc(strlen(temp) + 3);
> > sendmail_cmd = emalloc(strlen(sendmail_path) + strlen(qmail_from) +
> > 2);
> > 
> > I efree() both temp and qmail_from when they're done being used, but I 
> > can't seem to find why exactly this message is popping up. Both temp and 
> > qmail_from seem to be valid strings, and those are the only two strings 
> > I create myself that are used.
> > 
> > Any ideas? What else could cause the Freeing error message?
--- php-4.3.0RC4/ext/standard/mail.c~   Wed Dec 25 21:18:14 2002
+++ php-4.3.0RC4/ext/standard/mail.c    Thu Dec 26 04:50:57 2002
@@ -137,6 +138,55 @@
 }
 /* }}} */
 
+/* {{{ qmail_email
+       Returns an e-mail address if found in a From: header
+*/
+char *qmail_email(char *headers)
+{
+       int len = 0;
+       char *temp = NULL, *loc1 = NULL, *loc2 = NULL;
+       char *qmail_from = NULL;
+
+       temp = strstr(headers, "From: ");
+       if(temp != NULL) { /* From: header found, do everything */
+               loc1 = strchr(temp, '<');
+               if(loc1 != NULL) { /* < found, get text between brackets */
+                       loc1 += 1;
+                       loc2 = strchr(loc1, '>');
+                       if(loc2 != NULL) { /* > found, text should end one char before 
+*/
+                               loc2 -= 1;
+                               len = loc2 - loc1 + 1;
+                       } else { /* > not found, don't bother with any of this */
+                               return NULL;    
+                       }
+               } else { /* no <, just get all the text afterwards */
+                       loc1 = temp + 6;
+                       loc2 = strchr(loc1, '\n');
+                       if(loc2 != NULL) { /* newline found, we're almost set*/
+                               loc2 -= 1;
+                               len = loc2 - loc1 + 1;
+                       }
+               }
+               if(loc2 == NULL) { /* Go until the end of the string */
+                       qmail_from = estrdup(loc1);
+               } else { /* Only copy until loc2 */
+                       qmail_from = emalloc(len + 1);
+                       temp = qmail_from;
+                       while(loc1 <= loc2) {
+                               *temp = *loc1;
+                               loc1++;
+                               temp++;
+                       }
+                       *temp = '\0';
+               }
+               return qmail_from;
+       }
+       else {
+               return NULL;
+       }
+}      
+/* }}} */
+
 /* {{{ php_mail
  */
 PHPAPI int php_mail(char *to, char *subject, char *message, char *headers, char 
*extra_cmd TSRMLS_DC)
@@ -147,6 +197,7 @@
 #endif
        FILE *sendmail;
        int ret;
+       char *temp = NULL, *qmail_from = NULL;
        char *sendmail_path = INI_STR("sendmail_path");
        char *sendmail_cmd = NULL;
 
@@ -172,6 +223,23 @@
                strcpy (sendmail_cmd, sendmail_path);
                strcat (sendmail_cmd, " ");
                strcat (sendmail_cmd, extra_cmd);
+       } else if(INI_STR("qmail_compat") && headers != NULL) {
+               temp = qmail_email(headers);    
+               if(temp != NULL) { /* return e-mail address found */
+                       qmail_from = emalloc(strlen(temp) + 3);
+                       strcpy(qmail_from, "-f");
+                       strcat(qmail_from, temp);
+                       qmail_from = php_escape_shell_cmd(qmail_from);
+                       efree(temp);
+
+                       sendmail_cmd = emalloc(strlen(sendmail_path) + 
+strlen(qmail_from) + 2);
+                       strcpy(sendmail_cmd, sendmail_path);
+                       strcat(sendmail_cmd, " ");
+                       strcat(sendmail_cmd, qmail_from);
+                       efree(qmail_from);
+               } else {
+                       sendmail_cmd = sendmail_path;
+               }
        } else {
                sendmail_cmd = sendmail_path;
        }

-- 
PHP Development Mailing List <http://www.php.net/>
To unsubscribe, visit: http://www.php.net/unsub.php

Reply via email to