966 lines
35 KiB
C
966 lines
35 KiB
C
//**
|
|
//** Mercury Mail Transport System - Daemon Interface Definitions
|
|
//** Copyright (c) 1997-99, David Harris, All Rights Reserved.
|
|
//**
|
|
//** Note: the structures defined in this file are all BYTE-ALIGNED.
|
|
//** This is very important - if you are using a Borland Compiler
|
|
//** and your project uses WORD or DWORD alignment, then you will
|
|
//** need to add "#pragma option -a1" before you include this file
|
|
//** to ensure that the compiler aligns the structures correctly.
|
|
//** Getting the byte alignment wrong will almost certainly result
|
|
//** in your Daemon crashing when you load it.
|
|
//**
|
|
|
|
#ifndef _DAEMON_H
|
|
#define _DAEMON_H
|
|
|
|
#ifdef __cplusplus
|
|
extern "C" {
|
|
#endif
|
|
|
|
#ifndef INTS_DEFINED
|
|
#define INTS_DEFINED
|
|
// INT_16 and UINT_16 must be 16-bit Integer types
|
|
typedef unsigned short UINT_16;
|
|
typedef short INT_16;
|
|
typedef unsigned long UINT_32;
|
|
typedef long INT_32;
|
|
#endif
|
|
|
|
|
|
//**
|
|
//** Section 1: Data type definitions and constants for lists
|
|
//**
|
|
|
|
#ifndef _LISTS_H
|
|
|
|
struct _l_node
|
|
{
|
|
unsigned int flags, number;
|
|
struct _l_node *next, *prev;
|
|
void *data;
|
|
};
|
|
|
|
typedef struct _l_node LNODE;
|
|
|
|
struct _lv_node
|
|
{
|
|
unsigned int flags, number;
|
|
struct _lv_node *next, *prev;
|
|
BYTE data [];
|
|
};
|
|
|
|
typedef struct _lv_node LVNODE;
|
|
|
|
typedef struct
|
|
{
|
|
LNODE *top, *end; /* pointers to start/end of list */
|
|
int icount; /* number of items in list */
|
|
unsigned isize; /* size of *data in LNODE */
|
|
int ilimit; /* maximum size of list - no limit if 0 */
|
|
int ialloc; /* whether or not to allocate space for items */
|
|
unsigned int last_acc; /* Last data accessed using get_list_data */
|
|
LNODE *last_data; /* " " " " " " " " " " */
|
|
} LIST;
|
|
|
|
#endif
|
|
|
|
//**
|
|
//** Section 2: Data type definitions and constants for
|
|
//** Job Management
|
|
//**
|
|
|
|
// Rewind flags - passed to ji_rewind_job
|
|
|
|
#define JR_CONTROL 1
|
|
#define JR_DATA 2
|
|
|
|
// Diagnostic flags - passed to ji_set/get_diagnostics
|
|
|
|
#define JD_ELEMENT 1
|
|
#define JD_JOB 2
|
|
|
|
typedef struct
|
|
{
|
|
int structlen;
|
|
char jobstatus;
|
|
long jobflags;
|
|
char status;
|
|
char *from;
|
|
char *to;
|
|
long dsize;
|
|
long rsize;
|
|
int total_rcpts;
|
|
int total_failures;
|
|
int total_retries;
|
|
char ip1 [16];
|
|
char ip2 [16];
|
|
char ip3 [16];
|
|
char ip4 [16];
|
|
char jobid [20];
|
|
} JOBINFO;
|
|
|
|
enum // Job types, for ji_scan_* and ji_create_job
|
|
{
|
|
JT_GENERAL, // Local and newly-submitted mail
|
|
JT_OUTGOING, // Only mail destined for the outside world
|
|
JT_ANY // Any type of job
|
|
};
|
|
|
|
enum // "mode" values for ji_set_element_status
|
|
{
|
|
JS_COMPLETED, // "date" is ignored
|
|
JS_FAILED, // "date" is ignored
|
|
JS_RETRY, // "date" is used for requeuing if non-NULL
|
|
JS_PENDING, // "date" is ignored
|
|
JS_TEMP_FAIL // "date" is ignored
|
|
};
|
|
|
|
enum // "type" values for ji_get_next_element
|
|
{
|
|
JE_ANY, // Any type of element is OK
|
|
JE_READY, // Only return elements ready to be sent
|
|
JE_FAILED, // Only return elements marked as failed
|
|
JE_COMPLETED, // Only return elements marked as completed
|
|
JE_PENDING, // Only return elements marked as "pending"
|
|
JE_TEMP_FAIL // Only return elements marked as temporarily failed
|
|
};
|
|
|
|
|
|
//**
|
|
//** Section 3: General Mercury data type and constant definitions
|
|
//** Many of these structures are not directly used by Daemons.
|
|
//**
|
|
|
|
#ifndef MAXFPATH
|
|
#define MAXFPATH 128
|
|
#endif
|
|
|
|
#ifndef size
|
|
#define size(x) (sizeof (x) / sizeof (x [0]))
|
|
#endif
|
|
|
|
#define MAXUIC 128
|
|
#define MAXHOST 128
|
|
|
|
// Statistics manager constants.
|
|
|
|
#define STC_INTEGER 0
|
|
#define STC_STRING 1
|
|
#define STC_DATE 2
|
|
|
|
#define STF_CUMULATIVE 1
|
|
#define STF_PEAK 2
|
|
#define STF_UNIQUE 4
|
|
|
|
// Logging console manager priority constants
|
|
|
|
#define LOG_DEBUG 25
|
|
#define LOG_INFO 20
|
|
#define LOG_NORMAL 15
|
|
#define LOG_SIGNIFICANT 10
|
|
#define LOG_URGENT 5
|
|
#define LOG_NONE 0
|
|
|
|
// Constants that can be passed to "create_object"
|
|
|
|
#define OBJ_USER 1
|
|
#define OBJ_ADMINISTRATOR 2
|
|
|
|
typedef unsigned char UCHAR;
|
|
typedef unsigned short USHORT;
|
|
typedef unsigned long ULONG;
|
|
|
|
// INT_16 and UINT_16 must be 16-bit Integer types
|
|
typedef unsigned short UINT_16;
|
|
typedef short INT_16;
|
|
|
|
typedef struct
|
|
{
|
|
char auto_forward [60];
|
|
char gw_auto_forward [60]; // Mercury uses this field for forwarding
|
|
char from_alias [60]; // Alternative From: field value
|
|
unsigned flags;
|
|
char security;
|
|
} PMPROP;
|
|
|
|
typedef struct
|
|
{
|
|
char *name;
|
|
char *domain;
|
|
char *login_name;
|
|
char *password;
|
|
} SERVER_ID;
|
|
|
|
typedef struct
|
|
{
|
|
char *name;
|
|
char *groupname;
|
|
char *hostname;
|
|
} GROUP_ID;
|
|
|
|
typedef struct
|
|
{
|
|
char *match;
|
|
char *rewrite;
|
|
} REWRITE;
|
|
|
|
typedef struct
|
|
{
|
|
char lname [48];
|
|
char fname [128]; // Name of container file for list
|
|
char moderator [80]; // Primary list moderator (if any)
|
|
char title [80]; // Title for list (used in "to" field
|
|
char welcome_file [128]; // File to send to new subscribers
|
|
char farewell_file [128]; // File to send to unsubscribers
|
|
char ispublic; // NZ if open subscription is available
|
|
char matched; // NZ if the address passed in is a moderator
|
|
char moderated; // NZ if mailing to the list is restricted
|
|
char allow_enumeration; // NZ if anyone may use ENUMERATE
|
|
char reply_to_list; // NZ if replies should go to the list
|
|
int limit; // Maximum allowable number of subscribers
|
|
char errors_to [80]; // Address to which errors should be referred
|
|
char restricted; // NZ if only list members may mail to the list
|
|
int fanout; // Number of jobs to "fan" the delivery to
|
|
char anonymous; // Whether this list is anonymous or not
|
|
char title_is_address; // If NZ, the 'title' field contains an address
|
|
char digest_name [14]; // Name of digest file
|
|
unsigned long digest_maxsize;
|
|
int digest_maxwait;
|
|
char archive_file [128]; // File into which to archive messages
|
|
char digest_default; // If NZ, new users are default to digest mode
|
|
char list_headers; // Use IETF draft helper headers
|
|
char list_help [80]; // Help URL
|
|
char list_signature [128]; // List's signature file
|
|
char concealed; // If NZ, do not publicize via the maiser LIST
|
|
long maximum_size; // Largest message that may be submitted to list
|
|
char password [128]; // Moderator password or password filename
|
|
char pwd_is_filename; // NZ if "password" is a filename
|
|
} DLIST;
|
|
|
|
#define FS_BOLD 1
|
|
#define FS_ITALIC 2
|
|
#define FS_FIXED 4
|
|
#define FS_OEMCHARS 8
|
|
|
|
typedef struct
|
|
{
|
|
char fontname [LF_FACESIZE];
|
|
INT_16 fontsize, style;
|
|
} FONTSPEC;
|
|
|
|
typedef struct
|
|
{
|
|
char alias [60];
|
|
char obj_name [48];
|
|
char server [48];
|
|
long flags; /* Unused at present - might be handy later */
|
|
} CHBIND;
|
|
|
|
typedef struct
|
|
{
|
|
char alias [180], name [180];
|
|
} ALIAS;
|
|
|
|
|
|
// IMESSAGE structure definition:
|
|
// The IMESSAGE structure is used internally to represent messages
|
|
// and pseudo-messages. This structure exactly parallels a structure
|
|
// used in Pegasus Mail v3.x and later for the same purpose, and is
|
|
// included in this way to allow maximum code portability between
|
|
// the two.
|
|
|
|
typedef struct
|
|
{
|
|
INT_16 dsize; // The size of this data structure
|
|
INT_16 mtype; // User-defined message type field
|
|
UINT_32 flags; // First bank of message-related flags
|
|
UINT_32 flags2; // Second bank of message-related flags
|
|
char fname [14]; // Recommended filename for message
|
|
char from [42]; // The sender of the message
|
|
char subject [50]; // Can you guess what this is?
|
|
UCHAR cdate [8]; // Timezone-corrected date from message
|
|
UCHAR date [8]; // Raw RFC822 time and date for message
|
|
UINT_32 fsize; // Raw size of this message
|
|
UINT_16 colour; // Display colour for this entry
|
|
UINT_16 charset; // Character set for message
|
|
char unique_id [34]; // Unique ID for the message
|
|
void *folder; // Currently unused in Mercury/32
|
|
char filename [128]; // The file containing the message data
|
|
} IMESSAGE;
|
|
|
|
// Explanation of fields:
|
|
// "dsize" The allocated size of this data structure
|
|
// "mtype" The user can define message types that can be used for sorting
|
|
// "flags" Can contain any of the flag values shown in Group 1 below
|
|
// "flags2" Can contain any of the flag values shown in Group 2 below
|
|
// "fname" Recommended filename for any storage to do with the message
|
|
// "from" Display version of sender's address
|
|
// "subject" Display version of message subject
|
|
// "date" The date as shown in the message's RFC822 "Date:" field
|
|
// "cdate" The date the message arrived at the local system.
|
|
// - See below for more on the date format
|
|
// "fsize" Raw size of the message, including headers and formatting
|
|
// Note - no allowance is made for CR/LF conversions.
|
|
// "colour" Index into colour table for message display colour
|
|
// "charset" Index into character set table for message charset format
|
|
// "unique_id" Guaranteed unique persistent global identifier for this message
|
|
// "folder" The folder in which this message is currently stored.
|
|
//
|
|
// Date format: dates in IMESSAGEs use the NetWare 7-byte date format plus an
|
|
// extra byte containing the offset in half-hour units from GMT. The date is
|
|
// always pre-corrected to GMT by WinPMail. Note that byte 0 (the year) is
|
|
// always the actual year - 1900, so the year 2000 is represented by 100.
|
|
// The NetWare date format is as shown:
|
|
//
|
|
// Byte 0 - Year - 1900 (i.e, 2005 = 105)
|
|
// Byte 1 - Month (ie, January == 1)
|
|
// Byte 2 - Day (1 .. 31)
|
|
// Byte 3 - Hour (0 - 24)
|
|
// Byte 4 - Minute (0 - 59)
|
|
// Byte 5 - Second (0 - 60)
|
|
// Byte 6 - Day of week (Sunday == 0) ("255" == "not calculated")
|
|
|
|
//
|
|
// Group 1 flag values - these can be used in an IMESSAGE "flags" field.
|
|
//
|
|
#define FILE_MAILED 1 // The message contains a mailed file
|
|
#define UUENCODED 2 // The message contains uuencoded data
|
|
#define FILE_ATTACHED 0x800003L // Use this as an attachment mask.
|
|
#define ENCRYPTED 4 // The message is encrypted
|
|
#define EXPIRED 16 // The message is past its expiry date
|
|
#define FILE_ASCII 32 // Flag in attachment to indicate ASCII file
|
|
#define HAS_BEEN_READ 128 // Hey, what do you know! It's been read!
|
|
#define ALTERNATIVE 0x100 // The message is Multipart/Alternative type
|
|
#define IS_HTML 0x200 // The message is Text/HTML type
|
|
#define IS_CIRCULAR 0x400 // The message is being circulated
|
|
#define CONFIRMATION 0x2000 // Sender wants confirmation of reading
|
|
#define FORWARD 0x8000L // The message is being forwarded
|
|
#define IS_RTF 0x10000L // Message contains MS-RTF data
|
|
#define COPYSELF 0x20000L // The message is a copy to self
|
|
#define DELETED 0x40000L // The message has been deleted.
|
|
#define MIME 0x80000L // The message is a MIME transmission
|
|
#define REPLIED 0x100000L // The message has been replied to.
|
|
#define FORWARDED 0x200000L // The message has been forwarded.
|
|
#define URGENT 0x400000L // The message is urgent/high priority.
|
|
#define BINHEX 0x800000L // The message is a BinHex file
|
|
#define IS_MHS 0x1000000L // The message originates from MHS
|
|
#define IS_SMTP 0x2000000L // The message originated via SMTP
|
|
#define IS_ANNOTATED 0x4000000L // The message has an annotation
|
|
#define ENCLOSURE 0x8000000L // The message has an enclosure
|
|
#define HIGHLIGHTED 0x10000000L // The message has transient significance
|
|
#define MIME_MULTI 0x20000000L // The message is in MIME Multipart format
|
|
#define TEXT_ENRICHED 0x40000000L // The message is in "text/enriched" format
|
|
#define READ_ONLY 0x80000000L // The message may not be deleted
|
|
|
|
//
|
|
// Group 2 flag values - these can be used in an IMESSAGE "flags2" field
|
|
//
|
|
|
|
#define IS_NEWMAIL 1 // The message is in the new mail folder
|
|
#define IS_NOTICE 2 // The message comes from a noticeboard
|
|
#define IS_TEMPORARY 4
|
|
|
|
|
|
// MIME parsing definitions and structures
|
|
|
|
enum // Content dispositions
|
|
{
|
|
MD_ATTACHMENT, MD_INLINE
|
|
};
|
|
|
|
enum // The primary types
|
|
{
|
|
MP_TEXT, MP_MULTIPART, MP_MESSAGE, MP_APPLICATION,
|
|
MP_IMAGE, MP_VIDEO, MP_AUDIO, MP_UNKNOWN
|
|
};
|
|
|
|
enum // TEXT subtypes
|
|
{
|
|
MPT_PLAIN, MPT_RICHTEXT, MPT_HTML, MPT_RTF, MPT_UNKNOWN
|
|
};
|
|
|
|
enum // MULTIPART subtypes
|
|
{
|
|
MPP_MIXED, MPP_ALTERNATIVE, MPP_DIGEST,
|
|
MPP_PARALLEL, MPP_UNKNOWN
|
|
};
|
|
|
|
enum // MESSAGE subtypes
|
|
{
|
|
MPM_RFC822, MPM_PARTIAL, MPM_EXTERNAL_BODY, MPM_UNKOWN
|
|
};
|
|
|
|
enum // APPLICATION subtypes
|
|
{
|
|
MPA_OCTET_STREAM, MPA_POSTSCRIPT, MPA_ODA, MPA_BINHEX, MPA_UNKNOWN
|
|
};
|
|
|
|
enum // IMAGE subtypes
|
|
{
|
|
MPI_GIF, MPI_JPEG, MPI_UNKNOWN
|
|
};
|
|
|
|
enum // VIDEO subtypes
|
|
{
|
|
MPV_MPEG, MPV_UNKNOWN
|
|
};
|
|
|
|
enum // AUDIO subtypes
|
|
{
|
|
MPU_BASIC, MPU_UNKNOWN
|
|
};
|
|
|
|
enum // MIME transfer-encodings
|
|
{
|
|
// Note that ME_BINHEX and ME_UUENCODE are handled as special
|
|
// cases and as such must always appear after ME_UNKNOWN.
|
|
ME_7BIT, ME_8BIT, ME_QUOTED_PRINTABLE, ME_BASE64, ME_UNKNOWN,
|
|
ME_BINHEX, ME_UUENCODE
|
|
};
|
|
|
|
typedef struct
|
|
{
|
|
char charset [20];
|
|
char *table;
|
|
} MPT;
|
|
|
|
typedef struct
|
|
{
|
|
char boundary [71];
|
|
LIST partlist;
|
|
} MPP;
|
|
|
|
typedef struct
|
|
{
|
|
char fname [96];
|
|
char type [20];
|
|
} MPA;
|
|
|
|
typedef struct
|
|
{
|
|
int primary, secondary, encoding, disposition;
|
|
char p_string [20], s_string [20];
|
|
char description [48];
|
|
char encryptor [16]; // For encrypted attachments, the encryptor
|
|
int encryptor_flags;
|
|
int section;
|
|
char fname [96];
|
|
union
|
|
{
|
|
MPT mpt;
|
|
MPP mpp;
|
|
MPA mpa;
|
|
IMESSAGE mpm;
|
|
} d;
|
|
} IMIME;
|
|
|
|
|
|
//**
|
|
//** Section 4: Constants for message composition functions
|
|
//**
|
|
|
|
#define OM_M_8BIT 1
|
|
|
|
#define OM_MT_PLAIN 0 // A simple, single-part text/plain message
|
|
#define OM_MT_MULTIPART 1 // A multipart/mixed message
|
|
#define OM_MT_ALTERNATIVE 2 // A multipart/alternative message
|
|
#define OM_MT_DIGEST 3 // A multipart/digest type
|
|
|
|
#define OM_MF_TO 1 // Set the master recipient of the message
|
|
#define OM_MF_SUBJECT 2 // Set the subject field for the message
|
|
#define OM_MF_CC 3 // Set the secondary recipients of the message
|
|
#define OM_MF_FROM 4 // Set the originator of the message.
|
|
#define OM_MF_BODY 5 // Set the filename containing the message body
|
|
#define OM_MF_RAW 6 // Add a raw header for the message.
|
|
#define OM_MF_FLAGS 7 // Set the message's "flags" field
|
|
|
|
#define OM_AE_DEFAULT 0 // Default encoding (MIME BASE64 encoding)
|
|
#define OM_AE_TEXT 1 // Simple textual data, unencoded
|
|
#define OM_AE_UUENCODE 2 // Uuencoding
|
|
#define OM_AE_BINHEX 3 // Macintosh Binhex format (data fork only)
|
|
|
|
#define OM_AF_INLINE 1 // Write the file as a simple textual section
|
|
#define OM_AF_MESSAGE 2 // Write the message as a Message/RFC822 part
|
|
|
|
|
|
//**
|
|
//** Section 5: Protocol Module parameter block definition;
|
|
//** Daemons are passed a Protocol Module parameter block.
|
|
//**
|
|
|
|
#define GV_QUEUENAME 1
|
|
#define GV_SMTPQUEUENAME 2
|
|
#define GV_MYNAME 3
|
|
#define GV_TTYFONT 4
|
|
#define GV_MAISERNAME 5
|
|
#define GV_FRAMEWINDOW 6
|
|
#define GV_SYSFONT 7
|
|
#define GV_BASEDIR 8
|
|
#define GV_SCRATCHDIR 9
|
|
|
|
#define SYSTEM_PASSWORD 1
|
|
#define APOP_SECRET 2
|
|
#define PASSWD_MUST_EXIST 256
|
|
|
|
// Messages that protocol modules can send using the
|
|
// "mercury_command" function in the protocol parameter block
|
|
|
|
// GET_MODULE_INTERFACE:
|
|
// - "parm1" - char * pointer to name of module to locate
|
|
// - Returns: the command interface function for the module, or NULL
|
|
#define GET_MODULE_INTERFACE 1
|
|
|
|
// ADD_ALIAS
|
|
// - "parm1" - char * pointer to alias to add
|
|
// "parm2" - char * pointer to real-world address string
|
|
// - Returns: NZ on success, 0 on failure
|
|
#define ADD_ALIAS 2
|
|
|
|
// DELETE_ALIAS
|
|
// - "parm1" - char * pointer to alias field of alias to delete
|
|
// Returns: NZ on success, 0 on failure
|
|
#define DELETE_ALIAS 3
|
|
|
|
// RESOLVE_ALIAS
|
|
// - "parm1" - char * pointer to buffer to receive address (180 char min)
|
|
// "parm2" - char * pointer to alias to resolve
|
|
// - Returns: NZ if a match was found, 0 if none was found.
|
|
#define RESOLVE_ALIAS 4
|
|
|
|
// RESOLVE_SYNONYM
|
|
// - "parm1" - char * pointer to buffer to receive address (180 char min)
|
|
// "parm2" - char * pointer to synonym to resolve
|
|
// - Returns: NZ if a match was found, 0 if none was found
|
|
#define RESOLVE_SYNONYM 5
|
|
|
|
// QUEUE_STATE - enable or disable queue processing
|
|
// - "parm1" - 0 to query current state, 1 to set state
|
|
// "parm2" - 1 to pause processing, 0 to enable it
|
|
// - Returns: The state of queue processing prior to the call
|
|
#define QUEUE_STATE 6
|
|
|
|
// DISPLAY_HELP
|
|
// - "parm1" - section number in MERCURY.HLP
|
|
// "parm2" - unused, must be 0
|
|
// - Returns: Nothing.
|
|
#define DISPLAY_HELP 512
|
|
|
|
#define NOT_IMPLEMENTED 0xF0000000L
|
|
|
|
#define RFC_822_TIME 0
|
|
#define RFC_821_TIME 1
|
|
|
|
typedef DWORD (*GET_VARIABLE) (int index);
|
|
typedef int (*IS_LOCAL_ADDRESS) (char *address, char *uic, char *server);
|
|
typedef int (*GET_DELIVERY_PATH) (char *path, char *username, char *host);
|
|
|
|
typedef int (*IS_GROUP) (char *address, char *host, char *groupname);
|
|
typedef int (*PARSE_ADDRESS) (char *target, char *source, int limit);
|
|
typedef int (*EXTRACT_ONE_ADDRESS) (char *dest, char *source, int offset);
|
|
typedef void (*EXTRACT_CQTEXT) (char *dest, char *source, int len);
|
|
typedef int (*DLIST_INFO) (DLIST *dlist, char *lname, int num, char *address,
|
|
char *errbuf, LIST *modlist);
|
|
typedef void (*SEND_NOTIFICATION) (char *username, char *host, char *message);
|
|
typedef int (*GET_DATE_AND_TIME) (BYTE *tm);
|
|
typedef INT_32 (*VERIFY_PASSWORD) (char *username, char *host,
|
|
char *password, INT_32 select);
|
|
typedef int (*WRITE_PROFILE) (char *section, char *fname);
|
|
typedef int (*MODULE_STATE) (char *modname, int set_value, int state);
|
|
|
|
// Job control functions
|
|
|
|
typedef void * (*JI_SCAN_FIRST_JOB) (int type, int mode, void **data);
|
|
typedef void * (*JI_SCAN_NEXT_JOB) (void **data);
|
|
typedef void (*JI_END_SCAN) (void **data);
|
|
|
|
typedef int (*JI_OPEN_JOB) (void *jobhandle);
|
|
typedef int (*JI_CLOSE_JOB) (void *jobhandle);
|
|
typedef void (*JI_REWIND_JOB) (void *jobhandle, int flags);
|
|
typedef int (*JI_DISPOSE_JOB) (void *jobhandle);
|
|
typedef int (*JI_PROCESS_JOB) (void *jobhandle);
|
|
typedef int (*JI_DELETE_JOB) (void *jobhandle);
|
|
typedef int (*JI_ABORT_JOB) (void *jobhandle, int fatal);
|
|
typedef int (*JI_GET_JOB_INFO) (void *jobhandle, JOBINFO *ji);
|
|
|
|
typedef void * (*JI_CREATE_JOB) (int type, char *from,
|
|
unsigned char *start_time);
|
|
typedef int (*JI_ADD_ELEMENT) (void *jobhandle, char *address);
|
|
typedef int (*JI_ADD_DATA) (void *jobhandle, char *data);
|
|
typedef char * (*JI_GET_DATA) (void *jobhandle, char *buffer, int buflen);
|
|
|
|
typedef char * (*JI_GET_NEXT_ELEMENT) (void *jobhandle, int type, JOBINFO *job);
|
|
typedef int (*JI_SET_JOB_FLAGS) (void *jobhandle, long flags);
|
|
typedef int (*JI_SET_ELEMENT_STATUS) (void *jobhandle, int mode,
|
|
unsigned char *date);
|
|
typedef int (*JI_SET_ELEMENT_RESOLVINFO) (void *jobhandle, char *ip1, char *ip2,
|
|
char *ip3, char *ip4);
|
|
|
|
typedef int (*JI_SET_DIAGNOSTICS) (void *jobhandle, int forwhat, char *text);
|
|
typedef int (*JI_GET_DIAGNOSTICS) (void *jobhandle, int forwhat, char *fname);
|
|
|
|
typedef void (*JI_INCREMENT_TIME) (unsigned char *tm, unsigned int secs);
|
|
|
|
typedef long (*JI_TELL) (void *jobhandle, int selector);
|
|
typedef int (*JI_SEEK) (void *jobhandle, long ofs, int selector);
|
|
|
|
typedef void * (*JI_GET_JOB_BY_ID) (char *id);
|
|
typedef int (*JI_GET_JOB_TIMES) (void *job, char *submitted, char *ready);
|
|
|
|
// MNICA functions
|
|
|
|
typedef int (*GET_FIRST_GROUP_MEMBER) (char *group, char *host, char *member,
|
|
int mlen, void **data);
|
|
typedef int (*GET_NEXT_GROUP_MEMBER) (char *member, int mlen, void **data);
|
|
typedef int (*END_GROUP_SCAN) (void **data);
|
|
typedef int (*IS_VALID_LOCAL_USER) (char *address, char *username, char *host);
|
|
typedef int (*IS_GROUP_MEMBER) (char *host, char *username, char *groupname);
|
|
typedef int (*GET_FIRST_USER_DETAILS) (char *host, char *match, char *username,
|
|
int ulen, char *address, int alen, char *fullname, int flen, void **data);
|
|
typedef int (*GET_NEXT_USER_DETAILS) (char *username, int ulen, char *address,
|
|
int alen, char *fullname, int flen, void **data);
|
|
typedef int (*GET_USER_DETAILS) (char *host, char *match, char *username, int ulen,
|
|
char *address, int alen, char *fullname, int flen);
|
|
typedef int (*END_USER_SCAN) (void **data);
|
|
typedef void (*READ_PMPROP) (char *userid, char *server, PMPROP *p);
|
|
typedef int (*CHANGE_OWNERSHIP) (char *fname, char *host, char *newowner);
|
|
typedef int (*BEGIN_SINGLE_DELIVERY) (char *uic, char *server, void **data);
|
|
typedef void (*END_SINGLE_DELIVERY) (void **data);
|
|
|
|
// Miscellaneous functions - Mercury 2.11 and later only
|
|
|
|
typedef DWORD (*MERCURY_COMMAND) (DWORD selector, DWORD parm1, DWORD parm2);
|
|
typedef char * (*GET_DATE_STRING) (int dtype, char *buf, BYTE *date);
|
|
typedef char * (*RFC822_TIME) (char *buffer);
|
|
typedef char * (*RFC821_TIME) (char *buffer);
|
|
|
|
// File I/O and parsing functions - Mercury 2.15 and later only
|
|
|
|
typedef INT_32 (*FM_OPEN_FILE) (char *path, UINT_32 flags);
|
|
typedef INT_32 (*FM_OPEN_MESSAGE) (IMESSAGE *im, UINT_32 flags);
|
|
typedef int (*FM_CLOSE_MESSAGE) (INT_32 id);
|
|
typedef char * (*FM_GETS) (char *buf, INT_32 max, INT_32 id);
|
|
typedef INT_16 (*FM_GETC) (INT_32 id);
|
|
typedef void (*FM_UNGETC) (INT_16 c, INT_32 id);
|
|
typedef INT_32 (*FM_READ) (INT_32 id, char *buffer, INT_32 bufsize);
|
|
typedef INT_32 (*FM_GETPOS) (INT_32 fil);
|
|
typedef INT_16 (*FM_SETPOS) (INT_32 fil, INT_32 offset);
|
|
typedef INT_32 (*FM_GET_FOLDED_LINE) (INT_32 fil, char *line, int limit);
|
|
typedef char * (*FM_FIND_HEADER) (INT_32 fil, char *name, char *buf, int len);
|
|
typedef int (*FM_EXTRACT_MESSAGE) (void *job, char *fname, int flags);
|
|
|
|
typedef int (*PARSE_HEADER) (INT_32 fil, IMESSAGE *m);
|
|
typedef int (*MIME_PREP_MESSAGE) (INT_32 fil, char *fname, int headers);
|
|
typedef int (*PARSE_MIME) (INT_32 fil, IMIME *m);
|
|
typedef void (*FREE_MIME) (IMIME *m);
|
|
typedef int (*FAKE_IMESSAGE) (IMESSAGE *im, char *dest, char *src,
|
|
IMIME *m, char *boundary);
|
|
typedef int (*DECODE_MIME_HEADER) (char *dest, char *src);
|
|
typedef int (*ENCODE_MIME_HEADER) (char *dest, char *src, int raw);
|
|
|
|
typedef void * (*OM_CREATE_MESSAGE) (UINT_32 mtype, UINT_32 flags);
|
|
typedef INT_32 (*OM_DISPOSE_MESSAGE) (void *mhandle);
|
|
typedef INT_32 (*OM_ADD_FIELD) (void *mhandle, UINT_32 selector, char *data);
|
|
typedef INT_32 (*OM_ADD_ATTACHMENT) (void *mhandle, char *fname, char *ftype,
|
|
char *description, UINT_32 encoding, UINT_32 flags, void *reserved);
|
|
typedef INT_32 (*OM_WRITE_MESSAGE) (void *mhandle, char *fname);
|
|
typedef void * (*OM_SEND_MESSAGE) (void *mhandle, char *envelope);
|
|
|
|
typedef int (*ENCODE_BASE64_STR) (char *dest, char *src, int srclen);
|
|
typedef int (*DECODE_BASE64_STR) (char *dest, char *src, char *table);
|
|
|
|
typedef INT_32 (*ST_REGISTER_MODULE) (char *module_name);
|
|
typedef INT_32 (*ST_UNREGISTER_MODULE) (INT_32 mhandle);
|
|
typedef INT_32 (*ST_CREATE_CATEGORY) (INT_32 mhandle, char *cname,
|
|
INT_32 ctag, INT_32 ctype, INT_32 dlen, UINT_32 flags);
|
|
typedef INT_32 (*ST_REMOVE_CATEGORY) (INT_32 mhandle, UINT_32 ctag);
|
|
typedef INT_32 (*ST_SET_HCATEGORY) (INT_32 chandle, UINT_32 data);
|
|
typedef INT_32 (*ST_SET_CATEGORY) (INT_32 mhandle, INT_32 ctag, UINT_32 data);
|
|
|
|
typedef void (*LOGSTRING) (INT_16 ltype, INT_16 priority, char *str);
|
|
typedef void (*LOGDATA) (INT_16 ltype, INT_16 priority, char *fmt, ...);
|
|
|
|
typedef INT_32 (*CREATE_OBJECT) (char *objectname, INT_32 objecttype,
|
|
char *id, INT_32 flags);
|
|
typedef INT_32 (*SET_PASSWORD) (char *username, char *host, char *newpassword,
|
|
char *oldpassword, INT_32 select);
|
|
|
|
typedef INT_32 (*ST_GET_NEXT_MODULE) (INT_32 mhandle, char *modname);
|
|
typedef INT_32 (*ST_GET_NEXT_CATEGORY) (INT_32 mhandle, INT_32 chandle,
|
|
char *cname, INT_32 *ctype, INT_32 *clen, INT_32 *cflags);
|
|
typedef INT_32 (*ST_GET_CATEGORY_DATA) (INT_32 chandle, void *data);
|
|
typedef INT_32 (*ST_EXPORT_STATS) (INT_32 mhandle, char *fname, UINT_32 flags);
|
|
|
|
typedef INT_32 (*SELECT_PRINTER) (char *devicename, int maxlen);
|
|
typedef INT_32 (* PRINT_FILE) (char *fname, char *printername, UINT_32 flags,
|
|
INT_32 lrmargin, INT_32 tbmargin, char *title, char *username, char *fontname,
|
|
INT_32 fontsize);
|
|
|
|
typedef struct
|
|
{
|
|
long dsize; // Size of this structure
|
|
char vmajor, vminor;
|
|
HWND hMDIParent;
|
|
GET_VARIABLE get_variable;
|
|
IS_LOCAL_ADDRESS is_local_address;
|
|
IS_GROUP is_group;
|
|
PARSE_ADDRESS parse_address;
|
|
EXTRACT_ONE_ADDRESS extract_one_address;
|
|
EXTRACT_CQTEXT extract_cqtext;
|
|
DLIST_INFO dlist_info;
|
|
SEND_NOTIFICATION send_notification;
|
|
GET_DELIVERY_PATH get_delivery_path;
|
|
GET_DATE_AND_TIME get_date_and_time;
|
|
VERIFY_PASSWORD verify_password;
|
|
WRITE_PROFILE write_profile;
|
|
MODULE_STATE module_state;
|
|
|
|
// Job control functions
|
|
|
|
JI_SCAN_FIRST_JOB ji_scan_first_job;
|
|
JI_SCAN_NEXT_JOB ji_scan_next_job;
|
|
JI_END_SCAN ji_end_scan;
|
|
JI_OPEN_JOB ji_open_job;
|
|
JI_CLOSE_JOB ji_close_job;
|
|
JI_REWIND_JOB ji_rewind_job;
|
|
JI_DISPOSE_JOB ji_dispose_job;
|
|
JI_PROCESS_JOB ji_process_job;
|
|
JI_DELETE_JOB ji_delete_job;
|
|
JI_ABORT_JOB ji_abort_job;
|
|
JI_GET_JOB_INFO ji_get_job_info;
|
|
JI_CREATE_JOB ji_create_job;
|
|
JI_ADD_ELEMENT ji_add_element;
|
|
JI_ADD_DATA ji_add_data;
|
|
JI_GET_DATA ji_get_data;
|
|
JI_GET_NEXT_ELEMENT ji_get_next_element;
|
|
JI_SET_ELEMENT_STATUS ji_set_element_status;
|
|
JI_SET_ELEMENT_RESOLVINFO ji_set_element_resolvinfo;
|
|
JI_SET_DIAGNOSTICS ji_set_diagnostics;
|
|
JI_GET_DIAGNOSTICS ji_get_diagnostics;
|
|
JI_INCREMENT_TIME ji_increment_time;
|
|
|
|
// MNICA (Network interface) functions
|
|
|
|
GET_FIRST_GROUP_MEMBER get_first_group_member;
|
|
GET_NEXT_GROUP_MEMBER get_next_group_member;
|
|
END_GROUP_SCAN end_group_scan;
|
|
IS_VALID_LOCAL_USER is_valid_local_user;
|
|
IS_GROUP_MEMBER is_group_member;
|
|
GET_FIRST_USER_DETAILS get_first_user_details;
|
|
GET_NEXT_USER_DETAILS get_next_user_details;
|
|
GET_USER_DETAILS get_user_details;
|
|
END_USER_SCAN end_user_scan;
|
|
READ_PMPROP read_pmprop;
|
|
CHANGE_OWNERSHIP change_ownership;
|
|
BEGIN_SINGLE_DELIVERY begin_single_delivery;
|
|
END_SINGLE_DELIVERY end_single_delivery;
|
|
|
|
// Miscellaneous functions
|
|
|
|
MERCURY_COMMAND mercury_command;
|
|
GET_DATE_STRING get_date_string;
|
|
RFC822_TIME rfc822_time;
|
|
RFC821_TIME rfc821_time;
|
|
|
|
// File parsing and I/O functions
|
|
|
|
FM_OPEN_FILE fm_open_file;
|
|
FM_OPEN_MESSAGE fm_open_message;
|
|
FM_CLOSE_MESSAGE fm_close_message;
|
|
FM_GETS fm_gets;
|
|
FM_GETC fm_getc;
|
|
FM_UNGETC fm_ungetc;
|
|
FM_READ fm_read;
|
|
FM_GETPOS fm_getpos;
|
|
FM_SETPOS fm_setpos;
|
|
FM_GET_FOLDED_LINE fm_get_folded_line;
|
|
FM_FIND_HEADER fm_find_header;
|
|
FM_EXTRACT_MESSAGE fm_extract_message;
|
|
|
|
PARSE_HEADER parse_header;
|
|
MIME_PREP_MESSAGE mime_prep_message;
|
|
PARSE_MIME parse_mime;
|
|
FREE_MIME free_mime;
|
|
FAKE_IMESSAGE fake_imessage;
|
|
DECODE_MIME_HEADER decode_mime_header;
|
|
ENCODE_MIME_HEADER encode_mime_header;
|
|
|
|
OM_CREATE_MESSAGE om_create_message;
|
|
OM_DISPOSE_MESSAGE om_dispose_message;
|
|
OM_ADD_FIELD om_add_field;
|
|
OM_ADD_ATTACHMENT om_add_attachment;
|
|
OM_WRITE_MESSAGE om_write_message;
|
|
OM_SEND_MESSAGE om_send_message;
|
|
|
|
ENCODE_BASE64_STR encode_base64_str;
|
|
DECODE_BASE64_STR decode_base64_str;
|
|
|
|
ST_REGISTER_MODULE st_register_module;
|
|
ST_UNREGISTER_MODULE st_unregister_module;
|
|
ST_CREATE_CATEGORY st_create_category;
|
|
ST_REMOVE_CATEGORY st_remove_category;
|
|
ST_SET_HCATEGORY st_set_hcategory;
|
|
ST_SET_CATEGORY st_set_category;
|
|
|
|
JI_TELL ji_tell;
|
|
JI_SEEK ji_seek;
|
|
JI_SET_JOB_FLAGS ji_set_job_flags;
|
|
|
|
LOGSTRING logstring;
|
|
LOGDATA logdata;
|
|
|
|
CREATE_OBJECT create_object;
|
|
SET_PASSWORD set_password;
|
|
|
|
ST_GET_NEXT_MODULE st_get_next_module;
|
|
ST_GET_NEXT_CATEGORY st_get_next_category;
|
|
ST_GET_CATEGORY_DATA st_get_category_data;
|
|
ST_EXPORT_STATS st_export_stats;
|
|
|
|
JI_GET_JOB_BY_ID ji_get_job_by_id;
|
|
JI_GET_JOB_TIMES ji_get_job_times;
|
|
|
|
SELECT_PRINTER select_printer;
|
|
PRINT_FILE print_file;
|
|
} M_INTERFACE;
|
|
|
|
|
|
#ifdef USES_M_INTERFACE
|
|
|
|
// Convenience macros: allow calls to internal Mercury functions to
|
|
// be made in the same way as they would be in the core code (good
|
|
// for portability).
|
|
|
|
// Values for the "flags" field of print_file
|
|
|
|
#define PRT_MESSAGE 1 // Print as an RFC822 message
|
|
#define PRT_REFORMAT 2 // Reformat long lines when printing
|
|
#define PRT_TIDY 4 // Print only "important" headers
|
|
#define PRT_FOOTER 8 // Print a footer on each page
|
|
#define PRT_NOHEADERS 16 // Print no message headers
|
|
#define PRT_FIRSTONLY 32 // Print only first line of headers
|
|
#define PRT_ITALICS 64 // Print quoted text in italics
|
|
|
|
extern M_INTERFACE *mi;
|
|
|
|
#define get_variable(x) (mi->get_variable (x))
|
|
#define is_local_address(a,u,s) (mi->is_local_address (a, u, s))
|
|
#define is_group(a,h,g) (mi->is_group (a, h, g))
|
|
#define parse_address(t,s,l) (mi->parse_address (t, s, l))
|
|
#define extract_one_address(d,s,o) (mi->extract_one_address (d, s, o))
|
|
#define extract_cqtext(d,s,l) (mi->extract_cqtext (d, s, l))
|
|
#define dlist_info(d,l,n,a,e,m) (mi->dlist_info(d, l, n, a, e, m))
|
|
#define send_notification(u,h,m) (mi->send_notification (u, h, m))
|
|
#define get_delivery_path(p,u,h) (mi->get_delivery_path (p, u, h))
|
|
#define get_date_and_time(b) (mi->get_date_and_time (b))
|
|
#define verify_password(u,s,p,e) (mi->verify_password (u, s, p, e))
|
|
#define write_profile(s,f) (mi->write_profile (s, f))
|
|
#define module_state(m,v,s) (mi->module_state (m, v, s))
|
|
|
|
#define ji_scan_first_job(t,m,d) (mi->ji_scan_first_job (t,m,d))
|
|
#define ji_scan_next_job(d) (mi->ji_scan_next_job (d))
|
|
#define ji_end_scan(d) (mi->ji_end_scan (d))
|
|
#define ji_open_job(j) (mi->ji_open_job (j))
|
|
#define ji_close_job(j) (mi->ji_close_job (j))
|
|
#define ji_rewind_job(j,f) (mi->ji_rewind_job (j,f))
|
|
#define ji_dispose_job(j) (mi->ji_dispose_job (j))
|
|
#define ji_process_job(j) (mi->ji_process_job (j))
|
|
#define ji_delete_job(j) (mi->ji_delete_job (j))
|
|
#define ji_abort_job(j,f) (mi->ji_abort_job (j, f))
|
|
#define ji_get_job_info(j,i) (mi->ji_get_job_info (j, i))
|
|
#define ji_create_job(t,f,s) (mi->ji_create_job (t,f,s))
|
|
#define ji_add_element(j,a) (mi->ji_add_element (j,a))
|
|
#define ji_add_data(j,d) (mi->ji_add_data (j,d))
|
|
#define ji_get_data(j,b,l) (mi->ji_get_data (j,b,l))
|
|
#define ji_get_next_element(j,t,i) (mi->ji_get_next_element (j,t,i))
|
|
#define ji_set_element_status(j,m,d) (mi->ji_set_element_status (j,m,d))
|
|
#define ji_set_element_resolvinfo(j,k,l,m,n) (mi->ji_set_element_resolvinfo (j,k,l,m,n))
|
|
#define ji_set_diagnostics(j,w,t) (mi->ji_set_diagnostics (j,w,t))
|
|
#define ji_get_diagnostics(j,w,f) (mi->ji_get_diagnostics (j,w,f))
|
|
#define ji_increment_time(t,s) (mi->ji_increment_time (t,s))
|
|
#define ji_tell(j,s) (mi->ji_tell (j,s))
|
|
#define ji_seek(j,o,s) (mi->ji_seek(j,o,s))
|
|
#define ji_set_job_flags(j,f) (mi->ji_set_job_flags(j,f))
|
|
#define ji_get_job_by_id(i) (mi->ji_get_job_by_id(i))
|
|
#define ji_get_job_times(j,s,r) (mi->ji_get_job_times(j,s,r))
|
|
|
|
#define get_first_group_member(g,h,m,l,d) (mi->get_first_group_member(g,h,m,l,d))
|
|
#define get_next_group_member(m,l,d) (mi->get_next_group_member(m,l,d))
|
|
#define end_group_scan(d) (mi->end_group_scan(d))
|
|
#define is_valid_local_user(a,u,h) (mi->is_valid_local_user(a,u,h))
|
|
#define is_group_member(h,u,g) (mi->is_group_member(h,u,g))
|
|
#define get_first_user_details(h,n,u,ul,a,al,f,fl,d) (mi->get_first_user_details(h,n,u,ul,a,al,f,fl,d))
|
|
#define get_next_user_details(u,ul,a,al,f,fl,d) (mi->get_next_user_details(u,ul,a,al,f,fl,d))
|
|
#define get_user_details(h,m,u,ul,a,al,f,fl) (mi->get_user_details(h,m,u,ul,a,al,f,fl))
|
|
#define end_user_scan(d) (mi->end_user_scan(d))
|
|
#define read_pmprop(u,s,p) (mi->read_pmprop(u,s,p))
|
|
#define change_ownership(f,h,n) (mi->change_ownership(f,h,n))
|
|
#define begin_single_delivery(u,s,d) (mi->begin_single_delivery(u,s,d))
|
|
#define end_single_delivery(d) (mi->end_single_delivery(d))
|
|
|
|
#define mercury_command(s,p1,p2) (mi->mercury_command(s,p1,p2))
|
|
#define get_date_string(s,b,d) (mi->get_date_string(s,b,d))
|
|
#define rfc822_time(s) (mi->rfc822_time(s))
|
|
#define rfc821_time(s) (mi->rfc821_time(s))
|
|
|
|
#define fm_open_file(p,f) (mi->fm_open_file(p,f))
|
|
#define fm_open_message(i,f) (mi->fm_open_message(i,f))
|
|
#define fm_close_message(i) (mi->fm_close_message(i))
|
|
#define fm_gets(b,m,i) (mi->fm_gets(b,m,i))
|
|
#define fm_getc(i) (mi->fm_getc(i))
|
|
#define fm_ungetc(c,i) (mi->fm_ungetc(c,i))
|
|
#define fm_read(i,b,s) (mi->fm_read(i,b,s))
|
|
#define fm_getpos(f) (mi->fm_getpos(f))
|
|
#define fm_setpos(f,o) (mi->fm_setpos(f,o))
|
|
#define fm_get_folded_line(f,l,x) (mi->fm_get_folded_line(f,l,x))
|
|
#define fm_find_header(i,n,b,l) (mi->fm_find_header(i,n,b,l))
|
|
#define fm_extract_message(j,n,f) (mi->fm_extract_message(j,n,f))
|
|
|
|
#define parse_header(f,m) (mi->parse_header(f,m))
|
|
#define mime_prep_message(i,f,h) (mi->mime_prep_message(i,f,h))
|
|
#define parse_mime(i,m) (mi->parse_mime(i,m))
|
|
#define free_mime(m) (mi->free_mime(m))
|
|
#define fake_imessage(i,s,m,e,b) (mi->fake_imessage(i,s,m,e,b))
|
|
#define decode_mime_header(d,s) (mi->decode_mime_header(d,s))
|
|
#define encode_mime_header(d,s,r) (mi->encode_mime_header(d,s,r))
|
|
|
|
#define om_create_message(m,f) (mi->om_create_message(m,f))
|
|
#define om_dispose_message(m) (mi->om_dispose_message(m))
|
|
#define om_add_field(m,s,d) (mi->om_add_field(m,s,d))
|
|
#define om_add_attachment(m,f,t,d,e,g,r) (mi->om_add_attachment(m,f,t,d,e,g,r))
|
|
#define om_write_message(m,f) (mi->om_write_message(m,f))
|
|
#define om_send_message(m,e) (mi->om_send_message(m,e))
|
|
|
|
#define encode_base64_str(d,s,l) (mi->encode_base64_str(d,s,l))
|
|
#define decode_base64_str(d,s,t) (mi->decode_base64_str(d,s,t))
|
|
|
|
#define st_register_module(m) (mi->st_register_module(m))
|
|
#define st_unregister_module(h) (mi->st_unregister_module(h))
|
|
#define st_create_category(m,c,t,y,l,f) (mi->st_create_category(m,c,t,y,l,f))
|
|
#define st_remove_category(m,c) (mi->st_remove_category(m,c))
|
|
#define st_set_hcategory(c,d) (mi->st_set_hcategory(c,d))
|
|
#define st_set_category(m,c,d) (mi->st_set_category(m,c,d))
|
|
|
|
#define logstring(l,p,s) (mi->logstring(l,p,s))
|
|
// "logdata" has variable parameters and cannot be accessed via a macro
|
|
|
|
#define create_object(n,t,i,f) (mi->create_object(n,t,i,f))
|
|
#define set_password(u,h,n,o,s) (mi->set_password(u,h,n,o,s))
|
|
|
|
#define st_get_next_module(m,n) (mi->st_get_next_module(m,n))
|
|
#define st_get_next_category(m,h,c,t,l,f) (mi->st_get_next_category(m,h,c,t,l,f))
|
|
#define st_get_category_data(c,d) (mi->st_get_category_data(c,d))
|
|
#define st_export_stats(m,f,l) (mi->st_export_stats(m,f,l))
|
|
|
|
#define select_printer(d,m) (mi->select_printer(d,m))
|
|
#define print_file(f,p,l,m,b,t,u,n,z) (mi->print_file(f,p,l,m,b,t,u,n,z))
|
|
|
|
#endif // USES_M_INTERFACE
|
|
|
|
#ifdef __cplusplus
|
|
};
|
|
#endif
|
|
|
|
#endif // _DAEMON_H
|
|
|