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

1.1     ! root        1: % run this through LaTeX with the appropriate wrapper
        !             2: 
        !             3: \chapter      {User Library}\label{libftam}
        !             4: The \man libftam(3n) library implements the filestore-independent parts of
        !             5: the International Standard of the OSI file service, FTAM
        !             6: (which stands for File Transfer, Access and Management).
        !             7: Currently supported are:
        !             8: the no-recovery FTAM Quality-of-Service;
        !             9: the transfer, access, management, and transfer and management service classes;
        !            10: the kernel, read, write, access, limited file management,
        !            11: enhanced file management, grouping, and fadu-locking functional units;
        !            12: and, the kernel, storage, security, and private attribute groups.
        !            13: 
        !            14: Unlike most OSI services,
        !            15: FTAM distinguishes between the {\em initiator\/} of an FTAM association and
        !            16: the {\em responder}.
        !            17: However,
        !            18: as with most models of OSI services,
        !            19: an asynchronous environment is assumed.
        !            20: That is,
        !            21: the service provider may generate events for the service user without the
        !            22: latter triggering the actions which led to the event.
        !            23: For example,
        !            24: in a synchronous environment,
        !            25: an indication that data has arrived usually occurs only when the service user
        !            26: asks the service provider to read data;
        !            27: in an asynchronous environment,
        !            28: the service provider may interrupt the service user at any time to announce
        !            29: the arrival of data.
        !            30: 
        !            31: The \verb"ftam" module in this release initially uses a synchronous interface;
        !            32: however once the connection is established,
        !            33: an asynchronous interface may be selected.
        !            34: 
        !            35: All of the routines in the \man libftam(3n) library are integer-valued.
        !            36: They return the manifest constant \verb"OK" on success,
        !            37: or \verb"NOTOK" otherwise.
        !            38: 
        !            39: \section      {Warning}\label{ftam:note}
        !            40: Please read the following important message.
        !            41: \[\fbox{\begin{tabular}{lp{0.8\textwidth}}
        !            42: \bf NOTE:&     Readers of this chapter should have an intimate understanding
        !            43:                of FTAM.
        !            44:                It is not the intent of this
        !            45:                chapter to present a tutorial on these services, so novice
        !            46:                users will suffer greatly if they choose to read further.
        !            47: 
        !            48:                As previous versions of this software included an
        !            49:                implementation of DIS FTAM, and the release contains an IS
        !            50:                implementation, users of the \man libftam(3n) library
        !            51:                are urged to re-read this chapter.
        !            52: \end{tabular}}\]
        !            53: 
        !            54: \section      {Constants}
        !            55: There are several important constants, described below:
        !            56: 
        !            57: \subsection    {FTAM Quality-of-Service}
        !            58: \[\begin{tabular}{|l|l|}
        !            59: \hline
        !            60:     \multicolumn{1}{|c|}{\bf Value}&
        !            61:                \multicolumn{1}{c|}{\bf FTAM-QoS}\\
        !            62: \hline
        !            63:     \tt FQOS\_NORECOVERY&      no recovery\\
        !            64:     \tt FQOS\_CLASS1&  class 1 recovery\\
        !            65:     \tt FQOS\_CLASS2&  class 2 recovery\\
        !            66:     \tt FQOS\_CLASS3&  class 3 recovery\\
        !            67: \hline
        !            68: \end{tabular}\]
        !            69: Currently, only the no-recovery FTAM-QoS is supported.
        !            70: 
        !            71: \subsection    {Service Classes}
        !            72: \[\begin{tabular}{|l|l|}
        !            73: \hline
        !            74:     \multicolumn{1}{|c|}{\bf Value}&
        !            75:                \multicolumn{1}{c|}{\bf Service Class}\\
        !            76: \hline
        !            77:     \tt FCLASS\_TRANSFER&      transfer\\
        !            78:     \tt FCLASS\_ACCESS&                access\\
        !            79:     \tt FCLASS\_MANAGE&                management\\
        !            80:     \tt FCLASS\_TM&            transfer and management\\
        !            81:     \tt FCLASS\_UNCONS&                unconstrained\\
        !            82: \hline
        !            83: \end{tabular}\]
        !            84: Currently, all service classes other than the unconstrained class are
        !            85: supported.
        !            86: 
        !            87: \subsection    {Functional Units}
        !            88: \[\begin{tabular}{|l|l|}
        !            89: \hline
        !            90:     \multicolumn{1}{|c|}{\bf Value}&
        !            91:                \multicolumn{1}{c|}{\bf Functional Unit}\\
        !            92: \hline
        !            93:     \tt FUNIT\_READ&           read\\
        !            94:     \tt FUNIT\_WRITE&          write\\
        !            95:     \tt FUNIT\_ACCESS&         file access\\
        !            96:     \tt FUNIT\_LIMITED&                limited file management\\
        !            97:     \tt FUNIT\_ENHANCED&       enhanced file management\\
        !            98:     \tt FUNIT\_GROUPING&       grouping\\
        !            99:     \tt FUNIT\_FADULOCK&       fadu locking\\
        !           100:     \tt FUNIT\_RECOVERY&       recovery\\
        !           101:     \tt FUNIT\_RESTART&                restart data transfer\\
        !           102: \hline
        !           103: \end{tabular}\]
        !           104: Currently, all functional units other than the
        !           105: recovery and restart units are supported.
        !           106: Further, the grouping unit {\em must\/} be specified.
        !           107: 
        !           108: \subsection    {Attribute Groups}
        !           109: \[\begin{tabular}{|l|l|}
        !           110: \hline
        !           111:     \multicolumn{1}{|c|}{\bf Value}&
        !           112:                \multicolumn{1}{c|}{\bf Attribute Group}\\
        !           113: \hline
        !           114:     \tt FATTR\_STORAGE&                storage\\
        !           115:     \tt FATTR\_SECURITY&       security\\
        !           116:     \tt FATTR\_PRIVATE&                private\\
        !           117: \hline
        !           118: \end{tabular}\]
        !           119: Currently, all attribute groups other than the
        !           120: private group are supported.
        !           121: 
        !           122: \subsection    {State Results}
        !           123: \[\begin{tabular}{|l|l|}
        !           124: \hline
        !           125:     \multicolumn{1}{|c|}{\bf Value}&
        !           126:                \multicolumn{1}{c|}{\bf State Result}\\
        !           127: \hline
        !           128:     \tt FSTATE\_SUCCESS&       success\\
        !           129:     \tt FSTATE\_FAILURE&       failure\\
        !           130: \hline
        !           131: \end{tabular}\]
        !           132: 
        !           133: \subsection    {Action Results}
        !           134: \[\begin{tabular}{|l|l|}
        !           135: \hline
        !           136:     \multicolumn{1}{|c|}{\bf Value}&
        !           137:                \multicolumn{1}{c|}{\bf Action Result}\\
        !           138: \hline
        !           139:     \tt FACTION\_SUCCESS&      success\\
        !           140:     \tt FACTION\_TRANS&                transient error\\
        !           141:     \tt FACTION\_PERM&         permanent error\\
        !           142: \hline
        !           143: \end{tabular}\]
        !           144: 
        !           145: \section      {Data-Structures}
        !           146: There are several important data structures, described below:
        !           147: 
        !           148: \subsection    {Contents Type}
        !           149: An FTAM document type is represented by the \verb"FTAMcontent" structure.
        !           150: \begin{quote}\index{FTAMcontent}\small\begin{verbatim}
        !           151: struct FTAMcontent {
        !           152:     OID     fc_dtn;
        !           153: 
        !           154:     int     fc_id;
        !           155:     int     fc_result;
        !           156: };
        !           157: \end{verbatim}\end{quote}
        !           158: This elements of this structure are:
        !           159: \begin{describe}
        !           160: \item[\verb"fc\_dtn":] the document type name,
        !           161: represented as an object identifier
        !           162: (consult Section~\ref{psap:oid} of \volone/);
        !           163: 
        !           164: \item[\verb"fc\_id":] the presentation context identifier
        !           165: (consult Section~\ref{psap:context} of \voltwo/)
        !           166: associated with the document type;
        !           167: and,
        !           168: 
        !           169: \item[\verb"fc\_result":] the status indicator for the presentation context
        !           170: (codes are listed in Table~\ref{PSAPreasons} of \voltwo/).
        !           171: \end{describe}
        !           172: 
        !           173: A list of FTAM documents types is represented by the \verb"FTAMcontentlist"
        !           174: structure.
        !           175: \begin{quote}\index{FTAMcontentlist}\small\begin{verbatim}
        !           176: struct FTAMcontentlist {
        !           177:     int     fc_ncontent;
        !           178: 
        !           179: #define NFCONT  (NPCTX - 2)
        !           180:     struct FTAMcontent fc_contents[NFCONT];
        !           181: };
        !           182: \end{verbatim}\end{quote}
        !           183: This elements of this structure are:
        !           184: \begin{describe}
        !           185: \item[\verb"fc\_contents"/\verb"fc\_ncontent":] the contents list
        !           186: (and the number of contents in the list).
        !           187: \end{describe}
        !           188: A limitation of this implementation is that a fixed number of document types
        !           189: may be supported,
        !           190: as denoted by the manifest constant \verb"NFCONT".
        !           191: 
        !           192: \subsection    {Diagnostics}
        !           193: An FTAM diagnostic is represented by the \verb"FTAMdiagnostic" structure.
        !           194: \begin{quote}\index{FTAMcontent}\small\begin{verbatim}
        !           195: struct FTAMdiagnostic {
        !           196:     int     ftd_type;
        !           197: 
        !           198:     int     ftd_identifier;
        !           199: 
        !           200:     int     ftd_observer;
        !           201:     int     ftd_source;
        !           202: 
        !           203:     int     ftd_delay;
        !           204: 
        !           205: #define FTD_SIZE        512
        !           206:     int     ftd_cc;
        !           207:     char    ftd_data[FTD_SIZE];
        !           208: };
        !           209: \end{verbatim}\end{quote}
        !           210: This elements of this structure are:
        !           211: \begin{describe}
        !           212: \item[\verb"ftd\_type":] the diagnostic type, one of:
        !           213: \[\begin{tabular}{|l|l|}
        !           214: \hline
        !           215:     \multicolumn{1}{|c|}{\bf Value}&
        !           216:                \multicolumn{1}{c|}{\bf Meaning}\\
        !           217: \hline
        !           218:     \tt DIAG\_INFORM&  informative\\
        !           219:     \tt DIAG\_TRANS&   transient\\
        !           220:     \tt DIAG\_PERM&    permanent\\
        !           221: \hline
        !           222: \end{tabular}\]
        !           223: 
        !           224: \item[\verb"ftd\_identifier":] the error-identifier
        !           225: (consult \verb"<isode/ftam.h>" for the list,
        !           226: there are far too many to list here);
        !           227: 
        !           228: \item[\verb"ftd\_observer"/\verb"ftd\_source":] the observer and source of
        !           229: the error, one of:
        !           230: \[\begin{tabular}{|l|l|}
        !           231: \hline
        !           232:     \multicolumn{1}{|c|}{\bf Value}&
        !           233:                \multicolumn{1}{c|}{\bf Meaning}\\
        !           234: \hline
        !           235:     \tt EREF\_NONE&    no categorization possible\\
        !           236:     \tt EREF\_IFSU&    initiating file service user\\
        !           237:     \tt EREF\_IFPM&    initiating file service machine\\
        !           238:     \tt EREF\_SERV&    service support the file protocol machine\\
        !           239:     \tt EREF\_RFPM&    responding file protocol machine\\
        !           240:     \tt EREF\_RFSU&    responding file service user\\
        !           241: \hline
        !           242: \end{tabular}\]
        !           243: 
        !           244: \item[\verb"ftd\_delay":] the suggested delay that might be honored prior to
        !           245: retrying the operation (use \verb"DIAG_NODELAY" if a delay is not
        !           246: appropriate);
        !           247: and,
        !           248: 
        !           249: \item[\verb"ftd\_data"/\verb"ftd\_cc":] a diagnostic string
        !           250: (and the length of that string).
        !           251: \end{describe}
        !           252: A limitation of this implementation
        !           253: is that the routines and data structures which support diagnostics have a
        !           254: fixed limit as to the number of diagnostics permitted.
        !           255: This is currently denoted by the manifest constant \verb"NFDIAG".
        !           256: 
        !           257: \subsection    {Charging}
        !           258: A list of FTAM charges is represented by the \verb"FTAMcharging" structure.
        !           259: \begin{quote}\index{FTAMcharging}\small\begin{verbatim}
        !           260: struct FTAMcharging {
        !           261:     int     fc_ncharge;
        !           262: 
        !           263: #define NFCHRG  5
        !           264:     struct fc_charge {
        !           265:         char   *fc_resource;
        !           266:         char   *fc_unit;
        !           267:         int     fc_value;
        !           268:     }           fc_charges[NFCHRG];
        !           269: };
        !           270: \end{verbatim}\end{quote}
        !           271: This elements of this structure are:
        !           272: \begin{describe}
        !           273: \item[\verb"fc\_charges"/\verb"fc\_ncharge":] the charging list
        !           274: (and the number of charges in the list, which may not exceed
        !           275: the manifest constant \verb"NFCHRG").
        !           276: Each charge consists of:
        !           277:     \begin{describe}
        !           278:     \item[\verb"fc\_resource":] the resource identifier;
        !           279: 
        !           280:     \item[\verb"fc\_unit":] the charging unit;
        !           281:        and,
        !           282: 
        !           283:     \item[\verb"fc\_value":] the charging value.
        !           284:     \end{describe}
        !           285: \end{describe}
        !           286: A limitation of this implementation
        !           287: is that a fixed number of charges may be supported,
        !           288: as denoted by the manifest constant \verb"NFCHRG".
        !           289: 
        !           290: \subsection    {Passwords}
        !           291: A list of FTAM passwords is represented by the \verb"FTAMpasswords" structure.
        !           292: \begin{quote}\index{FTAMpasswords}\small\begin{verbatim}
        !           293: struct FTAMpasswords {
        !           294:     char   *fp_read;
        !           295:     int     fp_readlen;
        !           296: 
        !           297:     char   *fp_insert;
        !           298:     int     fp_insertlen;
        !           299: 
        !           300:     char   *fp_replace;
        !           301:     int     fp_replacelen;
        !           302: 
        !           303:     char   *fp_extend;
        !           304:     int     fp_extendlen;
        !           305: 
        !           306:     char   *fp_erase;
        !           307:     int     fp_eraselen;
        !           308: 
        !           309:     char   *fp_readattr;
        !           310:     int     fp_readattrlen;
        !           311: 
        !           312:     char   *fp_chngattr;
        !           313:     int     fp_chngattrlen;
        !           314: 
        !           315:     char   *fp_delete;
        !           316:     int     fp_deletelen;
        !           317: };
        !           318: \end{verbatim}\end{quote}
        !           319: This elements of this structure are:
        !           320: \begin{describe}
        !           321: \item[\verb"fp\_read"/\verb"fp\_readlen":] the read password
        !           322: (and the length of the password);
        !           323: 
        !           324: \item[\verb"fp\_insert"/\verb"fp\_insertlen":] the insert password
        !           325: (and the length of the password);
        !           326: 
        !           327: \item[\verb"fp\_replace"/\verb"fp\_replacelen":] the replace password
        !           328: (and the length of the password);
        !           329: 
        !           330: \item[\verb"fp\_extend"/\verb"fp\_extendlen":] the extend password
        !           331: (and the length of the password);
        !           332: 
        !           333: \item[\verb"fp\_erase"/\verb"fp\_eraselen":] the erase password
        !           334: (and the length of the password);
        !           335: 
        !           336: \item[\verb"fp\_readattr"/\verb"fp\_readattrlen":] the read attribute password
        !           337: (and the length of the password);
        !           338: 
        !           339: \item[\verb"fp\_chngattr"/\verb"fp\_chngattrlen":] the change attribute
        !           340: password (and the length of the password);
        !           341: and,
        !           342: 
        !           343: \item[\verb"fp\_delete"/\verb"fp\_deletelen":] the delete password
        !           344: (and the length of the password).
        !           345: \end{describe}
        !           346: The \verb"FPFREE" macro can be used to free the storage associated with an
        !           347: \verb"FTAMpasswords" structure (without freeing the structure itself).
        !           348: It behaves as if it was defined as:
        !           349: \begin{quote}\index{FPFREE}\small\begin{verbatim}
        !           350: void    FPFREE (fp)
        !           351: struct FTAMpasswords *fp;
        !           352: \end{verbatim}\end{quote}
        !           353: 
        !           354: \subsection    {Access Control}
        !           355: An FTAM access control element is represented by the \verb"FTAMacelement"
        !           356: structure.
        !           357: \begin{quote}\index{FTAMacelement}\small\begin{verbatim}
        !           358: struct FTAMacelement {
        !           359:     int     fe_actions;
        !           360: 
        !           361:     struct FTAMconcurrency fe_concurrency;
        !           362: 
        !           363:     char   *fe_aet;
        !           364: 
        !           365:     struct FTAMpasswords fe_passwords;
        !           366: 
        !           367:     AEI    fe_aet;
        !           368: 
        !           369:     struct FTAMacelement *fe_next;
        !           370: };
        !           371: \end{verbatim}\end{quote}
        !           372: The elements of this structure are:
        !           373: \begin{describe}
        !           374: \item[\verb"fe\_actions":] the action list,
        !           375: containing the inclusive-or of any of the values shown in
        !           376: Table~\ref{FTAMaccess};
        !           377: 
        !           378: \item[\verb"fe\_concurrency":] any concurrency-control constraints;
        !           379: 
        !           380: \item[\verb"fe\_aet":] the user identity;
        !           381: 
        !           382: \item[\verb"fe\_passwords"] the passwords;
        !           383: 
        !           384: \item[\verb"fe\_aet":] the application-entity title
        !           385: (defined in Section~\ref{acs:aei} on page~\pageref{acs:aei} in \volone/);
        !           386: and,
        !           387: 
        !           388: \item[\verb"fe\_next":] the next access element in the linked list.
        !           389: \end{describe}
        !           390: The \verb"FEFREE" macro can be used to free the storage associated with a
        !           391: list of FTAM access elements,
        !           392: including the head element on the list.
        !           393: It behaves as if it was defined as:
        !           394: \begin{quote}\index{FEFREE}\small\begin{verbatim}
        !           395: void    FEFREE (fe)
        !           396: struct FTAMacelement *fe;
        !           397: \end{verbatim}\end{quote}
        !           398: \tagtable[tp]{ftam-1}{FTAM Requested Access Values}{FTAMaccess}
        !           399: 
        !           400: \subsection    {Attributes}
        !           401: An FTAM attribute list is represented by the \verb"FTAMattributes" structure.
        !           402: \begin{quote}\index{FTAMattributes}\small\begin{verbatim}
        !           403: struct FTAMattributes {
        !           404:     long    fa_present;
        !           405:     long    fa_novalue;
        !           406: 
        !           407: #define NFFILE  5
        !           408:     int     fa_nfile;
        !           409:     char   *fa_files[NFFILE];
        !           410:     
        !           411:     int     fa_permitted;
        !           412: 
        !           413:     OID     fa_contents;
        !           414:     PE      fa_parameter;
        !           415: 
        !           416:     char   *fa_account;
        !           417: 
        !           418:     struct UTCtime fa_date_create;
        !           419:     struct UTCtime fa_date_modify;
        !           420:     struct UTCtime fa_date_read;
        !           421:     struct UTCtime fa_date_attribute;
        !           422: 
        !           423:     char   *fa_id_create;
        !           424:     char   *fa_id_modify;
        !           425:     char   *fa_id_read;
        !           426:     char   *fa_id_attribute;
        !           427: 
        !           428:     int     fa_availability;
        !           429: 
        !           430:     int     fa_filesize;
        !           431:     int     fa_futuresize;
        !           432: 
        !           433:     struct FTAMacelement fa_control;
        !           434:     char   *fa_legal;
        !           435: };
        !           436: \end{verbatim}\end{quote}
        !           437: 
        !           438: \newpage       %%% hack
        !           439: 
        !           440: The elements of this structure are:
        !           441: \begin{describe}
        !           442: \item[\verb"fa\_present":] the values present,
        !           443: containing the inclusive-or of any of the values shown in
        !           444: Table~\ref{FTAMattributes};
        !           445: 
        !           446: \item[\verb"fa\_novalue":] the values which are not available are not available
        !           447: (using the same values listed in Table~\ref{FTAMattributes},
        !           448: the value of this element is a subset of the value of the \verb"fa_present"
        !           449: element);
        !           450: 
        !           451: \item[\verb"fa\_files"/\verb"fa\_nfile":] the list of filename components
        !           452: (and the number of components, which may not exceed
        !           453: the manifest constant \verb"NFFILE");
        !           454: 
        !           455: \item[\verb"fa\_permitted":] permitted actions,
        !           456: containing the inclusive-or of any of the values shown in
        !           457: Table~\ref{FTAMaccess} on page~\pageref{FTAMaccess},
        !           458: in addition to any of:
        !           459: \[\begin{tabular}{|l|l|}
        !           460: \hline
        !           461:     \multicolumn{1}{|c|}{\bf Value}&
        !           462:                \multicolumn{1}{c|}{\bf Meaning}\\
        !           463: \hline
        !           464:     \tt FA\_PERM\_TRAV&                traversal\\
        !           465:     \tt FA\_PERM\_RVTRAV&      reverse-traversal\\
        !           466:     \tt FA\_PERM\_RANDOM&      random-order\\
        !           467: \hline
        !           468: \end{tabular}\]
        !           469: 
        !           470: \item[\verb"fa\_contents"/\verb"fa\_parameter":] the contents type;
        !           471: 
        !           472: \item[\verb"fa\_account":] the account;
        !           473: 
        !           474: \item[\verb"fa\_date\_create":] the date and time of creation;
        !           475: 
        !           476: \item[\verb"fa\_date\_modify":] the date and time of last modification;
        !           477: 
        !           478: \item[\verb"fa\_date\_read":] the date and time of last read access;
        !           479: 
        !           480: \item[\verb"fa\_date\_attribute":] the date and time of last attribute
        !           481: modification;
        !           482: 
        !           483: \item[\verb"fa\_id\_create":] the identity of creator;
        !           484: 
        !           485: \item[\verb"fa\_id\_modify":] the identity of last modifier;
        !           486: 
        !           487: \item[\verb"fa\_id\_read":] the identity of last reader;
        !           488: 
        !           489: \item[\verb"fa\_id\_attribute":] the identity of last attribute modifier;
        !           490: 
        !           491: \item[\verb"fa\_availability":] file availability,
        !           492: one of:
        !           493: \[\begin{tabular}{|l|l|}
        !           494: \hline
        !           495:     \multicolumn{1}{|c|}{\bf Value}&
        !           496:                \multicolumn{1}{c|}{\bf Meaning}\\
        !           497: \hline
        !           498:     \tt FA\_AVAIL\_IMMED&      immediate\\
        !           499:     \tt FA\_AVAIL\_DEFER&      deferred\\
        !           500: \hline
        !           501: \end{tabular}\]
        !           502: 
        !           503: \item[\verb"fa\_filesize":] filesize;
        !           504: 
        !           505: \item[\verb"fa\_futuresize":] future filesize;
        !           506: 
        !           507: \item[\verb"fa\_control":] access control;
        !           508: 
        !           509: \item[\verb"fa\_encrypt":] encryption name;
        !           510: and,
        !           511: 
        !           512: \item[\verb"fa\_legal":] legal qualification.
        !           513: \end{describe}
        !           514: A limitation of this implementation
        !           515: is that a fixed number of filename components may be supported,
        !           516: as denoted by the manifest constant \verb"NFFILE".
        !           517: 
        !           518: The routine \verb"FAFREE" can be used to free the storage associated with an
        !           519: \verb"FTAMattributes" structure (without freeing the structure itself).
        !           520: It is defined as:
        !           521: \begin{quote}\index{FAFREE}\small\begin{verbatim}
        !           522: void    FAFREE (fa)
        !           523: struct FTAMattributes *fa;
        !           524: \end{verbatim}\end{quote}
        !           525: \tagtable[tp]{ftam-2}{FTAM Attribute Values}{FTAMattributes}
        !           526: 
        !           527: \subsection    {Concurrency}
        !           528: An FTAM concurrency list is represented by the \verb"FTAMconcurrency"
        !           529: structure.
        !           530: \begin{quote}\index{FTAMconcurrency}\small\begin{verbatim}
        !           531: struct FTAMconcurrency {
        !           532: #define FLOCK_SHARED    00      /* shared */
        !           533: #define FLOCK_EXCLUSIVE 01      /* exclusive */
        !           534: #define FLOCK_NOTREQD   02      /* not-required */
        !           535: #define FLOCK_NOACCESS  03      /* no-access */
        !           536: 
        !           537:     char    fc_readlock;
        !           538:     char    fc_insertlock;
        !           539:     char    fc_replacelock;
        !           540:     char    fc_extendlock;
        !           541:     char    fc_eraselock;
        !           542:     char    fc_readattrlock;
        !           543:     char    fc_chngattrlock;
        !           544:     char    fc_deletelock;
        !           545: };
        !           546: \end{verbatim}\end{quote}
        !           547: This elements of this structure are:
        !           548: \begin{describe}
        !           549: \item[\verb"fc\_readlock":] the concurrency constraints for the read operation;
        !           550: 
        !           551: \item[\verb"fc\_insertlock":] the concurrency constraints for the insert
        !           552: operation; 
        !           553: 
        !           554: \item[\verb"fc\_replacelock":] the concurrency constraints for the replace
        !           555: operation;
        !           556: 
        !           557: \item[\verb"fc\_extendlock":] the concurrency constraints for the extend
        !           558: operation; 
        !           559: 
        !           560: \item[\verb"fc\_eraselock":] the concurrency constraints for the erase
        !           561: operation; 
        !           562: 
        !           563: \item[\verb"fc\_readattrlock":] the concurrency constraints for the read
        !           564: attribute operation;
        !           565: 
        !           566: \item[\verb"fc\_chngattrlock":] the concurrency constraints for the change
        !           567: attribute operation;
        !           568: and,
        !           569: 
        !           570: \item[\verb"fc\_deletelock":] the concurrency constraints for the delete
        !           571: operation.
        !           572: \end{describe}
        !           573: The \verb"FCINIT" macro can be used to initialize an
        !           574: \verb"FTAMconcurrency" structure.
        !           575: It behaves as if it was defined as:
        !           576: \begin{quote}\index{FCINIT}\small\begin{verbatim}
        !           577: void    FCINIT (fc)
        !           578: struct FTAMconcurrency *fc;
        !           579: \end{verbatim}\end{quote}
        !           580: 
        !           581: \subsection    {FADU Identity}
        !           582: An FADU identity is represented by the \verb"FADUidentity" structure.%
        !           583: \footnote{FADU stands for File Access Data Unit;
        !           584: if you didn't already know this, you shouldn't be reading this chapter.
        !           585: Read Section~\ref{ftam:note} right now.}
        !           586: \begin{quote}\index{FADUidentity}\small\begin{verbatim}
        !           587: struct FADUidentity {
        !           588:     int     fa_type;
        !           589: #define FA_FIRSTLAST    0       /* first-last */
        !           590: #define FA_RELATIVE     1       /* relative */
        !           591: #define FA_BEGINEND     2       /* begin-end */
        !           592: #define FA_SINGLE       3       /* single-name */
        !           593: #define FA_NAMELIST     4       /* name-list */
        !           594: #define FA_FADUNUMBER   5       /* fadu-number */
        !           595: 
        !           596:     union {
        !           597:         int     fa_un_firstlast;
        !           598: #define FA_FIRST        0
        !           599: #define FA_LAST         1
        !           600: 
        !           601:         int     fa_un_relative;
        !           602: #define FA_PREVIOUS     0
        !           603: #define FA_CURRENT      1
        !           604: #define FA_NEXT         2
        !           605: 
        !           606:         int     fa_un_beginend;
        !           607: #define FA_BEGIN        0
        !           608: #define FA_END          1
        !           609: 
        !           610:         char   *fa_un_singlename;
        !           611: 
        !           612: #define NANAME  5
        !           613:         struct {
        !           614:             char   *fa_un_names[NANAME];
        !           615:             int     fa_un_nname;
        !           616:         }       fa_un_list;
        !           617: 
        !           618:         int     fa_un_fadunumber;
        !           619:     }   fa_un;
        !           620: #define fa_firstlast    fa_un.fa_un_firstlast
        !           621: #define fa_relative     fa_un.fa_un_relative
        !           622: #define fa_beginend     fa_un.fa_un_beginend
        !           623: #define fa_singlename   fa_un.fa_un_singlename
        !           624: #define fa_names        fa_un.fa_un_list.fa_un_names
        !           625: #define fa_nname        fa_un.fa_un_list.fa_un_nname
        !           626: #define fa_fadunumber   fa_un.fa_un_fadunumber
        !           627: };
        !           628: \end{verbatim}\end{quote}
        !           629: As shown, this structure is really a discriminated union
        !           630: (a structure with a tag element followed by a union).
        !           631: The elements are:
        !           632: \begin{describe}
        !           633: \item[\verb"fa\_type":] indicates what type of FADU identity is represented;
        !           634: Depending on this type, one of the following elements is valid:
        !           635: \begin{describe}
        !           636: \item[\verb"fa\_firstlast":] the location, identified as first or last;
        !           637: 
        !           638: \item[\verb"fa\_relative":] the location, identified as previous,
        !           639: current, or next;
        !           640: 
        !           641: \item[\verb"fa\_beginend":] the location, identified as begin or end;
        !           642: 
        !           643: \item[\verb"fa\_singlename":] the location, as identified by name;
        !           644: 
        !           645: \item[\verb"fa\_names"/\verb"fa\_nname":] the location,
        !           646: as identified by a list of names (and the length of that list,
        !           647: which may not exceed the manifest constant \verb"NANAME");
        !           648: or,
        !           649: 
        !           650: \item[\verb"fa\_fadunumber":] the location, as identified by number.
        !           651: \end{describe}
        !           652: \end{describe}
        !           653: A limitation of this implementation
        !           654: is that a fixed number of FADU names may be supported,
        !           655: as denoted by the manifest constant \verb"NANAME".
        !           656: 
        !           657: The \verb"FUFREE" macro can be used to free the storage associated with an
        !           658: \verb"FADUidentity" structure (without freeing the structure itself).
        !           659: It behaves as if it was defined as:
        !           660: \begin{quote}\index{FUFREE}\small\begin{verbatim}
        !           661: void    FUFREE (fu)
        !           662: struct FADUidentity *fu;
        !           663: \end{verbatim}\end{quote}
        !           664: 
        !           665: \section      {Association Establishment}
        !           666: The \man libftam(3n) library distinguishes between the entity which started an
        !           667: association,
        !           668: the {\em initiator},
        !           669: and the entity which was subsequently bound to the association,
        !           670: the {\em responder}.
        !           671: We sometimes term these two entities the {\em client\/} and the {\em server},
        !           672: respectively.
        !           673: 
        !           674: Section~\ref{acs:addresses} of \volone/ describes the use of addressing
        !           675: for the application layer.
        !           676: In particular,
        !           677: Figure~\ref{getFTAMentity} on page~\pageref{getFTAMentity} of \volone/
        !           678: presents
        !           679: an example of how one constructs the address for the File Transfer, Access
        !           680: and Management (FTAM) service on host \verb"RemoteHost".
        !           681: 
        !           682: \subsection    {Responder}
        !           683: The \man tsapd(8c) daemon,
        !           684: upon accepting a connection from an initiating host,
        !           685: consults the ISO services database to determine which program
        !           686: on the local system implements the desired application context.
        !           687: 
        !           688: Once the program has been ascertained,
        !           689: the daemon runs the program with any arguments listed in the database.
        !           690: In addition,
        !           691: it appends some {\em magic arguments\/} to the argument vector.
        !           692: Hence,
        !           693: the very first action performed by the responder is to re-capture the FTAM
        !           694: state contained in the magic arguments.
        !           695: This is done by calling the routine \verb"FInit",
        !           696: which on a successful return,
        !           697: is equivalent to an {\sf F-INITIALIZE.INDICATION\/} event.
        !           698: \begin{quote}\index{FInit}\small\begin{verbatim}
        !           699: int     FInit (vecp, vec, fts, tracing, fti)
        !           700: int     vecp;
        !           701: char  **vec;
        !           702: struct FTAMstart *fts;
        !           703: int   (*tracing) ();
        !           704: struct FTAMindication *fti;
        !           705: \end{verbatim}\end{quote}
        !           706: The parameters to this procedure are:
        !           707: \begin{describe}
        !           708: \item[\verb"vecp":] the length of the argument vector;
        !           709: 
        !           710: \item[\verb"vec":] the argument vector;
        !           711: 
        !           712: \item[\verb"fts":] a pointer to an \verb"FTAMstart" structure,
        !           713: which is updated only if the call succeeds;
        !           714: 
        !           715: \item[\verb"tracing":] the address of a tracing routine to be invoked when an
        !           716: FTAM event occurs (consult Section~\ref{ftam:tracing});
        !           717: and,
        !           718: 
        !           719: \item[\verb"fti":] a pointer to an \verb"FTAMindication" structure,
        !           720: which is updated only if the call fails.
        !           721: \end{describe}
        !           722: If \verb"FInit" is successful,
        !           723: it returns information in the \verb"fts" parameter,
        !           724: which is a pointer to an \verb"FTAMstart" structure.
        !           725: \begin{quote}\index{FTAMstart}\small\begin{verbatim}
        !           726: struct FTAMstart {
        !           727:     int     fts_sd;
        !           728: 
        !           729:     AEInfo  fts_calledtitle;
        !           730:     AEInfo  fts_callingtitle;
        !           731: 
        !           732:     struct PSAPaddr fts_calledaddr;
        !           733:     struct PSAPaddr fts_callingaddr;
        !           734: 
        !           735:     OID     fts_context;
        !           736: 
        !           737:     int     fts_manage;
        !           738: 
        !           739:     int     fts_class;
        !           740: 
        !           741:     int     fts_units;
        !           742:     int     fts_attrs;
        !           743: 
        !           744:     PE      fts_sharedASE;
        !           745: 
        !           746:     int     fts_fqos;
        !           747: 
        !           748:     struct FTAMcontentlist fts_contents;
        !           749: 
        !           750:     char   *fts_initiator;
        !           751:     char   *fts_account;
        !           752:     char   *fts_password;
        !           753:     int     fts_passlen;
        !           754: 
        !           755:     int     fts_ssdusize;
        !           756: 
        !           757:     struct QOStype fts_qos;
        !           758: };
        !           759: \end{verbatim}\end{quote}
        !           760: The elements of this structure are:
        !           761: \begin{describe}
        !           762: \item[\verb"fts\_sd":] the association-descriptor to be used to reference
        !           763: this association;
        !           764: 
        !           765: \item[\verb"fts\_calledtitle":] information on the called application-entity,
        !           766: if any (consult Section~\ref{acs:aei} of \volone/);
        !           767: 
        !           768: \item[\verb"fts\_callingtitle":] information on the the calling
        !           769: application-entity, if any;
        !           770: 
        !           771: \item[\verb"fts\_calledaddr":] the called presentation address
        !           772: (consult Section~\ref{psap:addresses} of \voltwo/);
        !           773: 
        !           774: \item[\verb"fts\_callingaddr":] the calling presentation address;
        !           775: 
        !           776: \item[\verb"fts\_context":] the application context name;
        !           777: 
        !           778: \item[\verb"fts\_manage":] a flag indicating if presentation context
        !           779: management is available for use (zero if unavailable);
        !           780: 
        !           781: \item[\verb"fts\_class":] the inclusive-or of the service classes offered;
        !           782: 
        !           783: \item[\verb"fts\_units":] the functional units;
        !           784: 
        !           785: \item[\verb"fts\_attrs":] the attribute groups;
        !           786: 
        !           787: \item[\verb"fts\_sharedASE":] shared ASE information;
        !           788: 
        !           789: \item[\verb"fts\_fqos":] the FTAM Quality-of-Service;
        !           790: 
        !           791: \item[\verb"fts\_contents":] the contents type list;
        !           792: 
        !           793: \item[\verb"fts\_initiator":] the user-identity of the initiator, if any;
        !           794: 
        !           795: \item[\verb"fts\_account":] the account, if any;
        !           796: 
        !           797: \item[\verb"fts\_password"/\verb"fts\_passlen":] the password (and its
        !           798: length), if any;
        !           799: 
        !           800: \item[\verb"fts\_ssdusize":] the largest atomic SSDU size that can be used
        !           801: on the underlying connection;
        !           802: and,
        !           803: 
        !           804: \item[\verb"qos":] the quality of service on the connection
        !           805: (see Section~\ref{tsap:qos} in \voltwo/).
        !           806: \end{describe}
        !           807: Note that the data contained in the structure was allocated via \man malloc(3),
        !           808: and should be released by using the \verb"FTSFREE" macro when no longer
        !           809: referenced.
        !           810: The \verb"FTSFREE" macro,
        !           811: behaves as if it was defined as:
        !           812: \begin{quote}\index{FTSFREE}\small\begin{verbatim}
        !           813: void    FTSFREE (fts)
        !           814: struct FTAMstart *fts;
        !           815: \end{verbatim}\end{quote}
        !           816: The macro frees only the data allocated by \verb"FInit",
        !           817: and not the \verb"FTAMstart" structure itself.
        !           818: Further,
        !           819: \verb"FTSFREE" should be called only if the call to the \verb"FInit"
        !           820: routine returned \verb"OK".
        !           821: 
        !           822: If the call to \verb"FInit" is not successful,
        !           823: then an {\sf F-P-ABORT.INDICATION\/} event is simulated,
        !           824: and the relevant information is returned in an encoded \verb"FTAMindication"
        !           825: structure.\label{FTAMindication}
        !           826: \begin{quote}\index{FTAMindication}\small\begin{verbatim}
        !           827: struct FTAMindication {
        !           828:     int     fti_type;
        !           829: #define FTI_FINISH      0x00
        !           830: #define FTI_ABORT       0x01
        !           831: #define FTI_MANAGEMENT  0x02
        !           832: #define FTI_BULKBEGIN   0x03
        !           833: #define FTI_BULKEND     0x04
        !           834: #define FTI_ACCESS      0x05
        !           835: #define FTI_READWRITE   0x06
        !           836: #define FTI_DATA        0x07
        !           837: #define FTI_DATAEND     0x08
        !           838: #define FTI_CANCEL      0x09
        !           839: #define FTI_TRANSEND    0x10
        !           840: 
        !           841:     union {
        !           842:         struct FTAMfinish   fti_un_finish;
        !           843:         struct FTAMabort    fti_un_abort;
        !           844:         struct FTAMgroup    fti_un_group;
        !           845:         struct FTAMaccess   fti_un_access;
        !           846:         struct FTAMreadwrite fti_un_readwrite;
        !           847:         struct PSAPdata     fti_un_data;
        !           848:         struct FTAMdataend  fti_un_dataend;
        !           849:         struct FTAMcancel   fti_un_cancel;
        !           850:         struct FTAMtransend fti_un_transend;
        !           851:     }   fti_un;
        !           852: #define fti_finish      fti_un.fti_un_finish
        !           853: #define fti_abort       fti_un.fti_un_abort
        !           854: #define fti_group       fti_un.fti_un_group
        !           855: #define fti_access      fti_un.fti_un_access
        !           856: #define fti_readwrite   fti_un.fti_un_readwrite
        !           857: #define fti_data        fti_un.fti_un_data
        !           858: #define fti_dataend     fti_un.fti_un_dataend
        !           859: #define fti_cancel      fti_un.fti_un_cancel
        !           860: #define fti_transend    fti_un.fti_un_transend
        !           861: };
        !           862: \end{verbatim}\end{quote}
        !           863: As shown, this structure is really a discriminated union
        !           864: (a structure with a tag element followed by a union).
        !           865: Hence, on a failure return,
        !           866: one first coerces a pointer to the \verb"FTAMabort" structure contained
        !           867: therein,
        !           868: and then consults the elements of that structure.
        !           869: \begin{quote}\index{FTAMabort}\small\begin{verbatim}
        !           870: struct FTAMabort {
        !           871:     int     fta_peer;
        !           872: 
        !           873:     int     fta_action;
        !           874: 
        !           875: #define NFDIAG  5
        !           876:     int     fta_ndiag;
        !           877:     struct FTAMdiagnostic fta_diags[NFDIAG];
        !           878: };
        !           879: \end{verbatim}\end{quote}
        !           880: The elements of an \verb"FTAMabort" structure are:
        !           881: \begin{describe}
        !           882: \item[\verb"fta\_peer":] if set, indicates that a user-initiated abort occurred
        !           883: (an {\sf F-U-ABORT.INDICATION\/} event);
        !           884: if not set, indicates that a provider-initiated abort occurred
        !           885: (an {\sf F-P-ABORT.INDICATION\/} event);
        !           886: 
        !           887: \item[\verb"fta\_action":] an action result;
        !           888: and,
        !           889: 
        !           890: \item[\verb"fta\_diags"/\verb"fta\_ndiag":] any diagnostic information
        !           891: (and the number of diagnostics present).
        !           892: \end{describe}
        !           893: For each diagnostic present (typically only one) in the \verb"FTAMabort"
        !           894: structure,
        !           895: information regarding the failure is present.
        !           896: In particular,
        !           897: the error code can be found in the
        !           898: the \verb"ftd_identifier" element of each diagnostic.
        !           899: 
        !           900: After examining the information returned by \verb"FInit" on a successful call
        !           901: (and possibly after examining the argument vector),
        !           902: the responder should either accept or reject the association.
        !           903: For either response,
        !           904: the responder should use the \verb"FInitializeResponse" routine
        !           905: (which corresponds to the {\sf F-INITIALIZE.RESPONSE\/} action).
        !           906: \begin{quote}\index{FInitializeResonse}\small\begin{verbatim}
        !           907: int     FInitializeResponse (sd, state, action, context,
        !           908:         respondtitle, respondaddr, manage, class, units,
        !           909:         attrs, sharedASE, fqos, contents, diag, ndiag, fti)
        !           910: int     sd;
        !           911: int     state,
        !           912:         action,
        !           913:         manage,
        !           914:         class,
        !           915:         units,
        !           916:         attrs,
        !           917:         fqos;
        !           918: OID     context;
        !           919: AEI     respondtitle;
        !           920: struct PSAPaddr *respondaddr;
        !           921: PE      sharedASE;
        !           922: struct FTAMcontentlist *contents;
        !           923: struct FTAMdiagnostic diag[];
        !           924: int     ndiag;
        !           925: struct FTAMindication *fti;
        !           926: \end{verbatim}\end{quote}
        !           927: The parameters to this procedure are:
        !           928: \begin{describe}
        !           929: \item[\verb"sd":] the association-descriptor;
        !           930: 
        !           931: \item[\verb"state":] a state result;
        !           932: 
        !           933: \item[\verb"action":] an action result;
        !           934: 
        !           935: \item[\verb"context":] the application context name
        !           936: (use the manifest constant \verb"NULLOID" if the proposed name should be used);
        !           937: 
        !           938: \item[\verb"manage":] the negotiated use of presentation context management;
        !           939: 
        !           940: \item[\verb"respondtitle":] information on the responding application-entity,
        !           941: if any;
        !           942: 
        !           943: \item[\verb"respondaddr":] the responding presentation address, if any;
        !           944: 
        !           945: \item[\verb"manage":] the negotiated service class;
        !           946: 
        !           947: \item[\verb"units":] the negotiated functional units
        !           948: (specify both mandatory and optional functional units for the service class);
        !           949: 
        !           950: \item[\verb"attrs":] the negotiated attribute groups;
        !           951: 
        !           952: \item[\verb"sharedASE":] shared ASE information;
        !           953: 
        !           954: \item[\verb"fqos":] the negotiated FTAM Quality-of-Service;
        !           955: 
        !           956: \item[\verb"contents":] the negotiated contents type list;
        !           957: 
        !           958: \item[\verb"diag"/\verb"ndiag":] a list of diagnostics
        !           959: (and the number of diagnostics in the list);
        !           960: and,
        !           961: 
        !           962: \item[\verb"fti":] a pointer to an \verb"FTAMindication" structure,
        !           963: which is updated only if the call fails.
        !           964: \end{describe}
        !           965: If the call to \verb"FInitializeResponse" is successful,
        !           966: then association establishment has now been completed.
        !           967: Otherwise,
        !           968: if the call failed and the reason is ``fatal'',
        !           969: then the association is lost.
        !           970: 
        !           971: \subsection    {Initiator}
        !           972: A program wishing to associate itself with a filestore
        !           973: calls the routine \verb"FInitializeRequest",
        !           974: which corresponds to the user taking the {\sf F-INIT\-IAL\-IZE.REQUEST\/}
        !           975: action.
        !           976: \begin{quote}\index{FInitializeRequest}\small\begin{verbatim}
        !           977: int     FInitializeRequest (context, callingtitle, calledtitle, 
        !           978:         callingaddr, calledaddr, manage, class, units, attrs,
        !           979:         sharedASE, fqos, contents, initiator, account,
        !           980:         password, passlen, qos, tracing, ftc, fti)
        !           981: OID     context;
        !           982: AEI     calledtitle,
        !           983:         callingtitle;
        !           984: struct PSAPaddr *calledaddr,
        !           985:                 *callingaddr;
        !           986: int     manage,
        !           987:         class,
        !           988:         units,
        !           989:         attrs,
        !           990:         fqos,
        !           991:         passlen;
        !           992: PE      sharedASE;
        !           993: struct FTAMcontentlist *contents;
        !           994: char   *initiator,
        !           995:        *account,
        !           996:        *password;
        !           997: struct QOStype *qos;
        !           998: IFP     tracing;
        !           999: struct FTAMconnect *ftc;
        !          1000: struct FTAMindication *fti;
        !          1001: \end{verbatim}\end{quote}
        !          1002: The parameters to this procedure are:
        !          1003: \begin{describe}
        !          1004: \item[\verb"context":] the application context name
        !          1005: (use the manifest constant \verb"NULLOID" to invoke the default
        !          1006: file transfer context);
        !          1007: 
        !          1008: \item[\verb"callingtitle":] information on the the calling application-entity,
        !          1009: if any (consult Section~\ref{acs:aei} of \volone/);
        !          1010: 
        !          1011: \item[\verb"calledtitle":] information on the called application-entity,
        !          1012: if any;
        !          1013: 
        !          1014: \item[\verb"callingaddr":] the calling presentation address
        !          1015: (consult Section~\ref{psap:addresses} of \voltwo/);
        !          1016: 
        !          1017: \item[\verb"calledaddr":] the called presentation address;
        !          1018: 
        !          1019: \item[\verb"manage":] a flag indicating if presentation context management is
        !          1020: available for use (zero if unavailable);
        !          1021: 
        !          1022: \item[\verb"class":] the proposed service classes;
        !          1023: 
        !          1024: \item[\verb"units":] the proposed functional units
        !          1025: (specify both mandatory and optional functional units for the indicated
        !          1026: service class);
        !          1027: 
        !          1028: \item[\verb"attrs":] the proposed attribute groups;
        !          1029: 
        !          1030: \item[\verb"sharedASE":] shared ASE information;
        !          1031: 
        !          1032: \item[\verb"fqos":] the proposed FTAM Quality-of-Service;
        !          1033: 
        !          1034: \item[\verb"contents":] the contents type list;
        !          1035: 
        !          1036: \item[\verb"initiator":] the user-identity of the initiator, if any;
        !          1037: 
        !          1038: \item[\verb"account":] the account, if any
        !          1039: 
        !          1040: \item[\verb"password"/\verb"passlen":] the password (and its length), if any;
        !          1041: 
        !          1042: \item[\verb"qos":] the quality of service on the connection
        !          1043: (see Section~\ref{tsap:qos} in \voltwo/);
        !          1044: 
        !          1045: \item[\verb"tracing":] the address of a tracing routine to be invoked when an
        !          1046: FTAM event occurs (consult Section~\ref{ftam:tracing});
        !          1047: 
        !          1048: \item[\verb"ftc":] a pointer to an \verb"FTAMconnect" structure,
        !          1049: which is updated only if the call succeeds;
        !          1050: and,
        !          1051: 
        !          1052: \item[\verb"fti":] a pointer to an \verb"FTAMindication" structure,
        !          1053: which is updated only if the call fails.
        !          1054: \end{describe}
        !          1055: If the call to \verb"FInitializeRequest" is successful
        !          1056: (the {\sf F-INITIALIZE.CON\-FIR\-MA\-TION\/} event occurs),
        !          1057: it returns information in the \verb"ftc" parameter
        !          1058: which is a pointer to an \verb"FTAMconnect" structure.
        !          1059: \begin{quote}\index{FTAMconnect}\small\begin{verbatim}
        !          1060: struct FTAMconnect {
        !          1061:     int            ftc_sd;
        !          1062: 
        !          1063:     int            ftc_state;
        !          1064:     int            ftc_action;
        !          1065: 
        !          1066:     AEInfo  ftc_respondtitle;
        !          1067: 
        !          1068:     struct PSAPaddr ftc_respondaddr;
        !          1069: 
        !          1070:     int            ftc_manage;
        !          1071: 
        !          1072:     int            ftc_units;
        !          1073:     int            ftc_attrs;
        !          1074: 
        !          1075:     int            ftc_rollback;
        !          1076: 
        !          1077:     struct FTAMcontentlist ftc_contents;
        !          1078: 
        !          1079:     int            ftc_ndiag;
        !          1080:     struct FTAMdiagnostic  ftc_diags[NFDIAG];
        !          1081: 
        !          1082:     int            ftc_ssdusize;
        !          1083: 
        !          1084:     struct QOStype ftc_qos;
        !          1085: };
        !          1086: \end{verbatim}\end{quote}
        !          1087: The elements of an \verb"FTAMconnect" structure are:
        !          1088: \begin{describe}
        !          1089: \item[\verb"ftc\_sd":] the association-descriptor to be used to reference
        !          1090: this association;
        !          1091: 
        !          1092: \item[\verb"ftc\_state":] a state result
        !          1093: 
        !          1094: \item[\verb"ftc\_action":] an action result
        !          1095: 
        !          1096: \item[\verb"ftc\_respondtitle":] the responding application-entity title, if
        !          1097: any;
        !          1098: 
        !          1099: \item[\verb"ftc\_respondaddr":] the responding presentation address, if any;
        !          1100: 
        !          1101: \item[\verb"ftc\_manage":] the negotiated use of presentation context
        !          1102: management;
        !          1103: 
        !          1104: \item[\verb"ftc\_units":] the negotiated functional units;
        !          1105: 
        !          1106: \item[\verb"ftc\_attrs":] the negotiated attribute groups;
        !          1107: 
        !          1108: \item[\verb"ftc\_rollback":] the negotiated rollback availability;
        !          1109: 
        !          1110: \item[\verb"ftc\_contents":] the negotiated contents type list;
        !          1111: 
        !          1112: \item[\verb"ftc\_diags"/\verb"ftc\_ndiag":] any diagnostic information
        !          1113: (and the number of diagnostics present)
        !          1114: 
        !          1115: \item[\verb"ftc\_ssdusize":] the largest atomic SSDU size that can be used
        !          1116: on the underlying connection;
        !          1117: and,
        !          1118: 
        !          1119: \item[\verb"ftc\_qos":] the quality of service on the connection
        !          1120: (see Section~\ref{tsap:qos} in \voltwo/).
        !          1121: \end{describe}
        !          1122: If the call to \verb"FInitializeRequest" is successful,
        !          1123: and the \verb"ftc_state" element is set to \verb"FSTATE_SUCCESS",
        !          1124: then association establishment has completed.
        !          1125: If the call is successful,
        !          1126: but the \verb"acc_result" element is not \verb"FSTATE_SUCCESS",
        !          1127: the the association attempt has been rejected
        !          1128: and the diagnostics present indicate the reason for the rejection.
        !          1129: Otherwise, if the call fails then the association is not established and
        !          1130: the \verb"FTAMabort" structure contained in the \verb"FTAMindication"
        !          1131: discriminated union has been updated.
        !          1132: 
        !          1133: Note that the data contained in the structure was allocated via \man malloc(3),
        !          1134: and should be released by using the \verb"FTCFREE" macro when no longer
        !          1135: referenced.
        !          1136: The \verb"FTCFREE" macro,
        !          1137: behaves as if it was defined as:
        !          1138: \begin{quote}\index{FTCFREE}\small\begin{verbatim}
        !          1139: void    FTCFREE (ftc)
        !          1140: struct FTAMconnect *ftc;
        !          1141: \end{verbatim}\end{quote}
        !          1142: The macro frees only the data allocated by \verb"FInitializeRequest",
        !          1143: and not the \verb"FTAMconnect" structure itself.
        !          1144: Further,
        !          1145: \verb"FTCFREE" should be called only if the call to the
        !          1146: \verb"FInitializeRequest" routine returned \verb"OK".
        !          1147: 
        !          1148: \section      {Event Handling}
        !          1149: Once the association has been established,
        !          1150: an association-descriptor is used to reference the connection.
        !          1151: This is usually the first parameter given to any of the remaining routines in
        !          1152: the \man libftam(3n) library.
        !          1153: Further,
        !          1154: the last parameter is usually a pointer to an \verb"FTAMindication" structure
        !          1155: (as described on page~\pageref{FTAMindication}).
        !          1156: If a call to one of these routines fails,
        !          1157: then the structure is updated.
        !          1158: Consult the \verb"FTAMabort" element of the \verb"FTAMindication" structure
        !          1159: and look at the diagnostics (typically only one) present.
        !          1160: When a diagnostic is reported by the provider,
        !          1161: the \verb"ftd_type" element indicates if the error is ``fatal'' by having the
        !          1162: value \verb"DIAG_PERM".
        !          1163: Other values, such as \verb"DIAG_TRANS" indicate non-fatal errors
        !          1164: (the association still exists).
        !          1165: The most common non-fatal error to occur is \verb"FS_GEN_WAITING" which
        !          1166: indicates that an indication is waiting to be read.
        !          1167: 
        !          1168: The \verb"FWaitRequest" routine is used to wait for an event to occur.
        !          1169: \begin{quote}\index{FWaitRequest}\small\begin{verbatim}
        !          1170: int     FWaitRequest (sd, secs, fti)
        !          1171: int     sd;
        !          1172: int     secs;
        !          1173: struct FTAMindication *fti;
        !          1174: \end{verbatim}\end{quote}
        !          1175: The parameters to this procedure are:
        !          1176: \begin{describe}
        !          1177: \item[\verb"sd":] the association-descriptor;
        !          1178: 
        !          1179: \item[\verb"secs":] the maximum number of seconds to wait for the event
        !          1180: (a value of \verb"NOTOK" indicates that the call should block indefinitely,
        !          1181: whereas a value of \verb"OK" indicates that the call should not block at all,
        !          1182: e.g., a polling action);
        !          1183: and,
        !          1184: 
        !          1185: \item[\verb"fti":] a pointer to an \verb"FTAMindication" structure,
        !          1186: which is always updated.
        !          1187: \end{describe}
        !          1188: If the call to \verb"FWaitRequest" returns the manifest constant \verb"NOTOK",
        !          1189: then the \verb"FTAMabort" structure contained in the \verb"FTAMindication"
        !          1190: parameter \verb"fti" contains the reason for the failure.
        !          1191: Similarly,
        !          1192: if the manifest constant \verb"OK" is returned,
        !          1193: an event is encoded in the \verb"fti" parameter,
        !          1194: depending on the value of the \verb"fti_type" element:
        !          1195: \[\begin{tabular}{|l|l|}
        !          1196: \hline
        !          1197:     \multicolumn{1}{|c|}{\bf Value}&
        !          1198:                        \multicolumn{1}{c|}{\bf Event}\\
        !          1199: \hline
        !          1200:     \tt FTI\_FINISH&           \sf F-TERMINATE.INDICATION\\
        !          1201: \hline
        !          1202:     \tt FTI\_MANAGEMENT&       grouped management operation\\
        !          1203: \hline
        !          1204:     \tt FTI\_BULKBEGIN&                begin of grouped file transfer operation\\
        !          1205: \hline
        !          1206:     \tt FTI\_BULKEND&          end of grouped file transfer operation\\
        !          1207: \hline
        !          1208:     \tt FTI\_ACCESS&           \sf F-LOCATE.INDICATION\\
        !          1209:        &                       \sf F-LOCATE.CONFIRMATION\\
        !          1210:        &                       \sf F-ERASE.INDICATION\\
        !          1211:        &                       \sf F-ERASE.CONFIRMATION\\
        !          1212: \hline
        !          1213:     \tt FTI\_READWRITE&                \sf F-READ.INDICATION\\
        !          1214:        &                       \sf F-WRITE.INDICATION\\
        !          1215: \hline
        !          1216:     \tt FTI\_DATA&             \sf F-DATA.INDICATION\\
        !          1217: \hline
        !          1218:     \tt FTI\_DATAEND&          \sf F-DATA-END.INDICATION\\
        !          1219: \hline
        !          1220:     \tt FTI\_CANCEL&           \sf F-CANCEL.INDICATION\\
        !          1221:        &                       \sf F-CANCEL.CONFIRMATION\\
        !          1222: \hline
        !          1223:     \tt FTI\_TRANSEND&         \sf F-TRANSFER-END.INDICATION\\
        !          1224:        &                       \sf F-TRANSFER-END.CONFIRMATION\\
        !          1225: \hline
        !          1226: \end{tabular}\]
        !          1227: These are now discussed in turn.
        !          1228: 
        !          1229: \subsubsection {Termination Indication}
        !          1230: When an event associated with association release occurs,
        !          1231: the \verb"fti_type" field of the \verb"fti" parameter contains the value
        !          1232: \verb"FTI_FINISH".
        !          1233: Further,
        !          1234: an \verb"FTAMfinish" structure is contained inside the \verb"fti" parameter,
        !          1235: indicating an {\sf F-TERMINATE.INDICATION\/} event.
        !          1236: \begin{quote}\index{FTAMfinish}\small\begin{verbatim}
        !          1237: struct FTAMfinish {
        !          1238:     int     ftf_sharedASE;
        !          1239: };
        !          1240: \end{verbatim}\end{quote}
        !          1241: The elements of this structure are:
        !          1242: \begin{describe}
        !          1243: \item[\verb"ftf\_sharedASE":] shared ASE information.
        !          1244: \end{describe}
        !          1245: The \verb"FTFFREE" macro can be used to free the storage associated with an
        !          1246: \verb"FTAMdfinish" structure (without freeing the structure itself).
        !          1247: It behaves as if it was defined as:
        !          1248: \begin{quote}\index{FTFFREE}\small\begin{verbatim}
        !          1249: void    FTFFREE (ftf)
        !          1250: struct FTAMfinish *ftf;
        !          1251: \end{verbatim}\end{quote}
        !          1252: 
        !          1253: \subsubsection {Group Indications}
        !          1254: Use of the grouping function unit is required in the current implementation,
        !          1255: hence
        !          1256: when a transfer or management indication occurs,
        !          1257: the \verb"fti_type" field of the \verb"fti" parameter contains one of three
        !          1258: values:
        !          1259: \[\begin{tabular}{|l|l|}
        !          1260: \hline
        !          1261:     \multicolumn{1}{|c|}{\bf Value}&
        !          1262:                        \multicolumn{1}{c|}{\bf Event}\\
        !          1263: \hline
        !          1264:     \tt FTI\_MANAGEMENT&       grouped management operation\\
        !          1265:     \tt FTI\_BULKBEGIN&                begin of grouped file transfer operation\\
        !          1266:     \tt FTI\_BULKEND&          end of grouped file transfer operation\\
        !          1267: \hline
        !          1268: \end{tabular}\]
        !          1269: and an \verb"FTAMgroup" structure is contained inside the \verb"fti" parameter.
        !          1270: \begin{quote}\index{FTAMgroup}\small\begin{verbatim}
        !          1271: struct FTAMgroup {
        !          1272:     int     ftg_threshold;
        !          1273: 
        !          1274:     int     ftg_flags;
        !          1275: 
        !          1276:     union {
        !          1277:         struct FTAMselect   ftg_un1_select;
        !          1278:         struct FTAMcreate   ftg_un1_create;
        !          1279:         struct FTAMclose    ftg_un1_close;
        !          1280:     }                   ftg_un1;
        !          1281: #define ftg_select      ftg_un1.ftg_un1_select
        !          1282: #define ftg_create      ftg_un1.ftg_un1_create
        !          1283: #define ftg_close       ftg_un1.ftg_un1_close
        !          1284: 
        !          1285:     struct FTAMreadattr ftg_readattr;
        !          1286: 
        !          1287:     struct FTAMchngattr ftg_chngattr;
        !          1288: 
        !          1289:     union {
        !          1290:         struct FTAMdeselect ftg_un2_deselect;
        !          1291:         struct FTAMdelete   ftg_un2_delete;
        !          1292:         struct FTAMopen     ftg_un2_open;
        !          1293:     } ftg_un2;
        !          1294: #define ftg_deselect    ftg_un2.ftg_un2_deselect
        !          1295: #define ftg_delete      ftg_un2.ftg_un2_delete
        !          1296: #define ftg_open        ftg_un2.ftg_un2_open
        !          1297: };
        !          1298: \end{verbatim}\end{quote}
        !          1299: The elements of this structure are:\label{FTAMgroup}
        !          1300: \begin{describe}
        !          1301: \item[\verb"ftg\_threshold":] the grouping threshold;
        !          1302: 
        !          1303: \item[\verb"ftg\_flags":] the indications which are present,
        !          1304: containing the inclusive-or of any of the values:
        !          1305: \[\begin{tabular}{|l|l|}
        !          1306: \hline
        !          1307:     \multicolumn{1}{|c|}{\bf Value}&
        !          1308:                \multicolumn{1}{c|}{\bf Meaning}\\
        !          1309: \hline
        !          1310:     \tt FTG\_BEGIN&    F-BEGIN-GROUP\\
        !          1311:     \tt FTG\_SELECT&   F-SELECT\\
        !          1312:     \tt FTG\_CREATE&   F-CREATE\\
        !          1313:     \tt FTG\_RDATTR&   F-READ-ATTRIB\\
        !          1314:     \tt FTG\_CHATTR&   F-CHANGE-ATTRIB\\
        !          1315:     \tt FTG\_OPEN&     F-OPEN\\
        !          1316:     \tt FTG\_CLOSE&    F-CLOSE\\
        !          1317:     \tt FTG\_DESELECT& F-DESELECT\\
        !          1318:     \tt FTG\_DELETE&   F-DELETE\\
        !          1319:     \tt FTG\_END&      F-END-GROUP\\
        !          1320: \hline
        !          1321: \end{tabular}\]
        !          1322: 
        !          1323: \item[\verb"ftg\_select":]     an \verb"FTAMselect" structure;
        !          1324: 
        !          1325: \item[\verb"ftg\_create":]     an \verb"FTAMcreate" structure;
        !          1326: 
        !          1327: \item[\verb"ftg\_close":]      an \verb"FTAMclose" structure;
        !          1328: 
        !          1329: \item[\verb"ftg\_readattr":]   an \verb"FTAMreadattr" structure;
        !          1330: 
        !          1331: \item[\verb"ftg\_chngattr":]   an \verb"FTAMchngattr" structure;
        !          1332: 
        !          1333: \item[\verb"ftg\_deselect":]   an \verb"FTAMdeselect" structure;
        !          1334: 
        !          1335: \item[\verb"ftg\_delete":]     an \verb"FTAMdelete" structure;
        !          1336: and,
        !          1337: 
        !          1338: \item[\verb"ftg\_open":]       an \verb"FTAMopen" structure.
        !          1339: \end{describe}
        !          1340: The \verb"FTGFREE" macro can be used to free the storage associated with an
        !          1341: \verb"FTAMgroup" structure (without freeing the structure itself).
        !          1342: It behaves as if it was defined as:
        !          1343: \begin{quote}\index{FTGFREE}\small\begin{verbatim}
        !          1344: void    FTGFREE (ftg)
        !          1345: struct FTAMgroup *ftg;
        !          1346: \end{verbatim}\end{quote}
        !          1347: 
        !          1348: If the flag \verb"FTG_SELECT" is present,
        !          1349: then \verb"ftg_select" element contains an {\sf F-SELECT\/} event encoded in an
        !          1350: \verb"FTAMselect" structure:
        !          1351: \begin{quote}\index{FTAMselect}\small\begin{verbatim}
        !          1352: struct FTAMselect {
        !          1353:     int     ftse_state;
        !          1354:     int     ftse_action;
        !          1355: 
        !          1356:     struct FTAMattributes ftse_attrs;
        !          1357: 
        !          1358:     int            ftse_access;
        !          1359:     struct FTAMpasswords ftse_pwds;
        !          1360:     struct FTAMconcurrency ftse_conctl;
        !          1361: 
        !          1362:     PE      ftse_sharedASE;
        !          1363: 
        !          1364:     char   *ftse_account;
        !          1365: 
        !          1366:     int            ftse_ndiag;
        !          1367:     struct FTAMdiagnostic ftse_diags[NFDIAG];
        !          1368: };
        !          1369: \end{verbatim}\end{quote}
        !          1370: The elements of this structure are:
        !          1371: \begin{describe}
        !          1372: \item[\verb"ftse\_state":] the state result ({\sf .RESPONSE\/} only);
        !          1373: 
        !          1374: \item[\verb"ftse\_action":] the action result ({\sf .RESPONSE\/} only);
        !          1375: 
        !          1376: \item[\verb"ftse\_attrs":] file attributes;
        !          1377: 
        !          1378: \item[\verb"ftse\_access":] requested access,
        !          1379: containing the inclusive-or of any of the values
        !          1380: found in Table~\ref{FTAMaccess} ({\sf .REQUEST\/} only);
        !          1381: 
        !          1382: \item[\verb"ftse\_pwds":] access passwords ({\sf .REQUEST\/} only);
        !          1383: 
        !          1384: \item[\verb"ftse\_conctl":] concurrency control ({\sf .REQUEST\/} only);
        !          1385: 
        !          1386: \item[\verb"ftse\_sharedASE":] shared ASE information ({\sf .REQUEST\/} only);
        !          1387: 
        !          1388: \item[\verb"ftse\_account":] account ({\sf .REQUEST\/} only);
        !          1389: and,
        !          1390: 
        !          1391: \item[\verb"ftse\_diags"/\verb"ftse\_ndiag":] any diagnostic information
        !          1392: (and the number of diagnostics present, {\sf .RESPONSE\/} only).
        !          1393: \end{describe}
        !          1394: Note that the data contained in the structure was allocated via \man malloc(3),
        !          1395: and should be released with the \verb"FTSEFREE" macro when no longer needed.
        !          1396: The \verb"FTSEFREE" macro
        !          1397: behaves as if it was defined as:
        !          1398: \begin{quote}\index{FTSEFREE}\small\begin{verbatim}
        !          1399: void    FTSEFREE (ftse)
        !          1400: struct FTAMselect *ftse;
        !          1401: \end{verbatim}\end{quote}
        !          1402: The macro frees only the data allocated by \verb"FWaitRequest",
        !          1403: and not the \verb"FTAMselect" structure itself.
        !          1404: Note that the macro \verb"FTGFREE" when applied to the group,
        !          1405: will call \verb"FTSEFREE" as appropriate.
        !          1406: 
        !          1407: If the flag \verb"FTG_CREATE" is present,
        !          1408: then \verb"ftg_create" element contains an {\sf F-CREATE\/} event encoded in an
        !          1409: \verb"FTAMcreate" structure:
        !          1410: \begin{quote}\index{FTAMcreate}\small\begin{verbatim}
        !          1411: struct FTAMcreate {
        !          1412:     int     ftce_state;
        !          1413:     int     ftce_action;
        !          1414: 
        !          1415:     int     ftce_override;
        !          1416:     char   *ftce_create;
        !          1417:     int     ftce_crelen;
        !          1418: 
        !          1419:     struct FTAMattributes ftce_attrs;
        !          1420: 
        !          1421:     int     ftce_access;
        !          1422:     struct FTAMpasswords ftce_pwds;
        !          1423:     struct FTAMconcurrency ftce_conctl;
        !          1424: 
        !          1425:     PE      ftce_sharedASE;
        !          1426: 
        !          1427:     char   *ftce_account;
        !          1428: 
        !          1429:     int     ftce_ndiag;
        !          1430:     struct FTAMdiagnostic ftce_diags[NFDIAG];
        !          1431: };
        !          1432: \end{verbatim}\end{quote}
        !          1433: The elements of this structure are:
        !          1434: \begin{describe}
        !          1435: \item[\verb"ftce\_state":] the state result ({\sf .RESPONSE\/} only);
        !          1436: 
        !          1437: \item[\verb"ftce\_action":] the action result ({\sf .RESPONSE\/} only);
        !          1438: 
        !          1439: \item[\verb"ftce\_override":] the override setting, one of:
        !          1440: \[\begin{tabular}{|l|l|}
        !          1441: \hline
        !          1442:     \multicolumn{1}{|c|}{\bf Value}&
        !          1443:                \multicolumn{1}{c|}{\bf Meaning}\\
        !          1444: \hline
        !          1445:     \tt FOVER\_FAIL&           fail, if already exists\\
        !          1446:     \tt FOVER\_SELECT&         select, if already exists\\
        !          1447:     \tt FOVER\_WRITE&          zero-truncate, if already exists\\
        !          1448:     \tt FOVER\_DELETE&         delete, if already exists\\
        !          1449: \hline
        !          1450: \end{tabular}\]
        !          1451: ({\sf .REQUEST\/} only);
        !          1452: 
        !          1453: \item[\verb"ftce\_attrs":] file attributes;
        !          1454: 
        !          1455: \item[\verb"ftce\_create"/\verb"ftce\_crelen":] the
        !          1456: create password and its length, if any ({\sf .REQUEST\/} only);
        !          1457: 
        !          1458: \item[\verb"ftce\_access":] requested access,
        !          1459: containing the inclusive-or of any of the values
        !          1460: found in Table~\ref{FTAMaccess} ({\sf .REQUEST\/} only);
        !          1461: 
        !          1462: \item[\verb"ftce\_pwds":] access passwords ({\sf .REQUEST\/} only);
        !          1463: 
        !          1464: \item[\verb"ftce\_conctl":] concurrency control ({\sf .REQUEST\/} only);
        !          1465: 
        !          1466: \item[\verb"ftce\_sharedASE":] shared ASE information ({\sf .REQUEST\/} only);
        !          1467: 
        !          1468: \item[\verb"ftce\_account":] account ({\sf .REQUEST\/} only);
        !          1469: and,
        !          1470: 
        !          1471: \item[\verb"ftce\_diags"/\verb"ftce\_ndiag":] any diagnostic information
        !          1472: (and the number of diagnostics present, {\sf .RESPONSE\/} only).
        !          1473: \end{describe}
        !          1474: Note that the data contained in the structure was allocated via \man malloc(3),
        !          1475: and should be released with the \verb"FTCEFREE" macro when no longer needed.
        !          1476: The \verb"FTCEFREE" macro
        !          1477: behaves as if it was defined as:
        !          1478: \begin{quote}\index{FTCEFREE}\small\begin{verbatim}
        !          1479: void    FTCEFREE (ftce)
        !          1480: struct FTAMcreate *ftce;
        !          1481: \end{verbatim}\end{quote}
        !          1482: The macro frees only the data allocated by \verb"FWaitRequest",
        !          1483: and not the \verb"FTAMcreate" structure itself.
        !          1484: Note that the macro \verb"FTGFREE" when applied to the group,
        !          1485: will call \verb"FTCEFREE" as appropriate.
        !          1486: 
        !          1487: If the flag \verb"FTG_RDATTR" is present,
        !          1488: then \verb"ftg_readattr" element contains an {\sf F-READ-ATTRIB\/} event encoded in an
        !          1489: \verb"FTAMreadattr" structure:
        !          1490: \begin{quote}\index{FTAMreadattr}\small\begin{verbatim}
        !          1491: struct FTAMreadattr {
        !          1492:     int     ftra_action;
        !          1493: 
        !          1494:     int     ftra_attrnames;
        !          1495: 
        !          1496:     struct FTAMattributes ftra_attrs;
        !          1497:     int     ftra_ndiag;
        !          1498:     struct FTAMdiagnostic ftra_diags[NFDIAG];
        !          1499: };
        !          1500: \end{verbatim}\end{quote}
        !          1501: The elements of this structure are:
        !          1502: \begin{describe}
        !          1503: \item[\verb"ftra\_action":] the action result ({\sf .RESPONSE\/} only);
        !          1504: 
        !          1505: \item[\verb"ftra\_attrnames":] the attributes to read,
        !          1506: containing the inclusive-or of any of the values shown in
        !          1507: Table~\ref{FTAMattributes} on page~\pageref{FTAMattributes}
        !          1508: ({\sf .REQUEST\/} only);
        !          1509: 
        !          1510: \item[\verb"ftra\_attrs":] the attribute values
        !          1511: ({\sf .RESPONSE\/} only);
        !          1512: and,
        !          1513: 
        !          1514: \item[\verb"ftra\_diags"/\verb"ftra\_ndiag":] any diagnostic information
        !          1515: (and the number of diagnostics present, {\sf .RESPONSE\/} only).
        !          1516: \end{describe}
        !          1517: Note that the data contained in the structure was allocated via \man malloc(3),
        !          1518: and should be released with the \verb"FTRAFREE" macro when no longer needed.
        !          1519: The \verb"FTRAFREE" macro
        !          1520: behaves as if it was defined as:
        !          1521: \begin{quote}\index{FTRAFREE}\small\begin{verbatim}
        !          1522: void    FTRAFREE (ftra)
        !          1523: struct FTAMreadattr *ftra;
        !          1524: \end{verbatim}\end{quote}
        !          1525: The macro frees only the data allocated by \verb"FWaitRequest",
        !          1526: and not the \verb"FTAMreadattr" structure itself.
        !          1527: Note that the macro \verb"FTGFREE" when applied to the group,
        !          1528: will call \verb"FTRAFREE" as appropriate.
        !          1529: 
        !          1530: If the flag \verb"FTG_CHNGATTR" is present,
        !          1531: then \verb"ftg_chngattr" element contains an {\sf F-CHANGE-ATTRIB\/} event encoded in
        !          1532: an \verb"FTAMchngattr" structure:
        !          1533: \begin{quote}\index{FTAMchngattr}\small\begin{verbatim}
        !          1534: struct FTAMchngattr {
        !          1535:     int ftca_action;
        !          1536: 
        !          1537:     struct FTAMattributes ftca_attrs;
        !          1538: 
        !          1539:     int     ftca_ndiag;
        !          1540:     struct FTAMdiagnostic ftca_diags[NFDIAG];
        !          1541: };
        !          1542: \end{verbatim}\end{quote}
        !          1543: The elements of this structure are:
        !          1544: \begin{describe}
        !          1545: \item[\verb"ftca\_action":] the action result ({\sf .RESPONSE\/} only);
        !          1546: 
        !          1547: \item[\verb"ftca\_attrs":] the attribute values to change
        !          1548: (in a {\sf .REQUEST\/}),
        !          1549: and possibly the new values (in a {\sf .RESPONSE\/});
        !          1550: and,
        !          1551: 
        !          1552: \item[\verb"ftca\_diags"/\verb"ftca\_ndiag":] any diagnostic information
        !          1553: (and the number of diagnostics present, {\sf .RESPONSE\/} only).
        !          1554: \end{describe}
        !          1555: Note that the data contained in the structure was allocated via \man malloc(3),
        !          1556: and should be released with the \verb"FTCAFREE" macro when no longer needed.
        !          1557: The \verb"FTCAFREE" macro
        !          1558: behaves as if it was defined as:
        !          1559: \begin{quote}\index{FTCAFREE}\small\begin{verbatim}
        !          1560: void    FTCAFREE (ftca)
        !          1561: struct FTAMchngattr *ftca;
        !          1562: \end{verbatim}\end{quote}
        !          1563: The macro frees only the data allocated by \verb"FWaitRequest",
        !          1564: and not the \verb"FTAMchngattr" structure itself.
        !          1565: Note that the macro \verb"FTGFREE" when applied to the group,
        !          1566: will call \verb"FTCAFREE" as appropriate.
        !          1567: 
        !          1568: If the flag \verb"FTG_OPEN" is present,
        !          1569: then \verb"ftg_open" element contains an {\sf F-OPEN\/} event encoded in an
        !          1570: \verb"FTAMopen" structure:
        !          1571: \begin{quote}\index{FTAMopen}\small\begin{verbatim}
        !          1572: struct FTAMopen {
        !          1573:     int     ftop_state;
        !          1574:     int     ftop_action;
        !          1575: 
        !          1576:     int     ftop_mode;
        !          1577: 
        !          1578:     OID     ftop_contents;
        !          1579:     PE      ftop_parameter;
        !          1580:     struct FTAMconcurrency ftop_conctl;
        !          1581:     PE      ftop_sharedASE;
        !          1582: 
        !          1583:     int     ftop_locking;
        !          1584: 
        !          1585:     int     ftop_ndiag;
        !          1586:     struct FTAMdiagnostic ftop_diags[NFDIAG];
        !          1587: };
        !          1588: \end{verbatim}\end{quote}
        !          1589: The elements of this structure are:
        !          1590: \begin{describe}
        !          1591: \item[\verb"ftop\_state":] the state result ({\sf .RESPONSE\/} only);
        !          1592: 
        !          1593: \item[\verb"ftop\_action":] the action result ({\sf .RESPONSE\/} only);
        !          1594: 
        !          1595: \item[\verb"ftop\_mode":] the processing mode,
        !          1596: containing the inclusive-or of any of the values shown in
        !          1597: Table~\ref{FTAMaccess} on page~\pageref{FTAMaccess}
        !          1598: ({\sf .REQUEST\/} only);
        !          1599: 
        !          1600: \item[\verb"ftop\_contents"/\verb"ftop\_parameter":] the contents type;
        !          1601: 
        !          1602: \item[\verb"ftop\_conctl":] concurrency control;
        !          1603: 
        !          1604: \item[\verb"ftop\_sharedASE":] shared ASE information;
        !          1605: 
        !          1606: \item[\verb"ftop\_locking":] enable FADU locking ({\sf .REQUEST\/} only);
        !          1607: and,
        !          1608: 
        !          1609: \item[\verb"ftop\_diags"/\verb"ftop\_ndiag":] any diagnostic information
        !          1610: (and the number of diagnostics present, {\sf .RESPONSE\/} only).
        !          1611: \end{describe}
        !          1612: Note that the data contained in the structure was allocated via \man malloc(3),
        !          1613: and should be released with the \verb"FTOPFREE" macro when no longer needed.
        !          1614: The \verb"FTOPFREE" macro
        !          1615: behaves as if it was defined as:
        !          1616: \begin{quote}\index{FTOPFREE}\small\begin{verbatim}
        !          1617: void    FTOPFREE (ftop)
        !          1618: struct FTAMopen *ftop;
        !          1619: \end{verbatim}\end{quote}
        !          1620: The macro frees only the data allocated by \verb"FWaitRequest",
        !          1621: and not the \verb"FTAMopen" structure itself.
        !          1622: Note that the macro \verb"FTGFREE" when applied to the group,
        !          1623: will call \verb"FTOPFREE" as appropriate.
        !          1624: 
        !          1625: If the flag \verb"FTG_CLOSE" is present,
        !          1626: then \verb"ftg_close" element contains an {\sf F-CLOSE\/} event encoded in an
        !          1627: \verb"FTAMclose" structure:
        !          1628: \begin{quote}\index{FTAMclose}\small\begin{verbatim}
        !          1629: struct FTAMclose {
        !          1630:     int     ftcl_action;
        !          1631: 
        !          1632:     PE      ftcl_sharedASE;
        !          1633: 
        !          1634:     int     ftcl_ndiag;
        !          1635:     struct FTAMdiagnostic   ftcl_diags[NFDIAG];
        !          1636: };
        !          1637: \end{verbatim}\end{quote}
        !          1638: The elements of this structure are:
        !          1639: \begin{describe}
        !          1640: \item[\verb"ftcl\_action":] the action result;
        !          1641: 
        !          1642: \item[\verb"ftcl\_sharedASE":] shared ASE information;
        !          1643: and,
        !          1644: 
        !          1645: \item[\verb"ftcl\_diags"/\verb"ftcl\_ndiag":] any diagnostic information
        !          1646: (and the number of diagnostics present).
        !          1647: \end{describe}
        !          1648: Note that the data contained in the structure was allocated via \man malloc(3),
        !          1649: and should be released with the \verb"FTCLFREE" macro when no longer needed.
        !          1650: The \verb"FTCLFREE" macro
        !          1651: behaves as if it was defined as:
        !          1652: \begin{quote}\index{FTCLFREE}\small\begin{verbatim}
        !          1653: void    FTCLFREE (ftcl)
        !          1654: struct FTAMclose *ftcl;
        !          1655: \end{verbatim}\end{quote}
        !          1656: The macro frees only the data allocated by \verb"FWaitRequest",
        !          1657: and not the \verb"FTAMclose" structure itself.
        !          1658: Note that the macro \verb"FTGFREE" when applied to the group,
        !          1659: will call \verb"FTCLFREE" as appropriate.
        !          1660: 
        !          1661: If the flag \verb"FTG_DESELECT" is present,
        !          1662: then \verb"ftg_deselect" element contains an {\sf F-DESELECT\/} event encoded in an
        !          1663: \verb"FTAMdeselect" structure:
        !          1664: \begin{quote}\index{FTAMdeselect}\small\begin{verbatim}
        !          1665: struct FTAMdeselect {
        !          1666:     int     ftde_action;
        !          1667: 
        !          1668:     PE      ftde_sharedASE;
        !          1669: 
        !          1670:     struct FTAMcharging ftde_charges;
        !          1671:     int     ftde_ndiag;
        !          1672:     struct FTAMdiagnostic   ftde_diags[NFDIAG];
        !          1673: };
        !          1674: \end{verbatim}\end{quote}
        !          1675: The elements of this structure are:
        !          1676: \begin{describe}
        !          1677: \item[\verb"ftde\_action":] the action result ({\sf .RESPONSE\/} only);
        !          1678: 
        !          1679: \item[\verb"ftde\_sharedASE":] shared ASE information;
        !          1680: 
        !          1681: \item[\verb"ftde\_charges":] any charges ({\sf .RESPONSE\/} only);
        !          1682: and,
        !          1683: 
        !          1684: \item[\verb"ftde\_diags"/\verb"ftde\_ndiag":] any diagnostic information
        !          1685: (and the number of diagnostics present, {\sf .RESPONSE\/} only).
        !          1686: \end{describe}
        !          1687: Note that the data contained in the structure was allocated via \man malloc(3),
        !          1688: and should be released with the \verb"FTDEFREE" macro when no longer needed.
        !          1689: The \verb"FTDEFREE" macro
        !          1690: behaves as if it was defined as:
        !          1691: \begin{quote}\index{FTDEFREE}\small\begin{verbatim}
        !          1692: void    FTDEFREE (ftde)
        !          1693: struct FTAMdeselect *ftde;
        !          1694: \end{verbatim}\end{quote}
        !          1695: The macro frees only the data allocated by \verb"FWaitRequest",
        !          1696: and not the \verb"FTAMdeselect" structure itself.
        !          1697: Note that the macro \verb"FTGFREE" when applied to the group,
        !          1698: will call \verb"FTDEFREE" as appropriate.
        !          1699: 
        !          1700: If the flag \verb"FTG_DELETE" is present,
        !          1701: then \verb"ftg_delete" element contains an {\sf F-DELETE\/} event encoded in an
        !          1702: \verb"FTAMdelete" structure:
        !          1703: \begin{quote}\index{FTAMdelete}\small\begin{verbatim}
        !          1704: struct FTAMdelete {
        !          1705:     int     ftxe_action;
        !          1706:     
        !          1707:     PE      ftxe_sharedASE;
        !          1708: 
        !          1709:     struct FTAMcharging ftxe_charges;
        !          1710:     int     ftxe_ndiag;
        !          1711:     struct FTAMdiagnostic   ftxe_diags[NFDIAG];
        !          1712: };
        !          1713: \end{verbatim}\end{quote}
        !          1714: The elements of this structure are:
        !          1715: \begin{describe}
        !          1716: \item[\verb"ftxe\_action":] the action result ({\sf .RESPONSE\/} only);
        !          1717: 
        !          1718: \item[\verb"ftxe\_sharedASE":] shared ASE information;
        !          1719: 
        !          1720: \item[\verb"ftxe\_charges":] any charges ({\sf .RESPONSE\/} only);
        !          1721: and,
        !          1722: 
        !          1723: \item[\verb"ftxe\_diags"/\verb"ftxe\_ndiag":] any diagnostic information
        !          1724: (and the number of diagnostics present, {\sf .RESPONSE\/} only).
        !          1725: \end{describe}
        !          1726: Note that the data contained in the structure was allocated via \man malloc(3),
        !          1727: and should be released with the \verb"FTXEFREE" macro when no longer needed.
        !          1728: The \verb"FTXEFREE" macro
        !          1729: behaves as if it was defined as:
        !          1730: \begin{quote}\index{FTXEFREE}\small\begin{verbatim}
        !          1731: void    FTXEFREE (ftxe)
        !          1732: struct FTAMdeltee *ftxe;
        !          1733: \end{verbatim}\end{quote}
        !          1734: The macro frees only the data allocated by \verb"FWaitRequest",
        !          1735: and not the \verb"FTAMdelete" structure itself.
        !          1736: Note that the macro \verb"FTGFREE" when applied to the group,
        !          1737: will call \verb"FTXEFREE" as appropriate.
        !          1738: 
        !          1739: \subsubsection {Access Indications}
        !          1740: When an event associated with file access occurs,
        !          1741: the \verb"fti_type" field of the \verb"fti" parameter contains the value
        !          1742: \verb"FTI_ACCESS".
        !          1743: Further,
        !          1744: an \verb"FTAMaccess" structure is contained inside the \verb"fti" parameter,
        !          1745: indicating an {\sf F-LOCATE\/} or {\sf F-ERASE\/} event.
        !          1746: \begin{quote}\index{FTAMaccess}\small\begin{verbatim}
        !          1747: struct FTAMaccess {
        !          1748:     int            ftac_operation;
        !          1749: 
        !          1750:     int            ftac_action;
        !          1751: 
        !          1752:     struct FADUidentity ftac_identity;
        !          1753: 
        !          1754:     int     ftac_locking;
        !          1755: 
        !          1756:     int     ftac_ndiag;
        !          1757:     struct FTAMdiagnostic   ftac_diags[NFDIAG];
        !          1758: };
        !          1759: \end{verbatim}\end{quote}
        !          1760: The elements of this structure are:
        !          1761: \begin{describe}
        !          1762: \item[\verb"ftac\_operation":] the operation,
        !          1763: one of the values shown in Table~\ref{FTAMaccessops};
        !          1764: 
        !          1765: \item[\verb"ftac\_action":] the action result ({\sf .CONFIRMATION\/} only);
        !          1766: 
        !          1767: \item[\verb"ftac\_identity":] the FADU identity
        !          1768: (either {\sf .INDICATION\/} and optionally on {\sf F-LOCATE.CONFIRMATION\/});
        !          1769: 
        !          1770: \item[\verb"ftac\_locking":] FADU locked ({\sf F-LOCATE.INDICATION\/} only);
        !          1771: and,
        !          1772: 
        !          1773: \item[\verb"ftac\_diags"/\verb"ftac\_ndiag":] any diagnostic information
        !          1774: (and the number of diagnostics present, {\sf .CONFIRMATION\/} only).
        !          1775: \end{describe}
        !          1776: Note that the data contained in the structure was allocated via \man malloc(3),
        !          1777: and should be released with the \verb"FTACFREE" macro when no longer needed.
        !          1778: The \verb"FTACFREE" macro
        !          1779: behaves as if it was defined as:
        !          1780: \begin{quote}\index{FTACFREE}\small\begin{verbatim}
        !          1781: void    FTACFREE (ftac)
        !          1782: struct FTAMaccess *ftac;
        !          1783: \end{verbatim}\end{quote}
        !          1784: The macro frees only the data allocated by \verb"FWaitRequest",
        !          1785: and not the \verb"FTAMaccess" structure itself.
        !          1786: \tagtable[tp]{ftam-5}{FTAM Access Operations}{FTAMaccessops}
        !          1787: 
        !          1788: \subsubsection {Read/Write Indications}
        !          1789: When an event associated with the beginning of bulk data transfer occurs,
        !          1790: the \verb"fti_type" field of the \verb"fti" parameter contains the value
        !          1791: \verb"FTI_READWRITE".
        !          1792: Further,
        !          1793: an \verb"FTAMreadwrite" structure is contained inside the \verb"fti" parameter,
        !          1794: indicating an {\sf F-READ.INDICATION\/} or {\sf F-WRITE.INDICATION\/} event.
        !          1795: \begin{quote}\index{FTAMreadwrite}\small\begin{verbatim}
        !          1796: struct FTAMreadwrite {
        !          1797:     int     ftrw_operation;
        !          1798: 
        !          1799:     struct FADUidentity ftrw_identity;
        !          1800: 
        !          1801:     int     ftrw_context;
        !          1802:     int     ftrw_level;
        !          1803: 
        !          1804:     int     ftrw_locking;
        !          1805: };
        !          1806: \end{verbatim}\end{quote}
        !          1807: The elements of this structure are:
        !          1808: \begin{describe}
        !          1809: \item[\verb"ftrw\_operation":] the operation,
        !          1810: one of the values shown in Table~\ref{FTAMdataops};
        !          1811: 
        !          1812: \item[\verb"ftrw\_identity":] the FADU identity;
        !          1813: 
        !          1814: \item[\verb"ftrw\_context"/\verb"ftrw\_level":] the access context,
        !          1815: one of the values shown in Table~\ref{FTAMcontexts}
        !          1816: ({\sf F-READ.INDICATION\/} only);
        !          1817: and,
        !          1818: 
        !          1819: \item[\verb"ftrw\_locking":] FADU locked.
        !          1820: \end{describe}
        !          1821: Note that the data contained in the structure was allocated via \man malloc(3),
        !          1822: and should be released with the \verb"FTRWFREE" macro when no longer needed.
        !          1823: The \verb"FTRWFREE" macro
        !          1824: behaves as if it was defined as:
        !          1825: \begin{quote}\index{FTRWFREE}\small\begin{verbatim}
        !          1826: void    FTRWFREE (ftrw)
        !          1827: struct FTAMreadwrite *ftrw;
        !          1828: \end{verbatim}\end{quote}
        !          1829: The macro frees only the data allocated by \verb"FWaitRequest",
        !          1830: and not the \verb"FTAMreadwrite" structure itself.
        !          1831: \tagtable[tp]{ftam-4}{FTAM Data Operations}{FTAMdataops}
        !          1832: \tagtable[tp]{ftam-3}{FTAM Access Contexts}{FTAMcontexts}
        !          1833: 
        !          1834: \subsubsection {Data Indications}\label{ftam:data}
        !          1835: When an event associated with user data occurs,
        !          1836: the \verb"fti_type" field of the \verb"fti" parameter contains the value
        !          1837: \verb"FTI_DATA",
        !          1838: and an \verb"PSAPdata" structure
        !          1839: (described in Chapter~\ref{libpsap2} of \voltwo/)
        !          1840: is contained inside the \verb"fti" parameter,
        !          1841: indicating an {\sf F-DATA.INDICATION\/} event.
        !          1842: To distinguish between structure and contents,
        !          1843: FTAM uses different presentation context identifiers.
        !          1844: If the \verb"pe_context" field of any presentation element contains the value
        !          1845: \verb"PE_DFLT_CONTEXT",
        !          1846: then the element contains structuring information in the FTAM PCI,
        !          1847: and the \verb"pe_id" element should be consulted to determine the particular
        !          1848: structuring information being conveyed:
        !          1849: \[\begin{tabular}{|l|l|}
        !          1850: \hline
        !          1851:     \multicolumn{1}{|c|}{\bf Value}&
        !          1852:                \multicolumn{1}{c|}{\bf Meaning}\\
        !          1853: \hline
        !          1854:     \tt FADU\_NODESCR&         node descriptor data element\\
        !          1855:     \tt FADU\_ENTERTREE&       enter subtree data element\\
        !          1856:     \tt FADU\_EXITREE&         exit subtree data element\\
        !          1857: \hline
        !          1858: \end{tabular}\]
        !          1859: Otherwise,
        !          1860: the element contains file contents as defined in the PCI for the
        !          1861: document type being transferred.
        !          1862: 
        !          1863: \subsubsection {Data End Indication}
        !          1864: When an event associated with the end of bulk data transfer occurs,
        !          1865: the \verb"fti_type" field of the \verb"fti" parameter contains the value
        !          1866: \verb"FTI_DATAEND".
        !          1867: Further,
        !          1868: an \verb"FTAMdataend" structure is contained inside the \verb"fti" parameter,
        !          1869: indicating an {\sf F-DATA-END.INDICATION\/} event.
        !          1870: \begin{quote}\index{FTAMdataend}\small\begin{verbatim}
        !          1871: struct FTAMdataend {
        !          1872:     int     ftda_action;
        !          1873: 
        !          1874:     int     ftda_ndiag;
        !          1875:     struct FTAMdiagnostic   ftda_diags[NFDIAG];
        !          1876: };
        !          1877: \end{verbatim}\end{quote}
        !          1878: The elements of this structure are:
        !          1879: \begin{describe}
        !          1880: \item[\verb"ftda\_action":] the action result;
        !          1881: and,
        !          1882: 
        !          1883: \item[\verb"ftda\_diags"/\verb"ftda\_ndiag":] any diagnostic information
        !          1884: (and the number of diagnostics present).
        !          1885: \end{describe}
        !          1886: 
        !          1887: \subsubsection {Cancel Indications}
        !          1888: When an event associated with the cancellation of bulk data transfer occurs,
        !          1889: the \verb"fti_type" field of the \verb"fti" parameter contains the value
        !          1890: \verb"FTI_CANCEL".
        !          1891: Further,
        !          1892: an \verb"FTAMcancel" structure is contained inside the \verb"fti" parameter,
        !          1893: indicating an {\sf F-CANCEL\/} event.
        !          1894: \begin{quote}\index{FTAMcancel}\small\begin{verbatim}
        !          1895: struct FTAMcancel {
        !          1896:     int     ftcn_action;
        !          1897: 
        !          1898:     PE      ftcn_sharedASE;
        !          1899: 
        !          1900:     int     ftcn_ndiag;
        !          1901:     struct FTAMdiagnostic   ftcn_diags[NFDIAG];
        !          1902: };
        !          1903: \end{verbatim}\end{quote}
        !          1904: The elements of this structure are:
        !          1905: \begin{describe}
        !          1906: \item[\verb"ftcn\_action":] the action result;
        !          1907: 
        !          1908: \item[\verb"ftcn\_sharedASE":] shared ASE information;
        !          1909: and,
        !          1910: 
        !          1911: \item[\verb"ftcn\_diags"/\verb"ftcn\_ndiag":] any diagnostic information
        !          1912: (and the number of diagnostics present).
        !          1913: \end{describe}
        !          1914: Note that the data contained in the structure was allocated via \man malloc(3),
        !          1915: and should be released with the \verb"FTCNFREE" macro when no longer needed.
        !          1916: The \verb"FTCNFREE" macro
        !          1917: behaves as if it was defined as:
        !          1918: \begin{quote}\index{FTCNFREE}\small\begin{verbatim}
        !          1919: void    FTCNFREE (ftcn)
        !          1920: struct FTAMcancel *ftcn;
        !          1921: \end{verbatim}\end{quote}
        !          1922: The macro frees only the data allocated by \verb"FWaitRequest",
        !          1923: and not the \verb"FTAMcancel" structure itself.
        !          1924: 
        !          1925: \subsubsection {Transfer End Indications}
        !          1926: When an event associated with the termination of bulk data transfer occurs,
        !          1927: the \verb"fti_type" field of the \verb"fti" parameter contains the value
        !          1928: \verb"FTI_TRANSEND".
        !          1929: Further,
        !          1930: an \verb"FTAMtransend" structure is contained inside the \verb"fti" parameter,
        !          1931: indicating an {\sf F-TRANSFER-END\/} event.
        !          1932: \begin{quote}\index{FTAMtransend}\small\begin{verbatim}
        !          1933: struct FTAMtransend {
        !          1934:     int     ftre_action;
        !          1935: 
        !          1936:     PE      ftre_sharedASE;
        !          1937: 
        !          1938:     int     ftre_ndiag;
        !          1939:     struct FTAMdiagnostic   ftre_diags[NFDIAG];
        !          1940: };
        !          1941: \end{verbatim}\end{quote}
        !          1942: The elements of this structure are:
        !          1943: \begin{describe}
        !          1944: \item[\verb"ftre\_action":] the action result ({\sf .RESPONSE\/} only);
        !          1945: 
        !          1946: \item[\verb"ftre\_sharedASE":] shared ASE information;
        !          1947: and,
        !          1948: 
        !          1949: \item[\verb"ftre\_diags"/\verb"ftre\_ndiag":] any diagnostic information
        !          1950: (and the number of diagnostics present, {\sf .RESPONSE\/} only).
        !          1951: \end{describe}
        !          1952: Note that the data contained in the structure was allocated via \man malloc(3),
        !          1953: and should be released with the \verb"FTREFREE" macro when no longer needed.
        !          1954: The \verb"FTREFREE" macro
        !          1955: behaves as if it was defined as:
        !          1956: \begin{quote}\index{FTREFREE}\small\begin{verbatim}
        !          1957: void    FTREFREE (ftre)
        !          1958: struct FTAMtransend *ftre;
        !          1959: \end{verbatim}\end{quote}
        !          1960: The macro frees only the data allocated by \verb"FWaitRequest",
        !          1961: and not the \verb"FTAMtransend" structure itself.
        !          1962: 
        !          1963: \subsection    {Asynchronous Event Handling}
        !          1964: Thus far the discussion on event handling has been synchronous in nature.
        !          1965: Some users of FTAM may wish an asynchronous interface.
        !          1966: The \verb"FSetIndications" routine is used to change the service associated
        !          1967: with an association-descriptor to or from an asynchronous interface.
        !          1968: \begin{quote}\index{FSetIndications}\small\begin{verbatim}
        !          1969: int     FSetIndications (sd, indication, fti)
        !          1970: int     sd;
        !          1971: int   (*indication) ();
        !          1972: struct FTAMindication  *fti;
        !          1973: \end{verbatim}\end{quote}
        !          1974: The parameters to this procedure are:
        !          1975: \begin{describe}
        !          1976: \item[\verb"sd":] the association-descriptor;
        !          1977: 
        !          1978: \item[\verb"indication":] the address of an event-handler routine to be
        !          1979: invoked when an indication occurs;
        !          1980: and,
        !          1981: 
        !          1982: \item[\verb"fti":] a pointer to an \verb"FTAMindication" structure, which is
        !          1983: updated only if the call fails.
        !          1984: \end{describe}
        !          1985: If the service is to be made asynchronous,
        !          1986: then the event handler is specified,
        !          1987: otherwise,
        !          1988: if the service is to be made synchronous,
        !          1989: then the handler should not be specified
        !          1990: (use the manifest constant \verb"NULLIFP").
        !          1991: The most likely reason for the call failing is \verb"FS_GEN_WAITING",
        !          1992: which indicates that an event is waiting for the user.
        !          1993: 
        !          1994: When an event-handler is invoked,
        !          1995: future invocations of the event-hander are blocked until it returns.
        !          1996: The return value of the event-handler is ignored.
        !          1997: Further,
        !          1998: during the execution of a synchronous call to the library,
        !          1999: the event-handler will be blocked from being invoked.
        !          2000: 
        !          2001: When an event occurs,
        !          2002: the event-handler routine is invoked with two parameters:
        !          2003: \begin{quote}\small\begin{verbatim}
        !          2004: (*indication) (sd, fti);
        !          2005: int     sd;
        !          2006: struct FTAMindication *fti;
        !          2007: \end{verbatim}\end{quote}
        !          2008: The parameters are:
        !          2009: \begin{describe}
        !          2010: \item[\verb"sd":] the association-descriptor;
        !          2011: and,
        !          2012: 
        !          2013: \item[\verb"fti":] a pointer to the \verb"FTAMindication" structure containing
        !          2014: the indication.
        !          2015: \end{describe}
        !          2016: 
        !          2017: \[\fbox{\begin{tabular}{lp{0.8\textwidth}}
        !          2018: \bf NOTE:&     The \man libftam(3n) library uses the SIGEMT signal to provide
        !          2019:                these services.
        !          2020:                Programs using asynchronous association-descriptors should NOT
        !          2021:                use SIGEMT for other purposes.
        !          2022: \end{tabular}}\]
        !          2023: 
        !          2024: \subsection    {Synchronous Event Multiplexing}
        !          2025: A user of FTAM may wish to manage multiple
        !          2026: association-descriptors simultaneously;
        !          2027: the routine \verb"FSelectMask" is provided for this purpose.
        !          2028: This routine updates a file-descriptor mask and associated counter for use
        !          2029: with \verb"xselect".
        !          2030: \begin{quote}\index{FSelectMask}\small\begin{verbatim}
        !          2031: int     FSelectMask (sd, mask, nfds, fti)
        !          2032: int     sd;
        !          2033: fd_set *mask;
        !          2034: int    *nfds;
        !          2035: struct FTAMindication  *fti;
        !          2036: \end{verbatim}\end{quote}
        !          2037: The parameters to this procedure are:
        !          2038: \begin{describe}
        !          2039: \item[\verb"sd":] the association-descriptor;
        !          2040: 
        !          2041: \item[\verb"mask":] a pointer to a file-descriptor mask meaningful to
        !          2042: \verb"xselect";
        !          2043: 
        !          2044: \item[\verb"nfds":] a pointer to an integer-valued location meaningful to
        !          2045: \verb"xselect";
        !          2046: and,
        !          2047: 
        !          2048: \item[\verb"fti":] a pointer to an \verb"FTAMindication" structure, which is updated
        !          2049: only if the call fails.
        !          2050: \end{describe}
        !          2051: If the call is successful, then the \verb"mask" and \verb"nfds" parameters can
        !          2052: be used as arguments to \verb"xselect".
        !          2053: The most likely reason for the call failing is \verb"FS_GEN_WAITING",
        !          2054: which indicates that an event is waiting for the user.
        !          2055: 
        !          2056: If \verb"xselect" indicates that the association-descriptor is ready for
        !          2057: reading,
        !          2058: \verb"FWaitRequest" should be called with the \verb"secs" parameter equal to
        !          2059: \verb"OK".
        !          2060: If the network activity does not constitute an entire event for the user,
        !          2061: then \verb"FWaitRequest" will return \verb"NOTOK" with error code
        !          2062: \verb"FS_PRO_TIMEOUT".
        !          2063: 
        !          2064: \subsection    {Tracing}\label{ftam:tracing}
        !          2065: Users may wish to trace FTAM events as they are processed.
        !          2066: The routine \verb"FHookRequest" is used to set (or unset) the user-defined
        !          2067: tracing routine.
        !          2068: \begin{quote}\index{FHookRequest}\small\begin{verbatim}
        !          2069: int     FHookRequest (sd, tracing, fti)
        !          2070: int     sd;
        !          2071: int   (*tracing) ();
        !          2072: \end{verbatim}\end{quote}
        !          2073: The parameters to this procedure are:
        !          2074: \begin{describe}
        !          2075: \item[\verb"sd":] the association-descriptor;
        !          2076: 
        !          2077: \item[\verb"tracing":] the address of a tracing routine to be invoked when an
        !          2078: FTAM event occurs;
        !          2079: and,
        !          2080: 
        !          2081: \item[\verb"fti":] a pointer to an \verb"FTAMindication" structure, which is updated
        !          2082: only if the call fails.
        !          2083: \end{describe}
        !          2084: If tracing is to be enabled,
        !          2085: then the tracing routine is specified,
        !          2086: otherwise,
        !          2087: if tracing is to be turned off, the manifest constant \verb"NULLIFP" should
        !          2088: be used.
        !          2089: 
        !          2090: When an event occurs,
        !          2091: the tracing routine is invoked with five parameters:
        !          2092: \begin{quote}\small\begin{verbatim}
        !          2093: (*tracing) (sd, event, fpdu, pe, rw)
        !          2094: \end{verbatim}\end{quote}
        !          2095: The parameters are:
        !          2096: \begin{describe}
        !          2097: \item[\verb"sd":] the association-descriptor;
        !          2098: 
        !          2099: \item[\verb"event":] the name of the underlying service primitive
        !          2100: (association control or presentation) associated with the FTAM event;
        !          2101: 
        !          2102: \item[\verb"fpdu":] the name of the FTAM PDU, if any;
        !          2103: 
        !          2104: \item[\verb"pe":] a presentation element containing the FTAM PDU
        !          2105: associated with the FTAM event
        !          2106: (described in Chapter~\ref{libpsap} of \volone/), if any;
        !          2107: and,
        !          2108: 
        !          2109: \item[\verb"rw":] a flag saying whether the event is being initiated (zero)
        !          2110: or being received (non-zero).
        !          2111: \end{describe}
        !          2112: The return value of the tracing routine is ignored.
        !          2113: 
        !          2114: One pre-defined tracing routine is available, \verb"FTraceHook"
        !          2115: \index{FHookRequest},
        !          2116: which simply appends tracing information to the log determined by
        !          2117: \begin{quote}\index{ftamfile}\small\begin{verbatim}
        !          2118: LLog *ftam_log;
        !          2119: \end{verbatim}\end{quote}
        !          2120: See Chapter~\ref{logging} in \voltwo/ for all the details.
        !          2121: 
        !          2122: \section      {Grouped Operations: File Transfer}
        !          2123: The \verb"FBulkBeginRequest" routine is used to issue a grouped file transfer
        !          2124: request consisting of:
        !          2125: \begin{itemize}
        !          2126: \item  {\sf F-BEGIN-GROUP.REQUEST\/};
        !          2127: 
        !          2128: \item  {\sf F-SELECT.REQUEST\/} or {\sf F-CREATE.REQUEST\/};
        !          2129: 
        !          2130: \item  optionally, {\sf F-READ-ATTRIB.REQUEST\/};
        !          2131: 
        !          2132: \item  optionally, {\sf F-CHANGE-ATTRIB.REQUEST\/};
        !          2133: 
        !          2134: \item  {\sf F-OPEN.REQUEST\/};
        !          2135: and,
        !          2136: 
        !          2137: \item  {\sf F-END-GROUP.REQUEST}.
        !          2138: \end{itemize}
        !          2139: The user initializes an \verb"FTAMgroup" structure
        !          2140: (described in tedious detail on page~\pageref{FTAMgroup})
        !          2141: and then invokes \verb"FBulkRequest".
        !          2142: \begin{quote}\index{FBulkRequest}\small\begin{verbatim}
        !          2143: int     FBulkRequest (sd, ftg, fti)
        !          2144: int     sd;
        !          2145: struct FTAMgroup *ftg;
        !          2146: struct FTAMindication *fti;
        !          2147: \end{verbatim}\end{quote}
        !          2148: The parameters to this procedure are:
        !          2149: \begin{describe}
        !          2150: \item[\verb"sd":] the association-descriptor;
        !          2151: 
        !          2152: \item[\verb"ftg":] a pointer to an \verb"FTAMgroup" structure;
        !          2153: and,
        !          2154: 
        !          2155: \item[\verb"fti":] a pointer to an \verb"FTAMindication" structure, which is
        !          2156: always updated.
        !          2157: \end{describe}
        !          2158: If the call to \verb"FBulkBeginRequest" is successful,
        !          2159: then this corresponds to the appropriate {\sf .CONFIRMATION\/} events,
        !          2160: the \verb"fti_type" element of the \verb"fti" parameter is set to
        !          2161: \verb"FTI_BULKBEGIN",
        !          2162: and the \verb"fti_group" element contains the results.
        !          2163: Note that the data contained in the structure was allocated via \man malloc(3),
        !          2164: and should be released with the \verb"FTGFREE" macro when no longer needed.
        !          2165: 
        !          2166: Otherwise if the call fails,
        !          2167: the \verb"FTAMabort" structure contained in the
        !          2168: \verb"FTAMindication" parameter \verb"fti" contains the reason for the failure.
        !          2169: 
        !          2170: Upon receiving an \verb"FTI_BULKBEGIN" indication,
        !          2171: containing the appropriate {\sf .INDICATION\/} events,
        !          2172: the responder is required to generate the appropriate {\sf .RESPONSE\/}
        !          2173: events using the \verb"FBulkBeginResponse" routine.
        !          2174: \begin{quote}\index{FBulkResponse}\small\begin{verbatim}
        !          2175: int     FBulkBeginResponse (sd, ftg, fti)
        !          2176: int     sd;
        !          2177: struct FTAMgroup *ftg;
        !          2178: struct FTAMindication *fti;
        !          2179: \end{verbatim}\end{quote}
        !          2180: The parameters to this procedure are:
        !          2181: \begin{describe}
        !          2182: \item[\verb"sd":] the association-descriptor;
        !          2183: 
        !          2184: \item[\verb"ftg":] a pointer to an \verb"FTAMgroup" structure;
        !          2185: and,
        !          2186: 
        !          2187: \item[\verb"fti":] a pointer to an \verb"FTAMindication" structure, which is
        !          2188: updated only if the call fails.
        !          2189: \end{describe}
        !          2190: If the call fails,
        !          2191: the \verb"FTAMabort" structure contained in the
        !          2192: \verb"FTAMindication" parameter \verb"fti" contains the reason for the failure.
        !          2193: 
        !          2194: The \verb"FBulkEndRequest" routine is used to issue a grouped file transfer
        !          2195: request consisting of:
        !          2196: \begin{itemize}
        !          2197: \item  {\sf F-BEGIN-GROUP.REQUEST\/};
        !          2198: 
        !          2199: \item  {\sf F-CLOSE.REQUEST\/};
        !          2200: 
        !          2201: \item  {\sf F-DESELECT.REQUEST\/} or {\sf F-DELETE.REQUEST\/};
        !          2202: and,
        !          2203: 
        !          2204: \item  {\sf F-END-GROUP.REQUEST}.
        !          2205: \end{itemize}
        !          2206: The user initializes an \verb"FTAMgroup" structure
        !          2207: (described in tedious detail on page~\pageref{FTAMgroup})
        !          2208: and then invokes \verb"FBulkEndRequest".
        !          2209: \begin{quote}\index{FBulkEndRequest}\small\begin{verbatim}
        !          2210: int     FBulkEndRequest (sd, ftg, fti)
        !          2211: int     sd;
        !          2212: struct FTAMgroup *ftg;
        !          2213: struct FTAMindication *fti;
        !          2214: \end{verbatim}\end{quote}
        !          2215: The parameters to this procedure are:
        !          2216: \begin{describe}
        !          2217: \item[\verb"sd":] the association-descriptor;
        !          2218: 
        !          2219: \item[\verb"ftg":] a pointer to an \verb"FTAMgroup" structure;
        !          2220: and,
        !          2221: 
        !          2222: \item[\verb"fti":] a pointer to an \verb"FTAMindication" structure, which is
        !          2223: always updated.
        !          2224: \end{describe}
        !          2225: If the call to \verb"FBulkEndRequest" is successful,
        !          2226: then this corresponds to the appropriate {\sf .CONFIRMATION\/} events,
        !          2227: the \verb"fti_type" element of the \verb"fti" parameter is set to
        !          2228: \verb"FTI_BULKEND",
        !          2229: and the \verb"fti_group" element contains the results.
        !          2230: Note that the data contained in the structure was allocated via \man malloc(3),
        !          2231: and should be released with the \verb"FTGFREE" macro when no longer needed.
        !          2232: 
        !          2233: Otherwise if the call fails,
        !          2234: the \verb"FTAMabort" structure contained in the
        !          2235: \verb"FTAMindication" parameter \verb"fti" contains the reason for the failure.
        !          2236: 
        !          2237: Upon receiving an \verb"FTI_BULKEND" indication,
        !          2238: containing the appropriate {\sf .INDICATION\/} events,
        !          2239: the responder is required to generate the appropriate {\sf .RESPONSE\/}
        !          2240: events using the \verb"FBulkEndResponse" routine.
        !          2241: \begin{quote}\index{FBulkEndResponse}\small\begin{verbatim}
        !          2242: int     FBulkEndResponse (sd, ftg, fti)
        !          2243: int     sd;
        !          2244: struct FTAMgroup *ftg;
        !          2245: struct FTAMindication *fti;
        !          2246: \end{verbatim}\end{quote}
        !          2247: The parameters to this procedure are:
        !          2248: \begin{describe}
        !          2249: \item[\verb"sd":] the association-descriptor;
        !          2250: 
        !          2251: \item[\verb"ftg":] a pointer to an \verb"FTAMgroup" structure;
        !          2252: and,
        !          2253: 
        !          2254: \item[\verb"fti":] a pointer to an \verb"FTAMindication" structure, which is
        !          2255: updated only if the call fails.
        !          2256: \end{describe}
        !          2257: If the call fails,
        !          2258: the \verb"FTAMabort" structure contained in the
        !          2259: \verb"FTAMindication" parameter \verb"fti" contains the reason for the failure.
        !          2260: 
        !          2261: \section      {File Access}
        !          2262: The \verb"FAccessRequest" routine is equivalent to an {\sf F-LOCATE.REQUEST\/}
        !          2263: or {\sf F-ERASE.REQUEST\/} action on the part of the user.
        !          2264: \begin{quote}\index{FAccessRequest}\small\begin{verbatim}
        !          2265: int     FAccessRequest (sd, operation, identity, fti)
        !          2266: int     sd;
        !          2267: int     operation;
        !          2268: struct FADUidentity *identity;
        !          2269: struct FTAMindication *fti;
        !          2270: \end{verbatim}\end{quote}
        !          2271: The parameters to this procedure are:
        !          2272: \begin{describe}
        !          2273: \item[\verb"sd":] the association-descriptor;
        !          2274: 
        !          2275: \item[\verb"operation":] the operation to be performed,
        !          2276: one of the values shown in Table~\ref{FTAMaccessops};
        !          2277: 
        !          2278: \item[\verb"identity":] the identity of the FADU to locate or erase;
        !          2279: and,
        !          2280: 
        !          2281: \item[\verb"fti":] a pointer to an \verb"FTAMindication" structure, which is
        !          2282: always updated.
        !          2283: \end{describe}
        !          2284: If the call to \verb"FAccessRequest" is successful,
        !          2285: then this corresponds to the appropriate {\sf .CONFIRMATION\/} event,
        !          2286: the \verb"fti_type" element of the \verb"fti" parameter is set to
        !          2287: \verb"FTI_ACCESS",
        !          2288: and the \verb"fti_access" element contains the results.
        !          2289: Note that the data contained in the structure was allocated via \man malloc(3),
        !          2290: and should be released with the \verb"FTACFREE" macro when no longer needed.
        !          2291: 
        !          2292: Otherwise if the call fails,
        !          2293: the \verb"FTAMabort" structure contained in the
        !          2294: \verb"FTAMindication" parameter \verb"fti" contains the reason for the failure.
        !          2295: 
        !          2296: Upon receiving an {\sf F-LOCATE.INDICATION\/}
        !          2297: or an {\sf F-ERASE.IN\-DI\-CA\-TION\/}
        !          2298: event,
        !          2299: the user is required to generate the appropriate {\sf .RESPONSE\/} action
        !          2300: using the \verb"FAccessResponse" routine.
        !          2301: \begin{quote}\index{FAccessResponse}\small\begin{verbatim}
        !          2302: int     FAccessResponse (sd, action, identity, diag, ndiag,
        !          2303:             fti)
        !          2304: int     sd;
        !          2305: int     action;
        !          2306: struct FADUidentity *identity;
        !          2307: struct FTAMdiagnostic diag[];
        !          2308: int     ndiag;
        !          2309: struct FTAMindication *fti;
        !          2310: \end{verbatim}\end{quote}
        !          2311: The parameters to this procedure are:
        !          2312: \begin{describe}
        !          2313: \item[\verb"sd":] the association-descriptor;
        !          2314: 
        !          2315: \item[\verb"action":] the action result;
        !          2316: 
        !          2317: \item[\verb"identity":] the identity of the FADU located
        !          2318: (not present for the {\sf F-ERASE.RESPONSE\/} action);
        !          2319: 
        !          2320: \item[\verb"diag"/\verb"ndiag":] a list of diagnostics
        !          2321: (and the number of diagnostics in the list);
        !          2322: and,
        !          2323: 
        !          2324: \item[\verb"fti":] a pointer to an \verb"FTAMindication" structure, which is
        !          2325: updated only if the call fails.
        !          2326: \end{describe}
        !          2327: If the call to \verb"AccessResponse" is successful,
        !          2328: then the {\sf .RESPONSE\/} event has been queued for sending to the
        !          2329: initiator.
        !          2330: Otherwise the \verb"FTAMabort" structure contained in the
        !          2331: \verb"FTAMindication" parameter \verb"fti" contains the reason for the failure.
        !          2332: 
        !          2333: \section      {Data Transfer}
        !          2334: Once group file transfer request has been made,
        !          2335: and after any file access requests,
        !          2336: data transfer may occur.
        !          2337: This occurs in three steps:
        !          2338: the initiator requests reading or writing of an FADU,
        !          2339: the source sends the data,
        !          2340: the transfer is then either cancelled (by either side) or terminated by the
        !          2341: initiator.
        !          2342: 
        !          2343: \subsection    {Read/Write}
        !          2344: The \verb"FReadWriteRequest" routine is equivalent to a {\sf
        !          2345: F-READ.REQUEST\/} or {\sf F-WRITE.REQUEST\/} action on the part of the user.
        !          2346: \begin{quote}\index{FReadWriteRequest}\small\begin{verbatim}
        !          2347: int     FReadWriteRequest (sd, operation, identity, context,
        !          2348:                 level, lock, fti)
        !          2349: int     sd;
        !          2350: int     operation;
        !          2351: struct FADUidentity *identity;
        !          2352: int     context,
        !          2353:         level,
        !          2354:         lock;
        !          2355: struct FTAMindication *fti;
        !          2356: \end{verbatim}\end{quote}
        !          2357: The parameters to this procedure are:
        !          2358: \begin{describe}
        !          2359: \item[\verb"sd":] the association-descriptor;
        !          2360: 
        !          2361: \item[\verb"operation":] the operation to be performed,
        !          2362: one of the values shown in Table~\ref{FTAMdataops} on
        !          2363: page~\pageref{FTAMdataops};
        !          2364: 
        !          2365: \item[\verb"identity":] the identity of the FADU to be transferred;
        !          2366: 
        !          2367: \item[\verb"context"/\verb"level":] the access context,
        !          2368: one of the values shown in Table~\ref{FTAMcontexts};
        !          2369: 
        !          2370: \item[\verb"lock":] lock FADU;
        !          2371: and,
        !          2372: 
        !          2373: \item[\verb"fti":] a pointer to an \verb"FTAMindication" structure, which is
        !          2374: updated only if the call fails.
        !          2375: \end{describe}
        !          2376: If the call fails,
        !          2377: the \verb"FTAMabort" structure contained in the
        !          2378: \verb"FTAMindication" parameter \verb"fti" contains the reason for the failure.
        !          2379: 
        !          2380: \subsection    {Sending Data}
        !          2381: The FADU is transmitted as a series of presentation elements.
        !          2382: A group of presentation elements may be sent using the \verb"FDataRequest"
        !          2383: routine,
        !          2384: which corresponds to the {\sf F-DATA.REQUEST\/} action.
        !          2385: \begin{quote}\index{FDataRequest}\small\begin{verbatim}
        !          2386: int     FDataRequest (sd, fadus, nfadu, fti)
        !          2387: int     sd;
        !          2388: PE      fadus[];
        !          2389: int     nfadu;
        !          2390: struct FTAMindication *fti;
        !          2391: \end{verbatim}\end{quote}
        !          2392: The parameters to this procedure are:
        !          2393: \begin{describe}
        !          2394: \item[\verb"sd":] the association-descriptor;
        !          2395: 
        !          2396: \item[\verb"fadus"/\verb"nfadu":] the list of data elements
        !          2397: (and the number of data elements which may not exceed the manifest constant
        !          2398: \verb"NPDATA" described in Chapter~\ref{libpsap2}),
        !          2399: consult Section~\ref{ftam:data} on page~\pageref{ftam:data} for important
        !          2400: information on the use of presentation context identifiers;
        !          2401: and,
        !          2402: 
        !          2403: \item[\verb"fti":] a pointer to an \verb"FTAMindication" structure, which is
        !          2404: updated only if the call fails.
        !          2405: \end{describe}
        !          2406: If the call fails,
        !          2407: the \verb"FTAMabort" structure contained in the
        !          2408: \verb"FTAMindication" parameter \verb"fti" contains the reason for the failure.
        !          2409: 
        !          2410: When the last data element in the FADU has been sent,
        !          2411: the {\sf F-DATA-END.REQUEST\/} action should be performed
        !          2412: using the \verb"FDataEndRequest" routine.
        !          2413: \begin{quote}\index{FDataEndRequest}\small\begin{verbatim}
        !          2414: int     FDataEndRequest (sd, action, diag, ndiag, fti)
        !          2415: int     sd;
        !          2416: int     action;
        !          2417: struct FTAMdiagnostic diag[];
        !          2418: int     ndiag;
        !          2419: struct FTAMindication *fti;
        !          2420: \end{verbatim}\end{quote}
        !          2421: The parameters to this procedure are:
        !          2422: \begin{describe}
        !          2423: \item[\verb"sd":] the association-descriptor;
        !          2424: 
        !          2425: \item[\verb"action":] the action result;
        !          2426: 
        !          2427: \item[\verb"diag"/\verb"ndiag":] a list of diagnostics
        !          2428: (and the number of diagnostics in the list);
        !          2429: and,
        !          2430: 
        !          2431: \item[\verb"fti":] a pointer to an \verb"FTAMindication" structure, which is
        !          2432: updated only if the call fails.
        !          2433: \end{describe}
        !          2434: If the call fails,
        !          2435: the \verb"FTAMabort" structure contained in the
        !          2436: \verb"FTAMindication" parameter \verb"fti" contains the reason for the failure.
        !          2437: 
        !          2438: \subsection    {Canceling Transfer}
        !          2439: Either the initiator or the responder may cancel the transfer prior to
        !          2440: orderly termination of the data transfer.
        !          2441: The \verb"FCancelRequest",
        !          2442: which corresponds to the {\sf F-CANCEL.REQUEST\/} action,
        !          2443: is used to initiate cancellation.
        !          2444: \begin{quote}\index{FCancelRequest}\small\begin{verbatim}
        !          2445: int     FCancelRequest (sd, action, sharedASE, diag, ndiag,
        !          2446:                         fti)
        !          2447: int     sd;
        !          2448: int     action;
        !          2449: PE      sharedASE;
        !          2450: struct FTAMdiagnostic diag[];
        !          2451: int     ndiag;
        !          2452: struct FTAMindication *fti;
        !          2453: \end{verbatim}\end{quote}
        !          2454: The parameters to this procedure are:
        !          2455: \begin{describe}
        !          2456: \item[\verb"sd":] the association-descriptor;
        !          2457: 
        !          2458: \item[\verb"action":] the action result;
        !          2459: 
        !          2460: \item[\verb"sharedASE":] shared ASE information;
        !          2461: 
        !          2462: \item[\verb"diag"/\verb"ndiag":] a list of diagnostics
        !          2463: (and the number of diagnostics in the list);
        !          2464: and,
        !          2465: 
        !          2466: \item[\verb"fti":] a pointer to an \verb"FTAMindication" structure, which is
        !          2467: always updated.
        !          2468: \end{describe}
        !          2469: If the call to \verb"FCancelRequest" is successful,
        !          2470: then this corresponds to the {\sf F-CANCEL.CONFIRMATION\/} event,
        !          2471: the \verb"fti_type" element of the \verb"fti" parameter is set to
        !          2472: \verb"FTI_CANCEL",
        !          2473: and the \verb"fti_cancel" element contains the results.
        !          2474: 
        !          2475: Otherwise if the call fails,
        !          2476: the \verb"FTAMabort" structure contained in the
        !          2477: \verb"FTAMindication" parameter \verb"fti" contains the reason for the failure.
        !          2478: 
        !          2479: Upon receiving an {\sf F-CANCEL.INDICATION\/} event,
        !          2480: the user is required to generate the {\sf F-CANCEL.RESPONSE\/}
        !          2481: events using the \verb"FCancelResponse" routine.
        !          2482: \begin{quote}\index{FCancelResponse}\small\begin{verbatim}
        !          2483: int     FCancelResponse (sd, action, sharedASE, diag, ndiag,
        !          2484:                          fti)
        !          2485: int     sd;
        !          2486: int     action;
        !          2487: PE      sharedASE;
        !          2488: struct FTAMdiagnostic diag[];
        !          2489: int     ndiag;
        !          2490: struct FTAMindication *fti;
        !          2491: \end{verbatim}\end{quote}
        !          2492: The parameters to this procedure are:
        !          2493: \begin{describe}
        !          2494: \item[\verb"sd":] the association-descriptor;
        !          2495: 
        !          2496: \item[\verb"action":] the action result;
        !          2497: 
        !          2498: \item[\verb"sharedASE":] shared ASE information;
        !          2499: 
        !          2500: \item[\verb"diag"/\verb"ndiag":] a list of diagnostics
        !          2501: (and the number of diagnostics in the list);
        !          2502: and,
        !          2503: 
        !          2504: \item[\verb"fti":] a pointer to an \verb"FTAMindication" structure, which is
        !          2505: updated only if the call fails.
        !          2506: \end{describe}
        !          2507: If the call fails,
        !          2508: the \verb"FTAMabort" structure contained in the
        !          2509: \verb"FTAMindication" parameter \verb"fti" contains the reason for the failure.
        !          2510: 
        !          2511: \subsection    {Terminating Transfer}
        !          2512: After generating the {\sf F-DATA-END.REQUEST\/}
        !          2513: (or after receiving the {\sf F-DATA-END.RESPONSE\/}) action,
        !          2514: the initiator is required to perform the {\sf F-TRANSFER-END.REQUEST\/}
        !          2515: action using the \verb"FTransEndRequest" routine.
        !          2516: \begin{quote}\index{FTransEndRequest}\small\begin{verbatim}
        !          2517: int     FTransEndRequest (sd, sharedASE, fti)
        !          2518: int     sd;
        !          2519: PE     sharedASE;
        !          2520: struct FTAMindication *fti;
        !          2521: \end{verbatim}\end{quote}
        !          2522: The parameters to this procedure are:
        !          2523: \begin{describe}
        !          2524: \item[\verb"sd":] the association-descriptor;
        !          2525: 
        !          2526: \item[\verb"sharedASE":] shared ASE information;
        !          2527: and,
        !          2528: 
        !          2529: \item[\verb"fti":] a pointer to an \verb"FTAMindication" structure, which is
        !          2530: always updated.
        !          2531: \end{describe}
        !          2532: If the call to \verb"FTransEndRequest" is successful,
        !          2533: then this corresponds to the {\sf F-TRANSFER-END.CONFIRMATION\/} event,
        !          2534: the \verb"fti_type" element of the \verb"fti" parameter is set to
        !          2535: \verb"FTI_TRANSEND",
        !          2536: and the \verb"fti_transend" element contains the results.
        !          2537: 
        !          2538: Otherwise, if the call fails,
        !          2539: the \verb"FTAMabort" structure contained in the
        !          2540: \verb"FTAMindication" parameter \verb"fti" contains the reason for the failure.
        !          2541: 
        !          2542: Upon receiving an {\sf F-TRANSFER-END.INDICATION\/} event,
        !          2543: the responder is required to generate the {\sf F-TRANSFER-END.RESPONSE\/}
        !          2544: events using the \verb"FTransEndResponse" routine.
        !          2545: \begin{quote}\index{FTransEndResponse}\small\begin{verbatim}
        !          2546: int     FTransEndResponse (sd, action, sharedASE, diag, ndiag,
        !          2547:             fti)
        !          2548: int     sd;
        !          2549: int     action;
        !          2550: PE      sharedASE;
        !          2551: struct FTAMdiagnostic diag[];
        !          2552: int     ndiag;
        !          2553: struct FTAMindication *fti;
        !          2554: \end{verbatim}\end{quote}
        !          2555: The parameters to this procedure are:
        !          2556: \begin{describe}
        !          2557: \item[\verb"sd":] the association-descriptor;
        !          2558: 
        !          2559: \item[\verb"action":] the action result;
        !          2560: 
        !          2561: \item[\verb"sharedASE":] shared ASE information;
        !          2562: 
        !          2563: \item[\verb"diag"/\verb"ndiag":] a list of diagnostics
        !          2564: (and the number of diagnostics in the list);
        !          2565: and,
        !          2566: 
        !          2567: \item[\verb"fti":] a pointer to an \verb"FTAMindication" structure, which is
        !          2568: updated only if the call fails.
        !          2569: \end{describe}
        !          2570: If the call fails,
        !          2571: the \verb"FTAMabort" structure contained in the
        !          2572: \verb"FTAMindication" parameter \verb"fti" contains the reason for the failure.
        !          2573: 
        !          2574: \section      {Grouped Operations: File Management}
        !          2575: The \verb"FManageRequest" routine is used to issue a grouped management
        !          2576: request consisting of:
        !          2577: \begin{itemize}
        !          2578: \item  {\sf F-BEGIN-GROUP.REQUEST\/};
        !          2579: 
        !          2580: \item  {\sf F-SELECT.REQUEST\/} or {\sf F-CREATE.REQUEST\/};
        !          2581: 
        !          2582: \item  optionally, {\sf F-READ-ATTRIB.REQUEST\/};
        !          2583: 
        !          2584: \item  optionally, {\sf F-CHANGE-ATTRIB.REQUEST\/};
        !          2585: 
        !          2586: \item  {\sf F-DESELECT.REQUEST\/} or {\sf F-DELETE.REQUEST\/};
        !          2587: and,
        !          2588: 
        !          2589: \item  {\sf F-END-GROUP.REQUEST}.
        !          2590: \end{itemize}
        !          2591: The user initializes an \verb"FTAMgroup" structure
        !          2592: (described in tedious detail on page~\pageref{FTAMgroup})
        !          2593: and then invokes \verb"FManageRequest".
        !          2594: \begin{quote}\index{FManageRequest}\small\begin{verbatim}
        !          2595: int     FManageRequest (sd, ftg, fti)
        !          2596: int     sd;
        !          2597: struct FTAMgroup *ftg;
        !          2598: struct FTAMindication *fti;
        !          2599: \end{verbatim}\end{quote}
        !          2600: The parameters to this procedure are:
        !          2601: \begin{describe}
        !          2602: \item[\verb"sd":] the association-descriptor;
        !          2603: 
        !          2604: \item[\verb"ftg":] a pointer to an \verb"FTAMgroup" structure;
        !          2605: and,
        !          2606: 
        !          2607: \item[\verb"fti":] a pointer to an \verb"FTAMindication" structure, which is
        !          2608: always updated.
        !          2609: \end{describe}
        !          2610: If the call to \verb"FManageRequest" is successful,
        !          2611: then this corresponds to the appropriate {\sf .CONFIRMATION\/} events,
        !          2612: the \verb"fti_type" element of the \verb"fti" parameter is set to
        !          2613: \verb"FTI_MANAGEMENT",
        !          2614: and the \verb"fti_group" element contains the results.
        !          2615: Note that the data contained in the structure was allocated via \man malloc(3),
        !          2616: and should be released with the \verb"FTGFREE" macro when no longer needed.
        !          2617: 
        !          2618: Otherwise if the call fails,
        !          2619: the \verb"FTAMabort" structure contained in the
        !          2620: \verb"FTAMindication" parameter \verb"fti" contains the reason for the failure.
        !          2621: 
        !          2622: Upon receiving an \verb"FTI_MANAGEMENT" indication,
        !          2623: containing the appropriate {\sf .INDICATION\/} events,
        !          2624: the responder is required to generate the appropriate {\sf .RESPONSE\/}
        !          2625: events using the \verb"FManageResponse" routine.
        !          2626: \begin{quote}\index{FManageResponse}\small\begin{verbatim}
        !          2627: int     FManageResponse (sd, ftg, fti)
        !          2628: int     sd;
        !          2629: struct FTAMgroup *ftg;
        !          2630: struct FTAMindication *fti;
        !          2631: \end{verbatim}\end{quote}
        !          2632: The parameters to this procedure are:
        !          2633: \begin{describe}
        !          2634: \item[\verb"sd":] the association-descriptor;
        !          2635: 
        !          2636: \item[\verb"ftg":] a pointer to an \verb"FTAMgroup" structure;
        !          2637: and,
        !          2638: 
        !          2639: \item[\verb"fti":] a pointer to an \verb"FTAMindication" structure, which is
        !          2640: updated only if the call fails.
        !          2641: \end{describe}
        !          2642: If the call fails,
        !          2643: the \verb"FTAMabort" structure contained in the
        !          2644: \verb"FTAMindication" parameter \verb"fti" contains the reason for the failure.
        !          2645: 
        !          2646: \section      {Association Release}
        !          2647: The \verb"FTerminateRequest" routine is used to request the release of an
        !          2648: association,
        !          2649: and corresponds to an {\sf F-TERMINATE.REQUEST\/} action.
        !          2650: \begin{quote}\index{FTerminateRequest}\small\begin{verbatim}
        !          2651: int     FTerminateRequest (sd, sharedASE, ftr, fti)
        !          2652: int     sd;
        !          2653: PE      sharedASE;
        !          2654: struct FTAMrelease *ftr;
        !          2655: struct FTAMindication *fti;
        !          2656: \end{verbatim}\end{quote}
        !          2657: \newpage       %%% yikes!
        !          2658: The parameters to this procedure are:
        !          2659: \begin{describe}
        !          2660: \item[\verb"sd":] the association-descriptor;
        !          2661: 
        !          2662: \item[\verb"sharedASE":] shared ASE information;
        !          2663: 
        !          2664: \item[\verb"ftr":] a pointer to an \verb"FTAMrelease" structure, which is
        !          2665: updated only if the call succeeds;
        !          2666: and,
        !          2667: 
        !          2668: \item[\verb"fti":] a pointer to an \verb"FTAMindication" structure, which is
        !          2669: updated only if the call fails.
        !          2670: \end{describe}
        !          2671: If the call to \verb"FTerminateRequest" is successful,
        !          2672: then this corresponds to an {\sf F-TERMINATE.CONFIRMATION\/} event,
        !          2673: and it returns information in the \verb"ftr" parameter,
        !          2674: which is a pointer to an \verb"FTAMrelease" structure.
        !          2675: \begin{quote}\index{FTAMrelease}\small\begin{verbatim}
        !          2676: struct FTAMrelease {
        !          2677:     PE     ftr_sharedASE;
        !          2678: 
        !          2679:     struct FTAMcharging ftr_charges;
        !          2680: };
        !          2681: \end{verbatim}\end{quote}
        !          2682: The elements of this structure are:
        !          2683: \begin{describe}
        !          2684: \item[\verb"ftr\_sharedASE":] shared ASE information;
        !          2685: and,
        !          2686: 
        !          2687: \item[\verb"ftr\_charges":] any charges.
        !          2688: \end{describe}
        !          2689: Note that the data contained in the structure was allocated via \man malloc(3),
        !          2690: and should be released with the \verb"FTRFREE" macro when no longer needed.
        !          2691: The \verb"FTRFREE" macro
        !          2692: behaves as if it was defined as:
        !          2693: \begin{quote}\index{FTRFREE}\small\begin{verbatim}
        !          2694: void    FTRFREE (ftr)
        !          2695: struct FTAMrelease *ftr;
        !          2696: \end{verbatim}\end{quote}
        !          2697: The macro frees only the data allocated by \verb"FTerminateRequest",
        !          2698: and not the \verb"FTAMrelease" structure itself.
        !          2699: Further,
        !          2700: \verb"FTRFREE" should be called only if the call to the
        !          2701: \verb"FTerminateRequest" routine returned \verb"OK".
        !          2702: 
        !          2703: If the call to \verb"FTerminateRequest" is successful,
        !          2704: then the association has been released.
        !          2705: Otherwise the \verb"FTAMabort" structure contained in
        !          2706: the \verb"FTAMindication" parameter
        !          2707: \verb"fti" contains the reason for failure.
        !          2708: 
        !          2709: Upon receiving an {\sf F-TERMINATE.INDICATION\/} event,
        !          2710: the user is required to generate an {\sf F-TERMINATE.RESPONSE\/} action
        !          2711: using the\\    %%% hack
        !          2712: \verb"FTerminateResponse" routine.
        !          2713: \begin{quote}\index{FTerminateResponse}\small\begin{verbatim}
        !          2714: int     FTerminateResponse (sd, sharedASE, charging, fti)
        !          2715: int     sd;
        !          2716: PE      sharedASE;
        !          2717: struct FTAMcharging *charging;
        !          2718: struct FTAMindication  *fti;
        !          2719: \end{verbatim}\end{quote}
        !          2720: The parameters to this procedure are:
        !          2721: \begin{describe}
        !          2722: \item[\verb"sd":] the association-descriptor;
        !          2723: 
        !          2724: \item[\verb"sharedASE":] shared ASE information;
        !          2725: 
        !          2726: \item[\verb"charging":] charging information (if any);
        !          2727: and,
        !          2728: 
        !          2729: \item[\verb"fti":] a pointer to an \verb"FTAMindication" structure, which is
        !          2730: updated only if the call fails.
        !          2731: \end{describe}
        !          2732: If the call to \verb"FTerminateResponse" is successful,
        !          2733: then the association has been released.
        !          2734: 
        !          2735: \section      {Association Abort}
        !          2736: The \verb"FUAbortRequest" routine is used to request the ungraceful release
        !          2737: of an association,
        !          2738: and corresponds to an {\sf F-U-ABORT.REQUEST\/} action.
        !          2739: \begin{quote}\index{FUAbortRequest}\small\begin{verbatim}
        !          2740: int     FUAbortRequest (sd, action, diag, ndiag, fti)
        !          2741: int     sd;
        !          2742: int     action;
        !          2743: struct FTAMdiagnostic diag[];
        !          2744: int     ndiag;
        !          2745: struct FTAMindication *fti;
        !          2746: \end{verbatim}\end{quote}
        !          2747: The parameters to this procedure are:
        !          2748: \begin{describe}
        !          2749: \item[\verb"sd":] the association-descriptor;
        !          2750: 
        !          2751: \item[\verb"action":] an action result;
        !          2752: 
        !          2753: \item[\verb"diag"/\verb"ndiag":] a list of diagnostics
        !          2754: (and the number of diagnostics in the list);
        !          2755: and,
        !          2756: 
        !          2757: \item[\verb"fti":] a pointer to an \verb"FTAMindication" structure, which is
        !          2758: updated only if the call fails.
        !          2759: \end{describe}
        !          2760: If the call to \verb"FUAbortRequest" is successful,
        !          2761: then the connection is immediately closed,
        !          2762: and any data queued for the connection may be lost.
        !          2763: 
        !          2764: \section      {Error Conventions}
        !          2765: All of the routines in this library return the manifest constant \verb"NOTOK"
        !          2766: on error,
        !          2767: and also update the \verb"fti" parameter given to the routine.
        !          2768: The \verb"fti_abort" element of the \verb"FTAMindication" structure contains a
        !          2769: \verb"FTAMabort" structure detailing the reason for the failure.
        !          2770: For each diagnostic present (typically only one) in the \verb"FTAMabort"
        !          2771: structure,
        !          2772: the \verb"ftd_identifier" element of each diagnostic can be given as a
        !          2773: parameter to the procedure \verb"FErrString" which returns a null-terminated
        !          2774: diagnostic string.
        !          2775: \begin{quote}\index{FErrString}\small\begin{verbatim}
        !          2776: char   *FErrString (c)
        !          2777: int     c;
        !          2778: \end{verbatim}\end{quote}
        !          2779: 
        !          2780: \section      {Compiling and Loading}
        !          2781: Programs using the \man libftam(3n) library should include
        !          2782: \verb"<isode/ftam.h>".
        !          2783: These programs should also be loaded with \verb"-lftam" and \verb"-lisode".
        !          2784: 
        !          2785: \section      {An Example}
        !          2786: Read Section~\ref{unixftam:code} on page~\pageref{unixftam:code}.
        !          2787: 
        !          2788: \section      {For Further Reading}
        !          2789: The ISO specification for the International Standard on
        !          2790: File Transfer, Access, and Management is found in \cite{ISO.FTAM},
        !          2791: which is a four-part document.
        !          2792: 
        !          2793: %%% \section  {Changes Since the Last Release}\label{ftam:changes}
        !          2794: %%% A brief summary of the major changes between v~\ftamprevrsn/ and
        !          2795: %%% v~\ftamvrsn/ are now presented.
        !          2796: %%% These are the user-visible changes only;
        !          2797: %%% changes of a strictly internal nature are not discussed.
        !          2798: 

unix.superglobalmegacorp.com

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