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