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

1.1       root        1: % run this through LaTeX with the appropriate wrapper
                      2: 
                      3: \chapter      {Old-Style Associations}\label{old-style}
                      4: As discussed in Section~\ref{acs:note},
                      5: there are several ways to establish an association.
                      6: In the interests of compatibility with previously specified applications,
                      7: the \man librosap(3n) and \man librtsap(3n) libraries support ``old-style''
                      8: mechanisms for binding associations.
                      9: These are discussed in this appendix.
                     10: Use of these facilities for new applications is strongly discouraged.
                     11: 
                     12: \section      {Remote Operations}\label{ros:old-style}
                     13: Under old-style association handling for remote operations,
                     14: the mechanism used for establishing the association determines the
                     15: remote operations service discipline to be used.
                     16: If the basic service discipline is desired,
                     17: then continue reading this section which describes the addressing and
                     18: initialization mechanisms for native ROS associations.
                     19: These make use of the {\sf RO-BEGIN\/} and {\sf RO-END\/} primitives.
                     20: Instead,
                     21: if the advanced service discipline is desired,
                     22: then read Section~\ref{rts:old-style} on page~\pageref{rts:old-style}
                     23: which describes how
                     24: associations are established and released by the reliable transfer service
                     25: (RTS) using the {\sf X.410 OPEN\/} and {\sf X.410 CLOSE\/} primitives.
                     26: (Be sure to also read Section~\ref{ros:underlying} on
                     27: page~\pageref{ros:underlying}).
                     28: 
                     29: \subsection    {Addresses}
                     30: Addresses at the remote operations service access point are represented by the
                     31: \verb"RoSAPaddr" structure.
                     32: \begin{quote}\index{RoSAPaddr}\small\begin{verbatim}
                     33: struct RoSAPaddr {
                     34:     struct SSAPaddr roa_addr;
                     35: 
                     36:     u_short     roa_port;
                     37: };
                     38: \end{verbatim}\end{quote}
                     39: This structure contains two elements:
                     40: \begin{describe}
                     41: \item[\verb"roa\_addr":]       the session address,
                     42: as described in Section~\ref{ssap:addresses} on page~\pageref{ssap:addresses}
                     43: of \voltwo/;
                     44: and,
                     45: 
                     46: \item[\verb"roa\_port":] the port number of the entity residing above the
                     47: RoSAP,
                     48: as described in the \man isoservices(5) database,
                     49: for the service provider \verb"rosap".
                     50: \end{describe}
                     51: 
                     52: In Figure~\ref{getDSentity},
                     53: an example of how one constructs the RoSAP address for the directory services
                     54: entity on host \verb"RemoteHost" is presented.
                     55: (The routine \verb"is2saddr" is described on page~\pageref{ssap:addresses}
                     56: of \voltwo/.)
                     57: \tagrind[tp]{grindB-1}%
                     58:         {Constructing the RoSAP address for the Directory Services entity}%
                     59:         {getDSentity}
                     60: 
                     61: \subsection       {Association Establishment}
                     62: The \man librosap(3n) library distinguishes between the user which started an
                     63: association,
                     64: the {\em initiator},
                     65: and the user which subsequently was bound to the association,
                     66: the {\em responder}.
                     67: We sometimes term these two entities the {\em client\/} and the {\em server},
                     68: respectively.
                     69: 
                     70: \subsubsection     {Server Initialization}
                     71: The \man tsapd(8c) daemon,
                     72: upon accepting a connection from an initiating host,
                     73: consults the ISO services database to determine which program
                     74: on the local system implements the desired RoSAP entity.
                     75: In the case of the remote operations service,
                     76: the \pgm{tsapd} program contains the bootstrap for the remote operations
                     77: provider.
                     78: The daemon will again consult the ISO services database to determine which
                     79: program on the system implements the desired RoSAP entity.
                     80: 
                     81: Once the program has been ascertained,
                     82: the daemon runs the program with any arguments listed in the database.
                     83: In addition,
                     84: it appends some {\em magic arguments\/} to the argument vector.
                     85: Hence,
                     86: the very first action performed by the responder is to re-capture the RoSAP
                     87: state contained in the magic arguments.
                     88: This is done by calling the routine \verb"RoInit",
                     89: which on a successful return,
                     90: is equivalent to a {\sf RO-BEGIN.INDICATION\/} from the remote operations
                     91: service provider.
                     92: \begin{quote}\index{RoInit}\small\begin{verbatim}
                     93: int     RoInit (vecp, vec, ros, roi)
                     94: int     vecp;
                     95: char  **vec;
                     96: struct RoSAPstart *ros;
                     97: struct RoSAPindication *roi;
                     98: \end{verbatim}\end{quote}
                     99: The parameters to this procedure are:
                    100: \begin{describe}
                    101: \item[\verb"vecp":] the length of the argument vector;
                    102: 
                    103: \item[\verb"vec":] the argument vector;
                    104: 
                    105: \item[\verb"ros":] a pointer to a \verb"RoSAPstart" structure, which is
                    106: updated only if the call succeeds;
                    107: and,
                    108: 
                    109: \item[\verb"roi":] a pointer to a \verb"RoSAPindication" structure, which is
                    110: updated only if the call fails.
                    111: \end{describe}
                    112: If \verb"RoInit" is successful,
                    113: it returns information in the \verb"ros" parameter,
                    114: which is a pointer to a \verb"RoSAPstart" structure.
                    115: \begin{quote}\index{RoSAPstart}\small\begin{verbatim}
                    116: struct RoSAPstart {
                    117:     int     ros_sd;
                    118: 
                    119:     struct RoSAPaddr ros_initiator;
                    120: 
                    121:     u_short ros_port;
                    122: 
                    123:     PE      ros_data;
                    124: };
                    125: \end{verbatim}\end{quote}
                    126: The elements of this structure are:
                    127: \begin{describe}
                    128: \item[\verb"ros\_sd":] the association-descriptor to be used to
                    129: reference this association;
                    130: 
                    131: \item[\verb"ros\_initiator":] the ``unique identifier'' of the initiator
                    132: (containing the initiator's host address);
                    133: 
                    134: \item[\verb"ros\_port":] the application number the initiator wishes to use
                    135: to govern the association;
                    136: and
                    137: 
                    138: \item[\verb"ros\_data":] any initial data (this is a pointer to a
                    139: \verb"PElement" structure, which is fully explained in Chapter~\ref{libpsap}).
                    140: \end{describe}
                    141: Note that the \verb"ros_data" element is allocated via \man malloc(3) and
                    142: should be released using the \verb"ROSFREE" macro  when no longer referenced.
                    143: The \verb"ROSFREE" macro behaves as if it was defined as:
                    144: \begin{quote}\index{ROSFREE}\small\begin{verbatim}
                    145: void    ROSFREE (ros)
                    146: struct RoSAPstart *ros;
                    147: \end{verbatim}\end{quote}
                    148: The macro frees only the data allocated by \verb"RoInit",
                    149: and not the \verb"RoSAPstart" structure itself.
                    150: Further,
                    151: \verb"ROSFREE" should be called only if the call to the \verb"RoInit"
                    152: routine returned \verb"OK".
                    153: 
                    154: If the call to \verb"RoInit" is not successful,
                    155: then a {\sf RO-P-REJECT.IN\-DI\-CA\-TION\/} event is simulated,
                    156: and the relevant information is returned in an encoded
                    157: \verb"RoSAPindication" structure.
                    158: 
                    159: After examining the information returned by \verb"RoInit" on a successful call
                    160: (and possibly after examining the argument vector),
                    161: the responder should either accept or reject the association.
                    162: For either response,
                    163: the responder should use
                    164: the \verb"RoBeginResponse" routine
                    165: (which corresponds to the {\sf RO-BEGIN.RESPONSE\/} action).
                    166: \begin{quote}\index{RoBeginResponse}\small\begin{verbatim}
                    167: int     RoBeginResponse (sd, status, data, roi)
                    168: int     sd;
                    169: int     status;
                    170: PE      data;
                    171: struct RoSAPindication *roi;
                    172: \end{verbatim}\end{quote}
                    173: The parameters to this procedure are:
                    174: \begin{describe}
                    175: \item[\verb"sd":] the association-descriptor;
                    176: 
                    177: \item[\verb"status":] the acceptance indicator
                    178: (either \verb"ROS_ACCEPT" if the association is to be accepted,
                    179: or one of the ``fatal'' user-initiated rejection codes listed in
                    180: Table~\ref{RoSAPreasons} on page~\pageref{RoSAPreasons});
                    181: 
                    182: \item[\verb"data":] any initial data if the association is to be accepted;
                    183: and,
                    184: 
                    185: \item[\verb"roi":] a pointer to a \verb"RoSAPindication" structure, which is
                    186: updated only if the call fails.
                    187: \end{describe}
                    188: If the call to \verb"RoBeginResponse" is successful,
                    189: and the \verb"status" parameter is set to \verb"ROS_ACCEPT",
                    190: then association establishment has now been completed.
                    191: If the call is successful,
                    192: but the \verb"status" parameter is not \verb"ROS_ACCEPT",
                    193: then the association has been rejected and the responder may exit.
                    194: Otherwise,
                    195: if the call fails and the reason is ``fatal'',
                    196: then the association is closed.
                    197: 
                    198: \subsubsection     {Client Initialization}
                    199: A program wishing to associate itself with another user of remote operation
                    200: services calls the \verb"RoBeginRequest" routine,
                    201: which corresponds to the {\sf RO-BEGIN.REQUEST\/} action.
                    202: \begin{quote}\index{RoBeginRequest}\small\begin{verbatim}
                    203: int     RoBeginRequest (called, data, roc, roi)
                    204: struct  RoSAPaddr *called;
                    205: PE      data;
                    206: struct RoSAPconnect *roc;
                    207: struct RoSAPindication *roi;
                    208: \end{verbatim}\end{quote}
                    209: The parameters to this procedure are:
                    210: \begin{describe}
                    211: \item[\verb"called":] the RoSAP address of the responder;
                    212: 
                    213: \item[\verb"data":] any initial data;
                    214: 
                    215: \item[\verb"roc":] a pointer to a \verb"RoSAPconnect" structure, which is
                    216: updated only if the call succeeds;
                    217: and,
                    218: 
                    219: \item[\verb"roi":] a pointer to a \verb"RoSAPindication" structure, which is
                    220: updated only if the call fails.
                    221: \end{describe}
                    222: If the call to \verb"RoBeginRequest" is successful
                    223: (this corresponds to a {\sf RO-BEGIN.CONFIRMATION\/} event),
                    224: it returns information in the \verb"roc" parameter,
                    225: which is a pointer to a \verb"RoSAPconnect" structure.
                    226: \begin{quote}\index{RoSAPconnect}\small\begin{verbatim}
                    227: struct RoSAPconnect {
                    228:     int     roc_sd;
                    229: 
                    230:     int     roc_result;
                    231: 
                    232:     PE      roc_data;
                    233: };
                    234: \end{verbatim}\end{quote}
                    235: The elements of this structure are:
                    236: \begin{describe}
                    237: \item[\verb"roc\_sd":] the association-descriptor to be used to
                    238: reference this association;
                    239: 
                    240: \item[\verb"roc\_result":] the association response;
                    241: and,
                    242: 
                    243: \item[\verb"roc\_data":] any initial data if the association was accepted.
                    244: \end{describe}
                    245: If the call to \verb"RoBeginRequest" is successful,
                    246: and the \verb"roc_result" element is set to \verb"ROS_ACCEPT",
                    247: then association establishment has completed.
                    248: If the call is successful,
                    249: but the \verb"roc_result" element is not \verb"ROS_ACCEPT",
                    250: the the association attempt has been rejected,
                    251: consult Table~\ref{RoSAPreasons} to determine the reason for the reject.
                    252: Otherwise, if the call fails then the association is not established and
                    253: the \verb"RoSAPpreject" structure of the \verb"RoSAPindication" discriminated
                    254: union has been updated.
                    255: 
                    256: Note that the \verb"roc_data" element is allocated via \man malloc(3) and
                    257: should be released using the \verb"ROCFREE" macro  when no longer referenced.
                    258: The \verb"ROCFREE" macro behaves as if it was defined as:
                    259: \begin{quote}\index{ROCFREE}\small\begin{verbatim}
                    260: void    ROCFREE (roc)
                    261: struct RoSAPconnect *roc;
                    262: \end{verbatim}\end{quote}
                    263: The macro frees only the data allocated by \verb"RoBeginRequest",
                    264: and not the \verb"RoSAPconnect" structure itself.
                    265: Further,
                    266: \verb"ROCFREE" should be called only if the call to the \verb"RoBeginRequest"
                    267: routine returned \verb"OK".
                    268: 
                    269: Note that in the basic service the arguement parameter to an Invoke request
                    270: cannot be NULL.
                    271: As well only the initiator may make invoke requests.
                    272: 
                    273: \subsection       {Association Release}
                    274: The \verb"RoEndRequest" routine is used to request the release of an
                    275: association,
                    276: and corresponds to a {\sf RO-END.REQUEST\/} action.
                    277: This action may be taken by only the initiator of an association.
                    278: \begin{quote}\index{RoEndRequest}\small\begin{verbatim}
                    279: int     RoEndRequest (sd, priority, roi)
                    280: int     sd;
                    281: int     priority;
                    282: struct RoSAPindication *roi;
                    283: \end{verbatim}\end{quote}
                    284: The parameters to this procedure are:
                    285: \begin{describe}
                    286: \item[\verb"sd":] the association-descriptor;
                    287: 
                    288: \item[\verb"priority":] the priority of this request;
                    289: and,
                    290: 
                    291: \item[\verb"roi":] a pointer to a \verb"RoSAPindication" structure, which is
                    292: updated only if the call fails.
                    293: \end{describe}
                    294: If the call to \verb"RoEndRequest" is successful,
                    295: then the association has been released.
                    296: Otherwise if the call fails and the error is not fatal,
                    297: then the association remains established and the \verb"RoSAPpreject" structure
                    298: contained in
                    299: the \verb"RoSAPindication" parameter \verb"roi" contains the reason for the
                    300: failure.
                    301: 
                    302: Upon receiving a {\sf RO-END.INDICATION\/} event,
                    303: the user is required to generate a {\sf RO-END.RESPONSE\/} action
                    304: using the \verb"RoEndResponse" routine.
                    305: \begin{quote}\index{RoEndResponse}\small\begin{verbatim}
                    306: int     RoEndResponse (sd, roi)
                    307: int     sd;
                    308: struct RoSAPindication *roi;
                    309: \end{verbatim}\end{quote}
                    310: The parameters to this procedure are:
                    311: \begin{describe}
                    312: \item[\verb"sd":] the association-descriptor;
                    313: and,
                    314: 
                    315: \item[\verb"roi":] a pointer to a \verb"RoSAPindication" structure, which is
                    316: updated only if the call fails.
                    317: \end{describe}
                    318: If the call to \verb"RoEndResponse" is successful,
                    319: then the association has been released.
                    320: 
                    321: \subsection    {An Example}
                    322: Let's consider how one might construct a generic server which uses remote
                    323: operations services.
                    324: This entity will use an asynchronous interface and the basic service
                    325: discipline.
                    326: Note that we could have selected the advanced service discipline by using
                    327: \verb"RtBInit" instead of \verb"RoInit",
                    328: \verb"RtBeginResponse" instead of \verb"RoBeginResponse",
                    329: and
                    330: \verb"RtEndResponse" instead of \verb"RoEndResponse" (respectively).
                    331: This is demonstrated later in this appendix.
                    332: 
                    333: There are two parts to the program:
                    334: initialization and the request/reply loop.
                    335: In our example,
                    336: we assume that the routine \verb"error" results in the process being
                    337: terminated after printing a diagnostic.
                    338: 
                    339: In Figure~\ref{initROS:OLDresponder},
                    340: the initialization steps for the generic responder,
                    341: including the outer {\em C\/} wrapper,
                    342: is shown.
                    343: First, the RoSAP state is re-captured by calling \verb"RoInit".
                    344: If this succeeds,
                    345: then the association is authenticated and any command line arguments (as
                    346: specified in the \man isoservices(5) file) are parsed.
                    347: Assuming that the responder is satisfied with the proposed association,
                    348: it calls \verb"RoBeginResponse" to accept the association.
                    349: Then,
                    350: \verb"RoSetIndications" is set to specify an asynchronous event handler.
                    351: Finally,
                    352: the main request/reply loop is realized.
                    353: The server simply uses \man pause(2) to wait for the next event.
                    354: {\let\small=\scriptsize                        %%% yikes!
                    355: \tagrind[tp]{grindB-2}{Initializing the generic ROS responder}%
                    356:        {initROS:OLDresponder}}
                    357: 
                    358: Figure~\ref{doROSresponder} on page~\pageref{doROSresponder}
                    359: contains the definition of the
                    360: \verb"ros_indication" routine and associated routines.
                    361: Since the remote operations service was used to establish the association,
                    362: a different closing handler must be used.
                    363: This is shown in Figure~\ref{finROS:OLDresponder}.
                    364: {\let\small=\scriptsize                        %%% yikes!
                    365: \tagrind[tp]{grindB-3}%
                    366:        {Finalizing the generic ROS responder}{finROS:OLDresponder}}
                    367: 
                    368: \section      {Reliable Transfer}\label{rts:old-style}
                    369: Under old-style association handling for reliable transfer,
                    370: the {\sf X.410 OPEN\/} and {\sf X.410 CLOSE\/} primitives are used.
                    371: 
                    372: \subsection    {Addresses}
                    373: Addresses at the reliable transfer service access point are represented by the
                    374: \verb"RtSAPaddr" structure.
                    375: \begin{quote}\index{RtSAPaddr}\small\begin{verbatim}
                    376: struct RtSAPaddr {
                    377:     struct SSAPaddr rta_addr;
                    378: 
                    379:     u_short     rta_port;
                    380: };
                    381: \end{verbatim}\end{quote}
                    382: This structure contains two elements:
                    383: \begin{describe}
                    384: \item[\verb"rta\_addr":]       the session address,
                    385: as described in Section~\ref{ssap:addresses} on page~\pageref{ssap:addresses}
                    386: of \voltwo/;
                    387: and,
                    388: 
                    389: \item[\verb"rta\_port":] the port number of the entity residing above the
                    390: RtSAP,
                    391: as described in the \man isoservices(5) database,
                    392: for the service provider \verb"rtsap".
                    393: \end{describe}
                    394: 
                    395: In Figure~\ref{getP1entity},
                    396: an example of how one constructs the RtSAP address for the message transfer
                    397: entity on host \verb"RemoteHost" is presented.
                    398: (The routine \verb"is2saddr" is described on page~\pageref{ssap:addresses}
                    399: of \voltwo/.)
                    400: \tagrind[tp]{grindB-4}%
                    401:         {Constructing the RtSAP address for the Message Transfer entity}%
                    402:         {getP1entity}
                    403: 
                    404: \subsection       {Association Establishment}
                    405: The \man librtsap(3n) library distinguishes between the user which started an
                    406: association,
                    407: the {\em initiator},
                    408: and the user which was subsequently bound to the association,
                    409: the {\em responder}.
                    410: We sometimes term these two entities the {\em client\/} and the {\em server},
                    411: respectively.
                    412: 
                    413: \subsubsection     {Server Initialization}
                    414: The \man tsapd(8c) daemon,
                    415: upon accepting a connection from an initiating host,
                    416: consults the ISO services database to determine which program
                    417: on the local system implements the desired SSAP entity.
                    418: In the case of the reliable transfer service,
                    419: the \pgm{tsapd} program contains the bootstrap for the reliable transfer
                    420: provider.
                    421: The daemon will again consult the ISO services database to determine which
                    422: program on the system implements the desired RtSAP entity.
                    423: 
                    424: Once the program has been ascertained,
                    425: the daemon runs the program with any arguments listed in the database.
                    426: In addition,
                    427: it appends some {\em magic arguments\/} to the argument vector.
                    428: Hence,
                    429: the very first action performed by the responder is to re-capture the RtSAP
                    430: state contained in the magic arguments.
                    431: This is done by calling the routine \verb"RtBInit",
                    432: which on a successful return,
                    433: is equivalent to a {\sf X.410 OPEN.INDICATION\/} from the reliable transfer
                    434: service provider.
                    435: \begin{quote}\index{RtBInit}\small\begin{verbatim}
                    436: int     RtBInit (vecp, vec, rts, rti)
                    437: int     vecp;
                    438: char  **vec;
                    439: struct RtSAPstart *rts;
                    440: struct RtSAPindication *rti;
                    441: \end{verbatim}\end{quote}
                    442: The parameters to this procedure are:
                    443: \begin{describe}
                    444: \item[\verb"vecp":] the length of the argument vector;
                    445: 
                    446: \item[\verb"vec":] the argument vector;
                    447: 
                    448: \item[\verb"rts":] a pointer to a \verb"RtSAPstart" structure, which is
                    449: updated only if the call succeeds;
                    450: and,
                    451: 
                    452: \item[\verb"rti":] a pointer to a \verb"RtSAPindication" structure, which is
                    453: updated only if the call fails.
                    454: \end{describe}
                    455: If \verb"RtBInit" is successful,
                    456: it returns information in the \verb"rts" parameter,
                    457: which is a pointer to a \verb"RtSAPstart" structure.
                    458: \begin{quote}\index{RtSAPstart}\small\begin{verbatim}
                    459: struct RtSAPstart {
                    460:     int     rts_sd;
                    461: 
                    462:     struct RtSAPaddr rts_initiator;
                    463: 
                    464:     int     rts_mode;
                    465: #define RTS_MONOLOGUE   0
                    466: #define RTS_TWA         1
                    467: 
                    468:     int     rts_turn;
                    469: #define RTS_INITIATOR   0
                    470: #define RTS_RESPONDER   1
                    471: 
                    472:     u_short rts_port;
                    473: 
                    474:     PE      rts_data;
                    475: };
                    476: \end{verbatim}\end{quote}
                    477: The elements of this structure are:
                    478: \begin{describe}
                    479: \item[\verb"rts\_sd":] the association-descriptor to be used to
                    480: reference this association;
                    481: 
                    482: \item[\verb"rts\_initiator":] the address of the initiator;
                    483: 
                    484: \item[\verb"rts\_mode":] the dialogue mode (either monologue or two-way
                    485: alternate),
                    486: 
                    487: \item[\verb"rts\_turn":] the owner of the turn initially;
                    488: 
                    489: \item[\verb"rts\_port":] the application number the initiator wishes to use
                    490: to govern the association;
                    491: and
                    492: 
                    493: \item[\verb"rts\_data":] any initial data (this is a pointer to a
                    494: \verb"PElement" structure, which is fully explained in Chapter~\ref{libpsap}).
                    495: \end{describe}
                    496: Note that the \verb"rts_data" element is allocated via \man malloc(3) and
                    497: should be released by using the \verb"RTSFREE" macro when no longer referenced.
                    498: The \verb"RTSFREE" macro behaves as if it was defined as:
                    499: \begin{quote}\index{RTSFREE}\small\begin{verbatim}
                    500: void    RTSFREE (rts)
                    501: struct RtSAPstart *rts;
                    502: \end{verbatim}\end{quote}
                    503: The macro frees only the data allocated by \verb"RtBInit",
                    504: and not the \verb"RtSAPstart" structure itself.
                    505: Further,
                    506: \verb"RTSFREE" should be called only if the call to the \verb"RtBInit"
                    507: routine returned \verb"OK".
                    508: 
                    509: If the call to \verb"RtBInit" is not successful,
                    510: then a {\sf RT-P-ABORT.INDICATION\/} event is simulated,
                    511: and the relevant information is returned in an encoded
                    512: \verb"RtSAPindication" structure.
                    513: 
                    514: After examining the information returned by \verb"RtBInit" on a successful call
                    515: (and possibly after examining the argument vector),
                    516: the responder should either accept or reject the association.
                    517: For either response,
                    518: the responder should use
                    519: the \verb"RtBeginResponse" routine
                    520: (which corresponds to the {\sf X.410 OPEN.RESPONSE\/} action).
                    521: \begin{quote}\index{RtBeginResponse}\small\begin{verbatim}
                    522: int     RtBeginResponse (sd, status, data, rti)
                    523: int     sd;
                    524: int     status;
                    525: PE      data;
                    526: struct RtSAPindication *rti;
                    527: \end{verbatim}\end{quote}
                    528: The parameters to this procedure are:
                    529: \begin{describe}
                    530: \item[\verb"sd":] the association-descriptor;
                    531: 
                    532: \item[\verb"status":] the acceptance indicator
                    533: (either \verb"RTS_ACCEPT" if the association is to be accepted,
                    534: or one of the ``fatal'' user-initiated rejection codes,
                    535: other tha \verb"RTS_REJECT",
                    536: listed in Table~\ref{RtSAPreasons} on page~\pageref{RtSAPreasons});
                    537: 
                    538: \item[\verb"data":] any initial data if the association is to be accepted;
                    539: and,
                    540: 
                    541: \item[\verb"rti":] a pointer to a \verb"RtSAPindication" structure, which is
                    542: updated only if the call fails.
                    543: \end{describe}
                    544: If the call to \verb"RtBeginResponse" is successful,
                    545: and the \verb"status" parameter is set to \verb"RTS_ACCEPT",
                    546: then association establishment has now been completed.
                    547: If the call is successful,
                    548: but the \verb"status" parameter is not \verb"RTS_ACCEPT",
                    549: then the association has been rejected and the responder may exit.
                    550: Otherwise,
                    551: if the call fails and the reason is ``fatal'',
                    552: then the association is closed.
                    553: 
                    554: \subsubsection     {Client Initialization}
                    555: A program wishing to associate itself with another user of reliable transfer
                    556: services calls the \verb"RtBeginRequest" routine,
                    557: which corresponds to the {\sf X.410 OPEN.REQUEST\/} action.
                    558: \begin{quote}\index{RtBeginRequest}\small\begin{verbatim}
                    559: int     RtBeginRequest (called, mode, turn, data, rtc, rti)
                    560: struct  RtSAPaddr *called;
                    561: int     mode,
                    562:         turn;
                    563: PE      data;
                    564: struct RtSAPconnect *rtc;
                    565: struct RtSAPindication *rti;
                    566: \end{verbatim}\end{quote}
                    567: The parameters to this procedure are:
                    568: \begin{describe}
                    569: \item[\verb"called":] the RtSAP address of the responder;
                    570: 
                    571: \item[\verb"mode":] the dialogue mode;
                    572: 
                    573: \item[\verb"turn":] who gets the initial turn;
                    574: 
                    575: \item[\verb"data":] any initial data;
                    576: 
                    577: \item[\verb"rtc":] a pointer to a \verb"RtSAPconnect" structure, which is
                    578: updated only if the call succeeds;
                    579: and,
                    580: 
                    581: \item[\verb"rti":] a pointer to a \verb"RtSAPindication" structure, which is
                    582: updated only if the call fails.
                    583: \end{describe}
                    584: If the call to \verb"RtBeginRequest" is successful
                    585: (this corresponds to a {\sf X.410 OPEN.CONFIRMATION\/} event),
                    586: it returns information in the \verb"rtc" parameter,
                    587: which is a pointer to a \verb"RtSAPconnect" structure.
                    588: \begin{quote}\index{RtSAPconnect}\small\begin{verbatim}
                    589: struct RtSAPconnect {
                    590:     int     rtc_sd;
                    591: 
                    592:     int     rtc_result;
                    593: 
                    594:     PE      rtc_data;
                    595: };
                    596: \end{verbatim}\end{quote}
                    597: The elements of this structure are:
                    598: \begin{describe}
                    599: \item[\verb"rtc\_sd":] the association-descriptor to be used to
                    600: reference this association;
                    601: 
                    602: \item[\verb"rtc\_result":] the association response;
                    603: and,
                    604: 
                    605: \item[\verb"rtc\_data":] any initial data if the association was accepted.
                    606: \end{describe}
                    607: If the call to \verb"RtBeginRequest" is successful,
                    608: and the \verb"rtc_result" element is set to \verb"RTS_ACCEPT",
                    609: then association establishment has completed.
                    610: If the call is successful,
                    611: but the \verb"rtc_result" element is not \verb"RTS_ACCEPT",
                    612: the the association attempt has been rejected;
                    613: consult Table~\ref{RtSAPreasons} to determine the reason for the reject.
                    614: Otherwise, if the call fails then the association is not established and
                    615: the \verb"RtSAPabort" structure of the \verb"RtSAPindication" discriminated
                    616: union has been updated.
                    617: 
                    618: Note that the \verb"rtc_data" element is allocated via \man malloc(3) and
                    619: should be released using the \verb"RTCFREE" macro  when no longer referenced.
                    620: The \verb"RTCFREE" macro behaves as if it was defined as:
                    621: \begin{quote}\index{RTCFREE}\small\begin{verbatim}
                    622: void    RTCFREE (rtc)
                    623: struct RtSAPconnect *rtc;
                    624: \end{verbatim}\end{quote}
                    625: The macro frees only the data allocated by \verb"RtBeginRequest",
                    626: and not the \verb"RtSAPconnect" structure itself.
                    627: Further,
                    628: \verb"RTCFREE" should be called only if the call to the \verb"RtBeginRequest"
                    629: routine returned \verb"OK".
                    630: 
                    631: \subsection       {Association Release}
                    632: The \verb"RtEndRequest" routine is used to request the release of an
                    633: association,
                    634: and corresponds to a {\sf X.410 CLOSE.REQUEST\/} action.
                    635: This action may be taken by only the initiator of an association,
                    636: and, if the dialogue mode is two-way alternate,
                    637: if the initiator has the turn as well.
                    638: \begin{quote}\index{RtEndRequest}\small\begin{verbatim}
                    639: int     RtEndRequest (sd, rti)
                    640: int     sd;
                    641: struct RtSAPindication *rti;
                    642: \end{verbatim}\end{quote}
                    643: The parameters to this procedure are:
                    644: \begin{describe}
                    645: \item[\verb"sd":] the association-descriptor;
                    646: and,
                    647: 
                    648: \item[\verb"rti":] a pointer to a \verb"RtSAPindication" structure, which is
                    649: updated only if the call fails.
                    650: \end{describe}
                    651: If the call to \verb"RtEndRequest" is successful,
                    652: then the association has been released.
                    653: Otherwise if the call fails and the error is not fatal,
                    654: then the association remains established and the \verb"RtSAPabort" structure
                    655: contained in
                    656: the \verb"RtSAPindication" parameter \verb"rti" contains the reason for the
                    657: failure.
                    658: 
                    659: Upon receiving a {\sf X.410 CLOSE.INDICATION\/} event,
                    660: the user is required to generate a {\sf X.410 CLOSE.RESPONSE\/} action
                    661: using the \verb"RtEndResponse" routine.
                    662: \begin{quote}\index{RoEndResponse}\small\begin{verbatim}
                    663: int     RtEndResponse (sd, rti)
                    664: int     sd;
                    665: struct RtSAPindication *rti;
                    666: \end{verbatim}\end{quote}
                    667: The parameters to this procedure are:
                    668: \begin{describe}
                    669: \item[\verb"sd":] the association-descriptor;
                    670: and,
                    671: 
                    672: \item[\verb"rti":] a pointer to a \verb"RtSAPindication" structure, which is
                    673: updated only if the call fails.
                    674: \end{describe}
                    675: If the call to \verb"RtEndResponse" is successful,
                    676: then the association has been released.
                    677: 
                    678: \subsection    {An Example}
                    679: Let's consider how one might construct a generic server that uses
                    680: reliable transfer services to establish an association,
                    681: but then uses remote operation services to communicate with its peer.
                    682: This entity will use a synchronous interface.
                    683: 
                    684: There are two parts to the program:
                    685: initialization and the request/reply loop.
                    686: In our example,
                    687: we assume that the routine \verb"error" results in the process being
                    688: terminated after printing a diagnostic.
                    689: 
                    690: In Figure~\ref{initRTS:OLDresponder},
                    691: the initialization steps for the generic responder,
                    692: including the outer {\em C\/} wrapper,
                    693: is shown.
                    694: First, the RtSAP state is re-captured by calling \verb"RtBInit".
                    695: If this succeeds,
                    696: then the association is authenticated and any command line arguments (as
                    697: specified in the \man isoservices(5) file) are parsed.
                    698: Assuming that the responder is satisfied with the proposed association,
                    699: it calls \verb"RtBeginResponse" to accept the association.
                    700: The \verb"RoSetService" routine is called to set the underlying service to be
                    701: used for remote operations.
                    702: Finally,
                    703: the main request/reply loop is realized.
                    704: The responder calls \verb"RoWaitRequest" to get the next event,
                    705: and then calls \verb"ros_indication" to decode that event.
                    706: {\let\small=\scriptsize                        %%% yikes!
                    707: \tagrind[tp]{grindB-5}{Initializing the generic RTS responder}%
                    708:        {initRTS:OLDresponder}}
                    709: 
                    710: Figure~\ref{doROSresponder} on page~\pageref{doROSresponder}
                    711: contains the definition of the
                    712: \verb"ros_indication" routine and associated routines.
                    713: Since the reliable transfer service was used to establish the association,
                    714: a different closing handler must be used.
                    715: This is shown in Figure~\ref{finRTS:OLDresponder}.
                    716: {\let\small=\scriptsize                        %%% yikes!
                    717: \tagrind[tp]{grindB-6}{Finalizing the generic RTS responder}%
                    718:        {finRTS:OLDresponder}}

unix.superglobalmegacorp.com

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