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