
Messaging and Directory Server software used around the world in the
Government, Military, Aviation and Commercial sectors.
|
x400_mssend.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 <string.h>
00151 #include <sys/stat.h>
00152 #include <sys/types.h>
00153 #ifndef _WIN32
00154 #include <unistd.h>
00155 #endif
00156 #include <fcntl.h>
00157 #include <errno.h>
00158
00159 #include <x400_msapi.h>
00160 #include <seclabel_api.h>
00161 #include "example.h"
00162
00163
00164 static char *optstr = "u371m:d:p:w:M:D:P:W:r:o:O:r:g:G:c:l:R:y:C:iaqsAvf:";
00165
00166
00167 static char *default_recip = "/CN=P7User1/O=attlee/PRMD=TestPRMD/ADMD=TestADMD/C=GB/";
00168 char *recip;
00169 static char *subject = "A Test Message from X.400 C API";
00170 static const char text[] = "First line\r\nSecond line\r\n";
00171 static char *binary_data;
00172
00173 static char *fwd_subject = "Forwarded message subject";
00174
00175 static int add_binary_attachment (
00176 struct X400msMessage *mp,
00177 char * filename_to_send
00178 );
00179 static int add_fwd_bp (
00180 struct X400msMessage *mp,
00181 char *recip_orn,
00182 char *recip_dn
00183 ) ;
00184 static void usage(void) ;
00185
00186
00187 int main (
00188 int argc,
00189 char **argv
00190 )
00191 {
00192 char buffer[BUFSIZ];
00193 char pa[BUFSIZ];
00194 char orn[BUFSIZ];
00195 char tmp[BUFSIZ];
00196 int status;
00197 int nummsg;
00198 struct X400msSession *sp;
00199 struct X400msMessage *mp;
00200 struct X400Recipient *rp;
00201 int contype;
00202 char *def_oraddr;
00203 char *def_dn;
00204 char *def_pa;
00205
00206 if (get_args(argc, argv, optstr)) {
00207 usage();
00208 exit(-1);
00209 }
00210
00211 printf("Connection type (0 = P7, 1 = P3 submit only, 2 = P3 both directions) [%d]: ", x400_contype);
00212 contype = ic_fgetc(x400_contype, stdin);
00213 if (contype != 10)
00214 ic_fgetc(x400_contype, stdin);
00215
00216 if ( contype < '0' || '2' < contype )
00217 contype = x400_contype;
00218 else
00219 contype -= '0';
00220
00221 if (contype == 0) {
00222 def_oraddr = x400_ms_user_addr;
00223 def_dn = x400_ms_user_dn;
00224 def_pa = x400_ms_presentation_address;
00225 } else {
00226 def_oraddr = x400_mta_user_addr;
00227 def_dn = x400_mta_user_dn;
00228 def_pa = x400_mta_presentation_address;
00229 }
00230
00231 printf("Your ORAddress [%s] > ", def_oraddr);
00232 ic_fgets (orn, sizeof orn, stdin);
00233
00234 if ( orn[strlen(orn)-1] == '\n' )
00235 orn[strlen(orn)-1] = '\0';
00236
00237 if (orn[0] == '\0')
00238 strcpy(orn, def_oraddr);
00239
00240
00241 printf ("Password [%s]: ",
00242 contype == 0 ? x400_p7_password : x400_p3_password);
00243 if ( ic_fgets (buffer, sizeof buffer, stdin) == NULL )
00244 exit (1);
00245
00246 if (buffer[strlen(buffer)-1] == '\n' )
00247 buffer[strlen(buffer)-1] = '\0';
00248 if (buffer[0] == '\0')
00249 strcpy(buffer, contype == 0 ? x400_p7_password : x400_p3_password);
00250
00251
00252 printf("Presentation Address [%s] > ", def_pa);
00253 ic_fgets (pa, sizeof pa, stdin);
00254
00255 if ( pa[strlen(pa)-1] == '\n' )
00256 pa[strlen(pa)-1] = '\0';
00257
00258 if (pa[0] == '\0')
00259 strcpy(pa, def_pa);
00260
00261 if (talking_to_marben_ms)
00262 X400msSetConfigRequest(0);
00263
00264
00265 status = X400msOpen (contype, orn, def_dn, buffer, pa, &nummsg, &sp);
00266 if ( status != X400_E_NOERROR ) {
00267 fprintf (stderr, "Error in Open: %s\n", X400msError (status));
00268 exit (status);
00269 }
00270
00271 if (talking_to_marben_ms)
00272 X400msSetIntDefault(sp, X400_N_STRICT_P7_1988, 1);
00273
00274
00275 X400msSetStrDefault(sp, X400_S_LOG_CONFIGURATION_FILE, "x400api.xml", 0);
00276
00277 if (x400_default_recipient != NULL)
00278 recip = x400_default_recipient;
00279 else
00280 recip = default_recip;
00281
00282 printf("Message recipient [%s]: ", recip);
00283 ic_fgets (tmp, sizeof tmp, stdin);
00284
00285 if ( tmp[strlen(tmp)-1] == '\n' )
00286 tmp[strlen(tmp)-1] = '\0';
00287 if (strlen(tmp) != 0)
00288 recip = strdup(tmp);
00289
00290 printf("Subject [%s]: ", subject);
00291 ic_fgets (tmp, sizeof tmp, stdin);
00292
00293 if ( tmp[strlen(tmp)-1] == '\n' )
00294 tmp[strlen(tmp)-1] = '\0';
00295 if (strlen(tmp) != 0)
00296 subject = strdup(tmp);
00297
00298 status = X400msMsgNew (sp, X400_MSG_MESSAGE, &mp);
00299 if ( status != X400_E_NOERROR ) {
00300 fprintf (stderr, "x400msMsgNew returned error: %s\n", X400msError (status));
00301 exit (status);
00302 }
00303
00304 status = X400msRecipNew (mp, X400_RECIP_STANDARD, &rp);
00305 if ( status != X400_E_NOERROR ) {
00306 fprintf (stderr, "x400msRecipNew returned error: %s\n", X400msError (status));
00307 exit (status);
00308 }
00309
00310 status = X400msRecipAddStrParam (rp, X400_S_OR_ADDRESS, recip, -1);
00311 if ( status != X400_E_NOERROR ) {
00312 fprintf (stderr, "x400msRecipAddStrParam returned error: %s\n", X400msError (status));
00313 exit (status);
00314 }
00315
00316 status = X400msRecipAddStrParam (rp, X400_S_DIRECTORY_NAME, "CN=recipient;c=gb", -1);
00317 if ( status != X400_E_NOERROR ) {
00318 fprintf (stderr, "x400msRecipAddStrParam returned error: %s\n", X400msError (status));
00319 exit (status);
00320 }
00321
00322 status = X400msMsgAddStrParam (mp, X400_S_OR_ADDRESS, orn, -1);
00323 if ( status != X400_E_NOERROR ) {
00324 fprintf (stderr, "x400msMsgAddStrParam returned error: %s\n", X400msError (status));
00325 exit (status);
00326 }
00327
00328 status = X400msMsgAddStrParam (mp, X400_S_DIRECTORY_NAME, "CN=originator;c=gb", -1);
00329 if ( status != X400_E_NOERROR ) {
00330 fprintf (stderr, "x400msMsgAddStrParam returned error: %s\n", X400msError (status));
00331 exit (status);
00332 }
00333
00334
00335 status = X400msRecipAddIntParam (rp, X400_N_REPORT_REQUEST, 1);
00336 if ( status != X400_E_NOERROR ) {
00337 fprintf (stderr, "x400msRecipAddStrParam returned error: %s\n", X400msError (status));
00338 exit (status);
00339 }
00340
00341
00342 status = X400msRecipAddIntParam (rp, X400_N_NOTIFICATION_REQUEST, 2);
00343 if ( status != X400_E_NOERROR ) {
00344 fprintf (stderr, "x400msRecipAddIntParam returned error: %s\n", X400msError (status));
00345 exit (status);
00346 }
00347
00348
00349 status = X400msMsgAddIntParam (mp, X400_N_CONTENT_RETURN_REQUEST, 0);
00350 if ( status != X400_E_NOERROR ) {
00351 fprintf (stderr, "X400msMsgAddIntParam %d returned error: %s\n",
00352 X400_N_CONTENT_RETURN_REQUEST, X400msError (status));
00353 exit (status);
00354 }
00355
00356
00357 printf("message priority is %d ( 0 - normal, 1 - non-urgent, 2 - urgent)\n",
00358 x400_default_priority);
00359 status = X400msMsgAddIntParam (mp, X400_N_PRIORITY, x400_default_priority);
00360 if ( status != X400_E_NOERROR ) return (status);
00361
00362
00363 printf("military message priority is %d ( 0 - low, 1 - high)\n",
00364 x400_default_priority);
00365 status = X400msMsgAddIntParam (mp, X400_N_MMTS_PRIORITY_QUALIFIER, 1);
00366 if ( status != X400_E_NOERROR ) return (status);
00367
00368
00369 status = X400msMsgAddStrParam (mp, X400_S_SUBJECT, subject, -1);
00370 if ( status != X400_E_NOERROR ) {
00371 fprintf (stderr, "x400msMsgAddStrParam returned error: %s\n", X400msError (status));
00372 exit (status);
00373 }
00374
00375
00376 status = X400msMsgAddStrParam (mp, X400_T_ISO8859_1, text, -1);
00377 if ( status != X400_E_NOERROR ) {
00378 fprintf (stderr, "x400ms returned error: %s\n", X400msError (status));
00379 exit (status);
00380 }
00381
00382
00383 status = X400msMsgAddAttachment (mp, X400_T_IA5TEXT, text, strlen(text));
00384 if ( status != X400_E_NOERROR ) {
00385 printf("failed to add X400_T_IA5TEXT BP\n");
00386 return (status);
00387 }
00388
00389
00390
00391 if (filename_to_send != NULL) {
00392 status = add_binary_attachment (mp, filename_to_send);
00393 if ( status != X400_E_NOERROR ) {
00394 printf("failed to add X400_T_BINARY BP\n");
00395 return (status);
00396 }
00397 status = add_fwd_bp (mp, orn, def_dn);
00398 if ( status != X400_E_NOERROR ) {
00399 printf("failed to add forwarded BP\n");
00400 return (status);
00401 }
00402 } else {
00403 printf("no binary file set - not sending X400_T_BINARY\n");
00404 printf("no binary file set - not sending forwarded BP\n");
00405 }
00406
00407
00408 #ifdef USE_SEC_LABEL
00409 {
00410 #define XML_BUFSIZE 1024
00411 #define STRING_BUFSIZE 1024
00412
00413 const char* xml_filename = "seclabel.xml";
00414 char xml_content[XML_BUFSIZE];
00415 char str_content[STRING_BUFSIZE];
00416 int str_len = STRING_BUFSIZE;
00417 FILE *fd = NULL;
00418
00419
00420 fd = fopen(xml_filename,"r");
00421 if(fd == NULL) {
00422 fprintf(stderr,"Failed to open %s : %s\n",
00423 xml_filename,strerror(errno));
00424 }
00425
00426 fread(&xml_content,XML_BUFSIZE,1,fd);
00427
00428 fclose(fd);
00429
00430 status = SecLabelInit("Example program");
00431 if (status != SECLABEL_E_NOERROR) {
00432 fprintf(stderr, "SecLabelInit returned error %d\n", status);
00433 exit(1);
00434 }
00435
00436
00437 status = SecLabelParse(xml_content,
00438 str_content,
00439 STRING_BUFSIZE,
00440 &str_len);
00441
00442 if (status != SECLABEL_E_NOERROR) {
00443 fprintf(stderr, "SecLabelParse returned error %d\n", status);
00444 exit(1);
00445 }
00446
00447
00448 status = X400msMsgAddStrParam (mp, X400_S_SECURITY_LABEL,
00449 str_content,str_len);
00450 if ( status != X400_E_NOERROR ) {
00451 fprintf (stderr, "x400msMsgAddStrParam returned error: %s\n", X400msError (status));
00452 exit (status);
00453 }
00454
00455 }
00456 #endif
00457
00458 status = X400msMsgSend (mp);
00459 if ( status != X400_E_NOERROR ) {
00460 fprintf (stderr, "x400msMsgSend returned error: %s\n", X400msError (status));
00461 exit (status);
00462 } else {
00463 printf("Message submitted successfully\n");
00464 }
00465
00466 status = X400msMsgDelete (mp, 0);
00467 if ( status != X400_E_NOERROR ) {
00468 fprintf (stderr, "x400msMsgDelete returned error: %s\n", X400msError (status));
00469 exit (status);
00470 }
00471
00472 mp = NULL;
00473 rp = NULL;
00474
00475 status = X400msClose (sp);
00476 exit (status);
00477
00478 }
00479
00480 static int add_binary_attachment (
00481 struct X400msMessage *mp,
00482 char * filename_to_send
00483 )
00484 {
00485 int fd;
00486 int file_size;
00487 struct stat buf;
00488 int fs=0;
00489 int status;
00490
00491 printf("sending file %s\n", filename_to_send);
00492 if ((fd = open (filename_to_send, O_RDONLY)) == -1) {
00493 printf("Failed to open content file %s", filename_to_send);
00494 return X400_E_BADPARAM;
00495 }
00496
00497
00498 if (fstat(fd, &buf) != 0) {
00499 close(fd);
00500 printf("Can't fstat file %s %d", filename_to_send, errno);
00501 return X400_E_BADPARAM;
00502 }
00503
00504 file_size = buf.st_size;
00505 printf("Content file size = %d\n", file_size);
00506
00507 binary_data = (char *) malloc(file_size);
00508 if ( binary_data == NULL )
00509 return X400_E_NOMEMORY;
00510 if ((fs = read(fd, binary_data, file_size) ) == -1) {
00511 printf("Cannot read from binary file %d\n", errno);
00512 return (X400_E_SYSERROR);
00513 }
00514 close(fd);
00515
00516 status = X400msMsgAddAttachment (mp, X400_T_BINARY, binary_data, fs);
00517 if ( status != X400_E_NOERROR ) {
00518 printf("failed to add X400_T_BINARY BP\n");
00519 return (status);
00520 }
00521 return (status);
00522 }
00523
00524 static int add_fwd_bp (
00525 struct X400msMessage *mp,
00526 char *orig_orn,
00527 char *orig_dn
00528 )
00529 {
00530 struct X400Message *x400_mp;
00531 struct X400Recipient *rp;
00532 int status;
00533 int num_atts = 0;
00534
00535 printf("sending fwd bp \n");
00536
00537 status = X400MsgNew (X400_MSG_MESSAGE, &x400_mp);
00538 if ( status != X400_E_NOERROR ) {
00539 fprintf (stderr, "x400MsgNew returned error: %s\n", X400msError (status));
00540 exit (status);
00541 }
00542
00543
00544 status = X400MsgAddStrParam (x400_mp, X400_S_OR_ADDRESS, orig_orn, -1);
00545 if ( status != X400_E_NOERROR ) {
00546 fprintf (stderr, "x400MsgAddStrParam returned error: %s\n", X400msError (status));
00547 exit (status);
00548 }
00549 status = X400MsgAddStrParam (x400_mp, X400_S_DIRECTORY_NAME, orig_dn, -1);
00550 if ( status != X400_E_NOERROR ) {
00551 fprintf (stderr, "x400MsgAddStrParam returned error: %s\n", X400msError (status));
00552 exit (status);
00553 }
00554
00555
00556 status = X400RecipNew (X400_ORIGINATOR, &rp);
00557 if ( status != X400_E_NOERROR ) {
00558 fprintf (stderr, "x400RecipNew returned error: %s\n", X400msError (status));
00559 exit (status);
00560 }
00561
00562
00563 status = X400RecipAddStrParam (rp, X400_S_OR_ADDRESS, recip, -1);
00564 if ( status != X400_E_NOERROR ) {
00565 fprintf (stderr, "x400RecipAddStrParam returned error: %s\n", X400msError (status));
00566 exit (status);
00567 }
00568
00569
00570 status = X400RecipAddStrParam (rp, X400_S_DIRECTORY_NAME, orig_dn, -1);
00571 if ( status != X400_E_NOERROR ) {
00572 fprintf (stderr, "x400msRecipAddStrParam returned error: %s\n", X400msError (status));
00573 exit (status);
00574 }
00575
00576
00577 status = X400MsgAddRecip (x400_mp, X400_ORIGINATOR, rp);
00578 if ( status != X400_E_NOERROR ) {
00579 fprintf (stderr, "X400MsgAddRecip returned error: %s\n", X400msError (status));
00580 exit (status);
00581 }
00582 printf("Put %s in as originator\n", orig_orn);
00583
00584
00585 status = X400RecipNew (X400_RECIP_STANDARD, &rp);
00586 if ( status != X400_E_NOERROR ) {
00587 fprintf (stderr, "x400RecipNew returned error: %s\n", X400msError (status));
00588 exit (status);
00589 }
00590
00591 status = X400RecipAddStrParam (rp, X400_S_OR_ADDRESS, recip, -1);
00592 if ( status != X400_E_NOERROR ) {
00593 fprintf (stderr, "x400RecipAddStrParam returned error: %s\n", X400msError (status));
00594 exit (status);
00595 }
00596
00597 status = X400RecipAddStrParam (rp, X400_S_DIRECTORY_NAME, "CN=recipient;c=gb", -1);
00598 if ( status != X400_E_NOERROR ) {
00599 fprintf (stderr, "x400msRecipAddStrParam returned error: %s\n", X400msError (status));
00600 exit (status);
00601 }
00602
00603
00604
00605 status = X400MsgAddRecip (x400_mp, X400_RECIP_STANDARD, rp);
00606 if ( status != X400_E_NOERROR ) {
00607 fprintf (stderr, "X400MsgAddRecip returned error: %s\n", X400msError (status));
00608 exit (status);
00609 }
00610 printf("Put %s in as reipient\n", recip);
00611
00612
00613
00614
00615 printf("message priority is %d ( 0 - normal, 1 - non-urgent, 2 - urgent)\n",
00616 x400_default_priority);
00617 status = X400MsgAddIntParam (x400_mp, X400_N_PRIORITY, x400_default_priority);
00618 if ( status != X400_E_NOERROR ) return (status);
00619
00620
00621 printf("military message priority is %d ( 0 - low, 1 - high)\n",
00622 x400_default_priority);
00623 status = X400MsgAddIntParam (x400_mp, X400_N_MMTS_PRIORITY_QUALIFIER, 1);
00624 if ( status != X400_E_NOERROR ) return (status);
00625
00626
00627
00628 status = X400MsgAddStrParam (x400_mp, X400_S_SUBJECT, fwd_subject, -1);
00629 if ( status != X400_E_NOERROR ) {
00630 fprintf (stderr, "x400msMsgAddStrParam returned error: %s\n", X400msError (status));
00631 exit (status);
00632 }
00633
00634
00635 status = X400MsgAddAttachment (x400_mp, X400_T_IA5TEXT, text, strlen(text));
00636 if ( status != X400_E_NOERROR ) {
00637 printf("failed to add X400_T_IA5TEXT BP\n");
00638 return (status);
00639 }
00640 num_atts++;
00641
00642
00643 status = X400MsgAddStrParam (x400_mp, X400_T_ISO8859_1, text, -1);
00644 if ( status != X400_E_NOERROR ) {
00645 fprintf (stderr, "x400ms returned error: %s\n", X400msError (status));
00646 exit (status);
00647 }
00648 num_atts++;
00649
00650 status = X400MsgAddIntParam (x400_mp, X400_N_NUM_ATTACHMENTS, num_atts);
00651 if (status != X400_E_NOERROR )
00652 return (status);
00653
00654 status = X400msMsgAddMessageBody (mp, x400_mp);
00655 if (status != X400_E_NOERROR ) {
00656 fprintf (stderr, "X400msMsgAddMessageBody returned error: %s\n", X400msError (status));
00657 return (status);
00658 }
00659
00660 return X400_E_NOERROR;
00661 }
00662
00663 static void usage(void) {
00664 printf("usage: %s\n", optstr);
00665 printf("\t where:\n");
00666 printf("\t -u : Don't prompt to override defaults \n");
00667 printf("\t -3 : Use P3 connection \n");
00668 printf("\t -7 : Use P7 connection \n");
00669 printf("\t -m : OR Address in P7 bind arg \n");
00670 printf("\t -d : DN in P7 bind arg \n");
00671 printf("\t -p : Presentation Address of P7 Store \n");
00672 printf("\t -w : P7 password of P7 user \n");
00673 printf("\t -M : OR Address in P3 bind arg \n");
00674 printf("\t -D : DN in P3 bind arg \n");
00675 printf("\t -P : Presentation Address of P3 server\n");
00676 printf("\t -W : P3 password of P3 user \n");
00677 printf("\t -o : Originator \n");
00678 printf("\t -O : Originator Return Address \n");
00679 printf("\t -r : Recipient\n");
00680 printf("\t -l : Logline\n");
00681 printf("\t -y : Priority (0 - normal, 1 - non-urgent, 2 - urgent \n");
00682 printf("\t -C : Content Type (2/22/772/OID) \n");
00683 printf("\t -i : Implicit conversion prohibited = TRUE \n");
00684 printf("\t -a : Alternate Recipient Prohibited = TRUE \n");
00685 printf("\t -q : Content Return Request = TRUE \n");
00686 printf("\t -s : Disclosure of Recipient = FALSE \n");
00687 printf("\t -A : Recipient Reassignment Prohibited = FALSE \n");
00688 printf("\t -v : Conversion with Loss Prohibited = FALSE \n");
00689 printf("\t -f : Filename to transfer as binary bp\n");
00690 return;
00691 }
00692
00693
|