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

  1. /* tb_rtsparams.c: fetch X.400 RTS parameters */
  2.  
  3. # ifndef lint
  4. static char Rcsid[] = "@(#)$Header: /xtel/pp/pp-beta/Lib/table/RCS/tb_rtsparams.c,v 6.0 1991/12/18 20:24:28 jpo Rel $";
  5. # endif
  6.  
  7. /*
  8.  * $Header: /xtel/pp/pp-beta/Lib/table/RCS/tb_rtsparams.c,v 6.0 1991/12/18 20:24:28 jpo Rel $
  9.  *
  10.  * $Log: tb_rtsparams.c,v $
  11.  * Revision 6.0  1991/12/18  20:24:28  jpo
  12.  * Release 6.0
  13.  *
  14.  */
  15.  
  16.  
  17.  
  18. #include "util.h"
  19. #include "chan.h"
  20. #include "rtsparams.h"
  21. #include <isode/rtsap.h>
  22. #include <isode/cmd_srch.h>
  23.  
  24.  
  25. CMD_TABLE    rts_tbl[] = {
  26. #define RTSP_LMTA    1
  27.     "lmta",        RTSP_LMTA,
  28. #define RTSP_RMTA    2
  29.     "rmta",        RTSP_RMTA,
  30. #define RTSP_LPASS    3
  31.     "lpass",    RTSP_LPASS,
  32. #define RTSP_RPASS    4
  33.     "rpass",    RTSP_RPASS,
  34. #define RTSP_RPPNAME    5
  35.     "rname",    RTSP_RPPNAME,
  36. #define RTSP_MDINFO    6
  37.     "mdinfo",    RTSP_MDINFO,
  38. #define RTSP_LPSAP    7
  39.     "lpsap",    RTSP_LPSAP,
  40. #define RTSP_RPSAP    8
  41.     "rpsap",    RTSP_RPSAP,
  42. #define RTSP_MODE    9
  43.     "mode",        RTSP_MODE,
  44. #define RTSP_TYPE    10
  45.     "type",        RTSP_TYPE,
  46. #define RTSP_OTHER    11
  47.     "other",    RTSP_OTHER,
  48. #define RTSP_INFO    12
  49.     "info",        RTSP_INFO,
  50. #define RTSP_TRYNEXT    13
  51.     "trynext",    RTSP_TRYNEXT,
  52. #define RTSP_TRACE    14
  53.     "tracing",    RTSP_TRACE,
  54. #define RTSP_FIXORIG    15
  55.     "fix-orig",    RTSP_FIXORIG,
  56.     NULLCP,        -1
  57. };
  58.  
  59.  
  60.  
  61.  
  62. CMD_TABLE rts_info[] = {
  63. #define RTSINFO_MODE        1
  64.     "mode",            RTSINFO_MODE,
  65. #define RTSINFO_UNDEFINED    2
  66.     "undefined",        RTSINFO_UNDEFINED,
  67.     NULLCP,            -1
  68. };
  69.  
  70.  
  71.  
  72.  
  73. static char    def[] = "default";
  74.  
  75. static int    conv_entry(), conv_info();
  76.  
  77.  
  78.  
  79. /* ---------------------  Begin     Routines  -------------------------------- */
  80.  
  81.  
  82.  
  83.  
  84. RtsParams *tb_rtsparams(tbl, remote_site)
  85. Table    *tbl;
  86. char    *remote_site;
  87. {
  88.     RtsParams      *rp = NULL;
  89.     char        buffer[BUFSIZ];
  90.  
  91.     if (tbl == NULLTBL) {
  92.         PP_LOG(LLOG_EXCEPTIONS,
  93.                ("No incomming table specified for %s", remote_site));
  94.         return NULL;
  95.     }
  96.  
  97.     /* --- initialisation --- */
  98.     rp = (RtsParams *) smalloc(sizeof *rp);
  99.     bzero((char *) rp, sizeof *rp);
  100.     rp->rts_mode = RTS_MONOLOGUE;
  101.     rp->type = RTSP_1984;
  102.     rp->trace_type = RTSP_TRACE_ALL;
  103.     rp->our_passwd = strdup("");
  104.     rp->our_name = strdup("");
  105.  
  106.  
  107.     /* --- retrieve & convert the default entry --- */
  108.     if (tb_k2val(tbl, def, buffer, TRUE) == OK)
  109.         if (conv_entry(rp, buffer, def) == NOTOK)
  110.             goto tb_rtsparams_error;
  111.  
  112.     if (lexequ(def, remote_site) == 0)
  113.         return rp;
  114.  
  115.  
  116.     /* --- retrieve & convert the actual remote site entry --- */
  117.     if (tb_k2val(tbl, remote_site, buffer, TRUE) == NOTOK)
  118.         goto tb_rtsparams_error;
  119.  
  120.     if (conv_entry(rp, buffer, remote_site) == NOTOK)
  121.         goto tb_rtsparams_error;
  122.  
  123.     return rp;
  124.  
  125.  
  126. tb_rtsparams_error:;
  127.     RPfree(rp);
  128.     return NULL;
  129. }
  130.  
  131.  
  132.  
  133.  
  134. static int conv_entry(rp, buffer, remote_site)
  135. RtsParams    *rp;
  136. char        *buffer;
  137. char        *remote_site;
  138. {
  139.     int        argc;
  140.     char           *argv[100];
  141.     int        n;
  142.  
  143.     if ((argc = str2arg(buffer, 100, argv)) < 2) {
  144.         PP_LOG(LLOG_EXCEPTIONS,
  145.                ("Badly formatted table entry for %s (%s)",
  146.             remote_site, buffer));
  147.         return NOTOK;
  148.     }
  149.  
  150.  
  151.     for (n = 0; n < argc;) {
  152.         if (strcmp(argv[n], "=") != 0) {
  153.             PP_LOG(LLOG_EXCEPTIONS,
  154.                  ("Bad value %s for %s", argv[n], remote_site));
  155.             n++;
  156.             continue;
  157.         }
  158.         n++;
  159.         switch (cmd_srch(argv[n], rts_tbl)) {
  160.         case RTSP_LMTA:
  161.             if (rp->our_name)
  162.                 free(rp->our_name);
  163.             rp->our_name = strdup(argv[n + 1]);
  164.             break;
  165.         case RTSP_RMTA:
  166.             if (rp->their_name)
  167.                 free(rp->their_name);
  168.             rp->their_name = strdup(argv[n + 1]);
  169.             break;
  170.         case RTSP_LPASS:
  171.             if (rp->our_passwd)
  172.                 free(rp->our_passwd);
  173.             rp->our_passwd = strdup(argv[n + 1]);
  174.             break;
  175.         case RTSP_RPASS:
  176.             if (rp->their_passwd)
  177.                 free(rp->their_passwd);
  178.             rp->their_passwd = strdup(argv[n + 1]);
  179.             break;
  180.         case RTSP_RPPNAME:
  181.             if (rp->their_internal_ppname)
  182.                 free(rp->their_internal_ppname);
  183.             rp->their_internal_ppname = strdup(argv[n + 1]);
  184.             break;
  185.         case RTSP_MDINFO:
  186.             if (rp->md_info)
  187.                 free(rp->md_info);
  188.             rp->md_info = strdup(argv[n + 1]);
  189.             break;
  190.         case RTSP_LPSAP:
  191.             if (rp->our_address)
  192.                 free(rp->our_address);
  193.             rp->our_address = strdup(argv[n + 1]);
  194.             break;
  195.         case RTSP_RPSAP:
  196.             if (rp->their_address)
  197.                 free(rp->their_address);
  198.             rp->their_address = strdup(argv[n + 1]);
  199.             break;
  200.         case RTSP_MODE:
  201.             if (lexequ(argv[n + 1], "twa") == 0)
  202.                 rp->rts_mode = RTS_TWA;
  203.             else if (lexequ(argv[n + 1], "mon") == 0)
  204.                 rp->rts_mode = RTS_MONOLOGUE;
  205.             break;
  206.         case RTSP_TYPE:
  207.             if (lexequ(argv[n + 1], "1988-X410") == 0)
  208.                 rp->type = RTSP_1988_X410MODE;
  209.             else if (lexequ(argv[n + 1], "1988-NORMAL") == 0 ||
  210.                  lexequ(argv[n + 1], "1988") == 0)
  211.                 rp->type = RTSP_1988_NORMAL;
  212.             else if (lexequ(argv[n + 1], "1984") == 0)
  213.                 rp->type = RTSP_1984;
  214.             break;
  215.  
  216.         case RTSP_OTHER:
  217.         case RTSP_INFO:
  218.             if (conv_info (rp, argv[n + 1], remote_site) == NOTOK)
  219.                 return NOTOK;
  220.             break;
  221.  
  222.         case RTSP_TRACE:
  223.             if (lexequ(argv[n + 1], "admd") == 0)
  224.                 rp->trace_type = RTSP_TRACE_ADMD;
  225.             else if (lexequ(argv[n + 1], "nointernal") == 0)
  226.                 rp->trace_type = RTSP_TRACE_NOINT;
  227.             else if (lexequ(argv[n + 1], "local-internal") == 0)
  228.                 rp->trace_type = RTSP_TRACE_LOCALINT;
  229.             else
  230.                 rp->trace_type = RTSP_TRACE_ALL;
  231.             break;
  232.         case RTSP_TRYNEXT:
  233.             if (rp->try_next)
  234.                 free(rp->try_next);
  235.             rp->try_next = strdup(argv[n + 1]);
  236.             break;
  237.         case RTSP_FIXORIG:
  238.             if (rp->fix_orig)
  239.                 free(rp->fix_orig);
  240.             rp->fix_orig = strdup(argv[n + 1]);
  241.             break;
  242.         default:
  243.             PP_LOG(LLOG_EXCEPTIONS,
  244.                    (" Warning: Unknown keyword %s", argv[n]));
  245.             break;
  246.         }
  247.         n += 2;
  248.     }
  249.     return OK;
  250. }
  251.  
  252.  
  253.  
  254.  
  255. static int conv_info(rp, buffer, remote_site)
  256. RtsParams    *rp;
  257. char        *buffer;
  258. char        *remote_site;
  259. {
  260.     int        argc;
  261.     char           *argv[100];
  262.     int        n;
  263.  
  264.  
  265.     if ((argc = str2arg(buffer, 100, argv)) < 2) {
  266.         PP_LOG(LLOG_EXCEPTIONS,
  267.                ("Badly formatted table entry for %s (%s)",
  268.             remote_site, buffer));
  269.         return NOTOK;
  270.     }
  271.  
  272.  
  273.     for (n = 0; n < argc;) {
  274.         if (strcmp(argv[n], "=") != 0) {
  275.             PP_LOG(LLOG_EXCEPTIONS,
  276.                  ("Bad value %s for %s", argv[n], remote_site));
  277.             n++;
  278.             continue;
  279.         }
  280.         n++;
  281.         switch (cmd_srch(argv[n], rts_info)) {
  282.         case RTSINFO_MODE:
  283.             if (rp->info_mode)
  284.                 free(rp->info_mode);
  285.             rp->info_mode = strdup(argv[n + 1]);
  286.             break;
  287.         case RTSINFO_UNDEFINED:
  288.             if (rp->info_undefined)
  289.                 free(rp->info_undefined);
  290.             rp->info_undefined = strdup(argv[n + 1]);
  291.             break;
  292.         default:
  293.             PP_LOG(LLOG_EXCEPTIONS,
  294.                    (" Warning: Unknown keyword %s", argv[n]));
  295.             break;
  296.         }
  297.         n += 2;
  298.     }
  299.     return OK;
  300. }
  301.  
  302.  
  303.  
  304.  
  305. void RPfree(rp)
  306. RtsParams    *rp;
  307. {
  308.     PP_DBG(("RPfree()"));
  309.     if (rp == NULL)            return;
  310.     if (rp->their_name)        free(rp->their_name);
  311.     if (rp->their_passwd)        free(rp->their_passwd);
  312.     if (rp->their_internal_ppname)    free(rp->their_internal_ppname);
  313.     if (rp->their_address)        free(rp->their_address);
  314.     if (rp->our_name)        free(rp->our_name);
  315.     if (rp->our_passwd)        free(rp->our_passwd);
  316.     if (rp->our_address)        free(rp->our_address);
  317.     if (rp->md_info)        free(rp->md_info);
  318.     if (rp->try_next)        free(rp->try_next);
  319.     if (rp->info_mode)        free(rp->info_mode);
  320.     if (rp->info_undefined)        free(rp->info_undefined);
  321.     if (rp->fix_orig)        free(rp->fix_orig);
  322.     free((char *) rp);
  323. }
  324.