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

1.1     ! root        1: % run this through LaTeX with the appropriate wrapper
        !             2: 
        !             3: \chapter      {Session Services}\label{libssap}
        !             4: The \man libssap(3n) library implements the session service.
        !             5: 
        !             6: As with most models of OSI services,
        !             7: the underlying assumption is one of a symmetric, asynchronous environment.
        !             8: That is,
        !             9: although peers exist at a given layer,
        !            10: one does not necessary view a peer as either a client or a server.
        !            11: Further,
        !            12: the service provider may generate events for the service user without the
        !            13: latter entity triggering the actions which led to the event.
        !            14: For example,
        !            15: in a synchronous environment,
        !            16: an indication that data has arrived usually occurs only when the service user
        !            17: asks the service provider to read data;
        !            18: in an asynchronous environment,
        !            19: the service provider may interrupt the service user at any time to announce
        !            20: the arrival of data.
        !            21: 
        !            22: The \verb"ssap" module in this release initially uses a client/server
        !            23: paradigm to start communications.
        !            24: Once the connection is established,
        !            25: a symmetric view is taken.
        !            26: In addition,
        !            27: initially the interface is synchronous;
        !            28: however once the connection is established,
        !            29: an asynchronous interface may be selected.
        !            30: 
        !            31: All of the routines in the \man libssap(3n) library are integer-valued.
        !            32: They return the manifest constant \verb"OK" on success,
        !            33: or \verb"NOTOK" otherwise.
        !            34: 
        !            35: \section      {Warning}
        !            36: Please read the following important message.
        !            37: \[\fbox{\begin{tabular}{lp{0.8\textwidth}}
        !            38: \bf NOTE:&     Readers of this chapter should have an intimate understanding
        !            39:                of the OSI session service.  It is not the intent of this
        !            40:                chapter to present a tutorial on these services, so novice
        !            41:                users will suffer greatly if they choose to read further.
        !            42: \end{tabular}}\]
        !            43: 
        !            44: \section      {Addresses}\label{ssap:addresses}
        !            45: Addresses at the session service access point are represented by the
        !            46: \verb"SSAPaddr" structure.
        !            47: \begin{quote}\index{SSAPaddr}\small\begin{verbatim}
        !            48: struct SSAPaddr {
        !            49:     struct TSAPaddr sa_addr;
        !            50: 
        !            51: #define SSSIZE  64
        !            52:     int     sa_selectlen;
        !            53:     char    sa_selector[SSSIZE];
        !            54: };
        !            55: #define NULLSA  ((struct SSAPaddr *) 0)
        !            56: \end{verbatim}\end{quote}
        !            57: This structure contains two elements:
        !            58: \begin{describe}
        !            59: \item[\verb"sa\_addr":]        the transport address,
        !            60: as described in Section~\ref{tsap:addresses} on page~\pageref{tsap:addresses};
        !            61: and,
        !            62: 
        !            63: \item[\verb"sa\_selector"/\verb"sa\_selectlen":] the session selector,
        !            64: as described in the \man isoservices(5) database in Chapter~\ref{isoservices},
        !            65: for the service provider \verb"ssap".
        !            66: \end{describe}
        !            67: 
        !            68: In Figure~\ref{getASprovider},
        !            69: an example of how one constructs the SSAP address for the Presentation provider
        !            70: on host \verb"RemoteHost" is presented.
        !            71: The routine \verb"is2saddr" takes a host and service,
        !            72: and then consults the \man isoentities(5) file described in
        !            73: Chapter~\ref{isoentities} of \volone/ to construct a session
        !            74: address.
        !            75: \begin{quote}\index{is2saddr}\small\begin{verbatim}
        !            76: struct SSAPaddr *is2saddr (host, service, is)
        !            77: char   *host,
        !            78:        *service;
        !            79: struct isoservent *is;
        !            80: \end{verbatim}\end{quote}
        !            81: \tagrind[tp]{grind5b-1}%
        !            82:        {Constructing the SSAP address for the Presentation provider}%
        !            83:        {getASprovider}
        !            84: 
        !            85: \subsection    {Calling Address}
        !            86: Certain users of the session service
        !            87: (e.g., the reliable transfer service)
        !            88: need to know the name of the local host when they initiate a connection.
        !            89: The routine \verb"SLocalHostName" has been provided for this reason.
        !            90: \begin{quote}\index{SLocalHostName}\small\begin{verbatim}
        !            91: char   *SLocalHostName ()
        !            92: \end{verbatim}\end{quote}
        !            93: 
        !            94: \subsection    {Address Encodings}
        !            95: It may be useful to encode a session address for viewing.
        !            96: Although a consensus for a standard way of doing this has not yet been
        !            97: reached,
        !            98: the routines \verb"saddr2str" and \verb"str2saddr" may be used in the interim.
        !            99: \begin{quote}\index{saddr2str}\small\begin{verbatim}
        !           100: char   *saddr2str (sa)
        !           101: struct SSAPaddr *sa;
        !           102: \end{verbatim}\end{quote}
        !           103: The parameter to this procedure is:
        !           104: \begin{describe}
        !           105: \item[\verb"sa":] the session address.
        !           106: \end{describe}
        !           107: If \verb"saddr2str" fails,
        !           108: it returns the manifest constant \verb"NULLCP".
        !           109: 
        !           110: The routine \verb"str2saddr" takes an ascii string encoding and
        !           111: returns a
        !           112: session address.
        !           113: \begin{quote}\index{str2saddr}\small\begin{verbatim}
        !           114: struct SSAPaddr *str2saddr (str)
        !           115: char   *str;
        !           116: \end{verbatim}\end{quote}
        !           117: The parameter to this procedure is:
        !           118: \begin{describe}
        !           119: \item[\verb"str":] the ascii string.
        !           120: \end{describe}
        !           121: If \verb"str2saddr" fails,
        !           122: it returns the manifest constant \verb"NULLSA".
        !           123: 
        !           124: \section      {Connection Establishment}
        !           125: Until the connection has been fully established,
        !           126: the implementation distinguishes between clients and servers,
        !           127: which are more properly referred to as {\em initiators\/} and
        !           128: {\em responders}, to use OSI terminology.
        !           129: 
        !           130: \subsection    {Connection Negotiation}\label{ssap:negotiation}
        !           131: From the user's perspective,
        !           132: there are several parameters which are negotiated by the session providers
        !           133: during connection establishment.
        !           134: Suggestions as to the values of some of these parameters are made by the user.
        !           135: 
        !           136: \subsubsection {Maximum SSDU Size}
        !           137: The session provider will accept arbitrarily large session service data units
        !           138: (SSDUs) and transparently fragment and re-assemble them during transit.
        !           139: Hence, the actual SSDU is of unlimited size.
        !           140: However, for efficiency reasons,
        !           141: it may be desirable for the user to send SSDUs which are no larger than a
        !           142: certain threshold.
        !           143: When a connection has been established,
        !           144: the service providers inform the initiator and responder as to what this
        !           145: threshold is.
        !           146: 
        !           147: \[\fbox{\begin{tabular}{lp{0.8\textwidth}}\label{SSDU:atomic}
        !           148: \bf NOTE:&     In the current implementation,
        !           149:                SSDUs which are no larger than the maximum atomic SSDU size
        !           150:                are handled very efficiently.
        !           151:                For optimal performance,
        !           152:                users of the session service should strive to avoid sending
        !           153:                SSDUs which are larger than this threshold.
        !           154: \end{tabular}}\]
        !           155: 
        !           156: \subsubsection {Session Requirements}
        !           157: Users may specify the particular services that they will require from the
        !           158: session provider.
        !           159: The particular requirements supported in the current implementation are
        !           160: listed in Table~\ref{SSAPrequirements}.
        !           161: These requirements are always negotiated downward.
        !           162: That is,
        !           163: the initiator of the connection (i.e., the ``client'') indicates the
        !           164: desired session requirements.
        !           165: These are then given to the responder to the connection request
        !           166: (i.e., the ``server'') who may select any (or all) of the indicated session
        !           167: requirements.%
        !           168: \footnote{There is one exception,
        !           169: the responder may not select both the half- and full-duplex requirements.
        !           170: It must choose one.
        !           171: If the initiator selects both initially,
        !           172: it is indicating that the choice is made at the responder's discretion.}
        !           173: This selection is then indicated to the initiator.
        !           174: \tagtable[tp]{5b-1}{Session Requirements}{SSAPrequirements}
        !           175: 
        !           176: \subsubsection {Session Tokens}
        !           177: Depending on the session requirements selected,
        !           178: several session tokens may be available in order to coordinate the use of
        !           179: session services.
        !           180: 
        !           181: There are two terms commonly used when referring to a session token:
        !           182: \begin{itemize}
        !           183: \item  Availability\\
        !           184:        If a token is available, then it exists for use during the session
        !           185:        connection.
        !           186:        The availability of a token depends on the session requirements
        !           187:        selected for the connection.
        !           188: \item  Ownership\\
        !           189:        Certain session services are may not be requested by a user unless
        !           190:        that user owns the token associated with those services.
        !           191: \end{itemize}
        !           192: The particular tokens supported in the current implementation,
        !           193: along with their associated availability information are
        !           194: listed in Table~\ref{SSAPtokens}.
        !           195: \tagtable[tp]{5b-2}{Session Tokens}{SSAPtokens}
        !           196: 
        !           197: The session requirements are encoded as a single integer
        !           198: (actually, only the low-order 2~octets of an integer).
        !           199: To determine if a token is available,
        !           200: one can use a simple test involving the session requirements:
        !           201: \begin{quote}\small\begin{verbatim}
        !           202: if (requirements & SR_xxx_EXISTS) {
        !           203:     ...
        !           204: }
        !           205: \end{verbatim}\end{quote}
        !           206: For example,
        !           207: to determine if the negotiated release token is available:
        !           208: \begin{quote}\small\begin{verbatim}
        !           209: if (requirements & SR_RLS_EXISTS) {
        !           210:     ...
        !           211: }
        !           212: \end{verbatim}\end{quote}
        !           213: 
        !           214: Finally,
        !           215: the macro \verb"dotokens" may be used to execute {\em C\/} code for each
        !           216: session token (regardless of availability).\index{dotokens}
        !           217: This macro acts as if it executes:
        !           218: \begin{quote}\index{dotoken}\small\begin{verbatim}
        !           219: dotoken (SR_xxx_EXISTS, ST_xxx_SHIFT, ST_xxx_TOKEN, "xxx");
        !           220: \end{verbatim}\end{quote}
        !           221: for each token.
        !           222: Usually,
        !           223: \verb"dotoken" is a macro which executes some code for each token.
        !           224: An example is provided momentarily.
        !           225: 
        !           226: \subsubsection {Initial Token Settings}
        !           227: For each token which is made available during connection negotiation,
        !           228: the choice as to which user initially has the token is left to the discretion
        !           229: of the initiator.
        !           230: The three choices for the initial settings of a token are listed in
        !           231: Table~\ref{SSAPsettings}.
        !           232: \tagtable[tp]{5b-3}{Initial Token Settings}{SSAPsettings}
        !           233: 
        !           234: The initial settings for all available tokens are encoded in a single integer
        !           235: (actually, only the low-order 2~octets of an integer).
        !           236: To encode a value:
        !           237: \begin{quote}\small\begin{verbatim}
        !           238: settings &= ~(ST_MASK << ST_yyy_SHIFT);
        !           239: settings |= ST_xxx_VALUE << ST_yyy_SHIFT;
        !           240: \end{verbatim}\end{quote}
        !           241: For example,
        !           242: to indicate that the responder of the connection is to initially have the
        !           243: data token:
        !           244: \begin{quote}\small\begin{verbatim}
        !           245: settings &= ~(ST_MASK << ST_DAT_SHIFT);
        !           246: settings |= ST_RESP_VALUE << ST_DAT_SHIFT;
        !           247: \end{verbatim}\end{quote}
        !           248: The first statement,
        !           249: which clears the field in \verb"settings" by using \verb"ST_MASK",
        !           250: is not required if \verb"settings" is initially \verb"0".
        !           251: 
        !           252: If the initiator indicates that the initial setting of a token is left to
        !           253: the responder's choice,
        !           254: then the responder must decide.
        !           255: In Figure~\ref{setINITtokens},
        !           256: an example of the \verb"dotokens" macro is presented.
        !           257: In this example,
        !           258: the responder examines the initial setting for each available token,
        !           259: and:
        !           260: \begin{itemize}
        !           261: \item  Notes if the responder initially owns the token
        !           262:        (the \verb"ST_RESP_VALUE" case); or,
        !           263: \item  Gives ownership of the token to the initiator if the choice is
        !           264:        at the responder's discretion
        !           265:        (the \verb"ST_CALL_VALUE" case).
        !           266: \end{itemize}
        !           267: \tagrind[tp]{grind5b-2}{Determining the Initial Token Settings}{setINITtokens}
        !           268: 
        !           269: \subsection    {Server Initialization}
        !           270: The \man tsapd(8c) daemon,
        !           271: upon accepting a connection from an initiating host,
        !           272: consults the ISO services database to determine which program
        !           273: on the local system implements the desired TSAP entity.
        !           274: In the case of the session service,
        !           275: the \pgm{tsapd} program contains the bootstrap for the session provider.
        !           276: The daemon will again consult the ISO services database to determine which
        !           277: program on the system implements the desired SSAP entity.
        !           278: 
        !           279: Once the program has been ascertained,
        !           280: the daemon runs the program with any arguments listed in the database.
        !           281: In addition,
        !           282: it appends some {\em magic arguments\/} to the argument vector.
        !           283: Hence,
        !           284: the very first action performed by the responder is to re-capture the SSAP
        !           285: state contained in the magic arguments.
        !           286: This is done by calling the routine \verb"SInit",
        !           287: which on a successful return,
        !           288: is equivalent to a {\sf S-CONNECT.INDICATION\/} from the session service
        !           289: provider.
        !           290: \begin{quote}\index{SInit}\small\begin{verbatim}
        !           291: int     SInit (vecp, vec, ss, si)
        !           292: int     vecp;
        !           293: char  **vec;
        !           294: struct SSAPstart *ss;
        !           295: struct SSAPindication *si;
        !           296: \end{verbatim}\end{quote}
        !           297: The parameters to this procedure are:
        !           298: \begin{describe}
        !           299: \item[\verb"vecp":] the length of the argument vector;
        !           300: 
        !           301: \item[\verb"vec":] the argument vector;
        !           302: 
        !           303: \item[\verb"ss":] a pointer to a \verb"SSAPstart" structure, which is updated
        !           304: only if the call succeeds;
        !           305: and,
        !           306: 
        !           307: \item[\verb"si":] a pointer to a \verb"SSAPindication" structure, which is
        !           308: updated only if the call fails.
        !           309: \end{describe}
        !           310: If \verb"SInit" is successful,
        !           311: it returns information in the \verb"ss" parameter,
        !           312: which is a pointer to a \verb"SSAPstart" structure.
        !           313: \begin{quote}\index{SSAPstart}\small\begin{verbatim}
        !           314: struct SSAPstart {
        !           315:     int     ss_sd;
        !           316: 
        !           317:     struct SSAPref  ss_connect;
        !           318: 
        !           319:     struct SSAPaddr ss_calling;
        !           320:     struct SSAPaddr ss_called;
        !           321: 
        !           322:     int     ss_requirements;
        !           323:     int     ss_settings;
        !           324:     long    ss_isn;
        !           325: 
        !           326:     int     ss_ssdusize;
        !           327: 
        !           328:     struct QOStype ss_qos;
        !           329: 
        !           330: #define SS_SIZE         512
        !           331:     int     ss_cc;
        !           332:     char    ss_data[SS_SIZE];
        !           333: };
        !           334: \end{verbatim}\end{quote}
        !           335: The elements of this structure are:
        !           336: \begin{describe}
        !           337: \item[\verb"ss\_sd":] the session-descriptor to be used to reference this
        !           338: connection;
        !           339: 
        !           340: \item[\verb"ss\_connect":] the connection identifier (a.k.a. SSAP reference)
        !           341: used by the initiator;
        !           342: 
        !           343: \item[\verb"ss\_calling":] the address of the peer initiating the connection;
        !           344: 
        !           345: \item[\verb"ss\_called":] the address of the peer being asked to respond;
        !           346: 
        !           347: \item[\verb"ss\_requirements":] the proposed session requirements;
        !           348: 
        !           349: \item[\verb"ss\_settings":] the initial token settings;
        !           350: 
        !           351: \item[\verb"ss\_isn":] the initial serial-number;
        !           352: 
        !           353: \item[\verb"ss\_ssdusize":] the largest atomic SSDU size that can be used on
        !           354: the connection (see the note on page~\pageref{SSDU:atomic});
        !           355: 
        !           356: \item[\verb"ss\_qos":] the quality of service on the connection
        !           357: (see Section~\ref{tsap:qos});
        !           358: and,
        !           359: 
        !           360: \item[\verb"ss\_data"/\verb"ss\_cc":] any initial data
        !           361: (and the length of that data).
        !           362: \end{describe}
        !           363: 
        !           364: The \verb"ss_connect" element is a \verb"SSAPref" structure,
        !           365: which is passed transparently by the session service.
        !           366: \begin{quote}\index{SSAPref}\small\begin{verbatim}
        !           367: struct SSAPref {
        !           368: #define SREF_USER_SIZE 64
        !           369:     u_char sr_ulen;
        !           370:     char    sr_udata[SREF_USER_SIZE];
        !           371: 
        !           372: #define SREF_COMM_SIZE 64
        !           373:     u_char  sr_clen;
        !           374:     char    sr_cdata[SREF_COMM_SIZE];
        !           375: 
        !           376: #define SREF_ADDT_SIZE 4
        !           377:     u_char  sr_alen;
        !           378:     char    sr_adata[SREF_ADDT_SIZE];
        !           379: 
        !           380:     u_char  sr_vlen;
        !           381:     char    sr_vdata[SREF_USER_SIZE];
        !           382: };
        !           383: \end{verbatim}\end{quote}
        !           384: The elements of this structure are:\label{SSAPref}
        !           385: \begin{describe}
        !           386: \item[\verb"sr\_udata"/\verb"sr\_ulen":] the user reference (and length of
        !           387: that reference, which may not exceed \verb"SREF_USER_SIZE" octets);
        !           388: 
        !           389: \item[\verb"sr\_cdata"/\verb"sr\_clen":] the common reference (and length of
        !           390: that reference, which may not exceed \verb"SREF_COMM_SIZE" octets);
        !           391: 
        !           392: \item[\verb"sr\_adata"/\verb"sr\_adata":] the additional reference (and length
        !           393: of that reference, which may not exceed \verb"SREF_ADDT_SIZE" octets);
        !           394: and,
        !           395: 
        !           396: \item[\verb"sr\_vdata"/\verb"sr\_vlen":] a second user reference (and length
        !           397: of that reference, which may not exceed \verb"SREF_USER_SIZE" octets),
        !           398: which is used only when starting or resuming an activity.
        !           399: \end{describe}
        !           400: 
        !           401: If the call to the \verb"SInit" routine is not successful,
        !           402: then a {\sf S-P-ABORT.IN\-DI\-CA\-TION\/} event is simulated,
        !           403: and the relevant information is returned in a \verb"SSAPindication"
        !           404: structure.\label{SSAPindication}
        !           405: \begin{quote}\index{SSAPindication}\small\begin{verbatim}
        !           406: struct SSAPindication {
        !           407:     int     si_type;
        !           408: #define SI_DATA         0x00
        !           409: #define SI_TOKEN        0x01
        !           410: #define SI_SYNC         0x02
        !           411: #define SI_ACTIVITY     0x03
        !           412: #define SI_REPORT       0x04
        !           413: #define SI_FINISH       0x05
        !           414: #define SI_ABORT        0x06
        !           415: 
        !           416:     union {
        !           417:         struct SSAPdata si_un_data;
        !           418:         struct SSAPtoken si_un_token;
        !           419:         struct SSAPsync si_un_sync;
        !           420:         struct SSAPactivity si_un_activity;
        !           421:         struct SSAPreport si_un_report;
        !           422:         struct SSAPfinish si_un_finish;
        !           423:         struct SSAPabort si_un_abort;
        !           424:     }   si_un;
        !           425: #define si_data         si_un.si_un_data
        !           426: #define si_token        si_un.si_un_token
        !           427: #define si_sync         si_un.si_un_sync
        !           428: #define si_activity     si_un.si_un_activity
        !           429: #define si_report       si_un.si_un_report
        !           430: #define si_finish       si_un.si_un_finish
        !           431: #define si_abort        si_un.si_un_abort
        !           432: };
        !           433: \end{verbatim}\end{quote}
        !           434: As shown, this structure is really a discriminated union
        !           435: (a structure with a tag element followed by a union).
        !           436: Hence, on a failure return,
        !           437: one first coerces a pointer to the \verb"SSAPabort" structure contained
        !           438: therein,
        !           439: and then consults the elements of that structure.
        !           440: \begin{quote}\index{SSAPabort}\small\begin{verbatim}
        !           441: struct SSAPabort {
        !           442:     int     sa_peer;
        !           443: 
        !           444:     int     sa_reason;
        !           445: 
        !           446: #define SA_SIZE         512
        !           447:     int     sa_cc;
        !           448:     char    sa_data[SA_SIZE];
        !           449: };
        !           450: \end{verbatim}\end{quote}
        !           451: The elements of a \verb"SSAPabort" structure are:
        !           452: \begin{describe}
        !           453: \item[\verb"sa\_peer":] if set, indicates that a user-initiated abort occurred
        !           454: (a {\sf S-U-ABORT.INDICATION\/} event);
        !           455: if not set, indicates that a provider-initiated abort occurred
        !           456: (a {\sf S-P-ABORT.INDICATION\/} event);
        !           457: 
        !           458: \item[\verb"sa\_reason":] the reason for the provider-initiated abort
        !           459: (codes are listed in Table~\ref{SSAPreasons}),
        !           460: meaningless if the abort is user-initiated;
        !           461: and,
        !           462: 
        !           463: \item[\verb"sa\_data"/\verb"sa\_cc":] any abort data (and the length of that
        !           464: data) from the peer (if \verb"sa_peer" is set) or
        !           465: a diagnostic string from the provider (if \verb"sa_peer" is not set).
        !           466: \end{describe}
        !           467: \tagtable[tp]{5b-4}{SSAP Failure Codes}{SSAPreasons}
        !           468: \[\fbox{\begin{tabular}{lp{0.8\textwidth}}
        !           469: \bf NOTE:&     Although both \cite{ISO.SP.Protocol} and
        !           470:                \cite{CCITT.SP.Protocol} both require a maximum length
        !           471:                of \verb"9" octets for a user-initiated abort, the
        !           472:                current implementation permits up to \verb"512" octets to
        !           473:                be used.  Without this freedom, higher-layer protocols
        !           474:                which use presentation encoding mechanisms would be unable
        !           475:                to successfully use the session abort facility.
        !           476: \end{tabular}}\]
        !           477: 
        !           478: After examining the information returned by \verb"SInit" on a successful call
        !           479: (and possibly after examining the argument vector),
        !           480: the responder should either accept or reject the connection.
        !           481: For either response,
        !           482: the responder should use
        !           483: the \verb"SConnResponse" routine
        !           484: (which corresponds to the {\sf S-CONNECT.RESPONSE\/} action).
        !           485: \begin{quote}\index{SConnResponse}\small\begin{verbatim}
        !           486: int     SConnResponse (sd, ref, called, result, requirements,
        !           487:                 settings, isn, data, cc, si)
        !           488: int     sd;
        !           489: struct SSAPref *ref;
        !           490: struct SSAPaddr *called;
        !           491: int     result,
        !           492:         requirements,
        !           493:         settings,
        !           494:         cc;
        !           495: long   isn;
        !           496: char   *data;
        !           497: struct SSAPindication *si;
        !           498: \end{verbatim}\end{quote}
        !           499: The parameters to this procedure are:
        !           500: \begin{describe}
        !           501: \item[\verb"sd":] the session-descriptor;
        !           502: 
        !           503: \item[\verb"ref":]  the connection identifier used by the responder
        !           504: (consult page~\pageref{SSAPref} for a description of the \verb"SSAPref"
        !           505: structure);
        !           506: 
        !           507: \item[\verb"called":] the SSAP address of the responder (defaulting to the
        !           508: called address, if not present);
        !           509: 
        !           510: \item[\verb"result":] the acceptance indicator
        !           511: (either \verb"SC_ACCEPT" if the connection is to be accepted,
        !           512: or one of the user-initiated abort error codes listed in
        !           513: Table~\ref{SSAPreasons} on page~\pageref{SSAPreasons});
        !           514: 
        !           515: \item[\verb"requirements":] the responder's session requirements
        !           516: (this may not include any requirements not listed in the initiator's session
        !           517: requirements);
        !           518: 
        !           519: \item[\verb"settings":] the initial token settings
        !           520: (for each token,
        !           521: if the initiator specified \verb"ST_CALL_VALUE",
        !           522: then the responder should specify either \verb"ST_INIT_VALUE" or
        !           523: \verb"ST_RESP_VALUE";
        !           524: instead,
        !           525: if the initiator specified \verb"ST_INIT_VALUE",
        !           526: and the responder wants the token,
        !           527: it can specify the value \verb"ST_RSVD_VALUE".
        !           528: This is interpreted by the service provider as a ``tokens please'' request;
        !           529: 
        !           530: \item[\verb"isn":] the initial serial-number;
        !           531: 
        !           532: \item[\verb"data"/\verb"cc":] any initial data (and the length of that data,
        !           533: which may not exceed \verb"SC_SIZE" octets);
        !           534: and,
        !           535: 
        !           536: \item[\verb"si":] a pointer to a \verb"SSAPindication" structure, which is
        !           537: updated only if the call fails.
        !           538: \end{describe}
        !           539: If the call to \verb"SConnResponse" is successful,
        !           540: and if the \verb"result" parameter is set to \verb"SC_ACCEPT",
        !           541: then connection establishment has completed
        !           542: and the users of the session service now operate as symmetric peers.
        !           543: If the call is successful,
        !           544: but the \verb"result" parameter is not \verb"SC_ACCEPT",
        !           545: then the connection has been rejected and the responder may exit.
        !           546: Otherwise, if the call fails and the reason is not an interface error
        !           547: (see Table~\ref{SSAPreasons} on page~\pageref{SSAPreasons}),
        !           548: then the connection is closed.
        !           549: 
        !           550: Note that when the responder rejects the connection,
        !           551: it need not supply meaningful values for the the \verb"requirements",
        !           552: \verb"settings", and \verb"isn" parameters.
        !           553: The \verb"data"/\verb"cc" parameters are also optional,
        !           554: but it is recommended that the responder return some diagnostic information.
        !           555: 
        !           556: \subsection    {Client Initialization}
        !           557: A program wishing to connect to another user of session services calls the
        !           558: \verb"SConnRequest" routine,
        !           559: which corresponds to the {\sf S-CONNECT.REQUEST\/} action.
        !           560: \begin{quote}\index{SConnRequest}\small\begin{verbatim}
        !           561: int     SConnRequest (ref, calling, called, requirements,
        !           562:                 settings, isn, data, cc, qos, sc, si)
        !           563: struct SSAPref *ref;
        !           564: struct SSAPaddr *calling,
        !           565:                 *called;
        !           566: int     requirements,
        !           567:         settings,
        !           568:         cc;
        !           569: long   isn;
        !           570: char   *data;
        !           571: struct QOStype *qos;
        !           572: struct SSAPconnect *sc;
        !           573: struct SSAPindication *si;
        !           574: \end{verbatim}\end{quote}
        !           575: The parameters to this procedure are:
        !           576: \begin{describe}
        !           577: \item[\verb"ref":] the connection identifier used by the initiator
        !           578: (consult page~\pageref{SSAPref} for a description of the \verb"SSAPref"
        !           579: structure);
        !           580: 
        !           581: \item[\verb"calling":] the SSAP address of the responder;
        !           582: 
        !           583: \item[\verb"called":] the SSAP address of the initiator;
        !           584: 
        !           585: \item[\verb"requirements":] the session requirements;
        !           586: 
        !           587: \item[\verb"settings":] the initial token settings;
        !           588: 
        !           589: \item[\verb"isn":] the initial serial-number;
        !           590: 
        !           591: \item[\verb"data"/\verb"cc":] any initial data (and the length of that data,
        !           592: which may not exceed \verb"SS_SIZE" octets);
        !           593: 
        !           594: \item[\verb"qos":] the quality of service on the connection
        !           595: (see Section~\ref{tsap:qos});
        !           596: 
        !           597: \item[\verb"sc":] a pointer to a \verb"SSAPconnect" structure, which is
        !           598: updated only if the call succeeds;
        !           599: and,
        !           600: 
        !           601: \item[\verb"si":] a pointer to a \verb"SSAPindication" structure, which is
        !           602: updated only if either:
        !           603: \begin{itemize}
        !           604: \item the call fails;
        !           605: or,
        !           606: 
        !           607: \item the call succeeds,
        !           608: but the value of the \verb"sc_result" element of the \verb"sc" parameter
        !           609: is not \verb"SC_ACCEPT" (see below).
        !           610: \end{itemize}
        !           611: \end{describe}
        !           612: If the call to \verb"SConnRequest" is successful
        !           613: (a successful return corresponds to a {\sf S-CONNECT.CONFIRMATION\/} event),
        !           614: then information is returned in the \verb"sc" parameter,
        !           615: which is a pointer to a \verb"SSAPconnect" structure.
        !           616: \begin{quote}\index{SSAPconnect}\small\begin{verbatim}
        !           617: struct SSAPconnect {
        !           618:     int     sc_sd;
        !           619: 
        !           620:     struct SSAPref  sc_connect;
        !           621:     
        !           622:     struct SSAPaddr sc_responding;
        !           623: 
        !           624:     int     sc_result;
        !           625: 
        !           626:     int     sc_requirements;
        !           627:     int     sc_settings;
        !           628:     int     sc_please;
        !           629:     lnog    sc_isn;
        !           630: 
        !           631:     int     sc_ssdusize;
        !           632: 
        !           633:     struct QOStype sc_qos;
        !           634: 
        !           635: #define SC_SIZE         512
        !           636:     int     sc_cc;
        !           637:     char    sc_data[SC_SIZE];
        !           638: };
        !           639: \end{verbatim}\end{quote}
        !           640: The elements of this structure are:
        !           641: \begin{describe}
        !           642: \item[\verb"sc\_sd":] the session-descriptor to be used to reference this
        !           643: connection;
        !           644: 
        !           645: \item[\verb"sc\_connect":] the connection identifier used by the responder
        !           646: (consult page~\pageref{SSAPref} for a description of the \verb"SSAPref"
        !           647: structure);
        !           648: 
        !           649: \item[\verb"sc\_responding":] the responding peer's address
        !           650: (which is the same as the \verb"called" parameter given to
        !           651: \verb"SConnRequest");
        !           652: 
        !           653: \item[\verb"sc\_result":] the connection response;
        !           654: 
        !           655: \item[\verb"sc\_requirements":] the (negotiated) session requirements;
        !           656: 
        !           657: \item[\verb"sc\_settings":] the (negotiated) initial token settings;
        !           658: 
        !           659: \item[\verb"sc\_please":] the tokens which the responder wants to own
        !           660: (if any);
        !           661: 
        !           662: \item[\verb"sc\_isn":] the (negotiated) initial serial-number;
        !           663: 
        !           664: \item[\verb"sc\_ssdusize":] the largest atomic SSDU size that can be used on
        !           665: the connection (see the note on page~\pageref{SSDU:atomic});
        !           666: 
        !           667: \item[\verb"sc\_qos":] the quality of service on the connection
        !           668: (see Section~\ref{tsap:qos});
        !           669: and,
        !           670: 
        !           671: \item[\verb"sc\_data"/\verb"sc\_cc":] any initial data (and the length of
        !           672: that data).
        !           673: \end{describe}
        !           674: If the call to \verb"SConnRequest" is successful,
        !           675: and the \verb"sc_result" element is set to \verb"SC_ACCEPT",
        !           676: then connection establishment has completed and the users of the session
        !           677: service now operate as symmetric peers.
        !           678: If the call is successful,
        !           679: but the \verb"sc_result" element is not \verb"SC_ACCEPT",
        !           680: then the connection has been rejected;
        !           681: consult Table~\ref{SSAPreasons} to determine the reason
        !           682: (further information can be found in the \verb"si" parameter).
        !           683: Otherwise, if the call fails then the connection is not established and the
        !           684: \verb"SSAPabort" structure of the \verb"SSAPindication" discriminated union
        !           685: has been updated.
        !           686: 
        !           687: Normally \verb"SConnRequest" returns only after a connection has succeeded or
        !           688: failed.
        !           689: This is termed a {\em synchronous\/} connection initiation.
        !           690: If the user desires, an {\em asynchronous\/} connection may be initiated.
        !           691: The routine \verb"SConnRequest" is really a macro which calls the routine
        !           692: \verb"SAsynConnRequest" with an argument indicating that a connection should
        !           693: be attempted synchronously.
        !           694: \begin{quote}\index{SAsynConnRequest}\small\begin{verbatim}
        !           695: int     SAsynConnRequest (ref, calling, called,
        !           696:                 requirements, settings, isn, data, cc,
        !           697:                 qos, sc, si, async)
        !           698: struct SSAPref *ref;
        !           699: struct SSAPaddr *calling,
        !           700:                 *called;
        !           701: int     requirements,
        !           702:         settings,
        !           703:         cc,
        !           704:         async;
        !           705: long   isn;
        !           706: char   *data;
        !           707: struct QOStype *qos;
        !           708: struct SSAPconnect *sc;
        !           709: struct SSAPindication *si;
        !           710: \end{verbatim}\end{quote}
        !           711: The additional parameter to this procedure is:
        !           712: \begin{describe}
        !           713: \item[\verb"async":] whether the connection should be initiated asynchronously.
        !           714: \end{describe}
        !           715: If the \verb"async" parameter is non-zero,
        !           716: then \verb"SAsynConnRequest" returns one of four values:
        !           717: \verb"NOTOK", which indicates that the connection request failed;
        !           718: \verb"DONE", which indicates that the connection request succeeded;
        !           719: or, either of \verb"CONNECTING_1" or \verb"CONNECTING_2", which indicates that
        !           720: the connection request is still in
        !           721: progress.
        !           722: In the first two cases,
        !           723: the usual procedures for handling return values from \verb"SConnRequest" are
        !           724: employed
        !           725: (i.e., a \verb"NOTOK" return from \verb"SAsynConnRequest" is equivalent to a
        !           726: \verb"NOTOK" return from \verb"SConnRequest", and,
        !           727: a \verb"DONE" return from \verb"SAsynConnRequest" is equivalent to a
        !           728: \verb"OK" return from \verb"SConnRequest").
        !           729: In the final case, when either \verb"CONNECTING_1" or
        !           730: \verb"CONNECTING_2" is returned,
        !           731: only the \verb"sc_sd" element of the \verb"sc" parameter has been updated;
        !           732: it reflects the session-descriptor to be used to reference this connection.
        !           733: Note that the \verb"data" parameter is still being referenced by
        !           734: \man libssap(3n) and should not be tampered with until the connection attempt
        !           735: has been completed.
        !           736: 
        !           737: To determine when the connection attempt has been completed,
        !           738: the routine \verb"xselect" (consult Section~\ref{acs:select} of \volone/)
        !           739: should be used after calling \verb"SSelectMask".
        !           740: In order to determine if the connection attempt is successful,
        !           741: the \verb"SAsynRetryRequest" routine is called:
        !           742: \begin{quote}\index{SAsynRetryRequest}\small\begin{verbatim}
        !           743: int     SAsynRetryRequest (sd, sc, si)
        !           744: int     sd;
        !           745: struct SSAPconnect *sc;
        !           746: struct SSAPindication  *si;
        !           747: \end{verbatim}\end{quote}
        !           748: The parameters to this procedure are:
        !           749: \begin{describe}
        !           750: \item[\verb"sd":] the session-descriptor;
        !           751: 
        !           752: \item[\verb"sc":] a pointer to a \verb"SSAPconnect" structure, which is
        !           753: updated only if the call succeeds;
        !           754: and,
        !           755: 
        !           756: \item[\verb"si":] a pointer to a \verb"SSAPindication" structure, which is
        !           757: updated only if the call fails.
        !           758: \end{describe}
        !           759: Again, one of three values are returned:
        !           760: \verb"NOTOK", which indicates that the connection request failed;
        !           761: \verb"DONE", which indicates that the connection request succeeded;
        !           762: and, \verb"CONNECTING_1" or \verb"CONNECTING_2" which indicates that
        !           763: the connection request is still in progress.
        !           764: 
        !           765: Refer to Section~\ref{tsap:async} on page~\pageref{tsap:async} for information
        !           766: on how to make efficient use of the asynchronous connection facility.
        !           767: 
        !           768: \section      {Data Transfer}
        !           769: Once the connection has been established,
        !           770: a session-descriptor is used to reference the connection.
        !           771: This is usually the first parameter given to any of the remaining routines in
        !           772: the \man libssap(3n) library.
        !           773: Further,
        !           774: the last parameter is usually a pointer to a \verb"SSAPindication" structure
        !           775: (as described on page~\pageref{SSAPindication}).
        !           776: If a call to one of these routines fails,
        !           777: then the structure is updated.
        !           778: Consult the \verb"SSAPabort" element of the \verb"SSAPindication" structure.
        !           779: If the \verb"sa_reason" element of the \verb"SSAPabort" structure is
        !           780: associated with a fatal error,
        !           781: then the connection is closed.
        !           782: That is, a {\sf S-P-ABORT.INDICATION\/} event has occurred.
        !           783: The \verb"SC_FATAL" macro can be used to determine this.
        !           784: \begin{quote}\index{SC\_FATAL}\small\begin{verbatim}
        !           785: int     SC_FATAL (r)
        !           786: int     r;
        !           787: \end{verbatim}\end{quote}
        !           788: The most common interface error to occur is \verb"SC_OPERATION" which usually
        !           789: indicates that either the user is lacking ownership of a session token
        !           790: to perform an operation,
        !           791: or that a session requirement required by the operation was not negotiated
        !           792: during connection establishment.
        !           793: For protocol purists,
        !           794: the \verb"SC_OFFICIAL" macro can be used to determine if the error is an
        !           795: ``official'' error as defined by the specification,
        !           796: or an ``unofficial'' error used by the implementation.
        !           797: \begin{quote}\index{SC\_OFFICIAL}\small\begin{verbatim}
        !           798: int     SC_OFFICIAL (r)
        !           799: int     r;
        !           800: \end{verbatim}\end{quote}
        !           801: 
        !           802: \subsection    {Sending Data}
        !           803: There are six routines which may be used to send data.
        !           804: A call to the \verb"SDataRequest" routine is equivalent to a
        !           805: {\sf S-DATA.REQUEST\/} action on the part of the user.
        !           806: \begin{quote}\index{SDataRequest}\small\begin{verbatim}
        !           807: int     SDataRequest (sd, data, cc, si)
        !           808: int     sd;
        !           809: char   *data;
        !           810: int     cc;
        !           811: struct SSAPindication  *si;
        !           812: \end{verbatim}\end{quote}
        !           813: The parameters to this procedure are:
        !           814: \begin{describe}
        !           815: \item[\verb"sd":] the session-descriptor;
        !           816: 
        !           817: \item[\verb"data"/\verb"cc":] the data to be written (and the length of that
        !           818: data);
        !           819: and,
        !           820: 
        !           821: \item[\verb"si":] a pointer to a \verb"SSAPindication" structure, which is updated
        !           822: only if the call fails.
        !           823: \end{describe}
        !           824: If the call to \verb"SDataRequest" is successful,
        !           825: then the data has been queued for sending to the peer.
        !           826: Otherwise the \verb"SSAPabort" structure contained in
        !           827: the \verb"SSAPindication" parameter
        !           828: \verb"si" contains the reason for failure.
        !           829: 
        !           830: A call to the \verb"SExpdRequest" routine is equivalent to a
        !           831: {\sf S-EXPEDITED-DATA.REQUEST\/} action on the part of the user.
        !           832: \begin{quote}\index{SExpdRequest}\small\begin{verbatim}
        !           833: int     SExpdRequest (sd, data, cc, si)
        !           834: int     sd;
        !           835: char   *data;
        !           836: int     cc;
        !           837: struct SSAPindication  *si;
        !           838: \end{verbatim}\end{quote}
        !           839: The parameters to this procedure are:
        !           840: \begin{describe}
        !           841: \item[\verb"sd":] the session-descriptor;
        !           842: 
        !           843: \item[\verb"data"/\verb"cc":] the data to be written (and the length of that
        !           844: data, which may not exceed \verb"SX_SIZE" octets);
        !           845: and,
        !           846: 
        !           847: \item[\verb"si":] a pointer to a \verb"SSAPindication" structure, which is updated
        !           848: only if the call fails.
        !           849: \end{describe}
        !           850: If the call to \verb"SExpdRequest" is successful,
        !           851: then the data has been queued for expedited sending.
        !           852: Otherwise the \verb"SSAPabort" element of the \verb"si" parameter
        !           853: contains the reason for failure.
        !           854: 
        !           855: A call to the \verb"STypedRequest" routine is equivalent to a
        !           856: {\sf S-TYP\-ED-DA\-TA.RE\-QUEST\/} action on the part of the user.
        !           857: \begin{quote}\index{STypedRequest}\small\begin{verbatim}
        !           858: int     STypedRequest (sd, data, cc, si)
        !           859: int     sd;
        !           860: char   *data;
        !           861: int     cc;
        !           862: struct SSAPindication  *si;
        !           863: \end{verbatim}\end{quote}
        !           864: The parameters to this procedure are:
        !           865: \begin{describe}
        !           866: \item[\verb"sd":] the session-descriptor;
        !           867: 
        !           868: \item[\verb"data"/\verb"cc":] the data to be written (and the length of that
        !           869: data);
        !           870: and,
        !           871: 
        !           872: \item[\verb"si":] a pointer to a \verb"SSAPindication" structure, which is updated
        !           873: only if the call fails.
        !           874: \end{describe}
        !           875: If  the call to \verb"STypedRequest" is successful,
        !           876: then the data has been queued for sending to the peer.
        !           877: Otherwise the \verb"SSAPabort" structure contained in
        !           878: the \verb"SSAPindication" parameter
        !           879: \verb"si" contains the reason for failure.
        !           880: 
        !           881: A call to the \verb"SCapdRequest" routine is equivalent to a {\sf
        !           882: S-CAPABILITY-DATA.REQUEST\/} action on the part of the user.
        !           883: \begin{quote}\index{SCapdRequest}\small\begin{verbatim}
        !           884: int     SCapdRequest (sd, data, cc, si)
        !           885: int     sd;
        !           886: char   *data;
        !           887: int     cc;
        !           888: struct SSAPindication  *si;
        !           889: \end{verbatim}\end{quote}
        !           890: The parameters to this procedure are:
        !           891: \begin{describe}
        !           892: \item[\verb"sd":] the session-descriptor;
        !           893: 
        !           894: \item[\verb"data"/\verb"cc":] the data to be written (and the length of that
        !           895: data, which may not exceed \verb"SX_CDSIZE" octets);
        !           896: and,
        !           897: 
        !           898: \item[\verb"si":] a pointer to a \verb"SSAPindication" structure, which is updated
        !           899: only if the call fails.
        !           900: \end{describe}
        !           901: If the call to \verb"SCapdRequest" is successful,
        !           902: then the data has been queued for sending.
        !           903: When the {\sf S-CAPABILITY-DATA.CONFIRMATION\/} event is received,
        !           904: the data has been successfully received.
        !           905: Otherwise the \verb"SSAPabort" structure contained in
        !           906: the \verb"SSAPindication" parameter
        !           907: \verb"si" contains the reason for failure.
        !           908: 
        !           909: Upon receiving a {\sf S-CAPABILITY-DATA.INDICATION\/} event,
        !           910: the user is required to generate a {\sf S-CAPABILITY-DATA.RESPONSE\/} action
        !           911: using the \verb"SCapdResponse" routine.
        !           912: \begin{quote}\index{SCapdResponse}\small\begin{verbatim}
        !           913: int     SCapdResponse (sd, data, cc, si)
        !           914: int     sd;
        !           915: char   *data;
        !           916: int     cc;
        !           917: struct SSAPindication  *si;
        !           918: \end{verbatim}\end{quote}
        !           919: The parameters to this procedure are:
        !           920: \begin{describe}
        !           921: \item[\verb"sd":] the session-descriptor;
        !           922: 
        !           923: \item[\verb"data"/\verb"cc":] the data to be written (and the length of that
        !           924: data, which may not exceed \verb"SX_CDASIZE" octets);
        !           925: and,
        !           926: 
        !           927: \item[\verb"si":] a pointer to a \verb"SSAPindication" structure, which is updated
        !           928: only if the call fails.
        !           929: \end{describe}
        !           930: If  the call to \verb"SCapdResponse" is successful,
        !           931: then the data has been queued for sending to the peer.
        !           932: Otherwise the \verb"SSAPabort" structure contained in
        !           933: the \verb"SSAPindication" parameter
        !           934: \verb"si" contains the reason for failure.
        !           935: 
        !           936: The \verb"SWriteRequest" routine is similar in nature to the
        !           937: \verb"SDataRequest" and \verb"STypedRequest" routines,
        !           938: but uses a different set of parameters.
        !           939: The invocation is:
        !           940: \begin{quote}\index{SWriteRequest}\small\begin{verbatim}
        !           941: int     SWriteRequest (sd, typed, uv, si)
        !           942: int     sd;
        !           943: int     typed;
        !           944: struct udvec *uv;
        !           945: int     cc;
        !           946: \end{verbatim}\end{quote}
        !           947: The parameters to this procedure are:
        !           948: \begin{describe}
        !           949: \item[\verb"sd":] the session-descriptor;
        !           950: 
        !           951: \item[\verb"typed":] whether this is typed-data or not;
        !           952: 
        !           953: \item[\verb"uv":] the data to be written,
        !           954: described in a null-terimated array of scatter/gather elements;
        !           955: and,
        !           956: 
        !           957: \item[\verb"si":] a pointer to a \verb"SSAPindication" structure, which is updated
        !           958: only if the call fails.
        !           959: \end{describe}
        !           960: If the call to \verb"SWriteRequest" is successful,
        !           961: then the data has been queued for sending to the peer.
        !           962: Otherwise the \verb"SSAPabort" structure contained in
        !           963: the \verb"SSAPindication" parameter
        !           964: \verb"si" contains the reason for failure.
        !           965: 
        !           966: \subsection    {Receiving Data}
        !           967: There is one routine used to read data,
        !           968: \verb"SReadRequest",
        !           969: a call to which is equivalent to waiting for an event
        !           970: (usually an incoming data event) to occur.
        !           971: \begin{quote}\index{SReadRequest}\small\begin{verbatim}
        !           972: int     SReadRequest (sd, sx, secs, si)
        !           973: int     sd;
        !           974: struct SSAPdata *sx;
        !           975: int     secs;
        !           976: struct SSAPindication  *si;
        !           977: \end{verbatim}\end{quote}
        !           978: The parameters to this procedure are:
        !           979: \begin{describe}
        !           980: \item[\verb"sd":] the session-descriptor;
        !           981: 
        !           982: \item[\verb"sx":] a pointer to the \verb"SSAPdata" structure to be given
        !           983: the data;
        !           984: 
        !           985: \item[\verb"secs":] the maximum number of seconds to wait for the data
        !           986: (a value of \verb"NOTOK" indicates that the call should block indefinitely,
        !           987: whereas a value of \verb"OK" indicates that the call should not block at all,
        !           988: e.g., a polling action);
        !           989: and,
        !           990: 
        !           991: \item[\verb"si":] a pointer to a \verb"SSAPindication" structure, which is updated
        !           992: only if data is not read.
        !           993: \end{describe}
        !           994: Unlike the other routines in the \man libssap(3n) library,
        !           995: the \verb"SReadRequest" routine returns one of three values:
        !           996: \verb"NOTOK" (on failure),
        !           997: \verb"OK" (on reading data),
        !           998: or
        !           999: \verb"DONE" (otherwise).
        !          1000: 
        !          1001: If the call to \verb"SReadRequest" returns the manifest constant \verb"OK",
        !          1002: then the data has been read into the \verb"sx" parameter,
        !          1003: which is a pointer to a \verb"SSAPdata" structure.
        !          1004: \begin{quote}\index{SSAPdata}\small\begin{verbatim}
        !          1005: struct SSAPdata {
        !          1006:     int     sx_type;
        !          1007: #define SX_NORMAL       0x00
        !          1008: #define SX_EXPEDITED    0x01
        !          1009: #define SX_TYPED        0x02
        !          1010: #define SX_CAPDIND      0x03
        !          1011: #define SX_CAPDCNF      0x04
        !          1012: 
        !          1013:     int     sx_cc;
        !          1014:     struct qbuf sx_qbuf;
        !          1015: };
        !          1016: \end{verbatim}\end{quote}
        !          1017: The elements of a \verb"SSAPdata" structure are:
        !          1018: \begin{describe}
        !          1019: \item[\verb"sx\_type":] indicates how the data was received:
        !          1020: \[\begin{tabular}{|l|l|}
        !          1021: \hline
        !          1022:     \multicolumn{1}{|c|}{\bf Value}&
        !          1023:                \multicolumn{1}{c|}{\bf Event}\\
        !          1024: \hline
        !          1025:     \tt SX\_NORMAL&    \sf S-DATA.INDICATION\\
        !          1026:     \tt SX\_EXPEDITED& \sf S-EXPEDITED-DATA.INDICATION\\
        !          1027:     \tt SX\_TYPED&     \sf S-TYPED-DATA.INDICATION\\
        !          1028:     \tt SX\_CAPDIND&   \sf S-CAPABILITY-DATA.INDICATION\\
        !          1029:     \tt SX\_CAPDCNF&   \sf S-CAPABILITY-DATA.CONFIRMATION\\
        !          1030: \hline
        !          1031: \end{tabular}\]
        !          1032: 
        !          1033: \item[\verb"sx\_cc":] the total number of octets that was read;
        !          1034: and,
        !          1035: 
        !          1036: \item[\verb"sx\_qbuf":] the data that was read in a buffer-queue form
        !          1037: (see page~\pageref{tsap:qbuf} for a description of this structure).
        !          1038: \end{describe}
        !          1039: Note that the data contained in the structure was allocated via \man malloc(3),
        !          1040: and should be released by using the \verb"SXFREE" macro when no longer
        !          1041: referenced.
        !          1042: The \verb"SXFREE" macro,
        !          1043: behaves as if it was defined as:\label{SXFREE}
        !          1044: \begin{quote}\index{SXFREE}\small\begin{verbatim}
        !          1045: void    SXFREE (sx)
        !          1046: struct SSAPdata *sx;
        !          1047: \end{verbatim}\end{quote}
        !          1048: The macro frees only the data allocated by \verb"SReadRequest",
        !          1049: and not the \verb"SSAPdata" structure itself.
        !          1050: Further,
        !          1051: \verb"SXFREE" should be called only if the call to the \verb"SReadRequest"
        !          1052: routine returned \verb"OK".
        !          1053: 
        !          1054: \[\fbox{\begin{tabular}{lp{0.8\textwidth}}
        !          1055: \bf NOTE:&     Because the \verb"SSAPdata" structure contains a
        !          1056:                \verb"qbuf" element, care must be taken in initializing
        !          1057:                and copying variables of this type.
        !          1058:                The routines in \man libssap(3n) library will correctly
        !          1059:                initialize these structures when given as parameters.
        !          1060:                But, users who otherwise manipulate these structures 
        !          1061:                should take great care.
        !          1062: \end{tabular}}\]
        !          1063: 
        !          1064: Otherwise if the call to \verb"SReadRequest" returns the manifest constant
        !          1065: \verb"NOTOK",
        !          1066: then the \verb"SSAPabort" structure contained in
        !          1067: the \verb"SSAPindication" parameter
        !          1068: \verb"si" contains the reason for failure.
        !          1069: 
        !          1070: If the call to \verb"SReadRequest" returns the manifest constant \verb"DONE",
        !          1071: then some event other than data arrival has occurred.
        !          1072: This event is encoded in the \verb"si" parameter,
        !          1073: depending on the value of the \verb"si_type" element.
        !          1074: When \verb"SReadRequest" returns \verb"DONE",
        !          1075: the \verb"si_type" element may be set to one of five values:
        !          1076: \[\begin{tabular}{|l|l|}
        !          1077: \hline
        !          1078:     \multicolumn{1}{|c|}{\bf Value}&
        !          1079:                        \multicolumn{1}{c|}{\bf Event}\\
        !          1080: \hline
        !          1081:     \tt SI\_TOKEN&     Token management\\
        !          1082:     \tt SI\_SYNC&      Synchronization management\\
        !          1083:     \tt SI\_ACTIVITY&  Activity management\\
        !          1084:     \tt SI\_REPORT&    Exception reporting\\
        !          1085:     \tt SI\_FINISH&    Connection release\\
        !          1086: \hline
        !          1087: \end{tabular}\]
        !          1088: 
        !          1089: \subsubsection {Token Indications}
        !          1090: When an event associated with token management occurs,
        !          1091: the \verb"si_type" field of the \verb"si" parameter contains the value
        !          1092: \verb"SI_TOKEN",
        !          1093: and a \verb"SSAPtoken" structure is contained inside the \verb"si" parameter.
        !          1094: \begin{quote}\index{SSAPtoken}\small\begin{verbatim}
        !          1095: struct SSAPtoken {
        !          1096:     int     st_type;
        !          1097: #define ST_GIVE         0x00
        !          1098: #define ST_PLEASE       0x01
        !          1099: #define ST_CONTROL      0x02
        !          1100: 
        !          1101:     u_char  st_tokens;
        !          1102:     u_char  st_owned;
        !          1103: 
        !          1104: #define ST_SIZE         512
        !          1105:     int     st_cc;
        !          1106:     char    st_data[ST_SIZE];
        !          1107: };
        !          1108: \end{verbatim}\end{quote}
        !          1109: The elements of a \verb"SSAPtoken" structure are:
        !          1110: \begin{describe}
        !          1111: \item[\verb"st\_type":] defines the token management indication which
        !          1112: occurred:
        !          1113: \[\begin{tabular}{|l|l|}
        !          1114: \hline
        !          1115:     \multicolumn{1}{|c|}{\bf Value}&
        !          1116:                \multicolumn{1}{c|}{\bf Event}\\
        !          1117: \hline
        !          1118:     \tt ST\_GIVE&      \sf S-TOKEN-GIVE.INDICATION\\
        !          1119:     \tt ST\_PLEASE&    \sf S-TOKEN-PLEASE.INDICATION\\
        !          1120:     \tt ST\_CONTROL&   \sf S-GIVE-CONTROL.INDICATION\\
        !          1121: \hline
        !          1122: \end{tabular}\]
        !          1123: 
        !          1124: \item[\verb"st\_tokens":] the session tokens requested or given;
        !          1125: 
        !          1126: \item[\verb"st\_owned":] all of the session tokens currently owned by the
        !          1127: user;
        !          1128: and,
        !          1129: 
        !          1130: \item[\verb"st\_base"/\verb"st\_cc":]
        !          1131: associated data (and the length of that data) if tokens are requested.
        !          1132: \end{describe}
        !          1133: It is entirely at the discretion of the user what actions are to be taken when
        !          1134: an indication event associated with token management occurs.
        !          1135: 
        !          1136: \subsubsection {Synchronization Indications}
        !          1137: When an event associated with synchronization occurs,
        !          1138: the \verb"si_type" field of the \verb"si" parameter contains the value
        !          1139: \verb"SI_SYNC",
        !          1140: and a \verb"SSAPsync" structure is contained inside the \verb"si" parameter.
        !          1141: \begin{quote}\index{SSAPsync}\small\begin{verbatim}
        !          1142: struct SSAPsync {
        !          1143:     int     sn_type;
        !          1144: #define SN_MAJORIND     0x00
        !          1145: #define SN_MAJORCNF     0x01
        !          1146: #define SN_MINORIND     0x02
        !          1147: #define SN_MINORCNF     0x03
        !          1148: #define SN_RESETIND     0x04
        !          1149: #define SN_RESETCNF     0x05
        !          1150: 
        !          1151:     int     sn_options;
        !          1152: #define SYNC_CONFIRM    1
        !          1153: #define SYNC_NOCONFIRM  0
        !          1154: 
        !          1155: #define SYNC_RESTART    0
        !          1156: #define SYNC_ABANDON    1
        !          1157: #define SYNC_SET        2
        !          1158: 
        !          1159:     long    sn_ssn;
        !          1160: #define SERIAL_NONE     (-1L)
        !          1161: #define SERIAL_MIN      000000L
        !          1162: #define SERIAL_MAX      999998L
        !          1163: 
        !          1164:     int     sn_settings;
        !          1165: 
        !          1166: #define SN_SIZE         512
        !          1167:     int     sn_cc;
        !          1168:     char    sn_data[SN_SIZE];
        !          1169: };
        !          1170: \end{verbatim}\end{quote}
        !          1171: The elements of a \verb"SSAPsync" structure are:
        !          1172: \begin{describe}
        !          1173: \item[\verb"sn\_type":] defines the synchronization management indication
        !          1174: which occurred:
        !          1175: \[\begin{tabular}{|l|l|}
        !          1176: \hline
        !          1177:     \multicolumn{1}{|c|}{\bf Value}&
        !          1178:                \multicolumn{1}{c|}{\bf Event}\\
        !          1179: \hline
        !          1180:        \tt SN\_MAJORIND&       \sf S-MAJOR-SYNC.INDICATION\\
        !          1181:        \tt SN\_MAJORCNF&       \sf S-MAJOR-SYNC.CONFIRMATION\\
        !          1182:        \tt SN\_MINORIND&       \sf S-MINOR-SYNC.INDICATION\\
        !          1183:        \tt SN\_MINORCNF&       \sf S-MINOR-SYNC.CONFIRMATION\\
        !          1184:        \tt SN\_RESETIND&       \sf S-RESYNCHRONIZE.INDICATION\\
        !          1185:        \tt SN\_RESETCNF&       \sf S-RESYNCHRONIZE.CONFIRMATION\\
        !          1186: \hline
        !          1187: \end{tabular}\]
        !          1188: 
        !          1189: \item[\verb"sn\_options":] various modifiers of the indication.
        !          1190: For the minorsync indication (as described in Section~\ref{sync:mgmt}
        !          1191: on page~\pageref{sync:mgmt}):
        !          1192: \[\begin{tabular}{|l|l|}
        !          1193: \hline
        !          1194:     \multicolumn{1}{|c|}{\bf Value}&
        !          1195:                \multicolumn{1}{c|}{\bf Modifier}\\
        !          1196: \hline
        !          1197:     \tt SYNC\_CONFIRM&         peer wants explicit confirmation\\
        !          1198:     \tt SYNC\_NOCONFIRM&       peer doesn't want explicit confirmation\\
        !          1199: \hline
        !          1200: \end{tabular}\]
        !          1201: For the resync indication (also described in Section~\ref{sync:mgmt}):
        !          1202: \[\begin{tabular}{|l|l|}
        !          1203: \hline
        !          1204:     \multicolumn{1}{|c|}{\bf Value}&
        !          1205:                \multicolumn{1}{c|}{\bf Modifier}\\
        !          1206: \hline
        !          1207:     \tt SYNC\_RESTART& a ``restart'' resynchronization is requested\\
        !          1208:     \tt SYNC\_ABANDON& a ``abandon'' resynchronization is requested\\
        !          1209:     \tt SYNC\_SET&     a ``set'' resynchronization is requested\\
        !          1210: \hline
        !          1211: \end{tabular}\]
        !          1212: 
        !          1213: \item[\verb"sn\_ssn":] the serial-number associated with this synchronization
        !          1214: management event;
        !          1215: 
        !          1216: \item[\verb"sn\_settings":] for resync events,
        !          1217: the proposed (resync indication) or new (resync confirmation) token settings;
        !          1218: and,
        !          1219: 
        !          1220: \item[\verb"sn\_data"/\verb"sn\_cc":] associated data
        !          1221: (and the length of that data).
        !          1222: \end{describe}
        !          1223: Note that for minorsync events,
        !          1224: the user is not obligated to confirm the synchronization point
        !          1225: even if the originator requested it.
        !          1226: 
        !          1227: \subsubsection {Activity Indications}
        !          1228: When an event associated with activity management occurs,
        !          1229: the \verb"si_type" field of the \verb"si" parameter contains the value
        !          1230: \verb"SI_ACTIVITY",
        !          1231: and the \verb"si" parameter contains a \verb"SSAPactivity" structure.
        !          1232: \begin{quote}\index{SSAPactivity}\small\begin{verbatim}
        !          1233: struct SSAPactivity {
        !          1234:     int     sv_type;
        !          1235: #define SV_START        0x00
        !          1236: #define SV_RESUME       0x01
        !          1237: #define SV_INTRIND      0x02
        !          1238: #define SV_INTRCNF      0x03
        !          1239: #define SV_DISCIND      0x04
        !          1240: #define SV_DISCCNF      0x05
        !          1241: #define SV_ENDIND       0x06
        !          1242: #define SV_ENDCNF       0x07
        !          1243: 
        !          1244:     struct SSAPactid sv_id;
        !          1245: 
        !          1246:     struct SSAPactid sv_oid;
        !          1247:     struct SSAPref   sv_connect;
        !          1248: 
        !          1249:     long    sv_ssn;
        !          1250: 
        !          1251:     int     sv_reason;
        !          1252: 
        !          1253: #define SV_SIZE         512
        !          1254:     int     sv_cc;
        !          1255:     char    sv_data[SV_SIZE];
        !          1256: };
        !          1257: \end{verbatim}\end{quote}
        !          1258: The elements of a \verb"SSAPactivity" structure are:
        !          1259: \begin{describe}
        !          1260: \item[\verb"sv\_type":] defines the activity management indication which
        !          1261: occurred:
        !          1262: \[\begin{tabular}{|l|l|}
        !          1263: \hline
        !          1264:     \multicolumn{1}{|c|}{\bf Value}&
        !          1265:                \multicolumn{1}{c|}{\bf Event}\\
        !          1266: \hline
        !          1267:        \tt SV\_START&          \sf S-ACTIVITY-START.INDICATION\\
        !          1268:        \tt SV\_RESUME&         \sf S-ACTIVITY-RESUME.INDICATION\\
        !          1269:        \tt SV\_INTRIND&        \sf S-ACTIVITY-INTERRUPT.INDICATION\\
        !          1270:        \tt SV\_INTRCNF&        \sf S-ACTIVITY-INTERRUPT.CONFIRMATION\\
        !          1271:        \tt SV\_DISCIND&        \sf S-ACTIVITY-DISCARD.INDICATION\\
        !          1272:        \tt SV\_DISCCNF&        \sf S-ACTIVITY-DISCARD.CONFIRMATION\\
        !          1273:        \tt SV\_ENDIND&         \sf S-ACTIVITY-END.INDICATION\\
        !          1274:        \tt SV\_ENDCNF&         \sf S-ACTIVITY-END.CONFIRMATION\\
        !          1275: \hline
        !          1276: \end{tabular}\]
        !          1277: 
        !          1278: \item[\verb"sv\_id":] the activity identifier for an activity start
        !          1279: or resume indication;
        !          1280: 
        !          1281: \item[\verb"sv\_oid":] the previous activity identifier for an activity resume
        !          1282: indication (see page~\pageref{SSAPactref});
        !          1283: 
        !          1284: \item[\verb"sv\_connect":] the previous connection identifier for an activity
        !          1285: resume indication;
        !          1286: 
        !          1287: \item[\verb"sv\_ssn":] the serial-number for an activity resume or end
        !          1288: indication;
        !          1289: 
        !          1290: \item[\verb"sv\_reason":] the reason for an activity interrupt or discard
        !          1291: indication (codes are listed in Table~\ref{SSAPexceptions});
        !          1292: and,
        !          1293: 
        !          1294: \item[\verb"sv\_data"/\verb"sv\_cc":] associated data (and the length of that
        !          1295: data).
        !          1296: \end{describe}
        !          1297: \tagtable[tp]{5b-5}{SSAP Exception Codes}{SSAPexceptions}
        !          1298: 
        !          1299: \subsubsection {Report Indications}
        !          1300: When an event associated with exception reporting occurs,
        !          1301: the \verb"si_type" field of the \verb"si" parameter contains the value
        !          1302: \verb"SI_REPORT",
        !          1303: and a \verb"SSAPreport" structure is contained inside the \verb"si"
        !          1304: parameter.
        !          1305: \begin{quote}\index{SSAPreport}\small\begin{verbatim}
        !          1306: struct SSAPreport {
        !          1307:     int     sp_peer;
        !          1308: 
        !          1309:     int     sp_reason;
        !          1310: 
        !          1311: #define SP_SIZE         512
        !          1312:     int     sp_cc;
        !          1313:     char    sp_data[SP_SIZE];
        !          1314: };
        !          1315: \end{verbatim}\end{quote}
        !          1316: The elements of a \verb"SSAPreport" structure are:
        !          1317: \begin{describe}
        !          1318: \item[\verb"sp\_peer":] if set, indicates that a user-initiated
        !          1319: report occurred (a {\sf S-U-EXCEPTION-REPORT.INDICATION\/} event);
        !          1320: if not set,
        !          1321: indicates that a provider-initiated report occurred
        !          1322: (a {\sf S-P-EXCEPTION-REPORT.INDICATION\/} event);
        !          1323: 
        !          1324: \item[\verb"sp\_reason":] the reason for the report
        !          1325: (codes are listed in Table~\ref{SSAPexceptions} on
        !          1326: page~\pageref{SSAPexceptions});
        !          1327: and,
        !          1328: 
        !          1329: \item[\verb"sp\_data"/\verb"sp\_cc":] any report data
        !          1330: (and the length of that data) from the peer;
        !          1331: meaningless if the report is provider-initiated.
        !          1332: \end{describe}
        !          1333: 
        !          1334: \subsubsection {Finish Indication}
        !          1335: When a {\sf S-RELEASE.INDICATION\/} event occurs,
        !          1336: the \verb"si_type" field of the \verb"si" parameter contains the value
        !          1337: \verb"SI_FINISH",
        !          1338: and a \verb"SSAPfinish" structure is contained inside the \verb"si" parameter.
        !          1339: \begin{quote}\index{SSAPfinish}\small\begin{verbatim}
        !          1340: struct SSAPfinish {
        !          1341: #define SF_SIZE         512
        !          1342:     int     sf_cc;
        !          1343:     char    sf_data[SF_SIZE];
        !          1344: };
        !          1345: \end{verbatim}\end{quote}
        !          1346: The elements of a \verb"SSAPfinish" structure are:
        !          1347: \begin{describe}
        !          1348: \item[\verb"sf\_data"/\verb"sf\_cc":] any final data (and the length of that
        !          1349: data).
        !          1350: \end{describe}
        !          1351: 
        !          1352: \subsection    {Token Management}
        !          1353: The fundamental aspect of token management deals with transferring ownership
        !          1354: of the tokens.
        !          1355: 
        !          1356: \subsubsection {Sending Tokens}
        !          1357: To transfer ownership of one or more session tokens to the remote
        !          1358: user,
        !          1359: the \verb"SGTokenRequest" routine is called
        !          1360: (which corresponds to the {\sf S-TOKEN-GIVE.REQUEST\/} action).
        !          1361: \begin{quote}\index{SGTokenRequest}\small\begin{verbatim}
        !          1362: int     SGTokenRequest (sd, tokens, si)
        !          1363: int     sd;
        !          1364: int     tokens;
        !          1365: struct SSAPindication  *si;
        !          1366: \end{verbatim}\end{quote}
        !          1367: The parameters to this procedure are:
        !          1368: \begin{describe}
        !          1369: \item[\verb"sd":] the session-descriptor;
        !          1370: 
        !          1371: \item[\verb"tokens":] the tokens to be transferred;
        !          1372: and,
        !          1373: 
        !          1374: \item[\verb"si":] a pointer to a \verb"SSAPindication" structure, which is
        !          1375: updated only if the call fails.
        !          1376: \end{describe}
        !          1377: If the call to \verb"SGTokenRequest" is successful,
        !          1378: then ownership of the tokens has been transferred to the remote user.
        !          1379: 
        !          1380: If activity management has been selected,
        !          1381: then the ownership of all tokens can be transferred using the
        !          1382: \verb"SGControlRequest" routine
        !          1383: (which corresponds to the {\sf S-CONTROL-GIVE.REQUEST\/} action).
        !          1384: \begin{quote}\index{SGControlRequest}\small\begin{verbatim}
        !          1385: int     SGControlRequest (sd, si)
        !          1386: int     sd;
        !          1387: struct SSAPindication  *si;
        !          1388: \end{verbatim}\end{quote}
        !          1389: The parameters to this procedure are:
        !          1390: \begin{describe}
        !          1391: \item[\verb"sd":] the session-descriptor;
        !          1392: and,
        !          1393: 
        !          1394: \item[\verb"si":] a pointer to a \verb"SSAPindication" structure, which is
        !          1395: updated only if the call fails.
        !          1396: \end{describe}
        !          1397: If the call to \verb"SGControlRequest" is successful,
        !          1398: then ownership of all available tokens has been transferred to the remote user.
        !          1399: Until this transfer of ownership is acknowledged,
        !          1400: other token management functions will (non-fatally) fail.
        !          1401: 
        !          1402: \subsubsection {Requesting Tokens}
        !          1403: To request ownership of one or more session tokens,
        !          1404: the \verb"SPTokenRequest" routine is called
        !          1405: (which corresponds to the {\sf S-TOKEN-PLEASE.REQUEST\/} action).
        !          1406: \begin{quote}\index{SPTokenRequest}\small\begin{verbatim}
        !          1407: int     SPTokenRequest (sd, tokens, data, cc, si)
        !          1408: int     sd;
        !          1409: int     tokens,
        !          1410:         cc;
        !          1411: char   *data;
        !          1412: struct SSAPindication  *si;
        !          1413: \end{verbatim}\end{quote}
        !          1414: The parameters to this procedure are:
        !          1415: \begin{describe}
        !          1416: \item[\verb"sd":] the session-descriptor;
        !          1417: 
        !          1418: \item[\verb"tokens":] the tokens to requested;
        !          1419: 
        !          1420: \item[\verb"data"/\verb"cc":] any additional data
        !          1421: (and the length of that data, which may not exceed \verb"ST_SIZE" octets);
        !          1422: and,
        !          1423: 
        !          1424: \item[\verb"si":] a pointer to a \verb"SSAPindication" structure, which is
        !          1425: updated only if the call fails.
        !          1426: \end{describe}
        !          1427: If the call to \verb"SPTokenRequest" is successful,
        !          1428: then the remote user has been notified of the request;
        !          1429: however, the ownership of the tokens is not actually transferred until the
        !          1430: session provider notifies the user with a {\sf S-TOKEN-GIVE-INDICATION\/}
        !          1431: event,
        !          1432: which typically occurs on the next call to \verb"SReadRequest".
        !          1433: 
        !          1434: \subsection    {Synchronization Management}\label{sync:mgmt}
        !          1435: There are three types of synchronization services:
        !          1436: majorsyncs, minorsyncs, and resyncs.
        !          1437: 
        !          1438: \subsubsection {Major Synchronization}
        !          1439: To indicate a major synchronization point,
        !          1440: the \verb"SMajSyncRequest" routine is used
        !          1441: (which corresponds to the {\sf S-MAJOR-SYNC.REQUEST\/} action).
        !          1442: \begin{quote}\index{SMajSyncRequest}\small\begin{verbatim}
        !          1443: int     SMajSyncRequest (sd, ssn, data, cc, si)
        !          1444: int     sd;
        !          1445: long   *ssn;
        !          1446: char   *data;
        !          1447: int     cc;
        !          1448: struct SSAPindication *si;
        !          1449: \end{verbatim}\end{quote}
        !          1450: The parameters to this procedure are:
        !          1451: \begin{describe}
        !          1452: \item[\verb"sd":] the session-descriptor;
        !          1453: 
        !          1454: \item[\verb"ssn":] a pointer to a long integer which,
        !          1455: on a successful return,
        !          1456: will be updated to reflect the current serial-number ($V(M)-1$);
        !          1457: 
        !          1458: \item[\verb"data"/\verb"cc":] any additional data
        !          1459: (and the length of that data, which may not exceed \verb"SN_SIZE" octets);
        !          1460: and,
        !          1461: 
        !          1462: \item[\verb"si":] a pointer to a \verb"SSAPindication" structure, which is
        !          1463: updated only if the call fails.
        !          1464: \end{describe}
        !          1465: If the call to \verb"SMajSyncRequest" is successful,
        !          1466: then the major synchronization has been queued for the remote user.
        !          1467: When the {\sf S-MAJOR-SYNC.CON\-FIR\-MA\-TION\/} event is received,
        !          1468: the major synchronization is complete.
        !          1469: Otherwise the \verb"SSAPabort" structure contained in
        !          1470: the \verb"SSAPindication" parameter
        !          1471: \verb"si" contains the reason for failure.
        !          1472: 
        !          1473: Upon receiving a {\sf S-MAJOR-SYNC.INDICATION\/} event,
        !          1474: the user is required to generate a {\sf S-MAJOR-SYNC.RESPONSE\/} action
        !          1475: by calling the \verb"SMajSyncResponse" routine.
        !          1476: \begin{quote}\index{SMajSyncResponse}\small\begin{verbatim}
        !          1477: int     SMajSyncResponse (sd, data, cc, si)
        !          1478: int     sd;
        !          1479: char   *data;
        !          1480: int     cc;
        !          1481: struct SSAPindication *si;
        !          1482: \end{verbatim}\end{quote}
        !          1483: The parameters to this procedure are:
        !          1484: \begin{describe}
        !          1485: \item[\verb"sd":] the session-descriptor;
        !          1486: 
        !          1487: \item[\verb"data"/\verb"cc":] any additional data
        !          1488: (and the length of that data, which may not exceed \verb"SN_SIZE" octets);
        !          1489: and,
        !          1490: 
        !          1491: \item[\verb"si":] a pointer to a \verb"SSAPindication" structure, which is
        !          1492: updated only if the call fails.
        !          1493: \end{describe}
        !          1494: If the call to \verb"SMajSyncResponse" is successful,
        !          1495: then the major synchronization has been completed.
        !          1496: Otherwise the \verb"SSAPabort" structure contained in
        !          1497: the \verb"SSAPindication" parameter
        !          1498: \verb"si" contains the reason for failure.
        !          1499: 
        !          1500: \subsubsection {Minor Synchronization}
        !          1501: To indicate a minor synchronization point,
        !          1502: the \verb"SMinSyncRequest" routine is used
        !          1503: (which corresponds to the {\sf S-MINOR-SYNC.REQUEST\/} action).
        !          1504: \begin{quote}\index{SMinSyncRequest}\small\begin{verbatim}
        !          1505: int     SMinSyncRequest (sd, type, ssn, data, cc, si)
        !          1506: int     sd;
        !          1507: int     type;
        !          1508: long   *ssn;
        !          1509: char   *data;
        !          1510: int     cc;
        !          1511: struct SSAPindication *si;
        !          1512: \end{verbatim}\end{quote}
        !          1513: The parameters to this procedure are:
        !          1514: \begin{describe}
        !          1515: \item[\verb"sd":] the session-descriptor;
        !          1516: 
        !          1517: \item[\verb"type":] the type of minor synchronization requested,
        !          1518: one of:
        !          1519: \[\begin{tabular}{|l|l|}
        !          1520: \hline
        !          1521:     \multicolumn{1}{|c|}{\bf Value}&
        !          1522:                \multicolumn{1}{c|}{\bf Type}\\
        !          1523: \hline
        !          1524:     \tt SYNC\_CONFIRM&         explicit confirmation requested\\
        !          1525:     \tt SYNC\_NOCONFIRM&       no confirmation requested\\
        !          1526: \hline
        !          1527: \end{tabular}\]
        !          1528: 
        !          1529: \item[\verb"ssn":] a pointer to a long integer which,
        !          1530: on a successful return,
        !          1531: will be updated to reflect the current serial-number ($V(M)-1$);
        !          1532: 
        !          1533: \item[\verb"data"/\verb"cc":] any additional data
        !          1534: (and the length of that data, which may not exceed \verb"SN_SIZE" octets);
        !          1535: and,
        !          1536: 
        !          1537: \item[\verb"si":] a pointer to a \verb"SSAPindication" structure, which is
        !          1538: updated only if the call fails.
        !          1539: \end{describe}
        !          1540: If the call to \verb"SMinSyncRequest" is successful,
        !          1541: then the minor synchronization has been queued for the remote user.
        !          1542: If a {\sf S-MINOR-SYNC.CONFIRMATION\/} event is received,
        !          1543: the minor synchronization is complete.
        !          1544: However, the remote user is under no obligation to acknowledge the minorsync.
        !          1545: Otherwise the \verb"SSAPabort" structure contained in
        !          1546: the \verb"SSAPindication" parameter
        !          1547: \verb"si" contains the reason for failure.
        !          1548: 
        !          1549: Upon receiving a {\sf S-MINOR-SYNC.INDICATION\/} event,
        !          1550: the user may optionally use the \verb"SMinSyncResponse" routine
        !          1551: to generate a {\sf S-MINOR-SYNC.RESPONSE\/} action.
        !          1552: \begin{quote}\index{SMinSyncResponse}\small\begin{verbatim}
        !          1553: int     SMinSyncResponse (sd, ssn, data, cc, si)
        !          1554: int     sd;
        !          1555: long    ssn;
        !          1556: char   *data;
        !          1557: int     cc;
        !          1558: struct SSAPindication *si;
        !          1559: \end{verbatim}\end{quote}
        !          1560: The parameters to this procedure are:
        !          1561: \begin{describe}
        !          1562: \item[\verb"sd":] the session-descriptor;
        !          1563: 
        !          1564: \item[\verb"ssn":] the highest serial-number being confirmed;
        !          1565: 
        !          1566: \item[\verb"data"/\verb"cc":] any additional data
        !          1567: (and the length of that data, which may not exceed \verb"SN_SIZE" octets);
        !          1568: and,
        !          1569: 
        !          1570: \item[\verb"si":] a pointer to a \verb"SSAPindication" structure, which is
        !          1571: updated only if the call fails.
        !          1572: \end{describe}
        !          1573: If the call to \verb"SMinSyncResponse" is successful,
        !          1574: then the minor synchronization has been completed.
        !          1575: Otherwise the \verb"SSAPabort" structure contained in
        !          1576: the \verb"SSAPindication" parameter
        !          1577: \verb"si" contains the reason for failure.
        !          1578: 
        !          1579: \subsubsection {ReSynchronization}
        !          1580: To resynchronize the connection to a known state,
        !          1581: the \verb"SReSyncRequest" is used
        !          1582: (which corresponds to the {\sf S-RESYNCHRONIZE.REQUEST\/} action).
        !          1583: \begin{quote}\index{SReSyncRequest}\small\begin{verbatim}
        !          1584: int     SReSyncRequest (sd, type, ssn, settings, data, cc, si)
        !          1585: int     sd;
        !          1586: int     type,
        !          1587:         settings;
        !          1588: long    ssn;
        !          1589: char   *data;
        !          1590: int     cc;
        !          1591: struct SSAPindication *si;
        !          1592: \end{verbatim}\end{quote}
        !          1593: The parameters to this procedure are:
        !          1594: \begin{describe}
        !          1595: \item[\verb"sd":] the session-descriptor;
        !          1596: 
        !          1597: \item[\verb"type":] the type of resynchronization requested
        !          1598: (either \verb"SYNC_RESTART", \verb"SYNC_ABANDON",
        !          1599: or \verb"SYNC_SET");
        !          1600: 
        !          1601: \item[\verb"ssn":] the serial-number to resynchronize to;
        !          1602: 
        !          1603: \item[\verb"settings":] the new token settings;
        !          1604: 
        !          1605: \item[\verb"data"/\verb"cc":] any additional data
        !          1606: (and the length of that data, which may not exceed \verb"SN_SIZE" octets);
        !          1607: and,
        !          1608: 
        !          1609: \item[\verb"si":] a pointer to a \verb"SSAPindication" structure, which is
        !          1610: updated only if the call fails.
        !          1611: \end{describe}
        !          1612: If the call to \verb"SReSyncRequest" is successful,
        !          1613: then the resynchronization has been queued for the remote user.
        !          1614: When the {\sf S-RESYNCHRONIZE.CON\-FIR\-MA\-TION\/} event is received,
        !          1615: the resynchronization is complete.
        !          1616: Otherwise the \verb"SSAPabort" structure contained in
        !          1617: the \verb"SSAPindication" parameter
        !          1618: \verb"si" contains the reason for failure.
        !          1619: 
        !          1620: Upon receiving a {\sf S-RESYNCHRONIZE.INDICATION\/} event,
        !          1621: the user is required to generate a {\sf S-RESYNCHRONIZE.RESPONSE\/} action
        !          1622: using using the \verb"SReSyncResponse" routine.%
        !          1623: \footnote{Actually,
        !          1624: the user has other choices by using the rules of contention resolution.
        !          1625: Consult the ISO session service specification for the gruesome details.}
        !          1626: \begin{quote}\index{SReSyncResponse}\small\begin{verbatim}
        !          1627: int     SReSyncResponse (sd, ssn, settings, data, cc, si)
        !          1628: int     sd;
        !          1629: int     settings;
        !          1630: long    ssn;
        !          1631: char   *data;
        !          1632: int     cc;
        !          1633: struct SSAPindication *si;
        !          1634: \end{verbatim}\end{quote}
        !          1635: The parameters to this procedure are:
        !          1636: \begin{describe}
        !          1637: \item[\verb"sd":] the session-descriptor;
        !          1638: 
        !          1639: \item[\verb"ssn":] the serial-number to resynchronize to;
        !          1640: 
        !          1641: \item[\verb"settings":] the new token settings;
        !          1642: 
        !          1643: \item[\verb"data"/\verb"cc":] any additional data
        !          1644: (and the length of that data, which may not exceed \verb"SN_SIZE" octets);
        !          1645: and,
        !          1646: 
        !          1647: \item[\verb"si":] a pointer to a \verb"SSAPindication" structure, which is
        !          1648: updated only if the call fails.
        !          1649: \end{describe}
        !          1650: 
        !          1651: \subsection    {Activity Management}
        !          1652: There are several types of activity management services:
        !          1653: activity start and resume,
        !          1654: activity interrupt and discard,
        !          1655: and activity end.
        !          1656: 
        !          1657: \subsubsection {Activity Start/Resume}
        !          1658: To initiate a new activity,
        !          1659: the \verb"SActStartRequest" routine is used
        !          1660: (which corresponds to the {\sf S-ACTIVITY-START.REQUEST\/} action).
        !          1661: \begin{quote}\index{SActStartRequest}\small\begin{verbatim}
        !          1662: int     SActStartRequest (sd, id, data, cc, si)
        !          1663: int     sd;
        !          1664: struct SSAPactid *id;
        !          1665: char   *data;
        !          1666: int     cc;
        !          1667: struct SSAPindication *si;
        !          1668: \end{verbatim}\end{quote}
        !          1669: The parameters to this procedure are:
        !          1670: \begin{describe}
        !          1671: \item[\verb"sd":] the session-descriptor;
        !          1672: 
        !          1673: \item[\verb"id":] the activity-identifier;
        !          1674: 
        !          1675: \item[\verb"data"/\verb"cc":] any additional data
        !          1676: (and the length of that data, which may not exceed \verb"SV_SIZE" octets);
        !          1677: and,
        !          1678: 
        !          1679: \item[\verb"si":] a pointer to a \verb"SSAPindication" structure, which is
        !          1680: updated only if the call fails.
        !          1681: \end{describe}
        !          1682: 
        !          1683: The \verb"id" parameter is a pointer to a \verb"SSAPactid" structure,
        !          1684: which is passed transparently by the session service.
        !          1685: \begin{quote}\index{SSAPref}\small\begin{verbatim}
        !          1686: struct SSAPactid {
        !          1687: #define SID_DATA_SIZE   6
        !          1688:     u_char  sd_len;
        !          1689:     char    sd_data[SID_DATA_SIZE];
        !          1690: };
        !          1691: \end{verbatim}\end{quote}
        !          1692: The elements of this structure are:\label{SSAPactid}
        !          1693: \begin{describe}
        !          1694: \item[\verb"sd\_data"/\verb"sd\_len":] the data
        !          1695: (and length of that data, which may not exceed \verb"SID_DATA_SIZE" octets);
        !          1696: \end{describe}
        !          1697: If the call to the \verb"SActStartRequest" routine is successful,
        !          1698: then the activity is started.
        !          1699: Otherwise the \verb"SSAPabort" structure contained in
        !          1700: the \verb"SSAPindication" parameter
        !          1701: \verb"si" contains the reason for failure.
        !          1702: 
        !          1703: To resume a previously interrupted activity,
        !          1704: the \verb"SActResumeRequest" routine is used
        !          1705: (which corresponds to the {\sf S-ACTIVITY-RESUME.REQUEST\/} action).
        !          1706: \begin{quote}\index{SActResumeRequest}\small\begin{verbatim}
        !          1707: int     SActResumeRequest (sd, id, oid, ssn, ref, data, cc,
        !          1708:                 si)
        !          1709: int     sd;
        !          1710: struct SSAPactid *id,
        !          1711:                  *oid;
        !          1712: long    ssn;
        !          1713: struct SSAPref *ref;
        !          1714: char   *data;
        !          1715: int     cc;
        !          1716: struct SSAPindication *si;
        !          1717: \end{verbatim}\end{quote}
        !          1718: The parameters to this procedure are:
        !          1719: \begin{describe}
        !          1720: \item[\verb"sd":] the session-descriptor;
        !          1721: 
        !          1722: \item[\verb"id":] the activity-identifier
        !          1723: (consult page~\pageref{SSAPactid} for a description of the \verb"SSAPactid"
        !          1724: structure);
        !          1725: 
        !          1726: \item[\verb"oid":] the previous activity-identifier
        !          1727: (again, consult page~\pageref{SSAPactid});
        !          1728: 
        !          1729: \item[\verb"ssn":] the serial-number to resume the activity at;
        !          1730: 
        !          1731: \item[\verb"ref":] the previous connection identifier;
        !          1732: 
        !          1733: \item[\verb"data"/\verb"cc":] any additional data
        !          1734: (and the length of that data, which may not exceed \verb"SV_SIZE" octets);
        !          1735: and,
        !          1736: 
        !          1737: \item[\verb"si":] a pointer to a \verb"SSAPindication" structure, which is
        !          1738: updated only if the call fails.
        !          1739: \end{describe}
        !          1740: 
        !          1741: The \verb"ref" parameter is a pointer to a \verb"SSAPref" structure.
        !          1742: Note that unlike the connection identifiers used during connection
        !          1743: establishment (as described on page~\pageref{SSAPref}),
        !          1744: there are four fields:\label{SSAPactref}
        !          1745: \[\begin{tabular}{|l|l|l|}
        !          1746: \hline
        !          1747:     \multicolumn{1}{|c|}{\bf Field}&
        !          1748:     \multicolumn{1}{c|}{\bf Contents}&
        !          1749:     \multicolumn{1}{c|}{\bf Length}\\
        !          1750: \hline
        !          1751:     calling SSAP user reference&
        !          1752:                        \tt sr\_calling&        \tt sr\_calling\_len\\
        !          1753:     called SSAP user reference&
        !          1754:                        \tt sr\_called& \tt sr\_called\_len\\
        !          1755:     common reference&
        !          1756:                        \tt sr\_cdata&  \tt sr\_clen\\
        !          1757:     additional reference&
        !          1758:                        \tt sr\_adata&  \tt sr\_alen\\
        !          1759: \hline
        !          1760: \end{tabular}\]
        !          1761: 
        !          1762: If the call to the \verb"SActResumeRequest" routine is successful,
        !          1763: then the activity is resumed.
        !          1764: Otherwise the \verb"SSAPabort" structure contained in
        !          1765: the \verb"SSAPindication" parameter
        !          1766: \verb"si" contains the reason for failure.
        !          1767: 
        !          1768: \subsubsection {Activity Interrupt/Discard}
        !          1769: To interrupt an activity in progress,
        !          1770: the \verb"SActIntrRequest" routine is used
        !          1771: (which corresponds to the {\sf S-ACTIVITY-INTERRUPT.REQUEST\/} action).
        !          1772: \begin{quote}\index{SActIntrRequest}\small\begin{verbatim}
        !          1773: int     SActIntrRequest (sd, reason, si)
        !          1774: int     sd;
        !          1775: int     reason;
        !          1776: struct SSAPindication *si;
        !          1777: \end{verbatim}\end{quote}
        !          1778: The parameters to this procedure are:
        !          1779: \begin{describe}
        !          1780: \item[\verb"sd":] the session-descriptor;
        !          1781: 
        !          1782: \item[\verb"reason":] the reason for the interrupt
        !          1783: (codes are listed in Table~\ref{SSAPexceptions});
        !          1784: and,
        !          1785: 
        !          1786: \item[\verb"si":] a pointer to a \verb"SSAPindication" structure, which is
        !          1787: updated only if the call fails.
        !          1788: \end{describe}
        !          1789: If the call to \verb"SActIntrRequest" is successful,
        !          1790: then the activity interrupt has been queued for the remote user.
        !          1791: When the {\sf S-ACTIVITY-INTERRUPT.CON\-FIR\-MA\-TION\/} event is received,
        !          1792: the activity interrupt is complete.
        !          1793: Otherwise the \verb"SSAPabort" structure contained in
        !          1794: the \verb"SSAPindication" parameter
        !          1795: \verb"si" contains the reason for failure.
        !          1796: 
        !          1797: Upon receiving a {\sf S-ACTIVITY-INTERRUPT.INDICATION\/} event,
        !          1798: the user is required to generate a {\sf S-ACTIVITY-INTERRUPT.RESPONSE\/} action
        !          1799: using the \verb"SActIntrResponse" routine.
        !          1800: \begin{quote}\index{SActIntrResponse}\small\begin{verbatim}
        !          1801: int     SActIntrResponse (sd, si)
        !          1802: int     sd;
        !          1803: struct SSAPindication *si;
        !          1804: \end{verbatim}\end{quote}
        !          1805: The parameters to this procedure are:
        !          1806: \begin{describe}
        !          1807: \item[\verb"sd":] the session-descriptor;
        !          1808: and,
        !          1809: 
        !          1810: \item[\verb"si":] a pointer to a \verb"SSAPindication" structure, which is
        !          1811: updated only if the call fails.
        !          1812: \end{describe}
        !          1813: If the call to \verb"SActIntrResponse" is successful,
        !          1814: then the activity interrupt has been completed.
        !          1815: Otherwise the \verb"SSAPabort" structure contained in
        !          1816: the \verb"SSAPindication" parameter
        !          1817: \verb"si" contains the reason for failure.
        !          1818: 
        !          1819: To discard an activity in progress,
        !          1820: the \verb"SActDiscRequest" routine is used
        !          1821: (which corresponds to the {\sf S-ACTIVITY-DISCARD.REQUEST\/} action).
        !          1822: \begin{quote}\index{SActDiscRequest}\small\begin{verbatim}
        !          1823: int     SActDiscRequest (sd, reason, si)
        !          1824: int     sd;
        !          1825: int     reason;
        !          1826: struct SSAPindication *si;
        !          1827: \end{verbatim}\end{quote}
        !          1828: The parameters to this procedure are:
        !          1829: \begin{describe}
        !          1830: \item[\verb"sd":] the session-descriptor;
        !          1831: 
        !          1832: \item[\verb"reason":] the reason for the discard
        !          1833: (codes are listed in Table~\ref{SSAPexceptions});
        !          1834: and,
        !          1835: 
        !          1836: \item[\verb"si":] a pointer to a \verb"SSAPindication" structure, which is
        !          1837: updated only if the call fails.
        !          1838: \end{describe}
        !          1839: If the call to \verb"SActDiscRequest" is successful,
        !          1840: then the activity discard has been queued for the remote user.
        !          1841: When the {\sf S-ACTIVITY-DISCARD.CON\-FIR\-MA\-TION\/} event is received,
        !          1842: the activity discard is complete.
        !          1843: Otherwise the \verb"SSAPabort" structure contained in
        !          1844: the \verb"SSAPindication" parameter
        !          1845: \verb"si" contains the reason for failure.
        !          1846: 
        !          1847: Upon receiving a {\sf S-ACTIVITY-DISCARD.INDICATION\/} event,
        !          1848: the user is required to generate a {\sf S-ACTIVITY-DISCARD.RESPONSE\/} action
        !          1849: using the \verb"SActDiscResponse" routine.
        !          1850: \begin{quote}\index{SActDiscResponse}\small\begin{verbatim}
        !          1851: int     SActDiscResponse (sd, si)
        !          1852: int     sd;
        !          1853: struct SSAPindication *si;
        !          1854: \end{verbatim}\end{quote}
        !          1855: The parameters to this procedure are:
        !          1856: \begin{describe}
        !          1857: \item[\verb"sd":] the session-descriptor;
        !          1858: and,
        !          1859: 
        !          1860: \item[\verb"si":] a pointer to a \verb"SSAPindication" structure, which is
        !          1861: updated only if the call fails.
        !          1862: \end{describe}
        !          1863: If the call to \verb"SActDiscResponse" is successful,
        !          1864: then the activity discard has been completed.
        !          1865: Otherwise the \verb"SSAPabort" structure contained in
        !          1866: the \verb"SSAPindication" parameter
        !          1867: \verb"si" contains the reason for failure.
        !          1868: 
        !          1869: \subsubsection {Activity End}
        !          1870: To end an activity in progress,
        !          1871: the \verb"SActEndRequest" routine is used
        !          1872: (which corresponds to the {\sf S-ACTIVITY-END.REQUEST\/} action).
        !          1873: \begin{quote}\index{SActEndRequest}\small\begin{verbatim}
        !          1874: int     SActEndRequest (sd, ssn, data, cc, si)
        !          1875: int     sd;
        !          1876: long   *ssn;
        !          1877: char   *data;
        !          1878: int     cc;
        !          1879: struct SSAPindication *si;
        !          1880: \end{verbatim}\end{quote}
        !          1881: The parameters to this procedure are:
        !          1882: \begin{describe}
        !          1883: \item[\verb"sd":] the session-descriptor;
        !          1884: 
        !          1885: \item[\verb"ssn":] a pointer to a long integer which,
        !          1886: on a successful return,
        !          1887: will be updated to reflect the current serial-number ($V(M)-1$);
        !          1888: 
        !          1889: \item[\verb"data"/\verb"cc":] any additional data
        !          1890: (and the length of that data, which may not exceed \verb"SV_SIZE" octets);
        !          1891: and,
        !          1892: 
        !          1893: \item[\verb"si":] a pointer to a \verb"SSAPindication" structure, which is
        !          1894: updated only if the call fails.
        !          1895: \end{describe}
        !          1896: If the call to \verb"SActEndRequest" is successful,
        !          1897: then the activity end has been queued for the remote user.
        !          1898: When the {\sf S-ACTIVITY-END.CONFIRMATION\/} event is received,
        !          1899: the activity end is complete.
        !          1900: Otherwise the \verb"SSAPabort" structure contained in
        !          1901: the \verb"SSAPindication" parameter
        !          1902: \verb"si" contains the reason for failure.
        !          1903: 
        !          1904: Upon receiving a {\sf S-ACTIVITY-END.INDICATION\/} event,
        !          1905: the user is required to call the \verb"SActEndResponse" routine
        !          1906: to generate a {\sf S-ACTIVITY-END.RESPONSE\/} action.
        !          1907: \begin{quote}\index{SActEndResponse}\small\begin{verbatim}
        !          1908: int     SActEndResponse (sd, data, cc, si)
        !          1909: int     sd;
        !          1910: char   *data;
        !          1911: int     cc;
        !          1912: struct SSAPindication *si;
        !          1913: \end{verbatim}\end{quote}
        !          1914: The parameters to this procedure are:
        !          1915: \begin{describe}
        !          1916: \item[\verb"sd":] the session-descriptor;
        !          1917: 
        !          1918: \item[\verb"data"/\verb"cc":] any additional data
        !          1919: (and the length of that data, which may not exceed \verb"SV_SIZE" octets);
        !          1920: and,
        !          1921: 
        !          1922: \item[\verb"si":] a pointer to a \verb"SSAPindication" structure, which is
        !          1923: updated only if the call fails.
        !          1924: \end{describe}
        !          1925: If the call to \verb"SActEndResponse" is successful,
        !          1926: then the activity end has been completed.
        !          1927: Otherwise the \verb"SSAPabort" structure contained in
        !          1928: the \verb"SSAPindication" parameter
        !          1929: \verb"si" contains the reason for failure.
        !          1930: 
        !          1931: \subsection    {Exception Reporting}
        !          1932: To report an exception and place the connection in a special error-recovery
        !          1933: state,
        !          1934: the \verb"SUReportRequest" routine is called
        !          1935: (which corresponds to the {\sf S-U-EXCEPTION-REPORT.REQUEST\/} action).
        !          1936: \begin{quote}\index{SUReportRequest}\small\begin{verbatim}
        !          1937: int    SUReportRequest (sd, reason, data, cc, si)
        !          1938: int    sd;
        !          1939: int     reason;
        !          1940: char   *data;
        !          1941: int    cc;
        !          1942: struct SSAPindication  *si;
        !          1943: \end{verbatim}\end{quote}
        !          1944: The parameters to this procedure are:
        !          1945: \begin{describe}
        !          1946: \item[\verb"sd":] the session-descriptor;
        !          1947: 
        !          1948: \item[\verb"reason":] the reason for the report
        !          1949: (codes are listed in Table~\ref{SSAPexceptions});
        !          1950: 
        !          1951: \item[\verb"data"/\verb"cc":] any report data
        !          1952: (and the length of that data, which may not exceed \verb"SP_SIZE" octets);
        !          1953: and,
        !          1954: 
        !          1955: \item[\verb"si":] a pointer to a \verb"SSAPindication" structure, which is
        !          1956: updated only if the call fails.
        !          1957: \end{describe}
        !          1958: If the call to \verb"SUReportRequest" is successful,
        !          1959: then the connection is placed in an error state,
        !          1960: and any data queued for the connection may be lost until recovery is complete.
        !          1961: Otherwise the \verb"SSAPabort" structure contained in
        !          1962: the \verb"SSAPindication" parameter
        !          1963: \verb"si" contains the reason for failure.
        !          1964: 
        !          1965: Typically,
        !          1966: error recovery can be achieved by giving away the data token or by aborting
        !          1967: the connection (discussed next).
        !          1968: Error recovery is discussed in greater detail in the ISO session service
        !          1969: specification.
        !          1970: 
        !          1971: \subsection    {User-initiated Aborts}
        !          1972: To unilaterally initiate an abort of the connection,
        !          1973: the \verb"SUAbortRequest" routine is called
        !          1974: (which corresponds to the {\sf S-U-ABORT.REQUEST\/} action).
        !          1975: \begin{quote}\index{SUAbortRequest}\small\begin{verbatim}
        !          1976: int    SUAbortRequest (sd, data, cc, si)
        !          1977: int    sd;
        !          1978: char   *data;
        !          1979: int    cc;
        !          1980: struct SSAPindication  *si;
        !          1981: \end{verbatim}\end{quote}
        !          1982: The parameters to this procedure are:
        !          1983: \begin{describe}
        !          1984: \item[\verb"sd":] the session-descriptor;
        !          1985: 
        !          1986: \item[\verb"data"/\verb"cc":] any abort data
        !          1987: (and the length of that data, which may not exceed \verb"SA_SIZE" octets);
        !          1988: and,
        !          1989: 
        !          1990: \item[\verb"si":] a pointer to a \verb"SSAPindication" structure, which is
        !          1991: updated only if the call fails.
        !          1992: \end{describe}
        !          1993: If the call to \verb"SUAbortRequest" is successful,
        !          1994: then the connection is immediately closed,
        !          1995: and any data queued for the connection may be lost.
        !          1996: 
        !          1997: \subsection    {Asynchronous Event Handling}
        !          1998: The data transfer events discussed thus far have been synchronous in nature.
        !          1999: Some users of the session service may wish an asynchronous interface.
        !          2000: The \verb"SSetIndications" routine is used to change the service associated
        !          2001: with a session-descriptor to or from an asynchronous interface.
        !          2002: \begin{quote}\index{SSetIndications}\small\begin{verbatim}
        !          2003: int     SSetIndications (sd, data, tokens, sync, activity,
        !          2004:                 report, finish, abort, si)
        !          2005: int     sd;
        !          2006: int   (*data) (),
        !          2007:       (*tokens) (),
        !          2008:       (*sync) (),
        !          2009:       (*activity) (),
        !          2010:       (*report) (),
        !          2011:       (*finish) (),
        !          2012:       (*abort) ();
        !          2013: struct SSAPindication  *si;
        !          2014: \end{verbatim}\end{quote}
        !          2015: The parameters to this procedure are:
        !          2016: \begin{describe}
        !          2017: \item[\verb"sd":] the session-descriptor;
        !          2018: 
        !          2019: \item[\verb"data":] the address of an event-handler routine to be invoked when
        !          2020: data has arrived;
        !          2021: 
        !          2022: \item[\verb"tokens":] the address of an event-handler routine to be invoked
        !          2023: when a token management event occurs;
        !          2024: 
        !          2025: \item[\verb"sync":] the address of an event-handler routine to be invoked
        !          2026: when a synchronization management event occurs;
        !          2027: 
        !          2028: \item[\verb"activity":] the address of an event-handler routine to be invoked
        !          2029: when an activity management event occurs;
        !          2030: 
        !          2031: \item[\verb"report":] the address of an event-handler routine to be invoked
        !          2032: when an exception report event occurs;
        !          2033: 
        !          2034: \item[\verb"finish":] the address of an event-handler routine to be invoked
        !          2035: when the connection is ready to be released;
        !          2036: 
        !          2037: \item[\verb"abort":] the address of an event-handler routine to be invoked when
        !          2038: a user-initiated abort (a {\sf S-U-ABORT.INDICATION\/} event occurs)
        !          2039: or a provider-initiated abort
        !          2040: (a {\sf S-P-ABORT.INDICATION\/} event occurs);
        !          2041: and,
        !          2042: 
        !          2043: \item[\verb"si":] a pointer to a \verb"SSAPindication" structure, which is updated
        !          2044: only if the call fails.
        !          2045: \end{describe}
        !          2046: If the service is to be made asynchronous,
        !          2047: then all event handlers are specified,
        !          2048: otherwise,
        !          2049: if the service is to be made synchronous,
        !          2050: then no event handlers should be specified
        !          2051: (use the manifest constant \verb"NULLIFP").
        !          2052: The most likely reason for the call failing is \verb"SC_WAITING",
        !          2053: which indicates that an event is waiting for the user.
        !          2054: 
        !          2055: When an event-handler is invoked,
        !          2056: future invocations of the event-hander are blocked until it returns.
        !          2057: The return value of the event-handler is ignored.
        !          2058: Further,
        !          2059: during the execution of a synchronous call to the library,
        !          2060: the event-handler will be blocked from being invoked.
        !          2061: 
        !          2062: When an event associated with data arrival occurs,
        !          2063: the event-handler routine is invoked with two parameters:
        !          2064: \begin{quote}\small\begin{verbatim}
        !          2065: (*data) (sd, sx);
        !          2066: int     sd;
        !          2067: struct SSAPdata *sx;
        !          2068: \end{verbatim}\end{quote}
        !          2069: The parameters are:
        !          2070: \begin{describe}
        !          2071: \item[\verb"sd":] the session-descriptor;
        !          2072: and,
        !          2073: 
        !          2074: \item[\verb"sx":] a pointer to the \verb"SSAPdata" structure containing
        !          2075: the data.
        !          2076: \end{describe}
        !          2077: Note that the data contained in the structure was allocated via \man malloc(3),
        !          2078: and should be released with the \verb"SXFREE" macro
        !          2079: (described on page~\pageref{SXFREE}) when no longer needed.
        !          2080: 
        !          2081: When an event associated with token management arrives
        !          2082: the event-handler routine is invoked with two parameters:
        !          2083: \begin{quote}\small\begin{verbatim}
        !          2084: (*tokens) (sd, st);
        !          2085: int       sd;
        !          2086: struct SSAPtoken *st;
        !          2087: \end{verbatim}\end{quote}
        !          2088: The parameters are:
        !          2089: \begin{describe}
        !          2090: \item[\verb"sd":] the session-descriptor;
        !          2091: and,
        !          2092: 
        !          2093: \item[\verb"st":] a pointer to the \verb"SSAPtoken" structure containing
        !          2094: the token management information.
        !          2095: \end{describe}
        !          2096: 
        !          2097: When an event associated with synchronization management arrives
        !          2098: the event-handler routine is invoked with two parameters:
        !          2099: \begin{quote}\small\begin{verbatim}
        !          2100: (*sync) (sd, sn);
        !          2101: int       sd;
        !          2102: struct SSAPsync *sn;
        !          2103: \end{verbatim}\end{quote}
        !          2104: The parameters are:
        !          2105: \begin{describe}
        !          2106: \item[\verb"sd":] the session-descriptor;
        !          2107: and,
        !          2108: 
        !          2109: \item[\verb"sn":] a pointer to the \verb"SSAPsync" structure containing
        !          2110: the synchronization management information.
        !          2111: \end{describe}
        !          2112: 
        !          2113: When an event associated with activity management arrives
        !          2114: the event-handler routine is invoked with two parameters:
        !          2115: \begin{quote}\small\begin{verbatim}
        !          2116: (*activity) (sd, sv);
        !          2117: int       sd;
        !          2118: struct SSAPactivity *sv;
        !          2119: \end{verbatim}\end{quote}
        !          2120: The parameters are:
        !          2121: \begin{describe}
        !          2122: \item[\verb"sd":] the session-descriptor;
        !          2123: and,
        !          2124: 
        !          2125: \item[\verb"sv":] a pointer to the \verb"SSAPactivity" structure containing
        !          2126: the activity management information.
        !          2127: \end{describe}
        !          2128: 
        !          2129: When an event associated with exception reporting arrives
        !          2130: the event-handler routine is invoked with two parameters:
        !          2131: \begin{quote}\small\begin{verbatim}
        !          2132: (*report) (sd, sp);
        !          2133: int       sd;
        !          2134: struct SSAPreport *sp;
        !          2135: \end{verbatim}\end{quote}
        !          2136: The parameters are:
        !          2137: \begin{describe}
        !          2138: \item[\verb"sd":] the session-descriptor;
        !          2139: and,
        !          2140: 
        !          2141: \item[\verb"sp":] a pointer to the \verb"SSAPreport" structure containing
        !          2142: the exception report information.
        !          2143: \end{describe}
        !          2144: 
        !          2145: When an event associated with connection termination arrives
        !          2146: the event-handler routine is invoked with two parameters:
        !          2147: \begin{quote}\small\begin{verbatim}
        !          2148: (*finish) (sd, sf);
        !          2149: int       sd;
        !          2150: struct SSAPfinish *sf;
        !          2151: \end{verbatim}\end{quote}
        !          2152: The parameters are:
        !          2153: \begin{describe}
        !          2154: \item[\verb"sd":] the session-descriptor;
        !          2155: and,
        !          2156: 
        !          2157: \item[\verb"sf":] a pointer to the \verb"SSAPfinish" structure containing
        !          2158: information concerning the request to terminate the connection.
        !          2159: \end{describe}
        !          2160: 
        !          2161: When an event associated with a user- or provider-initiated abort occurs,
        !          2162: the event-handler is invoked with two parameters:
        !          2163: \begin{quote}\small\begin{verbatim}
        !          2164: (*abort) (sd, sa);
        !          2165: int      sd;
        !          2166: struct SSAPabort *sa;
        !          2167: \end{verbatim}\end{quote}
        !          2168: The parameters are:
        !          2169: \begin{describe}
        !          2170: \item[\verb"sd":] the session-descriptor;
        !          2171: and,
        !          2172: 
        !          2173: \item[\verb"sa":] a pointer to the \verb"SSAPabort" structure
        !          2174: indicating why the connection was aborted.
        !          2175: \end{describe}
        !          2176: Note that the session-descriptor is no longer valid at the instant the
        !          2177: call is made.
        !          2178: 
        !          2179: \[\fbox{\begin{tabular}{lp{0.8\textwidth}}
        !          2180: \bf NOTE:&     The \man libssap(3n) library uses the SIGEMT signal to provide
        !          2181:                these services.
        !          2182:                Programs using asynchronous session-descriptors should NOT
        !          2183:                use SIGEMT for other purposes.
        !          2184: \end{tabular}}\]
        !          2185: 
        !          2186: \subsection    {Synchronous Event Multiplexing}
        !          2187: A user of the session service may wish to manage multiple
        !          2188: session-de\-scrip\-tors simultaneously;
        !          2189: the routine \verb"SSelectMask" is provided for this purpose.
        !          2190: This routine updates a file-descriptor mask and associated counter for use
        !          2191: with \verb"xselect".
        !          2192: \begin{quote}\index{SSelectMask}\small\begin{verbatim}
        !          2193: int     SSelectMask (sd, mask, nfds, si)
        !          2194: int     sd;
        !          2195: fd_set *mask,
        !          2196: int    *nfds;
        !          2197: struct SSAPindication  *si;
        !          2198: \end{verbatim}\end{quote}
        !          2199: The parameters to this procedure are:
        !          2200: \begin{describe}
        !          2201: \item[\verb"sd":] the session-descriptor;
        !          2202: 
        !          2203: \item[\verb"mask":] a pointer to a file-descriptor mask meaningful to
        !          2204: \verb"xselect";
        !          2205: 
        !          2206: \item[\verb"nfds":] a pointer to an integer-valued location meaningful to
        !          2207: \verb"xselect";
        !          2208: and,
        !          2209: 
        !          2210: \item[\verb"si":] a pointer to a \verb"SSAPindication" structure, which is updated
        !          2211: only if the call fails.
        !          2212: \end{describe}
        !          2213: If the call is successful, then the \verb"mask" and \verb"nfds" parameters can
        !          2214: be used as arguments to \verb"xselect".
        !          2215: The most likely reason for the call failing is \verb"SC_WAITING",
        !          2216: which indicates that an event is waiting for the user.
        !          2217: 
        !          2218: If \verb"xselect" indicates that the session-descriptor is ready for reading,
        !          2219: \verb"SReadRequest" should be called with the \verb"secs" parameter equal to
        !          2220: \verb"OK".
        !          2221: If the network activity does not constitute an entire event for the user,
        !          2222: then \verb"SReadRequest" will return \verb"NOTOK" with error code
        !          2223: \verb"SC_TIMER".
        !          2224: 
        !          2225: \section      {Connection Release}
        !          2226: The \verb"SRelRequest" routine is used to request the release a connection,
        !          2227: and corresponds to a {\sf S-RELEASE.REQUEST\/} action.
        !          2228: The SSAP attempts to gracefully drain any queued data before closing
        !          2229: the connection.
        !          2230: \begin{quote}\index{SRelRequest}\small\begin{verbatim}
        !          2231: int     SRelRequest (sd, data, cc, secs, sr, si)
        !          2232: int     sd;
        !          2233: char   *data;
        !          2234: int     cc;
        !          2235: int     secs;
        !          2236: struct SSAPrelease  *sr;
        !          2237: struct SSAPindication  *si;
        !          2238: \end{verbatim}\end{quote}
        !          2239: The parameters to this procedure are:
        !          2240: \begin{describe}
        !          2241: \item[\verb"sd":] the session-descriptor;
        !          2242: 
        !          2243: \item[\verb"data"/\verb"cc":] any final data
        !          2244: (and the length of that data,
        !          2245: which may not exceed \verb"SF_SIZE" octets);
        !          2246: 
        !          2247: \item[\verb"secs":] the maximum number of seconds to wait for a response
        !          2248: (use the manifest constant \verb"NOTOK" if no time-out is desired);
        !          2249: 
        !          2250: \item[\verb"sr":] a pointer to a \verb"SSAPrelease" structure, which is updated
        !          2251: only if the call succeeds;
        !          2252: and,
        !          2253: 
        !          2254: \item[\verb"si":] a pointer to a \verb"SSAPindication" structure, which is updated
        !          2255: only if the call fails.
        !          2256: \end{describe}
        !          2257: If the call to \verb"SRelRequest" is successful,
        !          2258: then this corresponds to a {\sf S-RELEASE.CONFIRMATION\/} event,
        !          2259: and it returns information in the \verb"sr" parameter,
        !          2260: which is a pointer to a \verb"SSAPrelease" structure.
        !          2261: \begin{quote}\index{SSAPrelease}\small\begin{verbatim}
        !          2262: struct SSAPrelease {
        !          2263:     int     sr_affirmative;
        !          2264: 
        !          2265: #define SR_SIZE         512
        !          2266:     int     sr_cc;
        !          2267:     char    sr_data[SR_SIZE];
        !          2268: };
        !          2269: \end{verbatim}\end{quote}
        !          2270: The elements of this structure are:
        !          2271: \begin{describe}
        !          2272: \item[\verb"sr\_affirmative":] the acceptance indicator;
        !          2273: and,
        !          2274: 
        !          2275: \item[\verb"sr\_data"/\verb"sr\_cc":] any final data
        !          2276: (and the length of that data).
        !          2277: \end{describe}
        !          2278: If the call to \verb"SRelRequest" is successful,
        !          2279: and the \verb"sr_affirmative" element is set,
        !          2280: then the connection has been closed.
        !          2281: If the call is successful,
        !          2282: but the \verb"sr_affirmative" element is not set (i.e., zero),
        !          2283: then the request to close the connection has been rejected by the remote user,
        !          2284: and the connection is still open.
        !          2285: Otherwise the \verb"SSAPabort" structure contained in
        !          2286: the \verb"SSAPindication" parameter
        !          2287: \verb"si" contains the reason for failure.
        !          2288: 
        !          2289: Note that if a non-negative value is given to the \verb"secs" parameter and a
        !          2290: response is not received within this number of seconds,
        !          2291: then the value contained in the \verb"sa_reason" element is \verb"SC_TIMER".
        !          2292: The user can then call the routine \verb"SRelRetryRequest" to continue waiting
        !          2293: for a response:
        !          2294: \begin{quote}\index{SRelRetryRequest}\small\begin{verbatim}
        !          2295: int     SRelRetryRequest (sd, secs, sr, si)
        !          2296: int     sd;
        !          2297: int     secs;
        !          2298: struct SSAPrelease  *sr;
        !          2299: struct SSAPindication  *si;
        !          2300: \end{verbatim}\end{quote}
        !          2301: The parameters to this procedure are:
        !          2302: \begin{describe}
        !          2303: \item[\verb"sd":] the session-descriptor;
        !          2304: 
        !          2305: \item[\verb"secs":] the maximum number of seconds to wait for a response
        !          2306: (use the manifest constant \verb"NOTOK" if no time-out is desired);
        !          2307: 
        !          2308: \item[\verb"sr":] a pointer to a \verb"SSAPrelease" structure, which is updated
        !          2309: only if the call succeeds;
        !          2310: and,
        !          2311: 
        !          2312: \item[\verb"si":] a pointer to a \verb"SSAPindication" structure, which is updated
        !          2313: only if the call fails.
        !          2314: \end{describe}
        !          2315: If the call to \verb"SRelRetryRequest" is successful,
        !          2316: and the \verb"sr_affirmative" element is set,
        !          2317: then the connection has been closed.
        !          2318: If the call is successful,
        !          2319: but the \verb"sr_affirmative" element is not set (i.e., zero),
        !          2320: then the request to close the connection has been rejected by the remote user,
        !          2321: and the connection is still open.
        !          2322: Otherwise the \verb"SSAPabort" structure contained in
        !          2323: the \verb"SSAPindication" parameter
        !          2324: \verb"si" contains the reason for failure.
        !          2325: As expected,
        !          2326: the value \verb"SC_TIMER" indicates that no response was received within the
        !          2327: time given by the \verb"secs" parameter.
        !          2328: 
        !          2329: Upon receiving a {\sf S-RELEASE.INDICATION\/} event,
        !          2330: the user is required to generate a {\sf S-RELEASE.RESPONSE\/} action
        !          2331: using the \verb"SRelResponse" routine.
        !          2332: \begin{quote}\index{SRelResponse}\small\begin{verbatim}
        !          2333: int     SRelResponse (sd, status, data, cc, si)
        !          2334: int     sd;
        !          2335: int     status,
        !          2336:         cc;
        !          2337: char   *data;
        !          2338: struct SSAPindication  *si;
        !          2339: \end{verbatim}\end{quote}
        !          2340: The parameters to this procedure are:
        !          2341: \begin{describe}
        !          2342: \item[\verb"sd":] the session-descriptor;
        !          2343: 
        !          2344: \item[\verb"status":] the acceptance indicator
        !          2345: (either \verb"SC_ACCEPT" if the connection is to be closed,
        !          2346: or \verb"SC_REJECTED" otherwise);
        !          2347: 
        !          2348: \item[\verb"data"/\verb"cc":] any final data (and the length of that data,
        !          2349: which may not exceed \verb"SR_SIZE" octets);
        !          2350: and,
        !          2351: 
        !          2352: \item[\verb"si":] a pointer to a \verb"SSAPindication" structure, which is
        !          2353: updated only if the call fails.
        !          2354: \end{describe}
        !          2355: If the call to \verb"SRelResponse" is successful,
        !          2356: and if the \verb"result" parameter is set to \verb"SC_ACCEPT",
        !          2357: then the connection has been closed.
        !          2358: If the call is successful,
        !          2359: but the \verb"result" parameter is not \verb"SC_ACCEPT",
        !          2360: then the connection still remains open.
        !          2361: Note that in order to specify a value other tha \verb"SC_ACCEPT" for the
        !          2362: \verb"result" parameter to \verb"SRelResponse",
        !          2363: the release token must exist but must not be owned by the user making the
        !          2364: call to \verb"SRelResponse".%
        !          2365: \footnote{Gentle reader, we don't write the standards;
        !          2366: we just try to implement them.}
        !          2367: 
        !          2368: \section      {Restrictions on User Data}
        !          2369: The \man libssap(3n) contains partial support for the use of unlimited user
        !          2370: data for session services.
        !          2371: With the exception of the {\sf S-DATA\/} and the {\sf S-TYPED-DATA\/} services,
        !          2372: the initial session service limited the amount of user data that could be
        !          2373: present. 
        !          2374: With the introduction of the unlimited user data
        !          2375: addendum\cite{ISO.SS.UserData,ISO.SP.UserData} to the session service and
        !          2376: protocol,
        !          2377: this restriction has been lifted.
        !          2378: 
        !          2379: During connection establishment,
        !          2380: the \man libssap(3n) library will attempt to negotate the use of unlimited
        !          2381: user data.
        !          2382: If this negotiation fails,
        !          2383: then session services which permit user data,
        !          2384: other than {\sf S-DATA\/} and {\sf S-TYPED-DATA},
        !          2385: are limited to 512~octets of user data.%
        !          2386: \footnote{Strictly speaking,
        !          2387: the {\sf S-U-ABORT} service permits only 9~octets of user data.
        !          2388: This limitation is unreasonable~---~upto 512~octets will be permitted.}
        !          2389: 
        !          2390: If the negotation succeeds,
        !          2391: then session services which permit user data,
        !          2392: other than {\sf S-DATA\/} and {\sf S-TYPED-DATA},
        !          2393: are limited to 65400~octets of user data,
        !          2394: with the exception of the {\sf S-CONNECT.REQUEST\/} primitive,
        !          2395: which is limited to 10240~octets of user data
        !          2396: (the {\sf S-CONNECT.RESPONSE\/} primitive is limited to 65528~octets).%
        !          2397: \footnote{Strictly speaking,
        !          2398: the amount should be unlimited.
        !          2399: However this full generality is not available at this time.}
        !          2400: 
        !          2401: There is one further limitation however:
        !          2402: although the initiator of a connection can send upto 10240~octets,
        !          2403: due to limitations in the \unix/ kernel,
        !          2404: if the \man tsapd(8c) is dispatching based on session selector,
        !          2405: then a responder can accept upto approximately 1536~octets.
        !          2406: To avoid this problem,
        !          2407: have \man tsapd(8c) dispatch based on transport selector
        !          2408: (see Section~\ref{service:standard} in \volone/).
        !          2409: 
        !          2410: \section      {Error Conventions}
        !          2411: All of the routines in this library return the manifest constant \verb"NOTOK"
        !          2412: on error,
        !          2413: and also update the \verb"si" parameter given to the routine.
        !          2414: The \verb"si_abort" element of the \verb"SSAPindication" structure contains a
        !          2415: \verb"SSAPabort" structure detailing the reason for the failure.
        !          2416: The \verb"sa_reason" element of this latter structure can be given as a
        !          2417: parameter to the routine \verb"SErrString" which returns a null-terminated
        !          2418: diagnostic string.
        !          2419: \begin{quote}\index{SErrString}\small\begin{verbatim}
        !          2420: char   *SErrString (c)
        !          2421: int     c;
        !          2422: \end{verbatim}\end{quote}
        !          2423: 
        !          2424: \section      {Compiling and Loading}
        !          2425: Programs using the \man libssap(3n) library should include
        !          2426: \verb"<isode/ssap.h>".
        !          2427: The programs should also be loaded with \verb"-lssap" and \verb"-ltsap"
        !          2428: (this latter library contains the routines which implement the transport
        !          2429: services used by the session provider).
        !          2430: 
        !          2431: \section      {An Example}
        !          2432: Let's consider how one might construct a source entity that resides on the
        !          2433: SSAP.
        !          2434: This entity will use a synchronous interface.
        !          2435: 
        !          2436: There are two parts to the program:
        !          2437: initialization and data transfer;
        !          2438: release will occur when the standard input has been exhausted.
        !          2439: In our example,
        !          2440: we assume that the routine \verb"error" results in the process being
        !          2441: terminated after printing a diagnostic.
        !          2442: 
        !          2443: In Figure~\ref{initSSsource},
        !          2444: the initialization steps for the source entity,
        !          2445: including the outer {\em C\/} wrapper,
        !          2446: is shown.
        !          2447: First, a lookup is done in the ISO services database,
        !          2448: and the \verb"SSAPaddr" is initialized.
        !          2449: The \verb"SSAPref" is zeroed.
        !          2450: Next, for each token associated with the session requirements,
        !          2451: initial ownership of that token is claimed.
        !          2452: Finally,
        !          2453: the call to \verb"SConnRequest" is made.
        !          2454: If the call is successful,
        !          2455: a check is made to see if the remote user accepted the connection.
        !          2456: If so,
        !          2457: the session-descriptor is captured,
        !          2458: along with the negotiated requirements and initial token settings.
        !          2459: 
        !          2460: In Figure~\ref{dataSSsource} on page~\pageref{dataSSsource},
        !          2461: the data transfer loop is realized.
        !          2462: The source entity reads a line from the standard input,
        !          2463: and then queues that line for sending to the remote side.
        !          2464: When an end-of-file occurs on the standard input,
        !          2465: the source entity requests release and then gracefully terminates.
        !          2466: Although no checking is done in this example,
        !          2467: for the calls to \verb"SDataRequest" and \verb"SRelRequest",
        !          2468: on failure
        !          2469: a check for the operational error \verb"SC_OPERATION" should be made.
        !          2470: For \verb"SDataRequest",
        !          2471: this would occur when the data token was not owned by the user;
        !          2472: for \verb"SRelRequest",
        !          2473: this would occur when the release token was not owned by the user.
        !          2474: \clearpage
        !          2475: \tagrind[tp]{grind5b-3a}{Initializing the SSAP source entity}{initSSsource}
        !          2476: \clearpage
        !          2477: \tagrind[tp]{grind5b-3b}{Initializing the SSAP source entity (continued)}\empty
        !          2478: \clearpage
        !          2479: \tagrind[tp]{grind5b-4}{Data Transfer for the SSAP source entity}%
        !          2480:        {dataSSsource}.
        !          2481: 
        !          2482: \section      {For Further Reading}
        !          2483: The ISO specification for session services is defined in
        !          2484: \cite{ISO.SP.Service},
        !          2485: while the complementary CCITT recommendation is defined in
        !          2486: \cite{CCITT.SP.Service}.
        !          2487: The corresponding protocol definitions are \cite{ISO.SP.Protocol} and
        !          2488: \cite{CCITT.SP.Protocol}, respectively.
        !          2489: 
        !          2490: %%% \section  {Changes Since the Last Release}\label{ssap:changes}
        !          2491: %%% A brief summary of the major changes between v~\ssaprevrsn/ and
        !          2492: %%% v~\ssapvrsn/ are now presented.
        !          2493: %%% These are the user-visible changes only;
        !          2494: %%% changes of a strictly internal nature are not discussed.
        !          2495: 

unix.superglobalmegacorp.com

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