Annotation of 43BSDReno/contrib/isode-beta/doc/manual/q-dsap.tex, revision 1.1

1.1     ! root        1: % run this through LaTeX with the appropriate wrapper
        !             2: 
        !             3: \chapter {Programming the Directory}
        !             4: 
        !             5: This part of the manual is written for implementors who wish to access the
        !             6: Directory using the \man libdsap(3n) library.
        !             7: This might be an OSI application wishing to look up information,
        !             8: or an interactive Directory user-interface.
        !             9: The interface to the Directory is defined as a series of procedures which
        !            10: closely parallel the service defined in \cite{CCITT.Directory}.  This section
        !            11: defines the procedures,
        !            12: and shows how they relate to the standard.
        !            13: To avoid unnecessary wordiness, the user is expected to be familiar with
        !            14: the standard.
        !            15: 
        !            16: \section      {Conventions}
        !            17: \label{quipu_conv}
        !            18: 
        !            19: The library defines various C structures, described in the 
        !            20: following sections
        !            21: Associated with the C structures, are routines which:
        !            22: 
        !            23: \begin{itemize}
        !            24: \item allocate structures
        !            25: 
        !            26: \item free structures, including sub-structures
        !            27: 
        !            28: \item compare structures
        !            29: 
        !            30: \item copy structures
        !            31: 
        !            32: \item print structures
        !            33: 
        !            34: \item parse structures
        !            35: \end{itemize}
        !            36: 
        !            37: The following conventions are followed in many routines, which are then
        !            38: briefly identified later.
        !            39: For a general structure x, there will be the following routines:
        !            40: \begin{itemize}
        !            41: \item Allocation:
        !            42: \begin{quote}\small\begin{verbatim}
        !            43: struct x *x_alloc ()
        !            44: \end{verbatim}\end{quote}
        !            45: Allocate memory for structure \verb"x".
        !            46: 
        !            47: \item Freeing:
        !            48: \begin{quote}\small\begin{verbatim}
        !            49: x_free (a)
        !            50: struct x * a;
        !            51: \end{verbatim}\end{quote}
        !            52: Free structure \verb"x", and any nested structures.
        !            53: 
        !            54: If the structure, \verb"x", is a linked-list type of structure, then as well
        !            55: as the routines described above, there will be routines of the
        !            56: form \verb"x_comp_function" (where \verb"function" is \verb"alloc",
        !            57: \verb"free", and so on).  These act upon a single element of the
        !            58: list rather than the list as a whole.
        !            59: 
        !            60: \item Copying:
        !            61: \begin{quote}\small\begin{verbatim}
        !            62: struct x * x_cpy (a)
        !            63: struct x *a;
        !            64: \end{verbatim}\end{quote}
        !            65: Return a copy of structure \verb"a".
        !            66: 
        !            67: \item Comparing:
        !            68: \begin{quote}\small\begin{verbatim}
        !            69: int     x_cmp (a, b)
        !            70: struct x *a, *b;
        !            71: \end{verbatim}\end{quote}
        !            72: Return \verb"0" if the structures \verb"a" and \verb"b" same.  Return
        !            73: \verb"-1" if \verb"a<b", or \verb"1" if \verb"a>b".
        !            74: For some structures the notion of \verb"a>b" and \verb"a<b" is not defined,
        !            75: but will be consistent.
        !            76: 
        !            77: \item Printing:
        !            78: \begin{quote}
        !            79: \index{rdn\_print}\index{dn\_print}\index{as\_print}\index{avs\_print}
        !            80: \index{AttrT\_print}\index{AttrV\_print}
        !            81: \small\begin{verbatim}
        !            82: int     x_print (ps, a, format)
        !            83: PS       ps;
        !            84: struct x *a;
        !            85: int      format;
        !            86: \end{verbatim}\end{quote}
        !            87: Print the structure \verb"a" to the presentation stream \verb"ps", using the
        !            88: specified format, either \verb"READOUT", for a pretty-printed format (for
        !            89: example the output of a showentry from \pgm{dish}); or,
        !            90: \verb"EDBOUT", for a format suitable for inclusion in an EDB file.
        !            91: The \verb"PS" structure is described in \volone/ of this manual.
        !            92: 
        !            93: For the structures representing a DN and RDN there is an extra format:-
        !            94: \verb"DIROUT", which is used to get a representation of the name suitable
        !            95: for inclusion in a \unix/ filename (essentially \verb"EDBOUT" with the
        !            96: \verb"@" symbols replaced with \verb"/" separators).
        !            97: 
        !            98: \item String format:
        !            99: \begin{quote}
        !           100: \index{str2rdn}\index{str2dn}\index{str2as}
        !           101: \index{str2AttrV}\index{str2AttrT}
        !           102: \small\begin{verbatim}
        !           103: struct x * str2x (str)
        !           104: char * str;
        !           105: \end{verbatim}\end{quote}
        !           106: Most attribute syntaxes have a string representation.
        !           107: A string of the required 
        !           108: syntax can be converted to the relevant c structure with the ``str2x''
        !           109: function.
        !           110: Each of the string parsers assumes the input string has had multiple spaces
        !           111: and tabs removed, and replaced with single spaces.
        !           112: The function 
        !           113: \begin{quote}\small\begin{verbatim}
        !           114: char * Tidy_String (a)
        !           115: char * a;
        !           116: \end{verbatim}\end{quote}
        !           117: will do the relevant tidying if required.
        !           118: Strings printed with the \verb"EDBOUT" format of x\_print should be parsable.
        !           119: 
        !           120: NOTE \verb"str2AttrV()" \index{str2AttrV} does not follow the ``convention''
        !           121: and has an extra parameter, 
        !           122: which is the expected syntax
        !           123: of the string.
        !           124: 
        !           125: \item Decoding:
        !           126: \begin{quote}\small\begin{verbatim}
        !           127: x_decode (a)
        !           128: struct x *a;
        !           129: \end{verbatim}\end{quote}
        !           130: For efficiency reasons,
        !           131: when information is read from a DSA any
        !           132: structures that contain nested AttributeTypes and
        !           133: AttributeValues will not be fully decoded.
        !           134: This will not matter if
        !           135: you only intend to use the structures internally, but if you
        !           136: intend to show the structure to a ``user'' or write to a log file, 
        !           137: you should call this
        !           138: routine to complete the decoding, which will replace the
        !           139: various ``unfriendly'' structures (such as OID) with string
        !           140: representations.
        !           141: \end{itemize}
        !           142: 
        !           143: The structures following the ``convention'' are listed below.
        !           144: The ``prefix'' column shows the value
        !           145: \verb"x" should be replaced by to use the routines for the associated
        !           146:  structure.
        !           147: \index{RDN}
        !           148: \index{DN}
        !           149: \index{AttributeType}\index{AttrT}
        !           150: \index{AttributeValue}\index{AttrV}
        !           151: \index{AV\_Sequence}\index{avs}
        !           152: \index{Attr\_Sequence}\index{as}
        !           153: \index{EntryInfo}
        !           154: 
        !           155: 
        !           156: \[\begin{tabular}{|l|l|} \hline
        !           157: Structure & Prefix \\ \hline
        !           158: RDN & rdn \\
        !           159: DN & dn \\
        !           160: AttributeType & AttrT \\
        !           161: AttributeValue & AttrV \\
        !           162: AV\_Sequence & avs \\
        !           163: Attr\_Sequence & as \\
        !           164: EntryInfo& entryinfo \\ \hline
        !           165: \end{tabular}\]
        !           166: 
        !           167: \section {Attributes}
        !           168: 
        !           169: Attributes are fundamental
        !           170: components of the directory.  
        !           171: Attributes have two parts, types and values, which are
        !           172: (respectfully) represented by two structures,
        !           173: \verb"AttributeType" and \verb"AttributeValue".
        !           174: 
        !           175: For programing purposes you should include the file \file{quipu/attrvalue.h}
        !           176: into your programs, which contains the following structure definitions:-
        !           177: 
        !           178: \begin{quote}\index{AttributeType}\small\begin{verbatim}
        !           179: typedef struct {
        !           180:         OID              at_oid;
        !           181:         oid_table_attr * at_table;
        !           182: } attrType, * AttributeType;
        !           183: #define NULLAttrT (AttributeType) NULL
        !           184: \end{verbatim}\end{quote}
        !           185: 
        !           186: 
        !           187: The \verb"AttributeType" structure contains two components, only one
        !           188: of which is used at any one time.  An \verb"AttributeType" is defined
        !           189: in \cite{CCITT.Directory} as an OBJECT IDENTIFIER, hence the field
        !           190: \verb"at_oid".  
        !           191: 
        !           192: But
        !           193: \man libdsap(3n) goes further than this, and has a table (described in
        !           194: Section~\ref{oidtables}) which maps strings onto these OIDs.  The
        !           195: second field (\verb"at_table") is a pointer to this table.  The table
        !           196: then contains the OID.  
        !           197: 
        !           198: This table must be loaded by calling
        !           199: \begin{quote}\index{load\_oid\_table}\small\begin{verbatim}
        !           200: load_oid_table(name)
        !           201: char * name;
        !           202: \end{verbatim}\end{quote}
        !           203: The \verb"name" parameter should be the name of the oidtable to load.
        !           204: For most purposes this should be ``\verb"oidtable"''.
        !           205: 
        !           206: Before you load the table, any syntaxes you want special attribute handlers
        !           207: for should be loaded.  To do this you will probably want to call
        !           208: \label{quipusyntaxes}
        !           209: \begin{quote}
        !           210: \index{quipu\_syntaxes}
        !           211: \begin{verbatim}
        !           212: quipu_syntaxes()
        !           213: \end{verbatim}
        !           214: \end{quote}
        !           215: which will load all the syntax handlers defined in Chapter~\ref{syntaxes}.
        !           216: If not all there syntaxes are required, then a subset can be loaded by
        !           217: calling only the handlers required.
        !           218: 
        !           219: 
        !           220: The call
        !           221: \begin{quote}\index{dsap\_init}\small\begin{verbatim}
        !           222: dsap_init(argc,argv)
        !           223: int *argc;
        !           224: char *** argv;
        !           225: \end{verbatim}\end{quote}
        !           226: can be used to load the oidtable for you, with the additional 
        !           227: benifit that it will
        !           228: read the file \file{/etc/dsaptailor} to 
        !           229: find the location on the oidtable.
        !           230: The parameters it expects are the pointers to the 
        !           231: \verb"argc" and \verb"argv"
        !           232: parameters passed to your ``main()'' routine
        !           233: (Beware: \verb"dsap_init" removes certain flags from the parameter list, if you care,
        !           234: pass a copy of them, or pass nulls!).
        !           235: If a ``\tt -c\rm '' flag is found then this is used as the name of
        !           236: the DSA to contact as per dish (see Section~\ref{dish_bind}).
        !           237: Other parameters are ignored.
        !           238: As with loading the tables, the syntaxes you require should have been loaded
        !           239: before you make this call.
        !           240: 
        !           241: The oidtables are represented using the following structures:-
        !           242: \begin{quote}\index{oid\_table}\small\begin{verbatim}
        !           243: typedef struct {
        !           244:         char      ot_name [BUFSIZE];
        !           245:         char      ot_stroid [BUFSIZE];
        !           246:         OID       ot_oid;
        !           247: } oid_table;
        !           248: #define NULLTABLE ((oid_table * )0)
        !           249: 
        !           250: typedef struct {
        !           251:         oid_table oa_ot;
        !           252:         int       oa_syntax;
        !           253: } oid_table_attr;
        !           254: #define NULLTABLE_ATTR ((oid_table_attr *)0)
        !           255: \end{verbatim}\end{quote}
        !           256: 
        !           257: 
        !           258: As structures come across the network,
        !           259: the AttributeType is decoded into the \verb"at_oid" field.  If you
        !           260: want to use the string representation you must call
        !           261: \verb"AttrT_decode" (described in Section~\ref{quipu_conv}), 
        !           262: if you do not decode the structure, the
        !           263: print routines will still work, but the result will numeric
        !           264: OIDs.
        !           265: If successfully decoded the field \verb"at_oid" will be set to \verb"NULLOID",
        !           266: to indicate that there is a table version of the oid.
        !           267: 
        !           268: The table consists to two fields, an integer syntax :- \verb"oa_syntax".
        !           269: This is an integer handle onto the abstract syntax of the attribute value.
        !           270: The value `\verb"0"' indicates an unknown syntax hence ``ASN'' is used.
        !           271: 
        !           272: The second field \verb"oa_ot" is a reference to a \verb"oid_table" structure,
        !           273: which contain the oid -- \verb"ot_oid", a numeric string representation of the oid
        !           274: -- \verb"ot_stroid", and the local key string -- \verb"ot_name".
        !           275: 
        !           276: To create an \verb"AttributeType" given a string representation of an
        !           277: OID, you should use
        !           278: \begin{quote}\index{str2AttrT}\small\begin{verbatim}
        !           279: AttributeType str2AttrT (str)
        !           280: char   *str;
        !           281: \end{verbatim}\end{quote}
        !           282: which looks up the string ``\verb"str"'' in the OID table, and creates an
        !           283: \verb"AttributeType" structure.
        !           284: 
        !           285: There are various low level routines to manipulate entries in
        !           286: the OID table, however the \verb"AttributeType" routines described in 
        !           287: Section~\ref{quipu_conv}
        !           288: will be sufficient for most uses, so the details of these
        !           289: ``invisible'' routines are omitted here.
        !           290: 
        !           291: 
        !           292: Attribute values are represented by the structure \verb"AttributeValue":-
        !           293: 
        !           294: \begin{quote}\index{AttributeValue}\small\begin{verbatim}
        !           295: typedef struct attrVal {
        !           296:         short      av_syntax;
        !           297:         caddr_t           av_struct;
        !           298: } * AttributeValue;
        !           299: 
        !           300: #define NULLAttrV (AttributeValue) NULL
        !           301: \end{verbatim}\end{quote}
        !           302: 
        !           303: The \verb"AttributeValue" structure can hold attribute values in two
        !           304: formats. Firstly as a specialised {\em C\/} structure pointed to by
        !           305: \verb"av_struct", the
        !           306: field \verb"av_syntax" defines the syntax represented by the
        !           307: \verb"av_struct" field.
        !           308: Secondly as a presentation element (also in the \verb"av_struct" field), this is the case when an attribute has
        !           309: been received from the net, but not decoded (indicated by
        !           310: the syntax being zero).  The routine \verb"AttrV_decode"
        !           311: will burst this presentation element into the relevant \verb"av_struct"
        !           312: field.
        !           313: Section ~\ref{add_syntax} describes this more fully.
        !           314: 
        !           315: 
        !           316: Attribute values can now be linked together to form a multi-value attribute
        !           317: value.
        !           318: For this the \verb"AV_Sequence" structure is used.
        !           319: 
        !           320: \begin{quote}\index{AV\_Sequence}\small\begin{verbatim}
        !           321: typedef struct avseqcomp {     
        !           322:     attrVal             avseq_av;
        !           323:     struct avseqcomp    *avseq_next;
        !           324: } avseqcomp, *AV_Sequence;
        !           325: 
        !           326: #define NULLAV ((AV_Sequence) 0)
        !           327: \end{verbatim}\end{quote}
        !           328: 
        !           329: This is simply a linked list of AttributeValues\footnote{
        !           330: For those of you who wrote interfaces using ISODE-5.0, you should note that
        !           331: the field \verb+avseq\_av+ is now an \verb+attrVal+ and not an 
        !           332: \verb+attrVal *+.
        !           333: }.
        !           334: 
        !           335: To create an \verb"AV_Sequence" the two routines
        !           336: \begin{quote}\index{avs\_comp\_new}\index{avs\_merge}\small\begin{verbatim}
        !           337: AV_Sequence avs_comp_new (av)
        !           338: AttributeValue av;
        !           339: 
        !           340: AV_Sequence avs_merge (a,b)
        !           341: AV_Sequence a,b;
        !           342: \end{verbatim}\end{quote}
        !           343: can be used.
        !           344: 
        !           345: Finally an attribute can now be formed by linking the attribute type, and
        !           346: multiple attribute values using the \verb"AttrSequence" structure:-
        !           347: 
        !           348: \begin{quote}\index{Attr\_Sequence}\small\begin{verbatim}
        !           349: typedef struct attrcomp {       
        !           350:     attrType            attr_type;
        !           351:     AV_Sequence         attr_value;
        !           352:     struct attrcomp     *attr_link;
        !           353:     struct acl_info     *attr_acl;
        !           354: } attrcomp, *Attr_Sequence;
        !           355: 
        !           356: #define NULLATTR ((Attr_Sequence) 0)
        !           357: \end{verbatim}\end{quote}
        !           358: 
        !           359: This structure is used singularly to represent an attribute, and as a linked
        !           360: list (linked using \verb"attr_link") to represent a set of attributes.
        !           361: 
        !           362: To create an \verb"Attr_Sequence" the two routines
        !           363: \begin{quote}\index{as\_comp\_new}\index{as\_merge}\small\begin{verbatim}
        !           364: Attr_Sequence as_comp_new (at,as,acl)
        !           365: AttributeType at;
        !           366: AV_Sequence as;
        !           367: struct acl_info * acl;
        !           368: 
        !           369: Attr_Sequence as_merge (a,b)
        !           370: Attr_Sequence a,b;
        !           371: \end{verbatim}\end{quote}
        !           372: 
        !           373: can be used.
        !           374: The \verb"acl" parameter is only used by the DSA, for use in a DUA it should be
        !           375: set to \verb"NULLACL_INFO".
        !           376: 
        !           377: The routine
        !           378: \begin{quote}\index{as\_combine}\small\begin{verbatim}
        !           379: Attr_Sequence as_combine (as,str)
        !           380: AV_Sequence as;
        !           381: char * str;
        !           382: \end{verbatim}\end{quote}
        !           383: is also provided, as an optimisation of
        !           384: \begin{quote}\small\begin{verbatim}
        !           385: as_merge(as,str2as(str));
        !           386: \end{verbatim}\end{quote}
        !           387: 
        !           388: \section {Distinguished Names}
        !           389: The structures which define names are critical.  
        !           390: Names are essentially made up of attributes, but because of their
        !           391: importance, a different --- more specific structure is used.
        !           392: 
        !           393: \begin{quote}\index{RDN}\small\begin{verbatim}
        !           394: typedef struct rdncomp {       
        !           395:     attrType            rdn_at;
        !           396:     attrVal             rdn_av;
        !           397:     struct rdncomp      *rdn_next;
        !           398: } rdncomp, *RDN;
        !           399: 
        !           400: #define NULLRDN ((RDN) 0)
        !           401: \end{verbatim}\end{quote}
        !           402: 
        !           403: An RDN consists of a set of Attribute Types 
        !           404: (\verb"rdn_at"\footnote{This was an \verb+attrType *+ in ISODE-5.0})
        !           405: and Attribute Values 
        !           406: (\verb"rdn_av"\footnote{This was an \verb+attrVal *+ in ISODE-5.0}),
        !           407: the set is linked using \verb"rdn_next".
        !           408: 
        !           409: RDNs can the be joined in a sequence to form a Distinguished Name (DN):-
        !           410: \begin{quote}\index{DN}\small\begin{verbatim}
        !           411: typedef struct dncomp {
        !           412:     RDN                 dn_rdn;
        !           413:     struct dncomp       *dn_parent;
        !           414: } dncomp, *DN;
        !           415: 
        !           416: #define NULLDN ((DN) 0)
        !           417: \end{verbatim}\end{quote}
        !           418: 
        !           419: The following routines are provided in addition to the routines defined is
        !           420: Section~\ref{quipu_conv} to allow the user to create and manipulate names
        !           421: 
        !           422: \begin{itemize}
        !           423: \item Create a DN given an RDN:
        !           424: \begin{quote}\index{dn\_comp\_new}\small\begin{verbatim}
        !           425: dn_comp_new (rdn)
        !           426: RDN     rdn;
        !           427: \end{verbatim}\end{quote}
        !           428: 
        !           429: \item Append a DN to the end of another DN:
        !           430: \begin{quote}\index{dn\_append}\small\begin{verbatim}
        !           431: dn_append (dn1, dn2)
        !           432: DN      dn1,
        !           433:         dn2;
        !           434: \end{verbatim}\end{quote}
        !           435: \verb"dn2" is added to \verb"dn1".
        !           436: 
        !           437: \item Create a RDN given and AttributeType and AttributeValue:
        !           438: \begin{quote}\small\index{rdn\_comp\_new}\begin{verbatim}
        !           439: RDN rdn_comp_new (at, av)
        !           440: AttributeType  at;
        !           441: AttributeValue av;
        !           442: \end{verbatim}\end{quote}
        !           443: 
        !           444: \item Merge two RDNs:
        !           445: \begin{quote}\small\index{rdn\_merge}\begin{verbatim}
        !           446: RDN rdn_merge (rdn1, rdn2)
        !           447: RDN     rdn1,
        !           448:         rdn2;
        !           449: \end{verbatim}\end{quote}
        !           450: RDN's form a set, to make comparisons easier, this
        !           451: implementation assumes them to be ordered sets.  This routine
        !           452: takes two ordered RDN sets, and merges them.
        !           453: If RDNs received across the network are not ordered, the decoding
        !           454: process will order them for you.
        !           455: \end{itemize}
        !           456: 
        !           457: The approach to access control is defined in
        !           458: \cite{QUIPU.Design}.
        !           459: The representation of the attribute for access control is given by the
        !           460: structure shown below.  This closely follows the ASN.1
        !           461: definition.
        !           462: 
        !           463: \begin{quote}\small\begin{verbatim}
        !           464: struct acl_info {
        !           465:     int              acl_categories;
        !           466: #define ACL_NONE        0
        !           467: #define ACL_DETECT      1
        !           468: #define ACL_COMPARE     2
        !           469: #define ACL_READ        3
        !           470: #define ACL_ADD         4
        !           471: #define ACL_WRITE       5
        !           472:     int              acl_selector_type;
        !           473: #define ACL_ENTRY       0
        !           474: #define ACL_OTHER       1
        !           475: #define ACL_PREFIX      2
        !           476: #define ACL_GROUP       3
        !           477:     DN               acl_name;
        !           478:     struct acl_info *acl_next;
        !           479: };
        !           480: \end{verbatim}\end{quote}
        !           481: 
        !           482: The DN \verb"acl_name" is used for the type \verb"ACL_PREFIX" and
        !           483: \verb"ACL_OTHER" only.
        !           484: 
        !           485: \section {Adding New Syntaxes to QUIPU}
        !           486: \label{add_syntax}
        !           487: 
        !           488: It will probably be necessary to add knowledge of extra syntaxes to
        !           489: Directory User Interfaces as the range of applications grow.
        !           490: QUIPU has been designed to make this as easy as possible.
        !           491: 
        !           492: This section describes how you might do this, by adding knowledge
        !           493: of a \verb"FOOBAR" syntax to \man libdsap(3n) library.
        !           494: \verb"FOOBAR" is represented by the c structure
        !           495: ``\tt struct foobar \{\ldots\};\rm ''.
        !           496: 
        !           497: The DSA does not need to know about the new structure, as it will
        !           498: handle unknown syntaxes as blocks of ASN.1.
        !           499: 
        !           500: The procedure call
        !           501: \begin{quote}\small\begin{verbatim}
        !           502: add_attribute_syntax (sntx,enc,dec,parse,
        !           503:                       print,cpy,cmp,sfree,
        !           504:                       print_pe,approx,multiline)
        !           505: char *  sntx;
        !           506: IFP     enc,dec,parse,print,cpy,cmp,sfree,approx;
        !           507: char *  print_pe;
        !           508: char    multiline;
        !           509: \end{verbatim}\end{quote}
        !           510: is used to add knowledge of new attribute syntaxes to quipu.
        !           511: 
        !           512: The parameters are used as follows:-
        !           513: 
        !           514: \begin{describe}
        !           515: \item [\verb"sntx":] The string defining the syntax, in this case it should
        !           516: be \verb"Foobar". Any attributes defined as having the syntax ``Foobar'' in
        !           517: the oidtables will the be handled using the following routines.
        !           518: 
        !           519: \item [\verb"enc":] This is a function pointer to a routine that will convert
        !           520: a C structure representation of foobar into a presentation element that can
        !           521: be sent across the network.
        !           522: The routine is given a single parameter --- a pointer to the foobar structure,
        !           523: and is expected to return a PE.
        !           524: You are reminded of the \man pepy(1c) and \man posy(1c) utilities described
        !           525: in \volfour/ of this manual, they may be of help in creating this encoder.
        !           526: 
        !           527: \item [\verb"dec":] This performs the inverse of the above, it is passed a
        !           528: PE, and should return a C structure representation.
        !           529: 
        !           530: \item [\verb"parse":] Each syntax needs to have a representation that can
        !           531: be read from and written to an EDB file.  This defined routine should take
        !           532:  a single
        !           533: \verb"char *" argument and return a C structure representation.
        !           534: 
        !           535: \item [\verb"print":] This routine is used to print the syntax to a 
        !           536: \verb+PStream+\footnote{\verb+PStream+'s are discussed in \volone/ of this
        !           537: manual.}.
        !           538: The arguments are:
        !           539: \begin{quote}\small\begin{verbatim}
        !           540: foobar_print (ps,fb,format)
        !           541: PS ps;
        !           542: struct foobar * fb;
        !           543: int format;
        !           544: \end{verbatim}\end{quote}
        !           545: If \verb"format" is \verb"READOUT" the structure should be printed to the
        !           546: stream PS in a ``human readable'' manner, otherwise is should be printed
        !           547: in a form that can be parsed by the ``parse'' function.
        !           548: NOTE in many case both formats will be the same.
        !           549: 
        !           550: \item [\verb"cpy":] This function should take a foobar structure as a
        !           551: parameter and returns a copy of it.
        !           552: 
        !           553: \item [\verb"cmp":] A function that takes two foobar structures and compares
        !           554: them --- returning 0 if they are the same, 1 is the first is considered
        !           555: ``greater'' than the second, -1 otherwise.
        !           556: If there is no appropriate ordering for the syntax, return 2.
        !           557: If an error occurs during the comparison return -2.
        !           558: 
        !           559: \item[\verb"sfree":] A routine to free the structure foobar.
        !           560: 
        !           561: \item[\verb"print\_pe":] The name of an external process to `exec' when the
        !           562: \verb+READOUT+ option is supplied to the print routine.
        !           563: This is generally set to \verb+NULLCP+ which means the default `print'
        !           564: routine is used.
        !           565: 
        !           566: \item[\verb"approx":] A routine to perform approximate matching (if
        !           567: required).
        !           568: The routine should expect two parameters as shown:
        !           569: \begin{quote}
        !           570: \begin{verbatim}
        !           571: foobar_approx (a,b)
        !           572:     struct filter_item * a;
        !           573:     AV_Sequence b;
        !           574: \end{verbatim}
        !           575: \end{quote}
        !           576: The routine should return \verb+OK+ or \verb+NOTOK+ depending on whether 
        !           577: any attribute value in the \verb+AV_Sequence+ approximately matches the 
        !           578: \verb+filter_item+.
        !           579: 
        !           580: \item[\verb"multiline":] If \verb"TRUE" the multi-value attributes will be
        !           581: printed on separate lines:
        !           582: \begin{quote}\small\begin{verbatim}
        !           583: foobar = value1
        !           584: foobar = value2
        !           585: \end{verbatim}\end{quote}
        !           586: otherwise the attribute will be printed on one
        !           587: line:
        !           588: \begin{quote}\small\begin{verbatim}
        !           589: foobar = value1 & value2
        !           590: \end{verbatim}\end{quote}
        !           591: 
        !           592: \end{describe}
        !           593: 
        !           594: \subsection {Where to Add the Syntax Definition}
        !           595: 
        !           596: Where should you add this procedure call, to define the new syntaxes?
        !           597: 
        !           598: This depends on which applications you want to know about the syntax.
        !           599: If you want the DSA and all DUAs to know about the syntax, then this call
        !           600: should be added to libdsap, in the directory dsap/common.
        !           601: The file dsap/common/quipu\_sntx.c is where other similar calls are made.
        !           602: A small test program \verb"test" is included in the common directory, and is
        !           603: made with ``\verb+make test+''.  It takes as input a string representation of
        !           604: attributes, and exercises the handlers.
        !           605: If this works for your new attribute, then it should be safe to re-compile the
        !           606: DSA/DUA and try them.
        !           607: 
        !           608: If you only wish your DUAs to know about the new syntax, then add the call
        !           609: into you DUAs code, before loading the oidtables of calling \verb+dsap_init+.
        !           610: 

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.