root/usr/src/cmd/cmd-inet/usr.bin/ftp/ftp_var.h
/*
 * 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

#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.
 */

#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 */