Messaging Server Plug-in API
/*
 * CONFIDENTIAL AND PROPRIETARY SOURCE CODE OF NETSCAPE
 * COMMUNICATIONS CORPORATION
 *
 * Copyright (c) 1998 Netscape Communications Corporation. All Rights
 * Reserved.
 *
 * Use of this Source Code is subject to the terms of the applicable license
 * agreement from Netscape Communications Corporation.
 *
 * The copyright notice(s) in this Source Code does not indicate actual or
 * intended publication of this Source Code.
 *
 *  Filename
 *  --------
 *  msg4plugins.h
 *
 *  Description
 *  -----------
 *  PostSMTPAccept/PreSMTPDeliver plugin definitions
 *  for Messaging Server Plug-in API 4.1.
 *
 *  Author(s)
 *  ---------
 *  Sam Robertson
 *
 *  History
 *  -------
 *  Wed Sep 16 10:09:00 1998 - Created
 *
 */
#ifndef MSG4PLUGINS_H
#define MSG4PLUGINS_H
#ifdef __cplusplus
extern "C" {
#endif
/* Return values expected from plugin's main function
 */
#ifndef MSG_NOACTION
#define MSG_NOACTION   0x02
#endif
#ifndef MSG_CONTINUE
#define MSG_CONTINUE   0x04
#endif
/* a pblock is used to store name value pairs in a linked list.
 * The plugin configuration is passed into both functions
 * exported by the plugin through this structure.
 */
typedef struct p_block {
    char   *name;
    char   *value;
    struct p_block *next;
} pblock;
/* The following structures define the recipient
 * list which is included within the message structure
 * defined below.  The Recipient list should be
 * changed only through the API; however, the plugin
 * can read the recipient list through these
 * structures.
 */
typedef char *N821Address;
typedef char *SmtpExt;
typedef struct addresstag {
    long        magic;
    N821Address Addr821;
    SmtpExt     Ext;
    int         flags;
} Address;
typedef struct addr_list {
    long              magic;
    void             *context;
    Address           Addr;
    struct addr_list *pNext;
} AddressList;
typedef AddressList RecipientList;
typedef Address     Recipient;
typedef Address     Sender;
/* The message structure is defined here and is
 * passed into the plugin through the main
 * pFunc function.
 */
typedef struct message {
    long           magic;       /* magic cookie for the message */
    char          *BaseMsgName; /* Base message file name without path */
    char          *MsgFileName; /* The message file name including the path */
    RecipientList *recipList;   /* list of recipients */
    Sender        *sender;      /* envelope sender */
    const char    *stage;       /* stage in processing */
    int            flags;
    void          *context;     /* internal context for things
                                 * like getNext routines  */
    void          *control;     /* Pointer to ControlFile which
                                 * is accessible through plugin API */
    char          *PostOfficePath;  /* Path to postoffice */
} Message;
/* The following two prototypes are the functions that MUST be exported
 * by the plugin.
 *
 * The pInitFunc is called at MTA startup and the configuration that is
 * defined in plugins.cfg (the optional parameters) are passed in through
 * Config pblock. A return value of 1 is considered successful, while a
 * return value of 0 is considered failure.
 *
 * The pFunc is called for each message that is accepted.  The configuration
 * is passed once again, through the Config pblock.  The incoming message
 * details are stored within the InMessage message.  If the plugin should
 * create an outgoing message, it should be set in the OutMessage message.
 * A return value of MS
 */
typedef int (*pInitFunc)(pblock *Config);
typedef int (*pFunc) (pblock *Config,
                      struct message **InMessage,
                      struct message ***OutMessage);
/* The following functions are availble to the plugin
 */
/* DupMessage allows the plugin to duplicate the message
 * passed in.
 */
Message *DupMessage(Message *pMessage);
/* FreeMessage should be used to free all resources allocated
 * to a message.
 */
void FreeMessage(Message *pMessage);
/* The following functions allow access to the recipient
 * list encapsulated in the Message structure.
 */
Recipient *GetFirstRecipient(Message *pMessage);
Recipient *GetNextRecipient(Message *pMessage);
int AddRecipient(Message *pMessage,
                 Recipient *pRecipient);
int RemoveRecipient(Message *pMessage,
                    Recipient *pRecipient);
char *GetRecipientAddress(Recipient *pRecipient);
/* The control data functions allow the plugin to
 * view the SMTP envelope and connection information
 * gathered during message reception.  The string
 * returned contains a name: value representation with
 * each element delimited by LF's.
 *
 * The plugin should call 'FreeControlData' to free the
 * char * after it is done reviewing it.  Keep in mind
 * that changes to recipients using the functions above
 * will change the values of the information retrieved
 * here; therefore, the plugin should not rely on this
 * information to be up to date.
 */
char *GetControlData(Message *pMessage);  /* Return new control data */
void FreeControlData(char *controldata);  /* Let us free our own allocations */
/* AddControlInfo and RemoveControlInfo are methods used to
 * add and remove name: value pairs to the control data
 * respectively.  All changes will be reflected in any
 * future call to 'GetControlData'.
 */
int AddControlInfo(Message *pMessage, const char *key, const char *data,
                   int delete_original); /* Add control item */
int RemoveControlInfo(Message *pMessage, char *key);
/* Helper function to retrieve the MsgFileName for
 * the message passed in pMessage
 */
char *GetMessageFile(Message *pMessage);
/* pblock_findval will return the value for the
 * name passed in.  This helper function essentially
 * walks the pblock linked list searching for the
 * key specified in name and returns the value
 * associated with it, otherwise NULL.
 */
char *pblock_findval(char *name, pblock *pb);
/* PluginGetPostOffice returns the path to the postoffice directory.
 * This directory is where the physical message lives.
 */
char *GetPostOfficePath(Message *pMessage);
#ifdef __cplusplus
}
#endif
#endif