20 #include <sys/types.h> 28 #include <seclabel_api.h> 30 #include "ms_example.h" 34 static char *optstr =
"u371m:d:p:w:M:D:P:W:o:O:r:l:R:y:C:iaqsAvf:kK:B:";
37 static char *default_recip =
"/CN=P7User1/O=attlee/PRMD=TestPRMD/ADMD=TestADMD/C=GB/";
39 static const char text[] =
"First line\r\nSecond line\r\n";
40 static char *binary_data;
42 static char *fwd_subject =
"Forwarded message subject";
44 static int add_binary_attachment (
45 struct X400msMessage *mp,
46 char * filename_to_send
48 static int add_fwd_bp (
49 struct X400msMessage *mp,
53 static void usage(
void) ;
66 struct X400msSession *sp;
67 struct X400msMessage *mp;
68 struct X400Recipient *rp;
74 if (get_args(argc, argv, optstr)) {
79 printf(
"Connection type (0 = P7, 1 = P3 submit only, 2 = P3 both directions) [%d]: ", x400_contype);
80 contype = ic_fgetc(x400_contype, stdin);
82 ic_fgetc(x400_contype, stdin);
84 if ( contype <
'0' ||
'2' < contype )
85 contype = x400_contype;
90 def_oraddr = x400_ms_user_addr;
91 def_dn = x400_ms_user_dn;
92 def_pa = x400_ms_presentation_address;
94 def_oraddr = x400_mta_user_addr;
95 def_dn = x400_mta_user_dn;
96 def_pa = x400_mta_presentation_address;
99 printf(
"Your ORAddress [%s] > ", def_oraddr);
100 ic_fgets (orn,
sizeof orn, stdin);
102 if ( (strlen(orn) > 0) && (orn[strlen(orn)-1] ==
'\n') )
103 orn[strlen(orn)-1] =
'\0';
106 strcpy(orn, def_oraddr);
109 printf (
"Password [%s]: ",
110 contype == 0 ? x400_p7_password : x400_p3_password);
111 if ( ic_fgets (buffer,
sizeof buffer, stdin) == NULL )
114 if ((strlen(buffer) > 0) && (buffer[strlen(buffer)-1] ==
'\n') )
115 buffer[strlen(buffer)-1] =
'\0';
116 if (buffer[0] ==
'\0')
117 strcpy(buffer, contype == 0 ? x400_p7_password : x400_p3_password);
120 printf(
"Presentation Address [%s] > ", def_pa);
121 ic_fgets (pa,
sizeof pa, stdin);
123 if ( (strlen(pa) > 0) && (pa[strlen(pa)-1] ==
'\n'))
124 pa[strlen(pa)-1] =
'\0';
129 if (talking_to_marben_ms)
133 status =
X400msOpen (contype, orn, def_dn, buffer, pa, NULL, &sp);
135 fprintf (stderr,
"Error in Open: %s\n",
X400msError (status));
139 if (talking_to_marben_ms)
164 if (x400_default_recipient != NULL)
165 recip = x400_default_recipient;
167 recip = default_recip;
169 printf(
"Message recipient [%s]: ", recip);
170 ic_fgets (tmp,
sizeof tmp, stdin);
172 if ( (strlen(tmp) > 0) && (tmp[strlen(tmp)-1] ==
'\n') )
173 tmp[strlen(tmp)-1] =
'\0';
174 if (strlen(tmp) != 0)
177 printf(
"Subject [%s]: ", subject);
178 ic_fgets (tmp,
sizeof tmp, stdin);
180 if ( (strlen(tmp) > 0) && (tmp[strlen(tmp)-1] ==
'\n') )
181 tmp[strlen(tmp)-1] =
'\0';
182 if (strlen(tmp) != 0)
183 subject = strdup(tmp);
187 fprintf (stderr,
"x400msMsgNew returned error: %s\n",
X400msError (status));
193 fprintf (stderr,
"x400msRecipNew returned error: %s\n",
X400msError (status));
199 fprintf (stderr,
"x400msRecipAddStrParam returned error: %s\n",
X400msError (status));
205 fprintf (stderr,
"x400msRecipAddStrParam returned error: %s\n",
X400msError (status));
211 fprintf (stderr,
"x400msMsgAddStrParam returned error: %s\n",
X400msError (status));
217 fprintf (stderr,
"x400msMsgAddStrParam returned error: %s\n",
X400msError (status));
222 printf(
"delivery report request %d ( 1 - No, 2 - Yes)\n", x400_dr_req);
225 fprintf (stderr,
"x400msRecipAddStrParam returned error: %s\n",
X400msError (status));
230 printf(
"read notification request %d ( 1 - RN, 2 - NRN, 4 - return of IPM with NRN )\n", x400_rn_req);
233 fprintf (stderr,
"x400msRecipAddIntParam returned error: %s\n",
X400msError (status));
238 char *contid =
"ContID00001";
243 fprintf (stderr,
"X400msMsgAddIntParam %d returned error: %s\n",
252 fprintf (stderr,
"X400msMsgAddIntParam %d returned error: %s\n",
258 printf(
"message priority is %d ( 0 - normal, 1 - non-urgent, 2 - urgent)\n",
259 x400_default_priority);
264 printf(
"military message priority is %d ( 0 - low, 1 - high)\n",
265 x400_default_priority);
273 char tmp_buffer[255];
275 snprintf(tmp_buffer, 244,
"%s '%s' '%.19s'",
276 subject, get_x400_pty_str_from_4406(x400_default_priority), ctime(&t));
277 printf(
"Subject is '%s'\n", tmp_buffer);
280 fprintf (stderr,
"x400msMsgAddStrParam returned error: %s\n",
289 fprintf (stderr,
"x400msMsgAddStrParam returned error: %s\n",
X400msError (status));
295 fprintf (stderr,
"x400ms returned error: %s\n",
X400msError (status));
302 printf(
"failed to add X400_T_IA5TEXT BP\n");
307 if (filename_to_send != NULL) {
308 status = add_binary_attachment (mp, filename_to_send);
310 printf(
"failed to add X400_T_BINARY BP\n");
313 status = add_fwd_bp (mp, orn, def_dn);
315 printf(
"failed to add forwarded BP\n");
319 printf(
"no binary file set - not sending X400_T_BINARY\n");
320 printf(
"no binary file set - not sending forwarded BP\n");
326 #define XML_BUFSIZE 1024 327 #define STRING_BUFSIZE 1024 329 const char* xml_filename =
"seclabel.xml";
330 char xml_content[XML_BUFSIZE];
331 char str_content[STRING_BUFSIZE];
332 int str_len = STRING_BUFSIZE;
336 fd = fopen(xml_filename,
"r");
338 fprintf(stderr,
"Failed to open %s : %s\n",
339 xml_filename,strerror(errno));
342 fread(&xml_content,XML_BUFSIZE,1,fd);
346 status = SecLabelInit(
"Example program");
347 if (status != SECLABEL_E_NOERROR) {
348 fprintf(stderr,
"SecLabelInit returned error %d\n", status);
353 status = SecLabelParse(xml_content,
358 if (status != SECLABEL_E_NOERROR) {
359 fprintf(stderr,
"SecLabelParse returned error %d\n", status);
365 str_content,str_len);
367 fprintf (stderr,
"x400msMsgAddStrParam returned error: %s\n",
X400msError (status));
376 fprintf (stderr,
"x400msMsgSend returned error: %s\n",
X400msError (status));
380 struct X400Recipient *irp;
390 fprintf(stderr,
"A recipient with ");
395 fprintf (stderr,
"ORAddress %s ", buf);
401 fprintf (stderr,
" and DN %s", buf);
403 fprintf (stderr,
" was rejected\n");
414 printf(
"Message submitted successfully\n");
418 fprintf(stderr,
"No MessageId present from submission result: error %d\n", status);
421 printf(
"MessageId from Submission Result = %s\n", buf);
426 fprintf(stderr,
"No MessageSubmissionTime present from submission result: error %d\n", status);
429 printf(
"MessageSubmissionTime from Submission Result = %s\n", buf);
434 fprintf(stderr,
"No ContentIdentifier present from submission result: error %d\n", status);
437 printf(
"ContentIdentifier from Submission Result = %s\n", buf);
445 fprintf(stderr,
"Failed to get raw message length: error %d\n", status);
447 struct X400msMessage *newmsg;
450 databuf = (
char *)malloc(retlen);
451 printf(
"Data buffer length required = %d\n", (
int)retlen);
454 fprintf(stderr,
"Failed to get raw message: error %d\n", status);
457 FILE *fd = fopen(
"message.dump",
"w");
459 fprintf(stderr,
"Failed to open file message.dump\n");
461 if (fwrite(databuf, 1, retlen, fd) < retlen) {
462 fprintf(stderr,
"Failed to write message to file message.dump\n");
464 fprintf(stdout,
"Dumped message to file message.dump\n");
473 fprintf(stderr,
"Failed to create message from bytes: error %d\n", status);
482 fprintf (stderr,
"x400msMsgDelete returned error: %s\n",
X400msError (status));
494 static int add_binary_attachment (
495 struct X400msMessage *mp,
505 printf(
"sending file %s\n", filename);
506 if ((fd = open (filename_to_send, O_RDONLY)) == -1) {
507 printf(
"Failed to open content file %s", filename);
512 if (fstat(fd, &buf) != 0) {
514 printf(
"Can't fstat file %s %d", filename, errno);
518 file_size = buf.st_size;
519 printf(
"Content file size = %d\n", file_size);
521 binary_data = (
char *) malloc(file_size);
522 if ( binary_data == NULL )
524 if ((fs = read(fd, binary_data, file_size) ) == -1) {
525 printf(
"Cannot read from binary file %d\n", errno);
532 printf(
"failed to add X400_T_BINARY BP\n");
538 static int add_fwd_bp (
539 struct X400msMessage *mp,
544 struct X400Message *x400_mp;
545 struct X400Recipient *rp;
549 printf(
"sending fwd bp \n");
553 fprintf (stderr,
"x400MsgNew returned error: %s\n",
X400msError (status));
558 "090909090909Z", (
size_t)-1);
560 fprintf (stderr,
"x400MsgAddStrParam returned error: %s\n",
X400msError (status));
565 "090909090909Z", (
size_t)-1);
567 fprintf (stderr,
"x400MsgAddStrParam returned error: %s\n",
X400msError (status));
574 fprintf (stderr,
"x400MsgAddStrParam returned error: %s\n",
X400msError (status));
579 fprintf (stderr,
"x400MsgAddStrParam returned error: %s\n",
X400msError (status));
586 fprintf (stderr,
"x400RecipNew returned error: %s\n",
X400msError (status));
593 fprintf (stderr,
"x400RecipAddStrParam returned error: %s\n",
X400msError (status));
600 fprintf (stderr,
"x400msRecipAddStrParam returned error: %s\n",
X400msError (status));
607 fprintf (stderr,
"X400MsgAddRecip returned error: %s\n",
X400msError (status));
610 printf(
"Put %s in as originator\n", orig_orn);
615 fprintf (stderr,
"x400RecipNew returned error: %s\n",
X400msError (status));
621 fprintf (stderr,
"x400RecipAddStrParam returned error: %s\n",
X400msError (status));
627 fprintf (stderr,
"x400msRecipAddStrParam returned error: %s\n",
X400msError (status));
633 fprintf (stderr,
"X400MsgAddRecip returned error: %s\n",
X400msError (status));
636 printf(
"Put %s in as reipient\n", recip);
642 fprintf (stderr,
"x400RecipNew returned error: %s\n",
X400msError (status));
648 fprintf (stderr,
"x400RecipAddStrParam returned error: %s\n",
X400msError (status));
654 fprintf (stderr,
"x400msRecipAddStrParam returned error: %s\n",
X400msError (status));
662 fprintf (stderr,
"X400MsgAddRecip returned error: %s\n",
X400msError (status));
665 printf(
"Put %s in as reipient\n", recip);
671 printf(
"message priority is %d ( 0 - normal, 1 - non-urgent, 2 - urgent)\n",
672 x400_default_priority);
677 printf(
"military message priority is %d ( 0 - low, 1 - high)\n",
678 x400_default_priority);
686 fprintf (stderr,
"x400msMsgAddStrParam returned error: %s\n",
X400msError (status));
693 printf(
"failed to add X400_T_IA5TEXT BP\n");
701 fprintf (stderr,
"x400ms returned error: %s\n",
X400msError (status));
712 fprintf (stderr,
"X400msMsgAddMessageBody returned error: %s\n",
X400msError (status));
719 static void usage(
void) {
720 printf(
"usage: %s\n", optstr);
721 printf(
"\t where:\n");
722 printf(
"\t -u : Don't prompt to override defaults \n");
723 printf(
"\t -3 : Use P3 connection \n");
724 printf(
"\t -7 : Use P7 connection \n");
725 printf(
"\t -1 : Use Marben-compatibility mode for P7 connection \n");
726 printf(
"\t -m : OR Address in P7 bind arg \n");
727 printf(
"\t -d : DN in P7 bind arg \n");
728 printf(
"\t -p : Presentation Address of P7 Store \n");
729 printf(
"\t -w : P7 password of P7 user \n");
730 printf(
"\t -M : OR Address in P3 bind arg \n");
731 printf(
"\t -D : DN in P3 bind arg \n");
732 printf(
"\t -P : Presentation Address of P3 server\n");
733 printf(
"\t -W : P3 password of P3 user \n");
734 printf(
"\t -o : Originator \n");
735 printf(
"\t -O : Originator Return Address \n");
736 printf(
"\t -r : Recipient\n");
737 printf(
"\t -l : Logline\n");
738 printf(
"\t -R : Report setting: 0=none, 1=-ve, 2=+ve\n");
739 printf(
"\t -y : Military Priority \n");
740 printf(
"\t\t 0 - deferred, 1 - routine, 2 - priority \n");
741 printf(
"\t\t 3 - immediate, 4 - flash, 5 - override \n");
742 printf(
"\t -C : Content Type (2/22/772/OID) \n");
743 printf(
"\t -i : Implicit conversion prohibited = TRUE \n");
744 printf(
"\t -a : Alternate Recipient Prohibited = TRUE \n");
745 printf(
"\t -q : Content Return Request = TRUE \n");
746 printf(
"\t -s : Disclosure of Recipient = FALSE \n");
747 printf(
"\t -A : Recipient Reassignment Prohibited = FALSE \n");
748 printf(
"\t -v : Conversion with Loss Prohibited = FALSE \n");
749 printf(
"\t -f : Filename to transfer as binary bp\n");
750 printf(
"\t -k : Request Delivery Report\n");
751 printf(
"\t -K : Request Read Notification ( 1 - RN, 2 - NRN, 4 - return of IPM with NRN )\n");
752 printf(
"\t -B : Set alternative subject line \n");
#define X400_S_DIRECTORY_NAME
#define X400_S_EXTERNAL_CONTENT_TYPE
#define X400_S_TELETEX_CHARSETS
#define X400_S_LOG_CONFIGURATION_FILE
int X400msSetStrDefault(struct X400msSession *sp, int paramtype, const char *value, size_t length)
Set a default string parameter value in a session.
int X400MsgNew(int type, struct X400Message **mpp)
Creates new message.
#define X400_S_CONTENT_IDENTIFIER
int X400msMsgAddStrParam(struct X400msMessage *mp, int paramtype, const char *value, size_t length)
Add string-valued parameter to the message.
int X400msMsgAddMessageBody(struct X400msMessage *mp, struct X400Message *mbp)
void X400msSetConfigRequest(int val)
Disable and enable configuration requests in MS Bind operations.
int X400MsgAddStrParam(struct X400Message *mp, int paramtype, const char *value, size_t length)
Add string-valued parameter to the message.
int X400MsgAddIntParam(struct X400Message *mp, int paramtype, int value)
Add integer-valued parameter to the message.
int X400msRecipAddIntParam(struct X400Recipient *rp, int paramtype, int value)
Add integer-valued parameter to the message.
#define X400_N_STRICT_P7_1988
int X400RecipAddStrParam(struct X400Recipient *rp, int paramtype, const char *value, size_t length)
Add string-valued parameter to the recipient.
#define X400_S_GRAPHIC_CHARSETS
#define X400_E_RECIPIENT_ERROR
const char * X400msError(int error)
Obtain a string describing the meaning of the given error code.
int X400msMsgNew(struct X400msSession *sp, int type, struct X400msMessage **mpp)
Creates new message.
int X400msClose(struct X400msSession *sp)
Close a X400 Session.
int X400MsgAddAttachment(struct X400Message *mp, int type, const char *string, size_t length)
Add an attachment to the message.
#define X400_N_NOTIFICATION_REQUEST
int X400msMsgAddAttachment(struct X400msMessage *mp, int type, const char *string, size_t length)
Add attachment to the message.
int X400msRecipGet(struct X400msMessage *mp, int type, int number, struct X400Recipient **rpp)
Get recipient object from message.
int X400msRecipAddStrParam(struct X400Recipient *rp, int paramtype, const char *value, size_t length)
Add string-valued parameter to the message.
#define X400_S_MESSAGE_SUBMISSION_TIME
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 X400RecipNew(int type, struct X400Recipient **rpp)
Create a new recipient object.
#define X400_N_NUM_ATTACHMENTS
#define X400_S_OR_ADDRESS
#define X400_N_ERROR_DUPLICATE_ATTRIBUTE
#define X400_S_MESSAGE_IDENTIFIER
int X400msMsgGetStrParam(struct X400msMessage *mp, int paramtype, char *buffer, size_t buflen, size_t *paramlenp)
Return a string-valued parameter from the message object.
#define X400_RECIP_STANDARD
int X400MsgAddRecip(struct X400Message *mp, int reciptype, struct X400Recipient *recip)
Add a recipient object to the message.
int X400msMsgFromRaw(struct X400msSession *sp, char *buffer, size_t buflen, struct X400msMessage **mpp, int *typep)
Reconstruct a message from a binary representation.
#define X400_S_SECURITY_LABEL
#define X400_N_REPORT_REQUEST
#define X400_RECIP_INVALID
int X400msMsgSend(struct X400msMessage *mp)
Send message object.
int X400msRecipGetStrParam(struct X400Recipient *rp, int paramtype, char *buffer, size_t buflen, size_t *paramlenp)
Return a string-valued parameter from the recipient object.
X400 MA/MS (P3/P7) Interface.
int X400msMsgGetRaw(struct X400msSession *sp, struct X400msMessage *mp, char *buffer, size_t buflen, size_t *buflenp)
Get a binary representation of a message which can be subsequently be used to reconstruct the message...
int X400msRecipNew(struct X400msMessage *mp, int type, struct X400Recipient **rpp)
Add new recipient to a message.
#define X400_N_USE_EXTENDED_SUBJECT
int X400msSetIntDefault(struct X400msSession *sp, int paramtype, int value)
Set a default integer parameter value in a session.
#define X400_N_MMTS_PRIORITY_QUALIFIER
#define X400_N_CONTENT_RETURN_REQUEST
int X400msMsgAddIntParam(struct X400msMessage *mp, int paramtype, int value)
Add integer-valued parameter to the message.
int X400msMsgDelete(struct X400msMessage *mp, int retain)
Delete message object.
#define X400_S_MESSAGE_DELIVERY_TIME