|
|
1.1 root 1: % run this through LaTeX with the appropriate wrapper
2:
3: \chapter {The Procedural DUA}
4: \label{DUA:proc}
5:
6: The \man libdsap(3n) library defines a set of procedure calls which
7: correspond to each
8: of the X.500 abstract operations.
9: This chapter describes those procedure calls.
10:
11: \section {Procedure Model}
12: \label{proc_model}
13:
14: Each operation is accessed via a procedure call of the same name as the
15: operation, prefixed by ``\verb"ds_"''.
16: The procedure is supplied an argument structure, and returns either an error
17: or result structure.
18: For example the \verb"read" operation is invoked by calling
19: \verb"ds_read (argument,error,result)".
20:
21: The return value of the procedures have the following common values, which
22: indicated whether an error or result is returned:-
23: \begin{describe}
24: \item [\verb"DS\_OK":] Operation completed successfully, the result
25: structure will have the corresponding result (if the operation generates
26: results).
27: \item [\verb"DS\_ERROR\_LOCAL":] Error within the DUA module.
28: \item [\verb"DS\_ERROR\_CONNECT":] Failed to connect to a remote DSA.
29: \item [\verb"DS\_ERROR\_PROVIDER":] Other OSI provider error.
30: \item [\verb"DS\_ERROR\_REMOTE":] Remote error. Further details will
31: be in the error parameter in the procedure call.
32: \item [\verb"DS\_X500\_ERROR":] This is the same as \verb"DS_ERROR_REMOTE".
33: \end{describe}
34: These values defined in \file{quipu/ds\_error.h}, which must be included
35: in your program (there are other return values defined here, but these
36: should only occur within the DSA, and should not be returned by a DUA call).
37:
38: \section {Common Parameters}
39: All of the DAP operations described in Sections \ref{dap:bind} to \ref{modifyrdn}
40: have certain common parameters in their arguments and results.
41: These structures are now described.
42:
43:
44: \subsection {Arguments}
45: \label{common_args}
46:
47: The common arguments are represented by the following structure:-
48: \begin{quote}\index{CommonArgs}\small\begin{verbatim}
49: typedef struct common_args {
50: ServiceControl ca_servicecontrol;
51: DN ca_requestor;
52: struct op_progress ca_progress;
53: int ca_aliased_rdns;
54: #define CA_NO_ALIASDEREFERENCED -1
55: struct security_parms * ca_security;
56: struct signature * ca_sig;
57: struct extension * ca_ext;
58: } CommonArgs;
59: \end{verbatim}\end{quote}
60:
61: The fields \verb"ca_ext", \verb"ca_progress", \verb"ca_requestor"
62: and \verb"ca_aliased_rdns" are provided as
63: they are defined within X.500. Neither the QUIPU DSA or DUA use these fields.
64:
65: The field \verb"ca_servicecontrol" is used to select the type of service
66: the DSA should provide, the structure is given below
67:
68: \begin{quote}\index{ServiceControl}\small\begin{verbatim}
69: typedef struct svccontrol {
70: int svc_options;
71: #define SVC_OPT_PREFERCHAIN 0X001
72: #define SVC_OPT_CHAININGPROHIBIT 0X002
73: #define SVC_OPT_LOCALSCOPE 0X004
74: #define SVC_OPT_DONTUSECOPY 0X008
75: #define SVC_OPT_DONTDERFERERENCEALIAS 0X010
76: char svc_prio;
77: #define SVC_PRIO_LOW 0
78: #define SVC_PRIO_MED 1
79: #define SVC_PRIO_HIGH 2
80: int svc_timelimit;
81: #define SVC_NOTIMELIMIT -1
82: int svc_sizelimit;
83: #define SVC_NOSIZELIMIT -1
84: int svc_scopeofreferral;
85: #define SVC_REFSCOPE_NONE -1
86: #define SVC_REFSCOPE_DMD 0
87: #define SVC_REFSCOPE_COUNTRY 1
88: } svccontrol, ServiceControl;
89: \end{verbatim}\end{quote}
90:
91: The values takes by each field within the ServiceControl
92: structure are described in full
93: in \cite{CCITT.Directory}.
94:
95: \subsection {Results}
96: \label{common_results}
97:
98: \begin{quote}\index{CommonResults}\small\begin{verbatim}
99: typedef struct common_results {
100: DN cr_requestor;
101: char cr_aliasdereferenced;
102: } common_results, CommonResults;
103: \end{verbatim}\end{quote}
104:
105: The filed \verb"cr_aliasdereferenced" is set to \verb"TRUE" if the base
106: object of the operation was an alias, and was dereferenced.
107:
108: The field \verb"cr_requestor" is provided as
109: it is are defined within X.500. Neither the QUIPU DSA or DUA use this field.
110:
111:
112: \section {Continuation References}
113: \label{cont_ref}
114:
115: ``Continuation References'' are returned by the directory when the operation
116: asked for could not be fully completed, in which case
117: the structure \verb"ContinuationRef" is returned as part of the error or
118: results structures.
119: The structure is explained below:-
120:
121: \begin{quote}\index{ContinuationRef}\small\begin{verbatim}
122: typedef struct continuation_ref {
123: DN cr_name;
124: struct op_progress cr_progress;
125: int cr_rdn_resolved;
126: #define CR_RDNRESOLVED_NOTDEFINED -1
127: int cr_aliasedRDNs;
128: #define CR_NOALIASEDRDNS -1
129: int cr_reftype;
130: #define RT_UNDEFINED -1
131: #define RT_SUPERIOR 1
132: #define RT_SUBORDINATE 2
133: #define RT_CROSS 3
134: #define RT_NONSPECIFICSUBORDINATE 4
135: struct access_point * cr_accesspoints;
136: struct continuation_ref *cr_next;
137: }continuation_ref, *ContinuationRef;
138: \end{verbatim}\end{quote}
139:
140: \begin{describe}
141: \item [\verb"cr\_name":] The DN that has only been partially explored.
142: \item [\verb"cr\_rdn\_resolved":] The number of RDNs in the name that have
143: been examined --- hence how far down the DIT the query has been taken.
144: \item [\verb"cr\_aliasedRDNs":] If \verb"TRUE" then some of the RDNs were
145: aliases.
146: \item [\verb"cr\_reftype":] The type of reference that was used to get this
147: information.
148: \item [\verb"cr\_accesspoints":] The access point of the DSA to
149: contact\footnote{The was an \verb+access\_point+, not \verb+access\_point *+ in
150: ISODE-5.0.}.
151: The structure for an access point is as follows:-
152: \begin{quote}\index{access\_point}\small\begin{verbatim}
153: struct access_point {
154: DN ap_name;
155: struct PSAPaddr *ap_address;
156: struct access_point *ap_next;
157: };
158: \end{verbatim}\end{quote}
159: \begin{describe}
160: \item [\verb"ap\_name":] The DN of the DSA to contact.
161: \item [\verb"ap\_address":] The address of the DSA (derivable from
162: the name)\footnote{The was an \verb+PSAPaddr+, not \verb+PSAPaddr *+ in
163: ISODE-5.0.}.
164: \item [\verb"ap\_next":] There may be more than one access point, hence they
165: form a linked list structure.
166: \end{describe}
167: \item [\verb"cr\_next":] There may be more than one access point, if so they form
168: a linked list structure.
169: \end{describe}
170:
171:
172: \section {Errors}
173:
174: All DAP operations return a common error structure, which maps closely
175: onto the service definitions.
176: An error is only returned if the operation failed, if successful (indicated
177: by the return value DS\_OK) the error structure returned is undefined.
178:
179: \begin{quote}\index{DSError}\small\begin{verbatim}
180: struct DSError {
181: int dse_type;
182: #define DSE_LOCALERROR -2
183: #define DSE_REMOTEERROR -1
184: #define DSE_NOERROR 0
185: #define DSE_ATTRIBUTEERROR 1
186: #define DSE_NAMEERROR 2
187: #define DSE_SERVICEERROR 3
188: #define DSE_REFERRAL 4
189: #define DSE_ABANDONED 5
190: #define DSE_SECURITYERROR 6
191: #define DSE_ABANDON_FAILED 7
192: #define DSE_UPDATEERROR 8
193: #define DSE_DSAREFERRAL 9
194: union {
195: struct DSE_attribute dse_un_attribute;
196: struct DSE_name dse_un_name;
197: struct DSE_service dse_un_service;
198: struct DSE_referral dse_un_referral;
199: struct DSE_abandon_fail dse_un_abandon_fail;
200: struct DSE_security dse_un_security;
201: struct DSE_update dse_un_update;
202: } dse_un;
203: };
204: \end{verbatim}\end{quote}
205:
206: The field \verb"dse_type" is used to indicate what sort of error has
207: occurred, and hence which structure from the union is used.
208:
209: The value \verb"DSE_LOCALERROR" is used to indicate that the
210: error came from within the DUA, there is no associated
211: structure in the union for this error.
212:
213: The value \verb"DSE_REMOTEERROR" is used to indicate that an
214: error occurred at the DSA end, and the request was rejected, again there is
215: no associated structure in the union for this error.
216:
217: The structures in the union for the other
218: error conditions are as described in the following Sections.
219:
220:
221: \subsection{Attribute Error}
222: \begin{quote}\small\begin{verbatim}
223: struct DSE_attribute {
224: DN DSE_at_name;
225: struct DSE_at_problem DSE_at_plist;
226: };
227: \end{verbatim}\end{quote}
228:
229: \begin{describe}
230: \item [\verb"DSE\_at\_name":] The name of the entry causing the error.
231: \item [\verb"DSE\_at\_plist":] A list of the errors:-
232: \begin{quote}\small\begin{verbatim}
233: struct DSE_at_problem {
234: int DSE_at_what;
235: #define DSE_AT_NOSUCHATTRIBUTE 1
236: #define DSE_AT_INVALIDATTRIBUTESYNTAX 2
237: #define DSE_AT_UNDEFINEDATTRIBUTETYPE 3
238: #define DSE_AT_INAPPROPRIATEMATCHING 4
239: #define DSE_AT_CONSTRAINTVIOLATION 5
240: #define DSE_AT_TYPEORVALUEEXISTS 6
241: AttributeType DSE_at_type;
242: AttributeValue DSE_at_value;
243: struct DSE_at_problem * dse_at_next;
244: };
245: #define DSE_AT_NOPROBLEM ((struct DSE_at_problem*)0)
246: \end{verbatim}\end{quote}
247:
248: The fields are used as follows:-
249: \begin{describe}
250: \item [\verb"DSE\_at\_what":] Indicates which error has occurred.
251: \item [\verb"DSE\_at\_type":] The attribute type causing the error.
252: \item [\verb"DSE\_at\_value":] The associated value (if any).
253: \item [\verb"dse\_at\_next":] There may be more than one such error --- if
254: so they form a linked list.
255: \end{describe}
256: \end{describe}
257:
258:
259:
260: \subsection{Name Error}
261: \begin{quote}\small\begin{verbatim}
262: struct DSE_name {
263: int DSE_na_problem;
264: #define DSE_NA_NOSUCHOBJECT 1
265: #define DSE_NA_ALIASPROBLEM 2
266: #define DSE_NA_INVALIDATTRIBIBUTESYNTAX 3
267: #define DSE_NA_ALIASDEREFERENCE 4
268: DN DSE_na_matched;
269: };
270: \end{verbatim}\end{quote}
271:
272: \verb"DSE_na_matched" is the part of the DN successfully matched.
273:
274: \subsection{Referral Errors}
275:
276: \begin{quote}\small\begin{verbatim}
277: struct DSE_referral {
278: ContininuationRef DSE_ref_candidates;
279: DN DSE_ref_prefix;
280: };
281: \end{verbatim}\end{quote}
282:
283: The continuation reference supplies information on how the continue the
284: query.
285: The structure is described in Section~\ref{cont_ref}
286:
287: The field \verb"DSE_ref_prefix" is for DSP only.
288:
289: Quipu-6.0 will, due to enhanced security, issue more ``referrals'' than
290: Quipu-5.0. You should now generally chase such referrals.
291:
292: \subsection{Security Error}
293: \label{error_sec}
294: \begin{quote}\small\begin{verbatim}
295: struct DSE_security {
296: int DSE_sc_problem;
297: #define DSE_SC_AUTHENTICATION 1
298: #define DSE_SC_INVALIDCREDENTIALS 2
299: #define DSE_SC_ACCESSRIGHTS 3
300: #define DSE_SC_INVALIDSIGNATURE 4
301: #define DSE_SC_PROTECTIONREQUIRED 5
302: #define DSE_SC_NOINFORMATION 6
303: };
304: \end{verbatim}\end{quote}
305:
306: \subsection{Service Error}
307: \label{error_ser}
308: \begin{quote}\small\begin{verbatim}
309: struct DSE_service {
310: int DSE_sv_problem;
311: #define DSE_SV_BUSY 1
312: #define DSE_SV_UNAVAILABLE 2
313: #define DSE_SV_UNWILLINGTOPERFORM 3
314: #define DSE_SV_CHAININGREQUIRED 4
315: #define DSE_SV_UNABLETOPROCEED 5
316: #define DSE_SV_INVALIDREFERENCE 6
317: #define DSE_SV_TIMELIMITEXCEEDED 7
318: #define DSE_SV_ADMINLIMITEXCEEDED 8
319: #define DSE_SV_LOOPDETECT 9
320: #define DSE_SV_UNAVAILABLECRITICALEXTENSION 10
321: #define DSE_SV_OUTOFSCOPE 11
322: #define DSE_SV_DITERROR 12
323: };
324: \end{verbatim}\end{quote}
325:
326: \subsection{Update Error}
327: \begin{quote}\small\begin{verbatim}
328: struct DSE_update {
329: int DSE_up_problem;
330: #define DSE_UP_NAMINGVIOLATION 1
331: #define DSE_UP_OBJECTCLASSVIOLATION 2
332: #define DSE_UP_NOTONNONLEAF 3
333: #define DSE_UP_NOTONRDN 4
334: #define DSE_UP_ALREADYEXISTS 5
335: #define DSE_UP_AFFECTSMULTIPLEDSAS 6
336: #define DSE_UP_NOOBJECTCLASSMODS 7
337: };
338: \end{verbatim}\end{quote}
339:
340: \subsection{Abandon Failure}
341: If an abandon operation fails then the following is used:-
342: \begin{quote}\small\begin{verbatim}
343: struct DSE_abandon_fail {
344: int DSE_ab_problem;
345: #define DSE_AB_NOSUCHOPERATION 1
346: #define DSE_AB_TOOLATE 2
347: #define DSE_AB_CANNOTABANDON 3
348: int DSE_ab_invokeid;
349: };
350: \end{verbatim}\end{quote}
351:
352: \subsection {Error Handling Procedures}
353:
354: The \man libdsap(3n) library has three routines for handling errors.
355:
356: \begin{quote}\index{ds\_error}\small\begin{verbatim}
357: ds_error (ps,error)
358: PS ps;
359: struct DSError * error;
360: \end{verbatim}\end{quote}
361:
362: This routine will take the error, and pretty-print the contents to the
363: PStream \verb"ps".
364:
365: \begin{quote}\index{log\_ds\_error}\small\begin{verbatim}
366: log_ds_error (error)
367: struct DSError * error;
368: \end{verbatim}\end{quote}
369:
370: This routine will take the error, print a simple message
371: in ``dsap\_log'' at ``LLOG\_EXCEPTIONS'' logging level, and a more detailed
372: report at ``LLOG\_TRACE'' logging level.
373:
374: \begin{quote}\small\begin{verbatim}
375: ds_error_free (err)
376: struct DSError * err;
377: \end{verbatim}\end{quote}
378:
379: This frees the embedded structures within the error structure, BUT NOT
380: \verb"DSError" itself.
381:
382: \section {Binding and Unbinding}
383: \label{dap:bind}
384:
385: Before operations may be invoked, the DUA must BIND to the DSA.
386:
387: The \verb"bind" procedure
388: \begin{quote}\index{secure\_ds\_bind}\small\begin{verbatim}
389: secure_ds_bind (arg, error, result)
390: struct ds_bind_arg * arg;
391: struct ds_bind_arg * result;
392: struct ds_bind_error * error;
393: \end{verbatim}\end{quote}
394: is used for this purpose.
395:
396: You will need to include \file{quipu/bind.h} to use this procedure.
397:
398: The \verb"ds_bind_arg" structure is defined as follows.
399: \begin{quote}\small\begin{verbatim}
400: struct ds_bind_arg {
401: int dba_version;
402: #define DBA_VERSION_V1988 0x001
403: int dba_auth_type;
404: #define DBA_AUTH_EXTERNAL -1
405: #define DBA_AUTH_NONE 0
406: #define DBA_AUTH_SIMPLE 1
407: #define DBA_AUTH_PROTECTED 2
408: #define DBA_AUTH_STRONG 3
409: char *dba_time1;
410: char *dba_time2;
411: struct random_number dba_r1;
412: struct random_number dba_r2;
413: DN dba_dn;
414: int dba_passwd_len;
415: #define DBA_MAX_PASSWD_LEN 512
416: char dba_passwd[DBA_MAX_PASSWD_LEN];
417: struct signature *dba_sig;
418: struct certificate_list *dba_cpath;
419: };
420: \end{verbatim}\end{quote}
421:
422: \begin{describe}
423: \item [\verb"dba\_version":] should always be set to
424: \verb"DBA_VERSION_V1988".
425: \item [\verb"dsa\_auth\_type":] is used to select the type of authentication
426: required.
427: \item [\verb"dba\_dn":] is the name of the entity you wish to bind as, this
428: can be \verb"NULLDN" if you only require access to ``publically readable''
429: information.
430: \item [\verb"dba\_passwd":] The password required to bind as the entity.
431: This will be checked against the ``userPassword'' attribute in the entity.
432: \item [\verb"dba\_passwd\_len"] The length of the string in
433: \verb"dsa_passwd".
434: \item [\verb"dba\_sig"] The strong authentication signature (must be
435: provided if strong authentication is used).
436: \item [\verb"dba\_cpath"] The strong authentication certification path
437: (optional).
438: \item [\verb"dba\_time1"] Used for protected and strong authentication.
439: \item [\verb"dba\_time2"] Optionally used for protected simple authentication.
440: \item [\verb"dba\_r1"] Random number used for protected and strong
441: authentication.
442: \item [\verb"dba\_r2"] Optionally used for protected simple
443: authentication.
444: \end{describe}
445:
446: The \verb"bind" operation will try to connect to the DSA, whose address is
447: defined in the external \verb"char *", ``\verb"dsa_address"'', the syntax of
448: the string is that of an ISODE PSAP address.
449:
450: If \verb"secure_ds_bind()" returns \verb"DS_OK", then you have a successful connection,
451: otherwise a \verb"ds_bind_error" structure will inform you
452: of the error condition.
453:
454: \begin{quote}\small\begin{verbatim}
455: struct ds_bind_error {
456: int dbe_version;
457: char dbe_type;
458: #define DBE_TYPE_SERVICE 0
459: #define DBE_TYPE_SECURITY 1
460: int dbe_value;
461: };
462: \end{verbatim}\end{quote}
463:
464: The filed \verb"dbe_value" takes a value as defined for a \verb"DSE_security"
465: or \verb"DSE_service" error shown in Sections \ref{error_sec} and
466: \ref{error_ser}.
467:
468: \subsection{No Authentication}
469:
470: To bind without using any authentication,
471: \verb+dsa_auth_type+ should be set to \verb+DBA_AUTH_NONE+.
472: The fields \verb+dba_version+ and \verb+dba_dn+ must be filled in.
473:
474: \subsection{Simple Authentication}
475:
476: To bind using simple authentication,
477: the \verb+dsa_auth_type+ field should be set to the value
478: \verb+DBA_AUTH_SIMPLE+.
479: The fields \verb+dba_version+, \verb+dba_dn+,
480: \verb+dba_passwd+ and \verb+dba_passwd_len+ must be filled in.
481:
482: For backwards compatibility the routine
483: \begin{quote}\index{ds\_bind}\small\begin{verbatim}
484: ds_bind (arg, error, result)
485: struct ds_bind_arg * arg;
486: struct ds_bind_arg * result;
487: struct ds_bind_error * error;
488: \end{verbatim}\end{quote}
489: is still supplied, and gives you a unprotected simple bind request.
490:
491:
492: \subsection{Protected Simple Authentication}
493:
494: To bind using protected simple authentication,
495: the \verb+dsa_auth_type+ field should be set to to the value
496: \verb+DBA_AUTH_PROTECTED+.
497: The fields \verb+dba_version+, \verb+dba_dn+, \verb+dba_time1+, \verb+dba_r1+,
498: \verb+dba_passwd+ and \verb+dba_passwd_len+ must be filled in. The fields
499: \verb+dba_time2+ and \verb+dba_r2+ must be either filled in or set to
500: \verb+NULL+.
501:
502: \subsection{Strong Authentication}
503:
504: To bind using strong authentication,
505: the \verb+dsa_auth_type+ field should be set to the value
506: \verb+DBA_AUTH_STRONG+.
507: The fields \verb+dba_version+, \verb+dba_dn+, \verb+dba_time1+, \verb+dba_r1+,
508: and \verb+dba_sig+ must be filled in. The field
509: \verb+dba_cpath+ must be either filled in or set to \verb+NULL+.
510:
511: \section{Unbind}
512:
513: The unbind operation has no parameters.
514: \begin{quote}\index{ds\_unbind}\small\begin{verbatim}
515: ds_unbind ()
516: \end{verbatim}\end{quote}
517: and is used to disconnect from the directory.
518:
519: \section {Read}
520:
521: The read operation is used to access information from a particular
522: entity in the DSA.
523:
524: \begin{quote}\index{ds\_read}\small\begin{verbatim}
525: ds_read (arg, error, result)
526: struct ds_read_arg * arg;
527: struct ds_read_result * result;
528: struct DSError * error;
529: \end{verbatim}\end{quote}
530:
531: You will need to include \file{quipu/read.h} to use this procedure.
532:
533: The argument \verb"ds_read_arg" is used to formulate the DAP request:-
534:
535: \begin{quote}\small\begin{verbatim}
536: struct ds_read_arg {
537: CommonArgs rda_common;
538: DN rda_object;
539: EntryInfoSelection rda_eis;
540: };
541: \end{verbatim}\end{quote}
542:
543: The parameters are used as follows:-
544: \begin{describe}
545: \item [\verb"rda\_common":] The common arguments as described in
546: Section~\ref{common_args}
547: \item [\verb"rda\_object":] The DN of the object you want to read
548: \item [\verb"rda\_eis":] The ``Entry Information Selection'', which defines
549: which attributes you want to be returned, this is defined in
550: Section~\ref{eis}
551: \end{describe}
552:
553: The results returned on a \verb"DS_OK" return form the structure shown below:-
554:
555: \begin{quote}\small\begin{verbatim}
556: struct ds_read_result {
557: CommonResults rdr_common;
558: EntryInfo rdr_entry;
559: };
560: \end{verbatim}\end{quote}
561:
562: \begin{describe}
563: \item [\verb"rdr\_common":] The common results as described in
564: Section~\ref{common_results}
565: \item [\verb"rdr\_entry":] The ``Entry Information'', which contains the
566: attributes you requested. The structure is defined in Section~\ref{einfo}.
567: \end{describe}
568:
569: \subsection {Entry Information Selection}
570: \label{eis}
571:
572: Operations that return an Entry Information structure, will have an ``Entry
573: Information Selection'' in their arguments to specify exactly what the DSA
574: should return. The structure is represented thus:-
575:
576: \begin{quote}\index{EntryInfoSelection}\small\begin{verbatim}
577: typedef struct {
578: char eis_allattributes;
579: Attr_Sequence eis_select;
580: char eis_infotypes;
581: #define EIS_ATTRIBUTETYPESONLY 0
582: #define EIS_ATTRIBUTESANDVALUES 1
583: } EntryInfoSelection;
584: \end{verbatim}\end{quote}
585:
586: The parameters are used as follows:-
587: \begin{describe}
588: \item [\verb"eis\_allattributes":] If \verb"TRUE" the all attributes are
589: required.
590: \item [\verb"eis\_select":] If \verb"eis_allattributes" is \verb"FALSE" then
591: this field is used to specify the attributes you want.
592: ONLY the attribute types of this structure need to be set, any attribute
593: values will be ignored.
594: \item [\verb"eis\_infotypes":] If \verb"EIS_ATTRIBUTETYPESONLY" is set, then
595: only attribute types will be returned, otherwise the
596: values will also be returned.
597: \end{describe}
598:
599: \subsection {Entry Information}
600: \label{einfo}
601:
602: The structure ``Entry Information'' is used by some of the operations to
603: return data to the DUA.
604:
605: \begin{quote}\index{EntryInfo}\small\begin{verbatim}
606: typedef struct entrystruct {
607: DN ent_dn;
608: Attr_Sequence ent_attr;
609: int ent_iscopy;
610: #define INFO_MASTER 0x000
611: #define INFO_COPY 0x001
612: #define INFO_CACHE 0x002
613: time_t ent_age;
614: struct entrystruct *ent_next;
615: } entrystruct, EntryInfo;
616: \end{verbatim}\end{quote}
617:
618: The parameters are used as follows:-
619: \begin{describe}
620: \item [\verb"ent\_dn":] The DN of the entry.
621: \item [\verb"ent\_attr":] The requested attributes of the requested entry.
622: \item [\verb"ent\_iscopy":] This is either \verb"INFO_MASTER" or
623: \verb"INFO_COPY" indicating whether master data or
624: copied data was used to generate the results.
625: \verb"INFO_CACHE" is not applicable to a DUA.
626: \item [\verb"ent\_age":] This field is for DSA use only.
627: \item [\verb"ent\_next":] There may be many results, this is used to link them.
628: \end{describe}
629:
630: NOTE, the fields \verb"ent_dn" and \verb"ent_attr" will only be partially
631: decoded when this structure is returned.
632: You should call the routines \verb"dn_decode()" and \verb"as_decode()"
633: described in Section~\ref{quipu_conv} if you want to use the structures
634: fully decoded.
635:
636: \section {Compare}
637:
638: The compare operation is used to compare an asserted attribute, with an
639: attribute in the directory.
640:
641: \begin{quote}\index{ds\_compare}\small\begin{verbatim}
642: ds_compare (arg, error, result)
643: struct ds_compare_arg * arg;
644: struct ds_compare_result * result;
645: struct DSError * error;
646: \end{verbatim}\end{quote}
647:
648: You will need to include \file{quipu/compare.h} to use this procedure.
649:
650: The argument is as follows:-
651: \begin{quote}\small\begin{verbatim}
652: struct ds_compare_arg {
653: CommonArgs cma_common;
654: DN cma_object;
655: AVA cma_purported;
656: };
657: \end{verbatim}\end{quote}
658:
659: \begin{describe}
660: \item [\verb"cma\_common":] The common arguments as described in
661: Section~\ref{common_args}.
662: \item [\verb"cma\_object":] The DN of the object you want to attribute
663: against.
664: \item [\verb"cma\_purported":] The attribute you want to compare. This
665: structure is defined in Section~\ref{ava}.
666: \end{describe}
667:
668: If successful, the result structure is as follows:-
669: \begin{quote}\small\begin{verbatim}
670: struct ds_compare_result {
671: CommonResults cmr_common;
672: DN cmr_object;
673: char cmr_matched;
674: char cmr_iscopy;
675: };
676: \end{verbatim}\end{quote}
677:
678: \begin{describe}
679: \item [\verb"cmr\_common":] The common results as described in
680: Section~\ref{common_results}.
681: \item [\verb"cmr\_object":] The DN of the entry the attribute was compared
682: against. This may not be the same as the DN supplied in the argument (e.g.,
683: if an alias was dereferenced).
684: \item [\verb"cmr\_matched":] If \verb"TRUE" then the attributes were the
685: same, otherwise they were different.
686: \item [\verb"cmr\_iscopy":] If \verb"TRUE" then the compare took place
687: against a copy of the attribute.
688: \end{describe}
689:
690:
691: \subsection {Attribute Value Assertion}
692: \label{ava}
693:
694: An ``Attribute Value Assertion'' is used by some of the operations to
695: specify an attribute type/value pair, the structure used in this case is
696: shown below.
697:
698: \begin{quote}\index{AVA}\small\begin{verbatim}
699: typedef struct {
700: AttributeType ava_type;
701: AttributeValue ava_value;
702: }AVA;
703: \end{verbatim}\end{quote}
704:
705: \section {List}
706:
707: The list operation is show below.
708: This returns a list of subordinates of the specified entry.
709:
710: \begin{quote}\index{ds\_list}\small\begin{verbatim}
711: ds_list (arg, error, result)
712: struct ds_list_arg * arg;
713: struct ds_list_result * result;
714: struct DSError * error;
715: \end{verbatim}\end{quote}
716:
717: You will need to include \file{quipu/list.h} to use this procedure.
718:
719: \begin{quote}\small\begin{verbatim}
720: struct ds_list_arg {
721: CommonArgs lsa_common;
722: DN lsa_object;
723: };
724: \end{verbatim}\end{quote}
725:
726: \begin{describe}
727: \item [\verb"lsa\_common":] The common arguments as described in
728: Section~\ref{common_args}.
729: \item [\verb"lsa\_object":] The DN of the object you want to list the
730: children of.
731: \end{describe}
732:
733: The results of a successful list form the following structure:-
734:
735: \begin{quote}\small\begin{verbatim}
736: struct ds_list_result {
737: CommonResults lsr_common;
738: DN lsr_object;
739: time_t lsr_age;
740: struct subordinate * lsr_subordinates;
741: int lsr_limitproblem;
742: #define LSR_NOLIMITPROBLEM 0
743: #define LSR_TIMELIMITEXCEEDED 1
744: #define LSR_SIZELIMITEXCEEDED 2
745: #define LSR_ADMINSIZEEXCEEDED 3
746: ContinuationRef lsr_cr;
747: };
748: \end{verbatim}\end{quote}
749:
750: \begin{describe}
751: \item [\verb"lsr\_common":] The common results as described in
752: Section~\ref{common_results}.
753: \item [\verb"lsr\_object":]The DN of the entry whose children were listed.
754: This may not be the same as the DN supplied in the argument (e.g.,
755: if an alias was dereferenced).
756: \item [\verb"lsr\_age";] Not currently used.
757: \item [\verb"lsr\_subordinates":] This structure contains the RDNs
758: that were found below the base object. The structure is as follows:-
759: \begin{quote}\small\begin{verbatim}
760: struct subordinate {
761: RDN sub_rdn;
762: char sub_aliasentry;
763: char sub_copy;
764: struct subordinate * sub_next;
765: };
766: \end{verbatim}\end{quote}
767:
768: \begin{describe}
769: \item [\verb"sub\_rdn":] The RDN of this child.
770: \item [\verb"sub\_aliasentry":] If \verb"TRUE" then it is an alias entry.
771: \item [\verb"sub\_copy":] If \verb"TRUE" then the list took place
772: against a copy of the object.
773: \item [\verb"sub\_next":] A pointer to the next element in the list.
774: \end{describe}
775:
776: \item [\verb"lsr\_limitproblem":] If NON zero, then the specified limit
777: problem occurred during the operation.
778: \item [\verb"lsr\_cr":] A list of continuation references.
779: Continuation References are described in
780: Section~\ref{cont_ref}.
781: \end{describe}
782:
783: \section {Search}
784: \label{proc_search}
785: The search operation performs a key Directory functionality. This is done on
786: the basis of
787: filters as described in Section~\ref{filters} below
788: The operation is defined as:-
789: \begin{quote}\index{ds\_search}\small\begin{verbatim}
790: ds_search (arg, error, result)
791: struct ds_search_arg * arg;
792: struct ds_search_result * result;
793: struct DSError * error;
794: \end{verbatim}\end{quote}
795:
796: You will need to include \file{quipu/ds\_search.h} to use this procedure.
797:
798: \begin{quote}\small\begin{verbatim}
799: struct ds_search_arg {
800: CommonArgs sra_common;
801: DN sra_baseobject;
802: int sra_subset;
803: #define SRA_BASEOBJECT 0
804: #define SRA_ONELEVEL 1
805: #define SRA_WHOLESUBTREE 2
806: Filter sra_filter;
807: char sra_searchalias;
808: EntryInfoSelection sra_eis;
809: };
810: \end{verbatim}\end{quote}
811:
812: \begin{describe}
813: \item [\verb"sra\_common":] The common arguments as described in
814: Section~\ref{common_args}.
815: \item [\verb"sra\_baseobject":] The DN of the object you want to start the
816: search from.
817: \item [\verb"sra\_subset":] This specifies which part of the DIT to search.
818: \item [\verb"sra\_filter":] The filter to apply to the searched entries to
819: see if the entry is required. Filters are discussed in Section~\ref{filters}
820: \item [\verb"sra\_searchalias":] If \verb+TRUE+ aliases encountered below
821: the search baseobject are dereferenced, and the dereferenced object searched.
822: Note how this is different to the service control
823: ``\verb+dontderferencealiases+ which is used to control dereferencing of
824: entities above the base object.
825: \item [\verb"sra\_eis":] The ``Entry Information Selection'', which defines
826: which attributes you want to be returned (if the filter is matched),
827: this is defined in Section \ref{eis}.
828: \end{describe}
829:
830: The results form the following structure:-
831:
832: \begin{quote}\small\begin{verbatim}
833: struct ds_search_result {
834: char srr_correlated;
835: union {
836: struct ds_search_unit * srr_unit;
837: struct ds_search_result * srr_parts;
838: } srr_un;
839: struct ds_search_result * srr_next;
840: };
841: \end{verbatim}\end{quote}
842:
843: \begin{describe}
844: \item [\verb"srr\_correlated":] If \verb"TRUE" the the results are
845: said to be correlated, that is, there will only be one element
846: in the list of search results.
847: A DSA may return uncorrelated result, in which case the routine
848: \begin{quote}\index{correlate\_search\_results}\small\begin{verbatim}
849: correlate_search_results(sr_res)
850: struct ds_search_result * sr_res;
851: \end{verbatim}\end{quote}
852: can be called, which will correlate the results.
853:
854: NOTE QUIPU DSAs will always return correlated results.
855:
856: \item [\verb"srr\_un":] If the results are uncorrelated then the
857: union will contain a nested \verb"ds_search_result" structure, which
858: contains a list of the uncorrelated results.
859:
860: If the results are correlated, then this union will
861: contain a pointer to the correlated results. These form the structure
862: \begin{quote}\small\begin{verbatim}
863: struct ds_search_unit {
864: CommonResults srr_common;
865: DN srr_object;
866: EntryInfo * srr_entries;
867: int srr_limitproblem;
868: ContinuationRef srr_cr;
869: };
870: #define CSR_common srr_un.srr_unit->srr_common
871: #define CSR_object srr_un.srr_unit->srr_object
872: #define CSR_entries srr_un.srr_unit->srr_entries
873: #define CSR_limitproblem srr_un.srr_unit->\
874: srr_limitproblem
875: #define CSR_cr srr_un.srr_unit->srr_cr
876: \end{verbatim}\end{quote}
877: NOTE the \verb"#define"s to access the elements of this structure.
878: The fields are used as follows:
879: \begin{describe}
880: \item [\verb"srr\_common":] The common results as described in
881: \ref{common_results}.
882: \item [\verb"srr\_object":] The DN of the entry used as the base object of
883: the search. This may not be the same as the DN supplied in the argument (e.g.,
884: if an alias was dereferenced).
885: \item [\verb"srr\_entries":] The ``Entry Information'', which contains the
886: attributes you requested. The structure is defined in Section \ref{einfo}.
887: \item [\verb"srr\_limitproblem":] If NON zero, then the specified limit
888: problem occurred during the operation.
889: \item [\verb"srr\_cr":] A list of continuation references.
890: Continuation References are described in
891: Section~\ref{cont_ref}.
892: \end{describe}
893:
894: \item [\verb"srr\_next":] This is a pointer to the next
895: result in a list of uncorrelated results.
896: \end{describe}
897:
898: \subsection {Filters}
899: \label{filters}
900:
901: A filter in its simplest sense is a single \verb"filter_item". This is
902: used to perform one of six basic tests on one attribute of an entry.
903: If the ``match'' is good, then the entry is returned as part of
904: the search result structure.
905: The six basic types of \verb"filter_item"
906: are represented by the structure below:-
907:
908: \begin{quote}\index{filter\_item}\small\begin{verbatim}
909: struct filter_item {
910: int fi_type;
911: #define FILTERITEM_EQUALITY 0
912: #define FILTERITEM_SUBSTRINGS 1
913: #define FILTERITEM_GREATEROREQUAL 2
914: #define FILTERITEM_LESSOREQUAL 3
915: #define FILTERITEM_PRESENT 4
916: #define FILTERITEM_APPROX 5
917: union {
918: AttributeType fi_un_type;
919: AVA fi_un_ava;
920: Filter_Substrings fi_un_substrings;
921: } fi_un;
922: IFP fi_ifp;
923: };
924: \end{verbatim}\end{quote}
925:
926: \begin{describe}
927: \item [\verb"fi\_type":] Defines the type of \verb"filter_item" being represented.
928: \item [\verb"fi\_un.fi\_un\_type":] \verb"FILTERITEM_PRESENT"
929: matches, just supply an AttributeType, an entry matches if this attribute
930: exists within the entry.
931:
932: \item [\verb"fi\_un.fi\_un\_ava":] \verb"FILTERITEM_EQUALITY",
933: \verb"FILTERITEM_GREATEROREQUAL", \verb"FILTERITEM_LESSOREQUAL", and
934: \verb"FILTERITEM_APPROX" searches all
935: take an AVA (Attribute Value Assertion) structure, and return the entries
936: for which the attribute in the entry matches the asserted value.
937: The AVA structure is defined in Section~\ref{ava}.
938:
939: \item [\verb"fi\_un.un\_substrings":]
940: \verb"FILTERITEM_SUBSTRING" matches, use the substring structure defined below, to specify
941: which substrings to look for in the appropriate attribute.
942:
943: \begin{quote}\small\begin{verbatim}
944: typedef struct {
945: AttributeType fi_sub_type;
946: AV_Sequence fi_sub_initial;
947: AV_Sequence fi_sub_any;
948: AV_Sequence fi_sub_final;
949: } Filter_Substrings;
950: \end{verbatim}\end{quote}
951:
952: The \verb"AV_Sequence" structure is used to represent a string, and should be
953: treated as essentially a linked list of \verb"char *" parameters.
954: \begin{describe}
955: \item [\verb"fi\_sub\_type":] The attribute that you want to perform a
956: substring search on.
957: \item [\verb"fi\_sub\_initial":] This contains a single attribute value,
958: that must appear at the start of the string.
959: \item [\verb"fi\_sub\_any":] A set of values, which must appear in order in
960: the middle of the string.
961: \item [\verb"fi\_sun\_final":] This contains a single attribute value,
962: that must appear at the end of the string.
963: \end{describe}
964: \item [\verb"fi\_ifp":] For DSA use only.
965: \end{describe}
966:
967: The single filter items can now be linked into a \verb"filter" structure
968: to build more complex search definitions:-
969:
970: \begin{quote}\index{filter}\small\begin{verbatim}
971: typedef struct filter {
972: char flt_type;
973: #define FILTER_ITEM 0
974: #define FILTER_AND 1
975: #define FILTER_OR 2
976: #define FILTER_NOT 3
977: struct filter * flt_next;
978: union {
979: struct filter_item flt_un_item;
980: struct filter * flt_un_filter;
981: } flt_un;
982: }filter, *Filter;
983: \end{verbatim}\end{quote}
984:
985: \begin{describe}
986: \item [\verb"flt\_type":] This defines whether the filter is a single item,
987: or a more complex filter made up of one or more components.
988: \item [\verb"flt\_un.flt\_un\_item":] If the filter represents a
989: \verb"filter_item", then the item is placed here.
990: \item [\verb"flt\_un.flt\_un\_filter":] \verb"AND", \verb"OR" and \verb"NOT"
991: filters apply to a linked list of ``children'' filters. This element is a
992: pointer to the head of that list.
993: \item [\verb"flt\_next":] If the parent filter is an \verb"AND", \verb"OR".
994: or \verb"NOT"
995: filter, then the component filters are linked using this field.
996: NOTE that \verb"NOT" filters should contain a list of one child only.
997: \end{describe}
998:
999: As an example, lets us consider a filter to represent a person whose name
1000: is either ``Robbins'' OR ( ``Steve'' AND ``Kille'' ). The structure would
1001: look something like:-
1002: \begin{small}
1003: \begin{verbatim}
1004: flt_type = FILTER_OR
1005: - The filter is an OR filter
1006: flt_un_filter.flt_type = FILTER_ITEM
1007: - First component or the OR is an item
1008: flt_un_filter.flt_un_item = filter_item (Robbins)
1009: - The item should match "robbins"
1010: flt_un_filter.flt_next->flt_type = FILTER_AND
1011: - Second component or the OR is an AND filter
1012: flt_un_filter.flt_next->flt_un_filter.flt_type = FILTER_ITEM
1013: - First component or the AND is an item
1014: flt_un_filter.flt_next->flt_un_filter.flt_un_item =
1015: filter_item (Steve)
1016: - The item should match "Steve"
1017: flt_un_filter.flt_next->flt_un_filter.flt_next->flt_type =
1018: FILTER_ITEM
1019: - Second component or the AND is an item
1020: flt_un_filter.flt_next->flt_un_filter.flt_next->flt_un_item =
1021: filter_item (Kille)
1022: - The item should match "Kille"
1023: \end{verbatim}
1024: \end{small}
1025: \section {Modification Operations}\label{mod-op}
1026:
1027: There are 4 operations available to modify the directory.
1028:
1029: NOTE: with Quipu-6.0 DSA's modify operations are only allowed over DAP,
1030: attempts to modify over DSP will return referral errors.
1031:
1032: \subsection {Add}
1033:
1034: To add an entry to the DIT use
1035: \begin{quote}\index{ds\_addentry}\small\begin{verbatim}
1036: ds_addentry (arg, error)
1037: struct ds_addentry_arg * arg;
1038: struct DSError * error;
1039: \end{verbatim}\end{quote}
1040:
1041: You will need to include \file{quipu/add.h} to use this procedure.
1042:
1043: The argument you must supply is made up as follows:-
1044:
1045: \begin{quote}\small\begin{verbatim}
1046: struct ds_addentry_arg {
1047: CommonArgs ada_common;
1048: DN ada_object;
1049: Attr_Sequence ada_entry;
1050: };
1051: \end{verbatim}\end{quote}
1052:
1053:
1054: \begin{describe}
1055: \item [\verb"ada\_common":] The common arguments as described in
1056: \ref{common_args}.
1057: \item [\verb"ada\_object":] The DN of the object you want to add.
1058: \item [\verb"ada\_entry":] The attributes you want to add for this entry.
1059: This must contain the RDN of the entry, and an ``objectclass'' attribute.
1060: Then, the other attribute MUST conform to the set of ``optional'' and
1061: ``mandatory'' attribute for that object class.
1062: \end{describe}
1063:
1064:
1065: \subsection {Remove}
1066:
1067: This is used to remove an entry from the DIT.
1068: Only leaf entries can be removed.
1069:
1070: \begin{quote}\index{ds\_removeentry}\small\begin{verbatim}
1071: ds_removeentry (arg, error)
1072: struct ds_removeentry_arg * arg;
1073: struct DSError * error;
1074: \end{verbatim}\end{quote}
1075:
1076: You will need to include \file{quipu/remove.h} to use this procedure.
1077:
1078: The argument you must supply is made up as follows:-
1079:
1080: \begin{quote}\small\begin{verbatim}
1081: struct ds_removeentry_arg {
1082: CommonArgs rma_common;
1083: DN rma_object;
1084: };
1085: \end{verbatim}\end{quote}
1086:
1087: \begin{describe}
1088: \item [\verb"rma\_common":] The common arguments as described in
1089: \ref{common_args}.
1090: \item [\verb"rma\_object":] The DN of the object you want to remove.
1091: \end{describe}
1092:
1093:
1094: \subsection {Modify}
1095:
1096: \verb"ModifyEntry" is used to modify the attributes of the specified entry.
1097: There are strong restrictions on this operation as required by X.500.
1098: Invalid operations result in errors, and as such none of the requested
1099: modifications are made.
1100: To modify an attribute you must first \verb"remove" it then \verb"add" a new
1101: attribute.
1102: You can not modify the RDN, you must use the \verb"ModifyRDN" operation
1103: described in Section~\ref{modifyrdn} to do this.
1104:
1105: \begin{quote}\index{ds\_modifyentry}\small\begin{verbatim}
1106: ds_modifyentry (arg, error)
1107: struct ds_modifyentry_arg * arg;
1108: struct DSError * error;
1109: \end{verbatim}\end{quote}
1110:
1111: You will need to include \file{quipu/modify.h} to use this procedure.
1112:
1113: The argument you must supply is made up as follows:-
1114:
1115: \begin{quote}\small\begin{verbatim}
1116: struct ds_modifyentry_arg {
1117: CommonArgs mea_common;
1118: DN mea_object;
1119: struct entrymod * mea_changes;
1120: };
1121: \end{verbatim}\end{quote}
1122:
1123: \begin{describe}
1124: \item [\verb"mea\_common":] The common arguments as described in
1125: \ref{common_args}.
1126: \item [\verb"mea\_object":] The DN of the object you want to modify.
1127: \item [\verb"mea\_changes":] A tree structure defining the changes you want to
1128: make to the entry.
1129: \begin{quote}\index{entrymod}\small\begin{verbatim}
1130: struct entrymod {
1131: int em_type;
1132: #define EM_ADDATTRIBUTE 0
1133: #define EM_REMOVEATTRIBUTE 1
1134: #define EM_ADDVALUES 2
1135: #define EM_REMOVEVALUES 3
1136: Attr_Sequence em_what;
1137: struct entrymod * em_next;
1138: };
1139: \end{verbatim}\end{quote}
1140: \begin{describe}
1141: \item [\verb"em\_type":] The type of modification this is.
1142: \item [\verb"em\_what":] The attribute you want to add or remove. If the
1143: operation type is remove, then this structure should only contain an
1144: attribute type, and not a value.
1145: \item [\verb"em\_next":] A modify operation is built up with a series of
1146: small modifications. Hence this structure is a linked list.
1147: The operation is seen as one atomic operation.
1148: \end{describe}
1149: \end{describe}
1150:
1151:
1152: \subsection {ModifyRDN}
1153: \label{modifyrdn}
1154:
1155: To modify the distinguished attribute values of an entry, you MUST use this operation ---
1156: \verb"modifyEntry" can not be used.
1157:
1158: \begin{quote}\index{ds\_modifyrdn}\small\begin{verbatim}
1159: ds_modifyrdn (arg, error)
1160: struct ds_modifyrdn_arg * arg;
1161: struct DSError * error;
1162: \end{verbatim}\end{quote}
1163:
1164: You will need to include \file{quipu/modifyrdn.h} to use this procedure.
1165:
1166: The arguments are:-
1167:
1168: \begin{quote}\small\begin{verbatim}
1169: struct ds_modifyrdn_arg {
1170: CommonArgs mra_common;
1171: DN mra_object;
1172: RDN mra_newrdn;
1173: char mra_deleterdn;
1174: };
1175: \end{verbatim}\end{quote}
1176:
1177: \begin{describe}
1178: \item [\verb"mra\_common":] The common arguments as described in
1179: \ref{common_args}.
1180: \item [\verb"mra\_object":] The DN of the object you want to modify the name
1181: of.
1182: \item [\verb"mra\_newrdn":] The new RDN.
1183: \item [\verb"mra\_deleterdn":] if \verb"TRUE" then the old RDN will be
1184: deleted as an attribute, otherwise it will remain an a non-distinguished
1185: attribute.
1186: \end{describe}
1187:
1188: \section {Abandon}
1189:
1190: The abandon operation shown below is slightly
1191: different to the other DUA operations.
1192: It does not make much sense for a synchronous interface to
1193: handle abandon directly.
1194: In the next release, transparent use of abandon will be provided.
1195:
1196: \begin{quote}\index{ds\_abandon}\small\begin{verbatim}
1197: ds_abandon (arg, error)
1198: struct ds_abandon_arg * arg;
1199: struct DSError * error;
1200: \end{verbatim}\end{quote}
1201:
1202: The argument structure contains a single parameter
1203: supplies the operation invocation id.
1204:
1205: \begin{quote}\small\begin{verbatim}
1206: struct ds_abandon_arg {
1207: int aba_invokeid;
1208: };
1209: \end{verbatim}\end{quote}
1210:
1211:
1212: \section {Multiple Associations}
1213:
1214: The procedural interface described so far, has been based on the assumption
1215: of a connection to a single DSA.
1216: However, it is possible to make connection to multiple DSAs.
1217:
1218:
1219: \subsection {Multiple Binds}
1220:
1221: The bind and unbind routines needed to make
1222: multiple association are as follows:-
1223: \begin{quote}\index{dap\_bind}\small\begin{verbatim}
1224: dap_bind (ad, arg, error, result, addr)
1225: int * ad;
1226: struct ds_bind_arg *arg;
1227: struct ds_bind_arg *result;
1228: struct ds_bind_error *error;
1229: struct PSAPaddr *addr;
1230:
1231: dap_unbind (ad)
1232: int ad;
1233: \end{verbatim}\end{quote}
1234:
1235: The \verb"arg", \verb"error" and \verb"result" arguments are as defined
1236: in Section~\ref{dap:bind} for the routine \verb"secure_ds_bind".
1237:
1238: The argument \verb"ad" is the association descriptor of the association.
1239: It should be different for each association.
1240:
1241: The \verb"addr" argument in the address of the DSA you wish to contact.
1242:
1243: \subsection {Other DAP Operations}
1244:
1245: The other DAP operations (read, list, modify\ldots), use the same format
1246: a already described, but with two extra integer parameters, thus
1247: \begin{quote}\index{ds\_read}\small\begin{verbatim}
1248: ds_read (arg, error, result)
1249: \end{verbatim}\end{quote}
1250: becomes
1251: \begin{quote}\index{ds\_read}\small\begin{verbatim}
1252: dap_read (ad, id, arg, error, result)
1253: \end{verbatim}\end{quote}
1254: where \verb"ad" is the association descriptor used in the bind, and
1255: \verb"id" uniquely identifies the operation with respect to other
1256: operation on the same association.
1257:
1258: \section {Asynchronous Access}
1259:
1260: All of the procedures so far described make synchronous
1261: associations to the DSA.
1262: In the next release,
1263: asynchronous access will be provided.
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.