/* ftamsbr.c - FTAM subroutines */
static char *rcsid
= "$Header: /f/osi/ftam2/RCS/ftamsbr.c,v 7.6 91/02/22 09:24:06 mrose Interim $";
* $Header: /f/osi/ftam2/RCS/ftamsbr.c,v 7.6 91/02/22 09:24:06 mrose Interim $
* Revision 7.6 91/02/22 09:24:06 mrose
* Revision 7.5 91/01/13 12:27:04 mrose
* Revision 7.4 90/12/23 18:40:16 mrose
* Revision 7.3 90/11/21 11:30:50 mrose
* Revision 7.2 90/11/05 13:29:54 mrose
* Revision 7.1 90/07/01 21:03:31 mrose
* Revision 7.0 89/11/23 21:54:37 mrose
* 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
extern struct vfsmap vfs
[];
struct vfsmap
*st2vfs (fd
, file
, st
, proposed
, ftamfd
)
register struct vfsmap
*lf
;
register struct vfsmap
*vf
;
fmt
= st
-> st_mode
& S_IFMT
;
/* Return the suggested TYPE or Unstructured Text type for FTP bridge */
/* if during ftp_exist got multiple listing, return directory type */
for (vf
= vfs
; vf
-> vf_entry
; vf
++)
if (vf
-> vf_oid
&& oid_cmp (vf
-> vf_oid
, proposed
) == 0) {
if ((vf
-> vf_flags
& VF_OK
) && vf
-> vf_mode
== fmt
) {
&& (*vf
-> vf_peek
) (vf
, fd
, file
, st
, ftamfd
)
for (lf
= vfs
; lf
-> vf_entry
; lf
++)
for (vf
= lf
; vf
>= vfs
; vf
--)
if ((vf
-> vf_flags
& VF_OK
) && vf
-> vf_mode
== fmt
) {
&& (*vf
-> vf_peek
) (vf
, fd
, file
, st
, ftamfd
) != DONE
)
for (vf
= lf
; vf
>= vfs
; vf
--)
if ((vf
-> vf_flags
& VF_OK
)
&& vf
-> vf_simplify
!= VFS_XXX
)
/* 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
) {
(void) (*vf
-> vf_peek
) (vf
, fd
, file
, st
, ftamfd
);
return &vfs
[ftp_default
];
int binarycheck (param
, data
)
register struct type_DOCS_FTAM__3__Parameters
*p3
=
(struct type_DOCS_FTAM__3__Parameters
*) param
;
& opt_DOCS_FTAM__3__Parameters_maximum__string__length
) {
if (getenv ("UNISYS-FTAM"))
p3
-> maximum__string__length
= 0;
~opt_DOCS_FTAM__3__Parameters_maximum__string__length
;
& opt_DOCS_FTAM__3__Parameters_string__significanz
)
&& p3
-> string__significanz
== int_DOCS_string__significanz_fixed
) {
"filestore does not support fixed-length strings");
int textcheck (param
, data
)
register struct type_DOCS_FTAM__1__Parameters
*p1
=
(struct type_DOCS_FTAM__1__Parameters
*) param
;
& 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
) {
"filestore does not support strings of universal class number %d",
p1
-> universal__class__number
);
& opt_DOCS_FTAM__1__Parameters_maximum__string__length
) {
if (getenv ("UNISYS-FTAM")) {
p1
-> maximum__string__length
= 0;
~opt_DOCS_FTAM__1__Parameters_maximum__string__length
;
& opt_DOCS_FTAM__1__Parameters_string__significance
)
&& p1
-> string__significance
== int_DOCS_string__significance_fixed
) {
"filestore does not support fixed-length strings");
int binarypeek (vf
, fd
, file
, st
, ftamfd
)
register struct vfsmap
*vf
;
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
;
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
;
/* 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:
#define isIA5(c) (isprint ((u_char) c) || (isspace ((u_char)c) && (c) != '\r'))
int textpeek (vf
, fd
, file
, st
, ftamfd
)
register struct vfsmap
*vf
;
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
|= 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
) {
if (getenv ("HP-FTAM")) {
p1
-> string__significance
=
int_DOCS_string__significance_not__significant
;
p1
-> string__significance
=
int_DOCS_string__significance_variable
;
p1
-> string__significance
=
int_DOCS_string__significance_not__significant
;
&& (file
== NULLCP
|| (gd
= open (file
, O_RDONLY
)) == NOTOK
))
pos
= lseek (gd
, 0L, L_INCR
);
(void) lseek (gd
, 0L, L_SET
);
n
= read (gd
, buffer
, sizeof buffer
);
n
= 0 < st
-> st_blksize
&& st
-> st_blksize
<= sizeof buffer
? st
-> st_blksize
: sizeof buffer
;
n
= read (gd
, buffer
, n
);
if (fd
!= NOTOK
&& pos
!= -1L)
(void) lseek (gd
, pos
, L_SET
);
for (cp
= buffer
+ n
- 1; cp
>= buffer
; cp
--)
int fdfpeek (vf
, fd
, file
, st
, ftamfd
)
register struct vfsmap
*vf
;
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
)
vf
-> vf_parameter
= (caddr_t
) p9
;
/* 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
)
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
)
if (write (fd
, (char *) pe
-> pe_prim
, n
) != n
)
cp
= (char *) pe
-> pe_prim
;
for (ep
= (bp
= cp
) + pe
-> pe_len
; bp
< ep
;)
if (write (fd
, cp
, i
) != i
)
case 0x28: /* G0: 02/08 04/02 */
&& write (fd
, cp
, i
) != i
)
case 0x2d: /* G1: 02/13 04/01 */
default: /* unknown, pass it on... */
if (write (fd
, cp
, i
) != i
)
if (write (fd
, "\n", 1) != 1)
if (write (fd
, "\r\n", 2) != 2)
/* right from MH's sbr/path.c... */
#define NCWD (sizeof CWD - 1)
#define NPWD (sizeof PWD - 1)
for (dp
= cp
; *dp
== '/'; dp
++)
(void) strcpy (cp
--, dp
);
if (strcmp (cp
, DOT
) == 0) {
if (strcmp (cp
, DOTDOT
) == 0) {
for (cp
-= 2; cp
> f
; cp
--)
if (strncmp (cp
, PWD
, NPWD
) == 0) {
for (dp
= cp
- 2; dp
> f
; dp
--)
(void) strcpy (dp
, cp
+ NPWD
- 1);
if (strncmp (cp
, CWD
, NCWD
) == 0) {
(void) strcpy (cp
- 1, cp
+ NCWD
- 1);