26#include "ms_example.h"
28#include <isode/base/compat.h>
30#include <seclabel_api.h>
35#define XML_BUFSIZE 1024
38int num_unverified_rcvd;
44static char *optstr =
"u37m:d:p:w:M:D:P:W:e:b:x:EY:U:I";
46static void usage(
void);
48static int get_msg(
struct X400msSession *sp);
50static void setup_default_new_sec_env(
struct X400msSession *sp,
char *sec_trusted_cert_dir);
52static void setup_default_old_sec_env(
struct X400msSession *sp,
char *
id,
char *dn,
char *pw
55static void report_msg_token_info(
struct X400Recipient *rp);
57static int get_sec_label(
struct X400msMessage *mp);
59static void print_sec_label(
unsigned char slab_buffer[],
unsigned int length);
61static int get_cic(
struct X400Recipient *rp);
63static int get_4406_info(
struct X400msMessage *mp);
65static void show_recip_certificate(
struct X400Recipient *rp,
int certtype,
const char *tag);
67static void show_message_certificate(
struct X400msMessage *mp,
const char *tag);
69static void show_certificate(
struct X400Certificate *cert,
const char *tag);
71static int handle_ipn(
struct X400msMessage *mp);
73static int handle_msg(
struct X400msSession *sp,
struct X400msMessage *mp);
75static int send_ipn(
struct X400msSession *sp,
struct X400msMessage *mp,
struct X400msMessage **ipn);
77static int do_report(
struct X400msSession *sp,
struct X400msMessage *mp);
82int main(
int argc,
char **argv) {
88 struct X400msSession *sp;
94 if (get_args(argc, argv, optstr)) {
99 printf(
"Connection type (0 = P7, 1 = P3 submit only, 2 = P3 both directions) [%d]: ", x400_contype);
100 contype = ic_fgetc(x400_contype, stdin);
102 ic_fgetc(x400_contype, stdin);
105 if (contype <
'0' ||
'2' < contype) {
106 contype = x400_contype;
113 def_oraddr = x400_ms_user_addr;
114 def_dn = x400_ms_user_dn;
115 def_pa = x400_ms_presentation_address;
118 def_oraddr = x400_mta_user_addr;
119 def_dn = x400_mta_user_dn;
120 def_pa = x400_mta_presentation_address;
123 printf(
"Your ORAddress [%s] > ", def_oraddr);
124 ic_fgets(orn,
sizeof orn, stdin);
126 if (orn[strlen(orn) - 1] ==
'\n') {
127 orn[strlen(orn) - 1] =
'\0';
130 if (orn[0] ==
'\0') {
131 strcpy(orn, def_oraddr);
135 printf(
"Password [%s]: ", contype == 0 ? x400_p7_password : x400_p3_password);
136 if (ic_fgets(buffer,
sizeof buffer, stdin) == NULL) {
140 if (buffer[strlen(buffer) - 1] ==
'\n') {
141 buffer[strlen(buffer) - 1] =
'\0';
143 if (buffer[0] ==
'\0') {
144 strcpy(buffer, contype == 0 ? x400_p7_password : x400_p3_password);
147 printf(
"Presentation Address [%s] > ", def_pa);
148 ic_fgets(pa,
sizeof pa, stdin);
150 if (pa[strlen(pa) - 1] ==
'\n') {
151 pa[strlen(pa) - 1] =
'\0';
158 status =
X400msOpen(contype, orn, def_dn, buffer, pa, &nummsg, &sp);
160 fprintf(stderr,
"Error in Open: %s\n",
X400msError(status));
168 printf(
"no messages - waiting for a message to be delivered.....\n");
171 printf(
"%d messages waiting\n", nummsg);
174 status = get_msg(sp);
176 fprintf(stderr,
"Error in getting msg: %s\n",
X400msError(status));
179 fprintf(stderr,
"got first\n");
182 fprintf(stderr,
"================================================\n");
183 status = get_msg(sp);
185 fprintf(stderr,
"Error in getting msg: %s\n",
X400msError(status));
188 }
while (until_no_more_msgs);
191 printf(
"%d num_messages_rcvd\n", num_messages_rcvd);
192 printf(
"%d num_reports_rcvd\n", num_reports_rcvd);
193 printf(
"%d num_unsigned_rcvd\n", num_unsigned_rcvd);
194 printf(
"%d num_unverified_rcvd\n", num_unverified_rcvd);
195 printf(
"%d num_verified_rcvd\n", num_verified_rcvd);
196 printf(
"%d num_ipns_rcvd\n", num_ipns_rcvd);
200static int get_msg(
struct X400msSession *sp) {
205 struct X400msMessage *mp;
208 printf(
"Waiting for new messages for 10 seconds\n");
211 fprintf(stderr,
"Error from Wait: %s\n",
X400msError(status));
214 printf(
"%d num_messagese_rcvd\n", num_messages_rcvd);
215 printf(
"%d num_reports_rcvd\n", num_reports_rcvd);
216 printf(
"%d num_unsigned_rcvd\n", num_unsigned_rcvd);
217 printf(
"%d num_unverified_rcvd\n", num_unverified_rcvd);
218 printf(
"%d num_verified_rcvd\n", num_verified_rcvd);
235 if (use_new_sec_env) {
236 setup_default_new_sec_env(sp, trusted_ca_certs_dir);
239 setup_default_old_sec_env(sp, security_id, identity_dn, passphrase);
249 printf(
"Getting message\n");
254 fprintf(stderr,
"MsgGet successfully got message\n");
257 fprintf(stderr,
"Error from MsgGet: %s\n",
X400msError(status));
268 status = do_report(sp, mp);
278 fprintf(stderr,
"Error from MsgGetIntParam (X400_N_IS_IPN): %s\n",
X400msError(status));
281 printf(
"Type of Message: %d\n", intparam);
286 printf(
"Received an IPN\n");
295 status = handle_msg(sp, mp);
297 fprintf(stderr,
"Error from handle_msg: %s\n",
X400msError(status));
301 struct X400msMessage *ipn;
302 status = send_ipn(sp, mp, &ipn);
304 fprintf(stderr,
"Error from send_ipn: %s\n",
X400msError(status));
309 fprintf(stderr,
"Error from X400msMsgDelete (subject message)%s\n",
X400msError(status));
314 fprintf(stderr,
"Error from X400msMsgDelete (IPN)%s\n",
X400msError(status));
322 fprintf(stderr,
"Error from X400msMsgDelete (IPN)%s\n",
X400msError(status));
329static int do_report(
struct X400msSession *sp,
struct X400msMessage *mp) {
333 char recipient_str[BUFSIZ];
336 struct X400Recipient *rp;
342 fprintf(stderr,
"Got a report (printing only some attributes)\n");
347 fprintf(stderr,
"Error from MsgGetStrParam: %s\n",
X400msError(status));
352 printf(
"Subject Identifier: %.*s\n", (
int)length, buffer);
361 fprintf(stderr,
"Error from RecipGet: %s\n",
X400msError(status));
370 fprintf(stderr,
"Error from RecipGetStrParam: %s\n",
X400msError(status));
376 printf(
"Delivery Report for recipient %d: %.*s\n", n, (
int)length, recipient_str);
384 printf(
"Delivery Time: %.*s\n", (
int)length, buffer);
388 printf(
"Negative Delivery Report for recipient %d: %.*s\n", n, (
int)length, recipient_str);
393 fprintf(stderr,
"Error from RecipGetStrParam: %s\n",
X400msError(status));
396 printf(
"Supplementary Info: %.*s\n", (
int)length, buffer);
401 fprintf(stderr,
"Error from RecipGetIntParam: %s\n",
X400msError(status));
403 printf(
"Non-Delivery Reason: %d\n", intparam);
408 fprintf(stderr,
"Error from RecipGetIntParam: %s\n",
X400msError(status));
410 printf(
"Non-Delivery Diagnostic: %d\n", intparam);
416 fprintf(stderr,
"Error from X400msMsgDelete: %s\n",
X400msError(status));
421static int handle_ipn(
struct X400msMessage *mp) {
422 struct X400Recipient *rp;
432 fprintf(stderr,
"Error from MsgGetStrParam (X400_S_OR_ADDRESS): %s\n",
X400msError(status));
435 printf(
"IPN Originator: %.*s\n", (
int)length, buffer);
441 fprintf(stderr,
"Error from X400msRecipGet (X400_RECIP_ENVELOPE): %s\n",
X400msError(status));
446 fprintf(stderr,
"Error from X400RecipGetStrParam (X400_S_OR_ADDRESS): %s\n",
X400msError(status));
450 buffer[length] =
'\0';
451 printf(
"IPN Recipient: %.*s\n", (
int)length, buffer);
458 fprintf(stderr,
"Error from MsgGetStrParam (X400_S_SUBJECT_IPM): %s\n",
X400msError(status));
461 printf(
"Subject Message Identifier: %.*s\n", (
int)length, buffer);
467 fprintf(stderr,
"Error from MsgGetStrParam (X400_S_CONVERSION_EITS): %s\n",
X400msError(status));
470 printf(
"conversion EITs: %.*s\n", (
int)length, buffer);
476 printf(
" non-receipt reason: %d\n", intparam);
479 fprintf(stderr,
"Error getting non-receipt reason: %s\n",
X400msError(status));
485 printf(
"discard reason: %d\n", intparam);
488 fprintf(stderr,
"Error getting discard reason: %s\n",
X400msError(status));
494 fprintf(stderr,
"Error from MsgGetStrParam (X400_S_AUTOFORWARD_COMMENT): %s\n",
X400msError(status));
497 printf(
"autoforward comment: %.*s\n", (
int)length, buffer);
503 fprintf(stderr,
"Error from MsgGetStrParam(X400_S_RECEIPT_TIME): %s\n",
X400msError(status));
506 printf(
" Time of receipt: (UTCTime format): %.*s\n", (
int)length, buffer);
512 printf(
" Acknowledgement mode: (0 - manual; 1 -automatic): %d\n", intparam);
515 fprintf(stderr,
"Error getting Acknowledgement mode: %s\n",
X400msError(status));
521 fprintf(stderr,
"Error from MsgGetStrParam (X400_S_SUPP_RECEIPT_INFO): %s\n",
X400msError(status));
528 printf(
" Supplementary information: %.*s\n", (
int)length, buffer);
532 fprintf(stderr,
"Error from MsgGetIntParam (X400_N_CONTENT_TYPE,): %s\n",
X400msError(status));
535 printf(
"Content Type: %d\n", intparam);
541static int handle_msg(
struct X400msSession *sp,
struct X400msMessage *mp) {
546 struct X400Recipient *rp;
552 fprintf(stderr,
"Error from MsgGetIntParam: %s\n",
X400msError(status));
554 printf(
"Size of Message: %d\n", intparam);
559 fprintf(stderr,
"Error from MsgGetIntParam (X400_N_CONTENT_TYPE,): %s\n",
X400msError(status));
562 printf(
"Content Type: %d\n", intparam);
568 fprintf(stderr,
"Error from MsgGetStrParam (X400_S_EXTERNAL_CONTENT_TYPE): %s\n",
X400msError(status));
571 printf(
"External Content Type: %.*s\n", (
int)length, buffer);
577 fprintf(stderr,
"Error from MsgGetStrParam: %s\n",
X400msError(status));
582 printf(
"Message Identifier: %.*s\n", (
int)length, buffer);
590 fprintf(stderr,
"Error from MsgGetStrParam: %s\n",
X400msError(status));
595 printf(
"Originator: %.*s\n", (
int)length, buffer);
604 fprintf(stderr,
"Error from RecipGet (envelope): %s\n",
X400msError(status));
613 printf(
"Env Recipient %d: %.*s\n", n, (
int)length, buffer);
619 printf(
"Recipient proof of delivery request is %d\n", intparam);
622 fprintf(stderr,
"Error getting proof of delivery request: %s\n",
X400msError(status));
629 report_msg_token_info(rp);
642 fprintf(stderr,
"Error from RecipGet (primary): %s\n",
X400msError(status));
650 printf(
"Primary Recipient %d: %.*s\n", n, (
int)length, buffer);
655 printf(
"Primary Recipient Precedence %d\n", intparam);
658 fprintf(stderr,
"Error getting Primary Recipient Precedence : %s\n",
X400msError(status));
665 printf(
"Subject: %.*s\n", (
int)length, buffer);
671 printf(
"Text:\n%.*s\n", (
int)length, buffer);
674 printf(
"No IA5 Text content (%d: %s)\n", status,
X400msError(status));
678 printf(
"Getting body parts\n");
684static int send_ipn(
struct X400msSession *sp,
struct X400msMessage *mp,
struct X400msMessage **ipn) {
688 fprintf(stderr,
"x400msMsgNew returned error: %s\n",
X400msError(status));
694 fprintf(stderr,
"Error from X400msMakeIPN: %s\n",
X400msError(status));
701 fprintf(stderr,
"x400msMsgSend returned error: %s\n",
X400msError(status));
705 printf(
"IPN submitted successfully\n");
719static void setup_default_new_sec_env(
struct X400msSession *sp,
char *local_trusted_ca_certs_dir) {
723 printf(
" Adding %s as trusted CA cert dir\n", trusted_ca_certs_dir);
726 fprintf(stderr,
"X400msSetStrDefault returned error: %s\n",
X400msError(status));
742static void setup_default_old_sec_env(
struct X400msSession *sp,
char *
id,
char *dn,
char *pw
757 fprintf(stderr,
"X400msSetStrDefault returned error: %s\n",
X400msError(status));
764 fprintf(stderr,
"X400msSetStrDefault returned error: %s\n",
X400msError(status));
770static void report_msg_token_info(
struct X400Recipient *rp) {
778 fprintf(stderr,
"No MessageToken present in recipient\n");
784 fprintf(stderr,
"Message Token status not available\n");
787 fprintf(stderr,
"Message Token status %d \n", param);
792 fprintf(stderr,
"Token OK (%d)\n", param);
796 fprintf(stderr,
"Message Token validation cannot take place because the security environment is invalid (%d):\n", param);
806 fprintf(stderr,
"Message Token validation failed (%d): %s\n", param,
X400msError(param));
809 fprintf(stderr,
"Unexpected Message Token validation result (%d): %s\n", param,
X400msError(param));
818 fprintf(stderr,
"Error from RecipGetStrParam: %s\n",
X400msError(status));
820 fprintf(stderr,
"recipient in token not available\n");
823 fprintf(stderr,
"Message Token(%u): recipient in Token '%.*s'\n", (
unsigned)length, (
int)length, buffer);
829 fprintf(stderr,
"Message Token DER not available\n");
832 fprintf(stderr,
"Message Token DER available (%u bytes)\n", (
unsigned)length);
838 fprintf(stderr,
"Message Token seq num not available\n");
841 fprintf(stderr,
"Message Token seq num %d \n", param);
847 fprintf(stderr,
"Message Token Security Label DER not available\n");
850 fprintf(stderr,
"Message Token Security Label DER available (%u bytes)\n", (
unsigned)length);
851 fprintf(stderr,
"Security Label from Message Token is:\n");
852 print_sec_label((
unsigned char *)buffer, length);
858 printf(
"No Content Integrity Check in token\n");
861 printf(
"Error from RecipGetIntParam: %s\n",
X400msError(status));
868 printf(
"Content Integrity Check in token succeeded\n");
871 printf(
"Content Integrity Check in token error (%d): %s\n", param,
X400msError(param));
878 fprintf(stderr,
"Message Token Content Integrity Check DER not available\n");
881 fprintf(stderr,
"Message Token Content Integrity Check DER available (%u bytes)\n", (
unsigned)length);
891 fprintf(stderr,
"Message Token proof of delivery status not available\n");
894 fprintf(stderr,
"Message Token proof of delivery status %d \n", param);
900 fprintf(stderr,
"Message Token security label status not available\n");
903 fprintf(stderr,
"Message Token security label status %d \n", param);
909 fprintf(stderr,
"Message Token recip status not available\n");
912 fprintf(stderr,
"Message Token recip status %d \n", param);
918static int get_sec_label(
struct X400msMessage *mp) {
919 unsigned char slab_buffer[XML_BUFSIZE];
925 printf(
"No security label\n");
928 fprintf(stderr,
"Failed to fetch security label: %d", status);
932 fprintf(stderr,
"Security Label from envelope is:\n");
933 print_sec_label(slab_buffer, length);
938static void print_sec_label(
unsigned char slab_buffer[],
unsigned int length) {
940 char xml_buffer[XML_BUFSIZE];
943 status = SecLabelInit(
"Example program");
944 if (status != SECLABEL_E_NOERROR) {
945 fprintf(stderr,
"SecLabelInit returned error %d\n", status);
949 status = SecLabelPrint(slab_buffer, length, xml_buffer, XML_BUFSIZE);
951 if (status != SECLABEL_E_NOERROR) {
952 fprintf(stderr,
"SecLabelParse returned error %d\n", status);
957 printf(
"Got security label:%s\n", xml_buffer);
961static int get_cic(
struct X400Recipient *rp) {
963 int status, cic_status;
970 printf(
"No Content Integrity Check in recipient\n");
974 printf(
"Error from RecipGetIntParam: %s\n",
X400msError(cic_status));
981 printf(
"Content Integrity Check succeeded\n");
984 printf(
"Content Integrity Check error (%d): %s\n", intparam,
X400msError(intparam));
991 fprintf(stderr,
"Error getting recipient cic: %s\n",
X400msError(status));
994 printf(
"Content Integrity Check found in recipient (%d)\n", (
int)length);
1003static int get_4406_info(
struct X400msMessage *mp) {
1007 char buffer[BUFSIZ];
1012 printf(
"4406 Status (X400_N_S4406_STATUS) absent so not PCT: %s\n",
X400msError(status));
1016 fprintf(stderr,
"Error from MsgGetIntParam (X400_N_S4406_STATUS): %s\n",
X400msError(status));
1019 printf(
"4406 Status(X400_N_S4406_STATUS): %d\n", intparam);
1028 fprintf(stderr,
"Error from MsgGetIntParam (X400_N_S4406): %s\n",
X400msError(status));
1031 printf(
"4406 (X400_N_S4406): %d\n", intparam);
1037 fprintf(stderr,
"Error from MsgGetStrParam (X400_S_S4406_STATUS_DETAIL): %s\n",
X400msError(status));
1040 printf(
"S4406 Status Detail (X400_S_S4406_STATUS_DETAIL): %.*s\n", (
int)length, buffer);
1042 show_message_certificate(mp,
"S4406");
1047static void show_message_certificate(
struct X400msMessage *mp,
const char *tag ARGNOTUSED) {
1049 struct X400Certificate *cert;
1053 fprintf(stderr,
"Error getting S4406 certificate: %s\n",
X400msError(status));
1056 show_certificate(cert,
"X400_N_S4406_CERTIFICATE");
1060static void show_recip_certificate(
struct X400Recipient *rp,
int certtype,
const char *tag) {
1062 struct X400Certificate *cert;
1066 fprintf(stderr,
"Error getting %s certificate: %s\n", tag,
X400msError(status));
1069 show_certificate(cert, tag);
1073static void show_certificate(
struct X400Certificate *cert,
const char *tag) {
1075 char buffer[BUFSIZ];
1082 fprintf(stderr,
"Error getting subject of cert used for %s: %s\n", tag,
X400msError(status));
1085 printf(
"Subject of Cert used to verify %s (%.*s)\n", tag, (
int)length, buffer);
1091 fprintf(stderr,
"Error getting issuer of cert used for %s: %s\n", tag,
X400msError(status));
1094 printf(
"Issuer of Cert used to verify %s (%.*s)\n", tag, (
int)length, buffer);
1100 fprintf(stderr,
"Error getting serial num of cert used for %s: %s\n", tag,
X400msError(status));
1103 printf(
"Serial Num of Cert used to verify %s (%.*s)\n", tag, (
int)length, buffer);
1109 fprintf(stderr,
"Error getting certificate BER used for %s: %s\n", tag,
X400msError(status));
1112 printf(
"Returned certificate used to verify %s (%d)\n", tag, (
int)length);
1119 fprintf(stderr,
"No ORaddress SAN\n");
1122 fprintf(stderr,
"Error from CertGetStrParam: %s\n",
X400msError(status));
1127 fprintf(stderr,
"ORaddress SAN: '%.*s'\n", (
int)length, buffer);
1134 fprintf(stderr,
"No MTAname SAN (MTA)\n");
1137 fprintf(stderr,
"Error from CertGetStrParam: %s\n",
X400msError(status));
1142 fprintf(stderr,
"MTAname SAN MTA: '%.*s'\n", (
int)length, buffer);
1147 fprintf(stderr,
"No MTAname SAN (GDI)\n");
1150 fprintf(stderr,
"Error from CertGetStrParam: %s\n",
X400msError(status));
1155 fprintf(stderr,
"MTAname SAN GDI: '%.*s'\n", (
int)length, buffer);
1163 fprintf(stderr,
"Error from ORaddress CertGetStrParam: %s\n",
X400msError(status));
1166 fprintf(stderr,
"ORaddress SAN status: %s\n",
X400msError(paramval));
1171 fprintf(stderr,
"Error from MTAname CertGetStrParam: %s\n",
X400msError(status));
1174 fprintf(stderr,
"MTAname SAN status: %s\n",
X400msError(paramval));
1178 fprintf(stderr,
"ORaddress SAN status: %s\n",
X400msError(paramval));
1182static void usage(
void) {
1183 printf(
"usage: %s\n", optstr);
1184 printf(
"\t where:\n");
1185 printf(
"\t -u : Don't prompt to override defaults \n");
1186 printf(
"\t -3 : Use P3 connection \n");
1187 printf(
"\t -7 : Use P7 connection \n");
1188 printf(
"\t -m : OR Address in P7 bind arg \n");
1189 printf(
"\t -d : DN in P7 bind arg \n");
1190 printf(
"\t -p : Presentation Address of P7 Store \n");
1191 printf(
"\t -w : P7 password of P7 user \n");
1192 printf(
"\t -M : OR Address in P3 bind arg \n");
1193 printf(
"\t -D : DN in P3 bind arg \n");
1194 printf(
"\t -P : Presentation Address of P3 server\n");
1195 printf(
"\t -W : P3 password of P3 user \n");
1196 printf(
"\t -e : Security Environment (dir with x509 subdir): obsolete, use -Y <p12file>\n");
1197 printf(
"\t -x : DN of X.509 Digital Identity\n");
1198 printf(
"\t -b : Passphrase for private key in PKCS12 file\n");
1199 printf(
"\t -E : Fetch messages until all read\n");
1200 printf(
"\t -Y : Filename of PKCS12 file containing Digital Identity\n");
1201 printf(
"\t -U : Directory containing trust anchors\n");
1202 printf(
"\t -I : Generate IPN from message received\n");
#define X400_N_CERT_ORADDRESS_STATUS
#define X400_N_CERT_MTANAME_STATUS
#define X400_S_CERT_ISSUER_DN
#define X400_N_CERT_MSGTOK_CIC
#define X400_N_CERT_MSGTOK
#define X400_N_CERT_RECIP_CIC
#define X400_S_CERT_SUBJECT_DN
#define X400_S_CERT_SERIAL_NUM
#define X400_S_CERT_GDI_NAME
#define X400_S_CERT_MTA_NAME
#define X400_N_RECIP_CIC_STATUS
int X400CertGetStrParam(struct X400Certificate *cp, int paramtype, char *buffer, size_t buflen, size_t *paramlenp)
Return a string-valued parameter from the certificate object.
int X400RecipGetCert(struct X400Recipient *rp, int certtype, struct X400Certificate **certp)
Get certificate object from recipient This returns a certificate which was used to sign an object in ...
int X400CertGetIntParam(struct X400Certificate *cp, int paramtype, int *valp)
Return a integer-valued parameter from the certificate object.
int X400RecipGetStrParam(struct X400Recipient *rp, int paramtype, char *buffer, size_t buflen, size_t *paramlenp)
Return a string-valued parameter from the recipient object.
int X400msMsgGetCert(struct X400msMessage *mp, int certtype, struct X400Certificate **certp)
Get certificate object from message This returns a certificate which was used to sign an object in th...
int X400msRecipGet(struct X400msMessage *mp, int type, int number, struct X400Recipient **rpp)
Get recipient object from message.
int X400msMsgGetStrParam(struct X400msMessage *mp, int paramtype, char *buffer, size_t buflen, size_t *paramlenp)
Return a string-valued parameter from the message object.
int X400msMakeIPN(struct X400msMessage *mp, int non_receipt_reason, struct X400msMessage **mpp)
Make an IPN based on the subject IPM.
int X400msRecipGetStrParam(struct X400Recipient *rp, int paramtype, char *buffer, size_t buflen, size_t *paramlenp)
Return a string-valued parameter from the recipient object.
int X400msWait(struct X400msSession *sp, int seconds, int *count)
Wait for messages to be ready to be read.
int X400msMsgGet(struct X400msSession *sp, int number, struct X400msMessage **mpp, int *typep, int *seqp)
Get message object for transfer out from MS or MTA via P3.
const char * X400msError(int error)
Obtain a string describing the meaning of the given error code.
int X400msSetIntDefault(struct X400msSession *sp, int paramtype, int value)
Set a default integer parameter value in a session.
int X400msMsgSend(struct X400msMessage *mp)
Send message object.
int X400msRecipGetIntParam(struct X400Recipient *rp, int paramtype, int *valp)
Return a integer-valued parameter from the recipient object.
int X400msMsgDelete(struct X400msMessage *mp, int retain)
Delete message object.
int X400msMsgNew(struct X400msSession *sp, int type, struct X400msMessage **mpp)
Creates new message.
int X400msClose(struct X400msSession *sp)
Close a X400 Session.
int X400msSetStrDefault(struct X400msSession *sp, int paramtype, const char *value, size_t length)
Set a default string parameter value in a session.
int X400msOpen(int type, const char *oraddr, const char *dirname, const char *credentials, const char *pa, int *messages, struct X400msSession **spp)
Open a session to a Message Store (P7) or MTA (P3) in synchronous mode.
int X400msMsgGetIntParam(struct X400msMessage *mp, int paramtype, int *valp)
Return a integer-valued parameter from the message object.
#define X400_S_OR_ADDRESS
#define X400_N_PROOF_OF_DEL_REQ
#define X400_B_RETURN_VERIFICATION_ERRORS
#define X400_S_LOG_CONFIGURATION_FILE
#define X400_S_MESSAGE_DELIVERY_TIME
#define X400_N_CONTENT_TYPE
#define X400_N_CONTENT_LENGTH
#define X400_S_EXTERNAL_CONTENT_TYPE
#define X400_S_MESSAGE_IDENTIFIER
#define X400_S_SECURITY_LABEL
#define X400_E_X509_CERT_INVALID
#define X400_E_X509_VERIFY_FAIL
#define X400_E_X509_ITEM_INVALID
#define X400_E_X509_VERIFY_FAIL_NO_CERT
#define X400_E_X509_VERIFY_FAIL_UNSUPPORTED_ALG
#define X400_E_X509_VERIFY_FAIL_NO_PUBKEY
#define X400_E_X509_VERIFY_FAIL_INCOMPAT_ALG
#define X400_N_DISCARD_REASON
#define X400_S_AUTOFORWARD_COMMENT
#define X400_N_NON_RECEIPT_REASON
#define X400_S_SUPP_RECEIPT_INFO
#define X400_S_RECEIPT_TIME
#define X400_S_CONVERSION_EITS
#define X400_S_SUBJECT_IPM
#define X400_N_PRECEDENCE
#define X400_RECIP_PRIMARY
#define X400_RECIP_ENVELOPE
#define X400_RECIP_REPORT
#define X400_S_SUPPLEMENTARY_INFO
#define X400_S_SUBJECT_IDENTIFIER
#define X400_N_NON_DELIVERY_REASON
#define X400_N_NON_DELIVERY_DIAGNOSTIC
#define X400_N_S4406_STATUS
#define X400_S_S4406_STATUS_DETAIL
#define X400_N_S4406_CERTIFICATE
#define X400_N_MSGTOK_SEQ_NUM
#define X400_N_MSGTOK_RECIP_STATUS
#define X400_S_SEC_IDENTITY_DN
#define X400_S_MSGTOK_DER
#define X400_N_MSGTOK_CIC_STATUS
#define X400_N_MSGTOK_STATUS
#define X400_S_MSGTOK_SEC_LAB
#define X400_N_MSGTOK_SEC_LAB_STATUS
#define X400_S_SEC_TRUSTED_CERTS_DIR
#define X400_N_MSGTOK_PODR_STATUS
#define X400_S_SEC_IDENTITY
#define X400_S_MSGTOK_CIC
#define X400_S_SEC_IDENTITY_PASSPHRASE
#define X400_S_MSGTOK_RECIP
X400 MA/MS (P3/P7) Interface.