x400_ms_common.c
1/* Copyright (c) 2014-2025, Isode Limited, London, England.
2 * All rights reserved.
3 *
4 * Acquisition and use of this software and related materials for any
5 * purpose requires a written licence agreement from Isode Limited,
6 * or a written licence from an organisation licenced by Isode Limited
7 * to grant such a licence.
8 *
9 */
10
11/*
12 *
13 * @VERSION@
14 *
15 * Set of MS functions to get and display attribute from MS messages
16 */
17
18#include <stdio.h>
19#include <x400_msapi.h>
20#include <amhs_att.h>
21#include <errno.h>
22#include <seclabel_api.h> /* For security labels */
23#include "example.h"
24
25#include "ms_example.h"
26
27static int get_bp(
28 struct X400msMessage *mp,
29 struct X400Bodypart **bp,
30 int att_num
31);
32
33static int get_msgbp(
34 struct X400msMessage *mp,
35 struct X400Message **x400_mp,
36 int att_num
37);
38
39static int do_xmsg_content_as_bp(
40 struct X400Message *x400_mp
41);
42
43static int do_xrep_content_as_bp(
44 struct X400Message *x400_mp
45);
46
47static int do_xrep_headers(
48 struct X400Message *x400_mp
49);
50
51static int do_xmsg_headers(
52 struct X400Message *x400_mp
53);
54
55static int do_redirection_hist (
56 struct X400Recipient *rp
57);
58
59
60int get_recips(
61 struct X400Message *x400_mp,
62 int type
63)
64{
65
66 struct X400Recipient *rp;
67 int status;
68 int recip_num;
69
70 for (recip_num = 1; ; recip_num++ ) {
71
72 char buf[INIT_BUFFER_SIZE];
73 int buflen = sizeof buf;
74 size_t ret_len;
75
76 status = X400MsgGetRecip(x400_mp, type, recip_num, &rp);
77 if (status == X400_E_NO_RECIP) {
78 if (recip_num == 1) {
79 printf("no recips of type %x\n", type);
80 return X400_E_NOERROR;
81 } else {
82 printf("no more recips of type %x\n", type);
83 }
84 return X400_E_NOERROR;
85 }
86 else if (status != X400_E_NOERROR) {
87 fprintf(stderr, "X400MsgGetRecip (%d) failed %s\n",
89 return status;
90 }
91 printf("got recip number %d of type %s (%x)\n", recip_num,
92 type == X400_RECIP_PRIMARY ? "Primary" :
93 type == X400_RECIP_CC ? "CC" :
94 type == X400_RECIP_BCC ? "BCC" :
95 type == X400_ORIGINATOR ? "Originator" :
96 type == X400_AUTH_ORIG ? "Auth Orig" :
97 type == X400_RECIP_REPLY ? "Reply" :
98 type == X400_RECIP_REPORT ? "Reported Recip" :
99 type == X400_RECIP_INTENDED ? "Intended" :
100 type == X400_RECIP_ENVELOPE ? "Envelope" :
101 "Unknown",
102 type);
103 if (type == X400_RECIP_ENVELOPE) {
104 // These aren't expected as the message will be forwarded
105 // message with no envelope
106 status = X400RecipGetStrParam(rp, X400_S_OR_ADDRESS, buf, buflen,
107 &ret_len);
108 if (status != X400_E_NOERROR) {
109 fprintf(stderr, "X400MsgGetStrParam (%d) failed %s\n",
111 } else {
112 printf("Originator OR Address'%.*s'\n", (int)ret_len, buf);
113 }
114 } else {
115 status = X400RecipGetStrParam(rp, X400_S_OR_ADDRESS, buf, buflen,
116 &ret_len);
117 if (status != X400_E_NOERROR) {
118 fprintf(stderr, "X400MsgGetStrParam (%d) failed %s\n",
120 } else {
121 printf("Originator OR Address'%.*s'\n", (int)ret_len, buf);
122 }
123
124 }
125
126#define USE_REDIRECTION_HISTORY 1
127#ifdef USE_REDIRECTION_HISTORY
128 {
129 status = do_redirection_hist(rp);
130 if ( status == X400_E_NO_VALUE ) {
131 /* do nothing */
132 } else if (status == X400_E_MISSING_ATTR ) {
133 printf("There is no Redirection History\n");
134 } else if (status == X400_E_NOERROR ) {
135 printf("Found some Redirection History\n");
136 } else {
137 printf("error getting Redirection History\n");
138 fprintf (stderr, "Error fetching Redirection History: %s\n",
139 X400msError (status));
140 return status;
141 }
142 }
143#endif
144 }
145
146}
147
148int get_body_parts(
149 struct X400msMessage *mp
150)
151{
152#define INIT_BUFFER_SIZE 10000
153#define INIT_BUFFER2_SIZE 256
154 int status;
155 int num_atts = 0;
156 int type;
157 char *buf;
158 size_t buflen;
159 size_t ret_len;
160 int i;
161 size_t j;
162 struct X400Message *x400_mp;
163 struct X400Bodypart *bp;
164
165
166 printf ("Getting Body Parts\n");
167
168 status = X400msMsgGetIntParam (mp, X400_N_NUM_ATTACHMENTS, &num_atts);
169 if ( status != X400_E_NOERROR ) {
170 fprintf (stderr, "Error in X400msMsgGetIntParam attachments %s\n",
171 X400msError (status));
172 return status;
173 }
174 printf ("Number of attachments is %d\n", num_atts);
175
176 buf = (char *) malloc(INIT_BUFFER_SIZE);
177 if (buf == NULL) {
178 fprintf(stderr, "can't alloc %d bytes\n", INIT_BUFFER_SIZE);
179 return X400_E_NOMEMORY;
180 }
181 buflen = INIT_BUFFER_SIZE;
182
183 for (i = 0; i <= num_atts ; i++) {
184 printf ("\n----- Get attachment ----- %d\n", i);
185 status = X400msMsgGetAttachment(mp, i, &type, buf, buflen, &ret_len);
186 if (status == X400_E_NOSPACE) {
187 char *newbuf;
188 fprintf(stderr, "realloc %ld bytes\n", (long)ret_len);
189 newbuf = (char *) realloc(buf, ret_len + 1);
190 if (newbuf == NULL) {
191 fprintf(stderr, "can't alloc %d bytes\n", INIT_BUFFER_SIZE);
192 free (buf);
193 return X400_E_NOMEMORY;
194 }
195 buf = newbuf;
196 buflen = ret_len;
197 status = X400msMsgGetAttachment(
198 mp, i, &type, buf, buflen, &ret_len);
199 /* fall through with status set */
200 }
201 /* for some attachments you must use the BodyPart functions */
202 if (status == X400_E_COMPLEX_BODY) {
203 printf("got complex bodypart\n");
204 status = get_bp(mp, &bp, i);
205 if (status != X400_E_NOERROR ) {
206 free (buf);
207 return status;
208 }
209 }
210 /* for forwarded messages you must use the BodyPart functions */
211 else if (status == X400_E_MESSAGE_BODY) {
212 printf("got forwarded message bodypart\n");
213 status = get_msgbp(mp, &x400_mp, i);
214 if (status != X400_E_NOERROR ) {
215 free (buf);
216 return status;
217 }
218 }
219 else if (status == X400_E_NOERROR) {
220 /* process text or binary attachment */
221 printf("got FTBP, text or binary attachment\n");
222 switch (type) {
223 case X400_T_FTBP:
224
225 /* Could retrieve these here: */
226 /* Content Description */
227 /* Filename */
228 /* Creation Date Description */
229 /* Modification Date */
230
231 // Fall Thru
232 case X400_T_BINARY:
233 printf("First 1000 bytes of Binary Data for %s BP is:",
234 type == X400_T_BINARY ? "Binary" : "FTBP");
235 for (j = 0; j < ret_len && j < 1000; j++)
236 printf("%x ", buf[j]);
237 printf("\n");
238 break;
239 case X400_T_IA5TEXT:
240 printf("IA5 BP is:\n%.*s", (int)ret_len, buf);
241 break;
242 default:
243 printf("Printable Data for BP is:\n%.*s", (int)ret_len, buf);
244 break;
245 }
246 }
247 else if (status == X400_E_MISSING_ATTR) {
248 printf("attachment %d not found\n", i);
249 }
250 else {
251 /* got an error */
252 fprintf (stderr, "Error in X400msMsgGetAttachment %s\n",
253 X400msError (status));
254 break;
255 }
256 }
257 free (buf);
258 return status;
259}
260
261static int get_bp(
262 struct X400msMessage *mp,
263 struct X400Bodypart **bpp,
264 int att_num
265)
266{
267 int status;
268 int type;
269 int bp_type;
270 size_t j;
271 char *buf;
272 size_t buflen;
273 char buf2[INIT_BUFFER2_SIZE];
274 int buf2len = sizeof buf2;
275 size_t ret_len;
276
277#define INIT_BUFFER_SIZE 10000
278 printf ("Get Bodypart %d\n", att_num);
279
280 /* firstly get the Bodypart */
281 status = X400msMsgGetBodypart(mp, att_num, &type, bpp);
282 if (status != X400_E_NOERROR) {
283 fprintf(stderr, "X400msMsgGetBodypart %d failed %s\n", att_num,
284 X400msError (status));
285 return status;
286 }
287 printf("got Bodypart %d, type = %d\n", att_num, type);
288
289 /* What kind of Bodypart using a attribute of the BP */
290 status = X400BodypartGetIntParam(*bpp, X400_N_BODY_TYPE, &bp_type);
291 if (status != X400_E_NOERROR) {
292 fprintf(stderr, "X400msMsgGetBodypart failed %s\n",
293 X400msError (status));
294 return status;
295 }
296 printf("got Bodypart %d, type = %s\n", att_num,
297 bp_type == X400_T_IA5TEXT ? "IA5" :
298 bp_type == X400_T_ISO8859_1 ? "ISO8859-1" :
299 bp_type == X400_T_ISO8859_2 ? "ISO8859_2" :
300 bp_type == X400_T_BINARY ? "Binary" :
301 bp_type == X400_T_MESSAGE ? "Message" :
302 bp_type == X400_T_FTBP ? "File Transfer BP" :
303 bp_type == X400_T_GENERAL_TEXT ? "General Text" : "Unknown"
304 );
305
306 /* setup buffer to use to return BP data */
307 buf = (char *) malloc(INIT_BUFFER_SIZE);
308 if (buf == NULL) {
309 fprintf(stderr, "can't alloc %d bytes\n", INIT_BUFFER_SIZE);
310 return X400_E_NOMEMORY;
311 }
312 buflen = INIT_BUFFER_SIZE;
313 /* Read data from the Bodypart */
314 status = X400BodypartGetStrParam(*bpp, X400_S_BODY_DATA, buf,
315 buflen, &ret_len);
316 if (status == X400_E_NOSPACE) {
317 char *newbuf;
318 fprintf(stderr, "realloc %ld bytes\n", (long)ret_len);
319 newbuf = (char *) realloc(buf, ret_len + 1);
320 if (newbuf == NULL) {
321 free (buf);
322 fprintf(stderr, "can't alloc %d bytes\n", INIT_BUFFER_SIZE);
323 return X400_E_NOMEMORY;
324 }
325 buf = newbuf;
326 buflen = ret_len;
327 status = X400BodypartGetStrParam(*bpp, X400_S_BODY_DATA, buf,
328 buflen, &ret_len);
329 /* fall through with status set */
330 }
331 if (status != X400_E_NOERROR) {
332 fprintf(stderr, "X400msMsgGetBodypart failed %s\n",
333 X400msError (status));
334 return status;
335 }
336 printf("got %ld bytes of Bodypart data\n", (long)ret_len);
337 switch (bp_type) {
338 case X400_T_FTBP:
339
340 /* Content Description */
341 status = X400BodypartGetStrParam(*bpp,
342 X400_S_FTBP_CONTENT_DESCRIPTION, buf2, buf2len, &ret_len);
343 if (status != X400_E_NOERROR) {
344 fprintf(stderr, "X400BodypartGetStrParam (%d) failed %s\n",
346 } else {
347 printf("FTBP Content Description '%.*s'\n",
348 (int)ret_len, buf2);
349 }
350 /* Filename */
351 status = X400BodypartGetStrParam(*bpp,
352 X400_S_FTBP_FILENAME, buf2, buf2len, &ret_len);
353 if (status != X400_E_NOERROR) {
354 fprintf(stderr, "X400BodypartGetStrParam (%d) failed %s\n",
356 } else {
357 printf("FTBP Filename '%.*s'\n",
358 (int)ret_len, buf2);
359 }
360 /* Creation Date Description */
361 status = X400BodypartGetStrParam(*bpp,
362 X400_S_FTBP_CREATION_DATE, buf2, buf2len, &ret_len);
363 if (status != X400_E_NOERROR) {
364 fprintf(stderr, "X400BodypartGetStrParam (%d) failed %s\n",
366 } else {
367 printf("FTBP Content Description '%.*s'\n",
368 (int)ret_len, buf2);
369 }
370 /* Modification Date */
371 status = X400BodypartGetStrParam(*bpp,
372 X400_S_FTBP_MODIFICATION_DATE, buf2, buf2len, &ret_len);
373 if (status != X400_E_NOERROR) {
374 fprintf(stderr, "X400BodypartGetStrParam (%d) failed %s\n",
376 } else {
377 printf("FTBP Modification Date '%.*s'\n",
378 (int)ret_len, buf2);
379 }
380
381 // Fall Thru
382 case X400_T_BINARY:
383 printf("First 1000 bytes of Binary Data for %s BP is:",
384 type == X400_T_BINARY ? "Binary" : "FTBP");
385 for (j = 0; j < ret_len && j < 1000; j++)
386 printf("%x ", buf[j]);
387 printf("\n");
388 break;
389 case X400_T_IA5TEXT:
390 printf("IA5 BP is:\n%s", buf);
391 break;
392 default:
393 printf("Printable Data for BP is:\n%.*s", (int)ret_len, buf);
394 break;
395 }
396
397 free (buf);
398 return X400_E_NOERROR;
399}
400
401/*
402 * Extract and return a Bodypart from an MS Message
403 */
404static int get_msgbp(
405 struct X400msMessage *mp,
406 struct X400Message **x400_mpp,
407 int bp_num
408)
409{
410 struct X400Message *x400_mp;
411 int status;
412 char buf[INIT_BUFFER_SIZE];
413 int buflen = sizeof buf;
414 size_t ret_len;
415
416 status = X400msMsgGetMessageBody(mp, bp_num, x400_mpp);
417 if (status != X400_E_NOERROR) {
418 fprintf(stderr, "X400MsgGetMessageBody (%d) failed %s\n",
419 bp_num, X400msError (status));
420 return status;
421 }
422 printf("Got Message BP from BP %d\n", bp_num);
423 x400_mp = *x400_mpp;
424
425 status = X400MsgGetStrParam(x400_mp, X400_S_OBJECTTYPE, buf, buflen,
426 &ret_len);
427 if (status != X400_E_NOERROR) {
428 fprintf(stderr, "X400MsgGetStrParam (%d) failed %s\n",
430 return status;
431 }
432 printf("Message BP from BP is '%.*s'\n", (int)ret_len, buf);
433 if (strncmp(buf, "message", ret_len) == 0 ) {
434 status = do_xmsg_headers(x400_mp);
435 if (status != X400_E_NOERROR)
436 return status;
437 status = do_xmsg_content_as_bp(x400_mp);
438 if (status != X400_E_NOERROR)
439 return status;
440 }
441 else if (strncmp(buf, "report", ret_len) == 0 ) {
442 status = do_xrep_headers(x400_mp);
443 if (status != X400_E_NOERROR)
444 return status;
445 status = do_xrep_content_as_bp(x400_mp);
446 if (status != X400_E_NOERROR)
447 return status;
448 }
449 else if (strncmp(buf, "probe", ret_len) == 0 ) {
450 status = do_xmsg_headers(x400_mp);
451 if (status != X400_E_NOERROR)
452 return status;
453 }
454 else {
455 fprintf(stderr, "got unknown object: %s\n", buf);
456 return X400_E_BADPARAM;
457 }
458
459
460 return X400_E_NOERROR;
461}
462
463static int do_xmsg_content_as_bp(
464 struct X400Message *x400_mp
465#ifdef __GNUC__
466 __attribute__((unused))
467#endif
468)
469{
470 printf("do_xmsg_content_as_bp NYI\n");
471 return X400_E_NOERROR;
472}
473
474
475static int do_xrep_headers(
476 struct X400Message *x400_mp
477#ifdef __GNUC__
478 __attribute__((unused))
479#endif
480)
481{
482 printf("do_xrep_headers NYI\n");
483 return X400_E_NOERROR;
484}
485
486
487static int do_xrep_content_as_bp(
488 struct X400Message *x400_mp
489#ifdef __GNUC__
490 __attribute__((unused))
491#endif
492)
493{
494 printf("do_xrep_content_as_bp NYI\n");
495 return X400_E_NOERROR;
496}
497
498static int do_xmsg_headers(
499 struct X400Message *x400_mp
500)
501{
502 int status;
503 char buf[INIT_BUFFER_SIZE];
504 int buflen = sizeof buf;
505 size_t ret_len;
506 int num_atts;
507
508 printf("do_xmsg_headers\n");
509 status = X400MsgGetStrParam(x400_mp, X400_S_IPM_IDENTIFIER, buf, buflen,
510 &ret_len);
511 if (status != X400_E_NOERROR) {
512 fprintf(stderr, "X400MsgGetStrParam (%d) failed %s\n",
514 return status;
515 }
516 printf("IPM Identifier from Message BP '%.*s'\n", (int)ret_len, buf);
517
518 status = X400MsgGetStrParam(x400_mp, X400_S_SUBJECT, buf, buflen,
519 &ret_len);
520 if (status != X400_E_NOERROR) {
521 fprintf(stderr, "X400MsgGetStrParam (%d) failed %s\n",
523 return status;
524 }
525 printf("Subject from Message BP '%.*s'\n", (int)ret_len, buf);
526
527 status = X400MsgGetIntParam(x400_mp, X400_N_NUM_ATTACHMENTS, &num_atts);
528 if (status != X400_E_NOERROR) {
529 fprintf(stderr, "X400MsgGetStrParam (%d) failed %s\n",
531 return status;
532 }
533 printf("Number of attachments in Message BP %d'\n", num_atts);
534
535 status = get_recips(x400_mp, X400_ORIGINATOR);
536 if (status != X400_E_NOERROR) {
537 return status;
538 }
539
540 status = get_recips(x400_mp, X400_RECIP_PRIMARY);
541 if (status != X400_E_NOERROR) {
542 return status;
543 }
544
545 status = get_recips(x400_mp, X400_RECIP_ENVELOPE);
546 if (status != X400_E_NOERROR) {
547 return status;
548 }
549
550 return X400_E_NOERROR;
551}
552
553static int do_redirection_hist (
554 struct X400Recipient *rp
555)
556{
557 char redirection_time [BUFSIZ];
558 char or_address [BUFSIZ];
559 char dn [BUFSIZ];
560 int rr;
561
562 size_t length;
563 int n;
564 int status;
565
566 struct X400RediHist *hist = NULL;
567
568 for ( n=1; ;n++ ) {
569
570 status = X400RediHistGet (rp,n,&hist);
571 if (status != X400_E_NOERROR)
572 break;
573
575 redirection_time, BUFSIZ,&length);
576
577 if (status == X400_E_NO_VALUE) {
578 return X400_E_NO_VALUE;
579 }
580
581 if ( status == X400_E_NOERROR ) {
582 redirection_time[length] = '\0';
583 printf ("Redirection time: %i %s\n",n,redirection_time);
584 } else {
585 fprintf (stderr, "Error in do_redirection_hist: %s\n",
586 X400msError (status));
587 }
588
590 or_address, BUFSIZ , &length);
591 if ( status == X400_E_NOERROR ) {
592 or_address[length] = '\0';
593 printf ("Redirection OR address %i :%s\n",n,or_address);
594 } else {
595 fprintf (stderr, "Error in do_redirection_hist: %s\n",
596 X400msError (status));
597 }
598
600 dn, BUFSIZ , &length);
601 if ( status == X400_E_NOERROR ) {
602 dn[length] = '\0';
603 printf ("Redirection DN %i :%s\n",n,dn);
604 } else {
605 fprintf (stderr, "Error in do_redirection_hist: %s\n",
606 X400msError (status));
607 }
608
610 if ( status == X400_E_NOERROR ) {
611 printf ("DSI routing action %d :%s\n",n,X400RediReason(rr));
612 } else {
613 fprintf (stderr, "Error in do_redirection_hist: %s\n",
614 X400msError (status));
615 }
616
617 }
618 if (n == 1) {
619 printf("No Redirection histories found in message\n");
620 } else {
621 printf("%d Redirection histories found in message\n", n - 1);
622 }
623 return X400_E_NOERROR;
624
625}
626
627/* Military priority utilities */
628char * get_x400_pty_str_from_4406(int s4406_pty) {
629 switch (s4406_pty) {
630 case 0 : return "deferred";
631 case 1 : return "routine";
632 case 2 : return "priority";
633 case 3 : return "immediate";
634 case 4 : return "flash";
635 case 5 : return "override";
636 default: return "priority";
637 }
638}
639
640
641int get_x400_pty_qual_from_4406(int s4406_pty) {
642 switch (s4406_pty) {
643 case 0 :
644 case 2 :
645 case 4 :
646 return 0;
647 case 1 :
648 case 3 :
649 case 5 :
650 return 1;
651 default:
652 return 0;
653 }
654
655}
656
657
658int get_x400_pty_from_4406(int s4406_pty) {
659 switch (s4406_pty) {
660 case 0 :
661 case 1 :
662 return 1;
663 case 2 :
664 case 3 :
665 return 0;
666 case 4 :
667 case 5 :
668 return 2;
669 default:
670 return 0;
671 }
672
673}
674
675
676
677int add_sec_label(
678 struct X400msMessage *mp /* message object */
679)
680{
681#define XML_BUFSIZE 1024
682#define STRING_BUFSIZE 1024
683
684 const char* xml_filename = "seclabel.xml";
685 char xml_content[XML_BUFSIZE];
686 char str_content[STRING_BUFSIZE];
687 int str_len = STRING_BUFSIZE;
688 FILE *fd = NULL;
689 int status;
690
691 /* Read in the security label XML file */
692 fd = fopen(xml_filename,"r");
693 if(fd == NULL) {
694 fprintf(stderr,"Failed to open %s : %s\n",
695 xml_filename,strerror(errno));
696 return X400_E_INT_ERROR;
697 }
698
699#pragma GCC diagnostic push
700#pragma GCC diagnostic ignored "-Wunused-result"
701 fread(&xml_content,XML_BUFSIZE,1,fd);
702#pragma GCC diagnostic pop
703
704 fclose(fd);
705
706 status = SecLabelInit("Example program");
707 if (status != SECLABEL_E_NOERROR) {
708 fprintf(stderr, "SecLabelInit returned error %d\n", status);
709 return(X400_E_INT_ERROR);
710 }
711
712 /* Use SecLabelParse to turn the XML into an octect string */
713 status = SecLabelParse(xml_content,
714 str_content,
715 STRING_BUFSIZE,
716 &str_len);
717
718 if (status != SECLABEL_E_NOERROR) {
719 fprintf(stderr, "SecLabelParse returned error %d\n", status);
720 return(X400_E_INT_ERROR);
721 }
722
723 /* Add the octect string to the message pointer */
725 str_content,str_len);
726 if ( status != X400_E_NOERROR ) {
727 fprintf (stderr, "x400msMsgAddStrParam returned error: %s\n",
728 X400msError (status));
729 return (status);
730 }
731 return X400_E_NOERROR;
732}
AMHS Symbolic Constants.
int X400MsgGetIntParam(struct X400Message *mp, int paramtype, int *valuep)
Return a integer-valued parameter from the message object.
int X400MsgGetRecip(struct X400Message *mp, int recip_type, int number, struct X400Recipient **rpp)
Get recipient object from message.
int X400RediHistGetIntParam(struct X400RediHist *info, int paramtype, int *valuep)
Get int parameter from Redirection History object.
int X400BodypartGetStrParam(struct X400Bodypart *bp, int paramtype, char *buffer, size_t buflen, size_t *paramlenp)
Return a string-valued parameter from the body part object.
int X400RediHistGet(struct X400Recipient *recip, int entry, struct X400RediHist **hist)
Get the Redirection History object from a recipient.
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 X400MsgGetStrParam(struct X400Message *mp, int paramtype, char *buffer, size_t buflen, size_t *paramlenp)
Return a string-valued parameter from the message object.
int X400BodypartGetIntParam(struct X400Bodypart *bp, int paramtype, int *valp)
Return a integer-valued parameter from the body part object.
const char * X400RediReason(int redirection_reason)
Return a human readable string based on a redirection reason.
int X400RediHistGetStrParam(struct X400RediHist *hist, int paramtype, char *value, size_t length, size_t *lengthp)
Get string-valued parameter from the X400RediHist object.
int X400msMsgAddStrParam(struct X400msMessage *mp, int paramtype, const char *value, size_t length)
Add string-valued parameter to the message.
int X400msMsgGetMessageBody(struct X400msMessage *mp, int number, struct X400Message **mpp)
Return a pointer to a message part object.
int X400msMsgGetAttachment(struct X400msMessage *mp, int number, int *typep, char *buffer, size_t buflen, size_t *lengthp)
Return the data of an attachment (=bodypart) from the message object.
const char * X400msError(int error)
Obtain a string describing the meaning of the given error code.
int X400msMsgGetBodypart(struct X400msMessage *mp, int number, int *typep, struct X400Bodypart **bpp)
Return a pointer to a body part object.
int X400msMsgGetIntParam(struct X400msMessage *mp, int paramtype, int *valp)
Return a integer-valued parameter from the message object.
#define X400_S_DIRECTORY_NAME
Definition x400_att.h:397
#define X400_S_OR_ADDRESS
Definition x400_att.h:349
#define X400_S_FTBP_FILENAME
Definition x400_att.h:1227
#define X400_N_BODY_TYPE
Definition x400_att.h:1191
#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_T_MESSAGE
Definition x400_att.h:854
#define X400_S_IPM_IDENTIFIER
Definition x400_att.h:728
#define X400_S_SUBJECT
Definition x400_att.h:749
#define X400_T_GENERAL_TEXT
Definition x400_att.h:867
#define X400_T_BINARY
Definition x400_att.h:851
#define X400_T_IA5TEXT
Definition x400_att.h:825
#define X400_T_ISO8859_2
Definition x400_att.h:843
#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_N_REDIRECTION_REASON
Definition x400_att.h:517
#define X400_S_REDIRECTION_TIME
Definition x400_att.h:520
#define X400_S_OBJECTTYPE
Definition x400_att.h:479
#define X400_S_SECURITY_LABEL
Definition x400_att.h:1370
#define X400_E_MISSING_ATTR
Definition x400_att.h:88
#define X400_E_BADPARAM
Definition x400_att.h:55
#define X400_E_INT_ERROR
Definition x400_att.h:58
#define X400_E_COMPLEX_BODY
Definition x400_att.h:166
#define X400_E_NOMEMORY
Definition x400_att.h:52
#define X400_E_NOERROR
Definition x400_att.h:46
#define X400_E_NO_VALUE
Definition x400_att.h:100
#define X400_E_NOSPACE
Definition x400_att.h:112
#define X400_E_MESSAGE_BODY
Definition x400_att.h:169
#define X400_E_NO_RECIP
Definition x400_att.h:109
#define X400_RECIP_PRIMARY
Definition x400_att.h:296
#define X400_RECIP_BCC
Definition x400_att.h:302
#define X400_ORIGINATOR
Definition x400_att.h:305
#define X400_RECIP_INTENDED
Definition x400_att.h:317
#define X400_RECIP_CC
Definition x400_att.h:299
#define X400_RECIP_ENVELOPE
Definition x400_att.h:335
#define X400_RECIP_REPLY
Definition x400_att.h:311
#define X400_AUTH_ORIG
Definition x400_att.h:308
#define X400_RECIP_REPORT
Definition x400_att.h:314
X400 MA/MS (P3/P7) Interface.

All rights reserved © 2002 - 2024 Isode Ltd.