BSD 4_3_Net_2 development
authorCSRG <csrg@ucbvax.Berkeley.EDU>
Fri, 22 Feb 1991 02:24:30 +0000 (18:24 -0800)
committerCSRG <csrg@ucbvax.Berkeley.EDU>
Fri, 22 Feb 1991 02:24:30 +0000 (18:24 -0800)
Work on file usr/src/contrib/isode/dsap/x500as/llib-lx500as
Work on file usr/src/contrib/isode/dsap/x500as/make
Work on file usr/src/contrib/isode/dsap/x500as/nrs-cdefs.h
Work on file usr/src/contrib/isode/dsap/x500as/nrs.py
Work on file usr/src/contrib/isode/dsap/x500as/qu-cdefs.h
Work on file usr/src/contrib/isode/dsap/x500as/sa.py
Work on file usr/src/contrib/isode/dsap/x500as/th.py
Work on file usr/src/contrib/isode/ftam/Makefile
Work on file usr/src/contrib/isode/ftam/cont.py
Work on file usr/src/contrib/isode/ftam/fadu.py
Work on file usr/src/contrib/isode/ftam/ftam.py
Work on file usr/src/contrib/isode/ftam/ftamabort.c
Work on file usr/src/contrib/isode/ftam/ftamaccess1.c
Work on file usr/src/contrib/isode/ftam/ftamaccess2.c
Work on file usr/src/contrib/isode/ftam/ftamacl.c
Work on file usr/src/contrib/isode/ftam/ftamattr.c
Work on file usr/src/contrib/isode/ftam/ftambits.c
Work on file usr/src/contrib/isode/ftam/ftambulk.c
Work on file usr/src/contrib/isode/ftam/ftambulk1.c
Work on file usr/src/contrib/isode/ftam/ftambulk2.c
Work on file usr/src/contrib/isode/ftam/ftamchrg.c
Work on file usr/src/contrib/isode/ftam/ftamconctl.c
Work on file usr/src/contrib/isode/ftam/ftamdiag.c
Work on file usr/src/contrib/isode/ftam/ftamdocument.c
Work on file usr/src/contrib/isode/ftam/ftamerror.c
Work on file usr/src/contrib/isode/ftam/ftamfaduid.c
Work on file usr/src/contrib/isode/ftam/ftamfdf.c
Work on file usr/src/contrib/isode/ftam/ftamgroup1.c
Work on file usr/src/contrib/isode/ftam/ftamgroup2.c
Work on file usr/src/contrib/isode/ftam/ftaminitiate.c
Work on file usr/src/contrib/isode/ftam/ftamlose.c
Work on file usr/src/contrib/isode/ftam/ftampass.c
Work on file usr/src/contrib/isode/ftam/ftamprovider.c
Work on file usr/src/contrib/isode/ftam/ftamrelease1.c
Work on file usr/src/contrib/isode/ftam/ftamrelease2.c
Work on file usr/src/contrib/isode/ftam/ftamrespond.c
Work on file usr/src/contrib/isode/ftam/ftamselect.c
Work on file usr/src/contrib/isode/ftam/ftamshare.c
Work on file usr/src/contrib/isode/ftam/ftamtrace.c
Work on file usr/src/contrib/isode/ftam/isodocuments
Work on file usr/src/contrib/isode/ftam/isodocuments.5
Work on file usr/src/contrib/isode/ftam/libftam.3n
Work on file usr/src/contrib/isode/ftam/llib-lftam
Work on file usr/src/contrib/isode/ftam/make
Work on file usr/src/contrib/isode/ftam-ftp/Makefile
Work on file usr/src/contrib/isode/ftam-ftp/ftamd-ftp.8c
Work on file usr/src/contrib/isode/ftam-ftp/ftp.c
Work on file usr/src/contrib/isode/ftam-ftp/ftp_lib.c
Work on file usr/src/contrib/isode/ftam-ftp/ftp_var.h
Work on file usr/src/contrib/isode/ftam-ftp/make
Work on file usr/src/contrib/isode/ftam2/Makefile
Work on file usr/src/contrib/isode/ftam2/docs.py
Work on file usr/src/contrib/isode/ftam2/ftam-assoc.c
Work on file usr/src/contrib/isode/ftam2/ftam-dir.c
Work on file usr/src/contrib/isode/ftam2/ftam-get.c
Work on file usr/src/contrib/isode/ftam2/ftam-glob.c
Work on file usr/src/contrib/isode/ftam2/ftam-ls.c
Work on file usr/src/contrib/isode/ftam2/ftam-mgmt.c
Work on file usr/src/contrib/isode/ftam2/ftam-put.c
Work on file usr/src/contrib/isode/ftam2/ftam.1c
Work on file usr/src/contrib/isode/ftam2/ftam.c
Work on file usr/src/contrib/isode/ftam2/ftamd-manage.c
Work on file usr/src/contrib/isode/ftam2/ftamd-select.c
Work on file usr/src/contrib/isode/ftam2/ftamd-trans.c
Work on file usr/src/contrib/isode/ftam2/ftamd.8c
Work on file usr/src/contrib/isode/ftam2/ftamd.c
Work on file usr/src/contrib/isode/ftam2/ftamsbr.c
Work on file usr/src/contrib/isode/ftam2/ftamsbr.h
Work on file usr/src/contrib/isode/ftam2/ftamsystem.c
Work on file usr/src/contrib/isode/ftam2/ftamsystem.h
Work on file usr/src/contrib/isode/ftam2/ftamuser.c
Work on file usr/src/contrib/isode/ftam2/ftamuser.h
Work on file usr/src/contrib/isode/ftam2/ftamusers.5
Work on file usr/src/contrib/isode/ftam2/make
Work on file usr/src/contrib/isode/ftp-ftam/Makefile
Work on file usr/src/contrib/isode/ftp-ftam/ftpcmd.y
Work on file usr/src/contrib/isode/ftp-ftam/ftpd-ftam.8c
Work on file usr/src/contrib/isode/ftp-ftam/ftpd.c
Work on file usr/src/contrib/isode/ftp-ftam/make
Work on file usr/src/contrib/isode/h/Makefile

Synthesized-from: CSRG/cd2/net.2

80 files changed:
usr/src/contrib/isode/dsap/x500as/llib-lx500as [new file with mode: 0644]
usr/src/contrib/isode/dsap/x500as/make [new file with mode: 0644]
usr/src/contrib/isode/dsap/x500as/nrs-cdefs.h [new file with mode: 0644]
usr/src/contrib/isode/dsap/x500as/nrs.py [new file with mode: 0644]
usr/src/contrib/isode/dsap/x500as/qu-cdefs.h [new file with mode: 0644]
usr/src/contrib/isode/dsap/x500as/sa.py [new file with mode: 0644]
usr/src/contrib/isode/dsap/x500as/th.py [new file with mode: 0644]
usr/src/contrib/isode/ftam-ftp/Makefile [new file with mode: 0644]
usr/src/contrib/isode/ftam-ftp/ftamd-ftp.8c [new file with mode: 0644]
usr/src/contrib/isode/ftam-ftp/ftp.c [new file with mode: 0644]
usr/src/contrib/isode/ftam-ftp/ftp_lib.c [new file with mode: 0644]
usr/src/contrib/isode/ftam-ftp/ftp_var.h [new file with mode: 0644]
usr/src/contrib/isode/ftam-ftp/make [new file with mode: 0644]
usr/src/contrib/isode/ftam/Makefile [new file with mode: 0644]
usr/src/contrib/isode/ftam/cont.py [new file with mode: 0644]
usr/src/contrib/isode/ftam/fadu.py [new file with mode: 0644]
usr/src/contrib/isode/ftam/ftam.py [new file with mode: 0644]
usr/src/contrib/isode/ftam/ftamabort.c [new file with mode: 0644]
usr/src/contrib/isode/ftam/ftamaccess1.c [new file with mode: 0644]
usr/src/contrib/isode/ftam/ftamaccess2.c [new file with mode: 0644]
usr/src/contrib/isode/ftam/ftamacl.c [new file with mode: 0644]
usr/src/contrib/isode/ftam/ftamattr.c [new file with mode: 0644]
usr/src/contrib/isode/ftam/ftambits.c [new file with mode: 0644]
usr/src/contrib/isode/ftam/ftambulk.c [new file with mode: 0644]
usr/src/contrib/isode/ftam/ftambulk1.c [new file with mode: 0644]
usr/src/contrib/isode/ftam/ftambulk2.c [new file with mode: 0644]
usr/src/contrib/isode/ftam/ftamchrg.c [new file with mode: 0644]
usr/src/contrib/isode/ftam/ftamconctl.c [new file with mode: 0644]
usr/src/contrib/isode/ftam/ftamdiag.c [new file with mode: 0644]
usr/src/contrib/isode/ftam/ftamdocument.c [new file with mode: 0644]
usr/src/contrib/isode/ftam/ftamerror.c [new file with mode: 0644]
usr/src/contrib/isode/ftam/ftamfaduid.c [new file with mode: 0644]
usr/src/contrib/isode/ftam/ftamfdf.c [new file with mode: 0644]
usr/src/contrib/isode/ftam/ftamgroup1.c [new file with mode: 0644]
usr/src/contrib/isode/ftam/ftamgroup2.c [new file with mode: 0644]
usr/src/contrib/isode/ftam/ftaminitiate.c [new file with mode: 0644]
usr/src/contrib/isode/ftam/ftamlose.c [new file with mode: 0644]
usr/src/contrib/isode/ftam/ftampass.c [new file with mode: 0644]
usr/src/contrib/isode/ftam/ftamprovider.c [new file with mode: 0644]
usr/src/contrib/isode/ftam/ftamrelease1.c [new file with mode: 0644]
usr/src/contrib/isode/ftam/ftamrelease2.c [new file with mode: 0644]
usr/src/contrib/isode/ftam/ftamrespond.c [new file with mode: 0644]
usr/src/contrib/isode/ftam/ftamselect.c [new file with mode: 0644]
usr/src/contrib/isode/ftam/ftamshare.c [new file with mode: 0644]
usr/src/contrib/isode/ftam/ftamtrace.c [new file with mode: 0644]
usr/src/contrib/isode/ftam/isodocuments [new file with mode: 0644]
usr/src/contrib/isode/ftam/isodocuments.5 [new file with mode: 0644]
usr/src/contrib/isode/ftam/libftam.3n [new file with mode: 0644]
usr/src/contrib/isode/ftam/llib-lftam [new file with mode: 0644]
usr/src/contrib/isode/ftam/make [new file with mode: 0644]
usr/src/contrib/isode/ftam2/Makefile [new file with mode: 0644]
usr/src/contrib/isode/ftam2/docs.py [new file with mode: 0644]
usr/src/contrib/isode/ftam2/ftam-assoc.c [new file with mode: 0644]
usr/src/contrib/isode/ftam2/ftam-dir.c [new file with mode: 0644]
usr/src/contrib/isode/ftam2/ftam-get.c [new file with mode: 0644]
usr/src/contrib/isode/ftam2/ftam-glob.c [new file with mode: 0644]
usr/src/contrib/isode/ftam2/ftam-ls.c [new file with mode: 0644]
usr/src/contrib/isode/ftam2/ftam-mgmt.c [new file with mode: 0644]
usr/src/contrib/isode/ftam2/ftam-put.c [new file with mode: 0644]
usr/src/contrib/isode/ftam2/ftam.1c [new file with mode: 0644]
usr/src/contrib/isode/ftam2/ftam.c [new file with mode: 0644]
usr/src/contrib/isode/ftam2/ftamd-manage.c [new file with mode: 0644]
usr/src/contrib/isode/ftam2/ftamd-select.c [new file with mode: 0644]
usr/src/contrib/isode/ftam2/ftamd-trans.c [new file with mode: 0644]
usr/src/contrib/isode/ftam2/ftamd.8c [new file with mode: 0644]
usr/src/contrib/isode/ftam2/ftamd.c [new file with mode: 0644]
usr/src/contrib/isode/ftam2/ftamsbr.c [new file with mode: 0644]
usr/src/contrib/isode/ftam2/ftamsbr.h [new file with mode: 0644]
usr/src/contrib/isode/ftam2/ftamsystem.c [new file with mode: 0644]
usr/src/contrib/isode/ftam2/ftamsystem.h [new file with mode: 0644]
usr/src/contrib/isode/ftam2/ftamuser.c [new file with mode: 0644]
usr/src/contrib/isode/ftam2/ftamuser.h [new file with mode: 0644]
usr/src/contrib/isode/ftam2/ftamusers.5 [new file with mode: 0644]
usr/src/contrib/isode/ftam2/make [new file with mode: 0644]
usr/src/contrib/isode/ftp-ftam/Makefile [new file with mode: 0644]
usr/src/contrib/isode/ftp-ftam/ftpcmd.y [new file with mode: 0644]
usr/src/contrib/isode/ftp-ftam/ftpd-ftam.8c [new file with mode: 0644]
usr/src/contrib/isode/ftp-ftam/ftpd.c [new file with mode: 0644]
usr/src/contrib/isode/ftp-ftam/make [new file with mode: 0644]
usr/src/contrib/isode/h/Makefile [new file with mode: 0644]

diff --git a/usr/src/contrib/isode/dsap/x500as/llib-lx500as b/usr/src/contrib/isode/dsap/x500as/llib-lx500as
new file mode 100644 (file)
index 0000000..754b6a6
--- /dev/null
@@ -0,0 +1,6201 @@
+/* llib-lx500as - lint library for QUIPU x500 abstract syntax */
+
+/* 
+ * $Header: /f/osi/dsap/x500as/RCS/llib-lx500as,v 7.1 91/02/22 09:22:01 mrose Interim $
+ *
+ *
+ * $Log:       llib-lx500as,v $
+ * Revision 7.1  91/02/22  09:22:01  mrose
+ * Interim 6.8
+ * 
+ * Revision 7.0  90/12/06  07:34:47  mrose
+ * *** empty log message ***
+ * 
+ * Revision 7.0  89/11/23  21:50:43  mrose
+ * Release 6.0
+ * 
+ */
+
+/*
+ *                               NOTICE
+ *
+ *    Acquisition, use, and distribution of this module and related
+ *    materials are subject to the restrictions of a license agreement.
+ *    Consult the Preface in the User's Manual for the full terms of
+ *    this agreement.
+ *
+ */
+
+
+/* LINTLIBRARY */
+
+#include "quipu/AF-types.h"
+#include "quipu/DO-types.h"
+#include "quipu/IF-types.h"
+#include "quipu/Quipu-types.h"
+#include "quipu/Thorn-types.h"
+#include "quipu/DAS-types.h"
+#include "quipu/DSE-types.h"
+#include "quipu/NRS-types.h"
+#include "quipu/SA-types.h"
+
+
+#undef encode_AF_Version
+int    encode_AF_Version(pe, top, len, buffer, parm)
+PE     *pe;
+int    top,
+       len;
+char   *buffer;
+struct type_AF_Version *parm;
+{
+  return (enc_f(_ZVersionAF, &_ZAF_mod, pe, top, len, buffer,
+               (char *) parm));
+}
+
+#undef decode_AF_Version
+int    decode_AF_Version(pe, top, len, buffer, parm)
+PE     pe;
+int    top,
+       *len;
+char  **buffer;
+struct type_AF_Version **parm;
+{
+  return (dec_f(_ZVersionAF, &_ZAF_mod, pe, top, len, buffer,
+               (char **) parm));
+}
+
+#undef print_AF_Version
+/* ARGSUSED */
+int    print_AF_Version(pe, top, len, buffer, parm)
+PE     pe;
+int    top,
+       *len;
+char  **buffer,
+       *parm;
+{
+  return (prnt_f(_ZVersionAF, &_ZAF_mod, pe, top, len, buffer));
+}
+
+#undef encode_AF_CertificateSerialNumber
+int    encode_AF_CertificateSerialNumber(pe, top, len, buffer, parm)
+PE     *pe;
+int    top,
+       len;
+char   *buffer;
+struct type_AF_CertificateSerialNumber *parm;
+{
+  return (enc_f(_ZCertificateSerialNumberAF, &_ZAF_mod, pe, top, len, buffer,
+               (char *) parm));
+}
+
+#undef decode_AF_CertificateSerialNumber
+int    decode_AF_CertificateSerialNumber(pe, top, len, buffer, parm)
+PE     pe;
+int    top,
+       *len;
+char  **buffer;
+struct type_AF_CertificateSerialNumber **parm;
+{
+  return (dec_f(_ZCertificateSerialNumberAF, &_ZAF_mod, pe, top, len, buffer,
+               (char **) parm));
+}
+
+#undef print_AF_CertificateSerialNumber
+/* ARGSUSED */
+int    print_AF_CertificateSerialNumber(pe, top, len, buffer, parm)
+PE     pe;
+int    top,
+       *len;
+char  **buffer,
+       *parm;
+{
+  return (prnt_f(_ZCertificateSerialNumberAF, &_ZAF_mod, pe, top, len, buffer));
+}
+
+#undef encode_AF_Validity
+int    encode_AF_Validity(pe, top, len, buffer, parm)
+PE     *pe;
+int    top,
+       len;
+char   *buffer;
+struct type_AF_Validity *parm;
+{
+  return (enc_f(_ZValidityAF, &_ZAF_mod, pe, top, len, buffer,
+               (char *) parm));
+}
+
+#undef decode_AF_Validity
+int    decode_AF_Validity(pe, top, len, buffer, parm)
+PE     pe;
+int    top,
+       *len;
+char  **buffer;
+struct type_AF_Validity **parm;
+{
+  return (dec_f(_ZValidityAF, &_ZAF_mod, pe, top, len, buffer,
+               (char **) parm));
+}
+
+#undef print_AF_Validity
+/* ARGSUSED */
+int    print_AF_Validity(pe, top, len, buffer, parm)
+PE     pe;
+int    top,
+       *len;
+char  **buffer,
+       *parm;
+{
+  return (prnt_f(_ZValidityAF, &_ZAF_mod, pe, top, len, buffer));
+}
+
+#undef encode_AF_AlgorithmIdentifier
+int    encode_AF_AlgorithmIdentifier(pe, top, len, buffer, parm)
+PE     *pe;
+int    top,
+       len;
+char   *buffer;
+struct type_AF_AlgorithmIdentifier *parm;
+{
+  return (enc_f(_ZAlgorithmIdentifierAF, &_ZAF_mod, pe, top, len, buffer,
+               (char *) parm));
+}
+
+#undef decode_AF_AlgorithmIdentifier
+int    decode_AF_AlgorithmIdentifier(pe, top, len, buffer, parm)
+PE     pe;
+int    top,
+       *len;
+char  **buffer;
+struct type_AF_AlgorithmIdentifier **parm;
+{
+  return (dec_f(_ZAlgorithmIdentifierAF, &_ZAF_mod, pe, top, len, buffer,
+               (char **) parm));
+}
+
+#undef print_AF_AlgorithmIdentifier
+/* ARGSUSED */
+int    print_AF_AlgorithmIdentifier(pe, top, len, buffer, parm)
+PE     pe;
+int    top,
+       *len;
+char  **buffer,
+       *parm;
+{
+  return (prnt_f(_ZAlgorithmIdentifierAF, &_ZAF_mod, pe, top, len, buffer));
+}
+
+#undef encode_AF_SubjectPublicKeyInfo
+int    encode_AF_SubjectPublicKeyInfo(pe, top, len, buffer, parm)
+PE     *pe;
+int    top,
+       len;
+char   *buffer;
+struct type_AF_SubjectPublicKeyInfo *parm;
+{
+  return (enc_f(_ZSubjectPublicKeyInfoAF, &_ZAF_mod, pe, top, len, buffer,
+               (char *) parm));
+}
+
+#undef decode_AF_SubjectPublicKeyInfo
+int    decode_AF_SubjectPublicKeyInfo(pe, top, len, buffer, parm)
+PE     pe;
+int    top,
+       *len;
+char  **buffer;
+struct type_AF_SubjectPublicKeyInfo **parm;
+{
+  return (dec_f(_ZSubjectPublicKeyInfoAF, &_ZAF_mod, pe, top, len, buffer,
+               (char **) parm));
+}
+
+#undef print_AF_SubjectPublicKeyInfo
+/* ARGSUSED */
+int    print_AF_SubjectPublicKeyInfo(pe, top, len, buffer, parm)
+PE     pe;
+int    top,
+       *len;
+char  **buffer,
+       *parm;
+{
+  return (prnt_f(_ZSubjectPublicKeyInfoAF, &_ZAF_mod, pe, top, len, buffer));
+}
+
+#undef encode_AF_CertificateToSign
+int    encode_AF_CertificateToSign(pe, top, len, buffer, parm)
+PE     *pe;
+int    top,
+       len;
+char   *buffer;
+struct type_AF_CertificateToSign *parm;
+{
+  return (enc_f(_ZCertificateToSignAF, &_ZAF_mod, pe, top, len, buffer,
+               (char *) parm));
+}
+
+#undef decode_AF_CertificateToSign
+int    decode_AF_CertificateToSign(pe, top, len, buffer, parm)
+PE     pe;
+int    top,
+       *len;
+char  **buffer;
+struct type_AF_CertificateToSign **parm;
+{
+  return (dec_f(_ZCertificateToSignAF, &_ZAF_mod, pe, top, len, buffer,
+               (char **) parm));
+}
+
+#undef print_AF_CertificateToSign
+/* ARGSUSED */
+int    print_AF_CertificateToSign(pe, top, len, buffer, parm)
+PE     pe;
+int    top,
+       *len;
+char  **buffer,
+       *parm;
+{
+  return (prnt_f(_ZCertificateToSignAF, &_ZAF_mod, pe, top, len, buffer));
+}
+
+#undef encode_AF_Certificate
+int    encode_AF_Certificate(pe, top, len, buffer, parm)
+PE     *pe;
+int    top,
+       len;
+char   *buffer;
+struct type_AF_Certificate *parm;
+{
+  return (enc_f(_ZCertificateAF, &_ZAF_mod, pe, top, len, buffer,
+               (char *) parm));
+}
+
+#undef decode_AF_Certificate
+int    decode_AF_Certificate(pe, top, len, buffer, parm)
+PE     pe;
+int    top,
+       *len;
+char  **buffer;
+struct type_AF_Certificate **parm;
+{
+  return (dec_f(_ZCertificateAF, &_ZAF_mod, pe, top, len, buffer,
+               (char **) parm));
+}
+
+#undef print_AF_Certificate
+/* ARGSUSED */
+int    print_AF_Certificate(pe, top, len, buffer, parm)
+PE     pe;
+int    top,
+       *len;
+char  **buffer,
+       *parm;
+{
+  return (prnt_f(_ZCertificateAF, &_ZAF_mod, pe, top, len, buffer));
+}
+
+#undef encode_AF_CrossCertificates
+int    encode_AF_CrossCertificates(pe, top, len, buffer, parm)
+PE     *pe;
+int    top,
+       len;
+char   *buffer;
+struct type_AF_CrossCertificates *parm;
+{
+  return (enc_f(_ZCrossCertificatesAF, &_ZAF_mod, pe, top, len, buffer,
+               (char *) parm));
+}
+
+#undef decode_AF_CrossCertificates
+int    decode_AF_CrossCertificates(pe, top, len, buffer, parm)
+PE     pe;
+int    top,
+       *len;
+char  **buffer;
+struct type_AF_CrossCertificates **parm;
+{
+  return (dec_f(_ZCrossCertificatesAF, &_ZAF_mod, pe, top, len, buffer,
+               (char **) parm));
+}
+
+#undef print_AF_CrossCertificates
+/* ARGSUSED */
+int    print_AF_CrossCertificates(pe, top, len, buffer, parm)
+PE     pe;
+int    top,
+       *len;
+char  **buffer,
+       *parm;
+{
+  return (prnt_f(_ZCrossCertificatesAF, &_ZAF_mod, pe, top, len, buffer));
+}
+
+#undef encode_AF_ForwardCertificationPath
+int    encode_AF_ForwardCertificationPath(pe, top, len, buffer, parm)
+PE     *pe;
+int    top,
+       len;
+char   *buffer;
+struct type_AF_ForwardCertificationPath *parm;
+{
+  return (enc_f(_ZForwardCertificationPathAF, &_ZAF_mod, pe, top, len, buffer,
+               (char *) parm));
+}
+
+#undef decode_AF_ForwardCertificationPath
+int    decode_AF_ForwardCertificationPath(pe, top, len, buffer, parm)
+PE     pe;
+int    top,
+       *len;
+char  **buffer;
+struct type_AF_ForwardCertificationPath **parm;
+{
+  return (dec_f(_ZForwardCertificationPathAF, &_ZAF_mod, pe, top, len, buffer,
+               (char **) parm));
+}
+
+#undef print_AF_ForwardCertificationPath
+/* ARGSUSED */
+int    print_AF_ForwardCertificationPath(pe, top, len, buffer, parm)
+PE     pe;
+int    top,
+       *len;
+char  **buffer,
+       *parm;
+{
+  return (prnt_f(_ZForwardCertificationPathAF, &_ZAF_mod, pe, top, len, buffer));
+}
+
+#undef encode_AF_Certificates
+int    encode_AF_Certificates(pe, top, len, buffer, parm)
+PE     *pe;
+int    top,
+       len;
+char   *buffer;
+struct type_AF_Certificates *parm;
+{
+  return (enc_f(_ZCertificatesAF, &_ZAF_mod, pe, top, len, buffer,
+               (char *) parm));
+}
+
+#undef decode_AF_Certificates
+int    decode_AF_Certificates(pe, top, len, buffer, parm)
+PE     pe;
+int    top,
+       *len;
+char  **buffer;
+struct type_AF_Certificates **parm;
+{
+  return (dec_f(_ZCertificatesAF, &_ZAF_mod, pe, top, len, buffer,
+               (char **) parm));
+}
+
+#undef print_AF_Certificates
+/* ARGSUSED */
+int    print_AF_Certificates(pe, top, len, buffer, parm)
+PE     pe;
+int    top,
+       *len;
+char  **buffer,
+       *parm;
+{
+  return (prnt_f(_ZCertificatesAF, &_ZAF_mod, pe, top, len, buffer));
+}
+
+#undef encode_AF_CertificatePair
+int    encode_AF_CertificatePair(pe, top, len, buffer, parm)
+PE     *pe;
+int    top,
+       len;
+char   *buffer;
+struct type_AF_CertificatePair *parm;
+{
+  return (enc_f(_ZCertificatePairAF, &_ZAF_mod, pe, top, len, buffer,
+               (char *) parm));
+}
+
+#undef decode_AF_CertificatePair
+int    decode_AF_CertificatePair(pe, top, len, buffer, parm)
+PE     pe;
+int    top,
+       *len;
+char  **buffer;
+struct type_AF_CertificatePair **parm;
+{
+  return (dec_f(_ZCertificatePairAF, &_ZAF_mod, pe, top, len, buffer,
+               (char **) parm));
+}
+
+#undef print_AF_CertificatePair
+/* ARGSUSED */
+int    print_AF_CertificatePair(pe, top, len, buffer, parm)
+PE     pe;
+int    top,
+       *len;
+char  **buffer,
+       *parm;
+{
+  return (prnt_f(_ZCertificatePairAF, &_ZAF_mod, pe, top, len, buffer));
+}
+
+#undef encode_AF_CertificationPath
+int    encode_AF_CertificationPath(pe, top, len, buffer, parm)
+PE     *pe;
+int    top,
+       len;
+char   *buffer;
+struct type_AF_CertificationPath *parm;
+{
+  return (enc_f(_ZCertificationPathAF, &_ZAF_mod, pe, top, len, buffer,
+               (char *) parm));
+}
+
+#undef decode_AF_CertificationPath
+int    decode_AF_CertificationPath(pe, top, len, buffer, parm)
+PE     pe;
+int    top,
+       *len;
+char  **buffer;
+struct type_AF_CertificationPath **parm;
+{
+  return (dec_f(_ZCertificationPathAF, &_ZAF_mod, pe, top, len, buffer,
+               (char **) parm));
+}
+
+#undef print_AF_CertificationPath
+/* ARGSUSED */
+int    print_AF_CertificationPath(pe, top, len, buffer, parm)
+PE     pe;
+int    top,
+       *len;
+char  **buffer,
+       *parm;
+{
+  return (prnt_f(_ZCertificationPathAF, &_ZAF_mod, pe, top, len, buffer));
+}
+
+#undef encode_AF_RevokedCertificatesToSign
+int    encode_AF_RevokedCertificatesToSign(pe, top, len, buffer, parm)
+PE     *pe;
+int    top,
+       len;
+char   *buffer;
+struct type_AF_RevokedCertificatesToSign *parm;
+{
+  return (enc_f(_ZRevokedCertificatesToSignAF, &_ZAF_mod, pe, top, len, buffer,
+               (char *) parm));
+}
+
+#undef decode_AF_RevokedCertificatesToSign
+int    decode_AF_RevokedCertificatesToSign(pe, top, len, buffer, parm)
+PE     pe;
+int    top,
+       *len;
+char  **buffer;
+struct type_AF_RevokedCertificatesToSign **parm;
+{
+  return (dec_f(_ZRevokedCertificatesToSignAF, &_ZAF_mod, pe, top, len, buffer,
+               (char **) parm));
+}
+
+#undef print_AF_RevokedCertificatesToSign
+/* ARGSUSED */
+int    print_AF_RevokedCertificatesToSign(pe, top, len, buffer, parm)
+PE     pe;
+int    top,
+       *len;
+char  **buffer,
+       *parm;
+{
+  return (prnt_f(_ZRevokedCertificatesToSignAF, &_ZAF_mod, pe, top, len, buffer));
+}
+
+#undef encode_AF_RevokedCertificates
+int    encode_AF_RevokedCertificates(pe, top, len, buffer, parm)
+PE     *pe;
+int    top,
+       len;
+char   *buffer;
+struct type_AF_RevokedCertificates *parm;
+{
+  return (enc_f(_ZRevokedCertificatesAF, &_ZAF_mod, pe, top, len, buffer,
+               (char *) parm));
+}
+
+#undef decode_AF_RevokedCertificates
+int    decode_AF_RevokedCertificates(pe, top, len, buffer, parm)
+PE     pe;
+int    top,
+       *len;
+char  **buffer;
+struct type_AF_RevokedCertificates **parm;
+{
+  return (dec_f(_ZRevokedCertificatesAF, &_ZAF_mod, pe, top, len, buffer,
+               (char **) parm));
+}
+
+#undef print_AF_RevokedCertificates
+/* ARGSUSED */
+int    print_AF_RevokedCertificates(pe, top, len, buffer, parm)
+PE     pe;
+int    top,
+       *len;
+char  **buffer,
+       *parm;
+{
+  return (prnt_f(_ZRevokedCertificatesAF, &_ZAF_mod, pe, top, len, buffer));
+}
+
+#undef encode_AF_CertificateListToSign
+int    encode_AF_CertificateListToSign(pe, top, len, buffer, parm)
+PE     *pe;
+int    top,
+       len;
+char   *buffer;
+struct type_AF_CertificateListToSign *parm;
+{
+  return (enc_f(_ZCertificateListToSignAF, &_ZAF_mod, pe, top, len, buffer,
+               (char *) parm));
+}
+
+#undef decode_AF_CertificateListToSign
+int    decode_AF_CertificateListToSign(pe, top, len, buffer, parm)
+PE     pe;
+int    top,
+       *len;
+char  **buffer;
+struct type_AF_CertificateListToSign **parm;
+{
+  return (dec_f(_ZCertificateListToSignAF, &_ZAF_mod, pe, top, len, buffer,
+               (char **) parm));
+}
+
+#undef print_AF_CertificateListToSign
+/* ARGSUSED */
+int    print_AF_CertificateListToSign(pe, top, len, buffer, parm)
+PE     pe;
+int    top,
+       *len;
+char  **buffer,
+       *parm;
+{
+  return (prnt_f(_ZCertificateListToSignAF, &_ZAF_mod, pe, top, len, buffer));
+}
+
+#undef encode_AF_CertificateList
+int    encode_AF_CertificateList(pe, top, len, buffer, parm)
+PE     *pe;
+int    top,
+       len;
+char   *buffer;
+struct type_AF_CertificateList *parm;
+{
+  return (enc_f(_ZCertificateListAF, &_ZAF_mod, pe, top, len, buffer,
+               (char *) parm));
+}
+
+#undef decode_AF_CertificateList
+int    decode_AF_CertificateList(pe, top, len, buffer, parm)
+PE     pe;
+int    top,
+       *len;
+char  **buffer;
+struct type_AF_CertificateList **parm;
+{
+  return (dec_f(_ZCertificateListAF, &_ZAF_mod, pe, top, len, buffer,
+               (char **) parm));
+}
+
+#undef print_AF_CertificateList
+/* ARGSUSED */
+int    print_AF_CertificateList(pe, top, len, buffer, parm)
+PE     pe;
+int    top,
+       *len;
+char  **buffer,
+       *parm;
+{
+  return (prnt_f(_ZCertificateListAF, &_ZAF_mod, pe, top, len, buffer));
+}
+
+#undef print_IF_AttributeType
+/* ARGSUSED */
+int    print_IF_AttributeType(pe, top, len, buffer, parm)
+PE     pe;
+int    top,
+       *len;
+char  **buffer,
+       *parm;
+{
+  return (prnt_f(_ZAttributeTypeIF, &_ZIF_mod, pe, top, len, buffer));
+}
+
+#undef encode_IF_AttributeValue
+int    encode_IF_AttributeValue(pe, top, len, buffer, parm)
+PE     *pe;
+int    top,
+       len;
+char   *buffer;
+struct type_IF_AttributeValue *parm;
+{
+  return (enc_f(_ZAttributeValueIF, &_ZIF_mod, pe, top, len, buffer,
+               (char *) parm));
+}
+
+#undef decode_IF_AttributeValue
+int    decode_IF_AttributeValue(pe, top, len, buffer, parm)
+PE     pe;
+int    top,
+       *len;
+char  **buffer;
+struct type_IF_AttributeValue **parm;
+{
+  return (dec_f(_ZAttributeValueIF, &_ZIF_mod, pe, top, len, buffer,
+               (char **) parm));
+}
+
+#undef print_IF_AttributeValue
+/* ARGSUSED */
+int    print_IF_AttributeValue(pe, top, len, buffer, parm)
+PE     pe;
+int    top,
+       *len;
+char  **buffer,
+       *parm;
+{
+  return (prnt_f(_ZAttributeValueIF, &_ZIF_mod, pe, top, len, buffer));
+}
+
+#undef encode_IF_AttributeValueAssertion
+int    encode_IF_AttributeValueAssertion(pe, top, len, buffer, parm)
+PE     *pe;
+int    top,
+       len;
+char   *buffer;
+struct type_IF_AttributeValueAssertion *parm;
+{
+  return (enc_f(_ZAttributeValueAssertionIF, &_ZIF_mod, pe, top, len, buffer,
+               (char *) parm));
+}
+
+#undef decode_IF_AttributeValueAssertion
+int    decode_IF_AttributeValueAssertion(pe, top, len, buffer, parm)
+PE     pe;
+int    top,
+       *len;
+char  **buffer;
+struct type_IF_AttributeValueAssertion **parm;
+{
+  return (dec_f(_ZAttributeValueAssertionIF, &_ZIF_mod, pe, top, len, buffer,
+               (char **) parm));
+}
+
+#undef print_IF_AttributeValueAssertion
+/* ARGSUSED */
+int    print_IF_AttributeValueAssertion(pe, top, len, buffer, parm)
+PE     pe;
+int    top,
+       *len;
+char  **buffer,
+       *parm;
+{
+  return (prnt_f(_ZAttributeValueAssertionIF, &_ZIF_mod, pe, top, len, buffer));
+}
+
+#undef encode_IF_Attribute
+int    encode_IF_Attribute(pe, top, len, buffer, parm)
+PE     *pe;
+int    top,
+       len;
+char   *buffer;
+struct type_IF_Attribute *parm;
+{
+  return (enc_f(_ZAttributeIF, &_ZIF_mod, pe, top, len, buffer,
+               (char *) parm));
+}
+
+#undef decode_IF_Attribute
+int    decode_IF_Attribute(pe, top, len, buffer, parm)
+PE     pe;
+int    top,
+       *len;
+char  **buffer;
+struct type_IF_Attribute **parm;
+{
+  return (dec_f(_ZAttributeIF, &_ZIF_mod, pe, top, len, buffer,
+               (char **) parm));
+}
+
+#undef print_IF_Attribute
+/* ARGSUSED */
+int    print_IF_Attribute(pe, top, len, buffer, parm)
+PE     pe;
+int    top,
+       *len;
+char  **buffer,
+       *parm;
+{
+  return (prnt_f(_ZAttributeIF, &_ZIF_mod, pe, top, len, buffer));
+}
+
+#undef encode_IF_D__AValues
+int    encode_IF_D__AValues(pe, top, len, buffer, parm)
+PE     *pe;
+int    top,
+       len;
+char   *buffer;
+struct type_IF_D__AValues *parm;
+{
+  return (enc_f(_ZD_AValuesIF, &_ZIF_mod, pe, top, len, buffer,
+               (char *) parm));
+}
+
+#undef decode_IF_D__AValues
+int    decode_IF_D__AValues(pe, top, len, buffer, parm)
+PE     pe;
+int    top,
+       *len;
+char  **buffer;
+struct type_IF_D__AValues **parm;
+{
+  return (dec_f(_ZD_AValuesIF, &_ZIF_mod, pe, top, len, buffer,
+               (char **) parm));
+}
+
+#undef print_IF_D__AValues
+/* ARGSUSED */
+int    print_IF_D__AValues(pe, top, len, buffer, parm)
+PE     pe;
+int    top,
+       *len;
+char  **buffer,
+       *parm;
+{
+  return (prnt_f(_ZD_AValuesIF, &_ZIF_mod, pe, top, len, buffer));
+}
+
+#undef encode_IF_RelativeDistinguishedName
+int    encode_IF_RelativeDistinguishedName(pe, top, len, buffer, parm)
+PE     *pe;
+int    top,
+       len;
+char   *buffer;
+struct type_IF_RelativeDistinguishedName *parm;
+{
+  return (enc_f(_ZRelativeDistinguishedNameIF, &_ZIF_mod, pe, top, len, buffer,
+               (char *) parm));
+}
+
+#undef decode_IF_RelativeDistinguishedName
+int    decode_IF_RelativeDistinguishedName(pe, top, len, buffer, parm)
+PE     pe;
+int    top,
+       *len;
+char  **buffer;
+struct type_IF_RelativeDistinguishedName **parm;
+{
+  return (dec_f(_ZRelativeDistinguishedNameIF, &_ZIF_mod, pe, top, len, buffer,
+               (char **) parm));
+}
+
+#undef print_IF_RelativeDistinguishedName
+/* ARGSUSED */
+int    print_IF_RelativeDistinguishedName(pe, top, len, buffer, parm)
+PE     pe;
+int    top,
+       *len;
+char  **buffer,
+       *parm;
+{
+  return (prnt_f(_ZRelativeDistinguishedNameIF, &_ZIF_mod, pe, top, len, buffer));
+}
+
+#undef encode_IF_RDNSequence
+int    encode_IF_RDNSequence(pe, top, len, buffer, parm)
+PE     *pe;
+int    top,
+       len;
+char   *buffer;
+struct type_IF_RDNSequence *parm;
+{
+  return (enc_f(_ZRDNSequenceIF, &_ZIF_mod, pe, top, len, buffer,
+               (char *) parm));
+}
+
+#undef decode_IF_RDNSequence
+int    decode_IF_RDNSequence(pe, top, len, buffer, parm)
+PE     pe;
+int    top,
+       *len;
+char  **buffer;
+struct type_IF_RDNSequence **parm;
+{
+  return (dec_f(_ZRDNSequenceIF, &_ZIF_mod, pe, top, len, buffer,
+               (char **) parm));
+}
+
+#undef print_IF_RDNSequence
+/* ARGSUSED */
+int    print_IF_RDNSequence(pe, top, len, buffer, parm)
+PE     pe;
+int    top,
+       *len;
+char  **buffer,
+       *parm;
+{
+  return (prnt_f(_ZRDNSequenceIF, &_ZIF_mod, pe, top, len, buffer));
+}
+
+#undef encode_IF_DistinguishedName
+int    encode_IF_DistinguishedName(pe, top, len, buffer, parm)
+PE     *pe;
+int    top,
+       len;
+char   *buffer;
+struct type_IF_DistinguishedName *parm;
+{
+  return (enc_f(_ZDistinguishedNameIF, &_ZIF_mod, pe, top, len, buffer,
+               (char *) parm));
+}
+
+#undef decode_IF_DistinguishedName
+int    decode_IF_DistinguishedName(pe, top, len, buffer, parm)
+PE     pe;
+int    top,
+       *len;
+char  **buffer;
+struct type_IF_DistinguishedName **parm;
+{
+  return (dec_f(_ZDistinguishedNameIF, &_ZIF_mod, pe, top, len, buffer,
+               (char **) parm));
+}
+
+#undef print_IF_DistinguishedName
+/* ARGSUSED */
+int    print_IF_DistinguishedName(pe, top, len, buffer, parm)
+PE     pe;
+int    top,
+       *len;
+char  **buffer,
+       *parm;
+{
+  return (prnt_f(_ZDistinguishedNameIF, &_ZIF_mod, pe, top, len, buffer));
+}
+
+#undef encode_IF_Name
+int    encode_IF_Name(pe, top, len, buffer, parm)
+PE     *pe;
+int    top,
+       len;
+char   *buffer;
+struct type_IF_Name *parm;
+{
+  return (enc_f(_ZNameIF, &_ZIF_mod, pe, top, len, buffer,
+               (char *) parm));
+}
+
+#undef decode_IF_Name
+int    decode_IF_Name(pe, top, len, buffer, parm)
+PE     pe;
+int    top,
+       *len;
+char  **buffer;
+struct type_IF_Name **parm;
+{
+  return (dec_f(_ZNameIF, &_ZIF_mod, pe, top, len, buffer,
+               (char **) parm));
+}
+
+#undef print_IF_Name
+/* ARGSUSED */
+int    print_IF_Name(pe, top, len, buffer, parm)
+PE     pe;
+int    top,
+       *len;
+char  **buffer,
+       *parm;
+{
+  return (prnt_f(_ZNameIF, &_ZIF_mod, pe, top, len, buffer));
+}
+
+#undef print_Quipu_AccessSelector
+/* ARGSUSED */
+int    print_Quipu_AccessSelector(pe, top, len, buffer, parm)
+PE     pe;
+int    top,
+       *len;
+char  **buffer,
+       *parm;
+{
+  return (prnt_f(_ZAccessSelectorQuipu, &_ZQuipu_mod, pe, top, len, buffer));
+}
+
+#undef encode_Quipu_AccessCategories
+int    encode_Quipu_AccessCategories(pe, top, len, buffer, parm)
+PE     *pe;
+int    top,
+       len;
+char   *buffer;
+struct type_Quipu_AccessCategories *parm;
+{
+  return (enc_f(_ZAccessCategoriesQuipu, &_ZQuipu_mod, pe, top, len, buffer,
+               (char *) parm));
+}
+
+#undef decode_Quipu_AccessCategories
+int    decode_Quipu_AccessCategories(pe, top, len, buffer, parm)
+PE     pe;
+int    top,
+       *len;
+char  **buffer;
+struct type_Quipu_AccessCategories **parm;
+{
+  return (dec_f(_ZAccessCategoriesQuipu, &_ZQuipu_mod, pe, top, len, buffer,
+               (char **) parm));
+}
+
+#undef print_Quipu_AccessCategories
+/* ARGSUSED */
+int    print_Quipu_AccessCategories(pe, top, len, buffer, parm)
+PE     pe;
+int    top,
+       *len;
+char  **buffer,
+       *parm;
+{
+  return (prnt_f(_ZAccessCategoriesQuipu, &_ZQuipu_mod, pe, top, len, buffer));
+}
+
+#undef encode_Quipu_ACLInfo
+int    encode_Quipu_ACLInfo(pe, top, len, buffer, parm)
+PE     *pe;
+int    top,
+       len;
+char   *buffer;
+struct type_Quipu_ACLInfo *parm;
+{
+  return (enc_f(_ZACLInfoQuipu, &_ZQuipu_mod, pe, top, len, buffer,
+               (char *) parm));
+}
+
+#undef decode_Quipu_ACLInfo
+int    decode_Quipu_ACLInfo(pe, top, len, buffer, parm)
+PE     pe;
+int    top,
+       *len;
+char  **buffer;
+struct type_Quipu_ACLInfo **parm;
+{
+  return (dec_f(_ZACLInfoQuipu, &_ZQuipu_mod, pe, top, len, buffer,
+               (char **) parm));
+}
+
+#undef print_Quipu_ACLInfo
+/* ARGSUSED */
+int    print_Quipu_ACLInfo(pe, top, len, buffer, parm)
+PE     pe;
+int    top,
+       *len;
+char  **buffer,
+       *parm;
+{
+  return (prnt_f(_ZACLInfoQuipu, &_ZQuipu_mod, pe, top, len, buffer));
+}
+
+#undef encode_Quipu_AttributeACL
+int    encode_Quipu_AttributeACL(pe, top, len, buffer, parm)
+PE     *pe;
+int    top,
+       len;
+char   *buffer;
+struct type_Quipu_AttributeACL *parm;
+{
+  return (enc_f(_ZAttributeACLQuipu, &_ZQuipu_mod, pe, top, len, buffer,
+               (char *) parm));
+}
+
+#undef decode_Quipu_AttributeACL
+int    decode_Quipu_AttributeACL(pe, top, len, buffer, parm)
+PE     pe;
+int    top,
+       *len;
+char  **buffer;
+struct type_Quipu_AttributeACL **parm;
+{
+  return (dec_f(_ZAttributeACLQuipu, &_ZQuipu_mod, pe, top, len, buffer,
+               (char **) parm));
+}
+
+#undef print_Quipu_AttributeACL
+/* ARGSUSED */
+int    print_Quipu_AttributeACL(pe, top, len, buffer, parm)
+PE     pe;
+int    top,
+       *len;
+char  **buffer,
+       *parm;
+{
+  return (prnt_f(_ZAttributeACLQuipu, &_ZQuipu_mod, pe, top, len, buffer));
+}
+
+#undef encode_Quipu_ACLSyntax
+int    encode_Quipu_ACLSyntax(pe, top, len, buffer, parm)
+PE     *pe;
+int    top,
+       len;
+char   *buffer;
+struct type_Quipu_ACLSyntax *parm;
+{
+  return (enc_f(_ZACLSyntaxQuipu, &_ZQuipu_mod, pe, top, len, buffer,
+               (char *) parm));
+}
+
+#undef decode_Quipu_ACLSyntax
+int    decode_Quipu_ACLSyntax(pe, top, len, buffer, parm)
+PE     pe;
+int    top,
+       *len;
+char  **buffer;
+struct type_Quipu_ACLSyntax **parm;
+{
+  return (dec_f(_ZACLSyntaxQuipu, &_ZQuipu_mod, pe, top, len, buffer,
+               (char **) parm));
+}
+
+#undef print_Quipu_ACLSyntax
+/* ARGSUSED */
+int    print_Quipu_ACLSyntax(pe, top, len, buffer, parm)
+PE     pe;
+int    top,
+       *len;
+char  **buffer,
+       *parm;
+{
+  return (prnt_f(_ZACLSyntaxQuipu, &_ZQuipu_mod, pe, top, len, buffer));
+}
+
+#undef encode_Quipu_NameList
+int    encode_Quipu_NameList(pe, top, len, buffer, parm)
+PE     *pe;
+int    top,
+       len;
+char   *buffer;
+struct type_Quipu_NameList *parm;
+{
+  return (enc_f(_ZNameListQuipu, &_ZQuipu_mod, pe, top, len, buffer,
+               (char *) parm));
+}
+
+#undef decode_Quipu_NameList
+int    decode_Quipu_NameList(pe, top, len, buffer, parm)
+PE     pe;
+int    top,
+       *len;
+char  **buffer;
+struct type_Quipu_NameList **parm;
+{
+  return (dec_f(_ZNameListQuipu, &_ZQuipu_mod, pe, top, len, buffer,
+               (char **) parm));
+}
+
+#undef print_Quipu_NameList
+/* ARGSUSED */
+int    print_Quipu_NameList(pe, top, len, buffer, parm)
+PE     pe;
+int    top,
+       *len;
+char  **buffer,
+       *parm;
+{
+  return (prnt_f(_ZNameListQuipu, &_ZQuipu_mod, pe, top, len, buffer));
+}
+
+#undef encode_Quipu_EDBInfoSyntax
+int    encode_Quipu_EDBInfoSyntax(pe, top, len, buffer, parm)
+PE     *pe;
+int    top,
+       len;
+char   *buffer;
+struct type_Quipu_EDBInfoSyntax *parm;
+{
+  return (enc_f(_ZEDBInfoSyntaxQuipu, &_ZQuipu_mod, pe, top, len, buffer,
+               (char *) parm));
+}
+
+#undef decode_Quipu_EDBInfoSyntax
+int    decode_Quipu_EDBInfoSyntax(pe, top, len, buffer, parm)
+PE     pe;
+int    top,
+       *len;
+char  **buffer;
+struct type_Quipu_EDBInfoSyntax **parm;
+{
+  return (dec_f(_ZEDBInfoSyntaxQuipu, &_ZQuipu_mod, pe, top, len, buffer,
+               (char **) parm));
+}
+
+#undef print_Quipu_EDBInfoSyntax
+/* ARGSUSED */
+int    print_Quipu_EDBInfoSyntax(pe, top, len, buffer, parm)
+PE     pe;
+int    top,
+       *len;
+char  **buffer,
+       *parm;
+{
+  return (prnt_f(_ZEDBInfoSyntaxQuipu, &_ZQuipu_mod, pe, top, len, buffer));
+}
+
+#undef encode_Quipu_RelativeEntry
+int    encode_Quipu_RelativeEntry(pe, top, len, buffer, parm)
+PE     *pe;
+int    top,
+       len;
+char   *buffer;
+struct type_Quipu_RelativeEntry *parm;
+{
+  return (enc_f(_ZRelativeEntryQuipu, &_ZQuipu_mod, pe, top, len, buffer,
+               (char *) parm));
+}
+
+#undef decode_Quipu_RelativeEntry
+int    decode_Quipu_RelativeEntry(pe, top, len, buffer, parm)
+PE     pe;
+int    top,
+       *len;
+char  **buffer;
+struct type_Quipu_RelativeEntry **parm;
+{
+  return (dec_f(_ZRelativeEntryQuipu, &_ZQuipu_mod, pe, top, len, buffer,
+               (char **) parm));
+}
+
+#undef print_Quipu_RelativeEntry
+/* ARGSUSED */
+int    print_Quipu_RelativeEntry(pe, top, len, buffer, parm)
+PE     pe;
+int    top,
+       *len;
+char  **buffer,
+       *parm;
+{
+  return (prnt_f(_ZRelativeEntryQuipu, &_ZQuipu_mod, pe, top, len, buffer));
+}
+
+#undef encode_Quipu_TreeStructureSyntax
+int    encode_Quipu_TreeStructureSyntax(pe, top, len, buffer, parm)
+PE     *pe;
+int    top,
+       len;
+char   *buffer;
+struct type_Quipu_TreeStructureSyntax *parm;
+{
+  return (enc_f(_ZTreeStructureSyntaxQuipu, &_ZQuipu_mod, pe, top, len, buffer,
+               (char *) parm));
+}
+
+#undef decode_Quipu_TreeStructureSyntax
+int    decode_Quipu_TreeStructureSyntax(pe, top, len, buffer, parm)
+PE     pe;
+int    top,
+       *len;
+char  **buffer;
+struct type_Quipu_TreeStructureSyntax **parm;
+{
+  return (dec_f(_ZTreeStructureSyntaxQuipu, &_ZQuipu_mod, pe, top, len, buffer,
+               (char **) parm));
+}
+
+#undef print_Quipu_TreeStructureSyntax
+/* ARGSUSED */
+int    print_Quipu_TreeStructureSyntax(pe, top, len, buffer, parm)
+PE     pe;
+int    top,
+       *len;
+char  **buffer,
+       *parm;
+{
+  return (prnt_f(_ZTreeStructureSyntaxQuipu, &_ZQuipu_mod, pe, top, len, buffer));
+}
+
+#undef encode_Quipu_EntryDataBlock
+int    encode_Quipu_EntryDataBlock(pe, top, len, buffer, parm)
+PE     *pe;
+int    top,
+       len;
+char   *buffer;
+struct type_Quipu_EntryDataBlock *parm;
+{
+  return (enc_f(_ZEntryDataBlockQuipu, &_ZQuipu_mod, pe, top, len, buffer,
+               (char *) parm));
+}
+
+#undef decode_Quipu_EntryDataBlock
+int    decode_Quipu_EntryDataBlock(pe, top, len, buffer, parm)
+PE     pe;
+int    top,
+       *len;
+char  **buffer;
+struct type_Quipu_EntryDataBlock **parm;
+{
+  return (dec_f(_ZEntryDataBlockQuipu, &_ZQuipu_mod, pe, top, len, buffer,
+               (char **) parm));
+}
+
+#undef print_Quipu_EntryDataBlock
+/* ARGSUSED */
+int    print_Quipu_EntryDataBlock(pe, top, len, buffer, parm)
+PE     pe;
+int    top,
+       *len;
+char  **buffer,
+       *parm;
+{
+  return (prnt_f(_ZEntryDataBlockQuipu, &_ZQuipu_mod, pe, top, len, buffer));
+}
+
+#undef encode_Quipu_EDBVersion
+int    encode_Quipu_EDBVersion(pe, top, len, buffer, parm)
+PE     *pe;
+int    top,
+       len;
+char   *buffer;
+struct type_Quipu_EDBVersion *parm;
+{
+  return (enc_f(_ZEDBVersionQuipu, &_ZQuipu_mod, pe, top, len, buffer,
+               (char *) parm));
+}
+
+#undef decode_Quipu_EDBVersion
+int    decode_Quipu_EDBVersion(pe, top, len, buffer, parm)
+PE     pe;
+int    top,
+       *len;
+char  **buffer;
+struct type_Quipu_EDBVersion **parm;
+{
+  return (dec_f(_ZEDBVersionQuipu, &_ZQuipu_mod, pe, top, len, buffer,
+               (char **) parm));
+}
+
+#undef print_Quipu_EDBVersion
+/* ARGSUSED */
+int    print_Quipu_EDBVersion(pe, top, len, buffer, parm)
+PE     pe;
+int    top,
+       *len;
+char  **buffer,
+       *parm;
+{
+  return (prnt_f(_ZEDBVersionQuipu, &_ZQuipu_mod, pe, top, len, buffer));
+}
+
+#undef encode_Quipu_GetEntryDataBlockArgument
+int    encode_Quipu_GetEntryDataBlockArgument(pe, top, len, buffer, parm)
+PE     *pe;
+int    top,
+       len;
+char   *buffer;
+struct type_Quipu_GetEntryDataBlockArgument *parm;
+{
+  return (enc_f(_ZGetEntryDataBlockArgumentQuipu, &_ZQuipu_mod, pe, top, len, buffer,
+               (char *) parm));
+}
+
+#undef decode_Quipu_GetEntryDataBlockArgument
+int    decode_Quipu_GetEntryDataBlockArgument(pe, top, len, buffer, parm)
+PE     pe;
+int    top,
+       *len;
+char  **buffer;
+struct type_Quipu_GetEntryDataBlockArgument **parm;
+{
+  return (dec_f(_ZGetEntryDataBlockArgumentQuipu, &_ZQuipu_mod, pe, top, len, buffer,
+               (char **) parm));
+}
+
+#undef print_Quipu_GetEntryDataBlockArgument
+/* ARGSUSED */
+int    print_Quipu_GetEntryDataBlockArgument(pe, top, len, buffer, parm)
+PE     pe;
+int    top,
+       *len;
+char  **buffer,
+       *parm;
+{
+  return (prnt_f(_ZGetEntryDataBlockArgumentQuipu, &_ZQuipu_mod, pe, top, len, buffer));
+}
+
+#undef encode_Quipu_GetEntryDataBlockResult
+int    encode_Quipu_GetEntryDataBlockResult(pe, top, len, buffer, parm)
+PE     *pe;
+int    top,
+       len;
+char   *buffer;
+struct type_Quipu_GetEntryDataBlockResult *parm;
+{
+  return (enc_f(_ZGetEntryDataBlockResultQuipu, &_ZQuipu_mod, pe, top, len, buffer,
+               (char *) parm));
+}
+
+#undef decode_Quipu_GetEntryDataBlockResult
+int    decode_Quipu_GetEntryDataBlockResult(pe, top, len, buffer, parm)
+PE     pe;
+int    top,
+       *len;
+char  **buffer;
+struct type_Quipu_GetEntryDataBlockResult **parm;
+{
+  return (dec_f(_ZGetEntryDataBlockResultQuipu, &_ZQuipu_mod, pe, top, len, buffer,
+               (char **) parm));
+}
+
+#undef print_Quipu_GetEntryDataBlockResult
+/* ARGSUSED */
+int    print_Quipu_GetEntryDataBlockResult(pe, top, len, buffer, parm)
+PE     pe;
+int    top,
+       *len;
+char  **buffer,
+       *parm;
+{
+  return (prnt_f(_ZGetEntryDataBlockResultQuipu, &_ZQuipu_mod, pe, top, len, buffer));
+}
+
+#undef encode_Quipu_ProtectedPassword
+int    encode_Quipu_ProtectedPassword(pe, top, len, buffer, parm)
+PE     *pe;
+int    top,
+       len;
+char   *buffer;
+struct type_Quipu_ProtectedPassword *parm;
+{
+  return (enc_f(_ZProtectedPasswordQuipu, &_ZQuipu_mod, pe, top, len, buffer,
+               (char *) parm));
+}
+
+#undef decode_Quipu_ProtectedPassword
+int    decode_Quipu_ProtectedPassword(pe, top, len, buffer, parm)
+PE     pe;
+int    top,
+       *len;
+char  **buffer;
+struct type_Quipu_ProtectedPassword **parm;
+{
+  return (dec_f(_ZProtectedPasswordQuipu, &_ZQuipu_mod, pe, top, len, buffer,
+               (char **) parm));
+}
+
+#undef print_Quipu_ProtectedPassword
+/* ARGSUSED */
+int    print_Quipu_ProtectedPassword(pe, top, len, buffer, parm)
+PE     pe;
+int    top,
+       *len;
+char  **buffer,
+       *parm;
+{
+  return (prnt_f(_ZProtectedPasswordQuipu, &_ZQuipu_mod, pe, top, len, buffer));
+}
+
+#undef encode_Quipu_InheritedList
+int    encode_Quipu_InheritedList(pe, top, len, buffer, parm)
+PE     *pe;
+int    top,
+       len;
+char   *buffer;
+struct type_Quipu_InheritedList *parm;
+{
+  return (enc_f(_ZInheritedListQuipu, &_ZQuipu_mod, pe, top, len, buffer,
+               (char *) parm));
+}
+
+#undef decode_Quipu_InheritedList
+int    decode_Quipu_InheritedList(pe, top, len, buffer, parm)
+PE     pe;
+int    top,
+       *len;
+char  **buffer;
+struct type_Quipu_InheritedList **parm;
+{
+  return (dec_f(_ZInheritedListQuipu, &_ZQuipu_mod, pe, top, len, buffer,
+               (char **) parm));
+}
+
+#undef print_Quipu_InheritedList
+/* ARGSUSED */
+int    print_Quipu_InheritedList(pe, top, len, buffer, parm)
+PE     pe;
+int    top,
+       *len;
+char  **buffer,
+       *parm;
+{
+  return (prnt_f(_ZInheritedListQuipu, &_ZQuipu_mod, pe, top, len, buffer));
+}
+
+#undef encode_Quipu_InheritedAttribute
+int    encode_Quipu_InheritedAttribute(pe, top, len, buffer, parm)
+PE     *pe;
+int    top,
+       len;
+char   *buffer;
+struct type_Quipu_InheritedAttribute *parm;
+{
+  return (enc_f(_ZInheritedAttributeQuipu, &_ZQuipu_mod, pe, top, len, buffer,
+               (char *) parm));
+}
+
+#undef decode_Quipu_InheritedAttribute
+int    decode_Quipu_InheritedAttribute(pe, top, len, buffer, parm)
+PE     pe;
+int    top,
+       *len;
+char  **buffer;
+struct type_Quipu_InheritedAttribute **parm;
+{
+  return (dec_f(_ZInheritedAttributeQuipu, &_ZQuipu_mod, pe, top, len, buffer,
+               (char **) parm));
+}
+
+#undef print_Quipu_InheritedAttribute
+/* ARGSUSED */
+int    print_Quipu_InheritedAttribute(pe, top, len, buffer, parm)
+PE     pe;
+int    top,
+       *len;
+char  **buffer,
+       *parm;
+{
+  return (prnt_f(_ZInheritedAttributeQuipu, &_ZQuipu_mod, pe, top, len, buffer));
+}
+
+#undef print_SA_FacsimileTelephoneNumber
+/* ARGSUSED */
+int    print_SA_FacsimileTelephoneNumber(pe, top, len, buffer, parm)
+PE     pe;
+int    top,
+       *len;
+char  **buffer,
+       *parm;
+{
+  return (prnt_f(_ZFacsimileTelephoneNumberSA, &_ZSA_mod, pe, top, len, buffer));
+}
+
+#undef encode_SA_PostalAddress
+int    encode_SA_PostalAddress(pe, top, len, buffer, parm)
+PE     *pe;
+int    top,
+       len;
+char   *buffer;
+struct type_SA_PostalAddress *parm;
+{
+  return (enc_f(_ZPostalAddressSA, &_ZSA_mod, pe, top, len, buffer,
+               (char *) parm));
+}
+
+#undef decode_SA_PostalAddress
+int    decode_SA_PostalAddress(pe, top, len, buffer, parm)
+PE     pe;
+int    top,
+       *len;
+char  **buffer;
+struct type_SA_PostalAddress **parm;
+{
+  return (dec_f(_ZPostalAddressSA, &_ZSA_mod, pe, top, len, buffer,
+               (char **) parm));
+}
+
+#undef print_SA_PostalAddress
+/* ARGSUSED */
+int    print_SA_PostalAddress(pe, top, len, buffer, parm)
+PE     pe;
+int    top,
+       *len;
+char  **buffer,
+       *parm;
+{
+  return (prnt_f(_ZPostalAddressSA, &_ZSA_mod, pe, top, len, buffer));
+}
+
+#undef encode_SA_TelexNumber
+int    encode_SA_TelexNumber(pe, top, len, buffer, parm)
+PE     *pe;
+int    top,
+       len;
+char   *buffer;
+struct type_SA_TelexNumber *parm;
+{
+  return (enc_f(_ZTelexNumberSA, &_ZSA_mod, pe, top, len, buffer,
+               (char *) parm));
+}
+
+#undef decode_SA_TelexNumber
+int    decode_SA_TelexNumber(pe, top, len, buffer, parm)
+PE     pe;
+int    top,
+       *len;
+char  **buffer;
+struct type_SA_TelexNumber **parm;
+{
+  return (dec_f(_ZTelexNumberSA, &_ZSA_mod, pe, top, len, buffer,
+               (char **) parm));
+}
+
+#undef print_SA_TelexNumber
+/* ARGSUSED */
+int    print_SA_TelexNumber(pe, top, len, buffer, parm)
+PE     pe;
+int    top,
+       *len;
+char  **buffer,
+       *parm;
+{
+  return (prnt_f(_ZTelexNumberSA, &_ZSA_mod, pe, top, len, buffer));
+}
+
+#undef encode_SA_TeletexTerminalIdentifier
+int    encode_SA_TeletexTerminalIdentifier(pe, top, len, buffer, parm)
+PE     *pe;
+int    top,
+       len;
+char   *buffer;
+struct type_SA_TeletexTerminalIdentifier *parm;
+{
+  return (enc_f(_ZTeletexTerminalIdentifierSA, &_ZSA_mod, pe, top, len, buffer,
+               (char *) parm));
+}
+
+#undef decode_SA_TeletexTerminalIdentifier
+int    decode_SA_TeletexTerminalIdentifier(pe, top, len, buffer, parm)
+PE     pe;
+int    top,
+       *len;
+char  **buffer;
+struct type_SA_TeletexTerminalIdentifier **parm;
+{
+  return (dec_f(_ZTeletexTerminalIdentifierSA, &_ZSA_mod, pe, top, len, buffer,
+               (char **) parm));
+}
+
+#undef print_SA_TeletexTerminalIdentifier
+/* ARGSUSED */
+int    print_SA_TeletexTerminalIdentifier(pe, top, len, buffer, parm)
+PE     pe;
+int    top,
+       *len;
+char  **buffer,
+       *parm;
+{
+  return (prnt_f(_ZTeletexTerminalIdentifierSA, &_ZSA_mod, pe, top, len, buffer));
+}
+
+#undef encode_SA_PreferredDeliveryMethod
+int    encode_SA_PreferredDeliveryMethod(pe, top, len, buffer, parm)
+PE     *pe;
+int    top,
+       len;
+char   *buffer;
+struct type_SA_PreferredDeliveryMethod *parm;
+{
+  return (enc_f(_ZPreferredDeliveryMethodSA, &_ZSA_mod, pe, top, len, buffer,
+               (char *) parm));
+}
+
+#undef decode_SA_PreferredDeliveryMethod
+int    decode_SA_PreferredDeliveryMethod(pe, top, len, buffer, parm)
+PE     pe;
+int    top,
+       *len;
+char  **buffer;
+struct type_SA_PreferredDeliveryMethod **parm;
+{
+  return (dec_f(_ZPreferredDeliveryMethodSA, &_ZSA_mod, pe, top, len, buffer,
+               (char **) parm));
+}
+
+#undef print_SA_PreferredDeliveryMethod
+/* ARGSUSED */
+int    print_SA_PreferredDeliveryMethod(pe, top, len, buffer, parm)
+PE     pe;
+int    top,
+       *len;
+char  **buffer,
+       *parm;
+{
+  return (prnt_f(_ZPreferredDeliveryMethodSA, &_ZSA_mod, pe, top, len, buffer));
+}
+
+#undef encode_SA_CriteriaItem
+int    encode_SA_CriteriaItem(pe, top, len, buffer, parm)
+PE     *pe;
+int    top,
+       len;
+char   *buffer;
+struct type_SA_CriteriaItem *parm;
+{
+  return (enc_f(_ZCriteriaItemSA, &_ZSA_mod, pe, top, len, buffer,
+               (char *) parm));
+}
+
+#undef decode_SA_CriteriaItem
+int    decode_SA_CriteriaItem(pe, top, len, buffer, parm)
+PE     pe;
+int    top,
+       *len;
+char  **buffer;
+struct type_SA_CriteriaItem **parm;
+{
+  return (dec_f(_ZCriteriaItemSA, &_ZSA_mod, pe, top, len, buffer,
+               (char **) parm));
+}
+
+#undef print_SA_CriteriaItem
+/* ARGSUSED */
+int    print_SA_CriteriaItem(pe, top, len, buffer, parm)
+PE     pe;
+int    top,
+       *len;
+char  **buffer,
+       *parm;
+{
+  return (prnt_f(_ZCriteriaItemSA, &_ZSA_mod, pe, top, len, buffer));
+}
+
+#undef encode_SA_Criteria
+int    encode_SA_Criteria(pe, top, len, buffer, parm)
+PE     *pe;
+int    top,
+       len;
+char   *buffer;
+struct type_SA_Criteria *parm;
+{
+  return (enc_f(_ZCriteriaSA, &_ZSA_mod, pe, top, len, buffer,
+               (char *) parm));
+}
+
+#undef decode_SA_Criteria
+int    decode_SA_Criteria(pe, top, len, buffer, parm)
+PE     pe;
+int    top,
+       *len;
+char  **buffer;
+struct type_SA_Criteria **parm;
+{
+  return (dec_f(_ZCriteriaSA, &_ZSA_mod, pe, top, len, buffer,
+               (char **) parm));
+}
+
+#undef print_SA_Criteria
+/* ARGSUSED */
+int    print_SA_Criteria(pe, top, len, buffer, parm)
+PE     pe;
+int    top,
+       *len;
+char  **buffer,
+       *parm;
+{
+  return (prnt_f(_ZCriteriaSA, &_ZSA_mod, pe, top, len, buffer));
+}
+
+#undef encode_SA_Guide
+int    encode_SA_Guide(pe, top, len, buffer, parm)
+PE     *pe;
+int    top,
+       len;
+char   *buffer;
+struct type_SA_Guide *parm;
+{
+  return (enc_f(_ZGuideSA, &_ZSA_mod, pe, top, len, buffer,
+               (char *) parm));
+}
+
+#undef decode_SA_Guide
+int    decode_SA_Guide(pe, top, len, buffer, parm)
+PE     pe;
+int    top,
+       *len;
+char  **buffer;
+struct type_SA_Guide **parm;
+{
+  return (dec_f(_ZGuideSA, &_ZSA_mod, pe, top, len, buffer,
+               (char **) parm));
+}
+
+#undef print_SA_Guide
+/* ARGSUSED */
+int    print_SA_Guide(pe, top, len, buffer, parm)
+PE     pe;
+int    top,
+       *len;
+char  **buffer,
+       *parm;
+{
+  return (prnt_f(_ZGuideSA, &_ZSA_mod, pe, top, len, buffer));
+}
+
+#undef encode_SA_CaseIgnoreList
+int    encode_SA_CaseIgnoreList(pe, top, len, buffer, parm)
+PE     *pe;
+int    top,
+       len;
+char   *buffer;
+struct type_SA_CaseIgnoreList *parm;
+{
+  return (enc_f(_ZCaseIgnoreListSA, &_ZSA_mod, pe, top, len, buffer,
+               (char *) parm));
+}
+
+#undef decode_SA_CaseIgnoreList
+int    decode_SA_CaseIgnoreList(pe, top, len, buffer, parm)
+PE     pe;
+int    top,
+       *len;
+char  **buffer;
+struct type_SA_CaseIgnoreList **parm;
+{
+  return (dec_f(_ZCaseIgnoreListSA, &_ZSA_mod, pe, top, len, buffer,
+               (char **) parm));
+}
+
+#undef print_SA_CaseIgnoreList
+/* ARGSUSED */
+int    print_SA_CaseIgnoreList(pe, top, len, buffer, parm)
+PE     pe;
+int    top,
+       *len;
+char  **buffer,
+       *parm;
+{
+  return (prnt_f(_ZCaseIgnoreListSA, &_ZSA_mod, pe, top, len, buffer));
+}
+
+#undef encode_Thorn_MailBox
+int    encode_Thorn_MailBox(pe, top, len, buffer, parm)
+PE     *pe;
+int    top,
+       len;
+char   *buffer;
+struct type_Thorn_MailBox *parm;
+{
+  return (enc_f(_ZMailBoxThorn, &_ZThorn_mod, pe, top, len, buffer,
+               (char *) parm));
+}
+
+#undef decode_Thorn_MailBox
+int    decode_Thorn_MailBox(pe, top, len, buffer, parm)
+PE     pe;
+int    top,
+       *len;
+char  **buffer;
+struct type_Thorn_MailBox **parm;
+{
+  return (dec_f(_ZMailBoxThorn, &_ZThorn_mod, pe, top, len, buffer,
+               (char **) parm));
+}
+
+#undef print_Thorn_MailBox
+/* ARGSUSED */
+int    print_Thorn_MailBox(pe, top, len, buffer, parm)
+PE     pe;
+int    top,
+       *len;
+char  **buffer,
+       *parm;
+{
+  return (prnt_f(_ZMailBoxThorn, &_ZThorn_mod, pe, top, len, buffer));
+}
+
+#undef encode_DO_ChainedReadArgument
+int    encode_DO_ChainedReadArgument(pe, top, len, buffer, parm)
+PE     *pe;
+int    top,
+       len;
+char   *buffer;
+struct type_DO_ChainedReadArgument *parm;
+{
+  return (enc_f(_ZChainedReadArgumentDO, &_ZDO_mod, pe, top, len, buffer,
+               (char *) parm));
+}
+
+#undef decode_DO_ChainedReadArgument
+int    decode_DO_ChainedReadArgument(pe, top, len, buffer, parm)
+PE     pe;
+int    top,
+       *len;
+char  **buffer;
+struct type_DO_ChainedReadArgument **parm;
+{
+  return (dec_f(_ZChainedReadArgumentDO, &_ZDO_mod, pe, top, len, buffer,
+               (char **) parm));
+}
+
+#undef print_DO_ChainedReadArgument
+/* ARGSUSED */
+int    print_DO_ChainedReadArgument(pe, top, len, buffer, parm)
+PE     pe;
+int    top,
+       *len;
+char  **buffer,
+       *parm;
+{
+  return (prnt_f(_ZChainedReadArgumentDO, &_ZDO_mod, pe, top, len, buffer));
+}
+
+#undef encode_DO_ChainedReadArgumentData
+int    encode_DO_ChainedReadArgumentData(pe, top, len, buffer, parm)
+PE     *pe;
+int    top,
+       len;
+char   *buffer;
+struct type_DO_ChainedReadArgumentData *parm;
+{
+  return (enc_f(_ZChainedReadArgumentDataDO, &_ZDO_mod, pe, top, len, buffer,
+               (char *) parm));
+}
+
+#undef decode_DO_ChainedReadArgumentData
+int    decode_DO_ChainedReadArgumentData(pe, top, len, buffer, parm)
+PE     pe;
+int    top,
+       *len;
+char  **buffer;
+struct type_DO_ChainedReadArgumentData **parm;
+{
+  return (dec_f(_ZChainedReadArgumentDataDO, &_ZDO_mod, pe, top, len, buffer,
+               (char **) parm));
+}
+
+#undef print_DO_ChainedReadArgumentData
+/* ARGSUSED */
+int    print_DO_ChainedReadArgumentData(pe, top, len, buffer, parm)
+PE     pe;
+int    top,
+       *len;
+char  **buffer,
+       *parm;
+{
+  return (prnt_f(_ZChainedReadArgumentDataDO, &_ZDO_mod, pe, top, len, buffer));
+}
+
+#undef encode_DO_ChainedReadResult
+int    encode_DO_ChainedReadResult(pe, top, len, buffer, parm)
+PE     *pe;
+int    top,
+       len;
+char   *buffer;
+struct type_DO_ChainedReadResult *parm;
+{
+  return (enc_f(_ZChainedReadResultDO, &_ZDO_mod, pe, top, len, buffer,
+               (char *) parm));
+}
+
+#undef decode_DO_ChainedReadResult
+int    decode_DO_ChainedReadResult(pe, top, len, buffer, parm)
+PE     pe;
+int    top,
+       *len;
+char  **buffer;
+struct type_DO_ChainedReadResult **parm;
+{
+  return (dec_f(_ZChainedReadResultDO, &_ZDO_mod, pe, top, len, buffer,
+               (char **) parm));
+}
+
+#undef print_DO_ChainedReadResult
+/* ARGSUSED */
+int    print_DO_ChainedReadResult(pe, top, len, buffer, parm)
+PE     pe;
+int    top,
+       *len;
+char  **buffer,
+       *parm;
+{
+  return (prnt_f(_ZChainedReadResultDO, &_ZDO_mod, pe, top, len, buffer));
+}
+
+#undef encode_DO_ChainedReadResultData
+int    encode_DO_ChainedReadResultData(pe, top, len, buffer, parm)
+PE     *pe;
+int    top,
+       len;
+char   *buffer;
+struct type_DO_ChainedReadResultData *parm;
+{
+  return (enc_f(_ZChainedReadResultDataDO, &_ZDO_mod, pe, top, len, buffer,
+               (char *) parm));
+}
+
+#undef decode_DO_ChainedReadResultData
+int    decode_DO_ChainedReadResultData(pe, top, len, buffer, parm)
+PE     pe;
+int    top,
+       *len;
+char  **buffer;
+struct type_DO_ChainedReadResultData **parm;
+{
+  return (dec_f(_ZChainedReadResultDataDO, &_ZDO_mod, pe, top, len, buffer,
+               (char **) parm));
+}
+
+#undef print_DO_ChainedReadResultData
+/* ARGSUSED */
+int    print_DO_ChainedReadResultData(pe, top, len, buffer, parm)
+PE     pe;
+int    top,
+       *len;
+char  **buffer,
+       *parm;
+{
+  return (prnt_f(_ZChainedReadResultDataDO, &_ZDO_mod, pe, top, len, buffer));
+}
+
+#undef encode_DO_ChainedCompareArgument
+int    encode_DO_ChainedCompareArgument(pe, top, len, buffer, parm)
+PE     *pe;
+int    top,
+       len;
+char   *buffer;
+struct type_DO_ChainedCompareArgument *parm;
+{
+  return (enc_f(_ZChainedCompareArgumentDO, &_ZDO_mod, pe, top, len, buffer,
+               (char *) parm));
+}
+
+#undef decode_DO_ChainedCompareArgument
+int    decode_DO_ChainedCompareArgument(pe, top, len, buffer, parm)
+PE     pe;
+int    top,
+       *len;
+char  **buffer;
+struct type_DO_ChainedCompareArgument **parm;
+{
+  return (dec_f(_ZChainedCompareArgumentDO, &_ZDO_mod, pe, top, len, buffer,
+               (char **) parm));
+}
+
+#undef print_DO_ChainedCompareArgument
+/* ARGSUSED */
+int    print_DO_ChainedCompareArgument(pe, top, len, buffer, parm)
+PE     pe;
+int    top,
+       *len;
+char  **buffer,
+       *parm;
+{
+  return (prnt_f(_ZChainedCompareArgumentDO, &_ZDO_mod, pe, top, len, buffer));
+}
+
+#undef encode_DO_ChainedCompareArgumentData
+int    encode_DO_ChainedCompareArgumentData(pe, top, len, buffer, parm)
+PE     *pe;
+int    top,
+       len;
+char   *buffer;
+struct type_DO_ChainedCompareArgumentData *parm;
+{
+  return (enc_f(_ZChainedCompareArgumentDataDO, &_ZDO_mod, pe, top, len, buffer,
+               (char *) parm));
+}
+
+#undef decode_DO_ChainedCompareArgumentData
+int    decode_DO_ChainedCompareArgumentData(pe, top, len, buffer, parm)
+PE     pe;
+int    top,
+       *len;
+char  **buffer;
+struct type_DO_ChainedCompareArgumentData **parm;
+{
+  return (dec_f(_ZChainedCompareArgumentDataDO, &_ZDO_mod, pe, top, len, buffer,
+               (char **) parm));
+}
+
+#undef print_DO_ChainedCompareArgumentData
+/* ARGSUSED */
+int    print_DO_ChainedCompareArgumentData(pe, top, len, buffer, parm)
+PE     pe;
+int    top,
+       *len;
+char  **buffer,
+       *parm;
+{
+  return (prnt_f(_ZChainedCompareArgumentDataDO, &_ZDO_mod, pe, top, len, buffer));
+}
+
+#undef encode_DO_ChainedCompareResult
+int    encode_DO_ChainedCompareResult(pe, top, len, buffer, parm)
+PE     *pe;
+int    top,
+       len;
+char   *buffer;
+struct type_DO_ChainedCompareResult *parm;
+{
+  return (enc_f(_ZChainedCompareResultDO, &_ZDO_mod, pe, top, len, buffer,
+               (char *) parm));
+}
+
+#undef decode_DO_ChainedCompareResult
+int    decode_DO_ChainedCompareResult(pe, top, len, buffer, parm)
+PE     pe;
+int    top,
+       *len;
+char  **buffer;
+struct type_DO_ChainedCompareResult **parm;
+{
+  return (dec_f(_ZChainedCompareResultDO, &_ZDO_mod, pe, top, len, buffer,
+               (char **) parm));
+}
+
+#undef print_DO_ChainedCompareResult
+/* ARGSUSED */
+int    print_DO_ChainedCompareResult(pe, top, len, buffer, parm)
+PE     pe;
+int    top,
+       *len;
+char  **buffer,
+       *parm;
+{
+  return (prnt_f(_ZChainedCompareResultDO, &_ZDO_mod, pe, top, len, buffer));
+}
+
+#undef encode_DO_ChainedCompareResultData
+int    encode_DO_ChainedCompareResultData(pe, top, len, buffer, parm)
+PE     *pe;
+int    top,
+       len;
+char   *buffer;
+struct type_DO_ChainedCompareResultData *parm;
+{
+  return (enc_f(_ZChainedCompareResultDataDO, &_ZDO_mod, pe, top, len, buffer,
+               (char *) parm));
+}
+
+#undef decode_DO_ChainedCompareResultData
+int    decode_DO_ChainedCompareResultData(pe, top, len, buffer, parm)
+PE     pe;
+int    top,
+       *len;
+char  **buffer;
+struct type_DO_ChainedCompareResultData **parm;
+{
+  return (dec_f(_ZChainedCompareResultDataDO, &_ZDO_mod, pe, top, len, buffer,
+               (char **) parm));
+}
+
+#undef print_DO_ChainedCompareResultData
+/* ARGSUSED */
+int    print_DO_ChainedCompareResultData(pe, top, len, buffer, parm)
+PE     pe;
+int    top,
+       *len;
+char  **buffer,
+       *parm;
+{
+  return (prnt_f(_ZChainedCompareResultDataDO, &_ZDO_mod, pe, top, len, buffer));
+}
+
+#undef encode_DO_ChainedAbandonArgument
+int    encode_DO_ChainedAbandonArgument(pe, top, len, buffer, parm)
+PE     *pe;
+int    top,
+       len;
+char   *buffer;
+struct type_DO_ChainedAbandonArgument *parm;
+{
+  return (enc_f(_ZChainedAbandonArgumentDO, &_ZDO_mod, pe, top, len, buffer,
+               (char *) parm));
+}
+
+#undef decode_DO_ChainedAbandonArgument
+int    decode_DO_ChainedAbandonArgument(pe, top, len, buffer, parm)
+PE     pe;
+int    top,
+       *len;
+char  **buffer;
+struct type_DO_ChainedAbandonArgument **parm;
+{
+  return (dec_f(_ZChainedAbandonArgumentDO, &_ZDO_mod, pe, top, len, buffer,
+               (char **) parm));
+}
+
+#undef print_DO_ChainedAbandonArgument
+/* ARGSUSED */
+int    print_DO_ChainedAbandonArgument(pe, top, len, buffer, parm)
+PE     pe;
+int    top,
+       *len;
+char  **buffer,
+       *parm;
+{
+  return (prnt_f(_ZChainedAbandonArgumentDO, &_ZDO_mod, pe, top, len, buffer));
+}
+
+#undef encode_DO_ChainedAbandonResult
+int    encode_DO_ChainedAbandonResult(pe, top, len, buffer, parm)
+PE     *pe;
+int    top,
+       len;
+char   *buffer;
+struct type_DO_ChainedAbandonResult *parm;
+{
+  return (enc_f(_ZChainedAbandonResultDO, &_ZDO_mod, pe, top, len, buffer,
+               (char *) parm));
+}
+
+#undef decode_DO_ChainedAbandonResult
+int    decode_DO_ChainedAbandonResult(pe, top, len, buffer, parm)
+PE     pe;
+int    top,
+       *len;
+char  **buffer;
+struct type_DO_ChainedAbandonResult **parm;
+{
+  return (dec_f(_ZChainedAbandonResultDO, &_ZDO_mod, pe, top, len, buffer,
+               (char **) parm));
+}
+
+#undef print_DO_ChainedAbandonResult
+/* ARGSUSED */
+int    print_DO_ChainedAbandonResult(pe, top, len, buffer, parm)
+PE     pe;
+int    top,
+       *len;
+char  **buffer,
+       *parm;
+{
+  return (prnt_f(_ZChainedAbandonResultDO, &_ZDO_mod, pe, top, len, buffer));
+}
+
+#undef encode_DO_ChainedListArgument
+int    encode_DO_ChainedListArgument(pe, top, len, buffer, parm)
+PE     *pe;
+int    top,
+       len;
+char   *buffer;
+struct type_DO_ChainedListArgument *parm;
+{
+  return (enc_f(_ZChainedListArgumentDO, &_ZDO_mod, pe, top, len, buffer,
+               (char *) parm));
+}
+
+#undef decode_DO_ChainedListArgument
+int    decode_DO_ChainedListArgument(pe, top, len, buffer, parm)
+PE     pe;
+int    top,
+       *len;
+char  **buffer;
+struct type_DO_ChainedListArgument **parm;
+{
+  return (dec_f(_ZChainedListArgumentDO, &_ZDO_mod, pe, top, len, buffer,
+               (char **) parm));
+}
+
+#undef print_DO_ChainedListArgument
+/* ARGSUSED */
+int    print_DO_ChainedListArgument(pe, top, len, buffer, parm)
+PE     pe;
+int    top,
+       *len;
+char  **buffer,
+       *parm;
+{
+  return (prnt_f(_ZChainedListArgumentDO, &_ZDO_mod, pe, top, len, buffer));
+}
+
+#undef encode_DO_ChainedListArgumentData
+int    encode_DO_ChainedListArgumentData(pe, top, len, buffer, parm)
+PE     *pe;
+int    top,
+       len;
+char   *buffer;
+struct type_DO_ChainedListArgumentData *parm;
+{
+  return (enc_f(_ZChainedListArgumentDataDO, &_ZDO_mod, pe, top, len, buffer,
+               (char *) parm));
+}
+
+#undef decode_DO_ChainedListArgumentData
+int    decode_DO_ChainedListArgumentData(pe, top, len, buffer, parm)
+PE     pe;
+int    top,
+       *len;
+char  **buffer;
+struct type_DO_ChainedListArgumentData **parm;
+{
+  return (dec_f(_ZChainedListArgumentDataDO, &_ZDO_mod, pe, top, len, buffer,
+               (char **) parm));
+}
+
+#undef print_DO_ChainedListArgumentData
+/* ARGSUSED */
+int    print_DO_ChainedListArgumentData(pe, top, len, buffer, parm)
+PE     pe;
+int    top,
+       *len;
+char  **buffer,
+       *parm;
+{
+  return (prnt_f(_ZChainedListArgumentDataDO, &_ZDO_mod, pe, top, len, buffer));
+}
+
+#undef encode_DO_ChainedListResult
+int    encode_DO_ChainedListResult(pe, top, len, buffer, parm)
+PE     *pe;
+int    top,
+       len;
+char   *buffer;
+struct type_DO_ChainedListResult *parm;
+{
+  return (enc_f(_ZChainedListResultDO, &_ZDO_mod, pe, top, len, buffer,
+               (char *) parm));
+}
+
+#undef decode_DO_ChainedListResult
+int    decode_DO_ChainedListResult(pe, top, len, buffer, parm)
+PE     pe;
+int    top,
+       *len;
+char  **buffer;
+struct type_DO_ChainedListResult **parm;
+{
+  return (dec_f(_ZChainedListResultDO, &_ZDO_mod, pe, top, len, buffer,
+               (char **) parm));
+}
+
+#undef print_DO_ChainedListResult
+/* ARGSUSED */
+int    print_DO_ChainedListResult(pe, top, len, buffer, parm)
+PE     pe;
+int    top,
+       *len;
+char  **buffer,
+       *parm;
+{
+  return (prnt_f(_ZChainedListResultDO, &_ZDO_mod, pe, top, len, buffer));
+}
+
+#undef encode_DO_ChainedListResultData
+int    encode_DO_ChainedListResultData(pe, top, len, buffer, parm)
+PE     *pe;
+int    top,
+       len;
+char   *buffer;
+struct type_DO_ChainedListResultData *parm;
+{
+  return (enc_f(_ZChainedListResultDataDO, &_ZDO_mod, pe, top, len, buffer,
+               (char *) parm));
+}
+
+#undef decode_DO_ChainedListResultData
+int    decode_DO_ChainedListResultData(pe, top, len, buffer, parm)
+PE     pe;
+int    top,
+       *len;
+char  **buffer;
+struct type_DO_ChainedListResultData **parm;
+{
+  return (dec_f(_ZChainedListResultDataDO, &_ZDO_mod, pe, top, len, buffer,
+               (char **) parm));
+}
+
+#undef print_DO_ChainedListResultData
+/* ARGSUSED */
+int    print_DO_ChainedListResultData(pe, top, len, buffer, parm)
+PE     pe;
+int    top,
+       *len;
+char  **buffer,
+       *parm;
+{
+  return (prnt_f(_ZChainedListResultDataDO, &_ZDO_mod, pe, top, len, buffer));
+}
+
+#undef encode_DO_ChainedSearchArgument
+int    encode_DO_ChainedSearchArgument(pe, top, len, buffer, parm)
+PE     *pe;
+int    top,
+       len;
+char   *buffer;
+struct type_DO_ChainedSearchArgument *parm;
+{
+  return (enc_f(_ZChainedSearchArgumentDO, &_ZDO_mod, pe, top, len, buffer,
+               (char *) parm));
+}
+
+#undef decode_DO_ChainedSearchArgument
+int    decode_DO_ChainedSearchArgument(pe, top, len, buffer, parm)
+PE     pe;
+int    top,
+       *len;
+char  **buffer;
+struct type_DO_ChainedSearchArgument **parm;
+{
+  return (dec_f(_ZChainedSearchArgumentDO, &_ZDO_mod, pe, top, len, buffer,
+               (char **) parm));
+}
+
+#undef print_DO_ChainedSearchArgument
+/* ARGSUSED */
+int    print_DO_ChainedSearchArgument(pe, top, len, buffer, parm)
+PE     pe;
+int    top,
+       *len;
+char  **buffer,
+       *parm;
+{
+  return (prnt_f(_ZChainedSearchArgumentDO, &_ZDO_mod, pe, top, len, buffer));
+}
+
+#undef encode_DO_ChainedSearchArgumentData
+int    encode_DO_ChainedSearchArgumentData(pe, top, len, buffer, parm)
+PE     *pe;
+int    top,
+       len;
+char   *buffer;
+struct type_DO_ChainedSearchArgumentData *parm;
+{
+  return (enc_f(_ZChainedSearchArgumentDataDO, &_ZDO_mod, pe, top, len, buffer,
+               (char *) parm));
+}
+
+#undef decode_DO_ChainedSearchArgumentData
+int    decode_DO_ChainedSearchArgumentData(pe, top, len, buffer, parm)
+PE     pe;
+int    top,
+       *len;
+char  **buffer;
+struct type_DO_ChainedSearchArgumentData **parm;
+{
+  return (dec_f(_ZChainedSearchArgumentDataDO, &_ZDO_mod, pe, top, len, buffer,
+               (char **) parm));
+}
+
+#undef print_DO_ChainedSearchArgumentData
+/* ARGSUSED */
+int    print_DO_ChainedSearchArgumentData(pe, top, len, buffer, parm)
+PE     pe;
+int    top,
+       *len;
+char  **buffer,
+       *parm;
+{
+  return (prnt_f(_ZChainedSearchArgumentDataDO, &_ZDO_mod, pe, top, len, buffer));
+}
+
+#undef encode_DO_ChainedSearchResult
+int    encode_DO_ChainedSearchResult(pe, top, len, buffer, parm)
+PE     *pe;
+int    top,
+       len;
+char   *buffer;
+struct type_DO_ChainedSearchResult *parm;
+{
+  return (enc_f(_ZChainedSearchResultDO, &_ZDO_mod, pe, top, len, buffer,
+               (char *) parm));
+}
+
+#undef decode_DO_ChainedSearchResult
+int    decode_DO_ChainedSearchResult(pe, top, len, buffer, parm)
+PE     pe;
+int    top,
+       *len;
+char  **buffer;
+struct type_DO_ChainedSearchResult **parm;
+{
+  return (dec_f(_ZChainedSearchResultDO, &_ZDO_mod, pe, top, len, buffer,
+               (char **) parm));
+}
+
+#undef print_DO_ChainedSearchResult
+/* ARGSUSED */
+int    print_DO_ChainedSearchResult(pe, top, len, buffer, parm)
+PE     pe;
+int    top,
+       *len;
+char  **buffer,
+       *parm;
+{
+  return (prnt_f(_ZChainedSearchResultDO, &_ZDO_mod, pe, top, len, buffer));
+}
+
+#undef encode_DO_ChainedSearchResultData
+int    encode_DO_ChainedSearchResultData(pe, top, len, buffer, parm)
+PE     *pe;
+int    top,
+       len;
+char   *buffer;
+struct type_DO_ChainedSearchResultData *parm;
+{
+  return (enc_f(_ZChainedSearchResultDataDO, &_ZDO_mod, pe, top, len, buffer,
+               (char *) parm));
+}
+
+#undef decode_DO_ChainedSearchResultData
+int    decode_DO_ChainedSearchResultData(pe, top, len, buffer, parm)
+PE     pe;
+int    top,
+       *len;
+char  **buffer;
+struct type_DO_ChainedSearchResultData **parm;
+{
+  return (dec_f(_ZChainedSearchResultDataDO, &_ZDO_mod, pe, top, len, buffer,
+               (char **) parm));
+}
+
+#undef print_DO_ChainedSearchResultData
+/* ARGSUSED */
+int    print_DO_ChainedSearchResultData(pe, top, len, buffer, parm)
+PE     pe;
+int    top,
+       *len;
+char  **buffer,
+       *parm;
+{
+  return (prnt_f(_ZChainedSearchResultDataDO, &_ZDO_mod, pe, top, len, buffer));
+}
+
+#undef encode_DO_ChainedAddEntryArgument
+int    encode_DO_ChainedAddEntryArgument(pe, top, len, buffer, parm)
+PE     *pe;
+int    top,
+       len;
+char   *buffer;
+struct type_DO_ChainedAddEntryArgument *parm;
+{
+  return (enc_f(_ZChainedAddEntryArgumentDO, &_ZDO_mod, pe, top, len, buffer,
+               (char *) parm));
+}
+
+#undef decode_DO_ChainedAddEntryArgument
+int    decode_DO_ChainedAddEntryArgument(pe, top, len, buffer, parm)
+PE     pe;
+int    top,
+       *len;
+char  **buffer;
+struct type_DO_ChainedAddEntryArgument **parm;
+{
+  return (dec_f(_ZChainedAddEntryArgumentDO, &_ZDO_mod, pe, top, len, buffer,
+               (char **) parm));
+}
+
+#undef print_DO_ChainedAddEntryArgument
+/* ARGSUSED */
+int    print_DO_ChainedAddEntryArgument(pe, top, len, buffer, parm)
+PE     pe;
+int    top,
+       *len;
+char  **buffer,
+       *parm;
+{
+  return (prnt_f(_ZChainedAddEntryArgumentDO, &_ZDO_mod, pe, top, len, buffer));
+}
+
+#undef encode_DO_ChainedAddEntryArgumentData
+int    encode_DO_ChainedAddEntryArgumentData(pe, top, len, buffer, parm)
+PE     *pe;
+int    top,
+       len;
+char   *buffer;
+struct type_DO_ChainedAddEntryArgumentData *parm;
+{
+  return (enc_f(_ZChainedAddEntryArgumentDataDO, &_ZDO_mod, pe, top, len, buffer,
+               (char *) parm));
+}
+
+#undef decode_DO_ChainedAddEntryArgumentData
+int    decode_DO_ChainedAddEntryArgumentData(pe, top, len, buffer, parm)
+PE     pe;
+int    top,
+       *len;
+char  **buffer;
+struct type_DO_ChainedAddEntryArgumentData **parm;
+{
+  return (dec_f(_ZChainedAddEntryArgumentDataDO, &_ZDO_mod, pe, top, len, buffer,
+               (char **) parm));
+}
+
+#undef print_DO_ChainedAddEntryArgumentData
+/* ARGSUSED */
+int    print_DO_ChainedAddEntryArgumentData(pe, top, len, buffer, parm)
+PE     pe;
+int    top,
+       *len;
+char  **buffer,
+       *parm;
+{
+  return (prnt_f(_ZChainedAddEntryArgumentDataDO, &_ZDO_mod, pe, top, len, buffer));
+}
+
+#undef encode_DO_ChainedAddEntryResult
+int    encode_DO_ChainedAddEntryResult(pe, top, len, buffer, parm)
+PE     *pe;
+int    top,
+       len;
+char   *buffer;
+struct type_DO_ChainedAddEntryResult *parm;
+{
+  return (enc_f(_ZChainedAddEntryResultDO, &_ZDO_mod, pe, top, len, buffer,
+               (char *) parm));
+}
+
+#undef decode_DO_ChainedAddEntryResult
+int    decode_DO_ChainedAddEntryResult(pe, top, len, buffer, parm)
+PE     pe;
+int    top,
+       *len;
+char  **buffer;
+struct type_DO_ChainedAddEntryResult **parm;
+{
+  return (dec_f(_ZChainedAddEntryResultDO, &_ZDO_mod, pe, top, len, buffer,
+               (char **) parm));
+}
+
+#undef print_DO_ChainedAddEntryResult
+/* ARGSUSED */
+int    print_DO_ChainedAddEntryResult(pe, top, len, buffer, parm)
+PE     pe;
+int    top,
+       *len;
+char  **buffer,
+       *parm;
+{
+  return (prnt_f(_ZChainedAddEntryResultDO, &_ZDO_mod, pe, top, len, buffer));
+}
+
+#undef encode_DO_ChainedAddEntryResultData
+int    encode_DO_ChainedAddEntryResultData(pe, top, len, buffer, parm)
+PE     *pe;
+int    top,
+       len;
+char   *buffer;
+struct type_DO_ChainedAddEntryResultData *parm;
+{
+  return (enc_f(_ZChainedAddEntryResultDataDO, &_ZDO_mod, pe, top, len, buffer,
+               (char *) parm));
+}
+
+#undef decode_DO_ChainedAddEntryResultData
+int    decode_DO_ChainedAddEntryResultData(pe, top, len, buffer, parm)
+PE     pe;
+int    top,
+       *len;
+char  **buffer;
+struct type_DO_ChainedAddEntryResultData **parm;
+{
+  return (dec_f(_ZChainedAddEntryResultDataDO, &_ZDO_mod, pe, top, len, buffer,
+               (char **) parm));
+}
+
+#undef print_DO_ChainedAddEntryResultData
+/* ARGSUSED */
+int    print_DO_ChainedAddEntryResultData(pe, top, len, buffer, parm)
+PE     pe;
+int    top,
+       *len;
+char  **buffer,
+       *parm;
+{
+  return (prnt_f(_ZChainedAddEntryResultDataDO, &_ZDO_mod, pe, top, len, buffer));
+}
+
+#undef encode_DO_ChainedRemoveEntryArgument
+int    encode_DO_ChainedRemoveEntryArgument(pe, top, len, buffer, parm)
+PE     *pe;
+int    top,
+       len;
+char   *buffer;
+struct type_DO_ChainedRemoveEntryArgument *parm;
+{
+  return (enc_f(_ZChainedRemoveEntryArgumentDO, &_ZDO_mod, pe, top, len, buffer,
+               (char *) parm));
+}
+
+#undef decode_DO_ChainedRemoveEntryArgument
+int    decode_DO_ChainedRemoveEntryArgument(pe, top, len, buffer, parm)
+PE     pe;
+int    top,
+       *len;
+char  **buffer;
+struct type_DO_ChainedRemoveEntryArgument **parm;
+{
+  return (dec_f(_ZChainedRemoveEntryArgumentDO, &_ZDO_mod, pe, top, len, buffer,
+               (char **) parm));
+}
+
+#undef print_DO_ChainedRemoveEntryArgument
+/* ARGSUSED */
+int    print_DO_ChainedRemoveEntryArgument(pe, top, len, buffer, parm)
+PE     pe;
+int    top,
+       *len;
+char  **buffer,
+       *parm;
+{
+  return (prnt_f(_ZChainedRemoveEntryArgumentDO, &_ZDO_mod, pe, top, len, buffer));
+}
+
+#undef encode_DO_ChainedRemoveEntryArgumentData
+int    encode_DO_ChainedRemoveEntryArgumentData(pe, top, len, buffer, parm)
+PE     *pe;
+int    top,
+       len;
+char   *buffer;
+struct type_DO_ChainedRemoveEntryArgumentData *parm;
+{
+  return (enc_f(_ZChainedRemoveEntryArgumentDataDO, &_ZDO_mod, pe, top, len, buffer,
+               (char *) parm));
+}
+
+#undef decode_DO_ChainedRemoveEntryArgumentData
+int    decode_DO_ChainedRemoveEntryArgumentData(pe, top, len, buffer, parm)
+PE     pe;
+int    top,
+       *len;
+char  **buffer;
+struct type_DO_ChainedRemoveEntryArgumentData **parm;
+{
+  return (dec_f(_ZChainedRemoveEntryArgumentDataDO, &_ZDO_mod, pe, top, len, buffer,
+               (char **) parm));
+}
+
+#undef print_DO_ChainedRemoveEntryArgumentData
+/* ARGSUSED */
+int    print_DO_ChainedRemoveEntryArgumentData(pe, top, len, buffer, parm)
+PE     pe;
+int    top,
+       *len;
+char  **buffer,
+       *parm;
+{
+  return (prnt_f(_ZChainedRemoveEntryArgumentDataDO, &_ZDO_mod, pe, top, len, buffer));
+}
+
+#undef encode_DO_ChainedRemoveEntryResult
+int    encode_DO_ChainedRemoveEntryResult(pe, top, len, buffer, parm)
+PE     *pe;
+int    top,
+       len;
+char   *buffer;
+struct type_DO_ChainedRemoveEntryResult *parm;
+{
+  return (enc_f(_ZChainedRemoveEntryResultDO, &_ZDO_mod, pe, top, len, buffer,
+               (char *) parm));
+}
+
+#undef decode_DO_ChainedRemoveEntryResult
+int    decode_DO_ChainedRemoveEntryResult(pe, top, len, buffer, parm)
+PE     pe;
+int    top,
+       *len;
+char  **buffer;
+struct type_DO_ChainedRemoveEntryResult **parm;
+{
+  return (dec_f(_ZChainedRemoveEntryResultDO, &_ZDO_mod, pe, top, len, buffer,
+               (char **) parm));
+}
+
+#undef print_DO_ChainedRemoveEntryResult
+/* ARGSUSED */
+int    print_DO_ChainedRemoveEntryResult(pe, top, len, buffer, parm)
+PE     pe;
+int    top,
+       *len;
+char  **buffer,
+       *parm;
+{
+  return (prnt_f(_ZChainedRemoveEntryResultDO, &_ZDO_mod, pe, top, len, buffer));
+}
+
+#undef encode_DO_ChainedRemoveEntryResultData
+int    encode_DO_ChainedRemoveEntryResultData(pe, top, len, buffer, parm)
+PE     *pe;
+int    top,
+       len;
+char   *buffer;
+struct type_DO_ChainedRemoveEntryResultData *parm;
+{
+  return (enc_f(_ZChainedRemoveEntryResultDataDO, &_ZDO_mod, pe, top, len, buffer,
+               (char *) parm));
+}
+
+#undef decode_DO_ChainedRemoveEntryResultData
+int    decode_DO_ChainedRemoveEntryResultData(pe, top, len, buffer, parm)
+PE     pe;
+int    top,
+       *len;
+char  **buffer;
+struct type_DO_ChainedRemoveEntryResultData **parm;
+{
+  return (dec_f(_ZChainedRemoveEntryResultDataDO, &_ZDO_mod, pe, top, len, buffer,
+               (char **) parm));
+}
+
+#undef print_DO_ChainedRemoveEntryResultData
+/* ARGSUSED */
+int    print_DO_ChainedRemoveEntryResultData(pe, top, len, buffer, parm)
+PE     pe;
+int    top,
+       *len;
+char  **buffer,
+       *parm;
+{
+  return (prnt_f(_ZChainedRemoveEntryResultDataDO, &_ZDO_mod, pe, top, len, buffer));
+}
+
+#undef encode_DO_ChainedModifyEntryArgument
+int    encode_DO_ChainedModifyEntryArgument(pe, top, len, buffer, parm)
+PE     *pe;
+int    top,
+       len;
+char   *buffer;
+struct type_DO_ChainedModifyEntryArgument *parm;
+{
+  return (enc_f(_ZChainedModifyEntryArgumentDO, &_ZDO_mod, pe, top, len, buffer,
+               (char *) parm));
+}
+
+#undef decode_DO_ChainedModifyEntryArgument
+int    decode_DO_ChainedModifyEntryArgument(pe, top, len, buffer, parm)
+PE     pe;
+int    top,
+       *len;
+char  **buffer;
+struct type_DO_ChainedModifyEntryArgument **parm;
+{
+  return (dec_f(_ZChainedModifyEntryArgumentDO, &_ZDO_mod, pe, top, len, buffer,
+               (char **) parm));
+}
+
+#undef print_DO_ChainedModifyEntryArgument
+/* ARGSUSED */
+int    print_DO_ChainedModifyEntryArgument(pe, top, len, buffer, parm)
+PE     pe;
+int    top,
+       *len;
+char  **buffer,
+       *parm;
+{
+  return (prnt_f(_ZChainedModifyEntryArgumentDO, &_ZDO_mod, pe, top, len, buffer));
+}
+
+#undef encode_DO_ChainedModifyEntryArgumentData
+int    encode_DO_ChainedModifyEntryArgumentData(pe, top, len, buffer, parm)
+PE     *pe;
+int    top,
+       len;
+char   *buffer;
+struct type_DO_ChainedModifyEntryArgumentData *parm;
+{
+  return (enc_f(_ZChainedModifyEntryArgumentDataDO, &_ZDO_mod, pe, top, len, buffer,
+               (char *) parm));
+}
+
+#undef decode_DO_ChainedModifyEntryArgumentData
+int    decode_DO_ChainedModifyEntryArgumentData(pe, top, len, buffer, parm)
+PE     pe;
+int    top,
+       *len;
+char  **buffer;
+struct type_DO_ChainedModifyEntryArgumentData **parm;
+{
+  return (dec_f(_ZChainedModifyEntryArgumentDataDO, &_ZDO_mod, pe, top, len, buffer,
+               (char **) parm));
+}
+
+#undef print_DO_ChainedModifyEntryArgumentData
+/* ARGSUSED */
+int    print_DO_ChainedModifyEntryArgumentData(pe, top, len, buffer, parm)
+PE     pe;
+int    top,
+       *len;
+char  **buffer,
+       *parm;
+{
+  return (prnt_f(_ZChainedModifyEntryArgumentDataDO, &_ZDO_mod, pe, top, len, buffer));
+}
+
+#undef encode_DO_ChainedModifyEntryResult
+int    encode_DO_ChainedModifyEntryResult(pe, top, len, buffer, parm)
+PE     *pe;
+int    top,
+       len;
+char   *buffer;
+struct type_DO_ChainedModifyEntryResult *parm;
+{
+  return (enc_f(_ZChainedModifyEntryResultDO, &_ZDO_mod, pe, top, len, buffer,
+               (char *) parm));
+}
+
+#undef decode_DO_ChainedModifyEntryResult
+int    decode_DO_ChainedModifyEntryResult(pe, top, len, buffer, parm)
+PE     pe;
+int    top,
+       *len;
+char  **buffer;
+struct type_DO_ChainedModifyEntryResult **parm;
+{
+  return (dec_f(_ZChainedModifyEntryResultDO, &_ZDO_mod, pe, top, len, buffer,
+               (char **) parm));
+}
+
+#undef print_DO_ChainedModifyEntryResult
+/* ARGSUSED */
+int    print_DO_ChainedModifyEntryResult(pe, top, len, buffer, parm)
+PE     pe;
+int    top,
+       *len;
+char  **buffer,
+       *parm;
+{
+  return (prnt_f(_ZChainedModifyEntryResultDO, &_ZDO_mod, pe, top, len, buffer));
+}
+
+#undef encode_DO_ChainedModifyEntryResultData
+int    encode_DO_ChainedModifyEntryResultData(pe, top, len, buffer, parm)
+PE     *pe;
+int    top,
+       len;
+char   *buffer;
+struct type_DO_ChainedModifyEntryResultData *parm;
+{
+  return (enc_f(_ZChainedModifyEntryResultDataDO, &_ZDO_mod, pe, top, len, buffer,
+               (char *) parm));
+}
+
+#undef decode_DO_ChainedModifyEntryResultData
+int    decode_DO_ChainedModifyEntryResultData(pe, top, len, buffer, parm)
+PE     pe;
+int    top,
+       *len;
+char  **buffer;
+struct type_DO_ChainedModifyEntryResultData **parm;
+{
+  return (dec_f(_ZChainedModifyEntryResultDataDO, &_ZDO_mod, pe, top, len, buffer,
+               (char **) parm));
+}
+
+#undef print_DO_ChainedModifyEntryResultData
+/* ARGSUSED */
+int    print_DO_ChainedModifyEntryResultData(pe, top, len, buffer, parm)
+PE     pe;
+int    top,
+       *len;
+char  **buffer,
+       *parm;
+{
+  return (prnt_f(_ZChainedModifyEntryResultDataDO, &_ZDO_mod, pe, top, len, buffer));
+}
+
+#undef encode_DO_ChainedModifyRDNArgument
+int    encode_DO_ChainedModifyRDNArgument(pe, top, len, buffer, parm)
+PE     *pe;
+int    top,
+       len;
+char   *buffer;
+struct type_DO_ChainedModifyRDNArgument *parm;
+{
+  return (enc_f(_ZChainedModifyRDNArgumentDO, &_ZDO_mod, pe, top, len, buffer,
+               (char *) parm));
+}
+
+#undef decode_DO_ChainedModifyRDNArgument
+int    decode_DO_ChainedModifyRDNArgument(pe, top, len, buffer, parm)
+PE     pe;
+int    top,
+       *len;
+char  **buffer;
+struct type_DO_ChainedModifyRDNArgument **parm;
+{
+  return (dec_f(_ZChainedModifyRDNArgumentDO, &_ZDO_mod, pe, top, len, buffer,
+               (char **) parm));
+}
+
+#undef print_DO_ChainedModifyRDNArgument
+/* ARGSUSED */
+int    print_DO_ChainedModifyRDNArgument(pe, top, len, buffer, parm)
+PE     pe;
+int    top,
+       *len;
+char  **buffer,
+       *parm;
+{
+  return (prnt_f(_ZChainedModifyRDNArgumentDO, &_ZDO_mod, pe, top, len, buffer));
+}
+
+#undef encode_DO_ChainedModifyRDNArgumentData
+int    encode_DO_ChainedModifyRDNArgumentData(pe, top, len, buffer, parm)
+PE     *pe;
+int    top,
+       len;
+char   *buffer;
+struct type_DO_ChainedModifyRDNArgumentData *parm;
+{
+  return (enc_f(_ZChainedModifyRDNArgumentDataDO, &_ZDO_mod, pe, top, len, buffer,
+               (char *) parm));
+}
+
+#undef decode_DO_ChainedModifyRDNArgumentData
+int    decode_DO_ChainedModifyRDNArgumentData(pe, top, len, buffer, parm)
+PE     pe;
+int    top,
+       *len;
+char  **buffer;
+struct type_DO_ChainedModifyRDNArgumentData **parm;
+{
+  return (dec_f(_ZChainedModifyRDNArgumentDataDO, &_ZDO_mod, pe, top, len, buffer,
+               (char **) parm));
+}
+
+#undef print_DO_ChainedModifyRDNArgumentData
+/* ARGSUSED */
+int    print_DO_ChainedModifyRDNArgumentData(pe, top, len, buffer, parm)
+PE     pe;
+int    top,
+       *len;
+char  **buffer,
+       *parm;
+{
+  return (prnt_f(_ZChainedModifyRDNArgumentDataDO, &_ZDO_mod, pe, top, len, buffer));
+}
+
+#undef encode_DO_ChainedModifyRDNResult
+int    encode_DO_ChainedModifyRDNResult(pe, top, len, buffer, parm)
+PE     *pe;
+int    top,
+       len;
+char   *buffer;
+struct type_DO_ChainedModifyRDNResult *parm;
+{
+  return (enc_f(_ZChainedModifyRDNResultDO, &_ZDO_mod, pe, top, len, buffer,
+               (char *) parm));
+}
+
+#undef decode_DO_ChainedModifyRDNResult
+int    decode_DO_ChainedModifyRDNResult(pe, top, len, buffer, parm)
+PE     pe;
+int    top,
+       *len;
+char  **buffer;
+struct type_DO_ChainedModifyRDNResult **parm;
+{
+  return (dec_f(_ZChainedModifyRDNResultDO, &_ZDO_mod, pe, top, len, buffer,
+               (char **) parm));
+}
+
+#undef print_DO_ChainedModifyRDNResult
+/* ARGSUSED */
+int    print_DO_ChainedModifyRDNResult(pe, top, len, buffer, parm)
+PE     pe;
+int    top,
+       *len;
+char  **buffer,
+       *parm;
+{
+  return (prnt_f(_ZChainedModifyRDNResultDO, &_ZDO_mod, pe, top, len, buffer));
+}
+
+#undef encode_DO_ChainedModifyRDNResultData
+int    encode_DO_ChainedModifyRDNResultData(pe, top, len, buffer, parm)
+PE     *pe;
+int    top,
+       len;
+char   *buffer;
+struct type_DO_ChainedModifyRDNResultData *parm;
+{
+  return (enc_f(_ZChainedModifyRDNResultDataDO, &_ZDO_mod, pe, top, len, buffer,
+               (char *) parm));
+}
+
+#undef decode_DO_ChainedModifyRDNResultData
+int    decode_DO_ChainedModifyRDNResultData(pe, top, len, buffer, parm)
+PE     pe;
+int    top,
+       *len;
+char  **buffer;
+struct type_DO_ChainedModifyRDNResultData **parm;
+{
+  return (dec_f(_ZChainedModifyRDNResultDataDO, &_ZDO_mod, pe, top, len, buffer,
+               (char **) parm));
+}
+
+#undef print_DO_ChainedModifyRDNResultData
+/* ARGSUSED */
+int    print_DO_ChainedModifyRDNResultData(pe, top, len, buffer, parm)
+PE     pe;
+int    top,
+       *len;
+char  **buffer,
+       *parm;
+{
+  return (prnt_f(_ZChainedModifyRDNResultDataDO, &_ZDO_mod, pe, top, len, buffer));
+}
+
+#undef encode_DO_DSAReferralParm
+int    encode_DO_DSAReferralParm(pe, top, len, buffer, parm)
+PE     *pe;
+int    top,
+       len;
+char   *buffer;
+struct type_DO_DSAReferralParm *parm;
+{
+  return (enc_f(_ZDSAReferralParmDO, &_ZDO_mod, pe, top, len, buffer,
+               (char *) parm));
+}
+
+#undef decode_DO_DSAReferralParm
+int    decode_DO_DSAReferralParm(pe, top, len, buffer, parm)
+PE     pe;
+int    top,
+       *len;
+char  **buffer;
+struct type_DO_DSAReferralParm **parm;
+{
+  return (dec_f(_ZDSAReferralParmDO, &_ZDO_mod, pe, top, len, buffer,
+               (char **) parm));
+}
+
+#undef print_DO_DSAReferralParm
+/* ARGSUSED */
+int    print_DO_DSAReferralParm(pe, top, len, buffer, parm)
+PE     pe;
+int    top,
+       *len;
+char  **buffer,
+       *parm;
+{
+  return (prnt_f(_ZDSAReferralParmDO, &_ZDO_mod, pe, top, len, buffer));
+}
+
+#undef encode_DO_ChainingArgument
+int    encode_DO_ChainingArgument(pe, top, len, buffer, parm)
+PE     *pe;
+int    top,
+       len;
+char   *buffer;
+struct type_DO_ChainingArgument *parm;
+{
+  return (enc_f(_ZChainingArgumentDO, &_ZDO_mod, pe, top, len, buffer,
+               (char *) parm));
+}
+
+#undef decode_DO_ChainingArgument
+int    decode_DO_ChainingArgument(pe, top, len, buffer, parm)
+PE     pe;
+int    top,
+       *len;
+char  **buffer;
+struct type_DO_ChainingArgument **parm;
+{
+  return (dec_f(_ZChainingArgumentDO, &_ZDO_mod, pe, top, len, buffer,
+               (char **) parm));
+}
+
+#undef print_DO_ChainingArgument
+/* ARGSUSED */
+int    print_DO_ChainingArgument(pe, top, len, buffer, parm)
+PE     pe;
+int    top,
+       *len;
+char  **buffer,
+       *parm;
+{
+  return (prnt_f(_ZChainingArgumentDO, &_ZDO_mod, pe, top, len, buffer));
+}
+
+#undef encode_DO_ChainingResult
+int    encode_DO_ChainingResult(pe, top, len, buffer, parm)
+PE     *pe;
+int    top,
+       len;
+char   *buffer;
+struct type_DO_ChainingResult *parm;
+{
+  return (enc_f(_ZChainingResultDO, &_ZDO_mod, pe, top, len, buffer,
+               (char *) parm));
+}
+
+#undef decode_DO_ChainingResult
+int    decode_DO_ChainingResult(pe, top, len, buffer, parm)
+PE     pe;
+int    top,
+       *len;
+char  **buffer;
+struct type_DO_ChainingResult **parm;
+{
+  return (dec_f(_ZChainingResultDO, &_ZDO_mod, pe, top, len, buffer,
+               (char **) parm));
+}
+
+#undef print_DO_ChainingResult
+/* ARGSUSED */
+int    print_DO_ChainingResult(pe, top, len, buffer, parm)
+PE     pe;
+int    top,
+       *len;
+char  **buffer,
+       *parm;
+{
+  return (prnt_f(_ZChainingResultDO, &_ZDO_mod, pe, top, len, buffer));
+}
+
+#undef encode_DO_CrossReference
+int    encode_DO_CrossReference(pe, top, len, buffer, parm)
+PE     *pe;
+int    top,
+       len;
+char   *buffer;
+struct type_DO_CrossReference *parm;
+{
+  return (enc_f(_ZCrossReferenceDO, &_ZDO_mod, pe, top, len, buffer,
+               (char *) parm));
+}
+
+#undef decode_DO_CrossReference
+int    decode_DO_CrossReference(pe, top, len, buffer, parm)
+PE     pe;
+int    top,
+       *len;
+char  **buffer;
+struct type_DO_CrossReference **parm;
+{
+  return (dec_f(_ZCrossReferenceDO, &_ZDO_mod, pe, top, len, buffer,
+               (char **) parm));
+}
+
+#undef print_DO_CrossReference
+/* ARGSUSED */
+int    print_DO_CrossReference(pe, top, len, buffer, parm)
+PE     pe;
+int    top,
+       *len;
+char  **buffer,
+       *parm;
+{
+  return (prnt_f(_ZCrossReferenceDO, &_ZDO_mod, pe, top, len, buffer));
+}
+
+#undef encode_DO_ReferenceType
+int    encode_DO_ReferenceType(pe, top, len, buffer, parm)
+PE     *pe;
+int    top,
+       len;
+char   *buffer;
+struct type_DO_ReferenceType *parm;
+{
+  return (enc_f(_ZReferenceTypeDO, &_ZDO_mod, pe, top, len, buffer,
+               (char *) parm));
+}
+
+#undef decode_DO_ReferenceType
+int    decode_DO_ReferenceType(pe, top, len, buffer, parm)
+PE     pe;
+int    top,
+       *len;
+char  **buffer;
+struct type_DO_ReferenceType **parm;
+{
+  return (dec_f(_ZReferenceTypeDO, &_ZDO_mod, pe, top, len, buffer,
+               (char **) parm));
+}
+
+#undef print_DO_ReferenceType
+/* ARGSUSED */
+int    print_DO_ReferenceType(pe, top, len, buffer, parm)
+PE     pe;
+int    top,
+       *len;
+char  **buffer,
+       *parm;
+{
+  return (prnt_f(_ZReferenceTypeDO, &_ZDO_mod, pe, top, len, buffer));
+}
+
+#undef encode_DO_TraceInformation
+int    encode_DO_TraceInformation(pe, top, len, buffer, parm)
+PE     *pe;
+int    top,
+       len;
+char   *buffer;
+struct type_DO_TraceInformation *parm;
+{
+  return (enc_f(_ZTraceInformationDO, &_ZDO_mod, pe, top, len, buffer,
+               (char *) parm));
+}
+
+#undef decode_DO_TraceInformation
+int    decode_DO_TraceInformation(pe, top, len, buffer, parm)
+PE     pe;
+int    top,
+       *len;
+char  **buffer;
+struct type_DO_TraceInformation **parm;
+{
+  return (dec_f(_ZTraceInformationDO, &_ZDO_mod, pe, top, len, buffer,
+               (char **) parm));
+}
+
+#undef print_DO_TraceInformation
+/* ARGSUSED */
+int    print_DO_TraceInformation(pe, top, len, buffer, parm)
+PE     pe;
+int    top,
+       *len;
+char  **buffer,
+       *parm;
+{
+  return (prnt_f(_ZTraceInformationDO, &_ZDO_mod, pe, top, len, buffer));
+}
+
+#undef encode_DO_TraceItem
+int    encode_DO_TraceItem(pe, top, len, buffer, parm)
+PE     *pe;
+int    top,
+       len;
+char   *buffer;
+struct type_DO_TraceItem *parm;
+{
+  return (enc_f(_ZTraceItemDO, &_ZDO_mod, pe, top, len, buffer,
+               (char *) parm));
+}
+
+#undef decode_DO_TraceItem
+int    decode_DO_TraceItem(pe, top, len, buffer, parm)
+PE     pe;
+int    top,
+       *len;
+char  **buffer;
+struct type_DO_TraceItem **parm;
+{
+  return (dec_f(_ZTraceItemDO, &_ZDO_mod, pe, top, len, buffer,
+               (char **) parm));
+}
+
+#undef print_DO_TraceItem
+/* ARGSUSED */
+int    print_DO_TraceItem(pe, top, len, buffer, parm)
+PE     pe;
+int    top,
+       *len;
+char  **buffer,
+       *parm;
+{
+  return (prnt_f(_ZTraceItemDO, &_ZDO_mod, pe, top, len, buffer));
+}
+
+#undef encode_DO_OperationProgress
+int    encode_DO_OperationProgress(pe, top, len, buffer, parm)
+PE     *pe;
+int    top,
+       len;
+char   *buffer;
+struct type_DO_OperationProgress *parm;
+{
+  return (enc_f(_ZOperationProgressDO, &_ZDO_mod, pe, top, len, buffer,
+               (char *) parm));
+}
+
+#undef decode_DO_OperationProgress
+int    decode_DO_OperationProgress(pe, top, len, buffer, parm)
+PE     pe;
+int    top,
+       *len;
+char  **buffer;
+struct type_DO_OperationProgress **parm;
+{
+  return (dec_f(_ZOperationProgressDO, &_ZDO_mod, pe, top, len, buffer,
+               (char **) parm));
+}
+
+#undef print_DO_OperationProgress
+/* ARGSUSED */
+int    print_DO_OperationProgress(pe, top, len, buffer, parm)
+PE     pe;
+int    top,
+       *len;
+char  **buffer,
+       *parm;
+{
+  return (prnt_f(_ZOperationProgressDO, &_ZDO_mod, pe, top, len, buffer));
+}
+
+#undef encode_DO_DomainInfo
+int    encode_DO_DomainInfo(pe, top, len, buffer, parm)
+PE     *pe;
+int    top,
+       len;
+char   *buffer;
+struct type_DO_DomainInfo *parm;
+{
+  return (enc_f(_ZDomainInfoDO, &_ZDO_mod, pe, top, len, buffer,
+               (char *) parm));
+}
+
+#undef decode_DO_DomainInfo
+int    decode_DO_DomainInfo(pe, top, len, buffer, parm)
+PE     pe;
+int    top,
+       *len;
+char  **buffer;
+struct type_DO_DomainInfo **parm;
+{
+  return (dec_f(_ZDomainInfoDO, &_ZDO_mod, pe, top, len, buffer,
+               (char **) parm));
+}
+
+#undef print_DO_DomainInfo
+/* ARGSUSED */
+int    print_DO_DomainInfo(pe, top, len, buffer, parm)
+PE     pe;
+int    top,
+       *len;
+char  **buffer,
+       *parm;
+{
+  return (prnt_f(_ZDomainInfoDO, &_ZDO_mod, pe, top, len, buffer));
+}
+
+#undef encode_DO_ContinuationReference
+int    encode_DO_ContinuationReference(pe, top, len, buffer, parm)
+PE     *pe;
+int    top,
+       len;
+char   *buffer;
+struct type_DO_ContinuationReference *parm;
+{
+  return (enc_f(_ZContinuationReferenceDO, &_ZDO_mod, pe, top, len, buffer,
+               (char *) parm));
+}
+
+#undef decode_DO_ContinuationReference
+int    decode_DO_ContinuationReference(pe, top, len, buffer, parm)
+PE     pe;
+int    top,
+       *len;
+char  **buffer;
+struct type_DO_ContinuationReference **parm;
+{
+  return (dec_f(_ZContinuationReferenceDO, &_ZDO_mod, pe, top, len, buffer,
+               (char **) parm));
+}
+
+#undef print_DO_ContinuationReference
+/* ARGSUSED */
+int    print_DO_ContinuationReference(pe, top, len, buffer, parm)
+PE     pe;
+int    top,
+       *len;
+char  **buffer,
+       *parm;
+{
+  return (prnt_f(_ZContinuationReferenceDO, &_ZDO_mod, pe, top, len, buffer));
+}
+
+#undef encode_DO_AccessPoint
+int    encode_DO_AccessPoint(pe, top, len, buffer, parm)
+PE     *pe;
+int    top,
+       len;
+char   *buffer;
+struct type_DO_AccessPoint *parm;
+{
+  return (enc_f(_ZAccessPointDO, &_ZDO_mod, pe, top, len, buffer,
+               (char *) parm));
+}
+
+#undef decode_DO_AccessPoint
+int    decode_DO_AccessPoint(pe, top, len, buffer, parm)
+PE     pe;
+int    top,
+       *len;
+char  **buffer;
+struct type_DO_AccessPoint **parm;
+{
+  return (dec_f(_ZAccessPointDO, &_ZDO_mod, pe, top, len, buffer,
+               (char **) parm));
+}
+
+#undef print_DO_AccessPoint
+/* ARGSUSED */
+int    print_DO_AccessPoint(pe, top, len, buffer, parm)
+PE     pe;
+int    top,
+       *len;
+char  **buffer,
+       *parm;
+{
+  return (prnt_f(_ZAccessPointDO, &_ZDO_mod, pe, top, len, buffer));
+}
+
+#undef encode_DO_ISODEPresentationAddress
+int    encode_DO_ISODEPresentationAddress(pe, top, len, buffer, parm)
+PE     *pe;
+int    top,
+       len;
+char   *buffer;
+struct type_DO_ISODEPresentationAddress *parm;
+{
+  return (enc_f(_ZISODEPresentationAddressDO, &_ZDO_mod, pe, top, len, buffer,
+               (char *) parm));
+}
+
+#undef decode_DO_ISODEPresentationAddress
+int    decode_DO_ISODEPresentationAddress(pe, top, len, buffer, parm)
+PE     pe;
+int    top,
+       *len;
+char  **buffer;
+struct type_DO_ISODEPresentationAddress **parm;
+{
+  return (dec_f(_ZISODEPresentationAddressDO, &_ZDO_mod, pe, top, len, buffer,
+               (char **) parm));
+}
+
+#undef print_DO_ISODEPresentationAddress
+/* ARGSUSED */
+int    print_DO_ISODEPresentationAddress(pe, top, len, buffer, parm)
+PE     pe;
+int    top,
+       *len;
+char  **buffer,
+       *parm;
+{
+  return (prnt_f(_ZISODEPresentationAddressDO, &_ZDO_mod, pe, top, len, buffer));
+}
+
+#undef encode_DO_InvokeID
+int    encode_DO_InvokeID(pe, top, len, buffer, parm)
+PE     *pe;
+int    top,
+       len;
+char   *buffer;
+struct type_DO_InvokeID *parm;
+{
+  return (enc_f(_ZInvokeIDDO, &_ZDO_mod, pe, top, len, buffer,
+               (char *) parm));
+}
+
+#undef decode_DO_InvokeID
+int    decode_DO_InvokeID(pe, top, len, buffer, parm)
+PE     pe;
+int    top,
+       *len;
+char  **buffer;
+struct type_DO_InvokeID **parm;
+{
+  return (dec_f(_ZInvokeIDDO, &_ZDO_mod, pe, top, len, buffer,
+               (char **) parm));
+}
+
+#undef print_DO_InvokeID
+/* ARGSUSED */
+int    print_DO_InvokeID(pe, top, len, buffer, parm)
+PE     pe;
+int    top,
+       *len;
+char  **buffer,
+       *parm;
+{
+  return (prnt_f(_ZInvokeIDDO, &_ZDO_mod, pe, top, len, buffer));
+}
+
+#undef encode_DAS_SimpleCredentials
+int    encode_DAS_SimpleCredentials(pe, top, len, buffer, parm)
+PE     *pe;
+int    top,
+       len;
+char   *buffer;
+struct type_DAS_SimpleCredentials *parm;
+{
+  return (enc_f(_ZSimpleCredentialsDAS, &_ZDAS_mod, pe, top, len, buffer,
+               (char *) parm));
+}
+
+#undef decode_DAS_SimpleCredentials
+int    decode_DAS_SimpleCredentials(pe, top, len, buffer, parm)
+PE     pe;
+int    top,
+       *len;
+char  **buffer;
+struct type_DAS_SimpleCredentials **parm;
+{
+  return (dec_f(_ZSimpleCredentialsDAS, &_ZDAS_mod, pe, top, len, buffer,
+               (char **) parm));
+}
+
+#undef print_DAS_SimpleCredentials
+/* ARGSUSED */
+int    print_DAS_SimpleCredentials(pe, top, len, buffer, parm)
+PE     pe;
+int    top,
+       *len;
+char  **buffer,
+       *parm;
+{
+  return (prnt_f(_ZSimpleCredentialsDAS, &_ZDAS_mod, pe, top, len, buffer));
+}
+
+#undef encode_DAS_TAlgorithmIdentifier
+int    encode_DAS_TAlgorithmIdentifier(pe, top, len, buffer, parm)
+PE     *pe;
+int    top,
+       len;
+char   *buffer;
+struct type_DAS_TAlgorithmIdentifier *parm;
+{
+  return (enc_f(_ZTAlgorithmIdentifierDAS, &_ZDAS_mod, pe, top, len, buffer,
+               (char *) parm));
+}
+
+#undef decode_DAS_TAlgorithmIdentifier
+int    decode_DAS_TAlgorithmIdentifier(pe, top, len, buffer, parm)
+PE     pe;
+int    top,
+       *len;
+char  **buffer;
+struct type_DAS_TAlgorithmIdentifier **parm;
+{
+  return (dec_f(_ZTAlgorithmIdentifierDAS, &_ZDAS_mod, pe, top, len, buffer,
+               (char **) parm));
+}
+
+#undef print_DAS_TAlgorithmIdentifier
+/* ARGSUSED */
+int    print_DAS_TAlgorithmIdentifier(pe, top, len, buffer, parm)
+PE     pe;
+int    top,
+       *len;
+char  **buffer,
+       *parm;
+{
+  return (prnt_f(_ZTAlgorithmIdentifierDAS, &_ZDAS_mod, pe, top, len, buffer));
+}
+
+#undef encode_DAS_TBitString
+int    encode_DAS_TBitString(pe, top, len, buffer, parm)
+PE     *pe;
+int    top,
+       len;
+char   *buffer;
+struct type_DAS_TBitString *parm;
+{
+  return (enc_f(_ZTBitStringDAS, &_ZDAS_mod, pe, top, len, buffer,
+               (char *) parm));
+}
+
+#undef decode_DAS_TBitString
+int    decode_DAS_TBitString(pe, top, len, buffer, parm)
+PE     pe;
+int    top,
+       *len;
+char  **buffer;
+struct type_DAS_TBitString **parm;
+{
+  return (dec_f(_ZTBitStringDAS, &_ZDAS_mod, pe, top, len, buffer,
+               (char **) parm));
+}
+
+#undef print_DAS_TBitString
+/* ARGSUSED */
+int    print_DAS_TBitString(pe, top, len, buffer, parm)
+PE     pe;
+int    top,
+       *len;
+char  **buffer,
+       *parm;
+{
+  return (prnt_f(_ZTBitStringDAS, &_ZDAS_mod, pe, top, len, buffer));
+}
+
+#undef encode_DAS_TokenToSign
+int    encode_DAS_TokenToSign(pe, top, len, buffer, parm)
+PE     *pe;
+int    top,
+       len;
+char   *buffer;
+struct type_DAS_TokenToSign *parm;
+{
+  return (enc_f(_ZTokenToSignDAS, &_ZDAS_mod, pe, top, len, buffer,
+               (char *) parm));
+}
+
+#undef decode_DAS_TokenToSign
+int    decode_DAS_TokenToSign(pe, top, len, buffer, parm)
+PE     pe;
+int    top,
+       *len;
+char  **buffer;
+struct type_DAS_TokenToSign **parm;
+{
+  return (dec_f(_ZTokenToSignDAS, &_ZDAS_mod, pe, top, len, buffer,
+               (char **) parm));
+}
+
+#undef print_DAS_TokenToSign
+/* ARGSUSED */
+int    print_DAS_TokenToSign(pe, top, len, buffer, parm)
+PE     pe;
+int    top,
+       *len;
+char  **buffer,
+       *parm;
+{
+  return (prnt_f(_ZTokenToSignDAS, &_ZDAS_mod, pe, top, len, buffer));
+}
+
+#undef encode_DAS_Token
+int    encode_DAS_Token(pe, top, len, buffer, parm)
+PE     *pe;
+int    top,
+       len;
+char   *buffer;
+struct type_DAS_Token *parm;
+{
+  return (enc_f(_ZTokenDAS, &_ZDAS_mod, pe, top, len, buffer,
+               (char *) parm));
+}
+
+#undef decode_DAS_Token
+int    decode_DAS_Token(pe, top, len, buffer, parm)
+PE     pe;
+int    top,
+       *len;
+char  **buffer;
+struct type_DAS_Token **parm;
+{
+  return (dec_f(_ZTokenDAS, &_ZDAS_mod, pe, top, len, buffer,
+               (char **) parm));
+}
+
+#undef print_DAS_Token
+/* ARGSUSED */
+int    print_DAS_Token(pe, top, len, buffer, parm)
+PE     pe;
+int    top,
+       *len;
+char  **buffer,
+       *parm;
+{
+  return (prnt_f(_ZTokenDAS, &_ZDAS_mod, pe, top, len, buffer));
+}
+
+#undef encode_DAS_StrongCredentials
+int    encode_DAS_StrongCredentials(pe, top, len, buffer, parm)
+PE     *pe;
+int    top,
+       len;
+char   *buffer;
+struct type_DAS_StrongCredentials *parm;
+{
+  return (enc_f(_ZStrongCredentialsDAS, &_ZDAS_mod, pe, top, len, buffer,
+               (char *) parm));
+}
+
+#undef decode_DAS_StrongCredentials
+int    decode_DAS_StrongCredentials(pe, top, len, buffer, parm)
+PE     pe;
+int    top,
+       *len;
+char  **buffer;
+struct type_DAS_StrongCredentials **parm;
+{
+  return (dec_f(_ZStrongCredentialsDAS, &_ZDAS_mod, pe, top, len, buffer,
+               (char **) parm));
+}
+
+#undef print_DAS_StrongCredentials
+/* ARGSUSED */
+int    print_DAS_StrongCredentials(pe, top, len, buffer, parm)
+PE     pe;
+int    top,
+       *len;
+char  **buffer,
+       *parm;
+{
+  return (prnt_f(_ZStrongCredentialsDAS, &_ZDAS_mod, pe, top, len, buffer));
+}
+
+#undef encode_DAS_Credentials
+int    encode_DAS_Credentials(pe, top, len, buffer, parm)
+PE     *pe;
+int    top,
+       len;
+char   *buffer;
+struct type_DAS_Credentials *parm;
+{
+  return (enc_f(_ZCredentialsDAS, &_ZDAS_mod, pe, top, len, buffer,
+               (char *) parm));
+}
+
+#undef decode_DAS_Credentials
+int    decode_DAS_Credentials(pe, top, len, buffer, parm)
+PE     pe;
+int    top,
+       *len;
+char  **buffer;
+struct type_DAS_Credentials **parm;
+{
+  return (dec_f(_ZCredentialsDAS, &_ZDAS_mod, pe, top, len, buffer,
+               (char **) parm));
+}
+
+#undef print_DAS_Credentials
+/* ARGSUSED */
+int    print_DAS_Credentials(pe, top, len, buffer, parm)
+PE     pe;
+int    top,
+       *len;
+char  **buffer,
+       *parm;
+{
+  return (prnt_f(_ZCredentialsDAS, &_ZDAS_mod, pe, top, len, buffer));
+}
+
+#undef encode_DAS_Versions
+int    encode_DAS_Versions(pe, top, len, buffer, parm)
+PE     *pe;
+int    top,
+       len;
+char   *buffer;
+struct type_DAS_Versions *parm;
+{
+  return (enc_f(_ZVersionsDAS, &_ZDAS_mod, pe, top, len, buffer,
+               (char *) parm));
+}
+
+#undef decode_DAS_Versions
+int    decode_DAS_Versions(pe, top, len, buffer, parm)
+PE     pe;
+int    top,
+       *len;
+char  **buffer;
+struct type_DAS_Versions **parm;
+{
+  return (dec_f(_ZVersionsDAS, &_ZDAS_mod, pe, top, len, buffer,
+               (char **) parm));
+}
+
+#undef print_DAS_Versions
+/* ARGSUSED */
+int    print_DAS_Versions(pe, top, len, buffer, parm)
+PE     pe;
+int    top,
+       *len;
+char  **buffer,
+       *parm;
+{
+  return (prnt_f(_ZVersionsDAS, &_ZDAS_mod, pe, top, len, buffer));
+}
+
+#undef encode_DAS_SecurityProblem
+int    encode_DAS_SecurityProblem(pe, top, len, buffer, parm)
+PE     *pe;
+int    top,
+       len;
+char   *buffer;
+struct type_DAS_SecurityProblem *parm;
+{
+  return (enc_f(_ZSecurityProblemDAS, &_ZDAS_mod, pe, top, len, buffer,
+               (char *) parm));
+}
+
+#undef decode_DAS_SecurityProblem
+int    decode_DAS_SecurityProblem(pe, top, len, buffer, parm)
+PE     pe;
+int    top,
+       *len;
+char  **buffer;
+struct type_DAS_SecurityProblem **parm;
+{
+  return (dec_f(_ZSecurityProblemDAS, &_ZDAS_mod, pe, top, len, buffer,
+               (char **) parm));
+}
+
+#undef print_DAS_SecurityProblem
+/* ARGSUSED */
+int    print_DAS_SecurityProblem(pe, top, len, buffer, parm)
+PE     pe;
+int    top,
+       *len;
+char  **buffer,
+       *parm;
+{
+  return (prnt_f(_ZSecurityProblemDAS, &_ZDAS_mod, pe, top, len, buffer));
+}
+
+#undef encode_DAS_ServiceProblem
+int    encode_DAS_ServiceProblem(pe, top, len, buffer, parm)
+PE     *pe;
+int    top,
+       len;
+char   *buffer;
+struct type_DAS_ServiceProblem *parm;
+{
+  return (enc_f(_ZServiceProblemDAS, &_ZDAS_mod, pe, top, len, buffer,
+               (char *) parm));
+}
+
+#undef decode_DAS_ServiceProblem
+int    decode_DAS_ServiceProblem(pe, top, len, buffer, parm)
+PE     pe;
+int    top,
+       *len;
+char  **buffer;
+struct type_DAS_ServiceProblem **parm;
+{
+  return (dec_f(_ZServiceProblemDAS, &_ZDAS_mod, pe, top, len, buffer,
+               (char **) parm));
+}
+
+#undef print_DAS_ServiceProblem
+/* ARGSUSED */
+int    print_DAS_ServiceProblem(pe, top, len, buffer, parm)
+PE     pe;
+int    top,
+       *len;
+char  **buffer,
+       *parm;
+{
+  return (prnt_f(_ZServiceProblemDAS, &_ZDAS_mod, pe, top, len, buffer));
+}
+
+#undef encode_DAS_EntryInformationSelection
+int    encode_DAS_EntryInformationSelection(pe, top, len, buffer, parm)
+PE     *pe;
+int    top,
+       len;
+char   *buffer;
+struct type_DAS_EntryInformationSelection *parm;
+{
+  return (enc_f(_ZEntryInformationSelectionDAS, &_ZDAS_mod, pe, top, len, buffer,
+               (char *) parm));
+}
+
+#undef decode_DAS_EntryInformationSelection
+int    decode_DAS_EntryInformationSelection(pe, top, len, buffer, parm)
+PE     pe;
+int    top,
+       *len;
+char  **buffer;
+struct type_DAS_EntryInformationSelection **parm;
+{
+  return (dec_f(_ZEntryInformationSelectionDAS, &_ZDAS_mod, pe, top, len, buffer,
+               (char **) parm));
+}
+
+#undef print_DAS_EntryInformationSelection
+/* ARGSUSED */
+int    print_DAS_EntryInformationSelection(pe, top, len, buffer, parm)
+PE     pe;
+int    top,
+       *len;
+char  **buffer,
+       *parm;
+{
+  return (prnt_f(_ZEntryInformationSelectionDAS, &_ZDAS_mod, pe, top, len, buffer));
+}
+
+#undef encode_DAS_ServiceControls
+int    encode_DAS_ServiceControls(pe, top, len, buffer, parm)
+PE     *pe;
+int    top,
+       len;
+char   *buffer;
+struct type_DAS_ServiceControls *parm;
+{
+  return (enc_f(_ZServiceControlsDAS, &_ZDAS_mod, pe, top, len, buffer,
+               (char *) parm));
+}
+
+#undef decode_DAS_ServiceControls
+int    decode_DAS_ServiceControls(pe, top, len, buffer, parm)
+PE     pe;
+int    top,
+       *len;
+char  **buffer;
+struct type_DAS_ServiceControls **parm;
+{
+  return (dec_f(_ZServiceControlsDAS, &_ZDAS_mod, pe, top, len, buffer,
+               (char **) parm));
+}
+
+#undef print_DAS_ServiceControls
+/* ARGSUSED */
+int    print_DAS_ServiceControls(pe, top, len, buffer, parm)
+PE     pe;
+int    top,
+       *len;
+char  **buffer,
+       *parm;
+{
+  return (prnt_f(_ZServiceControlsDAS, &_ZDAS_mod, pe, top, len, buffer));
+}
+
+#undef encode_DAS_ProtectionRequest
+int    encode_DAS_ProtectionRequest(pe, top, len, buffer, parm)
+PE     *pe;
+int    top,
+       len;
+char   *buffer;
+struct type_DAS_ProtectionRequest *parm;
+{
+  return (enc_f(_ZProtectionRequestDAS, &_ZDAS_mod, pe, top, len, buffer,
+               (char *) parm));
+}
+
+#undef decode_DAS_ProtectionRequest
+int    decode_DAS_ProtectionRequest(pe, top, len, buffer, parm)
+PE     pe;
+int    top,
+       *len;
+char  **buffer;
+struct type_DAS_ProtectionRequest **parm;
+{
+  return (dec_f(_ZProtectionRequestDAS, &_ZDAS_mod, pe, top, len, buffer,
+               (char **) parm));
+}
+
+#undef print_DAS_ProtectionRequest
+/* ARGSUSED */
+int    print_DAS_ProtectionRequest(pe, top, len, buffer, parm)
+PE     pe;
+int    top,
+       *len;
+char  **buffer,
+       *parm;
+{
+  return (prnt_f(_ZProtectionRequestDAS, &_ZDAS_mod, pe, top, len, buffer));
+}
+
+#undef encode_DAS_DBitString
+int    encode_DAS_DBitString(pe, top, len, buffer, parm)
+PE     *pe;
+int    top,
+       len;
+char   *buffer;
+struct type_DAS_DBitString *parm;
+{
+  return (enc_f(_ZDBitStringDAS, &_ZDAS_mod, pe, top, len, buffer,
+               (char *) parm));
+}
+
+#undef decode_DAS_DBitString
+int    decode_DAS_DBitString(pe, top, len, buffer, parm)
+PE     pe;
+int    top,
+       *len;
+char  **buffer;
+struct type_DAS_DBitString **parm;
+{
+  return (dec_f(_ZDBitStringDAS, &_ZDAS_mod, pe, top, len, buffer,
+               (char **) parm));
+}
+
+#undef print_DAS_DBitString
+/* ARGSUSED */
+int    print_DAS_DBitString(pe, top, len, buffer, parm)
+PE     pe;
+int    top,
+       *len;
+char  **buffer,
+       *parm;
+{
+  return (prnt_f(_ZDBitStringDAS, &_ZDAS_mod, pe, top, len, buffer));
+}
+
+#undef encode_DAS_SecurityParameters
+int    encode_DAS_SecurityParameters(pe, top, len, buffer, parm)
+PE     *pe;
+int    top,
+       len;
+char   *buffer;
+struct type_DAS_SecurityParameters *parm;
+{
+  return (enc_f(_ZSecurityParametersDAS, &_ZDAS_mod, pe, top, len, buffer,
+               (char *) parm));
+}
+
+#undef decode_DAS_SecurityParameters
+int    decode_DAS_SecurityParameters(pe, top, len, buffer, parm)
+PE     pe;
+int    top,
+       *len;
+char  **buffer;
+struct type_DAS_SecurityParameters **parm;
+{
+  return (dec_f(_ZSecurityParametersDAS, &_ZDAS_mod, pe, top, len, buffer,
+               (char **) parm));
+}
+
+#undef print_DAS_SecurityParameters
+/* ARGSUSED */
+int    print_DAS_SecurityParameters(pe, top, len, buffer, parm)
+PE     pe;
+int    top,
+       *len;
+char  **buffer,
+       *parm;
+{
+  return (prnt_f(_ZSecurityParametersDAS, &_ZDAS_mod, pe, top, len, buffer));
+}
+
+#undef encode_DAS_Extension
+int    encode_DAS_Extension(pe, top, len, buffer, parm)
+PE     *pe;
+int    top,
+       len;
+char   *buffer;
+struct type_DAS_Extension *parm;
+{
+  return (enc_f(_ZExtensionDAS, &_ZDAS_mod, pe, top, len, buffer,
+               (char *) parm));
+}
+
+#undef decode_DAS_Extension
+int    decode_DAS_Extension(pe, top, len, buffer, parm)
+PE     pe;
+int    top,
+       *len;
+char  **buffer;
+struct type_DAS_Extension **parm;
+{
+  return (dec_f(_ZExtensionDAS, &_ZDAS_mod, pe, top, len, buffer,
+               (char **) parm));
+}
+
+#undef print_DAS_Extension
+/* ARGSUSED */
+int    print_DAS_Extension(pe, top, len, buffer, parm)
+PE     pe;
+int    top,
+       *len;
+char  **buffer,
+       *parm;
+{
+  return (prnt_f(_ZExtensionDAS, &_ZDAS_mod, pe, top, len, buffer));
+}
+
+#undef encode_DAS_EntryInformation
+int    encode_DAS_EntryInformation(pe, top, len, buffer, parm)
+PE     *pe;
+int    top,
+       len;
+char   *buffer;
+struct type_DAS_EntryInformation *parm;
+{
+  return (enc_f(_ZEntryInformationDAS, &_ZDAS_mod, pe, top, len, buffer,
+               (char *) parm));
+}
+
+#undef decode_DAS_EntryInformation
+int    decode_DAS_EntryInformation(pe, top, len, buffer, parm)
+PE     pe;
+int    top,
+       *len;
+char  **buffer;
+struct type_DAS_EntryInformation **parm;
+{
+  return (dec_f(_ZEntryInformationDAS, &_ZDAS_mod, pe, top, len, buffer,
+               (char **) parm));
+}
+
+#undef print_DAS_EntryInformation
+/* ARGSUSED */
+int    print_DAS_EntryInformation(pe, top, len, buffer, parm)
+PE     pe;
+int    top,
+       *len;
+char  **buffer,
+       *parm;
+{
+  return (prnt_f(_ZEntryInformationDAS, &_ZDAS_mod, pe, top, len, buffer));
+}
+
+#undef encode_DAS_LimitProblem
+int    encode_DAS_LimitProblem(pe, top, len, buffer, parm)
+PE     *pe;
+int    top,
+       len;
+char   *buffer;
+struct type_DAS_LimitProblem *parm;
+{
+  return (enc_f(_ZLimitProblemDAS, &_ZDAS_mod, pe, top, len, buffer,
+               (char *) parm));
+}
+
+#undef decode_DAS_LimitProblem
+int    decode_DAS_LimitProblem(pe, top, len, buffer, parm)
+PE     pe;
+int    top,
+       *len;
+char  **buffer;
+struct type_DAS_LimitProblem **parm;
+{
+  return (dec_f(_ZLimitProblemDAS, &_ZDAS_mod, pe, top, len, buffer,
+               (char **) parm));
+}
+
+#undef print_DAS_LimitProblem
+/* ARGSUSED */
+int    print_DAS_LimitProblem(pe, top, len, buffer, parm)
+PE     pe;
+int    top,
+       *len;
+char  **buffer,
+       *parm;
+{
+  return (prnt_f(_ZLimitProblemDAS, &_ZDAS_mod, pe, top, len, buffer));
+}
+
+#undef encode_DAS_PartialOutcomeQualifier
+int    encode_DAS_PartialOutcomeQualifier(pe, top, len, buffer, parm)
+PE     *pe;
+int    top,
+       len;
+char   *buffer;
+struct type_DAS_PartialOutcomeQualifier *parm;
+{
+  return (enc_f(_ZPartialOutcomeQualifierDAS, &_ZDAS_mod, pe, top, len, buffer,
+               (char *) parm));
+}
+
+#undef decode_DAS_PartialOutcomeQualifier
+int    decode_DAS_PartialOutcomeQualifier(pe, top, len, buffer, parm)
+PE     pe;
+int    top,
+       *len;
+char  **buffer;
+struct type_DAS_PartialOutcomeQualifier **parm;
+{
+  return (dec_f(_ZPartialOutcomeQualifierDAS, &_ZDAS_mod, pe, top, len, buffer,
+               (char **) parm));
+}
+
+#undef print_DAS_PartialOutcomeQualifier
+/* ARGSUSED */
+int    print_DAS_PartialOutcomeQualifier(pe, top, len, buffer, parm)
+PE     pe;
+int    top,
+       *len;
+char  **buffer,
+       *parm;
+{
+  return (prnt_f(_ZPartialOutcomeQualifierDAS, &_ZDAS_mod, pe, top, len, buffer));
+}
+
+#undef encode_DAS_FilterItem
+int    encode_DAS_FilterItem(pe, top, len, buffer, parm)
+PE     *pe;
+int    top,
+       len;
+char   *buffer;
+struct type_DAS_FilterItem *parm;
+{
+  return (enc_f(_ZFilterItemDAS, &_ZDAS_mod, pe, top, len, buffer,
+               (char *) parm));
+}
+
+#undef decode_DAS_FilterItem
+int    decode_DAS_FilterItem(pe, top, len, buffer, parm)
+PE     pe;
+int    top,
+       *len;
+char  **buffer;
+struct type_DAS_FilterItem **parm;
+{
+  return (dec_f(_ZFilterItemDAS, &_ZDAS_mod, pe, top, len, buffer,
+               (char **) parm));
+}
+
+#undef print_DAS_FilterItem
+/* ARGSUSED */
+int    print_DAS_FilterItem(pe, top, len, buffer, parm)
+PE     pe;
+int    top,
+       *len;
+char  **buffer,
+       *parm;
+{
+  return (prnt_f(_ZFilterItemDAS, &_ZDAS_mod, pe, top, len, buffer));
+}
+
+#undef encode_DAS_Filter
+int    encode_DAS_Filter(pe, top, len, buffer, parm)
+PE     *pe;
+int    top,
+       len;
+char   *buffer;
+struct type_DAS_Filter *parm;
+{
+  return (enc_f(_ZFilterDAS, &_ZDAS_mod, pe, top, len, buffer,
+               (char *) parm));
+}
+
+#undef decode_DAS_Filter
+int    decode_DAS_Filter(pe, top, len, buffer, parm)
+PE     pe;
+int    top,
+       *len;
+char  **buffer;
+struct type_DAS_Filter **parm;
+{
+  return (dec_f(_ZFilterDAS, &_ZDAS_mod, pe, top, len, buffer,
+               (char **) parm));
+}
+
+#undef print_DAS_Filter
+/* ARGSUSED */
+int    print_DAS_Filter(pe, top, len, buffer, parm)
+PE     pe;
+int    top,
+       *len;
+char  **buffer,
+       *parm;
+{
+  return (prnt_f(_ZFilterDAS, &_ZDAS_mod, pe, top, len, buffer));
+}
+
+#undef encode_DAS_TAttributeType
+int    encode_DAS_TAttributeType(pe, top, len, buffer, parm)
+PE     *pe;
+int    top,
+       len;
+char   *buffer;
+struct type_DAS_TAttributeType *parm;
+{
+  return (enc_f(_ZTAttributeTypeDAS, &_ZDAS_mod, pe, top, len, buffer,
+               (char *) parm));
+}
+
+#undef decode_DAS_TAttributeType
+int    decode_DAS_TAttributeType(pe, top, len, buffer, parm)
+PE     pe;
+int    top,
+       *len;
+char  **buffer;
+struct type_DAS_TAttributeType **parm;
+{
+  return (dec_f(_ZTAttributeTypeDAS, &_ZDAS_mod, pe, top, len, buffer,
+               (char **) parm));
+}
+
+#undef print_DAS_TAttributeType
+/* ARGSUSED */
+int    print_DAS_TAttributeType(pe, top, len, buffer, parm)
+PE     pe;
+int    top,
+       *len;
+char  **buffer,
+       *parm;
+{
+  return (prnt_f(_ZTAttributeTypeDAS, &_ZDAS_mod, pe, top, len, buffer));
+}
+
+#undef encode_DAS_EntryModification
+int    encode_DAS_EntryModification(pe, top, len, buffer, parm)
+PE     *pe;
+int    top,
+       len;
+char   *buffer;
+struct type_DAS_EntryModification *parm;
+{
+  return (enc_f(_ZEntryModificationDAS, &_ZDAS_mod, pe, top, len, buffer,
+               (char *) parm));
+}
+
+#undef decode_DAS_EntryModification
+int    decode_DAS_EntryModification(pe, top, len, buffer, parm)
+PE     pe;
+int    top,
+       *len;
+char  **buffer;
+struct type_DAS_EntryModification **parm;
+{
+  return (dec_f(_ZEntryModificationDAS, &_ZDAS_mod, pe, top, len, buffer,
+               (char **) parm));
+}
+
+#undef print_DAS_EntryModification
+/* ARGSUSED */
+int    print_DAS_EntryModification(pe, top, len, buffer, parm)
+PE     pe;
+int    top,
+       *len;
+char  **buffer,
+       *parm;
+{
+  return (prnt_f(_ZEntryModificationDAS, &_ZDAS_mod, pe, top, len, buffer));
+}
+
+#undef encode_DAS_AbandonProblem
+int    encode_DAS_AbandonProblem(pe, top, len, buffer, parm)
+PE     *pe;
+int    top,
+       len;
+char   *buffer;
+struct type_DAS_AbandonProblem *parm;
+{
+  return (enc_f(_ZAbandonProblemDAS, &_ZDAS_mod, pe, top, len, buffer,
+               (char *) parm));
+}
+
+#undef decode_DAS_AbandonProblem
+int    decode_DAS_AbandonProblem(pe, top, len, buffer, parm)
+PE     pe;
+int    top,
+       *len;
+char  **buffer;
+struct type_DAS_AbandonProblem **parm;
+{
+  return (dec_f(_ZAbandonProblemDAS, &_ZDAS_mod, pe, top, len, buffer,
+               (char **) parm));
+}
+
+#undef print_DAS_AbandonProblem
+/* ARGSUSED */
+int    print_DAS_AbandonProblem(pe, top, len, buffer, parm)
+PE     pe;
+int    top,
+       *len;
+char  **buffer,
+       *parm;
+{
+  return (prnt_f(_ZAbandonProblemDAS, &_ZDAS_mod, pe, top, len, buffer));
+}
+
+#undef encode_DAS_AttributeProblem
+int    encode_DAS_AttributeProblem(pe, top, len, buffer, parm)
+PE     *pe;
+int    top,
+       len;
+char   *buffer;
+struct type_DAS_AttributeProblem *parm;
+{
+  return (enc_f(_ZAttributeProblemDAS, &_ZDAS_mod, pe, top, len, buffer,
+               (char *) parm));
+}
+
+#undef decode_DAS_AttributeProblem
+int    decode_DAS_AttributeProblem(pe, top, len, buffer, parm)
+PE     pe;
+int    top,
+       *len;
+char  **buffer;
+struct type_DAS_AttributeProblem **parm;
+{
+  return (dec_f(_ZAttributeProblemDAS, &_ZDAS_mod, pe, top, len, buffer,
+               (char **) parm));
+}
+
+#undef print_DAS_AttributeProblem
+/* ARGSUSED */
+int    print_DAS_AttributeProblem(pe, top, len, buffer, parm)
+PE     pe;
+int    top,
+       *len;
+char  **buffer,
+       *parm;
+{
+  return (prnt_f(_ZAttributeProblemDAS, &_ZDAS_mod, pe, top, len, buffer));
+}
+
+#undef encode_DAS_NameProblem
+int    encode_DAS_NameProblem(pe, top, len, buffer, parm)
+PE     *pe;
+int    top,
+       len;
+char   *buffer;
+struct type_DAS_NameProblem *parm;
+{
+  return (enc_f(_ZNameProblemDAS, &_ZDAS_mod, pe, top, len, buffer,
+               (char *) parm));
+}
+
+#undef decode_DAS_NameProblem
+int    decode_DAS_NameProblem(pe, top, len, buffer, parm)
+PE     pe;
+int    top,
+       *len;
+char  **buffer;
+struct type_DAS_NameProblem **parm;
+{
+  return (dec_f(_ZNameProblemDAS, &_ZDAS_mod, pe, top, len, buffer,
+               (char **) parm));
+}
+
+#undef print_DAS_NameProblem
+/* ARGSUSED */
+int    print_DAS_NameProblem(pe, top, len, buffer, parm)
+PE     pe;
+int    top,
+       *len;
+char  **buffer,
+       *parm;
+{
+  return (prnt_f(_ZNameProblemDAS, &_ZDAS_mod, pe, top, len, buffer));
+}
+
+#undef encode_DAS_UpdateProblem
+int    encode_DAS_UpdateProblem(pe, top, len, buffer, parm)
+PE     *pe;
+int    top,
+       len;
+char   *buffer;
+struct type_DAS_UpdateProblem *parm;
+{
+  return (enc_f(_ZUpdateProblemDAS, &_ZDAS_mod, pe, top, len, buffer,
+               (char *) parm));
+}
+
+#undef decode_DAS_UpdateProblem
+int    decode_DAS_UpdateProblem(pe, top, len, buffer, parm)
+PE     pe;
+int    top,
+       *len;
+char  **buffer;
+struct type_DAS_UpdateProblem **parm;
+{
+  return (dec_f(_ZUpdateProblemDAS, &_ZDAS_mod, pe, top, len, buffer,
+               (char **) parm));
+}
+
+#undef print_DAS_UpdateProblem
+/* ARGSUSED */
+int    print_DAS_UpdateProblem(pe, top, len, buffer, parm)
+PE     pe;
+int    top,
+       *len;
+char  **buffer,
+       *parm;
+{
+  return (prnt_f(_ZUpdateProblemDAS, &_ZDAS_mod, pe, top, len, buffer));
+}
+
+#undef encode_DAS_DirectoryBindArgument
+int    encode_DAS_DirectoryBindArgument(pe, top, len, buffer, parm)
+PE     *pe;
+int    top,
+       len;
+char   *buffer;
+struct type_DAS_DirectoryBindArgument *parm;
+{
+  return (enc_f(_ZDirectoryBindArgumentDAS, &_ZDAS_mod, pe, top, len, buffer,
+               (char *) parm));
+}
+
+#undef decode_DAS_DirectoryBindArgument
+int    decode_DAS_DirectoryBindArgument(pe, top, len, buffer, parm)
+PE     pe;
+int    top,
+       *len;
+char  **buffer;
+struct type_DAS_DirectoryBindArgument **parm;
+{
+  return (dec_f(_ZDirectoryBindArgumentDAS, &_ZDAS_mod, pe, top, len, buffer,
+               (char **) parm));
+}
+
+#undef print_DAS_DirectoryBindArgument
+/* ARGSUSED */
+int    print_DAS_DirectoryBindArgument(pe, top, len, buffer, parm)
+PE     pe;
+int    top,
+       *len;
+char  **buffer,
+       *parm;
+{
+  return (prnt_f(_ZDirectoryBindArgumentDAS, &_ZDAS_mod, pe, top, len, buffer));
+}
+
+#undef encode_DAS_DirectoryBindResult
+int    encode_DAS_DirectoryBindResult(pe, top, len, buffer, parm)
+PE     *pe;
+int    top,
+       len;
+char   *buffer;
+struct type_DAS_DirectoryBindResult *parm;
+{
+  return (enc_f(_ZDirectoryBindResultDAS, &_ZDAS_mod, pe, top, len, buffer,
+               (char *) parm));
+}
+
+#undef decode_DAS_DirectoryBindResult
+int    decode_DAS_DirectoryBindResult(pe, top, len, buffer, parm)
+PE     pe;
+int    top,
+       *len;
+char  **buffer;
+struct type_DAS_DirectoryBindResult **parm;
+{
+  return (dec_f(_ZDirectoryBindResultDAS, &_ZDAS_mod, pe, top, len, buffer,
+               (char **) parm));
+}
+
+#undef print_DAS_DirectoryBindResult
+/* ARGSUSED */
+int    print_DAS_DirectoryBindResult(pe, top, len, buffer, parm)
+PE     pe;
+int    top,
+       *len;
+char  **buffer,
+       *parm;
+{
+  return (prnt_f(_ZDirectoryBindResultDAS, &_ZDAS_mod, pe, top, len, buffer));
+}
+
+#undef encode_DAS_ReadArgumentData
+int    encode_DAS_ReadArgumentData(pe, top, len, buffer, parm)
+PE     *pe;
+int    top,
+       len;
+char   *buffer;
+struct type_DAS_ReadArgumentData *parm;
+{
+  return (enc_f(_ZReadArgumentDataDAS, &_ZDAS_mod, pe, top, len, buffer,
+               (char *) parm));
+}
+
+#undef decode_DAS_ReadArgumentData
+int    decode_DAS_ReadArgumentData(pe, top, len, buffer, parm)
+PE     pe;
+int    top,
+       *len;
+char  **buffer;
+struct type_DAS_ReadArgumentData **parm;
+{
+  return (dec_f(_ZReadArgumentDataDAS, &_ZDAS_mod, pe, top, len, buffer,
+               (char **) parm));
+}
+
+#undef print_DAS_ReadArgumentData
+/* ARGSUSED */
+int    print_DAS_ReadArgumentData(pe, top, len, buffer, parm)
+PE     pe;
+int    top,
+       *len;
+char  **buffer,
+       *parm;
+{
+  return (prnt_f(_ZReadArgumentDataDAS, &_ZDAS_mod, pe, top, len, buffer));
+}
+
+#undef encode_DAS_ReadArgument
+int    encode_DAS_ReadArgument(pe, top, len, buffer, parm)
+PE     *pe;
+int    top,
+       len;
+char   *buffer;
+struct type_DAS_ReadArgument *parm;
+{
+  return (enc_f(_ZReadArgumentDAS, &_ZDAS_mod, pe, top, len, buffer,
+               (char *) parm));
+}
+
+#undef decode_DAS_ReadArgument
+int    decode_DAS_ReadArgument(pe, top, len, buffer, parm)
+PE     pe;
+int    top,
+       *len;
+char  **buffer;
+struct type_DAS_ReadArgument **parm;
+{
+  return (dec_f(_ZReadArgumentDAS, &_ZDAS_mod, pe, top, len, buffer,
+               (char **) parm));
+}
+
+#undef print_DAS_ReadArgument
+/* ARGSUSED */
+int    print_DAS_ReadArgument(pe, top, len, buffer, parm)
+PE     pe;
+int    top,
+       *len;
+char  **buffer,
+       *parm;
+{
+  return (prnt_f(_ZReadArgumentDAS, &_ZDAS_mod, pe, top, len, buffer));
+}
+
+#undef encode_DAS_ReadResultData
+int    encode_DAS_ReadResultData(pe, top, len, buffer, parm)
+PE     *pe;
+int    top,
+       len;
+char   *buffer;
+struct type_DAS_ReadResultData *parm;
+{
+  return (enc_f(_ZReadResultDataDAS, &_ZDAS_mod, pe, top, len, buffer,
+               (char *) parm));
+}
+
+#undef decode_DAS_ReadResultData
+int    decode_DAS_ReadResultData(pe, top, len, buffer, parm)
+PE     pe;
+int    top,
+       *len;
+char  **buffer;
+struct type_DAS_ReadResultData **parm;
+{
+  return (dec_f(_ZReadResultDataDAS, &_ZDAS_mod, pe, top, len, buffer,
+               (char **) parm));
+}
+
+#undef print_DAS_ReadResultData
+/* ARGSUSED */
+int    print_DAS_ReadResultData(pe, top, len, buffer, parm)
+PE     pe;
+int    top,
+       *len;
+char  **buffer,
+       *parm;
+{
+  return (prnt_f(_ZReadResultDataDAS, &_ZDAS_mod, pe, top, len, buffer));
+}
+
+#undef encode_DAS_ReadResult
+int    encode_DAS_ReadResult(pe, top, len, buffer, parm)
+PE     *pe;
+int    top,
+       len;
+char   *buffer;
+struct type_DAS_ReadResult *parm;
+{
+  return (enc_f(_ZReadResultDAS, &_ZDAS_mod, pe, top, len, buffer,
+               (char *) parm));
+}
+
+#undef decode_DAS_ReadResult
+int    decode_DAS_ReadResult(pe, top, len, buffer, parm)
+PE     pe;
+int    top,
+       *len;
+char  **buffer;
+struct type_DAS_ReadResult **parm;
+{
+  return (dec_f(_ZReadResultDAS, &_ZDAS_mod, pe, top, len, buffer,
+               (char **) parm));
+}
+
+#undef print_DAS_ReadResult
+/* ARGSUSED */
+int    print_DAS_ReadResult(pe, top, len, buffer, parm)
+PE     pe;
+int    top,
+       *len;
+char  **buffer,
+       *parm;
+{
+  return (prnt_f(_ZReadResultDAS, &_ZDAS_mod, pe, top, len, buffer));
+}
+
+#undef encode_DAS_CompareArgumentData
+int    encode_DAS_CompareArgumentData(pe, top, len, buffer, parm)
+PE     *pe;
+int    top,
+       len;
+char   *buffer;
+struct type_DAS_CompareArgumentData *parm;
+{
+  return (enc_f(_ZCompareArgumentDataDAS, &_ZDAS_mod, pe, top, len, buffer,
+               (char *) parm));
+}
+
+#undef decode_DAS_CompareArgumentData
+int    decode_DAS_CompareArgumentData(pe, top, len, buffer, parm)
+PE     pe;
+int    top,
+       *len;
+char  **buffer;
+struct type_DAS_CompareArgumentData **parm;
+{
+  return (dec_f(_ZCompareArgumentDataDAS, &_ZDAS_mod, pe, top, len, buffer,
+               (char **) parm));
+}
+
+#undef print_DAS_CompareArgumentData
+/* ARGSUSED */
+int    print_DAS_CompareArgumentData(pe, top, len, buffer, parm)
+PE     pe;
+int    top,
+       *len;
+char  **buffer,
+       *parm;
+{
+  return (prnt_f(_ZCompareArgumentDataDAS, &_ZDAS_mod, pe, top, len, buffer));
+}
+
+#undef encode_DAS_CompareArgument
+int    encode_DAS_CompareArgument(pe, top, len, buffer, parm)
+PE     *pe;
+int    top,
+       len;
+char   *buffer;
+struct type_DAS_CompareArgument *parm;
+{
+  return (enc_f(_ZCompareArgumentDAS, &_ZDAS_mod, pe, top, len, buffer,
+               (char *) parm));
+}
+
+#undef decode_DAS_CompareArgument
+int    decode_DAS_CompareArgument(pe, top, len, buffer, parm)
+PE     pe;
+int    top,
+       *len;
+char  **buffer;
+struct type_DAS_CompareArgument **parm;
+{
+  return (dec_f(_ZCompareArgumentDAS, &_ZDAS_mod, pe, top, len, buffer,
+               (char **) parm));
+}
+
+#undef print_DAS_CompareArgument
+/* ARGSUSED */
+int    print_DAS_CompareArgument(pe, top, len, buffer, parm)
+PE     pe;
+int    top,
+       *len;
+char  **buffer,
+       *parm;
+{
+  return (prnt_f(_ZCompareArgumentDAS, &_ZDAS_mod, pe, top, len, buffer));
+}
+
+#undef encode_DAS_CompareResultData
+int    encode_DAS_CompareResultData(pe, top, len, buffer, parm)
+PE     *pe;
+int    top,
+       len;
+char   *buffer;
+struct type_DAS_CompareResultData *parm;
+{
+  return (enc_f(_ZCompareResultDataDAS, &_ZDAS_mod, pe, top, len, buffer,
+               (char *) parm));
+}
+
+#undef decode_DAS_CompareResultData
+int    decode_DAS_CompareResultData(pe, top, len, buffer, parm)
+PE     pe;
+int    top,
+       *len;
+char  **buffer;
+struct type_DAS_CompareResultData **parm;
+{
+  return (dec_f(_ZCompareResultDataDAS, &_ZDAS_mod, pe, top, len, buffer,
+               (char **) parm));
+}
+
+#undef print_DAS_CompareResultData
+/* ARGSUSED */
+int    print_DAS_CompareResultData(pe, top, len, buffer, parm)
+PE     pe;
+int    top,
+       *len;
+char  **buffer,
+       *parm;
+{
+  return (prnt_f(_ZCompareResultDataDAS, &_ZDAS_mod, pe, top, len, buffer));
+}
+
+#undef encode_DAS_CompareResult
+int    encode_DAS_CompareResult(pe, top, len, buffer, parm)
+PE     *pe;
+int    top,
+       len;
+char   *buffer;
+struct type_DAS_CompareResult *parm;
+{
+  return (enc_f(_ZCompareResultDAS, &_ZDAS_mod, pe, top, len, buffer,
+               (char *) parm));
+}
+
+#undef decode_DAS_CompareResult
+int    decode_DAS_CompareResult(pe, top, len, buffer, parm)
+PE     pe;
+int    top,
+       *len;
+char  **buffer;
+struct type_DAS_CompareResult **parm;
+{
+  return (dec_f(_ZCompareResultDAS, &_ZDAS_mod, pe, top, len, buffer,
+               (char **) parm));
+}
+
+#undef print_DAS_CompareResult
+/* ARGSUSED */
+int    print_DAS_CompareResult(pe, top, len, buffer, parm)
+PE     pe;
+int    top,
+       *len;
+char  **buffer,
+       *parm;
+{
+  return (prnt_f(_ZCompareResultDAS, &_ZDAS_mod, pe, top, len, buffer));
+}
+
+#undef encode_DAS_TInvokeID
+int    encode_DAS_TInvokeID(pe, top, len, buffer, parm)
+PE     *pe;
+int    top,
+       len;
+char   *buffer;
+struct type_DAS_TInvokeID *parm;
+{
+  return (enc_f(_ZTInvokeIDDAS, &_ZDAS_mod, pe, top, len, buffer,
+               (char *) parm));
+}
+
+#undef decode_DAS_TInvokeID
+int    decode_DAS_TInvokeID(pe, top, len, buffer, parm)
+PE     pe;
+int    top,
+       *len;
+char  **buffer;
+struct type_DAS_TInvokeID **parm;
+{
+  return (dec_f(_ZTInvokeIDDAS, &_ZDAS_mod, pe, top, len, buffer,
+               (char **) parm));
+}
+
+#undef print_DAS_TInvokeID
+/* ARGSUSED */
+int    print_DAS_TInvokeID(pe, top, len, buffer, parm)
+PE     pe;
+int    top,
+       *len;
+char  **buffer,
+       *parm;
+{
+  return (prnt_f(_ZTInvokeIDDAS, &_ZDAS_mod, pe, top, len, buffer));
+}
+
+#undef encode_DAS_AbandonArgument
+int    encode_DAS_AbandonArgument(pe, top, len, buffer, parm)
+PE     *pe;
+int    top,
+       len;
+char   *buffer;
+struct type_DAS_AbandonArgument *parm;
+{
+  return (enc_f(_ZAbandonArgumentDAS, &_ZDAS_mod, pe, top, len, buffer,
+               (char *) parm));
+}
+
+#undef decode_DAS_AbandonArgument
+int    decode_DAS_AbandonArgument(pe, top, len, buffer, parm)
+PE     pe;
+int    top,
+       *len;
+char  **buffer;
+struct type_DAS_AbandonArgument **parm;
+{
+  return (dec_f(_ZAbandonArgumentDAS, &_ZDAS_mod, pe, top, len, buffer,
+               (char **) parm));
+}
+
+#undef print_DAS_AbandonArgument
+/* ARGSUSED */
+int    print_DAS_AbandonArgument(pe, top, len, buffer, parm)
+PE     pe;
+int    top,
+       *len;
+char  **buffer,
+       *parm;
+{
+  return (prnt_f(_ZAbandonArgumentDAS, &_ZDAS_mod, pe, top, len, buffer));
+}
+
+#undef encode_DAS_AbandonResult
+int    encode_DAS_AbandonResult(pe, top, len, buffer, parm)
+PE     *pe;
+int    top,
+       len;
+char   *buffer;
+struct type_DAS_AbandonResult *parm;
+{
+  return (enc_f(_ZAbandonResultDAS, &_ZDAS_mod, pe, top, len, buffer,
+               (char *) parm));
+}
+
+#undef decode_DAS_AbandonResult
+int    decode_DAS_AbandonResult(pe, top, len, buffer, parm)
+PE     pe;
+int    top,
+       *len;
+char  **buffer;
+struct type_DAS_AbandonResult **parm;
+{
+  return (dec_f(_ZAbandonResultDAS, &_ZDAS_mod, pe, top, len, buffer,
+               (char **) parm));
+}
+
+#undef print_DAS_AbandonResult
+/* ARGSUSED */
+int    print_DAS_AbandonResult(pe, top, len, buffer, parm)
+PE     pe;
+int    top,
+       *len;
+char  **buffer,
+       *parm;
+{
+  return (prnt_f(_ZAbandonResultDAS, &_ZDAS_mod, pe, top, len, buffer));
+}
+
+#undef encode_DAS_ListArgumentData
+int    encode_DAS_ListArgumentData(pe, top, len, buffer, parm)
+PE     *pe;
+int    top,
+       len;
+char   *buffer;
+struct type_DAS_ListArgumentData *parm;
+{
+  return (enc_f(_ZListArgumentDataDAS, &_ZDAS_mod, pe, top, len, buffer,
+               (char *) parm));
+}
+
+#undef decode_DAS_ListArgumentData
+int    decode_DAS_ListArgumentData(pe, top, len, buffer, parm)
+PE     pe;
+int    top,
+       *len;
+char  **buffer;
+struct type_DAS_ListArgumentData **parm;
+{
+  return (dec_f(_ZListArgumentDataDAS, &_ZDAS_mod, pe, top, len, buffer,
+               (char **) parm));
+}
+
+#undef print_DAS_ListArgumentData
+/* ARGSUSED */
+int    print_DAS_ListArgumentData(pe, top, len, buffer, parm)
+PE     pe;
+int    top,
+       *len;
+char  **buffer,
+       *parm;
+{
+  return (prnt_f(_ZListArgumentDataDAS, &_ZDAS_mod, pe, top, len, buffer));
+}
+
+#undef encode_DAS_ListArgument
+int    encode_DAS_ListArgument(pe, top, len, buffer, parm)
+PE     *pe;
+int    top,
+       len;
+char   *buffer;
+struct type_DAS_ListArgument *parm;
+{
+  return (enc_f(_ZListArgumentDAS, &_ZDAS_mod, pe, top, len, buffer,
+               (char *) parm));
+}
+
+#undef decode_DAS_ListArgument
+int    decode_DAS_ListArgument(pe, top, len, buffer, parm)
+PE     pe;
+int    top,
+       *len;
+char  **buffer;
+struct type_DAS_ListArgument **parm;
+{
+  return (dec_f(_ZListArgumentDAS, &_ZDAS_mod, pe, top, len, buffer,
+               (char **) parm));
+}
+
+#undef print_DAS_ListArgument
+/* ARGSUSED */
+int    print_DAS_ListArgument(pe, top, len, buffer, parm)
+PE     pe;
+int    top,
+       *len;
+char  **buffer,
+       *parm;
+{
+  return (prnt_f(_ZListArgumentDAS, &_ZDAS_mod, pe, top, len, buffer));
+}
+
+#undef encode_DAS_ListResultData
+int    encode_DAS_ListResultData(pe, top, len, buffer, parm)
+PE     *pe;
+int    top,
+       len;
+char   *buffer;
+struct type_DAS_ListResultData *parm;
+{
+  return (enc_f(_ZListResultDataDAS, &_ZDAS_mod, pe, top, len, buffer,
+               (char *) parm));
+}
+
+#undef decode_DAS_ListResultData
+int    decode_DAS_ListResultData(pe, top, len, buffer, parm)
+PE     pe;
+int    top,
+       *len;
+char  **buffer;
+struct type_DAS_ListResultData **parm;
+{
+  return (dec_f(_ZListResultDataDAS, &_ZDAS_mod, pe, top, len, buffer,
+               (char **) parm));
+}
+
+#undef print_DAS_ListResultData
+/* ARGSUSED */
+int    print_DAS_ListResultData(pe, top, len, buffer, parm)
+PE     pe;
+int    top,
+       *len;
+char  **buffer,
+       *parm;
+{
+  return (prnt_f(_ZListResultDataDAS, &_ZDAS_mod, pe, top, len, buffer));
+}
+
+#undef encode_DAS_ListResult
+int    encode_DAS_ListResult(pe, top, len, buffer, parm)
+PE     *pe;
+int    top,
+       len;
+char   *buffer;
+struct type_DAS_ListResult *parm;
+{
+  return (enc_f(_ZListResultDAS, &_ZDAS_mod, pe, top, len, buffer,
+               (char *) parm));
+}
+
+#undef decode_DAS_ListResult
+int    decode_DAS_ListResult(pe, top, len, buffer, parm)
+PE     pe;
+int    top,
+       *len;
+char  **buffer;
+struct type_DAS_ListResult **parm;
+{
+  return (dec_f(_ZListResultDAS, &_ZDAS_mod, pe, top, len, buffer,
+               (char **) parm));
+}
+
+#undef print_DAS_ListResult
+/* ARGSUSED */
+int    print_DAS_ListResult(pe, top, len, buffer, parm)
+PE     pe;
+int    top,
+       *len;
+char  **buffer,
+       *parm;
+{
+  return (prnt_f(_ZListResultDAS, &_ZDAS_mod, pe, top, len, buffer));
+}
+
+#undef encode_DAS_SearchArgumentData
+int    encode_DAS_SearchArgumentData(pe, top, len, buffer, parm)
+PE     *pe;
+int    top,
+       len;
+char   *buffer;
+struct type_DAS_SearchArgumentData *parm;
+{
+  return (enc_f(_ZSearchArgumentDataDAS, &_ZDAS_mod, pe, top, len, buffer,
+               (char *) parm));
+}
+
+#undef decode_DAS_SearchArgumentData
+int    decode_DAS_SearchArgumentData(pe, top, len, buffer, parm)
+PE     pe;
+int    top,
+       *len;
+char  **buffer;
+struct type_DAS_SearchArgumentData **parm;
+{
+  return (dec_f(_ZSearchArgumentDataDAS, &_ZDAS_mod, pe, top, len, buffer,
+               (char **) parm));
+}
+
+#undef print_DAS_SearchArgumentData
+/* ARGSUSED */
+int    print_DAS_SearchArgumentData(pe, top, len, buffer, parm)
+PE     pe;
+int    top,
+       *len;
+char  **buffer,
+       *parm;
+{
+  return (prnt_f(_ZSearchArgumentDataDAS, &_ZDAS_mod, pe, top, len, buffer));
+}
+
+#undef encode_DAS_SearchArgument
+int    encode_DAS_SearchArgument(pe, top, len, buffer, parm)
+PE     *pe;
+int    top,
+       len;
+char   *buffer;
+struct type_DAS_SearchArgument *parm;
+{
+  return (enc_f(_ZSearchArgumentDAS, &_ZDAS_mod, pe, top, len, buffer,
+               (char *) parm));
+}
+
+#undef decode_DAS_SearchArgument
+int    decode_DAS_SearchArgument(pe, top, len, buffer, parm)
+PE     pe;
+int    top,
+       *len;
+char  **buffer;
+struct type_DAS_SearchArgument **parm;
+{
+  return (dec_f(_ZSearchArgumentDAS, &_ZDAS_mod, pe, top, len, buffer,
+               (char **) parm));
+}
+
+#undef print_DAS_SearchArgument
+/* ARGSUSED */
+int    print_DAS_SearchArgument(pe, top, len, buffer, parm)
+PE     pe;
+int    top,
+       *len;
+char  **buffer,
+       *parm;
+{
+  return (prnt_f(_ZSearchArgumentDAS, &_ZDAS_mod, pe, top, len, buffer));
+}
+
+#undef encode_DAS_SearchResultData
+int    encode_DAS_SearchResultData(pe, top, len, buffer, parm)
+PE     *pe;
+int    top,
+       len;
+char   *buffer;
+struct type_DAS_SearchResultData *parm;
+{
+  return (enc_f(_ZSearchResultDataDAS, &_ZDAS_mod, pe, top, len, buffer,
+               (char *) parm));
+}
+
+#undef decode_DAS_SearchResultData
+int    decode_DAS_SearchResultData(pe, top, len, buffer, parm)
+PE     pe;
+int    top,
+       *len;
+char  **buffer;
+struct type_DAS_SearchResultData **parm;
+{
+  return (dec_f(_ZSearchResultDataDAS, &_ZDAS_mod, pe, top, len, buffer,
+               (char **) parm));
+}
+
+#undef print_DAS_SearchResultData
+/* ARGSUSED */
+int    print_DAS_SearchResultData(pe, top, len, buffer, parm)
+PE     pe;
+int    top,
+       *len;
+char  **buffer,
+       *parm;
+{
+  return (prnt_f(_ZSearchResultDataDAS, &_ZDAS_mod, pe, top, len, buffer));
+}
+
+#undef encode_DAS_SAlgorithmIdentifier
+int    encode_DAS_SAlgorithmIdentifier(pe, top, len, buffer, parm)
+PE     *pe;
+int    top,
+       len;
+char   *buffer;
+struct type_DAS_SAlgorithmIdentifier *parm;
+{
+  return (enc_f(_ZSAlgorithmIdentifierDAS, &_ZDAS_mod, pe, top, len, buffer,
+               (char *) parm));
+}
+
+#undef decode_DAS_SAlgorithmIdentifier
+int    decode_DAS_SAlgorithmIdentifier(pe, top, len, buffer, parm)
+PE     pe;
+int    top,
+       *len;
+char  **buffer;
+struct type_DAS_SAlgorithmIdentifier **parm;
+{
+  return (dec_f(_ZSAlgorithmIdentifierDAS, &_ZDAS_mod, pe, top, len, buffer,
+               (char **) parm));
+}
+
+#undef print_DAS_SAlgorithmIdentifier
+/* ARGSUSED */
+int    print_DAS_SAlgorithmIdentifier(pe, top, len, buffer, parm)
+PE     pe;
+int    top,
+       *len;
+char  **buffer,
+       *parm;
+{
+  return (prnt_f(_ZSAlgorithmIdentifierDAS, &_ZDAS_mod, pe, top, len, buffer));
+}
+
+#undef encode_DAS_SBitString
+int    encode_DAS_SBitString(pe, top, len, buffer, parm)
+PE     *pe;
+int    top,
+       len;
+char   *buffer;
+struct type_DAS_SBitString *parm;
+{
+  return (enc_f(_ZSBitStringDAS, &_ZDAS_mod, pe, top, len, buffer,
+               (char *) parm));
+}
+
+#undef decode_DAS_SBitString
+int    decode_DAS_SBitString(pe, top, len, buffer, parm)
+PE     pe;
+int    top,
+       *len;
+char  **buffer;
+struct type_DAS_SBitString **parm;
+{
+  return (dec_f(_ZSBitStringDAS, &_ZDAS_mod, pe, top, len, buffer,
+               (char **) parm));
+}
+
+#undef print_DAS_SBitString
+/* ARGSUSED */
+int    print_DAS_SBitString(pe, top, len, buffer, parm)
+PE     pe;
+int    top,
+       *len;
+char  **buffer,
+       *parm;
+{
+  return (prnt_f(_ZSBitStringDAS, &_ZDAS_mod, pe, top, len, buffer));
+}
+
+#undef encode_DAS_SearchResult
+int    encode_DAS_SearchResult(pe, top, len, buffer, parm)
+PE     *pe;
+int    top,
+       len;
+char   *buffer;
+struct type_DAS_SearchResult *parm;
+{
+  return (enc_f(_ZSearchResultDAS, &_ZDAS_mod, pe, top, len, buffer,
+               (char *) parm));
+}
+
+#undef decode_DAS_SearchResult
+int    decode_DAS_SearchResult(pe, top, len, buffer, parm)
+PE     pe;
+int    top,
+       *len;
+char  **buffer;
+struct type_DAS_SearchResult **parm;
+{
+  return (dec_f(_ZSearchResultDAS, &_ZDAS_mod, pe, top, len, buffer,
+               (char **) parm));
+}
+
+#undef print_DAS_SearchResult
+/* ARGSUSED */
+int    print_DAS_SearchResult(pe, top, len, buffer, parm)
+PE     pe;
+int    top,
+       *len;
+char  **buffer,
+       *parm;
+{
+  return (prnt_f(_ZSearchResultDAS, &_ZDAS_mod, pe, top, len, buffer));
+}
+
+#undef encode_DAS_AddEntryArgumentData
+int    encode_DAS_AddEntryArgumentData(pe, top, len, buffer, parm)
+PE     *pe;
+int    top,
+       len;
+char   *buffer;
+struct type_DAS_AddEntryArgumentData *parm;
+{
+  return (enc_f(_ZAddEntryArgumentDataDAS, &_ZDAS_mod, pe, top, len, buffer,
+               (char *) parm));
+}
+
+#undef decode_DAS_AddEntryArgumentData
+int    decode_DAS_AddEntryArgumentData(pe, top, len, buffer, parm)
+PE     pe;
+int    top,
+       *len;
+char  **buffer;
+struct type_DAS_AddEntryArgumentData **parm;
+{
+  return (dec_f(_ZAddEntryArgumentDataDAS, &_ZDAS_mod, pe, top, len, buffer,
+               (char **) parm));
+}
+
+#undef print_DAS_AddEntryArgumentData
+/* ARGSUSED */
+int    print_DAS_AddEntryArgumentData(pe, top, len, buffer, parm)
+PE     pe;
+int    top,
+       *len;
+char  **buffer,
+       *parm;
+{
+  return (prnt_f(_ZAddEntryArgumentDataDAS, &_ZDAS_mod, pe, top, len, buffer));
+}
+
+#undef encode_DAS_AddEntryArgument
+int    encode_DAS_AddEntryArgument(pe, top, len, buffer, parm)
+PE     *pe;
+int    top,
+       len;
+char   *buffer;
+struct type_DAS_AddEntryArgument *parm;
+{
+  return (enc_f(_ZAddEntryArgumentDAS, &_ZDAS_mod, pe, top, len, buffer,
+               (char *) parm));
+}
+
+#undef decode_DAS_AddEntryArgument
+int    decode_DAS_AddEntryArgument(pe, top, len, buffer, parm)
+PE     pe;
+int    top,
+       *len;
+char  **buffer;
+struct type_DAS_AddEntryArgument **parm;
+{
+  return (dec_f(_ZAddEntryArgumentDAS, &_ZDAS_mod, pe, top, len, buffer,
+               (char **) parm));
+}
+
+#undef print_DAS_AddEntryArgument
+/* ARGSUSED */
+int    print_DAS_AddEntryArgument(pe, top, len, buffer, parm)
+PE     pe;
+int    top,
+       *len;
+char  **buffer,
+       *parm;
+{
+  return (prnt_f(_ZAddEntryArgumentDAS, &_ZDAS_mod, pe, top, len, buffer));
+}
+
+#undef encode_DAS_AddEntryResult
+int    encode_DAS_AddEntryResult(pe, top, len, buffer, parm)
+PE     *pe;
+int    top,
+       len;
+char   *buffer;
+struct type_DAS_AddEntryResult *parm;
+{
+  return (enc_f(_ZAddEntryResultDAS, &_ZDAS_mod, pe, top, len, buffer,
+               (char *) parm));
+}
+
+#undef decode_DAS_AddEntryResult
+int    decode_DAS_AddEntryResult(pe, top, len, buffer, parm)
+PE     pe;
+int    top,
+       *len;
+char  **buffer;
+struct type_DAS_AddEntryResult **parm;
+{
+  return (dec_f(_ZAddEntryResultDAS, &_ZDAS_mod, pe, top, len, buffer,
+               (char **) parm));
+}
+
+#undef print_DAS_AddEntryResult
+/* ARGSUSED */
+int    print_DAS_AddEntryResult(pe, top, len, buffer, parm)
+PE     pe;
+int    top,
+       *len;
+char  **buffer,
+       *parm;
+{
+  return (prnt_f(_ZAddEntryResultDAS, &_ZDAS_mod, pe, top, len, buffer));
+}
+
+#undef encode_DAS_RemoveEntryArgumentData
+int    encode_DAS_RemoveEntryArgumentData(pe, top, len, buffer, parm)
+PE     *pe;
+int    top,
+       len;
+char   *buffer;
+struct type_DAS_RemoveEntryArgumentData *parm;
+{
+  return (enc_f(_ZRemoveEntryArgumentDataDAS, &_ZDAS_mod, pe, top, len, buffer,
+               (char *) parm));
+}
+
+#undef decode_DAS_RemoveEntryArgumentData
+int    decode_DAS_RemoveEntryArgumentData(pe, top, len, buffer, parm)
+PE     pe;
+int    top,
+       *len;
+char  **buffer;
+struct type_DAS_RemoveEntryArgumentData **parm;
+{
+  return (dec_f(_ZRemoveEntryArgumentDataDAS, &_ZDAS_mod, pe, top, len, buffer,
+               (char **) parm));
+}
+
+#undef print_DAS_RemoveEntryArgumentData
+/* ARGSUSED */
+int    print_DAS_RemoveEntryArgumentData(pe, top, len, buffer, parm)
+PE     pe;
+int    top,
+       *len;
+char  **buffer,
+       *parm;
+{
+  return (prnt_f(_ZRemoveEntryArgumentDataDAS, &_ZDAS_mod, pe, top, len, buffer));
+}
+
+#undef encode_DAS_RemoveEntryArgument
+int    encode_DAS_RemoveEntryArgument(pe, top, len, buffer, parm)
+PE     *pe;
+int    top,
+       len;
+char   *buffer;
+struct type_DAS_RemoveEntryArgument *parm;
+{
+  return (enc_f(_ZRemoveEntryArgumentDAS, &_ZDAS_mod, pe, top, len, buffer,
+               (char *) parm));
+}
+
+#undef decode_DAS_RemoveEntryArgument
+int    decode_DAS_RemoveEntryArgument(pe, top, len, buffer, parm)
+PE     pe;
+int    top,
+       *len;
+char  **buffer;
+struct type_DAS_RemoveEntryArgument **parm;
+{
+  return (dec_f(_ZRemoveEntryArgumentDAS, &_ZDAS_mod, pe, top, len, buffer,
+               (char **) parm));
+}
+
+#undef print_DAS_RemoveEntryArgument
+/* ARGSUSED */
+int    print_DAS_RemoveEntryArgument(pe, top, len, buffer, parm)
+PE     pe;
+int    top,
+       *len;
+char  **buffer,
+       *parm;
+{
+  return (prnt_f(_ZRemoveEntryArgumentDAS, &_ZDAS_mod, pe, top, len, buffer));
+}
+
+#undef encode_DAS_RemoveEntryResult
+int    encode_DAS_RemoveEntryResult(pe, top, len, buffer, parm)
+PE     *pe;
+int    top,
+       len;
+char   *buffer;
+struct type_DAS_RemoveEntryResult *parm;
+{
+  return (enc_f(_ZRemoveEntryResultDAS, &_ZDAS_mod, pe, top, len, buffer,
+               (char *) parm));
+}
+
+#undef decode_DAS_RemoveEntryResult
+int    decode_DAS_RemoveEntryResult(pe, top, len, buffer, parm)
+PE     pe;
+int    top,
+       *len;
+char  **buffer;
+struct type_DAS_RemoveEntryResult **parm;
+{
+  return (dec_f(_ZRemoveEntryResultDAS, &_ZDAS_mod, pe, top, len, buffer,
+               (char **) parm));
+}
+
+#undef print_DAS_RemoveEntryResult
+/* ARGSUSED */
+int    print_DAS_RemoveEntryResult(pe, top, len, buffer, parm)
+PE     pe;
+int    top,
+       *len;
+char  **buffer,
+       *parm;
+{
+  return (prnt_f(_ZRemoveEntryResultDAS, &_ZDAS_mod, pe, top, len, buffer));
+}
+
+#undef encode_DAS_ModifyEntryArgumentData
+int    encode_DAS_ModifyEntryArgumentData(pe, top, len, buffer, parm)
+PE     *pe;
+int    top,
+       len;
+char   *buffer;
+struct type_DAS_ModifyEntryArgumentData *parm;
+{
+  return (enc_f(_ZModifyEntryArgumentDataDAS, &_ZDAS_mod, pe, top, len, buffer,
+               (char *) parm));
+}
+
+#undef decode_DAS_ModifyEntryArgumentData
+int    decode_DAS_ModifyEntryArgumentData(pe, top, len, buffer, parm)
+PE     pe;
+int    top,
+       *len;
+char  **buffer;
+struct type_DAS_ModifyEntryArgumentData **parm;
+{
+  return (dec_f(_ZModifyEntryArgumentDataDAS, &_ZDAS_mod, pe, top, len, buffer,
+               (char **) parm));
+}
+
+#undef print_DAS_ModifyEntryArgumentData
+/* ARGSUSED */
+int    print_DAS_ModifyEntryArgumentData(pe, top, len, buffer, parm)
+PE     pe;
+int    top,
+       *len;
+char  **buffer,
+       *parm;
+{
+  return (prnt_f(_ZModifyEntryArgumentDataDAS, &_ZDAS_mod, pe, top, len, buffer));
+}
+
+#undef encode_DAS_ModifyEntryArgument
+int    encode_DAS_ModifyEntryArgument(pe, top, len, buffer, parm)
+PE     *pe;
+int    top,
+       len;
+char   *buffer;
+struct type_DAS_ModifyEntryArgument *parm;
+{
+  return (enc_f(_ZModifyEntryArgumentDAS, &_ZDAS_mod, pe, top, len, buffer,
+               (char *) parm));
+}
+
+#undef decode_DAS_ModifyEntryArgument
+int    decode_DAS_ModifyEntryArgument(pe, top, len, buffer, parm)
+PE     pe;
+int    top,
+       *len;
+char  **buffer;
+struct type_DAS_ModifyEntryArgument **parm;
+{
+  return (dec_f(_ZModifyEntryArgumentDAS, &_ZDAS_mod, pe, top, len, buffer,
+               (char **) parm));
+}
+
+#undef print_DAS_ModifyEntryArgument
+/* ARGSUSED */
+int    print_DAS_ModifyEntryArgument(pe, top, len, buffer, parm)
+PE     pe;
+int    top,
+       *len;
+char  **buffer,
+       *parm;
+{
+  return (prnt_f(_ZModifyEntryArgumentDAS, &_ZDAS_mod, pe, top, len, buffer));
+}
+
+#undef encode_DAS_ModifyEntryResult
+int    encode_DAS_ModifyEntryResult(pe, top, len, buffer, parm)
+PE     *pe;
+int    top,
+       len;
+char   *buffer;
+struct type_DAS_ModifyEntryResult *parm;
+{
+  return (enc_f(_ZModifyEntryResultDAS, &_ZDAS_mod, pe, top, len, buffer,
+               (char *) parm));
+}
+
+#undef decode_DAS_ModifyEntryResult
+int    decode_DAS_ModifyEntryResult(pe, top, len, buffer, parm)
+PE     pe;
+int    top,
+       *len;
+char  **buffer;
+struct type_DAS_ModifyEntryResult **parm;
+{
+  return (dec_f(_ZModifyEntryResultDAS, &_ZDAS_mod, pe, top, len, buffer,
+               (char **) parm));
+}
+
+#undef print_DAS_ModifyEntryResult
+/* ARGSUSED */
+int    print_DAS_ModifyEntryResult(pe, top, len, buffer, parm)
+PE     pe;
+int    top,
+       *len;
+char  **buffer,
+       *parm;
+{
+  return (prnt_f(_ZModifyEntryResultDAS, &_ZDAS_mod, pe, top, len, buffer));
+}
+
+#undef encode_DAS_ModifyRDNArgumentData
+int    encode_DAS_ModifyRDNArgumentData(pe, top, len, buffer, parm)
+PE     *pe;
+int    top,
+       len;
+char   *buffer;
+struct type_DAS_ModifyRDNArgumentData *parm;
+{
+  return (enc_f(_ZModifyRDNArgumentDataDAS, &_ZDAS_mod, pe, top, len, buffer,
+               (char *) parm));
+}
+
+#undef decode_DAS_ModifyRDNArgumentData
+int    decode_DAS_ModifyRDNArgumentData(pe, top, len, buffer, parm)
+PE     pe;
+int    top,
+       *len;
+char  **buffer;
+struct type_DAS_ModifyRDNArgumentData **parm;
+{
+  return (dec_f(_ZModifyRDNArgumentDataDAS, &_ZDAS_mod, pe, top, len, buffer,
+               (char **) parm));
+}
+
+#undef print_DAS_ModifyRDNArgumentData
+/* ARGSUSED */
+int    print_DAS_ModifyRDNArgumentData(pe, top, len, buffer, parm)
+PE     pe;
+int    top,
+       *len;
+char  **buffer,
+       *parm;
+{
+  return (prnt_f(_ZModifyRDNArgumentDataDAS, &_ZDAS_mod, pe, top, len, buffer));
+}
+
+#undef encode_DAS_ModifyRDNArgument
+int    encode_DAS_ModifyRDNArgument(pe, top, len, buffer, parm)
+PE     *pe;
+int    top,
+       len;
+char   *buffer;
+struct type_DAS_ModifyRDNArgument *parm;
+{
+  return (enc_f(_ZModifyRDNArgumentDAS, &_ZDAS_mod, pe, top, len, buffer,
+               (char *) parm));
+}
+
+#undef decode_DAS_ModifyRDNArgument
+int    decode_DAS_ModifyRDNArgument(pe, top, len, buffer, parm)
+PE     pe;
+int    top,
+       *len;
+char  **buffer;
+struct type_DAS_ModifyRDNArgument **parm;
+{
+  return (dec_f(_ZModifyRDNArgumentDAS, &_ZDAS_mod, pe, top, len, buffer,
+               (char **) parm));
+}
+
+#undef print_DAS_ModifyRDNArgument
+/* ARGSUSED */
+int    print_DAS_ModifyRDNArgument(pe, top, len, buffer, parm)
+PE     pe;
+int    top,
+       *len;
+char  **buffer,
+       *parm;
+{
+  return (prnt_f(_ZModifyRDNArgumentDAS, &_ZDAS_mod, pe, top, len, buffer));
+}
+
+#undef encode_DAS_ModifyRDNResult
+int    encode_DAS_ModifyRDNResult(pe, top, len, buffer, parm)
+PE     *pe;
+int    top,
+       len;
+char   *buffer;
+struct type_DAS_ModifyRDNResult *parm;
+{
+  return (enc_f(_ZModifyRDNResultDAS, &_ZDAS_mod, pe, top, len, buffer,
+               (char *) parm));
+}
+
+#undef decode_DAS_ModifyRDNResult
+int    decode_DAS_ModifyRDNResult(pe, top, len, buffer, parm)
+PE     pe;
+int    top,
+       *len;
+char  **buffer;
+struct type_DAS_ModifyRDNResult **parm;
+{
+  return (dec_f(_ZModifyRDNResultDAS, &_ZDAS_mod, pe, top, len, buffer,
+               (char **) parm));
+}
+
+#undef print_DAS_ModifyRDNResult
+/* ARGSUSED */
+int    print_DAS_ModifyRDNResult(pe, top, len, buffer, parm)
+PE     pe;
+int    top,
+       *len;
+char  **buffer,
+       *parm;
+{
+  return (prnt_f(_ZModifyRDNResultDAS, &_ZDAS_mod, pe, top, len, buffer));
+}
+
+#undef encode_DAS_DirectoryBindError
+int    encode_DAS_DirectoryBindError(pe, top, len, buffer, parm)
+PE     *pe;
+int    top,
+       len;
+char   *buffer;
+struct type_DAS_DirectoryBindError *parm;
+{
+  return (enc_f(_ZDirectoryBindErrorDAS, &_ZDAS_mod, pe, top, len, buffer,
+               (char *) parm));
+}
+
+#undef decode_DAS_DirectoryBindError
+int    decode_DAS_DirectoryBindError(pe, top, len, buffer, parm)
+PE     pe;
+int    top,
+       *len;
+char  **buffer;
+struct type_DAS_DirectoryBindError **parm;
+{
+  return (dec_f(_ZDirectoryBindErrorDAS, &_ZDAS_mod, pe, top, len, buffer,
+               (char **) parm));
+}
+
+#undef print_DAS_DirectoryBindError
+/* ARGSUSED */
+int    print_DAS_DirectoryBindError(pe, top, len, buffer, parm)
+PE     pe;
+int    top,
+       *len;
+char  **buffer,
+       *parm;
+{
+  return (prnt_f(_ZDirectoryBindErrorDAS, &_ZDAS_mod, pe, top, len, buffer));
+}
+
+#undef encode_DAS_AbandonFailedParm
+int    encode_DAS_AbandonFailedParm(pe, top, len, buffer, parm)
+PE     *pe;
+int    top,
+       len;
+char   *buffer;
+struct type_DAS_AbandonFailedParm *parm;
+{
+  return (enc_f(_ZAbandonFailedParmDAS, &_ZDAS_mod, pe, top, len, buffer,
+               (char *) parm));
+}
+
+#undef decode_DAS_AbandonFailedParm
+int    decode_DAS_AbandonFailedParm(pe, top, len, buffer, parm)
+PE     pe;
+int    top,
+       *len;
+char  **buffer;
+struct type_DAS_AbandonFailedParm **parm;
+{
+  return (dec_f(_ZAbandonFailedParmDAS, &_ZDAS_mod, pe, top, len, buffer,
+               (char **) parm));
+}
+
+#undef print_DAS_AbandonFailedParm
+/* ARGSUSED */
+int    print_DAS_AbandonFailedParm(pe, top, len, buffer, parm)
+PE     pe;
+int    top,
+       *len;
+char  **buffer,
+       *parm;
+{
+  return (prnt_f(_ZAbandonFailedParmDAS, &_ZDAS_mod, pe, top, len, buffer));
+}
+
+#undef encode_DAS_AttributeErrorParm
+int    encode_DAS_AttributeErrorParm(pe, top, len, buffer, parm)
+PE     *pe;
+int    top,
+       len;
+char   *buffer;
+struct type_DAS_AttributeErrorParm *parm;
+{
+  return (enc_f(_ZAttributeErrorParmDAS, &_ZDAS_mod, pe, top, len, buffer,
+               (char *) parm));
+}
+
+#undef decode_DAS_AttributeErrorParm
+int    decode_DAS_AttributeErrorParm(pe, top, len, buffer, parm)
+PE     pe;
+int    top,
+       *len;
+char  **buffer;
+struct type_DAS_AttributeErrorParm **parm;
+{
+  return (dec_f(_ZAttributeErrorParmDAS, &_ZDAS_mod, pe, top, len, buffer,
+               (char **) parm));
+}
+
+#undef print_DAS_AttributeErrorParm
+/* ARGSUSED */
+int    print_DAS_AttributeErrorParm(pe, top, len, buffer, parm)
+PE     pe;
+int    top,
+       *len;
+char  **buffer,
+       *parm;
+{
+  return (prnt_f(_ZAttributeErrorParmDAS, &_ZDAS_mod, pe, top, len, buffer));
+}
+
+#undef encode_DAS_NameErrorParm
+int    encode_DAS_NameErrorParm(pe, top, len, buffer, parm)
+PE     *pe;
+int    top,
+       len;
+char   *buffer;
+struct type_DAS_NameErrorParm *parm;
+{
+  return (enc_f(_ZNameErrorParmDAS, &_ZDAS_mod, pe, top, len, buffer,
+               (char *) parm));
+}
+
+#undef decode_DAS_NameErrorParm
+int    decode_DAS_NameErrorParm(pe, top, len, buffer, parm)
+PE     pe;
+int    top,
+       *len;
+char  **buffer;
+struct type_DAS_NameErrorParm **parm;
+{
+  return (dec_f(_ZNameErrorParmDAS, &_ZDAS_mod, pe, top, len, buffer,
+               (char **) parm));
+}
+
+#undef print_DAS_NameErrorParm
+/* ARGSUSED */
+int    print_DAS_NameErrorParm(pe, top, len, buffer, parm)
+PE     pe;
+int    top,
+       *len;
+char  **buffer,
+       *parm;
+{
+  return (prnt_f(_ZNameErrorParmDAS, &_ZDAS_mod, pe, top, len, buffer));
+}
+
+#undef encode_DAS_ReferralParm
+int    encode_DAS_ReferralParm(pe, top, len, buffer, parm)
+PE     *pe;
+int    top,
+       len;
+char   *buffer;
+struct type_DAS_ReferralParm *parm;
+{
+  return (enc_f(_ZReferralParmDAS, &_ZDAS_mod, pe, top, len, buffer,
+               (char *) parm));
+}
+
+#undef decode_DAS_ReferralParm
+int    decode_DAS_ReferralParm(pe, top, len, buffer, parm)
+PE     pe;
+int    top,
+       *len;
+char  **buffer;
+struct type_DAS_ReferralParm **parm;
+{
+  return (dec_f(_ZReferralParmDAS, &_ZDAS_mod, pe, top, len, buffer,
+               (char **) parm));
+}
+
+#undef print_DAS_ReferralParm
+/* ARGSUSED */
+int    print_DAS_ReferralParm(pe, top, len, buffer, parm)
+PE     pe;
+int    top,
+       *len;
+char  **buffer,
+       *parm;
+{
+  return (prnt_f(_ZReferralParmDAS, &_ZDAS_mod, pe, top, len, buffer));
+}
+
+#undef encode_DAS_SecurityErrorParm
+int    encode_DAS_SecurityErrorParm(pe, top, len, buffer, parm)
+PE     *pe;
+int    top,
+       len;
+char   *buffer;
+struct type_DAS_SecurityErrorParm *parm;
+{
+  return (enc_f(_ZSecurityErrorParmDAS, &_ZDAS_mod, pe, top, len, buffer,
+               (char *) parm));
+}
+
+#undef decode_DAS_SecurityErrorParm
+int    decode_DAS_SecurityErrorParm(pe, top, len, buffer, parm)
+PE     pe;
+int    top,
+       *len;
+char  **buffer;
+struct type_DAS_SecurityErrorParm **parm;
+{
+  return (dec_f(_ZSecurityErrorParmDAS, &_ZDAS_mod, pe, top, len, buffer,
+               (char **) parm));
+}
+
+#undef print_DAS_SecurityErrorParm
+/* ARGSUSED */
+int    print_DAS_SecurityErrorParm(pe, top, len, buffer, parm)
+PE     pe;
+int    top,
+       *len;
+char  **buffer,
+       *parm;
+{
+  return (prnt_f(_ZSecurityErrorParmDAS, &_ZDAS_mod, pe, top, len, buffer));
+}
+
+#undef encode_DAS_ServiceErrorParm
+int    encode_DAS_ServiceErrorParm(pe, top, len, buffer, parm)
+PE     *pe;
+int    top,
+       len;
+char   *buffer;
+struct type_DAS_ServiceErrorParm *parm;
+{
+  return (enc_f(_ZServiceErrorParmDAS, &_ZDAS_mod, pe, top, len, buffer,
+               (char *) parm));
+}
+
+#undef decode_DAS_ServiceErrorParm
+int    decode_DAS_ServiceErrorParm(pe, top, len, buffer, parm)
+PE     pe;
+int    top,
+       *len;
+char  **buffer;
+struct type_DAS_ServiceErrorParm **parm;
+{
+  return (dec_f(_ZServiceErrorParmDAS, &_ZDAS_mod, pe, top, len, buffer,
+               (char **) parm));
+}
+
+#undef print_DAS_ServiceErrorParm
+/* ARGSUSED */
+int    print_DAS_ServiceErrorParm(pe, top, len, buffer, parm)
+PE     pe;
+int    top,
+       *len;
+char  **buffer,
+       *parm;
+{
+  return (prnt_f(_ZServiceErrorParmDAS, &_ZDAS_mod, pe, top, len, buffer));
+}
+
+#undef encode_DAS_UpdateErrorParm
+int    encode_DAS_UpdateErrorParm(pe, top, len, buffer, parm)
+PE     *pe;
+int    top,
+       len;
+char   *buffer;
+struct type_DAS_UpdateErrorParm *parm;
+{
+  return (enc_f(_ZUpdateErrorParmDAS, &_ZDAS_mod, pe, top, len, buffer,
+               (char *) parm));
+}
+
+#undef decode_DAS_UpdateErrorParm
+int    decode_DAS_UpdateErrorParm(pe, top, len, buffer, parm)
+PE     pe;
+int    top,
+       *len;
+char  **buffer;
+struct type_DAS_UpdateErrorParm **parm;
+{
+  return (dec_f(_ZUpdateErrorParmDAS, &_ZDAS_mod, pe, top, len, buffer,
+               (char **) parm));
+}
+
+#undef print_DAS_UpdateErrorParm
+/* ARGSUSED */
+int    print_DAS_UpdateErrorParm(pe, top, len, buffer, parm)
+PE     pe;
+int    top,
+       *len;
+char  **buffer,
+       *parm;
+{
+  return (prnt_f(_ZUpdateErrorParmDAS, &_ZDAS_mod, pe, top, len, buffer));
+}
+
+#undef encode_NRS_Context
+int    encode_NRS_Context(pe, top, len, buffer, parm)
+PE     *pe;
+int    top,
+       len;
+char   *buffer;
+struct type_NRS_Context *parm;
+{
+  return (enc_f(_ZContextNRS, &_ZNRS_mod, pe, top, len, buffer,
+               (char *) parm));
+}
+
+#undef decode_NRS_Context
+int    decode_NRS_Context(pe, top, len, buffer, parm)
+PE     pe;
+int    top,
+       *len;
+char  **buffer;
+struct type_NRS_Context **parm;
+{
+  return (dec_f(_ZContextNRS, &_ZNRS_mod, pe, top, len, buffer,
+               (char **) parm));
+}
+
+#undef print_NRS_Context
+/* ARGSUSED */
+int    print_NRS_Context(pe, top, len, buffer, parm)
+PE     pe;
+int    top,
+       *len;
+char  **buffer,
+       *parm;
+{
+  return (prnt_f(_ZContextNRS, &_ZNRS_mod, pe, top, len, buffer));
+}
+
+#undef encode_NRS_Address__space__id
+int    encode_NRS_Address__space__id(pe, top, len, buffer, parm)
+PE     *pe;
+int    top,
+       len;
+char   *buffer;
+struct type_NRS_Address__space__id *parm;
+{
+  return (enc_f(_ZAddress_space_idNRS, &_ZNRS_mod, pe, top, len, buffer,
+               (char *) parm));
+}
+
+#undef decode_NRS_Address__space__id
+int    decode_NRS_Address__space__id(pe, top, len, buffer, parm)
+PE     pe;
+int    top,
+       *len;
+char  **buffer;
+struct type_NRS_Address__space__id **parm;
+{
+  return (dec_f(_ZAddress_space_idNRS, &_ZNRS_mod, pe, top, len, buffer,
+               (char **) parm));
+}
+
+#undef print_NRS_Address__space__id
+/* ARGSUSED */
+int    print_NRS_Address__space__id(pe, top, len, buffer, parm)
+PE     pe;
+int    top,
+       *len;
+char  **buffer,
+       *parm;
+{
+  return (prnt_f(_ZAddress_space_idNRS, &_ZNRS_mod, pe, top, len, buffer));
+}
+
+#undef encode_NRS_Route__cost
+int    encode_NRS_Route__cost(pe, top, len, buffer, parm)
+PE     *pe;
+int    top,
+       len;
+char   *buffer;
+struct type_NRS_Route__cost *parm;
+{
+  return (enc_f(_ZRoute_costNRS, &_ZNRS_mod, pe, top, len, buffer,
+               (char *) parm));
+}
+
+#undef decode_NRS_Route__cost
+int    decode_NRS_Route__cost(pe, top, len, buffer, parm)
+PE     pe;
+int    top,
+       *len;
+char  **buffer;
+struct type_NRS_Route__cost **parm;
+{
+  return (dec_f(_ZRoute_costNRS, &_ZNRS_mod, pe, top, len, buffer,
+               (char **) parm));
+}
+
+#undef print_NRS_Route__cost
+/* ARGSUSED */
+int    print_NRS_Route__cost(pe, top, len, buffer, parm)
+PE     pe;
+int    top,
+       *len;
+char  **buffer,
+       *parm;
+{
+  return (prnt_f(_ZRoute_costNRS, &_ZNRS_mod, pe, top, len, buffer));
+}
+
+#undef encode_NRS_Addressing__info
+int    encode_NRS_Addressing__info(pe, top, len, buffer, parm)
+PE     *pe;
+int    top,
+       len;
+char   *buffer;
+struct type_NRS_Addressing__info *parm;
+{
+  return (enc_f(_ZAddressing_infoNRS, &_ZNRS_mod, pe, top, len, buffer,
+               (char *) parm));
+}
+
+#undef decode_NRS_Addressing__info
+int    decode_NRS_Addressing__info(pe, top, len, buffer, parm)
+PE     pe;
+int    top,
+       *len;
+char  **buffer;
+struct type_NRS_Addressing__info **parm;
+{
+  return (dec_f(_ZAddressing_infoNRS, &_ZNRS_mod, pe, top, len, buffer,
+               (char **) parm));
+}
+
+#undef print_NRS_Addressing__info
+/* ARGSUSED */
+int    print_NRS_Addressing__info(pe, top, len, buffer, parm)
+PE     pe;
+int    top,
+       *len;
+char  **buffer,
+       *parm;
+{
+  return (prnt_f(_ZAddressing_infoNRS, &_ZNRS_mod, pe, top, len, buffer));
+}
+
+#undef encode_NRS_NRSInformation
+int    encode_NRS_NRSInformation(pe, top, len, buffer, parm)
+PE     *pe;
+int    top,
+       len;
+char   *buffer;
+struct type_NRS_NRSInformation *parm;
+{
+  return (enc_f(_ZNRSInformationNRS, &_ZNRS_mod, pe, top, len, buffer,
+               (char *) parm));
+}
+
+#undef decode_NRS_NRSInformation
+int    decode_NRS_NRSInformation(pe, top, len, buffer, parm)
+PE     pe;
+int    top,
+       *len;
+char  **buffer;
+struct type_NRS_NRSInformation **parm;
+{
+  return (dec_f(_ZNRSInformationNRS, &_ZNRS_mod, pe, top, len, buffer,
+               (char **) parm));
+}
+
+#undef print_NRS_NRSInformation
+/* ARGSUSED */
+int    print_NRS_NRSInformation(pe, top, len, buffer, parm)
+PE     pe;
+int    top,
+       *len;
+char  **buffer,
+       *parm;
+{
+  return (prnt_f(_ZNRSInformationNRS, &_ZNRS_mod, pe, top, len, buffer));
+}
+
+
+
+
diff --git a/usr/src/contrib/isode/dsap/x500as/make b/usr/src/contrib/isode/dsap/x500as/make
new file mode 100644 (file)
index 0000000..e3ccee0
--- /dev/null
@@ -0,0 +1,7 @@
+: run this script through /bin/sh
+M=/bin/make
+if [ -f /usr/bin/make ]; then
+    M=/usr/bin/make
+fi
+
+exec $M TOPDIR=../../ -f ../../config/CONFIG.make -f Makefile ${1+"$@"}
diff --git a/usr/src/contrib/isode/dsap/x500as/nrs-cdefs.h b/usr/src/contrib/isode/dsap/x500as/nrs-cdefs.h
new file mode 100644 (file)
index 0000000..5533b34
--- /dev/null
@@ -0,0 +1,11 @@
+#ifdef PEPYPATH
+
+#include "quipu/util.h"
+#include "quipu/nrs_info.h"
+
+#else
+
+#include <isode/quipu/util.h>
+#include <isode/quipu/nrs_info.h>
+
+#endif
diff --git a/usr/src/contrib/isode/dsap/x500as/nrs.py b/usr/src/contrib/isode/dsap/x500as/nrs.py
new file mode 100644 (file)
index 0000000..e564acd
--- /dev/null
@@ -0,0 +1,259 @@
+-- nrs.py
+
+--
+--                               NOTICE
+--
+--    Acquisition, use, and distribution of this module and related
+--    materials are subject to the restrictions of a license agreement.
+--    Consult the Preface in the User's Manual for the full terms of
+--    this agreement.
+--
+--
+
+
+NRS
+       {
+       ccitt
+       data(9)
+       pss(2342)
+       ucl(19200300)
+       quipu(99)
+       nRSDefinitions(2)
+       }
+
+DEFINITIONS
+::=
+
+PREFIXES encode decode print
+
+BEGIN
+
+Context [[P struct nrs_info *]]
+::=
+        INTEGER [[i context]]
+        {
+            context-unknown(-1) ,
+            x29(0) ,
+            ts29(1) ,
+            niftp(2) ,
+            mail-niftp(3) ,
+            not-used(4) ,
+            mail-telex(5) ,
+            jtmp(6) ,
+            jtmp-files(7) ,
+            jtmp-reg(8) ,
+            ybts-node(9) ,
+            ybts(10) ,
+            ftam(11) ,
+            jtm(12) ,
+            jtm-reg(13) ,
+            vt(14) ,
+            motis(15)
+        }
+
+Address-space-id
+[[P struct nrs_info *]]
+
+::=
+        INTEGER [[i addr_sp_id]]
+        {
+            pss(0) ,
+            janet(1) ,
+            telex(2) ,
+            osi-cons(3)
+        }
+
+Route-cost [[P PElement *]]
+::=
+        ANY [[a *]]
+
+Addressing-info [[P struct addr_info *]]
+::=
+        CHOICE
+            <<addr_info_type>>
+        {
+        dte-only
+               [0] NumericString [[s dte_number]] ,
+
+        dte-appli-info
+               [1] SEQUENCE [[T struct addr_info * $ *]]
+                {
+                dte-number
+                       [0] NumericString [[s dte_number]] ,
+
+                applic-info
+                       [1] SEQUENCE OF [[T struct str_seq * $ applic_info ]] <<ss_next>>
+                               VisibleString [[s ss_str]]
+                } ,
+
+        dte-cudf
+               [2] SEQUENCE [[T struct addr_info * $ *]]
+                {
+                dte-number
+                       [0] NumericString [[s dte_number]] ,
+                cudf
+                       [1] OCTET STRING [[s cudf]]
+                } ,
+
+        dte-cudf-applic-info
+               [3] SEQUENCE [[T struct addr_info * $ *]]
+                {
+                dte-number
+                       [0] NumericString [[s dte_number]] ,
+
+                cudf
+                       [1] OCTET STRING [[s cudf]] ,
+
+                applic-info
+                       [2] SEQUENCE OF [[T struct str_seq * $ applic_info ]] <<ss_next>>
+                               VisibleString [[s ss_str]]
+                } ,
+
+        dte-ybts
+               [4] SEQUENCE [[T struct addr_info * $ *]]
+                {
+                dte-number
+                       [0] NumericString [[s dte_number]] ,
+
+                ybts-string
+                       [1] VisibleString [[s ybts_string]]
+                } ,
+
+        dte-ybts-applic-info
+               [5] SEQUENCE [[T struct addr_info * $ *]]
+                {
+                dte-number
+                       [0] NumericString [[s dte_number]] ,
+
+                ybts-string
+                       [1] VisibleString [[s ybts_string]] ,
+
+                applic-info
+                       [2] SEQUENCE OF [[T struct str_seq * $ applic_info ]] <<ss_next>>
+                               VisibleString [[s ss_str]]
+                } ,
+
+        dte-ybts-appli-relays 
+               [6] SEQUENCE [[T struct addr_info * $ *]]
+                {
+                dte-number
+                       [0] NumericString [[s dte_number]] ,
+
+                ybts-string
+                       [1] VisibleString [[s ybts_string]] ,
+
+                applic-relay
+                       [2] SEQUENCE OF [[T struct str_seq * $ applic_info ]] <<ss_next>>
+                               VisibleString [[s ss_str]]
+                } ,
+
+        none-needed
+               [7] NULL ,
+
+        osi-addressing
+               [8] SEQUENCE [[T struct addr_info * $ *]]
+                {
+                nsap
+                       [0] NumericString [[s nsap]] ,
+
+                tselector
+                       [1] OCTET STRING [[s tselector]]
+                            OPTIONAL,
+
+                sselector
+                       [2] OCTET STRING [[s sselector]]
+                            OPTIONAL,
+
+                pselector
+                       [3] OCTET STRING [[s pselector]]
+                            OPTIONAL,
+
+                place-holder
+                       [4] ANY [[a place_holder]]
+                            OPTIONAL,
+
+                application-title
+                       [5] ANY [[a application_title]]
+                            OPTIONAL,
+
+                per-application-context-info
+                       [6] ANY [[a per_app_context_info]]
+                            OPTIONAL
+                } ,
+
+        osi-nsap-only
+               [9] NumericString [[s nsap]] ,
+
+        osi-nsap-applic-info
+               [10] SEQUENCE [[T struct addr_info * $ *]]
+                {
+                nsap
+                       [0] NumericString [[s nsap]] ,
+
+                applic-info
+                       [1] SEQUENCE OF [[T struct str_seq * $ applic_info ]] <<ss_next>>
+                               VisibleString [[s ss_str]]
+                } ,
+
+        osi-nsap-applic-relays
+               [11] SEQUENCE [[T struct addr_info * $ *]]
+                {
+                nsap
+                       [0] NumericString [[s nsap]] ,
+
+                applic-relay
+                       [1] SEQUENCE OF [[T struct str_seq * $ applic_info ]] <<ss_next>>
+                                VisibleString [[s ss_str]]
+                } ,
+
+       dte-ybts-osi-addressing
+               [12] SEQUENCE [[T struct addr_info * $ *]]
+               {
+                dte-number
+                       [0] NumericString [[s dte_number]] ,
+
+                ybts-string
+                       [1] VisibleString [[s ybts_string]] ,
+
+                tselector
+                       [2] OCTET STRING [[s tselector]]
+                            OPTIONAL,
+
+                sselector
+                       [3] OCTET STRING [[s sselector]]
+                            OPTIONAL,
+
+                pselector
+                       [4] OCTET STRING [[s pselector]]
+                            OPTIONAL,
+
+                place-holder
+                       [5] ANY [[a place_holder]]
+                            OPTIONAL,
+
+                application-title
+                       [6] ANY [[a application_title]]
+                            OPTIONAL,
+
+                per-application-context-info
+                       [7] ANY [[a per_app_context_info]]
+                            OPTIONAL
+               }
+        }
+
+NRSInformation [[P struct nrs_info *]]
+::=
+       SET
+       {
+               [0] Context [[p *]] ,
+               [1] Address-space-id [[p *]] ,
+       routes
+               [2] SEQUENCE OF [[T struct nrs_routes * $ routes]] <<next>>
+                       SEQUENCE [[T struct nrs_routes * $ *]]
+                       {
+                               Route-cost [[p cost]] ,
+                               Addressing-info [[p addr_info]]
+                       }
+       }
+
+END
diff --git a/usr/src/contrib/isode/dsap/x500as/qu-cdefs.h b/usr/src/contrib/isode/dsap/x500as/qu-cdefs.h
new file mode 100644 (file)
index 0000000..9569412
--- /dev/null
@@ -0,0 +1,13 @@
+#ifdef PEPYPATH
+
+#include "quipu/util.h"
+#include "quipu/entry.h"
+#include "quipu/authen.h"
+
+#else
+
+#include <isode/quipu/util.h>
+#include <isode/quipu/entry.h>
+#include <isode/quipu/authen.h>
+
+#endif
diff --git a/usr/src/contrib/isode/dsap/x500as/sa.py b/usr/src/contrib/isode/dsap/x500as/sa.py
new file mode 100644 (file)
index 0000000..f4d88e3
--- /dev/null
@@ -0,0 +1,194 @@
+-- sa.py
+
+-- $Header: /f/osi/dsap/x500as/RCS/sa.py,v 7.1 91/02/22 09:22:19 mrose Interim $
+--
+--
+-- $Log:       sa.py,v $
+-- Revision 7.1  91/02/22  09:22:19  mrose
+-- Interim 6.8
+-- 
+-- Revision 7.0  90/12/06  07:35:00  mrose
+-- *** empty log message ***
+-- 
+-- Revision 7.1  90/10/17  11:44:35  mrose
+-- sync
+-- 
+-- Revision 7.0  89/11/23  21:50:51  mrose
+-- Release 6.0
+-- 
+
+--
+--                               NOTICE
+--
+--    Acquisition, use, and distribution of this module and related
+--    materials are subject to the restrictions of a license agreement.
+--    Consult the Preface in the User's Manual for the full terms of
+--    this agreement.
+--
+--
+
+
+SA
+       {
+       joint-iso-ccitt
+       ds(5)
+       modules(1)
+       selectedAttributeTypes(5)
+       }
+
+DEFINITIONS ::=
+
+PREFIXES encode decode print
+
+BEGIN
+
+IMPORTS
+       AttributeType
+               FROM IF
+                       {
+                       joint-iso-ccitt
+                       ds(5)
+                       modules(1)
+                       informationFramework(1)
+                       };
+
+FacsimileTelephoneNumber [[P struct fax *]]
+        ::=
+        SEQUENCE
+        {
+       telephoneNumber
+               PrintableString [[s number]],
+       parameters
+               BIT STRING [[x fax_bits $ fax_len ]] 
+                OPTIONAL
+
+        }
+
+PostalAddress [[P struct postaddr *]]
+       ::=
+       SEQUENCE OF [[T struct postaddr * $ *]] <<pa_next>>
+       CHOICE [[T struct postaddr * $ *]] << addrtype >>
+               {
+               T61String [[s addrcomp]],
+               PrintableString [[s addrcomp]]
+               }
+
+TelexNumber [[P struct telex *]]
+       ::=
+       SEQUENCE
+       {
+               telexNumber     PrintableString [[s telexnumber]],
+               countryCode     PrintableString [[s countrycode]],
+               answerback      PrintableString [[s answerback]]
+       }
+
+TeletexTerminalIdentifier [[P struct teletex *]]
+       ::=
+       SEQUENCE
+       {
+       teletexTerminal
+               PrintableString [[s terminal]],
+       parameters SET [[T struct teletex * $ *]] {
+               graphic-character-sets [0] TeletexString
+                       [[s parm->graphic]] OPTIONAL,
+               control-character-sets [1] TeletexString
+                       [[s parm->control]] OPTIONAL,
+               page-formats [2] OCTET STRING 
+                       [[s parm->page]] OPTIONAL,
+               miscellaneous-terminal-capabilities [3] TeletexString
+                       [[s parm->misc]] OPTIONAL,
+               private-use [4] OCTET STRING 
+                       [[s parm->t_private]] OPTIONAL
+               } OPTIONAL <E<
+                   ((parm->graphic != NULLCP) || 
+                    (parm->control != NULLCP) ||
+                    (parm->page != NULLCP) || 
+                    (parm->misc != NULLCP) ||
+                    (parm->t_private != NULLCP)) 
+                    >>
+                    <D<0>>
+       }
+
+PreferredDeliveryMethod [[P struct pref_deliv *]]
+       ::=
+       SEQUENCE OF [[T struct pref_deliv * $ * ]] <<pd_next>>
+       INTEGER [[i deliv ]]
+       {
+       any-delivery-method     (0),
+       mhs-delivery            (1),
+       physical-delivery       (2),
+       telex-delivery          (3),
+       teletex-delivery        (4),
+       g3-facsimilie-delivery  (5),
+       g4-facsimilie-delivery  (6),
+       ia5-terminal-delivery   (7),
+       videotex-delivery       (8),
+       telephone-delivery      (9)
+       }
+
+CriteriaItem [[P struct CriteriaItem *]]
+    ::=
+         CHOICE <<offset>> {
+                    equality[0]
+                        AttributeType
+                        [[p attrib ]],
+
+                    substrings[1]
+                        AttributeType
+                        [[p attrib ]],
+
+                    greaterOrEqual[2]
+                        AttributeType
+                        [[p attrib ]],
+
+                    lessOrEqual[3]
+                        AttributeType
+                        [[p attrib ]],
+
+                    approximateMatch[4]
+                        AttributeType
+                        [[p attrib ]]
+                
+        }
+
+
+Criteria [[P struct Criteria *]]
+    ::=
+        CHOICE <<offset>>
+        {
+            type[0]
+                CriteriaItem [[p un.type ]],
+
+            and[1]
+                SET OF [[T struct and_or_set * $ un.and_or ]] << and_or_next >>
+                    Criteria [[p and_or_comp]],
+
+            or[2]
+                SET OF [[T struct and_or_set * $ un.and_or ]] << and_or_next >>
+                    Criteria [[p and_or_comp]],
+
+            not[3]
+                Criteria [[p parm -> un.not ]]
+        }
+
+
+
+Guide [[ P struct Guide *]]
+    ::=
+    SET {
+        objectClass [0]
+                OBJECT IDENTIFIER [[O objectClass ]] OPTIONAL,
+       criteria [1]
+               Criteria [[p criteria]]
+    }
+
+CaseIgnoreList [[P struct CIList *]]
+       ::=
+       SEQUENCE OF [[T struct CIList * $ *]] << l_next>>
+       CHOICE [[T struct CIList * $ *]] << l_type >>
+               {
+               T61String [[s l_str]],
+               PrintableString [[s l_str]]
+               }
+
+END
diff --git a/usr/src/contrib/isode/dsap/x500as/th.py b/usr/src/contrib/isode/dsap/x500as/th.py
new file mode 100644 (file)
index 0000000..c23413b
--- /dev/null
@@ -0,0 +1,73 @@
+-- th-enc.py - Thorn and RARE defined attribute sytaxes
+
+-- $Header: /f/osi/dsap/x500as/RCS/th.py,v 7.1 91/02/22 09:22:20 mrose Interim $
+--
+--
+-- $Log:       th.py,v $
+-- Revision 7.1  91/02/22  09:22:20  mrose
+-- Interim 6.8
+-- 
+-- Revision 7.0  90/12/06  07:35:05  mrose
+-- *** empty log message ***
+-- 
+-- Revision 7.0  89/11/23  21:50:54  mrose
+-- Release 6.0
+-- 
+
+--
+--                               NOTICE
+--
+--    Acquisition, use, and distribution of this module and related
+--    materials are subject to the restrictions of a license agreement.
+--    Consult the Preface in the User's Manual for the full terms of
+--    this agreement.
+--
+--
+
+
+Thorn
+       {
+       ccitt
+       data(9)
+       pss(2342)
+       ucl(19200300)
+       thorn(100)
+       directoryDefinitions(1)
+       }
+
+DEFINITIONS ::=
+
+PREFIXES encode decode print
+
+BEGIN
+
+
+MailBox [[P struct mailbox *]]
+        ::=
+        SEQUENCE
+        {
+       mailboxType
+               PrintableString [[ s mtype ]],
+       mailbox
+               IA5String       [[ s mbox ]]
+        }
+
+DocumentStoreSyntax [[P struct documentStore *]]
+       ::=
+       SEQUENCE {
+           method
+               INTEGER         [[ i ds_method ]]
+               { ftp(0), ftam(1) },
+
+           textEncodedHostName
+               IA5String       [[ s ds_host ]],
+
+           directoryName[0]
+               IA5String       [[ s ds_dir ]]
+               OPTIONAL,
+
+           fileFsName
+               IA5String       [[ s ds_file ]]
+       }
+
+END
diff --git a/usr/src/contrib/isode/ftam-ftp/Makefile b/usr/src/contrib/isode/ftam-ftp/Makefile
new file mode 100644 (file)
index 0000000..b4aaedc
--- /dev/null
@@ -0,0 +1,153 @@
+###############################################################################
+#   Instructions to Make, for compilation of MITRE FTAM/FTP gateway
+###############################################################################
+
+###############################################################################
+#
+# $Header: /f/osi/ftam-ftp/RCS/Makefile,v 7.4 91/02/22 09:23:24 mrose Interim $
+#
+#
+# $Log:        Makefile,v $
+# Revision 7.4  91/02/22  09:23:24  mrose
+# Interim 6.8
+# 
+# Revision 7.3  90/12/23  18:39:49  mrose
+# update
+# 
+# Revision 7.2  90/07/01  21:03:03  mrose
+# pepsy
+# 
+# Revision 7.1  90/03/15  11:17:50  mrose
+# quipu-sync
+# 
+# Revision 7.0  89/11/23  21:55:02  mrose
+# Release 6.0
+# 
+###############################################################################
+
+###############################################################################
+#
+#                               NOTICE
+#
+#    Acquisition, use, and distribution of this module and related
+#    materials are subject to the restrictions of a license agreement.
+#    Consult the Preface in the User's Manual for the full terms of
+#    this agreement.
+#
+###############################################################################
+
+
+###############################################################################
+# Generation Rules for program modules
+###############################################################################
+
+PEPYPATH=      -DPEPYPATH
+
+.SUFFIXES:     .py .c .o
+
+.c.o:;         $(CC) $(CFLAGS) -DBRIDGE -I$(FTAM) -c $*.c
+
+
+###############################################################################
+# Programs and Libraries
+###############################################################################
+
+LIBES  =       $(TOPDIR)libftam.a $(TOPDIR)libisode.a
+LLIBS  =       $(TOPDIR)llib-lftam $(TOPDIR)llib-lisode
+
+
+###############################################################################
+# Files
+###############################################################################
+
+FTAM   =       $(TOPDIR)ftam2/
+HFILES =       $(FTAM)ftamsystem.h $(FTAM)ftamsbr.h $(FTAM)DOCS-types.h
+CFILES =       $(FTAM)ftamd.c $(FTAM)ftamsystem.c $(FTAM)ftamd-manage.c \
+                       $(FTAM)ftamd-select.c $(FTAM)ftamd-trans.c \
+                       $(FTAM)ftamsbr.c 
+OFILES =       ftamd.o ftamsystem.o ftamd-manage.o ftamd-select.o \
+                       ftamd-trans.o ftamsbr.o
+DOCS-O =       $(FTAM)DOCS_tables.o
+DOCS-C =       $(FTAM)DOCS_tables.c
+
+
+##################################################################
+# Here it is...
+##################################################################
+
+all:           ftamd-ftp 
+inst-all:      inst-ftamd-ftp manuals
+install:       inst-all clean
+lint:          l-ftamd-ftp
+
+
+##################################################################
+# ftamd-ftp
+##################################################################
+
+inst-ftamd-ftp:        $(SBINDIR)iso.ftam-ftp
+
+$(SBINDIR)iso.ftam-ftp:        xftamd-ftp
+               -cp $@ zxftamd-ftp
+               -rm -f $@
+               cp xftamd-ftp $@
+               -@ls -gls $@
+               -@echo ""
+
+ftamd-ftp:     xftamd-ftp
+
+xftamd-ftp:    $(OFILES) $(DOCS-O) ftp.o ftp_lib.o $(LIBES)
+               $(LDCC) $(LDFLAGS) -o $@ $(OFILES) $(DOCS-O) ftp.o ftp_lib.o \
+                       $(LIBES) $(LSOCKET)
+
+l-ftamd-ftp:;  $(LINT) $(LFLAGS) -DBRIDGE -I$(FTAM) $(CFILES) ftp.c \
+                       $(DOCS-C) ftp_lib.c $(LLIBS) \
+                       | grep -v "warning: possible pointer alignment problem"
+
+ftamd.o:       $(HFILES) $(FTAM)ftamd.c
+               $(CC) $(CFLAGS) -DBRIDGE -I$(FTAM) -c $(FTAM)ftamd.c
+
+ftamsystem.o:  $(HFILES) $(HDIR)logger.h $(FTAM)ftamsystem.c
+               $(CC) $(CFLAGS) -DBRIDGE -I$(FTAM) -c $(FTAM)ftamsystem.c
+
+ftamd-manage.o:        $(HFILES) $(FTAM)ftamd-manage.c
+               $(CC) $(CFLAGS) -DBRIDGE -I$(FTAM) -c $(FTAM)ftamd-manage.c
+
+ftamd-select.o:        $(HFILES) $(FTAM)ftamd-select.c
+               $(CC) $(CFLAGS) -DBRIDGE -I$(FTAM) -c $(FTAM)ftamd-select.c
+
+ftamd-trans.o: $(HFILES) $(HDIR)usr.dirent.h $(HDIR)sys.dirent.h \
+                       $(FTAM)ftamd-trans.c
+               $(CC) $(CFLAGS) -DBRIDGE -I$(FTAM) -c $(FTAM)ftamd-trans.c
+
+ftamsbr.o:     $(HFILES) $(FTAM)ftamsbr.c
+               $(CC) $(CFLAGS) -DBRIDGE -I$(FTAM) -c $(FTAM)ftamsbr.c
+
+ftp.o:         ftp_var.h
+ftp_lib.o:     ftp_var.h
+
+
+##################################################################
+# manual pages
+##################################################################
+
+MANUALS        =       ftamd-ftp.8c
+
+manuals:;      @$(UTILDIR)inst-man.sh $(MANOPTS) $(MANUALS)
+               -@echo ""
+
+
+##################################################################
+# clean
+##################################################################
+
+clean:;                rm -f *.o x* z* _* core
+
+grind:;                iprint Makefile
+               tgrind -lc ftp_var.h ftp.c ftp_lib.c
+               @echo $(MANUALS) | \
+                       tr " " "\012" | \
+                       sed -e "s%.*%itroff -man &%" | \
+                       sh -ve
+
+true:;
diff --git a/usr/src/contrib/isode/ftam-ftp/ftamd-ftp.8c b/usr/src/contrib/isode/ftam-ftp/ftamd-ftp.8c
new file mode 100644 (file)
index 0000000..a770787
--- /dev/null
@@ -0,0 +1,80 @@
+.TH FTAMD-FTP 8C "16 Jun 1988"
+.\" $Header: /f/osi/ftam-ftp/RCS/ftamd-ftp.8c,v 7.1 91/02/22 09:23:26 mrose Interim $
+.\"
+.\"
+.\" $Log:      ftamd-ftp.8c,v $
+.\" Revision 7.1  91/02/22  09:23:26  mrose
+.\" Interim 6.8
+.\" 
+.\" Revision 7.0  89/11/23  21:55:04  mrose
+.\" Release 6.0
+.\" 
+.SH NAME
+ftamd-ftp \- MITRE FTAM/FTP gateway
+.SH SYNOPSIS
+.in +.5i
+.ti -.5i
+.B \*(SDiso.ftam-ftp
+\%[\-c]
+\fImagic\0arguments\fR
+.in -.5i
+(under \fI\*(SDtsapd\fR\0)
+.SH DESCRIPTION
+The \fIftamd-ftp\fR server appears to implement the responder side of
+the File Transfer, Access, and Management (FTAM) service,
+but is really an FTAM/FTP gateway.
+See \fIftamd\fR\0(8c) for details on the FTAM service.
+.PP
+When using \fIftam\fR with the MITRE FTP/FTAM gateway,
+the true destination is encoded in the user name (i.e., user@tcphost).
+.PP
+Note that the FTAM/FTP gateway is currently available on a different
+presentation address than the FTAM service on the gateway.
+To select the FTAM/FTP gateway,
+tell your \fIftam\fR initiator to associate with the service having
+\*(lqqualifier\*(rq \fBftpstore\fR on the gateway host.
+For example, using \fIftam\fR\0(1c):
+.sp
+.nf
+.in +.5i
+% ftam
+ftam> set qualifier ftpstore
+ftam> open gateway
+user (gateway:user): user@tcphost
+password (gateway:user@tcphost): 
+.in -.5i
+.fi
+.SH FILES
+.nf
+.ta \w'\*(EDisodocuments  'u
+\*(EDisodocuments      ISO documents database
+\*(EDisoentities       ISO application entity title database
+/usr/adm/wtmp  login records
+.re
+.fi
+.SH "SEE ALSO"
+ftam(1c), libftam(3n), isodocuments(5), ftamd(8c)
+.br
+\fIThe ISO Development Environment: User's Manual\fR,
+.br
+ISO 8571:
+\fIInformation Processing Systems \-\-
+File Transfer, Access, and Management\fR
+.SH AUTHORS
+Original version written by John A. Scott of the MITRE Corporation.
+Upgraded to \*(lqIS-level\*(rq by Philip B. Jelfs of the Wollongong Group.
+.SH DIAGNOSTICS
+All obvious.
+.SH BUGS
+.PP
+File information is limited to file names.  All file access rights are assumed
+until access is attempted.  The \fBftp\fP server of the destination
+grants or denies action permission at the time of file access.
+.PP
+Empty directories may not be
+recognized depending on the ftp server of the destination machine.  This
+bug manifests when trying to remove an empty directory.
+.PP
+The daemon should implement a crude form of access control for
+accounting purposes
+(FTP service might not be free in all environments).
diff --git a/usr/src/contrib/isode/ftam-ftp/ftp.c b/usr/src/contrib/isode/ftam-ftp/ftp.c
new file mode 100644 (file)
index 0000000..1189e35
--- /dev/null
@@ -0,0 +1,464 @@
+/* ftp.c - FTP client */
+
+#ifndef lint
+static char *rcsid = "$Header: /f/osi/ftam-ftp/RCS/ftp.c,v 7.1 91/02/22 09:23:27 mrose Interim $"; /* from UCB 4.11 7/26/83 */
+#endif
+
+/* 
+ * $Header: /f/osi/ftam-ftp/RCS/ftp.c,v 7.1 91/02/22 09:23:27 mrose Interim $
+ *
+ *
+ * $Log:       ftp.c,v $
+ * Revision 7.1  91/02/22  09:23:27  mrose
+ * Interim 6.8
+ * 
+ * Revision 7.0  89/11/23  21:55:04  mrose
+ * Release 6.0
+ * 
+ */
+
+/*
+ *                               NOTICE
+ *
+ *     The MITRE Corporation (hereafter MITRE) makes this software available 
+ *     on an "as is" basis.  No guarantees, either explicit or implied, are 
+ *     given as to performance or suitability.  
+ *
+ */
+
+/*
+ *     Shamelessly taken from UCB
+ */
+
+#include "config.h"
+#include <sys/param.h>
+#include <sys/ioctl.h>
+#include "internet.h"
+#include <sys/time.h>
+
+#include <arpa/ftp.h>
+
+#include <stdio.h>
+#include <errno.h>
+#include <varargs.h>
+
+#include "ftp_var.h"
+#include "general.h"
+#include "logger.h"
+void   advise ();
+
+#ifndef NOTOK
+#define NOTOK (-1)
+#define OK     0
+#define DONE   1
+#endif /* NOTOK */
+
+int    verbose = 0;
+
+struct sockaddr_in hisctladdr;
+struct sockaddr_in data_addr;
+int    data = -1;
+int    connected = 0;
+struct sockaddr_in myctladdr;
+
+FILE   *cin, *cout;
+int    dataconn();
+
+
+ftp_init()
+{ /* default ftp communication values */
+
+       (void)strcpy(typename, "ascii"), type = TYPE_A;
+        (void)strcpy(formname, "non-print"), form = FORM_N;
+        (void)strcpy(modename, "stream"), mode = MODE_S;
+        (void)strcpy(structname, "file"), stru = STRU_F;
+        (void)strcpy(bytename, "8"), bytesize = 8;
+       ftp_directory = 0;
+       ftp_error = ftp_error_buffer;
+       verbose = isatty (fileno (stderr));
+}
+
+hookup(host, port)
+       char *host;
+       int port;
+{
+       register struct hostent *hp;
+       int s, len;
+
+       bzero((char *)&hisctladdr, sizeof (hisctladdr));
+       hp = gethostbyname(host);
+       if (hp == NULL) {
+#ifdef h_addr
+               static char *addrs = NULL;
+#endif
+               static struct hostent def;
+               static struct in_addr defaddr;
+               static char namebuf[128];
+               u_long inet_addr();
+
+               defaddr.s_addr = inet_addr(host);
+               if (defaddr.s_addr == -1) {
+                       (void)sprintf(ftp_error, "%s: Unknown host.", host);
+                       return (NOTOK);
+               }
+               (void)strcpy(namebuf, host);
+               def.h_name = namebuf;
+               hostname = namebuf;
+#ifdef h_addr
+               def.h_addr_list = &addrs;
+#endif
+               def.h_addr = (char *)&defaddr;
+               def.h_length = sizeof (struct in_addr);
+               def.h_addrtype = AF_INET;
+               def.h_aliases = 0;
+               hp = &def;
+       }
+       hostname = hp->h_name;
+       hisctladdr.sin_family = hp->h_addrtype;
+       s = socket(hp->h_addrtype, SOCK_STREAM, 0);
+       if (s < 0) {
+               (void)sprintf(ftp_error,"ftp: socket %s",
+                       (errno <= sys_nerr)? sys_errlist[errno]:"");
+               return (NOTOK);
+       }
+       if (bind(s, (struct sockaddr *)&hisctladdr, sizeof (hisctladdr)) < 0) {
+               (void)sprintf(ftp_error,"ftp: bind %s",
+                       (errno <= sys_nerr)? sys_errlist[errno]:"");
+               goto bad;
+       }
+       inaddr_copy (hp, &hisctladdr);
+       hisctladdr.sin_port = htons ((u_short) port);
+       if (connect(s, (struct sockaddr *)&hisctladdr, sizeof (hisctladdr)) < 0) {
+               (void)sprintf(ftp_error,"ftp: connect %s",
+                       (errno <= sys_nerr)? sys_errlist[errno]:"");
+               goto bad;
+       }
+       len = sizeof (myctladdr);
+       if (getsockname(s, (struct sockaddr *)&myctladdr, &len) < 0) {
+               (void)sprintf(ftp_error,"ftp: getsockname %s",
+                       (errno <= sys_nerr)? sys_errlist[errno]:"");
+               goto bad;
+       }
+       cin = fdopen(s, "r");
+       cout = fdopen(s, "w");
+       if (cin == NULL || cout == NULL) {
+               (void)sprintf(ftp_error, "ftp: fdopen failed.");
+               if (cin)
+                       (void)fclose(cin);
+               if (cout)
+                       (void)fclose(cout);
+               goto bad;
+       }
+       (void) getreply(0);             /* read startup message from server */
+       connected = 1;
+       return (OK);
+bad:
+       (void)close(s);
+       return (NOTOK);
+}
+
+login(user,pass,acct)
+       char *user, *pass, *acct;
+{
+       int n;
+
+       if (!user){
+               (void)sprintf(ftp_error, "Username required");
+               return(NOTOK);
+       }
+       n = command("USER %s", user);
+       if (n == CONTINUE){
+               if (!pass){
+                       (void)sprintf(ftp_error, "Password required");
+                       return(NOTOK);
+               }
+               n = command("PASS %s", pass);
+       }
+       if (n == CONTINUE) {
+               if (!acct){
+                       (void)sprintf(ftp_error, "Account required");
+                       return(NOTOK);
+               }
+               n = command("ACCT %s", acct);
+       }
+       if (n != COMPLETE) {
+               (void)sprintf(ftp_error, "Login failed.");
+               return (NOTOK);
+       }
+       return (OK);
+}
+
+#ifndef        lint
+command(va_alist)
+va_dcl
+{
+    int            val;
+    va_list ap;
+
+    va_start (ap);
+
+    val = _command (ap);
+
+    va_end (ap);
+
+    return val;
+}
+
+_command(ap)
+va_list ap;
+{
+    char buffer[BUFSIZ];
+
+       if (cout == NULL) {
+               (void)sprintf(ftp_error,"No control connection for command %s",
+                       (errno <= sys_nerr)? sys_errlist[errno]:"");
+               return (NOTOK);
+       }
+
+       _asprintf (buffer, NULLCP, ap);
+       fprintf (cout, "%s\r\n", buffer);
+       (void) fflush(cout);
+       if (verbose)
+           advise (LLOG_DEBUG, NULLCP, "<--- %s", buffer);
+       return (getreply(!strcmp(buffer, "QUIT")));
+}
+#else
+/* VARARGS1 */
+
+command (fmt)
+char   *fmt;
+{
+    return command (fmt);
+}
+#endif
+
+#include <ctype.h>
+
+getreply(expecteof)
+       int expecteof;
+{
+       register int c, n;
+       register int code, dig;
+       int originalcode = 0, continuation = 0;
+       char *mesg;
+
+       mesg = ftp_error_buffer;
+       for (;;) {
+               dig = n = code = 0;
+               while ((c = getc(cin)) != '\n') {
+                       dig++;
+                       if (c == EOF) {
+                               if (expecteof)
+                                       return (0);
+                               lostpeer();
+                               advise (LLOG_EXCEPTIONS,NULLCP,"getreply: %s",
+                                       ftp_error_buffer);
+                               return(1);
+                               /* exit(1); */
+                       }
+                       if (c != '\r') *mesg++ = c;
+                       else *mesg = '\0';
+                       if (dig < 4 && isdigit(c))
+                               code = code * 10 + (c - '0');
+                       if (dig == 4 && c == '-')
+                               continuation++;
+                       if (n == 0)
+                               n = c;
+               }
+               if (continuation && code != originalcode) {
+                       if (originalcode == 0)
+                               originalcode = code;
+                       continue;
+               }
+               if (verbose)
+                   advise (LLOG_DEBUG,NULLCP,"---> %s",
+                           ftp_error_buffer);
+               return (n - '0');
+       }
+}
+
+/*
+ *  sendrequest and recvrequest routines have been modified to send the
+ *  appropriate remote command then open and return a file descriptor (socket).
+ *  The FTAM code treats this as though it were a local file (which
+ *  is about what FTP does)
+ */
+int
+sendrequest(cmd, /* local, */ remote)
+       char *cmd, /* *local, */ *remote;
+{
+       int dout;
+       int expectingreply = 0;
+
+       if (initconn())
+               goto bad;
+       if (remote) {
+               if (command("%s %s", cmd, remote) != PRELIM)
+                       goto bad;
+       } else
+               if (command("%s", cmd) != PRELIM)
+                       goto bad;
+       expectingreply++; /* got preliminary reply, expecting final reply */
+       dout = dataconn("w");
+       if (dout == NOTOK)
+               goto bad;
+       return(dout);
+
+bad:
+       if (data >= 0)
+               (void) close(data), data = -1;
+        if (expectingreply) {
+                (void) getreply(0);
+                expectingreply = 0;
+        }
+        return(NOTOK);
+}
+
+int
+recvrequest(cmd, /* local,*/ remote)
+       char *cmd, /* *local,*/ *remote;
+{
+       int din;
+       int expectingreply = 0;
+
+       if (initconn())
+               goto bad;
+       if (remote) {
+               if (command("%s %s", cmd, remote) != PRELIM)
+                       goto bad;
+       } else
+               if (command("%s", cmd) != PRELIM)
+                       goto bad;
+       expectingreply++;   /* got preliminary reply, expecting final reply */
+       din = dataconn("r");
+       if (din == NOTOK)
+               goto bad;
+       return(din);
+bad:
+       if (data >= 0)
+               (void) close(data), data = -1;
+       if (expectingreply) {
+               (void) getreply(0);
+               expectingreply = 0;
+       }
+       return(NOTOK);
+}
+
+/*
+ * Need to start a listen on the data channel
+ * before we send the command, otherwise the
+ * server's connect may fail.
+ */
+int sendport = -1;
+
+initconn()
+{
+       register char *p, *a;
+       int result, len;
+#ifdef BSD43
+       int     on = 1;
+#endif
+
+noport:
+       data_addr = myctladdr;
+       if (sendport)
+               data_addr.sin_port = 0; /* let system pick one */ 
+       if (data != -1)
+               (void) close (data);
+       data = socket(AF_INET, SOCK_STREAM, 0);
+       if (data < 0) {
+               (void)sprintf(ftp_error,"ftp: socket %s",
+                       (errno <= sys_nerr)? sys_errlist[errno]:"");
+               return (NOTOK);
+       }
+       if (!sendport)
+#ifndef        BSD43
+               if (setsockopt(data, SOL_SOCKET, SO_REUSEADDR, (char *) 0, 0) < 0) {
+#else
+               if (setsockopt(data, SOL_SOCKET, SO_REUSEADDR, (char *)&on, sizeof on) < 0) {
+#endif
+               (void)sprintf(ftp_error,"ftp: setsockopt (reuse address) %s",
+                       (errno <= sys_nerr)? sys_errlist[errno]:"");
+                       goto bad;
+               }
+       if (bind(data, (struct sockaddr *)&data_addr, sizeof (data_addr)) < 0) {
+               (void)sprintf(ftp_error,"ftp: bind %s",
+                       (errno <= sys_nerr)? sys_errlist[errno]:"");
+               goto bad;
+       }
+       if (options & SO_DEBUG &&
+#ifndef        BSD43
+           setsockopt(data, SOL_SOCKET, SO_DEBUG, (char *) 0, 0) < 0)
+#else
+           setsockopt(data, SOL_SOCKET, SO_DEBUG, (char *) &on, on) < 0)
+#endif
+               (void)sprintf(ftp_error,"ftp: setsockopt (ignoreg) %s",
+                       (errno <= sys_nerr)? sys_errlist[errno]:"");
+       len = sizeof (data_addr);
+       if (getsockname(data, (struct sockaddr *)&data_addr, &len) < 0) {
+               (void)sprintf(ftp_error,"ftp: getsockname  %s",
+                       (errno <= sys_nerr)? sys_errlist[errno]:"");
+               goto bad;
+       }
+       if (listen(data, 1) < 0) {
+               (void)sprintf(ftp_error,"ftp: listen  %s",
+                       (errno <= sys_nerr)? sys_errlist[errno]:"");
+               goto bad;
+       }
+       if (sendport) {
+               a = (char *)&data_addr.sin_addr;
+               p = (char *)&data_addr.sin_port;
+#define        UC(b)   (((int)b)&0xff)
+               result =
+                   command("PORT %d,%d,%d,%d,%d,%d",
+                     UC(a[0]), UC(a[1]), UC(a[2]), UC(a[3]),
+                     UC(p[0]), UC(p[1]));
+               if (result == ERROR && sendport == -1) {
+                       sendport = 0;
+                       goto noport;
+               }
+               return ((result == COMPLETE)?OK:NOTOK);
+       }
+       return (OK);
+bad:
+       (void) close(data), data = -1;
+       return (NOTOK);
+}
+
+/*ARGSUSED */
+int
+dataconn(modeX)
+       char *modeX;
+{
+       struct sockaddr_in from;
+       int s, fromlen = sizeof (from);
+
+       s = accept(data, (struct sockaddr *) &from, &fromlen);
+       if (s < 0) {
+               (void)sprintf(ftp_error,"ftp: accept  %s",
+                       (errno <= sys_nerr)? sys_errlist[errno]:"");
+               (void) close(data), data = -1;
+               return (NOTOK);
+       }
+       (void) close(data);
+       data = s;
+       return (data);
+}
+
+lostpeer()
+{
+        if (connected) {
+                if (cout != NULL) {
+                        (void)shutdown(fileno(cout), 1+1);
+                        (void)fclose(cout);
+                        cout = NULL;
+                }
+                if (data >= 0) {
+                        (void) shutdown(data, 1+1);
+                        (void) close(data);
+                        data = -1;
+                }
+                connected = 0;
+        }
+}
diff --git a/usr/src/contrib/isode/ftam-ftp/ftp_lib.c b/usr/src/contrib/isode/ftam-ftp/ftp_lib.c
new file mode 100644 (file)
index 0000000..f8a7b01
--- /dev/null
@@ -0,0 +1,351 @@
+/* ftp_lib.c - FTP subroutines */
+
+/* 
+ * $Header: /f/osi/ftam-ftp/RCS/ftp_lib.c,v 7.2 91/02/22 09:23:29 mrose Interim $
+ *
+ *
+ * $Log:       ftp_lib.c,v $
+ * Revision 7.2  91/02/22  09:23:29  mrose
+ * Interim 6.8
+ * 
+ * Revision 7.1  90/12/23  18:39:51  mrose
+ * update
+ * 
+ * Revision 7.0  89/11/23  21:55:06  mrose
+ * Release 6.0
+ * 
+ */
+
+/*
+ *                               NOTICE
+ *
+ *     The MITRE Corporation (hereafter MITRE) makes this software available 
+ *     on an "as is" basis.  No guarantees, either explicit or implied, are 
+ *     given as to performance or suitability.  
+ *
+ */
+
+/*
+ * Library interface routines.  Design of routines is specific for
+ * FTAM.
+ */
+
+/*
+ * FTP User Program -- Command Routines.
+ */
+#include "config.h"
+#include <sys/param.h>
+#include <sys/stat.h>
+#include <sys/socket.h>
+
+#include <arpa/ftp.h>
+
+#include <signal.h>
+#include <stdio.h>
+#include <errno.h>
+#include <netdb.h>
+
+#include "ftp_var.h"
+#include "general.h"
+#include "logger.h"
+
+void   advise ();
+#ifndef        NULLCP
+#define        NULLCP  ((char *) 0)
+#endif
+
+#define FTP_PORT 21
+
+/* Virtual filesystem file types */
+
+#define        VFS_UBF 0               /* offset to FTAM-3 */
+#define        VFS_UTF 1               /*  ..       FTAM-1 */
+#define        VFS_FDF 2               /*  ..       NBS-9 */
+
+#ifndef NOTOK
+#define NOTOK (-1)
+#define OK     0
+#define DONE   1
+#endif /* NOTOK */
+
+
+/*
+ * ftp_login: establish command connection with remote host
+ * then execute login process.
+ */
+int
+ftp_login(host,user,passwd,acct)
+char *host, *user, *passwd, *acct;
+{
+
+       if (connected) return NOTOK; /* already connected */
+
+       ftp_init(); /* initialize control state structures */
+       if (hookup(host,FTP_PORT) == NOTOK) return NOTOK;
+               
+
+       /* execute login process */
+       if (login(user,passwd,acct) == NOTOK) return NOTOK;
+
+       return OK;
+}
+
+/*
+ * ftp_quit: send quit command and shutdown communications link.
+ */
+int
+ftp_quit()
+{
+
+       extern FILE *cout;
+       extern int data;
+       int n;
+
+       if (!connected) return OK;
+       n = command("QUIT");
+       (void) fclose(cout);
+       connected = 0;
+       data = -1;
+
+       if (n == 0 || n == COMPLETE) return OK;
+       return NOTOK;
+}
+
+/*
+ * ftp_abort: send abort command
+ */
+int
+ftp_abort()
+{
+int n;
+
+       if (!connected) return NOTOK;
+       n = command("ABOR");
+
+       if (n == COMPLETE) return OK;
+       return NOTOK;
+
+}
+
+/*
+ * ftp_exist: perform NLST command and count number of records in data
+ * stream.  If 0 or reply code is failure, file does not exist.  If 1
+ * or more and reply code is COMPLETE, file exists.  ftp_directory is
+ * a global flag.  It is set if more than 1 record in data stream and
+ * reply code is COMPLETE.  Yes this is hokey but it works for all the
+ * test systems and is faster than trying a case sensitive, then case
+ * insensitive scan then falling back on record counts in the case of
+ * directories.
+ */
+int 
+ftp_exist(filename)
+char *filename;
+{
+int n, count;
+int fd;
+FILE *fp, *fdopen();
+char lineX[BUFSIZ];
+
+       ftp_directory = 0;
+
+       if (!connected) return NOTOK;
+
+       /* set ascii transfer */
+       if (ftp_type(VFS_FDF) != OK) return NOTOK;
+
+       /* begin list transfer */
+       if ((fd = recvrequest("NLST",filename)) == NOTOK) return NOTOK;
+       if ((fp = fdopen(fd,"r")) == NULL){
+               (void)close(fd);
+               (void) getreply(0);
+               (void)sprintf(ftp_error,"Out of memory");
+               return NOTOK;
+       }
+
+       /* count number of records (lines) in data transfer */
+       for(count=0; fgets(lineX,BUFSIZ,fp)!=NULL; count++);
+       (void)fclose(fp);
+
+       /* transfer complete reply */
+       n = getreply(0);
+
+       if (n != COMPLETE) /* directory command not accepted */
+               return NOTOK;
+
+       /* if more than one record in reply, guess that it is a directory */
+       if (count > 1) {
+               ftp_directory = 1;
+               if (verbose)
+                   advise (LLOG_DEBUG, NULLCP, "directory found");
+       }
+
+       /* if any records in reply, assume that file existed */
+       if (count) return OK;
+
+       return NOTOK;
+
+}
+
+/* Basicly set transfer type to ascii and issue NLST command
+ * and returning the socket descriptor for the data stream.
+ */
+int
+ftp_ls(dir)
+char *dir;
+{
+int fd;
+
+       if (!connected) return NOTOK;
+
+       /* set ascii transfer */
+       if (ftp_type(VFS_FDF) != OK) return NOTOK;
+
+       /* begin list transfer */
+       if ((fd = recvrequest("NLST",dir)) == NOTOK) return NOTOK;
+
+       return(fd);
+}
+int
+ftp_delete(file)
+char *file;
+{
+
+       
+       if (!connected) return NOTOK;
+
+       /* send delete command, return OK if complete, NOTOK otherwise */
+       if (command("DELE %s", file) == COMPLETE) return OK;
+       /* Hummm, try directory delete */
+       if (command("XRMD %s", file) == COMPLETE) return OK;
+       /* No dice, return error */
+       return NOTOK;
+
+}
+
+int
+ftp_mkdir(dir)
+char *dir;
+{
+
+       if (!connected) return NOTOK;
+
+       /* send MKDIR command, return OK if complete, NOTOK otherwise */
+       if (command("XMKD %s", dir) == COMPLETE) return OK;
+       return NOTOK;
+
+}
+
+int
+ftp_rename(from,to)
+char *from, *to;
+{
+int n;
+
+       if (!connected) return NOTOK;
+
+       /* send RNFR command followed by RNTO if successful */
+       if ((n = command("RNFR %s",from)) == CONTINUE)
+               n = command("RNTO %s",to);
+       if (n == COMPLETE) return OK;
+       return NOTOK;
+
+}
+
+int
+ftp_write(file)
+char *file;
+{
+
+       if (!connected) return NOTOK;
+
+       return(sendrequest("STOR",file));
+}
+int 
+ftp_append(file)
+char *file;
+{
+       if (!connected) return NOTOK;
+
+       return(sendrequest("APPE",file));
+}
+
+int
+ftp_read(file)
+char *file;
+{
+
+       if (!connected) return NOTOK;
+
+       return(recvrequest("RETR", file));
+}
+
+int
+ftp_type(modeX)
+int modeX;
+{
+int n;
+char cmd[10];
+
+       /* The current transfer type is stored in ``type''.
+        * The TYPE command is issued if the type changes.
+         * (this cuts down on the number of FTP transactions).
+         */
+       if (!connected) return NOTOK;
+       n = COMPLETE;
+
+       switch(modeX) {
+               /* unstructured binary file */
+               case VFS_UBF:
+                       if (type == TYPE_L) break;
+                       (void)sprintf(cmd, "TYPE L %s", bytename);
+                       type = TYPE_L;
+                       n = command(cmd,0);
+                       break;
+               /* unstructured text file */
+               case VFS_UTF:
+               /* directory file */
+               case VFS_FDF:
+               default:
+                       if (type == TYPE_A) break;
+                       (void)sprintf(cmd, "TYPE A");
+                       type = TYPE_A;
+                       n = command(cmd,0);
+               }
+
+       if (n == COMPLETE) return OK;
+       return NOTOK;
+
+}
+
+int
+ftp_reply()
+{
+int n;
+
+       /* process an FTP response */
+
+       n = getreply(0);
+       if (n == COMPLETE) return OK;
+       return NOTOK;
+}
+
+int
+ftp_create(filename)
+char *filename;
+{
+int fd,n;
+
+       if (!connected) return NOTOK;
+
+       /* open file */
+       fd = sendrequest("STOR",filename);
+       if (fd == NOTOK) return NOTOK;
+
+       /* close file (create empty file) */
+       (void)close(fd);
+       n = getreply(0);
+       if (n == COMPLETE) return OK;
+       return NOTOK;
+
+}
+
diff --git a/usr/src/contrib/isode/ftam-ftp/ftp_var.h b/usr/src/contrib/isode/ftam-ftp/ftp_var.h
new file mode 100644 (file)
index 0000000..5a79fd0
--- /dev/null
@@ -0,0 +1,94 @@
+/* ftp_var.h - FTP global variables */
+
+/* 
+ * $Header: /f/osi/ftam-ftp/RCS/ftp_var.h,v 7.1 91/02/22 09:23:32 mrose Interim $
+ *
+ *
+ * $Log:       ftp_var.h,v $
+ * Revision 7.1  91/02/22  09:23:32  mrose
+ * Interim 6.8
+ * 
+ * Revision 7.0  89/11/23  21:55:07  mrose
+ * Release 6.0
+ * 
+ */
+
+/*
+ *                               NOTICE
+ *
+ *    Acquisition, use, and distribution of this module and related
+ *    materials are subject to the restrictions of a license agreement.
+ *    Consult the Preface in the User's Manual for the full terms of
+ *    this agreement.
+ *
+ */
+
+
+/*
+ *     Shamelessly taken from UCB
+ */
+
+/*
+ * Options and other state info.
+ */
+int    trace;                  /* trace packets exchanged */
+int    hash;                   /* print # for each buffer transferred */
+int    verbose;                /* print messages to/from server */
+int    connected;              /* connected to server */
+int    fromatty;               /* input is from a terminal */
+int    interactive;            /* interactively prompt on m* cmds */
+int    debug;                  /* debugging level */
+int    bell;                   /* ring bell on cmd completion */
+int    doglob;                 /* glob local file names */
+int    autologin;              /* establish user account on connection */
+
+char   typename[32];           /* name of file transfer type */
+int    type;                   /* file transfer type */
+char   structname[32];         /* name of file transfer structure */
+int    stru;                   /* file transfer structure */
+char   formname[32];           /* name of file transfer format */
+int    form;                   /* file transfer format */
+char   modename[32];           /* name of file transfer mode */
+int    mode;                   /* file transfer mode */
+char   bytename[32];           /* local byte size in ascii */
+int    bytesize;               /* local byte size in binary */
+
+char   *hostname;              /* name of host connected to */
+
+struct servent *sp;            /* service spec for tcp/ftp */
+
+#include <setjmp.h>
+jmp_buf        toplevel;               /* non-local goto stuff for cmd scanner */
+
+char   line[200];              /* input line buffer */
+char   *stringbase;            /* current scan point in line buffer */
+char   argbuf[200];            /* argument storage buffer */
+char   *argbase;               /* current storage point in arg buffer */
+int    margc;                  /* count of arguments on input line */
+char   *margv[20];             /* args parsed from input line */
+
+int    options;                /* used during socket creation */
+
+/*
+ * Format of command table.
+ */
+struct cmd {
+       char    *c_name;        /* name of command */
+       char    *c_help;        /* help string */
+       char    c_bell;         /* give bell when command completes */
+       char    c_conn;         /* must be connected to use command */
+       int     (*c_handler)(); /* function to call */
+};
+
+extern char *tail();
+extern char *index();
+extern char *rindex();
+extern char *remglob();
+extern int errno;
+extern int sys_nerr;
+extern char *sys_errlist[];
+
+/* global interface variables */
+int ftp_directory;/* TRUE if last ftp_exist was a multiple listing */
+char ftp_error_buffer[BUFSIZ];
+char *ftp_error; /* points to FTP diagnostic string */
diff --git a/usr/src/contrib/isode/ftam-ftp/make b/usr/src/contrib/isode/ftam-ftp/make
new file mode 100644 (file)
index 0000000..d861596
--- /dev/null
@@ -0,0 +1,7 @@
+: run this script through /bin/sh
+M=/bin/make
+if [ -f /usr/bin/make ]; then
+    M=/usr/bin/make
+fi
+
+exec $M TOPDIR=../ -f ../config/CONFIG.make -f Makefile ${1+"$@"}
diff --git a/usr/src/contrib/isode/ftam/Makefile b/usr/src/contrib/isode/ftam/Makefile
new file mode 100644 (file)
index 0000000..f3b5fe3
--- /dev/null
@@ -0,0 +1,246 @@
+###############################################################################
+#   Instructions to Make, for compilation of ISODE FTAM processes
+###############################################################################
+
+###############################################################################
+#
+# $Header: /f/osi/ftam/RCS/Makefile,v 7.7 91/02/22 09:22:22 mrose Interim $
+#
+#
+# $Log:        Makefile,v $
+# Revision 7.7  91/02/22  09:22:22  mrose
+# Interim 6.8
+# 
+# Revision 7.6  91/01/24  14:50:14  mrose
+# update
+# 
+# Revision 7.5  90/12/23  18:39:53  mrose
+# update
+# 
+# Revision 7.4  90/07/27  08:44:37  mrose
+# update
+# 
+# Revision 7.3  90/07/09  14:36:30  mrose
+# sync
+# 
+# Revision 7.2  90/07/01  21:02:59  mrose
+# pepsy
+# 
+# Revision 7.1  90/03/06  13:56:31  mrose
+# touch-up
+# 
+# Revision 7.0  89/11/23  21:53:13  mrose
+# Release 6.0
+# 
+###############################################################################
+
+###############################################################################
+#
+#                               NOTICE
+#
+#    Acquisition, use, and distribution of this module and related
+#    materials are subject to the restrictions of a license agreement.
+#    Consult the Preface in the User's Manual for the full terms of
+#    this agreement.
+#
+###############################################################################
+
+
+PEPYPATH=      -DPEPYPATH
+
+.SUFFIXES:     .py .c .o
+
+
+LIBES  =       libftam.a $(TOPDIR)libisode.a
+LLIBS  =       $(TOPDIR)llib-lisode
+HFILES =       $(HDIR)ftam.h \
+               $(HDIR)acsap.h $(HDIR)psap2.h $(HDIR)psap.h $(HDIR)ssap.h \
+               $(HDIR)isoaddrs.h \
+               $(HDIR)manifest.h $(HDIR)general.h $(HDIR)config.h
+HXFILES        =       $(HFILES) $(HDIR)fpkt.h CONT-types.h FADU-types.h \
+               FTAM-types.h 
+
+
+##################################################################
+# Here it is...
+##################################################################
+
+all:           libftam
+inst-all:      inst-libftam documents manuals
+install:       inst-all clean
+lint:          l-libftam
+
+
+##################################################################
+# libftam
+##################################################################
+
+CFILES =       ftamprovider.c ftamerror.c ftaminitiate.c ftamrespond.c \
+               ftamrelease1.c ftamrelease2.c ftamabort.c ftamgroup1.c \
+               ftamgroup2.c ftamaccess1.c ftamaccess2.c ftambulk.c \
+               ftambulk1.c ftambulk2.c ftamselect.c ftamtrace.c ftamacl.c \
+               ftamattr.c ftambits.c ftamchrg.c ftamconctl.c ftamdiag.c \
+               ftamfaduid.c ftampass.c ftamshare.c ftamlose.c ftamdocument.c \
+               ftamfdf.c
+PYFILES        =       cont.py fadu.py ftam.py
+OFILES =       ftamprovider.o ftamerror.o ftaminitiate.o ftamrespond.o \
+               ftamrelease1.o ftamrelease2.o ftamabort.o ftamgroup1.o \
+               ftamgroup2.o ftamaccess1.o ftamaccess2.o ftambulk.o \
+               ftambulk1.o ftambulk2.o ftamselect.o ftamtrace.o ftamacl.o \
+               ftamattr.o ftambits.o ftamchrg.o ftamconctl.o ftamdiag.o \
+               ftamfaduid.o ftampass.o ftamshare.o ftamlose.o ftamdocument.o \
+               ftamfdf.o \
+               $(OSTRINGS)
+
+HEADERS        =       CONT.ph CONT-types.h CONT_defs.h CONT_pre_defs.h \
+               FADU.ph FADU-types.h FADU_defs.h FADU_pre_defs.h \
+               FTAM.ph FTAM-types.h FTAM_defs.h FTAM_pre_defs.h 
+
+inst-libftam:  $(LIBDIR)libftam.a inst-headers $(LINTDIR)llib-lftam
+
+$(LIBDIR)libftam.a:    libftam.a
+               -rm -f $@
+               cp libftam.a $@
+               @$(UTILDIR)make-lib.sh $(SYSTEM) $@ -ranlib
+               -@ls -gls $@
+               -@echo ""
+
+$(LINTDIR)llib-lftam:  llib-lftam
+               -cp $@ zllib-lftam
+               -rm -f $@
+               sed -e 's%#include "\(.*\)"%#include "$(INCDIR)\1"%' \
+                       < llib-lftam | \
+                       sed -e 's%#include "/usr/include/\(.*\)"%#include <\1>%' > $@
+               @$(UTILDIR)inst-lint.sh $(SYSTEM) $(OPTIONS) $@
+               -@ls -gls $@ $@.ln
+               -@echo ""
+
+inst-headers:; @cd $(TOPDIR)h; $(MAKE) inst-ftam
+               @for h in $(HEADERS); do $(MAKE) TARGET=$$h inst-target; done
+
+inst-target:   $(PEPSYDIR)$(TARGET)
+
+$(PEPSYDIR)$(TARGET):  $(TARGET)
+               -cp $@ z$(TARGET)
+               cp $(TARGET) $@
+               -@ls -gls $@
+               -@echo ""
+
+libftam:       libftam.a true
+               -@rm -f $(TOPDIR)h/CONT*.h $(TOPDIR)h/FADU*.h \
+                       $(TOPDIR)h/FTAM*.h
+               -@$(LN) CONT-types.h $(TOPDIR)h/CONT-types.h
+               -@$(LN) CONT_defs.h $(TOPDIR)h/CONT_defs.h
+               -@$(LN) CONT_pre_defs.h $(TOPDIR)h/CONT_pre_defs.h
+               -@$(LN) FADU-types.h $(TOPDIR)h/FADU-types.h 
+               -@$(LN) FADU_defs.h $(TOPDIR)h/FADU_defs.h 
+               -@$(LN) FADU_pre_defs.h $(TOPDIR)h/FADU_pre_defs.h 
+               -@$(LN) FTAM-types.h $(TOPDIR)h/FTAM-types.h
+               -@$(LN) FTAM_defs.h $(TOPDIR)h/FTAM_defs.h
+               -@$(LN) FTAM_pre_defs.h $(TOPDIR)h/FTAM_pre_defs.h
+
+libftam.a:     ftamvrsn.o
+               -rm -f $@
+               @$(UTILDIR)make-lib.sh $(SYSTEM) $(ARFLAGS) $@ $(OFILES) \
+                       CONT_tables.o FADU_tables.o FTAM_tables.o ftamvrsn.o
+               -@rm -f $(TOPDIR)libftam.a $(TOPDIR)llib-lftam
+               -@$(LN) libftam.a $(TOPDIR)libftam.a
+               -@$(LN) llib-lftam $(TOPDIR)llib-lftam
+               -@ls -l $@
+               -@echo "FTAM library built normally"
+
+FTAM_tables.o: FTAM_tables.c FTAM-types.h CONT-types.h FADU-types.h
+
+FTAM_tables.c FTAM-types.h: ftam.py $(TOPDIR)pepsy/xpepsy
+               $(TOPDIR)pepsy/xpepsy -A -f -h -m ftam.py
+
+FADU_tables.o: FADU_tables.c FADU-types.h 
+
+FADU_tables.c FADU-types.h: fadu.py $(TOPDIR)pepsy/xpepsy
+               $(TOPDIR)pepsy/xpepsy -A -f -h -m fadu.py
+
+CONT_tables.o: CONT_tables.c CONT-types.h 
+
+CONT_tables.c CONT-types.h: cont.py $(TOPDIR)pepsy/xpepsy
+               $(TOPDIR)pepsy/xpepsy -A -f -h -m cont.py
+
+
+ftamvrsn.c:    $(OFILES) CONT_tables.o FADU_tables.o FTAM_tables.o
+               @$(UTILDIR)version.sh ftam > $@
+
+l-libftam:     CONT_tables.c FADU_tables.c FTAM_tables.c true
+               $(LINT) $(LFLAGS) $(CFILES) CONT_tables.c FADU_tables.c \
+                       FTAM_tables.c ftamvrsn.c $(LLIBS) \
+                       | grep -v "warning: possible pointer alignment problem"
+
+ftamprovider.o:        $(HXFILES)
+ftamerror.o:   $(HFILES)
+ftaminitiate.o:        $(HXFILES)
+ftamrespond.o: $(HXFILES)
+ftamrelease1.o:        $(HXFILES)
+ftamrelease2.o:        $(HXFILES)
+ftamabort.o:   $(HXFILES)
+ftamgroup1.o:  $(HXFILES)
+ftamgroup2.o:  $(HXFILES)
+ftamaccess1.o: $(HXFILES)
+ftamaccess2.o: $(HXFILES)
+ftambulk.o:    $(HXFILES)
+ftambulk1.o:   $(HXFILES)
+ftambulk2.o:   $(HXFILES)
+ftamselect.o:  $(HXFILES)
+ftamtrace.o:   $(HXFILES)
+ftamacl.o:     $(HXFILES)
+ftambits.o:    $(HXFILES)
+ftamattr.o:    $(HXFILES)
+ftamchrg.o:    $(HXFILES)
+ftamconctl.o:  $(HXFILES)
+ftamdiag.o:    $(HXFILES)
+ftamfaduid.o:  $(HXFILES)
+ftampass.o:    $(HXFILES)
+ftamshare.o:   $(HXFILES)
+ftamlose.o:    $(HXFILES)
+ftamdocument.o:        $(HFILES) $(HDIR)tailor.h $(HDIR)logger.h
+ftamfdf.o:     $(HXFILES)
+
+
+################################################################
+# documents
+################################################################
+
+documents:     $(ETCDIR)isodocuments
+
+$(ETCDIR)isodocuments: isodocuments
+               -cp $@ zisodocuments
+               cp isodocuments $@
+               -@ls -gls $@
+               -@echo ""
+
+
+##################################################################
+# manual pages
+##################################################################
+
+MANUALS        =       libftam.3n isodocuments.5
+
+manuals:;      @$(UTILDIR)inst-man.sh $(MANOPTS) $(MANUALS)
+               -@echo ""
+
+
+##################################################################
+# clean
+##################################################################
+
+clean:;                rm -f *.o *.a *.ph CONT* FADU* FTAM* z* _* core  \
+                       ftamvrsn.c \
+                       $(TOPDIR)h/CONT*.h $(TOPDIR)h/FADU*.h \
+                       $(TOPDIR)h/FTAM*.h
+
+grind:;                iprint Makefile isodocuments
+               tgrind -lc $(CFILES) ftamvrsn.c llib-lftam
+               tgrind -lpepy -d $(TOPDIR)pepy/grindefs $(PYFILES)
+               @echo $(MANUALS) | \
+                       tr " " "\012" | \
+                       sed -e "s%.*%itroff -man &%" | \
+                       sh -ve
+
+true:;
diff --git a/usr/src/contrib/isode/ftam/cont.py b/usr/src/contrib/isode/ftam/cont.py
new file mode 100644 (file)
index 0000000..3ba5829
--- /dev/null
@@ -0,0 +1,39 @@
+-- cont.py - FTAM contents definitions
+--     lifted directly from ISO8571-2
+
+-- $Header: /f/osi/ftam/RCS/cont.py,v 7.1 91/02/22 09:22:24 mrose Interim $
+--
+--
+-- $Log:       cont.py,v $
+-- Revision 7.1  91/02/22  09:22:24  mrose
+-- Interim 6.8
+-- 
+-- Revision 7.0  89/11/23  21:53:15  mrose
+-- Release 6.0
+-- 
+
+--
+--                               NOTICE
+--
+--    Acquisition, use, and distribution of this module and related
+--    materials are subject to the restrictions of a license agreement.
+--    Consult the Preface in the User's Manual for the full terms of
+--    this agreement.
+--
+--
+
+
+--* ISO8571-CONTENTS *-- CONT DEFINITIONS ::=
+
+%{
+#ifndef        lint
+static char *rcsid = "$Header: /f/osi/ftam/RCS/cont.py,v 7.1 91/02/22 09:22:24 mrose Interim $";
+#endif
+%}
+
+BEGIN
+
+File-Contents-Data-Element ::=
+       ANY
+
+END
diff --git a/usr/src/contrib/isode/ftam/fadu.py b/usr/src/contrib/isode/ftam/fadu.py
new file mode 100644 (file)
index 0000000..d9c383d
--- /dev/null
@@ -0,0 +1,149 @@
+-- fadu.py - FTAM file-access-data-unit definitions
+--     lifted directly from ISO8571-2
+--
+--      Two kinds of changes to the ASN.1
+--         - more commentary-tags for POSY
+--         - Node-Name must be string-valued
+
+-- $Header: /f/osi/ftam/RCS/fadu.py,v 7.1 91/02/22 09:22:26 mrose Interim $
+--
+--
+-- $Log:       fadu.py,v $
+-- Revision 7.1  91/02/22  09:22:26  mrose
+-- Interim 6.8
+-- 
+-- Revision 7.0  89/11/23  21:53:15  mrose
+-- Release 6.0
+-- 
+
+--
+--                               NOTICE
+--
+--    Acquisition, use, and distribution of this module and related
+--    materials are subject to the restrictions of a license agreement.
+--    Consult the Preface in the User's Manual for the full terms of
+--    this agreement.
+--
+--
+
+
+--* ISO8571-FADU *-- FADU DEFINITIONS ::=
+
+%{
+#ifndef        lint
+static char *rcsid = "$Header: /f/osi/ftam/RCS/fadu.py,v 7.1 91/02/22 09:22:26 mrose Interim $";
+#endif
+%}
+
+BEGIN
+
+Subtree ::=
+        SEQUENCE {
+            node
+                Node-Descriptor-Data-Element,
+
+            data[0]
+                IMPLICIT DU
+                OPTIONAL,
+               -- present if and only if a DU is connected to the node
+
+            children[1]
+                IMPLICIT Children
+                OPTIONAL
+               -- a leaf node is characterized by having no children
+        }
+
+Children ::=
+        SEQUENCE {
+            enter-subtree
+                Enter-Subtree-Data-Element,
+
+           subtree --* *--
+                SEQUENCE OF
+                    Subtree,
+               -- subtrees must appear in their proper order according to
+               -- their proper ordering as children of their parent node
+
+            exit-subtree
+                Exit-Subtree-Data-Element
+        }
+
+DU ::=
+        SEQUENCE OF
+            --* ISO8571-CONTENTS *-- CONT.File-Contents-Data-Element
+
+Node-Descriptor-Data-Element ::=
+    [APPLICATION 0]
+        IMPLICIT SEQUENCE {
+            name
+                Node-Name
+                OPTIONAL,
+               -- present only if the root node of the subtree is a named node
+
+            arc-length[1]
+                IMPLICIT INTEGER
+                DEFAULT 1,
+               -- used to specify the length of the arc to the root node of
+               -- the subtree from its parent node
+
+            data-exists[2]
+                IMPLICIT BOOLEAN
+                DEFAULT TRUE
+               -- data-exists = TRUE indicates that a DU is connected to the
+               -- root node of the subtree
+        }
+
+Node-Name ::=
+--*     CHOICE { *--
+--*         ftam-coded *-- [0]
+                IMPLICIT GraphicString --* , *--
+               -- when ftam-coded is used, the Node-Name belongs to the same
+               -- abstract syntax as the structuring information.  Node-Names
+               -- are then transferred in the presentatino context established
+               -- to support the FTAM FADU abstract syntax.  This form of
+               -- Node-Name is only allowed when the content type file
+               -- attribute contains a document type name.  To support this
+               -- alternative, at least the G0 character set registered in
+               -- character set register entry 2 shall be supported.
+
+--*         user-coded *--
+--*             EXTERNAL *--
+               -- the actual types allowed are found in the abstract syntax
+               -- for the files contents, as specified in the contents type
+               -- file attribute for the file
+--*     } *--
+
+Enter-Subtree-Data-Element ::=
+    [APPLICATION 1]
+        IMPLICIT NULL
+
+Exit-Subtree-Data-Element ::=
+    [APPLICATION 2]
+        IMPLICIT NULL
+       -- the enter-subtree and exit-subtree data elements are used to bracket
+       -- the list of subtrees, which are children of the preceding node
+
+FADU ::=
+        Subtree
+
+Structuring-Data-Element ::=
+        CHOICE {
+           node-descriptor --* *--
+                Node-Descriptor-Data-Element,
+
+           enter-subtree --* *--
+                Enter-Subtree-Data-Element,
+
+           exit-subtree --* *--
+                Exit-Subtree-Data-Element
+        }
+
+-- Data-Element is defined to be a general data type whose values are
+--
+--     a) a value of the ASN.1 type Structuring-Data-Element in the abstract
+--       syntax "FTAM FADU"; or,
+--
+--     b) a value of the ASN.1 type ISO8571-CONTENTS.File-Contents-Data-Element
+--       in the abstract syntax derived from the contents type file attribute.
+
+END
diff --git a/usr/src/contrib/isode/ftam/ftam.py b/usr/src/contrib/isode/ftam/ftam.py
new file mode 100644 (file)
index 0000000..13981bb
--- /dev/null
@@ -0,0 +1,1676 @@
+-- ftam.py - FTAM PDU definitions
+--     lifted directly from ISO8571-4
+--
+--      Two kinds of changes to the ASN.1
+--         - more commentary-tags for POSY
+--         - minor patches for POSY
+
+-- $Header: /f/osi/ftam/RCS/ftam.py,v 7.2 91/02/22 09:22:28 mrose Interim $
+--
+--
+-- $Log:       ftam.py,v $
+-- Revision 7.2  91/02/22  09:22:28  mrose
+-- Interim 6.8
+-- 
+-- Revision 7.1  90/03/23  10:53:44  mrose
+-- update
+-- 
+-- Revision 7.0  89/11/23  21:53:16  mrose
+-- Release 6.0
+-- 
+
+--
+--                               NOTICE
+--
+--    Acquisition, use, and distribution of this module and related
+--    materials are subject to the restrictions of a license agreement.
+--    Consult the Preface in the User's Manual for the full terms of
+--    this agreement.
+--
+--
+
+
+--* ISO8571-FTAM *-- FTAM DEFINITIONS ::=
+
+%{
+#ifndef        lint
+static char *rcsid = "$Header: /f/osi/ftam/RCS/ftam.py,v 7.2 91/02/22 09:22:28 mrose Interim $";
+#endif
+%}
+
+BEGIN
+
+PDU ::=
+        CHOICE {
+           ftam-regime-pdu --* *--
+                FTAM-Regime-PDU,
+
+           file-pdu --* *--
+                File-PDU,
+
+           bulk-data-pdu --* *--
+                Bulk-Data-PDU
+        }
+
+
+-- FTAM regime PDUs
+
+FTAM-Regime-PDU ::=
+        CHOICE {
+            f-initialize-request[0]
+                IMPLICIT F-INITIALIZE-request,
+
+            f-initialize-response[1]
+                IMPLICIT F-INITIALIZE-response,
+
+            f-terminate-request[2]
+                IMPLICIT F-TERMINATE-request,
+
+            f-terminate-response[3]
+                IMPLICIT F-TERMINATE-response,
+
+            f-u-abort-request[4]
+                IMPLICIT F-U-ABORT-request,
+
+            f-p-abort-request[5]
+                IMPLICIT F-P-ABORT-request
+        }
+
+F-INITIALIZE-request ::=
+        SEQUENCE {
+            protocol-version
+                Protocol-Version
+                DEFAULT { version-1 },
+
+            implementation-information
+                Implementation-Information
+                OPTIONAL,
+
+            presentation-context-management[2]
+                IMPLICIT BOOLEAN
+                DEFAULT FALSE,
+
+            service-class
+                Service-Class
+                DEFAULT { transfer-class },
+               -- only the valid combinations as specified in ISO 8571-3
+               -- are allowed
+
+            functional-units
+                Functional-Units,
+
+            attribute-groups
+                Attribute-Groups
+                DEFAULT {},
+
+            shared-ASE-information
+                Shared-ASE-Information
+                OPTIONAL,
+
+            ftam-quality-of-service
+                FTAM-Quality-Of-Service,
+
+            contents-type-list
+                Contents-Type-List
+                OPTIONAL,
+
+            initiator-identity
+                User-Identity
+                OPTIONAL,
+
+            account
+                Account
+                OPTIONAL,
+
+            filestore-password
+                Password
+                OPTIONAL,
+
+            checkpoint-window[8]
+                IMPLICIT INTEGER
+                DEFAULT 1
+        }
+
+F-INITIALIZE-response ::=
+        SEQUENCE {
+            state-result
+                State-Result
+                DEFAULT success,
+
+            action-result
+                Action-Result
+                DEFAULT success,
+
+            protocol-version
+                Protocol-Version
+                DEFAULT { version-1 },
+
+            implementation-information
+                Implementation-Information
+                OPTIONAL,
+
+            presentation-context-management[2]
+                IMPLICIT BOOLEAN
+                DEFAULT FALSE,
+
+            service-class
+                Service-Class
+                DEFAULT { transfer-class },
+               -- only the valid combinations as specified in ISO 8571-3
+               -- are allowed
+
+            functional-units
+                Functional-Units,
+
+            attribute-groups
+                Attribute-Groups
+                DEFAULT {},
+
+            shared-ASE-information
+                Shared-ASE-Information
+                OPTIONAL,
+
+            ftam-quality-of-service
+                FTAM-Quality-Of-Service,
+
+            contents-type-list
+                Contents-Type-List
+                OPTIONAL,
+
+            diagnostic
+                Diagnostic
+                OPTIONAL,
+
+            checkpoint-window[8]
+                IMPLICIT INTEGER
+                DEFAULT 1
+        }
+
+Protocol-Version ::=
+    [0]
+        IMPLICIT BIT STRING {
+            version-1(0)
+        }
+
+Implementation-Information ::=
+    [1]
+        IMPLICIT GraphicString
+       -- this parameter is provided solely for the convenience of
+        -- implementors needing to distinguish between implementations of a
+       -- specific version number on different equipment, it shall not be
+       -- the subject of conformance test
+
+Service-Class ::=
+    [3]
+        IMPLICIT BIT STRING {
+            unconstrained-class(0),
+            management-class(1),
+            transfer-class(2),
+            transfer-and-management-class(3),
+            access-class(4)
+        }
+
+Functional-Units ::=
+    [4]
+        IMPLICIT BIT STRING {
+            read(2),
+            write(3),
+            file-access(4),
+            limited-file-management(5),
+            enhanced-file-management(6),
+            grouping(7),
+            fadu-locking(8),
+            recovery(9),
+            restart-data-transfer(10)
+        }
+       -- values 2 to 10 are chosen to align with numbering scheme used in
+       -- ISO8571-2
+
+Attribute-Groups ::=
+    [5]
+        IMPLICIT BIT STRING {
+            storage(0),
+            security(1),
+            private(2)
+        }
+
+FTAM-Quality-Of-Service ::=
+    [6]
+        IMPLICIT INTEGER {
+            no-recovery(0),
+            class-1-recovery(1),
+            class-2-recovery(2),
+            class-3-recovery(3)
+        }
+
+Contents-Type-List ::=
+    [7]
+        IMPLICIT SEQUENCE OF
+--*         CHOICE { *--
+--*             document-type-name *--
+                    Document-Type-Name --* , *--
+
+--*             abstract-syntax-name
+--*                  Abstract-Syntax-Name
+--*         } *--
+
+F-TERMINATE-request ::=
+        SEQUENCE {
+            shared-ASE-information
+                Shared-ASE-Information
+                OPTIONAL
+        }
+
+F-TERMINATE-response ::=
+        SEQUENCE {
+            shared-ASE-information
+                Shared-ASE-Information
+                OPTIONAL,
+
+            charging
+                Charging
+                OPTIONAL
+        }
+
+F-U-ABORT-request ::=
+        SEQUENCE {
+            action-result
+                Action-Result
+                DEFAULT success,
+
+            diagnostic
+                Diagnostic
+                OPTIONAL
+        }
+
+F-P-ABORT-request ::=
+        SEQUENCE {
+            action-result
+                Action-Result
+                DEFAULT success,
+
+            diagnostic
+                Diagnostic
+                OPTIONAL
+        }
+
+
+-- File selection and file open regime PDUs
+
+File-PDU ::=
+        CHOICE {
+            f-select-request[6]
+                IMPLICIT F-SELECT-request,
+
+            f-select-response[7]
+                IMPLICIT F-SELECT-response,
+
+            f-deselect-request[8]
+                IMPLICIT F-DESELECT-request,
+
+            f-deselect-response[9]
+                IMPLICIT F-DESELECT-response,
+
+            f-create-request[10]
+                IMPLICIT F-CREATE-request,
+
+            f-create-response[11]
+                IMPLICIT F-CREATE-response,
+
+            f-delete-request[12]
+                IMPLICIT F-DELETE-request,
+
+            f-delete-response[13]
+                IMPLICIT F-DELETE-response,
+
+            f-read-attrib-request[14]
+                IMPLICIT F-READ-ATTRIB-request,
+
+            f-read-attrib-response[15]
+                IMPLICIT F-READ-ATTRIB-response,
+
+            f-change-attrib-request[16]
+                IMPLICIT F-CHANGE-ATTRIB-request,
+
+            f-change-attrib-response[17]
+                IMPLICIT F-CHANGE-ATTRIB-response,
+
+            f-open-request[18]
+                IMPLICIT F-OPEN-request,
+
+            f-open-response[19]
+                IMPLICIT F-OPEN-response,
+
+            f-close-request[20]
+                IMPLICIT F-CLOSE-request,
+
+            f-close-response[21]
+                IMPLICIT F-CLOSE-response,
+
+            f-begin-group-request[22]
+                IMPLICIT F-BEGIN-GROUP-request,
+
+            f-begin-group-response[23]
+                IMPLICIT F-BEGIN-GROUP-response,
+
+            f-end-group-request[24]
+                IMPLICIT F-END-GROUP-request,
+
+            f-end-group-response[25]
+                IMPLICIT F-END-GROUP-response,
+
+            f-recover-request[26]
+                IMPLICIT F-RECOVER-request,
+
+            f-recover-response[27]
+                IMPLICIT F-RECOVER-response,
+
+            f-locate-request[28]
+                IMPLICIT F-LOCATE-request,
+
+            f-locate-response[29]
+                IMPLICIT F-LOCATE-response,
+
+            f-erase-request[30]
+                IMPLICIT F-ERASE-request,
+
+            f-erase-response[31]
+                IMPLICIT F-ERASE-response
+        }
+
+F-SELECT-request ::=
+        SEQUENCE {
+            attributes
+                Select-Attributes,
+
+            requested-access
+                Access-Request,
+
+            access-passwords
+                Access-Passwords
+                OPTIONAL,
+
+            concurrency-control
+                Concurrency-Control
+                OPTIONAL,
+
+            shared-ASE-information
+                Shared-ASE-Information
+                OPTIONAL,
+
+            account
+                Account
+                OPTIONAL
+        }
+
+F-SELECT-response ::=
+        SEQUENCE {
+            state-result
+                State-Result
+                DEFAULT success,
+
+            action-result
+                Action-Result
+                DEFAULT success,
+
+            attributes
+                Select-Attributes,
+
+            shared-ASE-information
+                Shared-ASE-Information
+                OPTIONAL,
+
+            diagnostic
+                Diagnostic
+                OPTIONAL
+        }
+
+F-DESELECT-request ::=
+        SEQUENCE {
+            shared-ASE-information
+                Shared-ASE-Information
+                OPTIONAL
+        }
+
+F-DESELECT-response ::=
+        SEQUENCE {
+            action-result
+                Action-Result
+                DEFAULT success,
+
+            charging
+                Charging
+                OPTIONAL,
+               -- present if and only if the account field was present on the
+               -- PDU which established the selection regime
+
+            shared-ASE-information
+                Shared-ASE-Information
+                OPTIONAL,
+
+            diagnostic
+                Diagnostic
+                OPTIONAL
+        }
+
+F-CREATE-request ::=
+        SEQUENCE {
+            override[0]
+                IMPLICIT INTEGER {
+                    create-failure(0),
+                    select-old-file(1),
+                    delete-and-create-with-old-attributes(2),
+                    delete-and-create-with-new-attributes(3)
+                }
+                DEFAULT create-failure,
+
+            initial-attributes
+                Create-Attributes,
+
+            create-password
+                Password
+                OPTIONAL,
+               -- present is an additional password to the filestore
+               -- password is required to allow the file creation
+
+            requested-access
+                Access-Request,
+
+            access-passwords
+                Access-Passwords
+                OPTIONAL,
+               -- present only if required to satisfy access control
+               -- requirement on existing file
+
+            concurrency-control
+                Concurrency-Control
+                OPTIONAL,
+
+            shared-ASE-information
+                Shared-ASE-Information
+                OPTIONAL,
+
+            account
+                Account
+                OPTIONAL
+        }
+
+F-CREATE-response ::=
+        SEQUENCE {
+            state-result
+                State-Result
+                DEFAULT success,
+
+            action-result
+                Action-Result
+                DEFAULT success,
+
+            initial-attributes
+                Create-Attributes,
+
+            shared-ASE-information
+                Shared-ASE-Information
+                OPTIONAL,
+
+            diagnostic
+                Diagnostic
+                OPTIONAL
+        }
+
+F-DELETE-request ::=
+        SEQUENCE {
+            shared-ASE-information
+                Shared-ASE-Information
+                OPTIONAL
+        }
+
+F-DELETE-response ::=
+        SEQUENCE {
+            action-result
+                Action-Result
+                DEFAULT success,
+
+            shared-ASE-information
+                Shared-ASE-Information
+                OPTIONAL,
+
+            charging
+                Charging
+                OPTIONAL,
+
+            diagnostic
+                Diagnostic
+                OPTIONAL
+        }
+
+F-READ-ATTRIB-request ::=
+        SEQUENCE {
+            attribute-names[0]
+                IMPLICIT Attribute-Names
+       }
+
+Attribute-Names ::=
+       BIT STRING {
+           -- Kernel group
+               read-filename(0),
+               read-permitted-actions(1),
+               read-content-types(2),
+           -- Storage group
+               read-storage-account(3),
+               read-date-and-time-of-creation(4),
+               read-date-and-time-of-last-modification(5),
+               read-date-and-time-of-last-read-access(6),
+               read-date-and-time-of-last-attribute-modification(7),
+               read-identity-of-creator(8),
+               read-identity-of-last-modifier(9),
+               read-identity-of-last-reader(10),
+               read-identity-of-last-attribute-modifier(11),
+               read-file-availability(12),
+               read-filesize(13),
+               read-future-filesize(14),
+           -- Security group
+               read-access-control(15),
+               read-legal-qualifications(16),
+           -- Private group
+               read-private-use(17)
+       }
+
+F-READ-ATTRIB-response ::=
+        SEQUENCE {
+            action-result
+                Action-Result
+                DEFAULT success,
+
+            attributes
+                Read-Attributes
+               OPTIONAL,
+               -- Password values within access control can not be read by
+               -- means of the read attribute action.  Whether other parts of
+               -- the access control file attribute can be read by means of
+               -- the read attribute is defined locally by the responding
+               -- entity, and it shall not be the subject of conformance test
+
+            diagnostic
+                Diagnostic
+                OPTIONAL
+        }
+
+F-CHANGE-ATTRIB-request ::=
+        SEQUENCE {
+            attributes
+                Change-Attributes
+        }
+
+F-CHANGE-ATTRIB-response ::=
+        SEQUENCE {
+            action-result
+                Action-Result
+                DEFAULT success,
+
+            attributes
+                Change-Attributes
+               OPTIONAL,
+               -- Password values within access control attribute are never
+               -- returned.  Other attributes are returned as an
+               -- implementation choice
+
+            diagnostic
+                Diagnostic
+                OPTIONAL
+        }
+
+F-OPEN-request ::=
+        SEQUENCE {
+            processing-mode[0]
+                IMPLICIT BIT STRING {
+                    f-read(0),
+                    f-insert(1),
+                    f-replace(2),
+                    f-extend(3),
+                    f-erase(4)
+                }
+                DEFAULT { f-read },
+
+            contents-type[1]
+                CHOICE {
+                    unknown[0]
+                        IMPLICIT NULL,
+
+                    proposed[1]
+                        Contents-Type-Attribute
+                },
+
+            concurrency-control
+                Concurrency-Control
+                OPTIONAL,
+
+            shared-ASE-information
+                Shared-ASE-Information
+                OPTIONAL,
+
+            enable-fadu-locking[2]
+                IMPLICIT BOOLEAN
+                DEFAULT FALSE,
+
+            activity-identifier
+                Activity-Identifier
+                   OPTIONAL,
+               -- only used in the recovery functional unit
+
+            recovery-mode[3]
+                IMPLICIT INTEGER {
+                    none(0),
+                    at-start-of-file(1),
+                    at-any-active-checkpoint(2)
+                }
+                DEFAULT none,
+
+            remove-contexts[4]
+                IMPLICIT SET OF
+                    Abstract-Syntax-Name
+                OPTIONAL,
+
+            define-contexts[5]
+                IMPLICIT SET OF
+                    Abstract-Syntax-Name
+                OPTIONAL
+        }
+
+F-OPEN-response ::=
+        SEQUENCE {
+            state-result
+                State-Result
+                DEFAULT success,
+
+            action-result
+                Action-Result
+                DEFAULT success,
+
+            contents-type[1]
+                Contents-Type-Attribute,
+
+            concurrency-control
+                Concurrency-Control
+                OPTIONAL,
+
+            shared-ASE-information
+                Shared-ASE-Information
+                OPTIONAL,
+
+            diagnostic
+                Diagnostic
+                OPTIONAL,
+
+            recovery-mode[3]
+                IMPLICIT INTEGER {
+                    none(0),
+                    at-start-of-file(1),
+                    at-any-active-checkpoint(2)
+                }
+                DEFAULT none,
+
+            presentation-action[6]
+                IMPLICIT BOOLEAN
+                DEFAULT FALSE
+               -- this flag is set if the responder is going to follow this
+               -- response by a P-ALTER-CONTEXT exchange
+        }
+
+F-CLOSE-request ::=
+        SEQUENCE {
+            action-result
+                Action-Result
+                DEFAULT success,
+
+            shared-ASE-information
+                Shared-ASE-Information
+                OPTIONAL,
+
+            diagnostic
+                Diagnostic
+                OPTIONAL
+        }
+
+F-CLOSE-response ::=
+        SEQUENCE {
+            action-result
+                Action-Result
+                DEFAULT success,
+
+            shared-ASE-information
+                Shared-ASE-Information
+                OPTIONAL,
+
+            diagnostic
+                Diagnostic
+                OPTIONAL
+        }
+
+F-BEGIN-GROUP-request ::=
+        SEQUENCE {
+            threshold[0]
+                IMPLICIT INTEGER
+        }
+
+F-BEGIN-GROUP-response ::=
+        SEQUENCE {}
+        -- No elements defined, shall be empty
+
+F-END-GROUP-request ::=
+        SEQUENCE {}
+        -- No elements defined, shall be empty
+
+F-END-GROUP-response ::=
+        SEQUENCE {}
+        -- No elements defined, shall be empty
+
+F-RECOVER-request ::=
+        SEQUENCE {
+            activity-identifier
+                Activity-Identifier,
+
+            bulk-transfer-number[0]
+                IMPLICIT INTEGER,
+
+            requested-access
+                Access-Request,
+
+            access-passwords
+                Access-Passwords
+                OPTIONAL,
+
+            recovery-point[2]
+                IMPLICIT INTEGER
+                DEFAULT 0,
+               -- zero indicates beginning of file
+               -- point after last checkpoint indicates end of file
+
+            remove-contexts[3]
+                IMPLICIT SET OF
+                    Abstract-Syntax-Name
+                OPTIONAL,
+
+            define-contexts[4]
+                IMPLICIT SET OF
+                    Abstract-Syntax-Name
+                OPTIONAL
+        }
+
+F-RECOVER-response ::=
+        SEQUENCE {
+            state-result
+                State-Result
+                DEFAULT success,
+
+            action-result
+                Action-Result
+                DEFAULT success,
+
+            contents-type[1]
+                Contents-Type-Attribute,
+
+            recovery-point[2]
+                IMPLICIT INTEGER
+                DEFAULT 0,
+               -- zero indicates beginning of file
+               -- point after last checkpoint indicates end of file
+
+            diagnostic
+                Diagnostic
+                OPTIONAL,
+
+            presentation-action[6]
+                IMPLICIT BOOLEAN
+                DEFAULT FALSE
+               -- this flag is set if the responder is going to follow this
+               -- response by a P-ALTER-CONTEXT exchange
+        }
+
+F-LOCATE-request ::=
+        SEQUENCE {
+            file-access-data-unit-identity
+                FADU-Identity,
+
+            fadu-lock
+                FADU-Lock
+                OPTIONAL
+        }
+
+F-LOCATE-response ::=
+        SEQUENCE {
+            action-result
+                Action-Result
+                DEFAULT success,
+
+            file-access-data-unit-identity
+                FADU-Identity
+                OPTIONAL,
+
+            diagnostic
+                Diagnostic
+                OPTIONAL
+        }
+
+F-ERASE-request ::=
+        SEQUENCE {
+            file-access-data-unit-identity
+                FADU-Identity
+        }
+
+F-ERASE-response ::=
+        SEQUENCE {
+            action-result
+                Action-Result
+                DEFAULT success,
+
+            diagnostic
+                Diagnostic
+                OPTIONAL
+        }
+
+
+-- Bulk data transfer PDUs
+    
+Bulk-Data-PDU ::=
+        CHOICE {
+            f-read-request[32]
+                IMPLICIT F-READ-request,
+
+            f-write-request[33]
+                IMPLICIT F-WRITE-request,
+
+               -- there is no F-DATA FPDU, the contents of a file are
+               -- transferred in a different presentation context and there is
+               -- therefore no need to define the types of file contents in
+               -- the FTAM PCI abstract syntax.  File contents data are
+               -- carried in the values of the data type Data-Element defined
+               -- in ISO 8571-2
+
+            f-data-end-request[34]
+                IMPLICIT F-DATA-END-request,
+
+            f-transfer-end-request[35]
+                IMPLICIT F-TRANSFER-END-request,
+
+            f-transfer-end-response[36]
+                IMPLICIT F-TRANSFER-END-response,
+
+            f-cancel-request[37]
+                IMPLICIT F-CANCEL-request,
+
+            f-cancel-response[38]
+                IMPLICIT F-CANCEL-response,
+
+               -- there is no F-CHECK PDU
+
+            f-restart-end-request[39]
+                IMPLICIT F-RESTART-END-request,
+
+            f-restart-end-response[40]
+                IMPLICIT F-RESTART-END-response
+        }
+
+F-READ-request ::=
+        SEQUENCE {
+            file-access-data-unit-identity
+                FADU-Identity,
+
+            access-context
+                Access-Context,
+
+            fadu-lock
+                FADU-Lock
+                OPTIONAL
+        }
+
+F-WRITE-request ::=
+        SEQUENCE {
+            file-access-data-unit-operation[0]
+                IMPLICIT INTEGER {
+                    insert(0),
+                    replace(1),
+                    extend(2)
+                },
+
+            file-access-data-unit-identity
+                FADU-Identity,
+
+            fadu-lock
+                FADU-Lock
+                OPTIONAL
+        }
+
+F-DATA-END-request ::=
+        SEQUENCE {
+            action-result
+                Action-Result
+                DEFAULT success,
+
+            diagnostic
+                Diagnostic
+                OPTIONAL
+        }
+
+F-TRANSFER-END-request ::=
+        SEQUENCE {
+            shared-ASE-information
+                Shared-ASE-Information
+                OPTIONAL
+        }
+
+F-TRANSFER-END-response ::=
+        SEQUENCE {
+            action-result
+                Action-Result
+                DEFAULT success,
+
+            shared-ASE-information
+                Shared-ASE-Information
+                OPTIONAL,
+
+            diagnostic
+                Diagnostic
+                OPTIONAL
+        }
+
+F-CANCEL-request ::=
+        SEQUENCE {
+            action-result
+                Action-Result
+                DEFAULT success,
+
+            shared-ASE-information
+                Shared-ASE-Information
+                OPTIONAL,
+
+            diagnostic
+                Diagnostic
+                OPTIONAL
+        }
+
+F-CANCEL-response ::=
+        SEQUENCE {
+            action-result
+                Action-Result
+                DEFAULT success,
+
+            shared-ASE-information
+                Shared-ASE-Information
+                OPTIONAL,
+
+            diagnostic
+                Diagnostic
+                OPTIONAL
+        }
+
+F-RESTART-END-request ::=
+        SEQUENCE {
+            checkpoint-identifier[0]
+                IMPLICIT INTEGER
+        }
+
+F-RESTART-END-response ::=
+        SEQUENCE {
+            checkpoint-identifier[0]
+                IMPLICIT INTEGER
+        }
+
+
+-- application-wide types
+
+Abstract-Syntax-Name ::=
+    [APPLICATION 0]
+        IMPLICIT OBJECT IDENTIFIER
+
+Access-Context ::=
+    [APPLICATION 1]
+        IMPLICIT SEQUENCE {
+            access-context[0]
+                IMPLICIT INTEGER {
+                    hierarchical-all-data-units(0),    -- HA
+                    hierarchical-no-data-units(1),     -- HN
+                    flat-all-data-units(2),            -- FA
+                    flat-one-level-units(3),           -- FL
+                    flat-single-data-units(4),         -- FS
+                    unstructured-all-data-units(5),    -- UA
+                    unstructured-single-data-unit(6)   -- US
+                },
+
+            level-number[1]
+                IMPLICIT INTEGER
+                OPTIONAL
+               -- present if and only if flat-one-level-data-units
+               -- (access context FL) is selected
+        }
+       -- as defined in ISO 8571-2
+
+Access-Passwords ::=
+    [APPLICATION 2]
+        IMPLICIT SEQUENCE {
+            read-password[0]
+                IMPLICIT Password,
+
+            insert-password[1]
+                IMPLICIT Password,
+
+            replace-password[2]
+                IMPLICIT Password,
+
+            extend-password[3]
+                IMPLICIT Password,
+
+            erase-password[4]
+                IMPLICIT Password,
+
+            read-attribute-password[5]
+                IMPLICIT Password,
+
+            change-attribute-password[6]
+                IMPLICIT Password,
+
+            delete-password[7]
+                IMPLICIT Password
+        }
+
+Access-Request ::=
+    [APPLICATION 3]
+        IMPLICIT BIT STRING {
+            read(0),
+            insert(1),
+            replace(2),
+            extend(3),
+            erase(4),
+            read-attribute(5),
+            change-attribute(6),
+            delete(7)
+        }
+
+Account ::=
+    [APPLICATION 4]
+        IMPLICIT GraphicString
+
+Action-Result ::=
+    [APPLICATION 5]
+        IMPLICIT INTEGER {
+            success(0),
+            transient-error(1),
+            permanent-error(2)
+        }
+
+Activity-Identifier ::=
+    [APPLICATION 6]
+        IMPLICIT INTEGER
+
+Application-Entity-Title ::=
+    [APPLICATION 7]
+        --* ACSE-1 *-- ACS.AE-title
+
+Change-Attributes ::=
+    [APPLICATION 8]
+        IMPLICIT --* SEQUENCE { *-- Read-Attributes
+       -- Kernel group
+--*         filename[0] *--
+--*             IMPLICIT Filename-Attribute *--
+--*             OPTIONAL, *--
+
+       -- Storage group
+--*         storage-account[3] *--
+--*             Account-Attribute *--
+--*             OPTIONAL, *--
+
+--*         file-availability[12] *--
+--*             File-Availability-Attribute *--
+--*             OPTIONAL, *--
+
+--*         future-filesize[14] *--
+--*             Filesize-Attribute *--
+--*             OPTIONAL, *--
+
+       -- Security group
+--*         access-control[15] *--
+--*             Access-Control-Change-Attribute *--
+--*             OPTIONAL, *--
+
+--*         legal-qualification[16] *--
+--*             Legal-Qualification-Attribute *--
+--*             OPTIONAL, *--
+
+       -- Private group
+--*         private-use[17] *--
+--*             Private-Use-Attribute *--
+--*             OPTIONAL *--
+--*     } *--
+
+Charging ::=
+    [APPLICATION 9]
+        IMPLICIT SEQUENCE OF
+            SEQUENCE %[ charge_element $ charge %] {
+                resource-identifier[0]
+                    IMPLICIT GraphicString,
+
+                charging-unit[1]
+                    IMPLICIT GraphicString,
+
+                charging-value[2]
+                    IMPLICIT INTEGER
+            }
+
+Concurrency-Control ::=
+    [APPLICATION 10]
+        IMPLICIT SEQUENCE {
+            read[0]
+                IMPLICIT Lock,
+
+            insert[1]
+                IMPLICIT Lock,
+
+            replace[2]
+                IMPLICIT Lock,
+
+            extend[3]
+                IMPLICIT Lock,
+
+            erase[4]
+                IMPLICIT Lock,
+
+            read-attribute[5]
+                IMPLICIT Lock,
+
+            change-attribute[6]
+                IMPLICIT Lock,
+
+            delete[7]
+                IMPLICIT Lock
+        }
+
+Lock ::=
+        INTEGER {
+            not-required(0),
+            shared(1),
+            exclusive(2),
+            no-access(3)
+        }
+
+Constraint-Set-Name ::=
+    [APPLICATION 11]
+        IMPLICIT OBJECT IDENTIFIER
+
+Create-Attributes ::=
+    [APPLICATION 12]
+        IMPLICIT --* SEQUENCE { *-- Read-Attributes
+       -- Kernel group
+--*         filename[0] *--
+--*             IMPLICIT Filename-Attribute, *--
+
+--*         permitted-actions[1] *--
+--*             IMPLICIT Permitted-Actions-Attribute, *--
+
+--*         contents-type[2] *--
+--*             Contents-Type-Attribute, *--
+
+       -- Storage group
+--*         storage-account[3] *--
+--*             Account-Attribute *--
+--*             OPTIONAL, *--
+
+--*         file-availability[12] *--
+--*             File-Availability-Attribute *--
+--*             OPTIONAL, *--
+
+--*         future-filesize[14] *--
+--*             Filesize-Attribute *--
+--*             OPTIONAL, *--
+
+       -- Security group
+--*         access-control[15] *--
+--*             Access-Control-Change-Attribute *--
+--*             OPTIONAL, *--
+
+--*         legal-qualification[16] *--
+--*             Legal-Qualification-Attribute *--
+--*             OPTIONAL, *--
+
+       -- Private group
+--*         private-use[17] *--
+--*             Private-Use-Attribute *--
+--*             OPTIONAL *--
+--*     } *--
+
+Diagnostic ::=
+    [APPLICATION 13]
+        IMPLICIT SEQUENCE OF
+            SEQUENCE %[ diag_element $ diagnostic %] {
+                diagnostic-type[0]
+                    IMPLICIT INTEGER {
+                        informative(0),
+                        transient(1),
+                        permanent(2)
+                    },
+
+                error-identifier[1]
+                    IMPLICIT INTEGER,
+                   -- as defined in ISO 8571-3
+
+                error-observer[2]
+                    IMPLICIT Entity-Reference,
+
+                error-source[3]
+                    IMPLICIT Entity-Reference,
+
+                suggested-delay[4]
+                    IMPLICIT INTEGER
+                    OPTIONAL,
+
+                further-details[5]
+                    IMPLICIT GraphicString
+                    OPTIONAL
+            }
+
+Entity-Reference ::=
+        INTEGER {
+            no-categorization-possible(0),
+            initiating-file-service-user(1),
+            initiating-file-protocol-machine(2),
+            service-supporting-the-file-protocol-machine(3),
+            responding-file-protocol-machine(4),
+            responding-file-service-user(5)
+        }
+       -- Note
+       --      1. The values 0 and 3 are only valid as values in error-source
+       --
+       --      2. The vaule 5 corresponds to the virtual filestore
+
+Document-Type-Name ::=
+    [APPLICATION 14]
+        IMPLICIT OBJECT IDENTIFIER
+
+FADU-Identity ::=
+    [APPLICATION 15]
+        CHOICE {
+            first-last[0]
+                IMPLICIT INTEGER {
+                    first(0),
+                    last(1)
+                },
+
+            relative[1]
+                IMPLICIT INTEGER {
+                    previous(0),
+                    current(1),
+                    next(2)
+                },
+
+            begin-end[2]
+                IMPLICIT INTEGER {
+                    begin(0),
+                    end(1)
+                },
+
+            single-name[3]
+                IMPLICIT Node-Name,
+
+            name-list[4]
+                IMPLICIT SEQUENCE OF %[ name_element %] 
+                    Node-Name,
+
+            fadu-number[5]
+                IMPLICIT INTEGER
+        }
+
+Node-Name ::=
+        --* EXTERNAL *-- FADU.Node-Name
+       -- the type to be used for Node-Name is defined in ISO8571-FADU
+
+FADU-Lock ::=
+    [APPLICATION 16]
+        IMPLICIT INTEGER {
+            off(0),
+            on(1)
+        }
+
+Password ::=
+    [APPLICATION 17]
+        CHOICE {
+           graphic --* *--
+                GraphicString,
+
+           binary --* *--
+                OCTET STRING
+        }
+
+Read-Attributes ::=
+    [APPLICATION 18]
+        IMPLICIT SEQUENCE {
+       -- Kernel group
+            filename[0]
+                IMPLICIT Filename-Attribute
+                OPTIONAL,
+
+            permitted-actions[1]
+                IMPLICIT Permitted-Actions-Attribute
+                OPTIONAL,
+
+            contents-type[2]
+                Contents-Type-Attribute
+                OPTIONAL,
+
+       -- Storage group
+            storage-account[3]
+                Account-Attribute
+                OPTIONAL,
+
+            date-and-time-of-creation[4]
+                Date-and-Time-Attribute
+                OPTIONAL,
+
+            date-and-time-of-last-modification[5]
+                Date-and-Time-Attribute
+                OPTIONAL,
+
+            date-and-time-of-last-read-access[6]
+                Date-and-Time-Attribute
+                OPTIONAL,
+
+            date-and-time-of-last-attribute-modification[7]
+                Date-and-Time-Attribute
+                OPTIONAL,
+
+            identity-of-creator[8]
+                User-Identity-Attribute
+                OPTIONAL,
+
+            identity-of-last-modifier[9]
+                User-Identity-Attribute
+                OPTIONAL,
+
+            identity-of-last-reader[10]
+                User-Identity-Attribute
+                OPTIONAL,
+
+            identity-of-last-attribute-modifier[11]
+                User-Identity-Attribute
+                OPTIONAL,
+
+            file-availability[12]
+                File-Availability-Attribute
+                OPTIONAL,
+
+            filesize[13]
+                Filesize-Attribute
+                OPTIONAL,
+
+            future-filesize[14]
+                Filesize-Attribute
+                OPTIONAL,
+
+       -- Security group
+            access-control[15]
+                Access-Control-Attribute
+                OPTIONAL,
+
+            legal-qualification[16]
+                Legal-Qualification-Attribute
+                OPTIONAL,
+
+       -- Private group
+           private-use[17]
+               Private-Use-Attribute
+               OPTIONAL
+        }
+
+Select-Attributes ::=
+    [APPLICATION 19]
+        IMPLICIT --* SEQUENCE { *-- Read-Attributes
+       -- Kernel group
+--*         filename[0] *--
+--*             IMPLICIT Filename-Attribute *--
+--*     } *--
+
+Shared-ASE-Information ::=
+    [APPLICATION 20]
+        IMPLICIT EXTERNAL
+
+State-Result ::=
+    [APPLICATION 21]
+        IMPLICIT INTEGER {
+            success(0),
+            failure(1)
+        }
+
+User-Identity ::=
+    [APPLICATION 22]
+        IMPLICIT GraphicString
+
+
+-- file attribute types
+
+Access-Control-Attribute ::=
+        CHOICE {
+            no-value-available[0]
+                IMPLICIT NULL,
+               -- indicates partial support of this attribute.
+               -- this value shall only appear in response PDUs
+
+            actual-values[1]
+                IMPLICIT --* SET OF *-- Access-Control-List
+                    --* Access-Control-Element
+        }
+       -- the semantics of this attribute is described in ISO 8571-2
+
+Access-Control-Change-Attribute ::=
+        CHOICE {
+            no-value-available[0]
+                IMPLICIT NULL,
+               -- indicates partial support of this attribute.
+               -- this value shall only appear in response PDUs
+
+            actual-values[1]
+                IMPLICIT SEQUENCE {
+                    insert-values[0]
+                        IMPLICIT --* SET OF *-- Access-Control-List
+                            --* Access-Control-Element
+                        OPTIONAL,
+                       -- this field is used by the change attribute action to
+                       -- indicate new values to be inserted in the access
+                       -- control file attribute
+
+                    delete-values[1]
+                        IMPLICIT --* SET OF *-- Access-Control-List
+                            --* Access-Control-Element
+                        OPTIONAL
+                       -- this field is used by the change attribute action to
+                       -- indicate old values to be removed in the access
+                       -- control file attribute
+                }
+        }
+
+Access-Control-List ::= --* *--
+        SET OF --* *--
+           Access-Control-Element --* *--
+
+Access-Control-Element ::=
+        SEQUENCE {
+            action-list[0]
+                IMPLICIT Access-Request,
+
+            concurrency-access[1]
+                IMPLICIT Concurrency-Access
+                OPTIONAL,
+
+            identity[2]
+                IMPLICIT User-Identity
+                OPTIONAL,
+
+            passwords[3]
+                IMPLICIT Access-Passwords
+                OPTIONAL,
+
+            location[4]
+                IMPLICIT Application-Entity-Title
+                OPTIONAL
+        }
+
+Concurrency-Access ::=
+        SEQUENCE {
+            read[0]
+                IMPLICIT Concurrency-Key,
+
+            insert[1]
+                IMPLICIT Concurrency-Key,
+
+            replace[2]
+                IMPLICIT Concurrency-Key,
+
+            extend[3]
+                IMPLICIT Concurrency-Key,
+
+            erase[4]
+                IMPLICIT Concurrency-Key,
+
+            read-attribute[5]
+                IMPLICIT Concurrency-Key,
+
+            change-attribute[6]
+                IMPLICIT Concurrency-Key,
+
+            delete[7]
+                IMPLICIT Concurrency-Key
+        }
+
+Concurrency-Key ::=
+        BIT STRING {
+            not-required(0),
+            shared(1),
+            exclusive(2),
+            no-access(3)
+        }
+
+Account-Attribute ::=
+        CHOICE {
+            no-value-available[0]
+                IMPLICIT NULL,
+               -- indicates partial support of this attribute.
+               -- this value shall only appear in response PDUs
+
+            actual-values
+                Account
+        }
+
+Contents-Type-Attribute ::=
+--*     CHOICE { *--
+            --* document-type *--[0]
+                IMPLICIT SEQUENCE {
+                    document-type-name
+                        Document-Type-Name,
+
+                    parameter[0]
+                        ANY
+                        OPTIONAL
+                } --* , *--
+               -- the actual types to be used for values of the parameter
+               -- field are defined in the named document type
+
+--*         constraint-set-and-abstract-syntax[1] *--
+--*             IMPLICIT SEQUENCE { *--
+--*                 constraint-set-name *--
+--*                     Constraint-Set-Name, *--
+
+--*                 abstract-syntax-name *--
+--*                     Abstract-Syntax-Name *--
+--*             } *--
+--*     } *--
+
+Date-and-Time-Attribute ::=
+        CHOICE {
+            no-value-available[0]
+                IMPLICIT NULL,
+               -- indicates partial support of this attribute.
+               -- this value shall only appear in response PDUs
+
+            actual-values[1]
+                IMPLICIT GeneralizedTime
+        }
+
+File-Availability-Attribute ::=
+        CHOICE {
+            no-value-available[0]
+                IMPLICIT NULL,
+               -- indicates partial support of this attribute.
+               -- this value shall only appear in response PDUs
+
+            actual-values[1]
+                IMPLICIT INTEGER {
+                    immediate-availability(0),
+                    deferred-availability(1)
+                }
+        }
+
+Filename-Attribute ::=
+        SEQUENCE OF
+            GraphicString
+
+Filesize-Attribute ::=
+        CHOICE {
+            no-value-available[0]
+                IMPLICIT NULL,
+               -- indicates partial support of this attribute.
+               -- this value shall only appear in response PDUs
+
+            actual-values[1]
+                IMPLICIT INTEGER
+        }
+
+Legal-Qualification-Attribute ::=
+        CHOICE {
+            no-value-available[0]
+                IMPLICIT NULL,
+               -- indicates partial support of this attribute.
+               -- this value shall only appear in response PDUs
+
+            actual-values[1]
+                IMPLICIT GraphicString
+        }
+
+Permitted-Actions-Attribute ::=
+        BIT STRING {
+            read(0),
+            insert(1),
+            replace(2),
+            extend(3),
+            erase(4),
+            read-attribute(5),
+            change-attribute(6),
+            delete-file(7),
+       -- FADU-Identity groups available
+            traversal(8),
+            reverse-traversal(9),
+            random-order(10)
+        }
+
+Private-Use-Attribute ::=
+        CHOICE {
+            no-value-available[0]
+                IMPLICIT NULL,
+               -- indicates partial support of this attribute.
+               -- this value shall only appear in response PDUs
+
+            abstract-syntax-not-supported[1]
+                IMPLICIT NULL,
+               -- indicates that abstract syntax is not available
+
+            actual-values[2]
+                IMPLICIT EXTERNAL
+        }
+
+User-Identity-Attribute ::=
+        CHOICE {
+            no-value-available[0]
+                IMPLICIT NULL,
+               -- indicates partial support of this attribute.
+               -- this value shall only appear in response PDUs
+
+            actual-values
+                User-Identity
+        }
+
+END
diff --git a/usr/src/contrib/isode/ftam/ftamabort.c b/usr/src/contrib/isode/ftam/ftamabort.c
new file mode 100644 (file)
index 0000000..2c9def1
--- /dev/null
@@ -0,0 +1,158 @@
+/* ftamabort.c - FPM: user abort */
+
+#ifndef        lint
+static char *rcsid = "$Header: /f/osi/ftam/RCS/ftamabort.c,v 7.1 91/02/22 09:22:32 mrose Interim $";
+#endif
+
+/* 
+ * $Header: /f/osi/ftam/RCS/ftamabort.c,v 7.1 91/02/22 09:22:32 mrose Interim $
+ *
+ *
+ * $Log:       ftamabort.c,v $
+ * Revision 7.1  91/02/22  09:22:32  mrose
+ * Interim 6.8
+ * 
+ * Revision 7.0  89/11/23  21:53:19  mrose
+ * Release 6.0
+ * 
+ */
+
+/*
+ *                               NOTICE
+ *
+ *    Acquisition, use, and distribution of this module and related
+ *    materials are subject to the restrictions of a license agreement.
+ *    Consult the Preface in the User's Manual for the full terms of
+ *    this agreement.
+ *
+ */
+
+
+/* LINTLIBRARY */
+
+#include <stdio.h>
+#include <signal.h>
+#include "fpkt.h"
+
+/* \f   F-U-ABORT.REQUEST */
+
+int    FUAbortRequest (sd, action, diag, ndiag, fti)
+int    sd;
+int    action;
+struct FTAMdiagnostic diag[];
+int    ndiag;
+struct FTAMindication *fti;
+{
+    SBV            smask;
+    int     result;
+    register struct ftamblk *fsb;
+
+    switch (action) {
+       case FACTION_SUCCESS: 
+       case FACTION_TRANS: 
+       case FACTION_PERM: 
+           break;
+
+       default: 
+           return ftamlose (fti, FS_GEN_NOREASON, 0, NULLCP,
+                   "bad value for action parameter");
+    }
+    toomuchP (diag, ndiag, NFDIAG, "diagnostic");
+
+    smask = sigioblock ();
+
+    ftamPsig (fsb, sd);
+
+    result = FAbortRequestAux (fsb, type_FTAM_PDU_f__u__abort__request, action,
+                              diag, ndiag, fti);
+
+    (void) sigiomask (smask);
+
+    return result;
+}
+
+/* \f */
+
+int    FAbortRequestAux (fsb, id, action, diag, ndiag, fti)
+register struct ftamblk *fsb;
+int    id,
+       action;
+struct FTAMdiagnostic diag[];
+int    ndiag;
+struct FTAMindication *fti;
+{
+    int     result;
+    PE     pe;
+    struct AcSAPindication  acis;
+    register struct AcSAPindication *aci = &acis;
+    register struct AcSAPabort *aca = &aci -> aci_abort;
+    register struct type_FTAM_PDU *pdu;
+    register struct type_FTAM_F__U__ABORT__request *req;
+
+    if ((pdu = (struct type_FTAM_PDU *) calloc (1, sizeof *pdu)) == NULL)
+       goto carry_on;
+    pdu -> offset = id;        /* F-P-ABORT-request is identical... */
+    if ((req = (struct type_FTAM_F__U__ABORT__request *)
+                       calloc (1, sizeof *req)) == NULL)
+       goto carry_on;
+    pdu -> un.f__u__abort__request = req;
+    if ((req -> action__result =
+                       (struct type_FTAM_Action__Result *)
+                                  calloc (1, sizeof *req -> action__result))
+                   == NULL)
+       goto carry_on;
+    req -> action__result -> parm = action;
+    if (ndiag > 0
+           && (req -> diagnostic =
+                       diag2fpm (fsb,
+                                 id == type_FTAM_PDU_f__p__abort__request,
+                                 diag, ndiag, fti)) == NULL) {
+       free_FTAM_PDU (pdu);
+       if (fti -> fti_abort.fta_action == FACTION_TRANS)
+           return NOTOK;
+       pdu = NULL;
+    }
+carry_on: ;
+
+    pe = NULLPE;
+    if (pdu) {
+       result = encode_FTAM_PDU (&pe, 1, 0, NULLCP, pdu);
+
+       if (result == NOTOK) {
+           if (pe)
+               pe_free (pe), pe = NULLPE;
+       }
+       else
+           if (pe)
+               pe -> pe_context = fsb -> fsb_id;
+    }
+
+    fsbtrace (fsb,
+       (fsb -> fsb_fd, "A-ABORT.REQUEST",
+        id != type_FTAM_PDU_f__p__abort__request ? "F-U-ABORT-request"
+                                                 : "F-P-ABORT-request",
+        pe, 0));
+
+    result = AcUAbortRequest (fsb -> fsb_fd, pe ? &pe : NULLPEP, pe ? 1 : 0,
+           aci);
+
+    if (pe)
+       pe_free (pe);
+    if (pdu)
+       free_FTAM_PDU (pdu);
+
+    if (result == NOTOK)
+       (void) acs2ftamlose (fsb, fti, "AcUAbortRequest", aca);
+    else {
+       fsb -> fsb_fd = NOTOK;
+       result = OK;
+    }
+
+    if (id != type_FTAM_PDU_f__p__abort__request)
+       freefsblk (fsb);
+    else
+       if (result == OK)
+           fsb -> fsb_fd = NOTOK;
+
+    return result;
+}
diff --git a/usr/src/contrib/isode/ftam/ftamaccess1.c b/usr/src/contrib/isode/ftam/ftamaccess1.c
new file mode 100644 (file)
index 0000000..8e02506
--- /dev/null
@@ -0,0 +1,162 @@
+/* ftamaccess1.c - FPM: initiate file access */
+
+#ifndef        lint
+static char *rcsid = "$Header: /f/osi/ftam/RCS/ftamaccess1.c,v 7.1 91/02/22 09:22:33 mrose Interim $";
+#endif
+
+/* 
+ * $Header: /f/osi/ftam/RCS/ftamaccess1.c,v 7.1 91/02/22 09:22:33 mrose Interim $
+ *
+ *
+ * $Log:       ftamaccess1.c,v $
+ * Revision 7.1  91/02/22  09:22:33  mrose
+ * Interim 6.8
+ * 
+ * Revision 7.0  89/11/23  21:53:20  mrose
+ * Release 6.0
+ * 
+ */
+
+/*
+ *                               NOTICE
+ *
+ *    Acquisition, use, and distribution of this module and related
+ *    materials are subject to the restrictions of a license agreement.
+ *    Consult the Preface in the User's Manual for the full terms of
+ *    this agreement.
+ *
+ */
+
+
+/* LINTLIBRARY */
+
+#include <stdio.h>
+#include <signal.h>
+#include "fpkt.h"
+
+/* \f   F-{LOCATE,ERASE}.REQUEST */
+
+int    FAccessRequest (sd, operation, identity, lock, fti)
+int    sd;
+int    operation;
+struct FADUidentity *identity;
+int    lock;   /* F-LOCATE.REQUEST only */
+struct FTAMindication *fti;
+{
+    SBV      smask;
+    int     result,
+           state;
+    register struct ftamblk *fsb;
+
+    switch (operation) {
+       case FA_OPS_LOCATE: 
+           state = FSB_LOCATE;
+           break;
+
+       case FA_OPS_ERASE: 
+           state = FSB_ERASE;
+           break;
+
+       default: 
+           return ftamlose (fti, FS_GEN_NOREASON, 0, NULLCP,
+                   "bad value for operation parameter");
+    }
+    missingP (identity);
+    missingP (fti);
+
+    smask = sigioblock ();
+
+    ftamPsig (fsb, sd);
+
+    result = FAccessRequestAux (fsb, state, identity, lock, fti);
+
+    (void) sigiomask (smask);
+
+    return result;
+}
+
+/* \f */
+
+static int  FAccessRequestAux (fsb, state, identity, lock, fti)
+register struct ftamblk *fsb;
+int    state;
+struct FADUidentity *identity;
+int    lock;
+struct FTAMindication *fti;
+{
+    int     result;
+    PE     pe;
+    struct PSAPindication   pis;
+    struct PSAPindication  *pi = &pis;
+    struct PSAPabort   *pa = &pi -> pi_abort;
+    register struct type_FTAM_PDU *pdu;
+    register struct type_FTAM_F__LOCATE__request *req;
+
+    if (!(fsb -> fsb_flags & FSB_INIT))
+       return ftamlose (fti, FS_GEN (fsb), 0, NULLCP, "not initiator");
+    if (fsb -> fsb_state != FSB_DATAIDLE)
+       return ftamlose (fti, FS_GEN (fsb), 0, NULLCP, "wrong state");
+    if (!(fsb -> fsb_units & FUNIT_ACCESS))
+       return ftamlose (fti, FS_GEN (fsb), 0, NULLCP,
+                   "file access not allowed");
+
+    pe = NULLPE;
+    if ((pdu = (struct type_FTAM_PDU *) calloc (1, sizeof *pdu)) == NULL) {
+no_mem: ;
+       (void) ftamlose (fti, FS_GEN (fsb), 1, NULLCP, "out of memory");
+out: ;
+       if (pe)
+           pe_free (pe);
+       if (pdu)
+           free_FTAM_PDU (pdu);
+       if (fti -> fti_abort.fta_action == FACTION_PERM)
+           freefsblk (fsb);
+       return NOTOK;
+    }
+                       /* F-ERASE-request is identical... */
+    pdu -> offset = state != FSB_LOCATE ? type_FTAM_PDU_f__erase__request
+                                       : type_FTAM_PDU_f__locate__request;
+    if ((req = (struct type_FTAM_F__LOCATE__request *)
+                       calloc (1, sizeof *req)) == NULL)
+       goto no_mem;
+    pdu -> un.f__locate__request = req;
+    if ((req -> file__access__data__unit__identity =
+                       faduid2fpm (fsb, identity, fti)) == NULL)
+       goto out;
+    if ((fsb -> fsb_units & FUNIT_FADULOCK) && state == FSB_LOCATE) {
+       if ((req -> fadu__lock = (struct type_FTAM_FADU__Lock *)
+                                       calloc (1, sizeof *req -> fadu__lock))
+               == NULL)
+           goto no_mem;
+       req -> fadu__lock -> parm = lock ? int_FTAM_FADU__Lock_on
+                                        : int_FTAM_FADU__Lock_off;
+    }
+
+    if (encode_FTAM_PDU (&pe, 1, 0, NULLCP, pdu) == NOTOK) {
+       (void) ftamlose (fti, FS_GEN (fsb), 1, NULLCP,
+                        "error encoding PDU: %s", PY_pepy);
+       goto out;
+    }
+
+    pe -> pe_context = fsb -> fsb_id;
+
+    fsbtrace (fsb, (fsb -> fsb_fd, "P-DATA.REQUEST",
+                   state == FSB_LOCATE ? "F-LOCATE-request"
+                                       : "F-ERASE-request", pe, 0));
+
+    result = PDataRequest (fsb -> fsb_fd, &pe, 1, pi);
+
+    pe_free (pe);
+    pe = NULLPE;
+    free_FTAM_PDU (pdu);
+    pdu = NULL;
+
+    if (result == NOTOK) {
+       (void) ps2ftamlose (fsb, fti, "PDataRequest", pa);
+       goto out;
+    }
+
+    fsb -> fsb_state = state;
+
+    return FWaitRequestAux (fsb, NOTOK, fti);
+}
diff --git a/usr/src/contrib/isode/ftam/ftamaccess2.c b/usr/src/contrib/isode/ftam/ftamaccess2.c
new file mode 100644 (file)
index 0000000..cee61ee
--- /dev/null
@@ -0,0 +1,189 @@
+/* ftamaccess2.c - FPM: respond to file access */
+
+#ifndef        lint
+static char *rcsid = "$Header: /f/osi/ftam/RCS/ftamaccess2.c,v 7.1 91/02/22 09:22:34 mrose Interim $";
+#endif
+
+/* 
+ * $Header: /f/osi/ftam/RCS/ftamaccess2.c,v 7.1 91/02/22 09:22:34 mrose Interim $
+ *
+ *
+ * $Log:       ftamaccess2.c,v $
+ * Revision 7.1  91/02/22  09:22:34  mrose
+ * Interim 6.8
+ * 
+ * Revision 7.0  89/11/23  21:53:21  mrose
+ * Release 6.0
+ * 
+ */
+
+/*
+ *                               NOTICE
+ *
+ *    Acquisition, use, and distribution of this module and related
+ *    materials are subject to the restrictions of a license agreement.
+ *    Consult the Preface in the User's Manual for the full terms of
+ *    this agreement.
+ *
+ */
+
+
+/* LINTLIBRARY */
+
+#include <stdio.h>
+#include <signal.h>
+#include "fpkt.h"
+
+/* \f   F-{LOCATE,ERASE}.RESPONSE */
+
+int    FAccessResponse (sd, action, identity, diag, ndiag, fti)
+int    sd;
+int    action;
+struct FADUidentity *identity; /* F-LOCATE.RESPONSE only */
+struct FTAMdiagnostic diag[];
+int    ndiag;
+struct FTAMindication *fti;
+{
+    SBV            smask;
+    int     result;
+    register struct ftamblk *fsb;
+
+    switch (action) {
+       case FACTION_SUCCESS: 
+       case FACTION_TRANS: 
+       case FACTION_PERM: 
+           break;
+
+       default: 
+           return ftamlose (fti, FS_GEN_NOREASON, 0, NULLCP,
+                   "bad value for action parameter");
+    }
+    toomuchP (diag, ndiag, NFDIAG, "diagnostic");
+    missingP (fti);
+
+    smask = sigioblock ();
+
+    ftamPsig (fsb, sd);
+
+    result = FAccessResponseAux (fsb, action, identity, diag, ndiag, fti);
+
+    (void) sigiomask (smask);
+
+    return result;
+}
+
+/* \f */
+
+static int  FAccessResponseAux (fsb, action, identity, diag, ndiag, fti)
+register struct ftamblk *fsb;
+int    action;
+struct FADUidentity *identity;
+struct FTAMdiagnostic diag[];
+int    ndiag;
+struct FTAMindication *fti;
+{
+    int     result;
+    PE     pe;
+    struct PSAPindication   pis;
+    struct PSAPindication  *pi = &pis;
+    struct PSAPabort   *pa = &pi -> pi_abort;
+    register struct type_FTAM_PDU *pdu;
+    register struct type_FTAM_F__LOCATE__response *loc;
+    register struct type_FTAM_F__ERASE__response *era;
+
+    if (fsb -> fsb_flags & FSB_INIT)
+       return ftamlose (fti, FS_GEN (fsb), 0, NULLCP, "not responder");
+    switch (fsb -> fsb_state) {
+       case FSB_LOCATE:
+           break;
+
+       case FSB_ERASE:
+           if (identity)
+               return ftamlose (fti, FS_GEN (fsb), 0, NULLCP,
+                           "FADU identity parameter not allowed");
+           break;
+
+       default:
+           return ftamlose (fti, FS_GEN (fsb), 0, NULLCP, "wrong state");
+    }
+
+    pe = NULLPE;
+    if ((pdu = (struct type_FTAM_PDU *) calloc (1, sizeof *pdu)) == NULL) {
+no_mem: ;
+       (void) ftamlose (fti, FS_GEN (fsb), 1, NULLCP, "out of memory");
+out: ;
+       if (pe)
+           pe_free (pe);
+       if (pdu)
+           free_FTAM_PDU (pdu);
+       if (fti -> fti_abort.fta_action == FACTION_PERM)
+           freefsblk (fsb);
+       return NOTOK;
+    }
+    if (fsb -> fsb_state != FSB_LOCATE) {
+       pdu -> offset = type_FTAM_PDU_f__erase__response;
+       if ((era = (struct type_FTAM_F__ERASE__response *)
+                       calloc (1, sizeof *era)) == NULL)
+           goto no_mem;
+       pdu -> un.f__erase__response = era;
+
+       if ((era -> action__result =
+               (struct type_FTAM_Action__Result *)
+                       calloc (1, sizeof *era -> action__result)) == NULL)
+           goto no_mem;
+       era -> action__result -> parm = action;
+       if (ndiag > 0
+               && (era -> diagnostic = diag2fpm (fsb, 0, diag, ndiag, fti))
+                       == NULL)
+           goto out;
+    }
+    else {
+       pdu -> offset = type_FTAM_PDU_f__locate__response;
+       if ((loc = (struct type_FTAM_F__LOCATE__response *)
+                       calloc (1, sizeof *loc)) == NULL)
+           goto no_mem;
+       pdu -> un.f__locate__response = loc;
+
+       if ((loc -> action__result =
+               (struct type_FTAM_Action__Result *)
+                       calloc (1, sizeof *loc -> action__result)) == NULL)
+           goto no_mem;
+       loc -> action__result -> parm = action;
+       if (identity
+               && (loc -> file__access__data__unit__identity =
+                               faduid2fpm (fsb, identity, fti)) == NULL)
+           goto out;
+       if (ndiag > 0
+               && (loc -> diagnostic = diag2fpm (fsb, 0, diag, ndiag, fti))
+                       == NULL)
+           goto out;
+    }
+
+    if (encode_FTAM_PDU (&pe, 1, 0, NULLCP, pdu) == NOTOK) {
+       (void) ftamlose (fti, FS_GEN (fsb), 1, NULLCP,
+                        "error encoding PDU: %s", PY_pepy);
+       goto out;
+    }
+
+    pe -> pe_context = fsb -> fsb_id;
+
+    fsbtrace (fsb, (fsb -> fsb_fd, "P-DATA.REQUEST",
+                   fsb -> fsb_state != FSB_LOCATE ? "F-LOCATE-response"
+                                       : "F-ERASE-response", pe, 0));
+
+    result = PDataRequest (fsb -> fsb_fd, &pe, 1, pi);
+
+    pe_free (pe);
+    pe = NULLPE;
+    free_FTAM_PDU (pdu);
+    pdu = NULL;
+
+    if (result == NOTOK) {
+       (void) ps2ftamlose (fsb, fti, "PDataRequest", pa);
+       goto out;
+    }
+
+    fsb -> fsb_state = FSB_DATAIDLE;
+
+    return OK;
+}
diff --git a/usr/src/contrib/isode/ftam/ftamacl.c b/usr/src/contrib/isode/ftam/ftamacl.c
new file mode 100644 (file)
index 0000000..ed42ab2
--- /dev/null
@@ -0,0 +1,176 @@
+/* ftamacl.c - FPM: encode/decode access control lists (SETs of AC elements) */
+
+#ifndef        lint
+static char *rcsid = "$Header: /f/osi/ftam/RCS/ftamacl.c,v 7.3 91/02/22 09:22:36 mrose Interim $";
+#endif
+
+/* 
+ * $Header: /f/osi/ftam/RCS/ftamacl.c,v 7.3 91/02/22 09:22:36 mrose Interim $
+ *
+ *
+ * $Log:       ftamacl.c,v $
+ * Revision 7.3  91/02/22  09:22:36  mrose
+ * Interim 6.8
+ * 
+ * Revision 7.2  90/08/14  14:27:59  mrose
+ * oops
+ * 
+ * Revision 7.1  90/03/23  10:53:55  mrose
+ * update
+ * 
+ * Revision 7.0  89/11/23  21:53:22  mrose
+ * Release 6.0
+ * 
+ */
+
+/*
+ *                               NOTICE
+ *
+ *    Acquisition, use, and distribution of this module and related
+ *    materials are subject to the restrictions of a license agreement.
+ *    Consult the Preface in the User's Manual for the full terms of
+ *    this agreement.
+ *
+ */
+
+
+/* LINTLIBRARY */
+
+#include <stdio.h>
+#include "fpkt.h"
+
+/* \f */
+
+struct type_FTAM_Access__Control__List *acl2fpm (fsb, fe, fti)
+register struct ftamblk *fsb;
+register struct FTAMacelement *fe;
+struct FTAMindication *fti;
+{
+    struct type_FTAM_Access__Control__List *fpmp;
+    register struct type_FTAM_Access__Control__List  *fpm,
+                                                   **fpc;
+    register struct type_FTAM_Access__Control__Element *ace;
+
+    fpmp = NULL, fpc = &fpmp;
+    for (; fe; fe = fe -> fe_next) {
+       if ((fpm = (struct type_FTAM_Access__Control__List *)
+                       calloc (1, sizeof *fpm)) == NULL) {
+no_mem: ;
+           (void) ftamlose (fti, FS_GEN (fsb), 1, NULLCP, "out of memory");
+out: ;
+           if (fpmp)
+               free_FTAM_Access__Control__List (fpmp);
+           return NULL;
+       }
+       *fpc = fpm, fpc = &fpm -> next;
+
+       if ((ace = (struct type_FTAM_Access__Control__Element *)
+                       calloc (1, sizeof *ace)) == NULL)
+           goto no_mem;
+       fpm -> Access__Control__Element = ace;
+
+       if (fe -> fe_actions & FA_PERM_TRAVERSAL) {
+           (void) ftamlose (fti, FS_GEN (fsb), 0, NULLCP,
+                            "bad value for action-list");
+           goto out;
+       }
+       if ((ace -> action__list = bits2fpm (fsb, frequested_pairs,
+                                            fe -> fe_actions, fti)) == NULL)
+           goto out;
+
+       if (conctl_present (&fe -> fe_concurrency)
+               && (ace -> concurrency__access =
+                               conacc2fpm (fsb, &fe -> fe_concurrency, fti))
+                       == NULL)
+           goto out;
+
+       if (fe -> fe_identity
+               && (ace -> identity = str2qb (fe -> fe_identity,
+                                             strlen (fe -> fe_identity), 1))
+                       == NULL)
+           goto no_mem;
+
+       if (passes_present (&fe -> fe_passwords)
+               && (ace -> passwords = pass2fpm (fsb, &fe -> fe_passwords, fti))
+                       == NULL)
+           goto out;
+
+       if (fe -> fe_aet) {
+           if ((ace -> location = (struct type_ACS_AE__title *)
+                                       calloc (1, sizeof *ace -> location))
+                   == NULL)
+               goto no_mem;
+           if (ace -> location -> title = fe -> fe_aet -> aei_ap_title)
+               ace -> location -> title -> pe_refcnt++;
+           if (ace -> location -> qualifier = fe -> fe_aet -> aei_ae_qualifier)
+               ace -> location -> qualifier -> pe_refcnt++;
+       }
+    }
+
+    return fpmp;
+}
+
+/* \f */
+
+int    fpm2acl (fsb, fpm, fe, fti)
+register struct ftamblk *fsb;
+register struct type_FTAM_Access__Control__List *fpm;
+register struct FTAMacelement **fe;
+struct FTAMindication *fti;
+{
+    register struct FTAMacelement *fc,
+                                **fl;
+    register struct type_FTAM_Access__Control__Element *ace;
+
+    *(fl = fe) = NULL;
+
+    for (; fpm; fpm = fpm -> next) {
+       ace = fpm -> Access__Control__Element;
+
+       if ((fc = (struct FTAMacelement *) calloc (1, sizeof *fc)) == NULL) {
+no_mem: ;
+           (void) ftamlose (fti, FS_GEN (fsb), 1, NULLCP, "out of memory");
+out: ;
+           if (fc = *fl)
+               FEFREE (fc);
+           return NOTOK;
+       }
+       *fe = fc, fe = &fc -> fe_next;
+
+       if (fpm2bits (fsb, frequested_pairs, ace -> action__list,
+                     &fc -> fe_actions, fti) == NOTOK)
+           goto out;
+
+       FCINIT (&fc -> fe_concurrency);
+       if (ace -> concurrency__access
+               && fpm2conacc (fsb, ace -> concurrency__access,
+                              &fc -> fe_concurrency, fti) == NOTOK)
+           goto out;
+
+       if (ace -> identity
+               && (fc -> fe_identity = qb2str (ace -> identity)) == NULL)
+           goto no_mem;
+
+       if (ace -> passwords
+               && fpm2pass (fsb, ace -> passwords, &fc -> fe_passwords, fti)
+                       == NOTOK)
+           goto out;
+
+       if (ace -> location) {
+           if ((fc -> fe_aet = (AEI) calloc (1, sizeof *fc -> fe_aet))
+                   == NULL)
+               goto no_mem;
+           if (ace -> location -> title
+                   && (fc -> fe_aet -> aei_ap_title
+                               = pe_cpy (ace -> location -> title)) == NULLPE)
+               goto no_mem;
+           if (ace -> location -> qualifier
+                   && (fc -> fe_aet -> aei_ae_qualifier
+                               = pe_cpy (ace -> location -> qualifier))
+                           == NULLPE)
+               goto no_mem;
+       }
+    }
+
+    return OK;
+}
diff --git a/usr/src/contrib/isode/ftam/ftamattr.c b/usr/src/contrib/isode/ftam/ftamattr.c
new file mode 100644 (file)
index 0000000..51ba0b9
--- /dev/null
@@ -0,0 +1,542 @@
+/* ftamattr.c - FPM: encode/decode attributes */
+
+#ifndef        lint
+static char *rcsid = "$Header: /f/osi/ftam/RCS/ftamattr.c,v 7.3 91/02/22 09:22:37 mrose Interim $";
+#endif
+
+/* 
+ * $Header: /f/osi/ftam/RCS/ftamattr.c,v 7.3 91/02/22 09:22:37 mrose Interim $
+ *
+ *
+ * $Log:       ftamattr.c,v $
+ * Revision 7.3  91/02/22  09:22:37  mrose
+ * Interim 6.8
+ * 
+ * Revision 7.2  90/10/23  20:41:27  mrose
+ * update
+ * 
+ * Revision 7.1  90/03/23  10:53:58  mrose
+ * update
+ * 
+ * Revision 7.0  89/11/23  21:53:23  mrose
+ * Release 6.0
+ * 
+ */
+
+/*
+ *                               NOTICE
+ *
+ *    Acquisition, use, and distribution of this module and related
+ *    materials are subject to the restrictions of a license agreement.
+ *    Consult the Preface in the User's Manual for the full terms of
+ *    this agreement.
+ *
+ */
+
+
+/* LINTLIBRARY */
+
+#include <stdio.h>
+#include "fpkt.h"
+
+/* \f */
+
+struct type_FTAM_Read__Attributes *attr2fpm (fsb, fa, fti)
+register struct ftamblk *fsb;
+register struct FTAMattributes *fa;
+struct FTAMindication *fti;
+{
+    register int    i;
+    register char  *cp,
+                 **ap;
+    register struct type_FTAM_Read__Attributes *fpm;
+
+    if ((fpm = (struct type_FTAM_Read__Attributes *) calloc (1, sizeof *fpm))
+           == NULL) {
+no_mem: ;
+       (void) ftamlose (fti, FS_GEN (fsb), 1, NULLCP, "out of memory");
+out: ;
+       if (fpm)
+           free_FTAM_Read__Attributes (fpm);
+       return NULL;
+    }
+
+    if (fa -> fa_present & FA_FILENAME) {
+       register struct type_FTAM_Filename__Attribute *fn,
+                                                    **fc;
+
+       if (fa -> fa_novalue & FA_FILENAME) {
+           (void) ftamlose (fti, FS_GEN (fsb), 0, NULLCP,
+                            "filename not present");
+           goto out;
+       }
+
+       if (fa -> fa_nfile > NFFILE) {
+           (void) ftamlose (fti, FS_GEN (fsb), 0, NULLCP,
+                            "too many filenames");
+           goto out;
+       }
+
+       fc = &fpm -> filename;
+       for (ap = fa -> fa_files, i = fa -> fa_nfile - 1; i >= 0; ap++, i--) {
+           if (*ap == NULL) {
+               (void) ftamlose (fti, FS_GEN (fsb), 0, NULLCP,
+                                "empty filename at slot %d",
+                                fa -> fa_nfile - i - 1);
+               goto out;
+           }
+
+           if ((fn = (struct type_FTAM_Filename__Attribute *)
+                               calloc (1, sizeof *fpm -> filename))
+                   == NULL)
+               goto no_mem;
+           *fc = fn;
+
+           if ((fn -> GraphicString = str2qb (*ap, strlen (*ap), 1)) == NULL)
+               goto no_mem;
+
+           fc = &((*fc) -> next);
+       }
+    }
+
+    if (fa -> fa_present & FA_ACTIONS) {
+       if (fa -> fa_novalue & FA_ACTIONS) {
+           (void) ftamlose (fti, FS_GEN (fsb), 0, NULLCP,
+                            "permitted-actions not present");
+           goto out;
+       }
+
+       if ((fpm -> permitted__actions = bits2fpm (fsb, fpermitted_pairs,
+                                                  fa -> fa_permitted, fti))
+               == NULL)
+           goto out;
+    }
+
+    if (fa -> fa_present & FA_CONTENTS) {
+       if (fa -> fa_novalue & FA_CONTENTS) {
+           (void) ftamlose (fti, FS_GEN (fsb), 0, NULLCP,
+                            "contents-type not present");
+           goto out;
+       }
+       if (fa -> fa_contents == NULLOID) {
+           (void) ftamlose (fti, FS_GEN (fsb), 0, NULLCP,
+                            "missing contents-type");
+           goto out;
+       }
+       if ((fpm -> contents__type =
+                   (struct type_FTAM_Contents__Type__Attribute *)
+                           calloc (1, sizeof *fpm -> contents__type)) == NULL
+               || (fpm -> contents__type -> document__type__name =
+                           oid_cpy (fa -> fa_contents)) == NULL)
+           goto no_mem;
+       if (fpm -> contents__type -> parameter = fa -> fa_parameter)
+           fpm -> contents__type -> parameter -> pe_refcnt++;
+    }
+
+    if (fa -> fa_present & FA_ACCOUNT) {
+       if (fa -> fa_account == NULL) {
+           (void) ftamlose (fti, FS_GEN (fsb), 0, NULLCP,
+                            "missing account");
+           goto out;
+       }
+       if ((fpm -> storage__account =
+                   (struct type_FTAM_Account__Attribute *)
+                           calloc (1, sizeof *fpm -> storage__account))
+               == NULL)
+           goto no_mem;
+       if (fa -> fa_novalue & FA_ACCOUNT)
+           fpm -> storage__account -> offset =
+                   type_FTAM_Account__Attribute_no__value__available;
+       else {
+           fpm -> storage__account -> offset =
+                   type_FTAM_Account__Attribute_actual__values;
+           if ((fpm -> storage__account -> un.actual__values =
+                      str2qb (fa -> fa_account, strlen (fa -> fa_account), 1))
+                   == NULL)
+               goto no_mem;
+       }
+    }
+
+#define        dodate(flag,field,tag) \
+    if (fa -> fa_present & flag) { \
+       if ((fpm -> tag = (struct type_FTAM_Date__and__Time__Attribute *) \
+                               calloc (1, sizeof *fpm -> tag)) == NULL) \
+           goto no_mem; \
+       if (fa -> fa_novalue & flag) \
+           fpm -> tag -> offset = \
+                   type_FTAM_Date__and__Time__Attribute_no__value__available;\
+       else { \
+           fpm -> tag -> offset = \
+                   type_FTAM_Date__and__Time__Attribute_actual__values; \
+           if ((cp = gent2str (field)) == NULL \
+                   || (fpm -> tag -> un.actual__values = \
+                               str2qb (cp, strlen (cp), 1)) == NULL) \
+               goto no_mem; \
+       } \
+    }
+    dodate (FA_DATE_CREATE, &fa -> fa_date_create,
+           date__and__time__of__creation);
+    dodate (FA_DATE_MODIFY, &fa -> fa_date_modify,
+           date__and__time__of__last__modification);
+    dodate (FA_DATE_READ, &fa -> fa_date_read,
+           date__and__time__of__last__read__access);
+    dodate (FA_DATE_ATTR, &fa -> fa_date_attribute,
+           date__and__time__of__last__attribute__modification);
+#undef dodate
+
+#define        douser(flag,field,tag,name) \
+    if (fa -> fa_present & flag) { \
+       if ((fpm -> tag = (struct type_FTAM_User__Identity__Attribute *) \
+                               calloc (1, sizeof *fpm -> tag)) == NULL) \
+           goto no_mem; \
+       if (fa -> fa_novalue & flag) \
+           fpm -> tag -> offset = \
+                   type_FTAM_User__Identity__Attribute_no__value__available; \
+       else { \
+           if (field == NULL) { \
+               (void) ftamlose (fti, FS_GEN (fsb), 0, NULLCP, "missing %s", \
+                                name); \
+               goto out; \
+           } \
+           fpm -> tag -> offset = \
+                   type_FTAM_User__Identity__Attribute_actual__values; \
+           if ((fpm -> tag -> un.actual__values = str2qb (field, \
+                                                         strlen (field), 1)) \
+                   == NULL) \
+               goto no_mem; \
+       } \
+    }
+    douser (FA_ID_CREATE, fa -> fa_id_create,
+           identity__of__creator, "identity-of-creator");
+    douser (FA_ID_MODIFY, fa -> fa_id_modify,
+           identity__of__last__modifier, "identity-of-last-modifier");
+    douser (FA_ID_READ, fa -> fa_id_read,
+           identity__of__last__reader, "identity-of-last-reader");
+    douser (FA_ID_ATTR, fa -> fa_id_attribute,
+           identity__of__last__attribute__modifier,
+           "identity-of-last-attribute-modifier");
+#undef douser
+
+    if (fa -> fa_present & FA_AVAILABILITY) {
+       if ((fpm -> file__availability =
+                   (struct type_FTAM_File__Availability__Attribute *)
+                           calloc (1, sizeof *fpm -> file__availability))
+               == NULL)
+           goto no_mem;
+       if (fa -> fa_novalue & FA_AVAILABILITY)
+           fpm -> file__availability -> offset =
+               type_FTAM_File__Availability__Attribute_no__value__available;
+       else {
+           fpm -> file__availability -> offset =
+               type_FTAM_File__Availability__Attribute_actual__values;
+           switch (fa -> fa_availability) {
+               case FA_AVAIL_IMMED:
+               case FA_AVAIL_DEFER:
+                   fpm -> file__availability -> un.actual__values =
+                               fa -> fa_availability;
+                   break;
+
+               default:
+                   (void) ftamlose (fti, FS_GEN (fsb), 0, NULLCP,
+                                    "bad value for file-availability");
+                   goto out;
+           }
+       }
+    }
+
+#define        dosize(flag,field,tag) \
+    if (fa -> fa_present & flag) { \
+       if ((fpm -> tag = (struct type_FTAM_Filesize__Attribute *) \
+                           calloc (1, sizeof *fpm -> tag)) == NULL) \
+           goto no_mem; \
+       if (fa -> fa_novalue & flag) \
+           fpm -> tag -> offset = \
+               type_FTAM_Filesize__Attribute_no__value__available; \
+       else { \
+           fpm -> tag -> offset = \
+               type_FTAM_Filesize__Attribute_actual__values; \
+           fpm -> tag -> un.actual__values = field; \
+       } \
+    }
+    dosize (FA_FILESIZE, fa -> fa_filesize, filesize);
+    dosize (FA_FUTURESIZE, fa -> fa_futuresize, future__filesize);
+#undef dosize
+
+    if (fa -> fa_present & FA_CONTROL) {
+       if ((fpm -> access__control =
+                   (struct type_FTAM_Access__Control__Attribute *)
+                           calloc (1, sizeof *fpm -> access__control))
+               == NULL)
+           goto no_mem;
+       if (fa -> fa_novalue & FA_CONTROL)
+           fpm -> access__control -> offset =
+               type_FTAM_Access__Control__Attribute_no__value__available;
+       else {
+           fpm -> access__control -> offset =
+               type_FTAM_Access__Control__Attribute_actual__values;
+           if ((fpm -> access__control -> un.actual__values =
+                           acl2fpm (fsb, fa -> fa_control, fti)) == NULL)
+               goto out;
+       }
+    }
+
+    if (fa -> fa_present & FA_LEGAL) {
+       if ((fpm -> legal__qualification =
+                       (struct type_FTAM_Legal__Qualification__Attribute *)
+                              calloc (1, sizeof *fpm -> legal__qualification))
+               == NULL)
+           goto no_mem;
+       if (fa -> fa_novalue & FA_LEGAL)
+           fpm -> legal__qualification -> offset =
+               type_FTAM_Legal__Qualification__Attribute_no__value__available;
+       else {
+           if (fa -> fa_legal == NULL) {
+               (void) ftamlose (fti, FS_GEN (fsb), 0, NULLCP,
+                                "missing legal-qualification");
+               goto out;
+           }
+           fpm -> legal__qualification -> offset =
+               type_FTAM_Legal__Qualification__Attribute_actual__values;
+           if ((fpm -> legal__qualification -> un.actual__values =
+                       str2qb (fa -> fa_legal, strlen (fa -> fa_legal), 1))
+                   == NULL)
+               goto no_mem;
+       }
+    }
+       
+    /*
+     * Added private use attribute functionality for Retix NBS9 interworking.
+     * No value should always be set because we don't support private use.
+     * pmk.
+     */
+    if (fa -> fa_present & FA_PRIVATE) {
+       (void) ftamlose (fti, FS_GEN (fsb), 0, NULLCP,
+                        "private-use attribute not supported");
+       goto out;
+    }
+
+    return fpm;
+}
+
+/* \f */
+
+int    fpm2attr (fsb, fpm, fa, fti)
+register struct ftamblk *fsb;
+register struct type_FTAM_Read__Attributes *fpm;
+register struct FTAMattributes *fa;
+struct FTAMindication *fti;
+{
+    register char   *cp;
+    register UTC     u;
+
+    bzero ((char *) fa, sizeof *fa);
+
+    if (fpm -> filename) {
+       register int    n;
+       register char **ap;
+       register struct type_FTAM_Filename__Attribute *fn;
+
+       fa -> fa_present |= FA_FILENAME;
+
+       ap = fa -> fa_files, n = NFFILE;
+       for (fn = fpm -> filename; fn; fn = fn -> next) {
+           if (n-- <= 0) {
+               (void) ftamlose (fti, FS_GEN (fsb), 1, NULLCP,
+                                "too many names in filename");
+out: ;
+               FAFREE (fa);
+               return NOTOK;
+           }
+           if ((*ap++ = qb2str (fn -> GraphicString)) == NULL) {
+no_mem: ;
+               (void) ftamlose (fti, FS_GEN (fsb), 1, NULLCP,
+                                "out of memory");
+               goto out;
+           }
+           fa -> fa_nfile++;
+       }
+    }
+
+    if (fpm -> permitted__actions) {
+       fa -> fa_present |= FA_ACTIONS;
+
+       if (fpm2bits (fsb, fpermitted_pairs, fpm -> permitted__actions,
+                     &fa -> fa_permitted, fti) == NOTOK)
+           goto out;
+    }
+
+    if (fpm -> contents__type) {
+       fa -> fa_present |= FA_CONTENTS;
+
+       fa -> fa_contents = fpm -> contents__type -> document__type__name;
+       fpm -> contents__type -> document__type__name = NULLOID;
+       if (fpm -> contents__type -> parameter
+               && (fa -> fa_parameter =
+                           pe_cpy (fpm -> contents__type -> parameter))
+                       == NULLPE)
+           goto no_mem;
+    }
+
+    if (fpm -> storage__account) {
+       fa -> fa_present |= FA_ACCOUNT;
+
+       if (fpm -> storage__account -> offset
+               == type_FTAM_Account__Attribute_no__value__available)
+           fa -> fa_novalue |= FA_ACCOUNT;
+       else {
+           if ((fa -> fa_account =
+                       qb2str (fpm -> storage__account -> un.actual__values))
+                   == NULL)
+               goto no_mem;
+           if (*fa -> fa_account == NULL) {    /* CDC: some other vendor... */
+               fa -> fa_present &= ~FA_ACCOUNT;
+
+               free (fa -> fa_account);
+               fa -> fa_account = NULL;
+           }
+       }
+    }
+
+#define        dodate(flag,field,tag) \
+    if (fpm -> tag) { \
+       fa -> fa_present |= flag; \
+ \
+       if (fpm -> tag -> offset \
+               == type_FTAM_Date__and__Time__Attribute_no__value__available) \
+           fa -> fa_novalue |= flag; \
+       else { \
+           if ((cp = qb2str (fpm -> tag -> un.actual__values)) == NULL) \
+               goto no_mem; \
+           u = str2gent (cp, strlen (cp)); \
+           free (cp); \
+           if (u == NULLUTC) \
+               goto no_mem; \
+           field = *u; \
+       } \
+    }
+    dodate (FA_DATE_CREATE, fa -> fa_date_create,
+           date__and__time__of__creation);
+    dodate (FA_DATE_MODIFY, fa -> fa_date_modify,
+           date__and__time__of__last__modification);
+    dodate (FA_DATE_READ, fa -> fa_date_read,
+           date__and__time__of__last__read__access);
+    dodate (FA_DATE_ATTR, fa -> fa_date_attribute,
+           date__and__time__of__last__attribute__modification);
+#undef dodate
+
+#define        douser(flag,field,tag,name) \
+    if (fpm -> tag) { \
+       fa -> fa_present |= flag; \
+ \
+       if (fpm -> tag -> offset \
+               == type_FTAM_User__Identity__Attribute_no__value__available) \
+           fa -> fa_novalue |= flag; \
+       else \
+           if ((field = qb2str (fpm -> tag -> un.actual__values)) == NULL) \
+               goto no_mem; \
+    }
+    douser (FA_ID_CREATE, fa -> fa_id_create,
+           identity__of__creator, "identity-of-creator");
+    douser (FA_ID_MODIFY, fa -> fa_id_modify,
+           identity__of__last__modifier, "identity-of-last-modifier");
+    douser (FA_ID_READ, fa -> fa_id_read,
+           identity__of__last__reader, "identity-of-last-reader");
+    douser (FA_ID_ATTR, fa -> fa_id_attribute,
+           identity__of__last__attribute__modifier,
+           "identity-of-last-attribute-modifier");
+#undef douser
+
+    if (fpm -> file__availability) {
+       fa -> fa_present |= FA_AVAILABILITY;
+
+       if (fpm -> file__availability -> offset ==
+               type_FTAM_File__Availability__Attribute_no__value__available)
+           fa -> fa_novalue |= FA_AVAILABILITY;
+       else
+           fa -> fa_availability =
+                       fpm -> file__availability -> un.actual__values;
+    }
+
+#define        dosize(flag,field,tag) \
+    if (fpm -> tag) { \
+       fa -> fa_present |= flag; \
+ \
+       if (fpm -> tag -> offset \
+               == type_FTAM_Filesize__Attribute_no__value__available) \
+           fa -> fa_novalue |= flag; \
+       else \
+           field = fpm -> tag -> un.actual__values; \
+    }
+    dosize (FA_FILESIZE, fa -> fa_filesize, filesize);
+    dosize (FA_FUTURESIZE, fa -> fa_futuresize, future__filesize);
+#undef dosize
+
+    if (fpm -> access__control) {
+       fa -> fa_present |= FA_CONTROL;
+
+       if (fpm -> access__control -> offset
+               == type_FTAM_Access__Control__Attribute_no__value__available)
+           fa -> fa_novalue |= FA_CONTROL;
+       else
+           if (fpm2acl (fsb, fpm -> access__control -> un.actual__values,
+                        &fa -> fa_control, fti) == NOTOK)
+           goto out;
+    }
+
+    if (fpm -> legal__qualification) {
+       fa -> fa_present |= FA_LEGAL;
+
+       if (fpm -> legal__qualification -> offset ==
+               type_FTAM_Legal__Qualification__Attribute_no__value__available)
+           fa -> fa_novalue |= FA_LEGAL;
+       else
+           if ((fa -> fa_legal =
+                    qb2str (fpm -> legal__qualification -> un.actual__values))
+                   == NULL)
+               goto no_mem;
+    }
+
+    /* Added private use functionality pmk */
+    if (fpm -> private__use) {
+       fa -> fa_present |= FA_PRIVATE;
+       /* Set no value, regardless of what is there we don't support it */
+       fa -> fa_novalue |= FA_PRIVATE;
+    }
+
+    return OK;
+}
+
+/* \f */
+
+void   FAFREE (fa)
+register struct FTAMattributes *fa;
+{
+    register int FAI;
+
+    for (FAI = (fa) -> fa_nfile - 1; FAI >= 0; FAI--)
+       if ((fa) -> fa_files[FAI])
+           free ((fa) -> fa_files[FAI]), (fa) -> fa_files[FAI] = NULL;
+    (fa) -> fa_nfile = 0;
+    if ((fa) -> fa_contents)
+       oid_free ((fa) -> fa_contents), (fa) -> fa_contents = NULLOID;
+    if ((fa) -> fa_parameter)
+       pe_free ((fa) -> fa_parameter), (fa) -> fa_parameter = NULLPE;
+    if ((fa) -> fa_account)
+       free ((fa) -> fa_account), (fa) -> fa_account = NULL;
+    if ((fa) -> fa_id_create)
+       free  ((fa) -> fa_id_create), (fa) -> fa_id_create = NULL;
+    if ((fa) -> fa_id_modify)
+       free  ((fa) -> fa_id_modify), (fa) -> fa_id_modify = NULL;
+    if ((fa) -> fa_id_read)
+       free  ((fa) -> fa_id_read), (fa) -> fa_id_read = NULL;
+    if ((fa) -> fa_id_attribute)
+       free  ((fa) -> fa_id_attribute), (fa) -> fa_id_attribute = NULL;
+    if (fa -> fa_control) {
+       FEFREE (fa -> fa_control);
+       fa -> fa_control = NULL;
+    }
+    if ((fa) -> fa_legal)
+       free ((fa) -> fa_legal), (fa) -> fa_legal = NULL;
+    if ((fa) -> fa_private)
+      free ((fa) -> fa_private), (fa) -> fa_private = NULL;
+}
diff --git a/usr/src/contrib/isode/ftam/ftambits.c b/usr/src/contrib/isode/ftam/ftambits.c
new file mode 100644 (file)
index 0000000..d510483
--- /dev/null
@@ -0,0 +1,93 @@
+/* ftambits.c - FPM: encode/decode BIT STRINGs */
+
+#ifndef        lint
+static char *rcsid = "$Header: /f/osi/ftam/RCS/ftambits.c,v 7.2 91/02/22 09:22:39 mrose Interim $";
+#endif
+
+/* 
+ * $Header: /f/osi/ftam/RCS/ftambits.c,v 7.2 91/02/22 09:22:39 mrose Interim $
+ *
+ *
+ * $Log:       ftambits.c,v $
+ * Revision 7.2  91/02/22  09:22:39  mrose
+ * Interim 6.8
+ * 
+ * Revision 7.1  90/11/21  11:30:06  mrose
+ * sun
+ * 
+ * Revision 7.0  89/11/23  21:53:25  mrose
+ * Release 6.0
+ * 
+ */
+
+/*
+ *                               NOTICE
+ *
+ *    Acquisition, use, and distribution of this module and related
+ *    materials are subject to the restrictions of a license agreement.
+ *    Consult the Preface in the User's Manual for the full terms of
+ *    this agreement.
+ *
+ */
+
+
+/* LINTLIBRARY */
+
+#include <stdio.h>
+#include "fpkt.h"
+
+/* \f */
+
+PE     bits2fpm (fsb, pairs, actions, fti)
+register struct ftamblk *fsb;
+struct pair pairs[];
+int    actions;
+struct FTAMindication *fti;
+{
+    register struct pair *pp;
+    register PE            fpm;
+
+    if ((fpm = prim2bit (pe_alloc (PE_CLASS_UNIV, PE_FORM_PRIM, PE_PRIM_BITS)))
+           == NULLPE) {
+no_mem: ;
+       (void) ftamlose (fti, FS_GEN (fsb), 1, NULLCP, "out of memory");
+       if (fpm)
+           pe_free (fpm);
+       return NULLPE;
+    }
+
+    for (pp = pairs; pp -> p_mask; pp++)
+       if ((actions & pp -> p_mask) && bit_on (fpm, pp -> p_bitno) == NOTOK)
+           goto no_mem;
+
+    return fpm;
+}
+
+/* \f */
+
+/* ARGSUSED */
+
+int    fpm2bits (fsb, pairs, fpm, actions, fti)
+struct ftamblk *fsb;
+struct pair pairs[];
+register PE  fpm;
+int    *actions;
+struct FTAMindication *fti;
+{
+    register int    i;
+       register int    bits_set=0;
+    register struct pair *pp;
+
+    i = 0;
+    for (pp = pairs; pp -> p_mask; pp++)
+       if (bit_test (fpm, pp -> p_bitno) > OK) {
+           i |= pp -> p_mask;
+               bits_set++;
+       }
+
+    *actions = i;
+       if (bits_set == 0)
+               return NOTOK;
+       else
+       return (bits_set);
+}
diff --git a/usr/src/contrib/isode/ftam/ftambulk.c b/usr/src/contrib/isode/ftam/ftambulk.c
new file mode 100644 (file)
index 0000000..9724e48
--- /dev/null
@@ -0,0 +1,532 @@
+/* ftambulk.c - FPM: bulk data transfer */
+
+#ifndef        lint
+static char *rcsid = "$Header: /f/osi/ftam/RCS/ftambulk.c,v 7.1 91/02/22 09:22:40 mrose Interim $";
+#endif
+
+/* 
+ * $Header: /f/osi/ftam/RCS/ftambulk.c,v 7.1 91/02/22 09:22:40 mrose Interim $
+ *
+ *
+ * $Log:       ftambulk.c,v $
+ * Revision 7.1  91/02/22  09:22:40  mrose
+ * Interim 6.8
+ * 
+ * Revision 7.0  89/11/23  21:53:26  mrose
+ * Release 6.0
+ * 
+ */
+
+/*
+ *                               NOTICE
+ *
+ *    Acquisition, use, and distribution of this module and related
+ *    materials are subject to the restrictions of a license agreement.
+ *    Consult the Preface in the User's Manual for the full terms of
+ *    this agreement.
+ *
+ */
+
+
+/* LINTLIBRARY */
+
+#include <stdio.h>
+#include <signal.h>
+#include "fpkt.h"
+
+/* \f   F-DATA.REQUEST */
+
+int    FDataRequest (sd, fadus, nfadu, fti)
+int    sd;
+PE     fadus[];
+int    nfadu;
+struct FTAMindication *fti;
+{
+    SBV            smask;
+    int     result;
+    register struct ftamblk *fsb;
+
+    missingP (fti);
+
+    smask = sigioblock ();
+
+    ftamPsig (fsb, sd);
+
+    result = FDataRequestAux (fsb, fadus, nfadu, fti);
+
+    (void) sigiomask (smask);
+
+    return result;
+}
+
+/* \f */
+
+static int  FDataRequestAux (fsb, fadus, nfadu, fti)
+register struct ftamblk *fsb;
+PE     fadus[];
+int    nfadu;
+struct FTAMindication *fti;
+{
+    register int    i;
+    PE     pe,
+          *pep;
+    struct PSAPindication   pis;
+    struct PSAPindication  *pi = &pis;
+    struct PSAPabort   *pa = &pi -> pi_abort;
+
+    switch (fsb -> fsb_state) {
+       case FSB_DATAREAD: 
+           if (fsb -> fsb_flags & FSB_INIT)
+               return ftamlose (fti, FS_GEN (fsb), 0, NULLCP,
+                       "not responder");
+           break;
+
+       case FSB_DATAWRITE: 
+           if (!(fsb -> fsb_flags & FSB_INIT))
+               return ftamlose (fti, FS_GEN (fsb), 0, NULLCP,
+                       "not initiator");
+           break;
+
+       default: 
+           return ftamlose (fti, FS_GEN (fsb), 0, NULLCP, "wrong state");
+    }
+
+    for (pep = fadus, i = nfadu - 1; i >= 0; pep++, i--) {
+       if ((pe = *pep) == NULLPE)
+           return ftamlose (fti, FS_GEN (fsb), 0, NULLCP,
+                   "empty FADU at slot %d", nfadu - i - 1);
+
+       if (pe -> pe_context == PE_DFLT_CTX)
+           pe -> pe_context = fsb -> fsb_id;
+
+       if (pe -> pe_context == fsb -> fsb_id)
+           switch (PE_ID (pe -> pe_class, pe -> pe_id)) {
+               case PE_ID (PE_CLASS_APPL, FADU_NODESCR):
+               case PE_ID (PE_CLASS_APPL, FADU_ENTERTREE):
+               case PE_ID (PE_CLASS_APPL, FADU_EXITREE):
+                   break;
+
+               default:
+                   return ftamlose (fti, FS_GEN (fsb), 0, NULLCP,
+                               "bad context at slot %d", nfadu - i - 1);
+           }
+    }
+
+    if (PDataRequest (fsb -> fsb_fd, fadus, nfadu, pi) == NOTOK) {
+       (void) ps2ftamlose (fsb, fti, "PDataRequest", pa);
+       if (PC_FATAL (pa -> pa_reason))
+           freefsblk (fsb);
+
+       return NOTOK;
+    }
+
+    return OK;
+}
+
+/* \f   F-DATA-END.REQUEST */
+
+int    FDataEndRequest (sd, action, diag, ndiag, fti)
+int    sd;
+int    action;
+struct FTAMdiagnostic diag[];
+int    ndiag;
+struct FTAMindication *fti;
+{
+    SBV            smask;
+    int     result;
+    register struct ftamblk *fsb;
+
+    switch (action) {
+       case FACTION_SUCCESS: 
+       case FACTION_TRANS: 
+       case FACTION_PERM: 
+           break;
+
+       default: 
+           return ftamlose (fti, FS_GEN_NOREASON, 0, NULLCP,
+                   "bad value for action parameter");
+    }
+    toomuchP (diag, ndiag, NFDIAG, "diagnostic");
+    missingP (fti);
+
+    smask = sigioblock ();
+
+    ftamPsig (fsb, sd);
+
+    result = FDataEndRequestAux (fsb, action, diag, ndiag, fti);
+
+    (void) sigiomask (smask);
+
+    return result;
+}
+
+/* \f */
+
+static int  FDataEndRequestAux (fsb, action, diag, ndiag, fti)
+register struct ftamblk *fsb;
+int    action;
+struct FTAMdiagnostic diag[];
+int    ndiag;
+struct FTAMindication *fti;
+{
+    int     result;
+    PE     pe;
+    struct PSAPindication   pis;
+    struct PSAPindication  *pi = &pis;
+    struct PSAPabort   *pa = &pi -> pi_abort;
+    register struct type_FTAM_PDU *pdu;
+    register struct type_FTAM_F__DATA__END__request *req;
+
+    switch (fsb -> fsb_state) {
+       case FSB_DATAREAD: 
+           if (fsb -> fsb_flags & FSB_INIT)
+               return ftamlose (fti, FS_GEN (fsb), 0, NULLCP,
+                       "not responder");
+           break;
+
+       case FSB_DATAWRITE: 
+           if (!(fsb -> fsb_flags & FSB_INIT))
+               return ftamlose (fti, FS_GEN (fsb), 0, NULLCP,
+                       "not initiator");
+           break;
+
+       default: 
+           return ftamlose (fti, FS_GEN (fsb), 0, NULLCP, "wrong state");
+    }
+
+    pe = NULLPE;
+    if ((pdu = (struct type_FTAM_PDU *) calloc (1, sizeof *pdu)) == NULL) {
+no_mem: ;
+       (void) ftamlose (fti, FS_GEN (fsb), 1, NULLCP, "out of memory");
+out: ;
+       if (pe)
+           pe_free (pe);
+       if (pdu)
+           free_FTAM_PDU (pdu);
+       if (fti -> fti_abort.fta_action == FACTION_PERM)
+           freefsblk (fsb);
+       return NOTOK;
+    }
+    pdu -> offset = type_FTAM_PDU_f__data__end__request;
+    if ((req = (struct type_FTAM_F__DATA__END__request *)
+                       calloc (1, sizeof *req)) == NULL)
+       goto no_mem;
+    pdu -> un.f__data__end__request = req;
+    if ((req -> action__result =
+            (struct type_FTAM_Action__Result *)
+                       calloc (1, sizeof *req -> action__result)) == NULL)
+       goto no_mem;
+    req -> action__result -> parm = action;
+    if (ndiag > 0
+           && (req -> diagnostic = diag2fpm (fsb, 0, diag, ndiag, fti))
+                   == NULL)
+       goto out;
+
+    if (encode_FTAM_PDU (&pe, 1, 0, NULLCP, pdu) == NOTOK) {
+       (void) ftamlose (fti, FS_GEN (fsb), 1, NULLCP,
+                        "error encoding PDU: %s", PY_pepy);
+       goto out;
+    }
+
+    pe -> pe_context = fsb -> fsb_id;
+
+    fsbtrace (fsb,
+             (fsb -> fsb_fd, "P-DATA.REQUEST", "F-DATA-END-request", pe, 0));
+
+    result = PDataRequest (fsb -> fsb_fd, &pe, 1, pi);
+
+    pe_free (pe);
+    pe = NULLPE;
+    free_FTAM_PDU (pdu);
+    pdu = NULL;
+
+    if (result == NOTOK) {
+       (void) ps2ftamlose (fsb, fti, "PDataRequest", pa);
+       goto out;
+    }
+
+    fsb -> fsb_state = FSB_DATAFIN1;
+
+    return OK;
+}
+
+/* \f   F-CANCEL.REQUEST */
+
+int    FCancelRequest (sd, action, sharedASE, diag, ndiag, fti)
+int    sd;
+int    action;
+PE     sharedASE;
+struct FTAMdiagnostic diag[];
+int    ndiag;
+struct FTAMindication *fti;
+{
+    SBV            smask;
+    int     result;
+    register struct ftamblk *fsb;
+
+    switch (action) {
+       case FACTION_SUCCESS: 
+       case FACTION_TRANS: 
+       case FACTION_PERM: 
+           break;
+
+       default: 
+           return ftamlose (fti, FS_GEN_NOREASON, 0, NULLCP,
+                   "bad value for action parameter");
+    }
+    toomuchP (diag, ndiag, NFDIAG, "diagnostic");
+    missingP (fti);
+
+    smask = sigioblock ();
+
+    ftamPsig (fsb, sd);
+
+    result = FCancelRequestAux (fsb, action, sharedASE, diag, ndiag, fti);
+
+    (void) sigiomask (smask);
+
+    return result;
+}
+
+/* \f */
+
+static int  FCancelRequestAux (fsb, action, sharedASE, diag, ndiag, fti)
+register struct ftamblk *fsb;
+int    action;
+PE     sharedASE;
+struct FTAMdiagnostic diag[];
+int    ndiag;
+struct FTAMindication *fti;
+{
+    int            result,
+           settings;
+    char   *prequest;
+    PE     pe;
+    struct PSAPindication   pis;
+    struct PSAPindication  *pi = &pis;
+    struct PSAPabort   *pa = &pi -> pi_abort;
+    register struct type_FTAM_PDU *pdu;
+    register struct type_FTAM_F__CANCEL__request *req;
+
+    switch (fsb -> fsb_state) {
+       case FSB_DATAREAD:
+       case FSB_DATAWRITE:
+               break;
+
+       default:
+           return ftamlose (fti, FS_GEN (fsb), 0, NULLCP, "wrong state");
+    }
+
+    pe = NULLPE;
+    if ((pdu = (struct type_FTAM_PDU *) calloc (1, sizeof *pdu)) == NULL) {
+no_mem: ;
+       (void) ftamlose (fti, FS_GEN (fsb), 1, NULLCP, "out of memory");
+out: ;
+       if (pe)
+           pe_free (pe);
+       if (pdu)
+           free_FTAM_PDU (pdu);
+       if (fti -> fti_abort.fta_action == FACTION_PERM)
+           freefsblk (fsb);
+       return NOTOK;
+    }
+    pdu -> offset = type_FTAM_PDU_f__cancel__request;
+    if ((req = (struct type_FTAM_F__CANCEL__request *)
+                       calloc (1, sizeof *req)) == NULL)
+       goto no_mem;
+    pdu -> un.f__cancel__request = req;
+    if ((req -> action__result =
+            (struct type_FTAM_Action__Result *)
+                       calloc (1, sizeof *req -> action__result)) == NULL)
+       goto no_mem;
+    req -> action__result -> parm = action;
+    if (sharedASE
+           && (req -> shared__ASE__information =
+                       shared2fpm (fsb, sharedASE, fti)) == NULL)
+       goto out;
+    if (ndiag > 0
+           && (req -> diagnostic = diag2fpm (fsb, 0, diag, ndiag, fti))
+                       == NULL)
+       goto out;
+
+    if (encode_FTAM_PDU (&pe, 1, 0, NULLCP, pdu) == NOTOK) {
+       (void) ftamlose (fti, FS_GEN (fsb), 1, NULLCP,
+                        "error encoding PDU: %s", PY_pepy);
+       goto out;
+    }
+
+    pe -> pe_context = fsb -> fsb_id;
+
+    if (fsb -> fsb_srequirements & SR_RESYNC) {
+       fsbtrace (fsb, (fsb -> fsb_fd, "P-RESYNCHRONIZE.REQUEST",
+                       "F-CANCEL-request", pe, 0));
+
+       settings = 0;           /* XXX: more later! */
+
+       result = PReSyncRequest (fsb -> fsb_fd, SYNC_ABANDON, SERIAL_NONE,
+                       settings, &pe, 1, pi);
+
+       prequest = "PReSyncRequest";
+    }
+    else {
+       fsbtrace (fsb, (fsb -> fsb_fd, "P-DATA.REQUEST", "F-CANCEL-request",
+                       pe, 0));
+
+       result = PDataRequest (fsb -> fsb_fd, &pe, 1, pi);
+
+       prequest = "PDataRequest";
+    }
+
+    pe_free (pe);
+    pe = NULLPE;
+    free_FTAM_PDU (pdu);
+    pdu = NULL;
+
+    if (result == NOTOK) {
+       (void) ps2ftamlose (fsb, fti, prequest, pa);
+       goto out;
+    }
+
+    fsb -> fsb_flags |= FSB_CANCEL;
+    fsb -> fsb_state = FSB_DATACANCEL;
+    fsb -> fsb_cancelaction = action;
+    if (fsb -> fsb_cancelshared = sharedASE)
+       fsb -> fsb_cancelshared -> pe_refcnt++;
+    fsb -> fsb_canceldiags = diag;
+    fsb -> fsb_cancelndiag = ndiag;
+
+    return FWaitRequestAux (fsb, NOTOK, fti);
+}
+
+/* \f   F-CANCEL.RESPONSE */
+
+int    FCancelResponse (sd, action, sharedASE, diag, ndiag, fti)
+int    sd;
+int    action;
+PE     sharedASE;
+struct FTAMdiagnostic diag[];
+int    ndiag;
+struct FTAMindication *fti;
+{
+    SBV            smask;
+    int     result;
+    register struct ftamblk *fsb;
+
+    switch (action) {
+       case FACTION_SUCCESS: 
+       case FACTION_TRANS: 
+       case FACTION_PERM: 
+           break;
+
+       default: 
+           return ftamlose (fti, FS_GEN_NOREASON, 0, NULLCP,
+                   "bad value for action parameter");
+    }
+    toomuchP (diag, ndiag, NFDIAG, "diagnostic");
+    missingP (fti);
+
+    smask = sigioblock ();
+
+    ftamPsig (fsb, sd);
+
+    result = FCancelResponseAux (fsb, action, sharedASE, diag, ndiag, fti);
+
+    (void) sigiomask (smask);
+
+    return result;
+}
+
+/* \f */
+
+int    FCancelResponseAux (fsb, action, sharedASE, diag, ndiag, fti)
+register struct ftamblk *fsb;
+int    action;
+PE     sharedASE;
+struct FTAMdiagnostic diag[];
+int    ndiag;
+struct FTAMindication *fti;
+{
+    int            result;
+    char   *prequest;
+    PE     pe;
+    struct PSAPindication   pis;
+    struct PSAPindication  *pi = &pis;
+    struct PSAPabort   *pa = &pi -> pi_abort;
+    register struct type_FTAM_PDU *pdu;
+    register struct type_FTAM_F__CANCEL__response *rsp;
+
+    if (fsb -> fsb_state != FSB_DATACANCEL)
+       return ftamlose (fti, FS_GEN (fsb), 0, NULLCP, "wrong state");
+
+    pe = NULLPE;
+    if ((pdu = (struct type_FTAM_PDU *) calloc (1, sizeof *pdu)) == NULL) {
+no_mem: ;
+       (void) ftamlose (fti, FS_GEN (fsb), 1, NULLCP, "out of memory");
+out: ;
+       if (pe)
+           pe_free (pe);
+       if (pdu)
+           free_FTAM_PDU (pdu);
+       if (fti -> fti_abort.fta_action == FACTION_PERM)
+           freefsblk (fsb);
+       return NOTOK;
+    }
+    pdu -> offset = type_FTAM_PDU_f__cancel__response;
+    if ((rsp = (struct type_FTAM_F__CANCEL__response *)
+                       calloc (1, sizeof *rsp)) == NULL)
+       goto no_mem;
+    pdu -> un.f__cancel__response = rsp;
+    if ((rsp -> action__result =
+            (struct type_FTAM_Action__Result *)
+                       calloc (1, sizeof *rsp -> action__result)) == NULL)
+       goto no_mem;
+    rsp -> action__result -> parm = action;
+    if (sharedASE
+           && (rsp -> shared__ASE__information =
+                       shared2fpm (fsb, sharedASE, fti)) == NULL)
+       goto out;
+    if (ndiag > 0
+           && (rsp -> diagnostic = diag2fpm (fsb, 0, diag, ndiag, fti))
+                       == NULL)
+       goto out;
+
+    if (encode_FTAM_PDU (&pe, 1, 0, NULLCP, pdu) == NOTOK) {
+       (void) ftamlose (fti, FS_GEN (fsb), 1, NULLCP,
+                        "error encoding PDU: %s", PY_pepy);
+       goto out;
+    }
+
+    pe -> pe_context = fsb -> fsb_id;
+
+    if (fsb -> fsb_srequirements & SR_RESYNC) {
+       fsbtrace (fsb, (fsb -> fsb_fd, "P-RESYNCHRONIZE.RESPONSE",
+               "F-CANCEL-response", pe, 0));
+
+       result = PReSyncResponse (fsb -> fsb_fd, SERIAL_NONE,
+                       fsb -> fsb_settings, &pe, 1, pi);
+
+       prequest = "PReSyncResponse";
+    }
+    else {
+       fsbtrace (fsb, (fsb -> fsb_fd, "P-DATA.REQUEST", "F-CANCEL-response",
+               pe, 0));
+
+       result = PDataRequest (fsb -> fsb_fd, &pe, 1, pi);
+
+       prequest = "PDataRequest";
+    }
+
+    pe_free (pe);
+    pe = NULLPE;
+    free_FTAM_PDU (pdu);
+    pdu = NULL;
+
+    if (result == NOTOK) {
+       (void) ps2ftamlose (fsb, fti, prequest, pa);
+       goto out;
+    }
+
+    fsb -> fsb_state = FSB_DATAIDLE;
+
+    return OK;
+}
diff --git a/usr/src/contrib/isode/ftam/ftambulk1.c b/usr/src/contrib/isode/ftam/ftambulk1.c
new file mode 100644 (file)
index 0000000..916d391
--- /dev/null
@@ -0,0 +1,323 @@
+/* ftambulk1.c - FPM: initiate bulk data transfer */
+
+#ifndef        lint
+static char *rcsid = "$Header: /f/osi/ftam/RCS/ftambulk1.c,v 7.1 91/02/22 09:22:42 mrose Interim $";
+#endif
+
+/* 
+ * $Header: /f/osi/ftam/RCS/ftambulk1.c,v 7.1 91/02/22 09:22:42 mrose Interim $
+ *
+ *
+ * $Log:       ftambulk1.c,v $
+ * Revision 7.1  91/02/22  09:22:42  mrose
+ * Interim 6.8
+ * 
+ * Revision 7.0  89/11/23  21:53:27  mrose
+ * Release 6.0
+ * 
+ */
+
+/*
+ *                               NOTICE
+ *
+ *    Acquisition, use, and distribution of this module and related
+ *    materials are subject to the restrictions of a license agreement.
+ *    Consult the Preface in the User's Manual for the full terms of
+ *    this agreement.
+ *
+ */
+
+
+/* LINTLIBRARY */
+
+#include <stdio.h>
+#include <signal.h>
+#include "fpkt.h"
+
+/* \f   F-{READ,WRITE}.REQUEST */
+
+int    FReadWriteRequest (sd, operation, identity, context, level, lock, fti)
+int    sd;
+int    operation;
+struct FADUidentity *identity;
+int    context,                /* F-READ.REQUEST only */
+       level,                  /*   .. */
+       lock;
+struct FTAMindication *fti;
+{
+    SBV      smask;
+    int     result,
+           state;
+    register struct ftamblk *fsb;
+
+    switch (operation) {
+       case FA_OPS_READ: 
+           state = FSB_DATAREAD;
+           break;
+
+       case FA_OPS_INSERT: 
+       case FA_OPS_REPLACE: 
+       case FA_OPS_EXTEND: 
+           state = FSB_DATAWRITE;
+           break;
+
+       default: 
+           return ftamlose (fti, FS_GEN_NOREASON, 0, NULLCP,
+                   "bad value for operation parameter");
+    }
+    missingP (identity);
+    if (operation == FA_OPS_READ)
+       switch (context) {
+           case FA_ACC_HA: 
+           case FA_ACC_HN: 
+           case FA_ACC_FA: 
+           case FA_ACC_FL: 
+           case FA_ACC_FS: 
+           case FA_ACC_UA: 
+           case FA_ACC_US: 
+               break;
+
+           default:
+               return ftamlose (fti, FS_GEN_NOREASON, 0, NULLCP,
+                                "bad value for context parameter");
+       }
+    missingP (fti);
+
+    smask = sigioblock ();
+
+    ftamPsig (fsb, sd);
+
+    result = FReadWriteRequestAux (fsb, state, operation, identity, context,
+                       level, lock, fti);
+
+    (void) sigiomask (smask);
+
+    return result;
+}
+
+/* \f */
+
+static int  FReadWriteRequestAux (fsb, state, operation, identity, context,
+               level, lock, fti)
+register struct ftamblk *fsb;
+int    state,
+       operation;
+struct FADUidentity *identity;
+int    context,
+       level,
+       lock;
+struct FTAMindication *fti;
+{
+    int     result;
+    char   *fpdu;
+    PE     pe;
+    struct PSAPindication   pis;
+    struct PSAPindication  *pi = &pis;
+    struct PSAPabort   *pa = &pi -> pi_abort;
+    register struct type_FTAM_PDU *pdu;
+    register struct type_FTAM_F__READ__request *rd;
+    register struct type_FTAM_F__WRITE__request *wr;
+
+    if (!(fsb -> fsb_flags & FSB_INIT))
+       return ftamlose (fti, FS_GEN (fsb), 0, NULLCP, "not initiator");
+    if (fsb -> fsb_state != FSB_DATAIDLE)
+       return ftamlose (fti, FS_GEN (fsb), 0, NULLCP, "wrong state");
+
+    switch (state) {
+       case FSB_DATAREAD:
+           if (!(fsb -> fsb_units & FUNIT_READ))
+               return ftamlose (fti, FS_GEN (fsb), 0, NULLCP,
+                           "reading not allowed");
+           break;
+
+       case FSB_DATAWRITE:
+           if (!(fsb -> fsb_units & FUNIT_WRITE))
+               return ftamlose (fti, FS_GEN (fsb), 0, NULLCP,
+                           "writing not allowed");
+           break;
+    }
+
+    pe = NULLPE;
+    if ((pdu = (struct type_FTAM_PDU *) calloc (1, sizeof *pdu)) == NULL) {
+no_mem: ;
+       (void) ftamlose (fti, FS_GEN (fsb), 1, NULLCP, "out of memory");
+out: ;
+       if (pe)
+           pe_free (pe);
+       if (pdu)
+           free_FTAM_PDU (pdu);
+       if (fti -> fti_abort.fta_action == FACTION_PERM)
+           freefsblk (fsb);
+       return NOTOK;
+    }
+    if (state != FSB_DATAREAD) {
+       pdu -> offset = type_FTAM_PDU_f__write__request;
+       if ((wr = (struct type_FTAM_F__WRITE__request *)
+                       calloc (1, sizeof *wr)) == NULL)
+           goto no_mem;
+       pdu -> un.f__write__request = wr;
+       fpdu = "F-WRITE-request";
+
+       wr -> file__access__data__unit__operation = operation;
+       if ((wr -> file__access__data__unit__identity =
+                       faduid2fpm (fsb, identity, fti)) == NULL)
+           goto out;
+       if (fsb -> fsb_units & FUNIT_FADULOCK) {
+           if ((wr -> fadu__lock = (struct type_FTAM_FADU__Lock *)
+                                       calloc (1, sizeof *wr -> fadu__lock))
+                   == NULL)
+               goto no_mem;
+           wr -> fadu__lock -> parm = lock ? int_FTAM_FADU__Lock_on
+                                           : int_FTAM_FADU__Lock_off;
+       }
+    }
+    else {
+       pdu -> offset = type_FTAM_PDU_f__read__request;
+       if ((rd = (struct type_FTAM_F__READ__request *)
+                       calloc (1, sizeof *rd)) == NULL)
+           goto no_mem;
+       pdu -> un.f__read__request = rd;
+       fpdu = "F-READ-request";
+
+       if ((rd -> file__access__data__unit__identity =
+                       faduid2fpm (fsb, identity, fti)) == NULL)
+           goto out;
+       if ((rd -> access__context =
+                       (struct type_FTAM_Access__Context *)
+                               calloc (1, sizeof *rd -> access__context))
+               == NULL)
+           goto no_mem;
+       if ((rd -> access__context -> access__context = context)
+               == FA_ACC_FL) {
+           rd -> access__context -> optionals |=
+                                       opt_FTAM_Access__Context_level__number;
+           rd -> access__context -> level__number = level;
+       }
+
+       if (fsb -> fsb_units & FUNIT_FADULOCK) {
+           if ((rd -> fadu__lock = (struct type_FTAM_FADU__Lock *)
+                                       calloc (1, sizeof *wr -> fadu__lock))
+                   == NULL)
+               goto no_mem;
+           rd -> fadu__lock -> parm = lock ? int_FTAM_FADU__Lock_on
+                                           : int_FTAM_FADU__Lock_off;
+       }
+    }
+
+    if (encode_FTAM_PDU (&pe, 1, 0, NULLCP, pdu) == NOTOK) {
+       (void) ftamlose (fti, FS_GEN (fsb), 1, NULLCP,
+                        "error encoding PDU: %s", PY_pepy);
+       goto out;
+    }
+
+    pe -> pe_context = fsb -> fsb_id;
+
+    fsbtrace (fsb, (fsb -> fsb_fd, "P-DATA.REQUEST", fpdu, pe, 0));
+
+    result = PDataRequest (fsb -> fsb_fd, &pe, 1, pi);
+
+    pe_free (pe);
+    pe = NULLPE;
+    free_FTAM_PDU (pdu);
+    pdu = NULL;
+
+    if (result == NOTOK) {
+       (void) ps2ftamlose (fsb, fti, "PDataRequest", pa);
+       goto out;
+    }
+
+    fsb -> fsb_state = state;
+
+    return OK;
+}
+
+/* \f   F-TRANSFER-END.REQUEST */
+
+int    FTransEndRequest (sd, sharedASE, fti)
+int    sd;
+PE     sharedASE;
+struct FTAMindication *fti;
+{
+    SBV            smask;
+    int     result;
+    register struct ftamblk *fsb;
+
+    missingP (fti);
+
+    smask = sigioblock ();
+
+    ftamPsig (fsb, sd);
+
+    result = FTransEndRequestAux (fsb, sharedASE, fti);
+
+    (void) sigiomask (smask);
+
+    return result;
+}
+
+
+/* \f */
+
+static int  FTransEndRequestAux (fsb, sharedASE, fti)
+register struct ftamblk *fsb;
+PE     sharedASE;
+struct FTAMindication *fti;
+{
+    int            result;
+    PE     pe;
+    struct PSAPindication   pis;
+    struct PSAPindication  *pi = &pis;
+    struct PSAPabort   *pa = &pi -> pi_abort;
+    register struct type_FTAM_PDU *pdu;
+
+    if (!(fsb -> fsb_flags & FSB_INIT))
+       return ftamlose (fti, FS_GEN (fsb), 0, NULLCP, "not initiator");
+    if (fsb -> fsb_state != FSB_DATAFIN1)
+       return ftamlose (fti, FS_GEN (fsb), 0, NULLCP, "wrong state");
+
+    pe = NULLPE;
+    if ((pdu = (struct type_FTAM_PDU *) calloc (1, sizeof *pdu)) == NULL) {
+       (void) ftamlose (fti, FS_GEN (fsb), 1, NULLCP, "out of memory");
+out: ;
+       if (pe)
+           pe_free (pe);
+       if (pdu)
+           free_FTAM_PDU (pdu);
+       if (fti -> fti_abort.fta_action == FACTION_PERM)
+           freefsblk (fsb);
+       return NOTOK;
+    }
+    pdu -> offset = type_FTAM_PDU_f__transfer__end__request;
+    if (sharedASE
+           && (pdu -> un.f__transfer__end__request =
+                       shared2fpm (fsb, sharedASE, fti)) == NULL)
+       goto out;
+
+    if (encode_FTAM_PDU (&pe, 1, 0, NULLCP, pdu) == NOTOK) {
+       (void) ftamlose (fti, FS_GEN (fsb), 1, NULLCP,
+                        "error encoding PDU: %s", PY_pepy);
+       goto out;
+    }
+
+    pe -> pe_context = fsb -> fsb_id;
+    
+    fsbtrace (fsb, (fsb -> fsb_fd, "P-DATA.REQUEST", "F-TRANSFER-END-request",
+               pe, 0));
+
+    result = PDataRequest (fsb -> fsb_fd, &pe, 1, pi);
+
+    pe_free (pe);
+    pe = NULLPE;
+    free_FTAM_PDU (pdu);
+    pdu = NULL;
+
+
+    if (result == NOTOK) {
+       (void) ps2ftamlose (fsb, fti, "PDataRequest", pa);
+       goto out;
+    }
+
+    fsb -> fsb_state = FSB_DATAFIN2;
+
+    return FWaitRequestAux (fsb, NOTOK, fti);
+}
diff --git a/usr/src/contrib/isode/ftam/ftambulk2.c b/usr/src/contrib/isode/ftam/ftambulk2.c
new file mode 100644 (file)
index 0000000..e32eca3
--- /dev/null
@@ -0,0 +1,156 @@
+/* ftambulk2.c - FPM: respond to bulk data transfer */
+
+#ifndef        lint
+static char *rcsid = "$Header: /f/osi/ftam/RCS/ftambulk2.c,v 7.1 91/02/22 09:22:43 mrose Interim $";
+#endif
+
+/* 
+ * $Header: /f/osi/ftam/RCS/ftambulk2.c,v 7.1 91/02/22 09:22:43 mrose Interim $
+ *
+ *
+ * $Log:       ftambulk2.c,v $
+ * Revision 7.1  91/02/22  09:22:43  mrose
+ * Interim 6.8
+ * 
+ * Revision 7.0  89/11/23  21:53:28  mrose
+ * Release 6.0
+ * 
+ */
+
+/*
+ *                               NOTICE
+ *
+ *    Acquisition, use, and distribution of this module and related
+ *    materials are subject to the restrictions of a license agreement.
+ *    Consult the Preface in the User's Manual for the full terms of
+ *    this agreement.
+ *
+ */
+
+
+/* LINTLIBRARY */
+
+#include <stdio.h>
+#include <signal.h>
+#include "fpkt.h"
+
+/* \f   F-TRANSFER-END.RESPONSE */
+
+int    FTransEndResponse (sd, action, sharedASE, diag, ndiag, fti)
+int    sd;
+int    action;
+PE     sharedASE;
+struct FTAMdiagnostic diag[];
+int    ndiag;
+struct FTAMindication *fti;
+{
+    SBV            smask;
+    int     result;
+    register struct ftamblk *fsb;
+
+    switch (action) {
+       case FACTION_SUCCESS: 
+       case FACTION_TRANS: 
+       case FACTION_PERM: 
+           break;
+
+       default: 
+           return ftamlose (fti, FS_GEN_NOREASON, 0, NULLCP,
+                   "bad value for action parameter");
+    }
+    toomuchP (diag, ndiag, NFDIAG, "diagnostic");
+    missingP (fti);
+
+    smask = sigioblock ();
+
+    ftamPsig (fsb, sd);
+
+    result = FTransEndResponseAux (fsb, action, sharedASE, diag, ndiag, fti);
+
+    (void) sigiomask (smask);
+
+    return result;
+}
+
+/* \f */
+
+static int  FTransEndResponseAux (fsb, action, sharedASE, diag, ndiag, fti)
+register struct ftamblk *fsb;
+int    action;
+PE     sharedASE;
+struct FTAMdiagnostic diag[];
+int    ndiag;
+struct FTAMindication *fti;
+{
+    int            result;
+    PE     pe;
+    struct PSAPindication   pis;
+    struct PSAPindication  *pi = &pis;
+    struct PSAPabort   *pa = &pi -> pi_abort;
+    register struct type_FTAM_PDU *pdu;
+    register struct type_FTAM_F__TRANSFER__END__response *rsp;
+
+    if (fsb -> fsb_flags & FSB_INIT)
+       return ftamlose (fti, FS_GEN (fsb), 0, NULLCP, "not responder");
+    if (fsb -> fsb_state != FSB_DATAFIN2)
+       return ftamlose (fti, FS_GEN (fsb), 0, NULLCP, "wrong state");
+
+    pe = NULLPE;
+    if ((pdu = (struct type_FTAM_PDU *) calloc (1, sizeof *pdu)) == NULL) {
+no_mem: ;
+       (void) ftamlose (fti, FS_GEN (fsb), 1, NULLCP, "out of memory");
+out: ;
+       if (pe)
+           pe_free (pe);
+       if (pdu)
+           free_FTAM_PDU (pdu);
+       if (fti -> fti_abort.fta_action == FACTION_PERM)
+           freefsblk (fsb);
+       return NOTOK;
+    }
+    pdu -> offset = type_FTAM_PDU_f__transfer__end__response;
+    if ((rsp = (struct type_FTAM_F__TRANSFER__END__response *)
+                       calloc (1, sizeof *rsp)) == NULL)
+       goto no_mem;
+    pdu -> un.f__transfer__end__response = rsp;
+    if ((rsp -> action__result =
+            (struct type_FTAM_Action__Result *)
+                       calloc (1, sizeof *rsp -> action__result)) == NULL)
+       goto no_mem;
+    rsp -> action__result -> parm = action;
+    if (sharedASE
+           && (rsp -> shared__ASE__information =
+                       shared2fpm (fsb, sharedASE, fti)) == NULL)
+       goto out;
+    if (ndiag > 0
+           && (rsp -> diagnostic = diag2fpm (fsb, 0, diag, ndiag, fti))
+                       == NULL)
+       goto out;
+
+    if (encode_FTAM_PDU (&pe, 1, 0, NULLCP, pdu) == NOTOK) {
+       (void) ftamlose (fti, FS_GEN (fsb), 1, NULLCP,
+                        "error encoding PDU: %s", PY_pepy);
+       goto out;
+    }
+
+    pe -> pe_context = fsb -> fsb_id;
+
+    fsbtrace (fsb, (fsb -> fsb_fd, "P-DATA.REQUEST", "F-TRANSFER-END-response",
+                   pe, 0));
+
+    result = PDataRequest (fsb -> fsb_fd, &pe, 1, pi);
+
+    pe_free (pe);
+    pe = NULLPE;
+    free_FTAM_PDU (pdu);
+    pdu = NULL;
+
+    if (result == NOTOK) {
+       (void) ps2ftamlose (fsb, fti, "PDataRequest", pa);
+       goto out;
+    }
+
+    fsb -> fsb_state = FSB_DATAIDLE;
+
+    return OK;
+}
diff --git a/usr/src/contrib/isode/ftam/ftamchrg.c b/usr/src/contrib/isode/ftam/ftamchrg.c
new file mode 100644 (file)
index 0000000..1c4e9bf
--- /dev/null
@@ -0,0 +1,131 @@
+/* ftamchrg.c - FPM: encode/decode charging */
+
+#ifndef        lint
+static char *rcsid = "$Header: /f/osi/ftam/RCS/ftamchrg.c,v 7.1 91/02/22 09:22:45 mrose Interim $";
+#endif
+
+/* 
+ * $Header: /f/osi/ftam/RCS/ftamchrg.c,v 7.1 91/02/22 09:22:45 mrose Interim $
+ *
+ *
+ * $Log:       ftamchrg.c,v $
+ * Revision 7.1  91/02/22  09:22:45  mrose
+ * Interim 6.8
+ * 
+ * Revision 7.0  89/11/23  21:53:30  mrose
+ * Release 6.0
+ * 
+ */
+
+/*
+ *                               NOTICE
+ *
+ *    Acquisition, use, and distribution of this module and related
+ *    materials are subject to the restrictions of a license agreement.
+ *    Consult the Preface in the User's Manual for the full terms of
+ *    this agreement.
+ *
+ */
+
+
+/* LINTLIBRARY */
+
+#include <stdio.h>
+#include "fpkt.h"
+
+/* \f */
+
+struct type_FTAM_Charging *chrg2fpm (fsb, charging, fti)
+register struct ftamblk *fsb;
+register struct FTAMcharging *charging;
+struct FTAMindication *fti;
+{
+    register int    i;
+    register struct fc_charge  *fc;
+    struct type_FTAM_Charging *fpmp;
+    register struct type_FTAM_Charging  *fpm,
+                                      **fpc;
+    register struct charge_element *f1;
+
+    fpmp = NULL, fpc = &fpmp;
+    for (fc = charging -> fc_charges, i = charging -> fc_ncharge - 1;
+           i >= 0;
+           fc++, i--) {
+       if (fc -> fc_resource == NULL || fc -> fc_unit == NULL) {
+           (void) ftamlose (fti, FS_GEN (fsb), 0, NULLCP,
+                            "empty charge at slot %d",
+                            charging -> fc_ncharge - i - 1);
+           goto out;
+       }
+
+       if ((fpm = (struct type_FTAM_Charging *) calloc (1, sizeof *fpm))
+               == NULL) {
+no_mem: ;
+           (void) ftamlose (fti, FS_GEN (fsb), 1, NULLCP, "out of memory");
+out: ;
+           if (fpmp)
+               free_FTAM_Charging (fpmp);
+           return NULL;
+       }
+       *fpc = fpm;
+
+       if ((f1 = (struct charge_element *) calloc (1, sizeof *f1)) == NULL)
+           goto no_mem;
+       fpm -> charge = f1;
+
+       if ((f1 -> resource__identifier = str2qb (fc -> fc_resource,
+                                                 strlen (fc -> fc_resource),
+                                                 1))
+                   == NULL
+               || (f1 -> charging__unit = str2qb (fc -> fc_unit,
+                                                  strlen (fc -> fc_unit), 1))
+                       == NULL)
+           goto no_mem;
+       f1 -> charging__value = fc -> fc_value;
+
+       fpc = &fpm -> next;
+    }
+
+    return fpmp;
+}
+
+/* \f */
+
+int    fpm2chrg (fsb, fpm, charging, fti)
+register struct ftamblk *fsb;
+register struct type_FTAM_Charging *fpm;
+register struct FTAMcharging *charging;
+struct FTAMindication *fti;
+{
+    register int    i;
+    register struct fc_charge *fc;
+    register struct charge_element *f1;
+
+    bzero ((char *) charging, sizeof *charging);
+
+    fc = charging -> fc_charges, i = 0;
+    for (; fpm; fpm = fpm -> next) {
+       if (i >= NFCHRG)
+           return ftamlose (fti, FS_GEN (fsb), 1, NULLCP,
+                            "too many charges");
+
+       f1 = fpm -> charge;
+       if ((fc -> fc_resource = qb2str (f1 -> resource__identifier)) == NULL
+               || (fc -> fc_unit = qb2str (f1 -> charging__unit)) == NULL) {
+           if (fc -> fc_resource)
+               free (fc -> fc_resource), fc -> fc_resource = NULL;
+           while (i-- > 0) {
+               fc--;
+               free (fc -> fc_resource), fc -> fc_resource = NULL;
+               free (fc -> fc_unit), fc -> fc_unit = NULL;
+           }
+
+           return ftamlose (fti, FS_GEN (fsb), 1, NULLCP, "out of memory");
+       }
+       fc -> fc_value = f1 -> charging__value;
+
+       fc++, i++;
+    }
+
+    return OK;
+}
diff --git a/usr/src/contrib/isode/ftam/ftamconctl.c b/usr/src/contrib/isode/ftam/ftamconctl.c
new file mode 100644 (file)
index 0000000..f1b4387
--- /dev/null
@@ -0,0 +1,199 @@
+/* ftamconctl.c - FPM: encode/decode concurrency control */
+
+#ifndef        lint
+static char *rcsid = "$Header: /f/osi/ftam/RCS/ftamconctl.c,v 7.3 91/02/22 09:22:46 mrose Interim $";
+#endif
+
+/* 
+ * $Header: /f/osi/ftam/RCS/ftamconctl.c,v 7.3 91/02/22 09:22:46 mrose Interim $
+ *
+ *
+ * $Log:       ftamconctl.c,v $
+ * Revision 7.3  91/02/22  09:22:46  mrose
+ * Interim 6.8
+ * 
+ * Revision 7.2  90/07/09  14:36:42  mrose
+ * sync
+ * 
+ * Revision 7.1  90/03/23  10:54:01  mrose
+ * update
+ * 
+ * Revision 7.0  89/11/23  21:53:31  mrose
+ * Release 6.0
+ * 
+ */
+
+/*
+ *                               NOTICE
+ *
+ *    Acquisition, use, and distribution of this module and related
+ *    materials are subject to the restrictions of a license agreement.
+ *    Consult the Preface in the User's Manual for the full terms of
+ *    this agreement.
+ *
+ */
+
+/* LINTLIBRARY */
+
+#include <stdio.h>
+#include "fpkt.h"
+
+/* \f   DATA */
+
+static int fc2lock[] = {
+    int_FTAM_Lock_shared, int_FTAM_Lock_exclusive,
+    int_FTAM_Lock_not__required, int_FTAM_Lock_no__access
+};
+
+static int lock2fc[] = {
+    FLOCK_NOTREQD, FLOCK_SHARED, FLOCK_EXCLUSIVE, FLOCK_NOACCESS
+};
+
+
+#define FCON_NOTREQD   0x01
+#define FCON_SHARED     0x02
+#define FCON_EXCLUSIVE  0x04
+#define FCON_NOACCESS   0x08
+
+struct pair fconctl_pairs [] = {
+              FCON_NOTREQD, bit_FTAM_Concurrency__Key_not__required,
+              FCON_SHARED, bit_FTAM_Concurrency__Key_shared,
+              FCON_EXCLUSIVE, bit_FTAM_Concurrency__Key_exclusive,
+              FCON_NOACCESS, bit_FTAM_Concurrency__Key_no__access,
+              0, 0
+};
+
+/* \f */
+
+struct type_FTAM_Concurrency__Control *conctl2fpm (fsb, fc, fti)
+register struct ftamblk *fsb;
+register struct FTAMconcurrency *fc;
+struct FTAMindication *fti;
+{
+    register struct type_FTAM_Concurrency__Control *fpm;
+
+    if ((fpm = (struct type_FTAM_Concurrency__Control *)
+                   calloc (1, sizeof *fpm)) == NULL) {
+no_mem: ;
+       (void) ftamlose (fti, FS_GEN (fsb), 1, NULLCP, "out of memory");
+       if (fpm)
+           free_FTAM_Concurrency__Control (fpm);
+       return NULL;
+    }
+
+#define        dolock(s,t) \
+{ \
+    if ((fpm -> s = (struct type_FTAM_Lock *) \
+                           calloc (1, sizeof *fpm -> s)) \
+           == NULL) \
+       goto no_mem; \
+    fpm -> s -> parm = fc2lock [fc -> t & FLOCK_MASK]; \
+}
+    dolock (read, fc_readlock);
+    dolock (insert, fc_insertlock);
+    dolock (replace, fc_replacelock);
+    dolock (extend, fc_extendlock);
+    dolock (erase, fc_eraselock);
+    dolock (read__attribute, fc_readattrlock);
+    dolock (change__attribute, fc_chngattrlock);
+    dolock (delete, fc_deletelock);
+#undef dolock
+
+    return fpm;
+}
+
+/* \f */
+
+/* ARGSUSED */
+
+int    fpm2conctl (fsb, fpm, fc, fti)
+struct ftamblk *fsb;
+register struct type_FTAM_Concurrency__Control *fpm;
+register struct FTAMconcurrency *fc;
+struct FTAMindication *fti;
+{
+    FCINIT (fc);
+
+#define        dolock(s,t) \
+{ \
+    fc -> t = lock2fc [fpm -> s -> parm]; \
+}
+    dolock (read, fc_readlock);
+    dolock (insert, fc_insertlock);
+    dolock (replace, fc_replacelock);
+    dolock (extend, fc_extendlock);
+    dolock (erase, fc_eraselock);
+    dolock (read__attribute, fc_readattrlock);
+    dolock (change__attribute, fc_chngattrlock);
+    dolock (delete, fc_deletelock);
+#undef dolock
+
+    return OK;
+}
+
+/* \f */
+
+struct type_FTAM_Concurrency__Access *conacc2fpm (fsb, fc, fti)
+register struct ftamblk *fsb;
+register struct FTAMconcurrency *fc;
+struct FTAMindication *fti;
+{
+    register struct type_FTAM_Concurrency__Access *fpm;
+    int key;
+
+    if ((fpm = (struct type_FTAM_Concurrency__Access *)
+                    calloc (1, sizeof *fpm)) == NULL) {
+        (void) ftamlose (fti, FS_GEN (fsb), 1, NULLCP, "out of memory");
+        if (fpm)
+            free_FTAM_Concurrency__Access (fpm);
+        return NULL;
+    }
+
+#define dolock(s,t) \
+{ \
+    key = (int) (fc -> t & FLOCK_MASK); \
+    fpm -> s = bits2fpm (fsb, fconctl_pairs, key, fti); \
+}
+
+    dolock (read, fc_readlock);
+    dolock (insert, fc_insertlock);
+    dolock (replace, fc_replacelock);
+    dolock (extend, fc_extendlock);
+    dolock (erase, fc_eraselock);
+    dolock (read__attribute, fc_readattrlock);
+    dolock (change__attribute, fc_chngattrlock);
+    dolock (delete, fc_deletelock);
+#undef  dolock
+
+    return fpm;
+}
+
+
+int     fpm2conacc (fsb, fpm, fc, fti)
+struct ftamblk *fsb;
+register struct type_FTAM_Concurrency__Access *fpm;
+register struct FTAMconcurrency *fc;
+struct FTAMindication *fti;
+{
+    int            key;
+
+    FCINIT (fc);
+
+#define dolock(s,t) \
+{ \
+    key = fc -> t; \
+    (void) fpm2bits (fsb, fconctl_pairs, fpm -> s, &key, fti); \
+}
+    dolock (read, fc_readlock);
+    dolock (insert, fc_insertlock);
+    dolock (replace, fc_replacelock);
+    dolock (extend, fc_extendlock);
+    dolock (erase, fc_eraselock);
+    dolock (read__attribute, fc_readattrlock);
+    dolock (change__attribute, fc_chngattrlock);
+    dolock (delete, fc_deletelock);
+#undef  dolock
+
+    return OK;
+
+}
diff --git a/usr/src/contrib/isode/ftam/ftamdiag.c b/usr/src/contrib/isode/ftam/ftamdiag.c
new file mode 100644 (file)
index 0000000..e456ac4
--- /dev/null
@@ -0,0 +1,204 @@
+/* ftamdiag.c - FPM: encode/decode diagnostics */
+
+#ifndef        lint
+static char *rcsid = "$Header: /f/osi/ftam/RCS/ftamdiag.c,v 7.2 91/02/22 09:22:47 mrose Interim $";
+#endif
+
+/* 
+ * $Header: /f/osi/ftam/RCS/ftamdiag.c,v 7.2 91/02/22 09:22:47 mrose Interim $
+ *
+ *
+ * $Log:       ftamdiag.c,v $
+ * Revision 7.2  91/02/22  09:22:47  mrose
+ * Interim 6.8
+ * 
+ * Revision 7.1  90/01/11  18:35:40  mrose
+ * real-sync
+ * 
+ * Revision 7.0  89/11/23  21:53:32  mrose
+ * Release 6.0
+ * 
+ */
+
+/*
+ *                               NOTICE
+ *
+ *    Acquisition, use, and distribution of this module and related
+ *    materials are subject to the restrictions of a license agreement.
+ *    Consult the Preface in the User's Manual for the full terms of
+ *    this agreement.
+ *
+ */
+
+
+/* LINTLIBRARY */
+
+#include <stdio.h>
+#include "fpkt.h"
+
+/* \f */
+
+struct type_FTAM_Diagnostic *diag2fpm (fsb, magic, diag, ndiag, fti)
+register struct ftamblk *fsb;
+int    magic;
+struct FTAMdiagnostic diag[];
+int    ndiag;
+struct FTAMindication *fti;
+{
+    register int    i;
+    register struct FTAMdiagnostic *dp;
+    struct type_FTAM_Diagnostic *fpmp;
+    register struct type_FTAM_Diagnostic  *fpm,
+                                        **fpc;
+    register struct diag_element *f3;
+
+    fpmp = NULL, fpc = &fpmp;
+    for (dp = diag, i = ndiag - 1; i >= 0; dp++, i--) {
+       if ((fpm = (struct type_FTAM_Diagnostic *) calloc (1, sizeof *fpm))
+               == NULL) {
+no_mem: ;
+           (void) ftamlose (fti, FS_GEN (fsb), 1, NULLCP, "out of memory");
+out: ;
+           if (fpmp)
+               free_FTAM_Diagnostic (fpmp);
+           return NULL;
+       }
+       *fpc = fpm;
+
+       if ((f3 = (struct diag_element *) calloc (1, sizeof *f3)) == NULL)
+           goto no_mem;
+       fpm -> diagnostic = f3;
+
+       switch (dp -> ftd_type) {
+           case DIAG_INFORM: 
+           case DIAG_TRANS: 
+           case DIAG_PERM: 
+               break;
+
+           default: 
+       bad_dp: ;
+               (void) ftamlose (fti, FS_GEN (fsb), 0, NULLCP,
+                       "bad diagnostic type/observer/source (%d/%d/%d) at slot %d",
+                       dp -> ftd_type, dp -> ftd_observer, dp -> ftd_source,
+                       ndiag - i - 1);
+               goto out;
+       }
+       f3 -> diagnostic__type = dp -> ftd_type;
+
+       f3 -> error__identifier = dp -> ftd_identifier;
+
+       switch (dp -> ftd_observer) {
+           case EREF_IFSU: 
+           case EREF_IFPM: 
+               if (!(fsb -> fsb_flags & FSB_INIT))
+                   goto bad_dp;
+               break;
+
+           case EREF_RFSU: 
+           case EREF_RFPM: 
+               if (fsb -> fsb_flags & FSB_INIT)
+                   goto bad_dp;
+               break;
+
+           default:
+               if (!magic)
+                   goto bad_dp;
+               break;
+       }
+       if ((f3 -> error__observer =
+                       (struct type_FTAM_Entity__Reference *)
+                               calloc (1, sizeof *f3 -> error__observer))
+               == NULL)
+           goto no_mem;
+       f3 -> error__observer -> parm = dp -> ftd_observer;
+
+       switch (dp -> ftd_source) {
+           case EREF_NONE: 
+           case EREF_IFSU: 
+           case EREF_IFPM: 
+           case EREF_SERV: 
+           case EREF_RFPM: 
+           case EREF_RFSU: 
+               break;
+
+           default: 
+               goto bad_dp;
+       }
+       if ((f3 -> error__source =
+                       (struct type_FTAM_Entity__Reference *)
+                               calloc (1, sizeof *f3 -> error__source))
+               == NULL)
+           goto no_mem;
+       f3 -> error__source -> parm = dp -> ftd_source;
+
+       if (dp -> ftd_delay != DIAG_NODELAY) {
+           f3 -> optionals |= opt_FTAM_diag_element_suggested__delay;
+           f3 -> suggested__delay = dp -> ftd_delay;
+       }
+
+       if (dp -> ftd_cc > FTD_SIZE)
+           goto bad_dp;
+       else
+           if (dp -> ftd_cc > 0
+                   && (f3 -> further__details = str2qb (dp -> ftd_data,
+                                                        dp -> ftd_cc, 1))
+                           == NULL)
+               goto no_mem;
+
+       fpc = &fpm -> next;
+    }
+
+    return fpmp;
+}
+
+/* \f */
+
+int    fpm2diag (fsb, fpm, diag, ndiag, fti)
+register struct ftamblk *fsb;
+register struct type_FTAM_Diagnostic *fpm;
+struct FTAMdiagnostic diag[];
+int   *ndiag;
+struct FTAMindication *fti;
+{
+    register int    i;
+    register struct FTAMdiagnostic *dp;
+    register struct diag_element *f3;
+
+    *ndiag = 0;
+
+    dp = diag, i = 0;
+    for (; fpm; fpm = fpm -> next) {
+       if (i >= NFDIAG)
+           return ftamlose (fti, FS_GEN (fsb), 1, NULLCP,
+                            "too many diagnostics");
+
+       f3 = fpm -> diagnostic;
+       dp -> ftd_type = f3 -> diagnostic__type;
+       dp -> ftd_identifier = f3 -> error__identifier;
+       dp -> ftd_observer = f3 -> error__observer -> parm;
+       dp -> ftd_source = f3 -> error__source -> parm;
+       if (f3 -> optionals & opt_FTAM_diag_element_suggested__delay)
+           dp -> ftd_delay = f3 -> suggested__delay;
+       else
+           dp -> ftd_delay = DIAG_NODELAY;
+       if (f3 -> further__details) {
+           register char   *cp;
+
+           if ((cp = qb2str (f3 -> further__details)) == NULL)
+               return ftamlose (fti, FS_GEN (fsb), 1, NULLCP,
+                                "out of memory");
+           (void) strncpy (dp -> ftd_data, cp, sizeof dp -> ftd_data);
+           dp -> ftd_data[sizeof dp -> ftd_data - 1] = NULL;
+           dp -> ftd_cc = strlen (dp -> ftd_data);
+           free (cp);
+       }
+       else
+           dp -> ftd_cc = 0;
+
+       dp++, i++;
+    }
+
+    *ndiag = i;
+
+    return OK;
+}
diff --git a/usr/src/contrib/isode/ftam/ftamdocument.c b/usr/src/contrib/isode/ftam/ftamdocument.c
new file mode 100644 (file)
index 0000000..432f19b
--- /dev/null
@@ -0,0 +1,180 @@
+/* ftamdocument.c - FTAM document database */
+
+#ifndef        lint
+static char *rcsid = "$Header: /f/osi/ftam/RCS/ftamdocument.c,v 7.1 91/02/22 09:22:48 mrose Interim $";
+#endif
+
+/* 
+ * $Header: /f/osi/ftam/RCS/ftamdocument.c,v 7.1 91/02/22 09:22:48 mrose Interim $
+ *
+ *
+ * $Log:       ftamdocument.c,v $
+ * Revision 7.1  91/02/22  09:22:48  mrose
+ * Interim 6.8
+ * 
+ * Revision 7.0  89/11/23  21:53:33  mrose
+ * Release 6.0
+ * 
+ */
+
+/*
+ *                               NOTICE
+ *
+ *    Acquisition, use, and distribution of this module and related
+ *    materials are subject to the restrictions of a license agreement.
+ *    Consult the Preface in the User's Manual for the full terms of
+ *    this agreement.
+ *
+ */
+
+
+/* LINTLIBRARY */
+
+#include <stdio.h>
+#include "ftam.h"
+#include "tailor.h"
+
+/* \f   DATA */
+
+static char *isodocuments = "isodocuments";
+
+static FILE *servf = NULL;
+static int   stayopen = 0;
+
+static struct isodocument ids;
+
+/* \f */
+
+int    setisodocument (f)
+int    f;
+{
+    if (servf == NULL)
+       servf = fopen (isodefile (isodocuments, 0), "r");
+    else
+       rewind (servf);
+    stayopen |= f;
+
+    return (servf != NULL);
+}
+
+
+int    endisodocument () {
+    if (servf && !stayopen) {
+       (void) fclose (servf);
+       servf = NULL;
+    }
+
+    return 1;
+}
+
+/* \f */
+
+struct isodocument *getisodocument () {
+    register char  *cp;
+    register struct isodocument *id = &ids;
+    static char buffer[BUFSIZ + 1];
+    static char *vec[NVEC + NSLACK + 1];
+
+    if (servf == NULL
+           && (servf = fopen (isodefile (isodocuments, 0), "r")) == NULL)
+       return NULL;
+
+    if (id -> id_type)
+       oid_free (id -> id_type);
+    if (id -> id_abstract)
+       oid_free (id -> id_abstract);
+    if (id -> id_transfer)
+       oid_free (id -> id_transfer);
+    if (id -> id_model)
+       oid_free (id -> id_model);
+    if (id -> id_constraint)
+       oid_free (id -> id_constraint);
+
+    bzero ((char *) id, sizeof *id);
+
+    while (fgets (buffer, sizeof buffer, servf) != NULL) {
+       if (*buffer == '#')
+           continue;
+       if (cp = index (buffer, '\n'))
+           *cp = NULL;
+       if (str2vec (buffer, vec) < 6)
+           continue;
+
+       id -> id_entry = vec[0];
+
+       if ((id -> id_type = str2oid (vec[1])) == NULLOID
+               || (id -> id_type = oid_cpy (id -> id_type)) == NULLOID)
+           continue;
+
+       if ((id -> id_abstract = str2oid (vec[2])) == NULLOID
+               || (id -> id_abstract = oid_cpy (id -> id_abstract))
+                       == NULLOID)
+           goto free1;
+
+       if ((id -> id_transfer = str2oid (vec[3])) == NULLOID
+               || (id -> id_transfer = oid_cpy (id -> id_transfer))
+                       == NULLOID)
+           goto free2;
+
+       if ((id -> id_model = str2oid (vec[4])) == NULLOID
+               || (id -> id_model = oid_cpy (id -> id_model)) == NULLOID)
+           goto free3;
+
+       if ((id -> id_constraint = str2oid (vec[5])) == NULLOID
+               || (id -> id_constraint = oid_cpy (id -> id_constraint))
+               == NULLOID) {
+           oid_free (id -> id_model);
+           id -> id_model = NULLOID;
+
+    free3: ;
+           oid_free (id -> id_transfer);
+           id -> id_transfer = NULLOID;
+
+    free2:  ;
+           oid_free (id -> id_abstract);
+           id -> id_abstract = NULLOID;
+
+    free1:  ;
+           oid_free (id -> id_type);
+           id -> id_type = NULLOID;
+
+           continue;
+       }
+
+       return id;
+    }
+
+    return NULL;
+}
+
+/* \f */
+
+struct isodocument *getisodocumentbyentry (entry)
+char    *entry;
+{
+    register struct isodocument *id;
+
+    (void) setisodocument (0);
+    while (id = getisodocument ())
+       if (strcmp (id -> id_entry, entry) == 0)
+           break;
+    (void) endisodocument ();
+
+    return id;
+}
+
+/* \f */
+
+struct isodocument *getisodocumentbytype (type)
+OID    type;
+{
+    register struct isodocument *id;
+
+    (void) setisodocument (0);
+    while (id = getisodocument ())
+       if (oid_cmp (id -> id_type, type) == 0)
+           break;
+    (void) endisodocument ();
+
+    return id;
+}
diff --git a/usr/src/contrib/isode/ftam/ftamerror.c b/usr/src/contrib/isode/ftam/ftamerror.c
new file mode 100644 (file)
index 0000000..91cae91
--- /dev/null
@@ -0,0 +1,279 @@
+/* ftamerror.c - return FTAM error code in string form */
+
+#ifndef        lint
+static char *rcsid = "$Header: /f/osi/ftam/RCS/ftamerror.c,v 7.1 91/02/22 09:22:50 mrose Interim $";
+#endif
+
+/* 
+ * $Header: /f/osi/ftam/RCS/ftamerror.c,v 7.1 91/02/22 09:22:50 mrose Interim $
+ *
+ *
+ * $Log:       ftamerror.c,v $
+ * Revision 7.1  91/02/22  09:22:50  mrose
+ * Interim 6.8
+ * 
+ * Revision 7.0  89/11/23  21:53:34  mrose
+ * Release 6.0
+ * 
+ */
+
+/*
+ *                               NOTICE
+ *
+ *    Acquisition, use, and distribution of this module and related
+ *    materials are subject to the restrictions of a license agreement.
+ *    Consult the Preface in the User's Manual for the full terms of
+ *    this agreement.
+ *
+ */
+
+
+/* LINTLIBRARY */
+
+#include <stdio.h>
+#include "ftam.h"
+
+/* \f   DATA */
+
+static char *diag_gen[] = {
+    "No reason",
+    "Responder error (unspecific)",
+    "System shutdown",
+    "FTAM management problem (unspecific)",
+    "FTAM management, bad account",
+    "FTAM management, security not passed",
+    "Delay may be encountered",
+    "Initiator error (unspecific)",
+    "Subsequent error",
+    "Temporal insufficiency of resources",
+    "Access request violates VFS security",
+    "Access request violates local security",
+    "Indications waiting"
+};
+
+static int diag_gen_cnt = sizeof diag_gen / sizeof diag_gen[0];
+
+
+static char *diag_pro[] = {
+    "Conflicting parameter values",
+    "Unsupported parameter values",
+    "Mandatory parameter not set",
+    "Unsupported parameter",
+    "Duplicated parameter",
+    "Illegal parameter type",
+    "Unsupported parameter type",
+    "FTAM protocol error (unspecific)",
+    "FTAM protocol error, procedure error",
+    "FTAM protocol error, functional unit error",
+    "FTAM protocol error, corruption error",
+    "Lower layer failure",
+    "Lower layer addressing error",
+    "Timeout",
+    "System shutdown",
+    "Illegal grouping sequence",
+    "Grouping threshold violation",
+    "Specific PDU request inconsistent with the current requested access"
+};
+
+static int diag_pro_cnt = sizeof diag_pro / sizeof diag_pro[0];
+
+
+static char *diag_acs[] = {
+    "Association with user not allowed",
+    "not assigned, #2001",
+    "Unsupported service class",
+    "Unsupported functional unit",
+    "Attribute group error (unspecific)",
+    "Attribute group not supported",
+    "Attribute group not allowed",
+    "Bad account",
+    "Association management (unspecific)",
+    "Association management - bad address",
+    "Association management - bad account",
+    "Checkpoint window error - too large",
+    "Checkpoint window error - too small",
+    "Checkpoint window error - unsupported",
+    "Communications QoS not supported",
+    "Initiator identity unacceptable",
+    "Context management refused",
+    "Rollback not available",
+    "Contents type list cut by responder",
+    "Contents type list cut by Presentation service",
+    "Invalid filestore password",
+    "Incompatible service classes"
+};
+
+static int diag_acs_cnt = sizeof diag_acs / sizeof diag_acs[0];
+
+
+static char *diag_sel[] = {
+    "Filename not found",
+    "Selection attributes not matched",
+    "Initial attributes not possible",
+    "Bad attribute name",
+    "Non-existent file",
+    "File already exists",
+    "File can not be created",
+    "File can not be deleted",
+    "Concurrency control not available",
+    "Concurrency control not supported",
+    "Concurrency control not possible",
+    "More restrictive lock",
+    "File busy",
+    "File not available",
+    "Access control not available",
+    "Access control not supported",
+    "Access control inconsistent",
+    "Filename truncated",
+    "Initial attributes altered",
+    "Bad account",
+    "Override selected existing file",
+    "Override deleted and recreated file with old attributes",
+    "Create override deleted and recreated file with new attributes",
+    "Create override - not possible",
+    "Ambiguous file specification",
+    "Invalid create password",
+    "Invalid delete password on override",
+    "Bad attribute value",
+    "Requested access violates permitted actions",
+    "Functional unit not available for requested access",
+    "File created but not selected"
+};
+
+static int diag_sel_cnt = sizeof diag_sel / sizeof diag_sel[0];
+
+
+static char *diag_mgt[] = {
+    "Attribute non-existant",
+    "Attribute cannot be read",
+    "Attribute cannot be changed",
+    "Attribute not supported",
+    "Bad attribute name",
+    "Bad attribute value",
+    "Attribute partially supported",
+    "Additional set attribute not distinct"
+};
+
+static int diag_mgt_cnt = sizeof diag_mgt / sizeof diag_mgt[0];
+
+
+static char *diag_acc[] = {
+    "Bad FADU (unspecific)",
+    "Bad FADU - size error",
+    "Bad FADU - type error",
+    "Bad FADU - poorly specified",
+    "Bad FADU - bad location",
+    "FADU does not exist",
+    "FADU not available (unspecific)",
+    "FADU not available for reading",
+    "FADU not available for writing",
+    "FADU not available for location",
+    "FADU not available for erasure",
+    "FADU cannot be inserted",
+    "FADU cannot be replaced",
+    "FADU cannot be located",
+    "Bad data element type",
+    "Operation not available",
+    "Operation not supported",
+    "Operation inconsistent",
+    "Concurrency control not available",
+    "Concurrency control not supported",
+    "Concurrency control inconsistent",
+    "Processing mode not available",
+    "Processing mode not supported",
+    "Processing mode inconsistent",
+    "Access context not available",
+    "Access context not supported",
+    "Bad write (unspecific)",
+    "Bad read (unspecific)",
+    "Local failure (unspecific)",
+    "Local failure - file space exhausted",
+    "Local failure - data corrupted",
+    "Local failure - device failure",
+    "Future file size exceeded",
+    "not assigned, #5033",
+    "Future file size increased",
+    "Functional unit invalid in processing mode",
+    "Contents type inconsistent",
+    "Contents type simplified",
+    "Duplicate FADU name",
+    "Damage to select/open regime",
+    "FADU locking not available on file",
+    "FADU locked by another user"
+};
+
+static int diag_acc_cnt = sizeof diag_acc / sizeof diag_acc[0];
+
+
+static char *diag_rvy[] = {
+    "Bad checkpoint (unspecific)",
+    "Activity not unique",
+    "Checkpoint outside window",
+    "Activity no longer exists",
+    "Activity not recognized",
+    "No docket",
+    "Corrupt docket",
+    "File waiting restart",
+    "Bad recovery point",
+    "Non-existent recovery point",
+    "Recovery mode not available",
+    "Recovery mode inconsistent",
+    "Recovery mode reduced",
+    "Access control not available",
+    "Access control not supported",
+    "Access control inconsistent",
+    "Contents type inconsistent",
+    "Contents type simplified"
+};
+
+static int diag_rvy_cnt = sizeof diag_rvy / sizeof diag_rvy[0];
+
+/* \f */
+
+char   *FErrString (code)
+register int code;
+{
+    register int    offset;
+    char    buffer[BUFSIZ];
+
+    offset = FS_CODE2OFF (code);
+    switch (code - offset) {
+       case FS_GEN_BASE: 
+           if (offset < diag_gen_cnt)
+               return diag_gen[offset];
+           break;
+
+       case FS_PRO_BASE: 
+           if (offset < diag_pro_cnt)
+               return diag_pro[offset];
+           break;
+
+       case FS_ACS_BASE: 
+           if (offset < diag_acs_cnt)
+               return diag_acs[offset];
+           break;
+
+       case FS_SEL_BASE: 
+           if (offset < diag_sel_cnt)
+               return diag_sel[offset];
+           break;
+
+       case FS_MGT_BASE: 
+           if (offset < diag_mgt_cnt)
+               return diag_mgt[offset];
+           break;
+
+       case FS_ACC_BASE: 
+           if (offset < diag_acc_cnt)
+               return diag_acc[offset];
+           break;
+
+       case FS_RVY_BASE: 
+           if (offset < diag_rvy_cnt)
+               return diag_rvy[offset];
+           break;
+    }
+
+    (void) sprintf (buffer, "unknown error code %d", code);
+    return buffer;
+}
diff --git a/usr/src/contrib/isode/ftam/ftamfaduid.c b/usr/src/contrib/isode/ftam/ftamfaduid.c
new file mode 100644 (file)
index 0000000..aada06c
--- /dev/null
@@ -0,0 +1,205 @@
+/* ftamfaduid.c - FPM: encode/decode FADU identities */
+
+#ifndef        lint
+static char *rcsid = "$Header: /f/osi/ftam/RCS/ftamfaduid.c,v 7.1 91/02/22 09:22:51 mrose Interim $";
+#endif
+
+/* 
+ * $Header: /f/osi/ftam/RCS/ftamfaduid.c,v 7.1 91/02/22 09:22:51 mrose Interim $
+ *
+ *
+ * $Log:       ftamfaduid.c,v $
+ * Revision 7.1  91/02/22  09:22:51  mrose
+ * Interim 6.8
+ * 
+ * Revision 7.0  89/11/23  21:53:36  mrose
+ * Release 6.0
+ * 
+ */
+
+/*
+ *                               NOTICE
+ *
+ *    Acquisition, use, and distribution of this module and related
+ *    materials are subject to the restrictions of a license agreement.
+ *    Consult the Preface in the User's Manual for the full terms of
+ *    this agreement.
+ *
+ */
+
+
+/* LINTLIBRARY */
+
+#include <stdio.h>
+#include "fpkt.h"
+
+/* \f */
+
+struct type_FTAM_FADU__Identity *faduid2fpm (fsb, fa, fti)
+register struct ftamblk *fsb;
+register struct FADUidentity *fa;
+struct FTAMindication *fti;
+{
+    register int    n;
+    register char **ap;
+    register struct type_FTAM_FADU__Identity *fpm;
+    register struct name_element **f4;
+
+    if ((fpm = (struct type_FTAM_FADU__Identity *) calloc (1, sizeof *fpm))
+           == NULL) {
+no_mem: ;
+       (void) ftamlose (fti, FS_GEN (fsb), 1, NULLCP, "out of memory");
+out: ;
+       if (fpm)
+           free_FTAM_FADU__Identity (fpm);
+       return NULL;
+    }
+
+    switch (fa -> fa_type) {
+       case FA_FIRSTLAST:
+           fpm -> offset = type_FTAM_FADU__Identity_first__last;
+           switch (fa -> fa_firstlast) {
+               case FA_FIRST:
+               case FA_LAST:
+                   break;
+
+               default:
+bad_value:;
+                   (void) ftamlose (fti, FS_GEN (fsb), 0, NULLCP,
+                                    "bad value in FADU identity");
+                   goto out;
+           }
+           fpm -> un.first__last = fa -> fa_firstlast;
+           break;
+
+       case FA_RELATIVE:
+           fpm -> offset = type_FTAM_FADU__Identity_relative;
+           switch (fa -> fa_relative) {
+               case FA_PREVIOUS:
+               case FA_CURRENT:
+               case FA_NEXT:
+                   break;
+
+               default:
+                   goto bad_value;
+           }
+           fpm -> un.relative = fa -> fa_relative;
+           break;
+
+       case FA_BEGINEND:
+           fpm -> offset = type_FTAM_FADU__Identity_begin__end;
+           switch (fa -> fa_beginend) {
+               case FA_BEGIN:
+               case FA_END:
+                   break;
+
+               default:
+                   goto out;
+           }
+           fpm -> un.begin__end = fa -> fa_beginend;
+           break;
+
+       case FA_SINGLE:
+           if (!fa -> fa_singlename)
+               goto bad_value;
+           fpm -> offset = type_FTAM_FADU__Identity_single__name;
+           if ((fpm -> un.single__name =
+                       str2qb (fa -> fa_singlename,
+                               strlen (fa -> fa_singlename),
+                               1)) == NULL)
+               goto no_mem;
+           break;
+
+       case FA_NAMELIST:
+           f4 = &fpm -> un.name__list;
+           for (n = fa -> fa_nname - 1, ap = fa -> fa_names;
+                    n >= 0;
+                    ap++, n--) {
+               if (!*ap)
+                   goto bad_value;
+               if ((*f4 = (struct name_element *) calloc (1, sizeof **f4))
+                           == NULL
+                       || ((*f4) -> Node__Name =
+                               str2qb (*ap, strlen (*ap), 1)) == NULL)
+                   goto no_mem;
+               f4 = &((*f4) -> next);
+           }
+           break;
+
+       case FA_FADUNUMBER:
+           fpm -> offset = type_FTAM_FADU__Identity_fadu__number;
+           fpm -> un.fadu__number = fa -> fa_fadunumber;
+           break;
+
+       default:
+           (void) ftamlose (fti, FS_GEN (fsb), 0, NULLCP,
+                            "bad type for FADU identity");
+           goto out;
+    }
+
+    return fpm;
+}
+
+/* \f */
+
+int    fpm2faduid (fsb, fpm, fa, fti)
+register struct ftamblk *fsb;
+register struct type_FTAM_FADU__Identity *fpm;
+register struct FADUidentity *fa;
+struct FTAMindication *fti;
+{
+    register int    n;
+    register char **ap;
+    register struct name_element *f4;
+
+    bzero ((char *) fa, sizeof *fa);
+
+    switch (fpm -> offset) {
+       case type_FTAM_FADU__Identity_first__last:
+           fa -> fa_type = FA_FIRSTLAST;
+           fa -> fa_firstlast = fpm -> un.first__last;
+           break;
+
+       case type_FTAM_FADU__Identity_relative:
+           fa -> fa_type = FA_RELATIVE;
+           fa -> fa_relative = fpm -> un.relative;
+           break;
+
+       case type_FTAM_FADU__Identity_begin__end:
+           fa -> fa_type = FA_BEGINEND;
+           fa -> fa_beginend = fpm -> un.begin__end;
+           break;
+
+       case type_FTAM_FADU__Identity_single__name:
+           fa -> fa_type = FA_SINGLE;
+           if ((fa -> fa_singlename = qb2str (fpm -> un.single__name))
+                   == NULL) {
+no_mem: ;
+               FUFREE (fa);
+               return ftamlose (fti, FS_GEN (fsb), 1, NULLCP,
+                                "out of memory");
+           }
+           break;
+
+       case type_FTAM_FADU__Identity_name__list:
+           fa -> fa_type = FA_NAMELIST;
+           ap = fa -> fa_names, n = NANAME;
+           for (f4 = fpm -> un.name__list; f4; f4 = f4 -> next) {
+               if (n-- <= 0) {
+                   FUFREE (fa);
+                   return ftamlose (fti, FS_GEN (fsb), 1, NULLCP,
+                                    "too many nodes in FADU name");
+               }
+               if ((*ap++ = qb2str (f4 -> Node__Name)) == NULL)
+                   goto no_mem;
+           }
+           break;
+
+       case type_FTAM_FADU__Identity_fadu__number:
+           fa -> fa_type = FA_FADUNUMBER;
+           fa -> fa_fadunumber = fpm -> un.fadu__number;
+           break;
+    }
+
+    return OK;
+}
diff --git a/usr/src/contrib/isode/ftam/ftamfdf.c b/usr/src/contrib/isode/ftam/ftamfdf.c
new file mode 100644 (file)
index 0000000..3249cdb
--- /dev/null
@@ -0,0 +1,106 @@
+/* ftamfdf.c - FDF support */
+
+#ifndef        lint
+static char *rcsid = "$Header: /f/osi/ftam/RCS/ftamfdf.c,v 7.1 91/02/22 09:22:53 mrose Interim $";
+#endif
+
+/* 
+ * $Header: /f/osi/ftam/RCS/ftamfdf.c,v 7.1 91/02/22 09:22:53 mrose Interim $
+ *
+ *
+ * $Log:       ftamfdf.c,v $
+ * Revision 7.1  91/02/22  09:22:53  mrose
+ * Interim 6.8
+ * 
+ * Revision 7.0  89/11/23  21:53:37  mrose
+ * Release 6.0
+ * 
+ */
+
+/*
+ *                               NOTICE
+ *
+ *    Acquisition, use, and distribution of this module and related
+ *    materials are subject to the restrictions of a license agreement.
+ *    Consult the Preface in the User's Manual for the full terms of
+ *    this agreement.
+ *
+ */
+
+
+/* LINTLIBRARY */
+
+#include <stdio.h>
+#include "fpkt.h"
+
+/* \f */
+
+int    fdf_p2names (fd, bits, names, fti)
+int    fd;
+PE     bits;
+int    *names;
+struct FTAMindication *fti;
+{
+    register struct ftamblk *fsb;
+
+    if ((fsb = findfsblk (fd)) == NULL)
+       return ftamlose (fti, FS_GEN_NOREASON, 0, NULLCP,
+                        "invalid ftam descriptor");
+
+    return fpm2bits (fsb, fname_pairs, bits, names, fti);
+}
+
+/* \f */
+
+int    fdf_names2p (fd, names, bits, fti)
+int    fd;
+int     names;
+PE     *bits;
+struct FTAMindication *fti;
+{
+    register struct ftamblk *fsb;
+
+    if ((fsb = findfsblk (fd)) == NULL)
+       return ftamlose (fti, FS_GEN_NOREASON, 0, NULLCP,
+                        "invalid ftam descriptor");
+
+    if ((*bits) = bits2fpm (fsb, fname_pairs, names, fti))
+       return OK;
+    return NOTOK;
+}
+
+/* \f */
+
+int    fdf_attrs2d (fd, fa, attrs, fti)
+int    fd;
+struct FTAMattributes *fa;
+struct type_FTAM_Read__Attributes **attrs;
+struct FTAMindication *fti;
+{
+    register struct ftamblk *fsb;
+
+    if ((fsb = findfsblk (fd)) == NULL)
+       return ftamlose (fti, FS_GEN_NOREASON, 0, NULLCP,
+                        "invalid ftam descriptor");
+
+    if ((*attrs) = attr2fpm (fsb, fa, fti))
+       return OK;
+    return NOTOK;
+}
+
+/* \f */
+
+int    fdf_d2attrs (fd, attrs, fa, fti)
+int    fd;
+struct type_FTAM_Read__Attributes *attrs;
+struct FTAMattributes *fa;
+struct FTAMindication *fti;
+{
+    register struct ftamblk *fsb;
+
+    if ((fsb = findfsblk (fd)) == NULL)
+       return ftamlose (fti, FS_GEN_NOREASON, 0, NULLCP,
+                        "invalid ftam descriptor");
+
+    return fpm2attr (fsb, attrs, fa, fti);
+}
diff --git a/usr/src/contrib/isode/ftam/ftamgroup1.c b/usr/src/contrib/isode/ftam/ftamgroup1.c
new file mode 100644 (file)
index 0000000..cd4cced
--- /dev/null
@@ -0,0 +1,726 @@
+/* ftamgroup1.c - FPM: initiate a grouped transaction */
+
+#ifndef        lint
+static char *rcsid = "$Header: /f/osi/ftam/RCS/ftamgroup1.c,v 7.1 91/02/22 09:22:54 mrose Interim $";
+#endif
+
+/* 
+ * $Header: /f/osi/ftam/RCS/ftamgroup1.c,v 7.1 91/02/22 09:22:54 mrose Interim $
+ *
+ *
+ * $Log:       ftamgroup1.c,v $
+ * Revision 7.1  91/02/22  09:22:54  mrose
+ * Interim 6.8
+ * 
+ * Revision 7.0  89/11/23  21:53:37  mrose
+ * Release 6.0
+ * 
+ */
+
+/*
+ *                               NOTICE
+ *
+ *    Acquisition, use, and distribution of this module and related
+ *    materials are subject to the restrictions of a license agreement.
+ *    Consult the Preface in the User's Manual for the full terms of
+ *    this agreement.
+ *
+ */
+
+
+/* LINTLIBRARY */
+
+#include <stdio.h>
+#include <signal.h>
+#include "fpkt.h"
+
+/* \f   F-{MANAGE,BULK-{BEGIN,END}}.REQUEST (group) */
+
+int     FManageRequest (sd, ftg, fti)
+int     sd;
+struct FTAMgroup   *ftg;
+struct FTAMindication  *fti;
+{
+    return FGroupRequest (sd, ftg, FTI_MANAGEMENT, FSB_MANAGEMENT, fti);
+}
+
+
+int     FBulkBeginRequest (sd, ftg, fti)
+int     sd;
+struct FTAMgroup   *ftg;
+struct FTAMindication  *fti;
+{
+    return FGroupRequest (sd, ftg, FTI_BULKBEGIN, FSB_BULKBEGIN, fti);
+}
+
+
+int     FBulkEndRequest (sd, ftg, fti)
+int     sd;
+struct FTAMgroup   *ftg;
+struct FTAMindication  *fti;
+{
+    return FGroupRequest (sd, ftg, FTI_BULKEND, FSB_BULKEND, fti);
+}
+
+/* \f   F-GROUP.REQUEST (group) */
+
+static int  FGroupRequest (sd, ftg, type, state, fti)
+int     sd;
+struct FTAMgroup   *ftg;
+int    type,
+       state;
+struct FTAMindication  *fti;
+{
+    SBV            smask;
+    int            result;
+    register struct ftamblk *fsb;
+
+    missingP (ftg);
+    missingP (fti);
+
+    smask = sigioblock ();
+
+    ftamPsig (fsb, sd);
+
+    if ((result = figrpchk (fsb, ftg, type, fti)) != NOTOK)
+       result = FGroupRequestAux (fsb, ftg, state, fti);
+
+    (void) sigiomask (smask);
+
+    return result;
+}
+
+/* \f */
+
+static int  FGroupRequestAux (fsb, ftg, state, fti)
+register struct ftamblk *fsb;
+register struct FTAMgroup  *ftg;
+int    state;
+struct FTAMindication  *fti;
+{
+    register int    i;
+    int     did_loop,
+           npdu,
+           result;
+    char  **txp,
+          *texts[NPDATA];
+    PE     pe,
+          *pep,
+           info[NPDATA];
+    struct PSAPindication   pis;
+    struct PSAPindication *pi = &pis;
+    struct PSAPabort  *pa = &pi -> pi_abort;
+    struct type_FTAM_PDU **pdup,
+                         *pdus[NPDATA];
+
+    bzero ((char *) texts, sizeof texts);
+    bzero ((char *) info, sizeof info);
+    bzero ((char *) pdus, sizeof pdus);
+
+    did_loop = 0;
+    if ((result = figrp2pdus (fsb, ftg, pdus, texts, &npdu, fti)) == NOTOK)
+       goto out;
+
+    for (pdup = pdus, pep = info, txp = texts, i = npdu - 1;
+           i >= 0;
+           pdup++, pep++, txp++, i--) {
+       pe = NULLPE;
+       if (encode_FTAM_PDU (&pe, 1, 0, NULLCP, *pdup) == NOTOK) {
+           result = ftamlose (fti, FS_GEN (fsb), 1, NULLCP,
+                              "error encoding PDU: %s", PY_pepy);          
+           goto out;
+       }
+       (*pep = pe) -> pe_context = fsb -> fsb_id;
+
+       fsbtrace (fsb, (fsb -> fsb_fd, "P-DATA.REQUEST", *txp, pe, 0));
+    }
+    did_loop = 1;
+
+    result = PDataRequest (fsb -> fsb_fd, info, npdu, pi);
+
+out: ;
+    for (pdup = pdus, pep = info, i = NPDATA - 1;
+           i >= 0;
+           pdup++, pep++, i--) {
+       if (*pep)
+           pe_free (*pep);
+       if (*pdup)
+           free_FTAM_PDU (*pdup);
+    }
+
+    if (result == NOTOK) {
+       if (did_loop)
+           (void) ps2ftamlose (fsb, fti, "PDataRequest", pa);
+       if (fti -> fti_abort.fta_action == FACTION_PERM)
+           freefsblk (fsb);
+
+       return NOTOK;
+    }
+
+    fsb -> fsb_state = state;
+    fsb -> fsb_group = ftg -> ftg_flags;
+    
+    return FWaitRequestAux (fsb, NOTOK, fti);
+}
+
+/* \f */
+
+static int  figrpchk (fsb, ftg, type, fti)
+register struct ftamblk *fsb;
+register struct FTAMgroup *ftg;
+int    type;
+struct FTAMindication *fti;
+{
+    int     i,
+            request;
+    register struct FTAMpasswords  *fp;
+    register struct FTAMconcurrency *fc;
+
+    if (!(fsb -> fsb_flags & FSB_INIT))
+       return ftamlose (fti, FS_GEN (fsb), 0, NULLCP, "not initiator");
+    switch (fsb -> fsb_state) {
+       case FSB_INITIALIZED: 
+           if (type == FTI_BULKEND)
+               goto wrong_state;
+           break;
+
+       case FSB_DATAIDLE: 
+           if (type != FTI_BULKEND)
+               goto wrong_state;
+           break;
+
+       default: 
+    wrong_state: ;
+           return ftamlose (fti, FS_GEN (fsb), 0, NULLCP, "wrong state");
+    }
+
+    switch (fsb -> fsb_class) {
+       case FCLASS_TRANSFER: 
+           if (type != FTI_MANAGEMENT)
+               break;
+           goto bad_class;
+
+       case FCLASS_MANAGE: 
+           if (type == FTI_MANAGEMENT)
+               break;
+           goto bad_class;
+
+       case FCLASS_TM: 
+       case FCLASS_ACCESS: 
+           break;
+
+       default: 
+    bad_class: ;
+           return ftamlose (fti, FS_GEN (fsb), 0, NULLCP,
+                   "file management not permitted");
+    }
+
+    if (!(ftg -> ftg_flags & FTG_BEGIN) || !(ftg -> ftg_flags & FTG_END))
+       return ftamlose (fti, FS_GEN (fsb), 0, NULLCP, "must be grouped");
+
+    switch (type) {
+       case FTI_MANAGEMENT: 
+       case FTI_BULKBEGIN: 
+           if ((ftg -> ftg_flags & (FTG_SELECT | FTG_CREATE)) == 0
+                   || (ftg -> ftg_flags & (FTG_SELECT | FTG_CREATE))
+                   == (FTG_SELECT | FTG_CREATE))
+               return ftamlose (fti, FS_GEN (fsb), 0, NULLCP,
+                       "missing/duplicate select/create request");
+           if (type == FTI_MANAGEMENT) {
+               if (ftg -> ftg_flags & (FTG_OPEN | FTG_CLOSE))
+                   return ftamlose (fti, FS_GEN (fsb), 0, NULLCP,
+                           "file transfer not permitted");
+               goto finish_end;
+           }
+           if (!(ftg -> ftg_flags & FTG_OPEN))
+               return ftamlose (fti, FS_GEN (fsb), 0, NULLCP,
+                       "missing open request");
+           if (ftg -> ftg_flags & (FTG_CLOSE | FTG_DESELECT | FTG_DELETE))
+               return ftamlose (fti, FS_GEN (fsb), 0, NULLCP,
+                       "file management/close not permitted");
+           break;
+
+       case FTI_BULKEND: 
+           if (ftg -> ftg_flags & (FTG_SELECT | FTG_CREATE | FTG_OPEN))
+               return ftamlose (fti, FS_GEN (fsb), 0, NULLCP,
+                       "file management/open not permitted");
+           if ((ftg -> ftg_flags & FTG_CLOSE) == 0)
+               return ftamlose (fti, FS_GEN (fsb), 0, NULLCP,
+                       "missing close request");
+
+    finish_end: ;
+           if ((ftg -> ftg_flags & (FTG_DESELECT | FTG_DELETE)) == 0
+                   || (ftg -> ftg_flags & (FTG_DESELECT | FTG_DELETE))
+                   == (FTG_DESELECT | FTG_DELETE))
+               return ftamlose (fti, FS_GEN (fsb), 0, NULLCP,
+                       "missing/duplicate deselect/delete request");
+           break;
+    }
+
+    if (!(fsb -> fsb_units & FUNIT_GROUPING)
+           && (ftg -> ftg_flags & (FTG_BEGIN | FTG_END)))
+       return ftamlose (fti, FS_GEN (fsb), 0, NULLCP,
+               "grouping not permitted");
+    if (!(fsb -> fsb_units & FUNIT_LIMITED)
+           && (ftg -> ftg_flags & (FTG_CREATE | FTG_RDATTR | FTG_DELETE)))
+       return ftamlose (fti, FS_GEN (fsb), 0, NULLCP,
+               "limited file management not permitted");
+    if (!(fsb -> fsb_units & FUNIT_ENHANCED)
+           && (ftg -> ftg_flags & FTG_CHATTR))
+       return ftamlose (fti, FS_GEN (fsb), 0, NULLCP,
+               "enhanced file management not permitted");
+
+    i = 0;
+
+    if (ftg -> ftg_flags & FTG_SELECT) {
+       register struct FTAMselect *ftse = &ftg -> ftg_select;
+
+       if (ftse -> ftse_attrs.fa_present != FA_FILENAME)
+           return ftamlose (fti, FS_GEN (fsb), 0, NULLCP,
+                   "only filename should be present");
+       if (ftse -> ftse_access & ~FA_REQ_MASK)
+           return ftamlose (fti, FS_GEN (fsb), 0, NULLCP,
+                   "FADU-Identity groups not permitted");
+
+       request = ftse -> ftse_access;
+       fp = &ftse -> ftse_pwds;
+       fc = &ftse -> ftse_conctl;
+
+       goto finish_create;
+    }
+
+    if (ftg -> ftg_flags & FTG_CREATE) {
+       register struct FTAMcreate *ftce = &ftg -> ftg_create;
+
+       switch (ftce -> ftce_override) {
+           case FOVER_FAIL: 
+           case FOVER_SELECT: 
+           case FOVER_WRITE: 
+           case FOVER_DELETE: 
+               break;
+
+           default: 
+               return ftamlose (fti, FS_GEN (fsb), 0, NULLCP,
+                       "bad value for creation mode");
+       }
+       if (!(ftce -> ftce_attrs.fa_present & FA_FILENAME))
+           return ftamlose (fti, FS_GEN (fsb), 0, NULLCP,
+                   "filename not present");
+       if (!(ftce -> ftce_attrs.fa_present & FA_ACTIONS))
+           return ftamlose (fti, FS_GEN (fsb), 0, NULLCP,
+                   "permitted-actions not present");
+       if (!(ftce -> ftce_attrs.fa_present & FA_CONTENTS))
+           return ftamlose (fti, FS_GEN (fsb), 0, NULLCP,
+                   "contents-type not present");
+       if (ftce -> ftce_attrs.fa_present & ~FA_CRE_ATTRS)
+           return ftamlose (fti, FS_GEN (fsb), 0, NULLCP,
+                            "illegal attributes present");
+       if (!(fsb -> fsb_attrs & FATTR_STORAGE)
+               && (ftce -> ftce_attrs.fa_present & FA_STORAGE))
+           return ftamlose (fti, FS_GEN (fsb), 0, NULLCP,
+                   "storage attributes not permitted");
+       if (!(fsb -> fsb_attrs & FATTR_SECURITY)
+               && (ftce -> ftce_attrs.fa_present & FA_SECURITY))
+           return ftamlose (fti, FS_GEN (fsb), 0, NULLCP,
+                   "security attributes not permitted");
+       if (ftce -> ftce_access & ~FA_REQ_MASK)
+           return ftamlose (fti, FS_GEN (fsb), 0, NULLCP,
+                   "FADU-Identity groups not permitted");
+
+       request = ftce -> ftce_access;
+       fp = &ftce -> ftce_pwds;
+       fc = &ftce -> ftce_conctl;
+
+finish_create: ;
+       if (!(fsb -> fsb_attrs & FATTR_SECURITY) && passes_present (fp))
+           return ftamlose (fti, FS_GEN (fsb), 0, NULLCP,
+                   "access passwords not permitted");
+       if (fsb -> fsb_attrs & FATTR_STORAGE) {
+           if ((!(request & FA_PERM_READ)
+                       && fc -> fc_readlock < FLOCK_PRESENT)
+                   || (!(request & FA_PERM_INSERT)
+                       && fc -> fc_insertlock < FLOCK_PRESENT)
+                   || (!(request & FA_PERM_REPLACE)
+                       && fc -> fc_replacelock < FLOCK_PRESENT)
+                   || (!(request & FA_PERM_ERASE)
+                       && fc -> fc_eraselock < FLOCK_PRESENT)
+                   || (!(request & FA_PERM_EXTEND)
+                       && fc -> fc_extendlock < FLOCK_PRESENT)
+                   || (!(request & FA_PERM_READATTR)
+                       && fc -> fc_readattrlock < FLOCK_PRESENT)
+                   || (!(request & FA_PERM_CHNGATTR)
+                       && fc -> fc_chngattrlock < FLOCK_PRESENT)
+                   || (!(request & FA_PERM_DELETE)
+                       && fc -> fc_deletelock < FLOCK_PRESENT))
+               return ftamlose (fti, FS_GEN (fsb), 0, NULLCP,
+                       "bad settings for select/create concurrency control");
+       }
+
+       i++;
+    }
+
+    if (ftg -> ftg_flags & FTG_CLOSE) {
+       register struct FTAMclose   *ftcl = &ftg -> ftg_close;
+       
+       switch (ftcl -> ftcl_action) {
+           case FACTION_SUCCESS: 
+           case FACTION_TRANS: 
+           case FACTION_PERM: 
+               break;
+
+           default: 
+               return ftamlose (fti, FS_GEN (fsb), 0, NULLCP,
+                       "bad value for close action parameter");
+       }
+
+       if (ftcl -> ftcl_ndiag > NFDIAG)
+           return ftamlose (fti, FS_GEN (fsb), 0, NULLCP,
+                   "too many close diagnostics");
+
+       i++;
+    }
+
+    if (ftg -> ftg_flags & FTG_RDATTR) {
+       register struct FTAMreadattr   *ftra = &ftg -> ftg_readattr;
+
+       if (!(fsb -> fsb_attrs & FATTR_STORAGE)
+               && (ftra -> ftra_attrnames & FA_STORAGE))
+           return ftamlose (fti, FS_GEN (fsb), 0, NULLCP,
+                   "storage attributes not permitted");
+       if (!(fsb -> fsb_attrs & FATTR_SECURITY)
+               && (ftra -> ftra_attrnames & FA_SECURITY))
+           return ftamlose (fti, FS_GEN (fsb), 0, NULLCP,
+                   "security attributes not permitted");
+
+       i++;
+    }
+
+    if (ftg -> ftg_flags & FTG_CHATTR) {
+       register struct FTAMchngattr   *ftca = &ftg -> ftg_chngattr;
+
+       if (ftca -> ftca_attrs.fa_present & ftca -> ftca_attrs.fa_novalue)
+           return ftamlose (fti, FS_GEN (fsb), 0, NULLCP,
+                   "attributes can not be changed to no-value-available");
+       if (!(fsb -> fsb_attrs & FATTR_STORAGE)
+               && (ftca -> ftca_attrs.fa_present & FA_STORAGE))
+           return ftamlose (fti, FS_GEN (fsb), 0, NULLCP,
+                   "storage attributes not permitted");
+       if (!(fsb -> fsb_attrs & FATTR_SECURITY)
+               && (ftca -> ftca_attrs.fa_present & FA_SECURITY))
+           return ftamlose (fti, FS_GEN (fsb), 0, NULLCP,
+                   "security attributes not permitted");
+       if (ftca -> ftca_attrs.fa_present & FA_CONTROL)
+           return ftamlose (fti, FS_GEN (fsb), 0, NULLCP,
+                            "encoding of access-control not supported (yet)");
+
+       i++;
+    }
+
+    if (ftg -> ftg_flags & FTG_DESELECT)
+       i++;
+
+    if (ftg -> ftg_flags & FTG_DELETE)
+       i++;
+
+    if (ftg -> ftg_flags & FTG_OPEN) {
+       register struct FTAMopen *ftop = &ftg -> ftg_open;
+       
+       if ((request = ftop -> ftop_mode) & ~FA_MODE_MASK)
+           return ftamlose (fti, FS_GEN (fsb), 0, NULLCP,
+                       "bad open mode");
+#ifdef notdef
+       if (ftop -> ftop_contents == NULLOID)
+           return ftamlose (fti, FS_GEN (fsb), 0, NULLCP,
+                       "missing contents type in open");
+#endif
+       if (fsb -> fsb_attrs & FATTR_STORAGE) {
+           fc = &ftop -> ftop_conctl;
+           if ((!(request & FA_PERM_READ)
+                       && fc -> fc_readlock < FLOCK_PRESENT)
+                   || (!(request & FA_PERM_INSERT)
+                       && fc -> fc_insertlock < FLOCK_PRESENT)
+                   || (!(request & FA_PERM_REPLACE)
+                       && fc -> fc_replacelock < FLOCK_PRESENT)
+                   || (!(request & FA_PERM_ERASE)
+                       && fc -> fc_eraselock < FLOCK_PRESENT)
+                   || (!(request & FA_PERM_EXTEND)
+                       && fc -> fc_extendlock < FLOCK_PRESENT)
+                   || fc -> fc_readattrlock != FLOCK_NOTREQD
+                   || fc -> fc_chngattrlock != FLOCK_NOTREQD
+                   || fc -> fc_deletelock != FLOCK_NOTREQD)
+               return ftamlose (fti, FS_GEN (fsb), 0, NULLCP,
+                       "bad settings for open concurrency control");
+       }
+
+       i++;
+    }
+
+    if (i != ftg -> ftg_threshold)
+       return ftamlose (fti, FS_GEN (fsb), 0, NULLCP,
+               "threshold mismatch; expecting %d, found %d",
+               ftg -> ftg_threshold, i);
+
+    return OK;
+}
+
+/* \f */
+
+static int  figrp2pdus (fsb, ftg, pdus, texts, npdu, fti)
+register struct ftamblk *fsb;
+register struct FTAMgroup *ftg;
+struct type_FTAM_PDU *pdus[];
+char   *texts[];
+int    *npdu;
+struct FTAMindication *fti;
+{
+    int     i;
+    register struct type_FTAM_PDU *pdu;
+
+    i = 0;
+
+#define        new_pdu(t,o,u,x) \
+       register struct t *req; \
+ \
+       if ((pdu = (struct type_FTAM_PDU *) calloc (1, sizeof *pdu)) == NULL) \
+           goto no_mem; \
+       pdus[i] = pdu; \
+       pdu  -> offset = o; \
+       texts[i++] = x; \
+       if ((req = (struct t *) calloc (1, sizeof *req)) == NULL) \
+           goto no_mem; \
+       pdu -> un.u = req;
+
+#define        new_action(a) \
+    if (a != int_FTAM_Action__Result_success) { \
+       if ((req -> action__result = \
+                       (struct type_FTAM_Action__Result *) \
+                               calloc (1, sizeof *req -> action__result)) \
+               == NULL) \
+           goto no_mem; \
+       req -> action__result -> parm = a; \
+    }
+
+    if (ftg -> ftg_flags & FTG_BEGIN) {
+       new_pdu (type_FTAM_F__BEGIN__GROUP__request,
+                type_FTAM_PDU_f__begin__group__request,
+                f__begin__group__request, "F-BEGIN-GROUP-request");
+       req -> parm = ftg -> ftg_threshold;
+    }
+
+    if (ftg -> ftg_flags & FTG_SELECT) {
+       register struct FTAMselect *ftse = &ftg -> ftg_select;
+
+       new_pdu (type_FTAM_F__SELECT__request,
+                type_FTAM_PDU_f__select__request,
+                f__select__request, "F-SELECT-request");
+       if ((req -> attributes = attr2fpm (fsb, &ftse -> ftse_attrs, fti))
+               == NULL)
+           return NOTOK;
+       if ((req -> requested__access = bits2fpm (fsb, frequested_pairs,
+                                                 ftse -> ftse_access, fti))
+               == NULL)
+           return NOTOK;
+       if (passes_present (&ftse -> ftse_pwds)
+               && (req -> access__passwords = pass2fpm (fsb,
+                                                        &ftse -> ftse_pwds,
+                                                        fti)) == NULL)
+           return NOTOK;
+       if (conctl_present (&ftse -> ftse_conctl)
+               && (req -> concurrency__control =
+                               conctl2fpm (fsb, &ftse -> ftse_conctl, fti))
+                       == NULL)
+           return NOTOK;
+       if (ftse -> ftse_sharedASE
+               && (req -> shared__ASE__information =
+                           shared2fpm (fsb, ftse -> ftse_sharedASE, fti)) == NULL)
+           return NOTOK;
+       if (ftse -> ftse_account
+               && (req -> account = str2qb (ftse -> ftse_account,
+                                            strlen (ftse -> ftse_account), 1))
+                       == NULL)
+           goto no_mem;
+    }
+
+    if (ftg -> ftg_flags & FTG_CREATE) {
+       register struct FTAMcreate *ftce = &ftg -> ftg_create;
+
+       new_pdu (type_FTAM_F__CREATE__request,
+                type_FTAM_PDU_f__create__request,
+                f__create__request, "F-CREATE-request");
+       req -> override = ftce -> ftce_override;
+       if ((req -> initial__attributes = attr2fpm (fsb, &ftce -> ftce_attrs,
+                                                   fti)) == NULL)
+           return NOTOK;
+       if (ftce -> ftce_create) {
+           register struct type_FTAM_Password *p;
+           
+           if ((p = (struct type_FTAM_Password *) calloc (1, sizeof *p))
+                   == NULL)
+               goto no_mem;
+           req -> create__password = p;
+           p -> offset = type_FTAM_Password_binary;
+           if ((p -> un.binary = str2qb (ftce -> ftce_create,
+                                         ftce -> ftce_crelen, 1)) == NULL)
+               goto no_mem;
+       }
+       if ((req -> requested__access = bits2fpm (fsb, frequested_pairs,
+                                                 ftce -> ftce_access, fti))
+               == NULL)
+           return NOTOK;
+       if (passes_present (&ftce -> ftce_pwds)
+               && (req -> access__passwords = pass2fpm (fsb,
+                                                        &ftce -> ftce_pwds,
+                                                        fti)) == NULL)
+           return NOTOK;
+       if (conctl_present (&ftce -> ftce_conctl)
+               && (req -> concurrency__control =
+                               conctl2fpm (fsb, &ftce -> ftce_conctl, fti))
+                       == NULL)
+           return NOTOK;
+       if (ftce -> ftce_sharedASE
+               && (req -> shared__ASE__information =
+                           shared2fpm (fsb, ftce -> ftce_sharedASE, fti)) == NULL)
+           return NOTOK;
+       if (ftce -> ftce_account
+               && (req -> account = str2qb (ftce -> ftce_account,
+                                            strlen (ftce -> ftce_account), 1))
+                       == NULL)
+           goto no_mem;
+    }
+
+    if (ftg -> ftg_flags & FTG_CLOSE) {
+       register struct FTAMclose *ftcl = &ftg -> ftg_close;
+
+       new_pdu (type_FTAM_F__CLOSE__request, type_FTAM_PDU_f__close__request,
+                f__close__request, "F-CLOSE-request");
+       new_action (ftcl -> ftcl_action);
+       if (ftcl -> ftcl_sharedASE
+               && (req -> shared__ASE__information =
+                               shared2fpm (fsb, ftcl -> ftcl_sharedASE, fti))
+                       == NULL)
+           return NOTOK;
+       if (ftcl -> ftcl_ndiag > 0
+               && (req -> diagnostic = diag2fpm (fsb, 0, ftcl -> ftcl_diags,
+                                                 ftcl -> ftcl_ndiag, fti))
+                       == NULL)
+           return NOTOK;
+    }
+
+    if (ftg -> ftg_flags & FTG_RDATTR) {
+       register struct FTAMreadattr   *ftra = &ftg -> ftg_readattr;
+
+       if ((pdu = (struct type_FTAM_PDU *) calloc (1, sizeof *pdu)) == NULL)
+           goto no_mem;
+       pdus[i] = pdu;
+       pdu -> offset = type_FTAM_PDU_f__read__attrib__request;
+       texts[i++] = "F-READ-ATTRIB-request";
+       if ((pdu -> un.f__read__attrib__request =
+                           bits2fpm (fsb, fname_pairs, ftra -> ftra_attrnames,
+                                     fti)) == NULLPE)
+           return NOTOK;
+    }
+
+    if (ftg -> ftg_flags & FTG_CHATTR) {
+       register struct FTAMchngattr   *ftca = &ftg -> ftg_chngattr;
+
+       if ((pdu = (struct type_FTAM_PDU *) calloc (1, sizeof *pdu)) == NULL)
+           goto no_mem;
+       pdus[i] = pdu;
+       pdu -> offset = type_FTAM_PDU_f__change__attrib__request;
+       texts[i++] = "F-CHANGE-ATTRIB-request";
+       if ((pdu -> un.f__change__attrib__request =
+                       attr2fpm (fsb, &ftca -> ftca_attrs, fti)) == NULL)
+           return NOTOK;
+    }
+
+    if (ftg -> ftg_flags & FTG_DESELECT) {
+       register struct FTAMdeselect *ftde = &ftg -> ftg_deselect;
+
+       if ((pdu = (struct type_FTAM_PDU *) calloc (1, sizeof *pdu)) == NULL)
+           goto no_mem;
+       pdus[i] = pdu;
+       pdu -> offset = type_FTAM_PDU_f__deselect__request;
+       texts[i++] = "F-DESELECT-request";
+       if (ftde -> ftde_sharedASE
+               && (pdu -> un.f__deselect__request =
+                       shared2fpm (fsb, ftde -> ftde_sharedASE, fti)) == NULL)
+           return NOTOK;
+    }
+
+    if (ftg -> ftg_flags & FTG_DELETE) {
+       register struct FTAMdelete *ftxe = &ftg -> ftg_delete;
+
+       if ((pdu = (struct type_FTAM_PDU *) calloc (1, sizeof *pdu)) == NULL)
+           goto no_mem;
+       pdus[i] = pdu;
+       pdu -> offset = type_FTAM_PDU_f__delete__request;
+       texts[i++] = "F-DELETE-request";
+       if (ftxe -> ftxe_sharedASE
+               && (pdu -> un.f__deselect__request =
+                       shared2fpm (fsb, ftxe -> ftxe_sharedASE, fti)) == NULL)
+           return NOTOK;
+    }
+    
+    if (ftg -> ftg_flags & FTG_OPEN) {
+       register struct FTAMopen *ftop = &ftg -> ftg_open;
+
+       new_pdu (type_FTAM_F__OPEN__request, type_FTAM_PDU_f__open__request,
+                f__open__request, "F-OPEN-request");
+       if (ftop -> ftop_mode != FA_PERM_READ
+               && (req -> processing__mode = bits2fpm (fsb, fmode_pairs,
+                                                       ftop -> ftop_mode,
+                                                       fti)) == NULL)
+           return NOTOK;
+       if ((req -> contents__type =
+                       (struct choice_FTAM_0 *)
+                               calloc (1, sizeof *req -> contents__type))
+               == NULL)
+           goto no_mem;
+       if (ftop -> ftop_contents) {
+           register struct type_FTAM_Contents__Type__Attribute *proposed;
+
+           req -> contents__type -> offset = choice_FTAM_0_proposed;
+           if ((proposed = (struct type_FTAM_Contents__Type__Attribute *)
+                                       calloc (1, sizeof *proposed)) == NULL)
+               goto no_mem;
+           req -> contents__type -> un.proposed = proposed;
+           if ((proposed -> document__type__name =
+                               oid_cpy (ftop -> ftop_contents)) == NULLOID)
+               goto no_mem;
+           if (proposed -> parameter = ftop -> ftop_parameter)
+               proposed -> parameter -> pe_refcnt++;
+       }
+       else
+           req -> contents__type -> offset = choice_FTAM_0_unknown;
+       if (conctl_present (&ftop -> ftop_conctl)
+               && (req -> concurrency__control =
+                               conctl2fpm (fsb, &ftop -> ftop_conctl, fti))
+                       == NULL)
+           return NOTOK;
+       if (ftop -> ftop_sharedASE
+               && (req -> shared__ASE__information =
+                           shared2fpm (fsb, ftop -> ftop_sharedASE, fti)) == NULL)
+           return NOTOK;
+       if (fsb -> fsb_units & FUNIT_FADULOCK)
+           req -> enable__fadu__locking = ftop -> ftop_locking
+                                               ? int_FTAM_FADU__Lock_on
+                                               : int_FTAM_FADU__Lock_off;
+    }
+
+    if (ftg -> ftg_flags & FTG_END) {
+       if ((pdu = (struct type_FTAM_PDU *) calloc (1, sizeof *pdu)) == NULL)
+           goto no_mem;
+       pdus[i] = pdu;
+       pdu -> offset = type_FTAM_PDU_f__end__group__request;
+       texts[i++] = "F-END-GROUP-request";
+    }
+
+    *npdu = i;
+    return OK;
+
+#undef new_pdu
+#undef new_action
+
+no_mem: ;
+    return ftamlose (fti, FS_GEN (fsb), 1, NULLCP, "out of memory");
+}
diff --git a/usr/src/contrib/isode/ftam/ftamgroup2.c b/usr/src/contrib/isode/ftam/ftamgroup2.c
new file mode 100644 (file)
index 0000000..ed21f37
--- /dev/null
@@ -0,0 +1,718 @@
+/* ftamgroup2.c - FPM: respond to a grouped transaction */
+
+#ifndef        lint
+static char *rcsid = "$Header: /f/osi/ftam/RCS/ftamgroup2.c,v 7.1 91/02/22 09:22:56 mrose Interim $";
+#endif
+
+/* 
+ * $Header: /f/osi/ftam/RCS/ftamgroup2.c,v 7.1 91/02/22 09:22:56 mrose Interim $
+ *
+ *
+ * $Log:       ftamgroup2.c,v $
+ * Revision 7.1  91/02/22  09:22:56  mrose
+ * Interim 6.8
+ * 
+ * Revision 7.0  89/11/23  21:53:39  mrose
+ * Release 6.0
+ * 
+ */
+
+/*
+ *                               NOTICE
+ *
+ *    Acquisition, use, and distribution of this module and related
+ *    materials are subject to the restrictions of a license agreement.
+ *    Consult the Preface in the User's Manual for the full terms of
+ *    this agreement.
+ *
+ */
+
+
+/* LINTLIBRARY */
+
+#include <stdio.h>
+#include <signal.h>
+#include "fpkt.h"
+
+/* \f   F-{MANAGE,BULK-{BEGIN,END}}.RESPONSE (group) */
+
+int     FManageResponse (sd, ftg, fti)
+int     sd;
+struct FTAMgroup   *ftg;
+struct FTAMindication  *fti;
+{
+    return FGroupResponse (sd, ftg, FTI_MANAGEMENT, FSB_INITIALIZED, fti);
+}
+
+
+int     FBulkBeginResponse (sd, ftg, fti)
+int     sd;
+struct FTAMgroup   *ftg;
+struct FTAMindication  *fti;
+{
+    return FGroupResponse (sd, ftg, FTI_BULKBEGIN, FSB_DATAIDLE, fti);
+}
+
+
+int     FBulkEndResponse (sd, ftg, fti)
+int     sd;
+struct FTAMgroup   *ftg;
+struct FTAMindication  *fti;
+{
+    return FGroupResponse (sd, ftg, FTI_BULKEND, FSB_INITIALIZED, fti);
+}
+
+/* \f   F-GROUP.RESPONSE (group) */
+
+static int  FGroupResponse (sd, ftg, type, state, fti)
+int     sd;
+struct FTAMgroup   *ftg;
+int    type,
+       state;
+struct FTAMindication  *fti;
+{
+    SBV            smask;
+    int            result;
+    register struct ftamblk *fsb;
+
+    missingP (ftg);
+    missingP (fti);
+
+    smask = sigioblock ();
+
+    ftamPsig (fsb, sd);
+
+    if ((result = frgrpchk (fsb, ftg, type, fti)) != NOTOK)
+       result = FGroupResponseAux (fsb, ftg, state, fti);
+
+    (void) sigiomask (smask);
+
+    return result;
+}
+
+/* \f */
+
+static int  FGroupResponseAux (fsb, ftg, state, fti)
+register struct ftamblk *fsb;
+register struct FTAMgroup  *ftg;
+int    state;
+struct FTAMindication  *fti;
+{
+    register int    i;
+    int     did_loop,
+           npdu,
+           result,
+           okstate;
+    char  **txp,
+          *texts[NPDATA];
+    PE     pe,
+          *pep,
+           info[NPDATA];
+    struct PSAPindication   pis;
+    struct PSAPindication *pi = &pis;
+    struct PSAPabort  *pa = &pi -> pi_abort;
+    struct type_FTAM_PDU **pdup,
+                         *pdus[NPDATA];
+
+    bzero ((char *) texts, sizeof texts);
+    bzero ((char *) info, sizeof info);
+    bzero ((char *) pdus, sizeof pdus);
+
+    did_loop = 0;
+    if ((result = frgrp2pdus (fsb, ftg, pdus, texts, &npdu, fti)) == NOTOK)
+       goto out;
+    for (pdup = pdus, pep = info, txp = texts, i = npdu - 1;
+           i >= 0;
+           pdup++, pep++, txp++, i--) {
+       pe = NULLPE;
+       if (encode_FTAM_PDU (&pe, 1, 0, NULLCP, *pdup) == NOTOK) {
+           result = ftamlose (fti, FS_GEN (fsb), 1, NULLCP,
+                              "error encoding PDU: %s", PY_pepy);          
+           goto out;
+       }
+       (*pep = pe) -> pe_context = fsb -> fsb_id;
+
+       fsbtrace (fsb, (fsb -> fsb_fd, "P-DATA.REQUEST", *txp, pe, 0));
+    }
+    did_loop = 1;
+
+    result = PDataRequest (fsb -> fsb_fd, info, npdu, pi);
+
+out: ;
+    for (pdup = pdus, pep = info, i = NPDATA - 1;
+           i >= 0;
+           pdup++, pep++, i--) {
+       if (*pep)
+           pe_free (*pep);
+       if (*pdup)
+           free_FTAM_PDU (*pdup);
+    }
+
+    if (result == NOTOK) {
+       if (did_loop)
+           (void) ps2ftamlose (fsb, fti, "PDataRequest", pa);
+       if (fti -> fti_abort.fta_action == FACTION_PERM)
+           freefsblk (fsb);
+
+       return NOTOK;
+    }
+
+    switch (state) {
+       case FSB_DATAIDLE:
+           if (ftg -> ftg_flags & FTG_SELECT)
+               okstate = ftg -> ftg_select.ftse_state;
+           else
+               okstate = ftg -> ftg_create.ftce_state;
+           if (okstate != FSTATE_SUCCESS
+                   || ftg -> ftg_open.ftop_state != FSTATE_SUCCESS) {
+               fsb -> fsb_state = FSB_INITIALIZED;
+               break;
+           }                   /* else fall */
+
+       default:
+           fsb -> fsb_state = state;
+           break;
+    }
+
+    return OK;
+}
+
+/* \f */
+
+static int  frgrpchk (fsb, ftg, type, fti)
+register struct ftamblk *fsb;
+register struct FTAMgroup *ftg;
+int    type;
+struct FTAMindication *fti;
+{
+    if (fsb -> fsb_flags & FSB_INIT)
+       return ftamlose (fti, FS_GEN (fsb), 0, NULLCP, "not responder");
+    switch (fsb -> fsb_state) {
+       case FSB_MANAGEMENT: 
+           if (type != FTI_MANAGEMENT)
+               goto wrong_state;
+           if (ftg -> ftg_flags & ~fsb -> fsb_group) {
+reply_mismatch: ;
+               return ftamlose (fti, FS_GEN (fsb), 0, NULLCP,
+                          "group reply mismatch; expecting 0x%x, found 0x%x",
+                           fsb -> fsb_group, ftg -> ftg_flags);
+           }
+           break;
+
+       case FSB_BULKBEGIN: 
+           if (type != FTI_BULKBEGIN)
+               goto wrong_state;
+           if (ftg -> ftg_flags & ~fsb -> fsb_group)
+               goto reply_mismatch;
+           break;
+
+       case FSB_BULKEND: 
+           if (type != FTI_BULKEND)
+               goto wrong_state;
+           if (ftg -> ftg_flags & ~fsb -> fsb_group)
+               goto reply_mismatch;
+           break;
+
+       default: 
+    wrong_state: ;
+           return ftamlose (fti, FS_GEN (fsb), 0, NULLCP, "wrong state");
+    }
+
+    if (ftg -> ftg_flags & FTG_SELECT) {
+       register struct FTAMselect *ftse = &ftg -> ftg_select;
+
+       switch (ftse -> ftse_state) {
+           case FSTATE_SUCCESS: 
+           case FSTATE_FAILURE:
+               break;
+
+           default: 
+               return ftamlose (fti, FS_GEN (fsb), 0, NULLCP,
+                       "bad value for select state parameter");
+       }
+       switch (ftse -> ftse_action) {
+           case FACTION_SUCCESS: 
+           case FACTION_TRANS: 
+           case FACTION_PERM: 
+               break;
+
+           default: 
+               return ftamlose (fti, FS_GEN (fsb), 0, NULLCP,
+                       "bad value for select action parameter");
+       }
+       if (ftse -> ftse_attrs.fa_present != FA_FILENAME)
+           return ftamlose (fti, FS_GEN (fsb), 0, NULLCP,
+                   "only filename should be present");
+       if (ftse -> ftse_ndiag > NFDIAG)
+           return ftamlose (fti, FS_GEN (fsb), 0, NULLCP,
+                   "too many select diagnostics");
+    }
+
+    if (ftg -> ftg_flags & FTG_CREATE) {
+       register struct FTAMcreate *ftce = &ftg -> ftg_create;
+
+       switch (ftce -> ftce_state) {
+           case FSTATE_SUCCESS: 
+           case FSTATE_FAILURE: 
+               break;
+
+           default: 
+               return ftamlose (fti, FS_GEN (fsb), 0, NULLCP,
+                       "bad value for create state parameter");
+       }
+       switch (ftce -> ftce_action) {
+           case FACTION_SUCCESS: 
+           case FACTION_TRANS: 
+           case FACTION_PERM: 
+               break;
+
+           default: 
+               return ftamlose (fti, FS_GEN (fsb), 0, NULLCP,
+                       "bad value for create action parameter");
+       }
+       if (!(ftce -> ftce_attrs.fa_present & FA_FILENAME))
+           return ftamlose (fti, FS_GEN (fsb), 0, NULLCP,
+                   "filename not present");
+       if (!(ftce -> ftce_attrs.fa_present & FA_ACTIONS))
+           return ftamlose (fti, FS_GEN (fsb), 0, NULLCP,
+                   "permitted-actions not present");
+       if (!(ftce -> ftce_attrs.fa_present & FA_CONTENTS))
+           return ftamlose (fti, FS_GEN (fsb), 0, NULLCP,
+                   "contents-type not present");
+       if (ftce -> ftce_attrs.fa_present & ~FA_CRE_ATTRS)
+           return ftamlose (fti, FS_GEN (fsb), 0, NULLCP,
+                            "illegal attributes present");
+       if (!(fsb -> fsb_attrs & FATTR_STORAGE)
+               && (ftce -> ftce_attrs.fa_present & FA_STORAGE))
+           return ftamlose (fti, FS_GEN (fsb), 0, NULLCP,
+                   "storage attributes not permitted");
+       if (!(fsb -> fsb_attrs & FATTR_SECURITY)
+               && (ftce -> ftce_attrs.fa_present & FA_SECURITY))
+           return ftamlose (fti, FS_GEN (fsb), 0, NULLCP,
+                   "security attributes not permitted");
+       if (ftce -> ftce_ndiag > NFDIAG)
+           return ftamlose (fti, FS_GEN (fsb), 0, NULLCP,
+                   "too many create diagnostics");
+    }
+
+    if (ftg -> ftg_flags & FTG_CLOSE) {
+       register struct FTAMclose     *ftcl = &ftg -> ftg_close;
+       
+       switch (ftcl -> ftcl_action) {
+           case FACTION_SUCCESS: 
+           case FACTION_TRANS: 
+           case FACTION_PERM: 
+               break;
+
+           default: 
+               return ftamlose (fti, FS_GEN (fsb), 0, NULLCP,
+                       "bad value for close action parameter");
+       }
+       if (ftcl -> ftcl_ndiag > NFDIAG)
+           return ftamlose (fti, FS_GEN (fsb), 0, NULLCP,
+                   "too many close diagnostics");
+    }
+
+    if (ftg -> ftg_flags & FTG_RDATTR) {
+       register struct FTAMreadattr   *ftra = &ftg -> ftg_readattr;
+
+       switch (ftra -> ftra_action) {
+           case FACTION_SUCCESS: 
+           case FACTION_TRANS: 
+           case FACTION_PERM: 
+               break;
+
+           default: 
+               return ftamlose (fti, FS_GEN (fsb), 0, NULLCP,
+                       "bad value for read attribute action parameter");
+       }
+       if (!(fsb -> fsb_attrs & FATTR_STORAGE)
+               && (ftra -> ftra_attrs.fa_present & FA_STORAGE))
+           return ftamlose (fti, FS_GEN (fsb), 0, NULLCP,
+                   "storage attributes not permitted");
+       if (!(fsb -> fsb_attrs & FATTR_SECURITY)
+               && (ftra -> ftra_attrs.fa_present & FA_SECURITY))
+           return ftamlose (fti, FS_GEN (fsb), 0, NULLCP,
+                   "security attributes not permitted");
+       if (ftra -> ftra_ndiag > NFDIAG)
+           return ftamlose (fti, FS_GEN (fsb), 0, NULLCP,
+                   "too many read attribute diagnostics");
+    }
+
+    if (ftg -> ftg_flags & FTG_CHATTR) {
+       register struct FTAMchngattr   *ftca = &ftg -> ftg_chngattr;
+
+       switch (ftca -> ftca_action) {
+           case FACTION_SUCCESS: 
+           case FACTION_TRANS: 
+           case FACTION_PERM: 
+               break;
+
+           default: 
+               return ftamlose (fti, FS_GEN (fsb), 0, NULLCP,
+                       "bad value for change attribute action parameter");
+       }
+       if (!(fsb -> fsb_attrs & FATTR_STORAGE)
+               && (ftca -> ftca_attrs.fa_present & FA_STORAGE))
+           return ftamlose (fti, FS_GEN (fsb), 0, NULLCP,
+                   "storage attributes not permitted");
+       if (!(fsb -> fsb_attrs & FATTR_SECURITY)
+               && (ftca -> ftca_attrs.fa_present & FA_SECURITY))
+           return ftamlose (fti, FS_GEN (fsb), 0, NULLCP,
+                   "security attributes not permitted");
+       if (ftca -> ftca_attrs.fa_present & FA_CONTROL)
+           return ftamlose (fti, FS_GEN (fsb), 0, NULLCP,
+                            "encoding of access-control not supported (yet)");
+       if (ftca -> ftca_ndiag > NFDIAG)
+           return ftamlose (fti, FS_GEN (fsb), 0, NULLCP,
+                   "too many change attribute diagnostics");
+    }
+
+    if (ftg -> ftg_flags & FTG_DESELECT) {
+       register struct FTAMdeselect   *ftde = &ftg -> ftg_deselect;
+
+       switch (ftde -> ftde_action) {
+           case FACTION_SUCCESS: 
+           case FACTION_TRANS: 
+           case FACTION_PERM: 
+               break;
+
+           default: 
+               return ftamlose (fti, FS_GEN (fsb), 0, NULLCP,
+                       "bad value for deselect action parameter");
+       }
+       if (!(fsb -> fsb_flags & FSB_DECHARGE)
+               && ftde -> ftde_charges.fc_ncharge > 0)
+           return ftamlose (fti, FS_GEN (fsb), 0, NULLCP,
+                   "deselect not permitted to include charges");
+       if (ftde -> ftde_charges.fc_ncharge > NFCHRG)
+           return ftamlose (fti, FS_GEN (fsb), 0, NULLCP,
+                   "too many deselect charges");
+       if (ftde -> ftde_ndiag > NFDIAG)
+           return ftamlose (fti, FS_GEN (fsb), 0, NULLCP,
+                   "too many deselect diagnostics");
+    }
+
+    if (ftg -> ftg_flags & FTG_DELETE) {
+       register struct FTAMdelete *ftxe = &ftg -> ftg_delete;
+
+       switch (ftxe -> ftxe_action) {
+           case FACTION_SUCCESS: 
+           case FACTION_TRANS: 
+           case FACTION_PERM: 
+               break;
+
+           default: 
+               return ftamlose (fti, FS_GEN (fsb), 0, NULLCP,
+                       "bad value for delete action parameter");
+       }
+       if (ftxe -> ftxe_charges.fc_ncharge > NFCHRG)
+           return ftamlose (fti, FS_GEN (fsb), 0, NULLCP,
+                   "too many delete charges");
+       if (ftxe -> ftxe_ndiag > NFDIAG)
+           return ftamlose (fti, FS_GEN (fsb), 0, NULLCP,
+                   "too many delete diagnostics");
+    }
+
+    if (ftg -> ftg_flags & FTG_OPEN) {
+       register struct FTAMopen *ftop = &ftg -> ftg_open;
+       register struct FTAMconcurrency *fc;
+
+       switch (ftop -> ftop_state) {
+           case FSTATE_SUCCESS: 
+           case FSTATE_FAILURE: 
+               break;
+
+           default: 
+               return ftamlose (fti, FS_GEN (fsb), 0, NULLCP,
+                       "bad value for open state parameter");
+       }
+       switch (ftop -> ftop_action) {
+           case FACTION_SUCCESS: 
+           case FACTION_TRANS: 
+           case FACTION_PERM: 
+               break;
+
+           default: 
+               return ftamlose (fti, FS_GEN (fsb), 0, NULLCP,
+                       "bad value for open action parameter");
+       }
+       if (ftop -> ftop_contents == NULLOID)
+           return ftamlose (fti, FS_GEN (fsb), 0, NULLCP,
+                   "missing open contents type parameter");
+       if (fsb -> fsb_attrs & FATTR_STORAGE) {
+           fc = &ftop -> ftop_conctl;
+           if (fc -> fc_readattrlock != FLOCK_NOTREQD
+                   || fc -> fc_chngattrlock != FLOCK_NOTREQD
+                   || fc -> fc_deletelock != FLOCK_NOTREQD)
+               return ftamlose (fti, FS_GEN (fsb), 0, NULLCP,
+                       "bad settings for open concurrency control");
+       }
+       if (ftop -> ftop_ndiag > NFDIAG)
+           return ftamlose (fti, FS_GEN (fsb), 0, NULLCP,
+                   "too many open diagnostics");
+    }
+
+    return OK;
+}
+
+/* \f */
+
+static int  frgrp2pdus (fsb, ftg, pdus, texts, npdu, fti)
+register struct ftamblk *fsb;
+register struct FTAMgroup *ftg;
+struct type_FTAM_PDU *pdus[];
+char   *texts[];
+int    *npdu;
+struct FTAMindication *fti;
+{
+    int     flags,
+           i;
+    register struct type_FTAM_PDU *pdu;
+
+    i = 0;
+
+#define        new_pdu(t,o,u,x) \
+       register struct t *req; \
+ \
+       if ((pdu = (struct type_FTAM_PDU *) calloc (1, sizeof *pdu)) == NULL) \
+           goto no_mem; \
+       pdus[i] = pdu; \
+       pdu  -> offset = o; \
+       texts[i++] = x; \
+       if ((req = (struct t *) calloc (1, sizeof *req)) == NULL) \
+           goto no_mem; \
+       pdu -> un.u = req;
+
+#define        new_state(s) \
+    if (s != int_FTAM_State__Result_success) { \
+       if ((req -> state__result = \
+                       (struct type_FTAM_State__Result *) \
+                               calloc (1, sizeof *req -> state__result)) \
+               == NULL) \
+           goto no_mem; \
+       req -> state__result -> parm = s; \
+    }
+
+#define        new_action(a) \
+    if (a != int_FTAM_Action__Result_success) { \
+       if ((req -> action__result = \
+                       (struct type_FTAM_Action__Result *) \
+                               calloc (1, sizeof *req -> action__result)) \
+               == NULL) \
+           goto no_mem; \
+       req -> action__result -> parm = a; \
+    }
+
+    if ((flags = ftg -> ftg_flags) & FTG_SELECT) {
+       if (ftg -> ftg_select.ftse_state == FSTATE_FAILURE)
+           flags &= FTG_BEGIN | FTG_SELECT | FTG_END;
+    }
+    else
+       if (flags & FTG_CREATE) {
+           if (ftg -> ftg_create.ftce_state == FSTATE_FAILURE)
+               flags &= FTG_BEGIN | FTG_CREATE | FTG_END;
+       }
+
+    if (flags & FTG_BEGIN) {
+       if ((pdu = (struct type_FTAM_PDU *) calloc (1, sizeof *pdu)) == NULL)
+           goto no_mem;
+       pdus[i] = pdu;
+       pdu -> offset = type_FTAM_PDU_f__begin__group__response;
+       texts[i++] = "F-BEGIN-GROUP-response";
+    }
+
+    if (flags & FTG_SELECT) {
+       register struct FTAMselect *ftse = &ftg -> ftg_select;
+
+       new_pdu (type_FTAM_F__SELECT__response,
+                type_FTAM_PDU_f__select__response,
+                f__select__response, "F-SELECT-response");
+       new_state (ftse -> ftse_state);
+       new_action (ftse -> ftse_action);
+       if ((req -> attributes = attr2fpm (fsb, &ftse -> ftse_attrs, fti))
+               == NULL)
+           return NOTOK;
+       if (ftse -> ftse_sharedASE
+               && (req -> shared__ASE__information =
+                           shared2fpm (fsb, ftse -> ftse_sharedASE, fti)) == NULL)
+           return NOTOK;
+       if (ftse -> ftse_ndiag > 0
+               && (req -> diagnostic = diag2fpm (fsb, 0, ftse -> ftse_diags,
+                                                 ftse -> ftse_ndiag, fti))
+                       == NULL)
+           return NOTOK;
+    }
+
+    if (flags & FTG_CREATE) {
+       register struct FTAMcreate *ftce = &ftg -> ftg_create;
+
+       new_pdu (type_FTAM_F__CREATE__response,
+                type_FTAM_PDU_f__create__response,
+                f__create__response, "F-CREATE-response");
+       new_state (ftce -> ftce_state);
+       new_action (ftce -> ftce_action);
+       if ((req -> initial__attributes = attr2fpm (fsb, &ftce -> ftce_attrs,
+                                                   fti)) == NULL)
+           return NOTOK;
+       if (ftce -> ftce_sharedASE
+               && (req -> shared__ASE__information =
+                           shared2fpm (fsb, ftce -> ftce_sharedASE, fti)) == NULL)
+           return NOTOK;
+       if (ftce -> ftce_ndiag > 0
+               && (req -> diagnostic = diag2fpm (fsb, 0, ftce -> ftce_diags,
+                                                 ftce -> ftce_ndiag, fti))
+                       == NULL)
+           return NOTOK;
+    }
+
+    if (flags & FTG_CLOSE) {
+       register struct FTAMclose *ftcl = &ftg -> ftg_close;
+
+       new_pdu (type_FTAM_F__CLOSE__response,
+                type_FTAM_PDU_f__close__response,
+                f__close__response, "F-CLOSE-response");
+       new_action (ftcl -> ftcl_action);
+       if (ftcl -> ftcl_sharedASE
+               && (req -> shared__ASE__information =
+                           shared2fpm (fsb, ftcl -> ftcl_sharedASE, fti)) == NULL)
+           return NOTOK;
+       if (ftcl -> ftcl_ndiag > 0
+               && (req -> diagnostic = diag2fpm (fsb, 0, ftcl -> ftcl_diags,
+                                                 ftcl -> ftcl_ndiag, fti))
+                       == NULL)
+           return NOTOK;
+    }
+
+    if (flags & FTG_RDATTR) {
+       register struct FTAMreadattr   *ftra = &ftg -> ftg_readattr;
+
+       new_pdu (type_FTAM_F__READ__ATTRIB__response,
+                type_FTAM_PDU_f__read__attrib__response,
+                f__read__attrib__response, "F-READ-ATTRIB-response");
+       new_action (ftra -> ftra_action);
+       if (ftra -> ftra_attrs.fa_present
+               && (req -> attributes = attr2fpm (fsb, &ftra -> ftra_attrs,
+                                                 fti)) == NULL)
+           return NOTOK;
+       if (ftra -> ftra_ndiag > 0
+               && (req -> diagnostic = diag2fpm (fsb, 0, ftra -> ftra_diags,
+                                                 ftra -> ftra_ndiag, fti))
+                       == NULL)
+           return NOTOK;
+    }
+
+    if (flags & FTG_CHATTR) {
+       register struct FTAMchngattr   *ftca = &ftg -> ftg_chngattr;
+
+       new_pdu (type_FTAM_F__CHANGE__ATTRIB__response,
+                type_FTAM_PDU_f__change__attrib__response,
+                f__change__attrib__response, "F-CHANGE-ATTRIB-response");
+       new_action (ftca -> ftca_action);
+       if (ftca -> ftca_attrs.fa_present
+               && (req -> attributes = attr2fpm (fsb, &ftca -> ftca_attrs,
+                                                 fti)) == NULL)
+           return NOTOK;
+       if (ftca -> ftca_ndiag > 0
+               && (req -> diagnostic = diag2fpm (fsb, 0, ftca -> ftca_diags,
+                                                 ftca -> ftca_ndiag, fti))
+                       == NULL)
+           return NOTOK;
+    }
+
+    if (flags & FTG_DESELECT) {
+       register struct FTAMdeselect   *ftde = &ftg -> ftg_deselect;
+
+       new_pdu (type_FTAM_F__DESELECT__response,
+                type_FTAM_PDU_f__deselect__response,
+                f__deselect__response, "F-DESELECT-response");
+       new_action (ftde -> ftde_action);
+       if (ftde -> ftde_sharedASE
+               && (req -> shared__ASE__information =
+                           shared2fpm (fsb, ftde -> ftde_sharedASE, fti)) == NULL)
+           return NOTOK;
+       if (ftde -> ftde_charges.fc_ncharge
+               && (req -> charging = chrg2fpm (fsb, &ftde -> ftde_charges,
+                                               fti)) == NULL)
+           return NOTOK;
+       if (ftde -> ftde_ndiag > 0
+               && (req -> diagnostic = diag2fpm (fsb, 0, ftde -> ftde_diags,
+                                                 ftde -> ftde_ndiag, fti))
+                       == NULL)
+           return NOTOK;
+    }
+
+    if (flags & FTG_DELETE) {
+       register struct FTAMdelete *ftxe = &ftg -> ftg_delete;
+
+       new_pdu (type_FTAM_F__DELETE__response,
+                type_FTAM_PDU_f__delete__response,
+                f__delete__response, "F-DELETE-response");
+       new_action (ftxe -> ftxe_action);
+       if (ftxe -> ftxe_sharedASE
+               && (req -> shared__ASE__information =
+                           shared2fpm (fsb, ftxe -> ftxe_sharedASE, fti)) == NULL)
+           return NOTOK;
+       if (ftxe -> ftxe_charges.fc_ncharge
+               && (req -> charging = chrg2fpm (fsb, &ftxe -> ftxe_charges,
+                                               fti)) == NULL)
+           return NOTOK;
+       if (ftxe -> ftxe_ndiag > 0
+               && (req -> diagnostic = diag2fpm (fsb, 0, ftxe -> ftxe_diags,
+                                                 ftxe -> ftxe_ndiag, fti))
+                       == NULL)
+           return NOTOK;
+    }
+
+    if (flags & FTG_OPEN) {
+       register struct FTAMopen *ftop = &ftg -> ftg_open;
+       register struct type_FTAM_Contents__Type__Attribute *proposed;
+
+       new_pdu (type_FTAM_F__OPEN__response,
+                type_FTAM_PDU_f__open__response,
+                f__open__response, "F-OPEN-response");
+       new_state (ftop -> ftop_state);
+       new_action (ftop -> ftop_action);
+       if ((proposed = (struct type_FTAM_Contents__Type__Attribute *)
+                               calloc (1, sizeof *proposed)) == NULL)
+           goto no_mem;
+       req -> contents__type = proposed;
+       if ((proposed -> document__type__name =
+                       oid_cpy (ftop -> ftop_contents)) == NULLOID)
+           goto no_mem;
+       if (proposed -> parameter = ftop -> ftop_parameter)
+           proposed -> parameter -> pe_refcnt++;
+       if (conctl_present (&ftop -> ftop_conctl)
+               && (req -> concurrency__control =
+                               conctl2fpm (fsb, &ftop -> ftop_conctl, fti))
+                       == NULL)
+           return NOTOK;
+       if (ftop -> ftop_sharedASE
+               && (req -> shared__ASE__information =
+                           shared2fpm (fsb, ftop -> ftop_sharedASE, fti)) == NULL)
+           return NOTOK;
+       if (ftop -> ftop_ndiag > 0
+               && (req -> diagnostic = diag2fpm (fsb, 0, ftop -> ftop_diags,
+                                                 ftop -> ftop_ndiag, fti))
+                       == NULL)
+           return NOTOK;
+    }
+
+    if (flags & FTG_END) {
+       if ((pdu = (struct type_FTAM_PDU *) calloc (1, sizeof *pdu)) == NULL)
+           goto no_mem;
+       pdus[i] = pdu;
+       pdu -> offset = type_FTAM_PDU_f__end__group__response;
+       texts[i++] = "F-END-GROUP-response";
+    }
+
+    *npdu = i;
+    return OK;
+
+#undef new_pdu
+#undef new_state
+#undef new_action
+
+no_mem: ;
+    return ftamlose (fti, FS_GEN (fsb), 1, NULLCP, "out of memory");
+}
diff --git a/usr/src/contrib/isode/ftam/ftaminitiate.c b/usr/src/contrib/isode/ftam/ftaminitiate.c
new file mode 100644 (file)
index 0000000..41d3c2e
--- /dev/null
@@ -0,0 +1,711 @@
+/* ftaminitiate.c - FPM: initiator */
+
+#ifndef        lint
+static char *rcsid = "$Header: /f/osi/ftam/RCS/ftaminitiate.c,v 7.3 91/02/22 09:23:00 mrose Interim $";
+#endif
+
+/* 
+ * $Header: /f/osi/ftam/RCS/ftaminitiate.c,v 7.3 91/02/22 09:23:00 mrose Interim $
+ *
+ *
+ * $Log:       ftaminitiate.c,v $
+ * Revision 7.3  91/02/22  09:23:00  mrose
+ * Interim 6.8
+ * 
+ * Revision 7.2  91/01/07  12:40:10  mrose
+ * update
+ * 
+ * Revision 7.1  90/11/21  11:30:08  mrose
+ * sun
+ * 
+ * Revision 7.0  89/11/23  21:53:41  mrose
+ * Release 6.0
+ * 
+ */
+
+/*
+ *                               NOTICE
+ *
+ *    Acquisition, use, and distribution of this module and related
+ *    materials are subject to the restrictions of a license agreement.
+ *    Consult the Preface in the User's Manual for the full terms of
+ *    this agreement.
+ *
+ */
+
+
+/* LINTLIBRARY */
+
+#include <stdio.h>
+#include <signal.h>
+#include "fpkt.h"
+
+
+#define        FS_CTX          "iso ftam"
+#define        FS_ASN          "ftam pci"
+
+/* \f   F-INITIALIZE.REQUEST */
+
+int    FInitializeRequest (context, callingtitle, calledtitle, callingaddr,
+       calledaddr, manage, class, units, attrs, sharedASE, fqos, contents,
+       initiator, account, password, passlen, qos, tracing, ftc, fti)
+OID    context;
+AEI    callingtitle,
+       calledtitle;
+struct PSAPaddr *callingaddr,
+               *calledaddr;
+int    manage,
+       class,
+       units,
+       attrs,
+       fqos,
+       passlen;
+PE     sharedASE;
+struct FTAMcontentlist *contents;
+char   *initiator,
+       *account,
+       *password;
+struct QOStype *qos;
+IFP    tracing;
+struct FTAMconnect *ftc;
+struct FTAMindication *fti;
+{
+    SBV     smask;
+    int     result;
+
+#ifdef notdef
+    missingP (context);
+    missingP (callingtitle);
+    missingP (calledtitle);
+    missingP (callingaddr);
+#endif
+    missingP (calledaddr);
+    if (manage)
+       return ftamlose (fti, FS_ACS_CONTEXT, 1, NULLCP, NULLCP);
+    if (units & ~MY_FUNIT)
+       return ftamlose (fti, FS_ACS_FUNIT, 1, NULLCP, NULLCP);
+    if (!(units & FUNIT_LIMITED) && (units & FUNIT_ENHANCED))
+       return ftamlose (fti, FS_GEN_NOREASON, 1, NULLCP,
+               "enhanced-file-management requires limited-file-management");
+    if ((class & FCLASS_TRANSFER
+               && ((units & FUNITS_TRANSFER) != FUNITS_TRANSFER))) {
+not_enough: ;
+           return ftamlose (fti, FS_GEN_NOREASON, 1, NULLCP,
+                           "insufficient functional units for service class");
+    }
+    if ((class & FCLASS_TM) && ((units & FUNITS_TM) != FUNITS_TM))
+       goto not_enough;
+    if ((class & (FCLASS_TRANSFER | FCLASS_TM))
+           && !(units & (FUNIT_READ | FUNIT_WRITE)))
+       goto not_enough;
+    if ((class & FCLASS_ACCESS) && ((units & FUNITS_ACCESS) != FUNITS_ACCESS))
+       goto not_enough;
+    if ((class & FCLASS_MANAGE) && ((units & FUNITS_MANAGE) != FUNITS_MANAGE))
+       goto not_enough;
+    if (!(class &=
+               (FCLASS_TRANSFER | FCLASS_TM | FCLASS_MANAGE | FCLASS_ACCESS)))
+       return ftamlose (fti, FS_ACS_CLASS, 1, NULLCP, NULLCP);
+    if (!(units & FUNIT_LIMITED) && (units & FUNIT_ENHANCED))
+       return ftamlose (fti, FS_GEN_NOREASON, 1, NULLCP,
+           "enhanced-file-management requires limited-file-management");
+    if (!(units & FUNIT_GROUPING))     /* XXX: should be OPTIONAL */
+           goto not_enough;
+    if (attrs & ~MY_FATTR)
+       return ftamlose (fti, FS_ACS_GRPSUP, 1, NULLCP, NULLCP);
+#ifdef notdef
+    if ((attrs & FATTR_SECURITY) && !(attrs & FATTR_STORAGE))
+       return ftamlose (fti, FS_ACS_GRP, 1, NULLCP, NULLCP);
+#endif
+    if (contents && contents -> fc_ncontent > NFCONT)
+       return ftamlose (fti, FS_GEN_NOREASON, 1, NULLCP,
+                   "too many content types");
+    if (password == NULL)
+       passlen = 0;
+#ifdef notdef
+    missingP (qos);
+#endif
+    missingP (fti);
+
+    smask = sigioblock ();
+
+    result = FInitializeRequestAux (context, callingtitle, calledtitle,
+           callingaddr, calledaddr, manage, class, units, attrs, sharedASE, fqos,
+           contents, initiator, account, password, passlen, qos, tracing, ftc,
+           fti);
+
+    (void) sigiomask (smask);
+
+    return result;
+}
+
+/* \f */
+
+static int  FInitializeRequestAux (context, callingtitle, calledtitle,
+       callingaddr, calledaddr, manage, class, units, attrs, sharedASE, fqos,
+       contents, initiator, account, password, passlen, qos, tracing, ftc,
+       fti)
+OID    context;
+AEI    callingtitle,
+       calledtitle;
+struct PSAPaddr *callingaddr,
+               *calledaddr;
+int    manage,
+       class,
+       units,
+       attrs,
+       fqos,
+       passlen;
+PE     sharedASE;
+struct FTAMcontentlist *contents;
+char   *initiator,
+       *account,
+       *password;
+struct QOStype *qos;
+IFP    tracing;
+struct FTAMconnect *ftc;
+struct FTAMindication *fti;
+{
+    register int       i;
+    int            bits,
+               rcvd_bits,
+           idc,
+           result,
+           settings;
+    long    isn;
+    PE     pe;
+    OID            ctx,
+           pci;
+    struct SSAPref *sr;
+    register struct PSAPcontext *px;
+    struct PSAPctxlist pls;
+    register struct PSAPctxlist *pl = &pls;
+    struct AcSAPconnect accs;
+    register struct AcSAPconnect *acc = &accs;
+    register struct PSAPconnect *pc = &acc -> acc_connect;
+    struct AcSAPindication acis;
+    register struct AcSAPindication *aci = &acis;
+    register struct AcSAPabort *aca = &aci -> aci_abort;
+    register struct FTAMcontent *fx;
+    register struct ftamblk *fsb;
+    struct type_FTAM_PDU *pdu;
+    register struct type_FTAM_F__INITIALIZE__request *req;
+    register struct type_FTAM_F__INITIALIZE__response *rsp;
+
+    if ((fsb = newfsblk ()) == NULL)
+       return ftamlose (fti, FS_GEN_NOREASON, 1, NULLCP, "out of memory");
+    fsb -> fsb_flags |= FSB_INIT;
+    fsb -> fsb_trace = tracing;
+
+    ctx = pci = NULLOID, pl -> pc_nctx = 0;
+    bzero ((char *) ftc, sizeof *ftc);
+
+    pdu = NULL;
+
+    if (context == NULLOID && (context = ode2oid (FS_CTX)) == NULLOID) {
+       result = ftamlose (fti, FS_ACS_MGMT, 1, NULLCP, "%s: unknown", FS_CTX);
+       goto out1;
+    }
+    if ((ctx = oid_cpy (context)) == NULLOID) {
+no_mem: ;
+       result = ftamlose (fti, FS_GEN_NOREASON, 1, NULLCP, "out of memory");
+       goto out1;
+    }
+
+    if ((pci = ode2oid (FS_ASN)) == NULLOID) {
+       result = ftamlose (fti, FS_ACS_MGMT, 1, NULLCP, "%s: unknown", FS_ASN);
+       goto out1;
+    }
+    if ((pci = oid_cpy (pci)) == NULLOID)
+       goto no_mem;
+
+    px = pl -> pc_ctx, pl -> pc_nctx = 0;
+
+    px -> pc_id = fsb -> fsb_id = idc = 1;
+    if ((px -> pc_asn = ode2oid (FS_ASN)) == NULLOID) {
+       result = ftamlose (fti, FS_ACS_MGMT, 1, NULLCP, "%s: unknown", FS_ASN);
+       goto out1;
+    }
+    if ((px -> pc_asn = oid_cpy (px -> pc_asn)) == NULLOID)
+       goto no_mem;
+    if ((px -> pc_atn = ode2oid (BER)) == NULLOID) {
+       result = ftamlose (fti, FS_ACS_MGMT, 1, NULLCP, "%s: unknown", BER);
+       goto out1;
+    }
+    if ((px -> pc_atn = oid_cpy (px -> pc_atn)) == NULLOID)
+       goto no_mem;
+    px++, pl -> pc_nctx++;
+
+    if (contents) {
+       register struct isodocument *id;
+
+       for (fx = contents -> fc_contents, i = contents -> fc_ncontent - 1;
+               i >= 0;
+               fx++, i--) {
+           if (fx -> fc_dtn == NULLOID) {
+               result = ftamlose (fti, FS_GEN (fsb), 1, NULLCP,
+                       "empty content type at slot %d",
+                       contents -> fc_ncontent - i - 1);
+               goto out1;
+           }
+
+           if ((id = getisodocumentbytype (fx -> fc_dtn)) == NULL) {
+               result = ftamlose (fti, FS_GEN (fsb), 1, NULLCP,
+                       "unknown document type %s at slot %d",
+                       sprintoid (fx -> fc_dtn),
+                       contents -> fc_ncontent - i - 1);
+               goto out1;
+           }
+
+           px -> pc_id = (idc += 2);
+           if ((px -> pc_asn = oid_cpy (id -> id_abstract)) == NULLOID)
+               goto no_mem;
+           if ((px -> pc_atn = oid_cpy (id -> id_transfer)) == NULLOID)
+               goto no_mem;
+           px++, pl -> pc_nctx++;
+       }
+    }
+
+    if ((pdu = (struct type_FTAM_PDU *) calloc (1, sizeof *pdu)) == NULL)
+       goto no_mem;
+    pdu -> offset = type_FTAM_PDU_f__initialize__request;
+    if ((req = (struct type_FTAM_F__INITIALIZE__request *)
+                               calloc (1, sizeof *req)) == NULL)
+       goto no_mem;
+    pdu -> un.f__initialize__request = req;
+    req -> presentation__context__management = manage;
+    if (class != FCLASS_TRANSFER
+               && (req -> service__class = bits2fpm (fsb, fclass_pairs, class,
+                                                     fti)) == NULLPE)
+       goto out1;
+    if ((req -> functional__units = bits2fpm (fsb, funit_pairs, units, fti))
+           == NULLPE)
+       goto out1;
+    if (attrs && (req -> attribute__groups = bits2fpm (fsb, fattr_pairs,
+                                                      attrs, fti)) == NULLPE)
+       goto out1;
+    if (sharedASE
+               && (req -> shared__ASE__information =
+                               shared2fpm (fsb, sharedASE, fti)) == NULL)
+       goto out1;
+    if ((req -> ftam__quality__of__service =
+               (struct type_FTAM_FTAM__Quality__Of__Service *)
+                       calloc (1, sizeof *req -> ftam__quality__of__service))
+           == NULL)
+       goto no_mem;
+#ifdef lint
+    req -> ftam__quality__of__service -> parm = fqos;
+#else
+    req -> ftam__quality__of__service -> parm = MY_FQOS;
+#endif
+    if (contents) {
+       struct type_FTAM_Contents__Type__List *fpm;
+       register struct type_FTAM_Contents__Type__List **fpc;
+
+       fpc = &req -> contents__type__list;
+       for (fx = contents -> fc_contents, i = contents -> fc_ncontent - 1;
+               i >= 0;
+               fx++, i--) {
+           if ((fpm = (struct type_FTAM_Contents__Type__List *)
+                           calloc (1, sizeof *fpm)) == NULL)
+               goto no_mem;
+           *fpc = fpm;
+
+           if ((fpm -> Document__Type__Name = oid_cpy (fx -> fc_dtn))
+                   == NULLOID)
+               goto no_mem;
+           fpc = &fpm -> next;
+       }
+    }
+    if (initiator
+           && (req -> initiator__identity = str2qb (initiator,
+                                                    strlen (initiator), 1))
+                   == NULL)
+       goto out1;
+    if (account
+           && (req -> account = str2qb (account, strlen (account), 1))
+                   == NULL)
+       goto out1;
+    if (password) {
+       register struct type_FTAM_Password *p;
+
+       if ((p = (struct type_FTAM_Password *) calloc (1, sizeof *p))
+               == NULL)
+           goto no_mem;
+       req -> filestore__password = p;
+       p -> offset = type_FTAM_Password_binary;
+       if ((p -> un.binary = str2qb (password, passlen, 1)) == NULL)
+           goto no_mem;
+    }
+    req -> checkpoint__window = 1;
+
+    if (encode_FTAM_PDU (&pe, 1, 0, NULLCP, pdu) == NOTOK) {
+       (void) ftamlose (fti, FS_GEN (fsb), 1, NULLCP,
+                        "error encoding PDU: %s", PY_pepy);
+       goto out1;
+    }
+
+    pe -> pe_context = fsb -> fsb_id;
+
+    fsb -> fsb_srequirements = SR_DUPLEX | SR_RESYNC;
+    fsb -> fsb_srequirements &= ~SR_RESYNC;    /* XXX */
+    if (units & (FUNIT_RECOVERY | FUNIT_RESTART))
+       fsb -> fsb_srequirements |= SR_MINORSYNC;
+    isn = (fsb -> fsb_srequirements & (SR_MINORSYNC | SR_RESYNC)) ? 1L
+               : SERIAL_NONE;
+    fsb -> fsb_prequirements = manage ? (PR_MANAGEMENT | PR_RESTORATION) : 0;
+    settings = 0;
+#define dotoken(requires,shift,bit,type) \
+{ \
+    if (fsb -> fsb_srequirements & requires) \
+       settings |= ST_INIT_VALUE << shift; \
+}
+    dotokens ();
+#undef dotoken
+
+    if ((sr = addr2ref (PLocalHostName ())) == NULL)
+       goto no_mem;
+
+    fsbtrace (fsb, (fsb -> fsb_fd, "A-ASSOCIATE.REQUEST",
+               "F-INITIALIZE-request", pe, 0));
+
+    result = AcAssocRequest (ctx, callingtitle, calledtitle, callingaddr,
+               calledaddr, pl, NULLOID /* pci */, fsb -> fsb_prequirements,
+               fsb -> fsb_srequirements, isn, settings, sr, &pe, 1,
+               qos, acc, aci);
+
+    if (result == NOTOK) {
+       (void) acs2ftamlose (fsb, fti, "AcAssocRequest", aca);
+       goto out1;
+    }
+
+    fsb -> fsb_fd = acc -> acc_sd;
+
+    pe_free (pe);
+    pe = NULLPE;
+    free_FTAM_PDU (pdu);
+    pdu = NULL;
+    oid_free (ctx);
+    ctx = NULLOID;
+    oid_free (pci);
+    pci = NULLOID;
+    for (px = pl -> pc_ctx, i = pl -> pc_nctx - 1; i >= 0; px++, i--) {
+       if (px -> pc_asn)
+           oid_free (px -> pc_asn);
+       if (px -> pc_atn)
+           oid_free (px -> pc_atn);
+    }
+       
+    if (acc -> acc_ninfo < 1 || (pe = acc -> acc_info[0]) == NULLPE) {
+       if (acc -> acc_result != ACS_ACCEPT) {
+           register struct FTAMabort *fta = &fti -> fti_abort;
+
+           aca -> aca_reason = acc -> acc_result;
+           (void) acs2ftamlose (fsb, fti, "AcAssocRequest(pseudo)", aca);
+
+           ftc -> ftc_sd = NOTOK;
+           ftc -> ftc_state = FSTATE_FAILURE;
+           ftc -> ftc_action = FACTION_PERM;
+           *ftc -> ftc_diags = *fta -> fta_diags;      /* struct copy */
+           ftc -> ftc_ndiag = fta -> fta_ndiag;
+
+           result = OK;
+       }
+       else
+           result = fpktlose (fsb, fti, FS_PRO_ERR, NULLCP, NULLCP);
+       goto out2;
+    }
+
+    if (decode_FTAM_PDU (pe, 1, NULLIP, NULLVP, &pdu) == NOTOK) {
+       result = fpktlose (fsb, fti, FS_PRO_ERRMSG, NULLCP,
+                          "unable to parse PDU: %s", PY_pepy);
+       goto out2;
+    }
+    if (pdu -> offset != type_FTAM_PDU_f__initialize__response) {
+       result = fpktlose (fsb, fti, FS_PRO_ERRPROC, NULLCP,
+                          "expecting F-INITIALIZE-response, got %d",
+                          pdu -> offset);
+       goto out2;
+    }
+    rsp = pdu -> un.f__initialize__response;
+
+    fsbtrace (fsb,
+       (fsb -> fsb_fd, "A-ASSOCIATE.CONFIRMATION", "F-INITIALIZE-response",
+               pe, 1));
+
+    ftc -> ftc_state = rsp -> state__result
+                         ? rsp -> state__result -> parm
+                         : int_FTAM_State__Result_success;
+    ftc -> ftc_action = rsp -> action__result
+                         ? rsp -> action__result -> parm
+                         : int_FTAM_Action__Result_success;
+    switch (acc -> acc_result) {
+       case ACS_ACCEPT:
+           if (ftc -> ftc_state != FSTATE_SUCCESS
+                   || ftc -> ftc_action != FACTION_SUCCESS) {
+               result = fpktlose (fsb, fti, FS_PRO_ERRPROC, NULLCP,
+                               "state/action mismatch");
+               goto out2;
+           }
+
+           fsb -> fsb_flags |= FSB_CONN;
+           fsb -> fsb_srequirements &= pc -> pc_srequirements;
+#define dotoken(requires,shift,bit,type) \
+{ \
+           if (fsb -> fsb_srequirements & requires) \
+               switch (pc -> pc_settings & (ST_MASK << shift)) { \
+                   case ST_INIT_VALUE << shift: \
+                       fsb -> fsb_owned |= bit; \
+                       fsb -> fsb_avail |= bit; \
+                       break; \
+ \
+                   case ST_RESP_VALUE << shift: \
+                       fsb -> fsb_avail |= bit; \
+                       break; \
+ \
+                   default: \
+                       result = fpktlose (fsb, fti, FS_PRO_ERRPROC, NULLCP, \
+                                       "%s token management botched", type); \
+                       goto out2; \
+               } \
+}
+           dotokens ();
+#undef dotoken
+           if (fsb -> fsb_owned != fsb -> fsb_avail) {
+               result = fpktlose (fsb, fti, FS_PRO_ERRPROC, NULLCP,
+                           "token management botched");
+               goto out2;
+           }
+           fsb -> fsb_ssdusize = pc -> pc_ssdusize;
+
+           pl = &pc -> pc_ctxlist;
+           if (pl -> pc_nctx > 0 && pl -> pc_ctx[0].pc_result != PC_ACCEPT) {
+               result = fpktlose (fsb, fti, FS_PRO_ERRPROC, NULLCP,
+                                   "FTAM PCI rejected");
+               goto out2;
+           }
+
+           fsb -> fsb_prequirements &= pc -> pc_prequirements;
+           if (rsp -> presentation__context__management) {
+               if (!(fsb -> fsb_prequirements & PR_MANAGEMENT)) {
+                   result = fpktlose (fsb, fti, FS_PRO_ERRPROC, NULLCP,
+                               "presentation content management mismatch");
+                   goto out2;
+               }
+           }
+           else
+               fsb -> fsb_prequirements &= ~PR_MANAGEMENT;
+
+               if (rsp -> service__class) {
+        rcvd_bits = fpm2bits (fsb, fclass_pairs, rsp -> service__class,
+&bits, fti);
+        if (rcvd_bits == NOTOK)
+            goto out2;
+        else if (rcvd_bits > 1) {
+                result = fpktlose (fsb, fti, FS_PRO_ERRPROC, NULLCP,
+                            "illegal negotiation of service classes");
+                goto out2;
+            }
+        }
+           else
+               bits = FCLASS_TRANSFER;
+           switch (fsb -> fsb_class = (bits & class)) {
+               case FCLASS_TRANSFER:
+                   i = FUNITS_TRANSFER;
+                   break;
+
+               case FCLASS_ACCESS:
+                   i = FUNITS_ACCESS;
+                   break;
+
+               case FCLASS_MANAGE:
+                   i = FUNITS_MANAGE;
+                   break;
+
+               case FCLASS_TM:
+                   i = FUNITS_TM;
+                   break;
+
+               case FCLASS_UNCONS:
+                   i = FUNITS_UNCONS;
+                   break;
+
+               default:
+                   result = fpktlose (fsb, fti, FS_PRO_ERRPROC, NULLCP,
+                                      "service class mismatch, offered 0x%x received 0x%x",
+                                      class, bits);
+                   goto out2;
+           }
+           if (fpm2bits (fsb, funit_pairs, rsp -> functional__units, &bits,
+                         fti) == NOTOK)
+               goto out2;
+           bits |= i;          /* conservative... */
+           if ((fsb -> fsb_units = bits) & ~units) {
+               result = fpktlose (fsb, fti, FS_PRO_ERRFUNIT, NULLCP,
+                               "functional unit mismatch");
+               goto out2;
+           }
+/* check for illegal and mandatory functional units */
+           switch (fsb -> fsb_class) {
+               case FCLASS_TRANSFER:
+                       if (!(fsb -> fsb_units & FUNITS_TRANSFER))
+               goto not_enough; 
+               goto do_trans;
+               case FCLASS_TM:
+                       if (!(fsb -> fsb_units & FUNITS_TM))
+                               goto not_enough;
+do_trans: ;
+               if (!(fsb -> fsb_units & (FUNIT_READ | FUNIT_WRITE))) {
+not_enough: ;
+                       result = fpktlose (fsb, fti, FS_PRO_ERRFUNIT, NULLCP,
+                        "insufficient functional units for service class");
+                       goto out2;
+               }
+                   if (fsb -> fsb_units & (FUNIT_ACCESS | FUNIT_FADULOCK)) {
+too_many: ;
+                       result = fpktlose (fsb, fti, FS_PRO_ERRFUNIT, NULLCP,
+                                          "illegal functional units for service class");
+                       goto out2;
+                   }
+                   break;
+
+           case FCLASS_ACCESS:
+               if (!(fsb -> fsb_units & FUNITS_ACCESS))
+               goto not_enough;
+               break;
+               case FCLASS_MANAGE:
+               if (!(fsb -> fsb_units & FUNITS_MANAGE))
+               goto not_enough;
+                   if (fsb -> fsb_units & (FUNIT_READ | FUNIT_WRITE
+                                               | FUNIT_ACCESS | FUNIT_FADULOCK
+                                               | FUNIT_RECOVERY
+                                               | FUNIT_RESTART))
+                       goto too_many;
+                   break;
+           }
+           if (rsp -> attribute__groups) {
+               if (fpm2bits (fsb, fattr_pairs, rsp -> attribute__groups,
+                             &bits, fti) == NOTOK)
+                   goto out2;
+           }
+           else
+               bits = 0;
+           if (bits & ~attrs) {
+               result = fpktlose (fsb, fti, FS_PRO_ERRPROC, NULLCP,
+                               "attribute group mismatch");
+               goto out2;
+           }
+           fsb -> fsb_attrs = bits;
+           if (rsp -> ftam__quality__of__service -> parm != MY_FQOS) {
+               result = fpktlose (fsb, fti, FS_ACS_ROLLBACK, NULLCP,
+                               "class-%d-recovery not supported",
+                                  rsp -> ftam__quality__of__service -> parm);
+               goto out2;
+           }
+           fsb -> fsb_fqos = MY_FQOS;
+
+           ftc -> ftc_sd = fsb -> fsb_fd;
+           break;
+           
+       default:
+           ftc -> ftc_sd = NOTOK;
+           if (ftc -> ftc_state == FSTATE_SUCCESS
+                   && ftc -> ftc_action == FACTION_SUCCESS) {
+               result = fpktlose (fsb, fti, FS_PRO_ERRPROC, NULLCP,
+                               "state/action mismatch");
+               goto out2;
+           }
+           {
+               register struct FTAMabort *fta = &fti -> fti_abort;
+
+               bzero ((char *) fta, sizeof *fta);
+               fta -> fta_peer = 1;
+           }
+           break;
+    }
+
+    ftc -> ftc_respondtitle = acc -> acc_respondtitle; /* struct copy */
+    bzero ((char *) &acc -> acc_respondtitle, sizeof acc -> acc_respondtitle);
+    ftc -> ftc_respondaddr = pc -> pc_responding;      /* struct copy */
+    ftc -> ftc_context = acc -> acc_context;
+    acc -> acc_context = NULLOID;
+    ftc -> ftc_manage = (fsb -> fsb_prequirements & PR_MANAGEMENT) ? 1 : 0;
+    ftc -> ftc_class = fsb -> fsb_class;
+    ftc -> ftc_units = fsb -> fsb_units;
+    ftc -> ftc_attrs = fsb -> fsb_attrs;
+    if (rsp -> shared__ASE__information
+           && fpm2shared (fsb, rsp -> shared__ASE__information,
+                          &ftc -> ftc_sharedASE, fti) == NOTOK)
+       goto out2;
+    ftc -> ftc_fqos = fsb -> fsb_fqos;
+
+    if (contents) {
+       register struct type_FTAM_Contents__Type__List *dtn;
+       register struct FTAMcontent *fx2;
+
+       fx2 = ftc -> ftc_contents.fc_contents;
+
+       for (fx = contents -> fc_contents,
+               i = contents -> fc_ncontent - 1;
+               i >= 0;
+               fx++, i--) {
+           for (dtn = rsp -> contents__type__list; dtn; dtn = dtn -> next)
+               if (oid_cmp (fx -> fc_dtn, dtn -> Document__Type__Name) == 0)
+                   break;
+           if (dtn == NULL)
+               continue;
+
+           px = pl -> pc_ctx + 1 + (fx - contents -> fc_contents);
+
+           fx2 -> fc_dtn = dtn -> Document__Type__Name;
+           fx2 -> fc_id = px -> pc_id;
+           fx2 -> fc_result = px -> pc_result;
+
+           fx2++, ftc -> ftc_contents.fc_ncontent++;
+       }
+
+       for (dtn = rsp -> contents__type__list; dtn; dtn = dtn -> next) {
+           for (fx2 = ftc -> ftc_contents.fc_contents,
+                   i = ftc -> ftc_contents.fc_ncontent - 1;
+                   i >= 0;
+                   fx2++, i--)
+               if (dtn -> Document__Type__Name == fx2 -> fc_dtn) {
+                   dtn -> Document__Type__Name = NULLOID;
+                   break;
+               }
+       }
+    }
+    if (rsp -> diagnostic)
+       (void) fpm2diag (fsb, rsp -> diagnostic, ftc -> ftc_diags,
+                        &ftc -> ftc_ndiag, fti);
+    ftc -> ftc_ssdusize = fsb -> fsb_ssdusize;
+    ftc -> ftc_qos = pc -> pc_qos;     /* struct copy */
+
+    free_FTAM_PDU (pdu);
+    ACCFREE (acc);
+
+    if (acc -> acc_result != ACS_ACCEPT)
+       freefsblk (fsb);
+
+    return OK;
+    
+out2: ;
+    ACCFREE (acc);
+
+out1: ;
+    if (pdu)
+       free_FTAM_PDU (pdu);
+    if (ctx)
+       oid_free (ctx);
+    if (pci)
+       oid_free (pci);
+    for (px = pl -> pc_ctx, i = pl -> pc_nctx - 1; i >= 0; px++, i--) {
+       if (px -> pc_asn)
+           oid_free (px -> pc_asn);
+       if (px -> pc_atn)
+           oid_free (px -> pc_atn);
+    }
+    freefsblk (fsb);
+
+    return result;
+}
diff --git a/usr/src/contrib/isode/ftam/ftamlose.c b/usr/src/contrib/isode/ftam/ftamlose.c
new file mode 100644 (file)
index 0000000..e46279a
--- /dev/null
@@ -0,0 +1,209 @@
+/* ftamlose.c - FPM: you lose */
+
+#ifndef        lint
+static char *rcsid = "$Header: /f/osi/ftam/RCS/ftamlose.c,v 7.1 91/02/22 09:23:02 mrose Interim $";
+#endif
+
+/* 
+ * $Header: /f/osi/ftam/RCS/ftamlose.c,v 7.1 91/02/22 09:23:02 mrose Interim $
+ *
+ *
+ * $Log:       ftamlose.c,v $
+ * Revision 7.1  91/02/22  09:23:02  mrose
+ * Interim 6.8
+ * 
+ * Revision 7.0  89/11/23  21:53:43  mrose
+ * Release 6.0
+ * 
+ */
+
+/*
+ *                               NOTICE
+ *
+ *    Acquisition, use, and distribution of this module and related
+ *    materials are subject to the restrictions of a license agreement.
+ *    Consult the Preface in the User's Manual for the full terms of
+ *    this agreement.
+ *
+ */
+
+
+/* LINTLIBRARY */
+
+#include <stdio.h>
+#include <varargs.h>
+#include "fpkt.h"
+
+/* \f */
+
+#ifndef        lint
+int    fpktlose (va_alist)
+va_dcl
+{
+    int     observer,
+           reason,
+            result,
+            source;
+    struct FTAMindication   ftis;
+    register struct ftamblk *fsb;
+    register struct FTAMindication *fti;
+    va_list    ap;
+
+    va_start (ap);
+
+    fsb = va_arg (ap, struct ftamblk *);
+    fti = va_arg (ap, struct FTAMindication *);
+    reason = va_arg (ap, int);
+
+    if (fsb -> fsb_flags & FSB_INIT)
+       observer = EREF_IFPM, source = EREF_RFPM;
+    else
+       observer = EREF_RFPM, source = EREF_IFPM;
+
+    result = _ftamoops (fti, reason, 1, observer, source, ap);
+
+    va_end (ap);
+
+    if (fsb -> fsb_fd == NOTOK)
+       return result;
+
+    (void) FAbortRequestAux (fsb, type_FTAM_PDU_f__p__abort__request,
+                            FACTION_PERM, fti -> fti_abort.fta_diags, 1,
+                            &ftis);
+
+    return result;
+}
+#else
+/* VARARGS5 */
+
+int    fpktlose (fsb, fti, reason, what, fmt)
+struct ftamblk *fsb;
+struct FTAMindication *fti;
+int    reason;
+char   *what,
+       *fmt;
+{
+    return fpktlose (fsb, fti, reason, what, fmt);
+}
+#endif
+
+/* \f */
+
+#ifndef        lint
+int    ftamlose (va_alist)
+va_dcl
+{
+    int     fatal,
+           reason,
+           result;
+    struct FTAMindication *fti;
+    va_list    ap;
+
+    va_start (ap);
+
+    fti = va_arg (ap, struct FTAMindication *);
+    reason = va_arg (ap, int);
+    fatal = va_arg (ap, int);
+
+    result = _ftamoops (fti, reason, fatal, EREF_NONE, EREF_NONE, ap);
+
+    va_end (ap);
+
+    return result;
+}
+#else
+/* VARARGS4 */
+
+int    ftamlose (fti, reason, fatal, what, fmt)
+register struct FTAMindication *fti;
+int    reason,
+       fatal;
+char   *what,
+       *fmt;
+{
+    return ftamlose (fti, reason, fatal, what, fmt);
+}
+#endif
+
+/* \f */
+
+#ifndef        lint
+int    ftamoops (va_alist)
+va_dcl
+{
+    int            reason,
+           result,
+           fatal,
+           observer,
+           source;
+    struct FTAMindication *fti;
+    va_list ap;
+
+    va_start (ap);
+
+    fti = va_arg (ap, struct FTAMindication *);
+    reason = va_arg (ap, int);
+    fatal = va_arg (ap, int);
+    observer = va_arg (ap, int);
+    source = va_arg (ap, int);
+
+    result = _ftamoops (fti, reason, fatal, source, observer, ap);
+
+    va_end (ap);
+
+    return result;
+}
+
+
+static int  _ftamoops (fti, reason, fatal, observer, source, ap)
+register struct FTAMindication *fti;
+int    reason,
+       fatal,
+       observer,
+       source;
+va_list        ap;
+{
+    register char  *bp;
+    char    buffer[BUFSIZ];
+    register struct FTAMabort  *fta;
+    register struct FTAMdiagnostic *ftd;
+
+    if (fti) {
+       bzero ((char *) fti, sizeof *fti);
+       fti -> fti_type = FTI_ABORT;
+       fta = &fti -> fti_abort;
+
+       asprintf (bp = buffer, ap);
+       bp += strlen (bp);
+
+       fta -> fta_peer = 0;
+       fta -> fta_action = fatal ? FACTION_PERM : FACTION_TRANS;
+
+       ftd = &fta -> fta_diags[0];
+       ftd -> ftd_type = fatal ? DIAG_PERM : DIAG_TRANS;
+       ftd -> ftd_identifier = reason;
+       ftd -> ftd_observer = observer;
+       ftd -> ftd_source = source;
+       ftd -> ftd_delay = DIAG_NODELAY;
+       copyFTAMdata (buffer, bp - buffer, ftd);
+
+       fta -> fta_ndiag = 1;
+    }
+
+    return NOTOK;
+}
+#else
+/* VARARGS7 */
+
+int    ftamoops (fti, reason, fatal, observer, source, what, fmt)
+struct FTAMindication *fti;
+int    reason,
+       fatal,
+       observer,
+       source;
+char   *what,
+       *fmt;
+{
+    return ftamoops (fti, reason, fatal, observer, source, what, fmt);
+}
+#endif
diff --git a/usr/src/contrib/isode/ftam/ftampass.c b/usr/src/contrib/isode/ftam/ftampass.c
new file mode 100644 (file)
index 0000000..ab46dac
--- /dev/null
@@ -0,0 +1,117 @@
+/* ftampass.c - FPM: encode/decode access passwords */
+
+#ifndef        lint
+static char *rcsid = "$Header: /f/osi/ftam/RCS/ftampass.c,v 7.1 91/02/22 09:23:03 mrose Interim $";
+#endif
+
+/* 
+ * $Header: /f/osi/ftam/RCS/ftampass.c,v 7.1 91/02/22 09:23:03 mrose Interim $
+ *
+ *
+ * $Log:       ftampass.c,v $
+ * Revision 7.1  91/02/22  09:23:03  mrose
+ * Interim 6.8
+ * 
+ * Revision 7.0  89/11/23  21:53:44  mrose
+ * Release 6.0
+ * 
+ */
+
+/*
+ *                               NOTICE
+ *
+ *    Acquisition, use, and distribution of this module and related
+ *    materials are subject to the restrictions of a license agreement.
+ *    Consult the Preface in the User's Manual for the full terms of
+ *    this agreement.
+ *
+ */
+
+
+/* LINTLIBRARY */
+
+#include <stdio.h>
+#include "fpkt.h"
+
+/* \f */
+
+struct type_FTAM_Access__Passwords *pass2fpm (fsb, fp, fti)
+register struct ftamblk *fsb;
+register struct FTAMpasswords *fp;
+struct FTAMindication *fti;
+{
+    register struct type_FTAM_Access__Passwords *fpm;
+
+    if ((fpm = (struct type_FTAM_Access__Passwords *)
+                   calloc (1, sizeof *fpm)) == NULL) {
+no_mem: ;
+       (void) ftamlose (fti, FS_GEN (fsb), 1, NULLCP, "out of memory");
+       if (fpm)
+           free_FTAM_Access__Passwords (fpm);
+       return NULL;
+    }
+
+#define        dopass(s,t,u) \
+{ \
+    if ((fpm -> s = (struct type_FTAM_Password *) \
+                           calloc (1, sizeof *fpm -> s)) \
+           == NULL) \
+       goto no_mem; \
+    fpm -> s -> offset = type_FTAM_Password_binary; \
+    if ((fpm -> s -> un.binary = str2qb (fp -> t, fp -> u, 1)) == NULL) \
+       goto no_mem; \
+}
+
+    dopass (read__password, fp_read, fp_readlen);
+    dopass (insert__password, fp_insert, fp_insertlen);
+    dopass (replace__password, fp_replace, fp_replacelen);
+    dopass (extend__password, fp_extend, fp_extendlen);
+    dopass (erase__password, fp_erase, fp_eraselen);
+    dopass (read__attribute__password, fp_readattr, fp_readattrlen);
+    dopass (change__attribute__password, fp_chngattr, fp_chngattrlen);
+    dopass (delete__password, fp_delete, fp_deletelen);
+
+#undef dopass
+
+    return fpm;
+}
+
+/* \f */
+
+int    fpm2pass (fsb, fpm, fp, fti)
+register struct ftamblk *fsb;
+register struct type_FTAM_Access__Passwords *fpm;
+register struct FTAMpasswords *fp;
+struct FTAMindication *fti;
+{
+    register struct qbuf *qb;
+
+    bzero ((char *) fp, sizeof *fp);
+
+/* both choices of this structure are qbuf's, so... */
+#define        dopass(s,t,u) \
+{ \
+    qb = fpm -> s -> un.graphic; \
+ \
+    if ((fp -> t = qb2str (qb)) == NULL) \
+       goto no_mem; \
+    fp -> u = qb -> qb_len; \
+}
+
+    dopass (read__password, fp_read, fp_readlen);
+    dopass (insert__password, fp_insert, fp_insertlen);
+    dopass (replace__password, fp_replace, fp_replacelen);
+    dopass (extend__password, fp_extend, fp_extendlen);
+    dopass (erase__password, fp_erase, fp_eraselen);
+    dopass (read__attribute__password, fp_readattr, fp_readattrlen);
+    dopass (change__attribute__password, fp_chngattr, fp_chngattrlen);
+    dopass (delete__password, fp_delete, fp_deletelen);
+
+#undef dopass
+
+    return OK;
+
+no_mem: ;
+    FPFREE (fp);
+    return ftamlose (fti, FS_GEN (fsb), 1, NULLCP, "out of memory");
+}
diff --git a/usr/src/contrib/isode/ftam/ftamprovider.c b/usr/src/contrib/isode/ftam/ftamprovider.c
new file mode 100644 (file)
index 0000000..06ccdd9
--- /dev/null
@@ -0,0 +1,2222 @@
+/* ftamprovider.c - implement the FTAM protocol */
+
+#ifndef        lint
+static char *rcsid = "$Header: /f/osi/ftam/RCS/ftamprovider.c,v 7.6 91/02/22 09:23:05 mrose Interim $";
+#endif
+
+/* 
+ * $Header: /f/osi/ftam/RCS/ftamprovider.c,v 7.6 91/02/22 09:23:05 mrose Interim $
+ *
+ *
+ * $Log:       ftamprovider.c,v $
+ * Revision 7.6  91/02/22  09:23:05  mrose
+ * Interim 6.8
+ * 
+ * Revision 7.5  91/01/07  12:40:14  mrose
+ * update
+ * 
+ * Revision 7.4  90/11/21  11:30:12  mrose
+ * sun
+ * 
+ * Revision 7.3  90/11/05  13:32:53  mrose
+ * update
+ * 
+ * Revision 7.2  90/08/08  14:12:18  mrose
+ * update
+ * 
+ * Revision 7.1  89/12/14  10:04:00  mrose
+ * bdt
+ * 
+ * Revision 7.0  89/11/23  21:53:45  mrose
+ * Release 6.0
+ * 
+ */
+
+/*
+ *                               NOTICE
+ *
+ *    Acquisition, use, and distribution of this module and related
+ *    materials are subject to the restrictions of a license agreement.
+ *    Consult the Preface in the User's Manual for the full terms of
+ *    this agreement.
+ *
+ */
+
+
+/* LINTLIBRARY */
+
+#include <stdio.h>
+#include <signal.h>
+#include "fpkt.h"
+
+/* \f   DATA */
+
+struct pair fclass_pairs[] = {
+    FCLASS_UNCONS, bit_FTAM_Service__Class_unconstrained__class,
+    FCLASS_MANAGE, bit_FTAM_Service__Class_management__class,
+    FCLASS_TRANSFER, bit_FTAM_Service__Class_transfer__class,
+    FCLASS_TM, bit_FTAM_Service__Class_transfer__and__management__class,
+    FCLASS_ACCESS, bit_FTAM_Service__Class_access__class,
+
+    0, 0
+};
+
+struct pair funit_pairs[] = {
+    FUNIT_READ, bit_FTAM_Functional__Units_read,
+    FUNIT_WRITE, bit_FTAM_Functional__Units_write,
+    FUNIT_ACCESS, bit_FTAM_Functional__Units_file__access,
+    FUNIT_LIMITED, bit_FTAM_Functional__Units_limited__file__management,
+    FUNIT_ENHANCED, bit_FTAM_Functional__Units_enhanced__file__management,
+    FUNIT_GROUPING, bit_FTAM_Functional__Units_grouping,
+    FUNIT_FADULOCK, bit_FTAM_Functional__Units_fadu__locking,
+    FUNIT_RECOVERY, bit_FTAM_Functional__Units_recovery,
+    FUNIT_RESTART, bit_FTAM_Functional__Units_restart__data__transfer,
+
+    0, 0
+};
+
+struct pair fattr_pairs[] = {
+    FATTR_STORAGE, bit_FTAM_Attribute__Groups_storage,
+    FATTR_SECURITY, bit_FTAM_Attribute__Groups_security,
+    FATTR_PRIVATE, bit_FTAM_Attribute__Groups_private,
+
+    0, 0
+};
+
+struct pair fname_pairs[] = {
+    FA_FILENAME, bit_FTAM_Attribute__Names_read__filename,
+    FA_ACTIONS, bit_FTAM_Attribute__Names_read__permitted__actions,
+    FA_CONTENTS, bit_FTAM_Attribute__Names_read__content__types,
+    FA_ACCOUNT, bit_FTAM_Attribute__Names_read__storage__account,
+    FA_DATE_CREATE, bit_FTAM_Attribute__Names_read__date__and__time__of__creation,
+    FA_DATE_MODIFY, bit_FTAM_Attribute__Names_read__date__and__time__of__last__modification,
+    FA_DATE_READ, bit_FTAM_Attribute__Names_read__date__and__time__of__last__read__access,
+    FA_DATE_ATTR, bit_FTAM_Attribute__Names_read__date__and__time__of__last__attribute__modification,
+    FA_ID_CREATE, bit_FTAM_Attribute__Names_read__identity__of__creator,
+    FA_ID_MODIFY, bit_FTAM_Attribute__Names_read__identity__of__last__modifier,
+    FA_ID_READ, bit_FTAM_Attribute__Names_read__identity__of__last__reader,
+    FA_ID_ATTR, bit_FTAM_Attribute__Names_read__identity__of__last__attribute__modifier,
+    FA_AVAILABILITY, bit_FTAM_Attribute__Names_read__file__availability,
+    FA_FILESIZE, bit_FTAM_Attribute__Names_read__filesize,
+    FA_FUTURESIZE, bit_FTAM_Attribute__Names_read__future__filesize,
+    FA_CONTROL, bit_FTAM_Attribute__Names_read__access__control,
+    FA_LEGAL, bit_FTAM_Attribute__Names_read__legal__qualifications,
+    FA_PRIVATE, bit_FTAM_Attribute__Names_read__private__use,
+
+    0, 0
+};
+
+struct pair fmode_pairs[] = {
+    FA_PERM_READ, bit_FTAM_processing__mode_f__read,
+    FA_PERM_INSERT, bit_FTAM_processing__mode_f__insert,
+    FA_PERM_REPLACE, bit_FTAM_processing__mode_f__replace,
+    FA_PERM_EXTEND, bit_FTAM_processing__mode_f__extend,
+    FA_PERM_ERASE, bit_FTAM_processing__mode_f__erase,
+
+    0, 0
+};
+
+struct pair frequested_pairs[] = {
+    FA_PERM_READ, bit_FTAM_Access__Request_read,
+    FA_PERM_INSERT, bit_FTAM_Access__Request_insert,
+    FA_PERM_REPLACE, bit_FTAM_Access__Request_replace,
+    FA_PERM_EXTEND, bit_FTAM_Access__Request_extend,
+    FA_PERM_ERASE, bit_FTAM_Access__Request_erase,
+    FA_PERM_READATTR, bit_FTAM_Access__Request_read__attribute,
+    FA_PERM_CHNGATTR, bit_FTAM_Access__Request_change__attribute,
+    FA_PERM_DELETE, bit_FTAM_Access__Request_delete,
+
+    0, 0
+};
+
+struct pair fpermitted_pairs[] = {
+    FA_PERM_READ, bit_FTAM_Permitted__Actions__Attribute_read,
+    FA_PERM_INSERT, bit_FTAM_Permitted__Actions__Attribute_insert,
+    FA_PERM_REPLACE, bit_FTAM_Permitted__Actions__Attribute_replace,
+    FA_PERM_EXTEND, bit_FTAM_Permitted__Actions__Attribute_extend,
+    FA_PERM_ERASE, bit_FTAM_Permitted__Actions__Attribute_erase,
+    FA_PERM_READATTR, bit_FTAM_Permitted__Actions__Attribute_read__attribute,
+    FA_PERM_CHNGATTR, bit_FTAM_Permitted__Actions__Attribute_change__attribute,
+    FA_PERM_DELETE, bit_FTAM_Permitted__Actions__Attribute_delete__file,
+    FA_PERM_TRAV, bit_FTAM_Permitted__Actions__Attribute_traversal,
+    FA_PERM_RVTRAV, bit_FTAM_Permitted__Actions__Attribute_reverse__traversal,
+    FA_PERM_RANDOM, bit_FTAM_Permitted__Actions__Attribute_random__order,
+
+    0, 0
+};
+
+
+static int  once_only = 0;
+static struct ftamblk ftamque;
+static struct ftamblk *FSHead = &ftamque;
+
+int    psDATAser (), psTOKENser (), psSYNCser (), psACTIVITYser (),
+       psREPORTser (), psFINISHser (), psABORTser ();
+
+/* \f   F-WAIT.REQUEST (pseudo) */
+
+int    FWaitRequest (sd, secs, fti)
+int    sd;
+int    secs;
+struct FTAMindication *fti;
+{
+    SBV            smask;
+    int     result;
+    register struct ftamblk *fsb;
+
+    missingP (fti);
+
+    smask = sigioblock ();
+
+    ftamPsig (fsb, sd);
+
+    result = FWaitRequestAux (fsb, secs, fti);
+
+    (void) sigiomask (smask);
+
+    return result;
+}
+
+/* \f */
+
+int    FWaitRequestAux (fsb, secs, fti)
+register struct ftamblk *fsb;
+int    secs;
+struct FTAMindication *fti;
+{
+    int     result;
+    struct PSAPdata pxs;
+    register struct PSAPdata   *px = &pxs;
+    struct PSAPindication   pis;
+    register struct PSAPindication *pi = &pis;
+
+    for (;;) {
+       if (fsb -> fsb_data.px_ninfo > 0) {
+           *px = fsb -> fsb_data;      /* struct copy */
+           bzero ((char *) &fsb -> fsb_data, sizeof fsb -> fsb_data);
+           goto do_data;
+       }
+
+       switch (result = PReadRequest (fsb -> fsb_fd, px, secs, pi)) {
+           case NOTOK: 
+               return doPSabort (fsb, &pi -> pi_abort, fti);
+
+           case OK: 
+do_data: ;
+               result = doPSdata (fsb, px, fti);
+               break;
+
+           case DONE: 
+               switch (pi -> pi_type) {
+                   case PI_TOKEN: 
+                       result = doPStokens (fsb, &pi -> pi_token, fti);
+                       break;
+
+                   case PI_SYNC: 
+                       result = doPSsync (fsb, &pi -> pi_sync, fti);
+                       break;
+
+                   case PI_ACTIVITY: 
+                       result = doPSactivity (fsb, &pi -> pi_activity, fti);
+                       break;
+
+                   case PI_REPORT: 
+                       result = doPSreport (fsb, &pi -> pi_report, fti);
+                       break;
+
+                   case PI_FINISH: 
+                       result = doPSfinish (fsb, &pi -> pi_finish, fti);
+                       break;
+
+                   default: 
+                       result = fpktlose (fsb, fti, FS_PRO_LOWFAIL, NULLCP,
+                               "unknown indication (0x%x) from presentation",
+                               pi -> pi_type);
+                       freefsblk (fsb);
+                       break;
+               }
+               break;
+
+           default: 
+               result = fpktlose (fsb, fti, FS_PRO_LOWFAIL, NULLCP,
+                       "unexpected return from PReadRequest=%d", result);
+               freefsblk (fsb);
+               break;
+       }
+
+       switch (result) {
+           case NOTOK: 
+               return NOTOK;
+
+           case OK: 
+               break;
+
+           case DONE: 
+               return OK;
+       }
+    }
+}
+
+/* \f */
+
+static int  doPSdata (fsb, px, fti)
+register struct ftamblk   *fsb;
+register struct PSAPdata *px;
+struct FTAMindication *fti;
+{
+    int     next;
+    register int    i;
+    register PE        pe,
+               *pep;
+    register struct FTAMgroup  *ftg = &fti -> fti_group;
+    struct type_FTAM_PDU *pdu;
+
+    fti -> fti_type = FTI_FINISH;              /* temporary for group */
+    bzero ((char *) ftg, sizeof *ftg);
+    pdu = NULL;
+
+    next = 0;
+    for (pep = px -> px_info, i = px -> px_ninfo - 1; i >= 0; pep++, i--) {
+       if ((pe = *pep) == NULLPE)
+           continue;
+
+       if (pe -> pe_context != fsb -> fsb_id)
+           goto got_fadu;
+
+       switch (PE_ID (pe -> pe_class, pe -> pe_id)) {
+           case PE_ID (PE_CLASS_APPL, FADU_NODESCR):
+           case PE_ID (PE_CLASS_APPL, FADU_ENTERTREE):
+           case PE_ID (PE_CLASS_APPL, FADU_EXITREE):
+               pe -> pe_context = PE_DFLT_CTX;
+
+got_fadu: ;
+               if (next < 0)
+                   goto copy_psdu;
+               next = 1;
+               break;
+
+           default:
+               if (next > 0) {
+                   register struct PSAPdata *fx = &fsb -> fsb_data;
+
+copy_psdu: ;
+                   fsbtrace (fsb, (fsb -> fsb_id,
+                                   "queueing possible BDT entries in PSDU",
+                                   NULLCP, NULLPE, -1));
+                   px -> px_ninfo -= (i + 1);
+                   do {
+                       fx -> px_info[fx -> px_ninfo++] = *pep;
+                       *pep++ = NULL;
+                   }
+                   while (--i >= 0);
+                   break;
+               }
+               next = -1;
+               break;
+       }
+    }
+
+    if (next > 0) {
+       switch (fsb -> fsb_state) {
+           case FSB_DATAREAD: 
+               if (!(fsb -> fsb_flags & FSB_INIT)) {
+unexpected_fadu: ;
+                   (void) fpktlose (fsb, fti, FS_PRO_ERR, NULLCP,
+                               "unexpected FADU; state=0x%x",
+                               fsb -> fsb_state);
+                   goto out;
+               }
+               break;
+
+           case FSB_DATAWRITE: 
+               if (fsb -> fsb_flags & FSB_INIT)
+                   goto unexpected_fadu;
+               break;
+
+           case FSB_DATACANCEL: 
+               fsbtrace (fsb, (fsb -> fsb_fd,
+                           "discarding FADU during CANCEL procedure",
+                           NULLCP, NULLPE, -1));
+               PXFREE (px);
+               return OK;
+
+           default: 
+               goto unexpected_fadu;
+       }
+
+       fti -> fti_type = FTI_DATA;
+       {
+           register struct PSAPdata   *fx = &fti -> fti_data;
+
+           *fx = *px;          /* struct copy */
+       }
+
+       return DONE;
+    }
+
+    next = FTG_BEGIN;
+    for (pep = px -> px_info, i = px -> px_ninfo - 1; i >= 0; pep++, i--) {
+       if ((pe = *pep) == NULLPE)
+           continue;
+       if (decode_FTAM_PDU (pe, 1, NULLIP, NULLVP, &pdu) == NOTOK) {
+           (void) fpktlose (fsb, fti, FS_PRO_ERRMSG, NULLCP,
+                            "unable to parse PDU: %s", PY_pepy);
+           goto out;
+       }
+       fsbtrace (fsb, (fsb -> fsb_fd, "P-DATA.INDICATION", "FPDU", pe, 1));
+
+       switch (pdu -> offset) {
+           case type_FTAM_PDU_f__begin__group__request:
+               if (fsb -> fsb_flags & FSB_INIT)
+                   goto unexpected_fpdu;
+               ftg -> ftg_threshold =
+                           pdu -> un.f__begin__group__request -> parm;
+               goto do_begin;
+
+           case type_FTAM_PDU_f__begin__group__response:
+               if (!(fsb -> fsb_flags & FSB_INIT))
+                   goto unexpected_fpdu;
+       do_begin: ;
+               if (!(next & FTG_BEGIN))
+                   goto unexpected_fpdu;
+               if (!(fsb -> fsb_units & FUNIT_GROUPING)) {
+           no_grouping: ;
+                   (void) fpktlose (fsb, fti, FS_PRO_ERRFUNIT, NULLCP,
+                           "grouping not permitted");
+                   goto out;
+               }
+               ftg -> ftg_flags |= FTG_BEGIN;
+               next = FTG_SELECT | FTG_CREATE | FTG_CLOSE;
+               break;
+
+           case type_FTAM_PDU_f__select__request:
+               if ((fsb -> fsb_flags & FSB_INIT) || !(next & FTG_SELECT))
+                   goto unexpected_fpdu;
+               ftg -> ftg_flags |= FTG_SELECT;
+               {
+                   register struct FTAMselect *ftse = &ftg -> ftg_select;
+                   register struct type_FTAM_F__SELECT__request *req =
+                                               pdu -> un.f__select__request;
+
+                   if (fpm2attr (fsb, req -> attributes, &ftse -> ftse_attrs,
+                                 fti) == NOTOK)
+                       goto out;
+                   ftse -> ftse_attrs.fa_present &= FA_SEL_ATTRS;
+                   if (fpm2bits (fsb, frequested_pairs,
+                                 req -> requested__access,
+                                 &ftse -> ftse_access, fti) == NOTOK)
+                       goto out;
+                   if ((fsb -> fsb_attrs & FATTR_SECURITY)
+                           && req -> access__passwords
+                           && fpm2pass (fsb, req -> access__passwords,
+                                        &ftse -> ftse_pwds, fti) == NOTOK)
+                       goto out;
+                   FCINIT (&ftse -> ftse_conctl);
+                   if ((fsb -> fsb_attrs & FATTR_STORAGE)
+                           && req -> concurrency__control
+                           && fpm2conctl (fsb, req -> concurrency__control,
+                                          &ftse -> ftse_conctl, fti) == NOTOK)
+                       goto out;
+                   if (req -> shared__ASE__information
+                           && fpm2shared (fsb,
+                                          req -> shared__ASE__information,
+                                          &ftse -> ftse_sharedASE, fti) == NOTOK)
+                       goto out;
+                   if (req -> account
+                           && (ftse -> ftse_account = qb2str (req -> account))
+                                       == NULL) {
+no_mem: ;
+                       (void) ftamlose (fti, FS_GEN (fsb), 1, NULLCP,
+                                        "out of memory");
+                       goto out;
+                   }
+               }
+               next = FTG_RDATTR | FTG_CHATTR | FTG_OPEN | FTG_DESELECT
+                       | FTG_DELETE;
+               break;
+
+           case type_FTAM_PDU_f__select__response:
+               if (!(fsb -> fsb_flags & FSB_INIT) || !(next & FTG_SELECT))
+                   goto unexpected_fpdu;
+               ftg -> ftg_flags |= FTG_SELECT;
+               {
+                   register struct FTAMselect *ftse = &ftg -> ftg_select;
+                   register struct type_FTAM_F__SELECT__response *rsp =
+                                               pdu -> un.f__select__response;
+
+                   ftse -> ftse_state = rsp -> state__result
+                                           ? rsp -> state__result -> parm
+                                           : int_FTAM_State__Result_success;
+                   ftse -> ftse_action = rsp -> action__result
+                                           ? rsp -> action__result -> parm
+                                           : int_FTAM_Action__Result_success;
+                   if (fpm2attr (fsb, rsp  -> attributes, &ftse -> ftse_attrs,
+                                 fti) == NOTOK)
+                       goto out;
+                   ftse -> ftse_attrs.fa_present &= FA_SEL_ATTRS;
+                   if (rsp -> shared__ASE__information
+                           && fpm2shared (fsb,
+                                          rsp -> shared__ASE__information,
+                                          &ftse -> ftse_sharedASE, fti) == NOTOK)
+                       goto out;
+                   if (rsp -> diagnostic
+                           && fpm2diag (fsb, rsp -> diagnostic,
+                                        ftse -> ftse_diags,
+                                        &ftse -> ftse_ndiag, fti) == NOTOK)
+                       goto out;
+               }
+               next = FTG_RDATTR | FTG_CHATTR | FTG_OPEN | FTG_DESELECT
+                       | FTG_DELETE | FTG_END;
+               break;
+
+           case type_FTAM_PDU_f__create__request:
+               if ((fsb -> fsb_flags & FSB_INIT) || !(next & FTG_CREATE))
+                   goto unexpected_fpdu;
+               if (!(fsb -> fsb_units & FUNIT_LIMITED)) {
+       no_limited: ;
+                   (void) fpktlose (fsb, fti, FS_PRO_ERRPROC, NULLCP,
+                           "limited file management not permitted");
+                   goto out;
+               }
+               ftg -> ftg_flags |= FTG_CREATE;
+               {
+                   register struct FTAMcreate *ftce = &ftg -> ftg_create;
+                   register struct type_FTAM_F__CREATE__request *req =
+                                               pdu -> un.f__create__request;
+
+                   ftce -> ftce_override = req -> override;
+                   if (fpm2attr (fsb, req -> initial__attributes,
+                                 &ftce -> ftce_attrs, fti) == NOTOK)
+                       goto out;
+                   if ((ftce -> ftce_attrs.fa_present &
+                                (FA_FILENAME | FA_ACTIONS | FA_CONTENTS))
+                           != (FA_FILENAME | FA_ACTIONS | FA_CONTENTS)) {
+                       (void) ftamlose (fti, FS_GEN (fsb), 1, NULLCP,
+                          "missing mandatory parameters in F-CREATE-request");
+                       goto out;
+                   }
+                   ftce -> ftce_attrs.fa_present &= FA_CRE_ATTRS;
+                   if (!(fsb -> fsb_attrs & FATTR_STORAGE))
+                       ftce -> ftce_attrs.fa_present &= ~FA_STORAGE;
+                   if (!(fsb -> fsb_attrs & FATTR_SECURITY))
+                       ftce -> ftce_attrs.fa_present &= ~FA_SECURITY;
+                   if (req->create__password) {/* both choices are qbufs... */
+                       register struct qbuf *qb =
+                                       req -> create__password -> un.graphic;
+
+                       if ((ftce -> ftce_create = qb2str (qb)) == NULL)
+                           goto no_mem;
+                       ftce -> ftce_crelen = qb -> qb_len;
+                   }
+                   if (fpm2bits (fsb, frequested_pairs,
+                                 req -> requested__access,
+                                 &ftce -> ftce_access, fti) == NOTOK)
+                       goto out;
+                   if ((fsb -> fsb_attrs & FATTR_SECURITY)
+                           && req -> access__passwords
+                           && fpm2pass (fsb, req -> access__passwords,
+                                        &ftce -> ftce_pwds, fti) == NOTOK)
+                       goto out;
+                   FCINIT (&ftce -> ftce_conctl);
+                   if ((fsb -> fsb_attrs & FATTR_STORAGE)
+                           && req -> concurrency__control
+                           && fpm2conctl (fsb, req -> concurrency__control,
+                                          &ftce -> ftce_conctl, fti) == NOTOK)
+                       goto out;
+                   if (req -> shared__ASE__information
+                           && fpm2shared (fsb,
+                                          req -> shared__ASE__information,
+                                          &ftce -> ftce_sharedASE, fti) == NOTOK)
+                       goto out;
+                   if (req -> account
+                           && (ftce -> ftce_account = qb2str (req -> account))
+                                       == NULL)
+                       goto no_mem;
+               }
+               next = FTG_RDATTR | FTG_CHATTR | FTG_OPEN | FTG_DESELECT
+                       | FTG_DELETE;
+               break;
+
+           case type_FTAM_PDU_f__create__response:
+               if (!(fsb -> fsb_flags & FSB_INIT) || !(next & FTG_CREATE))
+                   goto unexpected_fpdu;
+               if (!(fsb -> fsb_units & FUNIT_LIMITED))
+                   goto no_limited;
+               ftg -> ftg_flags |= FTG_CREATE;
+               {
+                   register struct FTAMcreate *ftce = &ftg -> ftg_create;
+                   register struct type_FTAM_F__CREATE__response *rsp =
+                                               pdu -> un.f__create__response;
+
+                   ftce -> ftce_state = rsp -> state__result
+                                           ? rsp -> state__result -> parm
+                                           : int_FTAM_State__Result_success;
+                   ftce -> ftce_action = rsp -> action__result
+                                           ? rsp -> action__result -> parm
+                                           : int_FTAM_Action__Result_success;
+                   if (fpm2attr (fsb, rsp -> initial__attributes,
+                                 &ftce -> ftce_attrs, fti) == NOTOK)
+                       goto out;
+                   ftce -> ftce_attrs.fa_present &= FA_CRE_ATTRS;
+                   if (!(fsb -> fsb_attrs & FATTR_STORAGE))
+                       ftce -> ftce_attrs.fa_present &= ~FA_STORAGE;
+                   if (!(fsb -> fsb_attrs & FATTR_SECURITY))
+                       ftce -> ftce_attrs.fa_present &= ~FA_SECURITY;
+                   if (rsp -> shared__ASE__information
+                           && fpm2shared (fsb,
+                                          rsp -> shared__ASE__information,
+                                          &ftce -> ftce_sharedASE, fti) == NOTOK)
+                       goto out;
+                   if (rsp -> diagnostic
+                           && fpm2diag (fsb, rsp -> diagnostic,
+                                        ftce -> ftce_diags,
+                                        &ftce -> ftce_ndiag, fti) == NOTOK)
+                       goto out;
+               }
+               next = FTG_RDATTR | FTG_CHATTR | FTG_OPEN | FTG_DESELECT
+                       | FTG_DELETE | FTG_END;
+               break;
+
+           case type_FTAM_PDU_f__read__attrib__request:
+               if ((fsb -> fsb_flags & FSB_INIT) || !(next & FTG_RDATTR))
+                   goto unexpected_fpdu;
+               if (!(fsb -> fsb_units & FUNIT_LIMITED))
+                   goto no_limited;
+               ftg -> ftg_flags |= FTG_RDATTR;
+               {
+                   register struct FTAMreadattr  *ftra = &ftg -> ftg_readattr;
+                   register struct type_FTAM_F__READ__ATTRIB__request *req =
+                                           pdu -> un.f__read__attrib__request;
+
+                   if (fpm2bits (fsb, fname_pairs, req,
+                                    &ftra -> ftra_attrnames, fti) == NOTOK)
+                       goto out;
+                   if (!(fsb -> fsb_attrs & FATTR_STORAGE))
+                       ftra -> ftra_attrnames &= ~FA_STORAGE;
+                   if (!(fsb -> fsb_attrs & FATTR_SECURITY))
+                       ftra -> ftra_attrnames &= ~FA_SECURITY;
+               }
+               next = FTG_CHATTR | FTG_DESELECT | FTG_DELETE |
+                       ( ftg -> ftg_flags & ( FTG_SELECT | FTG_CREATE ) ?
+                         FTG_OPEN : FTG_NULL );
+               break;
+
+           case type_FTAM_PDU_f__read__attrib__response:
+               if (!(fsb -> fsb_flags & FSB_INIT) || !(next & FTG_RDATTR))
+                   goto unexpected_fpdu;
+               if (!(fsb -> fsb_units & FUNIT_LIMITED))
+                   goto no_limited;
+               ftg -> ftg_flags |= FTG_RDATTR;
+               {
+                   register struct FTAMreadattr  *ftra = &ftg -> ftg_readattr;
+                   register struct type_FTAM_F__READ__ATTRIB__response *rsp =
+                                          pdu -> un.f__read__attrib__response;
+
+                   ftra -> ftra_action = rsp -> action__result
+                                           ? rsp -> action__result -> parm
+                                           : int_FTAM_Action__Result_success;
+                   if (rsp -> attributes
+                           && fpm2attr (fsb, rsp -> attributes,
+                                        &ftra -> ftra_attrs, fti) == NOTOK)
+                       goto out;
+                   if (!(fsb -> fsb_attrs & FATTR_STORAGE))
+                       ftra -> ftra_attrs.fa_present &= ~FA_STORAGE;
+                   if (!(fsb -> fsb_attrs & FATTR_SECURITY))
+                       ftra -> ftra_attrs.fa_present &= ~FA_SECURITY;
+                   if (rsp -> diagnostic
+                           && fpm2diag (fsb, rsp -> diagnostic,
+                                        ftra -> ftra_diags,
+                                        &ftra -> ftra_ndiag, fti) == NOTOK)
+                       goto out;
+               }
+               next = FTG_CHATTR | FTG_DESELECT | FTG_DELETE |
+                       ( ftg -> ftg_flags & ( FTG_SELECT | FTG_CREATE ) ?
+                         FTG_OPEN : FTG_NULL );
+               break;
+
+           case type_FTAM_PDU_f__change__attrib__request:
+               if ((fsb -> fsb_flags & FSB_INIT) || !(next & FTG_CHATTR))
+                   goto unexpected_fpdu;
+               if (!(fsb -> fsb_units & FUNIT_ENHANCED)) {
+           no_enhanced: ;
+                   (void) fpktlose (fsb, fti, FS_PRO_ERRPROC, NULLCP,
+                           "enhanced file management not permitted");
+                   goto out;
+               }
+               ftg -> ftg_flags |= FTG_CHATTR;
+               {
+                   register struct FTAMchngattr  *ftca = &ftg -> ftg_chngattr;
+                   register struct type_FTAM_F__CHANGE__ATTRIB__request *req =
+                                         pdu -> un.f__change__attrib__request;
+
+                   if (fpm2attr (fsb, req, &ftca -> ftca_attrs, fti) == NOTOK)
+                       goto out;
+                   if (ftca -> ftca_attrs.fa_present
+                               & ftca -> ftca_attrs.fa_novalue) {
+                       (void) fpktlose (fsb, fti, FS_PRO_ERRPROC, NULLCP,
+                               "attributes can not be changed to no value available");
+                       goto out;
+                   }
+                   if (!(fsb -> fsb_attrs & FATTR_STORAGE))
+                       ftca -> ftca_attrs.fa_present &= ~FA_STORAGE;
+                   if (!(fsb -> fsb_attrs & FATTR_SECURITY))
+                       ftca -> ftca_attrs.fa_present &= ~FA_SECURITY;
+               }
+               next = FTG_DESELECT | FTG_DELETE |
+                       ( ftg -> ftg_flags & ( FTG_SELECT | FTG_CREATE ) ?
+                         FTG_OPEN : FTG_NULL );
+               break;
+
+           case type_FTAM_PDU_f__change__attrib__response:
+               if (!(fsb -> fsb_flags & FSB_INIT) || !(next & FTG_CHATTR))
+                   goto unexpected_fpdu;
+               if (!(fsb -> fsb_units & FUNIT_ENHANCED))
+                   goto no_enhanced;
+               ftg -> ftg_flags |= FTG_CHATTR;
+               {
+                   register struct FTAMchngattr  *ftca = &ftg -> ftg_chngattr;
+                   register struct type_FTAM_F__CHANGE__ATTRIB__response *rsp =
+                                        pdu -> un.f__change__attrib__response;
+
+                   ftca -> ftca_action = rsp -> action__result
+                                           ? rsp -> action__result -> parm
+                                           : int_FTAM_Action__Result_success;
+                   if (rsp -> attributes
+                           && fpm2attr (fsb, rsp -> attributes,
+                                        &ftca -> ftca_attrs, fti) == NOTOK)
+                       goto out;
+                   if (!(fsb -> fsb_attrs & FATTR_STORAGE))
+                       ftca -> ftca_attrs.fa_present &= ~FA_STORAGE;
+                   if (!(fsb -> fsb_attrs & FATTR_SECURITY))
+                       ftca -> ftca_attrs.fa_present &= ~FA_SECURITY;
+                   if (rsp -> diagnostic
+                           && fpm2diag (fsb, rsp -> diagnostic,
+                                        ftca -> ftca_diags,
+                                        &ftca -> ftca_ndiag, fti) == NOTOK)
+                       goto out;
+                   if (!(fsb -> fsb_attrs & FATTR_STORAGE))
+                       ftca -> ftca_attrs.fa_present &= ~FA_STORAGE;
+                   if (!(fsb -> fsb_attrs & FATTR_SECURITY))
+                       ftca -> ftca_attrs.fa_present &= ~FA_SECURITY;
+               }
+               next = FTG_DESELECT | FTG_DELETE |
+                       ( ftg -> ftg_flags & ( FTG_SELECT | FTG_CREATE ) ?
+                         FTG_OPEN : FTG_NULL );
+               break;
+
+           case type_FTAM_PDU_f__open__request:
+               if ((fsb -> fsb_flags & FSB_INIT) || !(next & FTG_OPEN))
+                   goto unexpected_fpdu;
+               ftg -> ftg_flags |= FTG_OPEN;
+               {
+                   register struct FTAMopen *ftop = &ftg -> ftg_open;
+                   register struct type_FTAM_F__OPEN__request *req =
+                                         pdu -> un.f__open__request;
+
+                   if (req -> processing__mode) {
+                       if (fpm2bits (fsb, fmode_pairs,
+                                     req -> processing__mode,
+                                     &ftop -> ftop_mode, fti) == NOTOK)
+                           goto out;
+                   }
+                   else
+                       ftop -> ftop_mode = FA_PERM_READ;
+                   if (req -> contents__type -> offset
+                           == choice_FTAM_0_proposed) {
+                       register struct type_FTAM_Contents__Type__Attribute
+                           *proposed = req -> contents__type -> un.proposed;
+
+                       ftop -> ftop_contents =
+                               proposed -> document__type__name;
+                       proposed -> document__type__name = NULLOID;
+                       if (proposed -> parameter
+                               && (ftop -> ftop_parameter =
+                                       pe_cpy (proposed -> parameter))
+                                               == NULLPE)
+                           goto no_mem;
+                   }
+                   FCINIT (&ftop -> ftop_conctl);
+                   if ((fsb -> fsb_attrs & FATTR_STORAGE)
+                           && req -> concurrency__control
+                           && fpm2conctl (fsb, req -> concurrency__control,
+                                          &ftop -> ftop_conctl, fti) == NOTOK)
+                       goto out;
+                   if (req -> shared__ASE__information
+                           && fpm2shared (fsb,
+                                          req -> shared__ASE__information,
+                                          &ftop -> ftop_sharedASE, fti) == NOTOK)
+                       goto out;
+                   if (fsb -> fsb_units & FUNIT_FADULOCK)
+                       ftop -> ftop_locking = req -> enable__fadu__locking;
+               }
+               next = FTG_END;
+               break;
+
+           case type_FTAM_PDU_f__open__response:
+               if (!(fsb -> fsb_flags & FSB_INIT) || !(next & FTG_OPEN))
+                   goto unexpected_fpdu;
+               ftg -> ftg_flags |= FTG_OPEN;
+               {
+                   register struct FTAMopen *ftop = &ftg -> ftg_open;
+                   register struct type_FTAM_F__OPEN__response *rsp =
+                                         pdu -> un.f__open__response;
+                   register struct type_FTAM_Contents__Type__Attribute
+                                       *proposed = rsp -> contents__type;
+
+                   ftop -> ftop_state = rsp -> state__result
+                                           ? rsp -> state__result -> parm
+                                           : int_FTAM_State__Result_success;
+                   ftop -> ftop_action = rsp -> action__result
+                                           ? rsp -> action__result -> parm
+                                           : int_FTAM_Action__Result_success;
+                   ftop -> ftop_contents = proposed -> document__type__name;
+                   proposed -> document__type__name = NULLOID;
+                   if (proposed -> parameter
+                           && (ftop -> ftop_parameter =
+                                   pe_cpy (proposed -> parameter)) == NULLPE)
+                       goto no_mem;
+                   FCINIT (&ftop -> ftop_conctl);
+                   if ((fsb -> fsb_attrs & FATTR_STORAGE)
+                           && rsp -> concurrency__control
+                           && fpm2conctl (fsb, rsp -> concurrency__control,
+                                          &ftop -> ftop_conctl, fti) == NOTOK)
+                       goto out;
+                   if (rsp -> shared__ASE__information
+                           && fpm2shared (fsb,
+                                          rsp -> shared__ASE__information,
+                                          &ftop -> ftop_sharedASE, fti) == NOTOK)
+                       goto out;
+                   if (rsp -> diagnostic
+                           && fpm2diag (fsb, rsp -> diagnostic,
+                                        ftop -> ftop_diags,
+                                        &ftop -> ftop_ndiag, fti) == NOTOK)
+                       goto out;
+               }
+               next = FTG_END;
+               break;
+
+           case type_FTAM_PDU_f__close__request:
+               if (fsb -> fsb_flags & FSB_INIT)
+                   goto unexpected_fpdu;
+               goto do_close;
+           case type_FTAM_PDU_f__close__response:
+               if (!(fsb -> fsb_flags & FSB_INIT))
+                   goto unexpected_fpdu;
+       do_close: ;
+               if (!(next & FTG_CLOSE))
+                   goto unexpected_fpdu;
+               ftg -> ftg_flags |= FTG_CLOSE;
+               {                       /* F-CLOSE-response is identical... */
+                   register struct FTAMclose *ftcl = &ftg -> ftg_close;
+                   register struct type_FTAM_F__CLOSE__request *req =
+                                         pdu -> un.f__close__request;
+
+                   ftcl -> ftcl_action = req -> action__result
+                                           ? req -> action__result -> parm
+                                           : int_FTAM_Action__Result_success;
+                   if (req -> shared__ASE__information
+                           && fpm2shared (fsb,
+                                          req -> shared__ASE__information,
+                                          &ftcl -> ftcl_sharedASE, fti) == NOTOK)
+                       goto out;
+                   if (req -> diagnostic
+                           && fpm2diag (fsb, req -> diagnostic,
+                                        ftcl -> ftcl_diags,
+                                        &ftcl -> ftcl_ndiag, fti) == NOTOK)
+                       goto out;
+               }
+               next = FTG_RDATTR | FTG_CHATTR | FTG_DESELECT | FTG_DELETE;
+               break;
+
+           case type_FTAM_PDU_f__deselect__request:
+               if ((fsb -> fsb_flags & FSB_INIT) || !(next & FTG_DESELECT))
+                   goto unexpected_fpdu;
+               ftg -> ftg_flags |= FTG_DESELECT;
+               {
+                   register struct FTAMdeselect  *ftde = &ftg -> ftg_deselect;
+                   register struct type_FTAM_F__DESELECT__request *req =
+                                         pdu -> un.f__deselect__request;
+
+                   if (req
+                           && fpm2shared (fsb, req,
+                                          &ftde -> ftde_sharedASE, fti) == NOTOK)
+                       goto out;
+               }
+               next = FTG_END;
+               break;
+
+           case type_FTAM_PDU_f__deselect__response:
+               if (!(fsb -> fsb_flags & FSB_INIT) || !(next & FTG_DESELECT))
+                   goto unexpected_fpdu;
+               ftg -> ftg_flags |= FTG_DESELECT;
+               {
+                   register struct FTAMdeselect  *ftde = &ftg -> ftg_deselect;
+                   register struct type_FTAM_F__DESELECT__response *rsp =
+                                         pdu -> un.f__deselect__response;
+
+                   ftde -> ftde_action = rsp -> action__result
+                                           ? rsp -> action__result -> parm
+                                           : int_FTAM_Action__Result_success;
+                   if (rsp -> shared__ASE__information
+                           && fpm2shared (fsb,
+                                          rsp -> shared__ASE__information,
+                                          &ftde -> ftde_sharedASE, fti) == NOTOK)
+                       goto out;
+                   if (rsp -> charging
+                           && fpm2chrg (fsb, rsp -> charging,
+                                         &ftde -> ftde_charges, fti) == NOTOK)
+                       goto out;
+                   if (rsp -> diagnostic
+                           && fpm2diag (fsb, rsp -> diagnostic,
+                                        ftde -> ftde_diags,
+                                        &ftde -> ftde_ndiag, fti) == NOTOK)
+                       goto out;
+               }
+               next = FTG_END;
+               break;
+
+           case type_FTAM_PDU_f__delete__request:
+               if (fsb -> fsb_flags & FSB_INIT)
+                   goto unexpected_fpdu;
+               if (!(fsb -> fsb_units & FUNIT_LIMITED))
+                   goto no_limited;
+               ftg -> ftg_flags |= FTG_DELETE;
+               {
+                   register struct FTAMdelete  *ftxe = &ftg -> ftg_delete;
+                   register struct type_FTAM_F__DELETE__request *req =
+                                         pdu -> un.f__delete__request;
+
+                   if (req
+                           && fpm2shared (fsb, req,
+                                          &ftxe -> ftxe_sharedASE, fti) == NOTOK)
+                       goto out;
+               }
+               next = FTG_END;
+               break;
+
+           case type_FTAM_PDU_f__delete__response:
+               if (!(fsb -> fsb_flags & FSB_INIT) || !(next & FTG_DELETE))
+                   goto unexpected_fpdu;
+               if (!(fsb -> fsb_units & FUNIT_LIMITED))
+                   goto no_limited;
+               ftg -> ftg_flags |= FTG_DELETE;
+               {
+                   register struct FTAMdelete  *ftxe = &ftg -> ftg_delete;
+                   register struct type_FTAM_F__DELETE__response *rsp =
+                                         pdu -> un.f__delete__response;
+
+                   ftxe -> ftxe_action = rsp -> action__result
+                                           ? rsp -> action__result -> parm
+                                           : int_FTAM_Action__Result_success;
+                   if (rsp -> shared__ASE__information
+                           && fpm2shared (fsb,
+                                          rsp -> shared__ASE__information,
+                                          &ftxe -> ftxe_sharedASE, fti) == NOTOK)
+                       goto out;
+                   if (rsp -> charging
+                           && fpm2chrg (fsb, rsp -> charging,
+                                         &ftxe -> ftxe_charges, fti) == NOTOK)
+                       goto out;
+                   if (rsp -> diagnostic
+                           && fpm2diag (fsb, rsp -> diagnostic,
+                                        ftxe -> ftxe_diags,
+                                        &ftxe -> ftxe_ndiag, fti) == NOTOK)
+                       goto out;
+               }
+               next = FTG_END;
+               break;
+
+           case type_FTAM_PDU_f__end__group__request:
+               if (fsb -> fsb_flags & FSB_INIT)
+                   goto unexpected_fpdu;
+               goto do_end;
+           case type_FTAM_PDU_f__end__group__response:
+               if (!(fsb -> fsb_flags & FSB_INIT))
+                   goto unexpected_fpdu;
+       do_end: ;
+               if (!(next & FTG_END))
+                   goto unexpected_fpdu;
+               if (!(fsb -> fsb_units & FUNIT_GROUPING))
+                   goto no_grouping;
+               ftg -> ftg_flags |= FTG_END;
+               next = 0;
+               break;
+
+           case type_FTAM_PDU_f__locate__request:
+               if ((fsb -> fsb_flags & FSB_INIT)
+                       || fsb -> fsb_state != FSB_DATAIDLE
+                       || next != FTG_BEGIN)
+                   goto unexpected_fpdu;
+               if (!(fsb -> fsb_units & FUNIT_ACCESS)) {
+       no_access: ;
+                   (void) fpktlose (fsb, fti, FS_PRO_ERRPROC, NULLCP,
+                           "file access not permitted");
+                   goto out;
+               }
+               fti -> fti_type = FTI_ACCESS;
+               {
+                   register struct FTAMaccess *ftac = &fti -> fti_access;
+                   register struct type_FTAM_F__LOCATE__request *req =
+                                         pdu -> un.f__locate__request;
+
+                   ftac -> ftac_operation = FA_OPS_LOCATE;
+                   if (fpm2faduid (fsb,
+                                   req -> file__access__data__unit__identity,
+                                   &ftac -> ftac_identity, fti) == NOTOK)
+                       goto out;
+                   if (req -> fadu__lock)
+                       ftac -> ftac_locking = req -> fadu__lock -> parm;
+               }
+               next = 0;
+               break;
+
+           case type_FTAM_PDU_f__locate__response:
+               if (!(fsb -> fsb_flags & FSB_INIT)
+                       || fsb -> fsb_state != FSB_LOCATE
+                       || next != FTG_BEGIN)
+                   goto unexpected_fpdu;
+               if (!(fsb -> fsb_units & FUNIT_ACCESS))
+                   goto no_access;
+               fti -> fti_type = FTI_ACCESS;
+               {
+                   register struct FTAMaccess *ftac = &fti -> fti_access;
+                   register struct type_FTAM_F__LOCATE__response *rsp =
+                                         pdu -> un.f__locate__response;
+
+                   ftac -> ftac_operation = FA_OPS_LOCATE;
+                   ftac -> ftac_action = rsp -> action__result
+                                           ? rsp -> action__result -> parm
+                                           : int_FTAM_Action__Result_success;
+                   if (rsp -> file__access__data__unit__identity
+                           && fpm2faduid (fsb,
+                                          rsp -> file__access__data__unit__identity,
+                                          &ftac -> ftac_identity, fti)
+                                   == NOTOK)
+                       goto out;
+                   if (rsp -> diagnostic
+                           && fpm2diag (fsb, rsp -> diagnostic,
+                                        ftac -> ftac_diags,
+                                        &ftac -> ftac_ndiag, fti) == NOTOK)
+                       goto out;
+               }
+               next = 0;
+               break;
+
+           case type_FTAM_PDU_f__erase__request:
+               if ((fsb -> fsb_flags & FSB_INIT)
+                       || fsb -> fsb_state != FSB_DATAIDLE
+                       || next != FTG_BEGIN)
+                   goto unexpected_fpdu;
+               if (!(fsb -> fsb_units & FUNIT_ACCESS))
+                   goto no_access;
+               fti -> fti_type = FTI_ACCESS;
+               {
+                   register struct FTAMaccess *ftac = &fti -> fti_access;
+                   register struct type_FTAM_F__ERASE__request *req =
+                                         pdu -> un.f__erase__request;
+
+                   ftac -> ftac_operation = FA_OPS_ERASE;
+                   if (fpm2faduid (fsb, req, &ftac -> ftac_identity, fti)
+                           == NOTOK)
+                       goto out;
+               }
+               next = 0;
+               break;
+
+           case type_FTAM_PDU_f__erase__response:
+               if (!(fsb -> fsb_flags & FSB_INIT)
+                       || fsb -> fsb_state != FSB_ERASE
+                       || next != FTG_BEGIN)
+                   goto unexpected_fpdu;
+               if (!(fsb -> fsb_units & FUNIT_ACCESS))
+                   goto no_access;
+               fti -> fti_type = FTI_ACCESS;
+               {
+                   register struct FTAMaccess *ftac = &fti -> fti_access;
+                   register struct type_FTAM_F__ERASE__response *rsp =
+                                         pdu -> un.f__erase__response;
+
+                   ftac -> ftac_operation = FA_OPS_ERASE;
+                   ftac -> ftac_action = rsp -> action__result
+                                           ? rsp -> action__result -> parm
+                                           : int_FTAM_Action__Result_success;
+                   if (rsp -> diagnostic
+                           && fpm2diag (fsb, rsp -> diagnostic,
+                                        ftac -> ftac_diags,
+                                        &ftac -> ftac_ndiag, fti) == NOTOK)
+                       goto out;
+               }
+               next = 0;
+               break;
+
+           case type_FTAM_PDU_f__read__request:
+               if ((fsb -> fsb_flags & FSB_INIT)
+                       || next != FTG_BEGIN
+                       || fsb -> fsb_state != FSB_DATAIDLE)
+                   goto unexpected_fpdu;
+               if (!(fsb -> fsb_units & FUNIT_READ)) {
+                   (void) fpktlose (fsb, fti, FS_PRO_ERRPROC, NULLCP,
+                           "reading not permitted");
+                   goto out;
+               }
+               fti -> fti_type = FTI_READWRITE;
+               {
+                   register struct FTAMreadwrite *ftrw = &fti -> fti_readwrite;
+                   register struct type_FTAM_F__READ__request *req =
+                                               pdu -> un.f__read__request;
+
+                   ftrw -> ftrw_operation = FA_OPS_READ;
+                   if (fpm2faduid (fsb,
+                                   req -> file__access__data__unit__identity,
+                                   &ftrw -> ftrw_identity, fti) == NOTOK)
+                       goto out;
+                   if ((ftrw -> ftrw_context =
+                                   req -> access__context -> access__context)
+                           == FA_ACC_FL) {
+                       if (req -> access__context -> optionals
+                               & opt_FTAM_Access__Context_level__number)
+                           ftrw -> ftrw_level =
+                                   req -> access__context -> level__number;
+                       else {
+                           (void) fpktlose (fsb, fti, FS_PRO_ERRMSG, NULLCP,
+                                "level-number missing for access-context FL");
+                           goto out;
+                       }
+                   }
+                   else
+                       ftrw -> ftrw_level = -1;
+
+                   if ((fsb -> fsb_units & FUNIT_FADULOCK)
+                           && req -> fadu__lock)
+                       ftrw -> ftrw_locking = req -> fadu__lock -> parm;
+               }
+               next = 0;
+               break;
+
+           case type_FTAM_PDU_f__write__request:
+               if ((fsb -> fsb_flags & FSB_INIT)
+                       || next != FTG_BEGIN
+                       || fsb -> fsb_state != FSB_DATAIDLE)
+                   goto unexpected_fpdu;
+               if (!(fsb -> fsb_units & FUNIT_WRITE)) {
+                   (void) fpktlose (fsb, fti, FS_PRO_ERRPROC, NULLCP,
+                           "writing not permitted");
+                   goto out;
+               }
+               fti -> fti_type = FTI_READWRITE;
+               {
+                   register struct FTAMreadwrite *ftrw = &fti -> fti_readwrite;
+                   register struct type_FTAM_F__WRITE__request *req =
+                                               pdu -> un.f__write__request;
+
+                   ftrw -> ftrw_operation =
+                                   req -> file__access__data__unit__operation;
+                   if (fpm2faduid (fsb,
+                                   req -> file__access__data__unit__identity,
+                                   &ftrw -> ftrw_identity, fti) == NOTOK)
+                       goto out;
+                   if ((fsb -> fsb_units & FUNIT_FADULOCK)
+                           && req -> fadu__lock)
+                       ftrw -> ftrw_locking = req -> fadu__lock -> parm;
+               }
+               next = 0;
+               break;
+
+           case type_FTAM_PDU_f__data__end__request:
+               switch (fsb -> fsb_state) {
+                   case FSB_DATAREAD:
+                       if (!(fsb -> fsb_flags & FSB_INIT))
+                           goto unexpected_data_end;
+                       break;
+
+                   case FSB_DATAWRITE:
+                       if (fsb -> fsb_flags & FSB_INIT)
+                           goto unexpected_data_end;
+                       break;
+
+                   case FSB_DATACANCEL:
+                       fsbtrace (fsb,
+                           (fsb -> fsb_fd,
+                          "discarding F-DATA-END during CANCEL procedure",
+                               NULLCP, NULLPE, -1));
+                       free_FTAM_PDU (pdu);
+                       PXFREE (px);
+                       return OK;
+                       
+                   default:
+unexpected_data_end: ;
+                       (void) fpktlose (fsb, fti, FS_PRO_ERR, NULLCP,
+                                   "unexpected data end; state=0x%x",
+                                   fsb -> fsb_state);
+                       goto out;
+               }
+               if (next != FTG_BEGIN)
+                   goto unexpected_data_end;
+
+               fti -> fti_type = FTI_DATAEND;
+               {
+                   register struct FTAMdataend *ftda = &fti -> fti_dataend;
+                   register struct type_FTAM_F__DATA__END__request *req =
+                                       pdu -> un.f__data__end__request;
+
+                   ftda -> ftda_action = req -> action__result
+                                           ?req -> action__result -> parm
+                                           : int_FTAM_Action__Result_success;
+                   if (req -> diagnostic
+                           && fpm2diag (fsb, req -> diagnostic,
+                                        ftda -> ftda_diags,
+                                        &ftda -> ftda_ndiag, fti) == NOTOK)
+                       goto out;
+               }
+               next = 0;
+               break;
+
+           case type_FTAM_PDU_f__cancel__request:
+               switch (fsb -> fsb_state) {
+                   case FSB_DATAREAD:
+                   case FSB_DATAWRITE:
+                   case FSB_DATAFIN1:
+                   case FSB_DATAFIN2:
+                       break;
+
+                   case FSB_DATACANCEL:
+                       fsb -> fsb_flags |= FSB_COLLIDE;
+                       break;
+
+                   default:
+                       goto unexpected_fpdu;
+               }
+               goto do_cancel;
+           case type_FTAM_PDU_f__cancel__response:
+               if (fsb -> fsb_state != FSB_DATACANCEL)
+                   goto unexpected_fpdu;
+       do_cancel: ;
+               if (next != FTG_BEGIN)
+                   goto unexpected_fpdu;
+               fti -> fti_type = FTI_CANCEL;
+               {                       /* F-CANCEL-response is identical... */
+                   register struct FTAMcancel *ftcn = &fti -> fti_cancel;
+                   register struct type_FTAM_F__CANCEL__request *req =
+                                               pdu -> un.f__cancel__request;
+
+                   ftcn -> ftcn_action = req -> action__result
+                                           ? req -> action__result -> parm
+                                           : int_FTAM_Action__Result_success;
+                   if (req -> shared__ASE__information
+                           && fpm2shared (fsb,
+                                          req -> shared__ASE__information,
+                                          &ftcn -> ftcn_sharedASE, fti) == NOTOK)
+                       goto out;
+                   if (req -> diagnostic
+                           && fpm2diag (fsb, req -> diagnostic,
+                                        ftcn -> ftcn_diags,
+                                        &ftcn -> ftcn_ndiag, fti) == NOTOK)
+                       goto out;
+               }
+               next = 0;
+               break;
+
+           case type_FTAM_PDU_f__transfer__end__request:
+               if ((fsb -> fsb_flags & FSB_INIT)
+                       || next != FTG_BEGIN)
+                   goto unexpected_fpdu;
+               switch (fsb -> fsb_state) {
+                   case FSB_DATAFIN1:
+                       break;
+
+                   case FSB_DATACANCEL:
+                       fsbtrace (fsb,
+                          (fsb -> fsb_fd,
+                          "discarding F-TRANSFER-END during CANCEL procedure",
+                               NULLCP, NULLPE, -1));
+                       free_FTAM_PDU (pdu);
+                       PXFREE (px);
+                       return OK;
+                       
+                   default:
+                       goto unexpected_fpdu;
+               }
+               fti -> fti_type = FTI_TRANSEND;
+               {
+                   register struct FTAMtransend *ftre = &fti -> fti_transend;
+                   register struct type_FTAM_F__TRANSFER__END__request *req =
+                                          pdu -> un.f__transfer__end__request;
+
+                   if (req
+                           && fpm2shared (fsb, req,
+                                          &ftre -> ftre_sharedASE, fti) == NOTOK)
+                       goto out;
+               }
+               next = 0;
+               break;
+
+           case type_FTAM_PDU_f__transfer__end__response:
+               if (!(fsb -> fsb_flags & FSB_INIT)
+                       || next != FTG_BEGIN
+                       || fsb -> fsb_state != FSB_DATAFIN2)
+                   goto unexpected_fpdu;
+               fti -> fti_type = FTI_TRANSEND;
+               {
+                   register struct FTAMtransend *ftre = &fti -> fti_transend;
+                   register struct type_FTAM_F__TRANSFER__END__response *rsp =
+                                         pdu -> un.f__transfer__end__response;
+
+                   ftre -> ftre_action = rsp -> action__result
+                                           ? rsp -> action__result -> parm
+                                           : int_FTAM_Action__Result_success;
+                   if (rsp -> shared__ASE__information
+                           && fpm2shared (fsb,
+                                          rsp -> shared__ASE__information,
+                                          &ftre -> ftre_sharedASE, fti) == NOTOK)
+                       goto out;
+                   if (rsp -> diagnostic
+                           && fpm2diag (fsb, rsp -> diagnostic,
+                                        ftre -> ftre_diags,
+                                        &ftre -> ftre_ndiag, fti) == NOTOK)
+                       goto out;
+               }
+               next = 0;
+               break;
+
+           default: 
+       unexpected_fpdu: ;
+               (void) fpktlose (fsb, fti, FS_PRO_ERR, NULLCP,
+                       "FPDU mismatch; expecting one of 0x%x, found tag %s/%d/0x%x; state=0x%x",
+                       next, pe_classlist[pe -> pe_class], pe -> pe_form,
+                       pe -> pe_id, fsb -> fsb_state);
+               goto out;
+       }
+
+       free_FTAM_PDU (pdu);
+       pdu = NULL;
+    }
+
+    if (next) {
+       (void) fpktlose (fsb, fti, FS_PRO_ERRPROC, NULLCP,
+               "missing FPDU(s) in group; expecting one of 0x%x next",
+               next);
+       goto out;
+    }
+
+    switch (fti -> fti_type) {
+       case FTI_ACCESS:
+           fsb -> fsb_state = (fsb -> fsb_flags & FSB_INIT) ? FSB_DATAIDLE
+                                   : fti -> fti_access.ftac_operation
+                                       == FA_OPS_LOCATE ? FSB_LOCATE
+                                                        : FSB_ERASE;
+           goto done;
+
+       case FTI_READWRITE:
+           fsb -> fsb_state = fti -> fti_readwrite.ftrw_operation
+                                   == FA_OPS_READ ? FSB_DATAREAD
+                                                  : FSB_DATAWRITE;
+           goto done;
+
+       case FTI_DATAEND:
+           fsb -> fsb_state = FSB_DATAFIN1;
+           goto done;
+
+       case FTI_TRANSEND:
+           fsb -> fsb_state = (fsb -> fsb_flags & FSB_INIT) ? FSB_DATAIDLE
+                                       : FSB_DATAFIN2;
+           goto done;
+
+       case FTI_CANCEL:
+           if (fsb -> fsb_flags & FSB_COLLIDE) {
+               struct FTAMindication ftis;
+
+               fsbtrace (fsb, (fsb -> fsb_fd, "resolving CANCEL collision",
+                           NULLCP, NULLPE, -1));
+               (void) FCancelResponseAux (fsb, fsb -> fsb_cancelaction,
+                                          fsb -> fsb_cancelshared,
+                                          fsb -> fsb_canceldiags,
+                                          fsb -> fsb_cancelndiag,
+                                          &ftis);
+
+               fsb -> fsb_flags &= ~FSB_COLLIDE;
+               fsb -> fsb_cancelaction = FACTION_PERM;
+               if (fsb -> fsb_cancelshared) {
+                   pe_free (fsb -> fsb_cancelshared);
+                   fsb -> fsb_cancelshared = NULLPE;
+               }
+               fsb -> fsb_canceldiags = NULL;
+               fsb -> fsb_cancelndiag = 0;
+               FTCNFREE (&fti -> fti_cancel);
+               PXFREE (px);
+               return OK;
+           }
+
+           if (fsb -> fsb_flags & FSB_CANCEL) {
+               fsb -> fsb_flags &= ~FSB_CANCEL;
+               fsb -> fsb_state = FSB_DATAIDLE;
+           }
+           else
+               fsb -> fsb_state = FSB_DATACANCEL;
+           goto done;
+
+       default:                /* a grouped request */
+           break;
+    }
+
+    if (!(fsb -> fsb_flags & FSB_INIT)
+           && ftg -> ftg_threshold != px -> px_ninfo - 2) {
+       (void) fpktlose (fsb, fti, FS_PRO_ERRPROC, NULLCP,
+               "threshold mismatch; expecting %d, found %d",
+               px -> px_ninfo - 2, ftg -> ftg_threshold);
+       goto out;
+    }
+
+    if (ftg -> ftg_flags & (FTG_SELECT | FTG_CREATE)) {
+       if ((fsb -> fsb_flags & FSB_INIT)
+               ? (fsb -> fsb_state == FSB_MANAGEMENT)
+               : (ftg -> ftg_flags & (FTG_DESELECT | FTG_DELETE))) {
+           if (!(fsb -> fsb_flags & FSB_INIT))
+               switch (fsb -> fsb_class) {
+                   case FCLASS_MANAGE:
+                   case FCLASS_TM:
+                   case FCLASS_ACCESS:
+                       break;
+
+                   default:
+                       goto unexpected_group;
+               }
+
+           fti -> fti_type = FTI_MANAGEMENT;
+
+           if (fsb -> fsb_flags & FSB_INIT) {
+               if (ftg -> ftg_flags & ~fsb -> fsb_group) {
+                   (void) fpktlose (fsb, fti, FS_PRO_ERRPROC, NULLCP,
+                           "management reply mismatch; expecting 0x%x, found 0x%x",
+                           fsb -> fsb_group, ftg -> ftg_flags);
+                   goto out;
+               }
+               fsb -> fsb_state = FSB_INITIALIZED;
+           }
+           else {
+               if (fsb -> fsb_state != FSB_INITIALIZED)
+                   goto unexpected_group;
+               if ((ftg -> ftg_flags & FTG_SELECT)
+                       ? ftg -> ftg_select.ftse_account
+                       : ftg -> ftg_create.ftce_account)
+                   fsb -> fsb_flags |= FSB_DECHARGE;
+               else
+                   fsb -> fsb_flags &= ~FSB_DECHARGE;
+               fsb -> fsb_state = FSB_MANAGEMENT;
+               fsb -> fsb_group = ftg -> ftg_flags;
+           }
+
+           goto done;
+       }
+
+       if ((fsb -> fsb_flags & FSB_INIT)
+               ? (fsb -> fsb_state == FSB_BULKBEGIN)
+               : (ftg -> ftg_flags & FTG_OPEN)) {
+           if (!(fsb -> fsb_flags & FSB_INIT))
+               switch (fsb -> fsb_class) {
+                   case FCLASS_TRANSFER: 
+                   case FCLASS_TM: 
+                   case FCLASS_ACCESS: 
+                       break;
+
+                   default: 
+                       goto unexpected_group;
+               }
+
+           fti -> fti_type = FTI_BULKBEGIN;
+
+           if (fsb -> fsb_flags & FSB_INIT) {
+               int     state;
+
+               if (ftg -> ftg_flags & ~fsb -> fsb_group) {
+                   (void) fpktlose (fsb, fti, FS_PRO_ERRPROC, NULLCP,
+                           "bulk transfer reply mismatch; expecting 0x%x found 0x%x",
+                           fsb -> fsb_group, ftg -> ftg_flags);
+                   goto out;
+               }
+               if (ftg -> ftg_flags & FTG_SELECT)
+                   state = ftg -> ftg_select.ftse_state;
+               else
+                   state = ftg -> ftg_create.ftce_state;
+               if (state != FSTATE_SUCCESS
+                       || ftg -> ftg_open.ftop_state != FSTATE_SUCCESS)
+                   fsb -> fsb_state = FSB_INITIALIZED;
+               else
+                   fsb -> fsb_state = FSB_DATAIDLE;
+           }
+           else {
+               if (fsb -> fsb_state != FSB_INITIALIZED)
+                   goto unexpected_group;
+               if ((ftg -> ftg_flags & FTG_SELECT)
+                       ? ftg -> ftg_select.ftse_account
+                       : ftg -> ftg_create.ftce_account)
+                   fsb -> fsb_flags |= FSB_DECHARGE;
+               else
+                   fsb -> fsb_flags &= ~FSB_DECHARGE;
+               fsb -> fsb_state = FSB_BULKBEGIN;
+               fsb -> fsb_group = ftg -> ftg_flags;
+           }
+
+           goto done;
+       }
+
+       goto unexpected_group;
+    }
+
+    if (ftg -> ftg_flags & FTG_CLOSE) {
+       switch (fsb -> fsb_class) {
+           case FCLASS_TRANSFER: 
+           case FCLASS_TM: 
+           case FCLASS_ACCESS: 
+               break;
+
+           default: 
+               goto unexpected_group;
+       }
+
+       fti -> fti_type = FTI_BULKEND;
+
+       if (fsb -> fsb_flags & FSB_INIT) {
+           if (fsb -> fsb_state != FSB_BULKEND)
+               goto unexpected_group;
+           if (ftg -> ftg_flags & ~fsb -> fsb_group) {
+               (void) fpktlose (fsb, fti, FS_PRO_ERRPROC, NULLCP,
+                       "bulk transfer reply mismatch; expecting 0x%x found 0x%x",
+                       fsb -> fsb_group, ftg -> ftg_flags);
+               goto out;
+           }
+           fsb -> fsb_state = FSB_INITIALIZED;
+       }
+       else {
+           if (fsb -> fsb_state != FSB_DATAIDLE)
+               goto unexpected_group;
+           fsb -> fsb_state = FSB_BULKEND;
+           fsb -> fsb_group = ftg -> ftg_flags;
+       }
+
+       goto done;
+    }
+
+unexpected_group: ;
+    (void) fpktlose (fsb, fti, FS_PRO_ERR, NULLCP,
+               "unexpected group type 0x%x; state=0x%x", ftg -> ftg_flags,
+               fsb -> fsb_state);
+    goto out;
+
+done: ;
+    PXFREE (px);
+    return DONE;
+
+out: ;
+    if (pdu)
+       free_FTAM_PDU (pdu);
+    switch (fti -> fti_type) {
+       case FTI_ACCESS:
+           FTACFREE (&fti -> fti_access);
+           break;
+
+       case FTI_READWRITE:
+           FTRWFREE (&fti -> fti_readwrite);
+           break;
+
+       case FTI_TRANSEND:
+           FTREFREE (&fti -> fti_transend);
+           break;
+
+       case FTI_CANCEL:
+           FTCNFREE (&fti -> fti_cancel);
+           break;
+
+       case FTI_FINISH:
+       case FTI_MANAGEMENT:
+       case FTI_BULKBEGIN:
+       case FTI_BULKEND:
+           FTGFREE (ftg);
+           break;
+
+       default:
+           break;
+    }
+    PXFREE (px);
+
+    freefsblk (fsb);
+    return NOTOK;
+}
+
+/* \f */
+
+static int  doPStokens (fsb, pt, fti)
+register struct ftamblk   *fsb;
+register struct PSAPtoken *pt;
+struct FTAMindication *fti;
+{
+    (void) fpktlose (fsb, fti, FS_PRO_ERR, NULLCP,
+           "unexpected token indication (0x%x)", pt -> pt_type);
+    PTFREE (pt);
+
+    freefsblk (fsb);
+    return NOTOK;
+}
+
+/* \f */
+
+static int  doPSsync (fsb, pn, fti)
+register struct ftamblk   *fsb;
+register struct PSAPsync *pn;
+struct FTAMindication *fti;
+{
+    register int i;
+    struct PSAPdata pxs;
+    register struct PSAPdata *px = &pxs;
+
+    switch (pn -> pn_type) {
+       case SN_RESETCNF:
+               break;
+       case SN_RESETIND:
+           if (pn -> pn_options == SYNC_ABANDON)
+               break;          /* else fall */
+
+       default:
+           (void) fpktlose (fsb, fti, FS_PRO_ERR, NULLCP,
+                       "unexpected sync indication (0x%x)", pn -> pn_type);
+           PNFREE (pn);
+
+           freefsblk (fsb);
+           return NOTOK;
+    }
+
+    fsb -> fsb_settings = pn -> pn_settings;
+#define dotoken(requires,shift,bit,type) \
+{ \
+    if (fsb -> fsb_srequirements & requires) \
+       switch (fsb -> fsb_settings & (ST_MASK << shift)) { \
+           default: \
+               fsb -> fsb_settings &= ~(ST_MASK << shift); \
+               fsb -> fsb_settings |= ST_INIT_VALUE << shift; \
+ \
+           case ST_INIT_VALUE << shift: \
+               fsb -> fsb_owned |= bit; \
+               fsb -> fsb_avail |= bit; \
+               break; \
+ \
+           case ST_RESP_VALUE << shift: \
+               fsb -> fsb_avail |= bit; \
+               break; \
+       } \
+}
+    dotokens ();
+#undef dotoken
+
+    if (pn -> pn_type == SN_RESETCNF && pn -> pn_ninfo == 0) {
+       register struct FTAMcancel *ftcn = &fti -> fti_cancel;
+
+       bzero ((char *) ftcn, sizeof *ftcn);
+       ftcn -> ftcn_action = FACTION_SUCCESS;/* what else can be done? */
+
+       fsb -> fsb_flags &= ~FSB_CANCEL;
+       fsb -> fsb_state = FSB_DATAIDLE;
+
+       PNFREE (pn);
+       return DONE;
+    }
+
+    bzero ((char *) px, sizeof *px);
+    for (i = pn -> pn_ninfo - 1; i >= 0; i--) {
+       px -> px_info[i] = pn -> pn_info[i];
+       pn -> pn_info[i] = NULLPE;
+    }
+    px -> px_ninfo = pn -> pn_ninfo;
+    PNFREE (pn);
+
+    return doPSdata (fsb, px, fti);
+}
+
+/* \f */
+
+static int  doPSactivity (fsb, pv, fti)
+register struct ftamblk   *fsb;
+register struct PSAPactivity *pv;
+struct FTAMindication *fti;
+{
+    (void) fpktlose (fsb, fti, FS_PRO_ERR, NULLCP,
+           "unexpected activity indication (0x%x)", pv -> pv_type);
+    PVFREE (pv);
+
+    freefsblk (fsb);
+    return NOTOK;
+}
+
+/* \f */
+
+static int  doPSreport (fsb, pp, fti)
+register struct ftamblk   *fsb;
+register struct PSAPreport *pp;
+struct FTAMindication *fti;
+{
+    (void) fpktlose (fsb, fti, FS_PRO_ERR, NULLCP,
+           "unexpected exception report indication (0x%x)", pp -> pp_peer);
+    PPFREE (pp);
+
+    freefsblk (fsb);
+    return NOTOK;
+}
+
+/* \f */
+
+static int  doPSfinish (fsb, pf, fti)
+register struct ftamblk   *fsb;
+register struct PSAPfinish *pf;
+struct FTAMindication *fti;
+{
+    PE     pe;
+    struct AcSAPindication  acis;
+    register struct AcSAPabort *aca = &acis.aci_abort;
+    register struct AcSAPfinish *acf = &acis.aci_finish;
+    struct type_FTAM_PDU *pdu;
+    register struct type_FTAM_F__TERMINATE__request *req;
+
+    pdu = NULL;
+    if ((fsb -> fsb_flags & FSB_INIT) || fsb -> fsb_state != FSB_INITIALIZED) {
+       (void) fpktlose (fsb, fti, FS_ACS_MGMT, NULLCP,
+               "association management botched");
+       PFFREE (pf);
+       goto out1;
+    }
+
+    if (AcFINISHser (fsb -> fsb_fd, pf, &acis) == NOTOK) {
+       (void) acs2ftamlose (fsb, fti, "AcFINISHser", aca);
+       goto out1;
+    }
+
+    if (acf -> acf_ninfo < 1 || (pe = acf -> acf_info[0]) == NULLPE) {
+       (void) fpktlose (fsb, fti, FS_PRO_ERR, NULLCP, NULLCP);
+       goto out2;
+    }
+
+    if (decode_FTAM_PDU (pe, 1, NULLIP, NULLVP, &pdu) == NOTOK) {
+       (void) fpktlose (fsb, fti, FS_PRO_ERRMSG, NULLCP,
+                        "unable to parse PDU: %s", PY_pepy);
+       goto out2;
+    }
+    if (pdu -> offset != type_FTAM_PDU_f__terminate__request) {
+       (void) fpktlose (fsb, fti, FS_PRO_ERRPROC, NULLCP,
+                        "expecting F-TERMINATE-request, got %d",
+                        pdu -> offset);
+       goto out2;
+    }
+    req = pdu -> un.f__terminate__request;
+
+    fsbtrace (fsb, (fsb -> fsb_fd, "A-RELEASE.INDICATION",
+               "F-TERMINATE-request", pe, 1));
+
+    ACFFREE (acf);
+
+    fti -> fti_type = FTI_FINISH;
+    {
+       register struct FTAMfinish *ftf = &fti -> fti_finish;
+
+       bzero ((char *) ftf, sizeof *ftf);
+       if (req && fpm2shared (fsb, req, &ftf -> ftf_sharedASE, fti) == NOTOK)
+           goto out2;
+    }
+    fsb -> fsb_flags |= FSB_FINN;
+
+    free_FTAM_PDU (pdu);
+    return DONE;
+
+out2:  ;
+    ACFFREE (acf);
+out1:  ;
+    if (pdu)
+       free_FTAM_PDU (pdu);
+    freefsblk (fsb);
+    return NOTOK;
+}
+
+/* \f */
+
+static int  doPSabort (fsb, pa, fti)
+register struct ftamblk *fsb;
+register struct PSAPabort *pa;
+struct FTAMindication *fti;
+{
+    struct AcSAPindication  acis;
+    register struct AcSAPabort *aca = &acis.aci_abort;
+
+    if (!pa -> pa_peer && pa -> pa_reason == PC_TIMER)
+       return ftamlose (fti, FS_PRO_TIMEOUT, 0, NULLCP, NULLCP);
+
+    if (AcABORTser (fsb -> fsb_fd, pa, &acis) == NOTOK) {
+       (void) acs2ftamlose (fsb, fti, "AcABORTser", aca);
+       fsb -> fsb_fd = NOTOK;
+       freefsblk (fsb);
+
+       return NOTOK;
+    }
+
+    return acs2ftamabort (fsb, aca, fti);
+}
+
+/* \f */
+
+static int  psDATAser (sd, px)
+int    sd;
+register struct PSAPdata *px;
+{
+    IFP            handler;
+    register struct ftamblk   *fsb;
+    struct FTAMindication  ftis;
+    register struct FTAMindication *fti = &ftis;
+
+    if ((fsb = findfsblk (sd)) == NULL)
+       return;
+    handler = fsb -> fsb_indication;
+
+    if (doPSdata (fsb, px, fti) != OK)
+       (*handler) (sd, fti);
+}
+
+/* \f */
+
+static int  psTOKENser (sd, pt)
+int    sd;
+register struct PSAPtoken *pt;
+{
+    IFP            handler;
+    register struct ftamblk   *fsb;
+    struct FTAMindication  ftis;
+    register struct FTAMindication *fti = &ftis;
+
+    if ((fsb = findfsblk (sd)) == NULL)
+       return;
+    handler = fsb -> fsb_indication;
+
+    if (doPStokens (fsb, pt, fti) != OK)
+       (*handler) (sd, fti);
+}
+
+/* \f */
+
+static int  psSYNCser (sd, pn)
+int    sd;
+register struct PSAPsync *pn;
+{
+    IFP            handler;
+    register struct ftamblk   *fsb;
+    struct FTAMindication  ftis;
+    register struct FTAMindication *fti = &ftis;
+
+    if ((fsb = findfsblk (sd)) == NULL)
+       return;
+    handler = fsb -> fsb_indication;
+
+    if (doPSsync (fsb, pn, fti) != OK)
+       (*handler) (sd, fti);
+}
+
+/* \f */
+
+static int  psACTIVITYser (sd, pv)
+int    sd;
+register struct PSAPactivity *pv;
+{
+    IFP            handler;
+    register struct ftamblk   *fsb;
+    struct FTAMindication  ftis;
+    register struct FTAMindication *fti = &ftis;
+
+    if ((fsb = findfsblk (sd)) == NULL)
+       return;
+    handler = fsb -> fsb_indication;
+
+    if (doPSactivity (fsb, pv, fti) != OK)
+       (*handler) (sd, fti);
+}
+
+/* \f */
+
+static int  psREPORTser (sd, pp)
+int    sd;
+register struct PSAPreport *pp;
+{
+    IFP            handler;
+    register struct ftamblk   *fsb;
+    struct FTAMindication  ftis;
+    register struct FTAMindication *fti = &ftis;
+
+    if ((fsb = findfsblk (sd)) == NULL)
+       return;
+    handler = fsb -> fsb_indication;
+
+    if (doPSreport (fsb, pp, fti) != OK)
+       (*handler) (sd, fti);
+}
+
+/* \f */
+
+static int  psFINISHser (sd, pf)
+int    sd;
+struct PSAPfinish *pf;
+{
+    IFP            handler;
+    register struct ftamblk   *fsb;
+    struct FTAMindication  ftis;
+    register struct FTAMindication *fti = &ftis;
+
+    if ((fsb = findfsblk (sd)) == NULL)
+       return;
+    handler = fsb -> fsb_indication;
+
+    if (doPSfinish (fsb, pf, fti) != OK)
+       (*handler) (sd, fti);
+}
+
+/* \f */
+
+static int  psABORTser (sd, pa)
+int    sd;
+register struct PSAPabort *pa;
+{
+    IFP            handler;
+    register struct ftamblk   *fsb;
+    struct FTAMindication  ftis;
+    register struct FTAMindication *fti = &ftis;
+
+    if ((fsb = findfsblk (sd)) == NULL)
+       return;
+    handler = fsb -> fsb_indication;
+
+    if (doPSabort (fsb, pa, fti) != OK)
+       (*handler) (sd, fti);
+}
+
+/* \f   define vector for INDICATION events */
+
+#define        e(i)    (indication ? (i) : NULLIFP)
+
+
+int    FSetIndications (sd, indication, fti)
+int    sd;
+IFP    indication;
+struct FTAMindication *fti;
+{
+    SBV     smask;
+    register struct ftamblk *fsb;
+    struct PSAPindication   pis;
+    register struct PSAPabort  *pa = &pis.pi_abort;
+
+    missingP (fti);
+
+    _iosignals_set = 1;
+    smask = sigioblock ();
+
+    ftamPsig (fsb, sd);
+
+    if (fsb -> fsb_indication = indication)
+       fsb -> fsb_flags |= FSB_ASYN;
+    else
+       fsb -> fsb_flags &= ~FSB_ASYN;
+
+    if (PSetIndications (fsb -> fsb_fd, e (psDATAser), e (psTOKENser),
+               e (psSYNCser), e (psACTIVITYser), e (psREPORTser),
+               e (psFINISHser), e (psABORTser), &pis) == NOTOK) {
+       fsb -> fsb_flags &= ~FSB_ASYN;
+       switch (pa -> pa_reason) {
+           case PC_WAITING: 
+               (void) sigiomask (smask);
+               return ftamlose (fti, FS_GEN_WAITING, 0, NULLCP, NULLCP);
+
+           default: 
+               (void) ps2ftamlose (fsb, fti, "PSetIndications", pa);
+               freefsblk (fsb);
+               (void) sigiomask (smask);
+               return NOTOK;
+       }
+    }
+    (void) sigiomask (smask);
+
+    return OK;
+}
+
+#undef e
+
+/* \f   AcSAP interface */
+
+int    acs2ftamlose (fsb, fti, event, aca)
+register struct ftamblk *fsb;
+struct FTAMindication *fti;
+char   *event;
+register struct AcSAPabort *aca;
+{
+    int     observer,
+            reason;
+    char   *cp,
+            buffer[BUFSIZ];
+
+    if (fsb && fsb -> fsb_trace && event) {
+       cp = buffer;
+       (void) sprintf (cp, "%s: %s", event, AcErrString (aca -> aca_reason));
+       if (aca -> aca_cc > 0) {
+           cp += strlen (cp);
+           (void) sprintf (cp, " [%*.*s]", aca -> aca_cc, aca -> aca_cc,
+                   aca -> aca_data);
+       }
+
+       fsbtrace (fsb, (fsb -> fsb_fd, buffer, NULLCP, NULLPE, -1));
+    }
+
+    cp = "";
+    switch (aca -> aca_reason) {
+       case ACS_ADDRESS: 
+           reason = FS_PRO_LOWADDR;
+           (void) sprintf (cp = buffer, " (%s)", AcErrString (ACS_ADDRESS));
+           break;
+
+       case ACS_REFUSED: 
+           reason = FS_PRO_LOWFAIL;
+           (void) sprintf (cp = buffer, " (%s)", AcErrString (ACS_REFUSED));
+           break;
+
+       default: 
+           (void) sprintf (cp = buffer, " (%s at association control)",
+                   AcErrString (aca -> aca_reason));
+       case ACS_CONGEST: 
+       case ACS_PARAMETER: 
+       case ACS_OPERATION: 
+       case ACS_PRESENTATION: 
+           reason = FS_PRO_LOWFAIL;
+           break;
+    }
+
+    if (fsb) {
+       if (fsb -> fsb_flags & FSB_INIT)
+           observer = EREF_IFPM;
+       else
+           observer = EREF_RFPM;
+    }
+    else
+       observer = EREF_NONE;
+
+    if (aca -> aca_cc > 0)
+       return ftamoops (fti, reason, ACS_FATAL (aca -> aca_reason), observer,
+               EREF_NONE, NULLCP, "%*.*s%s", aca -> aca_cc, aca -> aca_cc,
+               aca -> aca_data, cp);
+    else
+       return ftamoops (fti, reason, ACS_FATAL (aca -> aca_reason), observer,
+               EREF_NONE, NULLCP, "%s", *cp ? cp + 1 : cp);
+}
+
+/* \f */
+
+int    acs2ftamabort (fsb, aca, fti)
+register struct ftamblk *fsb;
+register struct AcSAPabort *aca;
+struct FTAMindication *fti;
+{
+    int     peer;
+    PE     pe;
+    register struct FTAMabort  *fta = &fti -> fti_abort;
+    struct type_FTAM_PDU *pdu;
+    register struct type_FTAM_F__U__ABORT__request *req;
+
+    pdu = NULL;
+    if (aca -> aca_source != ACA_USER) {
+       (void) acs2ftamlose (fsb, fti, NULLCP, aca);
+       goto out;
+    }
+
+    if (aca -> aca_ninfo < 1 || (pe = aca -> aca_info[0]) == NULLPE) {
+       (void) ftamlose (fti, FS_PRO_ERR, 1, NULLCP, NULLCP);
+       goto out;
+    }
+
+    if (decode_FTAM_PDU (pe, 1, NULLIP, NULLVP, &pdu) == NOTOK) {
+       (void) ftamlose (fti, FS_PRO_ERRMSG, 1, NULLCP,
+                        "unable to parse PDU: %s", PY_pepy);
+       goto out;
+    }
+    switch (pdu -> offset) {
+       case type_FTAM_PDU_f__u__abort__request:
+           peer = 1;
+           req = pdu -> un.f__u__abort__request;
+           break;
+
+       case type_FTAM_PDU_f__p__abort__request:
+           peer = 0;   /* F-P-ABORT-request is identical... */
+           req = pdu -> un.f__u__abort__request;
+           break;
+
+       default:
+           (void) ftamlose (fti, FS_PRO_ERRPROC, 1, NULLCP,
+                            "expecting F-{U,P}-ABORT-request, got %d",
+                            pdu -> offset);
+           goto out;
+    }
+    fsbtrace (fsb, (fsb -> fsb_fd, "A-ABORT.INDICATION",
+                   pdu -> offset != type_FTAM_PDU_f__u__abort__request
+                       ? "F-P-ABORT-request" : "F-U-ABORT-request",
+                   pe, 1));
+
+    fti -> fti_type = FTI_ABORT;
+
+    fta -> fta_peer = peer;
+    fta -> fta_action = req -> action__result ? req -> action__result -> parm
+                                             :int_FTAM_Action__Result_success;
+    if (req -> diagnostic)
+       (void) fpm2diag (fsb, req -> diagnostic, fta -> fta_diags,
+                        &fta -> fta_ndiag, fti);
+
+out: ;
+    ACAFREE (aca);
+    if (pdu)
+       free_FTAM_PDU (pdu);
+
+    fsb -> fsb_fd = NOTOK;
+    freefsblk (fsb);
+
+    return NOTOK;
+}
+
+/* \f   PSAP interface */
+
+int    ps2ftamlose (fsb, fti, event, pa)
+register struct ftamblk *fsb;
+struct FTAMindication *fti;
+char   *event;
+register struct PSAPabort *pa;
+{
+    int     observer,
+            reason;
+    char   *cp,
+            buffer[BUFSIZ];
+
+    if (fsb && fsb -> fsb_trace && event) {
+       cp = buffer;
+       (void) sprintf (cp, "%s: %s", event, PErrString (pa -> pa_reason));
+       if (pa -> pa_cc > 0) {
+           cp += strlen (cp);
+           (void) sprintf (cp, " [%*.*s]", pa -> pa_cc, pa -> pa_cc,
+                   pa -> pa_data);
+       }
+
+       fsbtrace (fsb, (fsb -> fsb_fd, buffer, NULLCP, NULLPE, -1));
+    }
+
+    cp = "";
+    switch (pa -> pa_reason) {
+       case PC_PARAMETER: 
+       case PC_OPERATION: 
+       default:
+           (void) sprintf (cp = buffer, " (%s at presentation)",
+                   PErrString (pa -> pa_reason));
+       case PC_CONGEST: 
+       case PC_SESSION: 
+           reason = FS_PRO_LOWFAIL;
+           break;
+    }
+
+    if (fsb) {
+       if (fsb -> fsb_flags & FSB_INIT)
+           observer = EREF_IFPM;
+       else
+           observer = EREF_RFPM;
+    }
+    else
+       observer = EREF_NONE;
+
+    if (pa -> pa_cc > 0)
+       return ftamoops (fti, reason, PC_FATAL (pa -> pa_reason), observer,
+               EREF_NONE, NULLCP, "%*.*s%s", pa -> pa_cc, pa -> pa_cc,
+               pa -> pa_data, cp);
+    else
+       return ftamoops (fti, reason, PC_FATAL (pa -> pa_reason), observer,
+               EREF_NONE, NULLCP, "%s", *cp ? cp + 1 : cp);
+}
+
+/* \f   INTERNAL */
+
+struct ftamblk *newfsblk () {
+    register struct ftamblk *fsb;
+
+    fsb = (struct ftamblk  *) calloc (1, sizeof *fsb);
+    if (fsb == NULL)
+       return NULL;
+
+    fsb -> fsb_fd = NOTOK;
+
+    if (once_only == 0) {
+       FSHead -> fsb_forw = FSHead -> fsb_back = FSHead;
+       once_only++;
+    }
+
+    insque (fsb, FSHead -> fsb_back);
+
+    return fsb;
+}
+
+/* \f */
+
+freefsblk (fsb)
+register struct ftamblk *fsb;
+{
+    register int    i;
+    register struct PSAPcontext *pp;
+    register struct FTAMcontent *fcont;
+
+    if (fsb == NULL)
+       return;
+
+    if (fsb -> fsb_fd != NOTOK) {
+       struct AcSAPindication  acis;
+
+       fsbtrace (fsb, (fsb -> fsb_fd, "A-ABORT.REQUEST(discard)",
+               NULLCP, NULLPE, 0));
+
+       (void) AcUAbortRequest (fsb -> fsb_fd, NULLPEP, 0, &acis);
+    }
+
+    if (fsb -> fsb_context)
+       oid_free (fsb -> fsb_context), fsb -> fsb_context = NULLOID;
+
+    for (pp = fsb -> fsb_contexts.pc_ctx, i = fsb -> fsb_contexts.pc_nctx - 1;
+           i >= 0; 
+           pp++, i--) {
+       if (pp -> pc_asn)
+           oid_free (pp -> pc_asn);
+    }
+    fsb -> fsb_contexts.pc_nctx = 0;
+
+    for (fcont = fsb -> fsb_contents.fc_contents,
+               i = fsb -> fsb_contents.fc_ncontent - 1;
+            i >= 0;
+            fcont++, i--) {
+       if (fcont -> fc_dtn)
+           oid_free (fcont -> fc_dtn);
+    }
+    fsb -> fsb_contents.fc_ncontent = 0;
+
+    PXFREE (&fsb -> fsb_data);
+
+    if (fsb -> fsb_cancelshared)
+       pe_free (fsb -> fsb_cancelshared);
+
+    remque (fsb);
+
+    free ((char *) fsb);
+}
+
+/* \f */
+
+struct ftamblk   *findfsblk (sd)
+register int sd;
+{
+    register struct ftamblk *fsb;
+
+    if (once_only == 0)
+       return NULL;
+
+    for (fsb = FSHead -> fsb_forw; fsb != FSHead; fsb = fsb -> fsb_forw)
+       if (fsb -> fsb_fd == sd)
+           return fsb;
+
+    return NULL;
+}
diff --git a/usr/src/contrib/isode/ftam/ftamrelease1.c b/usr/src/contrib/isode/ftam/ftamrelease1.c
new file mode 100644 (file)
index 0000000..e74eca8
--- /dev/null
@@ -0,0 +1,181 @@
+/* ftamrelease1.c - FPM: initiate release */
+
+#ifndef        lint
+static char *rcsid = "$Header: /f/osi/ftam/RCS/ftamrelease1.c,v 7.1 91/02/22 09:23:09 mrose Interim $";
+#endif
+
+/* 
+ * $Header: /f/osi/ftam/RCS/ftamrelease1.c,v 7.1 91/02/22 09:23:09 mrose Interim $
+ *
+ *
+ * $Log:       ftamrelease1.c,v $
+ * Revision 7.1  91/02/22  09:23:09  mrose
+ * Interim 6.8
+ * 
+ * Revision 7.0  89/11/23  21:53:49  mrose
+ * Release 6.0
+ * 
+ */
+
+/*
+ *                               NOTICE
+ *
+ *    Acquisition, use, and distribution of this module and related
+ *    materials are subject to the restrictions of a license agreement.
+ *    Consult the Preface in the User's Manual for the full terms of
+ *    this agreement.
+ *
+ */
+
+
+/* LINTLIBRARY */
+
+#include <stdio.h>
+#include <signal.h>
+#include "fpkt.h"
+
+/* \f   F-TERMINATE.REQUEST */
+
+int    FTerminateRequest (sd, sharedASE, ftr, fti)
+int    sd;
+PE     sharedASE;
+struct FTAMrelease *ftr;
+struct FTAMindication *fti;
+{
+    SBV            smask;
+    int     result;
+    register struct ftamblk *fsb;
+
+    missingP (ftr);
+    missingP (fti);
+
+    smask = sigioblock ();
+
+    ftamPsig (fsb, sd);
+
+    result = FTerminateRequestAux (fsb, sharedASE, ftr, fti);
+
+    (void) sigiomask (smask);
+
+    return result;
+}
+
+/* \f */
+
+static int  FTerminateRequestAux (fsb, sharedASE, ftr, fti)
+register struct ftamblk *fsb;
+PE     sharedASE;
+struct FTAMrelease *ftr;
+struct FTAMindication *fti;
+{
+    int     result;
+    PE     pe;
+    struct AcSAPrelease acrs;
+    register struct AcSAPrelease   *acr = &acrs;
+    struct AcSAPindication  acis;
+    register struct AcSAPindication *aci = &acis;
+    register struct AcSAPabort *aca = &aci -> aci_abort;
+    struct type_FTAM_PDU *pdu;
+    register struct type_FTAM_F__TERMINATE__response *rsp;
+
+    if (!(fsb -> fsb_flags & FSB_INIT))
+       return ftamlose (fti, FS_GEN (fsb), 0, NULLCP, "not initiator");
+    if (fsb -> fsb_state != FSB_INITIALIZED)
+       return ftamlose (fti, FS_GEN (fsb), 0, NULLCP,
+                   "not in the initialized state");
+
+    bzero ((char *) acr, sizeof *acr);
+    bzero ((char *) ftr, sizeof *ftr);
+
+    pe = NULLPE;
+    if ((pdu = (struct type_FTAM_PDU *) calloc (1, sizeof *pdu)) == NULL) {
+       (void) ftamlose (fti, FS_GEN (fsb), 1, NULLCP, "out of memory");
+out: ;
+       if (pe)
+           pe_free (pe);
+       if (pdu)
+           free_FTAM_PDU (pdu);
+       if (fti -> fti_abort.fta_action == FACTION_PERM)
+           freefsblk (fsb);
+       return NOTOK;
+    }
+    pdu -> offset = type_FTAM_PDU_f__terminate__request;
+    if (sharedASE
+           && (pdu -> un.f__terminate__request =
+                       shared2fpm (fsb, sharedASE, fti)) == NULL)
+       goto out;
+
+    if (encode_FTAM_PDU (&pe, 1, 0, NULLCP, pdu) == NOTOK) {
+       (void) ftamlose (fti, FS_GEN (fsb), 1, NULLCP,
+                        "error encoding PDU: %s", PY_pepy);
+       goto out;
+    }
+
+    pe -> pe_context = fsb -> fsb_id;
+
+    fsbtrace (fsb, (fsb -> fsb_fd, "A-RELEASE.REQUEST", "F-TERMINATE-request",
+                   pe, 0));
+
+    result = AcRelRequest (fsb -> fsb_fd, ACF_NORMAL, &pe, 1, NOTOK, acr, aci);
+
+    pe_free (pe);
+    pe = NULLPE;
+    free_FTAM_PDU (pdu);
+    pdu = NULL;
+
+    if (result == NOTOK) {
+       if (aca -> aca_source == ACA_USER)
+           return acs2ftamabort (fsb, aca, fti);
+
+       (void) acs2ftamlose (fsb, fti, "AcRelRequest", aca);
+       goto out;
+    }
+
+    if (!acr -> acr_affirmative) {
+       result = fpktlose (fsb, fti, FS_ACS_MGMT, NULLCP,
+               "other side refused to release association");
+       goto done;
+    }
+    fsb -> fsb_fd = NOTOK;
+
+    if (acr -> acr_ninfo < 1 || (pe = acr -> acr_info[0]) == NULLPE) {
+       result = fpktlose (fsb, fti, FS_PRO_ERR, NULLCP, NULLCP);
+       goto done;
+    }
+
+    if (decode_FTAM_PDU (pe, 1, NULLIP, NULLVP, &pdu) == NOTOK)
+       result = fpktlose (fsb, fti, FS_PRO_ERRMSG, NULLCP,
+                          "unable to parse PDU: %s", PY_pepy);
+    else {
+       if (pdu -> offset != type_FTAM_PDU_f__terminate__response) {
+           result = fpktlose (fsb, fti, FS_PRO_ERRPROC, NULLCP,
+                              "expecting F-TERMINATE-response, got %d",
+                              pdu -> offset);
+           goto done;
+       }
+       rsp = pdu -> un.f__terminate__response;
+
+       fsbtrace (fsb,
+               (fsb -> fsb_fd, "A-RELEASE.CONFIRMATION",
+               "F-TERMINATE-response", pe, 1));
+
+       if (rsp -> shared__ASE__information
+               && fpm2shared (fsb, rsp -> shared__ASE__information,
+                              &ftr -> ftr_sharedASE, fti) == NOTOK)
+           goto done;
+       if (rsp -> charging
+               && fpm2chrg (fsb, rsp -> charging, &ftr -> ftr_charges, fti)
+                       == NOTOK)
+           goto done;
+
+       result = OK;
+    }
+
+done: ;
+    if (pdu)
+       free_FTAM_PDU (pdu);
+    ACRFREE (acr);
+    freefsblk (fsb);
+
+    return result;
+}
diff --git a/usr/src/contrib/isode/ftam/ftamrelease2.c b/usr/src/contrib/isode/ftam/ftamrelease2.c
new file mode 100644 (file)
index 0000000..efcc385
--- /dev/null
@@ -0,0 +1,136 @@
+/* ftamrelease2.c - FPM: respond to release */
+
+#ifndef        lint
+static char *rcsid = "$Header: /f/osi/ftam/RCS/ftamrelease2.c,v 7.1 91/02/22 09:23:11 mrose Interim $";
+#endif
+
+/* 
+ * $Header: /f/osi/ftam/RCS/ftamrelease2.c,v 7.1 91/02/22 09:23:11 mrose Interim $
+ *
+ *
+ * $Log:       ftamrelease2.c,v $
+ * Revision 7.1  91/02/22  09:23:11  mrose
+ * Interim 6.8
+ * 
+ * Revision 7.0  89/11/23  21:53:50  mrose
+ * Release 6.0
+ * 
+ */
+
+/*
+ *                               NOTICE
+ *
+ *    Acquisition, use, and distribution of this module and related
+ *    materials are subject to the restrictions of a license agreement.
+ *    Consult the Preface in the User's Manual for the full terms of
+ *    this agreement.
+ *
+ */
+
+
+/* LINTLIBRARY */
+
+#include <stdio.h>
+#include <signal.h>
+#include "fpkt.h"
+
+/* \f   F-TERMINATE.RESPONSE */
+
+int    FTerminateResponse (sd, sharedASE, charging, fti)
+int    sd;
+PE     sharedASE;
+struct FTAMcharging *charging;
+struct FTAMindication *fti;
+{
+    SBV            smask;
+    int     result;
+    register struct ftamblk *fsb;
+
+    if (charging && charging -> fc_ncharge > NFCHRG)
+       return ftamlose (fti, FS_GEN_NOREASON, 0, NULLCP,
+                       "too many charges");
+    missingP (fti);
+
+    smask = sigioblock ();
+
+    ftamFsig (fsb, sd);
+
+    result = FTerminateResponseAux (fsb, sharedASE, charging, fti);
+
+    (void) sigiomask (smask);
+
+    return result;
+}
+
+/* \f */
+
+static int  FTerminateResponseAux (fsb, sharedASE, charging, fti)
+register struct ftamblk *fsb;
+PE     sharedASE;
+struct FTAMcharging *charging;
+struct FTAMindication *fti;
+{
+    int     result;
+    PE     pe;
+    struct AcSAPindication  acis;
+    register struct AcSAPindication *aci = &acis;
+    register struct AcSAPabort *aca = &aci -> aci_abort;
+    register struct type_FTAM_PDU *pdu;
+    register struct type_FTAM_F__TERMINATE__response *rsp;
+
+    pe = NULLPE;
+    if ((pdu = (struct type_FTAM_PDU *) calloc (1, sizeof *pdu)) == NULL) {
+no_mem: ;
+       (void) ftamlose (fti, FS_GEN (fsb), 1, NULLCP, "out of memory");
+out: ;
+       if (pe)
+           pe_free (pe);
+       if (pdu)
+           free_FTAM_PDU (pdu);
+       if (fti -> fti_abort.fta_action == FACTION_PERM)
+           freefsblk (fsb);
+       return NOTOK;
+    }
+    pdu -> offset = type_FTAM_PDU_f__terminate__response;
+    if ((rsp = (struct type_FTAM_F__TERMINATE__response *)
+                       calloc (1, sizeof *rsp)) == NULL)
+       goto no_mem;
+    pdu -> un.f__terminate__response = rsp;
+    if (sharedASE
+           && (rsp -> shared__ASE__information =
+                       shared2fpm (fsb, sharedASE, fti)) == NULL)
+       goto out;
+    if (charging
+           && charging -> fc_ncharge > 0
+           && (rsp -> charging = chrg2fpm (fsb, charging, fti)) == NULL)
+       goto out;
+
+    if (encode_FTAM_PDU (&pe, 1, 0, NULLCP, pdu) == NOTOK) {
+       (void) ftamlose (fti, FS_GEN (fsb), 1, NULLCP,
+                        "error encoding PDU: %s", PY_pepy);
+       goto out;
+    }
+
+    pe -> pe_context = fsb -> fsb_id;
+
+    fsbtrace (fsb, (fsb -> fsb_fd, "A-RELEASE.RESPONSE",
+                   "F-TERMINATE-response", pe, 0));
+
+    result = AcRelResponse (fsb -> fsb_fd, ACS_ACCEPT, ACR_NORMAL, &pe, 1,
+                           aci);
+
+    pe_free (pe);
+    pe = NULLPE;
+    free_FTAM_PDU (pdu);
+    pdu = NULL;
+
+    if (result == NOTOK) {
+       (void) acs2ftamlose (fsb, fti, "AcRelResponse", aca);
+       goto out;
+    }
+
+    fsb -> fsb_fd = NOTOK;
+    freefsblk (fsb);
+
+    return OK;
+}
diff --git a/usr/src/contrib/isode/ftam/ftamrespond.c b/usr/src/contrib/isode/ftam/ftamrespond.c
new file mode 100644 (file)
index 0000000..48c957a
--- /dev/null
@@ -0,0 +1,744 @@
+/* ftamrespond.c - FPM: responder */
+
+#ifndef        lint
+static char *rcsid = "$Header: /f/osi/ftam/RCS/ftamrespond.c,v 7.5 91/02/22 09:23:12 mrose Interim $";
+#endif
+
+/* 
+ * $Header: /f/osi/ftam/RCS/ftamrespond.c,v 7.5 91/02/22 09:23:12 mrose Interim $
+ *
+ *
+ * $Log:       ftamrespond.c,v $
+ * Revision 7.5  91/02/22  09:23:12  mrose
+ * Interim 6.8
+ * 
+ * Revision 7.4  91/01/07  12:40:20  mrose
+ * update
+ * 
+ * Revision 7.3  90/11/11  10:01:10  mrose
+ * touch-up
+ * 
+ * Revision 7.2  90/11/05  13:32:59  mrose
+ * update
+ * 
+ * Revision 7.1  90/11/04  19:15:10  mrose
+ * update
+ * 
+ * Revision 7.0  89/11/23  21:53:51  mrose
+ * Release 6.0
+ * 
+ */
+
+/*
+ *                               NOTICE
+ *
+ *    Acquisition, use, and distribution of this module and related
+ *    materials are subject to the restrictions of a license agreement.
+ *    Consult the Preface in the User's Manual for the full terms of
+ *    this agreement.
+ *
+ */
+
+
+/* LINTLIBRARY */
+
+#include <stdio.h>
+#include "fpkt.h"
+
+/* \f   F-INITIALIZE.INDICATION */
+
+int    FInit (vecp, vec, fts, tracing, fti)
+int    vecp;
+char  **vec;
+struct FTAMstart *fts;
+IFP    tracing;
+struct FTAMindication *fti;
+{
+    register int    i;
+    PE     pe = NULLPE;
+    struct AcSAPstart acss;
+    register struct AcSAPstart *acs = &acss;
+    register struct PSAPstart *ps = &acs -> acs_start;
+    struct AcSAPindication acis;
+    register struct AcSAPindication *aci = &acis;
+    register struct AcSAPabort *aca = &aci -> aci_abort;
+    register struct ftamblk *fsb;
+    struct type_FTAM_PDU *pdu;
+    register struct type_FTAM_F__INITIALIZE__request *req;
+    register struct type_FTAM_F__INITIALIZE__response *rsp;
+    
+    missingP (vec);
+    missingP (fts);
+    missingP (fti);
+
+    if ((fsb = newfsblk ()) == NULL)
+       return ftamlose (fti, FS_GEN_NOREASON, 0, NULLCP, "out of memory");
+    fsb -> fsb_trace = tracing;
+
+    bzero ((char *) fts, sizeof *fts);
+
+    pdu = NULL;
+    
+    if (AcInit (vecp, vec, acs, aci) == NOTOK) {
+       (void) acs2ftamlose (fsb, fti, "AcInit", aca);
+       goto out1;
+    }
+
+    fsb -> fsb_fd = acs -> acs_sd;
+
+    fsb -> fsb_srequirements = ps -> ps_srequirements;
+    fsb -> fsb_srequirements &= ~SR_RESYNC;    /* XXX */
+    if (!(fsb -> fsb_srequirements & (SR_MINORSYNC | SR_RESYNC)))
+       ps -> ps_isn = SERIAL_NONE;
+
+    fsb -> fsb_settings = ps -> ps_settings;
+#define dotoken(requires,shift,bit,type) \
+{ \
+    if (fsb -> fsb_srequirements & requires) \
+       switch (fsb -> fsb_settings & (ST_MASK << shift)) { \
+           case ST_INIT_VALUE << shift: \
+               fsb -> fsb_avail |= bit; \
+               break; \
+ \
+           case ST_RESP_VALUE << shift: \
+               fsb -> fsb_owned |= bit; \
+               fsb -> fsb_avail |= bit; \
+               break; \
+ \
+           default: \
+               (void) ftamoops (fti, FS_PRO_ERRPROC, 1, EREF_RFPM, \
+                           EREF_IFPM, NULLCP, \
+                           "%s token management botched", type); \
+               goto out2; \
+       } \
+}
+       dotokens ();
+#undef dotoken
+    if (fsb -> fsb_owned != 0) {
+       (void) ftamoops (fti, FS_PRO_ERRPROC, 1, EREF_RFPM, EREF_IFPM, NULLCP,
+               "token management botched");
+       goto out2;
+    }
+    fsb -> fsb_ssn = ps -> ps_isn;
+    fsb -> fsb_ssdusize = ps -> ps_ssdusize;
+    fsb -> fsb_connect = ps -> ps_connect;     /* struct copy */
+    fsb -> fsb_prequirements = ps -> ps_prequirements;
+
+    if (acs -> acs_ninfo < 1 || (pe = acs -> acs_info[0]) == NULLPE) {
+       (void) ftamoops (fti, FS_PRO_ERR, 1, EREF_RFPM, EREF_IFPM, NULLCP,
+               NULLCP);
+       goto out2;
+    }
+
+    if (decode_FTAM_PDU (pe, 1, NULLIP, NULLVP, &pdu) == NOTOK) {
+       (void) ftamoops (fti, FS_PRO_ERRMSG, 1, EREF_RFPM, EREF_RFPM,
+                        NULLCP, "unable to parse PDU: %s", PY_pepy);
+       goto out3;
+    }
+    if (pdu -> offset != type_FTAM_PDU_f__initialize__request) {
+       (void) ftamoops (fti, FS_PRO_ERRPROC, 1, EREF_RFPM, EREF_RFPM,
+                        NULLCP, "expecting F-INITIALIZE-request, got %d",
+                        pdu -> offset);
+       goto out3;
+    }
+    req = pdu -> un.f__initialize__request;
+
+    fsbtrace (fsb, (fsb -> fsb_fd, "A-ASSOCIATE.INDICATION",
+               "F-INITIALIZE-request", pe, 1));
+
+    fsb -> fsb_id = pe -> pe_context;
+
+    if (req -> presentation__context__management) {
+       if (!(fsb -> fsb_prequirements & PR_MANAGEMENT)) {
+           req -> presentation__context__management = 0;
+           fsb -> fsb_prequirements &= ~PR_RESTORATION;
+       }
+    }
+    else
+       fsb -> fsb_prequirements &= ~(PR_MANAGEMENT | PR_RESTORATION);
+    if (req -> service__class) {
+       if (fpm2bits (fsb, fclass_pairs, req -> service__class,
+                     &fsb -> fsb_class, fti) == NOTOK)
+           goto out3;
+    }
+    else
+       fsb -> fsb_class = FCLASS_TRANSFER;
+
+    if (fpm2bits (fsb, funit_pairs, req -> functional__units,
+                 &fsb -> fsb_units, fti) == NOTOK)
+       goto out3;
+                                       /* conservative... */
+    if (fsb -> fsb_class & FCLASS_TRANSFER)
+       fsb -> fsb_units |= FUNITS_TRANSFER;
+    if (fsb -> fsb_class & FCLASS_TM)
+       fsb -> fsb_units |= FUNITS_TM;
+    if (fsb -> fsb_class & FCLASS_ACCESS)
+       fsb -> fsb_units |= FUNITS_ACCESS;
+    if (fsb -> fsb_class & FCLASS_MANAGE)
+       fsb -> fsb_units |= FUNITS_MANAGE;
+    if (!(fsb -> fsb_class &=
+           (FCLASS_TRANSFER | FCLASS_TM | FCLASS_MANAGE | FCLASS_ACCESS))) {
+       (void) ftamoops (fti, FS_ACS_CLASS, 1, EREF_RFPM, EREF_IFPM,
+                        NULLCP, NULLCP);
+       goto out3;
+    }
+    if (!(fsb -> fsb_units & FUNIT_LIMITED)
+           && (fsb -> fsb_units & FUNIT_ENHANCED)) {
+       (void) ftamoops (fti, FS_PRO_ERRFUNIT, 1, EREF_RFPM, EREF_IFPM,
+                NULLCP,
+                "enhanced-file-management requires limited-file-management");
+       goto out3;
+    }
+    if (!(fsb -> fsb_units & FUNIT_GROUPING)) {        /* XXX: should be OPTIONAL */
+       (void) ftamoops (fti, FS_PRO_ERRFUNIT, 1, EREF_RFPM, EREF_IFPM,
+                        NULLCP,
+                        "insufficient functional units for service class");
+       goto out3;
+    }
+    if (req -> attribute__groups
+           && fpm2bits (fsb, fattr_pairs, req -> attribute__groups,
+                        &fsb -> fsb_attrs, fti) == NOTOK)
+       goto out3;
+#ifdef notdef
+    if ((fsb -> fsb_attrs & FATTR_SECURITY)
+           && !(fsb -> fsb_attrs & FATTR_STORAGE)) {
+       (void) ftamoops (fti, FS_ACS_GRP, 1, EREF_RFPM, EREF_IFPM,
+                       NULLCP, NULLCP);
+       goto out3;
+    }
+#endif
+
+    fts -> fts_sd = fsb -> fsb_fd;
+    fts -> fts_callingtitle = acs -> acs_callingtitle; /* struct copy */
+    bzero ((char *) &acs -> acs_callingtitle, sizeof acs -> acs_callingtitle);
+    fts -> fts_calledtitle = acs -> acs_calledtitle;   /* struct copy */
+    bzero ((char *) &acs -> acs_calledtitle, sizeof acs -> acs_calledtitle);
+    if ((fsb -> fsb_context = oid_cpy (acs -> acs_context)) == NULLOID) {
+no_mem: ;
+       (void) ftamoops (fti, FS_GEN_NOREASON, 1, EREF_RFPM, EREF_RFPM,
+                        NULLCP, "out of memory");
+       goto out3;
+    }
+    fts -> fts_context = acs -> acs_context;
+    acs -> acs_context = NULLOID;
+    fts -> fts_callingaddr = ps -> ps_calling; /* struct copy */
+    fts -> fts_calledaddr = ps -> ps_called;   /* struct copy */
+    fts -> fts_manage = (fsb -> fsb_prequirements & PR_MANAGEMENT) ? 1 : 0;
+    fts -> fts_class = fsb -> fsb_class;
+    fts -> fts_units = fsb -> fsb_units;
+    fts -> fts_attrs = fsb -> fsb_attrs;
+    if (req -> shared__ASE__information
+           && fpm2shared (fsb, req -> shared__ASE__information,
+                          &fts -> fts_sharedASE, fti) == NOTOK)
+       goto out3;
+    fts -> fts_fqos = fsb -> fsb_fqos = MY_FQOS;
+
+    if (ps -> ps_ctxlist.pc_nctx > 1) {
+#define        PC_XXX  (-2)            /* unique code */
+
+       int     acsid;
+       register struct type_FTAM_Contents__Type__List *dtn;
+       register struct FTAMcontent *fx,
+                                   *fx2;
+       register struct PSAPcontext *px;
+       register struct isodocument *id;
+
+       fsb -> fsb_contexts = ps -> ps_ctxlist;/* struct copy */
+       bzero ((char *) &ps -> ps_ctxlist, sizeof ps -> ps_ctxlist);
+
+       fx = fts -> fts_contents.fc_contents;
+
+       (void) AcFindPCI (fsb -> fsb_fd, &acsid, aci);
+
+       fx2 = fsb -> fsb_contents.fc_contents;
+       fsb -> fsb_contents.fc_ncontent = 0;
+
+       for (px = fsb -> fsb_contexts.pc_ctx,
+                    i = fsb -> fsb_contexts.pc_nctx - 1;
+                i >= 0;
+                px++, i--)
+           if (px -> pc_id != fsb -> fsb_id
+                   && px -> pc_id != acsid
+                   && px -> pc_result == PC_ACCEPT)
+               px -> pc_result = PC_XXX;
+
+       for (dtn = req -> contents__type__list; dtn; dtn = dtn -> next) {
+           if ((id = getisodocumentbytype (dtn -> Document__Type__Name))
+                   == NULL)
+               continue;
+           for (px = fsb -> fsb_contexts.pc_ctx,
+                       i = fsb -> fsb_contexts.pc_nctx - 1;
+                    i >= 0;
+                    px++, i--) {
+               if (px -> pc_id == fsb -> fsb_id
+                       || px -> pc_id == acsid
+                       || oid_cmp (id -> id_abstract, px -> pc_asn))
+                   continue;
+               break;
+           }
+
+           if (i < 0)
+               continue;
+
+           if ((fx2 -> fc_dtn = oid_cpy (dtn -> Document__Type__Name))
+                       == NULLOID
+                   || (fx -> fc_dtn = oid_cpy (dtn -> Document__Type__Name))
+                           == NULLOID)
+               goto no_mem;
+           fx2 -> fc_id = fx -> fc_id = px -> pc_id;
+           if (px -> pc_result == PC_XXX)
+               px -> pc_result = PC_ACCEPT;
+           fx2 -> fc_result = fx -> fc_result = px -> pc_result;
+
+           fx++, fts -> fts_contents.fc_ncontent++;
+           fx2++, fsb -> fsb_contents.fc_ncontent++;
+       }
+
+       for (px = fsb -> fsb_contexts.pc_ctx,
+                   i = fsb -> fsb_contexts.pc_nctx - 1;
+                i >= 0;
+                px++, i--)
+           if (px -> pc_result == PC_XXX)
+               px -> pc_result = PC_REJECTED;
+
+#undef PC_XXX
+    }
+    else
+       if (req -> contents__type__list) {
+           (void) ftamoops (fti, FS_PRO_ERRPROC, 1, EREF_RFPM, EREF_IFPM,
+                       NULLCP, "content types management botched");
+           goto out3;
+       }
+    
+    if (req -> initiator__identity
+           && (fts -> fts_initiator = qb2str (req -> initiator__identity))
+                   == NULL)
+       goto no_mem;
+    if (req -> account
+           && (fts -> fts_account = qb2str (req -> account)) == NULL)
+       goto no_mem;
+    if (req -> filestore__password) {  /* both choices are qbufs... */
+       register struct qbuf *qb = req -> filestore__password -> un.graphic;
+
+       if ((fts -> fts_password = qb2str (qb)) == NULL)
+           goto no_mem;
+       fts -> fts_passlen = qb -> qb_len;
+    }
+    fts -> fts_ssdusize = fsb -> fsb_ssdusize;
+    fts -> fts_qos = ps -> ps_qos;     /* struct copy */
+
+    free_FTAM_PDU (pdu);
+    ACSFREE (acs);
+
+    return OK;
+
+out3: ;
+    if (pdu)
+       free_FTAM_PDU (pdu);
+
+out2: ;
+    ACSFREE (acs);
+
+out1: ;
+    pe = NULLPE;
+    if ((pdu = (struct type_FTAM_PDU *) calloc (1, sizeof *pdu))
+           == NULL)
+       goto carry_on;
+    pdu -> offset = type_FTAM_PDU_f__initialize__response;
+    if ((rsp = (struct type_FTAM_F__INITIALIZE__response *)
+                       calloc (1, sizeof *rsp)) == NULL)
+       goto carry_on;
+    pdu -> un.f__initialize__response = rsp;
+    if (rsp -> state__result = (struct type_FTAM_State__Result *)
+                                     calloc (1, sizeof *rsp -> state__result))
+       rsp -> state__result -> parm = FSTATE_FAILURE;
+    if (rsp -> action__result = (struct type_FTAM_Action__Result *)
+                                    calloc (1, sizeof *rsp -> action__result))
+       rsp -> action__result -> parm= FACTION_PERM;
+    rsp -> functional__units = bits2fpm (fsb, funit_pairs, 0, fti);
+    if (rsp -> ftam__quality__of__service =
+               (struct type_FTAM_FTAM__Quality__Of__Service *)
+                      calloc (1, sizeof *rsp -> ftam__quality__of__service))
+       rsp -> ftam__quality__of__service -> parm = MY_FQOS;
+    rsp -> diagnostic = diag2fpm (fsb, 1, fti -> fti_abort.fta_diags, 1, fti);
+    rsp -> checkpoint__window = 1;
+
+    if (encode_FTAM_PDU (&pe, 1, 0, NULLCP, pdu) != NOTOK)
+       pe -> pe_context = fsb -> fsb_id;
+
+carry_on: ;
+    fsbtrace (fsb, (fsb -> fsb_fd, "A-ASSOCIATE.RESPONSE(reject)",
+                   "F-INITIALIZE-response", pe, 0));
+
+    (void) AcAssocResponse (acs -> acs_sd, ACS_TRANSIENT, ACS_USER_NOREASON,
+               NULLOID, NULLAEI, NULLPA, NULLPC, ps -> ps_defctxresult, 0, 0,
+               SERIAL_NONE, 0, &ps -> ps_connect, pe ? &pe : NULLPEP,
+               pe ? 1 : 0, aci);
+    if (pe)
+       pe_free (pe);
+    if (pdu)
+       free_FTAM_PDU (pdu);
+
+    fsb -> fsb_fd = NOTOK;
+    freefsblk (fsb);
+
+    return NOTOK;
+}
+
+/* \f   F-INITIALIZE.RESPONSE */
+
+int    FInitializeResponse (sd, state, action, context, respondtitle,
+       respondaddr, manage, class, units, attrs, sharedASE, fqos, contents,
+       diag, ndiag, fti)
+int    sd;
+int    state,
+       action,
+       manage,
+       class,
+       units,
+       attrs,
+       fqos;
+OID    context;
+AEI    respondtitle;
+struct PSAPaddr *respondaddr;
+PE     sharedASE;
+struct FTAMcontentlist *contents;
+struct FTAMdiagnostic diag[];
+int    ndiag;
+struct FTAMindication *fti;
+{
+    register int    i;
+    int            result,
+           status;
+    PE     pe;
+    register struct FTAMcontentlist *pl;
+    register struct FTAMcontent *px;
+    struct AcSAPindication acis;
+    register struct AcSAPindication *aci = &acis;
+    register struct AcSAPabort *aca = &aci -> aci_abort;
+    register struct ftamblk *fsb;
+    register struct type_FTAM_PDU *pdu;
+    register struct type_FTAM_F__INITIALIZE__response *rsp;
+
+    if ((fsb = findfsblk (sd)) == NULL || (fsb -> fsb_flags & FSB_CONN))
+       return ftamlose (fti, FS_GEN_NOREASON, 0, NULLCP,
+               "invalid ftam descriptor");
+
+    switch (state) {
+       case FSTATE_SUCCESS: 
+           status = ACS_ACCEPT;
+           break;
+
+       case FSTATE_FAILURE: 
+           break;
+
+       default: 
+           return ftamlose (fti, FS_GEN (fsb), 0, NULLCP,
+                   "bad value for state parameter");
+    }
+    switch (action) {
+       case FACTION_SUCCESS: 
+           if (state == FSTATE_SUCCESS)
+               break;
+bad_pair: ;
+           return ftamlose (fti, FS_GEN (fsb), 0, NULLCP,
+                       "bad value for state/action parameters");
+
+       case FACTION_TRANS: 
+           if (state != FSTATE_FAILURE)
+               goto bad_pair;
+           status = ACS_TRANSIENT;
+           break;
+
+       case FACTION_PERM: 
+           if (state != FSTATE_FAILURE)
+               goto bad_pair;
+           status = ACS_PERMANENT;
+           break;
+
+       default: 
+           return ftamlose (fti, FS_GEN (fsb), 0, NULLCP,
+                   "bad value for action parameter");
+    }
+#ifdef notdef
+    missingP (context);
+    missingP (respondtitle);
+    missingP (respondaddr);
+#endif
+    if (manage) {
+       if (!(fsb -> fsb_prequirements & PR_MANAGEMENT))
+           return ftamlose (fti, FS_ACS_CONTEXT, 0, NULLCP, NULLCP);
+    }
+    else
+       fsb -> fsb_prequirements &= ~(PR_MANAGEMENT | PR_RESTORATION);
+    switch (class & fsb -> fsb_class) {
+       case FCLASS_TRANSFER:
+       case FCLASS_ACCESS:
+       case FCLASS_MANAGE:
+       case FCLASS_TM:
+           fsb -> fsb_class &= class;
+           break;
+
+       default:
+           return ftamlose (fti, FS_GEN (fsb), 0, NULLCP,
+                            "service class mismatch, offered 0x%x received 0x%x",
+                            fsb -> fsb_class, class);
+    }
+    if (units & ~fsb -> fsb_units)
+       return ftamlose (fti, FS_GEN (fsb), 0, NULLCP,
+               "functional units not open for negotiation");
+    if (!(units & FUNIT_LIMITED) && (units & FUNIT_ENHANCED))
+       return ftamlose (fti, FS_GEN (fsb), 0, NULLCP,
+               "enhanced-file-management requires limited-file-management");
+    if (!((fsb -> fsb_units = units) & (FUNIT_RECOVERY | FUNIT_RESTART))) {
+       fsb -> fsb_srequirements &= ~SR_MINORSYNC;
+       fsb -> fsb_ssn = SERIAL_NONE;
+    }
+    switch (fsb -> fsb_class) {
+       case FCLASS_TRANSFER:
+           if (!(fsb -> fsb_units & FUNITS_TRANSFER))
+               goto not_enough;
+           goto do_trans;
+       case FCLASS_TM:
+           if (!(fsb -> fsb_units & FUNITS_TM))
+               goto not_enough;
+do_trans: ;
+           if (!(fsb -> fsb_units & (FUNIT_READ | FUNIT_WRITE))) {
+not_enough: ;
+               return ftamlose (fti, FS_GEN (fsb), 0, NULLCP,
+                                "insufficient functional units for service class");
+           }
+           if (fsb -> fsb_units & (FUNIT_ACCESS | FUNIT_FADULOCK)) {
+too_many: ;
+               return ftamlose (fti, FS_GEN (fsb), 0, NULLCP,
+                                "illegal functional units for service class");
+           }
+           break;
+
+       case FCLASS_ACCESS:
+           if (!(fsb -> fsb_units & FUNITS_ACCESS))
+               goto not_enough;
+           break;
+
+       case FCLASS_MANAGE:
+           if (!(fsb -> fsb_units & FUNITS_MANAGE))
+               goto not_enough;
+           if (fsb -> fsb_units & (FUNIT_READ | FUNIT_WRITE
+                                       | FUNIT_ACCESS | FUNIT_FADULOCK
+                                       | FUNIT_RECOVERY | FUNIT_RESTART))
+               goto too_many;
+           break;
+    }
+    if (attrs & ~fsb -> fsb_attrs)
+       return ftamlose (fti, FS_GEN (fsb), 0, NULLCP,
+               "attribute groups not open for negotiation");
+#ifdef notdef
+    if ((attrs & FATTR_SECURITY) && !(attrs & FATTR_STORAGE))
+       return ftamlose (fti, FS_ACS_GRP, 0, NULLCP, NULLCP);
+#endif
+    fsb -> fsb_attrs = attrs;
+    if (fqos != MY_FQOS)
+       return ftamlose (fti, FS_ACS_ROLLBACK, 1, NULLCP,
+                        "class-%d-recovery not supported", fqos);
+    pl = &fsb -> fsb_contents;
+    if (contents) {
+       int     acsid;
+       register struct FTAMcontent *fx = contents -> fc_contents;
+
+       if (contents -> fc_ncontent != pl -> fc_ncontent)
+           return ftamlose (fti, FS_GEN (fsb), 0, NULLCP,
+                       "proposed/resulting content types mismatch");
+       
+       (void) AcFindPCI (fsb -> fsb_fd, &acsid, aci);
+       for (px = pl -> fc_contents, i = pl -> fc_ncontent - 1;
+               i >= 0;
+               px++, i--) {
+           if (fx -> fc_id != px -> fc_id)
+               return ftamlose (fti, FS_GEN (fsb), 0, NULLCP,
+                           "bad context id %d at offset %d (wanted %d)",
+                           fx -> fc_id, fx - contents -> fc_contents,
+                           px -> fc_id);
+           switch (fx -> fc_result) {
+               case PC_ACCEPT:
+               case PC_REJECTED:
+                   if (px -> fc_result != PC_ACCEPT) {
+invalid_result: ;
+                       return ftamlose (fti, FS_GEN (fsb), 0, NULLCP,
+                                   "invalid result %d for content id %d",
+                                   fx -> fc_result, fx -> fc_id);
+                   }
+                   px -> fc_result = fx -> fc_result;
+                   break;
+
+               default:
+                   if (px -> fc_result != fx -> fc_result)
+                       goto invalid_result;
+                   break;
+           }
+
+           fx++;
+       }
+    }
+
+    toomuchP (diag, ndiag, NFDIAG, "diagnostic");
+    missingP (fti);
+
+    if ((pdu = (struct type_FTAM_PDU *) calloc (1, sizeof *pdu)) == NULL) {
+no_mem: ;
+       result = ftamlose (fti, FS_GEN (fsb), 1, NULLCP, "out of memory");
+       goto out;
+    }
+    pdu -> offset = type_FTAM_PDU_f__initialize__response;
+    if ((rsp = (struct type_FTAM_F__INITIALIZE__response *)
+                               calloc (1, sizeof *rsp)) == NULL)
+       goto no_mem;
+    pdu -> un.f__initialize__response = rsp;
+    if (state != int_FTAM_State__Result_success) {
+       if ((rsp -> state__result =
+                       (struct type_FTAM_State__Result *)
+                               calloc (1, sizeof *rsp -> state__result))
+               == NULL)
+           goto no_mem;
+       rsp -> state__result -> parm = state;
+    }
+    if (action != int_FTAM_Action__Result_success) {
+       if ((rsp -> action__result =
+                       (struct type_FTAM_Action__Result *)
+                               calloc (1, sizeof *rsp -> action__result))
+               == NULL)
+           goto no_mem;
+       rsp -> action__result -> parm = action;
+    }
+    rsp -> presentation__context__management = manage;
+    if (fsb -> fsb_class != FCLASS_TRANSFER
+               && (rsp -> service__class = bits2fpm (fsb, fclass_pairs,
+                                                     fsb -> fsb_class, fti))
+           == NULLPE)
+       goto out;
+    if ((rsp -> functional__units = bits2fpm (fsb, funit_pairs,
+                                             fsb -> fsb_units, fti))
+           == NULLPE)
+       goto out;
+    if (fsb -> fsb_attrs
+           && (rsp -> attribute__groups = bits2fpm (fsb, fattr_pairs,
+                                                    attrs, fti)) == NULLPE)
+       goto out;
+    if (sharedASE
+               && (rsp -> shared__ASE__information =
+                               shared2fpm (fsb, sharedASE, fti)) == NULL)
+       goto out;
+    if ((rsp -> ftam__quality__of__service =
+               (struct type_FTAM_FTAM__Quality__Of__Service *)
+                       calloc (1, sizeof *rsp -> ftam__quality__of__service))
+           == NULL)
+       goto no_mem;
+    rsp -> ftam__quality__of__service -> parm = fsb -> fsb_fqos;
+    if (contents) {
+       struct type_FTAM_Contents__Type__List *fpm;
+       register struct type_FTAM_Contents__Type__List **fpc;
+       
+       fpc = &rsp -> contents__type__list;
+       for (px = pl -> fc_contents, i = pl -> fc_ncontent - 1;
+               i >= 0;
+               px++, i--)
+           if (px -> fc_result == PC_ACCEPT) {
+               if ((fpm = (struct type_FTAM_Contents__Type__List *)
+                               calloc (1, sizeof *fpm)) == NULL)
+                   goto no_mem;
+               *fpc = fpm;
+
+               if ((fpm -> Document__Type__Name = oid_cpy (px -> fc_dtn))
+                       == NULLOID)
+                   goto no_mem;
+               fpc = &fpm -> next;
+           }
+    }
+
+    if (ndiag > 0
+           && (rsp -> diagnostic = diag2fpm (fsb, 0, diag, ndiag, fti))
+                   == NULL)
+       goto out;
+    rsp -> checkpoint__window = 1;
+
+    if (encode_FTAM_PDU (&pe, 1, 0, NULLCP, pdu) == NOTOK) {
+       (void) ftamlose (fti, FS_GEN (fsb), 1, NULLCP,
+                        "error encoding PDU: %s", PY_pepy);
+       goto out;
+    }
+
+    pe -> pe_context = fsb -> fsb_id;
+
+    fsbtrace (fsb, (fsb -> fsb_fd, "A-ASSOCIATE.RESPONSE",
+               "F-INITIALIZE-response", pe, 0));
+
+    result = AcAssocResponse (fsb -> fsb_fd, status, status != ACS_ACCEPT
+                             ? ACS_USER_NOREASON : ACS_USER_NULL,
+               context ? context : fsb -> fsb_context, respondtitle,
+               respondaddr, &fsb -> fsb_contexts, PC_ACCEPT,
+               fsb -> fsb_prequirements, fsb -> fsb_srequirements,
+               fsb -> fsb_ssn, fsb -> fsb_settings, &fsb -> fsb_connect,
+               &pe, 1, aci);
+
+    pe_free (pe);
+    pe = NULLPE;
+    free_FTAM_PDU (pdu);
+    pdu = NULL;
+
+    if (result == NOTOK) {
+       (void) acs2ftamlose (fsb, fti, "AcAssocResponse", aca);
+       goto out;
+    }
+
+    fsb -> fsb_flags |= FSB_CONN;
+    return OK;
+    
+out: ;
+    if (pe)
+       pe_free (pe);
+    if (pdu)
+       free_FTAM_PDU (pdu);
+
+    pe = NULLPE;
+    if ((pdu = (struct type_FTAM_PDU *) calloc (1, sizeof *pdu))
+           == NULL)
+       goto carry_on;
+    pdu -> offset = type_FTAM_PDU_f__initialize__response;
+    if ((rsp = (struct type_FTAM_F__INITIALIZE__response *)
+                               calloc (1, sizeof *rsp))
+           == NULL)
+       goto carry_on;
+    pdu -> un.f__initialize__response = rsp;
+    if (rsp -> state__result = (struct type_FTAM_State__Result *)
+                                     calloc (1, sizeof *rsp -> state__result))
+       rsp -> state__result -> parm = FSTATE_FAILURE;
+    if (rsp -> action__result = (struct type_FTAM_Action__Result *)
+                                    calloc (1, sizeof *rsp -> action__result))
+       rsp -> action__result -> parm= FACTION_PERM;
+    rsp -> functional__units = bits2fpm (fsb, funit_pairs, 0, fti);
+    if (rsp -> ftam__quality__of__service =
+               (struct type_FTAM_FTAM__Quality__Of__Service *)
+                      calloc (1, sizeof *rsp -> ftam__quality__of__service))
+       rsp -> ftam__quality__of__service -> parm = MY_FQOS;
+    rsp -> diagnostic = diag2fpm (fsb, 1, fti -> fti_abort.fta_diags, 1, fti);
+    rsp -> checkpoint__window = 1;
+
+    if (encode_FTAM_PDU (&pe, 1, 0, NULLCP, pdu) != NOTOK)
+       pe -> pe_context = fsb -> fsb_id;
+
+carry_on: ;
+    fsbtrace (fsb, (fsb -> fsb_fd, "A-ASSOCIATE.RESPONSE(reject)",
+                   "F-INITIALIZE-response", pe, 0));
+
+    (void) AcAssocResponse (fsb -> fsb_fd, ACS_TRANSIENT, ACS_USER_NOREASON,
+               NULLOID, NULLAEI, NULLPA, NULLPC, PC_ACCEPT, 0, 0, SERIAL_NONE,
+               0, &fsb -> fsb_connect, pe ? &pe : NULLPEP, pe ? 1 : 0, aci);
+    if (pe)
+       pe_free (pe);
+    if (pdu)
+       free_FTAM_PDU (pdu);
+
+    fsb -> fsb_fd = NOTOK;
+    freefsblk (fsb);
+
+    return NOTOK;
+}
diff --git a/usr/src/contrib/isode/ftam/ftamselect.c b/usr/src/contrib/isode/ftam/ftamselect.c
new file mode 100644 (file)
index 0000000..0e4d927
--- /dev/null
@@ -0,0 +1,80 @@
+/* ftamselect.c - FPM: map descriptors */
+
+#ifndef        lint
+static char *rcsid = "$Header: /f/osi/ftam/RCS/ftamselect.c,v 7.2 91/02/22 09:23:14 mrose Interim $";
+#endif
+
+/* 
+ * $Header: /f/osi/ftam/RCS/ftamselect.c,v 7.2 91/02/22 09:23:14 mrose Interim $
+ *
+ *
+ * $Log:       ftamselect.c,v $
+ * Revision 7.2  91/02/22  09:23:14  mrose
+ * Interim 6.8
+ * 
+ * Revision 7.1  89/12/14  10:04:10  mrose
+ * bdt
+ * 
+ * Revision 7.0  89/11/23  21:53:53  mrose
+ * Release 6.0
+ * 
+ */
+
+/*
+ *                               NOTICE
+ *
+ *    Acquisition, use, and distribution of this module and related
+ *    materials are subject to the restrictions of a license agreement.
+ *    Consult the Preface in the User's Manual for the full terms of
+ *    this agreement.
+ *
+ */
+
+
+/* LINTLIBRARY */
+
+#include <stdio.h>
+#include <signal.h>
+#include "fpkt.h"
+
+/* \f   map ftam descriptors for select() */
+
+int    FSelectMask (sd, mask, nfds, fti)
+int    sd;
+fd_set *mask;
+int    *nfds;
+struct FTAMindication *fti;
+{
+    SBV     smask;
+    register struct ftamblk *fsb;
+    struct PSAPindication   pis;
+    register struct PSAPabort  *pa = &pis.pi_abort;
+
+    missingP (mask);
+    missingP (nfds);
+    missingP (fti);
+
+    smask = sigioblock ();
+
+    ftamPsig (fsb, sd);
+
+    if (fsb -> fsb_data.px_ninfo > 0)
+       goto waiting;
+    if (PSelectMask (fsb -> fsb_fd, mask, nfds, &pis) == NOTOK)
+       switch (pa -> pa_reason) {
+           case PC_WAITING: 
+waiting: ;
+               (void) sigiomask (smask);
+               return ftamlose (fti, FS_GEN_WAITING, 0, NULLCP, NULLCP);
+
+           default: 
+               (void) ps2ftamlose (fsb, fti, "PSelectMask", pa);
+               freefsblk (fsb);
+               (void) sigiomask (smask);
+               return NOTOK;
+       }
+
+    (void) sigiomask (smask);
+
+    return OK;
+}
diff --git a/usr/src/contrib/isode/ftam/ftamshare.c b/usr/src/contrib/isode/ftam/ftamshare.c
new file mode 100644 (file)
index 0000000..c3b1dd6
--- /dev/null
@@ -0,0 +1,79 @@
+/* ftamshare.c - FPM: encode/decode shared ASE information */
+
+#ifndef        lint
+static char *rcsid = "$Header: /f/osi/ftam/RCS/ftamshare.c,v 7.1 91/02/22 09:23:15 mrose Interim $";
+#endif
+
+/* 
+ * $Header: /f/osi/ftam/RCS/ftamshare.c,v 7.1 91/02/22 09:23:15 mrose Interim $
+ *
+ *
+ * $Log:       ftamshare.c,v $
+ * Revision 7.1  91/02/22  09:23:15  mrose
+ * Interim 6.8
+ * 
+ * Revision 7.0  89/11/23  21:53:53  mrose
+ * Release 6.0
+ * 
+ */
+
+/*
+ *                               NOTICE
+ *
+ *    Acquisition, use, and distribution of this module and related
+ *    materials are subject to the restrictions of a license agreement.
+ *    Consult the Preface in the User's Manual for the full terms of
+ *    this agreement.
+ *
+ */
+
+
+/* LINTLIBRARY */
+
+#include <stdio.h>
+#include "fpkt.h"
+
+/* \f */
+
+struct type_FTAM_Shared__ASE__Information *shared2fpm (fsb, sharedASE, fti)
+register struct ftamblk *fsb;
+PE     sharedASE;
+struct FTAMindication *fti;
+{
+    register struct type_FTAM_Shared__ASE__Information *fpm;
+
+    if ((fpm = (struct type_FTAM_Shared__ASE__Information *)
+                   calloc (1, sizeof *fpm)) == NULL) {
+       (void) ftamlose (fti, FS_GEN (fsb), 1, NULLCP, "out of memory");
+       if (fpm)
+           free_FTAM_Shared__ASE__Information (fpm);
+       return NULL;
+    }
+
+    fpm -> indirect__reference = sharedASE -> pe_context;
+    fpm -> encoding -> offset = choice_UNIV_0_single__ASN1__type;
+    (fpm -> encoding -> un.single__ASN1__type = sharedASE) -> pe_refcnt++;
+
+    return fpm;
+}
+
+/* \f */
+
+int    fpm2shared (fsb, fpm, sharedASE, fti)
+struct ftamblk *fsb;
+register struct type_FTAM_Shared__ASE__Information *fpm;
+PE    *sharedASE;
+struct FTAMindication *fti;
+{
+    PE     pe;
+    
+    if (fpm -> encoding -> offset != choice_UNIV_0_single__ASN1__type)
+       return ftamlose (fti, FS_GEN (fsb), 1, NULLCP,
+                        "shared ASE information not single-ASN1-type");
+
+    if ((pe = pe_cpy (fpm -> encoding -> un.single__ASN1__type)) == NULLPE)
+       (void) ftamlose (fti, FS_GEN (fsb), 1, NULLCP, "out of memory");
+    (*sharedASE = pe) -> pe_context = fpm -> indirect__reference;
+
+    return OK;
+}
diff --git a/usr/src/contrib/isode/ftam/ftamtrace.c b/usr/src/contrib/isode/ftam/ftamtrace.c
new file mode 100644 (file)
index 0000000..26eebc3
--- /dev/null
@@ -0,0 +1,119 @@
+/* ftamtrace.c - FPM: tracing */
+
+#ifndef        lint
+static char *rcsid = "$Header: /f/osi/ftam/RCS/ftamtrace.c,v 7.2 91/02/22 09:23:16 mrose Interim $";
+#endif
+
+/* 
+ * $Header: /f/osi/ftam/RCS/ftamtrace.c,v 7.2 91/02/22 09:23:16 mrose Interim $
+ *
+ *
+ * $Log:       ftamtrace.c,v $
+ * Revision 7.2  91/02/22  09:23:16  mrose
+ * Interim 6.8
+ * 
+ * Revision 7.1  90/07/01  21:03:01  mrose
+ * pepsy
+ * 
+ * Revision 7.0  89/11/23  21:53:54  mrose
+ * Release 6.0
+ * 
+ */
+
+/*
+ *                               NOTICE
+ *
+ *    Acquisition, use, and distribution of this module and related
+ *    materials are subject to the restrictions of a license agreement.
+ *    Consult the Preface in the User's Manual for the full terms of
+ *    this agreement.
+ *
+ */
+
+
+/* LINTLIBRARY */
+
+#include <stdio.h>
+#include <signal.h>
+#include "fpkt.h"
+
+/* \f   DATA */
+
+LLog _ftam_log = {
+    "ftam.log", NULLCP, NULLCP, LLOG_FATAL | LLOG_EXCEPTIONS | LLOG_NOTICE,
+    LLOG_NONE, -1, LLOGCLS | LLOGCRT | LLOGZER, NOTOK
+};
+LLog *ftam_log = &_ftam_log;
+
+static char *ftam_appls[] = {
+    "Abstract-Syntax-Name",
+    "Access-Context",
+    "Access-Passwords",
+    "Access-Request",
+    "Account",
+    "Action-Result",
+    "Activity-Identifier",
+    "Application-Entity-Title",
+    "Change-Attributes",
+    "Charging",
+    "Concurrency-Control",
+    "Constraint-Set-Name",
+    "Create-Attributes",
+    "Diagnostic",
+    "Document-Type-Name",
+    "FADU-Identity",
+    "FADU-Lock",
+    "Password",
+    "Read-Attributes",
+    "Select-Attributes",
+    "Shared-ASE-Information",
+    "State-Result",
+    "User-Identity"
+};
+
+static int ftam_nappl = sizeof ftam_appls / sizeof ftam_appls[0];
+
+/* \f   set tracing */
+
+int    FHookRequest (sd, tracing, fti)
+int    sd;
+IFP    tracing;
+struct FTAMindication *fti;
+{
+    SBV            smask;
+    register struct ftamblk *fsb;
+
+    missingP (fti);
+
+    smask = sigioblock ();
+
+    ftamPsig (fsb, sd);
+
+    if (fsb -> fsb_trace = tracing)
+       pe_applist = ftam_appls, pe_maxappl = ftam_nappl;
+
+    (void) sigiomask (smask);
+
+    return OK;
+}
+
+/* \f   user-defined tracing */
+
+/* ARGSUSED */
+
+int    FTraceHook (sd, event, fpdu, pe, rw)
+int    sd;
+char   *event,
+       *fpdu;
+PE     pe;
+int    rw;
+{
+    if (event)
+       LLOG (ftam_log, LLOG_ALL, ("%s %s", rw > 0 ? "event"
+                            : rw == 0 ? "action" : "exception", event));
+
+    if (pe)
+       pvpdu (ftam_log, print_FTAM_PDU_P, pe, fpdu ? fpdu : "FPDU", rw);
+
+    (void) ll_sync (ftam_log);
+}
diff --git a/usr/src/contrib/isode/ftam/isodocuments b/usr/src/contrib/isode/ftam/isodocuments
new file mode 100644 (file)
index 0000000..c1ef9de
--- /dev/null
@@ -0,0 +1,72 @@
+###############################################################################
+# isodocuments - ISODE FTAM Document Types Database
+#
+#      Document Types as per ISO 8571/2
+#
+#
+# $Header: /f/osi/ftam/RCS/isodocuments,v 7.4 91/02/22 09:23:18 mrose Interim $
+#
+#
+# $Log:        isodocuments,v $
+# Revision 7.4  91/02/22  09:23:18  mrose
+# Interim 6.8
+# 
+# Revision 7.3  91/01/13  12:26:51  mrose
+# NBS
+# 
+# Revision 7.2  91/01/11  11:35:01  mrose
+# back-off
+# 
+# Revision 7.1  90/11/04  19:15:13  mrose
+# update
+# 
+# Revision 7.0  89/11/23  21:53:55  mrose
+# Release 6.0
+# 
+###############################################################################
+
+
+###############################################################################
+#
+# Syntax:
+#
+#  <entry> <document type> <abstract syntax> <transfer syntax> <file model>
+#                                                             <constraint set>
+#
+#      Each token is separated by LWSP, though double-quotes may be
+#      used to prevent separation
+#
+###############################################################################
+
+
+# Unstructured text file document type
+# Entry number:                        FTAM-1
+# Document type name:          "ISO FTAM unstructured text"
+# Abstract syntax name:                "FTAM unstructured text abstract syntax"
+# Transfer syntax name:                "Basic encoding of a single ASN.1 type"
+# File model:                  "FTAM hierarchical file model"
+# Constraint set:              "FTAM unstructured constraint set"
+
+FTAM-1 1.0.8571.5.1    1.0.8571.2.3    2.1.1   1.0.8571.3.1    1.0.8571.4.1
+
+
+# Unstructured binary file document type
+# Entry number:                        FTAM-3
+# Document type name:          "ISO FTAM unstructured binary"
+# Abstract syntax name:                "FTAM unstructured binary abstract syntax"
+# Transfer syntax name:                "Basic encoding of a single ASN.1 type"
+# File model:                  "FTAM hierarchical file model"
+# Constraint set name:         "FTAM unstructured constraint set"
+
+FTAM-3 1.0.8571.5.3    1.0.8571.2.4    2.1.1   1.0.8571.3.1    1.0.8571.4.1
+
+
+# Filedirectory file document type
+# Entry number:                        NBS-9
+# Document type name:          "NBS-9 FTAM file directory file"
+# Abstract syntax name:                "NIST file directory entry abstract syntax"
+# Transfer syntax name:                "Basic encoding of a single ASN.1 type"
+# File model:                  "FTAM hierarchical file model"
+# Constraint set name:         "FTAM unstructured constraint set"
+
+NBS-9  1.3.9999.1.5.9  1.3.9999.1.2.2  2.1.1   1.0.8571.3.1    1.0.8571.4.1
diff --git a/usr/src/contrib/isode/ftam/isodocuments.5 b/usr/src/contrib/isode/ftam/isodocuments.5
new file mode 100644 (file)
index 0000000..474b4f3
--- /dev/null
@@ -0,0 +1,39 @@
+.TH ISODOCUMENTS 5 "01 Mar 1987"
+.\" $Header: /f/osi/ftam/RCS/isodocuments.5,v 7.1 91/02/22 09:23:19 mrose Interim $
+.\"
+.\"
+.\" $Log:      isodocuments.5,v $
+.\" Revision 7.1  91/02/22  09:23:19  mrose
+.\" Interim 6.8
+.\" 
+.\" Revision 7.0  89/11/23  21:53:56  mrose
+.\" Release 6.0
+.\" 
+.SH NAME
+.B isodocuments
+\- ISODE FTAM Document Types Database
+.SH DESCRIPTION
+The \fIisodocuments\fR
+file contains information regarding the known ISO document types on the host.
+.PP
+Items are seperated by any number of blanks and/or tab characters,
+though double\-quotes may be used to prevent separation between arguments.
+The character `#' at the beginning of a line indicates a comment line.
+.PP
+The first item is the entry number of the document, a simple string.
+The remaining four items are object identifiers denothing the
+document type, abstract syntax, transfer syntax,
+file model, and constraint set (respectively).
+.SH FILES
+.nf
+.ta \w'\*(EDisodocuments  'u
+\*(EDisodocuments      ISODE FTAM document types database
+.re
+.fi
+.SH "SEE ALSO"
+libftam(3n),
+.br
+\fIThe ISO Development Environment: User's Manual, Volume 3:
+Applications\fR, \*(lqThe ISODE FTAM Documents Type Database\*(rq.
+.SH AUTHOR
+Marshall T. Rose
diff --git a/usr/src/contrib/isode/ftam/libftam.3n b/usr/src/contrib/isode/ftam/libftam.3n
new file mode 100644 (file)
index 0000000..9c734c6
--- /dev/null
@@ -0,0 +1,73 @@
+.TH LIBFTAM 3N "01 Mar 1987"
+.\" $Header: /f/osi/ftam/RCS/libftam.3n,v 7.2 91/02/22 09:23:20 mrose Interim $
+.\"
+.\"
+.\" $Log:      libftam.3n,v $
+.\" Revision 7.2  91/02/22  09:23:20  mrose
+.\" Interim 6.8
+.\" 
+.\" Revision 7.1  90/07/09  14:37:01  mrose
+.\" sync
+.\" 
+.\" Revision 7.0  89/11/23  21:53:57  mrose
+.\" Release 6.0
+.\" 
+.SH NAME
+libftam \- File Transfer, Access, and Management library
+.SH SYNOPSIS
+.B "#include <isode/ftam.h>"
+.sp
+\fIcc\fR\0...\0\fB\-lftam\fR\0\fB\-lisode\fR
+.SH DESCRIPTION
+The \fIlibftam\fR library contains a set of routines which implement the File
+Transfer, Access and Management (FTAM) protocol.
+This manual page describes only high\-level information only;
+consult the \fIUser's Manual\fR for the full details on the entire
+FTAM interface.
+.PP
+Supported are:
+the no-recovery FTAM-QoS;
+the transfer, access, management, and transfer and management service classes;
+the kernel, read, write, access, limited file management, enhanced file
+management, grouping, and fadu-locking functional units;
+and,
+the kernel, storage, security, and private attributes groups.
+Both initiators and responders are supported.
+.SH FILES
+.nf
+.ta \w'\*(EDisodocuments  'u
+\*(EDisodocuments      ISODE documents database
+\*(EDisoentities       ISODE entities database
+.re
+.fi
+.SH "SEE ALSO"
+isodocuments(5), ftam(1c), ftamd(8c),
+.br
+\fIThe ISO Development Environment: User's Manual\fR,
+.br
+ISO 8571:
+\fIInformation Processing Systems \-\-
+File Transfer, Access, and Management\fR
+.SH DIAGNOSTICS
+All routines return the manifest constant \fBNOTOK\fR (\-1) on error.
+In addition,
+those routines which take a pointer to a \fBFTAMindication\fR structure
+fill\-in the structure as appropriate.
+.SH AUTHOR
+Marshall T. Rose
+.SH BUGS
+Do not confuse ftam\-descriptors with file\-descriptors.
+Unlike file\-descriptors which are implemented by the kernel,
+ftam\-descriptors do not work across \fIfork\fRs and \fIexec\fRs.
+.PP
+The grouping functional unit is always required,
+even if the file access classes is selected.
+.PP
+Although the security group is implemented,
+access\-control attributes may be read but not changed.
+.PP
+The number of charging, diagnostic, and content types entries
+permitted on a given service primitive is limited to a compile-time constant.
+.PP
+Contents types are identified solely by document type name;
+identification by abstract syntax and/or constrait set name is not supported.
diff --git a/usr/src/contrib/isode/ftam/llib-lftam b/usr/src/contrib/isode/ftam/llib-lftam
new file mode 100644 (file)
index 0000000..85c77ca
--- /dev/null
@@ -0,0 +1,438 @@
+/* llib-lftam - lint library for -lftam */
+
+/* 
+ * $Header: /f/osi/ftam/RCS/llib-lftam,v 7.1 91/02/22 09:23:21 mrose Interim $
+ *
+ *
+ * $Log:       llib-lftam,v $
+ * Revision 7.1  91/02/22  09:23:21  mrose
+ * Interim 6.8
+ * 
+ * Revision 7.0  89/11/23  21:53:58  mrose
+ * Release 6.0
+ * 
+ */
+
+/*
+ *                               NOTICE
+ *
+ *    Acquisition, use, and distribution of this module and related
+ *    materials are subject to the restrictions of a license agreement.
+ *    Consult the Preface in the User's Manual for the full terms of
+ *    this agreement.
+ *
+ */
+
+
+/* LINTLIBRARY */
+
+#include "ftam.h"
+
+/* \f */
+
+/* F-INITIALIZE.INDICATION */
+
+int    FInit (vecp, vec, fts, tracing, fti)
+int    vecp;
+char  **vec;
+struct FTAMstart *fts;
+IFP    tracing;
+struct FTAMindication *fti;
+{
+    return FInit (vecp, vec, fts, tracing, fti);
+}
+
+
+/* F-INITIALIZE.RESPONSE */
+
+int    FInitializeResponse (sd, state, action, context, respondtitle,
+       respondaddr, manage, class, units, attrs, sharedASE, fqos, contents,
+       diag, ndiag, fti)
+int    sd;
+int    state,
+       action,
+       manage,
+       class,
+       units,
+       attrs,
+       fqos;
+OID    context;
+AEI    respondtitle;
+struct PSAPaddr *respondaddr;
+PE     sharedASE;
+struct FTAMcontentlist *contents;
+struct FTAMdiagnostic diag[];
+int    ndiag;
+struct FTAMindication *fti;
+{
+    return FInitializeResponse (sd, state, action, context, respondtitle,
+           respondaddr, manage, class, units, attrs, sharedASE, fqos, contents,
+           diag, ndiag, fti);
+}
+
+
+/* F-INITIALIZE.REQUEST */
+
+int    FInitializeRequest (context, callingtitle, calledtitle, callingaddr,
+       calledaddr, manage, class, units, attrs, sharedASE, fqos, contents,
+       initiator, account, password, passlen, qos, tracing, ftc, fti)
+OID    context;
+AEI    callingtitle,
+       calledtitle;
+struct PSAPaddr *callingaddr,
+               *calledaddr;
+int    manage,
+       class,
+       units,
+       attrs,
+       fqos,
+       passlen;
+PE     sharedASE;
+struct FTAMcontentlist *contents;
+char   *initiator,
+       *account,
+       *password;
+struct QOStype *qos;
+IFP    tracing;
+struct FTAMconnect *ftc;
+struct FTAMindication *fti;
+{
+    return FInitializeRequest (context, callingtitle, calledtitle, callingaddr,
+           calledaddr, manage, class, units, attrs, sharedASE, fqos,
+           contents, initiator, account, password, passlen, qos, tracing,
+           ftc, fti);
+}
+
+
+/* F-TERMINATE.REQUEST */
+
+int    FTerminateRequest (sd, sharedASE, ftr, fti)
+int    sd;
+PE     sharedASE;
+struct FTAMrelease *ftr;
+struct FTAMindication *fti;
+{
+    return FTerminateRequest (sd, sharedASE, ftr, fti);
+}
+
+
+/* F-TERMINATE.RESPONSE */
+
+int    FTerminateResponse (sd, sharedASE, charging, fti)
+int    sd;
+PE     sharedASE;
+struct FTAMcharging *charging;
+struct FTAMindication *fti;
+{
+    return FTerminateResponse (sd, sharedASE, charging, fti);
+}
+
+
+/* F-U-ABORT.REQUEST */
+
+int    FUAbortRequest (sd, action, diag, ndiag, fti)
+int    sd;
+int    action;
+struct FTAMdiagnostic diag[];
+int    ndiag;
+struct FTAMindication *fti;
+{
+    return FUAbortRequest (sd, action, diag, ndiag, fti);
+}
+
+
+/* F-WAIT.REQUEST (pseudo) */
+
+int    FWaitRequest (sd, secs, fti)
+int    sd;
+int    secs;
+struct FTAMindication *fti;
+{
+    return FWaitRequest (sd, secs, fti);
+}
+
+
+/* F-MANAGE.REQUEST (group) */
+
+int     FManageRequest (sd, ftg, fti)
+int     sd;
+struct FTAMgroup   *ftg;
+struct FTAMindication  *fti;
+{
+    return FManageRequest (sd, ftg, fti);
+}
+
+
+/* F-MANAGE.RESPONSE (group) */
+
+int     FManageResponse (sd, ftg, fti)
+int     sd;
+struct FTAMgroup   *ftg;
+struct FTAMindication  *fti;
+{
+    return FManageResponse (sd, ftg, fti);
+}
+
+
+/* F-BULK-BEGIN.REQUEST (group) */
+
+int     FBulkBeginRequest (sd, ftg, fti)
+int     sd;
+struct FTAMgroup   *ftg;
+struct FTAMindication  *fti;
+{
+    return FBulkBeginRequest (sd, ftg, fti);
+}
+
+
+/* F-BULK-BEGIN.RESPONSE (group) */
+
+int     FBulkBeginResponse (sd, ftg, fti)
+int     sd;
+struct FTAMgroup   *ftg;
+struct FTAMindication  *fti;
+{
+    return FBulkBeginResponse (sd, ftg, fti);
+}
+
+
+/* F-BULK-END.REQUEST (group) */
+
+int     FBulkEndRequest (sd, ftg, fti)
+int     sd;
+struct FTAMgroup   *ftg;
+struct FTAMindication  *fti;
+{
+    return FBulkEndRequest (sd, ftg, fti);
+}
+
+
+/* F-BULK-END.RESPONSE (group) */
+
+int     FBulkEndResponse (sd, ftg, fti)
+int     sd;
+struct FTAMgroup   *ftg;
+struct FTAMindication  *fti;
+{
+    return FBulkEndResponse (sd, ftg, fti);
+}
+
+
+/* F-{LOCATE,ERASE}.REQUEST */
+
+int    FAccessRequest (sd, operation, identity, fti)
+int    sd;
+int    operation;
+struct FADUidentity *identity;
+struct FTAMindication *fti;
+{
+    return FAccessRequest (sd, operation, identity, fti);
+}
+
+
+/* F-{LOCATE,ERASE}.RESPONSE */
+
+int    FAccessResponse (sd, action, identity, diag, ndiag, fti)
+int    sd;
+int    action;
+struct FADUidentity *identity; /* F-LOCATE.RESPONSE only */
+struct FTAMdiagnostic diag[];
+int    ndiag;
+struct FTAMindication *fti;
+{
+    return FAccessResponse (sd, action, identity, diag, ndiag, fti);
+}
+
+
+/* F-{READ,WRITE}.REQUEST */
+
+int    FReadWriteRequest (sd, operation, identity, context, level, lock, fti)
+int    sd;
+int    operation;
+struct FADUidentity *identity;
+int    context,                /* F-READ.REQUEST only */
+       level,                  /*   .. */
+       lock;
+struct FTAMindication *fti;
+{
+    return FReadWriteRequest (sd, operation, identity, context, level, lock,
+                             fti);
+}
+
+
+/* F-DATA.REQUEST */
+
+int    FDataRequest (sd, fadus, nfadu, fti)
+int    sd;
+PE     fadus[];
+int    nfadu;
+struct FTAMindication *fti;
+{
+    return FDataRequest (sd, fadus, nfadu, fti);
+}
+
+
+/* F-DATA-END.REQUEST */
+
+int    FDataEndRequest (sd, action, diag, ndiag, fti)
+int    sd;
+int    action;
+struct FTAMdiagnostic diag[];
+int    ndiag;
+struct FTAMindication *fti;
+{
+    return FDataEndRequest (sd, action, diag, ndiag, fti);
+}
+
+
+/* F-CANCEL.REQUEST */
+
+int    FCancelRequest (sd, action, sharedASE, diag, ndiag, fti)
+int    sd;
+int    action;
+PE     sharedASE;
+struct FTAMdiagnostic diag[];
+int    ndiag;
+struct FTAMindication *fti;
+{
+    return FCancelRequest (sd, action, sharedASE, diag, ndiag, fti);
+}
+
+
+/* F-CANCEL.RESPONSE */
+
+int    FCancelResponse (sd, action, sharedASE, diag, ndiag, fti)
+int    sd;
+int    action;
+PE     sharedASE;
+struct FTAMdiagnostic diag[];
+int    ndiag;
+struct FTAMindication *fti;
+{
+    return FCancelResponse (sd, action, sharedASE, diag, ndiag, fti);
+}
+
+
+/* F-TRANSFER-END.REQUEST */
+
+int    FTransEndRequest (sd, sharedASE, fti)
+int    sd;
+PE     sharedASE;
+struct FTAMindication *fti;
+{
+    return FTransEndRequest (sd, sharedASE, fti);
+}
+
+
+/* F-TRANSFER-END.RESPONSE */
+
+int    FTransEndResponse (sd, action, sharedASE, diag, ndiag, fti)
+int    sd;
+int    action;
+PE     sharedASE;
+struct FTAMdiagnostic diag[];
+int    ndiag;
+struct FTAMindication *fti;
+{
+    return FTransEndResponse (sd, action, sharedASE, diag, ndiag, fti);
+}
+
+
+/* define vector for INDICATION events */
+
+int    FSetIndications (sd, indication, fti)
+int    sd;
+IFP    indication;
+struct FTAMindication *fti;
+{
+    return FSetIndications (sd, indication, fti);
+}
+
+
+/* map ftam descriptors for select() */
+
+int    FSelectMask (sd, mask, nfds, fti)
+int    sd;
+fd_set *mask;
+int    *nfds;
+struct FTAMindication *fti;
+{
+    return FSelectMask (sd, mask, nfds, fti);
+}
+
+
+/* set tracing */
+
+int    FHookRequest (sd, tracing, fti)
+int    sd;
+IFP    tracing;
+struct FTAMindication *fti;
+{
+    return FHookRequest (sd, tracing, fti);
+}
+
+
+/* user-defined tracing */
+
+int    FTraceHook (sd, event, fpdu, pe, rw)
+int    sd;
+char   *event,
+       *fpdu;
+PE     pe;
+int    rw;
+{
+    return FTraceHook (sd, event, fpdu, pe, rw);
+}
+
+
+/* return FTAM error code in string form */
+
+char   *FErrString (code)
+int    code;
+{
+    return FErrString (code);
+}
+
+
+/* free list of attributes */
+
+void   FAFREE (fa)
+struct FTAMattributes *fa;
+{
+    FAFREE (fa);
+}
+
+/*  isodocuments routines */
+
+
+int    setisodocument (f)
+int    f;
+{
+    return setisodocument (f);
+}
+
+
+int    endisodocument ()
+{
+    return endisodocument ();
+}
+
+
+struct isodocument *getisodocument ()
+{
+    return getisodocument ();
+}
+
+
+struct isodocument *getisodocumentbyentry (entry)
+char   *entry;
+{
+    return getisodocumentbyentry (entry);
+}
+
+
+struct isodocument *getisodocumentbytype (type)
+OID    type;
+{
+    return getisodocumentbytype (type);
+}
diff --git a/usr/src/contrib/isode/ftam/make b/usr/src/contrib/isode/ftam/make
new file mode 100644 (file)
index 0000000..5e1df8a
--- /dev/null
@@ -0,0 +1,7 @@
+: run this script through /bin/sh
+M=/bin/make
+if [ -f /usr/bin/make ]; then
+    M=/usr/bin/make
+fi
+
+exec $M MODULE=ftam TOPDIR=../ -f ../config/CONFIG.make -f Makefile ${1+"$@"}
diff --git a/usr/src/contrib/isode/ftam2/Makefile b/usr/src/contrib/isode/ftam2/Makefile
new file mode 100644 (file)
index 0000000..da3885c
--- /dev/null
@@ -0,0 +1,195 @@
+###############################################################################
+#   Instructions to Make, for compilation of ISODE FTAM2 processes
+###############################################################################
+
+###############################################################################
+#
+# $Header: /f/osi/ftam2/RCS/Makefile,v 7.7 91/02/22 09:23:35 mrose Interim $
+#
+#
+# $Log:        Makefile,v $
+# Revision 7.7  91/02/22  09:23:35  mrose
+# Interim 6.8
+# 
+# Revision 7.6  90/12/23  18:39:55  mrose
+# update
+# 
+# Revision 7.5  90/11/21  11:30:21  mrose
+# sun
+# 
+# Revision 7.4  90/10/17  14:39:13  mrose
+# update
+# 
+# Revision 7.3  90/07/27  08:44:39  mrose
+# update
+# 
+# Revision 7.2  90/07/01  21:03:05  mrose
+# pepsy
+# 
+# Revision 7.1  90/03/06  13:56:34  mrose
+# touch-up
+# 
+# Revision 7.0  89/11/23  21:54:13  mrose
+# Release 6.0
+# 
+###############################################################################
+
+###############################################################################
+#
+#                               NOTICE
+#
+#    Acquisition, use, and distribution of this module and related
+#    materials are subject to the restrictions of a license agreement.
+#    Consult the Preface in the User's Manual for the full terms of
+#    this agreement.
+#
+###############################################################################
+
+
+PEPYPATH=      -DPEPYPATH
+
+.SUFFIXES:     .py .c .o
+
+.c.o:;         $(CC) $(CFLAGS) -c $*.c
+
+
+LIBD   =       $(TOPDIR)libftam.a $(TOPDIR)libisode.a 
+LIBES  =       $(TOPDIR)libftam.a $(LIBISODE)
+LLIBS  =       $(TOPDIR)llib-lftam $(TOPDIR)llib-lisode
+CFILES =       ftamd.c ftamsystem.c ftamd-manage.c ftamd-select.c \
+                       ftamd-trans.c \
+               ftam.c ftamuser.c ftam-assoc.c ftam-dir.c ftam-get.c \
+                       ftam-glob.c ftam-ls.c ftam-mgmt.c ftam-put.c \
+               ftamsbr.c
+PYFILES        =       docs.py
+HFILES =       $(HDIR)ftam.h \
+               $(HDIR)acsap.h $(HDIR)psap2.h $(HDIR)psap.h $(HDIR)ssap.h \
+               $(HDIR)isoaddrs.h \
+               $(HDIR)manifest.h $(HDIR)general.h $(HDIR)config.h
+
+
+##################################################################
+# Here it is...
+##################################################################
+
+all:           ftamd ftam
+inst-all:      inst-ftamd inst-ftam manuals
+install:       inst-all clean
+lint:          l-ftamd l-ftam
+
+
+##################################################################
+# ftamd
+##################################################################
+
+inst-ftamd:    $(SBINDIR)iso.ftam
+
+$(SBINDIR)iso.ftam:    xftamd
+               -cp $@ ziso.ftam
+               -rm -f $@
+               cp xftamd $@
+               -@ls -gls $@
+               -@echo ""
+
+ftamd:         xftamd
+
+xftamd:                ftamd.o ftamsystem.o ftamd-manage.o ftamd-select.o \
+                       ftamd-trans.o ftamsbr.o DOCS_tables.o $(LIBD)
+               $(LDCC) $(LDFLAGS) -o $@ ftamd.o ftamsystem.o ftamd-manage.o \
+                       ftamd-select.o ftamd-trans.o ftamsbr.o DOCS_tables.o \
+                       $(LIBES) $(LSOCKET)
+
+l-ftamd:       DOCS_tables.c true
+               $(LINT) $(LFLAGS) ftamd.c ftamsystem.c ftamd-manage.c \
+                       ftamd-select.c ftamd-trans.c ftamsbr.c DOCS_tables.c \
+                       $(LLIBS) \
+                       | grep -v "warning: possible pointer alignment problem"
+
+ftamd.o:       ftamsystem.h ftamsbr.h DOCS-types.h $(HFILES)
+ftamsystem.o:  ftamsystem.h ftamsbr.h DOCS-types.h $(HFILES) $(HDIR)logger.h
+ftamd-manage.o:        ftamsystem.h ftamsbr.h DOCS-types.h $(HFILES)
+ftamd-select.o:        ftamsystem.h ftamsbr.h DOCS-types.h $(HFILES)
+ftamd-trans.o: ftamsystem.h ftamsbr.h DOCS-types.h $(HFILES) \
+                       $(HDIR)usr.dirent.h $(HDIR)sys.dirent.h
+
+
+##################################################################
+# ftam
+##################################################################
+
+inst-ftam:     $(BINDIR)ftam
+
+$(BINDIR)ftam: xftam
+               -cp $@ zxftam
+               -rm -f $@
+               cp xftam $@
+               -@ls -gls $@
+               -@echo ""
+
+ftam:          xftam
+
+xftam:         ftam.o ftamuser.o ftam-assoc.o ftam-dir.o ftam-get.o \
+                       ftam-glob.o ftam-ls.o ftam-mgmt.o ftam-put.o \
+                       ftamsbr.o DOCS_tables.o $(LIBD)
+               $(LDCC) $(LDFLAGS) -o $@ ftam.o ftamuser.o ftam-assoc.o \
+                       ftam-dir.o ftam-get.o ftam-glob.o ftam-ls.o \
+                       ftam-mgmt.o ftam-put.o ftamsbr.o DOCS_tables.o \
+                       $(LIBES) $(LSOCKET)
+
+l-ftam:                DOCS_tables.c true
+               $(LINT) $(LFLAGS) ftam.c ftamuser.c ftam-assoc.c ftam-dir.c \
+                       ftam-get.c ftam-glob.c ftam-ls.c ftam-mgmt.c \
+                       ftam-put.c ftamsbr.c DOCS_tables.c $(LLIBS) \
+                       | grep -v "warning: possible pointer alignment problem"
+
+ftam.o:                ftamuser.h ftamsbr.h DOCS-types.h $(HFILES) $(HDIR)tailor.h \
+               $(HDIR)logger.h
+ftamuser.o:    ftamuser.h ftamsbr.h DOCS-types.h $(HFILES) $(HDIR)tailor.h \
+               $(HDIR)logger.h
+ftam-assoc.o:  ftamuser.h ftamsbr.h DOCS-types.h $(HFILES)
+ftam-dir.o:    ftamuser.h ftamsbr.h DOCS-types.h $(HFILES)
+ftam-get.o:    ftamuser.h ftamsbr.h DOCS-types.h $(HFILES)
+ftam-glob.o:   ftamuser.h ftamsbr.h DOCS-types.h $(HFILES) \
+                       $(HDIR)usr.dirent.h $(HDIR)sys.dirent.h
+ftam-ls.o:     ftamuser.h ftamsbr.h DOCS-types.h $(HFILES)
+ftam-mgmt.o:   ftamuser.h ftamsbr.h DOCS-types.h $(HFILES)
+ftam-put.o:    ftamuser.h ftamsbr.h DOCS-types.h $(HFILES)
+
+
+##################################################################
+# ftamsbr/DOCS
+##################################################################
+
+ftamsbr.o:     ftamsbr.h DOCS-types.h $(HFILES)
+
+DOCS_tables.o: DOCS_tables.c DOCS-types.h 
+
+DOCS_tables.c DOCS-types.h: docs.py $(TOPDIR)pepsy/xpepsy
+               $(TOPDIR)pepsy/xpepsy -A -f -h -m docs.py
+
+
+##################################################################
+# manual pages
+##################################################################
+
+MANUALS        =       ftamd.8c ftam.1c ftamusers.5
+
+manuals:;      @$(UTILDIR)inst-man.sh $(MANOPTS) $(MANUALS)
+               -@echo ""
+
+
+##################################################################
+# clean
+##################################################################
+
+clean:;                rm -f *.ph *.o DOCS* x* z* _* core
+
+grind:;                iprint Makefile
+               tgrind -lc ftamsystem.h ftamuser.h ftamsbr.h $(CFILES)
+               tgrind -lpepy -d $(TOPDIR)pepy/grindefs ($PYFILES)
+               @echo $(MANUALS) | \
+                       tr " " "\012" | \
+                       sed -e "s%.*%itroff -man &%" | \
+                       sh -ve
+
+true:;
diff --git a/usr/src/contrib/isode/ftam2/docs.py b/usr/src/contrib/isode/ftam2/docs.py
new file mode 100644 (file)
index 0000000..38769d2
--- /dev/null
@@ -0,0 +1,118 @@
+-- documents.py - FTAM document definitions
+
+-- $Header: /f/osi/ftam2/RCS/docs.py,v 7.3 91/02/22 09:23:36 mrose Interim $
+--
+--
+-- $Log:       docs.py,v $
+-- Revision 7.3  91/02/22  09:23:36  mrose
+-- Interim 6.8
+-- 
+-- Revision 7.2  91/01/13  12:26:54  mrose
+-- NBS
+-- 
+-- Revision 7.1  90/11/05  13:29:44  mrose
+-- nist
+-- 
+-- Revision 7.0  89/11/23  21:54:14  mrose
+-- Release 6.0
+-- 
+
+--
+--                               NOTICE
+--
+--    Acquisition, use, and distribution of this module and related
+--    materials are subject to the restrictions of a license agreement.
+--    Consult the Preface in the User's Manual for the full terms of
+--    this agreement.
+--
+--
+
+
+DOCS DEFINITIONS ::=
+
+%{
+#ifndef        lint
+static char *rcsid = "$Header: /f/osi/ftam2/RCS/docs.py,v 7.3 91/02/22 09:23:36 mrose Interim $";
+#endif
+%}
+
+BEGIN
+
+-- FTAM-1: ISO FTAM unstructured text
+
+FTAM-1-Parameters ::=
+        SEQUENCE {
+            universal-class-number[0]
+                IMPLICIT INTEGER
+               OPTIONAL,
+
+            maximum-string-length[1]
+                IMPLICIT INTEGER
+               OPTIONAL,
+
+            string-significance[2]
+                IMPLICIT INTEGER {
+                   variable(0),
+                   fixed(1),
+                   not-significant(2)
+               }
+               OPTIONAL
+        }
+
+FTAM-1-Datatype1 ::=
+        CHOICE {
+           printable --* *--
+                PrintableString,
+
+           teletex --* *--
+                TeletexString,
+
+           videotex --* *--
+                VideotexString,
+
+           ia5 --* *--
+                IA5String,
+
+           graphic --* *--
+                GraphicString,
+
+           visible --* *--
+                VisibleString,
+
+           general --* *--
+                GeneralString
+        }
+
+
+-- FTAM-3: ISO FTAM unstructured binary
+
+FTAM-3-Parameters ::=
+        SEQUENCE {
+            maximum-string-length[1]
+                IMPLICIT INTEGER
+               OPTIONAL,
+
+           string-significanz --* string-significance *-- [2]
+                IMPLICIT INTEGER {
+                   variable(0),
+                   fixed(1),
+                   not-significant(2)
+               }
+               OPTIONAL
+        }
+
+FTAM-3-Datatype1 ::=
+        OCTET STRING
+
+
+-- NBS-9: NBS-9 FTAM file directory
+
+NBS-9-Parameters ::=
+    [0]
+        IMPLICIT --* ISO8571-FTAM *-- FTAM.Attribute-Names
+
+NBS-9-Datatype1 ::=
+    [PRIVATE 2]
+        --* ISO8571-FTAM *-- FTAM.Read-Attributes
+
+END
diff --git a/usr/src/contrib/isode/ftam2/ftam-assoc.c b/usr/src/contrib/isode/ftam2/ftam-assoc.c
new file mode 100644 (file)
index 0000000..d3ea2c8
--- /dev/null
@@ -0,0 +1,428 @@
+/* ftam-assoc.c - interactive initiator FTAM -- association management */
+
+#ifndef        lint
+static char *rcsid = "$Header: /f/osi/ftam2/RCS/ftam-assoc.c,v 7.7 91/02/22 09:23:37 mrose Interim $";
+#endif
+
+/* 
+ * $Header: /f/osi/ftam2/RCS/ftam-assoc.c,v 7.7 91/02/22 09:23:37 mrose Interim $
+ *
+ *
+ * $Log:       ftam-assoc.c,v $
+ * Revision 7.7  91/02/22  09:23:37  mrose
+ * Interim 6.8
+ * 
+ * Revision 7.6  91/01/07  12:41:46  mrose
+ * update
+ * 
+ * Revision 7.5  90/12/23  18:39:57  mrose
+ * update
+ * 
+ * Revision 7.4  90/12/11  10:52:53  mrose
+ * lock-and-load
+ * 
+ * Revision 7.3  90/07/09  14:37:10  mrose
+ * sync
+ * 
+ * Revision 7.2  89/12/01  13:56:06  mrose
+ * touch-up
+ * 
+ * Revision 7.1  89/11/30  23:51:50  mrose
+ * pa2str
+ * 
+ * Revision 7.0  89/11/23  21:54:15  mrose
+ * Release 6.0
+ * 
+ */
+
+/*
+ *                               NOTICE
+ *
+ *    Acquisition, use, and distribution of this module and related
+ *    materials are subject to the restrictions of a license agreement.
+ *    Consult the Preface in the User's Manual for the full terms of
+ *    this agreement.
+ *
+ */
+
+
+#include <stdio.h>
+#include "ftamuser.h"
+
+/* \f */
+
+static struct PSAPaddr vfs_bound;
+
+/* \f */
+
+int    f_open (vec)
+char  **vec;
+{
+    register int    i;
+    int     manage;
+    char    passwd[BUFSIZ];
+#ifndef        BRIDGE
+    char    buffer[BUFSIZ],
+            prompt[BUFSIZ];
+#endif
+    AEI            aei;
+    register struct vfsmap *vf;
+    register struct PSAPaddr   *pa;
+    struct FTAMcontentlist  fcs;
+    register struct FTAMcontentlist *fc = &fcs;
+    register struct FTAMcontent *fx;
+    struct FTAMconnect  ftcs;
+    register struct FTAMconnect *ftc = &ftcs;
+    struct FTAMindication   ftis;
+    register struct FTAMindication *fti = &ftis;
+
+    if (*++vec == NULL) {
+#ifdef BRIDGE
+       return NOTOK;
+#else
+       if (getline ("host: ", buffer) == NOTOK
+               || str2vecX (buffer, vec, 0, NULLIP, NULL, 0) < 1)
+           return OK;
+#endif
+    }
+
+    if (host)
+       free (host);
+    host = strdup (*vec);
+
+    if (*++vec == NULL) {
+#ifdef BRIDGE
+       return NOTOK;
+#else
+       if (user == NULL)
+           user = strdup (myuser ? myuser : "");
+       (void) sprintf (prompt, "user (%s:%s): ", host, user);
+       if (getline (prompt, buffer) == NOTOK)
+           return OK;
+       if (str2vec (buffer, vec) < 1)
+           *vec = user, user = NULL;
+#endif
+    }
+
+    if (user)
+       free (user);
+    user = strdup (*vec);
+
+    if (*++vec) {
+       if (account)
+           free (account);
+#ifdef BRIDGE
+       account = (**vec) ? strdup (*vec) : "";
+#else
+       account = strdup (*vec);
+#endif
+    }
+
+#ifdef BRIDGE
+    if (!strcmp (user, "anonymous") || !strcmp (user, "ANONYMOUS") ){
+       free (user);
+       user = strdup ("ANON");
+    }
+#endif
+
+    if (strcmp (user, "anon") == 0) {
+       free (user);
+       user = strdup ("ANON");
+    }
+
+#ifdef BRIDGE
+    if (strcmp (user, "ANON") && !*++vec)
+       return NOTOK;
+    else
+       (void) strcpy (passwd, *vec ? strdup(*vec) : "");
+#else
+    if (strcmp (user, "ANON")) {
+       (void) sprintf (prompt, "password (%s:%s): ", host, user);
+       (void) strcpy (passwd, getpassword (prompt));
+    }
+    else
+       (void) strcpy (passwd, myuser ? myuser : "");
+#endif
+
+#ifdef BRIDGE
+    if ((aei = _str2aei (host, "filestore", "iso ftam", 0, NULLCP, NULLCP))
+           == NULLAEI) {
+       advise (NULLCP, "unable to resolve service: %s", PY_pepy);
+#else
+    if (userdn && *userdn) {
+#ifdef DEBUG
+       static  int     once_only = 1;
+
+       if (once_only)
+           set_lookup_dase (1), once_only = 0;
+#endif
+       (void) sprintf (prompt, "DN-password (%s): ", userdn);
+       (void) strcpy (buffer, getpassword (prompt));
+    }
+    else
+       buffer[0] = NULL;
+           
+    if ((aei = _str2aei (host, storename, "iso ftam", ontty,
+                        userdn && *userdn ? userdn : NULLCP,
+                        buffer[0] ? buffer : NULLCP))
+           == NULLAEI) {
+       advise (NULLCP, "unable to resolve service: %s", PY_pepy);
+#endif
+       return NOTOK;
+    }
+    if ((pa = aei2addr (aei)) == NULLPA) {
+       advise (NULLCP, "address translation failed");
+       return NOTOK;
+    }
+
+    manage = 0;
+    fqos = FQOS_NORECOVERY;
+    class = FCLASS_TM | FCLASS_TRANSFER | FCLASS_MANAGE;
+    units |=  FUNIT_READ | FUNIT_WRITE | FUNIT_LIMITED | FUNIT_ENHANCED
+               | FUNIT_GROUPING;
+    attrs = FATTR_STORAGE;
+    fc -> fc_ncontent = 0;
+    for (vf = vfs; vf -> vf_entry; vf++)
+       if (vf -> vf_oid)
+           fc -> fc_contents[fc -> fc_ncontent++].fc_dtn = vf -> vf_oid;
+
+#ifndef        BRIDGE
+    if (verbose) {
+       fprintf (stderr, "%s... ", host);
+       (void) fflush (stderr);
+    }
+#endif
+    if (FInitializeRequest (NULLOID, NULLAEI, aei, NULLPA, pa, manage, class,
+                           units, attrs, NULLPE, fqos, fc,
+                           *user ? user : NULLCP, account,
+                           passwd[0] ? passwd : NULLCP, strlen (passwd),
+                           &myqos, trace ? FTraceHook : NULLIFP, ftc, fti)
+           == NOTOK) {
+#ifndef        BRIDGE
+       if (verbose)
+           fprintf (stderr, "loses big\n");
+#endif
+       ftam_advise (&fti -> fti_abort, "F-INITIALIZE.REQUEST");
+
+       return NOTOK;
+    }
+
+    switch (ftc -> ftc_state) {
+       case FSTATE_SUCCESS: 
+#ifndef        BRIDGE
+           if (verbose)
+               fprintf (stderr, "connected\n");
+#endif
+#ifdef DEBUG
+           if (debug)
+               advise (NULLCP,
+                       "responding AE title: %s, responding PSAP address: %s",
+                       sprintaei (&ftc -> ftc_respondtitle),
+                       paddr2str (&ftc -> ftc_respondaddr, NULLNA));
+#endif
+           vfs_bound = ftc -> ftc_respondaddr;         /* struct copy */
+
+           ftamfd = ftc -> ftc_sd;
+           context = ftc -> ftc_context, ftc -> ftc_context = NULLOID;
+           fqos = ftc -> ftc_fqos;
+           class = ftc -> ftc_class;
+           units = ftc -> ftc_units;
+           attrs = ftc -> ftc_attrs;
+
+           for (fx = ftc -> ftc_contents.fc_contents,
+                       i = ftc -> ftc_contents.fc_ncontent - 1;
+                   i >= 0;
+                   fx++, i--) {
+               if (fx -> fc_result != PC_ACCEPT)
+                   continue;
+
+               for (vf = vfs; vf -> vf_entry; vf++)
+                   if (oid_cmp (vf -> vf_oid, fx -> fc_dtn) == 0) {
+                       vf -> vf_flags |= VF_OK;
+                       vf -> vf_id = fx -> fc_id;
+                       break;
+                   }
+           }
+           for (vf = vfs; vf -> vf_entry; vf++)
+               if (vf -> vf_oid
+                       && !(vf -> vf_flags & VF_OK)
+                       && (vf -> vf_flags & VF_WARN))
+                   advise (NULLCP,
+                       "warning: virtual filestore has no support for %ss",
+                       vf -> vf_text);
+
+           vf = &vfs[VFS_UBF];
+           if (vf -> vf_oid == NULLOID || !(vf -> vf_flags & VF_OK))
+               advise (NULLCP,
+                       "%s files not negotiated, suggest you quit now!",
+                       vf -> vf_entry);
+
+           if ((vf = &vfs[tmode]) != &vfs[VFS_DEF]
+                   && (vf -> vf_oid == NULLOID
+                           || !(vf -> vf_flags & VF_OK))) {
+               advise (NULLCP, "negotiation prevents transfer of %ss",
+                       vf -> vf_text);
+
+               tmode = VFS_DEF;
+           }
+
+           for (vf = vfs; vf -> vf_entry; vf++)    /* prime the pump */
+               if (vf -> vf_peek)
+                   (void) (*vf -> vf_peek) (vf, NOTOK, NULLCP,
+                                            (struct stat *) 0, ftamfd);
+
+           if ((fadusize = ftc -> ftc_ssdusize) < 0)
+               fadusize = 0;
+           break;
+
+       default: 
+#ifndef        BRIDGE
+           if (verbose)
+               fprintf (stderr, "failed\n");
+#endif
+           break;
+    }
+    ftam_diag (ftc -> ftc_diags, ftc -> ftc_ndiag,
+               ftamfd != NOTOK || fti -> fti_abort.fta_peer,
+               ftc -> ftc_action);
+
+    FTCFREE (ftc);
+
+    if (ftamfd != NOTOK) {
+       vec[0] = "sd";
+       vec[1] = NULLCP;
+
+       (void) f_cd (vec);
+    }
+
+    return (ftamfd != NOTOK ? OK : NOTOK);
+}
+
+/* \f */
+
+/* ARGSUSED */
+
+int    f_close (vec)
+char  **vec;
+{
+    struct FTAMrelease  ftrs;
+    register struct FTAMrelease *ftr = &ftrs;
+    struct FTAMindication   ftis;
+    register struct FTAMindication *fti = &ftis;
+
+#ifdef BRIDGE
+    if (ftamfd == NOTOK)
+       return OK;
+#endif
+
+    if (FTerminateRequest (ftamfd, NULLPE, ftr, fti) == NOTOK) {
+       ftam_advise (&fti -> fti_abort, "F-TERMINATE.REQUEST");
+
+       (void) FUAbortRequest (ftamfd, FACTION_PERM,
+                   (struct FTAMdiagnostic *) 0, 0, &ftis);
+       ftamfd = NOTOK;
+
+       return NOTOK;
+    }
+
+    ftam_chrg (&ftr -> ftr_charges);
+
+    FTRFREE (ftr);
+
+    ftamfd = NOTOK;
+    if (rcwd) {
+       free (rcwd);
+       rcwd = NULL;
+    }
+
+    return OK;
+}
+
+/* \f */
+
+int    f_quit (vec)
+char  **vec;
+{
+    if (ftamfd != NOTOK)
+       (void) f_close (vec);
+
+    return DONE;
+}
+
+/* \f */
+
+#define        AMASK   "\020\01STORAGE\02SECURITY\03PRIVATE"
+
+
+/* ARGSUSED */
+
+#ifndef        BRIDGE
+int    f_status (vec)
+char  **vec;
+{
+    int            hit;
+    register struct vfsmap *vf;
+
+    printf ("associated with virtual filestore on \"%s\"\n  at %s\n",
+           host, pa2str (&vfs_bound));
+    printf ("  as user \"%s\"", user);
+    if (account)
+       printf (" using account \"%s\"", account);
+    printf ("\n");
+
+    printf ("application-context: %s\nservice class: ", oid2ode (context));
+    switch (class) {
+       case FCLASS_TRANSFER: 
+           printf ("transfer");
+           break;
+
+       case FCLASS_ACCESS: 
+           printf ("access");
+           break;
+
+       case FCLASS_MANAGE: 
+           printf ("management");
+           break;
+
+       case FCLASS_TM: 
+           printf ("transfer-and-management");
+           break;
+
+       case FCLASS_UNCONS: 
+           printf ("unconstrained");
+           break;
+
+       default: 
+           printf ("%d", class);
+    }
+    printf (", ftam-QoS: ");
+    switch (fqos) {
+       case FQOS_NORECOVERY: 
+           printf ("no-recovery");
+           break;
+
+       default: 
+           printf ("class-%d-recovery", fqos);
+           break;
+    }
+
+    printf ("\nfunctional units: %s\n", sprintb (units, UMASK));
+
+    printf ("attribute groups: %s\n", sprintb (attrs, AMASK));
+
+    printf ("document types:");
+    hit = 0;
+    for (vf = vfs; vf -> vf_entry; vf++)
+       if (vf -> vf_oid && (vf -> vf_flags & VF_OK)) {
+           printf ("\n  %-16.16s %s (%s)", sprintoid (vf -> vf_oid),
+                   vf -> vf_text, vf -> vf_entry);
+           hit = 1;
+       }
+    if (!hit)
+       printf (" none negotiated!");
+
+    printf ("\nestimated integral FADU size: %d\n", fadusize);
+
+    return OK;
+}
+#endif
diff --git a/usr/src/contrib/isode/ftam2/ftam-dir.c b/usr/src/contrib/isode/ftam2/ftam-dir.c
new file mode 100644 (file)
index 0000000..608c647
--- /dev/null
@@ -0,0 +1,312 @@
+/* ftam-dir.c - interactive initiator FTAM -- directory management */
+
+#ifndef        lint
+static char *rcsid = "$Header: /f/osi/ftam2/RCS/ftam-dir.c,v 7.1 91/02/22 09:23:39 mrose Interim $";
+#endif
+
+/* 
+ * $Header: /f/osi/ftam2/RCS/ftam-dir.c,v 7.1 91/02/22 09:23:39 mrose Interim $
+ *
+ *
+ * $Log:       ftam-dir.c,v $
+ * Revision 7.1  91/02/22  09:23:39  mrose
+ * Interim 6.8
+ * 
+ * Revision 7.0  89/11/23  21:54:16  mrose
+ * Release 6.0
+ * 
+ */
+
+/*
+ *                               NOTICE
+ *
+ *    Acquisition, use, and distribution of this module and related
+ *    materials are subject to the restrictions of a license agreement.
+ *    Consult the Preface in the User's Manual for the full terms of
+ *    this agreement.
+ *
+ */
+
+
+#include <stdio.h>
+#include "ftamuser.h"
+
+/* \f   DATA */
+
+#ifndef        BRIDGE
+static char *lcwd = NULL;
+#endif
+
+
+int    fdffnx ();
+
+
+#ifndef        SYS5
+char   *getcwd ();
+#endif
+
+/* \f */
+
+#ifndef        BRIDGE
+int    f_lcd (vec)
+char  **vec;
+{
+    char   *cp,
+            cwd[MAXPATHLEN];
+
+    if (*++vec == NULL)
+       cp = strdup (myhome);
+    else
+       if ((cp = xglob1val (*vec, 0)) == NULL)
+           return OK;
+
+    if (chdir (cp) == NOTOK)
+       advise (cp, "unable to change to");
+    else {
+       if (lcwd)
+           free (lcwd);
+
+       if (getcwd (cwd, MAXPATHLEN) && strcmp (cp, cwd))
+#ifdef apollo
+           printf ("/%s\n", lcwd = strdup (cwd));      /* network root */
+#else
+           printf ("%s\n", lcwd = strdup (cwd));
+#endif
+       else
+           lcwd = cp, cp = NULL;
+    }
+
+    if (cp)
+       free (cp);
+
+    return OK;
+}
+#endif
+
+/* \f */
+
+int    f_cd (vec)
+char  **vec;
+{
+    int            silent;
+    char   *cp,
+           cwd[MAXPATHLEN];
+
+    silent = strcmp (*vec, "sd") == 0;
+
+    cp = *++vec;
+
+    switch (realstore) {
+       case RFS_UNKNOWN: 
+           if (!silent)
+               advise (NULLCP, rs_unknown);
+#ifndef        BRIDGE
+           else
+               if (rcwd) {
+                   free (rcwd);
+                   rcwd = NULL;
+               }
+#endif
+           return OK;
+
+       case RFS_UNIX: 
+           break;
+
+       default: 
+           if (!silent)
+               advise (NULLCP, "%s", rs_support);
+           return OK;
+    }
+
+    if (cp) {
+       if ((cp = xglob1val (cp, 1)) == NULL
+               || isdir (cp, cwd, silent) == NOTOK)
+           return OK;
+
+       if (cwd[0]) {
+           free (cp);
+           cp = strdup (cwd);
+       }
+    }
+
+    if (rcwd)
+       free (rcwd);
+    rcwd = cp;
+
+    return OK;
+}
+
+/* \f */
+
+int    isdir (dir, dp, silent)
+char   *dir,
+       *dp;
+int    silent;
+{
+    int            result;
+    struct FTAMgroup    ftgs;
+    register struct FTAMgroup  *ftg = &ftgs;
+    struct FTAMindication   ftis;
+    register struct FTAMindication *fti = &ftis;
+    struct vfsmap *vf = &vfs[VFS_FDF];
+
+    result = OK;
+    if (dp)
+       *dp = NULL;
+
+    if (!vf -> vf_oid || !(units & FUNIT_LIMITED))
+       return result;
+
+    bzero ((char *) ftg, sizeof *ftg);
+    ftg -> ftg_flags |= FTG_BEGIN | FTG_END;
+    ftg -> ftg_threshold = 0;
+
+    ftg -> ftg_flags |= FTG_SELECT;
+    {
+       register struct FTAMselect *ftse = &ftg -> ftg_select;
+       register struct FTAMattributes *fa = &ftse -> ftse_attrs;
+
+       fa -> fa_present = FA_FILENAME;
+       fa -> fa_nfile = 0;
+       fa -> fa_files[fa -> fa_nfile++] = dir;
+
+       ftse -> ftse_access = FA_PERM_READATTR;
+       FCINIT (&ftse -> ftse_conctl);
+    }
+    ftg -> ftg_threshold++;
+
+    ftg -> ftg_flags |= FTG_RDATTR;
+    {
+       register struct FTAMreadattr   *ftra = &ftg -> ftg_readattr;
+
+       ftra -> ftra_attrnames = FA_FILENAME | FA_CONTENTS;
+    }
+    ftg -> ftg_threshold++;
+
+    ftg -> ftg_flags |= FTG_DESELECT;
+    ftg -> ftg_threshold++;
+
+    if (FManageRequest (ftamfd, ftg, fti) == NOTOK) {
+       if (!silent)
+           ftam_advise (&fti -> fti_abort, "F-MANAGE.REQUEST");
+       return NOTOK;
+    }
+
+    ftg = &fti -> fti_group;
+
+    if (ftg -> ftg_flags & FTG_SELECT) {
+       register struct FTAMselect *ftse = &ftg -> ftg_select;
+
+       if (!silent)
+           ftam_diag (ftse -> ftse_diags, ftse -> ftse_ndiag, 1,
+                       ftse -> ftse_action);
+       if (ftse -> ftse_state != FSTATE_SUCCESS)
+           goto you_lose;
+    }
+
+    if (ftg -> ftg_flags & FTG_RDATTR) {
+       register struct FTAMreadattr   *ftra = &ftg -> ftg_readattr;
+       register struct FTAMattributes *fa = &ftra -> ftra_attrs;
+
+       if (!silent)
+           ftam_diag (ftra -> ftra_diags, ftra -> ftra_ndiag, 1,
+               ftra -> ftra_action);
+       if (ftra -> ftra_action != FACTION_SUCCESS)
+           fa -> fa_present = 0;
+
+       if ((fa -> fa_present & FA_FILENAME) && fa -> fa_nfile == 1 && dp)
+           (void) strcpy (dp, fa -> fa_files[0]);
+
+       if (fa -> fa_present & FA_CONTENTS)
+           if (oid_cmp (vf -> vf_oid, fa -> fa_contents)) {
+               if (!silent)
+                   advise (NULLCP, "not a directory");
+               goto you_lose;
+           }
+           else
+               result = DONE;
+    }
+
+    if (ftg -> ftg_flags & FTG_DESELECT) {
+       register struct FTAMdeselect   *ftde = &ftg -> ftg_deselect;
+
+       if (!silent) {
+           ftam_diag (ftde -> ftde_diags, ftde -> ftde_ndiag, 1,
+               ftde -> ftde_action);
+           ftam_chrg (&ftde -> ftde_charges);
+       }
+    }
+
+    FTGFREE (ftg);
+    return result;
+
+you_lose: ;
+    FTGFREE (ftg);
+    return NOTOK;
+}
+
+/* \f */
+
+/* ARGSUSED */
+
+int    f_pwd (vec)
+char  **vec;
+{
+#ifndef        BRIDGE
+    char    cwd[MAXPATHLEN];
+
+    if (lcwd == NULL)
+       lcwd = strdup (getcwd (cwd, MAXPATHLEN) ? cwd : ".");
+#ifdef apollo
+    printf ("local directory: /%s\n", lcwd);   /* network root */
+#else
+    printf ("local directory: %s\n", lcwd);
+#endif
+#endif
+
+    if (rcwd)
+#ifndef        BRIDGE
+       printf ("virtual filestore directory: %s\n", rcwd);
+#else
+       (void) sprintf (ftam_error, "virtual filestore directory: %s\n", rcwd);
+#endif
+
+    return OK;
+}
+
+/* \f */
+
+char   *str2file (s)
+char   *s;
+{
+    register char  *bp;
+    static int  i = 0;
+    static char buffer1[BUFSIZ],
+                buffer2[BUFSIZ];
+
+    if (!rcwd)
+       return s;
+
+    bp = (i++ % 2) ? buffer1 : buffer2;
+
+    switch (realstore) {
+       case RFS_UNIX:
+           if (*s == '/' || *s == '~')
+               return s;
+
+#ifdef apollo
+            if (strcmp (rcwd, "/") == 0 || strcmp (rcwd, "//") == 0)
+               (void) sprintf (bp, "%s%s", rcwd, s);
+            else
+#endif                
+           (void) sprintf (bp, "%s/%s", rcwd, s);
+           break;
+
+#ifdef BRIDGE
+       default:
+           return s;
+#endif
+    }
+
+    return bp;
+}
diff --git a/usr/src/contrib/isode/ftam2/ftam-get.c b/usr/src/contrib/isode/ftam2/ftam-get.c
new file mode 100644 (file)
index 0000000..8a06ee1
--- /dev/null
@@ -0,0 +1,968 @@
+/* ftam-get.c - interactive initiator FTAM -- "get" */
+
+#ifndef        lint
+static char *rcsid = "$Header: /f/osi/ftam2/RCS/ftam-get.c,v 7.6 91/02/22 09:23:40 mrose Interim $";
+#endif
+
+/* 
+ * $Header: /f/osi/ftam2/RCS/ftam-get.c,v 7.6 91/02/22 09:23:40 mrose Interim $
+ *
+ *
+ * $Log:       ftam-get.c,v $
+ * Revision 7.6  91/02/22  09:23:40  mrose
+ * Interim 6.8
+ * 
+ * Revision 7.5  90/12/23  18:39:59  mrose
+ * update
+ * 
+ * Revision 7.4  90/11/21  11:30:23  mrose
+ * sun
+ * 
+ * Revision 7.3  90/09/07  11:13:59  mrose
+ * update
+ * 
+ * Revision 7.2  90/07/01  21:03:08  mrose
+ * pepsy
+ * 
+ * Revision 7.1  90/01/11  23:48:39  mrose
+ * lint
+ * 
+ * Revision 7.0  89/11/23  21:54:17  mrose
+ * Release 6.0
+ * 
+ */
+
+/*
+ *                               NOTICE
+ *
+ *    Acquisition, use, and distribution of this module and related
+ *    materials are subject to the restrictions of a license agreement.
+ *    Consult the Preface in the User's Manual for the full terms of
+ *    this agreement.
+ *
+ */
+
+
+#include <errno.h>
+#include <stdio.h>
+#include "ftamuser.h"
+
+/* \f */
+
+static int effector;
+
+int    ubffnx ();
+struct vfsmap *findvf ();
+
+/* \f */
+
+int    f_get (vec)
+char  **vec;
+{
+#ifndef        BRIDGE
+    int     sglobbed;
+    register char  *bp;
+    register char  *dst,
+                  **gp,
+                  **src;
+    char   *freedst = NULL,
+           buffer[BUFSIZ];
+    struct stat st;
+#endif
+    struct FADUidentity faduids;
+    register struct FADUidentity   *faduid = &faduids;
+    struct vfsmap  *vf = &vfs[tmode];
+
+    if (vf == &vfs[VFS_DEF]
+           && (!(units & FUNIT_LIMITED)
+                   || (class != FCLASS_MANAGE && class != FCLASS_TM))) {
+       advise (NULLCP,
+               "unable to use \"default\" document type on this association");
+       return OK;
+    }
+
+#ifdef BRIDGE
+    if (*++vec == NULL)
+       return NOTOK;
+#else
+    if (*++vec == NULL) {
+       if (getline ("source: ", buffer) == NOTOK || str2vec (buffer, vec) < 1)
+           return OK;
+       dst = NULL;
+    }
+    else {
+       register char **ap;
+
+       for (ap = vec; *ap; ap++)
+           continue;
+       if (--ap != vec)
+           dst = *ap, *ap = NULL;
+       else
+           dst = NULL;
+    }
+    if (!(src = xglob (vec, 1)))
+       return OK;
+    sglobbed = xglobbed;       
+
+    if (dst == NULL) {
+       if (getline ("destination: ", buffer) == NOTOK) {
+           blkfree (src);
+           return OK;
+       }
+       switch (str2vec (buffer, vec)) {
+           case 0:
+               break;
+
+           case 1:
+               dst = *vec;
+               break;
+
+           default:
+               advise (NULLCP, "too many destinations");
+               goto out;
+       }
+    }
+    if (dst && !(dst = freedst = xglob1val (dst, 0)))
+       goto out;
+#endif
+
+    faduid -> fa_type = FA_FIRSTLAST;
+    faduid -> fa_firstlast = FA_FIRST;
+
+#ifdef BRIDGE
+    return getvf (*vec, *vec, faduid, vf, ubffnx);
+#else
+    if (src[1] == NULL) {
+       if (interrupted)
+           goto out;
+
+       if (dst == NULL) {
+           switch (realstore) {
+               case RFS_UNIX: 
+                   if (dst = rindex (*src, '/'))
+                       dst++;
+                   if (dst == NULL || *dst == NULL)
+                       dst = *src;
+                   break;
+
+               default: 
+                   dst = *src;
+                   break;
+           }
+
+ask_it: ;
+           if (query)
+               switch (ask ("get %s %s", *src, dst)) {
+                   case NOTOK:
+                       goto out;
+
+                   case OK:
+                   default:
+                       break;
+
+                   case DONE:
+                       goto out;
+               }
+       }
+       else
+           if (stat (dst, &st) != NOTOK
+                   && (st.st_mode & S_IFMT) == S_IFDIR) {
+#ifdef apollo
+                if (*dst == '/')
+                   (void) sprintf (bp = buffer, "%s", dst);
+                else
+#endif
+               (void) sprintf (bp = buffer, "%s/", dst);
+               bp += strlen (bp);
+               switch (realstore) {
+                   case RFS_UNIX:
+                       if (dst = rindex (*src, '/'))
+                           dst++;
+                       if (dst == NULL || *dst == NULL)
+                           dst = *src;
+                       break;
+
+                   default:
+                       break;
+               }
+               (void) strcpy (bp, dst);
+               dst = buffer;
+               goto ask_it;
+           }
+
+       if (check_get (dst) != NOTOK)
+           (void) getvf (*src, dst, faduid, vf, ubffnx);
+       goto out;
+    }
+
+    switch (realstore) {
+       case RFS_UNKNOWN:
+           advise (NULLCP, "%s", rs_unknown);
+           goto out;
+
+       case RFS_UNIX:
+#ifdef apollo
+            if (dst && dst[strlen (dst) - 1] == '/')
+               (void) sprintf (bp = buffer, "%s", dst);
+            else
+#endif
+           (void) sprintf (bp = buffer, "%s/", dst ? dst : ".");
+           bp += strlen (bp);
+           break;
+
+       default:
+           advise (NULLCP, "%s", rs_support);
+           goto out;
+    }
+
+    if (stat (buffer, &st) == NOTOK) {
+       advise (dst, "unable to stat");
+       goto out;
+    }
+    if ((st.st_mode & S_IFMT) != S_IFDIR) {
+       advise (NULLCP, "%s: not a directory");
+       goto out;
+    }
+
+    for (gp = src; *gp && !interrupted; gp++) {
+       switch (realstore) {
+           case RFS_UNIX:
+               if (dst = rindex (*gp, '/'))
+                   dst++;
+               if (dst == NULL || *dst == NULL)
+                   dst = *gp;
+               break;
+
+           default:
+               dst = *gp;
+               break;
+       }
+       (void) strcpy (bp, dst);
+       dst = buffer;
+
+       if (sglobbed) {
+           if (query)
+               switch (ask ("get %s %s", *gp, dst)) {
+                   case NOTOK:
+                       continue;
+
+                   case OK:
+                   default:
+                       break;
+
+                   case DONE:
+                       goto out;
+               }
+           else
+               advise (NULLCP, "get %s %s", *gp, dst);
+       }
+
+       if (check_get (dst) == NOTOK)
+           break;
+       (void) getvf (*gp, dst, faduid, vf, ubffnx);
+
+       if (ftamfd == NOTOK)
+           break;
+    }
+
+out: ;
+    blkfree (src);
+    if (freedst)
+       free (freedst);
+
+    return OK;
+#endif
+}
+
+/* \f */
+
+#ifndef        BRIDGE
+static int  check_get (dst)
+char   *dst;
+{
+    int            result;
+    register char  *cp;
+
+    if ((result = access (dst, W_OK)) == NOTOK && errno == ENOENT)
+       if (cp = rindex (dst, '/')) {
+           *cp = NULL;
+           result = access (*dst ? dst : "/", W_OK);
+           *cp = '/';
+       }
+       else
+           result = access (".", W_OK);
+    if (result == OK)
+       return result;
+
+    advise (dst, "unable to write");
+
+    return result;
+}
+#endif
+
+/* \f */
+
+int    getvf (src, dst, faduid, vf, wfnx)
+char   *src,
+       *dst;
+register struct FADUidentity *faduid;
+register struct vfsmap *vf;
+IFP    wfnx;
+{
+    int            fd,
+           result;
+#ifdef BRIDGE
+    int     ftp_result;
+#endif
+    PE     param;
+    struct FTAMgroup    ftgs;
+    register struct FTAMgroup  *ftg = &ftgs;
+    struct FTAMindication   ftis;
+    register struct FTAMindication *fti = &ftis;
+    register struct FTAMabort *fta = &fti -> fti_abort;
+
+    if (vf == &vfs[VFS_DEF]) {
+       if (!(vf = findvf (src))) {
+           vf = &vfs[VFS_UBF];
+           advise (NULLCP,
+               "unable to determine document type associated with %s", src);
+           /* most likely reason: the file isn't there... */
+
+           if (vf -> vf_oid == NULLOID || !(vf -> vf_flags & VF_OK))
+               return NOTOK;
+           advise (NULLCP, "proposing %s transfer", vf -> vf_text);
+       }
+       else
+           if (vf == &vfs[VFS_FDF]) {
+               advise (NULLCP, "%s is a %s", src, vf -> vf_text);
+               return NOTOK;
+           }
+    }
+    else
+       if (vf -> vf_oid == NULLOID || !(vf -> vf_flags & VF_OK)) {
+           advise (NULLCP, "no support for %ss", vf -> vf_text);
+           return NOTOK;
+       }
+
+    bzero ((char *) ftg, sizeof *ftg);
+    ftg -> ftg_flags |= FTG_BEGIN | FTG_END;
+    ftg -> ftg_threshold = 0;
+
+    ftg -> ftg_flags |= FTG_SELECT;
+    {
+       register struct FTAMselect *ftse = &ftg -> ftg_select;
+       register struct FTAMattributes *fa = &ftse -> ftse_attrs;
+
+       fa -> fa_present = FA_FILENAME;
+       fa -> fa_nfile = 0;
+       fa -> fa_files[fa -> fa_nfile++] = src;
+
+       ftse -> ftse_access = FA_PERM_READ;
+       FCINIT (&ftse -> ftse_conctl);
+    }
+    ftg -> ftg_threshold++;
+
+    param = NULLPE;
+
+    ftg -> ftg_flags |= FTG_OPEN;
+    {
+       register struct FTAMopen *ftop = &ftg -> ftg_open;
+
+       ftop -> ftop_mode = FA_PERM_READ;
+       ftop -> ftop_contents = vf -> vf_oid;
+       if (vf -> vf_parameter) {
+           if (enc_f (vf -> vf_number, &_ZDOCS_mod, &param, 1, 0, NULLCP,
+                     vf -> vf_parameter) == NOTOK) {
+               advise (NULLCP, "unable to build document type parameter: %s",
+                       PY_pepy);
+               return NOTOK;
+           }
+           ftop -> ftop_parameter = param;
+       }       
+       FCINIT (&ftop -> ftop_conctl);
+       if (concurrency)
+           ftop -> ftop_conctl.fc_readlock = FLOCK_SHARED;
+    }
+    ftg -> ftg_threshold++;
+
+    result = FBulkBeginRequest (ftamfd, ftg, fti);
+
+    if (param)
+       pe_free (param);
+
+    if (result == NOTOK) {
+       ftam_advise (&fti -> fti_abort, "F-BULK-BEGIN.REQUEST");
+       return NOTOK;
+    }
+
+    ftg = &fti -> fti_group;
+
+    if (ftg -> ftg_flags & FTG_SELECT) {
+       register struct FTAMselect *ftse = &ftg -> ftg_select;
+
+       ftam_diag (ftse -> ftse_diags, ftse -> ftse_ndiag, 1,
+               ftse -> ftse_action);
+       if (ftse -> ftse_state != FSTATE_SUCCESS)
+           goto you_lose;
+    }
+
+    if (ftg -> ftg_flags & FTG_OPEN) {
+       register struct FTAMopen *ftop = &ftg -> ftg_open;
+
+       ftam_diag (ftop -> ftop_diags, ftop -> ftop_ndiag, 1,
+               ftop -> ftop_action);
+       if (ftop -> ftop_state != FSTATE_SUCCESS)
+           goto you_lose;
+
+       for (myvf = vfs; myvf -> vf_entry; myvf++)
+           if (oid_cmp (myvf -> vf_oid, ftop -> ftop_contents) == 0)
+               break;
+       switch (myvf - vfs) {
+           case VFS_UBF:
+           case VFS_UTF:
+               effector = 1;
+               if (ftop -> ftop_parameter && myvf -> vf_number >= 0) {
+                   caddr_t parm = NULL;
+
+                   if (dec_f (myvf -> vf_number, &_ZDOCS_mod,
+                             ftop -> ftop_parameter, 1, NULLIP, NULLVP,
+                              (char **) &parm) == NOTOK)
+                       advise (NULLCP,
+                               "unable to parse document type parameter: %s",
+                               PY_pepy);
+                   else
+                       switch (myvf - vfs) {
+                           case VFS_UTF:
+                               {
+                                   PElementID  id;
+                                   register struct type_DOCS_FTAM__1__Parameters *p1 =
+                                       (struct type_DOCS_FTAM__1__Parameters *)
+                                                       parm;
+
+                                   if (p1 -> optionals
+                                           & opt_DOCS_FTAM__1__Parameters_universal__class__number)
+                                       id = (PElementID)
+                                               p1 -> universal__class__number;
+                                   else
+                                       id = PE_DEFN_GFXS;
+                                   switch (id) {
+                                       case PE_DEFN_GFXS:
+                                           if (getenv ("HP-FTAM")) {
+                                               effector = 1;
+                                               break;
+                                           }   /* else fall... */
+                                       case PE_DEFN_PRTS:
+                                       case PE_DEFN_VISS:
+                                           effector = 0;
+                                           break;
+
+                                       case PE_DEFN_T61S:
+                                       case PE_DEFN_VTXS:
+                                       case PE_DEFN_IA5S:
+                                       case PE_DEFN_GENS:
+                                           effector = 1;
+                                           break;
+
+                                       default:
+                                           break;
+                                   }
+                               }
+                               break;
+
+                           case VFS_UBF:
+                           default:
+                               break;
+                       }
+                   if (parm)
+                       (void) fre_obj (parm,
+                                       _ZDOCS_mod.md_dtab[myvf -> vf_number],
+                                       &_ZDOCS_mod, 1);
+               }
+               if (debug)
+                   advise (NULLCP, "effector=%d", effector);
+               /* and fall... */
+           case VFS_FDF:
+               if (myvf != vf || watch) {
+                   advise (NULLCP, "%s transfer", myvf -> vf_text);
+                   vf = myvf;
+               }
+               break;
+
+           default:
+               vf = &vfs[VFS_UBF];
+               advise (NULLCP, "document type mismatch; assuming %s (%s)",
+                               vf -> vf_text, vf -> vf_entry);
+               break;
+       }
+    }
+    myvf = vf;
+
+    FTGFREE (ftg);
+
+    if (FReadWriteRequest (ftamfd, FA_OPS_READ, faduid, myvf -> vf_context,
+               NOTOK, 0, fti) == NOTOK) {
+       ftam_advise (fta, "F-READWRITE.REQUEST");
+       return NOTOK;
+    }
+
+    if (dst) {
+#ifdef BRIDGE
+       if ((fd = dataconn(dst)) == NOTOK) {
+#else
+       if ((fd = open (dst, O_WRONLY | O_CREAT | O_TRUNC, 0666)) == NOTOK) {
+#endif
+           struct FTAMdiagnostic   diags[NFDIAG];
+           register struct FTAMdiagnostic *dp = diags;
+
+           advise (dst, "unable to write");
+#ifdef BRIDGE
+           ftp_result = DONE;
+#endif
+
+           dp -> ftd_type = DIAG_PERM;
+           dp -> ftd_identifier = FS_ACC_LCL;
+           dp -> ftd_observer = dp -> ftd_source = EREF_IFSU;
+           dp -> ftd_delay = DIAG_NODELAY;
+           (void) sprintf (dp -> ftd_data, "unable to write %s: %s",
+                   dst, sys_errname (errno));
+           dp -> ftd_cc = strlen (dp -> ftd_data);
+           dp++;
+
+           if (FCancelRequest (ftamfd, FACTION_PERM, NULLPE, diags,
+                               dp - diags, fti) == NOTOK) {
+               ftam_advise (fta, "F-CANCEL.REQUEST");
+               if (fd != NOTOK)
+                   (void) close (fd);
+               return NOTOK;
+           }
+
+           if (fti -> fti_type == FTI_CANCEL) {
+               register struct FTAMcancel *ftcn = &fti -> fti_cancel;
+
+               ftam_diag (ftcn -> ftcn_diags, ftcn -> ftcn_ndiag, 1,
+                       ftcn -> ftcn_action);
+               FTCNFREE (ftcn);
+           }
+
+           goto done_transfer;
+       }
+    }
+    else
+       fd = NOTOK;
+
+    if (fd != NOTOK)
+       (*wfnx) (fd, (struct PSAPdata *) 0, OK);
+
+    result = getloop (fd, dst, wfnx);
+
+    if (fd != NOTOK) {
+       (*wfnx) (fd, (struct PSAPdata *) 0, DONE);
+       (void) close (fd);
+    }
+    
+    switch (result) {
+       case NOTOK: 
+           return NOTOK;
+
+       case OK: 
+       default: 
+           break;
+
+       case DONE: 
+           goto done_transfer;
+    }
+
+    if (FTransEndRequest (ftamfd, NULLPE, fti) == NOTOK) {
+       ftam_advise (fta, "F-TRANSFER-END.REQUEST");
+       return NOTOK;
+    }
+
+    switch (fti -> fti_type) {
+       case FTI_TRANSEND:
+           {
+               register struct FTAMtransend *ftre = &fti -> fti_transend;
+
+               ftam_diag (ftre -> ftre_diags, ftre -> ftre_ndiag, 1,
+                          ftre -> ftre_action);
+               FTREFREE (ftre);
+           }
+           break;
+
+       case FTI_CANCEL:
+           {
+               register struct FTAMcancel *ftcn = &fti -> fti_cancel;
+               
+               advise (NULLCP, "data transfer cancelled!");
+               ftam_diag (ftcn -> ftcn_diags, ftcn -> ftcn_ndiag, 1, 
+                       ftcn -> ftcn_action);
+               FTCNFREE (ftcn);
+
+               if (FCancelResponse (ftamfd, FACTION_SUCCESS, NULLPE, 
+                           (struct FTAMdiagnostic *) 0, 0, fti)
+                       == NOTOK) {
+                   ftam_advise (fta, "F-CANCEL.RESPONSE");
+                   return NOTOK;
+               }
+           }
+           break;
+
+       default:
+           adios (NULLCP, "unexpected indication type=%d", fti -> fti_type);
+    }
+#ifdef BRIDGE
+    ftp_result = OK;
+#endif
+
+done_transfer: ;
+    ftg = &ftgs;
+    bzero ((char *) ftg, sizeof *ftg);
+    ftg -> ftg_flags |= FTG_BEGIN | FTG_END;
+    ftg -> ftg_threshold = 0;
+
+    ftg -> ftg_flags |= FTG_CLOSE;
+    ftg -> ftg_threshold++;
+
+    ftg -> ftg_flags |= FTG_DESELECT;
+    ftg -> ftg_threshold++;
+
+    if (FBulkEndRequest (ftamfd, ftg, fti) == NOTOK) {
+       ftam_advise (fta, "F-BULK-END.REQUEST");
+       return NOTOK;
+    }
+
+    ftg = &fti -> fti_group;
+
+    if (ftg -> ftg_flags & FTG_CLOSE) {
+       register struct FTAMclose     *ftcl = &ftg -> ftg_close;
+
+       ftam_diag (ftcl -> ftcl_diags, ftcl -> ftcl_ndiag, 1,
+               ftcl -> ftcl_action);
+    }
+
+    if (ftg -> ftg_flags & FTG_DESELECT) {
+       register struct FTAMdeselect   *ftde = &ftg -> ftg_deselect;
+
+       ftam_diag (ftde -> ftde_diags, ftde -> ftde_ndiag, 1,
+               ftde -> ftde_action);
+       ftam_chrg (&ftde -> ftde_charges);
+    }
+
+    FTGFREE (ftg);
+#ifdef BRIDGE
+    return ftp_result;
+#else
+    return OK;
+#endif
+
+you_lose: ;
+    FTGFREE (ftg);
+    return NOTOK;
+}
+
+/* \f */
+
+static struct vfsmap *findvf (file)
+char   *file;
+{
+    struct FTAMgroup    ftgs;
+    register struct FTAMgroup  *ftg = &ftgs;
+    struct FTAMindication   ftis;
+    register struct FTAMindication *fti = &ftis;
+    struct vfsmap *vf;
+
+    bzero ((char *) ftg, sizeof *ftg);
+    ftg -> ftg_flags |= FTG_BEGIN | FTG_END;
+    ftg -> ftg_threshold = 0;
+
+    ftg -> ftg_flags |= FTG_SELECT;
+    {
+       register struct FTAMselect *ftse = &ftg -> ftg_select;
+       register struct FTAMattributes *fa = &ftse -> ftse_attrs;
+
+       fa -> fa_present = FA_FILENAME;
+       fa -> fa_nfile = 0;
+       fa -> fa_files[fa -> fa_nfile++] = file;
+
+       ftse -> ftse_access = FA_PERM_READATTR;
+       FCINIT (&ftse -> ftse_conctl);
+    }
+    ftg -> ftg_threshold++;
+
+    ftg -> ftg_flags |= FTG_RDATTR;
+    {
+       register struct FTAMreadattr   *ftra = &ftg -> ftg_readattr;
+
+       ftra -> ftra_attrnames = FA_FILENAME | FA_CONTENTS;
+    }
+    ftg -> ftg_threshold++;
+
+    ftg -> ftg_flags |= FTG_DESELECT;
+    ftg -> ftg_threshold++;
+
+    if (FManageRequest (ftamfd, ftg, fti) == NOTOK) {
+       ftam_advise (&fti -> fti_abort, "F-MANAGE.REQUEST");
+       return NULL;
+    }
+
+    ftg = &fti -> fti_group;
+
+    if (ftg -> ftg_flags & FTG_SELECT) {
+       register struct FTAMselect *ftse = &ftg -> ftg_select;
+
+       if (debug)
+           ftam_diag (ftse -> ftse_diags, ftse -> ftse_ndiag, 1,
+                   ftse -> ftse_action);
+       if (ftse -> ftse_state != FSTATE_SUCCESS)
+           goto you_lose;
+    }
+
+    vf = NULL;
+    if (ftg -> ftg_flags & FTG_RDATTR) {
+       register struct FTAMreadattr   *ftra = &ftg -> ftg_readattr;
+       register struct FTAMattributes *fa = &ftra -> ftra_attrs;
+
+       if (debug)
+           ftam_diag (ftra -> ftra_diags, ftra -> ftra_ndiag, 1,
+                   ftra -> ftra_action);
+       if (ftra -> ftra_action != FACTION_SUCCESS)
+           fa -> fa_present = 0;
+
+       if (fa -> fa_present & FA_CONTENTS) {
+           for (vf = vfs; vf -> vf_entry; vf++)
+               if (vf -> vf_oid
+                       && (vf -> vf_flags & VF_OK)
+                       && oid_cmp (vf -> vf_oid, fa -> fa_contents) == 0) {
+                   if (fa -> fa_parameter && vf -> vf_number >= 0) {
+                       if (vf -> vf_parameter && (vf -> vf_flags & VF_PARM))
+                           (void) fre_obj (vf -> vf_parameter,
+                                           _ZDOCS_mod.md_dtab[vf
+                                                               -> vf_number],
+                                           &_ZDOCS_mod, 1);
+                       vf -> vf_parameter = NULL, vf -> vf_flags &= ~VF_PARM;
+                       if (dec_f (vf -> vf_number, &_ZDOCS_mod,
+                                  fa -> fa_parameter, 1, NULLIP, NULLVP,
+                                  &vf -> vf_parameter) == NOTOK) {
+                           advise (NULLCP,
+                                "unable to parse document type parameter: %s",
+                                   PY_pepy);
+                           vf = NULL;
+                       }
+                       else
+                           if (vf -> vf_check
+                                   && (*vf -> vf_check) (vf -> vf_parameter,
+                                                         PY_pepy) == NOTOK) {
+                               advise (NULLCP, "%s", PY_pepy);
+                               vf = NULL;
+                           }
+                   }
+                   break;
+               }
+           if (!vf -> vf_entry) {
+               advise (NULLCP,
+                       "unknown document type %s associated with %s",
+                       sprintoid (fa -> fa_contents), file);
+               vf = NULL;
+           }
+       }
+    }
+
+    if (ftg -> ftg_flags & FTG_DESELECT) {
+       register struct FTAMdeselect   *ftde = &ftg -> ftg_deselect;
+
+       if (debug) {
+           ftam_diag (ftde -> ftde_diags, ftde -> ftde_ndiag, 1,
+               ftde -> ftde_action);
+           ftam_chrg (&ftde -> ftde_charges);
+       }
+    }
+
+    FTGFREE (ftg);
+    return vf;
+
+you_lose: ;
+    FTGFREE (ftg);
+    return NULL;
+}
+
+/* \f */
+
+static int  getloop (fd, dst, wfnx)
+int    fd;
+char   *dst;
+IFP    wfnx;
+{
+    int            reason,
+           result;
+    struct FTAMindication   ftis;
+    register struct FTAMindication *fti = &ftis;
+    register struct FTAMabort  *fta = &fti -> fti_abort;
+
+    for (;;) {
+       if (!interrupted) {
+           int     nfds;
+           fd_set  rfds;
+
+           nfds = 0;
+           FD_ZERO (&rfds);
+                                       /* interrupt causes EINTR */
+           if (FSelectMask (ftamfd, &rfds, &nfds, fti) == OK)
+               (void) xselect (nfds, &rfds, NULLFD, NULLFD, NOTOK);
+       }
+
+       if (interrupted) {
+           advise (NULLCP, "cancelling transfer");
+           reason = FS_GEN_INITIATOR;
+           errno = EINTR;
+           goto do_cancel;
+       }
+       
+       switch (result = FWaitRequest (ftamfd, NOTOK, fti)) {
+           case NOTOK: 
+               ftam_advise (&fti -> fti_abort, "F-WAIT.REQUEST");
+               return NOTOK;
+
+           case OK: 
+           case DONE: 
+               break;
+
+           default: 
+               adios (NULLCP, "unknown return from FWaitRequest=%d",
+                       result);
+       }
+
+       switch (fti -> fti_type) {
+           case FTI_DATA: 
+               if ((*wfnx) (fd, &fti -> fti_data, OK) == NOTOK) {
+                   struct FTAMdiagnostic   diags[NFDIAG];
+                   register struct FTAMdiagnostic *dp;
+
+                   advise (dst, "error writing");
+                   reason = FS_ACC_WRITE;
+
+do_cancel: ;
+                   dp = diags;
+
+                   dp -> ftd_type = DIAG_PERM;
+                   dp -> ftd_identifier = reason;
+                   dp -> ftd_observer = dp -> ftd_source = EREF_IFSU;
+                   dp -> ftd_delay = DIAG_NODELAY;
+                   (void) strcpy (dp -> ftd_data, sys_errname (errno));
+                   dp -> ftd_cc = strlen (dp -> ftd_data);
+                   dp++;
+
+                   if (FCancelRequest (ftamfd, FACTION_PERM, NULLPE, diags,
+                           dp - diags, fti) == NOTOK) {
+                       ftam_advise (fta, "F-CANCEL.REQUEST");
+                       return NOTOK;
+                   }
+
+                   if (fti -> fti_type == FTI_CANCEL) {
+                       register struct FTAMcancel *ftcn = &fti -> fti_cancel;
+
+                       ftam_diag (ftcn -> ftcn_diags, ftcn -> ftcn_ndiag, 1,
+                                   ftcn -> ftcn_action);
+                       FTCNFREE (ftcn);
+                   }
+
+                   return DONE;
+               }
+               break;
+
+           case FTI_DATAEND: 
+               return OK;
+
+           case FTI_CANCEL: 
+               {
+                   register struct FTAMcancel *ftcn = &fti -> fti_cancel;
+               
+                   advise (NULLCP, "data transfer cancelled!");
+                   ftam_diag (ftcn -> ftcn_diags, ftcn -> ftcn_ndiag, 1,
+                           ftcn -> ftcn_action);
+                   FTCNFREE (ftcn);
+
+                   if (FCancelResponse (ftamfd, FACTION_SUCCESS, NULLPE, 
+                               (struct FTAMdiagnostic *) 0, 0, fti)
+                           == NOTOK) {
+                       ftam_advise (fta, "F-CANCEL.RESPONSE");
+                       return NOTOK;
+                   }
+               }
+               return DONE;
+
+           default: 
+               adios (NULLCP, "unexpected indication type=%d",
+                       fti -> fti_type);
+       }
+    }
+}
+
+/* \f */
+
+static int  ubffnx (fd, px, status)
+int    fd;
+register struct PSAPdata *px;
+int    status;
+{
+    register int    i,
+                   n;
+    register PE            pe,
+                  *pep;
+    static int     cc;
+
+    if (px == NULL) {
+       switch (status) {
+           case OK:
+           default:
+               cc = 0;
+               if (verbose)
+                   timer (cc, NULLCP);
+               if (hash)
+                   marks = BUFSIZ - 1;
+               break;
+
+           case DONE:
+               if (verbose)
+                   timer (cc, "received");
+               break;
+       }
+
+       return OK;
+    }
+
+    for (pep = px -> px_info, i = px -> px_ninfo - 1; i >= 0; pep++, i--) {
+       if ((pe = *pep) == NULLPE)
+           continue;
+
+       switch (myvf - vfs) {
+           case VFS_UBF:
+           default:
+               if (debug)
+                   WATCHP (DOCS_FTAM__3__Datatype1, pe, 1);
+               n = de2fd (fd, pe, 0, 0);
+               break;
+
+           case VFS_UTF:
+               if (debug)
+                   WATCHP (DOCS_FTAM__1__Datatype1, pe, 1);
+               n = de2fd (fd, pe, 1, effector);
+               break;
+       }
+       if (n == NOTOK)
+           break;
+
+       if (verbose || hash)
+           cc += n;
+       if (hash) {
+           if (hash > 1)
+               printf ("%d\r", cc);
+           else
+               for (; marks < cc; marks += BUFSIZ)
+                   (void) putchar ('#');
+           (void) fflush (stdout);
+       }
+    }
+
+    PXFREE (px);
+
+    return n;
+}
diff --git a/usr/src/contrib/isode/ftam2/ftam-glob.c b/usr/src/contrib/isode/ftam2/ftam-glob.c
new file mode 100644 (file)
index 0000000..9515562
--- /dev/null
@@ -0,0 +1,979 @@
+/* ftam-glob.c - interactive initiator FTAM -- globbing */
+
+#ifndef        lint
+static char *rcsid = "$Header: /f/osi/ftam2/RCS/ftam-glob.c,v 7.2 91/02/22 09:23:43 mrose Interim $";
+#endif
+
+/* 
+ * $Header: /f/osi/ftam2/RCS/ftam-glob.c,v 7.2 91/02/22 09:23:43 mrose Interim $
+ *
+ *
+ * $Log:       ftam-glob.c,v $
+ * Revision 7.2  91/02/22  09:23:43  mrose
+ * Interim 6.8
+ * 
+ * Revision 7.1  90/11/04  19:15:15  mrose
+ * update
+ * 
+ * Revision 7.0  89/11/23  21:54:19  mrose
+ * Release 6.0
+ * 
+ */
+
+/*
+ *                               NOTICE
+ *
+ *    Acquisition, use, and distribution of this module and related
+ *    materials are subject to the restrictions of a license agreement.
+ *    Consult the Preface in the User's Manual for the full terms of
+ *    this agreement.
+ *
+ */
+
+
+/*
+ * C-shell glob for random programs.
+ *
+ * Modified for FTAM (and linted)
+ *
+ * Used by permission.
+ */
+
+#include <stdio.h>
+#include <errno.h>
+#include <pwd.h>
+#include "ftamuser.h"
+
+
+#define        QUOTE 0200
+#define        TRIM 0177
+#define        eq(a,b)         (strcmp(a, b)==0)
+#define        GAVSIZ          (NCARGS/6)
+#define        isdir(d)        ((d.st_mode & S_IFMT) == S_IFDIR)
+
+static char **gargv;           /* Pointer to the (stack) arglist */
+static int    gargc;           /* Number args in gargv */
+static int    gnleft;
+static int    gflag;
+static int tglob();
+char   **glob();
+char   *globerr;
+static char *home;
+struct passwd *getpwnam();
+extern int errno;
+static char *strspl(), **copyblk(), *strend();
+char   *malloc(), *strcpy(), *strcat();
+
+static int globcnt;
+
+static
+char   *globchars = "`{[*?";
+
+static char *gpath, *gpathp, *lastgpathp;
+static int globbed;
+static char *entp;
+static char **sortbas;
+
+
+int    chkldir (), chkrdir ();
+static int (*chkdir) () = chkldir;
+
+int    getldir (), getrdir ();
+static int (*gethdir) () = getldir;
+
+int    matchldir (), matchrdir ();
+static int (*matchdir) () = matchldir;
+
+
+static
+char **
+glob(v)
+       register char *v;
+{
+       char agpath[BUFSIZ];
+       char *agargv[GAVSIZ];
+       char *vv[2];
+       vv[0] = malloc ((unsigned) (strlen (v) + 1));
+       if (vv[0] == (char *)0)
+               fatal("out of memory");
+       (void) strcpy (vv[0], v);
+       v = vv[0];
+       vv[1] = 0;
+       gflag = 0;
+       rscan(vv, tglob);
+       if (gflag == 0)
+               return (copyblk(vv));
+
+       globerr = 0;
+       gpath = agpath; gpathp = gpath; *gpathp = 0;
+       lastgpathp = &gpath[sizeof agpath - 2];
+       ginit(agargv); globcnt = 0;
+       collect(v);
+       free(v);
+       if (globcnt == 0 && (gflag&1)) {
+               blkfree(gargv), gargv = 0;
+               return (0);
+       } else
+               return (gargv = copyblk(gargv));
+}
+
+static
+ginit(agargv)
+       char **agargv;
+{
+
+       agargv[0] = 0; gargv = agargv; sortbas = agargv; gargc = 0;
+       gnleft = NCARGS - 4;
+}
+
+static
+collect(as)
+       register char *as;
+{
+       if (eq(as, "{") || eq(as, "{}")) {
+               Gcat(as, "");
+               sort();
+       } else
+               acollect(as);
+}
+
+static
+acollect(as)
+       register char *as;
+{
+       register int ogargc = gargc;
+
+       gpathp = gpath; *gpathp = 0; globbed = 0;
+       expand(as);
+       if (gargc != ogargc)
+               sort();
+}
+
+static
+sort()
+{
+       register char **p1, **p2, *c;
+       char **Gvp = &gargv[gargc];
+
+       p1 = sortbas;
+       while (p1 < Gvp-1) {
+               p2 = p1;
+               while (++p2 < Gvp)
+                       if (strcmp(*p1, *p2) > 0)
+                               c = *p1, *p1 = *p2, *p2 = c;
+               p1++;
+       }
+       sortbas = Gvp;
+}
+
+static
+expand(as)
+       char *as;
+{
+       register char *cs,
+                     *sgpathp,
+                     *oldcs;
+       char   *csstr;
+       struct stat stb;
+
+       sgpathp = gpathp;
+       cs = csstr = strdup (as);
+       if (*cs == '~' && gpathp == gpath) {
+               addpath('~');
+               for (cs++; letter(*cs) || digit(*cs) || *cs == '-';)
+                       addpath(*cs++);
+               if (!*cs || *cs == '/') {
+                       if (gpathp != gpath + 1) {
+                               *gpathp = 0;
+                               if ((*gethdir) (gpath + 1))
+                                       globerr = "Unknown user name after ~";
+                               (void) strcpy(gpath, gpath + 1);
+                       } else
+                               (void) strcpy(gpath, home);
+                       gpathp = strend(gpath);
+               }
+       }
+       while (!any(*cs, globchars)) {
+               if (*cs == 0) {
+                       if (!globbed)
+                               Gcat(gpath, "");
+                       else if (stat(gpath, &stb) >= 0) {
+                               Gcat(gpath, "");
+                               globcnt++;
+                       }
+                       goto endit;
+               }
+               addpath(*cs++);
+       }
+       oldcs = cs;
+       while (cs > as && *cs != '/')
+               cs--, gpathp--;
+       if (*cs == '/')
+               cs++, gpathp++;
+       *gpathp = 0;
+       if (*oldcs == '{') {
+               (void) execbrc(cs, ((char *)0));
+               return;
+       }
+       (*matchdir) (cs);
+endit:
+       gpathp = sgpathp;
+       *gpathp = 0;
+
+       if (csstr)
+           free (csstr);
+}
+
+static
+matchldir(pattern)
+       char *pattern;
+{
+       char    pat[MAXPATHLEN];
+       struct stat stb;
+       register struct dirent *dp;
+       DIR *dirp;
+
+       (void) strcpy (pat, pattern);
+
+       dirp = opendir(*gpath ? gpath : ".");
+       if (dirp == NULL) {
+               if (globbed)
+                       return;
+               goto patherr2;
+       }
+       if (fstat(dirp->dd_fd, &stb) < 0)
+               goto patherr1;
+       if (!isdir(stb)) {
+               errno = ENOTDIR;
+               goto patherr1;
+       }
+       for (errno = 0; dp = readdir(dirp); errno = 0) {
+               if (dp->d_ino == 0)
+                       continue;
+               if (match(dp->d_name, pat)) {
+                       Gcat(gpath, dp->d_name);
+                       globcnt++;
+               }
+       }
+       if (errno)
+           globerr = "corrupted directory";
+       (void) closedir(dirp);
+       return;
+
+patherr1:
+       (void) closedir(dirp);
+patherr2:
+       globerr = "Bad directory components";
+}
+
+static
+execbrc(p, s)
+       char *p, *s;
+{
+       char restbuf[BUFSIZ + 2];
+       register char *pe, *pm, *pl;
+       int brclev = 0;
+       char *lm, savec, *sgpathp;
+
+       for (lm = restbuf; *p != '{'; *lm++ = *p++)
+               continue;
+       for (pe = ++p; *pe; pe++)
+       switch (*pe) {
+
+       case '{':
+               brclev++;
+               continue;
+
+       case '}':
+               if (brclev == 0)
+                       goto pend;
+               brclev--;
+               continue;
+
+       case '[':
+               for (pe++; *pe && *pe != ']'; pe++)
+                       continue;
+               continue;
+       }
+pend:
+       brclev = 0;
+       for (pl = pm = p; pm <= pe; pm++)
+       switch (*pm & (QUOTE|TRIM)) {
+
+       case '{':
+               brclev++;
+               continue;
+
+       case '}':
+               if (brclev) {
+                       brclev--;
+                       continue;
+               }
+               goto doit;
+
+       case ','|QUOTE:
+       case ',':
+               if (brclev)
+                       continue;
+doit:
+               savec = *pm;
+               *pm = 0;
+               (void) strcpy(lm, pl);
+               (void) strcat(restbuf, pe + 1);
+               *pm = savec;
+               if (s == 0) {
+                       sgpathp = gpathp;
+                       expand(restbuf);
+                       gpathp = sgpathp;
+                       *gpathp = 0;
+               } else if (amatch(s, restbuf))
+                       return (1);
+               sort();
+               pl = pm + 1;
+               if (brclev)
+                       return (0);
+               continue;
+
+       case '[':
+               for (pm++; *pm && *pm != ']'; pm++)
+                       continue;
+               if (!*pm)
+                       pm--;
+               continue;
+       }
+       if (brclev)
+               goto doit;
+       return (0);
+}
+
+static
+match(s, p)
+       char *s, *p;
+{
+       register int c;
+       register char *sentp;
+       char sglobbed = globbed;
+
+       if (*s == '.' && *p != '.')
+               return (0);
+       sentp = entp;
+       entp = s;
+       c = amatch(s, p);
+       entp = sentp;
+       globbed = sglobbed;
+       return (c);
+}
+
+static
+amatch(s, p)
+       register char *s, *p;
+{
+       register int scc;
+       int ok, lc;
+       char *sgpathp;
+       struct stat stb;
+       int c, cc;
+
+       globbed = 1;
+       for (;;) {
+               scc = *s++ & TRIM;
+               switch (c = *p++) {
+
+               case '{':
+                       return (execbrc(p - 1, s - 1));
+
+               case '[':
+                       ok = 0;
+                       lc = 077777;
+                       while (cc = *p++) {
+                               if (cc == ']') {
+                                       if (ok)
+                                               break;
+                                       return (0);
+                               }
+                               if (cc == '-') {
+                                       if (lc <= scc && scc <= *p++)
+                                               ok++;
+                               } else
+                                       if (scc == (lc = cc))
+                                               ok++;
+                       }
+                       if (cc == 0)
+                               if (ok)
+                                       p--;
+                               else
+                                       return 0;
+                       continue;
+
+               case '*':
+                       if (!*p)
+                               return (1);
+                       if (*p == '/') {
+                               p++;
+                               goto slash;
+                       }
+                       s--;
+                       do {
+                               if (amatch(s, p))
+                                       return (1);
+                       } while (*s++);
+                       return (0);
+
+               case 0:
+                       return (scc == 0);
+
+               default:
+                       if (c != scc)
+                               return (0);
+                       continue;
+
+               case '?':
+                       if (scc == 0)
+                               return (0);
+                       continue;
+
+               case '/':
+                       if (scc)
+                               return (0);
+slash:
+                       s = entp;
+                       sgpathp = gpathp;
+                       while (*s)
+                               addpath(*s++);
+                       addpath('/');
+                       if ((*chkdir) (gpath, &stb)) 
+                               if (*p == 0) {
+                                       Gcat(gpath, "");
+                                       globcnt++;
+                               } else
+                                       expand(p);
+                       gpathp = sgpathp;
+                       *gpathp = 0;
+                       return (0);
+               }
+       }
+}
+
+static
+chkldir (path, st)
+char   *path;
+struct stat *st;
+{
+    return (stat (path, st) == 0 && (st -> st_mode & S_IFMT) == S_IFDIR);
+}
+
+static
+Gmatch(s, p)
+       register char *s, *p;
+{
+       register int scc;
+       int ok, lc;
+       int c, cc;
+
+       for (;;) {
+               scc = *s++ & TRIM;
+               switch (c = *p++) {
+
+               case '[':
+                       ok = 0;
+                       lc = 077777;
+                       while (cc = *p++) {
+                               if (cc == ']') {
+                                       if (ok)
+                                               break;
+                                       return (0);
+                               }
+                               if (cc == '-') {
+                                       if (lc <= scc && scc <= *p++)
+                                               ok++;
+                               } else
+                                       if (scc == (lc = cc))
+                                               ok++;
+                       }
+                       if (cc == 0)
+                               if (ok)
+                                       p--;
+                               else
+                                       return 0;
+                       continue;
+
+               case '*':
+                       if (!*p)
+                               return (1);
+                       for (s--; *s; s++)
+                               if (Gmatch(s, p))
+                                       return (1);
+                       return (0);
+
+               case 0:
+                       return (scc == 0);
+
+               default:
+                       if ((c & TRIM) != scc)
+                               return (0);
+                       continue;
+
+               case '?':
+                       if (scc == 0)
+                               return (0);
+                       continue;
+
+               }
+       }
+}
+
+static
+Gcat(s1, s2)
+       register char *s1, *s2;
+{
+       register int len = strlen(s1) + strlen(s2) + 1;
+
+       if (len >= gnleft || gargc >= GAVSIZ - 1)
+               globerr = "Arguments too long";
+       else {
+               gargc++;
+               gnleft -= len;
+               gargv[gargc] = 0;
+               gargv[gargc - 1] = strspl(s1, s2);
+       }
+}
+
+static
+addpath(c)
+       char c;
+{
+
+       if (gpathp >= lastgpathp)
+               globerr = "Pathname too long";
+       else {
+               *gpathp++ = c;
+               *gpathp = 0;
+       }
+}
+
+static
+rscan(t, f)
+       register char **t;
+       int (*f)();
+{
+       register char *p, c;
+
+       while (p = *t++) {
+               if (f == tglob)
+                       if (*p == '~')
+                               gflag |= 2;
+                       else if (eq(p, "{") || eq(p, "{}"))
+                               continue;
+               while (c = *p++)
+                       (*f)(c);
+       }
+}
+
+#ifdef notdef
+static
+scan(t, f)
+       register char **t;
+       int (*f)();
+{
+       register char *p, c;
+
+       while (p = *t++)
+               while (c = *p)
+                       *p++ = (*f)(c);
+}
+#endif
+
+static
+tglob(c)
+       register char c;
+{
+
+       if (any(c, globchars))
+               gflag |= c == '{' ? 2 : 1;
+       return (c);
+}
+
+#ifdef notdef
+static
+trim(c)
+       char c;
+{
+
+       return (c & TRIM);
+}
+#endif
+
+static
+letter(c)
+       register char c;
+{
+
+       return (c >= 'a' && c <= 'z' || c >= 'A' && c <= 'Z' || c == '_');
+}
+
+static
+digit(c)
+       register char c;
+{
+
+       return (c >= '0' && c <= '9');
+}
+
+static
+any(c, s)
+       register int c;
+       register char *s;
+{
+
+       while (*s)
+               if (*s++ == c)
+                       return(1);
+       return(0);
+}
+blklen(av)
+       register char **av;
+{
+       register int i = 0;
+
+       while (*av++)
+               i++;
+       return (i);
+}
+
+char **
+blkcpy(oav, bv)
+       char **oav;
+       register char **bv;
+{
+       register char **av = oav;
+
+       while (*av++ = *bv++)
+               continue;
+       return (oav);
+}
+
+blkfree(av0)
+       char **av0;
+{
+       register char **av = av0;
+
+       while (*av)
+               free(*av++);
+       free((char *)av0);
+}
+
+static
+char *
+strspl(cp, dp)
+       register char *cp, *dp;
+{
+       register char *ep = malloc((unsigned)(strlen(cp) + strlen(dp) + 1));
+
+       if (ep == (char *)0)
+               fatal("out of memory");
+       (void) strcpy(ep, cp);
+       (void) strcat(ep, dp);
+       return (ep);
+}
+
+static
+char **
+copyblk(v)
+       register char **v;
+{
+       register char **nv = (char **)malloc((unsigned)((blklen(v) + 1) *
+                                               sizeof(char **)));
+       if (nv == (char **)0)
+               fatal("out of memory");
+
+       return (blkcpy(nv, v));
+}
+
+static
+char *
+strend(cp)
+       register char *cp;
+{
+
+       while (*cp)
+               cp++;
+       return (cp);
+}
+/*
+ * Extract a home directory from the password file
+ * The argument points to a buffer where the name of the
+ * user whose home directory is sought is currently.
+ * We write the home directory of the user back there.
+ */
+static
+getldir(hdir)
+       char *hdir;
+{
+       register struct passwd *pp = getpwnam(hdir);
+
+       if (pp == 0)
+               return (1);
+       (void) strcpy(hdir, pp->pw_dir);
+       return (0);
+}
+
+/* \f */
+
+#undef isdir
+
+
+int    xglobbed;
+
+static OID   matchoid;
+
+/* \f */
+
+char   *xglob1val (v, remote)
+char   *v;
+int    remote;
+{
+    register char **gp;
+    char   *cp,
+           *gb[2];
+
+    gb[0] = v;
+    gb[1] = NULLCP;
+
+    if ((gp = xglob (gb, remote)) == NULLVP)
+       return NULLCP;
+
+    if (gp[1]) {
+       advise (NULLCP, "%s: ambiguous", v);
+       blkfree (gp);
+       return NULLCP;
+    }
+
+    cp = *gp;
+    free ((char *) gp);
+
+    return cp;
+}
+
+/* \f */
+
+char  **xglob (v, remote)
+char  **v;
+int    remote;
+{
+    register int    i;
+    register char  *cp,
+                 **gp,
+                  **vp;
+    char   *loses;
+
+    xglobbed = 0;
+
+    if (!globbing) {
+       register char *dp;
+
+       for (gp = vp = copyblk (v); *gp; gp++) {
+           cp = remote ? str2file (*gp) : *gp;
+           if ((dp = malloc ((unsigned) (strlen (cp) + 1))) == NULLCP)
+               fatal ("out of memory");
+           (void) strcpy (dp, cp);
+           *gp = dp;
+       }
+
+       return vp;
+    }
+
+    if (remote) {
+       switch (realstore) {
+           case RFS_UNKNOWN: 
+               advise (NULLCP, "%s", rs_unknown);
+               return NULLVP;
+
+           case RFS_UNIX: 
+               home = "~";
+               chkdir = chkrdir;
+               gethdir = getrdir;
+               matchdir = matchrdir;
+               break;
+
+           default: 
+               advise (NULLCP, "%s", rs_support);
+               return NULLVP;
+       }
+    }
+    else {
+       home = myhome;
+       chkdir = chkldir;
+       gethdir = getldir;
+       matchdir = matchldir;
+    }
+
+    for (i = 0, loses = NULL, vp = NULLVP; cp = *v++; ) {
+       if ((gp = glob (remote ? str2file (cp) : cp)) == NULLVP) {
+           if (!loses && globerr)
+               loses = globerr;
+           continue;
+       }
+
+       if (vp) {
+           register int    j;
+           register char **xp,
+                         **yp;
+
+           if ((j = blklen (gp)) > 1)
+               xglobbed++;
+
+           if ((vp = (char **) realloc ((char *) vp,
+                                   ((unsigned) (i + j + 1)) * sizeof *vp))
+                   == NULLVP)
+               fatal ("out of memory");
+
+           for (xp = vp + i, yp = gp; *xp = *yp; xp++, yp++)
+               continue;
+           i += j;
+
+           free ((char *) gp);
+       }
+       else
+           if ((i = blklen (vp = gp)) > 1)
+               xglobbed++;
+    }
+
+    if (vp == NULLVP || *vp == NULLCP) {
+       if (!loses)
+           loses = "no files match specification";
+       advise (NULLCP, "%s", loses);
+
+       if (vp) {
+           blkfree (vp);
+           vp = NULLVP;
+       }
+    }
+
+    if (vp && debug)
+       for (gp = vp; *gp; gp++)
+           printf ("%d: \"%s\"\n", gp - vp, *gp);
+
+    return vp;
+}
+
+/* \f */
+
+static matchrdir (pattern)
+char   *pattern;
+{
+    register char  *cp;
+    char    cwd[MAXPATHLEN],
+           pat[MAXPATHLEN];
+    struct FADUidentity faduids;
+    register struct FADUidentity *faduid = &faduids;
+    register struct filent *fi, *gi;
+    
+    (void) strcpy (pat, pattern);
+
+    switch (isdir (gpath, cwd, 1)) {
+       case NOTOK:
+       case OK:
+           if (!globbed)
+               globerr = "Bad directory components";
+           return;
+
+       default:
+           if (cwd[0] == NULL)
+               (void) strcpy (cwd, gpath);
+           cp = cwd + strlen (cwd) - 1;
+           if (*cp == '/')
+               *cp = NULL;
+           else {
+               *++cp = '/';
+               *++cp = NULL;
+           }
+           cp = cwd;
+           break;
+    }
+    
+    faduid -> fa_type = FA_FIRSTLAST;
+    faduid -> fa_firstlast = FA_FIRST;
+
+    (void) fdffnx (NOTOK, (struct PSAPdata *) 0, 1);
+    (void) getvf (cp, NULLCP, faduid, &vfs[VFS_FDF], fdffnx);
+
+    fi = gi = filents, filents = NULL;
+    (void) fdffnx (NOTOK, (struct PSAPdata *) 0, 0);
+
+    {
+       register int len = strlen (cp);
+
+       for (fi = gi; fi; fi = fi -> fi_next)
+           if (strncmp (fi -> fi_name, cp, len) == 0)
+               fi -> fi_entry = fi -> fi_name + len;
+    }
+
+    for (fi = gi; fi; fi = fi -> fi_next) {
+       matchoid = fi -> fi_oid;
+       if (match (fi -> fi_entry, pat)) {
+           Gcat (gpath, fi -> fi_entry);
+           globcnt++;
+       }
+    }
+
+    filents = gi;
+    (void) fdffnx (NOTOK, (struct PSAPdata *) 0, 0);
+}
+
+/* \f */
+
+/* ARGSUSED */
+
+static chkrdir (path, st)
+char   *path;
+struct stat *st;
+{
+    return (oid_cmp (vfs[VFS_FDF].vf_oid, matchoid) == 0);
+}
+
+/* \f */
+
+static getrdir (hdir)
+char    *hdir;
+{
+    char    buffer[BUFSIZ];
+
+    (void) sprintf (buffer, "~%s", hdir);
+
+    return (isdir (buffer, hdir, 1) != DONE);
+}
+
+/* \f */
+
+static int  fatal (s)
+char   *s;
+{
+    adios (NULLCP, "%s", s);
+}
+
+/* \f */
+
+int    f_echo (vec)
+char  **vec;
+{
+    char  **gb,
+          **gp,
+                  *gs;
+
+    if (*++vec && (gp = gb = xglob (vec, 1))) {
+       char   *cp;
+
+       for (cp = ""; *gp; gp++, cp = " "){
+               gs = rindex (*gp, '/');
+               if (gs == NULL)
+               printf ("%s%s", cp, *gp);
+               else
+               printf ("%s%s", cp, ++gs);
+       }
+       printf ("\n");
+
+       blkfree (gb);
+    }
+
+    return OK;
+}
diff --git a/usr/src/contrib/isode/ftam2/ftam-ls.c b/usr/src/contrib/isode/ftam2/ftam-ls.c
new file mode 100644 (file)
index 0000000..a0845e9
--- /dev/null
@@ -0,0 +1,676 @@
+/* ftam-ls.c - interactive initiator FTAM -- "ls" */
+
+#ifndef        lint
+static char *rcsid = "$Header: /f/osi/ftam2/RCS/ftam-ls.c,v 7.5 91/02/22 09:23:45 mrose Interim $";
+#endif
+
+/* 
+ * $Header: /f/osi/ftam2/RCS/ftam-ls.c,v 7.5 91/02/22 09:23:45 mrose Interim $
+ *
+ *
+ * $Log:       ftam-ls.c,v $
+ * Revision 7.5  91/02/22  09:23:45  mrose
+ * Interim 6.8
+ * 
+ * Revision 7.4  91/01/13  12:26:56  mrose
+ * NBS
+ * 
+ * Revision 7.3  90/11/21  11:30:26  mrose
+ * sun
+ * 
+ * Revision 7.2  90/11/05  13:29:46  mrose
+ * nist
+ * 
+ * Revision 7.1  90/07/01  21:03:12  mrose
+ * pepsy
+ * 
+ * Revision 7.0  89/11/23  21:54:21  mrose
+ * Release 6.0
+ * 
+ */
+
+/*
+ *                               NOTICE
+ *
+ *    Acquisition, use, and distribution of this module and related
+ *    materials are subject to the restrictions of a license agreement.
+ *    Consult the Preface in the User's Manual for the full terms of
+ *    this agreement.
+ *
+ */
+
+
+#include <signal.h>
+#include <stdio.h>
+#include "FTAM-types.h"
+#include "ftamuser.h"
+
+/* \f    DATA */
+
+static int dashl;
+static int didrecurse;
+static int silent;
+
+
+static long  now;
+static long  longtimeago;
+
+
+int    toomany;
+
+int    nfilent = 0;
+struct filent *filents = NULL;
+
+int    filcmp ();
+
+
+#ifdef BRIDGE
+FILE   *fdopen();
+#endif
+static  FILE *lsfp = stdout;
+
+
+long   time ();
+char   *ctime ();
+FILE   *popen ();
+
+/* \f */
+
+#ifndef        BRIDGE
+int    f_fls (vec)
+char  **vec;
+{
+    int            doingpipe,
+           result;
+    SFP            pstat;    
+    char   *cp,
+          *pp,
+           buffer[BUFSIZ];
+    FILE   *fp;
+
+    pp = vec[0];
+    if (*++vec == NULL)  {
+       if (getline ("output to file/program: ", buffer) == NOTOK
+               || str2vec (buffer, vec) < 1)
+           return OK;
+    }
+       
+    cp = vec[0];
+    if (*cp == '|') {
+       if ((fp = popen (cp + 1, "w")) == NULL) {
+           advise (cp + 1, "unable to start");
+           return OK;
+       }
+
+       doingpipe = 1;
+       pstat = signal (SIGPIPE, SIG_IGN);
+    }
+    else {
+       if ((cp = xglob1val (cp, 0)) == NULL)
+           return OK;
+
+       if ((fp = fopen (cp, "w")) == NULL) {
+           advise (cp, "unable to write");
+           free (cp);
+           return OK;
+       }
+
+       doingpipe = 0;
+    }
+    vec[0] = pp + 1;
+
+    lsfp = fp;
+
+    result = f_ls (vec);
+
+    if (doingpipe) {
+       (void) pclose (fp);
+       (void) signal (SIGPIPE, pstat);
+    }
+    else {
+       free (cp);
+       (void) fclose (fp);
+    }
+
+    lsfp = stdout;
+
+    return result;
+}
+#endif
+
+/* \f */
+
+int    f_ls (vec)
+char  **vec;
+{
+    int     invis,
+            multi,
+           result;
+#ifdef BRIDGE
+    int            fd;
+#else
+    char    buffer[BUFSIZ];
+#endif
+
+    if (dashl = strcmp (*vec, "dir") == 0) {
+       if (!(attrs & FATTR_STORAGE)) {
+           advise (NULLCP, "no support for storage attributes");
+           return OK;
+       }
+
+       (void) time (&now);
+       longtimeago = now - 6L * 30L * 24L * 60L * 60L;
+    }
+
+    if (*++vec == NULL) {
+#ifdef BRIDGE
+       return NOTOK;
+#else
+       switch (realstore) {
+           case RFS_UNIX: 
+               *vec++ = ".";
+               *vec-- = NULL;
+               invis = !dashl;
+               break;
+
+           default: 
+               if (getline ("file: ", buffer) == NOTOK
+                       || str2vec (buffer, vec) < 1)
+                   return OK;
+               invis = 0;
+               break;
+       }
+#endif
+    }
+    else
+       invis = 0;
+
+#ifdef BRIDGE
+    if ((fd = dataconn ("LIST")) == NOTOK
+           || (lsfp = fdopen (fd, "w")) == NULL) {
+       (void) sprintf (ftam_error, "out of memory");
+       if (fd != NOTOK) {
+           (void) close (fd);
+           return NOTOK;
+       }
+        return DONE;
+    }
+#endif
+
+    result = OK;
+    if (vec = xglob (vec, 1)) {
+       register char **gp;
+
+       didrecurse = 0;
+       multi = vec[1] ? 1 : 0;
+
+       for (gp = vec; *gp && !interrupted; gp++) {
+           result = ls (*gp, *gp, 1, gp == vec, gp[1] == NULL, invis, multi);
+
+           if (ftamfd == NOTOK || result == NOTOK)
+               break;
+       }
+
+       blkfree (vec);
+    }
+#ifdef BRIDGE
+    (void) fclose (lsfp);
+    (void) close (fd);
+#endif
+
+    return result;
+}
+
+/* \f */
+
+static int  ls (file, entry, top, first, last, invis, multi)
+char   *file,
+       *entry;
+int    top,
+       first,
+       last,
+       invis,
+       multi;
+{
+    int            recurse;
+    long    mtime;
+    char   *s;
+    UTC            ut;
+    struct FTAMgroup    ftgs;
+    register struct FTAMgroup  *ftg = &ftgs;
+    struct FTAMindication   ftis;
+    register struct FTAMindication *fti = &ftis;
+    struct vfsmap *vf = &vfs[VFS_FDF];
+
+    bzero ((char *) ftg, sizeof *ftg);
+    ftg -> ftg_flags |= FTG_BEGIN | FTG_END;
+    ftg -> ftg_threshold = 0;
+
+    ftg -> ftg_flags |= FTG_SELECT;
+    {
+       register struct FTAMselect *ftse = &ftg -> ftg_select;
+       register struct FTAMattributes *fa = &ftse -> ftse_attrs;
+
+       fa -> fa_present = FA_FILENAME;
+       fa -> fa_nfile = 0;
+       fa -> fa_files[fa -> fa_nfile++] = file;
+
+       ftse -> ftse_access = FA_PERM_READATTR;
+       FCINIT (&ftse -> ftse_conctl);
+    }
+    ftg -> ftg_threshold++;
+
+    ftg -> ftg_flags |= FTG_RDATTR;
+    {
+       register struct FTAMreadattr   *ftra = &ftg -> ftg_readattr;
+
+       ftra -> ftra_attrnames = FA_FILENAME | FA_CONTENTS;
+       if (dashl)
+#ifdef DEBUG
+           ftra -> ftra_attrnames |= FA_STORAGE
+                       | (attrs & FATTR_SECURITY ? FA_SECURITY : 0);
+#else
+           ftra -> ftra_attrnames |= FA_ID_CREATE | FA_DATE_MODIFY
+                       | FA_ACCOUNT | FA_FILESIZE;
+#endif
+    }
+    ftg -> ftg_threshold++;
+
+    ftg -> ftg_flags |= FTG_DESELECT;
+    ftg -> ftg_threshold++;
+
+    if (FManageRequest (ftamfd, ftg, fti) == NOTOK) {
+       ftam_advise (&fti -> fti_abort, "F-MANAGE.REQUEST");
+       return NOTOK;
+    }
+
+    ftg = &fti -> fti_group;
+
+    if (ftg -> ftg_flags & FTG_SELECT) {
+       register struct FTAMselect *ftse = &ftg -> ftg_select;
+       register struct FTAMattributes *fa = &ftse -> ftse_attrs;
+
+       if (multi && ftse -> ftse_state != FSTATE_SUCCESS)
+           printf ("%s\n", fa -> fa_files[0]);
+       ftam_diag (ftse -> ftse_diags, ftse -> ftse_ndiag, 1,
+               ftse -> ftse_action);
+       if (ftse -> ftse_state != FSTATE_SUCCESS)
+           goto you_lose;
+
+       file = fa -> fa_files[0];
+    }
+
+    recurse = 0;
+
+    if (ftg -> ftg_flags & FTG_RDATTR) {
+       register struct FTAMreadattr   *ftra = &ftg -> ftg_readattr;
+       register struct FTAMattributes *fa = &ftra -> ftra_attrs;
+
+       ftam_diag (ftra -> ftra_diags, ftra -> ftra_ndiag, 1,
+               ftra -> ftra_action);
+       if (ftra -> ftra_action != FACTION_SUCCESS)
+           fa -> fa_present = 0;
+       fa -> fa_present &= ~fa -> fa_novalue;
+
+       if (top
+               && (fa -> fa_present & FA_FILENAME)
+               && vf -> vf_oid
+               && (fa -> fa_present & FA_CONTENTS)
+               && oid_cmp (vf -> vf_oid, fa -> fa_contents) == 0) {
+           recurse++;
+           if (!didrecurse && !first)
+#ifdef BRIDGE
+               fprintf (lsfp, "\r\n");
+#else
+               fprintf (lsfp, "\n");
+#endif
+       }
+       if (!invis)
+           invis = recurse && !multi;/* recurse depends on top */
+
+       if (dashl && !invis && !recurse) {
+           s = (fa -> fa_present & FA_ID_CREATE) ? fa -> fa_id_create : NULL;
+           ut = (fa -> fa_present & FA_DATE_MODIFY) ? &fa -> fa_date_modify
+                                                    : NULLUTC;
+
+           if (fa -> fa_present & FA_CONTENTS) {
+               register struct vfsmap *uf;
+
+               for (uf = vfs; uf -> vf_entry; uf++)
+                   if (oid_cmp (uf -> vf_oid, fa -> fa_contents) == 0)
+                       break;
+               fprintf (lsfp, "%c ", uf -> vf_entry ? uf -> vf_stat : ' ');
+           }
+           else
+               fprintf (lsfp, "  ");
+           fprintf (lsfp, "%-8.8s %-8.8s %8d ", s ? s : "",
+                   (fa -> fa_present & FA_ACCOUNT) ? fa -> fa_account : "",
+                   (fa -> fa_present & FA_FILESIZE) ? fa -> fa_filesize : 0);
+           if (ut) {
+               mtime = gtime (ut2tm (ut));
+               s = ctime (&mtime);
+               if (mtime < longtimeago || mtime > now)
+                   fprintf (lsfp, "%-7.7s %-4.4s ", s + 4, s + 20);
+               else
+                   fprintf (lsfp, "%-12.12s ", s + 4);
+           }
+           else
+               fprintf (lsfp, "             ");
+       }
+       if (!invis) {
+           char *dp;
+
+           dp = top && (fa -> fa_present & FA_FILENAME) ? fa -> fa_files[0]
+                       : entry;
+#ifdef BRIDGE
+           fprintf (lsfp, "%s%s\r\n", dp, multi && recurse ? ":" : "");
+#else
+           fprintf (lsfp, "%s%s\n", dp, multi && recurse ? ":" : "");
+#endif
+       }
+    }
+
+    if (ftg -> ftg_flags & FTG_DESELECT) {
+       register struct FTAMdeselect   *ftde = &ftg -> ftg_deselect;
+
+       ftam_diag (ftde -> ftde_diags, ftde -> ftde_ndiag, 1,
+               ftde -> ftde_action);
+       ftam_chrg (&ftde -> ftde_charges);
+    }
+
+    if (recurse) {
+       struct FADUidentity faduids;
+       register struct FADUidentity *faduid = &faduids;
+
+       faduid -> fa_type = FA_FIRSTLAST;
+       faduid -> fa_firstlast = FA_FIRST;
+
+       (void) fdffnx (NOTOK, (struct PSAPdata *) 0, 0);
+       (void) getvf (file, NULLCP, faduid, vf, fdffnx);
+
+       (void) fdfls (file);
+
+       (void) fdffnx (NOTOK, (struct PSAPdata *) 0, 0);
+       didrecurse++;
+    }
+
+    if (top && !last && didrecurse)
+       fprintf (lsfp, "\n");
+
+    FTGFREE (ftg);
+    return OK;
+
+you_lose: ;
+    FTGFREE (ftg);
+    return NOTOK;
+}
+
+/* \f */
+
+static int  fdfls (file)
+char   *file;
+{
+    register int    i,
+                   j,
+                    w;
+    int     columns,
+            width,
+            lines;
+    char   *bp,
+           buffer[BUFSIZ];
+    register struct filent *fi,
+                          **xi,
+                          **yi;
+
+    switch (realstore) {
+       case RFS_UNIX:
+           if (strcmp (file, ".")) {
+#ifdef apollo
+                if (*file == '/')
+                   (void) sprintf (bp = buffer, "%s", file);
+                else
+#endif
+               (void) sprintf (bp = buffer, "%s/", file);
+               bp += strlen (bp);
+               i = bp - buffer;
+               for (xi = &filents; fi = *xi;)
+                   if (strncmp (fi -> fi_name, buffer, i) == 0) {
+                       fi -> fi_entry = fi -> fi_name + i;
+                       if (!dashl && !silent && *fi -> fi_entry == '.') {
+                           *xi = fi -> fi_next;
+                           if (fi -> fi_name)
+                               free (fi -> fi_name);
+                           if (fi -> fi_oid)
+                               oid_free (fi -> fi_oid);
+                           free ((char *) fi);
+
+                           nfilent--;
+                       }
+                       else
+                           xi = &fi -> fi_next;
+                   }
+           }
+           else
+               bp = buffer;
+           break;
+
+       default:
+           bp = buffer;
+           break;
+    }
+    
+    switch (nfilent) {
+       case 0: 
+           break;
+
+       case 1: 
+           fi = filents;
+           if (dashl)
+               (void) ls (fi -> fi_name, fi -> fi_entry, 0, 1, 1, 0, 0);
+           else
+#ifdef BRIDGE
+               fprintf (lsfp, "%s\r\n", fi -> fi_entry);
+#else
+               fprintf (lsfp, "%s\n", fi -> fi_entry);
+#endif
+           break;
+
+       default: 
+           xi = (struct filent **)
+                               calloc ((unsigned) (nfilent + 1), sizeof *xi);
+           if (xi) {
+               for (fi = filents, yi = xi; fi; fi = fi -> fi_next)
+                   *yi++ = fi;
+               qsort ((char *) xi, nfilent, sizeof *xi, filcmp);
+           }
+
+           if (dashl) {
+               if (xi) {
+                   for (filents = NULL, yi--; yi >= xi; yi--) {
+                       fi = *yi;
+                       fi -> fi_next = filents;
+                       filents = fi;
+                   }
+
+                   free ((char *) xi);
+               }
+
+               for (fi = filents; fi; fi = fi -> fi_next)
+                   (void) ls (fi -> fi_name, fi -> fi_entry, 0, fi == filents,
+                               fi -> fi_next == NULL, 0, 1);
+               break;
+           }
+
+           if (!xi) {
+               for (fi = filents; fi; fi = fi -> fi_next)
+#ifdef BRIDGE
+                   fprintf (lsfp, "%s\r\n", fi -> fi_entry);
+#else
+                   fprintf (lsfp, "%s\n", fi -> fi_entry);
+#endif
+               break;
+           }
+
+           width = 0;
+           for (yi = xi; fi = *yi; yi++)
+               if ((w = strlen (fi -> fi_entry)) > width)
+                   width = w;
+           if (lsfp != stdout) {
+               columns = 1;
+               lines = nfilent;
+           }
+           else {
+               if ((columns = ncols (lsfp) / (width = (width + 8) & ~7)) == 0)
+                   columns = 1;
+               lines = (nfilent + columns - 1) / columns;
+           }
+           for (i = 0; i < lines; i++)
+               for (j = 0; j < columns; j++) {
+                   fi = xi[w = j * lines + i];
+                   fprintf (lsfp, "%s", fi -> fi_entry);
+                   if (w + lines >= nfilent) {
+#ifdef BRIDGE
+                       (void) fputc ('\r', lsfp);
+                       (void) fputc ('\n', lsfp);
+#else
+                       (void) fputc ('\n', lsfp);
+#endif
+                       break;
+                   }
+                   for (w = strlen (fi -> fi_entry);
+                           w < width;
+                           w = (w + 8) & ~7)
+                       (void) fputc ('\t', lsfp);
+               }
+           free ((char *) xi);
+    }
+
+    return OK;
+}
+
+/* \f */
+
+/* ARGSUSED */
+
+int    fdffnx (fd, px, status)
+int    fd;
+register struct PSAPdata *px;
+int    status;
+{
+    register int    i;
+    register PE            pe,
+                  *pep;
+    register struct filent *fi;
+
+    if (px == NULL) {
+       register struct filent *gi;
+
+       for (fi = filents; fi; fi = gi) {
+           gi = fi -> fi_next;
+           if (fi -> fi_name);
+               free (fi -> fi_name);
+           if (fi -> fi_oid)
+               oid_free (fi -> fi_oid);
+           free ((char *) fi);
+       }
+       filents = NULL, nfilent = toomany = 0;
+
+       silent = status;
+       return OK;
+    }
+
+    for (pep = px -> px_info, i = px -> px_ninfo - 1; i >= 0; pep++, i--) {
+       int     result;
+       struct type_DOCS_NBS__9__Datatype1 *d9;
+       struct FTAMattributes fas;
+       register struct FTAMattributes *fa = &fas;
+       struct FTAMindication ftis;
+
+       if ((pe = *pep) == NULLPE)
+           continue;
+
+       d9 = NULL;
+       if (decode_DOCS_NBS__9__Datatype1 (pe, 1, NULLIP, NULLVP, &d9)
+               == NOTOK) {
+           if (silent)
+               globerr = PY_pepy;
+           else
+               advise (NULLCP, "%s", PY_pepy);
+
+           if (d9)
+               free_DOCS_NBS__9__Datatype1 (d9);
+
+           continue;
+       }
+
+       if (debug)
+           WATCHP (DOCS_NBS__9__Datatype1, pe, 1);
+
+       bzero ((char *) fa, sizeof *fa);
+       result = fdf_d2attrs (ftamfd, d9, fa, &ftis);
+
+       free_DOCS_NBS__9__Datatype1 (d9);
+
+       if (result == NOTOK) {
+           register struct FTAMabort *fta = &ftis.fti_abort;
+
+           if (silent)
+               globerr = "unable to interpret datatype";
+           else
+               ftam_diag (fta -> fta_diags, fta -> fta_ndiag, fta -> fta_peer,
+                          FACTION_PERM);
+           FAFREE (fa);
+
+           continue;
+       }
+
+       fi = (struct filent *) calloc (1, sizeof *fi);
+       if (fi == NULL) {
+           if (toomany == 0) {
+               if (silent)
+                   globerr = "too many files, listing truncated";
+               else
+                   advise (NULLCP, "too many files, listing truncated");
+               toomany++;
+           }
+
+           FAFREE (fa);
+           break;
+       }
+
+       if (!(fa -> fa_present & (FA_FILENAME | FA_CONTENTS))) {
+           if (silent)
+               globerr = "no filename/contents found in FDF entry";
+           else
+               advise (NULLCP, "no filename/contents found in FDF entry");
+
+           FAFREE (fa);
+           continue;
+       }
+
+       fi -> fi_name = fa -> fa_files[0];
+       if (*fi -> fi_name == '/' && *(fi -> fi_name + 1) == '/')
+           fi -> fi_entry = fi -> fi_name + 1;
+       else
+           fi -> fi_entry = fi -> fi_name;
+       fa -> fa_files[0] = NULLCP;
+       fi -> fi_oid = fa -> fa_contents;
+       fa -> fa_contents = NULLOID;
+       fi -> fi_next = filents;
+       filents = fi, nfilent++;
+
+       FAFREE (fa);
+    }
+
+    PXFREE (px);
+
+    return status;
+}
+
+
+static int  filcmp (a, b)
+struct filent **a,
+             **b;
+{
+    return strcmp ((*a) -> fi_entry, (*b) -> fi_entry);
+}
diff --git a/usr/src/contrib/isode/ftam2/ftam-mgmt.c b/usr/src/contrib/isode/ftam2/ftam-mgmt.c
new file mode 100644 (file)
index 0000000..32f94dc
--- /dev/null
@@ -0,0 +1,702 @@
+/* ftam-mgmt.c - interactive initiator FTAM -- file management */
+
+#ifndef        lint
+static char *rcsid = "$Header: /f/osi/ftam2/RCS/ftam-mgmt.c,v 7.2 91/02/22 09:23:46 mrose Interim $";
+#endif
+
+/* 
+ * $Header: /f/osi/ftam2/RCS/ftam-mgmt.c,v 7.2 91/02/22 09:23:46 mrose Interim $
+ *
+ *
+ * $Log:       ftam-mgmt.c,v $
+ * Revision 7.2  91/02/22  09:23:46  mrose
+ * Interim 6.8
+ * 
+ * Revision 7.1  90/11/21  11:30:30  mrose
+ * sun
+ * 
+ * Revision 7.0  89/11/23  21:54:23  mrose
+ * Release 6.0
+ * 
+ */
+
+/*
+ *                               NOTICE
+ *
+ *    Acquisition, use, and distribution of this module and related
+ *    materials are subject to the restrictions of a license agreement.
+ *    Consult the Preface in the User's Manual for the full terms of
+ *    this agreement.
+ *
+ */
+
+
+#include <stdio.h>
+#include "ftamuser.h"
+
+/* \f */
+
+int    f_mv (vec)
+char  **vec;
+{
+#ifdef BRIDGE
+    register char *src;
+#else
+    int        sglobbed;
+    register char  *bp,
+                 **gp,
+                 **src;
+    char   *freedst = NULL,
+           buffer[BUFSIZ];
+#endif
+    register char  *dst;
+
+    if (*++vec == NULL) {
+#ifdef BRIDGE
+       return NOTOK;
+#else
+       if (getline ("source: ", buffer) == NOTOK || str2vec (buffer, vec) < 1)
+           return OK;
+       dst = NULL;
+#endif
+    }
+#ifdef BRIDGE
+    src = *vec;
+    if (*++vec == NULL)
+       return NOTOK;
+    dst = *vec;
+#else
+    else {
+       register char **ap;
+
+       for (ap = vec; *ap; ap++)
+           continue;
+       if (--ap != vec)
+           dst = *ap, *ap = NULL;
+       else
+           dst = NULL;
+    }
+#endif
+#ifndef        BRIDGE
+    if (!(src = xglob (vec, 1)))
+       return OK;
+    sglobbed = xglobbed;
+
+    if (dst == NULL) {
+       if (getline ("destination: ", buffer) == NOTOK) {
+           blkfree (src);
+           return OK;
+       }
+       switch (str2vec (buffer, vec)) {
+           case 0: 
+               switch (realstore) {
+                   case RFS_UNIX:
+                       dst = ".";
+                       break;
+
+                   default:
+                       advise (NULLCP, "need a destination");
+                       goto out;
+               }
+               break;
+
+           case 1: 
+               dst = *vec;
+               break;
+
+           default: 
+               advise (NULLCP, "too many destinations");
+               goto out;
+       }
+    }
+    if (!(dst = freedst = xglob1val (dst, 1)))
+       goto out;
+
+    if (src[1] == NULL) {
+       if (interrupted)
+           goto out;
+           
+       switch (realstore) {
+           case RFS_UNIX:
+               if (isdir (dst, NULLCP, 1) == NOTOK)
+                   break;
+#ifdef apollo
+                if (*dst == '/')
+                   (void) sprintf (bp = buffer, "%s", dst);
+                else
+#endif
+               (void) sprintf (bp = buffer, "%s/", dst);
+               bp += strlen (bp);
+               if (dst = rindex (*src, '/'))
+                   dst++;
+               if (dst == NULL || *dst == NULL)
+                   dst = *src;
+               (void) strcpy (bp, dst);
+               dst = buffer;
+
+               switch (ask ("mv %s %s", *src, dst)) {
+                   case NOTOK: 
+                       goto out;
+
+                   case OK: 
+                   default: 
+                       break;
+
+                   case DONE: 
+                       goto out;
+               }
+               break;
+
+           default:
+               break;
+       }
+
+       (void) mv (*src, dst, 0);
+       goto out;
+    }
+
+    switch (realstore) {
+       case RFS_UNKNOWN: 
+           advise (NULLCP, "%s", rs_unknown);
+           goto out;
+
+       case RFS_UNIX: 
+#ifdef apollo
+            if (*dst == '/')
+                (void) sprintf (bp = buffer, "%s", dst);
+            else
+#endif
+           (void) sprintf (bp = buffer, "%s/", dst);
+           bp += strlen (bp);
+           break;
+
+       default: 
+           advise (NULLCP, "%s", rs_support);
+           goto out;
+    }
+
+    if (isdir (dst, NULLCP, 0) == NOTOK)
+       goto out;
+
+    for (gp = src; *gp; gp++) {
+       switch (realstore) {
+           case RFS_UNIX:
+               if (dst = rindex (*gp, '/'))
+                   dst++;
+               if (dst == NULL || *dst == NULL)
+                   dst = *gp;
+               break;
+
+           default:
+               dst = *gp;
+       }
+       (void) strcpy (bp, dst);
+       dst = str2file (buffer);
+
+       if (sglobbed) {
+           if (query)
+               switch (ask ("mv %s %s", *gp, dst)) {
+                   case NOTOK:
+                       continue;
+
+                   case OK:
+                   default:
+                       break;
+
+                   case DONE:
+                       goto out;
+               }
+           else
+               advise (NULLCP, "mv %s %s", *gp, dst);
+       }
+
+       (void) mv (*gp, dst, 1);
+
+       if (ftamfd == NOTOK)
+           break;
+    }
+#else
+    return mv (src, dst, 0);
+#endif
+
+#ifndef        BRIDGE
+out: ;
+    blkfree (src);
+    if (freedst)
+       free (freedst);
+
+    return OK;
+#endif
+}
+
+/* \f */
+
+static int  mv (src, dst, multi)
+char   *src,
+       *dst;
+int    multi;
+{
+    struct FTAMgroup    ftgs;
+    register struct FTAMgroup  *ftg = &ftgs;
+    struct FTAMindication   ftis;
+    register struct FTAMindication *fti = &ftis;
+
+    bzero ((char *) ftg, sizeof *ftg);
+    ftg -> ftg_flags |= FTG_BEGIN | FTG_END;
+    ftg -> ftg_threshold = 0;
+
+    ftg -> ftg_flags |= FTG_SELECT;
+    {
+       register struct FTAMselect *ftse = &ftg -> ftg_select;
+       register struct FTAMattributes *fa = &ftse -> ftse_attrs;
+
+       fa -> fa_present = FA_FILENAME;
+       fa -> fa_nfile = 0;
+       fa -> fa_files[fa -> fa_nfile++] = src;
+
+       ftse -> ftse_access = FA_PERM_CHNGATTR;
+       FCINIT (&ftse -> ftse_conctl);
+    }
+    ftg -> ftg_threshold++;
+
+    ftg -> ftg_flags |= FTG_CHATTR;
+    {
+       register struct FTAMchngattr   *ftca = &ftg -> ftg_chngattr;
+       register struct FTAMattributes *fa = &ftca -> ftca_attrs;
+
+       fa -> fa_present = FA_FILENAME;
+       fa -> fa_nfile = 0;
+       fa -> fa_files[fa -> fa_nfile++] = dst;
+    }
+    ftg -> ftg_threshold++;
+
+    ftg -> ftg_flags |= FTG_DESELECT;
+    ftg -> ftg_threshold++;
+
+    if (FManageRequest (ftamfd, ftg, fti) == NOTOK) {
+       ftam_advise (&fti -> fti_abort, "F-MANAGE.REQUEST");
+       return NOTOK;
+    }
+
+    ftg = &fti -> fti_group;
+
+    if (ftg -> ftg_flags & FTG_SELECT) {
+       register struct FTAMselect *ftse = &ftg -> ftg_select;
+
+       if (multi && ftse -> ftse_state != FSTATE_SUCCESS)
+           printf ("%s\n", src);
+       ftam_diag (ftse -> ftse_diags, ftse -> ftse_ndiag, 1, 
+               ftse -> ftse_action);
+       if (ftse -> ftse_state != FSTATE_SUCCESS)
+           goto you_lose;
+    }
+
+    if (ftg -> ftg_flags & FTG_CHATTR) {
+       register struct FTAMchngattr   *ftca = &ftg -> ftg_chngattr;
+
+       ftam_diag (ftca -> ftca_diags, ftca -> ftca_ndiag, 1,
+               ftca -> ftca_action);
+    }
+
+    if (ftg -> ftg_flags & FTG_DESELECT) {
+       register struct FTAMdeselect   *ftde = &ftg -> ftg_deselect;
+
+       ftam_diag (ftde -> ftde_diags, ftde -> ftde_ndiag, 1,
+               ftde -> ftde_action);
+       ftam_chrg (&ftde -> ftde_charges);
+    }
+
+    FTGFREE (ftg);
+    return OK;
+
+you_lose: ;
+    FTGFREE (ftg);
+    return NOTOK;
+}
+
+/* \f */
+
+int    f_rm (vec)
+char  **vec;
+{
+#ifndef        BRIDGE
+    int     multi;
+    char    buffer[BUFSIZ];
+#endif
+
+    if (*++vec == NULL) {
+#ifdef BRIDGE
+       return NOTOK;
+#else
+       if (getline ("file: ", buffer) == NOTOK || str2vec (buffer, vec) < 1)
+           return OK;
+#endif
+    }
+
+#ifdef BRIDGE
+    return rm (*vec, 0);
+#else
+    if (vec = xglob (vec, 1)) {
+       register char **gp;
+
+       multi = vec[1] ? 1 : 0;
+
+       for (gp = vec; *gp && !interrupted; gp++) {
+           if (xglobbed && query)
+               switch (ask ("rm %s", *gp)) {
+                   case NOTOK:
+                       continue;
+
+                   case OK:
+                   default:
+                       break;
+
+                   case DONE:
+                       goto out;
+               }
+                   
+           (void) rm (*gp, multi);
+
+           if (ftamfd == NOTOK)
+               break;
+       }
+
+out: ;
+       blkfree (vec);
+    }
+
+    return OK;
+#endif
+}
+
+/* \f */
+
+static int  rm (file, multi)
+char   *file;
+int    multi;
+{
+    struct FTAMgroup    ftgs;
+    register struct FTAMgroup  *ftg = &ftgs;
+    struct FTAMindication   ftis;
+    register struct FTAMindication *fti = &ftis;
+
+    bzero ((char *) ftg, sizeof *ftg);
+    ftg -> ftg_flags |= FTG_BEGIN | FTG_END;
+    ftg -> ftg_threshold = 0;
+
+    ftg -> ftg_flags |= FTG_SELECT;
+    {
+       register struct FTAMselect *ftse = &ftg -> ftg_select;
+       register struct FTAMattributes *fa = &ftse -> ftse_attrs;
+
+       fa -> fa_present = FA_FILENAME;
+       fa -> fa_nfile = 0;
+       fa -> fa_files[fa -> fa_nfile++] = file;
+
+       ftse -> ftse_access = FA_PERM_DELETE;
+       FCINIT (&ftse -> ftse_conctl);
+    }
+    ftg -> ftg_threshold++;
+
+    ftg -> ftg_flags |= FTG_DELETE;
+    ftg -> ftg_threshold++;
+
+    if (FManageRequest (ftamfd, ftg, fti) == NOTOK) {
+       ftam_advise (&fti -> fti_abort, "F-MANAGE.REQUEST");
+       return NOTOK;
+    }
+
+    ftg = &fti -> fti_group;
+
+    if (ftg -> ftg_flags & FTG_SELECT) {
+       register struct FTAMselect *ftse = &ftg -> ftg_select;
+
+       if (multi && ftse -> ftse_state != FSTATE_SUCCESS)
+           printf ("%s\n", file);
+       ftam_diag (ftse -> ftse_diags, ftse -> ftse_ndiag, 1,
+               ftse -> ftse_action);
+       if (ftse -> ftse_state != FSTATE_SUCCESS)
+           goto you_lose;
+    }
+
+    if (ftg -> ftg_flags & FTG_DELETE) {
+       register struct FTAMdelete   *ftxe = &ftg -> ftg_delete;
+
+       ftam_diag (ftxe -> ftxe_diags, ftxe -> ftxe_ndiag, 1,
+               ftxe -> ftxe_action);
+       ftam_chrg (&ftxe -> ftxe_charges);
+    }
+
+    FTGFREE (ftg);
+    return OK;
+
+you_lose: ;
+    FTGFREE (ftg);
+    return NOTOK;
+}
+
+/* \f */
+
+#ifndef        BRIDGE
+int    f_chgrp (vec)
+char  **vec;
+{
+    int     multi;
+    char    group[8 + 1];
+    char    buffer[BUFSIZ];
+
+    if (!(attrs & FATTR_STORAGE)) {
+       advise (NULLCP, "no support for storage attributes");
+       return OK;
+    }
+
+    if (*++vec == NULL) {
+       if (getline ("group: ", buffer) == NOTOK || str2vec (buffer, vec) < 1)
+           return OK;
+    }
+
+    (void) strcpy (group, vec[0]);
+
+    if (*++vec == NULL) {
+       if (getline ("file: ", buffer) == NOTOK || str2vec (buffer, vec) < 1)
+           return OK;
+    }
+
+    if (vec = xglob (vec, 1)) {
+       register char **gp;
+
+       multi = vec[1] ? 1 : 0;
+
+       for (gp = vec; *gp && !interrupted; gp++) {
+           if (xglobbed && query)
+               switch (ask ("chgrp %s %s", group, *gp)) {
+                   case NOTOK:
+                       continue;
+
+                   case OK:
+                   default:
+                       break;
+
+                   case DONE:
+                       goto out;
+               }
+                   
+           (void) chgrp (group, *gp, multi);
+
+           if (ftamfd == NOTOK)
+               break;
+       }
+
+out: ;
+       blkfree (vec);
+    }
+
+    return OK;
+}
+
+/* \f */
+
+static int  chgrp (group, file, multi)
+char   *group,
+       *file;
+int    multi;
+{
+    struct FTAMgroup    ftgs;
+    register struct FTAMgroup  *ftg = &ftgs;
+    struct FTAMindication   ftis;
+    register struct FTAMindication *fti = &ftis;
+
+    bzero ((char *) ftg, sizeof *ftg);
+    ftg -> ftg_flags |= FTG_BEGIN | FTG_END;
+    ftg -> ftg_threshold = 0;
+
+    ftg -> ftg_flags |= FTG_SELECT;
+    {
+       register struct FTAMselect *ftse = &ftg -> ftg_select;
+       register struct FTAMattributes *fa = &ftse -> ftse_attrs;
+
+       fa -> fa_present = FA_FILENAME;
+       fa -> fa_nfile = 0;
+       fa -> fa_files[fa -> fa_nfile++] = file;
+
+       ftse -> ftse_access = FA_PERM_CHNGATTR;
+       FCINIT (&ftse -> ftse_conctl);
+    }
+    ftg -> ftg_threshold++;
+
+    ftg -> ftg_flags |= FTG_CHATTR;
+    {
+       register struct FTAMchngattr   *ftca = &ftg -> ftg_chngattr;
+       register struct FTAMattributes *fa = &ftca -> ftca_attrs;
+
+       fa -> fa_present = FA_ACCOUNT;
+       fa -> fa_account = group;
+    }
+    ftg -> ftg_threshold++;
+
+    ftg -> ftg_flags |= FTG_DESELECT;
+    ftg -> ftg_threshold++;
+
+    if (FManageRequest (ftamfd, ftg, fti) == NOTOK) {
+       ftam_advise (&fti -> fti_abort, "F-MANAGE.REQUEST");
+       return NOTOK;
+    }
+
+    ftg = &fti -> fti_group;
+
+    if (ftg -> ftg_flags & FTG_SELECT) {
+       register struct FTAMselect *ftse = &ftg -> ftg_select;
+
+       if (multi && ftse -> ftse_state != FSTATE_SUCCESS)
+           printf ("%s\n", file);
+       ftam_diag (ftse -> ftse_diags, ftse -> ftse_ndiag, 1, 
+               ftse -> ftse_action);
+       if (ftse -> ftse_state != FSTATE_SUCCESS)
+           goto you_lose;
+    }
+
+    if (ftg -> ftg_flags & FTG_CHATTR) {
+       register struct FTAMchngattr   *ftca = &ftg -> ftg_chngattr;
+
+       ftam_diag (ftca -> ftca_diags, ftca -> ftca_ndiag, 1,
+               ftca -> ftca_action);
+    }
+
+    if (ftg -> ftg_flags & FTG_DESELECT) {
+       register struct FTAMdeselect   *ftde = &ftg -> ftg_deselect;
+
+       ftam_diag (ftde -> ftde_diags, ftde -> ftde_ndiag, 1,
+               ftde -> ftde_action);
+       ftam_chrg (&ftde -> ftde_charges);
+    }
+
+    FTGFREE (ftg);
+    return OK;
+
+you_lose: ;
+    FTGFREE (ftg);
+    return NOTOK;
+}
+#endif
+
+/* \f */
+
+int    f_mkdir (vec)
+char  **vec;
+{
+#ifndef        BRIDGE
+    int            multi;
+    register char  *dir;
+    char    buffer[BUFSIZ];
+#endif
+
+    if (*++vec == NULL) {
+#ifdef BRIDGE
+       return NOTOK;
+#else
+       if (getline ("directory: ", buffer) == NOTOK
+               || str2vec (buffer, vec) < 1)
+           return OK;
+
+       (void) makedir (str2file (*vec), 0);
+#endif
+    }
+#ifdef BRIDGE
+    return makedir (str2file (*vec));
+#else
+    else {
+       multi = vec[1] ? 1 : 0;
+
+       while (dir = *vec++)
+           (void) makedir (str2file (dir), multi);
+    }
+
+    return OK;
+#endif
+}
+
+/* \f */
+
+static int  makedir (dir, multi)
+char   *dir;
+int    multi;
+{
+    struct FTAMgroup    ftgs;
+    register struct FTAMgroup  *ftg = &ftgs;
+    struct FTAMindication   ftis;
+    register struct FTAMindication *fti = &ftis;
+    struct vfsmap *vf = &vfs[VFS_FDF];
+
+    if (vf -> vf_oid == NULLOID) {
+       advise (NULLCP, "no support for %ss", vf -> vf_text);
+       return NOTOK;
+    }
+
+    bzero ((char *) ftg, sizeof *ftg);
+    ftg -> ftg_flags |= FTG_BEGIN | FTG_END;
+    ftg -> ftg_threshold = 0;
+
+    ftg -> ftg_flags |= FTG_CREATE;
+    {
+       register struct FTAMcreate *ftce = &ftg -> ftg_create;
+       register struct FTAMattributes *fa = &ftce -> ftce_attrs;
+
+       ftce -> ftce_override = FOVER_FAIL;
+
+       fa -> fa_present = FA_FILENAME;
+       fa -> fa_nfile = 0;
+       fa -> fa_files[fa -> fa_nfile++] = dir;
+
+       fa -> fa_present |= FA_ACTIONS;
+/*for NBS Phase 2 creation of directories is not               */
+/*allowed; so the access mode and the permitted actions */
+/*below which includes "EXTEND" will have to be checked */
+/*once creation of NSB-9 dir. file type is defined      */
+       fa -> fa_permitted = FA_PERM_READ | FA_PERM_EXTEND
+                                       | FA_PERM_READATTR | FA_PERM_CHNGATTR
+                               | FA_PERM_DELETE | FA_PERM_TRAV;
+
+       fa -> fa_present |= FA_CONTENTS;
+       fa -> fa_contents = vf -> vf_oid;
+
+       ftce -> ftce_access = FA_PERM_EXTEND;
+       FCINIT (&ftce -> ftce_conctl);
+    }
+    ftg -> ftg_threshold++;
+
+    ftg -> ftg_flags |= FTG_DESELECT;
+    ftg -> ftg_threshold++;
+
+    if (FManageRequest (ftamfd, ftg, fti) == NOTOK) {
+       ftam_advise (&fti -> fti_abort, "F-MANAGE.REQUEST");
+       return NOTOK;
+    }
+
+    ftg = &fti -> fti_group;
+
+    if (ftg -> ftg_flags & FTG_CREATE) {
+       register struct FTAMcreate *ftce = &ftg -> ftg_create;
+
+       if (multi && ftce -> ftce_state != FSTATE_SUCCESS)
+           printf ("%s\n", dir);
+       ftam_diag (ftce -> ftce_diags, ftce -> ftce_ndiag, 1, 
+               ftce -> ftce_action);
+       if (ftce -> ftce_state != FSTATE_SUCCESS)
+           goto you_lose;
+    }
+
+    if (ftg -> ftg_flags & FTG_DESELECT) {
+       register struct FTAMdeselect   *ftde = &ftg -> ftg_deselect;
+
+       ftam_diag (ftde -> ftde_diags, ftde -> ftde_ndiag, 1,
+               ftde -> ftde_action);
+       ftam_chrg (&ftde -> ftde_charges);
+    }
+
+    FTGFREE (ftg);
+    return OK;
+
+you_lose: ;
+    FTGFREE (ftg);
+    return NOTOK;
+}
diff --git a/usr/src/contrib/isode/ftam2/ftam-put.c b/usr/src/contrib/isode/ftam2/ftam-put.c
new file mode 100644 (file)
index 0000000..9d7e2f0
--- /dev/null
@@ -0,0 +1,1085 @@
+/* ftam-put.c - interactive initiator FTAM -- "put" */
+
+#ifndef        lint
+static char *rcsid = "$Header: /f/osi/ftam2/RCS/ftam-put.c,v 7.9 91/02/22 09:23:48 mrose Interim $";
+#endif
+
+/* 
+ * $Header: /f/osi/ftam2/RCS/ftam-put.c,v 7.9 91/02/22 09:23:48 mrose Interim $
+ *
+ *
+ * $Log:       ftam-put.c,v $
+ * Revision 7.9  91/02/22  09:23:48  mrose
+ * Interim 6.8
+ * 
+ * Revision 7.8  90/12/23  18:40:03  mrose
+ * update
+ * 
+ * Revision 7.7  90/11/21  11:30:33  mrose
+ * sun
+ * 
+ * Revision 7.6  90/09/07  11:14:04  mrose
+ * update
+ * 
+ * Revision 7.5  90/08/29  15:02:20  mrose
+ * fixes
+ * 
+ * Revision 7.4  90/08/14  14:28:31  mrose
+ * T1
+ * 
+ * Revision 7.3  90/07/01  21:03:16  mrose
+ * pepsy
+ * 
+ * Revision 7.2  90/01/16  22:37:17  mrose
+ * very last time
+ * 
+ * Revision 7.1  90/01/11  18:35:43  mrose
+ * real-sync
+ * 
+ * Revision 7.0  89/11/23  21:54:24  mrose
+ * Release 6.0
+ * 
+ */
+
+/*
+ *                               NOTICE
+ *
+ *    Acquisition, use, and distribution of this module and related
+ *    materials are subject to the restrictions of a license agreement.
+ *    Consult the Preface in the User's Manual for the full terms of
+ *    this agreement.
+ *
+ */
+
+
+#include <errno.h>
+#include <stdio.h>
+#include "ftamuser.h"
+
+
+
+/* \f */
+
+int    f_put (vec)
+char  **vec;
+{
+    int     append;
+#ifdef BRIDGE
+    int     result;
+    register char  *dst;
+#else
+    int            sglobbed;
+    register char  *bp,
+                   *dst,
+                  **gp,
+                  **src;
+    char   *freedst = NULL,
+           buffer[BUFSIZ];
+#endif
+
+    append = strcmp (*vec, "append") == 0;
+
+    if (*++vec == NULL) {
+#ifdef BRIDGE
+       return NOTOK;
+#else
+       if (getline ("source: ", buffer) == NOTOK || str2vec (buffer, vec) < 1)
+           return OK;
+       dst = NULL;
+#endif
+    }
+    else {
+#ifdef BRIDGE
+       dst = *vec;
+#else
+       register char **ap;
+
+       for (ap = vec; *ap; ap++)
+           continue;
+       if (--ap != vec)
+           dst = *ap, *ap = NULL;
+       else
+           dst = NULL;
+#endif
+    }
+#ifndef        BRIDGE
+    if (!(src = xglob (vec, 0)))
+       return OK;
+    sglobbed = xglobbed;
+
+    if (dst == NULL) {
+       if (getline ("destination: ", buffer) == NOTOK) {
+           blkfree (src);
+           return OK;
+       }
+       switch (str2vec (buffer, vec)) {
+           case 0: 
+               break;
+
+           case 1: 
+               dst = *vec;
+               break;
+
+           default: 
+               advise (NULLCP, "too many destinations");
+               goto out;
+       }
+    }
+    if (dst && !(dst = freedst = xglob1val (dst, 0)))
+       goto out;
+
+    if (src[1] == NULL) {
+       if (interrupted)
+           goto out;
+
+       if (dst == NULL) {
+           switch (realstore) {
+               case RFS_UNIX: 
+                   if (dst = rindex (*src, '/'))
+                       dst++;
+                   if (dst == NULL || *dst == NULL)
+                       dst = *src;
+                   break;
+
+               default: 
+                   dst = *src;
+                   break;
+           }
+           dst = str2file (dst);
+
+ask_it: ;
+           if (query)
+               switch (ask ("%s %s %s", append ? "append" : "put", *src,
+                       dst)) {
+                   case NOTOK: 
+                       goto out;
+
+                   case OK: 
+                   default: 
+                       break;
+
+                   case DONE: 
+                       goto out;
+               }
+       }
+       else
+           switch (realstore) {
+               case RFS_UNIX:
+                   if (isdir (dst, NULLCP, 1) == NOTOK)
+                       break;
+#ifdef apollo
+                    if (*dst == '/')
+                        (void) sprintf (bp = buffer, "%s", dst);
+                    else
+#endif
+                   (void) sprintf (bp = buffer, "%s/", dst);
+                   bp += strlen (bp);
+                   if (dst = rindex (*src, '/'))
+                       dst++;
+                   if (dst == NULL || *dst == NULL)
+                       dst = *src;
+                   (void) strcpy (bp, dst);
+                   dst = buffer;
+                   goto ask_it;
+
+               default:
+                   break;
+           }
+
+       dst = str2file (dst);
+       (void) put (*src, dst, append);
+       goto out;
+    }
+
+    switch (realstore) {
+       case RFS_UNKNOWN: 
+           advise (NULLCP, "%s", rs_unknown);
+           goto out;
+
+       case RFS_UNIX: 
+           if (dst)
+#ifdef apollo
+                if (*(bp = str2file (dst)) == '/') {
+                   (void) strcpy (buffer, bp);
+                   bp = buffer;
+               }
+                else
+#endif
+               (void) sprintf (bp = buffer, "%s/", str2file (dst));
+           else
+               if (rcwd)
+                   (void) sprintf (bp = buffer, "%s", str2file (""));
+               else
+                   (void) strcpy (bp = buffer, "./");
+           bp += strlen (bp);
+           break;
+
+       default: 
+           advise (NULLCP, "%s", rs_support);
+           goto out;
+    }
+
+    if (isdir (str2file (buffer), NULLCP, 0) == NOTOK)
+       goto out;
+
+    for (gp = src; *gp && !interrupted; gp++) {
+       switch (realstore) {
+           case RFS_UNIX:
+               if (dst = rindex (*gp, '/'))
+                   dst++;
+               if (dst == NULL || *dst == NULL)
+                   dst = *gp;
+               break;
+
+           default:
+               dst = *gp;
+               break;
+       }
+       (void) strcpy (bp, dst);
+       dst = str2file (buffer);
+
+       if (sglobbed) {
+           if (query)
+               switch (ask ("%s %s %s", append ? "append" : "put", *gp, dst)){
+                   case NOTOK:
+                       continue;
+
+                   case OK:
+                   default:
+                       break;
+
+                   case DONE:
+                       goto out;
+               }
+           else
+               advise (NULLCP, "%s %s %s", append ? "append" : "put", *gp,
+                       dst);
+       }
+
+       (void) put (*gp, dst, append);
+
+       if (ftamfd == NOTOK)
+           break;
+    }
+
+out: ;
+    blkfree (src);
+    if (freedst)
+       free (freedst);
+
+    return OK;
+#else
+    result = put (dst, append);
+    return result;
+#endif
+}
+
+/* \f */
+
+#ifdef BRIDGE
+static int  put (dst, append)
+char   *dst;
+#else
+static int  put (src, dst, append)
+char   *src,
+       *dst;
+#endif
+int    append;
+{
+    int     bsize,
+            fd,
+           magic,
+            result,
+            size;
+    PE     pe;
+#ifndef        BRIDGE
+    struct stat st;
+#endif
+    struct vfsmap  *vf;
+
+#ifdef BRIDGE
+    if ((fd = dataconn (dst)) == NOTOK) {
+       advise (dst, "unable to open");
+       return NOTOK;
+    }
+#else
+    if ((fd = open (src, O_RDONLY)) == NOTOK) {
+       advise (src, "unable to open");
+       return NOTOK;
+    }
+#endif
+
+#ifndef        BRIDGE
+    if (fstat (fd, &st) == NOTOK) {
+       advise (src, "unable to fstat");
+you_lose: ;
+       (void) close (fd);
+       return NOTOK;
+    }
+    if ((st.st_mode & S_IFMT) != S_IFREG) {
+       advise (NULLCP, "%s: not a regular file", src);
+       goto you_lose;
+    }
+#endif
+
+#ifdef BRIDGE
+    vf = &vfs[tmode];
+#else
+    if ((vf = st2vfs (fd, src, &st, vfs[tmode].vf_oid, ftamfd)) == NULL) {
+       advise (NULLCP, "unable to determine document type for %s", src);
+       goto you_lose;
+    }
+    if (vf == &vfs[VFS_FDF]) {
+       advise (NULLCP, "%s is a %s", src, vf -> vf_text);
+       goto you_lose;
+    }
+#endif
+    if (tmode != vf - vfs && tmode != VFS_DEF)
+       advise (NULLCP, "negotiating %s transfer", vf -> vf_text);
+
+    if ((pe = pe_alloc (PE_CLASS_UNIV, PE_FORM_PRIM, PE_PRIM_OCTS))
+           == NULLPE) {
+       advise (NULLCP, "out of memory");
+#ifdef BRIDGE
+you_lose: ;
+       (void) close (fd);
+       return NOTOK;
+#else
+       goto you_lose;
+#endif
+    }
+
+    switch (vf - vfs) {
+       case VFS_UTF: 
+           if ((magic = fadusize - MAGIC_OCTET1) < 0)
+               magic = 0;
+           break;
+
+       case VFS_UBF:
+       default:
+           if ((magic = fadusize - MAGIC_SINGLE) < 0)
+               magic = 0;
+           break;
+    }
+
+    if (magic > 6 * 1024)      /* FTAM profile T1 or A/111 limits  to 7K */
+       magic = 6 * 1024;
+#ifdef BRIDGE
+    bsize = BUFSIZ << 2;
+    size = magic >= bsize ? magic : bsize;
+    if (size > bsize)
+       size -= size % bsize;
+#else
+#ifndef        MAXBSIZE
+    bsize = BUFSIZ;
+#else
+    bsize = st.st_blksize > 0 ? st.st_blksize : BUFSIZ;
+#endif
+    size = (1024 <= magic && magic < bsize) ? magic : bsize;
+#endif
+    if (watch) {
+#ifndef        BRIDGE
+       printf ("Selecting FADU size of %d\n", size);
+       printf ("based on blksize of %d and estimated integral FADU size of %d\n",
+               bsize, magic);
+#endif
+    }
+
+    if ((pe -> pe_prim = PEDalloc (pe -> pe_len = size)) == NULLPED) {
+       advise (NULLCP, "out of memory");
+       pe_free (pe);
+       goto you_lose;
+    }
+
+#ifdef BRIDGE
+    result = putaux (dst, append, fd, pe, vf, size);
+#else
+    result = putaux (src, dst, append, fd, pe, vf, size);
+#endif
+
+    pe_free (pe);
+
+    (void) close (fd);
+
+    return result;
+}
+
+/* \f */
+
+#ifdef BRIDGE
+static int  putaux (dst, append, fd, pe, vf, size)
+char   *dst;
+#else
+static int  putaux (src, dst, append, fd, pe, vf, size)
+char   *src,
+       *dst;
+#endif
+int    append,
+       fd;
+PE      pe;
+struct vfsmap  *vf;
+int    size;
+{
+    register int    n;
+    int     cc,
+           effector,
+           gd,
+           nc,
+            reason,
+           result;
+    PE     de,
+           param;
+#ifdef BRIDGE
+    char line[BUFSIZ];
+#endif
+    struct FADUidentity faduids;
+    register struct FADUidentity   *faduid = &faduids;
+    struct FTAMgroup    ftgs;
+    register struct FTAMgroup  *ftg = &ftgs;
+    struct FTAMindication   ftis;
+    register struct FTAMindication *fti = &ftis;
+    register struct FTAMabort  *fta = &fti -> fti_abort;
+    FILE *fp;
+
+    pe -> pe_context = vf -> vf_id;
+
+    param = NULLPE;
+    if (vf -> vf_parameter
+           && enc_f (vf -> vf_number, &_ZDOCS_mod, &param, 1, 0, NULLCP,
+                     vf -> vf_parameter) == NOTOK) {
+       advise (NULLCP, "unable to build document type parameter: %s",
+               PY_pepy);
+       return NOTOK;
+    }
+
+    bzero ((char *) ftg, sizeof *ftg);
+    ftg -> ftg_flags |= FTG_BEGIN | FTG_END;
+    ftg -> ftg_threshold = 0;
+
+    if (omode == FOVER_SELECT)
+       append = 1;
+    if (units & FUNIT_LIMITED) {
+       ftg -> ftg_flags |= FTG_CREATE;
+       {
+           register struct FTAMcreate *ftce = &ftg -> ftg_create;
+           register struct FTAMattributes *fa = &ftce -> ftce_attrs;
+
+           ftce -> ftce_override = append ? FOVER_SELECT : omode;
+
+           fa -> fa_present = FA_FILENAME;
+           fa -> fa_nfile = 0;
+           fa -> fa_files[fa -> fa_nfile++] = dst;
+
+           fa -> fa_present |= FA_ACTIONS;
+           fa -> fa_permitted = FA_PERM_READ | FA_PERM_REPLACE
+                                       | FA_PERM_EXTEND | FA_PERM_READATTR
+                                       | FA_PERM_CHNGATTR | FA_PERM_DELETE
+                                       | FA_PERM_TRAV;
+
+           fa -> fa_present |= FA_CONTENTS;
+           fa -> fa_contents = vf -> vf_oid;
+           fa  -> fa_parameter = param;
+
+           ftce -> ftce_access = append ? FA_PERM_EXTEND : FA_PERM_REPLACE;
+           FCINIT (&ftce -> ftce_conctl);
+       }
+    }
+    else {
+       ftg -> ftg_flags |= FTG_SELECT;
+       {
+           register struct FTAMselect *ftse = &ftg -> ftg_select;
+           register struct FTAMattributes *fa = &ftse -> ftse_attrs;
+
+           if (!append && omode == FOVER_FAIL) {
+               advise (NULLCP,
+                       "lack of limited-file-management conflicts with setting of \"override\" variable");
+               return NOTOK;
+           }
+
+           fa -> fa_present = FA_FILENAME;
+           fa -> fa_nfile = 0;
+           fa -> fa_files[fa -> fa_nfile++] = dst;
+
+           ftse -> ftse_access = append ? FA_PERM_EXTEND : FA_PERM_REPLACE;
+           FCINIT (&ftse -> ftse_conctl);
+       }
+    }
+    
+    ftg -> ftg_threshold++;
+
+    ftg -> ftg_flags |= FTG_OPEN;
+    {
+       register struct FTAMopen   *ftop = &ftg -> ftg_open;
+
+       ftop -> ftop_contents = vf -> vf_oid;
+       ftop -> ftop_parameter = param;
+       FCINIT (&ftop -> ftop_conctl);
+       if (append) {
+           ftop -> ftop_mode = FA_PERM_EXTEND;
+            if (concurrency)
+               ftop -> ftop_conctl.fc_extendlock = FLOCK_EXCLUSIVE;
+       }
+       else {
+           ftop -> ftop_mode = FA_PERM_REPLACE;
+            if (concurrency)
+               ftop -> ftop_conctl.fc_replacelock = FLOCK_EXCLUSIVE;
+       }
+    }
+    ftg -> ftg_threshold++;
+
+    result = FBulkBeginRequest (ftamfd, ftg, fti);
+
+    if (param)
+       pe_free (param);
+
+    if (result == NOTOK) {
+       ftam_advise (fta, "F-BULK-BEGIN.REQUEST");
+       return NOTOK;
+    }
+
+    ftg = &fti -> fti_group;
+
+    if (ftg -> ftg_flags & FTG_SELECT) {
+           register struct FTAMselect *ftse = &ftg -> ftg_select;
+
+           ftam_diag (ftse -> ftse_diags, ftse -> ftse_ndiag, 1,
+                      ftse -> ftse_action);
+           if (ftse -> ftse_state != FSTATE_SUCCESS)
+               goto you_lose;
+    }
+    else
+       if (ftg -> ftg_flags & FTG_CREATE) {
+           register struct FTAMcreate *ftce = &ftg -> ftg_create;
+
+           ftam_diag (ftce -> ftce_diags, ftce -> ftce_ndiag, 1,
+                      ftce -> ftce_action);
+           if (ftce -> ftce_state != FSTATE_SUCCESS)
+               goto you_lose;
+       }
+
+    if (ftg -> ftg_flags & FTG_OPEN) {
+       register struct FTAMopen   *ftop = &ftg -> ftg_open;
+
+       ftam_diag (ftop -> ftop_diags, ftop -> ftop_ndiag, 1,
+               ftop -> ftop_action);
+       if (ftop -> ftop_state != FSTATE_SUCCESS)
+           goto you_lose;
+
+       for (myvf = vfs; myvf -> vf_entry; myvf++)
+           if (oid_cmp (myvf -> vf_oid, ftop -> ftop_contents) == 0)
+               break;
+       switch (myvf - vfs) {
+           case VFS_UTF: 
+               pe -> pe_id = (PElementID)
+                                   ((struct type_DOCS_FTAM__1__Parameters *)
+                                                       myvf -> vf_parameter)
+                                           -> universal__class__number;
+               /* and fall... */
+           case VFS_UBF: 
+               effector = 1;
+               if (ftop -> ftop_parameter && myvf -> vf_number >= 0) {
+                   caddr_t parm = NULL;
+
+                   if (dec_f (myvf -> vf_number, &_ZDOCS_mod,
+                              ftop -> ftop_parameter, 1, NULLIP, NULLVP,
+                              &parm) == NOTOK)
+                       advise (NULLCP,
+                               "unable to parse document type parameter: %s",
+                               PY_pepy);
+                   else
+                       switch (myvf - vfs) {
+                           case VFS_UTF:
+                               {
+                                   register struct type_DOCS_FTAM__1__Parameters *p1 =
+                                       (struct type_DOCS_FTAM__1__Parameters *)
+                                                       parm;
+
+                                   if (p1 -> optionals
+                                           & opt_DOCS_FTAM__1__Parameters_universal__class__number)
+                                       pe -> pe_id = (PElementID)
+                                               p1 -> universal__class__number;
+                                   else
+                                       pe -> pe_id = PE_DEFN_GFXS;
+                                   switch (pe -> pe_id) {
+                                       case PE_DEFN_GFXS:
+                                           if (getenv ("HP-FTAM")) {
+                                               effector = 1;
+                                               break;
+                                           }   /* else fall... */
+                                       case PE_DEFN_PRTS:
+                                       case PE_DEFN_VISS:
+                                           effector = 0;
+                                           break;
+
+                                       case PE_DEFN_T61S:
+                                       case PE_DEFN_VTXS:
+                                       case PE_DEFN_IA5S:
+                                       case PE_DEFN_GENS:
+                                           effector = 1;
+                                           break;
+
+                                       default:
+                                           break;
+                                   }
+                               }
+                               break;
+
+                           case VFS_UBF:
+                           default:
+                               break;
+                       }
+                   if (parm)
+                       (void) fre_obj (parm,
+                                       _ZDOCS_mod.md_dtab[myvf -> vf_number],
+                                       &_ZDOCS_mod, 1);
+               }
+               if (debug)
+                   advise (NULLCP, "effector=%d id=0x%x",
+                           effector, pe -> pe_id);
+               if (myvf != vf || watch) {
+                   advise (NULLCP, "%s transfer", myvf -> vf_text);
+                   vf = myvf;
+               }
+               break;
+
+           default: 
+               vf = &vfs[VFS_UBF];
+               advise (NULLCP, "document type mismatch; assuming %s (%s)",
+                       vf -> vf_text, vf -> vf_entry);
+               break;
+       }
+    }
+    myvf = vf;
+
+    FTGFREE (ftg);
+
+    faduid -> fa_type = FA_FIRSTLAST;
+    faduid -> fa_firstlast = FA_FIRST;
+    if (FReadWriteRequest (ftamfd, append ? FA_OPS_EXTEND : FA_OPS_REPLACE,
+               faduid, myvf -> vf_context, NOTOK, 0, fti) == NOTOK) {
+       ftam_advise (fta, "F-READWRITE.REQUEST");
+       return NOTOK;
+    }
+
+    switch (myvf - vfs) {
+       case VFS_UTF:
+           if ((gd = dup (fd)) == NOTOK || (fp = fdopen (gd, "r")) == NULL) {
+               if (gd != NOTOK)
+                   (void) close (gd);
+
+#ifdef BRIDGE
+               advise (dst, gd != NOTOK ? "fdopen failed" : "unable to dup");
+#else
+               advise (src, gd != NOTOK ? "fdopen failed on"
+                                        : "unable to dup");
+#endif
+               reason = FS_ACC_LCL;
+               goto do_cancel;
+           }
+           break;
+
+       case VFS_UBF:
+       default: 
+           fp = NULL;
+           break;
+    }
+
+    cc = 0;
+    if (verbose)
+       timer (cc, NULLCP);
+    if (hash)
+       marks = BUFSIZ - 1;
+
+#ifdef BRIDGE
+    line[0] = '\0';
+#endif
+
+    for (;;) {
+       register char  *bp,
+                      *ep;
+
+       if (!interrupted) {
+           int     nfds;
+           fd_set  wfds;
+
+           nfds = 0;
+           FD_ZERO (&wfds);
+                                       /* interrupt causes EINTR */
+           if (FSelectMask (ftamfd, &wfds, &nfds, fti) == OK)
+               (void) xselect (nfds, NULLFD, &wfds, NULLFD, NOTOK);
+       }
+
+       if (interrupted) {
+           advise (NULLCP, "cancelling transfer");
+
+           reason = FS_GEN_INITIATOR;
+           errno = EINTR;
+           goto do_cancel;
+       }
+
+       for (ep = (bp = (char *) pe -> pe_prim) + size - (fp ? 2 : 0), nc = 0;
+               bp < ep; ) {
+           if (fp) {
+               register char  *cp;
+
+#ifdef BRIDGE
+               if (strlen (line) || fgets (line, BUFSIZ, fp)) {
+                   if ((strlen(line) + 1) < (ep - bp - 1)) {
+                       (void) strcpy (bp, line);
+                       line[0] = NULL;
+                   }
+                   else
+                       break;
+               }
+               else {
+#else
+               if (fgets (bp, ep - bp + 1, fp) == NULL) {
+#endif
+                   n = (ferror (fp) && !feof (fp)) ? NOTOK : OK;
+                   break;
+               }
+               cp = bp + strlen (bp) - 1;
+               if (!effector) {
+                   if (*cp == '\n') {
+#ifndef        BRIDGE
+                       *cp = NULL;
+#else
+                       if (cp > bp) {
+                           if (*--cp == '\r')
+                               *cp = NULL;
+                           else
+                               *++cp = NULL;
+                       }
+                       else
+                           *cp = NULL;
+#endif
+                       n = cp - bp;
+                       bp = cp;
+                   }
+                   else {                      /* XXX: losing! */
+                       n = cp - bp + 1;
+                       bp = cp + 1;
+                   }
+               }
+               else {
+                   if (*cp == '\n') {
+#ifndef        BRIDGE
+                       *cp++ = '\r';
+#endif
+                       *cp++ = '\n';
+                       n = cp - bp;
+                       bp = cp;
+                       nc++;
+                       continue;
+                   }
+
+                   n = cp - bp + 1;
+                   bp = cp + 1;
+               }
+           }
+           else {
+#ifdef BRIDGE
+               switch (n = read (fd, bp, ep - bp)) {
+#else
+               switch (n = read (fd, bp, ep - bp)) {
+#endif
+                   case NOTOK: 
+                   case OK: 
+                       break;
+
+                   default: 
+                       bp += n;
+                       continue;
+               }
+           }
+           break;
+       }
+       if (n == NOTOK || (n = bp - (char *) pe -> pe_prim) == 0)
+           break;
+       pe -> pe_len = n;
+
+       if (fp && !effector) {
+           if ((de = pe_cpy (pe)) == NULLPE) {
+               reason = FS_ACC_LCL;
+               errno = ENOMEM;
+               goto do_cancel;
+           }
+       }
+       else
+           de = pe;
+
+       if (debug) {
+           if (fp) {
+               WATCHP (DOCS_FTAM__1__Datatype1, de, 0);
+           }
+           else
+               WATCHP (DOCS_FTAM__3__Datatype1, de, 0);
+       }
+
+       switch (de2fadu (de, pe != de ? 1 : 0)) {
+           case NOTOK: 
+               if (fp)
+                   (void) fclose (fp);
+               return NOTOK;
+
+           case OK: 
+           default: 
+               if (verbose || hash)
+                   cc += (n - nc), nc = 0;
+               if (hash) {
+                   if (hash > 1)
+                       printf ("%d\r", cc);
+                   else
+                       for (; marks < cc; marks += BUFSIZ)
+                           (void) putchar ('#');
+                   (void) fflush (stdout);
+               }
+               break;
+
+           case DONE:
+               (void) de2fadu (NULLPE, 0);
+               if (fp)
+                   (void) fclose (fp);
+               goto done_transfer;
+       }
+    }
+
+    if (verbose)
+       timer (cc, "sent");
+
+    if (fp)
+       (void) fclose (fp);
+
+    if (n == NOTOK) {
+       struct FTAMdiagnostic   diags[NFDIAG];
+       register struct FTAMdiagnostic *dp;
+
+#ifdef BRIDGE
+       advise (dst, "error reading");
+#else
+       advise (src, "error reading");
+#endif
+       reason = FS_ACC_LCLDEV;
+
+do_cancel: ;
+       dp = diags;
+
+       dp -> ftd_type = DIAG_PERM;
+       dp -> ftd_identifier = reason;
+       dp -> ftd_observer = dp -> ftd_source = EREF_IFSU;
+       dp -> ftd_delay = DIAG_NODELAY;
+       (void) strcpy (dp -> ftd_data, sys_errname (errno));
+       dp -> ftd_cc = strlen (dp -> ftd_data);
+       dp++;
+
+       (void) de2fadu (NULLPE, 0);
+
+       if (FCancelRequest (ftamfd, FACTION_PERM, NULLPE, diags, dp - diags,
+                           fti) == NOTOK) {
+           ftam_advise (fta, "F-CANCEL.REQUEST");
+           return NOTOK;
+       }
+
+       if (fti -> fti_type == FTI_CANCEL) {
+           register struct FTAMcancel *ftcn = &fti -> fti_cancel;
+
+           ftam_diag (ftcn -> ftcn_diags, ftcn -> ftcn_ndiag, 1,
+                   ftcn -> ftcn_action);
+           FTCNFREE (ftcn);
+       }
+
+       goto done_transfer;
+    }
+
+    if (n == OK)
+       n = de2fadu (NULLPE, 1);
+
+    if (FDataEndRequest (ftamfd, FACTION_SUCCESS, (struct FTAMdiagnostic *) 0,
+           0, fti) == NOTOK) {
+       ftam_advise (fta, "F-DATA-END.REQUEST");
+       return NOTOK;
+    }
+
+    if (FTransEndRequest (ftamfd, NULLPE, fti) == NOTOK) {
+       ftam_advise (fta, "F-TRANSFER-END.REQUEST");
+       return NOTOK;
+    }
+
+    switch (fti -> fti_type) {
+       case FTI_TRANSEND: 
+           {
+               register struct FTAMtransend   *ftre = &fti -> fti_transend;
+
+               ftam_diag (ftre -> ftre_diags, ftre -> ftre_ndiag, 1,
+                       ftre -> ftre_action);
+               FTREFREE (ftre);
+           }
+           break;
+
+       case FTI_CANCEL: 
+           {
+               register struct FTAMcancel *ftcn = &fti -> fti_cancel;
+
+               advise (NULLCP, "data transfer canceled!");
+               ftam_diag (ftcn -> ftcn_diags, ftcn -> ftcn_ndiag, 1,
+                       ftcn -> ftcn_action);
+               FTCNFREE (ftcn);
+
+               if (FCancelResponse (ftamfd, FACTION_SUCCESS, NULLPE,
+                           (struct FTAMdiagnostic *) 0, 0, fti) == NOTOK) {
+                   ftam_advise (fta, "F-CANCEL.RESPONSE");
+                   return NOTOK;
+               }
+           }
+           break;
+
+       default: 
+           adios (NULLCP, "unexpected indication type=%d", fti -> fti_type);
+    }
+
+done_transfer: ;
+    ftg = &ftgs;
+    bzero ((char *) ftg, sizeof *ftg);
+    ftg -> ftg_flags |= FTG_BEGIN | FTG_END;
+    ftg -> ftg_threshold = 0;
+
+    ftg -> ftg_flags |= FTG_CLOSE;
+    ftg -> ftg_threshold++;
+
+    ftg -> ftg_flags |= FTG_DESELECT;
+    ftg -> ftg_threshold++;
+
+    if (FBulkEndRequest (ftamfd, ftg, fti) == NOTOK) {
+       ftam_advise (fta, "F-BULK-END.REQUEST");
+       return NOTOK;
+    }
+
+    ftg = &fti -> fti_group;
+
+    if (ftg -> ftg_flags & FTG_CLOSE) {
+       register struct FTAMclose  *ftcl = &ftg -> ftg_close;
+
+       ftam_diag (ftcl -> ftcl_diags, ftcl -> ftcl_ndiag, 1,
+               ftcl -> ftcl_action);
+    }
+
+    if (ftg -> ftg_flags & FTG_DESELECT) {
+       register struct FTAMdeselect   *ftde = &ftg -> ftg_deselect;
+
+       ftam_diag (ftde -> ftde_diags, ftde -> ftde_ndiag, 1,
+               ftde -> ftde_action);
+       ftam_chrg (&ftde -> ftde_charges);
+    }
+
+    FTGFREE (ftg);
+    return OK;
+
+you_lose: ;
+    FTGFREE (ftg);
+    return NOTOK;
+}
+
+/* \f */
+
+int    de2fadu (pe, concat)
+PE     pe;
+int    concat;
+{
+    int            result;
+    struct FTAMindication   ftis;
+    register struct FTAMindication *fti = &ftis;
+    register struct FTAMabort  *fta = &fti -> fti_abort;
+    static int ninfo = 0;
+    static int size = 0;
+    static PE info[NPDATA];
+
+    if (pe == NULLPE) {
+       result = OK;
+       if (concat
+               && ninfo > 0
+               && FDataRequest (ftamfd, info, ninfo, fti) == NOTOK) {
+           ftam_advise (fta, "F-DATA.REQUEST");
+           result = NOTOK;
+       }
+
+       while (ninfo > 0)
+           pe_free (info[--ninfo]);
+       size = 0;
+
+       return result;
+    }
+
+    if (concat) {
+       int     flush,
+               n;
+
+       if (size + (n = ps_get_abs (pe) + MAGIC_OCTET2) >= fadusize
+               && ninfo > 0) {
+           if (debug)
+               advise (NULLCP,
+                       "de2fadu flushing on %d FADUs, estimated size %d/%d",
+                       ninfo, size, fadusize);
+
+           if ((result = de2fadu (NULLPE, 1)) != OK)
+               return result;
+           flush = 1;
+       }
+       else
+           flush = 0;
+       
+       info[ninfo++] = pe;
+       size += n;
+
+       if (ninfo < NPDATA && size < fadusize) {
+           if (!flush)
+               return OK;
+       }
+       else {
+           if ((result = FDataRequest (ftamfd, info, ninfo, fti)) == NOTOK)
+               ftam_advise (fta, "F-DATA.REQUEST");
+
+           while (ninfo > 0)
+               pe_free (info[--ninfo]);
+           size = 0;
+
+           if (result == NOTOK)
+               return result;
+       }
+    }
+    else
+       if (FDataRequest (ftamfd, &pe, 1, fti) == NOTOK) {
+           ftam_advise (fta, "F-DATA.REQUEST");
+           return NOTOK;
+       }
+
+    if (FWaitRequest (ftamfd, OK, fti) == NOTOK) {
+       if (fta -> fta_peer
+               || fta -> fta_action != FACTION_TRANS
+               || fta -> fta_ndiag < 1
+               || fta -> fta_diags[0].ftd_type != DIAG_TRANS
+               || fta -> fta_diags[0].ftd_identifier != FS_PRO_TIMEOUT) {
+           ftam_advise (fta, "F-WAIT.REQUEST");
+           return NOTOK;
+       }
+
+       return OK;
+    }
+
+    if (fti -> fti_type == FTI_CANCEL) {
+       register struct FTAMcancel *ftcn = &fti -> fti_cancel;
+
+       advise (NULLCP, "data transfer cancelled!");
+       ftam_diag (ftcn -> ftcn_diags, ftcn -> ftcn_ndiag, 1,
+                  ftcn -> ftcn_action);
+       FTCNFREE (ftcn);
+
+       if (FCancelResponse (ftamfd, FACTION_SUCCESS, NULLPE, 
+                   (struct FTAMdiagnostic *) 0, 0, fti) == NOTOK) {
+           ftam_advise (fta, "F-CANCEL.RESPONSE");
+           return NOTOK;
+       }
+    }
+
+    return DONE;
+}
+
diff --git a/usr/src/contrib/isode/ftam2/ftam.1c b/usr/src/contrib/isode/ftam2/ftam.1c
new file mode 100644 (file)
index 0000000..f0e27d9
--- /dev/null
@@ -0,0 +1,283 @@
+.TH FTAM 1C "01 Mar 1987"
+.\" $Header: /f/osi/ftam2/RCS/ftam.1c,v 7.5 91/02/22 09:23:50 mrose Interim $
+.\"
+.\"
+.\" $Log:      ftam.1c,v $
+.\" Revision 7.5  91/02/22  09:23:50  mrose
+.\" Interim 6.8
+.\" 
+.\" Revision 7.4  90/12/23  18:40:07  mrose
+.\" update
+.\" 
+.\" Revision 7.3  90/11/21  11:35:44  mrose
+.\" update
+.\" 
+.\" Revision 7.2  90/11/04  19:15:18  mrose
+.\" update
+.\" 
+.\" Revision 7.1  90/01/11  18:35:47  mrose
+.\" real-sync
+.\" 
+.\" Revision 7.0  89/11/23  21:54:26  mrose
+.\" Release 6.0
+.\" 
+.SH NAME
+ftam \- interactive ftam initiator
+.SH SYNOPSIS
+.in +.5i
+.ti -.5i
+.B ftam
+\%[options]
+\%[host]
+\%[command\0arguments\0...]
+.in -.5i
+.SH DESCRIPTION
+The \fIftam\fR program implements the initiator side of 
+the File Transfer, Access, and Management (FTAM) service.
+.PP
+Currently, implementations for Berkeley and AT&T UNIX exist.
+Supported are:
+the no-recovery FTAM-QoS;
+any of
+the transfer, management, and transfer and management service classes;
+the kernel, read, write, limited file management, enhanced file management, and
+grouping functional units;
+and, the kernel and storage attribute groups.
+Only three document types are supported as of this writing:
+unstructured text files (FTAM\-1),
+unstructured binary files (FTAM\-3),
+and filedirectory files (NIST\-9).
+.PP
+Typing INTR at the top\-level does nothing,
+but typing it twice in a row at the top\-level terminates \fIftam\fR;
+typing INTR during additional prompting causes \fIftam\fR to abort the command;
+typing INTR during file transfer causes the transfer to be aborted.
+.PP
+On start-up, \fIftam\fR will read a file called \fB\&.ftamrc\fR in the
+user's home directory.
+This file, if present, contains user-preference commands.
+.SH COMMANDS
+.TP
+.B append\fR\0source\0destination
+Appends to a file in the filestore.
+.TP
+.B cd\fR\0\%[dir]
+Changes the working directory on the virtual filestore.
+This requires the \fBrealstore\fR variable to be set appropriately.
+.TP
+.B chgrp\fR\0group\0file\0...
+Changes the account attribute of the named files.
+.TP
+.B close
+Terminates the association with the virtual filestore.
+.TP
+.B dir\fR\0\%[file]
+Prints a long directory listing.
+.TP
+.B echo\fR\0file\0...
+Simply echoes any arguments.
+Useful for seeing how globbed expressions will evaluate.
+.TP
+.B fdir\fR\0stream\0\%[file]
+Prints a long directory listing to a file or program.
+If \*(lqstream\*(rq starts with a vertical bar \*(lq|\*(rq,
+then the named program is invoked;
+otherwise the named file is written.
+.TP
+.B fls\fR\0stream\0\%[file]
+Prints a directory listing to a file or program.
+If \*(lqstream\*(rq starts with a vertical bar \*(lq|\*(rq,
+then the named program is invoked;
+otherwise the named file is written.
+.TP
+.B get\fR\0source\0destination
+Retrieves a file.
+.TP
+.B help\fR\0\%[command]
+Prints help information.
+For detailed information, try \*(lqhelp\0?\*(rq.
+.TP
+.B lcd\fR\0\%[file]
+Changes the working directory on the local system.
+.TP
+.B ls\fR\0\%[file]
+Prints a directory listing.
+.TP
+.B mkdir\fR\0dir\0...
+Creates a directory.
+.TP
+.B mv\fR\0source\0destination
+Renames a file.
+.TP
+.B open\fR\0host\0user\0\%[account]
+Associates with the virtual filestore.
+.TP
+.B put\fR\0source\0destination
+Stores a file.
+.TP
+.B pwd
+Prints the working directories.
+.TP
+.B quit
+Terminates the association with the virtual filestore and exits.
+.TP
+.B rm\fR\0file\0...
+Deletes a file.
+.TP
+.B set\fR\0variable\0value
+Displays or changes variables.
+For detailed information, try \*(lqset\0?\*(rq.
+.TP
+.B status
+Shows the current status.
+.SH VARIABLES
+.TP
+.B bell
+Rings the bell after each command terminates.
+Useful for long file transfers when you want to attend to other matters and
+be notified when you can type another command.
+Boolean (values: \fBon\fR or \fBoff\fR).
+.TP
+.B concurrency
+Requests concurrency control for transfers.
+Values: \fIoff\fR; \fIon\fR.
+.TP
+.B debug
+This enables voluminous output during file transfers,
+among other things.  Boolean.
+.TP
+.B glob
+This enables the expansion of shell meta\-characters.
+Operations which perform globbing
+require the \fBrealstore\fR variable to be set appropriately.
+Boolean.
+.TP
+.B hash
+This enables the printing of hash marks during file transfers.  
+Values: \fIoff\fR; \fIon\fR; \fItotal\fR.
+.TP
+.B override
+This sets the creation override mode for files being written to the virtual
+filestore.
+Values:
+\fBfail\fR,
+the creation operation;
+\fBselect\fR,
+use the existing file with its old contents and attributes
+(i.e., the put command acts like the append command);
+\fBwrite\fR,
+zero-truncate if it already exists, and use the existing file with its old
+attributes;
+\fBdelete\fR,
+if it already exists, then create a new file with new attributes.
+This defaults to \*(lqwrite\*(rq.
+.TP
+.B qualifier
+This sets the \*(lqqualifier\*(rq portion of the service which
+\fIftam\fR will associate with.
+It is needed when using the current implementation of the MITRE
+FTAM/FTP gateway.
+This defaults to \*(lqfilestore\*(rq.
+.TP
+.B query
+This determines if \fIftam\fR should ask the user to confirm operations
+involving globbing that expand to more than one filename.
+Boolean.
+This defaults to \*(lqon\*(rq.
+.TP
+.B realstore
+Sets the type of remote realstore associated with the virtual filestore.
+This is used to help \fIftam\fR act friendlier to the user!
+Values: \fBunix\fR, \fBunknown\fR.
+Note well: the concept of a \fBrealstore\fR is contrary to the notion of
+open systems as it is an N*M (not N+M) method.
+.TP
+.B trace
+This enables the tracing of FTAM PDUs.  Boolean.
+.TP
+.B tracefile
+This defines the file where tracing information is appended.
+Note that the pathname of this file is interpreted relatively to the
+ISODE logging area.
+To have tracing information written to a file in the current
+directory,
+start the filename with \*(lq./\*(rq.
+.TP
+.B type
+This defines the file transfer mode to use.
+Values: \fBdefault\fR, \fBbinary\fR, \fBtext\fR.
+.TP
+.B verbose
+This enables printing of informative diagnostics during operation.  Boolean.
+.TP
+.B watch
+This enables watch mode,
+something in between debug mode (too voluminous),
+and verbose mode (not informative enough).  Boolean.
+.TP
+.B userdn
+This defines the Distinguished Name to be used when binding to the
+Directory for AE-lookup.  DN-string.
+.TP
+.B \fIx\fBsapfile
+This defines the file where \fIx\fRPDU tracing information is appended.
+Value: any filename, or \*(lq\-\*(rq for the diagnostic output.
+.TP
+.B \fIx\fBsaplevel
+This enables tracing of the \fIx\fR module.
+Values: \fBnone\fR, \fBfatal\fR, \fBexceptions\fR, \fBnotice\fR,
+\fBpdus\fR, \fBtrace\fR, \fBdebug\fR, and \fBall\fR.
+.SH OPTIONS
+.TP
+.B \-a\0\fIacct\fR
+Sets the account to be used on the virtual filestore.
+.TP
+.B \-c\0\fImode\fR
+Sets \fBconcurrency\fR.
+.TP
+.B \-d
+Sets \fBdebug\fR.
+.TP
+.B \-f
+Inhibits reading of the user's \fB\&.ftamrc\fR on startup.
+.TP
+.B \-h
+Sets \fBhash\fR.
+.TP
+.B \-o\0\fImode\fR
+Sets \fBoverride\fR.
+.TP
+.B \-t
+Sets \fBtrace\fR.
+.TP
+.B \-u\0\fIuser\fR
+Sets the initiator identity to be used on the virtual filestore.
+.TP
+.B \-v
+Sets \fBverbose\fR (default for interactive use).
+.TP
+.B \-w
+Sets \fBwatch\fR.
+.SH FILES
+.nf
+.ta \w'\*(EDisodocuments  'u
+\*(EDisodocuments      ISODE FTAM document types database
+\*(EDisoentities       ISODE entities database
+$HOME/\&.ftamrc        runcom file
+.re
+.fi
+.SH "SEE ALSO"
+libftam(3n), ftamd(8c),
+.br
+\fIThe ISO Development Environment: User's Manual\fR,
+.br
+ISO 8571:
+\fIInformation Processing Systems \-\-
+File Transfer, Access, and Management\fR
+.SH DIAGNOSTICS
+All obvious.
+.SH AUTHOR
+Marshall T. Rose
+.br
+This program is based heavily on the \fIftp\fR(1c) program supplied with
+Berkeley UNIX.
diff --git a/usr/src/contrib/isode/ftam2/ftam.c b/usr/src/contrib/isode/ftam2/ftam.c
new file mode 100644 (file)
index 0000000..4a71612
--- /dev/null
@@ -0,0 +1,674 @@
+/* ftam.c - interactive FTAM initiator */
+
+#ifndef        lint
+static char *rcsid = "$Header: /f/osi/ftam2/RCS/ftam.c,v 7.4 91/02/22 09:23:52 mrose Interim $";
+#endif
+
+/* 
+ * $Header: /f/osi/ftam2/RCS/ftam.c,v 7.4 91/02/22 09:23:52 mrose Interim $
+ *
+ *
+ * $Log:       ftam.c,v $
+ * Revision 7.4  91/02/22  09:23:52  mrose
+ * Interim 6.8
+ * 
+ * Revision 7.3  91/01/07  12:41:49  mrose
+ * update
+ * 
+ * Revision 7.2  90/11/21  11:30:38  mrose
+ * sun
+ * 
+ * Revision 7.1  90/07/09  14:37:18  mrose
+ * sync
+ * 
+ * Revision 7.0  89/11/23  21:54:27  mrose
+ * Release 6.0
+ * 
+ */
+
+/*
+ *                               NOTICE
+ *
+ *    Acquisition, use, and distribution of this module and related
+ *    materials are subject to the restrictions of a license agreement.
+ *    Consult the Preface in the User's Manual for the full terms of
+ *    this agreement.
+ *
+ */
+
+
+#include <ctype.h>
+#include <setjmp.h>
+#include <signal.h>
+#include <stdio.h>
+#include <varargs.h>
+#include "ftamuser.h"
+#include "tailor.h"
+
+/* \f   DATA */
+
+#ifndef        BRIDGE
+static char *myname = "ftam";
+
+static char **op = NULL;
+
+static char *aflag = NULL;
+static char *concur = NULL;
+static char *oflag = NULL;
+static int   fflag = 0;
+static char *hflag = NULL;
+static char *uflag = NULL;
+
+
+static char ringring = 0x07;
+
+int    ontty;
+
+static int     armed;
+static jmp_buf intrenv;
+#endif
+int    interrupted;
+
+
+void   adios (), advise ();
+#ifndef        BRIDGE
+SFD    intrser ();
+#endif
+
+/* \f   MAIN */
+
+/* ARGSUSED */
+
+#ifndef        BRIDGE
+main (argc, argv, envp)
+int    argc;
+char  **argv,
+      **envp;
+{
+    int     eof,
+           status,
+            vecp;
+    SFP            istat;
+    char   *bp,
+           buffer[BUFSIZ],
+           *vec[NVEC + 1];
+    FILE   *fp;
+
+    arginit (argv);
+
+    runcom = 1;
+    
+    /* The lower layers get a SIGPIPE if the remote end dies while
+     * we are sending. The SIGPIPE is followed by a DISCONNECT Request.
+     */
+    (void)signal(SIGPIPE, SIG_IGN);
+
+    rcinit ();
+    (void) sprintf (buffer, "%s/.ftamrc", myhome);
+
+    if (!fflag && (fp = fopen (buffer, "r"))) {
+       while (fgets (buffer, sizeof buffer, fp)) {
+           if (bp = index (buffer, '\n'))
+               *bp = NULL;
+
+           bzero ((char *) vec, sizeof vec);
+           if ((vecp = str2vec (buffer, vec)) < 1)
+               continue;
+
+           if (ftamloop (vec, NOTOK) != OK && op)
+               exit (1);
+       }
+    
+       (void) fclose (fp);
+    }
+       
+    if (hflag) {
+       vecp = 0;
+       vec[vecp++] = "open";
+       vec[vecp++] = hflag;
+       if (uflag)
+           vec[vecp++] = uflag;
+       if (aflag)
+           vec[vecp++] = aflag;
+       vec[vecp] = NULL;
+
+       if (ftamloop (vec, NOTOK) != OK && op)
+           exit (1);
+    }
+    else {
+       if (uflag)
+           user = strdup (uflag);
+       if (aflag)
+           account = strdup (aflag);
+    }
+
+    if (concur) {
+       vecp = 0;
+       vec[vecp++] = "set";
+       vec[vecp++] = "concurrency";
+       vec[vecp++] = concur;
+       vec[vecp] = NULL;
+
+       if (ftamloop (vec, NOTOK) != OK && op)
+           exit (1);
+    }
+
+    if (oflag) {
+       vecp = 0;
+       vec[vecp++] = "set";
+       vec[vecp++] = "override";
+       vec[vecp++] = oflag;
+       vec[vecp] = NULL;
+
+       if (ftamloop (vec, NOTOK) != OK && op)
+           exit (1);
+    }
+       
+    runcom = 0;
+
+    if (op) {
+       for (vecp = 0; *op; op++)
+           vec[vecp++] = *op;
+       vec[vecp] = NULL;
+
+       status = ftamfd != NOTOK ? 1 : 0;
+       switch (ftamloop (vec, NOTOK)) {
+           case NOTOK: 
+               status = 1;
+               break;
+
+           case OK: 
+           case DONE: 
+           default:
+               if (ftamfd != NOTOK)
+                   status = 0;
+               break;
+       }
+    }
+    else {
+       istat = signal (SIGINT, intrser);
+
+       eof = 0;
+       for (interrupted = 0;; interrupted = 0) {
+           if (hash && marks >= BUFSIZ) {
+               marks = 0;
+               printf ("\n");
+           }
+
+           if (getline ("%s> ", buffer) == NOTOK) {
+               if (eof)
+                   break;
+
+               eof = 1;
+               continue;
+           }
+           eof = 0;
+
+           bzero ((char *) vec, sizeof vec);
+           if ((vecp = str2vec (buffer, vec)) < 1)
+               continue;
+
+           switch (ftamloop (vec, OK)) {
+               case NOTOK: 
+                   status = 1;
+                   break;
+
+               case OK: 
+               default: 
+                   if (bell)
+                       (void) putchar (ringring);
+                   continue;
+
+               case DONE: 
+                   status = 0;
+                   break;
+           }
+           break;
+       }
+
+       (void) signal (SIGINT, istat);
+    }
+
+    if (ftamfd != NOTOK) {
+       vecp = 0;
+       vec[vecp++] = "close";
+       vec[vecp] = NULL;
+       
+       (void) ftamloop (vec, NOTOK);
+    }
+
+#ifdef DEBUG
+    set_lookup_dase (0);
+#endif
+
+    exit (status);             /* NOTREACHED */
+}
+#endif
+
+/* \f */
+
+#ifndef        BRIDGE
+static ftamloop (vec, error)
+char  **vec;
+int    error;
+{
+    register struct dispatch   *ds;
+
+    if ((ds = getds (strcmp (*vec, "?") ? *vec : "help")) == NULL)
+       return error;
+
+    if (ftamfd == NOTOK) {
+       if (ds -> ds_flags & DS_OPEN) {
+           advise (NULLCP, "not associated with virtual filestore");
+           return error;
+       }
+    }
+    else
+       if (ds -> ds_flags & DS_CLOSE) {
+           advise (NULLCP, "already associated with virtual filestore");
+           return error;
+       }
+
+    if (ds -> ds_flags & DS_MODES) {
+       switch (ds -> ds_class) {
+           case FCLASS_TRANSFER:
+               if (class != FCLASS_TRANSFER && class != FCLASS_TM) {
+                   advise (NULLCP, "need transfer service class");
+                   return error;
+               }
+               break;
+
+           case FCLASS_MANAGE:
+               if (class != FCLASS_MANAGE && class != FCLASS_TM) {
+                   advise (NULLCP, "need management service class");
+                   return error;
+               }
+               break;
+
+           default:
+               break;
+       }
+
+       if ((ds -> ds_units & units) != ds -> ds_units) {
+           advise (NULLCP, "need %s functional units",
+                   sprintb (ds -> ds_units & ~units, UMASK));
+           return error;
+       }
+    }
+
+    switch ((*ds -> ds_fnx) (vec)) {
+       case NOTOK: 
+           return error;
+
+       case OK: 
+       default: 
+           return OK;
+
+       case DONE: 
+           return DONE;
+    }
+}
+#endif
+
+/* \f   ARGINIT */
+
+#ifndef        BRIDGE
+static arginit (vec)
+char  **vec;
+{
+    register char  *ap,
+                   *pp;
+
+    if (myname = rindex (*vec, '/'))
+       myname++;
+    if (myname == NULL || *myname == NULL)
+       myname = *vec;
+
+    isodetailor (myname, 1);
+    ftam_log -> ll_file = strdup ("./ftam.log");
+    ll_hdinit (ftam_log, myname);
+
+    storename = strdup ("filestore");
+    if (ontty = isatty (fileno (stdin)))
+       verbose++;
+
+    for (vec++; ap = *vec; vec++) {
+       if (*ap == '-') {
+           while (*++ap)
+               switch (*ap) {
+                   case 'a': 
+                       if ((pp = *++vec) == NULL || *pp == NULL)
+                           adios (NULLCP, "usage: %s -a acct", myname);
+                       aflag = pp;
+                       break;
+
+                   case 'c':
+                       if ((pp = *++vec) == NULL || *pp == NULL)
+                               adios (NULLCP, "usage: %s -c mode", myname);
+                       concur = pp;
+                       break;
+
+                   case 'd': 
+                       debug++;
+                       break;
+
+                   case 'f':
+                       fflag++;
+                       break;
+
+                   case 'h': 
+                       hash++;
+                       break;
+
+                   case 'o': 
+                       if ((pp = *++vec) == NULL || *pp == NULL)
+                           adios (NULLCP, "usage: %s -o mode", myname);
+                       oflag = pp;
+                       break;
+
+                   case 't': 
+                       trace++;
+                       break;
+
+                   case 'u': 
+                       if ((pp = *++vec) == NULL || *pp == NULL)
+                           adios (NULLCP, "usage: %s -u user", myname);
+                       uflag = pp;
+                       break;
+
+                   case 'v': 
+                       verbose = 1;
+                       break;
+
+                   case 'w': 
+                       watch++;
+                       break;
+
+                   default: 
+                       adios (NULLCP, "unknown switch -%c", *ap);
+               }
+           continue;
+       }
+
+       if (hflag == NULL)
+           hflag = ap;
+       else
+           if (op == NULL) {
+               op = vec;
+               break;
+           }
+    }
+}
+#endif
+
+/* \f   INTERACTIVE */
+
+#ifndef        BRIDGE
+int    getline (prompt, buffer)
+char   *prompt,
+       *buffer;
+{
+    register int    i;
+    register char  *cp,
+                   *ep;
+    static int  sticky = 0;
+
+    if (interrupted) {
+       interrupted = 0;
+       return NOTOK;
+    }
+
+    if (sticky) {
+       sticky = 0;
+       return NOTOK;
+    }
+
+    switch (setjmp (intrenv)) {
+       case OK:
+           armed++;
+           break;
+
+       case NOTOK:
+           if (ontty)
+               printf ("\n");  /* and fall */
+       default:
+           armed = 0;
+           return NOTOK;
+    }
+       
+    if (ontty) {
+       printf (prompt, ftamfd != NOTOK ? host : myname);
+       (void) fflush (stdout);
+    }
+
+    for (ep = (cp = buffer) + BUFSIZ - 1; (i = getchar ()) != '\n';) {
+       if (i == EOF) {
+           if (ontty)
+               printf ("\n");
+           clearerr (stdin);
+           if (cp == buffer)
+               longjmp (intrenv, DONE);
+
+           sticky++;
+           break;
+       }
+
+       if (cp < ep)
+           *cp++ = i;
+    }
+    *cp = NULL;
+
+    armed = 0;
+    
+    return OK;
+}
+#endif
+
+/* \f */
+
+#ifndef        BRIDGE
+
+/* ARGSUSED */
+
+static SFD intrser (sig)
+int    sig;
+{
+#ifndef        BSDSIGS
+    (void) signal (SIGINT, intrser);
+#endif
+
+    if (armed)
+       longjmp (intrenv, NOTOK);
+
+    interrupted++;
+}
+#endif
+
+/* \f */
+
+#ifndef        BRIDGE
+#ifndef        lint
+int    ask (va_alist)
+va_dcl
+{
+    int     x,
+            y,
+            result;
+    char    buffer[BUFSIZ];
+    va_list ap;
+
+    if (interrupted) {
+       interrupted = 0;
+       return NOTOK;
+    }
+
+    if (!ontty)
+       return OK;
+
+    switch (setjmp (intrenv)) {
+       case OK: 
+           armed++;
+           break;
+
+       case NOTOK: 
+       default: 
+           printf ("\n");
+           armed = 0;
+           return DONE;
+    }
+    if (bell)
+       (void) putchar (ringring);
+
+    va_start (ap);
+
+    _asprintf (buffer, NULLCP, ap);
+
+    va_end (ap);
+    
+again: ;
+    printf ("%s? (y)es, (n)o: ", buffer);
+
+    x = y = getchar ();
+    while (y != '\n' && y != EOF)
+       y = getchar ();
+
+    switch (x) {
+       case 'y': 
+       case '\n':
+           result = OK;
+           break;
+
+       case 'n': 
+           result = NOTOK;
+           break;
+
+       case EOF: 
+           result = DONE;
+           break;
+
+       default: 
+           goto again;
+    }
+
+    armed = 0;
+
+    return result;
+}
+#else
+/* VARARGS */
+
+int    ask (fmt)
+char   *fmt;
+{
+    return ask (fmt);
+}
+#endif
+#endif
+
+/* \f   ERRORS */
+
+#ifndef        lint
+void   _advise ();
+
+
+void   adios (va_alist)
+va_dcl
+{
+    struct FTAMindication   ftis;
+    va_list ap;
+
+    va_start (ap);
+
+    _advise (ap);
+
+    va_end (ap);
+
+    if (ftamfd != NOTOK)
+       (void) FUAbortRequest (ftamfd, FACTION_PERM,
+               (struct FTAMdiagnostic *) 0, 0, &ftis);
+
+#ifdef BRIDGE
+    reply (550, ftam_error);
+    exit (1);
+#else
+    _exit (1);
+#endif
+}
+#else
+/* VARARGS */
+
+void   adios (what, fmt)
+char   *what,
+       *fmt;
+{
+    adios (what, fmt);
+}
+#endif
+
+
+#ifndef        lint
+void   advise (va_alist)
+va_dcl
+{
+    va_list ap;
+
+    va_start (ap);
+
+    _advise (ap);
+
+    va_end (ap);
+}
+
+
+static void  _advise (ap)
+va_list        ap;
+{
+    char    buffer[BUFSIZ];
+
+    asprintf (buffer, ap);
+
+#ifndef        BRIDGE
+    if (hash && marks >= BUFSIZ) {
+       marks = 0;
+       printf ("\n");
+    }
+
+    (void) fflush (stdout);
+
+    fprintf (stderr, "%s: ", myname);
+    (void) fputs (buffer, stderr);
+    (void) fputc ('\n', stderr);
+
+    (void) fflush (stderr);
+#else
+    (void) ll_log (ftam_log, LLOG_NOTICE, NULLCP, "%s", buffer);
+    (void) strcpy (ftam_error, buffer);
+#endif
+}
+#else
+/* VARARGS */
+
+void   advise (what, fmt)
+char   *what,
+       *fmt;
+{
+    advise (what, fmt);
+}
+#endif
+
+/* \f   MISCELLANY */
+
+#ifndef        lint
+char   *strdup (s)
+char   *s;
+{
+    char    *p;
+
+    if ((p = malloc((unsigned) (strlen (s) + 1))) == NULL)
+       adios (NULLCP, "out of memory");
+
+    (void) strcpy (p, s);
+
+    return p;
+}
+#endif
diff --git a/usr/src/contrib/isode/ftam2/ftamd-manage.c b/usr/src/contrib/isode/ftam2/ftamd-manage.c
new file mode 100644 (file)
index 0000000..1c2743e
--- /dev/null
@@ -0,0 +1,60 @@
+/* ftamd-manage.c - FTAM responder -- management */
+
+#ifndef        lint
+static char *rcsid = "$Header: /f/osi/ftam2/RCS/ftamd-manage.c,v 7.1 91/02/22 09:23:53 mrose Interim $";
+#endif
+
+/* 
+ * $Header: /f/osi/ftam2/RCS/ftamd-manage.c,v 7.1 91/02/22 09:23:53 mrose Interim $
+ *
+ *
+ * $Log:       ftamd-manage.c,v $
+ * Revision 7.1  91/02/22  09:23:53  mrose
+ * Interim 6.8
+ * 
+ * Revision 7.0  89/11/23  21:54:29  mrose
+ * Release 6.0
+ * 
+ */
+
+/*
+ *                               NOTICE
+ *
+ *    Acquisition, use, and distribution of this module and related
+ *    materials are subject to the restrictions of a license agreement.
+ *    Consult the Preface in the User's Manual for the full terms of
+ *    this agreement.
+ *
+ */
+
+#include <stdio.h>
+#include "ftamsystem.h"
+
+/* \f   MANAGEMENT */
+
+int    ftam_managementindication (ftg)
+struct FTAMgroup *ftg;
+{
+    struct FTAMgroup    ftms;
+    struct FTAMgroup   *ftm = &ftms;
+    struct FTAMindication   ftis;
+    register struct FTAMindication *fti = &ftis;
+
+    ftam_selection (ftg, ftm);
+
+    if (myfd != NOTOK) {
+#ifndef        BRIDGE
+       unlock ();
+       (void) close (myfd);
+#else
+       (void) close (myfd);
+       (void) ftp_reply ();
+#endif
+       myfd = NOTOK;
+    }
+
+    if (FManageResponse (ftamfd, ftm, fti) == NOTOK)
+       ftam_adios (&fti -> fti_abort, "F-MANAGE.RESPONSE");
+
+    FTGFREE (ftg);
+}
diff --git a/usr/src/contrib/isode/ftam2/ftamd-select.c b/usr/src/contrib/isode/ftam2/ftamd-select.c
new file mode 100644 (file)
index 0000000..67068d6
--- /dev/null
@@ -0,0 +1,2011 @@
+/* ftamd-select.c - FTAM responder -- selection regime */
+
+#ifndef        lint
+static char *rcsid = "$Header: /f/osi/ftam2/RCS/ftamd-select.c,v 7.4 91/02/22 09:23:54 mrose Interim $";
+#endif
+
+/* 
+ * $Header: /f/osi/ftam2/RCS/ftamd-select.c,v 7.4 91/02/22 09:23:54 mrose Interim $
+ *
+ *
+ * $Log:       ftamd-select.c,v $
+ * Revision 7.4  91/02/22  09:23:54  mrose
+ * Interim 6.8
+ * 
+ * Revision 7.3  90/12/23  18:40:09  mrose
+ * update
+ * 
+ * Revision 7.2  90/11/21  11:30:40  mrose
+ * sun
+ * 
+ * Revision 7.1  90/07/01  21:03:20  mrose
+ * pepsy
+ * 
+ * Revision 7.0  89/11/23  21:54:29  mrose
+ * Release 6.0
+ * 
+ */
+
+/*
+ *                               NOTICE
+ *
+ *    Acquisition, use, and distribution of this module and related
+ *    materials are subject to the restrictions of a license agreement.
+ *    Consult the Preface in the User's Manual for the full terms of
+ *    this agreement.
+ *
+ */
+
+
+#include <grp.h>
+#include <stdio.h>
+#include <pwd.h>
+#include "ftamsystem.h"
+
+
+#define        NUID    400
+#define        NGID    400
+
+
+#define        FA_CHATTR \
+    (FA_FILENAME | FA_ACCOUNT)
+
+
+#define        FA_PERM_WRITE   (FA_PERM_INSERT | FA_PERM_REPLACE | FA_PERM_EXTEND \
+                               | FA_PERM_ERASE)
+#define        FA_PERM_OWNER   FA_PERM_CHNGATTR
+#define        FA_PERM_PARENT  FA_PERM_DELETE
+
+
+#ifdef SYS5
+struct group  *getgrnam ();
+struct passwd *getpwnam (), *getpwent (), *getpwuid ();
+#endif
+
+/* \f   DATA */
+
+static char mvfile[MAXPATHLEN];
+static PE   rdparam = NULLPE;
+
+char   *getfile ();
+#ifdef BRIDGE
+#define        E_OK    R_OK
+#else
+char   *getuser (), *getgroup ();
+#endif
+
+
+long   lseek ();
+
+#ifdef SYS5
+#define        EACCESS access
+
+#define        rename(f1,f2)   \
+       (unlink (f2), link (f1, f2) != NOTOK ? unlink (f1) : NOTOK)
+#endif
+
+#ifdef BRIDGE
+#define        ftp_access(file,mode)   ftp_exist (file)
+#endif
+
+/* \f   SELECTION REGIME */
+
+int    ftam_selection (ftg, ftm)
+register struct FTAMgroup *ftg,
+                         *ftm;
+{
+    int     action,
+            state;
+
+    bzero ((char *) ftm, sizeof *ftm);
+    ftm -> ftg_flags = ftg -> ftg_flags;
+
+    statok = 0;
+
+    state = FSTATE_SUCCESS;
+    if (ftg -> ftg_flags & FTG_SELECT) {
+       register struct FTAMselect *ftse = &ftg -> ftg_select;
+       register struct FTAMattributes *fa = &ftse -> ftse_attrs;
+       struct FTAMdiagnostic *dp = ftm -> ftg_select.ftse_diags;
+
+       errno = 0;
+       if (!(fa -> fa_present & FA_FILENAME)
+               || fa -> fa_nfile != 1
+               || (myfile = getfile (fa -> fa_files[0])) == NULL
+#ifdef BRIDGE
+               || ftp_access (myfile, E_OK) == NOTOK) {
+#else
+               || stat (myfile, &myst) == NOTOK) {
+#endif
+           dp -> ftd_type = DIAG_PERM;
+           dp -> ftd_identifier = FS_SEL_FILENAME;
+           dp -> ftd_observer = dp -> ftd_source = EREF_RFSU;
+           dp -> ftd_delay = DIAG_NODELAY;
+           if (errno) {
+               (void) strcpy (dp -> ftd_data, sys_errname (errno));
+               dp -> ftd_cc = strlen (dp -> ftd_data);
+           }
+           else
+               dp -> ftd_cc = 0;
+           dp++;
+
+           state = FSTATE_FAILURE;
+           goto done_select;
+       }
+       statok = 1;
+#ifndef        BRIDGE
+       switch (myst.st_mode & S_IFMT) {
+           case S_IFREG: 
+           case S_IFDIR: 
+               break;
+
+           default:
+               if (myst.st_dev == null_dev && myst.st_ino == null_ino) {
+                   myst.st_mode &= ~S_IFMT, myst.st_mode |= S_IFREG;
+                   break;
+               }
+               dp -> ftd_type = DIAG_PERM;
+               dp -> ftd_identifier = FS_SEL_AVAIL;
+               dp -> ftd_observer = dp -> ftd_source = EREF_RFSU;
+               dp -> ftd_delay = DIAG_NODELAY;
+               dp -> ftd_cc = 0;
+               dp++;
+
+               state = FSTATE_FAILURE;
+               goto done_select;
+       }
+#else
+/* can't check a file you don't have */
+#endif
+
+       if (ftg -> ftg_flags & FTG_RDATTR)
+           ftse -> ftse_access |= FA_PERM_READATTR;
+       if (ftg -> ftg_flags & FTG_CHATTR)
+           ftse -> ftse_access |= FA_PERM_CHNGATTR;
+       if (ftg -> ftg_flags & FTG_DELETE)
+           ftse -> ftse_access |= FA_PERM_DELETE;
+       if (chkaccess (NOTOK, ftse -> ftse_access, &ftse -> ftse_conctl, &dp)
+               == NOTOK) {
+           state = FSTATE_FAILURE;
+           goto done_select;
+       }
+#ifndef        BRIDGE
+       if (ftse -> ftse_account && strlen (ftse -> ftse_account) > 1) {
+           if ((mygid = findgid (ftse -> ftse_account)) == NOTOK) {
+               dp -> ftd_type = DIAG_PERM;
+               dp -> ftd_identifier = FS_SEL_ACCOUNT;
+               dp -> ftd_observer = EREF_RFSU, dp -> ftd_source = EREF_IFSU;
+               dp -> ftd_delay = DIAG_NODELAY;
+               dp -> ftd_cc = 0;
+               dp++;
+
+               state = FSTATE_FAILURE;
+               goto done_select;
+           }
+       }
+       else
+#else
+/* no account checking */
+#endif
+           mygid = NOTOK;
+
+done_select: ;
+       myaccess = ftse -> ftse_access;
+       ftm -> ftg_select.ftse_state = state;
+       ftm -> ftg_select.ftse_ndiag = dp - ftm -> ftg_select.ftse_diags;
+    }
+
+    if (ftg -> ftg_flags & FTG_CREATE) {
+       register struct FTAMcreate *ftce = &ftg -> ftg_create;
+       register struct FTAMattributes *fa = &ftce -> ftce_attrs;
+       struct FTAMdiagnostic *dp = ftm -> ftg_create.ftce_diags;
+       register struct vfsmap *vf;
+
+       if (!(fa -> fa_present & FA_FILENAME)
+               || fa -> fa_nfile != 1
+               || (myfile = getfile (fa -> fa_files[0])) == NULL) {
+           dp -> ftd_type = DIAG_PERM;
+           dp -> ftd_identifier = FS_SEL_FILENAME;
+           dp -> ftd_observer = dp -> ftd_source = EREF_RFSU;
+           dp -> ftd_delay = DIAG_NODELAY;
+           dp -> ftd_cc = 0;
+           dp++;
+
+           state = FSTATE_FAILURE;
+           goto done_create;
+       }
+#ifdef BRIDGE
+       if (ftp_access (myfile, E_OK) != NOTOK)
+#else
+       if (stat (myfile, &myst) != NOTOK)
+#endif
+           statok = 1;
+       if (statok) {
+#ifndef        BRIDGE  /* Assume file type allow corrective action */
+           switch (myst.st_mode & S_IFMT) {
+               case S_IFREG: 
+                   break;
+
+               case S_IFDIR: 
+                   switch (ftce -> ftce_override) {
+                       case FOVER_WRITE: 
+                           dp -> ftd_type = DIAG_PERM;
+                           dp -> ftd_identifier = FS_SEL_CRELOSE;
+                           dp -> ftd_observer = dp -> ftd_source = EREF_RFSU;
+                           dp -> ftd_delay = DIAG_NODELAY;
+                           dp -> ftd_cc = 0;
+                           dp++;
+
+                           state = FSTATE_FAILURE;
+                           goto done_create;
+
+                       default: 
+                           break;
+                   }
+                   break;
+
+               default: 
+                   if (myst.st_dev == null_dev && myst.st_ino == null_ino) {
+                       myst.st_mode &= ~S_IFMT, myst.st_mode |= S_IFREG;
+                       break;
+                   }
+                   dp -> ftd_type = DIAG_PERM;
+                   dp -> ftd_identifier = FS_SEL_AVAIL;
+                   dp -> ftd_observer = dp -> ftd_source = EREF_RFSU;
+                   dp -> ftd_delay = DIAG_NODELAY;
+                   dp -> ftd_cc = 0;
+                   dp++;
+
+                   state = FSTATE_FAILURE;
+                   goto done_create;
+           }
+#endif
+           switch (ftce -> ftce_override) {
+               case FOVER_FAIL: 
+                   dp -> ftd_type = DIAG_PERM;
+                   dp -> ftd_identifier = FS_SEL_EXISTS;
+                   dp -> ftd_observer = dp -> ftd_source = EREF_RFSU;
+                   dp -> ftd_delay = DIAG_NODELAY;
+                   dp -> ftd_cc = 0;
+                   dp++;
+
+                   state = FSTATE_FAILURE;
+                   goto done_create;
+
+               case FOVER_SELECT:
+                       if (ftg -> ftg_flags & FTG_RDATTR)
+                           ftce -> ftce_access |= FA_PERM_READATTR;
+                       if (ftg -> ftg_flags & FTG_CHATTR)
+                           ftce -> ftce_access |= FA_PERM_CHNGATTR;
+                       if (ftg -> ftg_flags & FTG_DELETE)
+                           ftce -> ftce_access |= FA_PERM_DELETE;
+                       if (chkaccess (NOTOK, ftce -> ftce_access, 
+                                   &ftce -> ftce_conctl, &dp) == NOTOK) {
+                           state = FSTATE_FAILURE;
+                           goto done_create;
+                       }
+                   break;
+
+               default: 
+                   break;
+           }
+       }
+
+       for (vf = vfs; vf -> vf_entry; vf++)
+           if (vf -> vf_oid
+                   && oid_cmp (vf -> vf_oid, fa -> fa_contents) == 0)
+               break;
+       if (!vf -> vf_entry) {
+           (void) sprintf (dp -> ftd_data,
+                          "invalid contents-type %s",
+                          sprintoid (fa -> fa_contents));
+           dp -> ftd_cc = strlen (dp -> ftd_data);
+           dp -> ftd_type = DIAG_PERM;
+           dp -> ftd_identifier = FS_SEL_ATRVALUE;
+           dp -> ftd_observer = EREF_RFSU, dp -> ftd_source = EREF_IFSU;
+           dp -> ftd_delay = DIAG_NODELAY;
+           dp++;
+
+           state = FSTATE_FAILURE;
+           goto done_create;
+       }
+
+       if (chkattrs (fa, fa -> fa_present & ~(FA_FILENAME | FA_CONTENTS),
+                   1, &dp) == NOTOK) {
+           state = FSTATE_FAILURE;
+           goto done_create;
+       }
+
+#ifndef        BRIDGE   /* no account checking */
+       if (ftce -> ftce_account && strlen (ftce -> ftce_account) > 1) {
+           if ((mygid = findgid (ftce -> ftce_account)) == NOTOK) {
+               dp -> ftd_type = DIAG_PERM;
+               dp -> ftd_identifier = FS_SEL_ACCOUNT;
+               dp -> ftd_observer = EREF_RFSU, dp -> ftd_source = EREF_IFSU;
+               dp -> ftd_delay = DIAG_NODELAY;
+               dp -> ftd_cc = 0;
+               dp++;
+
+               state = FSTATE_FAILURE;
+               goto done_create;
+           }
+       }
+       else
+#endif
+           mygid = NOTOK;
+
+done_create: ;
+       ftm -> ftg_create.ftce_state = state;
+       ftm -> ftg_create.ftce_ndiag = dp - ftm -> ftg_create.ftce_diags;
+    }
+
+    if (ftg -> ftg_flags & FTG_RDATTR)
+       ftm -> ftg_readattr.ftra_action = FACTION_SUCCESS;
+
+    if (ftg -> ftg_flags & FTG_CHATTR) {
+       register struct FTAMchngattr   *ftca = &ftg -> ftg_chngattr;
+       register struct FTAMattributes *fa = &ftca -> ftca_attrs;
+       struct FTAMdiagnostic *dp = ftm -> ftg_chngattr.ftca_diags;
+
+       if (chkattrs (fa, fa -> fa_present, 0, &dp) == NOTOK)
+           action = FACTION_PERM;
+       else
+           action = FACTION_SUCCESS;
+
+       ftm -> ftg_chngattr.ftca_action = action;
+       ftm -> ftg_chngattr.ftca_ndiag = dp - ftm -> ftg_chngattr.ftca_diags;
+    }
+    
+    if (ftg -> ftg_flags & FTG_OPEN) {
+       register struct FTAMopen *ftop = &ftm -> ftg_open;
+
+       ftop -> ftop_state = FSTATE_FAILURE;
+       ftop -> ftop_action = FACTION_SUCCESS;
+       if (ftop -> ftop_contents = ftg -> ftg_open.ftop_contents)
+           ftop -> ftop_parameter = ftg -> ftg_open.ftop_parameter;
+
+       FCINIT (&ftop -> ftop_conctl);
+    }
+
+    if (ftg -> ftg_flags & FTG_CLOSE)
+       ftm -> ftg_close.ftcl_action = FACTION_SUCCESS;
+
+    if (ftg -> ftg_flags & FTG_DESELECT)
+       ftm -> ftg_deselect.ftde_action = FACTION_SUCCESS;
+
+    if (ftg -> ftg_flags & FTG_DELETE)
+       ftm -> ftg_delete.ftxe_action = FACTION_SUCCESS;
+
+    if (ftg -> ftg_flags & FTG_SELECT) {
+       register struct FTAMselect *ftse = &ftm -> ftg_select;
+       register struct FTAMattributes *fa = &ftse -> ftse_attrs;
+
+       if (state != FSTATE_SUCCESS) {
+           ftse -> ftse_action = FACTION_PERM;
+           *fa = ftg -> ftg_select.ftse_attrs; /* struct copy */
+           ftm -> ftg_flags &= ~(FTG_RDATTR | FTG_CHATTR | FTG_OPEN);
+           return;
+       }
+       ftse -> ftse_action = FACTION_SUCCESS;
+       fa -> fa_present = FA_FILENAME;
+       fa -> fa_nfile = 0;
+       fa -> fa_files[fa -> fa_nfile++] = myfile;
+    }
+
+    if (ftg -> ftg_flags & FTG_CREATE) {
+       register struct FTAMattributes *fa = &ftg -> ftg_create.ftce_attrs;
+       register struct FTAMcreate *ftce = &ftm -> ftg_create;
+       struct FTAMdiagnostic  *dp = ftce -> ftce_diags + ftce -> ftce_ndiag;
+
+       if (state != FSTATE_SUCCESS) {
+           ftce -> ftce_action = FACTION_PERM;
+           ftce -> ftce_attrs = *fa;   /* struct copy */
+           ftm -> ftg_flags &= ~(FTG_RDATTR | FTG_CHATTR | FTG_OPEN);
+           return;
+       }
+       switch (ftg -> ftg_create.ftce_override) {
+           case FOVER_SELECT:
+           default: 
+               if (statok)
+                   break;
+               goto do_create;
+
+           case FOVER_DELETE: 
+#ifdef BRIDGE
+               if (statok && ftp_delete (myfile) == NOTOK) {
+#else
+               if (statok
+                       && ((myst.st_mode & S_IFMT) == S_IFREG
+                                   ? unlink (myfile)
+                                   : rmdir (myfile)) == NOTOK) {
+           bad_override: ;
+#endif
+                   dp -> ftd_type = DIAG_PERM;
+                   dp -> ftd_identifier = FS_SEL_CRELOSE;
+                   dp -> ftd_observer = dp -> ftd_source = EREF_RFSU;
+                   dp -> ftd_delay = DIAG_NODELAY;
+#ifdef BRIDGE
+                   (void) strcpy (dp -> ftd_data, ftp_error);
+#else
+                   (void) strcpy (dp -> ftd_data, sys_errname (errno));
+#endif
+                   dp -> ftd_cc = strlen (dp -> ftd_data);
+                   dp++;
+
+           bad_create: ;
+                   ftce -> ftce_action = FACTION_PERM;
+                   ftce -> ftce_attrs = *fa;   /* struct copy */
+                   ftce -> ftce_ndiag = dp - ftce -> ftce_diags;
+
+                   ftce -> ftce_state = FSTATE_FAILURE;
+                   ftm -> ftg_flags &= ~(FTG_RDATTR | FTG_CHATTR | FTG_OPEN);
+                   return;
+               }
+               /* else fall */
+
+           case FOVER_FAIL:
+               statok = 0;
+       do_create: ;
+               if (!(fa -> fa_present & FA_CONTENTS)
+                       || oid_cmp (vfs[VFS_FDF].vf_oid, fa -> fa_contents)) {
+#ifdef BRIDGE
+                   if (ftp_create (myfile) == NOTOK) {
+#else
+                   if ((myfd = open (myfile, O_RDWR | O_CREAT | O_TRUNC,
+                                       0666)) == NOTOK) {
+#endif
+               bad_open: ;
+                       dp -> ftd_type = DIAG_PERM;
+                       dp -> ftd_identifier = FS_SEL_CREATE;
+                       dp -> ftd_observer = dp -> ftd_source = EREF_RFSU;
+                       dp -> ftd_delay = DIAG_NODELAY;
+                       (void) strcpy (dp -> ftd_data, sys_errname (errno));
+                       dp -> ftd_cc = strlen (dp -> ftd_data);
+                       dp++;
+
+                       goto bad_create;
+                   }
+               }
+               else
+#ifdef BRIDGE
+                   if (ftp_mkdir (myfile) == NOTOK)
+#else
+                   if (mkdir (myfile, 0755) == NOTOK)
+#endif
+                       goto bad_open;
+               if (chngattrs (fa -> fa_present
+                       & ~(FA_FILENAME | FA_CONTENTS), fa, &dp) == NOTOK)
+                   goto bad_create;
+               break;
+
+           case FOVER_WRITE: 
+               if (!statok)
+                   goto do_create;
+#ifndef        BRIDGE
+#ifdef SUNOS4
+               if (myst.st_size > 0 && truncate (myfile, (off_t) 0) == NOTOK)
+                   goto bad_override;
+#else
+               if (myst.st_size > 0 && truncate (myfile, 0) == NOTOK)
+                   goto bad_override;
+#endif
+#endif
+               break;
+       }
+
+       ftce -> ftce_action = FACTION_SUCCESS;
+       (void) readattrs (FA_FILENAME | FA_ACTIONS | FA_CONTENTS,
+                         &ftce -> ftce_attrs, fa -> fa_contents,
+                         fa -> fa_parameter, myfile, &myst, &dp);
+       if (fa -> fa_present & FA_ACTIONS)
+           ftce -> ftce_attrs.fa_permitted &= fa -> fa_permitted;
+       ftce -> ftce_ndiag = dp - ftce -> ftce_diags;
+    }
+
+    if (ftg -> ftg_flags & FTG_RDATTR
+           && (ftm -> ftg_readattr.ftra_action == FACTION_SUCCESS)) {
+       register struct FTAMreadattr   *ftra = &ftm -> ftg_readattr;
+       struct FTAMdiagnostic  *dp = ftra -> ftra_diags + ftra -> ftra_ndiag;
+
+       if (!statok) {
+#ifdef BRIDGE
+           if (0) { /* assume OK */
+#else
+           if ((myfd != NOTOK ? fstat (myfd, &myst)
+                              : stat (myfile, &myst)) == NOTOK) {
+               dp -> ftd_type = DIAG_PERM;
+               dp -> ftd_identifier = FS_MGT_READ;
+               dp -> ftd_observer = dp -> ftd_source = EREF_RFSU;
+               dp -> ftd_delay = DIAG_NODELAY;
+               dp -> ftd_cc = 0;
+               dp++;
+#endif
+
+       bad_readattr: ;
+               ftra -> ftra_action = FACTION_PERM;
+               ftra -> ftra_ndiag = dp - ftra -> ftra_diags;
+               return;
+           }
+           else
+               statok++;
+       }
+       if (readattrs (ftg -> ftg_readattr.ftra_attrnames,
+                      &ftra -> ftra_attrs, ftg -> ftg_flags & FTG_OPEN
+                          ? ftg -> ftg_open.ftop_contents : NULLOID, NULLPE,
+                      myfile, &myst, &dp) == NOTOK)
+           goto bad_readattr;
+       ftra -> ftra_ndiag = dp - ftra -> ftra_diags;
+    }
+
+    if (ftg -> ftg_flags & FTG_CHATTR
+           && (ftm -> ftg_chngattr.ftca_action == FACTION_SUCCESS)) {
+       register struct FTAMchngattr   *ftca = &ftm -> ftg_chngattr;
+       register struct FTAMattributes *fa = &ftg -> ftg_chngattr.ftca_attrs;
+       struct FTAMdiagnostic  *dp = ftca -> ftca_diags + ftca -> ftca_ndiag;
+
+       if (chngattrs (fa -> fa_present, fa, &dp) == NOTOK) {
+           ftca -> ftca_action = FACTION_PERM;
+           ftca -> ftca_ndiag = dp - ftca -> ftca_diags;
+           return;
+       }
+
+       ftca -> ftca_ndiag = dp - ftca -> ftca_diags;
+    }
+
+    if (ftg -> ftg_flags & FTG_OPEN) {
+#ifndef        BRIDGE
+       int     mode;
+#endif
+       register struct FTAMopen *ftop = &ftm -> ftg_open;
+       struct FTAMdiagnostic  *dp = ftop -> ftop_diags + ftop -> ftop_ndiag;
+       
+       ftop -> ftop_state = FSTATE_SUCCESS;
+       if (statok == 0) {
+           if (stat (myfile, &myst) == NOTOK) {
+#ifndef        BRIDGE
+unavailable: ;
+#endif
+               dp -> ftd_type = DIAG_PERM;
+               dp -> ftd_identifier = FS_SEL_AVAIL;
+               dp -> ftd_observer = dp -> ftd_source = EREF_RFSU;
+               dp -> ftd_delay = DIAG_NODELAY;
+               if (errno) {
+                   (void) strcpy (dp -> ftd_data, sys_errname (errno));
+                   dp -> ftd_cc = strlen (dp -> ftd_data);
+               }
+               else
+                   dp -> ftd_cc = 0;
+               dp++;
+
+               ftop -> ftop_state = FSTATE_FAILURE;
+               goto done_open;
+           }
+           else
+               statok = 1;
+       }
+
+        if (ftop -> ftop_contents == NULL) {
+           register struct FTAMattributes *fa;
+
+           if (ftg -> ftg_flags & FTG_CREATE) {
+               fa = &ftg -> ftg_create.ftce_attrs;
+
+               ftop -> ftop_contents = fa -> fa_contents;
+               ftop -> ftop_parameter = fa -> fa_parameter;
+               advise (LLOG_DEBUG, NULLCP,
+                       "using contents-type from CREATE <%s, 0x%x>",
+                       oid2ode (ftop -> ftop_contents),
+                       ftop -> ftop_parameter);
+               goto find_myvfs;
+           }
+
+           if ((ftg -> ftg_flags & FTG_RDATTR)
+                   && ftm -> ftg_readattr.ftra_action == FACTION_SUCCESS
+                   && ((fa = &ftm -> ftg_readattr.ftra_attrs) -> fa_present
+                               & FA_CONTENTS)) {
+               ftop -> ftop_contents = fa -> fa_contents;
+               ftop -> ftop_parameter = fa -> fa_parameter;
+               advise (LLOG_DEBUG, NULLCP,
+                       "using contents-type from READ-ATTRIBUTE <%s, 0x%x>",
+                       oid2ode (ftop -> ftop_contents),
+                       ftop -> ftop_parameter);
+
+find_myvfs: ;
+               if ((myvf = st2vfs (myfd, myfile, &myst, ftop -> ftop_contents,
+                                   ftamfd)) == NULL)
+                   goto no_ascertain;
+               if (oid_cmp (ftop -> ftop_contents, myvf -> vf_oid) == 0)
+                   goto find_param;
+               advise (LLOG_DEBUG, NULLCP,
+                       "wrong intuition; back to step one");
+               ftop -> ftop_contents = NULLOID;
+               ftop -> ftop_parameter = NULLPE;
+           }
+
+           if ((myvf = st2vfs (myfd, myfile, &myst, NULLOID, ftamfd))
+                   == NULL) {
+no_ascertain: ;
+               (void) strcpy (dp -> ftd_data,
+                              "unable to ascertain contents-type");
+               dp -> ftd_cc = strlen (dp -> ftd_data);
+               dp -> ftd_type = DIAG_PERM;
+               dp -> ftd_identifier = FS_ACC_LCL;
+               dp -> ftd_observer = dp -> ftd_source = EREF_RFSU;
+               dp -> ftd_delay = DIAG_NODELAY;
+               dp++;
+
+               ftop -> ftop_state = FSTATE_FAILURE;
+               goto done_open;
+           }
+           ftop -> ftop_contents = myvf -> vf_oid;
+           advise (LLOG_DEBUG, NULLCP,
+                   "using contents-type from st2vfs: %s",
+                   oid2ode (ftop -> ftop_contents));
+
+find_param: ;
+           if (myvf -> vf_mandatory == 0 && ftop -> ftop_parameter)
+               ftop -> ftop_parameter = NULLPE;
+           else if (ftop -> ftop_parameter == NULL) {
+               char buffer[BUFSIZ];
+
+               if (rdparam)
+                   pe_free (rdparam), rdparam = NULLPE;
+               if (enc_f (myvf -> vf_number, &_ZDOCS_mod, &rdparam, 1, 0,
+                          NULLCP, myvf -> vf_parameter) == NOTOK) {
+                   advise (LLOG_EXCEPTIONS, NULLCP,
+                           "unable to build parameter: %s", PY_pepy);
+                   if (rdparam)
+                       pe_free (rdparam), rdparam = NULLPE;
+                   goto no_ascertain;
+               }
+               ftop -> ftop_parameter = rdparam;
+
+               vpushstr (buffer);
+               vunknown (ftop -> ftop_parameter);
+               vpopstr ();
+               advise (LLOG_DEBUG, NULLCP,
+                       "generating parameter from vfs: %s", buffer);
+           }
+       }
+       else
+           if ((myvf = st2vfs (myfd, myfile, &myst, ftop -> ftop_contents,
+                               ftamfd)) == NULL) {
+               dp -> ftd_cc = 0;
+bad_param: ;
+               dp -> ftd_type = DIAG_PERM;
+               dp -> ftd_identifier = FS_ACC_TYPINCON;
+               dp -> ftd_observer = EREF_RFSU, dp -> ftd_source = EREF_IFSU;
+               dp -> ftd_delay = DIAG_NODELAY;
+               dp++;
+
+               ftop -> ftop_state = FSTATE_FAILURE;
+               goto done_open;
+           }
+
+        if (oid_cmp (ftop -> ftop_contents, myvf -> vf_oid)) {
+           advise (LLOG_NOTICE, NULLCP, "simplifying document type");
+
+           ftop -> ftop_contents = myvf -> vf_oid;
+           ftop -> ftop_parameter = NULLPE;
+           if (myvf -> vf_mandatory) {
+               char buffer[BUFSIZ];
+
+               if (rdparam)
+                   pe_free (rdparam), rdparam = NULLPE;
+               if (enc_f (myvf -> vf_number, &_ZDOCS_mod, &rdparam, 1, 0,
+                          NULLCP, myvf -> vf_parameter) == NOTOK) {
+                   advise (LLOG_EXCEPTIONS, NULLCP,
+                           "unable to build parameter: %s", PY_pepy);
+                   if (rdparam)
+                       pe_free (rdparam), rdparam = NULLPE;
+                   goto no_ascertain;
+               }
+               ftop -> ftop_parameter = rdparam;
+
+               vpushstr (buffer);
+               vunknown (ftop -> ftop_parameter);
+               vpopstr ();
+               advise (LLOG_DEBUG, NULLCP,
+                       "generating parameter from myvf: %s", buffer);
+           }
+       }
+
+       if (ftop -> ftop_parameter) {
+           if (myvf -> vf_number < 0) {
+               (void) sprintf (dp -> ftd_data,
+                               "unexpected document type parameter");
+               dp -> ftd_cc = strlen (dp -> ftd_data);
+               goto bad_param;
+           }
+           myparam = NULL;
+           if (dec_f (myvf -> vf_number, &_ZDOCS_mod, ftop -> ftop_parameter,
+                      1, NULLIP, NULLVP, &myparam) == NOTOK) {
+               (void) sprintf (dp -> ftd_data,
+                               "unable to parse document type parameter: %s",
+                               PY_pepy);
+               dp -> ftd_cc = strlen (dp -> ftd_data);
+               goto bad_param;
+           }
+           if (myvf -> vf_check
+                   && (*myvf -> vf_check) (myparam, dp -> ftd_data)
+                           == NOTOK)
+               goto bad_param;
+       }
+       else
+           if (myvf -> vf_mandatory > 0) {
+               (void) strcpy (dp -> ftd_data,
+                              "mandatory document type parameter missing");
+               dp -> ftd_cc = strlen (dp -> ftd_data);
+               goto bad_param;
+           }
+
+       mymode = ftg -> ftg_open.ftop_mode;
+#ifndef        BRIDGE
+       if (mymode & FA_PERM_WRITE)
+           mode = (mymode & FA_PERM_READ) ? O_RDWR : O_WRONLY;
+       else
+           mode = O_RDONLY;
+#endif
+
+       errno = 0;
+#ifndef        BRIDGE
+       switch (myst.st_mode & S_IFMT) {
+           case S_IFREG:
+               if (myfd == NOTOK && (myfd = open (myfile, mode)) == NOTOK)
+                   goto unavailable;
+               break;
+                   
+           case S_IFDIR:
+               if (mode == O_RDONLY)
+                   break;
+               /* else fall */
+
+           default:
+               goto unavailable;
+       }
+#endif
+
+       myconctl = ftg -> ftg_open.ftop_conctl; /* struct copy */
+       ftm -> ftg_open.ftop_conctl = myconctl; /*   .. */
+       mylockstyle = ftg -> ftg_open.ftop_locking;
+
+       if (chkaccess (myfd, mymode, &myconctl, &dp) == NOTOK) {
+           ftop -> ftop_state = FSTATE_FAILURE;
+           goto done_open;
+       }
+
+done_open: ;
+       ftop -> ftop_ndiag = dp - ftop -> ftop_diags;
+
+       if (ftop -> ftop_state != FSTATE_SUCCESS) {
+           ftop -> ftop_action = FACTION_PERM;
+           return;
+       }
+    }
+
+    if (ftg -> ftg_flags & FTG_CLOSE
+           && (ftm -> ftg_close.ftcl_action == FACTION_SUCCESS)) {
+       if (myfd != NOTOK) {
+#ifdef BRIDGE
+           (void) close (myfd);
+           (void) ftp_reply ();
+#else
+           unlock ();
+           (void) close (myfd);
+#endif
+           myfd = NOTOK;
+       }
+       if (myvf && myparam) {
+           (void) fre_obj (myparam, _ZDOCS_mod.md_dtab[myvf -> vf_number],
+                           &_ZDOCS_mod, 1);
+           myparam = NULL;
+       }
+    }
+
+    if (ftg -> ftg_flags & FTG_DESELECT) {
+       register struct FTAMdeselect   *ftde = &ftm -> ftg_deselect;
+
+       if (ftde -> ftde_action == FACTION_SUCCESS) {
+       /* anything to charge if (mygid != NOTOK)?  ha! */
+       }
+    }
+
+    if (ftg -> ftg_flags & FTG_DELETE) {
+       register struct FTAMdelete *ftxe = &ftm -> ftg_delete;
+       struct FTAMdiagnostic  *dp = ftxe -> ftxe_diags + ftxe -> ftxe_ndiag;
+
+       if (ftxe -> ftxe_action == FACTION_SUCCESS) {
+#ifdef BRIDGE
+           if (ftp_delete (myfile) == NOTOK) {
+#else
+           if (!statok && stat (myfile, &myst) == NOTOK)
+               myst.st_mode = S_IFREG;
+           if (((myst.st_mode & S_IFMT) == S_IFREG ? unlink (myfile)
+                                                   : rmdir (myfile))
+                       == NOTOK) {
+#endif
+               dp -> ftd_type = DIAG_PERM;
+               dp -> ftd_identifier = FS_SEL_DELETE;
+               dp -> ftd_observer = dp -> ftd_source = EREF_RFSU;
+               dp -> ftd_delay = DIAG_NODELAY;
+#ifdef BRIDGE
+               (void) strcpy (dp -> ftd_data, ftp_error);
+#else
+               (void) strcpy (dp -> ftd_data, sys_errname (errno));
+#endif
+               dp -> ftd_cc = strlen (dp -> ftd_data);
+               dp++;
+
+               ftxe -> ftxe_action = FACTION_PERM;
+               ftxe -> ftxe_ndiag = dp - ftxe -> ftxe_diags;
+               return;
+           }
+           advise (LLOG_NOTICE, NULLCP, "delete %s", myfile);
+       }
+    }
+}
+
+/* \f */
+
+#ifdef BRIDGE
+/* ARGSUSED */
+#endif
+
+static int  chkaccess (fd, request, fc, diags)
+int    fd,
+       request;
+#ifndef        BRIDGE
+register
+#endif
+struct FTAMconcurrency *fc;
+register struct FTAMdiagnostic **diags;
+{
+    int     result;
+#ifndef        BRIDGE
+    register char  *cp;
+#endif
+    register struct FTAMdiagnostic *dp = *diags;
+
+    result = OK;
+
+#ifndef        BRIDGE
+    if (((request & FA_PERM_READ) && EACCESS (myfile, R_OK) == NOTOK)
+           || ((request & FA_PERM_WRITE) && EACCESS (myfile, W_OK) == NOTOK)
+           || ((request & FA_PERM_OWNER)
+                       && (myuid != myst.st_uid && myuid != 0))) {
+no_access: ;
+       dp -> ftd_type = DIAG_PERM;
+       dp -> ftd_identifier = FS_SEL_ACCAVAIL;
+       dp -> ftd_observer = dp -> ftd_source = EREF_RFSU;
+       dp -> ftd_delay = DIAG_NODELAY;
+       dp -> ftd_cc = 0;
+       dp++;
+
+       result = NOTOK;
+       goto out;
+    }
+    if (request & FA_PERM_PARENT) {
+       if (cp = rindex (myfile, '/')) {
+           *cp = NULL;
+           result = EACCESS (*myfile ? myfile : "/", W_OK);
+           *cp = '/';
+       }
+       else
+           result = EACCESS (".", W_OK);
+
+       if (result == NOTOK)
+           goto no_access;
+    }
+#else
+/* already selected file and know it exists, FTP cannot tell us more */
+#endif
+
+#ifndef        BRIDGE
+out: ;
+
+    if (attrs & FATTR_STORAGE) {
+       if (fd == NOTOK) {
+           mylock = 0;
+
+           if (((request & FA_PERM_READATTR)
+                       && (fc -> fc_readattrlock & FLOCK_RESTRICT))
+                   || ((request & FA_PERM_CHNGATTR)
+                       && (fc -> fc_chngattrlock & FLOCK_RESTRICT))
+                   || ((request & FA_PERM_DELETE)
+                       && (fc -> fc_deletelock & FLOCK_RESTRICT))) {
+               dp -> ftd_type = DIAG_PERM;
+               dp -> ftd_identifier = FS_SEL_CONSUPRT;
+               dp -> ftd_observer = dp -> ftd_source = EREF_RFSU;
+               dp -> ftd_delay = DIAG_NODELAY;
+               dp -> ftd_cc = 0;
+               dp++;
+
+               result = NOTOK;
+           }
+       }
+       else {
+#ifdef SYS5
+           struct flock    fs;
+#endif
+
+           if ((request & FA_PERM_WRITE)
+                   && ((fc -> fc_insertlock & FLOCK_RESTRICT)
+                           || (fc -> fc_replacelock & FLOCK_RESTRICT)
+                           || (fc -> fc_eraselock & FLOCK_RESTRICT)
+                           || (fc -> fc_extendlock & FLOCK_RESTRICT))) {
+               mylock = 1;
+#ifndef        SYS5
+               if (flock (fd, LOCK_EX) == NOTOK)
+                   goto bad_concur;
+#else
+               fs.l_type = F_WRLCK;
+               fs.l_whence = L_SET;
+               fs.l_start = fs.l_len = 0;
+               if (fcntl (fd, F_SETLKW, &fs) == NOTOK)
+                   goto bad_concur;
+#endif
+           }
+           else
+               if ((request & FA_PERM_READ)
+                       && (fc -> fc_readlock & FLOCK_RESTRICT)) {
+                   mylock = 1;
+#ifndef        SYS5
+                   if (flock (fd, LOCK_SH) == NOTOK) {
+#else
+                   fs.l_type = F_RDLCK;
+                   fs.l_whence = L_SET;
+                   fs.l_start = fs.l_len = 0;
+                   if (fcntl (fd, F_SETLKW, &fs) == NOTOK) {
+#endif
+bad_concur: ;
+                       dp -> ftd_type = DIAG_PERM;
+                       dp -> ftd_identifier = FS_ACC_CONAVAIL;
+                       dp -> ftd_observer = dp -> ftd_source = EREF_RFSU;
+                       dp -> ftd_delay = DIAG_NODELAY;
+                       (void) strcpy (dp -> ftd_data, sys_errname (errno));
+                       dp -> ftd_cc = strlen (dp -> ftd_data);
+                       dp++;
+
+                       mylock = 0;
+                       result = NOTOK;
+                   }
+               }
+       }
+    }
+#endif
+
+    *diags = dp;
+    return result;
+}
+
+/* \f */
+
+static int  chkattrs (fa, present, select, diags)
+register struct FTAMattributes *fa;
+long   present;
+int    select;
+register struct FTAMdiagnostic **diags;
+{
+    int     id,
+           result;
+    char   *file;
+    register struct FTAMdiagnostic *dp = *diags;
+
+    result = OK;
+
+    present &= ~FA_FUTURESIZE; /* be liberal in what you accept... */
+    if (present & ~(FA_CHATTR | FA_RDATTR)) {
+       dp -> ftd_type = DIAG_PERM;
+       dp -> ftd_identifier = select ? FS_SEL_INITIAL
+           : (present & FA_RDATTR) ? FS_MGT_CHANGE : FS_MGT_EXIST;
+       dp -> ftd_observer = dp -> ftd_source = EREF_RFSU;
+       dp -> ftd_delay = DIAG_NODELAY;
+       dp -> ftd_cc = 0;
+       dp++;
+
+       result = NOTOK;
+    }
+
+    id = select ? FS_SEL_ATRVALUE : FS_MGT_VALUE;
+
+    if (present & FA_FILENAME) {
+       if (fa -> fa_nfile != 1
+               || (file = getfile (fa -> fa_files[0])) == NULL) {
+           dp -> ftd_type = DIAG_PERM;
+           dp -> ftd_identifier = id;
+           dp -> ftd_observer = EREF_RFSU, dp -> ftd_source = EREF_IFSU;
+           dp -> ftd_delay = DIAG_NODELAY;
+           (void) strcpy (dp -> ftd_data, "00 bad filename");
+           dp -> ftd_cc = strlen (dp -> ftd_data);
+           dp++;
+
+           result = NOTOK;
+       }
+       else
+           (void) strcpy (mvfile, file);
+    }
+
+#ifndef        BRIDGE
+    if ((present & FA_ACCOUNT) && strlen (fa -> fa_account) > 1) {
+       if (findgid (fa -> fa_account) == NOTOK) {
+           dp -> ftd_type = DIAG_PERM;
+           dp -> ftd_identifier = id;
+           dp -> ftd_observer = EREF_RFSU, dp -> ftd_source = EREF_IFSU;
+           dp -> ftd_delay = DIAG_NODELAY;
+           (void) strcpy (dp -> ftd_data, "02 bad storage account");
+           dp -> ftd_cc = strlen (dp -> ftd_data);
+           dp++;
+       
+           result = NOTOK;
+       }
+    }
+
+    if ((present & FA_FILESIZE) && fa -> fa_filesize < 0) {
+       dp -> ftd_type = DIAG_PERM;
+       dp -> ftd_identifier = id;
+       dp -> ftd_observer = EREF_RFSU, dp -> ftd_source = EREF_IFSU;
+       dp -> ftd_delay = DIAG_NODELAY;
+       (void) strcpy (dp -> ftd_data, "13bad filesize");
+       dp -> ftd_cc = strlen (dp -> ftd_data);
+       dp++;
+
+       result = NOTOK;
+    }
+#endif
+
+    *diags = dp;
+    return result;
+}
+
+/* \f */
+
+int    readattrs (attrnames, fa, proposed, parameter, file, st, diags)
+int    attrnames;
+register struct FTAMattributes *fa;
+OID    proposed;
+PE     parameter;
+char   *file;
+struct stat *st;
+register struct FTAMdiagnostic **diags;
+{
+#ifndef        BRIDGE
+    int     result;
+    char   *cp;
+    register struct tm *tm;
+#endif
+    register struct FTAMdiagnostic *dp = *diags;
+
+    fa -> fa_present = attrnames;
+    fa -> fa_novalue = attrnames & (FA_SECURITY | FA_PRIVATE);
+
+    if (attrnames & FA_FILENAME) {
+       fa -> fa_nfile = 0;
+       fa -> fa_files[fa -> fa_nfile++] = file;
+    }
+
+    if (attrnames & FA_ACTIONS) {
+       fa -> fa_permitted = 0;
+#ifndef        BRIDGE
+       if (EACCESS (file, R_OK) != NOTOK)
+#endif
+           fa -> fa_permitted |= FA_PERM_READ;
+
+#ifndef        BRIDGE
+       if (EACCESS (file, W_OK) != NOTOK)
+#endif
+           fa -> fa_permitted |= FA_PERM_WRITE;
+
+       if (fa -> fa_permitted & (FA_PERM_READ | FA_PERM_WRITE))
+           fa -> fa_permitted |= FA_PERM_TRAVERSAL;
+
+       fa -> fa_permitted |= FA_PERM_READATTR;
+
+#ifndef        BRIDGE
+       if (myuid == st -> st_uid || myuid == 0)
+#endif
+           fa -> fa_permitted |= FA_PERM_OWNER;
+
+#ifndef        BRIDGE
+       if (cp = rindex (file, '/')) {
+           *cp = NULL;
+           result = EACCESS (*file ? file : "/", W_OK);
+           *cp = '/';
+       }
+       else
+           result = EACCESS (".", W_OK);
+       if (result != NOTOK)
+#endif
+           fa -> fa_permitted |= FA_PERM_PARENT;
+    }
+
+    if (attrnames & FA_CONTENTS) {
+       register struct vfsmap *vf;
+
+       if (vf = st2vfs (myfd, file, st, proposed, ftamfd)) {
+           fa -> fa_contents = vf -> vf_oid;
+           if (proposed
+                   && oid_cmp (proposed, vf -> vf_oid) == 0
+                   && parameter
+                   && vf -> vf_number >= 0
+                   && vf -> vf_check) {
+               caddr_t p = NULL;
+
+               if (dec_f (vf -> vf_number, &_ZDOCS_mod, parameter, 1, NULLIP,
+                          NULLVP, &p) == NOTOK) {
+                   advise (LLOG_NOTICE, NULLCP,
+                           "unable to parse document type parameter: %s",
+                           PY_pepy);
+                   goto bad_param;
+               }
+               if ((*vf -> vf_check) (p, dp -> ftd_data) == NOTOK) {
+                   advise (LLOG_NOTICE, NULLCP,
+                           "unacceptable document type parameter: %s",
+                           dp -> ftd_data);
+                   goto bad_param;
+               }
+               (void) fre_obj (p, _ZDOCS_mod.md_dtab[vf -> vf_number],
+                               &_ZDOCS_mod, 1);
+               fa -> fa_parameter = parameter;
+           }
+bad_param: ;
+
+           if (vf -> vf_parameter) {
+               if (rdparam)
+                   pe_free (rdparam), rdparam = NULLPE;
+
+               if (enc_f (vf -> vf_number, &_ZDOCS_mod, &rdparam, 1, 0,
+                          NULLCP, vf -> vf_parameter) == NOTOK) {
+                   advise (LLOG_EXCEPTIONS, NULLCP,
+                           "unable to build parameter: %s", PY_pepy);
+                   if (rdparam)
+                       pe_free (rdparam), rdparam = NULLPE;
+               }
+               fa -> fa_parameter = rdparam;
+           }
+           else
+               fa -> fa_parameter = NULLPE;
+       }
+       else
+           fa -> fa_present &= ~FA_CONTENTS;
+    }
+
+#ifdef BRIDGE
+/* these values cannot be obtained from FTP */
+    if (attrnames & FA_ACCOUNT)
+#else
+    if ((attrnames & FA_ACCOUNT)
+           && (fa -> fa_account = getgroup (st -> st_gid)) == NULL)
+#endif
+       fa -> fa_present &= ~FA_ACCOUNT;
+
+    if (attrnames & FA_DATE_CREATE)
+#ifndef        BRIDGE
+       if (tm = gmtime ((long *) &st -> st_mtime))
+           tm2ut (tm, &fa -> fa_date_create);
+       else
+#endif
+           fa -> fa_novalue |= FA_DATE_CREATE;
+
+    if (attrnames & FA_DATE_MODIFY)
+#ifndef        BRIDGE
+       if (tm = gmtime ((long *) &st -> st_mtime))
+           tm2ut (tm, &fa -> fa_date_modify);
+       else
+#endif
+           fa -> fa_novalue |= FA_DATE_MODIFY;
+
+    if (attrnames & FA_DATE_READ)
+#ifndef        BRIDGE
+       if (tm = gmtime ((long *) &st -> st_atime))
+           tm2ut (tm, &fa -> fa_date_read);
+       else
+#endif
+           fa -> fa_novalue |= FA_DATE_READ;
+
+    if (attrnames & FA_DATE_ATTR)
+#ifndef        BRIDGE
+       if (tm = gmtime ((long *) &st -> st_ctime))
+           tm2ut (tm, &fa -> fa_date_attribute);
+       else
+#endif
+           fa -> fa_novalue |= FA_DATE_ATTR;
+
+#ifdef BRIDGE
+    if (attrnames & FA_ID_CREATE)
+#else
+    if ((attrnames & FA_ID_CREATE)
+           && (fa -> fa_id_create = getuser (st -> st_uid)) == NULL)
+#endif
+       fa -> fa_novalue |= FA_ID_CREATE;
+
+#ifdef BRIDGE
+    if (attrnames & FA_ID_MODIFY)
+#else
+    if ((attrnames & FA_ID_MODIFY)
+           && ((st -> st_mode & 0022)
+                   || (fa -> fa_id_modify = getuser (st -> st_uid)) == NULL))
+#endif
+       fa -> fa_novalue |= FA_ID_MODIFY;
+
+#ifdef BRIDGE
+    if (attrnames & FA_ID_READ)
+#else
+    if ((attrnames & FA_ID_READ)
+           && ((st -> st_mode & 0044)
+                   || (fa -> fa_id_read = getuser (st -> st_uid)) == NULL))
+#endif
+       fa -> fa_novalue |= FA_ID_READ;
+
+#ifdef BRIDGE
+    if (attrnames & FA_ID_ATTR)
+#else
+    if ((attrnames & FA_ID_ATTR)
+           && ( (st -> st_mode & 0022)
+                   || (fa -> fa_id_attribute = getuser (st -> st_uid))
+                               == NULL))
+#endif
+       fa -> fa_novalue |= FA_ID_ATTR;
+
+    if (attrnames & FA_AVAILABILITY)
+       fa -> fa_availability = FA_AVAIL_IMMED;
+
+    if (attrnames & FA_FILESIZE)
+#ifdef BRIDGE
+       fa -> fa_novalue |= FA_FILESIZE;
+#else
+       fa -> fa_filesize = (int) st -> st_size;
+#endif
+
+    if (attrnames & FA_FUTURESIZE)
+       fa -> fa_novalue |= FA_FUTURESIZE;
+
+    *diags = dp;
+    return OK;
+}
+
+/* \f */
+
+static int  chngattrs (present, fa, diags)
+long   present;
+register struct FTAMattributes *fa;
+register struct FTAMdiagnostic **diags;
+{
+#ifndef        BRIDGE
+    int     gid,
+            result;
+#endif
+    register struct FTAMdiagnostic *dp = *diags;
+#ifndef        BRIDGE
+    struct  stat    n1;
+#endif
+
+#ifdef BRIDGE
+    statok = 1;
+#else
+    if ((myfd != NOTOK ? fstat (myfd, &myst) : stat (myfile, &myst))
+           == NOTOK) {
+bad_system: ;
+       (void) strcpy (dp -> ftd_data, sys_errname (errno));
+       dp -> ftd_cc = strlen (dp -> ftd_data);
+       goto no_change;
+    }
+    statok = 1;
+    if (myuid != myst.st_uid && myuid != 0) {
+       errno = EPERM;
+       goto bad_system;
+    }
+#endif
+
+#ifndef        BRIDGE
+    if ((present & FA_ACCOUNT) && strlen (fa -> fa_account) > 1)
+       if ((gid = findgid (fa -> fa_account)) != NOTOK) {
+#ifndef        SYS5
+           (void) seteuid (0);
+           result = myfd != NOTOK ? fchown (myfd, -1, gid)
+                   : chown (myfile, -1, gid);
+           (void) seteuid (myuid);
+#else
+           result = chgrp (myfile, gid);
+#endif
+
+           if (result == NOTOK) {
+               (void) sprintf (dp -> ftd_data, "%s: %s", fa -> fa_account,
+                               sys_errname (errno));
+               dp -> ftd_cc = strlen (dp -> ftd_data);
+
+       no_change: ;
+               dp -> ftd_type = DIAG_PERM;
+               dp -> ftd_identifier = FS_MGT_CHANGE;
+               dp -> ftd_observer = dp -> ftd_source = EREF_RFSU;
+               dp -> ftd_delay = DIAG_NODELAY;
+               dp++;
+
+               *diags = dp;
+               return NOTOK;
+           }
+
+           myst.st_gid = gid;
+        }
+#endif
+
+    if (present & FA_FILENAME) {
+#ifdef BRIDGE
+       if (ftp_rename (myfile, mvfile) == NOTOK) {
+           (void) sprintf (dp -> ftd_data, "%s: %s", fa -> fa_files[0],
+                           ftp_error);
+#else
+       if (stat (mvfile, &n1) == 0) {  /*file exists*/
+           advise (LLOG_NOTICE, NULLCP, "file %s already exists",mvfile);
+           (void) sprintf (dp->ftd_data, "File \"%s\" already exists",
+                           fa -> fa_files[0]);
+           dp -> ftd_cc = strlen (dp -> ftd_data);
+           dp -> ftd_type = DIAG_PERM;
+           dp -> ftd_identifier = FS_MGT_CHANGE;
+           dp -> ftd_observer = dp -> ftd_source = EREF_RFSU;
+           dp -> ftd_delay = DIAG_NODELAY;
+           dp++;
+
+           *diags = dp;
+           return NOTOK;
+       } else if (rename (myfile, mvfile) == NOTOK) {  /* on EXDEV could do gonzo
+                                                  copy, but why bother? */
+           (void) sprintf (dp -> ftd_data, "%s: %s", fa -> fa_files[0],
+                   sys_errname (errno));
+#endif
+           dp -> ftd_cc = strlen (dp -> ftd_data);
+#ifndef        BRIDGE
+           goto no_change;
+#else
+           dp -> ftd_type = DIAG_PERM;
+           dp -> ftd_identifier = FS_MGT_CHANGE;
+           dp -> ftd_observer = dp -> ftd_source = EREF_RFSU;
+           dp -> ftd_delay = DIAG_NODELAY;
+           dp++;
+
+           *diags = dp;
+           return NOTOK;
+#endif
+       }
+       advise (LLOG_NOTICE, NULLCP, "rename %s to %s", myfile, mvfile);
+
+       myfile = mvfile;
+    }
+
+    *diags = dp;
+    return OK;
+}
+
+/* \f */
+
+static char *getfile (file)
+char   *file;
+{
+    register char  *bp;
+#ifndef        BRIDGE
+    register char  *cp,
+                   *pp;
+    register struct passwd *pw;
+#endif
+    static int  i = 0;
+    static char buffer1[MAXPATHLEN],
+                buffer2[MAXPATHLEN];
+
+    bp = (i++ % 2) ? buffer1 : buffer2;
+
+#ifndef        BRIDGE
+    switch (*file) {
+       case '/': 
+           if (strlen (file) >= MAXPATHLEN)
+               goto trunc;
+
+           (void) strcpy (bp, file);
+           break;
+
+       case '~': 
+           if (cp = index (pp = file + 1, '/'))
+               *cp = NULL;
+
+           if (*pp == NULL)
+               pp = myhome;
+           else {
+               if ((pw = getpwnam (pp)) == NULL)
+                   return NULL;
+               else
+                   pp = pw -> pw_dir;
+           }
+
+           if (strlen (pp) + 1 + (cp ? strlen (cp) : 0) >= MAXPATHLEN)
+               goto trunc;
+
+           (void) sprintf (bp, "%s/%s", pp, cp ? cp + 1 : "");
+           if (cp)
+               *cp = '/';
+           break;
+
+       default: 
+           if (strlen (file) + myhomelen + 1 >= MAXPATHLEN)
+               goto trunc;
+
+           (void) sprintf (bp, "%s/%s", myhome, file);
+           break;
+    }
+
+    compath (bp);
+
+#ifndef        apollo          /* always return RELATIVE pathnames */
+    if (strncmp (bp, myhome, myhomelen - 1) == 0)
+       switch (bp[myhomelen - 1]) {
+           case NULL: 
+               (void) strcpy (bp, ".");
+               break;
+
+           case '/': 
+               bp += myhomelen;
+               break;
+
+           default: 
+               break;
+       }
+#endif
+
+    return bp;
+
+trunc: ;
+    errno = 0;
+    return NULLCP;
+#else
+       (void) strcpy (bp, file);
+       return bp;
+#endif
+}
+
+/* \f */
+
+#ifndef        BRIDGE
+/* originally used algorithms similar to those in /bin/ls; Don Preuss of
+   Apollo suggested these algorithms as they work better with distributed
+   /etc/passwd and /etc/group files */
+
+static char *getuser (uid)
+int    uid;
+{
+    static struct passwd *pw = NULL;
+
+    if (pw == NULL || pw -> pw_uid != uid)
+       pw = getpwuid (uid);
+    return (pw ? pw -> pw_name : NULL);
+}
+
+/* \f */
+
+static char *getgroup (gid)
+int    gid;
+{
+    register struct group *gr;
+    static int my_gid = -1;
+    static char my_name[NMAX + 1];
+
+    if (my_gid != gid) {
+       if ((gr = getgrgid (gid)) == NULL)
+           return NULL;
+
+       my_gid = gr -> gr_gid;
+       (void) strcpy (my_name, gr -> gr_name);
+    }
+
+    return my_name;
+}
+
+/* \f */
+
+int    findgid (group)
+char   *group;
+{
+    int            i;
+#ifdef BSD42
+    int            gidset[NGROUPS];
+#endif
+    register struct group *gr;
+    static int my_gid = -1;
+    static char my_name[NMAX + 1] = "";
+
+    if (*group == NULL)
+       return NOTOK;
+
+    if (strcmp (my_name, group) != 0) {
+       if ((gr = getgrnam (group)) == NULL)
+           return NOTOK;
+
+#ifdef BSD42
+       for (i = getgroups (NGROUPS, gidset) - 1; i >= 0; i--)
+           if (gr -> gr_gid == gidset[i])
+               break;
+       if (i < 0)
+           return NOTOK;
+#endif
+
+       (void) strcpy (my_name, gr -> gr_name);
+       my_gid = gr -> gr_gid;
+    }
+
+    return my_gid;
+}
+#endif
+
+/* \f */
+
+#ifndef        SYS5
+#ifndef        BRIDGE
+static int  EACCESS (file, mode)
+char   *file;
+int    mode;
+{
+    int            result;
+
+    (void) seteuid (0);
+    (void) setruid (myuid);
+
+    result = access (file, mode);
+
+    (void) setruid (0);
+    (void) seteuid (myuid);
+
+    return result;
+}
+#endif
+#else
+
+/* \f */
+
+static int  chgrp (file, gid)
+char   *file;
+int    gid;
+{
+    int     i,
+           pid,
+           status;
+    char    group[10];
+    struct stat st;
+
+    (void) sprintf (group, "%d", gid);
+
+    switch (pid = fork ()) {
+       case NOTOK: 
+           return NOTOK;
+
+       case OK: 
+           execl ("/bin/chgrp", "chgrp", group, file, NULLCP);
+           execl ("/usr/bin/chgrp", "chgrp", group, file, NULLCP);
+           execl ("/etc/chgrp", "chgrp", group, file, NULLCP);
+           _exit (NOTOK);
+
+       default: 
+           while ((i = wait (&status)) != NOTOK && pid != i)
+               continue;
+           if (i != NOTOK && status) {
+               if (stat (file, &st) == NOTOK || st.st_gid != gid) {
+                   i = NOTOK;
+                   errno = EACCES;
+               }
+               else
+                   status = OK;
+           }
+           return (i == NOTOK ? NOTOK : status);
+    }
+}
+
+/* \f */
+
+static int  mkdir (dir, mode)
+char   *dir;
+int    mode;
+{
+    int     i,
+           pid,
+           status;
+    struct stat st;
+
+    switch (pid = fork ()) {
+       case NOTOK: 
+           return NOTOK;
+
+       case OK: 
+           (void) umask (~mode);
+           execl ("/bin/mkdir", "mkdir", dir, NULLCP);
+           execl ("/usr/bin/mkdir", "mkdir", dir, NULLCP);
+           execl ("/etc/mkdir", "mkdir", dir, NULLCP);
+           _exit (NOTOK);
+
+       default: 
+           while ((i = wait (&status)) != NOTOK && pid != i)
+               continue;
+           if (i != NOTOK && status) {
+               if (stat (dir, &st) == NOTOK
+                       || (st.st_mode & S_IFMT) != S_IFDIR) {
+                   i = NOTOK;
+                   errno = EACCES;
+               }
+               else
+                   status = OK;
+           }
+           return (i == NOTOK ? NOTOK : status);
+    }
+}
+
+/* \f */
+
+static int  rmdir (dir)
+char   *dir;
+{
+    int     i,
+           pid,
+           status;
+
+    switch (pid = fork ()) {
+       case NOTOK: 
+           return NOTOK;
+
+       case OK: 
+           execl ("/bin/rmdir", "rmdir", dir, NULLCP);
+           execl ("/usr/bin/rmdir", "rmdir", dir, NULLCP);
+           execl ("/etc/rmdir", "rmdir", dir, NULLCP);
+           _exit (NOTOK);
+
+       default: 
+           while ((i = wait (&status)) != NOTOK && pid != i)
+               continue;
+           if (i != NOTOK && status) {
+               if (access (dir, 0x00) != NOTOK) {
+                   i = NOTOK;
+                   errno = EACCES;
+               }
+               else
+                   status = OK;
+           }
+           return (i == NOTOK ? NOTOK : status);
+    }
+}
+
+/* \f */
+
+static int  truncate (file, length)
+char   *file;
+int    length;
+{
+    int            fd;
+
+    if (length != 0) {         /* XXX: too much work to get right */
+       errno = EINVAL;
+       return NOTOK;
+    }
+
+    if ((fd = open (file, O_WRONLY | O_TRUNC)) == NOTOK)
+       return NOTOK;
+
+    (void) close (fd);
+    return OK;
+}
+
+
+/* ARGSUSED */
+
+int    ftruncate (fd, length)  /* works only 'cause we're lucky */
+int    fd,
+       length;
+{
+    return truncate (myfile, length);
+}
+#endif
+
+/* \f   DEBUG */
+
+#if    defined(FTAMDEBUG) && defined(BSD42)
+#include <syscall.h>
+
+
+static int  unlink (file)
+char   *file;
+{
+    if (debug) {
+       int     i,
+               b;
+
+again:         ;
+       fprintf (stderr, "unlink(\"%s\")? y, w, l: ", file);
+
+       i = b = getchar ();
+       while (b != '\n' && b != EOF)
+           b = getchar ();
+
+       switch (i) {
+           case 'y': 
+               break;
+
+           case 'w': 
+               return OK;
+
+           case 'l': 
+               return NOTOK;
+
+           default: 
+               goto again;
+       }
+    }
+
+    return syscall (SYS_unlink, file);
+}
+
+
+static int  rmdir (dir)
+char   *dir;
+{
+    if (debug) {
+       int     i,
+               b;
+
+again:         ;
+       fprintf (stderr, "rmdir(\"%s\")? y, w, l: ", dir);
+
+       i = b = getchar ();
+       while (b != '\n' && b != EOF)
+           b = getchar ();
+
+       switch (i) {
+           case 'y': 
+               break;
+
+           case 'w': 
+               return OK;
+
+           case 'l': 
+               return NOTOK;
+
+           default: 
+               goto again;
+       }
+    }
+
+    return syscall (SYS_rmdir, dir);
+}
+
+
+/* VARARGS2 */
+
+static int  open (file, flags, mode)
+char   *file;
+int     flags,
+        mode;
+{
+    if (debug) {
+       int     i,
+               b;
+
+again:         ;
+       fprintf (stderr, "open(\"%s\",0x%x,0%o)? y, l: ", file, flags,
+                       (flags & O_CREAT) ? mode : 0);
+
+       i = b = getchar ();
+       while (b != '\n' && b != EOF)
+           b = getchar ();
+
+       switch (i) {
+           case 'y': 
+               break;
+
+           case 'l': 
+               return NOTOK;
+
+           default: 
+               goto again;
+       }
+    }
+
+    return syscall (SYS_open, file, flags, mode);
+}
+
+
+static int  mkdir (dir, mode)
+char   *dir;
+int     mode;
+{
+    if (debug) {
+       int     i,
+               b;
+
+again:         ;
+       fprintf (stderr, "mkdir(\"%s\",0%o)? y, w, l: ", dir, mode);
+
+       i = b = getchar ();
+       while (b != '\n' && b != EOF)
+           b = getchar ();
+
+       switch (i) {
+           case 'y': 
+               break;
+
+           case 'w': 
+               return OK;
+
+           case 'l': 
+               return NOTOK;
+
+           default: 
+               goto again;
+       }
+    }
+
+    return syscall (SYS_mkdir, dir, mode);
+}
+
+
+static int  chown (file, uid, gid)
+char   *file;
+int     uid,
+        gid;
+{
+    if (debug) {
+       int     i,
+               b;
+
+again:         ;
+       fprintf (stderr, "chown(\"%s\",%d,%d)? y, w, l: ", file, uid, gid);
+
+       i = b = getchar ();
+       while (b != '\n' && b != EOF)
+           b = getchar ();
+
+       switch (i) {
+           case 'y': 
+               break;
+
+           case 'w': 
+               return OK;
+
+           case 'l': 
+               return NOTOK;
+
+           default: 
+               goto again;
+       }
+    }
+
+    return syscall (SYS_chown, file, uid, gid);
+}
+
+
+static int  fchown (fd, uid, gid)
+int     fd;
+int     uid,
+        gid;
+{
+    if (debug) {
+       int     i,
+               b;
+
+again:         ;
+       fprintf (stderr, "fchown(%d,%d,%d)? y, w, l: ", fd, uid, gid);
+
+       i = b = getchar ();
+       while (b != '\n' && b != EOF)
+           b = getchar ();
+
+       switch (i) {
+           case 'y': 
+               break;
+
+           case 'w': 
+               return OK;
+
+           case 'l': 
+               return NOTOK;
+
+           default: 
+               goto again;
+       }
+    }
+
+    return syscall (SYS_fchown, fd, uid, gid);
+}
+
+
+static int  truncate (file, length)
+char   *file;
+int     length;
+{
+    if (debug) {
+       int     i,
+               b;
+
+again:         ;
+       fprintf (stderr, "truncate(\"%s\",%d)? y, w, l: ", file, length);
+
+       i = b = getchar ();
+       while (b != '\n' && b != EOF)
+           b = getchar ();
+
+       switch (i) {
+           case 'y': 
+               break;
+
+           case 'w': 
+               return OK;
+
+           case 'l': 
+               return NOTOK;
+
+           default: 
+               goto again;
+       }
+    }
+
+    return syscall (SYS_truncate, file, length);
+}
+
+
+static int  rename (old, new)
+char   *old;
+char   *new;
+{
+    if (debug) {
+       int     i,
+               b;
+
+again:         ;
+       fprintf (stderr, "rename(\"%s\",\"%s\")? y, w, l: ", old, new);
+
+       i = b = getchar ();
+       while (b != '\n' && b != EOF)
+           b = getchar ();
+
+       switch (i) {
+           case 'y': 
+               break;
+
+           case 'w': 
+               return OK;
+
+           case 'l': 
+               return NOTOK;
+
+           default: 
+               goto again;
+       }
+    }
+
+    return syscall (SYS_rename, old, new);
+}
+
+
+static int  flock (fd, operation)
+int    fd,
+       operation;
+{
+    if (debug) {
+       int     i,
+               b;
+
+again:         ;
+       fprintf (stderr, "flock(%d,0x%x)? y, w, l: ", fd, operation);
+
+       i = b = getchar ();
+       while (b != '\n' && b != EOF)
+           b = getchar ();
+
+       switch (i) {
+           case 'y': 
+               break;
+
+           case 'w': 
+               return OK;
+
+           case 'l': 
+               return NOTOK;
+
+           default: 
+               goto again;
+       }
+    }
+
+    return syscall (SYS_flock, fd, operation);
+}
+#endif
diff --git a/usr/src/contrib/isode/ftam2/ftamd-trans.c b/usr/src/contrib/isode/ftam2/ftamd-trans.c
new file mode 100644 (file)
index 0000000..c57822a
--- /dev/null
@@ -0,0 +1,1195 @@
+/* ftamd-trans.c - FTAM responder -- transfer */
+
+#ifndef        lint
+static char *rcsid = "$Header: /f/osi/ftam2/RCS/ftamd-trans.c,v 7.8 91/02/22 09:23:58 mrose Interim $";
+#endif
+
+/* 
+ * $Header: /f/osi/ftam2/RCS/ftamd-trans.c,v 7.8 91/02/22 09:23:58 mrose Interim $
+ *
+ *
+ * $Log:       ftamd-trans.c,v $
+ * Revision 7.8  91/02/22  09:23:58  mrose
+ * Interim 6.8
+ * 
+ * Revision 7.7  91/01/13  12:26:59  mrose
+ * NBS
+ * 
+ * Revision 7.6  90/11/21  11:30:46  mrose
+ * sun
+ * 
+ * Revision 7.5  90/11/11  10:01:15  mrose
+ * touch-up
+ * 
+ * Revision 7.4  90/11/05  13:29:50  mrose
+ * nist
+ * 
+ * Revision 7.3  90/08/14  14:28:28  mrose
+ * T1
+ * 
+ * Revision 7.2  90/07/01  21:03:28  mrose
+ * pepsy
+ * 
+ * Revision 7.1  90/01/16  20:43:01  mrose
+ * last check-out
+ * 
+ * Revision 7.0  89/11/23  21:54:33  mrose
+ * Release 6.0
+ * 
+ */
+
+/*
+ *                               NOTICE
+ *
+ *    Acquisition, use, and distribution of this module and related
+ *    materials are subject to the restrictions of a license agreement.
+ *    Consult the Preface in the User's Manual for the full terms of
+ *    this agreement.
+ *
+ */
+
+#include <stdio.h>
+#include "FTAM-types.h"
+#include "ftamsystem.h"
+#if    defined(SYS5) && !defined(HPUX)
+#include <sys/times.h>
+#define        TMS
+#endif
+
+/* \f   DATA */
+
+static int  nbytes;
+
+long   lseek ();
+
+
+/* \f   TRANSFER */
+
+int    ftam_bulkbeginindication (ftg)
+struct FTAMgroup *ftg;
+{
+    int            state;
+    struct FTAMgroup    ftms;
+    struct FTAMgroup   *ftm = &ftms;
+    struct FTAMindication   ftis;
+    register struct FTAMindication *fti = &ftis;
+
+    ftam_selection (ftg, ftm);
+
+    if (ftm -> ftg_flags & FTG_SELECT)
+       state = ftm -> ftg_select.ftse_state;
+    else
+       state = ftm -> ftg_create.ftce_state;
+    if ((state != FSTATE_SUCCESS
+               || ((ftm -> ftg_flags & FTG_OPEN)
+                       && ftm -> ftg_open.ftop_state != FSTATE_SUCCESS))
+           && myfd != NOTOK) {
+#ifndef        BRIDGE
+       unlock ();
+#endif
+       (void) close (myfd);
+       myfd = NOTOK;
+    }
+
+    if (FBulkBeginResponse (ftamfd, ftm, fti) == NOTOK)
+       ftam_adios (&fti -> fti_abort, "F-BULK-BEGIN.RESPONSE");
+
+    FTGFREE (ftg);
+}
+
+/* \f */
+
+/* we really pay the price here for not keeping more constraint set
+   information in the vfs structure...
+
+   regular files have the unstructured constraint set
+       access context US
+
+   directory files have the sequential flat constraint set
+       access context UA (is forced)
+
+   Hence, when FADUs are transmitted, only data elements of type
+
+       File-Contents-Data-Element
+
+   are sent.
+*/
+
+
+int    ftam_readwriteindication (ftrw)
+struct FTAMreadwrite *ftrw;
+{
+    int            result;
+    register struct FADUidentity *fa = &ftrw -> ftrw_identity;
+    struct FTAMdiagnostic   diags[NFDIAG];
+    struct FTAMdiagnostic *dp = diags;
+    struct FTAMindication   ftis;
+    register struct FTAMindication *fti = &ftis;
+
+    mylocation = *fa;          /* struct copy */
+    mylevel = ftrw -> ftrw_level;
+    
+#ifdef BRIDGE
+    myoperation = ftrw -> ftrw_operation; 
+    if (ftp_type (myvf - vfs) == NOTOK
+           && myoperation == FA_OPS_READ
+           && (mycontext = ftrw -> ftrw_context) != myvf -> vf_context) {
+#else
+    if ((myoperation = ftrw -> ftrw_operation) == FA_OPS_READ
+           && (mycontext = ftrw -> ftrw_context) != myvf -> vf_context) {
+#endif
+       dp -> ftd_type = DIAG_PERM;
+       dp -> ftd_identifier = FS_ACC_CTXSUPRT;
+       dp -> ftd_observer = dp -> ftd_source = EREF_RFSU;
+       dp -> ftd_delay = DIAG_NODELAY;
+       dp -> ftd_cc = 0;
+       dp++;
+
+       goto do_cancel;
+    }
+
+    switch (myvf - vfs) {
+       case VFS_UBF: 
+       case VFS_UTF: 
+       default: 
+           if (fa -> fa_type != FA_FIRSTLAST
+                   || fa -> fa_firstlast != FA_FIRST) {
+               dp -> ftd_type = DIAG_PERM;
+               dp -> ftd_identifier = FS_ACC_FADULOC;
+               dp -> ftd_observer = EREF_RFSU, dp -> ftd_source = EREF_IFSU;
+               dp -> ftd_delay = DIAG_NODELAY;
+               dp -> ftd_cc = 0;
+               dp++;
+
+               goto do_cancel;
+           }
+           break;
+    }
+
+    switch (myoperation) {
+       case FA_OPS_READ:
+       default:
+           advise (LLOG_NOTICE, NULLCP, "read %s", myfile);
+           break;
+
+       case FA_OPS_INSERT:     /* not valid on an FDF */
+           dp -> ftd_type = DIAG_PERM;
+           dp -> ftd_identifier = FS_ACC_INSERT;
+           dp -> ftd_observer = dp -> ftd_source = EREF_RFSU;
+           dp -> ftd_delay = DIAG_NODELAY;
+           dp -> ftd_cc = 0;
+           dp++;
+           goto do_cancel;
+
+       case FA_OPS_REPLACE:
+#ifdef BRIDGE
+           if ((myfd = ftp_write (myfile)) == NOTOK) {
+#else
+           if (statok && myst.st_size == 0)
+               goto replace;
+#ifdef SUNOS4
+           if (ftruncate (myfd, (off_t) 0) == NOTOK) {
+#else
+           if (ftruncate (myfd, 0) == NOTOK) {
+#endif
+#endif
+bad_operation: ;
+               dp -> ftd_type = DIAG_PERM;
+               dp -> ftd_identifier = myoperation == FA_OPS_REPLACE
+                                           ? FS_ACC_REPLACE : FS_ACC_INSERT;
+               dp -> ftd_observer = dp -> ftd_source = EREF_RFSU;
+               dp -> ftd_delay = DIAG_NODELAY;
+#ifdef BRIDGE
+               (void) strcpy (dp -> ftd_data, ftp_error);
+#else
+               (void) strcpy (dp -> ftd_data, sys_errname (errno));
+#endif
+               dp -> ftd_cc = strlen (dp -> ftd_data);
+               dp++;
+               goto do_cancel;
+           }
+#ifndef        BRIDGE
+replace: ;
+#endif
+           advise (LLOG_NOTICE, NULLCP, "replace %s", myfile);
+           break;
+
+       case FA_OPS_EXTEND:
+#ifdef BRIDGE
+           if ((myfd = ftp_append (myfile)) == NOTOK)
+#else
+           if (lseek (myfd, 0L, L_XTND) == (long) NOTOK)
+#endif
+               goto bad_operation;
+           advise (LLOG_NOTICE, NULLCP, "extend %s", myfile);
+           break;
+    }
+
+    FTRWFREE (ftrw);
+
+    timer (nbytes = 0, NULLCP);
+    if (myoperation != FA_OPS_READ)
+       return;
+
+    switch (myvf - vfs) {
+       case VFS_UTF:
+       case VFS_UBF:
+       default:
+           result = uxfget (&dp);
+           break;
+
+       case VFS_FDF:
+           result = fdfget (&dp);
+           break;
+    }
+
+    if (result != NOTOK)
+       return;
+
+do_cancel: ;
+    FTRWFREE (ftrw);
+
+    if (FCancelRequest (ftamfd, FACTION_PERM, NULLPE, diags, dp - diags, fti)
+           == NOTOK)
+       ftam_adios (&fti -> fti_abort, "F-CANCEL-REQUEST");
+
+    if (fti -> fti_type == FTI_CANCEL) {
+       register struct FTAMcancel *ftcn = &fti -> fti_cancel;
+
+       advise (LLOG_NOTICE, NULLCP, "F-CANCEL.RESPONSE: %d",
+                   ftcn -> ftcn_action);
+       ftam_diag (ftcn -> ftcn_diags, ftcn -> ftcn_ndiag);
+       FTCNFREE (ftcn);
+    }
+}
+
+/* \f */
+
+static uxfget (diags)
+register struct FTAMdiagnostic **diags;
+{
+    register int    n;
+    int            bsize,
+           effector,
+           gd,
+           magic,
+           nc,
+           size,
+           cancelled = OK;
+    PE     pe,
+           de;
+    register struct FTAMdiagnostic *dp = *diags;
+    struct FTAMindication   ftis;
+    register struct FTAMindication *fti = &ftis;
+    register struct FTAMabort *fta = &fti -> fti_abort;
+    register struct type_DOCS_FTAM__1__Parameters *p1;
+    register struct type_DOCS_FTAM__3__Parameters *p3;
+    FILE   *fp;
+#ifdef BRIDGE
+    char line[BUFSIZ];
+#endif
+
+#ifdef BRIDGE
+    /* try opening file for ftp read */
+    if ((myfd = ftp_read (myfile)) == NOTOK){
+       dp -> ftd_type = DIAG_PERM;
+       dp -> ftd_identifier = FS_ACC_LCL;
+       dp -> ftd_observer = dp -> ftd_source = EREF_RFSU;
+       dp -> ftd_delay = DIAG_NODELAY;
+       (void) strcpy (dp -> ftd_data, "failed file access on remote host");
+       dp -> ftd_cc = strlen (dp -> ftd_data);
+       dp++;
+
+       *diags = dp;
+       return NOTOK;
+    }
+#endif
+
+    effector = 1;
+    switch (myvf - vfs) {
+       case VFS_UTF: 
+           p1 = (struct type_DOCS_FTAM__1__Parameters *) myparam;
+           if ((gd = dup (myfd)) == NOTOK
+                   || (fp = fdopen (gd, "r")) == NULL) {
+               if (gd != NOTOK)
+                   (void) close (gd);
+               if (myfd != NOTOK){
+#ifdef BRIDGE
+                       (void) close (myfd);
+                       myfd = NOTOK;
+                       (void) ftp_reply ();
+#endif
+               }
+               goto no_mem;
+           }
+
+           {
+               PElementID    id;
+
+               if (p1
+                       && (p1 -> optionals
+                               & opt_DOCS_FTAM__1__Parameters_universal__class__number))
+                   id = (PElementID) p1 -> universal__class__number;
+               else
+                   id = PE_DEFN_GFXS;
+
+               pe = pe_alloc (PE_CLASS_UNIV, PE_FORM_PRIM, id);
+
+               switch (pe -> pe_id) {
+                   case PE_DEFN_GFXS:
+                       if (getenv ("HP-FTAM")) {
+                           effector = 1;
+                           break;
+                       }       /* else fall... */
+                   case PE_DEFN_PRTS:
+                   case PE_DEFN_VISS:
+                       effector = 0;
+                       break;
+
+                   case PE_DEFN_T61S:
+                   case PE_DEFN_VTXS:
+                   case PE_DEFN_IA5S:
+                   case PE_DEFN_GENS:
+                       effector = 1;
+                       break;
+
+                   default:
+                       break;
+               }
+           }
+           if ((magic = fadusize - MAGIC_OCTET1) < 0)
+               magic = 0;
+           break;
+
+       case VFS_UBF:
+           p3 = (struct type_DOCS_FTAM__3__Parameters *) myparam;
+           /* and fall */
+       default:
+           fp = NULL;
+
+           pe = pe_alloc (PE_CLASS_UNIV, PE_FORM_PRIM, PE_PRIM_OCTS);
+           if ((magic = fadusize - MAGIC_SINGLE) < 0)
+               magic = 0;
+           break;
+    }
+    if (pe == NULLPE)
+       goto no_mem;
+    pe -> pe_context = myvf -> vf_id;
+
+    if (magic > 6 * 1024)      /* FTAM profile T1 or A/111 limits  to 7K */
+       magic = 6 * 1024;
+#ifdef BRIDGE
+    bsize = BUFSIZ << 2;
+    size = magic >= bsize ? magic : bsize;
+    if (size > bsize)
+       size -= size % bsize;
+#else
+#ifndef        MAXBSIZE
+    bsize = BUFSIZ;
+#else
+    bsize = myst.st_blksize > 0 ? myst.st_blksize : BUFSIZ;
+#endif
+    size = (1024 <= magic && magic < bsize) ? magic : bsize;
+#endif
+    switch (myvf - vfs) {
+       case VFS_UTF:
+           if (p1
+                   && (p1 -> optionals
+                           & opt_DOCS_FTAM__1__Parameters_maximum__string__length)
+                   && p1 -> maximum__string__length > 0)                   
+               size = p1 -> maximum__string__length;
+           break;
+
+       case VFS_UBF:
+           if (p3
+                   && (p3 -> optionals
+                           & opt_DOCS_FTAM__3__Parameters_maximum__string__length)
+                   && p3 -> maximum__string__length > 0)
+               size = p3 -> maximum__string__length;
+           /* and fall */
+       default:
+           break;
+    }
+
+    if (debug)
+       advise (LLOG_DEBUG, NULLCP, "effector=%d id=0x%x size=%d",
+               effector, pe -> pe_id, size);
+
+    if ((pe -> pe_prim = PEDalloc (pe -> pe_len = size)) == NULLPED) {
+no_mem: ;
+       dp -> ftd_type = DIAG_PERM;
+       dp -> ftd_identifier = FS_ACC_LCL;
+       dp -> ftd_observer = dp -> ftd_source = EREF_RFSU;
+       dp -> ftd_delay = DIAG_NODELAY;
+       (void) strcpy (dp -> ftd_data, "out of memory");
+       dp -> ftd_cc = strlen (dp -> ftd_data);
+       dp++;
+
+error_return: ;
+       (void) de2fadu (NULLPE, 0);
+       if (pe)
+           pe_free (pe);
+       if (fp)
+           (void) fclose (fp);
+       *diags = dp;
+       return NOTOK;
+    }
+
+    for (;;) {
+       register char  *bp,
+                      *ep;
+
+       for (ep = (bp = (char *) pe -> pe_prim) + size - (fp ? 2 : 0), nc = 0;
+               bp < ep; ) {
+           if (fp) {
+               register char *cp;
+
+#ifdef BRIDGE
+               if (strlen (line) || fgets (line, BUFSIZ, fp)) {
+                   if ((strlen (line) + 1) < (ep - bp + 1)) {
+                       (void) strcpy (bp, line);
+                       line[0] = NULL;
+                   }
+                   else
+                       break;
+               }
+               else {
+                   n = (ferror (fp) && !feof (fp)) ? NOTOK : OK;
+                   break;
+               }
+#else
+               if (fgets (bp, ep - bp + 1, fp) == NULL) {
+                   n = (ferror (fp) && !feof (fp)) ? NOTOK : OK;
+                   break;
+               }
+#endif
+               cp = bp + strlen (bp) - 1;
+               if (!effector) {
+                   if (*cp == '\n') {
+#ifndef        BRIDGE
+                       *cp = NULL;
+#else
+                       if (cp > bp) {
+                           if (*--cp == '\r')
+                               *cp = NULL;
+                           else
+                               *++cp = NULL;
+                       }
+                       else
+                           *cp = NULL;
+#endif
+                       n = cp - bp;
+                       bp = cp;
+                   }
+                   else {                      /* XXX: losing! */
+                       n = cp - bp + 1;
+                       bp = cp + 1;
+                   }
+               }
+               else {
+                   if (*cp == '\n') {
+#ifndef        BRIDGE
+                       *cp++ = '\r';
+#endif
+                       *cp++ = '\n';
+                       n = cp - bp;
+                       bp = cp;
+                       nc++;
+                       continue;
+                   }
+
+                   n = cp - bp + 1;
+                   bp = cp + 1;
+               }
+           }
+           else {
+               switch (n = read (myfd, bp, ep - bp)) {
+                   case NOTOK: 
+                   case OK: 
+                       break;
+
+                   default: 
+                       bp += n;
+                       continue;
+               }
+           }
+           break;
+       }
+       if (n == NOTOK || (n = bp - (char *) pe -> pe_prim) == 0)
+           break;
+       pe -> pe_len = n;
+
+       if (fp && !effector) {
+           if ((de = pe_cpy (pe)) == NULLPE)
+               goto no_mem;
+       }
+       else
+           de = pe;
+
+       if (debug)
+           if (fp) {
+               WATCHP (DOCS_FTAM__1__Datatype1, de, 0);
+           }
+           else
+               WATCHP (DOCS_FTAM__3__Datatype1, de, 0);
+
+
+       switch (cancelled = de2fadu (de, pe != de ? 1 : 0)) {
+           case NOTOK:
+               dp -> ftd_type = DIAG_PERM;
+               dp -> ftd_identifier = FS_ACC_LCL;
+               dp -> ftd_observer = dp -> ftd_source = EREF_RFSU;
+               dp -> ftd_delay = DIAG_NODELAY;
+               dp -> ftd_cc = 0;
+               dp++;
+               goto error_return;
+
+           case OK:
+           default:
+               nbytes += (n - nc), nc = 0;
+               continue;
+
+           case DONE:
+               break;
+       }
+       break;
+    }
+
+    pe_free (pe);
+
+    if (fp)
+       (void) fclose (fp);
+
+    if (n == DONE || cancelled == DONE)
+       return DONE;
+
+    if (n == NOTOK) {
+       dp -> ftd_type = DIAG_PERM;
+       dp -> ftd_identifier = FS_ACC_LCLDEV;
+       dp -> ftd_observer = dp -> ftd_source = EREF_RFSU;
+       dp -> ftd_delay = DIAG_NODELAY;
+       (void) strcpy (dp -> ftd_data, sys_errname (errno));
+       dp -> ftd_cc = strlen (dp -> ftd_data);
+       dp++;
+
+       *diags = dp;
+
+       (void) de2fadu (NULLPE, 0);
+       return NOTOK;
+    }
+
+    n = de2fadu (NULLPE, 1);
+
+    if (n != DONE) {
+       timer (nbytes, "sent");
+
+       if (FDataEndRequest (ftamfd, FACTION_SUCCESS,
+                            (struct FTAMdiagnostic *) 0, 0, fti) == NOTOK)
+           ftam_adios (fta, "F-DATA-END.REQUEST");
+    }
+
+    return n;
+}
+
+/* \f */
+
+static fdfget (diags)
+register struct FTAMdiagnostic **diags;
+{
+    int            names,
+           len,
+           n;
+    char   *pp,
+           path[MAXPATHLEN];
+    PE     pe;
+#ifdef BRIDGE
+    int            dd;
+    FILE   *df;
+    char   *ptr,
+           line[BUFSIZ];
+#else
+    register struct dirent *d;
+    register DIR *dd;
+#endif
+    struct stat st;
+    register struct FTAMdiagnostic *dp = *diags;
+    struct FTAMindication   ftis;
+    register struct FTAMindication *fti = &ftis;
+    register struct FTAMabort *fta = &fti -> fti_abort;
+    register struct type_DOCS_NBS__9__Parameters *p9;
+    struct type_DOCS_NBS__9__Datatype1 *d9;
+
+    if (strcmp (myfile, ".") == 0) {
+       pp = path;
+       *pp = NULL;
+       len = 0;
+    }
+    else 
+#ifdef apollo
+        if (strcmp (myfile, "/") == 0 || strcmp (myfile, "//") == 0) {
+            (void) sprintf (pp = path, "%s", myfile);
+            pp += (len = strlen (pp));
+        }
+        else
+#endif                
+    {
+       (void) sprintf (pp = path, "%s/", myfile);
+       pp += (len = strlen (pp));
+    }
+
+    pe = NULLPE;
+
+#ifdef BRIDGE
+    if ((dd = ftp_ls (myfile)) == NOTOK || (df = fdopen (dd,"r")) == NULL) {
+#else
+    if ((dd = opendir (myfile)) == NULL) {
+#endif
+no_mem: ;
+       dp -> ftd_type = DIAG_PERM;
+       dp -> ftd_identifier = FS_ACC_LCL;
+       dp -> ftd_observer = dp -> ftd_source = EREF_RFSU;
+       dp -> ftd_delay = DIAG_NODELAY;
+       (void) strcpy (dp -> ftd_data, "out of memory");
+       dp -> ftd_cc = strlen (dp -> ftd_data);
+       dp++;
+
+error_return: ;
+       (void) de2fadu (NULLPE, 0);
+       if (pe)
+           pe_free (pe);
+#ifdef BRIDGE
+       if (dd) {
+           (void) close (dd);
+           (void) ftp_reply ();
+        }
+#else
+       if (dd)
+           (void) closedir (dd);
+#endif
+       *diags = dp;
+       return NOTOK;
+    }
+
+
+    p9 = (struct type_DOCS_NBS__9__Parameters *) myparam;
+    if (fdf_p2names (ftamfd, p9, &names, fti) == NOTOK) {
+       register struct FTAMdiagnostic *d2 = fti -> fti_abort.fta_diags;
+
+       dp = d2;        /* struct copy */
+       dp++;
+       goto error_return;
+    }
+
+    n = OK;
+#ifdef BRIDGE
+    while (fgets(line, BUFSIZ, df)) {
+#else
+    for (errno = 0; d = readdir (dd); errno = 0) {
+#endif
+       struct FTAMattributes fas;
+       register struct FTAMattributes *fa = &fas;
+#ifndef        BRIDGE
+       register struct vfsmap *vf;
+#endif
+
+#ifdef BRIDGE
+       if (ptr = rindex(line,'\r'))
+           *ptr = '\0';
+#endif
+
+       if (debug)
+#ifdef BRIDGE
+           advise (LLOG_DEBUG, NULLCP, "len=%d name=\"%s\"",
+                       strlen(line), line);
+#else
+           advise (LLOG_DEBUG, NULLCP, "ino=%ld len=%d name=\"%s\"",
+                   d -> d_ino, strlen (d -> d_name), d -> d_name);
+#endif
+
+#ifndef        BRIDGE
+       if (!d -> d_ino)
+           continue;
+#endif
+
+#ifdef BRIDGE
+       if (len + strlen (line) >= MAXPATHLEN)
+#else
+       if (len + strlen (d -> d_name) >= MAXPATHLEN)
+#endif
+           continue;
+
+#ifdef BRIDGE
+       (void) strcpy (pp, line);
+#else
+       (void) strcpy (pp, d -> d_name);
+#endif
+
+#ifndef        BRIDGE
+       if (stat (path, &st) == NOTOK
+               || (vf = st2vfs (NOTOK, path, &st, NULLOID, ftamfd)) == NULL)
+           continue;
+#endif
+
+       bzero ((char *) fa, sizeof *fa);
+       *diags = dp;
+#ifdef BRIDGE
+       (void) readattrs (names, fa, vfs[VFS_UTF].vf_oid, NULLPE, path, &st,
+                         diags);
+#else
+       (void) readattrs (names, fa, vf -> vf_oid, NULLPE, path, &st, diags);
+#endif
+       dp = *diags;
+
+       if (fdf_attrs2d (ftamfd, fa, &d9, fti) == NOTOK) {
+           register struct FTAMdiagnostic *d2 = fti -> fti_abort.fta_diags;
+
+           dp = d2;    /* struct copy */
+           dp++;
+           goto error_return;
+       }
+
+       if (encode_DOCS_NBS__9__Datatype1 (&pe, 1, 0, NULLCP, d9) == NOTOK) {
+           dp -> ftd_type = DIAG_PERM;
+           dp -> ftd_identifier = FS_ACC_LCL;
+           dp -> ftd_observer = dp -> ftd_source = EREF_RFSU;
+           dp -> ftd_delay = DIAG_NODELAY;
+           (void) sprintf (dp -> ftd_data, "error encoding Datatype1: %s",
+                           PY_pepy);
+           dp -> ftd_cc = strlen (dp -> ftd_data);
+           dp++;
+
+           free_DOCS_NBS__9__Datatype1 (d9);
+           goto error_return;
+       }
+       pe -> pe_context = myvf -> vf_id;
+
+       if (debug)
+           WATCHP (DOCS_NBS__9__Datatype1, pe, 0);
+
+       n = de2fadu (pe, 1), pe = NULLPE;
+       switch (n) {
+           case NOTOK:
+               goto no_mem;
+
+           case OK:
+           default:
+               continue;
+
+           case DONE:
+               break;
+       }
+       break;
+    }
+
+#ifdef BRIDGE
+    (void) fclose (df);
+    (void) close (dd);
+    (void) ftp_reply ();
+#else
+    if (errno != 0) {
+       dp -> ftd_type = DIAG_PERM;
+       dp -> ftd_identifier = FS_ACC_LCL;
+       dp -> ftd_observer = dp -> ftd_source = EREF_RFSU;
+       dp -> ftd_delay = DIAG_NODELAY;
+       (void) sprintf (dp -> ftd_data, "%s: %s", myfile, sys_errname (errno));
+       dp -> ftd_cc = strlen (dp -> ftd_data);
+       dp++;
+
+       goto error_return;
+       
+    }
+    (void) closedir (dd);
+#endif
+
+    if (n == OK)
+       n = de2fadu (NULLPE, 1);
+
+    switch (n) {
+       case DONE:
+           return DONE;
+
+       case OK:
+       default:
+           if (FDataEndRequest (ftamfd, FACTION_SUCCESS,
+                       (struct FTAMdiagnostic *) 0, 0, fti) == NOTOK)
+               ftam_adios (fta, "F-DATA-END.REQUEST");
+           return OK;
+    }
+}
+
+/* \f */
+
+static int  de2fadu (pe, concat)
+PE     pe;
+int    concat;
+{
+    struct FTAMindication   ftis;
+    register struct FTAMindication *fti = &ftis;
+    register struct FTAMabort  *fta = &fti -> fti_abort;
+    static int ninfo = 0;
+    static int size = 0;
+    static PE info[NPDATA];
+
+    if (pe == NULLPE) {
+       if (concat
+               && ninfo > 0
+               && FDataRequest (ftamfd, info, ninfo, fti) == NOTOK)
+           ftam_adios (fta, "F-DATA.REQUEST");
+
+       while (ninfo > 0)
+           pe_free (info[--ninfo]);
+       size = 0;
+
+       return OK;
+    }
+
+    if (concat) {
+       int     flush,
+               n;
+
+       if (size + (n = ps_get_abs (pe) + MAGIC_OCTET2) >= fadusize
+               && ninfo > 0) {
+           if (debug)
+               advise (LLOG_DEBUG, NULLCP,
+                       "de2fadu flushing on %d FADUs, estimated size %d/%d",
+                       ninfo, size, fadusize);
+
+           (void) de2fadu (NULLPE, 1);
+           flush = 1;
+       }
+       else
+           flush = 0;
+       
+       info[ninfo++] = pe;
+       size += n;
+
+       if (ninfo < NPDATA && size < fadusize) {
+           if (!flush)
+               return OK;
+       }
+       else {
+           if (FDataRequest (ftamfd, info, ninfo, fti) == NOTOK)
+               ftam_adios (fta, "F-DATA.REQUEST");
+
+           while (ninfo > 0)
+               pe_free (info[--ninfo]);
+           size = 0;
+       }
+    }
+    else
+       if (FDataRequest (ftamfd, &pe, 1, fti) == NOTOK)
+           ftam_adios (fta, "F-DATA.REQUEST");
+
+    if (FWaitRequest (ftamfd, OK, fti) == NOTOK) {
+       if (fta -> fta_peer
+               || fta -> fta_action != FACTION_TRANS
+               || fta -> fta_ndiag < 1
+               || fta -> fta_diags[0].ftd_type != DIAG_TRANS
+               || fta -> fta_diags[0].ftd_identifier != FS_PRO_TIMEOUT)
+           ftam_adios (fta, "F-WAIT.REQUEST");
+
+       return OK;
+    }
+
+    if (fti -> fti_type == FTI_CANCEL) {
+       register struct FTAMcancel *ftcn = &fti -> fti_cancel;
+
+       advise (LLOG_NOTICE, NULLCP, "F-CANCEL.INDICATION: %d",
+               ftcn -> ftcn_action);
+       ftam_diag (ftcn -> ftcn_diags, ftcn -> ftcn_ndiag);
+       FTCNFREE (ftcn);
+
+       if (FCancelResponse (ftamfd, FACTION_SUCCESS, NULLPE, 
+                   (struct FTAMdiagnostic *) 0, 0, fti) == NOTOK)
+           ftam_adios (fta, "F-CANCEL.RESPONSE");
+    }
+
+    return DONE;
+}
+
+/* \f */
+
+int    ftam_dataindication (px)
+register struct PSAPdata *px;
+{
+    register int    i;
+    int            effector,
+           n;
+    register PE     pe,
+                  *pep;
+    struct FTAMdiagnostic   diags[NFDIAG];
+    register struct FTAMdiagnostic *dp = diags;
+    struct FTAMindication   ftis;
+    register struct FTAMindication *fti = &ftis;
+
+    effector = 1;
+    switch (myvf - vfs) {
+       case VFS_UBF:
+       default:
+           break;
+
+       case VFS_UTF:
+           {
+               PElementID    id;
+               register struct type_DOCS_FTAM__1__Parameters *p1 =
+                           (struct type_DOCS_FTAM__1__Parameters *) myparam;
+
+               if (p1
+                       && (p1 -> optionals
+                               & opt_DOCS_FTAM__1__Parameters_universal__class__number))
+                   id = (PElementID) p1 -> universal__class__number;
+               else
+                   id = PE_DEFN_GFXS;
+               switch (id) {
+                   case PE_DEFN_GFXS:
+                       if (getenv ("HP-FTAM")) {
+                           effector = 1;
+                           break;
+                       }       /* else fall... */
+                   case PE_DEFN_PRTS:
+                   case PE_DEFN_VISS:
+                       effector = 0;
+                       break;
+
+                   case PE_DEFN_T61S:
+                   case PE_DEFN_VTXS:
+                   case PE_DEFN_IA5S:
+                   case PE_DEFN_GENS:
+                       effector = 1;
+                       break;
+
+                   default:
+                       break;
+               }
+           }
+           break;
+    }
+
+    for (pep = px -> px_info, i = px -> px_ninfo - 1; i >= 0; pep++, i--) {
+       if ((pe = *pep) == NULLPE)
+           continue;
+
+       switch (myvf - vfs) {
+           case VFS_UBF:
+           default:
+               if (debug)
+                   WATCHP (DOCS_FTAM__3__Datatype1, pe, 1);
+               n = de2fd (myfd, pe, 0, 0);
+               break;
+
+           case VFS_UTF:
+               if (debug)
+                   WATCHP (DOCS_FTAM__1__Datatype1, pe, 1);
+               n = de2fd (myfd, pe, 1, effector);
+               break;
+       }
+
+       if (n != NOTOK) {
+           nbytes += n;
+           continue;
+       }
+
+       dp -> ftd_type = DIAG_PERM;
+       switch (errno) {
+           case ENOSPC: 
+               dp -> ftd_identifier = FS_ACC_LCLSPACE;
+               dp -> ftd_cc = 0;
+               break;
+
+           case EIO: 
+           case ENXIO: 
+               dp -> ftd_identifier = FS_ACC_LCLDEV;
+               dp -> ftd_cc = 0;
+               break;
+
+           default: 
+               dp -> ftd_identifier = FS_ACC_WRITE;
+               (void) strcpy (dp -> ftd_data, sys_errname (errno));
+               dp -> ftd_cc = strlen (dp -> ftd_data);
+               break;
+       }
+       dp -> ftd_observer = dp -> ftd_source = EREF_RFSU;
+       dp -> ftd_delay = DIAG_NODELAY;
+       dp++;
+
+       if (FCancelRequest (ftamfd, FACTION_PERM, NULLPE, diags, dp - diags,
+                           fti) == NOTOK)
+           ftam_adios (&fti -> fti_abort, "F-CANCEL-REQUEST");
+
+       if (fti -> fti_type == FTI_CANCEL) {
+           register struct FTAMcancel *ftcn = &fti -> fti_cancel;
+
+           advise (LLOG_NOTICE, NULLCP, "F-CANCEL.RESPONSE: %d",
+                   ftcn -> ftcn_action);
+           ftam_diag (ftcn -> ftcn_diags, ftcn -> ftcn_ndiag);
+           FTCNFREE (ftcn);
+       }
+       break;
+    }
+
+    PXFREE (px);
+}
+
+/* \f */
+
+/* ARGSUSED */
+
+int    ftam_dataendindication (ftda)
+struct FTAMdataend *ftda;
+{
+    timer (nbytes, "received");
+
+#ifndef        SYS5
+    if (ftda -> ftda_action == FACTION_SUCCESS)
+       (void) fsync (myfd);
+#endif
+}
+
+/* \f */
+
+int    ftam_cancelindication (ftcn)
+register struct FTAMcancel *ftcn;
+{
+    struct FTAMindication   ftis;
+    register struct FTAMindication *fti = &ftis;
+
+    advise (LLOG_NOTICE, NULLCP, "F-CANCEL.INDICATION: %d",
+           ftcn -> ftcn_action);
+    ftam_diag (ftcn -> ftcn_diags, ftcn -> ftcn_ndiag);
+    FTCNFREE (ftcn);
+
+    if (FCancelResponse (ftamfd, FACTION_SUCCESS, NULLPE,
+               (struct FTAMdiagnostic *) 0, 0, fti) == NOTOK)
+       ftam_adios (&fti -> fti_abort, "F-CANCEL.RESPONSE");
+}
+
+/* \f */
+
+/* ARGSUSED */
+
+int    ftam_transendindication (ftre)
+struct FTAMtransend *ftre;
+{
+    struct FTAMindication   ftis;
+    register struct FTAMindication *fti = &ftis;
+
+    if (FTransEndResponse (ftamfd, FACTION_SUCCESS, NULLPE, 
+               (struct FTAMdiagnostic *) 0, 0, fti) == NOTOK)
+       ftam_adios (&fti -> fti_abort, "F-TRANSFER-END.RESPONSE");
+}
+
+/* \f */
+
+int    ftam_bulkendindication (ftg)
+struct FTAMgroup *ftg;
+{
+    struct FTAMgroup    ftms;
+    struct FTAMgroup   *ftm = &ftms;
+    struct FTAMindication   ftis;
+    register struct FTAMindication *fti = &ftis;
+
+    ftam_selection (ftg, ftm);
+
+    if (myfd != NOTOK) {
+#ifdef BRIDGE
+       (void) close (myfd);
+       (void) ftp_reply ();
+#else
+       unlock ();
+       (void) close (myfd);
+#endif
+       myfd = NOTOK;
+    }
+
+    if (FBulkEndResponse (ftamfd, ftm, fti) == NOTOK)
+       ftam_adios (&fti -> fti_abort, "F-BULK-END.RESPONSE");
+
+    FTGFREE (ftg);
+}
+
+/* \f */
+
+#ifndef        NBBY
+#define        NBBY    8
+#endif
+
+
+#ifndef        TMS
+timer (cc, action)
+int     cc;
+char   *action;
+{
+    long    ms;
+    float   bs;
+    struct timeval  stop,
+                    td;
+    static struct timeval   start;
+
+    if (cc == 0) {
+       (void) gettimeofday (&start, (struct timezone *) 0);
+       return;
+    }
+    else
+       (void) gettimeofday (&stop, (struct timezone  *) 0);
+
+    tvsub (&td, &stop, &start);
+    ms = (td.tv_sec * 1000) + (td.tv_usec / 1000);
+    bs = (((float) cc * NBBY * 1000) / (float) (ms ? ms : 1)) / NBBY;
+
+    advise (LLOG_NOTICE, NULLCP,
+           "%d bytes %s in %d.%02d seconds (%.2f Kbytes/s)",
+           cc, action, td.tv_sec, td.tv_usec / 10000, bs / 1024);
+}
+
+
+static  tvsub (tdiff, t1, t0)
+register struct timeval *tdiff,
+                       *t1,
+                       *t0;
+{
+
+    tdiff -> tv_sec = t1 -> tv_sec - t0 -> tv_sec;
+    tdiff -> tv_usec = t1 -> tv_usec - t0 -> tv_usec;
+    if (tdiff -> tv_usec < 0)
+       tdiff -> tv_sec--, tdiff -> tv_usec += 1000000;
+}
+
+#else
+#ifndef        HZ
+#define        HZ      60
+#endif
+
+
+long   times ();
+
+
+static timer (cc, action)
+int    cc;
+char   *action;
+{
+    long    ms;
+    float   bs;
+    long    stop,
+           td,
+           secs,
+           msecs;
+    struct tms tm;
+    static long start;
+
+    if (cc == 0) {
+       start = times (&tm);
+       return;
+    }
+    else
+       stop = times (&tm);
+
+    td = stop - start;
+    secs = td / HZ, msecs = (td % HZ) * 1000 / HZ;
+    ms = (secs * 1000) +  msecs;
+    bs = (((float) cc * NBBY * 1000) / (float) (ms ? ms : 1)) / NBBY;
+    
+    advise (LLOG_NOTICE, NULLCP,
+           "%d bytes %s in %d.%02d seconds (%.2f Kbytes/s)",
+           cc, action, secs, msecs / 10, bs / 1024);
+}
+#endif
diff --git a/usr/src/contrib/isode/ftam2/ftamd.8c b/usr/src/contrib/isode/ftam2/ftamd.8c
new file mode 100644 (file)
index 0000000..c10cf9b
--- /dev/null
@@ -0,0 +1,233 @@
+.TH FTAMD 8C "01 Mar 1987"
+.\" $Header: /f/osi/ftam2/RCS/ftamd.8c,v 7.3 91/02/22 09:24:03 mrose Interim $
+.\"
+.\"
+.\" $Log:      ftamd.8c,v $
+.\" Revision 7.3  91/02/22  09:24:03  mrose
+.\" Interim 6.8
+.\" 
+.\" Revision 7.2  90/11/04  19:15:20  mrose
+.\" update
+.\" 
+.\" Revision 7.1  90/02/20  17:12:11  mrose
+.\" update
+.\" 
+.\" Revision 7.0  89/11/23  21:54:35  mrose
+.\" Release 6.0
+.\" 
+.SH NAME
+ftamd \- FTAM responder
+.SH SYNOPSIS
+.in +.5i
+.ti -.5i
+.B \*(SDiso.ftam
+\%[\-c]
+\%[\-d]
+\fImagic\0arguments\fR
+.in -.5i
+(under \fI\*(SDtsapd\fR\0)
+.SH DESCRIPTION
+The \fIftamd\fR server implements the responder side of 
+the File Transfer, Access, and Management (FTAM) service.
+.PP
+Currently, implementations for Berkeley and AT&T UNIX exist.
+Supported are:
+the no-recovery FTAM-QoS;
+any of
+the transfer, management, and transfer and management service classes;
+the kernel, read, write, limited file management, enhanced file management, and
+grouping functional units;
+and, the kernel and storage attribute groups.
+Only three document types are supported as of this writing:
+unstructured text files (FTAM\-1),
+unstructured binary files (FTAM\-3),
+and filedirectory files (NIST\-9).
+.SH "DEBUG OPERATION"
+If \fIiso.ftamd\fR is started interactively,
+or if the `\-d' switch is given,
+then debug mode is entered.
+In this case,
+all logging activity is displayed on the user's terminal.
+In addition,
+the logging information is more verbose.
+.SH AUTHENTICATION
+An FTAM initiator must be listed in the \fIpasswd\fR file and have a
+non\-empty password.
+Further, as with the \fIftpd\fR daemon,
+the username must not appear in the \fI\*(EDftamusers\fR file
+or the \fI/etc/ftpusers\fR file.
+.PP
+If the username \*(lqANON\*(rq or \*(lqftp\*(rq is given,
+then \fIftamd\fR treats this as a guest access,
+similar to the \*(lqanonymous\*(rq facility supported by the \fIftpd\fR daemon.
+An entry in the \fIpasswd\fR file for user \*(lqftp\*(rq must be present with
+a non\-zero UID.
+For guest access,
+a \fIchroot\fR to the guest home directory
+is executed to restrict access to the system.
+The guest home directory should be structured thusly:
+.PP
+Note that the `\-c' flag (given in the \fIisoservices\fR\0(5) file)
+forces a \fIchroot\fR to the initiator's home directory.
+This is used to restrict network access.
+.TP
+.B ~ftp/
+Owned by \*(lqftp\*(rq with mode 555.
+.TP
+.B ~ftp/etc/
+Owned by the super\-user with mode 555.
+The \fIpasswd\fR and \fIgroup\fR files should be present,
+each with mode 444.
+.TP
+.B ~ftp/pub/
+Owned by \*(lqftp\*(rq with mode 777.
+This is the directory where guests can place files from remote systems.
+.TP
+.B ~ftp/portal/
+Owned by the super\-user with mode 555.
+The super\-user can put world\-readable files here
+(with mode 444) without fear of these files being removed or altered by
+guests.
+.PP
+Note that since \fIftamd\fR doesn't use \fIls\fR in order to produce
+directory listings,
+the directory \fIbin/\fR under the guest home directory need not be present,
+as it must be to support the anonymous guest with \fIftpd\fR.
+.SH "VIRTUAL FILESTORE"
+Here are the file attribute mappings:
+.TP
+.B filename
+A single component, relative to the user's $HOME.
+Changing this attribute is equivalent to a \fIrename\fR.
+.TP
+.B contents\-type
+Based on st_mode:
+\fBNIST\-9\fR for directories,
+\fBFTAM\-1\fR for regular files appearing to be textual,
+\fBFTAM\-3\fR for all other regular files.
+Files that are neither regular nor directories are inaccessible via this
+implementation of the VFS (i.e., special files).
+.TP
+.B account
+The st_gid according to /etc/group.
+Changing this attribute is equivalent to a \fIchgrp\fR.
+.TP
+.B date\-and\-time\-of\-creation
+The st_mtime.
+.TP
+.B date\-and\-time\-of\-last\-modification
+The st_mtime.
+.TP
+.B date\-and\-time\-of\-last\-read\-access
+The st_atime.
+.TP
+.B date\-and\-time\-of\-last\-attribute\-modification
+The st_ctime.
+.TP
+.B identity\-of\-creator
+The st_uid according to /etc/passwd.
+.TP
+.B identity\-of\-last\-modifier
+The st_uid according to /etc/passwd
+(if the value of the st_mode field guarantees uniqueness).
+.TP
+.B identity\-of\-last\-reader
+The st_uid according to /etc/passwd
+(if the value of the st_mode field guarantees uniqueness).
+.TP
+.B identity\-of\-last\-attribute\-modifier
+The st_uid according to /etc/passwd
+(if the value of the st_mode field guarantees uniqueness).
+.TP
+.B file\-availability
+Immediate.
+.TP
+.B permitted\-actions
+Depends on st_mode as interpreted by \fIaccess\fR\0(2):
+R_OK for permission to read;
+W_OK for permission to write;
+permission is always granted to read attributes;
+permission is granted to change attributes if the initiator has uid equal to
+st_uid;
+permission to delete is based on writability of parent directory.
+.TP
+.B filesize
+The st_size.
+.TP
+.B future\-filesize
+Not available.
+.TP
+.B access\-control
+Not available.
+.TP
+.B encryption\-name
+Not available.
+.TP
+.B legal\-qualifications
+Not available.
+.TP
+.B private\-use
+Not available.
+.PP
+The activity attribute mappings are straight\-forward.
+The read action corresponds to reading UNIX files.
+The insert, replace, extend, and erase actions correspond to writing
+UNIX files.
+Concurrency control is supported for reading and writing,
+but not for reading or changing attributes, or for deleting files.
+.SH FILES
+.nf
+.ta \w'\*(EDisodocuments    'u
+\*(EDisodocuments      ISODE FTAM document types database
+\*(EDisoentities       ISODE entities database
+\*(EDftamusers list of users prohibited by ftam
+\*(LDftam.log  logfile
+/usr/adm/wtmp  login records
+.re
+.fi
+.SH "SEE ALSO"
+ftam(1c), libftam(3n), isodocuments(5)
+.br
+\fIThe ISO Development Environment: User's Manual\fR,
+.br
+ISO 8571:
+\fIInformation Processing Systems \-\-
+File Transfer, Access, and Management\fR
+.SH DIAGNOSTICS
+All obvious.
+.SH AUTHOR
+Marshall T. Rose
+.PP
+This program is based somewhat on the \fIftpd\fR(8c) program supplied with
+Berkeley UNIX.
+.SH BUGS
+The anonymous account is inherently dangerous and should be avoided when
+possible.
+It is also inherently useful.
+.PP
+The Berkeley UNIX version of this program runs with the effective UID of the
+FTAM initiator,
+but also with the real UID of the super\-user.
+This is necessary to change the account attribute on files
+(using \fIchown\fR\0).
+The possible security holes have been extensively considered,
+but may be incomplete.
+.PP
+The AT&T UNIX version, which lacks kernel support for this technique, acts
+differently.
+Immediately upon association establishment,
+it changes both the real and effective UID to that of the FTAM initiator.
+To change the account attribute on files,
+it invokes the \fIchgrp\fR program.
+Similarly, to create or delete directories,
+it invokes either the \fImkdir\fR program or the \fIrmdir\fR program.
+.PP
+The AT&T UNIX version of this program has been tested both under
+the System V Compatibility Package in SUN UNIX release 3.2
+and a true SVR3 implementation.
+However,
+the \fIfcntl\fR syscall,
+which is used to implement concurrency control,
+currently seems to be a no\-op.
+The Berkeley UNIX version of this program uses \fIflock\fR,
+which seems to work just fine.
diff --git a/usr/src/contrib/isode/ftam2/ftamd.c b/usr/src/contrib/isode/ftam2/ftamd.c
new file mode 100644 (file)
index 0000000..0390169
--- /dev/null
@@ -0,0 +1,344 @@
+/* ftamd.c - FTAM -- responder */
+
+#ifndef        lint
+static char *rcsid = "$Header: /f/osi/ftam2/RCS/ftamd.c,v 7.1 91/02/22 09:24:04 mrose Interim $";
+#endif
+
+/* 
+ * $Header: /f/osi/ftam2/RCS/ftamd.c,v 7.1 91/02/22 09:24:04 mrose Interim $
+ *
+ *
+ * $Log:       ftamd.c,v $
+ * Revision 7.1  91/02/22  09:24:04  mrose
+ * Interim 6.8
+ * 
+ * Revision 7.0  89/11/23  21:54:36  mrose
+ * Release 6.0
+ * 
+ */
+
+/*
+ *                               NOTICE
+ *
+ *    Acquisition, use, and distribution of this module and related
+ *    materials are subject to the restrictions of a license agreement.
+ *    Consult the Preface in the User's Manual for the full terms of
+ *    this agreement.
+ *
+ */
+
+
+#include <stdio.h>
+#include <varargs.h>
+#include "ftamsystem.h"
+
+/* \f   DATA */
+
+int    ftamfd = NOTOK;
+
+int    cflag = 0;
+int    debug = 0;
+char   *myname = "ftamd";
+
+/* \f   MAIN */
+
+#define        SMASK   "\020\01UNCONS\02MANAGE\03TRANSFER\04TM\05ACCESS"
+
+#define        UMASK   "\020\01READ\02WRITE\03ACCESS\04LIMITED\05ENHANCED\06GROUPING\
+\07FADULOCK\08RECOVERY\00RESTART"
+
+#define        AMASK   "\020\01STORAGE\02SECURITY\03PRIVATE"
+
+/* ARGSUSED */
+
+main (argc, argv, envp)
+int    argc;
+char  **argv,
+      **envp;
+{
+    int     result;
+    char   *ap;
+    struct FTAMstart    ftss;
+    register struct FTAMstart  *fts = &ftss;
+    struct FTAMindication   ftis;
+    register struct FTAMindication *fti = &ftis;
+
+    if (myname = rindex (argv[0], '/'))
+       myname++;
+    if (myname == NULL || *myname == NULL)
+       myname = argv[0];
+
+    isodetailor (myname, 0);
+    if (debug == 0 && !(debug = isatty (fileno (stderr)))) {
+       ftam_log -> ll_stat &= ~LLOGCLS;
+       ll_hdinit (ftam_log, myname);
+    }
+    else
+       ll_dbinit (ftam_log, myname);
+
+    advise (LLOG_NOTICE, NULLCP, "starting");
+
+    if (FInit (argc, argv, fts, debug ? FTraceHook : NULLIFP, fti) == NOTOK)
+       ftam_adios (&fti -> fti_abort, "initialization");
+    advise (LLOG_NOTICE, NULLCP,
+           "F-INITIALIZE.INDICATION: <%d, %s, %s, %s, %s>",
+           fts -> fts_sd, oid2ode (fts -> fts_context),
+           sprintb (fts -> fts_class, SMASK),
+           fts -> fts_initiator ? fts -> fts_initiator : "",
+           fts -> fts_account ? fts -> fts_account : "");
+#ifdef DEBUG
+    {
+       register int    i;
+       register struct FTAMcontent *fx;
+
+       advise (LLOG_DEBUG, NULLCP,
+               " called AE title: %s, called PSAP address: %s",
+               sprintaei (&fts -> fts_calledtitle),
+               paddr2str (&fts -> fts_calledaddr, NULLNA));
+       advise (LLOG_DEBUG, NULLCP,
+               " calling AE title: %s, calling PSAP address: %s",
+               sprintaei (&fts -> fts_callingtitle),
+               paddr2str (&fts -> fts_callingaddr, NULLNA));
+
+       advise (LLOG_DEBUG, NULLCP, " manage: %d, ftam-QoS: %d",
+               fts -> fts_manage, fts -> fts_fqos);
+       advise (LLOG_DEBUG, NULLCP, " units: %s",
+               sprintb (fts -> fts_units, UMASK));
+       advise (LLOG_DEBUG, NULLCP, " attrs: %s",
+               sprintb (fts -> fts_attrs, AMASK));
+
+       for (fx = fts -> fts_contents.fc_contents, i = 0;
+               i < fts -> fts_contents.fc_ncontent;
+               fx++, i++)
+           advise (LLOG_DEBUG, NULLCP, " cnt %d: %s %d %d",
+               i, sprintoid (fx -> fc_dtn), fx -> fc_id, fx -> fc_result);
+    }
+#endif
+
+    for (argv++; ap = *argv; argv++)
+       if (*ap == '-')
+           while (*++ap)
+               switch (*ap) {
+                   case 'c':
+                       cflag++;
+                       break;
+
+                   case 'd':
+                       debug++;
+                       ll_dbinit (ftam_log, myname);
+                       (void) FHookRequest (fts -> fts_sd, FTraceHook, fti);
+                       break;
+
+                   default:
+                       adios (NULLCP, "unknown switch -%c", *ap);
+               }
+       else
+           advise (LLOG_NOTICE, NULLCP, "unknown argument \"%s\"", ap);    
+
+    ftam_start (fts);
+
+    FTSFREE (fts);
+
+    for (;;)
+       switch (result = FWaitRequest (ftamfd, NOTOK, fti)) {
+           case NOTOK: 
+           case OK: 
+           case DONE: 
+               ftam_indication (fti);
+               break;
+
+           default: 
+               adios (NULLCP, "unknown return from FWaitRequest=%d", result);
+       }
+}
+
+/* \f */
+
+void   ftam_adios (fta, event)
+struct FTAMabort *fta;
+char   *event;
+{
+    struct FTAMindication   ftis;
+
+    ftam_advise (fta, event);
+
+    if (fta -> fta_action != FACTION_PERM && ftamfd != NOTOK)
+       (void) FUAbortRequest (ftamfd, FACTION_PERM,
+               (struct FTAMdiagnostic *) 0, 0, &ftis);
+
+    closewtmp ();
+
+    _exit (1);
+}
+
+
+void   ftam_advise (fta, event)
+register struct FTAMabort *fta;
+char   *event;
+{
+    advise (LLOG_NOTICE, NULLCP, "%s: failed", event);
+    ftam_diag (fta -> fta_diags, fta -> fta_ndiag);
+
+    if (fta -> fta_action == FACTION_PERM) {
+       closewtmp ();
+
+       _exit (1);
+    }
+}
+
+/* \f */
+
+static char *entity[] = {
+    "UNK", "IFSU", "IFPM", "VFS", "RFPM", "RFSU"
+};
+
+
+void   ftam_diag (diag, ndiag)
+struct FTAMdiagnostic diag[];
+int    ndiag;
+{
+    register int    i;
+    register char  *cp;
+    char    buffer[BUFSIZ];
+    register struct FTAMdiagnostic *dp;
+
+    for (dp = diag, i = ndiag - 1; i >= 0; dp++, i--) {
+       cp = buffer;
+       (void) sprintf (cp, "%s", FErrString (dp -> ftd_identifier));
+
+       if (dp -> ftd_cc > 0) {
+           cp += strlen (cp);
+           (void) sprintf (cp, ": %*.*s", dp -> ftd_cc, dp -> ftd_cc,
+                   dp -> ftd_data);
+       }
+
+       advise (LLOG_NOTICE, NULLCP, "%s", buffer);
+
+       cp = buffer;
+       (void) sprintf (cp, "    type ");
+       cp += strlen (cp);
+
+       switch (dp -> ftd_type) {
+           case DIAG_INFORM: 
+               (void) sprintf (cp, "informative");
+               break;
+
+           case DIAG_TRANS: 
+               (void) sprintf (cp, "transient");
+               break;
+
+           case DIAG_PERM: 
+               (void) sprintf (cp, "permanent");
+               break;
+
+           default: 
+               (void) sprintf (cp, "%d", dp -> ftd_type);
+               break;
+       }
+       cp += strlen (cp);
+
+       (void) sprintf (cp, ", observer ");
+       cp += strlen (cp);
+
+       switch (dp -> ftd_observer) {
+           case EREF_IFSU: 
+           case EREF_IFPM: 
+           case EREF_RFPM: 
+           case EREF_RFSU: 
+               (void) sprintf (cp, "%s", entity[dp -> ftd_observer]);
+               break;
+
+           default: 
+               (void) sprintf (cp, "%d", dp -> ftd_observer);
+               break;
+       }
+       cp += strlen (cp);
+
+       (void) sprintf (cp, ", source ");
+       cp += strlen (cp);
+
+       switch (dp -> ftd_source) {
+           case EREF_NONE: 
+           case EREF_IFSU: 
+           case EREF_IFPM: 
+           case EREF_SERV: 
+           case EREF_RFPM: 
+           case EREF_RFSU: 
+               (void) sprintf (cp, "%s", entity[dp -> ftd_source]);
+               break;
+
+           default: 
+               (void) sprintf (cp, "%d", dp -> ftd_source);
+               break;
+       }
+
+       if (dp -> ftd_delay != DIAG_NODELAY) {
+           cp += strlen (cp);
+           (void) sprintf (cp, ", suggested-delay %d", dp -> ftd_delay);
+       }
+
+       advise (LLOG_NOTICE, NULLCP, "%s", buffer);
+    }
+}
+
+/* \f */
+
+#ifndef        lint
+void   adios (va_alist)
+va_dcl
+{
+    struct FTAMindication   ftis;
+    va_list ap;
+
+    va_start (ap);
+
+    (void) _ll_log (ftam_log, LLOG_FATAL, ap);
+
+    va_end (ap);
+
+    if (ftamfd != NOTOK)
+       (void) FUAbortRequest (ftamfd, FACTION_PERM,
+               (struct FTAMdiagnostic *) 0, 0, &ftis);
+
+    closewtmp ();
+
+    _exit (1);
+}
+#else
+/* VARARGS */
+
+void   adios (what, fmt)
+char   *what,
+       *fmt;
+{
+    adios (what, fmt);
+}
+#endif
+
+
+#ifndef        lint
+void   advise (va_alist)
+va_dcl
+{
+    int            code;
+    va_list ap;
+
+    va_start (ap);
+
+    code = va_arg (ap, int);
+
+    (void) _ll_log (ftam_log, code, ap);
+
+    va_end (ap);
+}
+#else
+/* VARARGS */
+
+void   advise (code, what, fmt)
+char   *what,
+       *fmt;
+int    code;
+{
+    advise (code, what, fmt);
+}
+#endif
diff --git a/usr/src/contrib/isode/ftam2/ftamsbr.c b/usr/src/contrib/isode/ftam2/ftamsbr.c
new file mode 100644 (file)
index 0000000..29fd630
--- /dev/null
@@ -0,0 +1,591 @@
+/* ftamsbr.c - FTAM subroutines */
+
+#ifndef        lint
+static char *rcsid = "$Header: /f/osi/ftam2/RCS/ftamsbr.c,v 7.6 91/02/22 09:24:06 mrose Interim $";
+#endif
+
+/* 
+ * $Header: /f/osi/ftam2/RCS/ftamsbr.c,v 7.6 91/02/22 09:24:06 mrose Interim $
+ *
+ *
+ * $Log:       ftamsbr.c,v $
+ * Revision 7.6  91/02/22  09:24:06  mrose
+ * Interim 6.8
+ * 
+ * Revision 7.5  91/01/13  12:27:04  mrose
+ * NBS
+ * 
+ * Revision 7.4  90/12/23  18:40:16  mrose
+ * update
+ * 
+ * Revision 7.3  90/11/21  11:30:50  mrose
+ * sun
+ * 
+ * Revision 7.2  90/11/05  13:29:54  mrose
+ * nist
+ * 
+ * Revision 7.1  90/07/01  21:03:31  mrose
+ * pepsy
+ * 
+ * Revision 7.0  89/11/23  21:54:37  mrose
+ * Release 6.0
+ * 
+ */
+
+/*
+ *                               NOTICE
+ *
+ *    Acquisition, use, and distribution of this module and related
+ *    materials are subject to the restrictions of a license agreement.
+ *    Consult the Preface in the User's Manual for the full terms of
+ *    this agreement.
+ *
+ */
+
+
+#include <ctype.h>
+#include <stdio.h>
+#include "ftamsbr.h"
+
+#ifdef BRIDGE
+extern int vfs_fdf;
+#endif
+
+extern struct vfsmap vfs[];
+
+/* \f */
+
+#ifdef BRIDGE
+/* ARGSUSED */
+#endif
+
+struct vfsmap *st2vfs (fd, file, st, proposed, ftamfd)
+int    fd;
+char   *file;
+struct stat *st;
+OID    proposed;
+int    ftamfd;
+{
+#ifndef        BRIDGE
+    register int    fmt;
+    register struct vfsmap *lf;
+#endif
+    register struct vfsmap *vf;
+
+#ifndef        BRIDGE
+    fmt = st -> st_mode & S_IFMT;
+#else
+/* Return the suggested TYPE or Unstructured Text type for FTP bridge */
+/* if during ftp_exist got multiple listing, return directory type */
+    if (ftp_directory)
+       return &vfs[vfs_fdf];
+#endif
+
+    if (proposed) {
+       for (vf = vfs; vf -> vf_entry; vf++)
+           if (vf -> vf_oid && oid_cmp (vf -> vf_oid, proposed) == 0) {
+#ifdef BRIDGE
+               return vf;
+           }
+#else
+               if ((vf -> vf_flags & VF_OK) && vf -> vf_mode == fmt) {
+                   if (vf -> vf_peek
+                           && (*vf -> vf_peek) (vf, fd, file, st, ftamfd)
+                                       == NOTOK)
+                       break;
+
+                   return vf;
+               }
+
+               break;
+           }
+
+       if (!vf -> vf_entry)
+           return NULL;
+#endif
+    }
+#ifndef        BRIDGE
+    else {
+       for (lf = vfs; lf -> vf_entry; lf++)
+           continue;
+       lf--;
+
+       for (vf = lf; vf >= vfs; vf--)
+           if ((vf -> vf_flags & VF_OK) && vf -> vf_mode == fmt) {
+               if (vf -> vf_peek
+                       && (*vf -> vf_peek) (vf, fd, file, st, ftamfd) != DONE)
+                   continue;
+
+               return vf;
+           }
+
+       for (vf = lf; vf >= vfs; vf--)
+           if ((vf -> vf_flags & VF_OK)
+                   && vf -> vf_mode == fmt
+                   && vf -> vf_simplify != VFS_XXX)
+               break;
+       if (vf < vfs)
+           return NULL;
+    }
+
+/* let's hope there aren't any simplification loops! */
+
+    while (vf -> vf_simplify != VFS_XXX) {
+       vf = &vfs[vf -> vf_simplify];
+
+       if (vf -> vf_flags & VF_OK) {
+           if (vf -> vf_peek)
+               (void) (*vf -> vf_peek) (vf, fd, file, st, ftamfd);
+           return vf;
+       }
+    }
+
+    return NULL;
+#else
+    return &vfs[ftp_default];
+#endif
+}
+
+/* \f */
+
+int    binarycheck (param, data)
+caddr_t param;
+char   *data;
+{
+    register struct type_DOCS_FTAM__3__Parameters *p3 =
+                       (struct type_DOCS_FTAM__3__Parameters *) param;
+
+    if (p3 -> optionals
+             & opt_DOCS_FTAM__3__Parameters_maximum__string__length) {
+       if (getenv ("UNISYS-FTAM"))
+           p3 -> maximum__string__length = 0;
+       else
+           p3 -> optionals &=
+                       ~opt_DOCS_FTAM__3__Parameters_maximum__string__length;
+    }
+
+    if ((p3 -> optionals
+               & opt_DOCS_FTAM__3__Parameters_string__significanz)
+           && p3 -> string__significanz
+                   == int_DOCS_string__significanz_fixed) {
+       (void) strcpy (data,
+                      "filestore does not support fixed-length strings");
+       return NOTOK;
+    }
+    
+
+    return OK;
+}
+
+/* \f */
+
+int    textcheck (param, data)
+caddr_t param;
+char   *data;
+{
+    register struct type_DOCS_FTAM__1__Parameters *p1 =
+                       (struct type_DOCS_FTAM__1__Parameters *) param;
+
+    if (!(p1 -> optionals
+             & opt_DOCS_FTAM__1__Parameters_universal__class__number)) {
+       p1 -> optionals |= opt_DOCS_FTAM__1__Parameters_universal__class__number;
+       p1 -> universal__class__number = PE_DEFN_GENS;
+    }
+    switch (p1 -> universal__class__number) {
+       case PE_DEFN_GFXS:
+       case PE_DEFN_IA5S:
+       case PE_DEFN_GENS:
+           break;
+
+       default:
+           (void) sprintf (data,
+                           "filestore does not support strings of universal class number %d",
+                           p1 -> universal__class__number);
+           return NOTOK;
+    }
+
+    if (p1 -> optionals
+             & opt_DOCS_FTAM__1__Parameters_maximum__string__length) {
+       if (getenv ("UNISYS-FTAM")) {
+           p1 -> maximum__string__length = 0;
+       }
+       else
+           p1 -> optionals &=
+                       ~opt_DOCS_FTAM__1__Parameters_maximum__string__length;
+    }
+
+    if ((p1 -> optionals
+               & opt_DOCS_FTAM__1__Parameters_string__significance)
+           && p1 -> string__significance
+                   == int_DOCS_string__significance_fixed) {
+       (void) strcpy (data,
+                      "filestore does not support fixed-length strings");
+       return NOTOK;
+    }
+    
+
+    return OK;
+}
+
+/* \f */
+
+/* ARGSUSED */
+
+int    binarypeek (vf, fd, file, st, ftamfd)
+register struct vfsmap *vf;
+int    fd;
+char   *file;
+struct stat *st;
+int    ftamfd;
+{
+    static struct type_DOCS_FTAM__3__Parameters p3s;
+    register struct type_DOCS_FTAM__3__Parameters *p3 = &p3s;
+
+    if (vf -> vf_parameter && (vf -> vf_flags & VF_PARM))
+       (void) fre_obj (vf -> vf_parameter,
+                       _ZDOCS_mod.md_dtab[vf -> vf_number], &_ZDOCS_mod, 1);
+
+    vf -> vf_parameter = (caddr_t) p3, vf -> vf_flags &= ~VF_PARM;
+
+    p3 -> optionals = 0;
+
+    if (getenv ("UNISYS-FTAM")) {
+       p3 -> optionals |=opt_DOCS_FTAM__3__Parameters_maximum__string__length;
+       p3 -> maximum__string__length = 0;
+    }
+
+    p3 -> optionals |= opt_DOCS_FTAM__3__Parameters_string__significanz;
+    p3 -> string__significanz = int_DOCS_string__significanz_not__significant;
+
+    return DONE;
+}
+
+/* \f */
+
+/* Various textual repetories.  In addition to the prohibited characters, on
+   UNIX we disallow CRs.  This avoids funny CR-LF mappings. */
+
+/* Here's the assumptions we make for whether format-effectors are used:
+
+       PrintableString -       no
+       TeletexString   -       yes
+       VideotexString  -       yes (?)
+       IA5String       -       yes
+       GraphicString   -       no (?)
+       VisibleString   -       no (?)
+       GeneralString   -       yes (?)
+
+*/
+
+
+#define        isIA5(c) (isprint ((u_char) c) || (isspace ((u_char)c) && (c) != '\r'))
+
+
+/* ARGSUSED */
+
+int    textpeek (vf, fd, file, st, ftamfd)
+register struct vfsmap *vf;
+int    fd;
+char   *file;
+struct stat *st;
+int    ftamfd;
+{
+#ifndef        BRIDGE
+    int     gd,
+           n;
+    register char *cp;
+    char    buffer[BLKSIZE];
+    long    pos;
+#endif
+    static struct type_DOCS_FTAM__1__Parameters p1s;
+    register struct type_DOCS_FTAM__1__Parameters *p1 = &p1s;
+
+    if (vf -> vf_parameter && (vf -> vf_flags & VF_PARM))
+       (void) fre_obj (vf -> vf_parameter,
+                       _ZDOCS_mod.md_dtab[vf -> vf_number], &_ZDOCS_mod, 1);
+
+    vf -> vf_parameter = (caddr_t) p1, vf -> vf_flags &= ~VF_PARM;
+
+    p1 -> optionals = 0;
+
+    p1 -> optionals |= opt_DOCS_FTAM__1__Parameters_universal__class__number;
+    p1 -> universal__class__number = PE_DEFN_GENS;
+
+    if (getenv ("UNISYS-FTAM")) {
+       p1 -> optionals |=opt_DOCS_FTAM__1__Parameters_maximum__string__length;
+       p1 -> maximum__string__length = 0;
+    }
+
+    p1 -> optionals |= opt_DOCS_FTAM__1__Parameters_string__significance;
+    switch (p1 -> universal__class__number) {
+       case PE_DEFN_GFXS:
+           if (getenv ("HP-FTAM")) {
+               p1 -> string__significance =
+                               int_DOCS_string__significance_not__significant;
+               break;
+           }   /* else fall... */
+       case PE_DEFN_PRTS:
+       case PE_DEFN_VISS:
+           p1 -> string__significance =
+                               int_DOCS_string__significance_variable;
+           break;
+
+       case PE_DEFN_T61S:
+       case PE_DEFN_VTXS:
+       case PE_DEFN_IA5S:
+       case PE_DEFN_GENS:
+           p1 -> string__significance =
+                               int_DOCS_string__significance_not__significant;
+           break;
+    }
+
+#ifndef        BRIDGE
+    if ((gd = fd) == NOTOK
+           && (file == NULLCP || (gd = open (file, O_RDONLY)) == NOTOK))
+       return OK;
+
+    if (fd != NOTOK) {
+       pos = lseek (gd, 0L, L_INCR);
+       (void) lseek (gd, 0L, L_SET);
+    }
+#ifndef        MAXBSIZE
+    n = read (gd, buffer, sizeof buffer);
+#else
+    n = 0 < st -> st_blksize && st -> st_blksize <= sizeof buffer 
+               ? st -> st_blksize : sizeof buffer;
+    n = read (gd, buffer, n);
+#endif
+    if (fd != NOTOK && pos != -1L)
+       (void) lseek (gd, pos, L_SET);
+
+    if (fd == NOTOK)
+       (void) close (gd);
+
+    for (cp = buffer + n - 1; cp >= buffer; cp--)
+       if (!isIA5 (*cp))
+           return NOTOK;
+    return DONE;
+#else
+    return OK;
+#endif
+}
+
+/* \f */
+
+/* ARGSUSED */
+
+int    fdfpeek (vf, fd, file, st, ftamfd)
+register struct vfsmap *vf;
+int    fd;
+char   *file;
+struct stat *st;
+int    ftamfd;
+{
+    struct type_DOCS_NBS__9__Parameters *p9;
+    struct FTAMindication ftis;
+
+    if (vf -> vf_parameter && (vf -> vf_flags & VF_PARM))
+       (void) fre_obj (vf -> vf_parameter,
+                       _ZDOCS_mod.md_dtab[vf -> vf_number], &_ZDOCS_mod, 1);
+
+    vf -> vf_parameter = NULLCP, vf -> vf_flags &= ~VF_PARM;
+
+    if (fdf_names2p (ftamfd, FA_RDATTR, &p9, &ftis) == NOTOK)
+       return NOTOK;
+
+    vf -> vf_parameter = (caddr_t) p9;
+
+    return DONE;
+}
+
+/* \f */
+
+/* If text, then need to worry about ESCape sequences for the various
+   repetoires (thank you, Digital!)  For now, we'll recognize G0 and G1 from
+   the 8859-1 (latin) alphabet.  Note that when sending a file, we do not
+   generate escape sequences...
+ */
+
+
+int    de2fd (fd, pe, text, effector)
+int    fd;
+PE     pe;
+int    text,
+       effector;
+{
+    register int    i,
+                   n;
+               register char  *bp,
+                              *cp,
+                              *ep;
+    register PE            p;
+
+    if (pe -> pe_form == PE_FORM_CONS) {
+           for (p = pe -> pe_cons, n = 0; p; p = p -> pe_next, n += i)
+               if ((i = de2fd (fd, p, text, 1)) == NOTOK)
+                   return NOTOK;
+       goto outside;
+    }
+
+    if (!text) {
+       n = pe -> pe_len;
+       if (write (fd, (char *) pe -> pe_prim, n) != n)
+           return NOTOK;
+       goto outside;
+    }
+
+    n = 0;
+    cp = (char *) pe -> pe_prim;
+    for (ep = (bp = cp) + pe -> pe_len; bp < ep;)
+       switch (*bp) {
+#ifndef        BRIDGE
+            case '\r':
+               if (!effector) {
+                   bp++;
+                   break;
+               }
+               *bp++ = '\n';
+               i = bp - cp;
+               if (write (fd, cp, i) != i)
+                   return NOTOK;
+               cp = ++bp, n += i;
+               break;
+#endif
+
+           case 033:
+               switch (*++bp) {
+                   case 0x28:  /* G0: 02/08 04/02 */
+                       if (*++bp == 0x42) {
+                           register char *dp;
+
+write_it: ;
+                           dp = bp - 2;
+                           if ((i = (dp - cp)) > 0
+                                   && write (fd, cp, i) != i)
+                               return NOTOK;
+                           cp = ++bp, n += i;
+                       }
+                       else
+                           bp--;
+                       break;
+
+                   case 0x2d:  /* G1: 02/13 04/01 */
+                       if (*++bp == 0x41)
+                           goto write_it;
+                       else
+                           bp--;
+                       break;
+
+                   default:    /* unknown, pass it on... */
+                       break;
+               }
+               break;
+
+           default:
+               bp++;
+               break;
+       }
+
+    if (i = bp - cp) {
+       if (write (fd, cp, i) != i)
+           return NOTOK;
+
+       n += i;
+    }
+
+outside: ;
+    if (text && !effector) {
+#ifndef        BRIDGE
+       if (write (fd, "\n", 1) != 1)
+#else
+       if (write (fd, "\r\n", 2) != 2)
+#endif
+           return NOTOK;
+    }
+
+    return n;
+}
+
+/* \f */
+
+/* right from MH's sbr/path.c... */
+
+#define        CWD     "./"
+#define        NCWD    (sizeof CWD - 1)
+#define        DOT     "."
+#define        DOTDOT  ".."
+#define        PWD     "../"
+#define        NPWD    (sizeof PWD - 1)
+
+
+int    compath (f)
+register char  *f;
+{
+    register char  *cp,
+                   *dp;
+
+    if (*f != '/')
+       return;
+
+    for (cp = f; *cp;)
+       if (*cp == '/') {
+           switch (*++cp) {
+               case NULL: 
+                   if (--cp > f)
+                       *cp = NULL;
+                   break;
+
+               case '/': 
+#ifdef apollo
+                    if ((f+1) == cp) {
+                       cp++;
+                       continue;
+                    }
+#endif                    
+                   for (dp = cp; *dp == '/'; dp++)
+                       continue;
+                   (void) strcpy (cp--, dp);
+                   continue;
+
+               case '.': 
+                   if (strcmp (cp, DOT) == 0) {
+                       if (cp > f + 1)
+                           cp--;
+                       *cp = NULL;
+                       break;
+                   }
+                   if (strcmp (cp, DOTDOT) == 0) {
+                       for (cp -= 2; cp > f; cp--)
+                           if (*cp == '/')
+                               break;
+                       if (cp <= f)
+                           cp = f + 1;
+                       *cp = NULL;
+                       break;
+                   }
+                   if (strncmp (cp, PWD, NPWD) == 0) {
+                       for (dp = cp - 2; dp > f; dp--)
+                           if (*dp == '/')
+                               break;
+                       if (dp <= f)
+                           dp = f;
+                       (void) strcpy (dp, cp + NPWD - 1);
+                       cp = dp;
+                       continue;
+                   }
+                   if (strncmp (cp, CWD, NCWD) == 0) {
+                       (void) strcpy (cp - 1, cp + NCWD - 1);
+                       cp--;
+                       continue;
+                   }
+                   continue;
+
+               default: 
+                   cp++;
+                   continue;
+           }
+           break;
+       }
+       else
+           cp++;
+}
diff --git a/usr/src/contrib/isode/ftam2/ftamsbr.h b/usr/src/contrib/isode/ftam2/ftamsbr.h
new file mode 100644 (file)
index 0000000..37ee212
--- /dev/null
@@ -0,0 +1,230 @@
+/* ftamsbr.h - include file for FTAM initiator/responder subroutines */
+
+/* 
+ * $Header: /f/osi/ftam2/RCS/ftamsbr.h,v 7.2 91/02/22 09:24:07 mrose Interim $
+ *
+ *
+ * $Log:       ftamsbr.h,v $
+ * Revision 7.2  91/02/22  09:24:07  mrose
+ * Interim 6.8
+ * 
+ * Revision 7.1  90/07/01  21:03:34  mrose
+ * pepsy
+ * 
+ * Revision 7.0  89/11/23  21:54:39  mrose
+ * Release 6.0
+ * 
+ */
+
+/*
+ *                               NOTICE
+ *
+ *    Acquisition, use, and distribution of this module and related
+ *    materials are subject to the restrictions of a license agreement.
+ *    Consult the Preface in the User's Manual for the full terms of
+ *    this agreement.
+ *
+ */
+
+
+#include "ftam.h"              /* definitions for FS-USERs */
+#include "DOCS-types.h"
+#ifdef NULL
+#undef NULL
+#endif
+#include <sys/param.h>
+#ifndef        NULL
+#define        NULL    0
+#endif
+#ifndef        SYS5
+#include <sys/file.h>
+#else
+#define        L_SET           0       /* absolute offset */
+#define        L_INCR          1       /* relative to current offset */
+#define        L_XTND          2       /* relative to end of file */
+
+#define        F_OK            0       /* file exists */
+#define        X_OK            1       /* executable by caller */
+#define        W_OK            2       /* writable by caller */
+#define        R_OK            4       /* readable by caller */
+
+#if    !defined(AIX) && !defined(HPUX) && !defined(AUX)
+#include <sys/fcntl.h>
+#else
+#include <fcntl.h>
+#endif
+#endif
+#include <sys/stat.h>
+#include "usr.dirent.h"
+
+
+#ifndef        MAXPATHLEN
+#define        MAXPATHLEN      MAXNAMLEN
+#endif
+
+#ifdef MAXBSIZE
+#define        BLKSIZE MAXBSIZE
+#else
+#define        BLKSIZE BUFSIZ
+#endif
+
+/*
+   Used to calculate the estimated integral FADU size:
+
+
+   FTAM-3 transfers -
+
+       An FADU maps onto a single PSDU with the P-DATA service.  Because the
+       DCS is non-empty and the FADU is not in the default context, the
+       Fully-encoded-data encoding is used.  Further, since only one PSDU is
+       present, the single-ASN1-type option is used.  Hence, the outer ASN.1
+       wrapper consists of
+
+           [APPLICATION 1] IMPLICIT
+               SEQUENCE OF {   -- 4 octets for the outer structure
+                   SEQUENCE {  -- 4 octets for the one and only PDV-list
+
+                               -- 3 octets for the PCI
+                       presentation-context-identifier
+                           INTEGER,
+
+                       presentation-data-values {
+                               -- 4 octets for the single-ASN1-type wrapper
+                           single-ASN1-type[0]
+                               -- 4 octets for the id/length of the FADU
+                               -- n octets for the data in the FADU
+                               ANY
+                       }
+                   }
+               }
+
+     4 + 4 + 3 + 4 + 4 = 19
+
+     For each structure, 4 octets is used for non-data encodings
+               1 octet for the ID
+               1 octet for an indefinite form
+               2 octets for the EOC
+    If the data portion is smaller, then the definite form might be used which
+    requires 3 octets, not 4.
+
+
+   FTAM-1 transfers -
+
+       FADUs are batched to the P-DATA service.  This means that the
+       octet-aligned option is used.  Hence, the outer ASN.1 wrapper
+       consists of  
+
+           [APPLICATION 1] IMPLICIT
+               SEQUENCE OF {   -- 4 octets for the outer structure
+
+-- this sequence is repeated for each member of the batch
+
+                   SEQUENCE {  -- 4 octets for the one and only PDV-list
+
+                               -- 3 octets for the PCI
+                       presentation-context-identifier
+                           INTEGER,
+
+                       presentation-data-values {
+                               -- 4 octets for the octet-aligned wrapper
+                           octet-aligned[1]
+                               -- 4 octets for the id/length of the FADU
+                               -- n octets for the data in the FADU
+                               IMPLICIT OCTET STRING
+                       }
+                   }
+
+
+               }
+
+     4 + N*(4 + 3 + 4 + 4)
+ */
+#define        MAGIC_SINGLE    19
+#define        MAGIC_OCTET1    4
+#define        MAGIC_OCTET2    15
+
+/* \f */
+
+struct vfsmap {
+    char   *vf_entry;          /* document entry */
+    OID            vf_oid;             /* object identifier */
+    caddr_t vf_parameter;      /* parameter, filled-in by vf_peek */
+
+    int     vf_flags;          /* flags */
+#define        VF_NULL 0x00
+#define        VF_OK   0x01            /* negotiated */
+#define        VF_WARN 0x02            /* warn if loses */
+#define        VF_PARM 0x04            /* parameter dynamically allocated */
+
+    int            vf_id;              /* presentation context */
+
+    int            vf_mode;            /* st.st_mode & S_IFMT bits */
+    IFP            vf_peek;            /* sees if really this type of file */
+    char    vf_stat;           /* stat character for 'ls' */
+
+    int            vf_simplify;        /* the next document type to try */
+#define        VFS_XXX (-1)
+
+    int            vf_context;         /* access context */
+                               /* really should have entire constraint set */
+
+    int            vf_mandatory;       /* > 0 parameter required
+                                  < 0 parameter optional
+                                 == 0 parameter illegal */
+    IFP            vf_check;           /*   .. check */
+    int            vf_number;          /* encode/decode index */
+
+    char  *vf_text;            /* textual description */
+};
+
+struct vfsmap *st2vfs ();
+
+
+/* WATCHP is one pepsy people should use as the macro which is
+ * not expansion order dependant
+ */
+
+#ifndef DEBUG
+#define        WATCH(fnx, pe, rw)
+#define        WATCHP(args, pe, rw)
+#else
+#ifdef __STDC__
+#define        WATCHP(args, pe, rw) \
+    pvpdu (ftam_log, print_##args##_P, pe, \
+       rw ? "F-DATA.INDICATION" : "F-DATA.REQUEST", rw)
+#define        WATCH(fnx, pe, rw) \
+    pvpdu (ftam_log, fnx/**/_P, pe, \
+       rw ? "F-DATA.INDICATION" : "F-DATA.REQUEST", rw)
+#else
+#define        WATCHP(args, pe, rw) \
+    pvpdu (ftam_log, print_/**/args/**/_P, pe, \
+       rw ? "F-DATA.INDICATION" : "F-DATA.REQUEST", rw)
+#define        WATCH(fnx, pe, rw) \
+    pvpdu (ftam_log, fnx/**/_P, pe, \
+       rw ? "F-DATA.INDICATION" : "F-DATA.REQUEST", rw)
+#endif
+#endif
+
+
+int    binarypeek (), textpeek (), fdfpeek ();
+
+int    binarycheck (), textcheck ();
+
+/* \f */
+
+#define        FA_RDATTR \
+    (FA_FILENAME | FA_ACTIONS | FA_CONTENTS | FA_ACCOUNT | FA_DATE_CREATE \
+       | FA_DATE_MODIFY | FA_DATE_READ | FA_DATE_ATTR | FA_ID_CREATE \
+       | FA_ID_MODIFY | FA_ID_READ | FA_ID_ATTR | FA_AVAILABILITY \
+       | FA_FILESIZE)
+
+/* \f */
+
+#ifdef BRIDGE
+extern int  ftp_default;
+extern int  ftp_directory;
+#endif
+
+int    de2fd ();
+
+int    compath ();
diff --git a/usr/src/contrib/isode/ftam2/ftamsystem.c b/usr/src/contrib/isode/ftam2/ftamsystem.c
new file mode 100644 (file)
index 0000000..c290529
--- /dev/null
@@ -0,0 +1,624 @@
+/* ftamsystem.c - FTAM responder routines */
+
+#ifndef        lint
+static char *rcsid = "$Header: /f/osi/ftam2/RCS/ftamsystem.c,v 7.7 91/02/22 09:24:08 mrose Interim $";
+#endif
+
+/* 
+ * $Header: /f/osi/ftam2/RCS/ftamsystem.c,v 7.7 91/02/22 09:24:08 mrose Interim $
+ *
+ *
+ * $Log:       ftamsystem.c,v $
+ * Revision 7.7  91/02/22  09:24:08  mrose
+ * Interim 6.8
+ * 
+ * Revision 7.6  91/01/14  13:32:45  mrose
+ * kerberos
+ * 
+ * Revision 7.5  91/01/13  12:27:07  mrose
+ * NBS
+ * 
+ * Revision 7.4  90/11/21  11:30:52  mrose
+ * sun
+ * 
+ * Revision 7.3  90/11/05  13:29:57  mrose
+ * nist
+ * 
+ * Revision 7.2  90/07/01  21:03:35  mrose
+ * pepsy
+ * 
+ * Revision 7.1  90/01/16  22:37:20  mrose
+ * very last time
+ * 
+ * Revision 7.0  89/11/23  21:54:40  mrose
+ * Release 6.0
+ * 
+ */
+
+/*
+ *                               NOTICE
+ *
+ *    Acquisition, use, and distribution of this module and related
+ *    materials are subject to the restrictions of a license agreement.
+ *    Consult the Preface in the User's Manual for the full terms of
+ *    this agreement.
+ *
+ */
+
+
+#if    defined(DEBUG) && !defined(NULL_INITIATOR)
+#define        NULL_INITIATOR
+#endif
+
+#include <ctype.h>
+#include <stdio.h>
+#include <grp.h>
+#include <pwd.h>
+#include "ftamsystem.h"
+#ifdef NULL_INITIATOR
+#include "tailor.h"
+#else
+#include "logger.h"
+#endif
+#include <utmp.h>
+
+
+#ifdef SYS5
+struct group  *getgrnam ();
+struct passwd *getpwnam ();
+#endif
+
+#ifndef        ANON
+#define        ANON    "ftp"
+#endif
+
+/* \f   UNIX DATA */
+
+int   myuid;
+
+int   myhomelen;
+char  myhome[MAXPATHLEN];
+
+dev_t  null_dev;
+ino_t  null_ino;
+
+
+static int   wtmp = NOTOK;
+
+static long  clok;
+
+
+struct utmp  uts;
+
+
+long   lseek (), time ();
+
+/* \f   VFS DATA */
+
+struct vfsmap vfs[] = {
+/* VFS_UBF */
+    "FTAM-3", NULLOID, NULLCP, VF_WARN, 0, S_IFREG, binarypeek, 'b', VFS_XXX,
+       FA_ACC_UA,
+       -1, binarycheck,
+          _ZFTAM_3_ParametersDOCS,
+       "unstructured binary file",
+
+/* VFS_UTF */
+    "FTAM-1", NULLOID, NULLCP, VF_WARN, 0, S_IFREG, textpeek, 't', VFS_UBF,
+       FA_ACC_UA,
+       -1, textcheck,
+          _ZFTAM_1_ParametersDOCS,
+       "unstructured text file",
+
+/* VFS_FDF */
+    "NBS-9",  NULLOID, NULLCP, VF_NULL, 0, S_IFDIR, fdfpeek, 'd', VFS_XXX,
+       FA_ACC_UA,
+       1, NULLIFP,
+          _ZNBS_9_ParametersDOCS,
+       "file directory file",
+
+    NULL
+};
+#ifdef BRIDGE
+int    vfs_fdf = VFS_FDF;
+#endif
+
+/* \f   REGIME DATA */
+
+int     fqos;
+int     class;
+int     units = FUNIT_READ | FUNIT_WRITE | FUNIT_LIMITED | FUNIT_ENHANCED
+                       | FUNIT_GROUPING;
+int     attrs = FATTR_STORAGE;
+
+int     fadusize = 0;
+
+/* \f   ACTIVITY DATA */
+
+int     myfd = NOTOK;          /* handle to file */
+char   *myfile;
+struct stat myst;
+int     statok;
+
+struct vfsmap   *myvf;         /* active contents type */
+caddr_t myparam;               /*   .. */
+
+int  myaccess;                 /* current access request */
+
+char *initiator;               /* current initiator identity */
+#ifdef NULL_INITIATOR
+static int null_initiator = 0; /*   none given, do EurOSInet style */
+#endif
+
+struct FADUidentity  mylocation;/* current location */
+
+int  mymode;                   /* current processing mode */
+int  myoperation;              /*   .. */
+
+#ifdef notdef
+AEI    mycalling;              /* current calling AET */
+AEI    myresponding;           /* current responding AET */
+#endif
+
+char *account;                 /* current account */
+int  mygid;                    /* "inner" account */
+
+int  mylock;                   /* current concurrency control */
+struct FTAMconcurrency myconctl;/*   .. */
+
+int  mylockstyle;              /* current locking style */
+
+
+int  mycontext;                        /* current access context */
+int  mylevel;                  /*   .. */
+
+#ifdef BRIDGE
+static char *RemoteHost;
+static char *password;
+
+int    ftp_default = VFS_UBF;
+#endif
+
+/* \f   REGIME */
+
+#ifdef BRIDGE
+#define        seterr(id,ob,so,des) \
+{ \
+    dp -> ftd_identifier = (id); \
+    dp -> ftd_observer = (ob), dp -> ftd_source = (so); \
+    (void) strncpy (dp -> ftd_data, des, FTD_SIZE);\
+    dp -> ftd_cc = strlen(dp -> ftd_data);\
+    goto bad2; \
+}
+#else
+#define        seterr(id,ob,so,des) \
+{ \
+    dp -> ftd_identifier = (id); \
+    dp -> ftd_observer = (ob), dp -> ftd_source = (so); \
+    goto bad2; \
+}
+#endif
+
+
+int    ftam_start (fts)
+register struct FTAMstart *fts;
+{
+    register int    i;
+#ifndef        BRIDGE
+    int            guest;
+    struct passwd *pw;
+#endif
+    struct stat st;
+    register struct isodocument *id;
+    register struct vfsmap *vf;
+    register struct FTAMcontent *fx;
+    struct FTAMdiagnostic   diags[NFDIAG];
+    register struct FTAMdiagnostic *dp = diags;
+    struct FTAMindication   ftis;
+    struct FTAMindication *fti = &ftis;
+
+    (void) time (&clok);
+
+    if (stat ("/dev/null", &st) != NOTOK)
+       null_dev = st.st_dev, null_ino = st.st_ino;
+    else
+       null_dev = (dev_t) 0, null_ino = (ino_t) 0;
+
+    for (vf = vfs; vf -> vf_entry; vf++)
+       if (id = getisodocumentbyentry (vf -> vf_entry)) {
+           if ((vf -> vf_oid = oid_cpy (id -> id_type)) == NULLOID)
+               adios (NULLCP, "%s: out of memory", vf -> vf_entry);
+       }
+       else
+           if (vf -> vf_flags & VF_WARN)
+               advise (LLOG_NOTICE, NULLCP, "%s: unknown", vf -> vf_entry);
+
+    ftamfd = fts -> fts_sd;
+    if ((class = fts -> fts_class) & FCLASS_TM)
+       class = FCLASS_TM;
+    else
+       if (class & FCLASS_TRANSFER)
+           class = FCLASS_TRANSFER;
+       else
+           if (class & FCLASS_MANAGE)
+               class = FCLASS_MANAGE;
+           else
+               seterr (FS_ACS_CLASS, EREF_RFSU, EREF_IFSU, "");
+    units &= fts -> fts_units;
+    attrs &= fts -> fts_attrs;
+    if ((fqos = fts -> fts_fqos) != FQOS_NORECOVERY)
+       seterr (FS_ACS_ROLLBACK, EREF_RFPM, EREF_IFSU, "");
+    if ((fadusize = fts -> fts_ssdusize) < 0)
+       fadusize = 0;
+
+    for (fx = fts -> fts_contents.fc_contents,
+               i = fts -> fts_contents.fc_ncontent - 1;
+           i >= 0;
+           fx++, i--) {
+       if (fx -> fc_result != PC_ACCEPT)
+           continue;
+
+       for (vf = vfs; vf -> vf_entry; vf++)
+           if (vf -> vf_oid
+                   && oid_cmp (vf -> vf_oid, fx -> fc_dtn) == 0) {
+               vf -> vf_flags |= VF_OK;
+               vf -> vf_id = fx -> fc_id;
+               break;
+           }
+       if (!vf -> vf_entry) {
+           advise (LLOG_NOTICE, NULLCP, "%s: unknown document-type",
+                   oid2ode (fx -> fc_dtn));
+           fx -> fc_result = PC_REJECTED;
+       }
+    }
+
+    if ((initiator = fts -> fts_initiator) == NULL) {
+#ifdef NULL_INITIATOR
+       initiator = ANON;
+       null_initiator = 1;
+#else
+       seterr (FS_ACS_IDENTITY, EREF_RFSU, EREF_IFSU, "");
+#endif
+    }
+    fts -> fts_initiator = NULL;
+
+#ifdef BRIDGE
+/* scan initiator for remote host */
+    if ((RemoteHost = rindex(initiator, '@')) == NULL) {
+       advise (LLOG_EXCEPTIONS, NULLCP, "missing remote host name in \"%s\"",
+               initiator);
+       seterr (FS_ACS_IDENTITY, EREF_RFSU, EREF_IFSU,
+               "missing remote hostname");
+    }
+    *RemoteHost++ = '\0';
+    if (strcmp (initiator, "ANON") == 0 || strcmp (initiator, ANON) == 0) {
+       initiator = "ANONYMOUS"; /* FTP guest name */
+    }
+    password = (fts -> fts_password == NULL) ? "guest" : fts -> fts_password;
+    account = fts -> fts_account;
+    advise (LLOG_NOTICE, NULLCP,
+           "attemping connection with TCP host \"%s\" for user \"%s\"",
+           RemoteHost, initiator);
+    if (ftp_login(RemoteHost, initiator, password, account) == NOTOK)
+       seterr (FS_ACS_IDENTITY, EREF_RFSU, EREF_IFSU, ftp_error);
+    (void) strcpy (myhome, "");
+    myhomelen = strlen (myhome);
+#else
+    guest = 0;
+#ifdef NULL_INITIATOR
+    if (!baduser (NULLCP, initiator) && baduser ("ftamguests", initiator)) {
+       initiator = ANON;
+       null_initiator = 1;
+    }
+#endif
+    if (strcmp (initiator, "ANON") == 0 || strcmp (initiator, ANON) == 0) {
+       if ((pw = getpwnam (ANON)) && pw -> pw_uid == 0)
+           pw = NULL;
+       guest = 1;
+    }
+    else
+       pw = baduser ("ftamusers", initiator) ? NULL : getpwnam (initiator);
+    if (pw == NULL)
+       seterr (FS_ACS_USER, EREF_RFSU, EREF_IFSU, "");
+    if ((!guest && fts -> fts_password == NULL)
+           || *pw -> pw_passwd == NULL
+           || (!guest && !chkpassword (initiator, pw -> pw_passwd,
+                                       fts -> fts_password)))
+       seterr (FS_ACS_PASSWORD, EREF_RFSU, EREF_IFSU, "");
+
+#ifdef DEBUG
+    advise (LLOG_DEBUG, NULLCP,
+           "initiator=%s, account=%s", initiator, fts -> fts_account);
+#endif
+    if ((account = fts -> fts_account) && (strlen(fts -> fts_account) > 1)) {
+       register struct group *gr = getgrnam (account);
+       register char **gp;
+
+       if (gr == NULL) {
+bad_account: ;
+           seterr (FS_ACS_ACCT, EREF_RFPM, EREF_IFSU, "");
+       }
+       if (gr -> gr_gid != pw -> pw_gid) {
+           for (gp = gr -> gr_mem; *gp; gp++)
+               if (strcmp (*gp, initiator) == 0)
+                   break;
+           if (!*gp)
+               goto bad_account;
+       }
+
+       fts -> fts_account = NULL;
+    }
+
+    if (chdir (pw -> pw_dir) == NOTOK) {
+       dp -> ftd_type = DIAG_PERM;
+       dp -> ftd_identifier = FS_ACS_MGMT;
+       dp -> ftd_observer = EREF_RFPM, dp -> ftd_source = EREF_IFSU;
+       dp -> ftd_delay = DIAG_NODELAY;
+       (void) sprintf (dp -> ftd_data, "unable to change to %s: %s",
+               pw -> pw_dir, sys_errname (errno));
+       dp -> ftd_cc = strlen (dp -> ftd_data);
+       dp++;
+    }
+#endif
+
+    if ((wtmp = open ("/usr/adm/wtmp", O_WRONLY | O_APPEND)) != NOTOK) {
+       char    line[32];
+
+       (void) sprintf (line, "ftam%d", getpid ());
+       (void) SCPYN (uts.ut_line, line);
+#ifndef        BRIDGE
+       (void) SCPYN (uts.ut_name, pw -> pw_name);
+#else
+       (void) SCPYN (uts.ut_name, initiator);
+#endif
+#if    !defined(SYS5) && !defined(bsd43_ut_host)
+       (void) SCPYN (uts.ut_host,
+               na2str (fts -> fts_callingaddr.pa_addr.sa_addr.ta_addrs));
+#else
+       uts.ut_type = USER_PROCESS;
+#endif
+       uts.ut_time = clok;
+       (void) write (wtmp, (char *) &uts, sizeof uts);
+#if    defined(SYS5) || defined(bsd43_ut_host)
+       (void) close (wtmp);
+#endif
+    }
+
+#ifndef        BRIDGE
+    if (cflag || guest) {
+       (void) setisobject (1);         /* for PDU pretty-printing
+                                          AND for A-ASSOCIATE.RESPONSE!!! */
+       if (chroot (pw -> pw_dir) == NOTOK) {
+           if (!debug)
+               dp = diags;
+           dp -> ftd_type = DIAG_PERM;
+           if (debug) {
+               dp -> ftd_identifier = FS_ACS_MGMT;
+               dp -> ftd_observer = EREF_RFPM, dp -> ftd_source = EREF_IFSU;
+           }
+           else {
+               dp -> ftd_identifier = FS_ACS_USER;
+               dp -> ftd_observer = EREF_RFSU, dp -> ftd_source = EREF_IFSU;
+           }
+           dp -> ftd_delay = DIAG_NODELAY;
+           (void) sprintf (dp -> ftd_data, "unable to change root to %s: %s",
+                   pw -> pw_dir, sys_errname (errno));
+           dp -> ftd_cc = strlen (dp -> ftd_data);
+           if (debug)
+               dp++;
+           else
+               goto bad1;
+       }
+#ifdef NULL_INITIATOR
+       else
+           if (null_initiator) {
+               if (chdir (pw -> pw_dir = "/pub") == NOTOK) {
+                   dp -> ftd_type = DIAG_PERM;
+                   dp -> ftd_identifier = FS_ACS_MGMT;
+                   dp -> ftd_observer = EREF_RFPM, dp -> ftd_source = EREF_IFSU;
+                   dp -> ftd_delay = DIAG_NODELAY;
+                   (void) sprintf (dp -> ftd_data,
+                                   "unable to change to %s: %s",
+                                   pw -> pw_dir, sys_errname (errno));
+                   dp -> ftd_cc = strlen (dp -> ftd_data);
+                   dp++;
+               }
+           }
+#endif
+       else {
+           dp -> ftd_type = DIAG_INFORM;
+           dp -> ftd_identifier = FS_GEN_NOREASON;
+           dp -> ftd_observer = EREF_RFSU, dp -> ftd_source = EREF_RFSU;
+           dp -> ftd_delay = DIAG_NODELAY;
+           if (guest)
+               (void) strcpy (dp -> ftd_data,
+                       "ANONymous user permitted, access restrictions apply");
+           dp -> ftd_cc = strlen (dp -> ftd_data);
+           dp++;
+
+           pw -> pw_dir = "/";
+       }
+    }
+
+    (void) sprintf (myhome, "%s/", pw -> pw_dir);
+    myhomelen = strlen (myhome);
+
+    (void) setgid (pw -> pw_gid);
+#ifndef        SYS5
+    (void) initgroups (pw -> pw_name, pw -> pw_gid);
+    (void) seteuid (myuid = pw -> pw_uid);
+#else
+    (void) setuid (myuid = pw -> pw_uid);
+#endif
+
+    (void) umask (0022);
+#endif
+
+    if (FInitializeResponse (ftamfd, FSTATE_SUCCESS, FACTION_SUCCESS,
+                            NULLOID, NULLAEI, NULLPA, fts -> fts_manage,
+                            class, units, attrs, NULLPE,
+                            fqos, &fts -> fts_contents, diags, dp - diags,
+                            fti) == NOTOK)
+       ftam_adios (&fti -> fti_abort, "F-INITIALIZE.RESPONSE");
+
+    advise (LLOG_NOTICE, NULLCP, "accepting association");
+    ftam_diag (diags, dp - diags);
+    return;
+
+bad2: ;
+    dp -> ftd_type = DIAG_PERM;
+    dp -> ftd_delay = DIAG_NODELAY;
+#ifndef        BRIDGE
+    dp -> ftd_cc = 0;
+
+bad1: ;
+#endif
+    advise (LLOG_NOTICE, NULLCP, "rejecting association");
+    ftam_diag (diags, 1);
+
+    if (FInitializeResponse (ftamfd, FSTATE_FAILURE, FACTION_PERM, NULLOID,
+           NULLAEI, NULLPA, fts -> fts_manage, class, units, 0, NULLPE,
+           fqos, (struct FTAMcontentlist *) 0, diags, 1, fti) == NOTOK)
+       ftam_adios (&fti -> fti_abort, "F-INITIALIZE.RESPONSE(reject)");
+
+    closewtmp ();
+
+    exit (1);
+}
+
+/* \f */
+
+int    ftam_indication (fti)
+register struct FTAMindication *fti;
+{
+    switch (fti -> fti_type) {
+       case FTI_FINISH: 
+           ftam_finishindication (&fti -> fti_finish);
+           break;
+
+       case FTI_ABORT: 
+           ftam_abortindication (&fti -> fti_abort);
+           break;
+
+       case FTI_BULKBEGIN:
+           ftam_bulkbeginindication (&fti -> fti_group);
+           break;
+
+       case FTI_READWRITE:
+           ftam_readwriteindication (&fti -> fti_readwrite);
+           break;
+       
+       case FTI_DATA:
+           ftam_dataindication (&fti -> fti_data);
+           break;
+
+       case FTI_DATAEND:
+           ftam_dataendindication (&fti -> fti_dataend);
+           break;
+
+       case FTI_CANCEL:
+           ftam_cancelindication (&fti -> fti_cancel);
+           break;
+
+       case FTI_TRANSEND:
+           ftam_transendindication (&fti -> fti_transend);
+           break;
+
+       case FTI_BULKEND:
+           ftam_bulkendindication (&fti -> fti_group);
+           break;
+
+       case FTI_MANAGEMENT:
+           ftam_managementindication (&fti -> fti_group);
+           break;
+
+       default: 
+           adios (NULLCP, "unknown indication type=%d", fti -> fti_type);
+    }
+}
+
+/* \f   TERMINATION */
+
+/* ARGSUSED */
+
+static ftam_finishindication (ftf)
+struct FTAMfinish *ftf;
+{
+#ifdef DEBUG
+    long    now;
+    struct FTAMcharging fcs;
+    register struct FTAMcharging   *fc = &fcs;
+#else
+#define        fc      ((struct FTAMcharging *) 0)
+#endif
+    struct FTAMindication   ftis;
+    register struct FTAMindication *fti = &ftis;
+#ifdef BRIDGE
+    (void) ftp_quit ();
+#endif
+
+    advise (LLOG_NOTICE, NULLCP, "F-TERMINATE.INDICATION");
+
+#ifdef DEBUG
+    fc -> fc_ncharge = 0;
+    if (account) {
+       (void) time (&now);
+
+       fc -> fc_charges[fc -> fc_ncharge].fc_resource = "elapsed time";
+       fc -> fc_charges[fc -> fc_ncharge].fc_unit = "seconds";
+       fc -> fc_charges[fc -> fc_ncharge++].fc_value = (int) (now - clok);
+    }
+#endif
+
+    if (FTerminateResponse (ftamfd, NULLPE, fc, fti) == NOTOK)
+       ftam_adios (&fti -> fti_abort, "F-TERMINATE.RESPONSE");
+
+    FTFFREE (ftf);
+
+    closewtmp ();
+
+    exit (0);
+}
+
+
+closewtmp ()
+{
+#if    !defined(SYS5) && !defined(bsd43_ut_host)
+    long    now;
+
+    (void) time (&now);
+
+    if (wtmp != NOTOK) {
+       (void) lseek (wtmp, 0L, L_XTND);
+       (void) SCPYN (uts.ut_name, "");
+       (void) SCPYN (uts.ut_host, "");
+       uts.ut_time = now;
+       (void) write (wtmp, (char *) &uts, sizeof uts);
+       (void) close (wtmp);
+    }
+#endif
+}
+
+/* \f   ABORT */
+
+static ftam_abortindication (fta)
+register struct FTAMabort *fta;
+{
+    struct FTAMindication   ftis;
+
+    advise (LLOG_NOTICE, NULLCP, "F-%s-ABORT.INDICATION %d",
+           fta -> fta_peer ? "U" : "P", fta -> fta_action);
+    ftam_diag (fta -> fta_diags, fta -> fta_ndiag);
+#ifdef BRIDGE
+    (void) ftp_abort ();
+    (void) ftp_quit ();
+#endif 
+
+    if (fta -> fta_action != FACTION_PERM && !fta -> fta_peer)
+       (void) FUAbortRequest (ftamfd, FACTION_PERM,
+                              (struct FTAMdiagnostic *) 0, 0, &ftis);
+
+    closewtmp ();
+
+    exit (1);
+}
diff --git a/usr/src/contrib/isode/ftam2/ftamsystem.h b/usr/src/contrib/isode/ftam2/ftamsystem.h
new file mode 100644 (file)
index 0000000..24c0541
--- /dev/null
@@ -0,0 +1,151 @@
+/* ftamsystem.h - include file for FTAM responder */
+
+/* 
+ * $Header: /f/osi/ftam2/RCS/ftamsystem.h,v 7.2 91/02/22 09:24:10 mrose Interim $
+ *
+ *
+ * $Log:       ftamsystem.h,v $
+ * Revision 7.2  91/02/22  09:24:10  mrose
+ * Interim 6.8
+ * 
+ * Revision 7.1  90/11/05  13:30:00  mrose
+ * nist
+ * 
+ * Revision 7.0  89/11/23  21:54:41  mrose
+ * Release 6.0
+ * 
+ */
+
+/*
+ *                               NOTICE
+ *
+ *    Acquisition, use, and distribution of this module and related
+ *    materials are subject to the restrictions of a license agreement.
+ *    Consult the Preface in the User's Manual for the full terms of
+ *    this agreement.
+ *
+ */
+
+
+#include <errno.h>
+#include "ftamsbr.h"
+#include "logger.h"
+
+
+#define        SCPYN(a,b)      strncpy ((a), (b), sizeof (a))
+
+/* \f   SERVER */
+
+extern int  ftamfd;
+
+extern int  cflag;
+extern int  debug;
+extern char *myname;
+
+
+void   ftam_adios (), ftam_advise (), ftam_diag ();
+
+void   adios (), advise ();
+
+/* \f   UNIX DATA */
+
+extern int  myuid;
+
+extern int  myhomelen;
+extern char myhome[];
+
+extern dev_t null_dev;
+extern ino_t null_ino;
+
+/* \f   VFS DATA */
+
+#define        NMAX    8               /* too painful to get right! */
+
+#ifndef        NGROUPS
+#define        NACCT   32
+#else
+#define        NACCT   (NGROUPS + 20)
+#endif
+
+
+extern struct vfsmap vfs[];    /* ordering affects default action in st2vfs()
+                                  put preferential entries towards the end */
+#define        VFS_UBF 0               /* offset to FTAM-3 */
+#define        VFS_UTF 1               /*  ..       FTAM-1 */
+#define        VFS_FDF 2               /*  ..       NIST-9 */
+
+/* \f   REGIME DATA */
+
+extern int level;
+extern int class;
+extern int units;
+extern int attrs;
+extern int fadusize;
+
+/* \f   ACTIVITY DATA */
+
+extern int  myfd;
+extern char *myfile;
+extern struct stat  myst;
+extern int  statok;
+
+extern struct vfsmap   *myvf;  /* active contents type */
+extern caddr_t myparam;                /*   .. */
+
+extern int  myaccess;          /* current access request */
+
+extern char *initiator;                /* current initiator identity */
+
+extern struct FADUidentity mylocation;/* current location */
+
+extern int  mymode;            /* current processing mode */
+extern int  myoperation;       /*   .. */
+
+#ifdef notdef
+extern AEI mycalling;          /* current calling AET */
+extern AEI myresponding;       /* current responding AET */
+#endif
+
+extern char *account;          /* current account */
+extern int  mygid;             /* "inner" account */
+
+extern int  mylock;            /* current concurrency control */
+extern struct FTAMconcurrency myconctl;/* .. */
+
+extern int mylockstyle;                /* current locking style */
+
+
+extern int  mycontext;         /* current access context */
+extern int  mylevel;           /*   .. */
+
+
+#ifndef        SYS5
+#define        unlock()        if (mylock) (void) flock (myfd, LOCK_UN); else
+#else
+#define        unlock() \
+    if (mylock) { \
+       struct flock fs; \
+ \
+       fs.l_type = F_UNLCK; \
+       fs.l_whence = L_SET; \
+       fs.l_start = fs.l_len = 0; \
+       (void) fcntl (myfd, F_SETLK, &fs); \
+    } \
+    else
+#endif
+
+/* \f */
+
+extern int  errno;
+
+/* \f */
+
+#ifdef BRIDGE
+/* FTP interface routines and variables */
+
+extern char *ftp_error;
+
+int    ftp_exits (), ftp_delete (), ftp_mkdir (), ftp_rename (), ftp_type (),
+       ftp_write (), ftp_append (), ftp_read (), ftp_ls (), ftp_login (),
+       ftp_quit (), ftp_abort (), ftp_reply ();
+#endif
diff --git a/usr/src/contrib/isode/ftam2/ftamuser.c b/usr/src/contrib/isode/ftam2/ftamuser.c
new file mode 100644 (file)
index 0000000..135c1a0
--- /dev/null
@@ -0,0 +1,1393 @@
+/* ftamuser.c - FTAM initiator routines */
+
+#ifndef        lint
+static char *rcsid = "$Header: /f/osi/ftam2/RCS/ftamuser.c,v 7.8 91/02/22 09:24:11 mrose Interim $";
+#endif
+
+/* 
+ * $Header: /f/osi/ftam2/RCS/ftamuser.c,v 7.8 91/02/22 09:24:11 mrose Interim $
+ *
+ *
+ * $Log:       ftamuser.c,v $
+ * Revision 7.8  91/02/22  09:24:11  mrose
+ * Interim 6.8
+ * 
+ * Revision 7.7  91/01/13  12:27:10  mrose
+ * NBS
+ * 
+ * Revision 7.6  90/12/23  18:40:19  mrose
+ * update
+ * 
+ * Revision 7.5  90/11/21  11:30:54  mrose
+ * sun
+ * 
+ * Revision 7.4  90/11/05  13:30:02  mrose
+ * nist
+ * 
+ * Revision 7.3  90/09/07  11:14:08  mrose
+ * update
+ * 
+ * Revision 7.2  90/07/01  21:03:37  mrose
+ * pepsy
+ * 
+ * Revision 7.1  90/01/11  18:35:50  mrose
+ * real-sync
+ * 
+ * Revision 7.0  89/11/23  21:54:42  mrose
+ * Release 6.0
+ * 
+ */
+
+/*
+ *                               NOTICE
+ *
+ *    Acquisition, use, and distribution of this module and related
+ *    materials are subject to the restrictions of a license agreement.
+ *    Consult the Preface in the User's Manual for the full terms of
+ *    this agreement.
+ *
+ */
+
+
+#include <ctype.h>
+#include <errno.h>
+#include <stdio.h>
+#include "ftamuser.h"
+#include "tailor.h"
+#if    defined(SYS5) && !defined(HPUX)
+#include <sys/times.h>
+#define        TMS
+#endif
+#ifdef BSD42
+#include <sys/ioctl.h>
+#endif
+
+/* \f   DATA */
+
+int   ftamfd = NOTOK;
+
+char *host = NULLCP;
+char *user = NULLCP;
+char *account = NULLCP;
+#ifndef        BRIDGE
+char *userdn = NULLCP;
+char *storename = NULLCP;
+#endif
+
+int   bell = 0;
+int   concurrency = 1;
+#ifndef        BRIDGE
+int   debug = 0;
+#endif
+#ifdef BRIDGE
+int   globbing = 1;
+#else
+int   globbing = 0;
+#endif
+int   hash = 0;
+int   marks = 0;
+int   omode = FOVER_WRITE;
+int   query = 1;
+int   runcom = 0;
+#ifdef BRIDGE
+int   tmode = VFS_UTF;
+#else
+int   tmode = VFS_DEF;
+#endif
+int   trace = 0;
+#ifndef        BRIDGE
+int   verbose = 0;
+int   watch = 0;
+#endif
+
+
+char *myuser = NULLCP;
+char *myhome = NULLCP;
+
+#ifdef BRIDGE
+int realstore = RFS_UNIX;
+#else
+int realstore = 0;
+#endif
+
+char *rs_unknown =
+       "type of remote realstore is unknown; use \"set realstore\"";
+char *rs_support = "operation not supported on remote realstore";
+
+
+char *rcwd = NULL;
+
+#ifdef BRIDGE
+int    ftp_default = VFS_UTF;
+int    ftp_directory;
+char   ftam_error[BUFSIZ];
+#endif
+
+struct QOStype myqos;
+
+/* \f   DISPATCH */
+
+#ifndef        BRIDGE
+int    f_open (), f_close (), f_quit (), f_status ();
+int    f_set (), f_help ();
+int    f_lcd (), f_cd (), f_pwd ();
+int    f_ls (), f_fls ();
+int    f_get (), f_put ();
+int    f_mv (), f_rm (), f_chgrp (), f_mkdir ();
+int    f_echo ();
+
+
+static struct dispatch  dispatches[] = {
+    "append", f_put, DS_OPEN | DS_MODES, FCLASS_TRANSFER, FUNIT_WRITE,
+    "append to a file in the virtual filestore",
+
+    "cd", f_cd, DS_OPEN, 0, 0,
+    "change working directory on virtual filestore",
+
+    "chgrp", f_chgrp, DS_OPEN | DS_MODES, FCLASS_MANAGE, FUNIT_ENHANCED,
+    "change group of a file",
+
+    "close", f_close, DS_OPEN, 0, 0,
+    "terminate association with virtual filestore",
+
+    "dir", f_ls, DS_OPEN | DS_MODES, FCLASS_MANAGE, FUNIT_LIMITED,
+    "print long directory listing",
+
+    "echo", f_echo, DS_OPEN | DS_MODES, FCLASS_MANAGE, FUNIT_LIMITED,
+    "echo globbed filenames",
+
+    "fdir", f_fls, DS_OPEN | DS_MODES, FCLASS_MANAGE, FUNIT_LIMITED,
+    "print long directory listing to a file/program",
+
+    "fls", f_fls, DS_OPEN | DS_MODES, FCLASS_MANAGE, FUNIT_LIMITED,
+    "print directory listing to a file/program",
+
+    "get", f_get, DS_OPEN | DS_MODES, FCLASS_TRANSFER, FUNIT_READ,
+    "retrieve file",
+
+    "help", f_help, DS_NULL, 0, 0,
+    "print help information",
+
+    "lcd", f_lcd, DS_NULL, 0, 0,
+    "change working directory on local system",
+
+    "ls", f_ls, DS_OPEN | DS_MODES, FCLASS_MANAGE, FUNIT_LIMITED,
+    "print directory listing",
+
+    "mkdir", f_mkdir, DS_OPEN | DS_MODES, FCLASS_MANAGE, FUNIT_LIMITED,
+    "create directory",
+
+    "mv", f_mv, DS_OPEN | DS_MODES, FCLASS_MANAGE, FUNIT_ENHANCED,
+    "rename file",
+
+    "open", f_open, DS_CLOSE, 0, 0,
+    "associate with virtual filestore",
+
+    "put", f_put, DS_OPEN | DS_MODES, FCLASS_TRANSFER, FUNIT_WRITE,
+    "store file",
+
+    "pwd", f_pwd, DS_NULL, 0, 0,
+    "print working directories",
+
+    "quit", f_quit, DS_NULL, 0, 0,
+    "terminate association with virtual filestore and exit",
+
+    "rm", f_rm, DS_OPEN | DS_MODES, FCLASS_MANAGE, FUNIT_LIMITED,
+    "delete file",
+
+    "set", f_set, DS_NULL, 0, 0,
+    "display or change variables",
+
+    "status", f_status, DS_OPEN, 0, 0,
+    "show current status",
+
+    NULL
+};
+
+/* \f */
+
+struct dispatch *getds (name)
+register char *name;
+{
+    register int    longest,
+                    nmatches;
+    register char  *p,
+                   *q;
+    char    buffer[BUFSIZ];
+    register struct dispatch   *ds,
+                               *fs;
+
+    longest = nmatches = 0;
+    for (ds = dispatches; p = ds -> ds_name; ds++) {
+       for (q = name; *q == *p++; q++)
+           if (*q == NULL)
+               return ds;
+       if (*q == NULL)
+           if (q - name > longest) {
+               longest = q - name;
+               nmatches = 1;
+               fs = ds;
+           }
+           else
+               if (q - name == longest)
+                   nmatches++;
+    }
+
+    switch (nmatches) {
+       case 0: 
+           advise (NULLCP, "unknown operation \"%s\"", name);
+           return NULL;
+
+       case 1: 
+           return fs;
+
+       default: 
+           for (ds = dispatches, p = buffer; q = ds -> ds_name; ds++)
+               if (strncmp (q, name, longest) == 0) {
+                   (void) sprintf (p, "%s \"%s\"", p != buffer ? "," : "", q);
+                   p += strlen (p);
+               }
+           advise (NULLCP, "ambiguous operation, it could be one of:%s",
+                       buffer);
+           return NULL;
+    }
+}
+#endif
+
+/* \f   VARIABLES */
+
+#ifndef        BRIDGE
+static char *bool[] = {
+    "off", "on", NULL
+};
+
+static char *hmodes[] = {
+    "off", "on", "total", NULL
+};
+
+static char *omodes[] = {
+    "fail", "select", "write", "delete", NULL
+};
+
+static char *tmodes[] = {
+    "default", "binary", "text", NULL
+};
+
+static char *realstores[] = {
+    "unknown", "unix", NULL
+};
+
+static char *xsaplevels[] = {
+    "none", "fatal", "exceptions", "notice", "pdus", "trace", "debug", NULL
+};
+
+
+static char *sversions[] = {
+    "default", "v1", "v2", NULL
+};
+
+
+struct var {
+    char   *v_name;
+    IP     v_value;
+
+    char   *v_dname;
+    char  **v_dvalue;
+    char   *v_mask;
+
+    IFP            v_hook;
+};
+
+struct var *getvar ();
+
+
+int    set_realstore (), set_trace (), set_type ();
+
+
+static struct var vars[] = {
+    "acsaplevel", &_acsap_log.ll_events, "ACSAP logging", xsaplevels,
+       LLOG_MASK, NULLIFP,
+    "acsapfile", NULLIP, "ACSAP trace file", &_acsap_log.ll_file, NULLCP,
+       NULLIFP,
+
+    "addrlevel", &_addr_log.ll_events, "address logging", xsaplevels,
+       LLOG_MASK, NULLIFP,
+    "addrfile", NULLIP, "address trace file", &_addr_log.ll_file, NULLCP,
+       NULLIFP,
+
+    "bell", &bell, "ring the bell when a command finishes", bool, NULLCP,
+       NULLIFP,
+
+    "compatlevel", &_compat_log.ll_events, "COMPAT logging", xsaplevels,
+       LLOG_MASK, NULLIFP,
+    "compatfile", NULLIP, "COMPAT trace file", &_compat_log.ll_file, NULLCP,
+       NULLIFP,
+
+    "concurrency", &concurrency,       /* Olivier Dubois */
+       "request concurrency control for transfers", bool, NULLCP, NULLIFP,
+
+    "debug", &debug, "debug FTAM", bool, NULLCP, NULLIFP,
+
+    "glob", &globbing, "expand metacharacters like the shell", bool, NULLCP,
+       NULLIFP,
+
+    "hash", &hash, "hash mark printing", hmodes, NULLCP, NULLIFP,
+
+    "override", &omode, "creation override mode", omodes, NULLCP, NULLIFP,
+
+    "psaplevel", &_psap_log.ll_events, "PSAP logging", xsaplevels,
+       LLOG_MASK, NULLIFP,
+    "psapfile", NULLIP, "PSAP trace file", &_psap_log.ll_file, NULLCP,
+       NULLIFP,
+
+    "psap2level", &_psap2_log.ll_events, "PSAP2 logging", xsaplevels,
+       LLOG_MASK, NULLIFP,
+    "psap2file", NULLIP, "PSAP2 trace file", &_psap2_log.ll_file, NULLCP,
+       NULLIFP,
+
+    "qualifier", NULLIP, "service qualifier", &storename, NULLCP, NULLIFP,
+
+    "query", &query, "confirm operations on globbing", bool, NULLCP, NULLIFP,
+
+    "realstore", &realstore, "type of remote realstore", realstores, NULLCP,
+       set_realstore,
+
+    "ssaplevel", &_ssap_log.ll_events, "SSAP logging", xsaplevels,
+       LLOG_MASK, NULLIFP,
+    "ssapfile", NULLIP, "SSAP trace file", &_ssap_log.ll_file, NULLCP,
+       NULLIFP,
+
+    "sversion", &myqos.qos_sversion, "session version number", sversions,
+       NULLCP, NULLIFP,
+
+    "trace", &trace, "trace FPDUs", bool, NULLCP, set_trace,
+    "tracefile", NULLIP, "FTAM trace file", &_ftam_log.ll_file, NULLCP,
+       NULLIFP,
+
+    "tsaplevel", &_tsap_log.ll_events, "TSAP logging", xsaplevels,
+       LLOG_MASK, NULLIFP,
+    "tsapfile", NULLIP, "TSAP trace file", &_tsap_log.ll_file, NULLCP,
+       NULLIFP,
+
+    "type", &tmode, "file transfer mode", tmodes, NULLCP, set_type,
+
+    "verbose", &verbose, "verbose interaction", bool, NULLCP, NULLIFP,
+
+    "userdn", NULLIP, "DN to use when binding for AE-lookup", &userdn, NULLCP,
+       NULLIFP,
+
+    "watch", &watch, "watch transfers", bool, NULLCP, NULLIFP,
+
+    NULL
+};
+
+
+static int varwidth1;
+static int varwidth2;
+
+char    **getval ();
+
+/* \f */
+
+static int  f_set (vec)
+char  **vec;
+{
+    register int    i,
+                   j;
+    int     value,
+           vflag;
+    register char **cp,
+                  *dp;
+    register struct var *v;
+
+    if (*++vec == NULL) {
+       register int    w;
+       int     columns,
+               width,
+               lines;
+       register struct var *u;
+
+       for (u = vars; u -> v_name; u++)
+           continue;
+       width = varwidth1;
+
+       if ((columns = ncols (stdout) / (width = (width + 8) & ~7)) == 0)
+           columns = 1;
+       lines = ((u - vars) + columns - 1) / columns;
+
+       printf ("Variables:\n");
+       for (i = 0; i < lines; i++)
+           for (j = 0; j < columns; j++) {
+               v = vars + j * lines + i;
+               printf ("%s", v -> v_name);
+               if (v + lines >= u) {
+                   printf ("\n");
+                   break;
+               }
+               for (w = strlen (v -> v_name); w < width; w = (w + 8) & ~7)
+                   (void) putchar ('\t');
+           }
+
+       return OK;
+    }
+
+    if (strcmp (*vec, "?") == 0) {
+       for (v = vars; v -> v_name; v++)
+           printvar (v);
+
+       return OK;
+    }
+
+    if ((v = getvar (*vec)) == NULL)
+       return OK;
+
+    if (*++vec == NULL) {
+       printvar (v);
+
+       return OK;
+    }
+
+    if (strcmp (*vec, "?") == 0) {
+       if (v -> v_value && (cp = v -> v_dvalue)) {
+           printf ("use %s of:", v -> v_mask ? "any" : "one");
+           for (i = 0; *cp; cp++)
+               printf ("%s \"%s\"", i++ ? "," : "", *cp);
+           if (v -> v_mask)
+               printf (";\n\tor  \"all\";\n\tor a hexadecimal number from 0 to 0x%x\n",
+                   (1 << (i - 1)) - 1);
+           else
+               printf (";\n\tor a number from 0 to %d\n",
+                   cp - v -> v_dvalue - 1);
+       }
+       else
+           printf ("use any %s value\n",
+                   v -> v_value ? "integer" : "string");
+
+       return OK;
+    }
+
+    if (v -> v_value == NULLIP) {
+       register int    w;
+
+       if (*v -> v_dvalue)
+           free (*v -> v_dvalue);
+       *v -> v_dvalue = strdup (*vec);
+       if ((w = strlen (*v -> v_dvalue) + 2) > varwidth2)
+           varwidth2 = w;
+       if (v -> v_hook)
+           (*v -> v_hook) (v);
+       if (verbose)
+           printvar (v);
+       return OK;
+    }
+
+    if (v -> v_mask) {
+       if (strcmp (dp = *vec, "all") == 0 && (cp = v -> v_dvalue)) {
+           i = 1;
+           while (*++cp)
+               i <<= 1;
+           value = i - 1;
+           j = 1;
+       }
+       else {
+           if (strncmp (dp, "0x", 2) == 0)
+               dp += 2;
+           for (j = sscanf (dp, "%x", &value); *dp; dp++)
+               if (!isxdigit ((u_char) *dp)) {
+                   j = 0;
+                   break;
+               }
+       }
+    }
+    else
+       j = sscanf (*vec, "%d", &value);
+
+    if (j == 1) {
+       if (cp = v -> v_dvalue) {
+           if (v -> v_mask) {
+               i = 1;
+               while (*++cp)
+                   i <<= 1;
+               if (value >= i)
+                   goto out_of_range;
+           }
+           else {
+               for (; *cp; cp++)
+                   continue;
+               if (value >= cp - v -> v_dvalue) {
+out_of_range: ;
+                   advise (NULLCP, "value out of range \"%s\"", *vec);
+
+                   return OK;
+               }
+           }
+       }
+
+       vflag = verbose;
+       *v -> v_value = value;
+       if (v -> v_hook)
+           (*v -> v_hook) (v);
+       if (vflag)
+           printvar (v);
+
+       return OK;
+    }
+
+    if (v -> v_mask) {
+       i = 0;
+       for (; *vec; vec++) {
+           if (!(cp = getval (*vec, v -> v_dvalue))) {
+               advise (NULLCP, "bad value \"%s\"", *vec);
+
+               return OK;
+           }
+           if ((j = cp - v -> v_dvalue) <= 0)
+               continue;
+
+           i |= 1 << (j - 1);
+       }
+
+       vflag = verbose;
+       *v -> v_value = i;
+       if (v -> v_hook)
+           (*v -> v_hook) (v);
+       if (vflag)
+           printvar (v);
+
+       return OK;
+    }
+
+    if (v -> v_dvalue && (cp = getval (*vec, v -> v_dvalue))) {
+       vflag = verbose;
+       *v -> v_value = cp - v -> v_dvalue;
+       if (v -> v_hook)
+           (*v -> v_hook) (v);
+       if (vflag)
+           printvar (v);
+    }
+    else
+       if (!v -> v_dvalue)
+           advise (NULLCP, "bad value \"%s\"", *vec);
+
+    return OK;
+}
+
+/* \f */
+
+static printvar (v)
+register struct var *v;
+{
+    int            i;
+    char    buffer[BUFSIZ];
+
+    if (runcom)
+       return;
+
+    printf ("%-*s = ", varwidth1, v -> v_name);
+    if (v -> v_value) {
+       i = *v -> v_value;
+
+       if (v -> v_mask) {
+           if (v -> v_dvalue) {
+               if (i == 0)
+                   printf ("%-*s", varwidth2, v -> v_dvalue[i]);
+               else {
+                   (void) strcpy (buffer, sprintb (i, v -> v_mask));
+                   if (strlen (buffer) <= varwidth2)
+                       printf ("%-*s", varwidth2, buffer);
+                   else
+                       printf ("%s\n%*s", buffer, varwidth1 + varwidth2 + 3,
+                               "");
+               }
+           }
+           else
+               printf ("0x%-*x", varwidth2 - 2, i);
+       }
+       else {
+           if (v -> v_dvalue)
+               printf ("%-*s", varwidth2, v -> v_dvalue[i]);
+           else
+               printf ("%-*d", varwidth2, i);
+       }
+    }
+    else
+       if (*v -> v_dvalue) {
+           (void) sprintf (buffer, "\"%s\"", *v -> v_dvalue);
+           printf ("%-*s", varwidth2, buffer);
+       }
+    printf ("    - %s\n", v -> v_dname);
+}
+
+/* \f */
+
+/* ARGSUSED */
+
+static int  set_realstore (v)
+struct var *v;
+{
+    char   *vec[2];
+
+    if (ftamfd != NOTOK) {
+       vec[0] = "sd";
+       vec[1] = NULLCP;
+
+       (void) f_cd (vec);
+    }
+}
+
+
+
+/* ARGSUSED */
+
+static int  set_trace (v)
+struct var *v;
+{
+    struct FTAMindication   ftis;
+    register struct FTAMindication *fti = &ftis;
+
+    if (ftamfd == NOTOK)
+       return;
+
+    if (FHookRequest (ftamfd, trace ? FTraceHook : NULLIFP, fti) == NOTOK)
+       ftam_advise (&fti -> fti_abort, "F-HOOK.REQUEST");
+}
+
+
+/* ARGSUSED */
+
+static int  set_type (v)
+struct var *v;
+{
+    register struct vfsmap *vf;
+
+    if (ftamfd == NOTOK)
+       return;
+
+    if ((vf = &vfs[tmode]) != &vfs[VFS_DEF]
+           && (vf -> vf_oid == NULLOID || !(vf -> vf_flags & VF_OK))) {
+       advise (NULLCP, "negotiation prevents transfer of %ss",
+               vf -> vf_text);
+
+       tmode = VFS_DEF;
+    }
+}
+
+/* \f */
+
+static char **getval (name, choices)
+register char *name;
+char   **choices;
+{
+    register int    longest,
+                    nmatches;
+    register char  *p,
+                   *q,
+                  **cp,
+                  **fp;
+    char    buffer[BUFSIZ];
+
+    longest = nmatches = 0;
+    for (cp = choices; p = *cp; cp++) {
+       for (q = name; *q == *p++; q++)
+           if (*q == NULL)
+               return cp;
+       if (*q == NULL)
+           if (q - name > longest) {
+               longest = q - name;
+               nmatches = 1;
+               fp = cp;
+           }
+           else
+               if (q - name == longest)
+                   nmatches++;
+    }
+
+    switch (nmatches) {
+       case 0: 
+           advise (NULLCP, "unknown value \"%s\"", name);
+           return NULL;
+
+       case 1: 
+           return fp;
+
+       default: 
+           for (cp = choices, p = buffer; q = *cp; cp++)
+               if (strncmp (q, name, longest) == 0) {
+                   (void) sprintf (p, "%s \"%s\"", p != buffer ? "," : "", q);
+                   p += strlen (p);
+               }
+           advise (NULLCP, "ambiguous value, it could be one of:%s",
+                   buffer);
+           return NULL;
+    }
+}
+
+/* \f */
+
+static struct var *getvar (name)
+register char *name;
+{
+    register int    longest,
+                    nmatches;
+    register char  *p,
+                   *q;
+    char    buffer[BUFSIZ];
+    register struct var *v,
+                       *f;
+
+    longest = nmatches = 0;
+    for (v = vars; p = v -> v_name; v++) {
+       for (q = name; *q == *p++; q++)
+           if (*q == NULL)
+               return v;
+       if (*q == NULL)
+           if (q - name > longest) {
+               longest = q - name;
+               nmatches = 1;
+               f = v;
+           }
+           else
+               if (q - name == longest)
+                   nmatches++;
+    }
+
+    switch (nmatches) {
+       case 0: 
+           advise (NULLCP, "unknown variable \"%s\"", name);
+           return NULL;
+
+       case 1: 
+           return f;
+
+       default: 
+           for (v = vars, p = buffer; q = v -> v_name; v++)
+               if (strncmp (q, name, longest) == 0) {
+                   (void) sprintf (p, "%s \"%s\"", p != buffer ? "," : "", q);
+                   p += strlen (p);
+               }
+           advise (NULLCP, "ambiguous variable, it could be one of:%s",
+                       buffer);
+           return NULL;
+    }
+}
+
+/* \f   HELP */
+
+static int helpwidth;
+
+/* \f */
+
+static int  f_help (vec)
+char  **vec;
+{
+    register int    i,
+                    j,
+                    w;
+    int     columns,
+            width,
+            lines;
+    register struct dispatch   *ds,
+                               *es;
+
+    for (es = dispatches; es -> ds_name; es++)
+       continue;
+    width = helpwidth;
+
+    if (*++vec == NULL) {
+       if ((columns = ncols (stdout) / (width = (width + 8) & ~7)) == 0)
+           columns = 1;
+       lines = ((es - dispatches) + columns - 1) / columns;
+
+       printf ("Operations:\n");
+       for (i = 0; i < lines; i++)
+           for (j = 0; j < columns; j++) {
+               ds = dispatches + j * lines + i;
+               printf ("%s", ds -> ds_name);
+               if (ds + lines >= es) {
+                   printf ("\n");
+                   break;
+               }
+               for (w = strlen (ds -> ds_name); w < width; w = (w + 8) & ~7)
+                   (void) putchar ('\t');
+           }
+
+       printf ("\nversion info:\t%s\n\t\t%s\n", ftamversion, isodeversion);
+
+       return OK;
+    }
+
+    for (; *vec; vec++)
+       if (strcmp (*vec, "?") == 0) {
+           for (ds = dispatches; ds -> ds_name; ds++)
+               printf ("%-*s\t- %s\n", width, ds -> ds_name, ds -> ds_help);
+
+           break;
+       }
+       else
+           if (ds = getds (*vec))
+               printf ("%-*s\t- %s\n", width, ds -> ds_name, ds -> ds_help);
+
+    return OK;
+}
+#endif
+
+/* \f   FTAM */
+
+/* When going from an FADU to an SSDU via FTAM, we are talking about:
+
+       octets = 2 + <number of FADUs>*12 + <size of each FADU>
+
+   in the best case, and probably
+
+       octets = 3 + <number of FADUs>*16 + <size of each FADU>
+
+   on the average.  
+
+   On a Berkeley UNIX system we typically see a blksize of 8192 octets.
+
+   When deciding how to read from the filesystem when writing to the network,
+   for the file's FADU size, we prefer to use the integral FADU size,
+   unless the blksize is larger.  This works well on LANs.
+ */
+
+OID    context;
+int    fqos;
+int    class = FCLASS_TRANSFER | FCLASS_MANAGE | FCLASS_TM;
+int    units;
+int    attrs;
+int    fadusize;
+
+
+struct vfsmap vfs[] = {
+/* VFS_DEF */
+    "default", NULLOID, NULLCP, VF_NULL, 0, 0, NULLIFP, ' ', VFS_XXX,
+       0,
+       0, NULLIFP,
+          -1,
+       NULLCP,
+
+/* VFS_UBF */
+    "FTAM-3", NULLOID, NULLCP, VF_WARN, 0, S_IFREG, binarypeek, 'b', VFS_XXX,
+       FA_ACC_UA,
+       1, binarycheck,
+          _ZFTAM_3_ParametersDOCS,
+       "unstructured binary file",
+
+/* VFS_UTF */
+    "FTAM-1", NULLOID, NULLCP, VF_WARN, 0, S_IFREG, textpeek, 't', VFS_UBF,
+       FA_ACC_UA,
+       1, textcheck,
+          _ZFTAM_1_ParametersDOCS,
+       "unstructured text file",
+
+/* VFS_FDF */
+    "NBS-9",  NULLOID, NULLCP, VF_NULL, 0, S_IFDIR, fdfpeek, 'd', VFS_XXX,
+       FA_ACC_UA,
+       0, NULLIFP,
+          _ZNBS_9_ParametersDOCS,
+       "file directory file",
+
+    NULL
+};
+#ifdef BRIDGE
+int    vfs_fdf = VFS_FDF;
+#endif
+
+struct vfsmap *myvf;
+
+/* \f */
+
+void   ftam_advise (fta, event)
+register struct FTAMabort *fta;
+char   *event;
+{
+    if (hash && marks >= BUFSIZ) {
+       marks = 0;
+       printf ("\n");
+    }
+
+    (void) fflush (stdout);
+
+    if (fta -> fta_peer) {
+#ifdef BRIDGE
+       (void) sprintf (ftam_error, "%s: peer aborted association, due to ",
+                       event);
+#else
+       fprintf (stderr, "%s: peer aborted association, due to ", event);
+#endif
+       switch (fta -> fta_action) {
+           case FACTION_TRANS: 
+#ifdef BRIDGE
+               (void) sprintf (ftam_error + strlen (ftam_error),
+                               "transient-error");
+#else
+               fprintf (stderr, "transient-error");
+#endif
+               break;
+
+           case FACTION_PERM: 
+#ifdef BRIDGE
+               (void) sprintf (ftam_error + strlen (ftam_error),
+                               "permanent-error");
+#else
+               fprintf (stderr, "permanent-error");
+#endif
+               break;
+
+           default: 
+#ifdef BRIDGE
+               (void) sprintf (ftam_error + strlen (ftam_error),
+                               "action result %d", fta -> fta_action);
+#else
+               fprintf (stderr, "action result %d", fta -> fta_action);
+#endif
+               break;
+       }
+#ifndef        BRIDGE
+       fprintf (stderr, "\n");
+#endif
+    }
+    else
+#ifdef BRIDGE
+       (void) sprintf (ftam_error + strlen (ftam_error), "%s: failed\n",
+                       event);
+    if (verbose)
+       advise (NULLCP, "%s", ftam_error);
+#else
+       fprintf (stderr, "%s: failed\n", event);
+#endif
+    ftam_diag (fta -> fta_diags, fta -> fta_ndiag, fta -> fta_peer,
+               FACTION_PERM);
+
+    if (fta -> fta_action == FACTION_PERM) {
+       ftamfd = NOTOK;
+       if (rcwd) {
+           free (rcwd);
+           rcwd = NULL;
+       }
+    }
+}
+
+/* \f */
+
+void   ftam_chrg (charges)
+register struct FTAMcharging *charges;
+{
+    register int    i;
+    char   *cp;
+    register struct fc_charge  *fc;
+
+    cp = "charging information:\n    %s: %d %s\n";
+    for (fc = charges -> fc_charges, i = charges -> fc_ncharge - 1;
+           i >= 0;
+           fc++, i--, cp = "    %s: %d %s\n")
+#ifdef BRIDGE
+       (void) sprintf (ftam_error, cp, fc -> fc_resource, fc -> fc_value,
+                       fc -> fc_unit);
+       advise (NULLCP, "%s", ftam_error);
+#else
+       printf (cp, fc -> fc_resource, fc -> fc_value, fc -> fc_unit);
+#endif
+}
+
+/* \f */
+
+static char *entity[] = {
+    "unknown",
+    "initiator",
+    "initiator's FPM",
+    "virtual filestore",
+    "responder's FPM",
+    "responder"
+};
+
+
+void   ftam_diag (diag, ndiag, peer, action)
+struct FTAMdiagnostic diag[];
+int    ndiag;
+int    peer,
+       action;
+{
+    register int    i;
+    int     didit;
+    register struct FTAMdiagnostic *dp;
+
+#ifdef BRIDGE
+    ftam_error[0] = NULL;
+#endif
+    for (dp = diag, i = ndiag - 1; i >= 0; dp++, i--) {
+       if (dp -> ftd_identifier != FS_GEN_NOREASON) {
+#ifdef BRIDGE
+           (void) sprintf (ftam_error + strlen (ftam_error),
+                           "%s", FErrString (dp -> ftd_identifier));
+#else
+           printf ("%s", FErrString (dp -> ftd_identifier));
+#endif
+           if (dp -> ftd_cc > 0)
+#ifdef BRIDGE
+               (void) sprintf (ftam_error + strlen (ftam_error),
+                               ": %*.*s", dp -> ftd_cc, dp -> ftd_cc,
+                               dp -> ftd_data);
+#else
+               printf (": %*.*s", dp -> ftd_cc, dp -> ftd_cc, dp -> ftd_data);
+#endif
+       }
+       else
+           if (dp -> ftd_cc > 0)
+#ifdef BRIDGE
+               (void) sprintf (ftam_error + strlen (ftam_error),
+                               "%*.*s", dp -> ftd_cc, dp -> ftd_cc,
+                               dp -> ftd_data);
+#else
+               printf ("%*.*s", dp -> ftd_cc, dp -> ftd_cc, dp -> ftd_data);
+#endif
+
+#ifdef BRIDGE
+       advise (NULLCP, "%s", ftam_error);
+#else
+       printf ("\n");
+#endif
+
+       didit = 0;
+       switch (dp -> ftd_type) {
+           case DIAG_INFORM: 
+               if (action == FACTION_SUCCESS)
+                   break;
+               didit++;
+#ifdef BRIDGE
+               (void) sprintf (ftam_error + strlen (ftam_error),
+                               "    type informative");
+#else
+               printf ("    type informative");
+#endif
+               break;
+
+           case DIAG_TRANS: 
+               didit++;
+#ifdef BRIDGE
+               (void) sprintf (ftam_error + strlen (ftam_error),
+                               "    type transient");
+#else
+               printf ("    type transient");
+#endif
+               break;
+
+           case DIAG_PERM: 
+               if (dp -> ftd_observer == EREF_IFSU)
+                   ftamfd = NOTOK;
+               if (action != FACTION_SUCCESS)
+                   break;
+               didit++;
+#ifdef BRIDGE
+               (void) sprintf (ftam_error + strlen (ftam_error),
+                               "    type permanent");
+#else
+               printf ("    type permanent");
+#endif
+               break;
+
+           default: 
+               didit++;
+#ifdef BRIDGE
+               (void) sprintf (ftam_error + strlen (ftam_error),
+                               "    type %d", dp -> ftd_type);
+#else
+               printf ("    type %d", dp -> ftd_type);
+#endif
+               break;
+       }
+
+       switch (dp -> ftd_observer) {
+           case EREF_IFSU: 
+               goto print_it;
+
+           case EREF_IFPM: 
+               if (peer)
+                   goto print_it;
+               break;
+
+           case EREF_RFSU: 
+               if (peer)
+                   break;      /* else fall */
+           case EREF_RFPM: 
+       print_it: ;
+#ifdef BRIDGE
+               (void) sprintf (ftam_error + strlen (ftam_error),
+                               "%sobserver %s", didit++ ? ", " : "    ",
+                               entity[dp -> ftd_observer]);
+#else
+               printf ("%sobserver %s", didit++ ? ", " : "    ",
+                       entity[dp -> ftd_observer]);
+#endif
+               break;
+
+           default: 
+#ifdef BRIDGE
+               (void) sprintf (ftam_error + strlen (ftam_error),
+                               "%sobserver %d", didit++ ? ", " : "    ",
+                               dp -> ftd_observer);
+#else
+               printf ("%sobserver %d", didit++ ? ", " : "    ",
+                       dp -> ftd_observer);
+#endif
+               break;
+       }
+
+       switch (dp -> ftd_source) {
+           case EREF_NONE: 
+           case EREF_IFSU: 
+               break;
+
+           case EREF_SERV: 
+           case EREF_RFSU: 
+               if (peer)
+                   break;      /* else fall */
+           case EREF_IFPM: 
+           case EREF_RFPM: 
+#ifdef BRIDGE
+               (void) sprintf (ftam_error + strlen (ftam_error),
+                               "%ssource %s", didit++ ? ", " : "    ",
+                               entity[dp -> ftd_source]);
+#else
+               printf ("%ssource %s", didit++ ? ", " : "    ",
+                       entity[dp -> ftd_source]);
+#endif
+               break;
+
+           default: 
+#ifdef BRIDGE
+               (void) sprintf (ftam_error + strlen (ftam_error),
+                               "%ssource %d", didit++ ? ", " : "    ",
+                               dp -> ftd_source);
+#else
+               printf ("%ssource %d", didit++ ? ", " : "    ",
+                       dp -> ftd_source);
+#endif
+               break;
+       }
+
+       if (dp -> ftd_delay != DIAG_NODELAY)
+#ifdef BRIDGE
+           (void) sprintf (ftam_error + strlen (ftam_error),
+                           "%ssuggested-delay %d", didit++ ? ", " : "    ",
+                           dp -> ftd_delay);
+#else
+           printf ("%ssuggested-delay %d", didit++ ? ", " : "    ",
+                   dp -> ftd_delay);
+#endif
+
+#ifndef        BRIDGE
+       if (didit)
+           printf ("\n");
+#endif
+    }
+#ifdef BRIDGE
+    if (ftam_error[0])
+       advise (NULLCP, "%s", ftam_error);
+#endif
+}
+
+/* \f   MISCELLANY */
+
+rcinit ()
+{
+#ifndef        BRIDGE
+    register int    w;
+    register char **cp;
+    register struct dispatch   *ds;
+    register struct var *v;
+#endif
+    register struct isodocument *id;
+    register struct vfsmap *vf;
+
+#ifndef        BRIDGE
+    if ((myhome = getenv ("HOME")) == NULL)
+       myhome = ".";           /* could do passwd search... */
+
+    if ((myuser = getenv ("USER")) == NULLCP)
+       myuser = getenv ("LOGNAME");
+#endif
+
+    for (vf = vfs + 1; vf -> vf_entry; vf++)   /* skip "default" entry */
+       if (id = getisodocumentbyentry (vf -> vf_entry)) {
+           if ((vf -> vf_oid = oid_cpy (id -> id_type)) == NULLOID)
+               adios (NULLCP, "out of memory");
+       }
+       else
+           if (vf -> vf_flags & VF_WARN)
+               advise (NULLCP,
+                   "warning: local realstore has no support for %ss (%s)",
+                   vf -> vf_text, vf -> vf_entry);
+
+    bzero ((char *) &myqos, sizeof myqos);
+    myqos.qos_sversion = 2;
+
+#ifndef        BRIDGE
+    for (ds = dispatches, helpwidth = 0; ds -> ds_name; ds++)
+       if ((w = strlen (ds -> ds_name)) > helpwidth)
+           helpwidth = w;
+
+    userdn = strdup ("");
+    for (v = vars, varwidth1 = 0; v -> v_name; v++) {
+       if ((w = strlen (v -> v_name)) > varwidth1)
+           varwidth1 = w;
+
+       if (v -> v_value) {
+           if (cp = v -> v_dvalue) {
+               if (v -> v_mask) {
+#ifdef notdef
+                   w = 1;
+                   while (*++cp)
+                       w <<= 1;
+                   w--;
+                   if ((w = strlen (sprintb (w, v -> v_mask))) > varwidth2)
+                       varwidth2 = w;
+#endif
+               }
+               else
+                   for (; *cp; cp++)
+                       if ((w = strlen (*cp)) > varwidth2)
+                           varwidth2 = w;
+           }
+       }
+       else
+           if (*v -> v_dvalue) {
+               *v -> v_dvalue = strdup (*v -> v_dvalue);
+               if ((w = strlen (*v -> v_dvalue) + 2) > varwidth2)
+                   varwidth2 = w;
+           }
+    }
+#endif
+}
+
+
+#ifndef        TIOCGWINSZ
+/* ARGSUSED */
+#endif
+
+int    ncols (fp)
+FILE *fp;
+{
+#ifdef TIOCGWINSZ
+    int            i;
+    struct winsize ws;
+
+    if (ioctl (fileno (fp), TIOCGWINSZ, (char *) &ws) != NOTOK
+           && (i = ws.ws_col) > 0)
+       return i;
+#endif
+
+    return 80;
+}
+
+/* \f */
+
+#ifndef        NBBY
+#define        NBBY    8
+#endif
+
+
+#ifndef        TMS
+timer (cc, action)
+int     cc;
+char   *action;
+{
+    long    ms;
+    float   bs;
+    struct timeval  stop,
+                    td;
+    static struct timeval   start;
+
+    if (cc == 0) {
+       (void) gettimeofday (&start, (struct timezone *) 0);
+       return;
+    }
+    else
+       (void) gettimeofday (&stop, (struct timezone  *) 0);
+
+    tvsub (&td, &stop, &start);
+    ms = (td.tv_sec * 1000) + (td.tv_usec / 1000);
+    bs = (((float) cc * NBBY * 1000) / (float) (ms ? ms : 1)) / NBBY;
+
+    advise (NULLCP, "%d bytes %s in %d.%02d seconds (%.2f Kbytes/s)",
+           cc, action, td.tv_sec, td.tv_usec / 10000, bs / 1024);
+}
+
+
+static  tvsub (tdiff, t1, t0)
+register struct timeval *tdiff,
+                       *t1,
+                       *t0;
+{
+
+    tdiff -> tv_sec = t1 -> tv_sec - t0 -> tv_sec;
+    tdiff -> tv_usec = t1 -> tv_usec - t0 -> tv_usec;
+    if (tdiff -> tv_usec < 0)
+       tdiff -> tv_sec--, tdiff -> tv_usec += 1000000;
+}
+
+#else
+#ifndef        HZ
+#define        HZ      60
+#endif
+
+
+long   times ();
+
+
+timer (cc, action)
+int    cc;
+char   *action;
+{
+    long    ms;
+    float   bs;
+    long    stop,
+           td,
+           secs,
+           msecs;
+    struct tms tm;
+    static long start;
+
+    if (cc == 0) {
+       start = times (&tm);
+       return;
+    }
+    else
+       stop = times (&tm);
+
+    td = stop - start;
+    secs = td / HZ, msecs = (td % HZ) * 1000 / HZ;
+    ms = (secs * 1000) +  msecs;
+    bs = (((float) cc * NBBY * 1000) / (float) (ms ? ms : 1)) / NBBY;
+    
+    advise (NULLCP, "%d bytes %s in %d.%02d seconds (%.2f Kbytes/s)",
+           cc, action, secs, msecs / 10, bs / 1024);
+}
+#endif
+
+/* \f */
+
+#ifdef BRIDGE
+/* FTP TYPE Function */
+
+#include <arpa/ftp.h>
+
+f_type (mode)
+int    mode;
+{
+    switch(mode) {
+        case TYPE_A:
+           tmode = VFS_UTF;
+           return OK;
+           
+       case TYPE_I:
+       case TYPE_L:
+           tmode = VFS_UBF;
+           return OK;
+           
+       case TYPE_E:
+       default:
+           return NOTOK;
+       }
+}
+#endif
diff --git a/usr/src/contrib/isode/ftam2/ftamuser.h b/usr/src/contrib/isode/ftam2/ftamuser.h
new file mode 100644 (file)
index 0000000..7a6b5ff
--- /dev/null
@@ -0,0 +1,181 @@
+/* ftamuser.h - include file for interactive FTAM initiator */
+
+/* 
+ * $Header: /f/osi/ftam2/RCS/ftamuser.h,v 7.5 91/02/22 09:24:14 mrose Interim $
+ *
+ *
+ * $Log:       ftamuser.h,v $
+ * Revision 7.5  91/02/22  09:24:14  mrose
+ * Interim 6.8
+ * 
+ * Revision 7.4  90/12/23  18:40:24  mrose
+ * update
+ * 
+ * Revision 7.3  90/11/21  11:30:59  mrose
+ * sun
+ * 
+ * Revision 7.2  90/09/07  11:14:13  mrose
+ * update
+ * 
+ * Revision 7.1  90/07/09  14:37:30  mrose
+ * sync
+ * 
+ * Revision 7.0  89/11/23  21:54:45  mrose
+ * Release 6.0
+ * 
+ */
+
+/*
+ *                               NOTICE
+ *
+ *    Acquisition, use, and distribution of this module and related
+ *    materials are subject to the restrictions of a license agreement.
+ *    Consult the Preface in the User's Manual for the full terms of
+ *    this agreement.
+ *
+ */
+
+
+#include "ftamsbr.h"
+
+/* \f   MAIN */
+
+extern int  ontty;
+extern int  interrupted;
+
+void   adios (), advise ();
+#ifndef        BRIDGE
+int    ask (), getline ();
+#endif
+char   *strdup ();
+
+/* \f   DATA */
+
+extern int  ftamfd;
+#ifdef BRIDGE
+extern int  dataconn ();
+#endif
+
+extern char *host;
+extern char *user;
+extern char *account;
+#ifndef        BRIDGE
+extern char *userdn;
+extern char *storename;
+#endif
+
+extern int  bell;
+extern int  concurrency;       /* Olivier Dubois */
+extern int  debug;
+extern int  globbing;
+extern int  hash;
+extern int  marks;
+extern int  omode;
+extern int  query;
+extern int  runcom;
+extern int  tmode;
+extern int  trace;
+extern int  verbose;
+extern int  watch;
+
+extern char *myhome;
+extern char *myuser;
+
+extern int  realstore;
+#define        RFS_UNKNOWN     0
+#define        RFS_UNIX        1
+
+extern char *rs_unknown;
+extern char *rs_support;
+
+
+extern char *rcwd;
+
+extern struct QOStype myqos;
+
+
+char   *str2file ();
+
+/* \f   DISPATCH */
+
+struct dispatch {
+    char   *ds_name;
+    IFP            ds_fnx;
+
+    int            ds_flags;
+#define        DS_NULL         0x00
+#define        DS_OPEN         0x01    /* association required */
+#define        DS_CLOSE        0x02    /* association avoided */
+#define        DS_MODES        0x04    /* class/units meaningful */
+
+    int            ds_class;
+    int            ds_units;
+
+    char   *ds_help;
+};
+
+
+struct dispatch *getds ();
+
+/* \f   FTAM */
+
+#define        UMASK   "\020\01READ\02WRITE\03ACCESS\04LIMITED\05ENHANCED\06GROUPING\
+\07RECOVERY\08RESTART"
+
+
+extern OID context;
+extern int fqos;
+extern int class;
+extern int units;
+extern int attrs;
+extern int fadusize;
+
+
+extern struct vfsmap vfs[];    /* ordering depends on char *tmodes[] */
+#define        VFS_DEF 0               /* try to default it */
+#define        VFS_UBF 1               /* offset to unstructured binary file */
+#define        VFS_UTF 2               /*   ..      unstructured text file */
+#define        VFS_FDF 3               /*   ..      file directory file */
+
+extern struct vfsmap *myvf;
+
+
+void   ftam_advise (), ftam_chrg (), ftam_diag (), ftam_watch ();
+
+/* \f   FILES */
+
+struct filent {
+    char   *fi_name;
+    OID            fi_oid;
+
+    char   *fi_entry;
+
+    struct filent *fi_next;
+};
+
+extern int  toomany;
+
+extern int  nfilent;
+extern struct filent *filents;
+
+
+int    fdffnx ();
+
+/* \f   GLOB */
+
+extern int   xglobbed;
+extern char *globerr;
+
+int    blkfree (), blklen ();
+char  **blkcpy ();
+
+char   *xglob1val ();
+char  **xglob ();
+
+/* \f */
+
+extern int  errno;
+extern char *isodeversion;
+#ifdef BRIDGE
+extern char ftam_error[];
+#endif
diff --git a/usr/src/contrib/isode/ftam2/ftamusers.5 b/usr/src/contrib/isode/ftam2/ftamusers.5
new file mode 100644 (file)
index 0000000..ff1f713
--- /dev/null
@@ -0,0 +1,21 @@
+.TH FTAMUSERS 5 "16 Nov 1988"
+.\" $Header: /f/osi/ftam2/RCS/ftamusers.5,v 7.1 91/02/22 09:24:15 mrose Interim $
+.\"
+.\"
+.\" $Log:      ftamusers.5,v $
+.\" Revision 7.1  91/02/22  09:24:15  mrose
+.\" Interim 6.8
+.\" 
+.\" Revision 7.0  89/11/23  21:54:46  mrose
+.\" Release 6.0
+.\" 
+.SH NAME
+ftamusers \- list of users prohibited by ftam
+.SH SYNOPSIS
+.B \*(EDftamusers
+.SH DESCRIPTION
+The \fIftamusers\fR file contains a list of users who cannot access
+this system using the  \fIftam\fR\0(1c) program.
+This file contains one user name per line.
+.SH "SEE ALSO"
+ftam(1C), ftamd(8C)
diff --git a/usr/src/contrib/isode/ftam2/make b/usr/src/contrib/isode/ftam2/make
new file mode 100644 (file)
index 0000000..d861596
--- /dev/null
@@ -0,0 +1,7 @@
+: run this script through /bin/sh
+M=/bin/make
+if [ -f /usr/bin/make ]; then
+    M=/usr/bin/make
+fi
+
+exec $M TOPDIR=../ -f ../config/CONFIG.make -f Makefile ${1+"$@"}
diff --git a/usr/src/contrib/isode/ftp-ftam/Makefile b/usr/src/contrib/isode/ftp-ftam/Makefile
new file mode 100644 (file)
index 0000000..8ecf0a8
--- /dev/null
@@ -0,0 +1,172 @@
+###############################################################################
+#   Instructions to Make, for compilation of MITRE FTP/FTAM gateway
+###############################################################################
+
+###############################################################################
+#
+# $Header: /f/osi/ftp-ftam/RCS/Makefile,v 7.5 91/02/22 09:24:18 mrose Interim $
+#
+#
+# $Log:        Makefile,v $
+# Revision 7.5  91/02/22  09:24:18  mrose
+# Interim 6.8
+# 
+# Revision 7.4  90/12/23  18:40:26  mrose
+# update
+# 
+# Revision 7.3  90/07/09  14:37:34  mrose
+# sync
+# 
+# Revision 7.2  90/07/01  21:03:42  mrose
+# pepsy
+# 
+# Revision 7.1  90/03/15  11:17:55  mrose
+# quipu-sync
+# 
+# Revision 7.0  89/11/23  21:55:18  mrose
+# Release 6.0
+# 
+###############################################################################
+
+###############################################################################
+#
+#                               NOTICE
+#
+#    Acquisition, use, and distribution of this module and related
+#    materials are subject to the restrictions of a license agreement.
+#    Consult the Preface in the User's Manual for the full terms of
+#    this agreement.
+#
+###############################################################################
+
+
+###############################################################################
+# Generation Rules for program modules
+###############################################################################
+
+PEPYPATH=      -DPEPYPATH
+
+.SUFFIXES:     .py .c .o
+
+.c.o:;         $(CC) $(CFLAGS) -DBRIDGE -I$(FTAM) -c $*.c
+
+
+###############################################################################
+# Programs and Libraries
+###############################################################################
+
+LIBES  =       $(TOPDIR)libftam.a $(TOPDIR)libisode.a
+LLIBS  =       $(TOPDIR)llib-lftam $(TOPDIR)llib-lisode
+
+
+###############################################################################
+# Files
+###############################################################################
+
+FTAM   =       $(TOPDIR)ftam2/
+HFILES =       $(FTAM)ftamuser.h $(FTAM)ftamsbr.h $(FTAM)DOCS-types.h
+CFILES =       $(FTAM)ftam.c $(FTAM)ftamuser.c $(FTAM)ftam-assoc.c \
+                       $(FTAM)ftam-dir.c $(FTAM)ftam-get.c \
+                       $(FTAM)ftam-glob.c $(FTAM)ftam-ls.c \
+                       $(FTAM)ftam-mgmt.c $(FTAM)ftam-put.c $(FTAM)ftamsbr.c
+OFILES =       ftam.o ftamuser.o ftam-assoc.o ftam-dir.o ftam-get.o \
+                       ftam-glob.o ftam-ls.o ftam-mgmt.o ftam-put.o \
+                       ftamsbr.o
+DOCS-O =       $(FTAM)DOCS_tables.o
+DOCS-C =       $(FTAM)DOCS_tables.c
+
+
+##################################################################
+# Here it is...
+##################################################################
+
+all:           ftpd-ftam
+inst-all:      inst-ftpd-ftam manuals
+install:       inst-all clean
+lint:          l-ftpd-ftam
+
+
+##################################################################
+# ftpd-ftam
+##################################################################
+
+inst-ftpd-ftam:        $(SBINDIR)in.ftpd-ftam
+
+$(SBINDIR)in.ftpd-ftam:        xftpd-ftam
+               -cp $@ zxftpd-ftam
+               -rm -f $@
+               cp xftpd-ftam $@
+               -@ls -gls $@
+               -@echo ""
+
+ftpd-ftam:     xftpd-ftam
+
+xftpd-ftam:    ftpd.o ftpcmd.o vers.o $(OFILES) $(DOCS-O) $(LIBES)
+               $(LDCC) $(LDFLAGS) -o $@ ftpd.o ftpcmd.o vers.o $(OFILES) \
+                       $(DOCS-O) $(LIBES) $(LSOCKET)
+
+l-ftpd-ftam:   ftpcmd.c vers.c true
+               $(LINT) $(LFLAGS) -DBRIDGE -I$(FTAM) ftpd.c ftpcmd.c \
+                       vers.c $(CFILES) $(DOCS-C) $(LLIBS) \
+                       | grep -v "warning: possible pointer alignment problem"
+
+vers.o:                vers.c
+vers.c:                ftpd.c ftpcmd.y
+               sh newvers.sh
+
+ftam.o:                $(HFILES) $(FTAM)ftam.c
+               $(CC) $(CFLAGS) -DBRIDGE  -I$(FTAM) -c $(FTAM)ftam.c
+
+ftamuser.o:    $(HFILES) $(FTAM)ftamuser.c
+               $(CC) $(CFLAGS) -DBRIDGE  -I$(FTAM) -c $(FTAM)ftamuser.c
+
+ftam-assoc.o:  $(HFILES) $(FTAM)ftam-assoc.c
+               $(CC) $(CFLAGS) -DBRIDGE  -I$(FTAM) -c $(FTAM)ftam-assoc.c
+
+ftam-dir.o:    $(HFILES) $(FTAM)ftam-dir.c
+               $(CC) $(CFLAGS) -DBRIDGE  -I$(FTAM) -c $(FTAM)ftam-dir.c
+
+ftam-get.o:    $(HFILES) $(FTAM)ftam-get.c
+               $(CC) $(CFLAGS) -DBRIDGE  -I$(FTAM) -c $(FTAM)ftam-get.c
+
+ftam-glob.o:   $(HFILES) $(FTAM)ftam-glob.c
+               $(CC) $(CFLAGS) -DBRIDGE  -I$(FTAM) -c $(FTAM)ftam-glob.c
+
+ftam-ls.o:     $(HFILES) $(FTAM)ftam-ls.c
+               $(CC) $(CFLAGS) -DBRIDGE  -I$(FTAM) -c $(FTAM)ftam-ls.c
+
+ftam-mgmt.o:   $(HFILES) $(FTAM)ftam-mgmt.c
+               $(CC) $(CFLAGS) -DBRIDGE  -I$(FTAM) -c $(FTAM)ftam-mgmt.c
+
+ftam-put.o:    $(HFILES) $(FTAM)ftam-put.c
+               $(CC) $(CFLAGS) -DBRIDGE  -I$(FTAM) -c $(FTAM)ftam-put.c
+
+ftamsbr.o:     $(HFILES) $(FTAM)ftamsbr.c
+               $(CC) $(CFLAGS) -DBRIDGE  -I$(FTAM) -c $(FTAM)ftamsbr.c
+
+
+#################################################################
+# manual pages
+##################################################################
+
+MANUALS        =       ftpd-ftam.8c
+
+manuals:;      @$(UTILDIR)inst-man.sh $(MANOPTS) $(MANUALS)
+               -@echo ""
+
+
+##################################################################
+# clean
+##################################################################
+
+clean:;                rm -f *.o ftpcmd.c y.tab.h x* z* _* core vers.c
+
+grind:         ftpcmd.c vers.c true
+               iprint Makefile
+               tgrind -lc $(HFILES) ftpd.c ftpcmd.c vers.c
+               @echo $(MANUALS) | \
+                       tr " " "\012" | \
+                       sed -e "s%.*%itroff -man &%" | \
+                       sh -ve
+
+true:;
diff --git a/usr/src/contrib/isode/ftp-ftam/ftpcmd.y b/usr/src/contrib/isode/ftp-ftam/ftpcmd.y
new file mode 100644 (file)
index 0000000..ab0ed7e
--- /dev/null
@@ -0,0 +1,839 @@
+/* ftpcmd.y - grammar for FTP commands */
+
+/* 
+ * $Header: /f/osi/ftp-ftam/RCS/ftpcmd.y,v 7.1 91/02/22 09:24:20 mrose Interim $
+ *
+ * $Log:       ftpcmd.y,v $
+ * Revision 7.1  91/02/22  09:24:20  mrose
+ * Interim 6.8
+ * 
+ * Revision 7.0  89/11/23  21:55:19  mrose
+ * Release 6.0
+ * 
+ */
+
+/*
+ *                               NOTICE
+ *
+ *    Acquisition, use, and distribution of this module and related
+ *    materials are subject to the restrictions of a license agreement.
+ *    Consult the Preface in the User's Manual for the full terms of
+ *    this agreement.
+ *
+ */
+
+
+/*
+ *     Shamelessly taken from UCB
+ */
+
+/*
+ * Grammar for FTP commands.
+ * See RFC 765.
+ */
+
+%{
+
+#ifndef        lint
+static char *rcsid = "$Header: /f/osi/ftp-ftam/RCS/ftpcmd.y,v 7.1 91/02/22 09:24:20 mrose Interim $";
+#endif
+
+#include "config.h"
+#include "internet.h"
+
+#include <arpa/ftp.h>
+
+#include <stdio.h>
+#include <signal.h>
+#include <ctype.h>
+#include <pwd.h>
+#include <setjmp.h>
+#include "manifest.h"
+#include "general.h"
+void advise();
+time_t time ();
+
+extern struct sockaddr_in data_dest;
+extern int logged_in;
+extern int logging;
+extern int type;
+extern int form;
+extern int debug;
+extern int timeout;
+extern char hostname[];
+extern int usedefault;
+extern  char *osi_host;
+extern  char *ftp_user;
+extern  char *ftp_passwd;
+extern  char *ftp_account;
+extern  int verbose;
+
+static int cmd_type;
+static int cmd_form;
+static int cmd_bytesz;
+
+char   *index();
+char   *savestr();
+%}
+
+%token
+       A       B       C       E       F       I
+       L       N       P       R       S       T
+
+       SP      CRLF    COMMA   STRING  NUMBER
+
+       USER    PASS    ACCT    REIN    QUIT    PORT
+       PASV    TYPE    STRU    MODE    RETR    STOR
+       APPE    MLFL    MAIL    MSND    MSOM    MSAM
+       MRSQ    MRCP    ALLO    REST    RNFR    RNTO
+       ABOR    DELE    CWD     LIST    NLST    SITE
+       STAT    HELP    NOOP    XMKD    XRMD    XPWD
+       XCUP
+
+       LEXERR
+
+%start cmd_list
+
+%%
+
+cmd_list:      /* empty */
+       |       cmd_list cmd
+       ;
+
+cmd:           USER SP username CRLF
+               = {
+                       /* remote host information may appear in user
+                        * name as user@osihost.  Save user and hostname until
+                        * all neccessary information is gathered.
+                        */
+                       char *op;
+
+                       ftp_user = savestr((char*)$3);
+                       if (op = index (ftp_user, '@')) {
+                           *op++ = NULL;
+                           osi_host = op;
+                       }
+
+                       if (strcmp(ftp_user, "ftp") == 0 ||
+                         strcmp(ftp_user, "anonymous") == 0) {
+                               free(ftp_user);
+                               ftp_user = "ANON";
+                                       reply(331,
+                                 "Guest login ok, send ident as password.");
+                       } else if (checkuser(ftp_user)) {
+                               reply(331, "Password required for \"%s\".", $3);
+                       } else 
+                               reply(500,"User disallowed");
+                       free((char*)$3);
+               }
+       |       PASS SP password CRLF
+               = {
+                       /* Try and login. dologin() checks if it has
+                        * all the neccessary information to try and login.
+                        * Appropriate response codes are generated.
+                        */
+                       ftp_passwd = savestr((char*)$3);
+                       logged_in = dologin();
+                       free((char*)$3);
+               }
+       |       SITE SP osi_hostname CRLF
+               = {
+                       osi_host = savestr((char*)$3);
+                       logged_in = ftp_passwd ? dologin() : 0;
+                       free((char*)$3);
+               }
+       |       ACCT SP account CRLF
+               = {
+                       ftp_account = savestr((char*)$3);
+                       logged_in = dologin();
+                       free((char*)$3);
+               }
+       |       PORT SP host_port CRLF
+               = {
+                       usedefault = 0;
+                       ack((char*)$1);
+               }
+       |       TYPE SP type_code CRLF
+               = {
+                       /* The ISODE supports three file types:
+                        *      binary
+                        *      text
+                        *      directory
+                        * Binary and Text are selected here.  
+                        * Directory file types are used for LIST and NLST
+                        */
+                       switch (cmd_type) {
+
+                       case TYPE_A:
+                               if (cmd_form == FORM_N && 
+                                       f_type(TYPE_A) != NOTOK) {
+                                       reply(200, "Type set to A.");
+                                       type = cmd_type;
+                                       form = cmd_form;
+                               } else
+                                       reply(504, "TYPE set error.");
+                               break;
+
+                       case TYPE_E:
+                               reply(504, "Type E not implemented.");
+                               break;
+
+                       case TYPE_I:
+                               if (f_type(TYPE_I) == OK){
+                                       reply(200, "Type set to I.");
+                                       type = cmd_type;
+                               } else 
+                                       reply(504, "TYPE set error.");
+                               break;
+
+                       case TYPE_L:
+                               if (cmd_bytesz == 8 && f_type(TYPE_L) == OK) {
+                                       reply(200,
+                                           "Type set to L (byte size 8).");
+                                       type = cmd_type;
+                               } else
+                                       reply(504, "TYPE set error.");
+                       }
+               }
+       |       STRU SP struct_code CRLF
+               = {
+                       switch ($3) {
+
+                       case STRU_F:
+                               reply(200, "STRU F ok.");
+                               break;
+
+                       default:
+                               reply(502, "Unimplemented STRU type.");
+                       }
+               }
+       |       MODE SP mode_code CRLF
+               = {
+                       switch ($3) {
+
+                       case MODE_S:
+                               reply(200, "MODE S ok.");
+                               break;
+
+                       default:
+                               reply(502, "Unimplemented MODE type.");
+                       }
+               }
+       |       ALLO SP NUMBER CRLF
+               = {
+                       ack((char*)$1);
+               }
+       |       RETR check_login SP pathname CRLF
+               = {
+                       if ($2 && $4 != NULL)
+                               retrieve((char*)$4);
+                       if ($4 != NULL)
+                               free((char*)$4);
+               }
+       |       STOR check_login SP pathname CRLF
+               = {
+                       if ($2 && $4 != NULL)
+                               ftp_store((char*)$4, "w");
+                       if ($4 != NULL)
+                               free((char*)$4);
+               }
+       |       APPE check_login SP pathname CRLF
+               = {
+                       if ($2 && $4 != NULL)
+                               ftp_store((char *)$4, "a");
+                       if ($4 != NULL)
+                               free((char*)$4);
+               }
+       |       NLST check_login CRLF
+               = {
+                       if ($2)
+                               directory("NLST",".");
+               }
+       |       NLST check_login SP pathname CRLF
+               = {
+                       if ($2 && $4 != NULL)
+                               directory("NLST", (char*)$4);
+                       if ($4 != NULL)
+                               free((char*)$4);
+               }
+       |       LIST check_login CRLF
+               = {
+                       if ($2)
+                               directory("LIST", ".");
+               }
+       |       LIST check_login SP pathname CRLF
+               = {
+                       if ($2 && $4 != NULL)
+                               directory("LIST", (char*)$4);
+                       if ($4 != NULL)
+                               free((char*)$4);
+               }
+       |       DELE check_login SP pathname CRLF
+               = {
+                       if ($2 && $4 != NULL)
+                               ftp_delete((char*)$4);
+                       if ($4 != NULL)
+                               free((char*)$4);
+               }
+       |       rename_cmd
+       |       HELP CRLF
+               = {
+                       help((char*)0);
+               }
+       |       HELP SP STRING CRLF
+               = {
+                       help((char*)$3);
+               }
+       |       NOOP CRLF
+               = {
+                       ack((char*)$1);
+               }
+       |       XMKD check_login SP pathname CRLF
+               = {
+                       if ($2 && $4 != NULL)
+                               (void)makedir((char*)$4);
+                       if ($4 != NULL)
+                               free((char*)$4);
+               }
+       |       XRMD check_login SP pathname CRLF
+               = {
+                       if ($2 && $4 != NULL)
+                               removedir((char*)$4);
+                       if ($4 != NULL)
+                               free((char*)$4);
+               }
+       |       QUIT CRLF
+               = {
+                       dologout(0);
+               }
+       |       error CRLF
+               = {
+                       yyerrok;
+               }
+       ;
+
+username:      STRING
+       ;
+
+password:      STRING
+       ;
+
+osi_hostname:  STRING
+       ;
+account:       STRING
+       ;
+
+byte_size:     NUMBER
+       ;
+
+host_port:     NUMBER COMMA NUMBER COMMA NUMBER COMMA NUMBER COMMA 
+               NUMBER COMMA NUMBER
+               = {
+                       register char *a, *p;
+
+                       a = (char *)&data_dest.sin_addr;
+                       a[0] = $1; a[1] = $3; a[2] = $5; a[3] = $7;
+                       p = (char *)&data_dest.sin_port;
+                       p[0] = $9; p[1] = $11;
+                       data_dest.sin_family = AF_INET;
+               }
+       ;
+
+form_code:     N
+       = {
+               $$ = FORM_N;
+       }
+       |       T
+       = {
+               $$ = FORM_T;
+       }
+       |       C
+       = {
+               $$ = FORM_C;
+       }
+       ;
+
+type_code:     A
+       = {
+               cmd_type = TYPE_A;
+               cmd_form = FORM_N;
+       }
+       |       A SP form_code
+       = {
+               cmd_type = TYPE_A;
+               cmd_form = $3;
+       }
+       |       E
+       = {
+               cmd_type = TYPE_E;
+               cmd_form = FORM_N;
+       }
+       |       E SP form_code
+       = {
+               cmd_type = TYPE_E;
+               cmd_form = $3;
+       }
+       |       I
+       = {
+               cmd_type = TYPE_I;
+       }
+       |       L
+       = {
+               cmd_type = TYPE_L;
+               cmd_bytesz = 8;
+       }
+       |       L SP byte_size
+       = {
+               cmd_type = TYPE_L;
+               cmd_bytesz = $3;
+       }
+       /* this is for a bug in the BBN ftp */
+       |       L byte_size
+       = {
+               cmd_type = TYPE_L;
+               cmd_bytesz = $2;
+       }
+       ;
+
+struct_code:   F
+       = {
+               $$ = STRU_F;
+       }
+       |       R
+       = {
+               $$ = STRU_R;
+       }
+       |       P
+       = {
+               $$ = STRU_P;
+       }
+       ;
+
+mode_code:     S
+       = {
+               $$ = MODE_S;
+       }
+       |       B
+       = {
+               $$ = MODE_B;
+       }
+       |       C
+       = {
+               $$ = MODE_C;
+       }
+       ;
+
+pathname:      pathstring
+       = {
+                       $$ = $1;
+       }
+       ;
+
+pathstring:    STRING
+       ;
+
+rename_cmd:    rename_from rename_to
+       = {
+               if ($1 && $2)
+                       renamecmd((char*)$1, (char*)$2);
+               else
+                       reply(503, "Bad sequence of commands.");
+               if ($1)
+                       free((char*)$1);
+               if ($2)
+                       free((char*)$2);
+       }
+       ;
+
+rename_from:   RNFR check_login SP pathname CRLF
+       = {
+               char *from = 0, *renamefrom();
+
+               if ($2 && $4)
+                       from = renamefrom((char*)$4);
+               if (from == 0 && $4)
+                       free((char*)$4);
+               $$ = (int)from;
+       }
+       ;
+
+rename_to:     RNTO SP pathname CRLF
+       = {
+               $$ = $3;
+       }
+       ;
+
+check_login:   /* empty */
+       = {
+               if (logged_in)
+                       $$ = 1;
+               else {
+                       reply(530, "Please login with USER and PASS.");
+                       $$ = 0;
+               }
+       }
+       ;
+
+%%
+
+extern jmp_buf errcatch;
+
+#define        CMD     0       /* beginning of command */
+#define        ARGS    1       /* expect miscellaneous arguments */
+#define        STR1    2       /* expect SP followed by STRING */
+#define        STR2    3       /* expect STRING */
+#define        OSTR    4       /* optional STRING */
+
+struct tab {
+       char    *name;
+       short   token;
+       short   state;
+       short   implemented;    /* 1 if command is implemented */
+       char    *help;
+};
+
+struct tab cmdtab[] = {                /* In order defined in RFC 765 */
+       { "USER", USER, STR1, 1,        "<sp> username" },
+       { "PASS", PASS, STR1, 1,        "<sp> password" },
+       { "ACCT", ACCT, STR1, 1,        "(specify account)" },
+       { "REIN", REIN, ARGS, 0,        "(reinitialize server state)" },
+       { "QUIT", QUIT, ARGS, 1,        "(terminate service)", },
+       { "PORT", PORT, ARGS, 1,        "<sp> b0, b1, b2, b3, b4" },
+       { "PASV", PASV, ARGS, 0,        "(set server in passive mode)" },
+       { "TYPE", TYPE, ARGS, 1,        "<sp> [ A | E | I | L ]" },
+       { "STRU", STRU, ARGS, 1,        "(specify file structure)" },
+       { "MODE", MODE, ARGS, 1,        "(specify transfer mode)" },
+       { "RETR", RETR, STR1, 1,        "<sp> file-name" },
+       { "STOR", STOR, STR1, 1,        "<sp> file-name" },
+       { "APPE", APPE, STR1, 1,        "<sp> file-name" },
+       { "MLFL", MLFL, OSTR, 0,        "(mail file)" },
+       { "MAIL", MAIL, OSTR, 0,        "(mail to user)" },
+       { "MSND", MSND, OSTR, 0,        "(mail send to terminal)" },
+       { "MSOM", MSOM, OSTR, 0,        "(mail send to terminal or mailbox)" },
+       { "MSAM", MSAM, OSTR, 0,        "(mail send to terminal and mailbox)" },
+       { "MRSQ", MRSQ, OSTR, 0,        "(mail recipient scheme question)" },
+       { "MRCP", MRCP, STR1, 0,        "(mail recipient)" },
+       { "ALLO", ALLO, ARGS, 1,        "allocate storage (vacuously)" },
+       { "REST", REST, STR1, 0,        "(restart command)" },
+       { "RNFR", RNFR, STR1, 1,        "<sp> file-name" },
+       { "RNTO", RNTO, STR1, 1,        "<sp> file-name" },
+       { "ABOR", ABOR, ARGS, 0,        "(abort operation)" },
+       { "DELE", DELE, STR1, 1,        "<sp> file-name" },
+       /* Most directory oriented commands (except XMKD and XRMD) are
+        * not supported.  The ISODE FTAM requires more knowledge
+        * about the remote filesystem type than is available through FTP.
+        */
+       { "CWD",  CWD,  OSTR, 0,        "[ <sp> directory-name]" },
+       { "XCWD", CWD,  OSTR, 0,        "[ <sp> directory-name ]" },
+       { "LIST", LIST, OSTR, 1,        "[ <sp> path-name ]" },
+       { "NLST", NLST, OSTR, 1,        "[ <sp> path-name ]" },
+       { "SITE", SITE, STR1, 1,        "(get site parameters)" },
+       { "STAT", STAT, OSTR, 0,        "(get server status)" },
+       { "HELP", HELP, OSTR, 1,        "[ <sp> <string> ]" },
+       { "NOOP", NOOP, ARGS, 1,        "" },
+       { "XMKD", XMKD, STR1, 1,        "<sp> path-name" },
+       { "XRMD", XRMD, STR1, 1,        "<sp> path-name" },
+       { "XPWD", XPWD, ARGS, 0,        "(return current directory)" },
+       { "XCUP", XCUP, ARGS, 0,        "(change to parent directory)" },
+       { NULL,   0,    0,    0,        0 }
+};
+
+struct tab *
+lookup(cmd)
+       char *cmd;
+{
+       register struct tab *p;
+
+       for (p = cmdtab; p->name != NULL; p++)
+               if (strcmp(cmd, p->name) == 0)
+                       return (p);
+       return (0);
+}
+
+#include <arpa/telnet.h>
+
+/*
+ * getline - a hacked up version of fgets to ignore TELNET escape codes.
+ */
+char *
+getline(s, n, iop)
+       char *s;
+       register FILE *iop;
+{
+       register c;
+       register char *cs;
+
+       cs = s;
+       while (--n > 0 && (c = getc(iop)) >= 0) {
+               while (c == IAC) {
+                       c = getc(iop);  /* skip command */
+                       c = getc(iop);  /* try next char */
+               }
+               *cs++ = c;
+               if (c=='\n')
+                       break;
+       }
+       if (c < 0 && cs == s)
+               exit(1);
+       *cs++ = '\0';
+       if (verbose)
+               advise (NULLCP, "---> %s", s);
+       return (s);
+}
+
+static SFD
+toolong()
+{
+       long now;
+       extern char *ctime();
+
+       reply(421,
+         "Timeout (%d seconds): closing control connection.", timeout);
+       (void)time(&now);
+       if (logging)
+               advise(NULLCP,
+                       "user %s timed out after %d seconds at %s",
+                       ftp_user, timeout, ctime(&now));
+       dologout(1);
+}
+
+yylex()
+{
+       static char cbuf[512];
+       static int cpos, state;
+       register char *cp;
+       register struct tab *p;
+       int n;
+       char c;
+
+       for (;;) {
+               switch (state) {
+
+               case CMD:
+                       (void)signal(SIGALRM, toolong);
+                       (void)alarm((unsigned)timeout);
+                       if (getline(cbuf, sizeof(cbuf)-1, stdin) == NULL) {
+                               dologout(0);
+                       }
+                       (void)alarm(0);
+                       if (index(cbuf, '\r')) {
+                               cp = index(cbuf, '\r');
+                               cp[0] = '\n'; cp[1] = 0;
+                       }
+                       if (index(cbuf, ' '))
+                               cpos = index(cbuf, ' ') - cbuf;
+                       else
+                               cpos = 4;
+                       c = cbuf[cpos];
+                       cbuf[cpos] = '\0';
+                       upper(cbuf);
+                       p = lookup(cbuf);
+                       cbuf[cpos] = c;
+                       if (p != 0) {
+                               if (p->implemented == 0) {
+                                       nack(p->name);
+                                       longjmp(errcatch,NOTOK);
+                                       /* NOTREACHED */
+                               }
+                               state = p->state;
+                               yylval = (int) p->name;
+                               return (p->token);
+                       }
+                       break;
+
+               case OSTR:
+                       if (cbuf[cpos] == '\n') {
+                               state = CMD;
+                               return (CRLF);
+                       }
+                       /* FALL THRU */
+
+               case STR1:
+                       if (cbuf[cpos] == ' ') {
+                               /* trim leading blanks */
+                               for(;cbuf[cpos] == ' ';cpos++);
+                               state = STR2;
+                               return (SP);
+                       }
+                       break;
+
+               case STR2:
+                       cp = &cbuf[cpos];
+                       n = strlen(cp);
+                       cpos += n - 1;
+                       /*
+                        * Make sure the string is nonempty and \n terminated.
+                        */
+                       if (n > 1 && cbuf[cpos] == '\n') {
+                               cbuf[cpos] = '\0';
+                               yylval = copy(cp);
+                               cbuf[cpos] = '\n';
+                               state = ARGS;
+                               return (STRING);
+                       }
+                       break;
+
+               case ARGS:
+                       if (isdigit(cbuf[cpos])) {
+                               cp = &cbuf[cpos];
+                               while (isdigit(cbuf[++cpos]))
+                                       ;
+                               c = cbuf[cpos];
+                               cbuf[cpos] = '\0';
+                               yylval = atoi(cp);
+                               cbuf[cpos] = c;
+                               return (NUMBER);
+                       }
+                       switch (cbuf[cpos++]) {
+
+                       case '\n':
+                               state = CMD;
+                               return (CRLF);
+
+                       case ' ':
+                               return (SP);
+
+                       case ',':
+                               return (COMMA);
+
+                       case 'A':
+                       case 'a':
+                               return (A);
+
+                       case 'B':
+                       case 'b':
+                               return (B);
+
+                       case 'C':
+                       case 'c':
+                               return (C);
+
+                       case 'E':
+                       case 'e':
+                               return (E);
+
+                       case 'F':
+                       case 'f':
+                               return (F);
+
+                       case 'I':
+                       case 'i':
+                               return (I);
+
+                       case 'L':
+                       case 'l':
+                               return (L);
+
+                       case 'N':
+                       case 'n':
+                               return (N);
+
+                       case 'P':
+                       case 'p':
+                               return (P);
+
+                       case 'R':
+                       case 'r':
+                               return (R);
+
+                       case 'S':
+                       case 's':
+                               return (S);
+
+                       case 'T':
+                       case 't':
+                               return (T);
+
+                       }
+                       break;
+
+               default:
+                       fatal("Unknown state in scanner.");
+               }
+               yyerror("");
+               state = CMD;
+               longjmp(errcatch,NOTOK);
+       }
+}
+
+upper(s)
+       char *s;
+{
+       while (*s != '\0') {
+               if (islower(*s))
+                       *s = toupper(*s);
+               s++;
+       }
+}
+
+copy(s)
+       char *s;
+{
+       char *p;
+       extern char *malloc();
+
+       p = malloc((unsigned) (strlen(s) + 1));
+       if (p == NULL)
+               fatal("Ran out of memory.");
+       (void)strcpy(p, s);
+       return ((int)p);
+}
+
+help(s)
+       char *s;
+{
+       register struct tab *c;
+       register int width, NCMDS;
+
+       width = 0, NCMDS = 0;
+       for (c = cmdtab; c->name != NULL; c++) {
+               int len = strlen(c->name);
+
+               if (c->implemented == 0)
+                       len++;
+               if (len > width)
+                       width = len;
+               NCMDS++;
+       }
+       width = (width + 8) &~ 7;
+       if (s == 0) {
+               register int i, j, w;
+               int columns, lines;
+
+               lreply(214,
+         "The following commands are recognized (* =>'s unimplemented).");
+               columns = 76 / width;
+               if (columns == 0)
+                       columns = 1;
+               lines = (NCMDS + columns - 1) / columns;
+               for (i = 0; i < lines; i++) {
+                       printf("    ");
+                       for (j = 0; j < columns; j++) {
+                               c = cmdtab + j * lines + i;
+                               printf("%s%c", c->name,
+                                       c->implemented ? ' ' : '*');
+                               if (c + lines >= &cmdtab[NCMDS])
+                                       break;
+                               w = strlen(c->name);
+                               while (w < width) {
+                                       putchar(' ');
+                                       w++;
+                               }
+                       }
+                       printf("\r\n");
+               }
+               (void)fflush(stdout);
+               reply(214, "Direct comments to ftp-bugs@%s.", hostname);
+               return;
+       }
+       upper(s);
+       c = lookup(s);
+       if (c == (struct tab *)0) {
+               reply(504, "Unknown command %s.", s);
+               return;
+       }
+       if (c->implemented)
+               reply(214, "Syntax: %s %s", c->name, c->help);
+       else
+               reply(214, "%-*s\t%s; unimplemented.", width, c->name, c->help);
+}
diff --git a/usr/src/contrib/isode/ftp-ftam/ftpd-ftam.8c b/usr/src/contrib/isode/ftp-ftam/ftpd-ftam.8c
new file mode 100644 (file)
index 0000000..a0eacb5
--- /dev/null
@@ -0,0 +1,61 @@
+.TH FTPD-FTAM 8C "16 Jun 1988"
+.\" $Header: /f/osi/ftp-ftam/RCS/ftpd-ftam.8c,v 7.1 91/02/22 09:24:22 mrose Interim $
+.\"
+.\"
+.\" $Log:      ftpd-ftam.8c,v $
+.\" Revision 7.1  91/02/22  09:24:22  mrose
+.\" Interim 6.8
+.\" 
+.\" Revision 7.0  89/11/23  21:55:20  mrose
+.\" Release 6.0
+.\" 
+.SH NAME
+ftpd-ftam \- MITRE FTP/FTAM gateway
+.SH SYNOPSIS
+.in +.5i
+.ti -.5i
+.B \*(SDin.ftpd-ftam
+\%[host.socket]
+.in -.5i
+(under \fI\*(SDinetd\fR\0)
+.SH DESCRIPTION
+The \fIftpd-ftam\fR server appears to be the DARPA Internet File
+Transfer Protocol server process, but is really an FTP/FTAM gateway.
+See
+.IR ftpd (8C)
+for details on the FTP service.
+.PP
+When using \fIftp\fP with the MITRE FTP/FTAM gateway,
+the true destination is encoded in the user name (i.e., user@osi-host)
+or using the \fBftp\fP \fISITE\fP command.
+If further accounting information is required by the true destination,
+the \fIACCT\fP command is used separately and the \fISITE\fP command
+must be used to specify the destination.
+.PP
+Note that the FTP/FTAM gateway is currently available on a different port than
+the FTP service on the gateway.
+To select the FTP/FTAM gateway,
+tell your \fIftp\fR client program to connect to port \fB531\fR on the
+gateway host.
+For example, using \fIftp\fR\0(1c):
+.sp
+.nf
+.in +.5i
+% ftp
+ftp> open gateway 531
+Name (gateway:user): user@osihost
+Password:
+.in -.5i
+.fi
+.SH "SEE ALSO"
+ftp(1C), ftpusers(5), ftpd(8C)
+.SH AUTHORS
+Original version written by John A. Scott of the MITRE Corporation.
+Upgraded to \*(lqIS-level\*(rq by Philip B. Jelfs of the Wollongong Group.
+.SH BUGS
+\fBFtp\fP current directory commands (\fIcd\fP and \fIpwd\fP\|) are
+not supported by the gateway (there is no \fBFTAM\fP equivalent).
+.PP
+The daemon should implement a crude form of access control for
+accouting purposes
+(FTAM service might not be free in all environments).
diff --git a/usr/src/contrib/isode/ftp-ftam/ftpd.c b/usr/src/contrib/isode/ftp-ftam/ftpd.c
new file mode 100644 (file)
index 0000000..d886fb9
--- /dev/null
@@ -0,0 +1,644 @@
+/* ftpd.c - FTAM/FTP gateway */
+
+#ifndef        lint
+static char *rcsid = "$Header: /f/osi/ftp-ftam/RCS/ftpd.c,v 7.1 91/02/22 09:24:24 mrose Interim $";
+#endif
+
+/* 
+ * $Header: /f/osi/ftp-ftam/RCS/ftpd.c,v 7.1 91/02/22 09:24:24 mrose Interim $
+ *
+ * Author:     John A. Scott           <Scott@GATEWAY.MITRE.ORG>
+ *             The MITRE Corporation
+ *             Washington C3I Division
+ *             7525 Colshire Drive
+ *             Mclean, Virginia 22102
+ *             +1-703-883-5915
+ *
+ * $Log:       ftpd.c,v $
+ * Revision 7.1  91/02/22  09:24:24  mrose
+ * Interim 6.8
+ * 
+ * Revision 7.0  89/11/23  21:55:21  mrose
+ * Release 6.0
+ * 
+ */
+
+/*
+ *                               NOTICE
+ *
+ *     The MITRE Corporation (hereafter MITRE) makes this software available 
+ *     on an "as is" basis.  No guarantees, either explicit or implied, are 
+ *     given as to performance or suitability.  
+ *
+ */
+
+/*
+ *     Shamelessly taken from UCB
+ */
+
+/*
+ * FTP server.
+ */
+#include "config.h"
+#include <sys/param.h>
+#include <sys/stat.h>
+#include <sys/ioctl.h>
+#include <sys/socket.h>
+#include <sys/file.h>
+
+#include <netinet/in.h>
+
+#include <arpa/ftp.h>
+#include <arpa/inet.h>
+
+#include <stdio.h>
+#include <signal.h>
+#include <pwd.h>
+#include <setjmp.h>
+#include <netdb.h>
+#include <errno.h>
+#include "general.h"
+#include "manifest.h"
+#include "logger.h"
+extern LLog _ftam_log, *ftam_log;
+#include <varargs.h>
+
+char *ctime();
+time_t time();
+void adios (), advise ();
+
+/*
+ * File containing login names
+ * NOT to be used on this machine.
+ * Commonly used to disallow uucp.
+ */
+/*
+ * This may be rework to provide bridge access control. JAS
+ */
+#define        FTPUSERS        "/usr/etc/ftpusers"
+
+extern int errno;
+extern char *sys_errlist[];
+extern  char ftam_error[];
+extern char version[];
+
+struct sockaddr_in ctrl_addr;
+struct sockaddr_in data_source;
+struct sockaddr_in data_dest;
+struct sockaddr_in his_addr;
+
+int    data;
+jmp_buf        errcatch;
+int    logged_in;
+int    debug = 0;
+int    watch = 1;
+int    timeout;
+int    logging = 0;
+int    type;
+int    form;
+int    stru;                   /* avoid C keyword */
+int    mode;
+int    usedefault = 1;         /* for data transfers */
+char   hostname[32];
+char   remotehost[32];
+char   *osi_host = NULL;
+char   *ftp_user;
+char   *ftp_account;
+char   *ftp_passwd;
+int    verbose = 0;
+#define NVEC 100
+char *vec[NVEC];
+
+/*
+ * Timeout intervals for retrying connections
+ * to hosts that don't accept PORT cmds.  This
+ * is a kludge, but given the problems with TCP...
+ */
+#define        SWAITMAX        90      /* wait at most 90 seconds */
+#define        SWAITINT        5       /* interval between retries */
+
+int    swaitmax = SWAITMAX;
+int    swaitint = SWAITINT;
+
+SFD    lostconn();
+
+main(argc, argv)
+       int argc;
+       char *argv[];
+{
+       int     addrlen;
+       char *ptr, *index();
+       struct servent *sp;
+
+       isodetailor (ptr = argv[0], 0);
+       argc--, argv++;
+       if (verbose = isatty (fileno (stderr)))
+           ll_dbinit (ftam_log, ptr);
+       else {
+           ftam_log -> ll_stat &= ~LLOGCLS;
+           ll_hdinit (ftam_log, ptr);
+       }
+
+       advise (NULLCP, "starting");
+
+       addrlen = sizeof his_addr;
+       if (getpeername (0, (struct sockaddr *) &his_addr, &addrlen) == NOTOK)
+           adios ("failed", "getpeername");
+       sp = getservbyname("ftp", "tcp");
+       if (sp == 0) {
+               advise(NULLCP, "ftp/tcp: unknown service");
+abort();
+               exit(1);
+       }
+       ctrl_addr.sin_port = sp->s_port;
+       data_source.sin_port = htons(ntohs((u_short) sp->s_port) - 1);
+       (void)signal(SIGPIPE, lostconn);
+       (void)signal(SIGCHLD, SIG_IGN);
+       (void)dup2(0, 1);
+       /* do telnet option negotiation here */
+       /*
+        * Set up default state
+        */
+       rcinit(); /* FTAM state initialize */
+       logged_in = 0;
+       data = -1;
+       type = TYPE_A;
+       form = FORM_N;
+       stru = STRU_F;
+       mode = MODE_S;
+       addrlen = sizeof ctrl_addr;
+       if (getsockname(0, (struct sockaddr *) &ctrl_addr, &addrlen) == NOTOK)
+           adios ("failed", "getsockname");
+       (void)gethostname(hostname, sizeof (hostname));
+       ptr = index(hostname,'.'); /* strip off domain name */
+       if (ptr) *ptr = '\0';
+       reply(220, "%s FTP/FTAM gateway (%s) ready.",
+               hostname, version);
+       for (;;) {
+               (void)setjmp(errcatch);
+               (void)yyparse();
+       }
+}
+
+SFD
+lostconn()
+{
+
+       advise (NULLCP,"lost connection");
+       dologout(-1);
+}
+
+char *
+savestr(s)
+       char *s;
+{
+       char *malloc();
+       char *new = malloc((unsigned) (strlen(s) + 1));
+       
+       if (new != NULL)
+               (void)strcpy(new, s);
+       return (new);
+}
+
+retrieve(name)
+       char *name;
+{
+       int result;
+
+ /* FTAM file retrieval block function.  Return values:
+  * OK    -- file transfered without error
+  * NOTOK -- file transfer error
+  * DONE  -- Problem opening TCP connection for transfer
+  *          Error response made by dataconn routine.
+  */
+       vec[0] = "f_get";
+       vec[1] = name;
+       vec[2] = NULL;
+
+       if ((result = f_get(vec)) == NOTOK){
+               reply(550, "%s: %s.", name, ftam_error);
+       } else if (result == OK)
+               reply(226, "Transfer complete.");
+
+       data = -1;
+       return;
+}
+
+ftp_store(name, modeX)
+       char *name, *modeX;
+{
+       int result;
+/*
+ * f_put is FTAM file storage block function.  First arguement
+ * controls file overwrite or append selection.
+ * OK    -- file transfered without error
+ * NOTOK -- file transfer error
+ * DONE  -- Problem opening TCP connection for transfer
+ *          Error response made by dataconn routine.
+ */
+
+       vec[0] = strcmp(modeX,"a") ? "put" : "append";
+       vec[1] = name;
+       vec[2] = NULL;
+       if ((result = f_put(vec)) == NOTOK)
+               reply(550, "%s: %s.", name, ftam_error);
+       else if (result == OK)
+               reply(226, "Transfer complete.");
+       data = -1;
+}
+
+int
+getdatasock()
+{
+/* UCB data socket creation routine */
+       int s;
+#ifdef BSD43
+       int on = 1;
+#endif
+
+       if (data >= 0)
+               return (data);
+       s = socket(AF_INET, SOCK_STREAM, 0);
+       if (s < 0)
+               return (NOTOK);
+#ifndef        BSD43
+       if (setsockopt(s, SOL_SOCKET, SO_REUSEADDR, (char *) 0, 0) < 0)
+#else
+       if (setsockopt(s, SOL_SOCKET, SO_REUSEADDR, (char *) &on, sizeof on) < 0)
+#endif
+               goto bad;
+       /* anchor socket to avoid multi-homing problems */
+       data_source.sin_family = AF_INET;
+       data_source.sin_addr = ctrl_addr.sin_addr;
+       if (bind(s, (struct sockaddr *) &data_source, sizeof (data_source)) < 0)
+               goto bad;
+       return (s);
+bad:
+       (void)close(s);
+       return (NOTOK);
+}
+
+int
+dataconn(name)
+       char *name;
+{
+/* UCB data connection routine */
+       int retry = 0;
+
+       if (data >= 0) {
+               reply(125, "Using existing data connection for %s.",
+                   name);
+               usedefault = 1;
+               return (data);
+       }
+       if (usedefault)
+               data_dest = his_addr;
+       usedefault = 1;
+       data = getdatasock();
+       if (data == NOTOK){
+               reply(425, "Can't create data socket (%s,%d): %s.",
+                   inet_ntoa(data_source.sin_addr),
+                   ntohs(data_source.sin_port),
+                   sys_errlist[errno]);
+               return (NOTOK);
+       }
+       reply(150, "Opening data connection for %s (%s,%d).",
+           name, inet_ntoa(data_dest.sin_addr),
+           ntohs(data_dest.sin_port));
+       while (connect(data, (struct sockaddr *)&data_dest, sizeof (data_dest)) < 0) {
+               if (errno == EADDRINUSE && retry < swaitmax) {
+                       sleep((unsigned) swaitint);
+                       retry += swaitint;
+                       continue;
+               }
+               reply(425, "Can't build data connection: %s.",
+                   sys_errlist[errno]);
+               (void) close(data);
+               data = -1;
+               return (NOTOK);
+       }
+       return (data);
+}
+
+fatal(s)
+       char *s;
+{
+       reply(451, "Error in server: %s\n", s);
+       /* reply(221, "Closing connection due to server error.");*/
+       dologout(0);
+}
+
+#ifndef        lint
+reply(va_alist)
+va_dcl
+{
+    int        n;
+    va_list ap;
+
+    va_start (ap);
+
+    n = va_arg (ap, int);
+
+    _reply (n, ' ', ap);
+
+    va_end (ap);
+}
+
+lreply(va_alist)
+va_dcl
+{
+    int        n;
+    va_list ap;
+
+    va_start (ap);
+
+    n = va_arg (ap, int);
+
+    _reply (n, '-', ap);
+
+    va_end (ap);
+}
+
+static _reply (n, c, ap)
+int    n;
+char    c;
+va_list ap;
+{
+    char    buffer[BUFSIZ];
+
+    _asprintf (buffer, NULLCP, ap);
+
+    printf ("%d%c%s\r\n", n, c, buffer);
+    (void)fflush (stdout);
+
+    if (verbose)
+       advise (NULLCP,"<--- %d%c%s", n, c, buffer);
+}
+#else
+/* VARARGS2 */
+
+reply(n,fmt)
+int    n;
+char   *fmt;
+{
+    reply(n,fmt);
+}
+/* VARARGS2 */
+
+lreply(n,fmt)
+int    n;
+char   *fmt;
+{
+    lreply(n,fmt);
+}
+#endif
+
+replystr(s)
+       char *s;
+{
+       printf("%s\r\n", s);
+       (void)fflush(stdout);
+       if (verbose)
+           advise(NULLCP,"<--- %s", s);
+}
+
+ack(s)
+       char *s;
+{
+       reply(200, "%s command okay.", s);
+}
+
+nack(s)
+       char *s;
+{
+       reply(502, "%s command not implemented.", s);
+}
+
+/*ARGSUSED*/
+yyerror(s)
+char *s;
+{
+       reply(500, "Command not understood.");
+}
+
+ftp_delete(name)
+       char *name;
+{
+/* f_rm is the general purpose FTAM file/directory deletion routine.
+ * Change information is formatted in ftam_error.
+ */
+       vec[0] = "f_rm";
+       vec[1] = name;
+       vec[2] = NULL;
+
+       if (f_rm(vec) == NOTOK){
+               reply(550, "%s: %s.", name, ftam_error);
+               return;
+       }
+       ack("DELE");
+}
+
+makedir(name)
+       char *name;
+{
+       
+/* f_mkdir is the FTAM directory creation routine */
+
+       vec[0] = "f_mkdir";
+       vec[1] = name;
+       vec[2] = NULL;
+       
+       if (f_mkdir(vec) == NOTOK){
+               reply(550, "%s: %s.", name, ftam_error);
+               return;
+       }
+       ack("MKDIR");
+}
+
+removedir(name)
+       char *name;
+{
+
+/* f_rm is the general purpose FTAM file/directory deletion routine.
+ */
+       vec[0] = "f_rm";
+       vec[1] = name;
+       vec[2] = NULL;
+
+       if (f_rm(vec) == NOTOK){
+               reply(550, "%s: %s.", name, ftam_error);
+               return;
+       }
+       ack("RMDIR");
+}
+
+char *
+renamefrom(name)
+       char *name;
+{
+       reply(350, "Ready for destination name");
+       return (name);
+}
+
+renamecmd(from, to)
+       char *from, *to;
+{
+
+/* f_mv is FTAM block function to select and change attributes 
+ * (i.e. file name)
+ */
+       vec[0] ="f_mv";
+       vec[1] = from;
+       vec[2] = to;
+       vec[3] = NULL;
+
+       if (f_mv(vec) == NOTOK){
+               reply(550, "rename: %s.", ftam_error);
+               return;
+       }
+       ack("RNTO");
+}
+
+dolog(sin)
+       struct sockaddr_in *sin;
+{
+#ifdef notanymore
+       struct hostent *hp = gethostbyaddr((char*)&sin->sin_addr,
+               sizeof (struct in_addr), AF_INET);
+#endif
+       time_t t;
+
+#ifdef notanymore
+       if (hp) {
+               (void)strncpy(remotehost, hp->h_name, sizeof (remotehost));
+               endhostent();
+       } else
+#endif
+               (void)strncpy(remotehost, inet_ntoa(sin->sin_addr),
+                   sizeof (remotehost));
+       t = time((time_t*)0);
+       if (!logging)
+               return;
+       advise(NULLCP,"connection from %s at %s", remotehost, ctime(&t));
+}
+directory(how,name)
+char *how, *name;
+{
+
+       int result;
+/* f_ls does a directory contents transfer.  The first arguement
+ * determines whether a name list (NLST) or long list (LIST) is returned.
+ * Results:
+ * OK    -- list transfered without error
+ * NOTOK -- list transfer error
+ * DONE  -- Problem opening TCP connection for transfer
+ *          Error response made by dataconn routine.
+ */
+
+       vec[0] = strcmp(how,"NLST") ? "dir" : "ls";
+       vec[1] = name;
+       vec[2] = NULL;
+
+       if ((result = f_ls(vec)) == OK)
+               reply(226, "Transfer complete.");
+       else if (result == NOTOK)
+               reply(500, ftam_error);
+       data = -1;
+
+}
+/*
+ * Execute FTAM login if all necessary arguements present
+ */
+dologin()
+{
+
+       if (!ftp_user) {
+               reply(500,"Send USER command first");
+               return(0);
+       }
+       if (!ftp_passwd) {
+               reply(330,"Send PASS command");
+               return(0);
+       }
+       if (!osi_host){
+       /* Success is returned since most user FTP response scanners
+         * are not prepared for a continue at this point.  The osi
+         * host may be specified by encoding it with the user name
+         * (i.e. user@osihost) or using the SITE command (SITE osihost).
+        * Gateway users are expected to know if the remote site
+        * requires account charging information.  The bridge makes
+         * ACCT optional.
+         */
+               reply(200,"Specify OSI filestore with SITE command");
+               return(0);
+       }
+       vec[0] = "f_open";
+       vec[1] = osi_host;
+       vec[2] = ftp_user;
+       vec[3] = (ftp_account) ? "" : ftp_account;
+       vec[4] = ftp_passwd;
+
+       advise (NULLCP,
+               "attempting association with OSI filestore \"%s\" as initiator \"%s\"",
+              osi_host, ftp_user);
+
+       /* f_open performs the FTAM initialization (including login) */
+       if (f_open(vec) == NOTOK){
+               reply(500,"Login failed");
+               return(0);
+       }
+
+       reply(200,"Associated with OSI filestore %s", osi_host);
+       return(1);
+
+}
+
+/*
+ * exit with supplied status.
+ */
+dologout(status)
+       int status;
+{
+
+       vec[0] = "f_close";
+       vec[1] = NULL;
+       /* f_close performs the logout sequence and receives charging
+         * information 
+         */
+       (void) f_close(vec);
+       if (status>=0)
+               reply(221,"Logged off. %s",ftam_error);
+       /* beware of flushing buffers after a SIGPIPE */
+       _exit(status);
+}
+
+
+/*
+ * Check user requesting login priviledges.
+ * Disallow anyone mentioned in the file FTPUSERS
+ * to allow people such as uucp to be avoided.
+ */
+checkuser(name)
+       register char *name;
+{
+       char line[BUFSIZ], *index();
+       FILE *fd, *fopen();
+       int found = 0;
+
+       fd = fopen(FTPUSERS, "r");
+       if (fd == NULL)
+               return (1);
+       while (fgets(line, sizeof (line), fd) != NULL) {
+               register char *cp = index(line, '\n');
+
+               if (cp)
+                       *cp = '\0';
+               if (strcmp(line, name) == 0) {
+                       found++;
+                       break;
+               }
+       }
+       (void)fclose(fd);
+       return (!found);
+}
+
diff --git a/usr/src/contrib/isode/ftp-ftam/make b/usr/src/contrib/isode/ftp-ftam/make
new file mode 100644 (file)
index 0000000..d861596
--- /dev/null
@@ -0,0 +1,7 @@
+: run this script through /bin/sh
+M=/bin/make
+if [ -f /usr/bin/make ]; then
+    M=/usr/bin/make
+fi
+
+exec $M TOPDIR=../ -f ../config/CONFIG.make -f Makefile ${1+"$@"}
diff --git a/usr/src/contrib/isode/h/Makefile b/usr/src/contrib/isode/h/Makefile
new file mode 100644 (file)
index 0000000..390375a
--- /dev/null
@@ -0,0 +1,96 @@
+###############################################################################
+#   Instructions to Make, for compilation of ISODE header files
+###############################################################################
+
+###############################################################################
+#
+# $Header: /f/osi/h/RCS/Makefile,v 7.4 91/02/22 09:24:29 mrose Interim $
+#
+#
+# $Log:        Makefile,v $
+# Revision 7.4  91/02/22  09:24:29  mrose
+# Interim 6.8
+# 
+# Revision 7.3  90/10/17  11:45:43  mrose
+# sync
+# 
+# Revision 7.2  90/07/01  21:03:45  mrose
+# pepsy
+# 
+# Revision 7.1  89/12/19  16:18:00  mrose
+# dgram
+# 
+# Revision 7.0  89/11/23  21:55:36  mrose
+# Release 6.0
+# 
+###############################################################################
+
+###############################################################################
+#
+#                               NOTICE
+#
+#    Acquisition, use, and distribution of this module and related
+#    materials are subject to the restrictions of a license agreement.
+#    Consult the Preface in the User's Manual for the full terms of
+#    this agreement.
+#
+###############################################################################
+
+
+DIRS   =       quipu
+
+HEADERS        =       config.h \
+               sys.dirent.h usr.dirent.h \
+               general.h manifest.h isoaddrs.h \
+               internet.h x25.h tp4.h dgram.h \
+               cmd_srch.h isoservent.h logger.h tailor.h \
+               mpkt.h \
+               tpkt.h tsap.h \
+               spkt.h ssap.h \
+               pepsy.h \
+               ppkt.h psap2.h psap.h \
+               acpkt.h acsap.h \
+               rtpkt.h rtsap.h \
+               ropkt.h rosap.h \
+               ronot.h \
+               rosy.h
+
+FHEADERS=      fpkt.h ftam.h
+
+
+##################################################################
+# Here it is...
+##################################################################
+
+all:;
+
+inst-all:;     -mkdir $(INCDIRM)
+               @for h in $(HEADERS); do $(MAKE) TARGET=$$h inst-target; done
+
+inst-ftam:;    @for h in $(FHEADERS); do $(MAKE) TARGET=$$h inst-target; done
+
+inst-target:   $(INCDIR)$(TARGET)
+
+$(INCDIR)$(TARGET):    $(TARGET)
+               -cp $@ z$(TARGET)
+               sed -e 's%#include "\([^/]*\)"%#include "$(INCDIR)\1"%' \
+                       < $(TARGET) | \
+                       sed -e 's%#include "/usr/include/\(.*\)"%#include <\1>%' > $@
+               -@ls -gls $@
+               -@echo ""
+
+install:       inst-all clean
+
+lint:;
+
+clean:;                rm -f z* _*
+               @for i in $(DIRS); \
+                   do (echo "cd $$i; $(MAKE) clean"; \
+                             cd $$i; $(MAKE) clean); \
+                   done
+
+grind:;                tgrind -lc $(HEADERS)
+               @for i in $(DIRS); \
+                   do (echo "cd $$i; $(MAKE) grind"; \
+                             cd $$i; $(MAKE) grind); \
+                   done