x400_mssend.c
1/*
2 * Copyright (c) 2003-2013, Isode Limited, London, England.
3 * All rights reserved.
4 *
5 * Acquisition and use of this software and related materials for any
6 * purpose requires a written licence agreement from Isode Limited,
7 * or a written licence from an organisation licenced by Isode Limited
8 * to grant such a licence.
9 */
10
11/*
12 * @VERSION@
13 * Simple example program for submitting a message via a message store.
14 */
15
16#include <stdio.h>
17#include <stdlib.h>
18#include <string.h>
19#include <sys/stat.h>
20#include <sys/types.h>
21#ifndef _WIN32
22#include <unistd.h>
23#endif
24#include <fcntl.h>
25#include <errno.h>
26
27#include <x400_msapi.h>
28#include <seclabel_api.h> /* For security labels */
29#include "example.h"
30#include "ms_example.h"
31#include "time.h"
32
33
34static char *optstr = "u371m:d:p:w:M:D:P:W:o:O:r:l:R:y:C:iaqsAvf:kK:B:";
35
36/* These are the data items used to construct the message for submission */
37static char *default_recip = "/CN=P7User1/O=attlee/PRMD=TestPRMD/ADMD=TestADMD/C=GB/";
38char *recip;
39static const char text[] = "First line\r\nSecond line\r\n";
40static char *binary_data;
41
42static char *fwd_subject = "Forwarded message subject";
43
44static int add_binary_attachment (
45 struct X400msMessage *mp,
46 char * filename_to_send
47);
48static int add_fwd_bp (
49 struct X400msMessage *mp,
50 char *recip_orn,
51 char *recip_dn
52) ;
53static int add_ftbp(
54 struct X400msMessage *mp
55);
56static void usage(void) ;
57
58
59int main (
60 int argc,
61 char **argv
62)
63{
64 char buffer[BUFSIZ];
65 char pa[BUFSIZ];
66 char orn[BUFSIZ];
67 char tmp[BUFSIZ];
68 int status;
69 struct X400msSession *sp;
70 struct X400msMessage *mp;
71 struct X400Recipient *rp;
72 int contype;
73 char *def_oraddr;
74 char *def_dn;
75 char *def_pa;
76
77 if (get_args(argc, argv, optstr)) {
78 usage();
79 exit(-1);
80 }
81
82 printf("Connection type (0 = P7, 1 = P3 submit only, 2 = P3 both directions) [%d]: ", x400_contype);
83 contype = ic_fgetc(x400_contype, stdin);
84 if (contype != 10)
85 ic_fgetc(x400_contype, stdin);
86
87 if ( contype < '0' || '2' < contype )
88 contype = x400_contype;
89 else
90 contype -= '0';
91
92 if (contype == 0) {
93 def_oraddr = x400_ms_user_addr;
94 def_dn = x400_ms_user_dn;
95 def_pa = x400_ms_presentation_address;
96 } else {
97 def_oraddr = x400_mta_user_addr;
98 def_dn = x400_mta_user_dn;
99 def_pa = x400_mta_presentation_address;
100 }
101
102 printf("Your ORAddress [%s] > ", def_oraddr);
103 ic_fgets (orn, sizeof orn, stdin);
104
105 if ( (strlen(orn) > 0) && (orn[strlen(orn)-1] == '\n') )
106 orn[strlen(orn)-1] = '\0';
107
108 if (orn[0] == '\0')
109 strcpy(orn, def_oraddr);
110
111 /* Prompt for password; note: reflected. */
112 printf ("Password [%s]: ",
113 contype == 0 ? x400_p7_password : x400_p3_password);
114 if ( ic_fgets (buffer, sizeof buffer, stdin) == NULL )
115 exit (1);
116
117 if ((strlen(buffer) > 0) && (buffer[strlen(buffer)-1] == '\n') )
118 buffer[strlen(buffer)-1] = '\0';
119 if (buffer[0] == '\0')
120 strcpy(buffer, contype == 0 ? x400_p7_password : x400_p3_password);
121
122 /* Presentation Address */
123 printf("Presentation Address [%s] > ", def_pa);
124 ic_fgets (pa, sizeof pa, stdin);
125
126 if ( (strlen(pa) > 0) && (pa[strlen(pa)-1] == '\n'))
127 pa[strlen(pa)-1] = '\0';
128
129 if (pa[0] == '\0')
130 strcpy(pa, def_pa);
131
132 if (talking_to_marben_ms)
134
135 /* we've got what we need - now open an API session */
136 status = X400msOpen (contype, orn, def_dn, buffer, pa, NULL, &sp);
137 if ( status != X400_E_NOERROR ) {
138 fprintf (stderr, "Error in Open: %s\n", X400msError (status));
139 exit (status);
140 }
141
142 if (talking_to_marben_ms)
144
145 /* setup logging */
147
148 /* Turn on generation of extended-subject heading extension */
150
151 /* Turn on error on duplicate string attribute setting */
153
154 /* Configure the character sets to be used for Teletex syntax fields
155 (X400_S_FREE_FORM_NAME, X400_T_TELETEX, X400_S_SUBJECT). If not
156 explicitly configured, the default set of 102, 103, 106, 107
157 will be assumed. The string below adds Cyrillic (8859-5) into the list. */
158 X400msSetStrDefault(sp, X400_S_TELETEX_CHARSETS, "102 103 106 107 144", -1);
159
160 /* Configure the character sets to be used for Graphic string syntax fields
161 (X400_S_FTBP_APPLICATION_REFERENCE_STR, X400_S_FTBP_CONTENT_DESCRIPTION,
162 X400_S_FTBP_FILENAME). If not explicitly configured, a default of
163 character set 6 (US-ASCII) will be assumed.
164 The string below adds Cyrillic (8859-5) into the list. */
166
167 if (x400_default_recipient != NULL)
168 recip = x400_default_recipient;
169 else
170 recip = default_recip;
171
172 printf("Message recipient [%s]: ", recip);
173 ic_fgets (tmp, sizeof tmp, stdin);
174
175 if ( (strlen(tmp) > 0) && (tmp[strlen(tmp)-1] == '\n') )
176 tmp[strlen(tmp)-1] = '\0';
177 if (strlen(tmp) != 0)
178 recip = strdup(tmp);
179
180 printf("Subject [%s]: ", subject);
181 ic_fgets (tmp, sizeof tmp, stdin);
182
183 if ( (strlen(tmp) > 0) && (tmp[strlen(tmp)-1] == '\n') )
184 tmp[strlen(tmp)-1] = '\0';
185 if (strlen(tmp) != 0)
186 subject = strdup(tmp);
187
188 status = X400msMsgNew (sp, X400_MSG_MESSAGE, &mp);
189 if ( status != X400_E_NOERROR ) {
190 fprintf (stderr, "x400msMsgNew returned error: %s\n", X400msError (status));
191 exit (status);
192 }
193
194 status = X400msRecipNew (mp, X400_RECIP_STANDARD, &rp);
195 if ( status != X400_E_NOERROR ) {
196 fprintf (stderr, "x400msRecipNew returned error: %s\n", X400msError (status));
197 exit (status);
198 }
199
200 status = X400msRecipAddStrParam (rp, X400_S_OR_ADDRESS, recip, -1);
201 if ( status != X400_E_NOERROR ) {
202 fprintf (stderr, "x400msRecipAddStrParam returned error: %s\n", X400msError (status));
203 exit (status);
204 }
205
206 status = X400msRecipAddStrParam (rp, X400_S_DIRECTORY_NAME, "CN=recipient;c=gb", -1);
207 if ( status != X400_E_NOERROR ) {
208 fprintf (stderr, "x400msRecipAddStrParam returned error: %s\n", X400msError (status));
209 exit (status);
210 }
211
212 status = X400msMsgAddStrParam (mp, X400_S_OR_ADDRESS, orn, -1);
213 if ( status != X400_E_NOERROR ) {
214 fprintf (stderr, "x400msMsgAddStrParam returned error: %s\n", X400msError (status));
215 exit (status);
216 }
217
218 status = X400msMsgAddStrParam (mp, X400_S_DIRECTORY_NAME, "CN=originator;c=gb", -1);
219 if ( status != X400_E_NOERROR ) {
220 fprintf (stderr, "x400msMsgAddStrParam returned error: %s\n", X400msError (status));
221 exit (status);
222 }
223
224 /* Ask for delivery reports */
225 printf("delivery report request %d ( 1 - No, 2 - Yes)\n", x400_dr_req);
226 status = X400msRecipAddIntParam (rp, X400_N_REPORT_REQUEST, x400_dr_req);
227 if ( status != X400_E_NOERROR ) {
228 fprintf (stderr, "x400msRecipAddStrParam returned error: %s\n", X400msError (status));
229 exit (status);
230 }
231
232 /* Ask for read receipts */
233 printf("read notification request %d ( 1 - RN, 2 - NRN, 4 - return of IPM with NRN )\n", x400_rn_req);
234 status = X400msRecipAddIntParam (rp, X400_N_NOTIFICATION_REQUEST, x400_rn_req);
235 if ( status != X400_E_NOERROR ) {
236 fprintf (stderr, "x400msRecipAddIntParam returned error: %s\n", X400msError (status));
237 exit (status);
238 }
239
240 if (1) {
241 char *contid = "ContID00001";
242
243 /* Content identifier so we can correlate with submission result */
244 status = X400msMsgAddStrParam(mp, X400_S_CONTENT_IDENTIFIER, contid, -1);
245 if ( status != X400_E_NOERROR ) {
246 fprintf (stderr, "X400msMsgAddIntParam %d returned error: %s\n",
248 exit (status);
249 }
250 }
251
252 /* content return request on report - 0 = no */
254 if ( status != X400_E_NOERROR ) {
255 fprintf (stderr, "X400msMsgAddIntParam %d returned error: %s\n",
257 exit (status);
258 }
259
260 /* Priority: 0 - normal, 1 - non-urgent, 2 - urgent */
261 printf("message priority is %d ( 0 - normal, 1 - non-urgent, 2 - urgent)\n",
262 x400_default_priority);
263 status = X400msMsgAddIntParam (mp, X400_N_PRIORITY, x400_default_priority);
264 if ( status != X400_E_NOERROR ) return (status);
265
266 /* Priority: 0 - normal, 1 - non-urgent, 2 - urgent */
267 printf("military message priority is %d ( 0 - low, 1 - high)\n",
268 x400_default_priority);
270 if ( status != X400_E_NOERROR ) return (status);
271
272 /* subject */
273 {
274 time_t t;
275 time(&t);
276 char tmp_buffer[255];
277 // NB strip newline from ctime result
278 snprintf(tmp_buffer, 244, "%s '%s' '%.19s'",
279 subject, get_x400_pty_str_from_4406(x400_default_priority), ctime(&t));
280 printf("Subject is '%s'\n", tmp_buffer);
281 status = X400msMsgAddStrParam (mp, X400_S_SUBJECT, tmp_buffer, -1);
282 if ( status != X400_E_NOERROR ) {
283 fprintf (stderr, "x400msMsgAddStrParam returned error: %s\n",
284 X400msError (status));
285 exit (status);
286 }
287 }
288
289 status = add_sec_label (mp);
290 if ( status != X400_E_NOERROR ) {
291 fprintf (stderr, "Failed to add Security Label: %s\n",
292 X400msError (status));
293 return (status);
294 } else {
295 fprintf (stderr, "added Security Label\n");
296 }
297
298 /* content type */
299 status = X400msMsgAddStrParam (mp, X400_S_EXTERNAL_CONTENT_TYPE, "1.3.26.0.4406.0.4.1", -1);
300 if ( status != X400_E_NOERROR ) {
301 fprintf (stderr, "x400msMsgAddStrParam returned error: %s\n", X400msError (status));
302 exit (status);
303 }
304 /* 8859-1 attachment */
305 status = X400msMsgAddStrParam (mp, X400_T_ISO8859_1, text, -1);
306 if ( status != X400_E_NOERROR ) {
307 fprintf (stderr, "x400ms returned error: %s\n", X400msError (status));
308 exit (status);
309 }
310
311 /* now an IA5 body part using the bodypart func */
312 status = X400msMsgAddAttachment (mp, X400_T_IA5TEXT, text, strlen(text));
313 if ( status != X400_E_NOERROR ) {
314 printf("failed to add X400_T_IA5TEXT BP\n");
315 return (status);
316 }
317
318 /* or a Binary body part using the bodypart func */
319 if (filename_to_send != NULL) {
320 status = add_binary_attachment (mp, filename_to_send);
321 if ( status != X400_E_NOERROR ) {
322 printf("failed to add X400_T_BINARY BP\n");
323 return (status);
324 }
325 status = add_fwd_bp (mp, orn, def_dn);
326 if ( status != X400_E_NOERROR ) {
327 printf("failed to add forwarded BP\n");
328 return (status);
329 }
330 } else {
331 printf("no binary file set - not sending X400_T_BINARY\n");
332 printf("no binary file set - not sending forwarded BP\n");
333 }
334
335 /* File Transfer Body Part using the bodypart func */
336 status = add_ftbp(mp);
337 if ( status != X400_E_NOERROR ) {
338 printf("failed to add X400_T_BINARY BP\n");
339 return (status);
340 }
341
342
343#ifdef USE_SEC_LABEL
344 {
345#define XML_BUFSIZE 1024
346#define STRING_BUFSIZE 1024
347
348 const char* xml_filename = "seclabel.xml";
349 char xml_content[XML_BUFSIZE];
350 char str_content[STRING_BUFSIZE];
351 int str_len = STRING_BUFSIZE;
352 FILE *fd = NULL;
353
354 /* Read in the security label XML file */
355 fd = fopen(xml_filename,"r");
356 if(fd == NULL) {
357 fprintf(stderr,"Failed to open %s : %s\n",
358 xml_filename,strerror(errno));
359 }
360
361 fread(&xml_content,XML_BUFSIZE,1,fd);
362
363 fclose(fd);
364
365 status = SecLabelInit("Example program");
366 if (status != SECLABEL_E_NOERROR) {
367 fprintf(stderr, "SecLabelInit returned error %d\n", status);
368 exit(1);
369 }
370
371 /* Use SecLabelParse to turn the XML into an octet string */
372 status = SecLabelParse(xml_content,
373 str_content,
374 STRING_BUFSIZE,
375 &str_len);
376
377 if (status != SECLABEL_E_NOERROR) {
378 fprintf(stderr, "SecLabelParse returned error %d\n", status);
379 exit(1);
380 }
381
382 /* Add the octet string to the message pointer */
384 str_content,str_len);
385 if ( status != X400_E_NOERROR ) {
386 fprintf (stderr, "x400msMsgAddStrParam returned error: %s\n", X400msError (status));
387 exit (status);
388 }
389
390 }
391#endif
392
393 status = X400msMsgSend (mp);
394 if ( status != X400_E_NOERROR ) {
395 fprintf (stderr, "x400msMsgSend returned error: %s\n", X400msError (status));
396
397 if (status == X400_E_RECIPIENT_ERROR) {
398 int n = 1;
399 struct X400Recipient *irp;
400 int ss = X400_E_NOERROR;
401
402 while (ss == X400_E_NOERROR) {
403 ss = X400msRecipGet(mp, X400_RECIP_INVALID, n, &irp);
404 if (ss == X400_E_NOERROR) {
405 char buf[1024];
406 size_t retlen;
407 int s;
408
409 fprintf(stderr, "A recipient with ");
410
411 s = X400msRecipGetStrParam(irp, X400_S_OR_ADDRESS, buf, 1024, &retlen);
412 if (s == X400_E_NOERROR) {
413 buf[retlen] = '\0';
414 fprintf (stderr, "ORAddress %s ", buf);
415 }
416
417 s = X400msRecipGetStrParam(irp, X400_S_DIRECTORY_NAME, buf, 1024, &retlen);
418 if (s == X400_E_NOERROR) {
419 buf[retlen] = '\0';
420 fprintf (stderr, " and DN %s", buf);
421 }
422 fprintf (stderr, " was rejected\n");
423 n++;
424 }
425 }
426 }
427
428 } else {
429 char buf[1024];
430 size_t retlen;
431 char *databuf = buf;
432
433 printf("Message submitted successfully\n");
434
435 status = X400msMsgGetStrParam(mp, X400_S_MESSAGE_IDENTIFIER, buf, 1024, &retlen);
436 if (status != X400_E_NOERROR) {
437 fprintf(stderr, "No MessageId present from submission result: error %d\n", status);
438 } else {
439 buf [retlen] = '\0';
440 printf("MessageId from Submission Result = %s\n", buf);
441 }
442
443 status = X400msMsgGetStrParam(mp, X400_S_MESSAGE_SUBMISSION_TIME, buf, 1024, &retlen);
444 if (status != X400_E_NOERROR) {
445 fprintf(stderr, "No MessageSubmissionTime present from submission result: error %d\n", status);
446 } else {
447 buf [retlen] = '\0';
448 printf("MessageSubmissionTime from Submission Result = %s\n", buf);
449 }
450
451 status = X400msMsgGetStrParam(mp, X400_S_CONTENT_IDENTIFIER, buf, 1024, &retlen);
452 if (status != X400_E_NOERROR) {
453 fprintf(stderr, "No ContentIdentifier present from submission result: error %d\n", status);
454 } else {
455 buf [retlen] = '\0';
456 printf("ContentIdentifier from Submission Result = %s\n", buf);
457 }
458
459 /* Get binary representation and store to file */
460
461 /* First pass to find out how big it needs to be */
462 status = X400msMsgGetRaw(sp, mp, databuf, 0, &retlen);
463 if (status != X400_E_NOSPACE) {
464 fprintf(stderr, "Failed to get raw message length: error %d\n", status);
465 } else {
466 struct X400msMessage *newmsg;
467 int newtype;
468
469 databuf = (char *)malloc(retlen);
470 printf("Data buffer length required = %d\n", (int)retlen);
471 status = X400msMsgGetRaw(sp, mp, databuf, retlen, &retlen);
472 if (status != X400_E_NOERROR) {
473 fprintf(stderr, "Failed to get raw message: error %d\n", status);
474 } else {
475 /* Dump to file */
476 FILE *fd = fopen("message.dump", "w");
477 if (fd == NULL) {
478 fprintf(stderr, "Failed to open file message.dump\n");
479 } else {
480 if (fwrite(databuf, 1, retlen, fd) < retlen) {
481 fprintf(stderr, "Failed to write message to file message.dump\n");
482 } else {
483 fprintf(stdout, "Dumped message to file message.dump\n");
484 }
485 fclose(fd);
486 }
487 }
488
489 /* And try to reconstruct message from bytes */
490 status = X400msMsgFromRaw(sp, databuf, retlen, &newmsg, &newtype);
491 if (status != X400_E_NOERROR) {
492 fprintf(stderr, "Failed to create message from bytes: error %d\n", status);
493 }
494
495 free(databuf);
496 }
497 }
498
499 status = X400msMsgDelete (mp, 0);
500 if ( status != X400_E_NOERROR ) {
501 fprintf (stderr, "x400msMsgDelete returned error: %s\n", X400msError (status));
502 exit (status);
503 }
504
505 mp = NULL;
506 rp = NULL;
507
508 status = X400msClose (sp);
509 exit (status);
510 /* NOTREACHED */
511}
512
513static int add_binary_attachment (
514 struct X400msMessage *mp,
515 char * filename
516)
517{
518 int fd;
519 int file_size;
520 struct stat buf;
521 int fs=0;
522 int status;
523
524 printf("sending file %s\n", filename);
525 if ((fd = open (filename_to_send, O_RDONLY)) == -1) {
526 printf("Failed to open content file %s: ", filename);
527 return X400_E_BADPARAM;
528 }
529
530
531 if (fstat(fd, &buf) != 0) {
532 close(fd);
533 printf("Can't fstat file %s %d", filename, errno);
534 return X400_E_BADPARAM;
535 }
536
537 file_size = buf.st_size;
538 printf("Content file size = %d\n", file_size);
539
540 binary_data = (char *) malloc(file_size);
541 if ( binary_data == NULL )
542 return X400_E_NOMEMORY;
543
544 if ((fs = read(fd, binary_data, file_size) ) == -1) {
545 printf("Cannot read from binary file %d\n", errno);
546 return (X400_E_SYSERROR);
547 }
548 close(fd);
549
550 status = X400msMsgAddAttachment (mp, X400_T_BINARY, binary_data, fs);
551 if ( status != X400_E_NOERROR ) {
552 printf("failed to add X400_T_BINARY BP\n");
553 return (status);
554 }
555 return (status);
556}
557
558static int add_fwd_bp (
559 struct X400msMessage *mp,
560 char *orig_orn,
561 char *orig_dn
562)
563{
564 struct X400Message *x400_mp;
565 struct X400Recipient *rp;
566 int status;
567 int num_atts = 0;
568
569 printf("sending fwd bp \n");
570
571 status = X400MsgNew (X400_MSG_MESSAGE, &x400_mp);
572 if ( status != X400_E_NOERROR ) {
573 fprintf (stderr, "x400MsgNew returned error: %s\n", X400msError (status));
574 exit (status);
575 }
576
578 "090909090909Z", (size_t)-1);
579 if ( status != X400_E_NOERROR ) {
580 fprintf (stderr, "x400MsgAddStrParam returned error: %s\n", X400msError (status));
581 exit (status);
582 }
583
585 "090909090909Z", (size_t)-1);
586 if ( status != X400_E_NOERROR ) {
587 fprintf (stderr, "x400MsgAddStrParam returned error: %s\n", X400msError (status));
588 exit (status);
589 }
590
591 /* envelope originator OR address */
592 status = X400MsgAddStrParam (x400_mp, X400_S_OR_ADDRESS, orig_orn, (size_t)-1);
593 if ( status != X400_E_NOERROR ) {
594 fprintf (stderr, "x400MsgAddStrParam returned error: %s\n", X400msError (status));
595 exit (status);
596 }
597 status = X400MsgAddStrParam (x400_mp, X400_S_DIRECTORY_NAME, orig_dn, (size_t)-1);
598 if ( status != X400_E_NOERROR ) {
599 fprintf (stderr, "x400MsgAddStrParam returned error: %s\n", X400msError (status));
600 exit (status);
601 }
602
603 /* add originator into headers */
604 status = X400RecipNew (X400_ORIGINATOR, &rp);
605 if ( status != X400_E_NOERROR ) {
606 fprintf (stderr, "x400RecipNew returned error: %s\n", X400msError (status));
607 exit (status);
608 }
609
610 /* put in OR Address part of OR Name */
611 status = X400RecipAddStrParam (rp, X400_S_OR_ADDRESS, recip, -1);
612 if ( status != X400_E_NOERROR ) {
613 fprintf (stderr, "x400RecipAddStrParam returned error: %s\n", X400msError (status));
614 exit (status);
615 }
616
617 /* put in DN part of OR Name */
618 status = X400RecipAddStrParam (rp, X400_S_DIRECTORY_NAME, orig_dn, -1);
619 if ( status != X400_E_NOERROR ) {
620 fprintf (stderr, "x400msRecipAddStrParam returned error: %s\n", X400msError (status));
621 exit (status);
622 }
623
624 /* put originator into message */
625 status = X400MsgAddRecip (x400_mp, X400_ORIGINATOR, rp);
626 if ( status != X400_E_NOERROR ) {
627 fprintf (stderr, "X400MsgAddRecip returned error: %s\n", X400msError (status));
628 exit (status);
629 }
630 printf("Put %s in as originator\n", orig_orn);
631
632 /* add a recipient */
633 status = X400RecipNew (X400_RECIP_STANDARD, &rp);
634 if ( status != X400_E_NOERROR ) {
635 fprintf (stderr, "x400RecipNew returned error: %s\n", X400msError (status));
636 exit (status);
637 }
638
639 status = X400RecipAddStrParam (rp, X400_S_OR_ADDRESS, recip, -1);
640 if ( status != X400_E_NOERROR ) {
641 fprintf (stderr, "x400RecipAddStrParam returned error: %s\n", X400msError (status));
642 exit (status);
643 }
644
645 status = X400RecipAddStrParam (rp, X400_S_DIRECTORY_NAME, "CN=recipient;c=gb", -1);
646 if ( status != X400_E_NOERROR ) {
647 fprintf (stderr, "x400msRecipAddStrParam returned error: %s\n", X400msError (status));
648 exit (status);
649 }
650
651 status = X400MsgAddRecip (x400_mp, X400_RECIP_STANDARD, rp);
652 if ( status != X400_E_NOERROR ) {
653 fprintf (stderr, "X400MsgAddRecip returned error: %s\n", X400msError (status));
654 exit (status);
655 }
656 printf("Put %s in as reipient\n", recip);
657
658
659 /* Add 2nd recipient */
660 status = X400RecipNew (X400_RECIP_STANDARD, &rp);
661 if ( status != X400_E_NOERROR ) {
662 fprintf (stderr, "x400RecipNew returned error: %s\n", X400msError (status));
663 exit (status);
664 }
665
666 status = X400RecipAddStrParam (rp, X400_S_OR_ADDRESS, recip, -1);
667 if ( status != X400_E_NOERROR ) {
668 fprintf (stderr, "x400RecipAddStrParam returned error: %s\n", X400msError (status));
669 exit (status);
670 }
671
672 status = X400RecipAddStrParam (rp, X400_S_DIRECTORY_NAME, "CN=second recipient;c=gb", -1);
673 if ( status != X400_E_NOERROR ) {
674 fprintf (stderr, "x400msRecipAddStrParam returned error: %s\n", X400msError (status));
675 exit (status);
676 }
677
678
679 /* put recipient into message */
680 status = X400MsgAddRecip (x400_mp, X400_RECIP_STANDARD, rp);
681 if ( status != X400_E_NOERROR ) {
682 fprintf (stderr, "X400MsgAddRecip returned error: %s\n", X400msError (status));
683 exit (status);
684 }
685 printf("Put %s in as reipient\n", recip);
686
687
688 /* envelope */
689
690 /* Priority: 0 - normal, 1 - non-urgent, 2 - urgent */
691 printf("message priority is %d ( 0 - normal, 1 - non-urgent, 2 - urgent)\n",
692 x400_default_priority);
693 status = X400MsgAddIntParam (x400_mp, X400_N_PRIORITY, x400_default_priority);
694 if ( status != X400_E_NOERROR ) return (status);
695
696 /* Priority: 0 - normal, 1 - non-urgent, 2 - urgent */
697 printf("military message priority is %d ( 0 - low, 1 - high)\n",
698 x400_default_priority);
700 if ( status != X400_E_NOERROR ) return (status);
701
702 /* content */
703 /* subject */
704 status = X400MsgAddStrParam (x400_mp, X400_S_SUBJECT, fwd_subject, (size_t)-1);
705 if ( status != X400_E_NOERROR ) {
706 fprintf (stderr, "x400msMsgAddStrParam returned error: %s\n", X400msError (status));
707 exit (status);
708 }
709
710 /* now an IA5 body part using the bodypart func */
711 status = X400MsgAddAttachment (x400_mp, X400_T_IA5TEXT, text, strlen(text));
712 if ( status != X400_E_NOERROR ) {
713 printf("failed to add X400_T_IA5TEXT BP\n");
714 return (status);
715 }
716 num_atts++;
717
718 /* 8859-1 attachment */
719 status = X400MsgAddStrParam (x400_mp, X400_T_ISO8859_1, text, (size_t)-1);
720 if ( status != X400_E_NOERROR ) {
721 fprintf (stderr, "x400ms returned error: %s\n", X400msError (status));
722 exit (status);
723 }
724 num_atts++;
725
726 status = X400MsgAddIntParam (x400_mp, X400_N_NUM_ATTACHMENTS, num_atts);
727 if (status != X400_E_NOERROR )
728 return (status);
729
730 status = X400msMsgAddMessageBody (mp, x400_mp);
731 if (status != X400_E_NOERROR ) {
732 fprintf (stderr, "X400msMsgAddMessageBody returned error: %s\n", X400msError (status));
733 return (status);
734 }
735
736 return X400_E_NOERROR;
737}
738
739
740static int add_ftbp(
741 struct X400msMessage *mp
742)
743{
744 FILE *fp = NULL;
745 int fs=0;
746 char *binary_data;
747 int status;
748 struct X400Bodypart *bp;
749
750 /* Add FTBP using the bodypart func */
751 if (filename_to_send == NULL) {
752 printf("no file set - not sending X400_T_FTBP\n");
753 return X400_E_NOERROR;
754 }
755 fp = fopen(filename_to_send, "rb");
756 if (fp == (FILE *)NULL) {
757 printf("Cannot open binary file\n");
758 return (X400_E_SYSERROR);
759 }
760 binary_data = (char *) malloc(bin_bp_size);
761 if ( binary_data == NULL )
762 return X400_E_NOMEMORY;
763 if ((fs = fread (binary_data, sizeof(char),
764 bin_bp_size/sizeof(char), fp) ) == -1) {
765 printf("Cannot read from binary file\n");
766 free (binary_data);
767 fclose(fp);
768 return (X400_E_SYSERROR);
769 }
770 fclose(fp);
771 if (fs < bin_bp_size) {
772 printf("Cannot read %d bytes from binary file (got %d)\n",
773 bin_bp_size, fs);
774 free (binary_data);
775 return (X400_E_SYSERROR);
776 }
777
779 X400BodypartAddStrParam(bp, X400_S_BODY_DATA, binary_data, fs);
781 "Test FTBP File", -1);
782 /* NB this value should have the filename, but not the full path */
783 /* And on Windows backslashes must be escaped with a second backslash */
784 X400BodypartAddStrParam(bp, X400_S_FTBP_FILENAME, filename_to_send, -1);
786 "20230801060101.0Z", -1);
788 "20230801060202.0Z", -1);
790 status = X400msMsgAddBodypart(mp, bp);
791 free (binary_data);
792
793 if ( status != X400_E_NOERROR ) {
794 printf("failed to add X400_T_FTBP BP\n");
795 return (status);
796 }
797 printf("Sent %d bytes as X400_T_FTBP BP\n", fs);
798 return X400_E_NOERROR;
799}
800
801static void usage(void) {
802 printf("usage: %s\n", optstr);
803 printf("\t where:\n");
804 printf("\t -u : Don't prompt to override defaults \n");
805 printf("\t -3 : Use P3 connection \n");
806 printf("\t -7 : Use P7 connection \n");
807 printf("\t -1 : Use Marben-compatibility mode for P7 connection \n");
808 printf("\t -m : OR Address in P7 bind arg \n");
809 printf("\t -d : DN in P7 bind arg \n");
810 printf("\t -p : Presentation Address of P7 Store \n");
811 printf("\t -w : P7 password of P7 user \n");
812 printf("\t -M : OR Address in P3 bind arg \n");
813 printf("\t -D : DN in P3 bind arg \n");
814 printf("\t -P : Presentation Address of P3 server\n");
815 printf("\t -W : P3 password of P3 user \n");
816 printf("\t -o : Originator \n");
817 printf("\t -O : Originator Return Address \n");
818 printf("\t -r : Recipient\n");
819 printf("\t -l : Logline\n");
820 printf("\t -R : Report setting: 0=none, 1=-ve, 2=+ve\n");
821 printf("\t -y : Military Priority \n");
822 printf("\t\t 0 - deferred, 1 - routine, 2 - priority \n");
823 printf("\t\t 3 - immediate, 4 - flash, 5 - override \n");
824 printf("\t -C : Content Type (2/22/772/OID) \n");
825 printf("\t -i : Implicit conversion prohibited = TRUE \n");
826 printf("\t -a : Alternate Recipient Prohibited = TRUE \n");
827 printf("\t -q : Content Return Request = TRUE \n");
828 printf("\t -s : Disclosure of Recipient = FALSE \n");
829 printf("\t -A : Recipient Reassignment Prohibited = FALSE \n");
830 printf("\t -v : Conversion with Loss Prohibited = FALSE \n");
831 printf("\t -f : Filename to transfer as binary bp\n");
832 printf("\t -k : Request Delivery Report\n");
833 printf("\t -K : Request Read Notification ( 1 - RN, 2 - NRN, 4 - return of IPM with NRN )\n");
834 printf("\t -B : Set alternative subject line \n");
835 return;
836}
int X400RecipNew(int type, struct X400Recipient **rpp)
Create a new recipient object.
int X400MsgAddRecip(struct X400Message *mp, int reciptype, struct X400Recipient *recip)
Add a recipient object to the message.
int X400RecipAddStrParam(struct X400Recipient *rp, int paramtype, const char *value, size_t length)
Add string-valued parameter to the recipient.
int X400MsgAddIntParam(struct X400Message *mp, int paramtype, int value)
Add integer-valued parameter to the message.
int X400BodypartAddStrParam(struct X400Bodypart *bp, int paramtype, const char *value, size_t length)
Add string-valued parameter to the body part.
int X400BodypartAddIntParam(struct X400Bodypart *bp, int paramtype, int value)
Add integer-valued parameter to the body part.
int X400MsgNew(int type, struct X400Message **mpp)
Creates new message.
int X400MsgAddAttachment(struct X400Message *mp, int type, const char *string, size_t length)
Add an attachment to the message.
int X400MsgAddStrParam(struct X400Message *mp, int paramtype, const char *value, size_t length)
Add string-valued parameter to the message.
int X400BodypartNew(int type, struct X400Bodypart **bpp)
Create a new body part object.
int X400msMsgAddStrParam(struct X400msMessage *mp, int paramtype, const char *value, size_t length)
Add string-valued parameter 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.
int X400msMsgAddBodypart(struct X400msMessage *mp, struct X400Bodypart *bp)
int X400msRecipGet(struct X400msMessage *mp, int type, int number, struct X400Recipient **rpp)
Get recipient object from message.
int X400msRecipAddIntParam(struct X400Recipient *rp, int paramtype, int value)
Add integer-valued parameter to the message.
int X400msMsgAddIntParam(struct X400msMessage *mp, int paramtype, int value)
Add integer-valued parameter to the 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 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 X400msRecipGetStrParam(struct X400Recipient *rp, int paramtype, char *buffer, size_t buflen, size_t *paramlenp)
Return a string-valued parameter from the recipient object.
int X400msRecipNew(struct X400msMessage *mp, int type, struct X400Recipient **rpp)
Add new recipient to a message.
const char * X400msError(int error)
Obtain a string describing the meaning of the given error code.
int X400msRecipAddStrParam(struct X400Recipient *rp, int paramtype, const char *value, size_t length)
Add string-valued parameter to the message.
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 X400msMsgAddMessageBody(struct X400msMessage *mp, struct X400Message *mbp)
int X400msMsgDelete(struct X400msMessage *mp, int retain)
Delete message object.
int X400msMsgAddAttachment(struct X400msMessage *mp, int type, const char *string, size_t length)
Add attachment to the message.
void X400msSetConfigRequest(int val)
Disable and enable configuration requests in MS Bind operations.
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.
#define X400_S_DIRECTORY_NAME
Definition x400_att.h:397
#define X400_S_OR_ADDRESS
Definition x400_att.h:349
#define X400_N_FTBP_OBJECT_SIZE
Definition x400_att.h:1239
#define X400_S_FTBP_FILENAME
Definition x400_att.h:1227
#define X400_S_BODY_DATA
Definition x400_att.h:1194
#define X400_S_FTBP_MODIFICATION_DATE
Definition x400_att.h:1233
#define X400_S_FTBP_CREATION_DATE
Definition x400_att.h:1230
#define X400_S_FTBP_CONTENT_DESCRIPTION
Definition x400_att.h:1224
#define X400_S_SUBJECT
Definition x400_att.h:749
#define X400_T_BINARY
Definition x400_att.h:851
#define X400_T_IA5TEXT
Definition x400_att.h:825
#define X400_N_NUM_ATTACHMENTS
Definition x400_att.h:822
#define X400_T_ISO8859_1
Definition x400_att.h:835
#define X400_T_FTBP
Definition x400_att.h:860
#define X400_S_GRAPHIC_CHARSETS
Definition x400_att.h:1168
#define X400_S_TELETEX_CHARSETS
Definition x400_att.h:1175
#define X400_S_LOG_CONFIGURATION_FILE
Definition x400_att.h:1116
#define X400_N_PRIORITY
Definition x400_att.h:433
#define X400_S_MESSAGE_DELIVERY_TIME
Definition x400_att.h:451
#define X400_N_MMTS_PRIORITY_QUALIFIER
Definition x400_att.h:482
#define X400_S_CONTENT_IDENTIFIER
Definition x400_att.h:425
#define X400_N_CONTENT_RETURN_REQUEST
Definition x400_att.h:445
#define X400_S_MESSAGE_SUBMISSION_TIME
Definition x400_att.h:448
#define X400_S_EXTERNAL_CONTENT_TYPE
Definition x400_att.h:456
#define X400_S_MESSAGE_IDENTIFIER
Definition x400_att.h:416
#define X400_S_SECURITY_LABEL
Definition x400_att.h:1370
#define X400_E_BADPARAM
Definition x400_att.h:55
#define X400_E_SYSERROR
Definition x400_att.h:49
#define X400_E_RECIPIENT_ERROR
Definition x400_att.h:157
#define X400_E_NOMEMORY
Definition x400_att.h:52
#define X400_E_NOERROR
Definition x400_att.h:46
#define X400_E_NOSPACE
Definition x400_att.h:112
#define X400_N_ERROR_DUPLICATE_ATTRIBUTE
Definition x400_att.h:1306
#define X400_N_STRICT_P7_1988
Definition x400_att.h:1293
#define X400_N_USE_EXTENDED_SUBJECT
Definition x400_att.h:1299
#define X400_MSG_MESSAGE
Definition x400_att.h:29
#define X400_N_REPORT_REQUEST
Definition x400_att.h:680
#define X400_N_NOTIFICATION_REQUEST
Definition x400_att.h:702
#define X400_RECIP_STANDARD
Definition x400_att.h:341
#define X400_ORIGINATOR
Definition x400_att.h:305
#define X400_RECIP_INVALID
Definition x400_att.h:338
X400 MA/MS (P3/P7) Interface.

All rights reserved © 2002 - 2024 Isode Ltd.