|
|
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:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.