Server : Apache/2.4.43 (Win64) OpenSSL/1.1.1g PHP/7.4.6 System : Windows NT USER-PC 6.1 build 7601 (Windows 7 Professional Edition Service Pack 1) AMD64 User : User ( 0) PHP Version : 7.4.6 Disable Function : NONE Directory : C:/xampp/MercuryMail/RESOURCE/ |
//** //** 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