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

  1. /* qmgr_start.c: routines to read in Q from addr dir and pass on to Qmgr */
  2.  
  3. # ifndef lint
  4. static char Rcsid[] = "@(#)$Header: /xtel/pp/pp-beta/Chans/qmgr-load/RCS/qmgr-start.c,v 6.0 1991/12/18 20:11:26 jpo Rel $";
  5. # endif
  6.  
  7. /*
  8.  * $Header: /xtel/pp/pp-beta/Chans/qmgr-load/RCS/qmgr-start.c,v 6.0 1991/12/18 20:11:26 jpo Rel $
  9.  *
  10.  * $Log: qmgr-start.c,v $
  11.  * Revision 6.0  1991/12/18  20:11:26  jpo
  12.  * Release 6.0
  13.  *
  14.  */
  15.  
  16.  
  17. #include "util.h"
  18. #include "retcode.h"
  19. #include "Qmgr-ops.h"           /* operation definitions */
  20. #include "Qmgr-types.h"         /* type definitions */
  21. #include "ryinitiator.h"        /* for generic interactive initiators */
  22.  
  23. /* Sumbit types */
  24. #include "q.h"
  25. #include "prm.h"
  26.  
  27. /*   */
  28. /* Outside routines */
  29. extern struct type_Qmgr_MsgStruct     *qstruct2qmgr();
  30. extern void    qinit(), sys_init(), rd_end();
  31.  
  32.  
  33. /*   */
  34. /* DATA */
  35. static char *myservice =     "pp qmgr";
  36.  
  37. /* OPERATIONS */
  38. static int     do_newmessage(),
  39.         do_help(),
  40.         do_quit();
  41.  
  42. /* RESULTS */
  43. int     newmessage_result();
  44.     
  45. /* ERRORS */
  46. int     general_error ();
  47.  
  48. #define newmessage_error     general_error
  49.  
  50. static struct client_dispatch dispatches[] = {
  51. {
  52.     "newmessage", operation_Qmgr_newmessage,
  53. #ifdef    PEPSY_VERSION
  54.     do_newmessage, &_ZQmgr_mod, _ZPseudo_newmessageQmgr,
  55. #else 
  56.     do_newmessage, free_Qmgr_newmessage_argument,
  57. #endif
  58.     newmessage_result, newmessage_error,
  59.     "Re-add message to the queue"
  60. },
  61. {
  62.     "help",     0,      
  63.     do_help,
  64. #ifdef    PEPSY_VERSION
  65.     NULL, 0, 
  66. #else
  67.     NULLIFP, 
  68. #endif
  69.     NULLIFP, NULLIFP,
  70.     "print this information",
  71. },
  72. {
  73.     "quit",     0,      do_quit,
  74. #ifdef    PEPSY_VERSION
  75.     NULL, 0,
  76. #else
  77.     NULLIFP,
  78. #endif
  79.     NULLIFP, NULLIFP,
  80.     "terminate the association and exit",
  81. },
  82. {
  83.     NULL
  84. }
  85. };
  86.  
  87.  
  88. extern char *pptailor;
  89.  
  90. /*   */
  91. /* MAIN */
  92.  
  93. /* ARGSUSED */
  94.  
  95. main (argc, argv, envp)
  96. int     argc;
  97. char     **argv,
  98.     **envp;
  99. {
  100.     int opt;
  101.     extern char *optarg;
  102.     extern int optind;
  103.     char    *myname,
  104.         *hostname;
  105.  
  106.     if (myname = rindex (argv[0], '/'))
  107.         myname++;
  108.     if (myname == NULL || *myname == NULL)
  109.         myname = argv[0];
  110.  
  111.     hostname = PLocalHostName ();
  112.  
  113.     while ((opt = getopt (argc, argv, "h:t:")) != EOF) {
  114.         switch (opt) {
  115.             case 'h':
  116.             hostname = optarg;
  117.             break;
  118.             case 't':
  119.             pptailor = optarg;
  120.             break;
  121.             default:
  122.             fprintf(stderr,
  123.                 "usage: %s [-h hostname] [-t tailor] msg ...\n",
  124.                 myname);
  125.             exit(1);
  126.         }
  127.     }
  128.     argv += optind;
  129.     argc -= optind;
  130.     if (argc < 1) {
  131.         fprintf(stderr,
  132.             "usage: %s [-h hostname] [-t tailor] msg ...\n",
  133.             myname);
  134.         exit(1);
  135.     }
  136.  
  137.     sys_init(myname);
  138.  
  139.     (void) ryinitiator (myname, hostname,
  140.                 argc, argv, myservice,
  141.                 table_Qmgr_Operations, dispatches, do_quit);
  142.     
  143.     exit(0);    /* NOT REACHED */
  144. }
  145.  
  146. /*   */
  147. /* OPERATIONS */
  148.  
  149. /* ARGSUSED */
  150. static int do_newmessage (sd, ds, args, arg)
  151. int                 sd;
  152. struct client_dispatch         *ds;
  153. char                 **args;
  154. struct type_Qmgr_MsgStruct     **arg;
  155. {
  156.     char         *file = NULL;
  157.     struct prm_vars    prm;
  158.     Q_struct    que;
  159.     ADDR        *sender = NULL;
  160.     ADDR        *recips = NULL;
  161.     int         rcount, result;
  162.     
  163.     result = OK;
  164.  
  165.     qinit (&que);
  166.     bzero ((char *)&prm, sizeof(prm));
  167.  
  168.     if ((file = *args++) == NULLCP)
  169.         result = NOTOK;
  170.  
  171.     if ((result == OK) 
  172.         && (rp_isbad(rd_msg(file,&prm,&que,&sender,&recips,&rcount)))) {
  173.         PP_LOG(LLOG_EXCEPTIONS,
  174.                ("Chans/qmgr-load/xqstart rd_msg err: '%s'",file));
  175.         result = NOTOK;
  176.     }
  177.  
  178.     /* unlock message */
  179.     rd_end();
  180.  
  181.     if ((result == OK) 
  182.         && ((*arg = qstruct2qmgr(file,&prm,&que,sender,recips,rcount)) == NULL)) {
  183.         PP_LOG(LLOG_EXCEPTIONS,
  184.                ("Chans/qmgr-load/xqstart qstruct2qmgr err: '%s'",file));
  185.         result = NOTOK;
  186.     }
  187.     
  188.     /* free all storage */
  189.     q_init(&que);
  190.  
  191.     return result;
  192. }
  193.  
  194. /* ARGSUSED */
  195. static int do_help (sd, ds, args)
  196. int                 sd;
  197. register struct client_dispatch *ds;
  198. char                 **args;
  199. {
  200.     printf("\nCommands are:\n");
  201.     for (ds = dispatches; ds->ds_name; ds++)
  202.         printf("%s\t%s\n", ds->ds_name, ds->ds_help);
  203.     return NOTOK;
  204. }
  205.  
  206. /* ARGSUSED */
  207. static int  do_quit (sd, ds, args)
  208. int     sd;
  209. struct client_dispatch *ds;
  210. char  **args;
  211. {
  212.     struct AcSAPrelease acrs;
  213.     register struct AcSAPrelease   *acr = &acrs;
  214.     struct AcSAPindication  acis;
  215.     register struct AcSAPindication *aci = &acis;
  216.     register struct AcSAPabort *aca = &aci -> aci_abort;
  217.  
  218.     if (AcRelRequest (sd, ACF_NORMAL, NULLPEP, 0, 
  219.               NOTOK, acr, aci) == NOTOK)
  220.         acs_adios (aca, "A-RELEASE.REQUEST");
  221.  
  222.     if (!acr -> acr_affirmative) {
  223.         (void) AcUAbortRequest (sd, NULLPEP, 0, aci);
  224.         adios (NULLCP, "Release rejected by peer: %d", acr -> acr_reason);
  225.     }
  226.  
  227.     ACRFREE (acr);
  228.  
  229.     exit (0);
  230.  
  231. }
  232.  
  233. /*   */
  234. /* RESULTS */
  235.  
  236. /* ARGSUSED */
  237. newmessage_result (sd, id, dummy, result, roi)
  238. int                    sd,
  239.                                     id,
  240.                                     dummy;
  241. struct type_Qmgr_Pseudo__newmessage     *result;
  242. struct RoSAPindication            *roi;
  243. {
  244.     return OK;
  245. }
  246.  
  247. /*   */
  248. /* ERRORS */
  249.  
  250. /* ARGSUSED */
  251. general_error (sd, id, error, parameter, roi)
  252. int     sd,
  253.     id,
  254.     error;
  255. caddr_t parameter;
  256. struct RoSAPindication *roi;
  257. {
  258.     register struct RyError *rye;
  259.  
  260.     if (error == RY_REJECT) {
  261.         advise (NULLCP, "%s", RoErrString ((int) parameter));
  262.         return OK;
  263.     }
  264.  
  265.     if (rye = finderrbyerr (table_Qmgr_Errors, error))
  266.         advise (NULLCP, "%s", rye -> rye_name);
  267.     else
  268.         advise (NULLCP, "Error %d", error);
  269.  
  270.     return OK;
  271. }
  272.