1 /*        $NetBSD: recipient.c,v 1.2 2017/02/14 01:16:49 christos Exp $         */
2 
3 /*++
4 /* NAME
5 /*        recipient 3
6 /* SUMMARY
7 /*        deliver to one local recipient
8 /* SYNOPSIS
9 /*        #include "virtual.h"
10 /*
11 /*        int       deliver_recipient(state, usr_attr)
12 /*        LOCAL_STATE state;
13 /*        USER_ATTR *usr_attr;
14 /* DESCRIPTION
15 /*        deliver_recipient() delivers a message to a local recipient.
16 /*
17 /*        Arguments:
18 /* .IP state
19 /*        The attributes that specify the message, sender, and more.
20 /* .IP usr_attr
21 /*        Attributes describing user rights and mailbox location.
22 /* DIAGNOSTICS
23 /*        deliver_recipient() returns non-zero when delivery should be
24 /*        tried again.
25 /* SEE ALSO
26 /*        mailbox(3) delivery to UNIX-style mailbox
27 /*        maildir(3) delivery to qmail-style maildir
28 /* LICENSE
29 /* .ad
30 /* .fi
31 /*        The Secure Mailer license must be distributed with this software.
32 /* AUTHOR(S)
33 /*        Wietse Venema
34 /*        IBM T.J. Watson Research
35 /*        P.O. Box 704
36 /*        Yorktown Heights, NY 10598, USA
37 /*--*/
38 
39 /* System library. */
40 
41 #include <sys_defs.h>
42 
43 /* Utility library. */
44 
45 #include <msg.h>
46 #include <mymalloc.h>
47 #include <stringops.h>
48 
49 /* Global library. */
50 
51 #include <bounce.h>
52 
53 /* Application-specific. */
54 
55 #include "virtual.h"
56 
57 /* deliver_recipient - deliver one local recipient */
58 
deliver_recipient(LOCAL_STATE state,USER_ATTR usr_attr)59 int     deliver_recipient(LOCAL_STATE state, USER_ATTR usr_attr)
60 {
61     const char *myname = "deliver_recipient";
62     VSTRING *folded;
63     int     rcpt_stat;
64 
65     /*
66      * Make verbose logging easier to understand.
67      */
68     state.level++;
69     if (msg_verbose)
70           MSG_LOG_STATE(myname, state);
71 
72     /*
73      * Set up the recipient-specific attributes. The recipient's lookup
74      * handle is the full address.
75      */
76     if (state.msg_attr.delivered == 0)
77           state.msg_attr.delivered = state.msg_attr.rcpt.address;
78     folded = vstring_alloc(100);
79     state.msg_attr.user = casefold(folded, state.msg_attr.rcpt.address);
80 
81     /*
82      * Deliver
83      */
84     if (msg_verbose)
85           deliver_attr_dump(&state.msg_attr);
86 
87     if (deliver_mailbox(state, usr_attr, &rcpt_stat) == 0)
88           rcpt_stat = deliver_unknown(state);
89 
90     /*
91      * Cleanup.
92      */
93     vstring_free(folded);
94 
95     return (rcpt_stat);
96 }
97