ok by me, commited

gilles

On 09/06/10 11:48, Gregory Edigarov wrote:
Hi everybody,

The following diff adds sender expansions to OpenSMTPD.
%U for sender localpart
%D for sender domainpart

--- lka.c.orig  Sun Jun 20 12:56:26 2010
+++ lka.c       Sun Sep  5 16:41:37 2010
@@ -55,11 +55,11 @@
  struct lkasession *lka_session_init(struct smtpd *, struct message *);
  void          lka_request_forwardfile(struct smtpd *, struct lkasession *, 
struct path *);
  void          lka_clear_expandtree(struct expandtree *);
  void          lka_clear_deliverylist(struct deliverylist *);
  char           *lka_encode_secret(struct map_secret *);
-size_t         lka_expand(char *, size_t, struct path *);
+size_t         lka_expand(char *, size_t, struct path *,struct path *);
  void          lka_rcpt_action(struct smtpd *, char *, struct path *);
  void          lka_session_destroy(struct smtpd *, struct lkasession *);
  void          lka_expansion_done(struct smtpd *, struct lkasession *);
  void          lka_session_fail(struct smtpd *, struct lkasession *);
  void          lka_queue_append(struct smtpd *, struct lkasession *, int);
@@ -370,20 +370,19 @@
  {
        return 1;
  }

  size_t
-lka_expand(char *buf, size_t len, struct path *path)
+lka_expand(char *buf, size_t len, struct path *path, struct path *sender)
  {
        char *p, *pbuf;
        struct rule r;
        size_t ret;
        struct passwd *pw;

        bzero(r.r_value.path, MAXPATHLEN);
        pbuf = r.r_value.path;
-
        ret = 0;
        for (p = path->rule.r_value.path; *p != '\0'; ++p) {
                if (p == path->rule.r_value.path&&  *p == '~') {
                        if (*(p + 1) == '/' || *(p + 1) == '\0') {
                                pw = getpwnam(path->pw_name);
@@ -422,10 +421,26 @@
                                pbuf += strlen(pw->pw_dir);
                                p += strlen(username);
                                continue;
                        }
                }
+               if (strncmp(p, "%U", 2) == 0) {
+                       ret += strlcat(pbuf, sender->user, len);
+                       if (ret>= len)
+                               return ret;
+                       pbuf += strlen (sender->user);
+                       ++p;
+                       continue;
+               }
+               if (strncmp(p,"%D",2) == 0) {
+                       ret += strlcat(pbuf, sender->domain, len);
+                       if (ret>= len)
+                               return ret;
+                       pbuf += strlen(sender->domain);
+                       ++p;
+                       continue;
+               }
                if (strncmp(p, "%a", 2) == 0) {
                        ret += strlcat(pbuf, path->user, len);
                        if (ret>= len)
                                return ret;
                        pbuf += strlen(path->user);
@@ -680,11 +695,11 @@
                return;
        }

        /* send next item to queue */
        message = s->message;
-       lka_expand(path->rule.r_value.path, sizeof(path->rule.r_value.path), 
path);
+       lka_expand(path->rule.r_value.path, sizeof(path->rule.r_value.path), 
path,&message.sender);
        message.recipient = *path;
        sep = strchr(message.session_hostname, '@');
        if (sep) {
                *sep = '\0';
                uid = strtonum(message.session_hostname, 0, UID_MAX,&errstr);

Reply via email to