home *** CD-ROM | disk | FTP | other *** search
/ InfoMagic Internet Tools 1993 July / Internet Tools.iso / RockRidge / mail / pp / pp-6.0 / Tools / probe / probe.c < prev    next >
Encoding:
C/C++ Source or Header  |  1991-12-18  |  5.8 KB  |  312 lines

  1. /* probe.c: Generates a probe */
  2.  
  3. # ifndef lint
  4. static char Rcsid[] = "@(#)$Header: /xtel/pp/pp-beta/Tools/probe/RCS/probe.c,v 6.0 1991/12/18 20:32:41 jpo Rel $";
  5. # endif
  6.  
  7. /*
  8.  * $Header: /xtel/pp/pp-beta/Tools/probe/RCS/probe.c,v 6.0 1991/12/18 20:32:41 jpo Rel $
  9.  *
  10.  * $Log: probe.c,v $
  11.  * Revision 6.0  1991/12/18  20:32:41  jpo
  12.  * Release 6.0
  13.  *
  14.  */
  15.  
  16.  
  17.  
  18. #include "head.h"
  19. #include "prm.h"
  20. #include "q.h"
  21. #include <isode/cmd_srch.h>
  22.  
  23.  
  24.  
  25. /* --- externals --- */
  26. extern char                *loc_dom_site,
  27.                     *local_822_chan,
  28.                     *cont_822;
  29. extern ADDR                *make_adr_new();
  30.  
  31.  
  32. /* --- queue variables --- */
  33. static struct prm_vars                  PRMstruct;
  34. static Q_struct                         Qstruct;
  35. static struct prm_vars                  *PrmPtr = &PRMstruct;
  36. Q_struct                                *QuePtr = &Qstruct;
  37.  
  38.  
  39. /* --- other statics  --- */
  40. static char                *myname = NULLCP;
  41.  
  42. #define    OPT_TO                1
  43. #define OPT_SIZE            2
  44. #define    OPT_EIT                3
  45. #define    OPT_UAID            4
  46. #define    OPT_IMPCONV            5
  47. #define OPT_ALTRECIP            6
  48. #define OPT_DEBUG            7
  49.  
  50. static int                param = OPT_TO;
  51.  
  52. CMD_TABLE  probe_options[] = { /* probe commandline options */
  53.     "-t",                OPT_TO,
  54.     "-s",                OPT_SIZE,
  55.     "-e",                OPT_EIT,
  56.     "-u",                OPT_UAID,
  57.     "-i",                OPT_IMPCONV,
  58.     "-a",                OPT_ALTRECIP,
  59.     0,                -1
  60.     };
  61.  
  62.  
  63.  
  64. static void        probe_set_rest(), probe_checks(), usage();    
  65.  
  66.  
  67.  
  68.  
  69.  
  70. /* ---------------------  Begin  Routines  -------------------------------- */
  71.  
  72.  
  73.  
  74.  
  75. main (argc, argv)
  76. int     argc;
  77. char    **argv;
  78. {
  79.     char    *filename;
  80.     ADDR    *ap;
  81.     int    retval;
  82.  
  83.  
  84.     bzero ((char *)PrmPtr, sizeof(*PrmPtr));
  85.     bzero ((char *)QuePtr, sizeof(*QuePtr));
  86.     (void) set_from();
  87.  
  88.     myname = argv[0];
  89.  
  90.     if (argc > 16)
  91.         usage();
  92.  
  93.     if (argc == 1) {
  94.         (void) prompt_probe_stdin();    
  95.         probe_process();
  96.     }
  97.         
  98.  
  99.     while (--argc > 0) {
  100.         argv ++;
  101.         if (**argv == '-')
  102.             switch (param = cmd_srch (*argv, probe_options)) {
  103.  
  104.             case OPT_TO:
  105.             case OPT_SIZE:
  106.             case OPT_EIT:
  107.             case OPT_UAID:
  108.                 break;
  109.  
  110.             case OPT_IMPCONV:
  111.                 QuePtr -> implicit_conversion_prohibited = YES;
  112.                 break;
  113.             case OPT_ALTRECIP:
  114.                 QuePtr->alternate_recip_allowed = YES;
  115.                 break;
  116.             default:
  117.                             printf ("\n***Error: Unknown option '%s'\n",
  118.                     *argv);
  119.                             usage();
  120.             }   /* -- end of switch -- */
  121.  
  122.         else {
  123.             switch (param) {
  124.             case OPT_TO:
  125.                 ap = make_adr_new (*argv, AD_RECIPIENT);
  126.                         adr_add (&QuePtr -> Raddress, ap);
  127.                 break;
  128.             case OPT_SIZE:
  129.                 QuePtr -> msgsize = atoi(*argv);
  130.                 break;
  131.             case OPT_EIT:
  132.                 retval = set_encoded (*argv);
  133.                 if (retval == NOTOK) {
  134.                                 printf ("\n***Error: eits! '%s'\n",
  135.                     *argv);
  136.                                 usage();
  137.                 }
  138.                 break;
  139.             case OPT_UAID:
  140.                 QuePtr -> ua_id = strdup (*argv);
  141.                 break;
  142.             default:
  143.                             printf ("\n***Error: Unknown option '%s'\n",
  144.                     *argv);
  145.                 usage();
  146.  
  147.             }  /* -- end of switch -- */
  148.  
  149.         }   /* -- end of else -- */
  150.  
  151.     }  /* -- end of while -- */
  152.  
  153.     
  154.     probe_process();
  155. }
  156.  
  157.  
  158.  
  159.  
  160.  
  161.  
  162. /* ---------------------  Static  Routines  ------------------------------- */
  163.  
  164.  
  165.  
  166.  
  167.  
  168.  
  169. static void usage()
  170. {
  171.     printf ("\n\n");
  172.     printf ("Usage:   %s\n", myname); 
  173.     printf ("          [-t Recipient]\n");
  174.     printf ("        [-s MessageSize]\n");
  175.     printf ("          [-e EncodedInfoTypes]\n");
  176.     printf ("        [-u UAid]\n");
  177.     printf ("          [-i ImplicitConversion]\n");
  178.     printf ("          [-a AlternateRecipientAllowed]\n");
  179.     printf ("\n\n");
  180.     exit (1);
  181. }
  182.  
  183.  
  184.  
  185.  
  186.  
  187. static int probe_process()
  188. {
  189.     int    retval; 
  190.  
  191.     (void) probe_checks();
  192.  
  193.     sys_init (myname);
  194.     if (or_init() == NOTOK)     exit (1);
  195.     or_myinit();
  196.     (void) probe_set_rest();
  197.  
  198.     printf ("Processing ...\n");
  199.     retval = probe_submit();
  200.  
  201.     if (rp_isbad (retval)) {
  202.         printf ("*** Error: Unable to submit ***\n\n");
  203.         exit (1);
  204.     }
  205.         
  206.     exit (0);
  207. }
  208.  
  209.  
  210.  
  211.  
  212. static void probe_set_rest()
  213. {
  214.     prm_init (PrmPtr);
  215.         PrmPtr->prm_opts = PRM_ACCEPTALL;
  216.  
  217.     QuePtr -> msgtype    = MT_PMPDU;
  218.     QuePtr -> cont_type    = strdup(cont_822);
  219.     QuePtr -> priority    = PRIO_URGENT;
  220.     QuePtr -> inbound     = list_rchan_new (loc_dom_site, local_822_chan);
  221.  
  222.     if (QuePtr -> msgsize == 0)
  223.     QuePtr -> msgsize     = 500;
  224.  
  225.     if (QuePtr -> encodedinfo.eit_types == 0)
  226.         if (set_encoded (NULLCP) == NOTOK) {
  227.             printf ("\n***Error: Unable to set eit\n");
  228.             exit (1);
  229.         }
  230.     (void) MPDUid_new (&QuePtr -> msgid);
  231. }
  232.  
  233.  
  234.  
  235.  
  236. static void probe_checks()
  237. {
  238.  
  239.     ADDR    *ap;
  240.     int    err = FALSE;
  241.  
  242.         if (isstr (QuePtr -> ua_id) && (int)strlen (QuePtr -> ua_id) > 16) {
  243.                 printf ("*** Error:  Invalid UA size (max 16) '%s' ***\n",
  244.                         QuePtr -> ua_id);
  245.                    exit (1);
  246.     }
  247.  
  248.         if (QuePtr -> msgsize < 0) {
  249.                 printf ("*** Error:  Invalid Message Size '%d' ***\n",
  250.                         QuePtr -> msgsize);
  251.                    exit (1);
  252.     }
  253. }
  254.  
  255.  
  256.  
  257.  
  258. static int probe_submit()
  259. {
  260.     RP_Buf          rp;
  261.     ADDR            *ap;
  262.     int        submit_status = NOTOK;
  263.  
  264.     if (rp_isbad (io_init(rp))) {
  265.         printf ("*** Error: probe_submit:  io_init\n");
  266.         exit (1);
  267.     }
  268.  
  269.     if (rp_isbad (io_wprm (PrmPtr, &rp))) {
  270.         printf ("*** Error: probe_submit:  io_wprm\n");
  271.         goto  probe_submit_end;
  272.     }
  273.  
  274.     if (rp_isbad (io_wrq (QuePtr, &rp))) {
  275.         printf ("*** Error: probe_submit:  io_wrq\n");
  276.         goto  probe_submit_end;
  277.     }
  278.  
  279.     if (rp_isbad (io_wadr (QuePtr->Oaddress, AD_ORIGINATOR, &rp))) {
  280.         printf ("*** Error: probe_submit:  io_wadr ('%s')\n",
  281.             QuePtr->Oaddress->ad_value);
  282.         goto  probe_submit_end;
  283.     }
  284.  
  285.  
  286.     for (ap = QuePtr->Raddress; ap; ap = ap->ad_next) {
  287.  
  288.         /* -- Red Book X.411 Clause 4.3.2.2 -- */ 
  289.         ap -> ad_mtarreq = AD_MTA_CONFIRM;
  290.         ap -> ad_usrreq = AD_USR_CONFIRM;
  291.  
  292.         if (rp_isbad (io_wadr (ap, AD_RECIPIENT, &rp))) {
  293.             printf ("*** Error: probe_submit:  io_wadr ('%s')\n",
  294.                 ap->ad_value);
  295.             goto  probe_submit_end;
  296.         }
  297.     }
  298.  
  299.  
  300.     if (rp_isbad (io_adend (&rp))) {
  301.         printf ("*** Error: probe_submit:  io_adend\n");
  302.         goto  probe_submit_end;
  303.     }
  304.     else printf ("%s\n", rp.rp_line);
  305.  
  306.     submit_status = OK;
  307.  
  308. probe_submit_end: ;
  309.     io_end (submit_status);
  310.     return submit_status;
  311. }
  312.