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

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.

unix.superglobalmegacorp.com

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