1 /* 2 * CDDL HEADER START 3 * 4 * The contents of this file are subject to the terms of the 5 * Common Development and Distribution License (the "License"). 6 * You may not use this file except in compliance with the License. 7 * 8 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 9 * or http://www.opensolaris.org/os/licensing. 10 * See the License for the specific language governing permissions 11 * and limitations under the License. 12 * 13 * When distributing Covered Code, include this CDDL HEADER in each 14 * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 15 * If applicable, add the following below this CDDL HEADER, with the 16 * fields enclosed by brackets "[]" replaced with your own identifying 17 * information: Portions Copyright [yyyy] [name of copyright owner] 18 * 19 * CDDL HEADER END 20 */ 21 /* 22 * Copyright 2006 Sun Microsystems, Inc. All rights reserved. 23 * Use is subject to license terms. 24 */ 25 26 /* Copyright (c) 1983, 1984, 1985, 1986, 1987, 1988, 1989 AT&T */ 27 /* All Rights Reserved */ 28 29 /* 30 * University Copyright- Copyright (c) 1982, 1986, 1988 31 * The Regents of the University of California 32 * All Rights Reserved 33 * 34 * University Acknowledgment- Portions of this document are derived from 35 * software developed by the University of California, Berkeley, and its 36 * contributors. 37 */ 38 39 #ifndef _FTP_VAR_H 40 #define _FTP_VAR_H 41 42 #pragma ident "%Z%%M% %I% %E% SMI" 43 44 #ifdef __cplusplus 45 extern "C" { 46 #endif 47 48 #include <sys/param.h> 49 #include <sys/types.h> 50 #include <sys/socket.h> 51 #include <sys/ioctl.h> 52 #include <sys/stat.h> 53 #include <sys/wait.h> 54 #include <sys/resource.h> 55 #include <sys/ttold.h> 56 #include <sys/stropts.h> 57 #include <sys/time.h> 58 #include <netinet/in.h> 59 #include <netinet/tcp.h> 60 #include <arpa/ftp.h> 61 #include <arpa/telnet.h> 62 #include <arpa/inet.h> 63 #include <setjmp.h> 64 #include <libintl.h> 65 #include <string.h> 66 #include <fcntl.h> 67 #include <stdlib.h> 68 #include <stdio.h> 69 #include <widec.h> 70 #include <signal.h> 71 #include <netdb.h> 72 #include <pwd.h> 73 #include <locale.h> 74 #include <limits.h> 75 #include <fnmatch.h> 76 #include <dirent.h> 77 #include <termios.h> 78 #include <stdarg.h> 79 #include <unistd.h> 80 #include <malloc.h> 81 #include <strings.h> 82 #include <errno.h> 83 #include <ctype.h> 84 #include <gssapi/gssapi.h> 85 #include <gssapi/gssapi_ext.h> 86 87 #define signal(s, f) sigset(s, f) 88 #define setjmp(e) sigsetjmp(e, 1) 89 #define longjmp(e, v) siglongjmp(e, v) 90 #define jmp_buf sigjmp_buf 91 92 /* 93 * FTP global variables. 94 */ 95 #ifndef EXTERN 96 #define EXTERN extern 97 #endif 98 99 #define DEFAULTFTPFILE "/etc/default/ftp" 100 101 /* 102 * Options and other state info. 103 */ 104 EXTERN int trace; /* trace packets exchanged */ 105 EXTERN int hash; /* print # for each buffer transferred */ 106 EXTERN int sendport; /* use PORT cmd for each data connection */ 107 EXTERN int verbose; /* print messages coming back from server */ 108 EXTERN int connected; /* connected to server */ 109 EXTERN int fromatty; /* input is from a terminal */ 110 EXTERN int interactive; /* interactively prompt on m* cmds */ 111 EXTERN int debug; /* debugging level */ 112 EXTERN int bell; /* ring bell on cmd completion */ 113 EXTERN int doglob; /* glob local file names */ 114 EXTERN int autologin; /* establish user account on connection */ 115 EXTERN int proxy; /* proxy server connection active */ 116 EXTERN int proxflag; /* proxy connection exists */ 117 EXTERN int sunique; /* store files on server with unique name */ 118 EXTERN int runique; /* store local files with unique name */ 119 EXTERN int mcase; /* map upper to lower case for mget names */ 120 EXTERN int ntflag; /* use ntin ntout tables for name translation */ 121 EXTERN int mapflag; /* use mapin mapout templates on file names */ 122 EXTERN int code; /* return/reply code for ftp command */ 123 EXTERN int crflag; /* if 1, strip car. rets. on ascii gets */ 124 EXTERN char pasv[64]; /* passive port for proxy data connection */ 125 EXTERN char *altarg; /* argv[1] with no shell-like preprocessing */ 126 EXTERN char ntin[17]; /* input translation table */ 127 EXTERN char ntout[17]; /* output translation table */ 128 EXTERN char mapin[MAXPATHLEN]; /* input map template */ 129 EXTERN char mapout[MAXPATHLEN]; /* output map template */ 130 EXTERN char typename[32]; /* name of file transfer type */ 131 EXTERN int type; /* file transfer type */ 132 EXTERN char structname[32]; /* name of file transfer structure */ 133 EXTERN int stru; /* file transfer structure */ 134 EXTERN char formname[32]; /* name of file transfer format */ 135 EXTERN int form; /* file transfer format */ 136 EXTERN char modename[32]; /* name of file transfer mode */ 137 EXTERN int mode; /* file transfer mode */ 138 EXTERN char bytename[32]; /* local byte size in ascii */ 139 EXTERN int bytesize; /* local byte size in binary */ 140 EXTERN int passivemode; /* passive transfer mode toggle */ 141 EXTERN off_t restart_point; /* transfer restart offset */ 142 EXTERN int tcpwindowsize; /* TCP window size for the data connection */ 143 144 EXTERN boolean_t ls_invokes_NLST; /* behaviour of 'ls' */ 145 EXTERN char *hostname; /* name of host connected to */ 146 EXTERN char *home; 147 EXTERN char *globerr; 148 149 EXTERN struct sockaddr_in6 myctladdr; /* for channel bindings */ 150 EXTERN struct sockaddr_in6 remctladdr; /* for channel bindings */ 151 152 EXTERN int clevel; /* command channel protection level */ 153 EXTERN int dlevel; /* data channel protection level */ 154 155 EXTERN int autoauth; /* do authentication on connect */ 156 EXTERN int auth_type; /* authentication type */ 157 EXTERN int auth_error; /* one error code for all auth types */ 158 EXTERN int autoencrypt; /* do encryption on connect */ 159 EXTERN int fflag; /* forward credentials */ 160 EXTERN boolean_t goteof; 161 162 EXTERN int skipsyst; /* enable automatic sending of SYST command */ 163 164 EXTERN uchar_t *ucbuf; /* clear text buffer */ 165 166 #define MECH_SZ 40 167 #define FTP_DEF_MECH "kerberos_v5" 168 EXTERN char mechstr[MECH_SZ]; /* mechanism type */ 169 170 EXTERN gss_OID mechoid; /* corresponding mechanism oid type */ 171 EXTERN gss_ctx_id_t gcontext; /* gss security context */ 172 173 #define FTPBUFSIZ BUFSIZ*16 174 #define HASHSIZ BUFSIZ*8 175 176 EXTERN char *buf; /* buffer for binary sends and gets */ 177 178 EXTERN jmp_buf toplevel; /* non-local goto stuff for cmd scanner */ 179 180 /* 181 * BUFSIZE includes 182 * - (MAXPATHLEN)*2 to accomodate 2 paths (remote and local file names). 183 * - MAXCMDLEN to accomodate the longest command listed in cmdtab[] 184 * (defined in cmdtab.c) as this is stuffed into the buffer along 185 * with the remote and local file names. 186 * - The 4 bytes are for the 2 blank separators, a carriage-return 187 * and a NULL terminator. 188 * 189 * NOTE : The arguments may not be always pathnames (they can be commands 190 * too). But, here we have considered the worst case of two pathnames. 191 */ 192 #define MAXCMDLEN 10 /* The length of longest command in cmdtab[] */ 193 #define BUFSIZE ((MAXPATHLEN)*2+MAXCMDLEN+4) 194 195 EXTERN char line[BUFSIZE]; /* input line buffer */ 196 EXTERN char *stringbase; /* current scan point in line buffer */ 197 EXTERN char argbuf[BUFSIZE]; /* argument storage buffer */ 198 EXTERN char *argbase; /* current storage point in arg buffer */ 199 EXTERN int margc; /* count of arguments on input line */ 200 EXTERN char **margv; /* args parsed from input line */ 201 EXTERN int cpend; /* flag: if != 0, then pending server reply */ 202 EXTERN int mflag; /* flag: if != 0, then active multi command */ 203 EXTERN FILE *tmp_nlst; /* tmp file; holds NLST results for mget, etc */ 204 205 EXTERN char *reply_parse; /* for parsing replies to the ADAT command */ 206 EXTERN char reply_buf[FTPBUFSIZ]; 207 EXTERN char *reply_ptr; 208 209 EXTERN int options; /* used during socket creation */ 210 211 EXTERN int timeout; /* connection timeout */ 212 EXTERN int timeoutms; /* connection timeout in msec */ 213 EXTERN jmp_buf timeralarm; /* to recover from global timeout */ 214 215 216 /* 217 * Format of command table. 218 */ 219 struct cmd { 220 char *c_name; /* name of command */ 221 char *c_help; /* help string */ 222 char c_bell; /* give bell when command completes */ 223 char c_conn; /* must be connected to use command */ 224 char c_proxy; /* proxy server may execute */ 225 void (*c_handler)(int argc, char *argv[]); /* function to call */ 226 }; 227 228 struct macel { 229 char mac_name[9]; /* macro name */ 230 char *mac_start; /* start of macro in macbuf */ 231 char *mac_end; /* end of macro in macbuf */ 232 }; 233 234 EXTERN int macnum; /* number of defined macros */ 235 EXTERN struct macel macros[16]; 236 EXTERN char macbuf[4096]; 237 238 extern void macdef(int argc, char *argv[]); 239 extern void doproxy(int argc, char *argv[]); 240 extern void setpeer(int argc, char *argv[]); 241 extern void rmthelp(int argc, char *argv[]); 242 extern void settype(int argc, char *argv[]); 243 extern void setbinary(int argc, char *argv[]); 244 extern void setascii(int argc, char *argv[]); 245 extern void settenex(int argc, char *argv[]); 246 extern void setebcdic(int argc, char *argv[]); 247 extern void setmode(int argc, char *argv[]); 248 extern void setform(int argc, char *argv[]); 249 extern void setstruct(int argc, char *argv[]); 250 extern void put(int argc, char *argv[]); 251 extern void mput(int argc, char *argv[]); 252 extern void get(int argc, char *argv[]); 253 extern void mget(int argc, char *argv[]); 254 extern void status(int argc, char *argv[]); 255 extern void setbell(int argc, char *argv[]); 256 extern void settrace(int argc, char *argv[]); 257 extern void sethash(int argc, char *argv[]); 258 extern void setverbose(int argc, char *argv[]); 259 extern void setport(int argc, char *argv[]); 260 extern void setprompt(int argc, char *argv[]); 261 extern void setglob(int argc, char *argv[]); 262 extern void setdebug(int argc, char *argv[]); 263 extern void cd(int argc, char *argv[]); 264 extern void lcd(int argc, char *argv[]); 265 extern void delete(int argc, char *argv[]); 266 extern void mdelete(int argc, char *argv[]); 267 extern void renamefile(int argc, char *argv[]); 268 extern void ls(int argc, char *argv[]); 269 extern void mls(int argc, char *argv[]); 270 extern void shell(int argc, char *argv[]); 271 extern void user(int argc, char *argv[]); 272 extern void pwd(int argc, char *argv[]); 273 extern void makedir(int argc, char *argv[]); 274 extern void removedir(int argc, char *argv[]); 275 extern void quote(int argc, char *argv[]); 276 extern void rmthelp(int argc, char *argv[]); 277 extern void quit(int argc, char *argv[]); 278 extern void disconnect(int argc, char *argv[]); 279 extern void account(int argc, char *argv[]); 280 extern void setcase(int argc, char *argv[]); 281 extern void setcr(int argc, char *argv[]); 282 extern void setntrans(int argc, char *argv[]); 283 extern void setnmap(int argc, char *argv[]); 284 extern void setsunique(int argc, char *argv[]); 285 extern void setrunique(int argc, char *argv[]); 286 extern void cdup(int argc, char *argv[]); 287 extern void domacro(int argc, char *argv[]); 288 extern void help(int argc, char *argv[]); 289 extern void reset(int argc, char *argv[]); 290 extern void reget(int argc, char *argv[]); 291 extern void restart(int argc, char *argv[]); 292 extern void setpassive(int argc, char *argv[]); 293 extern void settcpwindow(int argc, char *argv[]); 294 extern void site(int argc, char *argv[]); 295 296 extern void ccc(int argc, char *argv[]); 297 extern void setclear(int argc, char *argv[]); 298 extern void setclevel(int argc, char *argv[]); 299 extern void setdlevel(int argc, char *argv[]); 300 extern void setsafe(int argc, char *argv[]); 301 extern void setmech(int argc, char *argv[]); 302 303 extern int do_auth(void); 304 extern void setpbsz(uint_t size); 305 extern char *radix_error(int); 306 extern int radix_encode(uchar_t *, uchar_t *, size_t, int *, int); 307 extern void user_gss_error(OM_uint32 maj_stat, OM_uint32 min_stat, 308 char *errstr); 309 extern void setprivate(int argc, char *argv[]); 310 311 extern int secure_flush(int); 312 extern int secure_getc(FILE *); 313 extern int secure_putc(int, FILE *); 314 extern ssize_t secure_read(int, void *, size_t); 315 extern ssize_t secure_write(int, const void *, size_t); 316 317 extern void fatal(char *msg); 318 extern int getreply(int expecteof); 319 extern void call(void (*routine)(int argc, char *argv[]), ...); 320 extern void sendrequest(char *cmd, char *local, char *remote, int allowpipe); 321 extern void recvrequest(char *cmd, char *local, char *remote, char *mode, 322 int allowpipe); 323 extern void makeargv(void); 324 extern int login(char *host); 325 extern int command(char *fmt, ...); 326 extern char **glob(char *v); 327 extern void blkfree(char **); 328 extern void pswitch(int flag); 329 330 extern char *hookup(char *host, char *); 331 extern char *mygetpass(char *prompt); 332 extern void lostpeer(int sig); 333 extern int ruserpass(char *host, char **aname, char **apass, char **aacct); 334 extern FILE *mypopen(char *cmd, char *mode); 335 extern int mypclose(FILE *ptr); 336 extern struct cmd *getcmd(char *name); 337 338 extern void stop_timer(void); 339 extern void reset_timer(void); 340 extern int getpagesize(void); 341 342 #define ENCODELEN(l) (((4 * (l)) / 3) + 4) 343 #define DECODELEN(l) (((3 * (l)) / 4) + 4) 344 345 #ifdef __cplusplus 346 } 347 #endif 348 349 #endif /* _FTP_VAR_H */ 350