Annotation of 43BSDReno/contrib/isode-beta/doc/manual/librosy.tex, revision 1.1

1.1     ! root        1: % run this through LaTeX with the appropriate wrapper
        !             2: 
        !             3: \chapter       {Run-Time Environment}\label{librosy}
        !             4: The \man librosap(3n) library implements the run-time environment for the
        !             5: stubs generated by the \man rosy(1) program.
        !             6: 
        !             7: The routines described herein provide a more structured interface to the 
        !             8: remote operations service (ROS).
        !             9: They are used in the boilerplate routines which are described in the
        !            10: following chapters.
        !            11: Hence,
        !            12: the more hasty reader may wish to skip this chapter on first reading of this
        !            13: volume.
        !            14: 
        !            15: \section      {Notice}
        !            16: Please read the following important message.
        !            17: \[\fbox{\begin{tabular}{lp{0.8\textwidth}}
        !            18: \bf NOTE:&     When using the \man librosy(3n) library,
        !            19:                no calls should be made to the \man librosap(3n) library.
        !            20:                (That is, the \verb"RoXXX" routines should not be directly
        !            21:                referenced.)
        !            22: 
        !            23:                There are three exceptions: \verb"RoSetService" and
        !            24:                its related arguments (e.g., \verb"RoPService"),
        !            25:                \verb"RoSelectMask", and \verb"RoErrString".
        !            26: \end{tabular}}\]
        !            27: 
        !            28: \section      {Conventions}
        !            29: All of the routines in the \man librosy(3n) library are integer-valued.
        !            30: Unless otherwise indicated,
        !            31: they return the manifest constant \verb"OK" on success,
        !            32: or \verb"NOTOK" otherwise.
        !            33: 
        !            34: The routines all work on an established association,
        !            35: which is referenced by an association-descriptor.
        !            36: This is usually the first parameter given to any of the routines in the
        !            37: \man librosy(3n) library.
        !            38: Further,
        !            39: the last parameter is usually a pointer to a \verb"RoSAPindication" structure.
        !            40: If a call to one of these routines fails,
        !            41: then the structure is updated.
        !            42: Section~\ref{ros:operations} of \volone/ describes this structure and how to
        !            43: interpret error conditions and their severity.
        !            44: 
        !            45: \subsection    {Interface from ROSY}
        !            46: For a given module, e.g., \verb"MODULE",
        !            47: \pgm{rosy} will define two tables:
        !            48: \begin{quote}\small\begin{verbatim}
        !            49: struct RyOperation table_MODULE_Operations[];
        !            50: 
        !            51: struct RyError table_MODULE_Errors[];
        !            52: \end{verbatim}\end{quote}
        !            53: 
        !            54: The \verb"RyOperation" structure is used to define the compiled parts of an
        !            55: operation:
        !            56: \begin{quote}\small\index{RyOperation}\begin{verbatim}
        !            57: struct RyOperation {
        !            58:     char   *ryo_name;
        !            59:     int     ryo_op;
        !            60: 
        !            61:     IFP     ryo_arg_encode;
        !            62:     IFP     ryo_arg_decode;
        !            63:     IFP     ryo_arg_free;
        !            64: 
        !            65:     int     ryo_result;
        !            66:     IFP     ryo_res_encode;
        !            67:     IFP     ryo_res_decode;
        !            68:     IFP     ryo_res_free;
        !            69: 
        !            70:     struct RyError **ryo_errors;
        !            71: };
        !            72: \end{verbatim}\end{quote}
        !            73: The elements of this structure are:
        !            74: \begin{describe}
        !            75: \item[\verb"ryo\_name"/\verb"ryo\_op":] the operation name and code;
        !            76: 
        !            77: \item[\verb"ryo\_arg\_encode"/\verb"ryo\_arg\_decode":] the address of the
        !            78: routines to encode or decode (respectively) the operation's argument from a
        !            79: {\em C\/} structure to its corresponding abstract syntax
        !            80: (present only if the operation takes an argument);
        !            81: 
        !            82: \item[\verb"ryo\_arg\_free":] the routine to free the {\em C\/} structure
        !            83: created by the argument decode routine for the operation;
        !            84: 
        !            85: \item[\verb"ryo\_result":] non-zero if this operation returns a result;
        !            86: 
        !            87: \item[\verb"ryo\_res\_encode"/\verb"ryo\_res\_decode":] the address of the
        !            88: routines to encode or decode (respectively) the operation's result from a
        !            89: {\em C\/} structure to its corresponding abstract syntax
        !            90: (present only if the operation returns a result);
        !            91: 
        !            92: \item[\verb"ryo\_res\_free":] the routine to free the {\em C\/} structure
        !            93: created by the result decode routine for the operation;
        !            94: and,
        !            95: 
        !            96: \item[\verb"ryo\_errors":] a pointer to null-terminated list of the errors
        !            97: which this operation may generate (present only if the operation may returns
        !            98: at least one error).
        !            99: \end{describe}
        !           100: 
        !           101: The \verb"RyError" structure is used to define the compiled parts of an
        !           102: error:
        !           103: \begin{quote}\small\index{RyError}\begin{verbatim}
        !           104: struct RyError {
        !           105:     char   *rye_name;
        !           106:     int     rye_err;
        !           107: 
        !           108:     IFP     rye_param_encode;
        !           109:     IFP     rye_param_decode;
        !           110:     IFP     rye_param_free;
        !           111: };
        !           112: \end{verbatim}\end{quote}
        !           113: The elements of this structure are:
        !           114: \begin{describe}
        !           115: \item[\verb"rye\_name"/\verb"rye\_err":] the error name and code;
        !           116: 
        !           117: \item[\verb"rye\_param\_encode"/\verb"rye\_res\_decode":] the address of the
        !           118: routines to encode or decode (respectively) the error's parameter from a
        !           119: {\em C\/} structure to its corresponding abstract syntax
        !           120: (present only if the error contains a parameter);
        !           121: and,
        !           122: 
        !           123: \item[\verb"ryo\_param\_free":] the routine to free the {\em C\/} structure
        !           124: created by the parameter decode routine for the error.
        !           125: \end{describe}
        !           126: 
        !           127: \section      {Routines for Initiators}
        !           128: Initiators use the routines in the \man libacsap(3n) library for association
        !           129: control.
        !           130: These are described in Chapter~\ref{libacsap} of \volone/.
        !           131: 
        !           132: \section      {Routines for Invokers}\label{ryoperation}
        !           133: After forming an association,
        !           134: invokers are able to request operations for execution by the performer.
        !           135: Two interfaces are provided:
        !           136: a synchronous interface and an asynchronous interface.
        !           137: 
        !           138: \subsection*   {Synchronous Interface}
        !           139: Most invokers desire a simple interface for synchronous execution
        !           140: of operations (the operation blocks until it is completed).
        !           141: The \verb"RyOperation" routine is used to provide such an interface.
        !           142: \begin{quote}\index{RyOperation}\small\begin{verbatim}
        !           143: int     RyOperation (sd, ryo, op, in, out, response, roi)
        !           144: int     sd;
        !           145: struct RyOperation *ryo;
        !           146: int     op,
        !           147:        *response;
        !           148: caddr_t in,
        !           149:        *out;
        !           150: struct RoSAPindication *roi;
        !           151: \end{verbatim}\end{quote}
        !           152: The parameters to this procedure are:
        !           153: \begin{describe}
        !           154: \item[\verb"sd":] the association-descriptor;
        !           155: 
        !           156: \item[\verb"ryo":] a pointer to a \verb"RyOperation" table;
        !           157: 
        !           158: \item[\verb"op":] the operation code of the operation to invoke;
        !           159: 
        !           160: \item[\verb"response":] an integer-valued location which is updated if the
        !           161: call succeeds;
        !           162: 
        !           163: \item[\verb"in":] the address of the {\em C\/} structure for the operation's
        !           164: argument;
        !           165: 
        !           166: \item[\verb"out":] an address-valued location which is updated if the call
        !           167: succeeds;
        !           168: and,
        !           169: 
        !           170: \item[\verb"roi":] a pointer to a \verb"RoSAPindication" structure,
        !           171: which is updated only if the operation was not performed.
        !           172: \end{describe}
        !           173: The \verb"RyOperation" routine returns one of three values:
        !           174: \verb"NOTOK" (on failure),
        !           175: \verb"OK" (on reading a reply),
        !           176: or
        !           177: \verb"DONE" (when something else happens).
        !           178: 
        !           179: If the call to \verb"RyOperation" returns the manifest constant \verb"NOTOK",
        !           180: then the \verb"RoSAPpreject" structure contained in
        !           181: the \verb"RoSAPindication" parameter
        !           182: \verb"roi" contains the reason for the failure.
        !           183: 
        !           184: If the call to \verb"RyOperation" returns the manifest constant \verb"OK",
        !           185: then the \verb"response" and \verb"out" parameters are updated.
        !           186: If the value of the integer pointed to by \verb"response" is \verb"RY_RESULT",
        !           187: then the value of the address pointed to by \verb"out" is a newly allocated
        !           188: {\em C\/} structure for the operation's result (if any).
        !           189: If the value of the integer pointed to by \verb"response" is any other value,
        !           190: then it indicates the error which the operation returned,
        !           191: and the value of the address pointed to by \verb"out" is a newly allocated
        !           192: {\em C\/} structure for the error's parameter (if any).
        !           193: Note that if a result or parameter is returned,
        !           194: then it is the invoker's responsibility to release the memory used by the
        !           195: {\em C\/} structure, when appropriate.
        !           196: 
        !           197: If the call to \verb"RyOperation" returns the manifest constant \verb"DONE",
        !           198: then an indication that the association is pending termination is returned.
        !           199: The value of the \verb"roi_type" element of the \verb"RoSAPindication"
        !           200: parameter is either \verb"ROI_END" or \verb"ROI_FINISH".
        !           201: Consult Section~\ref{ros:end} of \volone/ for the details,
        !           202: as this normally does not happen to initiators.
        !           203: 
        !           204: The routine \verb"RyOperation" is simply a comprehensive interface for a more
        !           205: general routine, \verb"RyOpInvoke", which invokes an operation:
        !           206: \begin{quote}\index{RyOpInvoke}\small\begin{verbatim}
        !           207: int     RyOpInvoke (sd, ryo, op, in, out, rfx, efx, class,
        !           208:                 invokeID, linkedID, priority, roi)
        !           209: int     sd;
        !           210: struct RyOperation *ryo;
        !           211: int     op,
        !           212:         class,
        !           213:         invokeID,
        !           214:        *linkedID,
        !           215:         priority;
        !           216: IFP     rfx,
        !           217:         efx;
        !           218: caddr_t in,
        !           219:        *out;
        !           220: struct RoSAPindication *roi;
        !           221: \end{verbatim}\end{quote}
        !           222: The parameters to this procedure are:
        !           223: \begin{describe}
        !           224: \item[\verb"sd":] the association-descriptor;
        !           225: 
        !           226: \item[\verb"ryo":] a pointer to a \verb"RyOperation" table;
        !           227: 
        !           228: \item[\verb"op":] the operation code of the operation to invoke;
        !           229: 
        !           230: \item[\verb"in":] the address of the {\em C\/} structure for the operation's
        !           231: argument;
        !           232: 
        !           233: \item[\verb"out":] an address-valued location which is updated if the call
        !           234: succeeds;
        !           235: 
        !           236: \item[\verb"rfx":] the address of a dispatch routine to be invoked if
        !           237: the operation returns a result;
        !           238: 
        !           239: \item[\verb"efx":] the address of a dispatch routine to be invoked if
        !           240: the operation returns an error;
        !           241: 
        !           242: \item[\verb"class":] the operation class
        !           243: (either \verb"ROS_SYNC" for a synchronous operation,
        !           244: or \verb"ROS_ASYNC" for an asynchronous one);
        !           245: 
        !           246: \item[\verb"invokeID":] the invocation ID of this request;
        !           247: 
        !           248: \item[\verb"linkedID":] the linked ID of this request
        !           249: (use \verb"NULLIP" if not linked);
        !           250: 
        !           251: \item[\verb"priority":] the priority of this request
        !           252: (use \verb"ROS_NOPRIO" if the priority is undetermined);
        !           253: and,
        !           254: 
        !           255: \item[\verb"roi":] a pointer to a \verb"RoSAPindication" structure,
        !           256: which is updated only if the operation was not performed.
        !           257: \end{describe}
        !           258: This routine is exactly equivalent to the \verb"RoInvokeRequest" routine in the
        !           259: \man librosap(3n) library,
        !           260: with the additional functions of:
        !           261: automatically encoding and decoding arguments, results, and parameters.
        !           262: Hence,
        !           263: the routine \verb"RyOperation",
        !           264: is essentially a call to \verb"RyOpInvoke" with a few hard-wired parameters:
        !           265: \begin{describe}
        !           266: \item[\verb"class":]  \verb"ROS_SYNC";
        !           267: 
        !           268: \item[\verb"invokeID":] a unique-number;
        !           269: 
        !           270: \item[\verb"linkedID":] \verb"NULLIP";
        !           271: and,
        !           272: 
        !           273: \item[\verb"priority":] \verb"ROS_NOPRIO".
        !           274: \end{describe}
        !           275: 
        !           276: \subsection*   {Asynchronous Interface}
        !           277: Although
        !           278: most invokers desire a simple interface for synchronous execution,
        !           279: it is also useful to have an asynchronous interface.
        !           280: Further,
        !           281: since a synchronous interface can be thought of as a degenerate subset of an
        !           282: asynchronous interface,
        !           283: most invokers use the asynchronous interface and simply ask for it to block
        !           284: after making the invocation.
        !           285: The \verb"RyStub" routine is used to provide such an interface.
        !           286: \begin{quote}\index{RyStub}\small\begin{verbatim}
        !           287: int     RyStub (sd, ryo, op, id, linked, in, rfx, efx,
        !           288:                 class, roi)
        !           289: int     sd;
        !           290: struct RyOperation *ryo;
        !           291: int     op,
        !           292:         id,
        !           293:        *linked,
        !           294:         class;
        !           295: caddr_t in;
        !           296: IFP     rfx,
        !           297:         efx;
        !           298: struct RoSAPindication *roi;
        !           299: \end{verbatim}\end{quote}
        !           300: The parameters to this procedure are:
        !           301: \begin{describe}
        !           302: \item[\verb"sd":] the association-descriptor;
        !           303: 
        !           304: \item[\verb"ryo":] a pointer to a \verb"RyOperation" table;
        !           305: 
        !           306: \item[\verb"op":] the operation code of the operation to invoke;
        !           307: 
        !           308: \item[\verb"id":] the invocation identifier to use;
        !           309: 
        !           310: \item[\verb"linked":] the linked invocation identifier to use, if any
        !           311: (use \verb"NULLIP" if this is not a linked reply);
        !           312: 
        !           313: \item[\verb"in":] the address of the {\em C\/} structure for the operation's
        !           314: argument;
        !           315: 
        !           316: \item[\verb"rfx":] the address of a dispatch routine to be invoked if
        !           317: the operation returns a result;
        !           318: 
        !           319: \item[\verb"efx":] the address of a dispatch routine to be invoked if
        !           320: the operation returns an error or is rejected;
        !           321: 
        !           322: \item[\verb"class":] the operation class
        !           323: (either \verb"ROS_SYNC" for a synchronous operation,
        !           324: \verb"ROS_ASYNC" for an asynchronous operation,
        !           325: or \verb"ROS_INTR" for a synchronous but user-interruptable operation);
        !           326: and,
        !           327: 
        !           328: \item[\verb"roi":] a pointer to a \verb"RoSAPindication" structure,
        !           329: which is updated only if the operation was not performed.
        !           330: \end{describe}
        !           331: The \verb"RyStub" routine returns one of three values:
        !           332: \verb"NOTOK" (on failure),
        !           333: \verb"OK" (on success),
        !           334: or
        !           335: \verb"DONE" (when something else happens).
        !           336: 
        !           337: If the call to \verb"RyStub" returns the manifest constant \verb"NOTOK",
        !           338: then the \verb"RoSAPpreject" structure contained in
        !           339: the \verb"RoSAPindication" parameter
        !           340: \verb"roi" contains the reason for the failure.
        !           341: 
        !           342: If the call to \verb"RyStub" returns the manifest constant \verb"OK",
        !           343: then the operation was queued or completed,
        !           344: depending on the value of the \verb"class" parameter.
        !           345: If the value of the \verb"class" parameter was \verb"ROS_ASYNC",
        !           346: then \verb"RyStub" returns immediately after queuing the invocation.
        !           347: Otherwise,
        !           348: \verb"RyStub" waits for a response to the operation,
        !           349: invokes the appropriate dispatch routine,
        !           350: and then returns.
        !           351: Both the result and error dispatch routines are invoked in the same way:
        !           352: \begin{quote}\small\begin{verbatim}
        !           353: result = (*fnx) (sd, id, reason, value, roi)
        !           354: int     sd;
        !           355: int     id,
        !           356:         reason;
        !           357: caddr_t value;
        !           358: struct RoSAPindication *roi;
        !           359: \end{verbatim}\end{quote}
        !           360: The parameters to this procedure are:
        !           361: \begin{describe}
        !           362: \item[\verb"sd":] the association-descriptor;
        !           363: 
        !           364: \item[\verb"id":] the invocation identifier associated with the result or
        !           365: error;
        !           366: 
        !           367: \item[\verb"reason":] either \verb"RY_RESULT" if the result dispatch routine
        !           368: is invoked, the error code if the error dispatch routine is invoked with an
        !           369: error, or \verb"RY_REJECT" if the error dispatch routine is invoked with a
        !           370: rejection;
        !           371: 
        !           372: \item[\verb"value":] the address of the {\em C\/} structure for the result or
        !           373: error parameter (if any);
        !           374: and,
        !           375: 
        !           376: \item[\verb"roi":] a pointer to a \verb"RoSAPindication" structure,
        !           377: which is updated only if the result, error, or rejection is faulty.
        !           378: \end{describe}
        !           379: The dispatch routine should return the manifest constant \verb"OK"
        !           380: unless you know what you're doing.
        !           381: Note that if \verb"value" is present,
        !           382: then the \man librosy(3n) library will automatically release the memory used
        !           383: by the {\em C\/} structure when the dispatch routine returns.
        !           384: 
        !           385: If the call to \verb"RyStub" returns the manifest constant \verb"DONE",
        !           386: then an indication that the association is pending termination is returned.
        !           387: The value of the \verb"roi_type" element of the \verb"RoSAPindication"
        !           388: parameter is either \verb"ROI_END" or \verb"ROI_FINISH".
        !           389: Consult Section~\ref{ros:end} of \volone/ for the details,
        !           390: as this normally does not happen to initiators.
        !           391: 
        !           392: If the value of the \verb"class" parameter was \verb"ROS_INTR",
        !           393: then \verb"RyStub" issues a synchronous call
        !           394: (as described above for the \verb"ROS_SYNC" case).
        !           395: However, if the user generates an interrupt,
        !           396: usually by typing control-C (`\verb"^C"'),
        !           397: while waiting for the response to the operation,
        !           398: then \verb"RyStub" will return immediately with the value \verb"NOTOK"
        !           399: and the \verb"rop_reason" element of the  \verb"RoSAPpreject" structure
        !           400: contained in the \verb"RoSAPindication" parameter \verb"roi" will be set to
        !           401: the value \verb"ROS_INTERRUPTED".
        !           402: 
        !           403: At this time,
        !           404: the program may do other processing and later return to wait for the outcome
        !           405: of the operation.
        !           406: Instead,
        !           407: the program may direct the run-time environment to silently discard any
        !           408: outcome.
        !           409: This is useful when the user wishes to abandon an inprogress operation and
        !           410: really doesn't care what the results are
        !           411: (i.e., when reading from a database).
        !           412: The verb"RyDiscard" routine is used to accomplish this function:
        !           413: \begin{quote}\index{RyDiscard}\small\begin{verbatim}
        !           414: int     RyDiscard (sd, id, roi)
        !           415: int     sd,
        !           416:         id;
        !           417: struct RoSAPindication *roi;
        !           418: \end{verbatim}\end{quote}
        !           419: The parameters to this procedure are:
        !           420: \begin{describe}
        !           421: \item[\verb"sd":] the association descriptor;
        !           422: 
        !           423: \item[\verb"sd":] the invocation-identifier associated with the operation; and,
        !           424: 
        !           425: \item[\verb"roi":] a pointer to a \verb"RoSAPindication" structure,
        !           426: which is updated only on failure.
        !           427: \end{describe}
        !           428: The \verb"RyDiscard" routine returns either \verb"NOTOK" (on failure)
        !           429: or \verb"OK" (on success).
        !           430: 
        !           431: \section      {Routines for Responders}
        !           432: Responders use the routines in the \man libacsap(3n) library for association
        !           433: control.
        !           434: These are described in Chapter~\ref{libacsap} of \volone/.
        !           435: 
        !           436: \section      {Routines for Performers}
        !           437: After forming an association,
        !           438: performers register the operations they are willing to perform.
        !           439: They then typically wait for those operations to be invoked.
        !           440: 
        !           441: \subsection    {Registering Operations}\label{librosy:register}
        !           442: The routine \verb"RyDispatch" is used to register a handler for an operation:
        !           443: \begin{quote}\index{RyDispatch}\small\begin{verbatim}
        !           444: int     RyDispatch (sd, ryo, op, fnx, roi)
        !           445: int     sd;
        !           446: struct RyOperation *ryo;
        !           447: int     op;
        !           448: IFP     fnx;
        !           449: struct RoSAPindication *roi;
        !           450: \end{verbatim}\end{quote}
        !           451: The parameters to this procedure are:
        !           452: \begin{describe}
        !           453: \item[\verb"sd":] the association-descriptor;
        !           454: 
        !           455: \item[\verb"ryo":] a pointer to a \verb"RyOperation" table;
        !           456: 
        !           457: \item[\verb"op":] the operation code of the operation to be registered;
        !           458: 
        !           459: \item[\verb"fnx":] the address of a dispatch routine to be invoked when
        !           460: the operation is invoked;
        !           461: and,
        !           462: 
        !           463: \item[\verb"roi":] a pointer to a \verb"RoSAPindication" structure,
        !           464: which is updated only if the call fails.
        !           465: \end{describe}
        !           466: An operation may be un-registered by using \verb"NULLIFP" for the \verb"fnx"
        !           467: parameter.
        !           468: 
        !           469: When a registered operation is invoked
        !           470: (from the routine \verb"RyWait" described in Section~\ref{librosy:waiting}),
        !           471: the dispatch routine is invoked with five parameters:
        !           472: \begin{quote}\small\begin{verbatim}
        !           473: result = (*fnx) (sd, ryo, rox, in, roi)
        !           474: int     sd;
        !           475: struct RyOperation *ryo;
        !           476: struct RoSAPinvoke *rox;
        !           477: caddr_t in;
        !           478: struct RoSAPindication *roi;
        !           479: \end{verbatim}\end{quote}
        !           480: The parameters to this procedure are:
        !           481: \begin{describe}
        !           482: \item[\verb"sd":] the association-descriptor;
        !           483: 
        !           484: \item[\verb"ryo":] a pointer to a entry in the \verb"RyOperation" table
        !           485: for this operation;
        !           486: 
        !           487: \item[\verb"rox":] a pointer to a \verb"RoSAPinvoke" structure containing
        !           488: miscellaneous information regarding the operation being invoked
        !           489: (e.g., the invocation id);
        !           490: 
        !           491: \item[\verb"in":] the address of the {\em C\/} structure for the operation's
        !           492: argument (if any);
        !           493: and,
        !           494: 
        !           495: \item[\verb"roi":] a pointer to a \verb"RoSAPindication" structure,
        !           496: which is updated only if the operation was not performed.
        !           497: \end{describe}
        !           498: Note that if an argument is present for the operation,
        !           499: then the \man librosy(3n) library will automatically release the memory used
        !           500: by the {\em C\/} structure when the dispatch routine returns.
        !           501: 
        !           502: The return value of the dispatch routine is consulted to determine the
        !           503: disposition of the invocation.
        !           504: One of three values should be returned:
        !           505: \verb"NOTOK", which indicates that some non-operational error occured;
        !           506: \verb"OK", which indicates that the operation was handled;
        !           507: or,
        !           508: \verb"DONE", which indicates that the association is pending termination.
        !           509: 
        !           510: \subsection    {Responding to Operations}
        !           511: If the operation corresponding to the dispatch routine does not return a
        !           512: result,
        !           513: then the routine may simply process the request and return.
        !           514: Otherwise,
        !           515: the dispatch routine should ultimately cause one of three routines to be
        !           516: called to handle an invocation.
        !           517: 
        !           518: The routine \verb"RyDsResult" is used to return a result to an invocation.
        !           519: \begin{quote}\index{RyDsResult}\small\begin{verbatim}
        !           520: int     RyDsResult (sd, id, out, priority, roi)
        !           521: int     sd;
        !           522: int     id,
        !           523:         priority;
        !           524: caddr_t out;
        !           525: struct RoSAPindication *roi;
        !           526: \end{verbatim}\end{quote}
        !           527: The parameters to this procedure are:
        !           528: \begin{describe}
        !           529: \item[\verb"sd":] the association-descriptor;
        !           530: 
        !           531: \item[\verb"id":] the ID of the invocation being responded to;
        !           532: 
        !           533: \item[\verb"out":] the address of the {\em C\/} structure for the operation's
        !           534: result (if any);
        !           535: 
        !           536: \item[\verb"priority":] the priority of the response
        !           537: (use \verb"ROS_NOPRIO" if the priority is undetermined);
        !           538: and,
        !           539: 
        !           540: \item[\verb"roi":] a pointer to a \verb"RoSAPindication" structure,
        !           541: which is updated only if the call fails.
        !           542: \end{describe}
        !           543: 
        !           544: The routine \verb"RyDsError" is used to return an error to an invocation.
        !           545: \begin{quote}\index{RyDsError}\small\begin{verbatim}
        !           546: int     RyDsError (sd, id, err, out, priority, roi)
        !           547: int     sd;
        !           548: int     id,
        !           549:         err,
        !           550:         priority;
        !           551: caddr_t out;
        !           552: struct RoSAPindication *roi;
        !           553: \end{verbatim}\end{quote}
        !           554: The parameters to this procedure are:
        !           555: \begin{describe}
        !           556: \item[\verb"sd":] the association-descriptor;
        !           557: 
        !           558: \item[\verb"id":] the ID of the invocation being responded to;
        !           559: 
        !           560: \item[\verb"err":] the error code being returned;
        !           561: 
        !           562: \item[\verb"out":] the address of the {\em C\/} structure for the error's
        !           563: parameter (if any);
        !           564: 
        !           565: \item[\verb"priority":] the priority of the response
        !           566: (use \verb"ROS_NOPRIO" if the priority is undetermined);
        !           567: and,
        !           568: 
        !           569: \item[\verb"roi":] a pointer to a \verb"RoSAPindication" structure,
        !           570: which is updated only if the call fails.
        !           571: \end{describe}
        !           572: 
        !           573: The routine \verb"RyDsUReject" is used to reject an invocation.
        !           574: \begin{quote}\index{RyDsUReject}\small\begin{verbatim}
        !           575: int    RyDsUReject (sd, id, reason, priority, roi)
        !           576: int     sd;
        !           577: int    id,
        !           578:        reason,
        !           579:        priority;
        !           580: struct RoSAPindication *roi;
        !           581: \end{verbatim}\end{quote}
        !           582: The parameters to this procedure are:
        !           583: \begin{describe}
        !           584: \item[\verb"sd":] the association-descriptor;
        !           585: 
        !           586: \item[\verb"id":] the ID of the invocation being rejected;
        !           587: 
        !           588: \item[\verb"reason":] the reason for the rejection
        !           589: (codes are listed in Table~\ref{RoSAPreasons} on page~\pageref{RoSAPreasons}
        !           590: of \volone/);
        !           591: 
        !           592: \item[\verb"priority":] the priority of the response
        !           593: (use \verb"ROS_NOPRIO" if the priority is undetermined);
        !           594: and,
        !           595: 
        !           596: \item[\verb"roi":] a pointer to a \verb"RoSAPindication" structure,
        !           597: which is updated only if the call fails.
        !           598: \end{describe}
        !           599: 
        !           600: \section      {Waiting for Events}\label{librosy:waiting}
        !           601: The \verb"RyWait" routine is used by both invokers and performers to wait
        !           602: for some event to occur.
        !           603: Normally,
        !           604: it is not used by invokers,
        !           605: except when it is desired to wait for a previously invoked asynchronous
        !           606: operation to complete.
        !           607: \begin{quote}\index{RyWait}\small\begin{verbatim}
        !           608: int     RyWait (sd, id, out, secs, roi)
        !           609: int     sd,
        !           610:        *id,
        !           611:         secs;
        !           612: caddr_t *out;
        !           613: struct RoSAPindication *roi;
        !           614: \end{verbatim}\end{quote}
        !           615: The parameters to this procedure are:
        !           616: \begin{describe}
        !           617: \item[\verb"sd":] the association-descriptor;
        !           618: 
        !           619: \item[\verb"id":] the integer-value address of the invocation ID to wait for
        !           620: (use \verb"NULLIP" if any invocation ID is satisfactory);
        !           621: 
        !           622: \item[\verb"out":] an address-valued location which is updated if the call
        !           623: succeeds;
        !           624: 
        !           625: \item[\verb"secs":] the maximum number of seconds to wait
        !           626: (a value of \verb"NOTOK" indicates that the call should block indefinitely,
        !           627: whereas a value of \verb"OK" indicates that the call should not block at all,
        !           628: e.g., a polling action);
        !           629: and,
        !           630: 
        !           631: \item[\verb"roi":] a pointer to a \verb"RoSAPindication" structure,
        !           632: which is updated only if the call fails.
        !           633: \end{describe}
        !           634: The \verb"RyWait" routine is analogous to the \verb"RoWaitRequest" routine in
        !           635: the \man librosy(3n) library,
        !           636: with the additional functions of:
        !           637: automatically encoding and decoding arguments, results, and parameters;
        !           638: invoking a dispatch routine for the performer on incoming invocations;
        !           639: and,
        !           640: also queuing events for future retrieval.
        !           641: 
        !           642: The \verb"RyWait" routine returns one of three values:
        !           643: \verb"NOTOK" (on failure),
        !           644: \verb"OK" (on reading a reply),
        !           645: or
        !           646: \verb"DONE" (when something else happens).
        !           647: 
        !           648: If the call to \verb"RyWait" returns the manifest constant \verb"NOTOK",
        !           649: then the \verb"RoSAPpreject" structure contained in
        !           650: the \verb"RoSAPindication" parameter
        !           651: \verb"roi" contains the reason for the failure.
        !           652: 
        !           653: If the call to \verb"RyWait" returns the manifest constant \verb"OK",
        !           654: then either a result or error has been returned from a previous invocation.
        !           655: The value of the \verb"roi_type" element of the \verb"RoSAPindication"
        !           656: parameter is either \verb"ROI_RESULT" or \verb"ROI_ERROR",
        !           657: and the value of the address pointed to by \verb"out" is a newly allocated
        !           658: {\em C\/} structure for the operations result or error's parameter (if any).
        !           659: Note that if a result or parameter is returned,
        !           660: then it is the invoker's responsibility to release the memory used by the
        !           661: {\em C\/} structure, when appropriate.
        !           662: 
        !           663: If the call to \verb"RyWait" returns the manifest constant \verb"DONE",
        !           664: then an indication that the association is pending termination is returned.
        !           665: The value of the \verb"roi_type" element of the \verb"RoSAPindication"
        !           666: parameter is either \verb"ROI_END" or \verb"ROI_FINISH".
        !           667: Consult Section~\ref{ros:end} of \volone/ for the details.
        !           668: 
        !           669: Note that because the \man librosy(3n) library may queue events while waiting
        !           670: for a particular event,
        !           671: it is important to call \verb"RyWait" with a \verb"secs" parameter of
        !           672: \verb"OK" prior to deciding to explicitly block for activity
        !           673: (e.g., calling \verb"RoSelectMask" or \verb"xselect").
        !           674: 
        !           675: \section      {Miscellaneous Routines}
        !           676: There are a few miscellaneous routines of interest.
        !           677: 
        !           678: \subsection    {Association Termination}
        !           679: When an association is either released or aborted,
        !           680: it is important to expunge any information regarding queued operations from
        !           681: the run-time environment.
        !           682: The \verb"RyLose" routine is used to perform this function.
        !           683: \begin{quote}\index{RyLose}\small\begin{verbatim}
        !           684: int     RyLose (sd, roi)
        !           685: int     sd;
        !           686: struct RoSAPindication *roi;
        !           687: \end{verbatim}\end{quote}
        !           688: The parameters to this procedure are:
        !           689: \begin{describe}
        !           690: \item[\verb"sd":] the association-descriptor;
        !           691: and,
        !           692: 
        !           693: \item[\verb"roi":] a pointer to a \verb"RoSAPindication" structure,
        !           694: which is updated only if the call fails.
        !           695: \end{describe}
        !           696: 
        !           697: \subsection    {Utility Routines}
        !           698: It may be useful,
        !           699: primarily for diagnostic purposes,
        !           700: to retrieve an entry for a particular operation or error from the tables
        !           701: compiled by the \man rosy(1) compiler.
        !           702: There are four routines for this purpose.
        !           703: 
        !           704: The routine \verb"findopbyop" takes a table and an operation code and returns
        !           705: the corresponding entry for the operation in the table,
        !           706: or the manifest constant \verb"NULL" on failure.
        !           707: \begin{quote}\index{findopbyop}\small\begin{verbatim}
        !           708: struct RyOperation *findopbyop (ryo, op)
        !           709: struct RyOperation *ryo;
        !           710: int     op;
        !           711: \end{verbatim}\end{quote}
        !           712: The parameters to this procedure are:
        !           713: \begin{describe}
        !           714: \item[\verb"ryo":] a pointer to a \verb"RyOperation" table compiled by
        !           715: \pgm{rosy};
        !           716: and,
        !           717: 
        !           718: \item[\verb"op":] the operation code of the operation to search for in the
        !           719: table.
        !           720: \end{describe}
        !           721: 
        !           722: The routine \verb"findopbyname" takes a table and an operation name and returns
        !           723: the corresponding entry for the operation in the table,
        !           724: or the manifest constant \verb"NULL" on failure.
        !           725: \begin{quote}\index{findopbyname}\small\begin{verbatim}
        !           726: struct RyOperation *findopbyname (ryo, name)
        !           727: struct RyOperation *ryo;
        !           728: char   *name;
        !           729: \end{verbatim}\end{quote}
        !           730: The parameters to this procedure are:
        !           731: \begin{describe}
        !           732: \item[\verb"ryo":] a pointer to a \verb"RyOperation" table compiled by
        !           733: \pgm{rosy};
        !           734: and,
        !           735: 
        !           736: \item[\verb"name":] the operation name of the operation to search for in the
        !           737: table.
        !           738: \end{describe}
        !           739: 
        !           740: The routine \verb"finderrbyerr" takes a table and an error code and returns
        !           741: the corresponding entry for the error in the table,
        !           742: or the manifest constant \verb"NULL" on failure.
        !           743: \begin{quote}\index{finderrbyerr}\small\begin{verbatim}
        !           744: struct RyError *finderrbyerr (rye, err)
        !           745: struct RyError *rye;
        !           746: int     err;
        !           747: \end{verbatim}\end{quote}
        !           748: The parameters to this procedure are:
        !           749: \begin{describe}
        !           750: \item[\verb"rye":] a pointer to a \verb"RyError" table compiled by
        !           751: \pgm{rosy};
        !           752: and,
        !           753: 
        !           754: \item[\verb"err":] the error code of the error to search for in the
        !           755: table.
        !           756: \end{describe}
        !           757: 
        !           758: The routine \verb"finderrbyname" takes a table and an error code and returns
        !           759: the corresponding entry for the error in the table,
        !           760: or the manifest constant \verb"NULL" on failure.
        !           761: \begin{quote}\index{finderrbyname}\small\begin{verbatim}
        !           762: struct RyError *finderrbyname (rye, name)
        !           763: struct RyError *rye;
        !           764: char   *name;
        !           765: \end{verbatim}\end{quote}
        !           766: The parameters to this procedure are:
        !           767: \begin{describe}
        !           768: \item[\verb"rye":] a pointer to a \verb"RyError" table compiled by
        !           769: \pgm{rosy};
        !           770: and,
        !           771: 
        !           772: \item[\verb"name":] the error name of the error to search for in the
        !           773: table.
        !           774: \end{describe}
        !           775: 
        !           776: \section      {Error Conventions}
        !           777: All of the routines in this library return the manifest constant \verb"NOTOK"
        !           778: on error,
        !           779: and also update the \verb"roi" parameter given to the routine.
        !           780: The element called \verb"roi_preject" in the \verb"RoSAPindication" structure
        !           781: encodes the reason for the failure.
        !           782: To determine the reason,
        !           783: one coerces a pointer to a \verb"RoSAPpreject" structure,
        !           784: and consults the \verb"rop_reason" element of this latter structure.
        !           785: This element can be given as a
        !           786: parameter to the routine \verb"RoErrString" which returns a null-terminated
        !           787: diagnostic string.
        !           788: \begin{quote}\index{RoErrString}\small\begin{verbatim}
        !           789: char   *RoErrString (c)
        !           790: int     c;
        !           791: \end{verbatim}\end{quote}
        !           792: 
        !           793: \section      {Compiling and Loading}
        !           794: Programs using the \man librosy(3n) library should include
        !           795: \verb"<isode/rosy.h>".
        !           796: The programs should also be loaded with \verb"-lisode".
        !           797: 
        !           798: %%% \section  {Changes Since the Last Release}\label{rosy:changes}
        !           799: %%% A brief summary of the major changes between v~\rosyprevrsn/ and
        !           800: %%% v~\rosyvrsn/ are now presented.
        !           801: %%% These are the user-visible changes only;
        !           802: %%% changes of a strictly internal nature are not discussed.
        !           803: 

unix.superglobalmegacorp.com

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