/*
 * CDDL HEADER START
 *
 * The contents of this file are subject to the terms of the
 * Common Development and Distribution License (the "License").
 * You may not use this file except in compliance with the License.
 *
 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
 * or http://www.opensolaris.org/os/licensing.
 * See the License for the specific language governing permissions
 * and limitations under the License.
 *
 * When distributing Covered Code, include this CDDL HEADER in each
 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
 * If applicable, add the following below this CDDL HEADER, with the
 * fields enclosed by brackets "[]" replaced with your own identifying
 * information: Portions Copyright [yyyy] [name of copyright owner]
 *
 * CDDL HEADER END
 */
/*
 *	Copyright 2006 Sun Microsystems, Inc.  All rights reserved.
 *	Use is subject to license terms.
 */

/*	Copyright (c) 1983, 1984, 1985, 1986, 1987, 1988, 1989 AT&T	*/
/*	All Rights Reserved  	*/

/*
 *	University Copyright- Copyright (c) 1982, 1986, 1988
 *	The Regents of the University of California
 *	All Rights Reserved
 *
 *	University Acknowledgment- Portions of this document are derived from
 *	software developed by the University of California, Berkeley, and its
 *	contributors.
 */

#ifndef	_FTP_VAR_H
#define	_FTP_VAR_H

#pragma ident	"%Z%%M%	%I%	%E% SMI"

#ifdef	__cplusplus
extern "C" {
#endif

#include <sys/param.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <sys/ioctl.h>
#include <sys/stat.h>
#include <sys/wait.h>
#include <sys/resource.h>
#include <sys/ttold.h>
#include <sys/stropts.h>
#include <sys/time.h>
#include <netinet/in.h>
#include <netinet/tcp.h>
#include <arpa/ftp.h>
#include <arpa/telnet.h>
#include <arpa/inet.h>
#include <setjmp.h>
#include <libintl.h>
#include <string.h>
#include <fcntl.h>
#include <stdlib.h>
#include <stdio.h>
#include <widec.h>
#include <signal.h>
#include <netdb.h>
#include <pwd.h>
#include <locale.h>
#include <limits.h>
#include <fnmatch.h>
#include <dirent.h>
#include <termios.h>
#include <stdarg.h>
#include <unistd.h>
#include <malloc.h>
#include <strings.h>
#include <errno.h>
#include <ctype.h>
#include <gssapi/gssapi.h>
#include <gssapi/gssapi_ext.h>

#define	signal(s, f)	sigset(s, f)
#define	setjmp(e)	sigsetjmp(e, 1)
#define	longjmp(e, v)	siglongjmp(e, v)
#define	jmp_buf		sigjmp_buf

/*
 * FTP global variables.
 */
#ifndef	EXTERN
#define	EXTERN	extern
#endif

#define	DEFAULTFTPFILE	"/etc/default/ftp"

/*
 * Options and other state info.
 */
EXTERN int	trace;		/* trace packets exchanged */
EXTERN int	hash;		/* print # for each buffer transferred */
EXTERN int	sendport;	/* use PORT cmd for each data connection */
EXTERN int	verbose;	/* print messages coming back from server */
EXTERN int	connected;	/* connected to server */
EXTERN int	fromatty;	/* input is from a terminal */
EXTERN int	interactive;	/* interactively prompt on m* cmds */
EXTERN int	debug;		/* debugging level */
EXTERN int	bell;		/* ring bell on cmd completion */
EXTERN int	doglob;		/* glob local file names */
EXTERN int	autologin;	/* establish user account on connection */
EXTERN int	proxy;		/* proxy server connection active */
EXTERN int	proxflag;	/* proxy connection exists */
EXTERN int	sunique;	/* store files on server with unique name */
EXTERN int	runique;	/* store local files with unique name */
EXTERN int	mcase;		/* map upper to lower case for mget names */
EXTERN int	ntflag;		/* use ntin ntout tables for name translation */
EXTERN int	mapflag;	/* use mapin mapout templates on file names */
EXTERN int	code;		/* return/reply code for ftp command */
EXTERN int	crflag;		/* if 1, strip car. rets. on ascii gets */
EXTERN char	pasv[64];	/* passive port for proxy data connection */
EXTERN char	*altarg;	/* argv[1] with no shell-like preprocessing  */
EXTERN char	ntin[17];	/* input translation table */
EXTERN char	ntout[17];	/* output translation table */
EXTERN char	mapin[MAXPATHLEN]; /* input map template */
EXTERN char	mapout[MAXPATHLEN]; /* output map template */
EXTERN char	typename[32];	/* name of file transfer type */
EXTERN int	type;		/* file transfer type */
EXTERN char	structname[32];	/* name of file transfer structure */
EXTERN int	stru;		/* file transfer structure */
EXTERN char	formname[32];	/* name of file transfer format */
EXTERN int	form;		/* file transfer format */
EXTERN char	modename[32];	/* name of file transfer mode */
EXTERN int	mode;		/* file transfer mode */
EXTERN char	bytename[32];	/* local byte size in ascii */
EXTERN int	bytesize;	/* local byte size in binary */
EXTERN int	passivemode;	/* passive transfer mode toggle */
EXTERN off_t	restart_point;	/* transfer restart offset */
EXTERN int	tcpwindowsize;	/* TCP window size for the data connection */

EXTERN boolean_t	ls_invokes_NLST;	/* behaviour of 'ls' */
EXTERN char		*hostname;		/* name of host connected to */
EXTERN char		*home;
EXTERN char		*globerr;

EXTERN struct	sockaddr_in6 myctladdr;		/* for channel bindings */
EXTERN struct	sockaddr_in6 remctladdr;	/* for channel bindings */

EXTERN int	clevel;		/* command channel protection level */
EXTERN int	dlevel;		/* data channel protection level */

EXTERN int	autoauth;	/* do authentication on connect */
EXTERN int	auth_type;	/* authentication type */
EXTERN int	auth_error;	/* one error code for all auth types */
EXTERN int	autoencrypt;	/* do encryption on connect */
EXTERN int	fflag;		/* forward credentials */
EXTERN boolean_t goteof;

EXTERN int	skipsyst;	/* enable automatic sending of SYST command */

EXTERN uchar_t	*ucbuf;		/* clear text buffer */

#define	MECH_SZ		40
#define	FTP_DEF_MECH	"kerberos_v5"
EXTERN char	mechstr[MECH_SZ];	/* mechanism type */

EXTERN gss_OID	mechoid;	/* corresponding mechanism oid type */
EXTERN gss_ctx_id_t gcontext;	/* gss security context */

#define	FTPBUFSIZ	BUFSIZ*16
#define	HASHSIZ		BUFSIZ*8

EXTERN char *buf;		/* buffer for binary sends and gets */

EXTERN jmp_buf toplevel;	/* non-local goto stuff for cmd scanner */

/*
 * BUFSIZE includes
 *	- (MAXPATHLEN)*2 to  accomodate 2 paths (remote and local file names).
 *	- MAXCMDLEN to accomodate the longest command listed in cmdtab[]
 *	  (defined in cmdtab.c) as this is stuffed into the buffer along
 *	  with the remote and local file names.
 *	- The 4 bytes are for the 2 blank separators, a carriage-return
 *	  and a NULL terminator.
 *
 * NOTE : The arguments may not be always pathnames (they can be commands
 *	  too). But, here we have considered the worst case of two pathnames.
 */
#define	MAXCMDLEN	10	/* The length of longest command in cmdtab[] */
#define	BUFSIZE	((MAXPATHLEN)*2+MAXCMDLEN+4)

EXTERN char	line[BUFSIZE];	/* input line buffer */
EXTERN char	*stringbase;	/* current scan point in line buffer */
EXTERN char	argbuf[BUFSIZE]; /* argument storage buffer */
EXTERN char	*argbase;	/* current storage point in arg buffer */
EXTERN int	margc;		/* count of arguments on input line */
EXTERN char	**margv;	/* args parsed from input line */
EXTERN int	cpend;		/* flag: if != 0, then pending server reply */
EXTERN int	mflag;		/* flag: if != 0, then active multi command */
EXTERN FILE	*tmp_nlst;	/* tmp file; holds NLST results for mget, etc */

EXTERN char	*reply_parse;	/* for parsing replies to the ADAT command */
EXTERN char	reply_buf[FTPBUFSIZ];
EXTERN char	*reply_ptr;

EXTERN int	options;	/* used during socket creation */

EXTERN int	timeout;	/* connection timeout */
EXTERN int	timeoutms;	/* connection timeout in msec */
EXTERN jmp_buf	timeralarm;	/* to recover from global timeout */


/*
 * 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 */
	char	c_proxy;	/* proxy server may execute */
	void	(*c_handler)(int argc, char *argv[]); /* function to call */
};

struct macel {
	char mac_name[9];	/* macro name */
	char *mac_start;	/* start of macro in macbuf */
	char *mac_end;		/* end of macro in macbuf */
};

EXTERN int macnum;			/* number of defined macros */
EXTERN struct macel macros[16];
EXTERN char macbuf[4096];

extern void macdef(int argc, char *argv[]);
extern void doproxy(int argc, char *argv[]);
extern void setpeer(int argc, char *argv[]);
extern void rmthelp(int argc, char *argv[]);
extern void settype(int argc, char *argv[]);
extern void setbinary(int argc, char *argv[]);
extern void setascii(int argc, char *argv[]);
extern void settenex(int argc, char *argv[]);
extern void setebcdic(int argc, char *argv[]);
extern void setmode(int argc, char *argv[]);
extern void setform(int argc, char *argv[]);
extern void setstruct(int argc, char *argv[]);
extern void put(int argc, char *argv[]);
extern void mput(int argc, char *argv[]);
extern void get(int argc, char *argv[]);
extern void mget(int argc, char *argv[]);
extern void status(int argc, char *argv[]);
extern void setbell(int argc, char *argv[]);
extern void settrace(int argc, char *argv[]);
extern void sethash(int argc, char *argv[]);
extern void setverbose(int argc, char *argv[]);
extern void setport(int argc, char *argv[]);
extern void setprompt(int argc, char *argv[]);
extern void setglob(int argc, char *argv[]);
extern void setdebug(int argc, char *argv[]);
extern void cd(int argc, char *argv[]);
extern void lcd(int argc, char *argv[]);
extern void delete(int argc, char *argv[]);
extern void mdelete(int argc, char *argv[]);
extern void renamefile(int argc, char *argv[]);
extern void ls(int argc, char *argv[]);
extern void mls(int argc, char *argv[]);
extern void shell(int argc, char *argv[]);
extern void user(int argc, char *argv[]);
extern void pwd(int argc, char *argv[]);
extern void makedir(int argc, char *argv[]);
extern void removedir(int argc, char *argv[]);
extern void quote(int argc, char *argv[]);
extern void rmthelp(int argc, char *argv[]);
extern void quit(int argc, char *argv[]);
extern void disconnect(int argc, char *argv[]);
extern void account(int argc, char *argv[]);
extern void setcase(int argc, char *argv[]);
extern void setcr(int argc, char *argv[]);
extern void setntrans(int argc, char *argv[]);
extern void setnmap(int argc, char *argv[]);
extern void setsunique(int argc, char *argv[]);
extern void setrunique(int argc, char *argv[]);
extern void cdup(int argc, char *argv[]);
extern void domacro(int argc, char *argv[]);
extern void help(int argc, char *argv[]);
extern void reset(int argc, char *argv[]);
extern void reget(int argc, char *argv[]);
extern void restart(int argc, char *argv[]);
extern void setpassive(int argc, char *argv[]);
extern void settcpwindow(int argc, char *argv[]);
extern void site(int argc, char *argv[]);

extern void ccc(int argc, char *argv[]);
extern void setclear(int argc, char *argv[]);
extern void setclevel(int argc, char *argv[]);
extern void setdlevel(int argc, char *argv[]);
extern void setsafe(int argc, char *argv[]);
extern void setmech(int argc, char *argv[]);

extern int do_auth(void);
extern void setpbsz(uint_t size);
extern char *radix_error(int);
extern int radix_encode(uchar_t *, uchar_t *, size_t, int *, int);
extern void user_gss_error(OM_uint32 maj_stat, OM_uint32 min_stat,
	char *errstr);
extern void setprivate(int argc, char *argv[]);

extern int secure_flush(int);
extern int secure_getc(FILE *);
extern int secure_putc(int, FILE *);
extern ssize_t secure_read(int, void *, size_t);
extern ssize_t secure_write(int, const void *, size_t);

extern void fatal(char *msg);
extern int getreply(int expecteof);
extern void call(void (*routine)(int argc, char *argv[]), ...);
extern void sendrequest(char *cmd, char *local, char *remote, int allowpipe);
extern void recvrequest(char *cmd, char *local, char *remote, char *mode,
    int allowpipe);
extern void makeargv(void);
extern int login(char *host);
extern int command(char *fmt, ...);
extern char **glob(char *v);
extern void blkfree(char **);
extern void pswitch(int flag);

extern char *hookup(char *host, char *);
extern char *mygetpass(char *prompt);
extern void lostpeer(int sig);
extern int ruserpass(char *host, char **aname, char **apass, char **aacct);
extern FILE *mypopen(char *cmd, char *mode);
extern int mypclose(FILE *ptr);
extern struct cmd *getcmd(char *name);

extern void stop_timer(void);
extern void reset_timer(void);
extern int getpagesize(void);

#define	ENCODELEN(l)	(((4 * (l)) / 3) + 4)
#define	DECODELEN(l)	(((3 * (l)) / 4) + 4)

#ifdef	__cplusplus
}
#endif

#endif	/* _FTP_VAR_H */