|
|
1.1 ! root 1: % run this through LaTeX with the appropriate wrapper ! 2: ! 3: \chapter {Remote Operations}\label{librosap} ! 4: The \man librosap(3n) library implements the Remote Operations Service (ROS). ! 5: Three service disciplines are implemented: ! 6: when the ECMA interpretation of the ROS is used, ! 7: we term this the {\em basic\/} service discipline; ! 8: when the CCITT X.400 interpretation is used, ! 9: we term this the {\em advanced\/} service discipline; ! 10: and, ! 11: when the new ISO and CCITT MOTIS interpretation is used, ! 12: we term this the {\em complete\/} service discipline. ! 13: The advanced discipline is somewhat less restrictive than the basic ! 14: discipline, ! 15: at the cost of requiring a more complex implementation on the part of both ! 16: the provider and the user. ! 17: The complete discipline, in addition to all of the facilities provided by the ! 18: advanced discipline, also supports the notion of {\em linked\/} operations. ! 19: ! 20: The abstraction provided to applications is that of an {\em association\/} ! 21: for remote operations. ! 22: An association is a binding between two users: ! 23: the {\em initiator\/} of the association, ! 24: and the {\em responder\/} to the association. ! 25: Once an association is established, ! 26: the initiator requests the responder to perform remote operations. ! 27: The responder in turn attempts these operations, ! 28: replying with either a result or an error. ! 29: This process continues until the initiator decides to release the association. ! 30: ! 31: Like most models of OSI services, ! 32: the underlying assumption is one of an asynchronous environment: ! 33: the service provider may generate events for the service user without the ! 34: latter entity triggering the actions which led to the event. ! 35: For example, ! 36: in a synchronous environment, ! 37: an indication that data has arrived usually occurs only when the service user ! 38: asks the service provider to read data; ! 39: in an asynchronous environment, ! 40: the service provider may interrupt the service user at any time to announce ! 41: the arrival of data. ! 42: ! 43: The \verb"rosap" module in this release presents a synchronous interface. ! 44: However once the association is established, ! 45: an asynchronous interface may be selected. ! 46: ! 47: All of the routines in the \man librosap(3n) library are integer-valued. ! 48: They return the manifest constant \verb"OK" on success, ! 49: or \verb"NOTOK" otherwise. ! 50: ! 51: \section {Notice} ! 52: Please read the following important message. ! 53: \[\fbox{\begin{tabular}{lp{0.8\textwidth}} ! 54: \bf NOTE:& The interface described herein is a ``raw'' interface to the ! 55: remote operations service. ! 56: Consult \volfour/ for a ``cooked'' interface. ! 57: \end{tabular}}\] ! 58: ! 59: \section {Service Disciplines and Associations}\label{ros:disciplines} ! 60: There are three service disciplines for remote operations: ! 61: {\em basic}, {\em remote}, and {\em complete}. ! 62: The basic service discipline limits its users by permitting only the ! 63: initiator to invoke remote operations. ! 64: Certain applications, ! 65: e.g., message handling systems, ! 66: require more freedom than this, ! 67: along with more reliability. ! 68: ! 69: The Remote Operations Service Element does not establish associations. ! 70: Consult Section~\ref{acs:note} to determine which mechanism you should use to ! 71: manage associations for your application. ! 72: Since the advanced and complete disciplines are both proper supersets of the ! 73: basic service discipline, ! 74: two users of an association can utilize exactly the features of the basic ! 75: service discipline even though the advanced or complete service discipline has ! 76: been selected, ! 77: without a loss of generality. ! 78: ! 79: \section {Remote Operations}\label{ros:operations} ! 80: Once the association has been established, ! 81: an association-descriptor is used to reference the association. ! 82: This is usually the first parameter given to any of the remaining routines in ! 83: the \man librosap(3n) library. ! 84: Further, ! 85: the last parameter is usually a pointer to a \verb"RoSAPindication" ! 86: structure. ! 87: If a call to one of these routines fails, ! 88: then the structure is updated. ! 89: \begin{quote}\index{RoSAPindication}\small\begin{verbatim} ! 90: struct RoSAPindication { ! 91: int roi_type; ! 92: #define ROI_INVOKE 0x00 ! 93: #define ROI_RESULT 0x01 ! 94: #define ROI_ERROR 0x02 ! 95: #define ROI_UREJECT 0x03 ! 96: #define ROI_PREJECT 0x04 ! 97: #define ROI_END 0x05 ! 98: #define ROI_FINISH 0x06 ! 99: ! 100: union { ! 101: struct RoSAPinvoke roi_un_invoke; ! 102: struct RoSAPresult roi_un_result; ! 103: struct RoSAPerror roi_un_error; ! 104: struct RoSAPureject roi_un_ureject; ! 105: struct RoSAPpreject roi_un_preject; ! 106: struct RoSAPend roi_un_end; ! 107: struct AcSAPfinish roi_un_finish; ! 108: } roi_un; ! 109: #define roi_invoke roi_un.roi_un_invoke ! 110: #define roi_result roi_un.roi_un_result ! 111: #define roi_error roi_un.roi_un_error ! 112: #define roi_ureject roi_un.roi_un_ureject ! 113: #define roi_preject roi_un.roi_un_preject ! 114: #define roi_end roi_un.roi_un_end ! 115: #define roi_finish roi_un.roi_un_finish ! 116: }; ! 117: \end{verbatim}\end{quote} ! 118: As shown, this structure is really a discriminated union ! 119: (a structure with a tag element followed by a union). ! 120: Hence, on a failure return, ! 121: one first coerces a pointer to the \verb"RoSAPpreject" structure contained ! 122: therein, ! 123: and then consults the elements of that structure. ! 124: \begin{quote}\index{RoSAPpreject}\small\begin{verbatim} ! 125: struct RoSAPpreject { ! 126: int rop_reason; ! 127: ! 128: int rop_id; ! 129: PE rop_apdu; ! 130: ! 131: #define ROP_SIZE 512 ! 132: int rop_cc; ! 133: char rop_data[ROP_SIZE]; ! 134: }; ! 135: \end{verbatim}\end{quote} ! 136: The elements of a \verb"RoSAPpreject" structure are: ! 137: \begin{describe} ! 138: \item[\verb"rop\_reason":] the reason for the provider-initiated reject ! 139: (codes are listed in Table~\ref{RoSAPreasons}), ! 140: ! 141: \item[\verb"rop\_id"/\verb"rop\_apdu":] if an APDU could not be transferred ! 142: (\verb"rop_reason" is \verb"ROS_APDU"), then this is the invocation ID ! 143: of the APDU and (possibly) the APDU itself, respectively; ! 144: and, ! 145: ! 146: \item[\verb"rop\_data"/\verb"rop\_cc":] a diagnostic string from the provider. ! 147: \end{describe} ! 148: \tagtable[tp]{2b-1a}{RoSAP Failure Codes}{RoSAPreasons} ! 149: \tagtable[tp]{2b-1b}{RoSAP Failure Codes (continued)}\empty ! 150: Note that the \verb"rop_apdu" element is allocated via \man malloc(3) and ! 151: should be released using the \verb"ROPFREE" macro when no longer referenced. ! 152: The \verb"ROPFREE" macro behaves as if it was defined as: ! 153: \begin{quote}\index{ROPFREE}\small\begin{verbatim} ! 154: void ROPFREE (rop) ! 155: struct RoSAPpreject *rop; ! 156: \end{verbatim}\end{quote} ! 157: The macro frees only the data allocated in the \verb"RoSAPpreject" structure ! 158: and not the structure itself. ! 159: ! 160: On a failure return, ! 161: if the \verb"rop_reason" element of the \verb"RoSAPpreject" structure is ! 162: associated with a fatal error, ! 163: the the association is released. ! 164: The \verb"ROS_FATAL" macro can be used to determine this. ! 165: \begin{quote}\index{ROS\_FATAL}\small\begin{verbatim} ! 166: int ROS_FATAL (r) ! 167: int r; ! 168: \end{verbatim}\end{quote} ! 169: For protocol purists, ! 170: the \verb"ROS_OFFICIAL" macro can be used to determine if the error is an ! 171: ``official'' error as defined by the specification, ! 172: or an ``unofficial'' error used by the implementation. ! 173: \begin{quote}\index{ROS\_OFFICIAL}\small\begin{verbatim} ! 174: int ROS_OFFICIAL (r) ! 175: int r; ! 176: \end{verbatim}\end{quote} ! 177: ! 178: Finally, ! 179: some of these routines also take a \verb"priority" parameter indicating the ! 180: relative importance of the remote operation. ! 181: Under the basic service discipline, ! 182: this parameter is ignored. ! 183: Under the advanced or complete service discipline, ! 184: each application decides on its own integer-valued definitions. ! 185: The manifest constant \verb"ROS_NOPRIO" can be used if the application is ! 186: unconcerned with the priority. ! 187: ! 188: \subsection {Selecting an Underlying Service}\label{ros:underlying} ! 189: As should be obvious from Section~\ref{ros:disciplines}, ! 190: the \man librosap(3n) library supports the use of three different underlying ! 191: services, ! 192: depending on the method used to establish the association. ! 193: The \man librosap(3n) library is constructed in such a way as to ! 194: avoid loading the object code for all three underlying services ! 195: when only one is desired. ! 196: In order to effect this, ! 197: it is necessary to give the loader a small hint. ! 198: ! 199: Once an association has been established, ! 200: the \verb"RoSetService" routine should be called. ! 201: \begin{quote}\index{RoSetService}\small\begin{verbatim} ! 202: int RoSetService (sd, bfunc, roi) ! 203: int sd; ! 204: IFP bfunc; ! 205: struct RoSAPindication *roi; ! 206: \end{verbatim}\end{quote} ! 207: The parameters to this procedure are: ! 208: \begin{describe} ! 209: \item[\verb"sd":] the association-descriptor; ! 210: ! 211: \item[\verb"bfunc":] a {\em magic\/} argument, use: ! 212: \[\begin{tabular}{|l|l|l|} ! 213: \hline ! 214: \multicolumn{1}{|c|}{\bf Value}& ! 215: \multicolumn{1}{c|}{\bf Underlying Service}& ! 216: \multicolumn{1}{c|}{\bf Routine}\\ ! 217: \hline ! 218: \tt RoRtService& Reliable Transfer& \tt RtOpenResponse\\ ! 219: & & \tt RtOpenRequest\\ ! 220: & & \tt RtBeginResponse\\ ! 221: & & \tt RtBeginRequest\\ ! 222: \hline ! 223: \tt RoPService& Presentation& \tt AcAssocResponse\\ ! 224: & & \tt AcAssocRequest\\ ! 225: \hline ! 226: \tt RoSService& Session& \tt RoBeginResponse\\ ! 227: & & \tt RoBeginRequest\\ ! 228: \hline ! 229: \end{tabular}\] ! 230: ! 231: \item[\verb"roi":] a pointer to a \verb"RoSAPindication" structure, ! 232: which is updated only if the call fails. ! 233: \end{describe} ! 234: The call to \verb"RoSetService" should be made after a succesful return from ! 235: any of the routines listed above. ! 236: ! 237: \subsection {Invoking Operations} ! 238: The \verb"RoInvokeRequest" routine is used to request an operation to be ! 239: performed remotely, ! 240: and corresponds to a {\sf RO-INVOKE.REQUEST\/} action. ! 241: Under the basic service discipline, ! 242: this action may be taken by only the initiator of an association; ! 243: under the advanced or complete service discipline, ! 244: no such restriction is made. ! 245: \begin{quote}\index{RoInvokeRequest}\small\begin{verbatim} ! 246: int RoInvokeRequest (sd, op, class, args, invoke, ! 247: linked, priority, roi) ! 248: int sd; ! 249: int op, ! 250: class, ! 251: invoke, ! 252: *linked, ! 253: priority; ! 254: PE args; ! 255: struct RoSAPindication *roi; ! 256: \end{verbatim}\end{quote} ! 257: The parameters to this procedure are: ! 258: \begin{describe} ! 259: \item[\verb"sd":] the association-descriptor; ! 260: ! 261: \item[\verb"op":] the operation code; ! 262: ! 263: \item[\verb"class":] the operation class ! 264: (either \verb"ROS_SYNC" for a synchronous operation, ! 265: or \verb"ROS_ASYNC" for an asynchronous one); ! 266: ! 267: \item[\verb"args":] the arguments for the operation; ! 268: ! 269: \item[\verb"invoke":] the invocation ID of this request; ! 270: ! 271: \item[\verb"linked":] the linked ID of this request ! 272: (only present if the complete service discipline has been selected, ! 273: use \verb"NULLIP" otherwise); ! 274: ! 275: \item[\verb"priority":] the priority of this request ! 276: (use \verb"ROS_NOPRIO" if the priority is undetermined); ! 277: and, ! 278: ! 279: \item[\verb"roi":] a pointer to a \verb"RoSAPindication" structure, which is ! 280: always updated on synchronous operations, ! 281: and only updated if the call fails for asynchronous operations. ! 282: \end{describe} ! 283: If the \verb"class" parameter was \verb"ROS_ASYNC", ! 284: then \verb"RoInvokeRequest" returns immediately. ! 285: Otherwise, ! 286: after queuing the request, ! 287: the \verb"RoWaitRequest" routine ! 288: (described in Section~\ref{replies} on page~\pageref{replies}) ! 289: is called implicitly to return the reply of the request. ! 290: Every attempt will be made to return the corresponding reply to the request. ! 291: Nevertheless, ! 292: it is the responsibility of the user to verify the invocation ID which is ! 293: returned. ! 294: ! 295: The routine \verb"RoIntrRequest" is similar to \verb"RoInvokeRequest" ! 296: with a \verb"class" argument of \verb"ROS_SYNC": ! 297: it invokes an operation and then waits for a response. ! 298: However, ! 299: if the user generates an interrupt, ! 300: usually by typing control-C (`\verb"^C"'), ! 301: then \verb"RoIntrRequest" will return immediately by simulating ! 302: a {\sf RO-U-REJECT.INDICATION\/} with reason \verb"ROS_INTERRPUTED" ! 303: (see section~\ref{rejections} on page~\pageref{rejections}). ! 304: This is useful for users of remote operations which support an ! 305: ``abandon'' functionality (e.g., the OSI Directory). ! 306: \begin{quote}\index{RoInvokeRequest}\small\begin{verbatim} ! 307: int RoIntrRequest (sd, op, args, invoke, linked, ! 308: priority, roi) ! 309: int sd; ! 310: int op, ! 311: invoke, ! 312: *linked, ! 313: priority; ! 314: PE args; ! 315: struct RoSAPindication *roi; ! 316: \end{verbatim}\end{quote} ! 317: The parameters to this procedure are: ! 318: \begin{describe} ! 319: \item[\verb"sd":] the association-descriptor; ! 320: ! 321: \item[\verb"op":] the operation code; ! 322: ! 323: \item[\verb"args":] the arguments for the operation; ! 324: ! 325: \item[\verb"invoke":] the invocation ID of this request; ! 326: ! 327: \item[\verb"linked":] the linked ID of this request ! 328: (only present if the complete service discipline has been selected, ! 329: use \verb"NULLIP" otherwise); ! 330: ! 331: \item[\verb"priority":] the priority of this request ! 332: (use \verb"ROS_NOPRIO" if the priority is undetermined); ! 333: and, ! 334: ! 335: \item[\verb"roi":] a pointer to a \verb"RoSAPindication" structure, which is ! 336: always updated on synchronous operations, ! 337: and only updated if the call fails for asynchronous operations. ! 338: \end{describe} ! 339: ! 340: ! 341: \subsection {Replying to Requests} ! 342: When a request to perform a remote operation has been received by the ! 343: responder to an association, ! 344: the responder either returns a result or an error ! 345: (or in some cases, returns nothing at all). ! 346: ! 347: The \verb"RoResultRequest" routine is used to return a result, ! 348: and corresponds to the {\sf RO-RESULT.REQUEST\/} action. ! 349: Under the basic service discipline, ! 350: this action may only be taken by the responder to an association; ! 351: under the advanced or complete service discipline, ! 352: no such restriction is made. ! 353: \begin{quote}\index{RoResultRequest}\small\begin{verbatim} ! 354: int RoResultRequest (sd, invoke, op, result, priority, roi) ! 355: int sd; ! 356: int invoke, ! 357: op, ! 358: priority; ! 359: PE result; ! 360: struct RoSAPindication *roi; ! 361: \end{verbatim}\end{quote} ! 362: The parameters to this procedure are: ! 363: \begin{describe} ! 364: \item[\verb"sd":] the association-descriptor; ! 365: ! 366: \item[\verb"invoke":] the invocation ID of the request corresponding to this ! 367: reply; ! 368: ! 369: \item[\verb"op":] the operation code of the operation performed ! 370: (meaningful only in the complete service discipline); ! 371: ! 372: \item[\verb"result":] the results of the operation; ! 373: ! 374: \item[\verb"priority":] the priority of this reply; ! 375: and, ! 376: ! 377: \item[\verb"roi":] a pointer to a \verb"RoSAPindication" structure, which is ! 378: updated only if the call fails. ! 379: \end{describe} ! 380: ! 381: The \verb"RoErrorRequest" routine is used to return an error, ! 382: and corresponds to the {\sf RO-ERROR.REQUEST\/} action. ! 383: Under the basic service discipline, ! 384: this action may only be taken by the responder to an association; ! 385: under the advanced or complete service discipline, ! 386: no such restriction is made. ! 387: \begin{quote}\index{RoErrorRequest}\small\begin{verbatim} ! 388: int RoErrorRequest (sd, invoke, error, params, ! 389: priority, roi) ! 390: int sd; ! 391: int invoke, ! 392: error, ! 393: priority; ! 394: PE params; ! 395: struct RoSAPindication *roi; ! 396: \end{verbatim}\end{quote} ! 397: The parameters to this procedure are: ! 398: \begin{describe} ! 399: \item[\verb"sd":] the association-descriptor; ! 400: ! 401: \item[\verb"invoke":] the invocation ID of the request corresponding to this ! 402: reply; ! 403: ! 404: \item[\verb"op":] the error code; ! 405: ! 406: \item[\verb"params":] the parameters for the error; ! 407: ! 408: \item[\verb"priority":] the priority of this request; ! 409: and, ! 410: ! 411: \item[\verb"roi":] a pointer to a \verb"RoSAPindication" structure, which is ! 412: updated only if the call fails. ! 413: \end{describe} ! 414: ! 415: \subsection {Reading Replies}\label{replies} ! 416: The \verb"RoWaitRequest" routine is used to await either a request or a ! 417: reply from the other user. ! 418: \begin{quote}\index{RoWaitRequest}\small\begin{verbatim} ! 419: int RoWaitRequest (sd, secs, roi) ! 420: int sd; ! 421: int secs; ! 422: struct RoSAPindication *roi; ! 423: \end{verbatim}\end{quote} ! 424: The parameters to this procedure are: ! 425: \begin{describe} ! 426: \item[\verb"sd":] the association-descriptor; ! 427: ! 428: \item[\verb"secs":] the maximum number of seconds to wait for the data ! 429: (a value of \verb"NOTOK" indicates that the call should block indefinitely, ! 430: whereas a value of \verb"OK" indicates that the call should not block at all, ! 431: e.g., a polling action); ! 432: and, ! 433: ! 434: \item[\verb"roi":] a pointer to a \verb"RoSAPindication" structure, ! 435: which is always updated. ! 436: \end{describe} ! 437: Unlike the other routines in the \man librosap(3n) library, ! 438: the \verb"RoWaitRequest" routine returns one of three values: ! 439: \verb"NOTOK" (on failure), ! 440: \verb"OK" (on reading a request or a reply), ! 441: or ! 442: \verb"DONE" (when something else happens). ! 443: ! 444: If the call to \verb"RoWaitRequest" returns the manifest constant ! 445: \verb"NOTOK", ! 446: then the \verb"RoSAPpreject" structure contained in ! 447: the \verb"RoSAPindication" parameter ! 448: \verb"roi" contains the reason for the failure. ! 449: ! 450: Otherwise if the call to \verb"RoWaitRequest" returns the manifest constant ! 451: \verb"OK", ! 452: then a request or a reply has arrived. ! 453: This event is encoded in the \verb"roi" parameter, ! 454: depending on the value of the \verb"roi_type" element. ! 455: Currently, ! 456: when \verb"RoWaitRequest" returns \verb"OK", ! 457: the \verb"roi_type" element is set to one of four values: ! 458: \[\begin{tabular}{|l|l|} ! 459: \hline ! 460: \multicolumn{1}{|c|}{\bf Value}& ! 461: \multicolumn{1}{c|}{\bf Event}\\ ! 462: \hline ! 463: \tt ROI\_INVOKE& \sf RO-INVOKE.INDICATION\\ ! 464: \tt ROI\_RESULT& \sf RO-RESULT.INDICATION\\ ! 465: \tt ROI\_ERROR& \sf RO-ERROR.INDICATION\\ ! 466: \tt ROI\_UREJECT& \sf RO-U-REJECT.INDICATION\\ ! 467: \hline ! 468: \end{tabular}\] ! 469: ! 470: Otherwise if the call to \verb"RoWaitRequest" returns the manifest constant ! 471: \verb"DONE", ! 472: then some event other than a request or reply arriving has occurred. ! 473: This event is encoded in the \verb"roi" parameter, ! 474: depending on the value of the \verb"roi_type" element. ! 475: Currently, ! 476: when \verb"RoWaitRequest" returns \verb"DONE", ! 477: the \verb"roi_type" element is set to one of two values: ! 478: \[\begin{tabular}{|l|l|} ! 479: \hline ! 480: \multicolumn{1}{|c|}{\bf Value}& ! 481: \multicolumn{1}{c|}{\bf Event}\\ ! 482: \hline ! 483: \tt ROI\_END& \sf RO-END.INDICATION\\ ! 484: & \ \ (for old-style associations)\\ ! 485: \hline ! 486: \tt ROI\_FINISH& \sf A-RELEASE.INDICATION\\ ! 487: & \ \ (or {\sf RT-CLOSE.INDICATION\/})\\ ! 488: \hline ! 489: \end{tabular}\] ! 490: ! 491: \subsubsection {Invocation Indication} ! 492: When an {\sf RO-INVOKE.INDICATION\/} event occurs, ! 493: the \verb"roi_type" field of the \verb"roi" parameter contains the value ! 494: \verb"ROI_INVOKE", ! 495: and a \verb"RoSAPinvoke" structure is contained inside the \verb"roi" ! 496: parameter. ! 497: \begin{quote}\index{RoSAPinvoke}\small\begin{verbatim} ! 498: struct RoSAPinvoke { ! 499: int rox_id; ! 500: ! 501: int rox_linkid; ! 502: int rox_nolinked; ! 503: ! 504: int rox_op; ! 505: PE rox_args; ! 506: }; ! 507: \end{verbatim}\end{quote} ! 508: The elements of this structure are: ! 509: \begin{describe} ! 510: \item[\verb"rox\_id":] the invocation ID of this request; ! 511: ! 512: \item[\verb"rox\_linkid":] if \verb"rox_nolinked" is not set, ! 513: then this contains the invocation ID of the linked request; ! 514: ! 515: \item[\verb"rox\_nolinked":] the linked ID indicator ! 516: (if set, then this invocation is not linked to another operation); ! 517: ! 518: \item[\verb"rox\_op":] the operation code; ! 519: and, ! 520: ! 521: \item[\verb"rox\_args":] the arguments for the operation. ! 522: \end{describe} ! 523: Note that the \verb"rox_data" element is allocated via \man malloc(3) and ! 524: should be released using the \verb"ROXFREE" macro when no longer referenced. ! 525: The \verb"ROXFREE" macro behaves as if it was defined as: ! 526: \begin{quote}\index{ROXFREE}\small\begin{verbatim} ! 527: void ROXFREE (rox) ! 528: struct RoSAPinvoke *rox; ! 529: \end{verbatim}\end{quote} ! 530: The macro frees only the data allocated in the \verb"RoSAPinvoke" structure ! 531: and not the structure itself. ! 532: ! 533: Under the basic service discipline, ! 534: only the responder to an association will receive this event; ! 535: it is expected that the user will (eventually) call either ! 536: the \verb"RoResultRequest", the \verb"RoErrorRequest", ! 537: or perhaps the \verb"RoURejectRequest" routine in response. ! 538: ! 539: \subsubsection {Result Indication} ! 540: When an {\sf RO-RESULT.INDICATION\/} event occurs, ! 541: the \verb"roi_type" field of the \verb"roi" parameter contains the value ! 542: \verb"ROI_RESULT", ! 543: and a \verb"RoSAPresult" structure is contained inside the \verb"roi" ! 544: parameter. ! 545: \begin{quote}\index{RoSAPresult}\small\begin{verbatim} ! 546: struct RoSAPresult { ! 547: int ror_id; ! 548: ! 549: PE ror_result; ! 550: }; ! 551: \end{verbatim}\end{quote} ! 552: The elements of this structure are: ! 553: \begin{describe} ! 554: \item[\verb"ror\_id":] the invocation ID of this reply, ! 555: which is identical to the ID of the request which generated the results; ! 556: ! 557: \item[\verb"ror\_op":] the operation code of the operation performed ! 558: (meaningful only in the complete service discipline); ! 559: and, ! 560: ! 561: \item[\verb"ror\_result":] the results of the operation. ! 562: \end{describe} ! 563: Note that the \verb"ror_result" element is allocated via \man malloc(3) and ! 564: should be released using the \verb"RORFREE" macro when no longer referenced. ! 565: The \verb"RORFREE" macro behaves as if it was defined as: ! 566: \begin{quote}\index{RORFREE}\small\begin{verbatim} ! 567: void RORFREE (ror) ! 568: struct RoSAPresult *ror; ! 569: \end{verbatim}\end{quote} ! 570: The macro frees only the data allocated in the \verb"RoSAPresult" structure ! 571: and not the structure itself. ! 572: ! 573: Under the basic service discipline, ! 574: only the initiator to an association will receive this event in response to ! 575: an earlier call to \verb"RoInvokeRequest". ! 576: ! 577: \subsubsection {Error Indication} ! 578: When an {\sf RO-ERROR.INDICATION\/} event occurs, ! 579: the \verb"roi_type" field of the \verb"roi" parameter contains the value ! 580: \verb"ROI_ERROR", ! 581: and a \verb"RoSAPerror" structure is contained inside the \verb"roi" ! 582: parameter. ! 583: \begin{quote}\index{RoSAPerror}\small\begin{verbatim} ! 584: struct RoSAPerror { ! 585: int roe_id; ! 586: ! 587: int roe_error; ! 588: PE roe_param; ! 589: }; ! 590: \end{verbatim}\end{quote} ! 591: The elements of this structure are: ! 592: \begin{describe} ! 593: \item[\verb"roe\_id":] the invocation ID of this reply, ! 594: which is identical to the ID of the request which generated the error; ! 595: ! 596: \item[\verb"roe\_error":] the error code; ! 597: and, ! 598: ! 599: \item[\verb"roe\_param":] the parameters of the error. ! 600: \end{describe} ! 601: Note that the \verb"roe_param" element is allocated via \man malloc(3) and ! 602: should be released using the \verb"ROEFREE" macro when no longer referenced. ! 603: The \verb"ROEFREE" macro behaves as if it was defined as: ! 604: \begin{quote}\index{ROEFREE}\small\begin{verbatim} ! 605: void ROEFREE (roe) ! 606: struct RoSAPerror *roe; ! 607: \end{verbatim}\end{quote} ! 608: The macro frees only the data allocated in the \verb"RoSAPerror" structure ! 609: and not the structure itself. ! 610: ! 611: Under the basic service discipline, ! 612: only the initiator to an association will receive this event in response to ! 613: an earlier call to \verb"RoInvokeRequest". ! 614: ! 615: \subsubsection {User-Reject Indication}\label{rejections} ! 616: When an {\sf RO-U-REJECT.INDICATION\/} event occurs, ! 617: the \verb"roi_type" field of the \verb"roi" parameter contains the value ! 618: \verb"ROI_UREJECT", ! 619: and a \verb"RoSAPureject" structure is contained inside the \verb"roi" ! 620: parameter. ! 621: \begin{quote}\index{RoSAPureject}\small\begin{verbatim} ! 622: struct RoSAPureject { ! 623: int rou_id; ! 624: int rou_noid; ! 625: ! 626: int rou_reason; ! 627: }; ! 628: \end{verbatim}\end{quote} ! 629: The elements of this structure are: ! 630: \begin{describe} ! 631: \item[\verb"rou\_id":] if \verb"rou_noid" is not set, ! 632: then this contains the invocation ID of the request which generated the ! 633: rejection; ! 634: ! 635: \item[\verb"rou\_noid":] the invocation ID indicator ! 636: (if set, then no request in particular caused the rejection to be generated); ! 637: and, ! 638: ! 639: \item[\verb"rou\_reason":] the reason for the rejection ! 640: (a ``non-fatal'' user-initiated rejection code listed in ! 641: Table~\ref{RoSAPreasons}). ! 642: \end{describe} ! 643: ! 644: \subsubsection {End Indication}\label{ros:end} ! 645: When the \verb"roi_type" field of the \verb"roi" parameter contains the value ! 646: \verb"ROI_END", ! 647: a \verb"RoSAPend" structure is contained inside the \verb"roi" ! 648: parameter. ! 649: \begin{quote}\index{RoSAPend}\small\begin{verbatim} ! 650: struct RoSAPend { ! 651: int roe_dummy; ! 652: }; ! 653: \end{verbatim}\end{quote} ! 654: Depending on whether the reliable transfer service was used to start the ! 655: association, ! 656: a {\sf X.400 CLOSE.INDICATION\/} or a {\sf RO-END.INDICATION\/} event has ! 657: occurred, ! 658: and the user should respond appropriately. ! 659: ! 660: \subsubsection {Finish Indication}\label{ros:finish} ! 661: When the \verb"roi_type" field of the \verb"RoSAPindication" parameter ! 662: \verb"roi" contains the value ! 663: \verb"ROI_FINISH", ! 664: a \verb"AcSAPfinish" structure is contained inside the \verb"roi" parameter. ! 665: Depending on whether the reliable transfer service was used to start the ! 666: association, ! 667: an {\sf RT-CLOSE.INDICATION\/} or an {\sf A-RELEASE.INDICATION\/} event has ! 668: occurred, and the user should respond appropriately. ! 669: ! 670: \subsection {Rejecting Requests and Replies} ! 671: The \verb"RoURejectRequest" routine is used to perform user-level ! 672: error-recovery. ! 673: Usually, ! 674: it signals the rejection of a previously received request or reply. ! 675: \begin{quote}\index{RoURejectRequest}\small\begin{verbatim} ! 676: int RoURejectRequest (sd, invoke, reason, priority, roi) ! 677: int sd; ! 678: int *invoke, ! 679: reason, ! 680: priority; ! 681: struct RoSAPindication *roi; ! 682: \end{verbatim}\end{quote} ! 683: The parameters to this procedure are: ! 684: \begin{describe} ! 685: \item[\verb"sd":] the association-descriptor; ! 686: ! 687: \item[\verb"invoke":] a pointer to the invocation ID of the request in ! 688: question (or \verb"NULLIP" if this rejection does not apply to a particular ! 689: request or reply); ! 690: ! 691: \item[\verb"reason":] a ``non-fatal'' user-initiated rejection code as ! 692: listed in Table~\ref{RoSAPreasons} on page~\pageref{RoSAPreasons}; ! 693: ! 694: \item[\verb"priority":] the priority of this request; ! 695: and, ! 696: ! 697: \item[\verb"roi":] a pointer to a \verb"RoSAPindication" structure, which is ! 698: updated only if the call fails. ! 699: \end{describe} ! 700: Upon a successful return from this call, ! 701: a {\sf ROU-U-REJECT.INDICATION\/} event has been queued for the other user. ! 702: ! 703: \subsection {Asynchronous Event Handling} ! 704: The request/reply events discussed thus far have been synchronous in nature. ! 705: Some users of the remote operations service may wish an asynchronous interface. ! 706: The \verb"RoSetIndications" routine is used to change the service associated ! 707: with an association-descriptor to an asynchronous interface. ! 708: \begin{quote}\index{RoSetIndications}\small\begin{verbatim} ! 709: int RoSetIndications (sd, indication, roi) ! 710: int sd; ! 711: IFP indication; ! 712: struct RoSAPindication *roi; ! 713: \end{verbatim}\end{quote} ! 714: The parameters to this procedure are: ! 715: \begin{describe} ! 716: \item[\verb"sd":] the association-descriptor; ! 717: ! 718: \item[\verb"indication":] the address of an event-handler routine to be ! 719: invoked when an event occurs; ! 720: and, ! 721: ! 722: \item[\verb"roi":] a pointer to a \verb"RoSAPindication" structure, which is ! 723: updated only if the call fails. ! 724: \end{describe} ! 725: If the service is to be made asynchronous, ! 726: then \verb"indication" is specified; ! 727: otherwise, ! 728: if the service is to be made synchronous, ! 729: it is not specified (use the manifest constant \verb"NULLIFP"). ! 730: The most likely reason for the call failing is \verb"ROS_WAITING", ! 731: which indicates that an event is waiting for the user. ! 732: ! 733: When an event occurs, ! 734: the event-handler routine is invoked with two parameters: ! 735: \begin{quote}\small\begin{verbatim} ! 736: (*handler) (sd, roi); ! 737: int sd; ! 738: struct RoSAPindication *roi; ! 739: \end{verbatim}\end{quote} ! 740: The parameters are: ! 741: \begin{describe} ! 742: \item[\verb"sd":] the association-descriptor; ! 743: and, ! 744: ! 745: \item[\verb"roi":] a pointer to a \verb"RoSAPindication" structure encoding ! 746: the event. ! 747: \end{describe} ! 748: Note that the data contained in the structure was allocated via \man malloc(3), ! 749: and should be released with the appropriate macro ! 750: (i.e., \verb"ROPFREE", \verb"ROXFREE", \verb"RORFREE", or \verb"ROEFREE") ! 751: when no longer needed. ! 752: ! 753: When an event-handler is invoked, ! 754: future invocations of the event-hander are blocked until it returns. ! 755: The return value of the event-handler is ignored. ! 756: Further, ! 757: during the execution of a synchronous call to the library, ! 758: the event-handler will be blocked from being invoked. ! 759: The one exception to this is a call to \verb"RoInvokeRequest" with the ! 760: \verb"class" parameter set to \verb"ROS_SYNC". ! 761: In this circumstance, ! 762: replies to invocations other than the one being waited for will result in the ! 763: event-handler being invoked as appropriate. ! 764: ! 765: \[\fbox{\begin{tabular}{lp{0.8\textwidth}} ! 766: \bf NOTE:& The \man librosap(3n) library uses the SIGEMT signal to ! 767: provide these services. ! 768: Programs using asynchronous association-descriptors should NOT ! 769: use SIGEMT for other purposes. ! 770: \end{tabular}}\] ! 771: ! 772: \subsection {Synchronous Event Multiplexing} ! 773: A user of the remote operations service may wish to manage multiple ! 774: association-descriptors simultaneously; ! 775: the routine \verb"RoSelectMask" is provided for this purpose. ! 776: This routine updates a file-descriptor mask and associated counter for use ! 777: with \verb"xselect" (consult Section~\ref{acs:select}), ! 778: as assocation-descriptors are file-descriptors. ! 779: \begin{quote}\index{RoSelectMask}\small\begin{verbatim} ! 780: int RoSelectMask (sd, mask, nfds, roi) ! 781: int sd; ! 782: fd_set *mask; ! 783: int *nfds; ! 784: struct RoSAPindication *roi; ! 785: \end{verbatim}\end{quote} ! 786: The parameters to this procedure are: ! 787: \begin{describe} ! 788: \item[\verb"sd":] the association-descriptor; ! 789: ! 790: \item[\verb"mask":] a pointer to a file-descriptor mask meaningful to ! 791: \verb"xselect"; ! 792: ! 793: \item[\verb"nfds":] a pointer to an integer-valued location meaningful to ! 794: \verb"xselect"; ! 795: and, ! 796: ! 797: \item[\verb"roi":] a pointer to a \verb"RoSAPindication" structure, which is ! 798: updated only if the call fails. ! 799: \end{describe} ! 800: If the call is successful, then the \verb"mask" and \verb"nfds" parameters can ! 801: be used as arguments to \verb"xselect". ! 802: The most likely reason for the call failing is \verb"ROS_WAITING", ! 803: which indicates that an event is waiting for the user. ! 804: ! 805: If \verb"xselect" indicates that the association-descriptor is ready for ! 806: reading, ! 807: \verb"RoWaitRequest" should be called with the \verb"secs" parameter equal to ! 808: \verb"OK". ! 809: If the network activity does not constitute an entire event for the user, ! 810: then \verb"RoWaitRequest" will return \verb"NOTOK" with error code ! 811: \verb"ROS_TIMER". ! 812: ! 813: \section {Error Conventions} ! 814: All of the routines in this library return the manifest constant \verb"NOTOK" ! 815: on error, ! 816: and also update the \verb"roi" parameter given to the routine. ! 817: The element called \verb"roi_preject" in the \verb"RoSAPindication" structure ! 818: encodes the reason for the failure. ! 819: To determine the reason, ! 820: one coerces a pointer to a \verb"RoSAPpreject" structure, ! 821: and consults the \verb"rop_reason" element of this latter structure. ! 822: This element can be given as a ! 823: parameter to the routine \verb"RoErrString" which returns a null-terminated ! 824: diagnostic string. ! 825: \begin{quote}\index{RoErrString}\small\begin{verbatim} ! 826: char *RoErrString (c) ! 827: int c; ! 828: \end{verbatim}\end{quote} ! 829: ! 830: \section {Compiling and Loading} ! 831: Programs using the \man librosap(3n) library should include ! 832: \verb"<isode/rosap.h>", ! 833: which automatically includes the header file \verb"<isode/psap.h>" described in ! 834: Chapter~\ref{libpsap} and the header file \verb"<isode/acsap.h>" described in ! 835: Chapter~\ref{libacsap}. ! 836: The programs should also be loaded with \verb"-lisode". ! 837: ! 838: \section {Two Examples}\label{ros:example} ! 839: Two examples are now presented: ! 840: a detailed exposition on the construction of a responder for remote operations; ! 841: and, ! 842: a terse presentation of an initiator process. ! 843: ! 844: \subsection {The Generic Server}\label{ros:example:server} ! 845: Let's consider how one might construct a generic server which uses remote ! 846: operations services. ! 847: This entity will use an asynchronous interface. ! 848: ! 849: There are two parts to the program: ! 850: initialization and the request/reply loop. ! 851: In our example, ! 852: we assume that the routine \verb"error" results in the process being ! 853: terminated after printing a diagnostic. ! 854: ! 855: In Figure~\ref{initROSresponder}, ! 856: the initialization steps for the generic responder, ! 857: including the outer {\em C\/} wrapper, ! 858: is shown. ! 859: First, the ACSE state is re-captured by calling \verb"AcInit". ! 860: If this succeeds, ! 861: then any command line arguments ! 862: (as specified in the \man isoservices(5) file described in ! 863: Chapter~\ref{isoservices} of \voltwo/) ! 864: are parsed. ! 865: Assuming that the responder is satisfied with the proposed association, ! 866: it calls \verb"AcAssocResponse" to accept the association. ! 867: Then, ! 868: \verb"RoSetService" is called ! 869: to set the underlying service to be used for remote operations. ! 870: The ! 871: \verb"RoSetIndications" routine is called ! 872: to specify an asynchronous event handler. ! 873: Finally, ! 874: the main request/reply loop is realized. ! 875: The server simply uses \man pause(2) to wait for the next event. ! 876: ! 877: In Figure~\ref{doROSresponder} on page~\pageref{doROSresponder}, ! 878: the \verb"ros_indication" routine simply dispatches based on the value of the ! 879: \verb"roi_type" element of the \verb"RoSAPindication" structure. ! 880: {\let\small=\scriptsize %%% yikes! ! 881: \clearpage ! 882: \tagrind[tp]{grind2b-2}{Initializing the generic ROS responder}% ! 883: {initROSresponder} ! 884: \clearpage ! 885: \tagrind[tp]{grind2b-3a}{The request/reply loop for the generic ROS responder}% ! 886: {doROSresponder} ! 887: \clearpage ! 888: \tagrind[tp]{grind2b-3b}% ! 889: {The request/reply loop for the generic ROS responder (continued)}% ! 890: \empty ! 891: \clearpage ! 892: \tagrind[tp]{grind2b-3c}% ! 893: {The request/reply loop for the generic ROS responder (continued)}% ! 894: \empty ! 895: \clearpage ! 896: \tagrind[tp]{grind2b-3d}% ! 897: {The request/reply loop for the generic ROS responder (continued)}% ! 898: \empty ! 899: \clearpage ! 900: \tagrind[tp]{grind2b-3e}% ! 901: {The request/reply loop for the generic ROS responder (continued)}% ! 902: \empty} ! 903: ! 904: If the event was caused by a request to invoke an operation, ! 905: then \verb"ros_invoke" is called. ! 906: This routine consults a dispatch table to find the function which will ! 907: execute the operation. ! 908: Based on the return value of the function, ! 909: either the result is returned, ! 910: an error is returned, ! 911: or the request to perform the operation is rejected. ! 912: ! 913: If the event was caused by a reply to the invocation of an operation ! 914: (i.e., either results or an error), ! 915: this is rejected. ! 916: The basic service discipline prohibits this event from happening to ! 917: responders; ! 918: hence, the \verb"ros_result" and \verb"ros_error" routines are used as stubs. ! 919: ! 920: If the event was caused by a rejection of a previous reply, ! 921: then the \verb"ros_ureject" routine is called to handle this. ! 922: If the event was caused by the provider initiating a rejection, ! 923: then the \verb"ros_preject" routine is called to handle this. ! 924: ! 925: Finally, ! 926: if the event was caused by the association being released, ! 927: the \verb"ros_finish" routine is called to handle this. ! 928: ! 929: \subsection {The Generic Client} ! 930: As the previous example described~---~in great detail~---~how users of the ! 931: remote operations services employ the \man librosap(3n) library, ! 932: we now present a short example of how a client connects to the server. ! 933: ! 934: In Figure~\ref{initROSinitiator}, ! 935: the initialization steps for the generic initiator, ! 936: including the outer {\em C\/} wrapper, ! 937: is shown. ! 938: First, the application-entity information and presentation address are ! 939: looked-up. ! 940: Second, the application context and protocol control information objects are ! 941: looked-up ! 942: (and copied, since \verb"ode2oid" returns a pointer to a static area). ! 943: Next, the session connection reference is initialized. ! 944: Then, the call to \verb"AcAssocRequest" is made. ! 945: The arguments to this routine are the minimal required for remote operations. ! 946: If the call succeeds, ! 947: then the client checks to see if the association is successfully established. ! 948: If so, the association descriptor is captured, and then the routine ! 949: \verb"invoke", ! 950: which is not described in this example, ! 951: is called. ! 952: This routine presumably requests remote operations from the responder ! 953: previously described. ! 954: Upon the return of the \verb"invoke" routine, ! 955: the association is (forcibly) released, ! 956: and the program exits. ! 957: {\let\small=\scriptsize %%% yikes! ! 958: \clearpage ! 959: \tagrind[tp]{grind2b-4a}{Initializing the generic ROS initiator}% ! 960: {initROSinitiator} ! 961: \clearpage ! 962: \tagrind[tp]{grind2b-4b}{Initializing the generic ROS initiator (continued)}% ! 963: \empty} ! 964: ! 965: \section {For Further Reading}\label{ros:reading} ! 966: The ECMA technical report on remote operation services is defined in ! 967: \cite{ECMA.ROS}. ! 968: The CCITT recommendation describing remote operations, ! 969: as supported by the reliable transfer service, ! 970: is \cite{MHS.RTS}. ! 971: These both assume the use of old-style associations; ! 972: the draft CCITT work which assumes the use of new-style associations is ! 973: defined in \cite{CCITT.ROS.Service} and \cite{CCITT.ROS.Protocol}. ! 974: Similarly, ! 975: the corresponding ISO work is ! 976: \cite{ISO.ROS.Service} and \cite{ISO.ROS.Protocol}. ! 977: ! 978: %%% \section {Changes Since the Last Release}\label{rosap:changes} ! 979: %%% A brief summary of the major changes between v~\rosaprevrsn/ and ! 980: %%% v~\rosapvrsn/ are now presented. ! 981: %%% These are the user-visible changes only; ! 982: %%% changes of a strictly internal nature are not discussed. ! 983:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.