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

  1. /* syn_permit.c: */ 
  2.  
  3. # ifndef lint
  4. static char Rcsid[] = "@(#)$Header: /xtel/pp/pp-beta/Chans/lists/RCS/syn_permit.c,v 6.0 1991/12/18 20:10:43 jpo Rel $";
  5. # endif
  6.  
  7. /*
  8.  * $Header: /xtel/pp/pp-beta/Chans/lists/RCS/syn_permit.c,v 6.0 1991/12/18 20:10:43 jpo Rel $
  9.  *
  10.  * $Log: syn_permit.c,v $
  11.  * Revision 6.0  1991/12/18  20:10:43  jpo
  12.  * Release 6.0
  13.  *
  14.  */
  15.  
  16.  
  17.  
  18. #include "dlist.h"
  19. #include <isode/cmd_srch.h>
  20.  
  21. extern ORName * orName_cpy();
  22. extern ORName * orName_parse();
  23.  
  24. static permit_free (ptr)
  25. struct dl_permit * ptr;
  26. {
  27.     if (ptr->dp_type == DP_GROUP)
  28.         dn_free (ptr->dp_dn);
  29.     else
  30.         ORName_free (ptr->dp_or);
  31. }
  32.  
  33.  
  34. static struct dl_permit * permit_cpy (a)
  35. struct dl_permit * a;
  36. {
  37. struct dl_permit * result;
  38.  
  39.     result = (struct dl_permit *) smalloc (sizeof (struct dl_permit));
  40.     if ( (result->dp_type = a->dp_type) == DP_GROUP)
  41.         result->dp_dn = dn_cpy (a->dp_dn);
  42.     else
  43.         result->dp_or = orName_cpy (a->dp_or);
  44.  
  45.     return (result);
  46. }
  47.  
  48. static permit_cmp (a,b)
  49. struct dl_permit * a;
  50. struct dl_permit * b;
  51. {    
  52.     if (a->dp_type != b->dp_type)
  53.         return (a->dp_type > b->dp_type ? 1 : -1);
  54.  
  55.     if (a->dp_type == DP_GROUP) 
  56.         return (dn_cmp (a->dp_dn,b->dp_dn));
  57.     else
  58.         return (orName_cmp (a->dp_or,b->dp_or));
  59. }
  60.  
  61.  
  62. static permit_print (ps,p,format)
  63. register PS ps;
  64. struct   dl_permit* p;
  65. int format;
  66. {
  67.     if ((format == READOUT) || (format == UFNOUT)) {
  68.         if (p->dp_type == DP_GROUP) {
  69.             ps_print (ps,"Members of the X.500 Group:\n   ");
  70.             dn_print (ps,p->dp_dn,EDBOUT);
  71.             return;
  72.         }
  73.         switch (p->dp_type) {
  74.         case DP_INDIVIDUAL:
  75.             ps_print (ps,"The individual:\n   ");
  76.             break;
  77.         case DP_MEMBER:
  78.             ps_print (ps,"The members of the mail list:\n   ");
  79.             break;
  80.         case DP_PATTERN:
  81.             if ((p->dp_or != NULLORName) && (p->dp_or->on_or == NULLOR)) {
  82.                 ps_print (ps,"Anybody");
  83.                 return;
  84.             }
  85.             ps_print (ps,"Entities matching the OR pattern:\n   ");
  86.             break;
  87.         }
  88.         orName_print (ps, p->dp_or,UFNOUT);
  89.     } else {
  90.         switch (p->dp_type) {
  91.         case DP_GROUP:
  92.             ps_print (ps,"GROUP#");
  93.             dn_print (ps,p->dp_dn,format);
  94.             return;
  95.         case DP_INDIVIDUAL:
  96.             ps_print (ps,"INDIVIDUAL#");
  97.             break;
  98.         case DP_MEMBER:
  99.             ps_print (ps,"MEMBER#");
  100.             break;
  101.         case DP_PATTERN:
  102.             ps_print (ps,"PATTERN#");
  103.             break;
  104.         }
  105.         orName_print (ps, p->dp_or,format);        
  106.     }
  107. }
  108.  
  109.  
  110. static struct dl_permit* str2permit (str)
  111. char * str;
  112. {
  113. struct dl_permit * result;
  114. char * ptr;
  115. static CMD_TABLE permit_table [] = {
  116.     "GROUP",    DP_GROUP,
  117.     "INDIVIDUAL",    DP_INDIVIDUAL,
  118.     "MEMBER",    DP_MEMBER,
  119.     "PATTERN",    DP_PATTERN,
  120.     0,        -1,
  121. };
  122.  
  123.     if ( (ptr=index (str,'#')) == NULLCP) {
  124.         if (lexequ (str,"ALL") == 0) {
  125.             result = (struct dl_permit *) smalloc (sizeof (struct dl_permit));
  126.             result->dp_type = DP_PATTERN;
  127.             result->dp_or = (ORName *) smalloc (sizeof (ORName));
  128.             result->dp_or->on_dn = NULLDN;
  129.             result->dp_or->on_or = NULLOR;
  130.             return result;            
  131.         }    
  132.         parse_error ("seperator missing in permit '%s'",str);
  133.         return ((struct dl_permit *) NULL);
  134.     }
  135.  
  136.     result = (struct dl_permit *) smalloc (sizeof (struct dl_permit));
  137.     *ptr-- = 0;
  138.     if (isspace (*ptr)) 
  139.         *ptr = 0;
  140.     ptr++,ptr++;
  141.  
  142.     if ((result->dp_type = cmd_srch (str,permit_table)) == -1) {
  143.         parse_error ("unknown permit choice '%s'",str);
  144.          return ((struct dl_permit *) NULL);
  145.     }
  146.  
  147.     if (result->dp_type == DP_GROUP) {
  148.         if ((result->dp_dn = str2dn(ptr)) == NULLDN) 
  149.              return ((struct dl_permit *) NULL);
  150.     } else {
  151.         if ((result->dp_or = orName_parse(ptr)) == NULLORName)
  152.              return ((struct dl_permit *) NULL);
  153.     }
  154.  
  155.     if (result->dp_type == DP_MEMBER) {
  156.         if (result->dp_or->on_dn == NULLDN) {
  157.             parse_error ("Must specify X.500 name for member permission",NULLCP);
  158.             return ((struct dl_permit *) NULL);
  159.         }
  160.     }
  161.  
  162.     return (result);
  163. }
  164.  
  165. static PE permit_enc (m)
  166. struct dl_permit * m;
  167. {
  168. PE ret_pe;
  169.  
  170.         (void) encode_MD_DLSubmitPermission (&ret_pe,0,0,NULLCP,m);
  171.  
  172.     return (ret_pe);
  173. }
  174.  
  175. static struct dl_permit * permit_dec (pe)
  176. PE pe;
  177. {
  178.     struct dl_permit * m;
  179.  
  180.     if (decode_MD_DLSubmitPermission (pe,1,NULLIP,NULLVP,&m) == NOTOK) {
  181.         free ((char *)m);
  182.         return ((struct dl_permit *) NULL);
  183.     }
  184.  
  185.     return (m);
  186. }
  187.  
  188. permit_syntax ()
  189. {
  190.     (void) add_attribute_syntax ("DLSubmitPermission",
  191.         (IFP) permit_enc,    (IFP) permit_dec,
  192.         (IFP) str2permit,    permit_print,
  193.         (IFP) permit_cpy,    permit_cmp,
  194.         permit_free,        NULLCP,
  195.         NULLIFP,        TRUE);
  196. }
  197.