|
|
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:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.