
Messaging and Directory Server software used around the world in the
Government, Military, Aviation and Commercial sectors.
|
x400_msrcv.c00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044
00045
00046
00047
00048
00049
00050
00051
00052
00053
00054
00055
00056
00057
00058
00059
00060
00061
00062
00063
00064
00065
00066
00067
00068
00069
00070
00071
00072
00073
00074
00075
00076
00077
00078
00079
00080
00081
00082
00083
00084
00085
00086
00087
00088
00089
00090
00091
00092
00093
00094
00095
00096
00097
00098
00099
00100
00101
00102
00103
00104
00105
00106
00107
00108
00109
00110
00111
00112
00113
00114
00115
00116
00117
00118
00119
00120
00121
00122
00123
00124
00125
00126
00127
00128
00129
00130
00131
00132
00133
00134
00135
00136
00137
00138
00139
00140
00141
00142
00143
00144
00145
00146
00147
00148 #include <stdio.h>
00149 #include <stdlib.h>
00150 #include <x400_msapi.h>
00151 #include <seclabel_api.h>
00152 #include "example.h"
00153
00154 static char *optstr = "u371m:d:p:w:M:D:P:W:";
00155
00156 static void usage(void);
00157
00158
00159 #ifdef WANT_DL_EXP_HIST
00160 static int do_dl_hist (
00161 struct X400msMessage *mp
00162 );
00163 #endif
00164
00165 static int get_body_parts(
00166 struct X400msMessage *mp
00167 );
00168
00169 static int get_bp(
00170 struct X400msMessage *mp,
00171 struct X400Bodypart **bp,
00172 int att_num
00173 );
00174
00175 static int get_msgbp(
00176 struct X400msMessage *mp,
00177 struct X400Message **x400_mp,
00178 int att_num
00179 );
00180
00181 static int do_xmsg_headers(
00182 struct X400Message *x400_mp
00183 );
00184
00185 static int do_xmsg_content_as_bp(
00186 struct X400Message *x400_mp
00187 );
00188
00189 static int do_xrep_headers(
00190 struct X400Message *x400_mp
00191 );
00192
00193 static int do_xmsg_headers(
00194 struct X400Message *x400_mp
00195 );
00196
00197 static int do_xrep_content_as_bp(
00198 struct X400Message *x400_mp
00199 );
00200
00201 static int get_recips(
00202 struct X400Message *x400_mp,
00203 int type
00204 );
00205
00206 static int do_redirection_hist (
00207 struct X400Recipient *rp
00208 );
00209
00210 static int do_redirection_hist_env (
00211 struct X400msMessage *mp
00212 );
00213
00214 static int do_trace_info (
00215 struct X400msMessage *mp
00216 );
00217
00218 static int do_internal_trace_info (
00219 struct X400msMessage *mp
00220 );
00221
00222 static int do_orig_and_dl (
00223 struct X400msMessage *mp
00224 );
00225
00229 int
00230 main(
00231 int argc,
00232 char **argv)
00233 {
00234 char buffer[BUFSIZ];
00235 char pa[BUFSIZ];
00236 char orn[BUFSIZ];
00237 int status;
00238 int nummsg;
00239 int type;
00240 int seqn;
00241 struct X400msSession *sp;
00242 struct X400msMessage *mp;
00243 struct X400Recipient *rp;
00244 int n;
00245 size_t length;
00246 int contype;
00247 char *def_oraddr;
00248 char *def_dn;
00249 char *def_pa;
00250 int intparam;
00251 char recipient_str[BUFSIZ];
00252 int num_recips = -1;
00253
00254 if (get_args(argc, argv, optstr)) {
00255 usage();
00256 exit(-1);
00257 }
00258
00259 printf("Connection type (0 = P7, 1 = P3 submit only, 2 = P3 both directions) [%d]: ", x400_contype);
00260 contype = ic_fgetc(x400_contype, stdin);
00261 if (contype != 10)
00262 ic_fgetc(x400_contype, stdin);
00263
00264 if ( contype < '0' || '2' < contype )
00265 contype = x400_contype;
00266 else
00267 contype -= '0';
00268
00269 if (contype == 0) {
00270 def_oraddr = x400_ms_user_addr;
00271 def_dn = x400_ms_user_dn;
00272 def_pa = x400_ms_presentation_address;
00273 }
00274 else {
00275 def_oraddr = x400_mta_user_addr;
00276 def_dn = x400_mta_user_dn;
00277 def_pa = x400_mta_presentation_address;
00278 }
00279
00280 printf("Your ORAddress [%s] > ", def_oraddr);
00281 ic_fgets(orn, sizeof orn, stdin);
00282
00283 if (orn[strlen(orn) - 1] == '\n')
00284 orn[strlen(orn) - 1] = '\0';
00285
00286 if (orn[0] == '\0')
00287 strcpy(orn, def_oraddr);
00288
00289
00290 printf("Password [%s]: ",
00291 contype == 0 ? x400_p7_password : x400_p3_password);
00292 if (ic_fgets(buffer, sizeof buffer, stdin) == NULL)
00293 exit(1);
00294
00295 if (buffer[strlen(buffer) - 1] == '\n')
00296 buffer[strlen(buffer) - 1] = '\0';
00297 if (buffer[0] == '\0')
00298 strcpy(buffer, contype == 0 ? x400_p7_password : x400_p3_password);
00299
00300 printf("Presentation Address [%s] > ", def_pa);
00301 ic_fgets(pa, sizeof pa, stdin);
00302
00303 if (pa[strlen(pa) - 1] == '\n')
00304 pa[strlen(pa) - 1] = '\0';
00305
00306 if (pa[0] == '\0')
00307 strcpy(pa, def_pa);
00308
00309 if (talking_to_marben_ms)
00310 X400msSetConfigRequest(0);
00311
00312 status = X400msOpen(contype, orn, def_dn, buffer, pa, &nummsg, &sp);
00313 if (status != X400_E_NOERROR) {
00314 fprintf(stderr, "Error in Open: %s\n", X400msError(status));
00315 exit(status);
00316 }
00317
00318 if (talking_to_marben_ms)
00319 X400msSetIntDefault(sp, X400_N_STRICT_P7_1988, 1);
00320
00321 #ifdef USING_ALERTS
00322
00323
00324
00325
00326 X400msSetIntDefault(sp, X400_N_WAIT_INTERVAL, 1000);
00327 #endif
00328
00329
00330 X400msSetStrDefault(sp, X400_S_LOG_CONFIGURATION_FILE, "x400api.xml", 0);
00331
00332 if (contype == 0) {
00333 #ifdef WANT_AUTOFORWARDING
00334 struct X400msAutoActionParameter *aa_param;
00335
00336
00337 aa_param = X400msNewAutoActionParameter();
00338
00339
00340
00341 X400RecipNew(0, &rp);
00342
00343 X400RecipAddStrParam(rp, X400_S_OR_ADDRESS, def_oraddr,
00344 strlen(def_oraddr));
00345
00346 X400msAutoActionParameterAddRecip(aa_param, X400_RECIP_STANDARD, rp);
00347
00348 X400msAutoActionParameterAddStrParam(aa_param,
00349 X400_S_CONTENT_IDENTIFIER,
00350 "AF contentid", -1);
00351
00352 X400msAutoActionParameterAddIntParam(aa_param, X400_N_DISCLOSURE, 1);
00353
00354 X400msAutoActionParameterAddIntParam(aa_param,
00355 X400_N_IMPLICIT_CONVERSION_PROHIBITED,
00356 1);
00357
00358 X400msAutoActionParameterAddIntParam(aa_param,
00359 X400_N_ALTERNATE_RECIPIENT_ALLOWED,
00360 1);
00361
00362 X400msAutoActionParameterAddIntParam(aa_param,
00363 X400_N_CONTENT_RETURN_REQUEST,
00364 1);
00365
00366 X400msAutoActionParameterAddIntParam(aa_param, X400_N_PRIORITY, 2);
00367
00368 X400msAutoActionParameterAddStrParam(aa_param,
00369 X400_S_AUTO_FORWARDING_COMMENT,
00370 "This message was autoforwarded",
00371 -1);
00372
00373 X400msAutoActionParameterAddStrParam(aa_param,
00374 X400_S_COVER_NOTE,
00375 "This is a cover note", -1);
00376
00377 X400msAutoActionParameterAddStrParam(aa_param,
00378 X400_S_THIS_IPM_PREFIX,
00379 "AutoForwarded:", -1);
00380
00381 status = X400msRegisterAutoAction(sp, X400_AUTO_FORWARDING,
00382 4, aa_param);
00383 if (status != X400_E_NOERROR) {
00384 fprintf(stderr,
00385 "Error in RegisterAutoAction: %s\n", X400msError(status));
00386
00387 status = X400msClose(sp);
00388 exit(status);
00389 }
00390 printf("Registered AutoForwarding autoaction (id = 4) OK\n");
00391 X400msFreeAutoActionParameter(aa_param);
00392 #endif
00393
00394 #ifdef USING_ALERTS
00395
00396
00397 status = X400msRegisterAutoAction(sp, X400_AUTO_ALERT, 9, NULL);
00398 if (status != X400_E_NOERROR) {
00399 fprintf(stderr, "Error in RegisterAutoAction: %s\n",
00400 X400msError(status));
00401
00402 status = X400msClose(sp);
00403 exit(status);
00404 }
00405 printf("Registered AutoAlert autoaction (id = 9) OK\n");
00406 #endif
00407
00408
00409 status = X400msRegisterAutoAction(sp, X400_AUTO_ALERT, 10, NULL);
00410 if (status != X400_E_NOERROR) {
00411 fprintf(stderr, "Error in RegisterAutoAction: %s\n",
00412 X400msError(status));
00413
00414 status = X400msClose(sp);
00415 exit(status);
00416 }
00417 printf("Registered AutoAlert autoaction (id = 10) OK\n");
00418
00419
00420 status = X400msDeregisterAutoAction(sp, X400_AUTO_ALERT, 10);
00421 if (status != X400_E_NOERROR) {
00422 fprintf(stderr, "Error in DeregisterAutoAction: %s\n",
00423 X400msError(status));
00424
00425 status = X400msClose(sp);
00426 exit(status);
00427 }
00428 printf("Deregistered AutoAlert autoaction (id = 10) OK\n");
00429 }
00430
00431 if (nummsg == 0) {
00432 printf ("no messages - waiting 60 seconds for a message to be delivered.....\n");
00433 }
00434 else {
00435 printf("%d messages waiting\n", nummsg);
00436 }
00437
00438 status = X400msWait(sp, 1, &nummsg);
00439 if (status != X400_E_NOERROR) {
00440 fprintf(stderr, "Error from Wait: %s\n", X400msError(status));
00441
00442 status = X400msClose(sp);
00443 exit(status);
00444 }
00445
00446 if (x400_default_recipient != NULL)
00447 printf("Getting message\n");
00448 status = X400msMsgGet(sp, 0, &mp, &type, &seqn);
00449 switch (status) {
00450 case X400_E_NOERROR:
00451 fprintf(stderr, "MsgGet successfully got message\n");
00452 break;
00453 default :
00454 fprintf(stderr, "Error from MsgGet: %s\n", X400msError(status));
00455
00456 status = X400msClose(sp);
00457 exit(status);
00458 break;
00459 }
00460
00461 if (type != X400_MSG_MESSAGE) {
00462 fprintf(stderr, "Got a report (printing only some attributes)\n");
00463
00464
00465 status = X400msMsgGetStrParam(mp, X400_S_SUBJECT_IDENTIFIER,
00466 buffer, sizeof buffer, &length);
00467 if (status != X400_E_NOERROR) {
00468 fprintf(stderr, "Error from MsgGetStrParam: %s\n",
00469 X400msError(status));
00470
00471 status = X400msClose(sp);
00472 exit(status);
00473 }
00474 printf("Subject Identifier: %.*s\n", (int)length, buffer);
00475
00476
00477 status = do_orig_and_dl (mp);
00478 if (status != X400_E_NOERROR &&
00479 status != X400_E_MISSING_ATTR) {
00480 fprintf(stderr,"Failed to fetch originator and dl history: %s\n",
00481 X400msError (status));
00482 }
00483
00484
00485 for (n = 1;; n++) {
00486 status = X400msRecipGet(mp, X400_RECIP_REPORT, n, &rp);
00487 if (status == X400_E_NO_RECIP)
00488 break;
00489 if (status != X400_E_NOERROR) {
00490 fprintf(stderr, "Error from RecipGet: %s\n",
00491 X400msError(status));
00492
00493 status = X400msClose(sp);
00494 exit(status);
00495 }
00496
00497
00498 status = X400msRecipGetStrParam(rp, X400_S_OR_ADDRESS,
00499 recipient_str,
00500 sizeof recipient_str, &length);
00501 if (status != X400_E_NOERROR) {
00502 fprintf(stderr, "Error from RecipGetStrParam: %s\n",
00503 X400msError(status));
00504
00505 status = X400msClose(sp);
00506 exit(status);
00507 }
00508
00509
00510
00511 status = X400msRecipGetStrParam(rp, X400_S_MESSAGE_DELIVERY_TIME,
00512 buffer, sizeof buffer, &length);
00513 if (status == X400_E_NOERROR) {
00514
00515 printf("Positive Delivery Report for recipient %d: %s\n", n,
00516 recipient_str);
00517 printf("Delivery Time: %.*s\n", (int)length, buffer);
00518 }
00519 else {
00520
00521 printf("Negative Delivery Report for recipient %d: %s\n", n,
00522 recipient_str);
00523
00524
00525 status = X400msRecipGetStrParam(rp, X400_S_SUPPLEMENTARY_INFO,
00526 buffer, sizeof buffer,
00527 &length);
00528 if (status != X400_E_NOERROR) {
00529 fprintf(stderr, "Error from RecipGetStrParam: %s\n",
00530 X400msError(status));
00531 buffer[0] = '\0';
00532 }
00533 printf("Supplementary Info: %.*s\n", (int)length, buffer);
00534
00535
00536 status =
00537 X400msRecipGetIntParam(rp, X400_N_NON_DELIVERY_REASON,
00538 &intparam);
00539 if (status != X400_E_NOERROR) {
00540 fprintf(stderr, "Error from MsgGetIntParam: %s\n",
00541 X400msError(status));
00542 }
00543 printf("Non-Delivery Reason: %d\n", intparam);
00544
00545
00546 status =
00547 X400msRecipGetIntParam(rp, X400_N_NON_DELIVERY_DIAGNOSTIC,
00548 &intparam);
00549 if (status != X400_E_NOERROR) {
00550 fprintf(stderr, "Error from MsgGetIntParam: %s\n",
00551 X400msError(status));
00552 }
00553 printf("Non-Delivery Diagnostic: %d\n", intparam);
00554 }
00555 }
00556
00557 status = X400msMsgDelete(mp, 0);
00558 status = X400msClose(sp);
00559 exit(status);
00560 }
00561
00562
00563
00564 status = X400msMsgGetStrParam(mp, X400_S_MESSAGE_IDENTIFIER,
00565 buffer, sizeof buffer, &length);
00566 if (status != X400_E_NOERROR) {
00567 fprintf(stderr, "Error from MsgGetStrParam: %s\n",
00568 X400msError(status));
00569
00570 status = X400msClose(sp);
00571 exit(status);
00572 }
00573 printf("Message Identifier: %.*s\n", (int)length, buffer);
00574
00575
00576 status = X400msMsgGetStrParam(mp, X400_S_OR_ADDRESS,
00577 buffer, sizeof buffer, &length);
00578 if (status != X400_E_NOERROR) {
00579 fprintf(stderr, "Error from MsgGetStrParam: %s\n",
00580 X400msError(status));
00581
00582 status = X400msClose(sp);
00583 exit(status);
00584 }
00585 printf("Originator: %.*s\n", (int)length, buffer);
00586
00587 status = X400msMsgCountRecip(mp, X400_RECIP_PRIMARY, &num_recips);
00588 if (status != X400_E_NOERROR) {
00589 fprintf(stderr, "Error from MsgCountRecip: %s\n",
00590 X400msError(status));
00591
00592 status = X400msClose(sp);
00593 exit(status);
00594 }
00595
00596 printf("There are %d recipients\n", num_recips);
00597
00598
00599 for (n = 1;; n++) {
00600 status = X400msRecipGet(mp, X400_RECIP_ENVELOPE, n, &rp);
00601 if (status == X400_E_NO_RECIP)
00602 break;
00603 if (status != X400_E_NOERROR) {
00604 fprintf(stderr, "Error from RecipGet: %s\n", X400msError(status));
00605
00606 status = X400msClose(sp);
00607 exit(status);
00608 }
00609
00610
00611 status = X400msRecipGetStrParam(rp, X400_S_OR_ADDRESS,
00612 buffer, sizeof buffer, &length);
00613 if (status == X400_E_NOERROR) {
00614 printf("Envelope Recipient %d: %.*s\n", n, (int)length, buffer);
00615 }
00616 }
00617
00618
00619 for (n = 1;; n++) {
00620 status = X400msRecipGet(mp, X400_RECIP_PRIMARY, n, &rp);
00621 if (status == X400_E_NO_RECIP)
00622 break;
00623 if (status != X400_E_NOERROR) {
00624 fprintf(stderr, "Error from RecipGet: %s\n", X400msError(status));
00625
00626 status = X400msClose(sp);
00627 exit(status);
00628 }
00629
00630
00631 status = X400msRecipGetStrParam(rp, X400_S_OR_ADDRESS,
00632 buffer, sizeof buffer, &length);
00633 if (status == X400_E_NOERROR) {
00634 printf("Primary Recipient %d: %.*s\n", n, (int)length, buffer);
00635 }
00636 }
00637
00638 #ifdef WANT_DL_EXP_HIST
00639
00640 {
00641
00642 status = do_dl_hist(hist);
00643
00644
00645
00646
00647
00648
00649 if ( status == X400_E_NO_VALUE) {
00650
00651 } else if (status == X400_E_MISSING_ATTR ) {
00652 printf("There is no DL expansion history\n");
00653 } else {
00654
00655 printf("error getting DL Expansion History\n");
00656 fprintf (stderr, "Error in X400mtDLExpHistGet: %s\n",
00657 X400msError (status));
00658 return status;
00659 }
00660 }
00661 #endif
00662
00663 #define WANT_TRACE_INFO 1
00664 #ifdef WANT_TRACE_INFO
00665 {
00666
00667 status = do_trace_info(mp);
00668 if ( status == X400_E_NO_VALUE) {
00669
00670 } else if (status == X400_E_MISSING_ATTR ) {
00671 printf("There is no Trace Info\n");
00672 } else {
00673 printf("error getting Trace Info\n");
00674 fprintf (stderr, "Error fetching trace info: %s\n",
00675 X400msError (status));
00676 return status;
00677 }
00678
00679 }
00680
00681 #endif
00682
00683 #define USE_INTERNAL_TRACE_INFO 1
00684 #ifdef USE_INTERNAL_TRACE_INFO
00685 {
00686
00687 status = do_internal_trace_info(mp);
00688 if ( status == X400_E_NO_VALUE) {
00689
00690 } else if (status == X400_E_MISSING_ATTR ) {
00691 printf("There is no internal Trace Info\n");
00692 } else {
00693 printf("error getting int Trace Info\n");
00694 fprintf (stderr, "Error fetching int trace info: %s\n",
00695 X400msError (status));
00696 return status;
00697 }
00698
00699 }
00700 #endif
00701
00702
00703
00704 #define USE_REDIRECTION_HISTORY 1
00705 #ifdef USE_REDIRECTION_HISTORY
00706 {
00707 status = do_redirection_hist_env(mp);
00708 if ( status == X400_E_NO_VALUE ) {
00709
00710 } else if (status == X400_E_MISSING_ATTR ) {
00711 printf("There is no Redirection History\n");
00712 } else {
00713 printf("error getting Redirection History\n");
00714 fprintf (stderr, "Error fetching Redirection History: %s\n",
00715 X400msError (status));
00716 return status;
00717 }
00718 }
00719 #endif
00720
00721
00722 #ifdef USE_SEC_LABEL
00723
00724 #define XML_BUFSIZE 1024
00725 {
00726 char xml_buffer[XML_BUFSIZE];
00727 unsigned char slab_buffer[XML_BUFSIZE];
00728
00729 status = X400msMsgGetStrParam(mp,
00730 X400_S_SECURITY_LABEL,
00731 (char*)slab_buffer,
00732 XML_BUFSIZE,
00733 &length);
00734 if (status == X400_E_NO_VALUE) {
00735 printf("No security label\n");
00736 } else if (status != X400_E_NOERROR) {
00737 fprintf(stderr,"Failed to fetch security label: %d",status);
00738 exit(1);
00739 } else {
00740 int sec_status = 0;
00741
00742 sec_status = SecLabelInit("Example program");
00743 if (status != SECLABEL_E_NOERROR) {
00744 fprintf(stderr, "SecLabelInit returned error %d\n", status);
00745 exit(1);
00746 }
00747
00748 status = SecLabelPrint(slab_buffer,
00749 length,
00750 xml_buffer,
00751 XML_BUFSIZE);
00752
00753 if (status != SECLABEL_E_NOERROR) {
00754 fprintf(stderr, "SecLabelParse returned error %d\n", status);
00755 exit(1);
00756 }
00757
00758
00759 printf("Got security label:%s\n",xml_buffer);
00760 }
00761
00762
00763 }
00764
00765 #endif
00766
00767
00768
00769
00770 status = X400msMsgGetStrParam(mp, X400_S_SUBJECT,
00771 buffer, sizeof buffer, &length);
00772 if (status == X400_E_NOERROR)
00773 printf("Subject: %.*s\n", (int)length, buffer);
00774
00775
00776 status = X400msMsgGetStrParam(mp, X400_T_IA5TEXT,
00777 buffer, sizeof buffer, &length);
00778 if (status == X400_E_NOERROR)
00779 printf("Text:\n%.*s\n", (int)length, buffer);
00780
00781
00782 status = get_body_parts(mp);
00783
00784
00785 status = X400msMsgDelete(mp, 0);
00786
00787 status = X400msClose(sp);
00788 return(status);
00789 }
00790
00791 #ifdef WANT_DL_EXP_HIST
00792 static int do_dl_hist (
00793 struct X400msMessage *mp
00794 )
00795 {
00796 char DLORAddress[BUFSIZ];
00797 char DLORDN[BUFSIZ];
00798 char DLExpTime[BUFSIZ];
00799 size_t length;
00800 int n;
00801 int status;
00802 struct X400DLExpHist *hist = NULL;
00803
00804
00805
00806
00807
00808 for ( n=1; ;n++ ) {
00809
00810 status = X400msDLExpHistGet (mp,n,&hist);
00811 if (status != X400_E_NOERROR) {
00812 return status;
00813 }
00814
00815 status = X400DLGetStrParam (hist, X400_S_OR_ADDRESS,
00816 DLORAddress, BUFSIZ , &length);
00817 if (status == X400_E_NO_VALUE) {
00818 return X400_E_NO_VALUE;
00819 }
00820 if ( status == X400_E_NOERROR ) {
00821 DLORAddress[length] = '\0';
00822 printf ("DLExpansion List entry %d OR Address:%s\n",
00823 n,DLORAddress);
00824 } else {
00825 fprintf (stderr, "Error in :X400mtDLGetStrParam OR %s\n",
00826 X400msError (status));
00827 }
00828
00829
00830
00831 status = X400DLGetStrParam (hist, X400_S_DIRECTORY_NAME,
00832 DLORDN, BUFSIZ , &length);
00833 if ( status == X400_E_NOERROR ) {
00834 DLORDN[length] = '\0';
00835 printf ("DLExpansion List entry %d DN :%s\n",n,DLORDN);
00836 } else {
00837 fprintf (stderr, "Error in :X400mtDLGetStrParam DN %s\n",
00838 X400msError (status));
00839 }
00840
00841 status = X400DLGetStrParam (hist, X400_S_DLEXP_TIME,
00842 DLExpTime, BUFSIZ , &length);
00843 if ( status == X400_E_NOERROR ) {
00844 DLExpTime[length] = '\0';
00845 printf ("DLExpansion List entry %d Time :%s\n",n,DLExpTime);
00846 } else {
00847 fprintf (stderr, "Error in :X400mtDLGetStrParam Time %s\n",
00848 X400msError (status));
00849 }
00850
00851 }
00852 if (n == 1) {
00853 printf("No DLEH found in message");
00854 } else {
00855 printf("%d DLEH entries found in message", n - 1);
00856 }
00857 return X400_E_NOERROR;
00858 }
00859 #endif
00860
00861 static int get_body_parts(
00862 struct X400msMessage *mp
00863 )
00864 {
00865 #define INIT_BUFFER_SIZE 10000
00866 int status;
00867 int num_atts = 0;
00868 int type;
00869 char *buf;
00870 size_t buflen;
00871 size_t ret_len;
00872 int i;
00873 size_t j;
00874 struct X400Message *x400_mp;
00875 struct X400Bodypart *bp;
00876
00877
00878 status = X400msMsgGetIntParam (mp, X400_N_NUM_ATTACHMENTS, &num_atts);
00879 if ( status != X400_E_NOERROR ) {
00880 fprintf (stderr, "Error in X400msMsgGetIntParam attachments %s\n",
00881 X400msError (status));
00882 return status;
00883 }
00884 printf ("Number of attachments is %d\n", num_atts);
00885
00886 buf = (char *) malloc(INIT_BUFFER_SIZE);
00887 if (buf == NULL) {
00888 fprintf(stderr, "can't alloc %d bytes\n", INIT_BUFFER_SIZE);
00889 return X400_E_NOMEMORY;
00890 }
00891 buflen = INIT_BUFFER_SIZE;
00892
00893 for (i = 1; i <= num_atts ; i++) {
00894 printf ("Get attachment %d\n", i);
00895 status = X400msMsgGetAttachment(mp, i, &type, buf, buflen, &ret_len);
00896 if (status == X400_E_NOSPACE) {
00897 fprintf(stderr, "realloc %d bytes\n", ret_len);
00898 buf = (char *) realloc(buf, ret_len + 1);
00899 if (buf == NULL) {
00900 fprintf(stderr, "can't alloc %d bytes\n", INIT_BUFFER_SIZE);
00901 return X400_E_NOMEMORY;
00902 }
00903 buflen = ret_len;
00904 status = X400msMsgGetAttachment(
00905 mp, i, &type, buf, buflen, &ret_len);
00906
00907 }
00908
00909 if (status == X400_E_COMPLEX_BODY) {
00910 printf("got complex bodypart\n");
00911 status = get_bp(mp, &bp, i);
00912 if (status != X400_E_NOERROR ) {
00913 return status;
00914 }
00915 }
00916
00917 else if (status == X400_E_MESSAGE_BODY) {
00918 printf("got forwarded message bodypart\n");
00919 status = get_msgbp(mp, &x400_mp, i);
00920 if (status != X400_E_NOERROR ) {
00921 return status;
00922 }
00923 }
00924 else if (status == X400_E_NOERROR) {
00925
00926 printf("got text or binary attachment\n");
00927 switch (type) {
00928 case X400_T_BINARY:
00929 case X400_T_FTBP:
00930 printf("First 1000 bytes of Binary Data for %s BP is:",
00931 type == X400_T_BINARY ? "Binary" : "FTBP");
00932 for (j = 0; j < ret_len && j < 1000; j++)
00933 printf("%x ", buf[j]);
00934 printf("\n");
00935 break;
00936 default:
00937 printf("Printable Data for BP is:\n %s", buf);
00938 break;
00939 }
00940 }
00941 else {
00942
00943 fprintf (stderr, "Error in X400msMsgGetAttachment %s\n",
00944 X400msError (status));
00945 break;
00946 }
00947 }
00948 return status;
00949 }
00950
00951 static int get_bp(
00952 struct X400msMessage *mp,
00953 struct X400Bodypart **bpp,
00954 int att_num
00955 )
00956 {
00957 int status;
00958 int type;
00959 int bp_type;
00960 size_t j;
00961 char *buf;
00962 size_t buflen;
00963 size_t ret_len;
00964
00965 #define INIT_BUFFER_SIZE 10000
00966 printf ("Get Bodypart %d\n", att_num);
00967
00968
00969 status = X400msMsgGetBodypart(mp, att_num, &type, bpp);
00970 if (status != X400_E_NOERROR) {
00971 fprintf(stderr, "X400msMsgGetBodypart %d failed %s\n", att_num,
00972 X400msError (status));
00973 return status;
00974 }
00975 printf("got Bodypart %d, type = %d\n", att_num, type);
00976
00977
00978 status = X400BodypartGetIntParam(*bpp, X400_N_BODY_TYPE, &bp_type);
00979 if (status != X400_E_NOERROR) {
00980 fprintf(stderr, "X400msMsgGetBodypart failed %s\n",
00981 X400msError (status));
00982 return status;
00983 }
00984 printf("got Bodypart %d, type = %s\n", att_num,
00985 bp_type == X400_T_IA5TEXT ? "IA5" :
00986 bp_type == X400_T_ISO8859_1 ? "ISO8859-1" :
00987 bp_type == X400_T_ISO8859_2 ? "ISO8859_2" :
00988 bp_type == X400_T_BINARY ? "Binary" :
00989 bp_type == X400_T_MESSAGE ? "Message" :
00990 bp_type == X400_T_FTBP ? "File Transfer BP" :
00991 bp_type == X400_T_GENERAL_TEXT ? "General Text" : "Unknown"
00992 );
00993
00994
00995 buf = (char *) malloc(INIT_BUFFER_SIZE);
00996 if (buf == NULL) {
00997 fprintf(stderr, "can't alloc %d bytes\n", INIT_BUFFER_SIZE);
00998 return X400_E_NOMEMORY;
00999 }
01000 buflen = INIT_BUFFER_SIZE;
01001
01002 status = X400BodypartGetStrParam(*bpp, X400_S_BODY_DATA, buf,
01003 buflen, &ret_len);
01004 if (status == X400_E_NOSPACE) {
01005 fprintf(stderr, "realloc %d bytes\n", ret_len);
01006 buf = (char *) realloc(buf, ret_len + 1);
01007 if (buf == NULL) {
01008 fprintf(stderr, "can't alloc %d bytes\n", INIT_BUFFER_SIZE);
01009 return X400_E_NOMEMORY;
01010 }
01011 buflen = ret_len;
01012 status = X400BodypartGetStrParam(*bpp, X400_S_BODY_DATA, buf,
01013 buflen, &ret_len);
01014
01015 }
01016 if (status != X400_E_NOERROR) {
01017 fprintf(stderr, "X400msMsgGetBodypart failed %s\n",
01018 X400msError (status));
01019 return status;
01020 }
01021 printf("got %d bytes of Bodypart data\n", ret_len);
01022 switch (bp_type) {
01023 case X400_T_BINARY:
01024 case X400_T_FTBP:
01025 printf("First 1000 bytes of Binary Data for %s BP is:",
01026 type == X400_T_BINARY ? "Binary" : "FTBP");
01027 for (j = 0; j < ret_len && j < 1000; j++)
01028 printf("%x ", buf[j]);
01029 printf("\n");
01030 break;
01031 default:
01032 printf("Printable Data for BP is:\n %s", buf);
01033 break;
01034 }
01035
01036
01037
01038 return X400_E_NOERROR;
01039
01040 }
01041
01042
01043
01044
01045 static int get_msgbp(
01046 struct X400msMessage *mp,
01047 struct X400Message **x400_mpp,
01048 int bp_num
01049 )
01050 {
01051 struct X400Message *x400_mp;
01052 int status;
01053 char buf[INIT_BUFFER_SIZE];
01054 int buflen = sizeof buf;
01055 size_t ret_len;
01056
01057 status = X400msMsgGetMessageBody(mp, bp_num, x400_mpp);
01058 if (status != X400_E_NOERROR) {
01059 fprintf(stderr, "X400MsgGetMessageBody (%d) failed %s\n",
01060 bp_num, X400msError (status));
01061 return status;
01062 }
01063 printf("Got Message BP from BP %d\n", bp_num);
01064 x400_mp = *x400_mpp;
01065
01066 status = X400MsgGetStrParam(x400_mp, X400_S_OBJECTTYPE, buf, buflen,
01067 &ret_len);
01068 if (status != X400_E_NOERROR) {
01069 fprintf(stderr, "X400MsgGetStrParam (%d) failed %s\n",
01070 X400_S_OBJECTTYPE, X400msError (status));
01071 return status;
01072 }
01073 printf("Message BP from BP is '%.*s'\n", ret_len, buf);
01074 if (strncmp(buf, "message", ret_len) == 0 ) {
01075 status = do_xmsg_headers(x400_mp);
01076 if (status != X400_E_NOERROR)
01077 return status;
01078 status = do_xmsg_content_as_bp(x400_mp);
01079 if (status != X400_E_NOERROR)
01080 return status;
01081 }
01082 else if (strncmp(buf, "report", ret_len) == 0 ) {
01083 status = do_xrep_headers(x400_mp);
01084 if (status != X400_E_NOERROR)
01085 return status;
01086 status = do_xrep_content_as_bp(x400_mp);
01087 if (status != X400_E_NOERROR)
01088 return status;
01089 }
01090 else if (strncmp(buf, "probe", ret_len) == 0 ) {
01091 status = do_xmsg_headers(x400_mp);
01092 if (status != X400_E_NOERROR)
01093 return status;
01094 }
01095 else {
01096 fprintf(stderr, "got unknown object: %s\n", buf);
01097 return X400_E_BADPARAM;
01098 }
01099
01100
01101 return X400_E_NOERROR;
01102 }
01103
01104 static int do_xmsg_headers(
01105 struct X400Message *x400_mp
01106 )
01107 {
01108 int status;
01109 char buf[INIT_BUFFER_SIZE];
01110 int buflen = sizeof buf;
01111 size_t ret_len;
01112 int num_atts;
01113
01114 printf("do_xmsg_headers\n");
01115 status = X400MsgGetStrParam(x400_mp, X400_S_IPM_IDENTIFIER, buf, buflen,
01116 &ret_len);
01117 if (status != X400_E_NOERROR) {
01118 fprintf(stderr, "X400MsgGetStrParam (%d) failed %s\n",
01119 X400_S_OBJECTTYPE, X400msError (status));
01120 return status;
01121 }
01122 printf("IPM Identifier from Message BP '%.*s'\n", ret_len, buf);
01123
01124 status = X400MsgGetStrParam(x400_mp, X400_S_SUBJECT, buf, buflen,
01125 &ret_len);
01126 if (status != X400_E_NOERROR) {
01127 fprintf(stderr, "X400MsgGetStrParam (%d) failed %s\n",
01128 X400_S_OBJECTTYPE, X400msError (status));
01129 return status;
01130 }
01131 printf("Subject from Message BP '%.*s'\n", ret_len, buf);
01132
01133 status = X400MsgGetIntParam(x400_mp, X400_N_NUM_ATTACHMENTS, &num_atts);
01134 if (status != X400_E_NOERROR) {
01135 fprintf(stderr, "X400MsgGetStrParam (%d) failed %s\n",
01136 X400_S_OBJECTTYPE, X400msError (status));
01137 return status;
01138 }
01139 printf("Number of attachments in Message BP %d'\n", num_atts);
01140
01141 status = get_recips(x400_mp, X400_ORIGINATOR);
01142 if (status != X400_E_NOERROR) {
01143 return status;
01144 }
01145
01146 status = get_recips(x400_mp, X400_RECIP_PRIMARY);
01147 if (status != X400_E_NOERROR) {
01148 return status;
01149 }
01150
01151
01152 return X400_E_NOERROR;
01153 }
01154
01155
01156 static int get_recips(
01157 struct X400Message *x400_mp,
01158 int type
01159 )
01160 {
01161
01162 struct X400Recipient *rp;
01163 int status;
01164 int recip_num;
01165
01166 for (recip_num = 1; ; recip_num++ ) {
01167
01168 char buf[INIT_BUFFER_SIZE];
01169 int buflen = sizeof buf;
01170 size_t ret_len;
01171
01172 status = X400MsgGetRecip(x400_mp, type, recip_num, &rp);
01173 if (status == X400_E_NO_RECIP) {
01174 if (recip_num == 1) {
01175 printf("no recips of type %x\n", type);
01176 return X400_E_NOERROR;
01177 } else {
01178 printf("no more recips of type %x\n", type);
01179 }
01180 return X400_E_NOERROR;
01181 }
01182 else if (status != X400_E_NOERROR) {
01183 fprintf(stderr, "X400MsgGetRecip (%d) failed %s\n",
01184 X400_S_OBJECTTYPE, X400msError (status));
01185 return status;
01186 }
01187 printf("got recip number %d of type %s (%x)\n", recip_num,
01188 type == X400_RECIP_PRIMARY ? "Primary" :
01189 type == X400_RECIP_CC ? "CC" :
01190 type == X400_RECIP_BCC ? "BCC" :
01191 type == X400_ORIGINATOR ? "Originator" :
01192 type == X400_AUTH_ORIG ? "Auth Orig" :
01193 type == X400_RECIP_REPLY ? "Reply" :
01194 type == X400_RECIP_REPORT ? "Reported Recip" :
01195 type == X400_RECIP_INTENDED ? "Intended" :
01196 type == X400_RECIP_ENVELOPE ? "Envelope" :
01197 "Unknown",
01198 type);
01199 if (type == X400_RECIP_ENVELOPE) {
01200
01201
01202 status = X400RecipGetStrParam(rp, X400_S_OR_ADDRESS, buf, buflen,
01203 &ret_len);
01204 if (status != X400_E_NOERROR) {
01205 fprintf(stderr, "X400MsgGetStrParam (%d) failed %s\n",
01206 X400_S_OBJECTTYPE, X400msError (status));
01207 } else {
01208 printf("Originator OR Address'%.*s'\n", ret_len, buf);
01209 }
01210 } else {
01211 status = X400RecipGetStrParam(rp, X400_S_OR_ADDRESS, buf, buflen,
01212 &ret_len);
01213 if (status != X400_E_NOERROR) {
01214 fprintf(stderr, "X400MsgGetStrParam (%d) failed %s\n",
01215 X400_S_OBJECTTYPE, X400msError (status));
01216 } else {
01217 printf("Originator OR Address'%.*s'\n", ret_len, buf);
01218 }
01219
01220 }
01221
01222 #define USE_REDIRECTION_HISTORY 1
01223 #ifdef USE_REDIRECTION_HISTORY
01224 {
01225 status = do_redirection_hist(rp);
01226 if ( status == X400_E_NO_VALUE ) {
01227
01228 } else if (status == X400_E_MISSING_ATTR ) {
01229 printf("There is no Redirection History\n");
01230 } else {
01231 printf("error getting Redirection History\n");
01232 fprintf (stderr, "Error fetching Redirection History: %s\n",
01233 X400msError (status));
01234 return status;
01235 }
01236 }
01237 #endif
01238 }
01239
01240 }
01241 static int do_xmsg_content_as_bp(
01242 struct X400Message *x400_mp
01243 )
01244 {
01245 printf("do_xmsg_content_as_bp NYI\n");
01246 return X400_E_NOERROR;
01247 }
01248
01249
01250 static int do_xrep_headers(
01251 struct X400Message *x400_mp
01252 )
01253 {
01254 printf("do_xrep_headers NYI\n");
01255 return X400_E_NOERROR;
01256 }
01257
01258
01259 static int do_xrep_content_as_bp(
01260 struct X400Message *x400_mp
01261 )
01262 {
01263 printf("do_xrep_content_as_bp NYI\n");
01264 return X400_E_NOERROR;
01265 }
01266
01267
01268 static void usage(void) {
01269 printf("usage: %s\n", optstr);
01270 printf("\t where:\n");
01271 printf("\t -u : Don't prompt to override defaults \n");
01272 printf("\t -3 : Use P3 connection \n");
01273 printf("\t -7 : Use P7 connection \n");
01274 printf("\t -m : OR Address in P7 bind arg \n");
01275 printf("\t -d : DN in P7 bind arg \n");
01276 printf("\t -p : Presentation Address of P7 Store \n");
01277 printf("\t -w : P7 password of P7 user \n");
01278 printf("\t -M : OR Address in P3 bind arg \n");
01279 printf("\t -D : DN in P3 bind arg \n");
01280 printf("\t -P : Presentation Address of P3 server\n"); |