1 /*        $NetBSD: ftp_var.h,v 1.89 2024/09/25 16:55:39 christos Exp $          */
2 
3 /*-
4  * Copyright (c) 1996-2009 The NetBSD Foundation, Inc.
5  * All rights reserved.
6  *
7  * This code is derived from software contributed to The NetBSD Foundation
8  * by Luke Mewburn.
9  *
10  * Redistribution and use in source and binary forms, with or without
11  * modification, are permitted provided that the following conditions
12  * are met:
13  * 1. Redistributions of source code must retain the above copyright
14  *    notice, this list of conditions and the following disclaimer.
15  * 2. Redistributions in binary form must reproduce the above copyright
16  *    notice, this list of conditions and the following disclaimer in the
17  *    documentation and/or other materials provided with the distribution.
18  *
19  * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
20  * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
21  * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
22  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
23  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
24  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
25  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
26  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
27  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
28  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
29  * POSSIBILITY OF SUCH DAMAGE.
30  */
31 
32 /*
33  * Copyright (c) 1985, 1989, 1993, 1994
34  *        The Regents of the University of California.  All rights reserved.
35  *
36  * Redistribution and use in source and binary forms, with or without
37  * modification, are permitted provided that the following conditions
38  * are met:
39  * 1. Redistributions of source code must retain the above copyright
40  *    notice, this list of conditions and the following disclaimer.
41  * 2. Redistributions in binary form must reproduce the above copyright
42  *    notice, this list of conditions and the following disclaimer in the
43  *    documentation and/or other materials provided with the distribution.
44  * 3. Neither the name of the University nor the names of its contributors
45  *    may be used to endorse or promote products derived from this software
46  *    without specific prior written permission.
47  *
48  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
49  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
50  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
51  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
52  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
53  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
54  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
55  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
56  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
57  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
58  * SUCH DAMAGE.
59  *
60  *        @(#)ftp_var.h       8.4 (Berkeley) 10/9/94
61  */
62 
63 /*
64  * Copyright (C) 1997 and 1998 WIDE Project.
65  * All rights reserved.
66  *
67  * Redistribution and use in source and binary forms, with or without
68  * modification, are permitted provided that the following conditions
69  * are met:
70  * 1. Redistributions of source code must retain the above copyright
71  *    notice, this list of conditions and the following disclaimer.
72  * 2. Redistributions in binary form must reproduce the above copyright
73  *    notice, this list of conditions and the following disclaimer in the
74  *    documentation and/or other materials provided with the distribution.
75  * 3. Neither the name of the project nor the names of its contributors
76  *    may be used to endorse or promote products derived from this software
77  *    without specific prior written permission.
78  *
79  * THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND
80  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
81  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
82  * ARE DISCLAIMED.  IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE
83  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
84  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
85  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
86  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
87  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
88  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
89  * SUCH DAMAGE.
90  */
91 
92 /*
93  * FTP global variables.
94  */
95 
96 #ifdef SMALL
97 #undef    NO_EDITCOMPLETE
98 #define   NO_EDITCOMPLETE
99 #undef    NO_PROGRESS
100 #define   NO_PROGRESS
101 #endif
102 
103 #include <sys/param.h>
104 #include <sys/queue.h>
105 
106 #include <netinet/in.h>
107 #include <arpa/inet.h>
108 
109 #include <poll.h>
110 
111 #include <setjmp.h>
112 #include <stringlist.h>
113 
114 #ifndef NO_EDITCOMPLETE
115 #include <histedit.h>
116 #endif /* !NO_EDITCOMPLETE */
117 
118 #include "extern.h"
119 #include "progressbar.h"
120 
121 /*
122  * Format of command table.
123  */
124 struct cmd {
125           const char          *c_name;  /* name of command */
126           const char          *c_help;  /* help string */
127           char                c_bell;             /* give bell when command completes */
128           char                c_conn;             /* must be connected to use command */
129           char                c_proxy;  /* proxy server may execute */
130 #ifndef NO_EDITCOMPLETE
131           const char          *c_complete;        /* context sensitive completion list */
132 #endif /* !NO_EDITCOMPLETE */
133           void                (*c_handler)(int, char **); /* function to call */
134 };
135 
136 #define MAX_C_NAME  12                  /* maximum length of cmd.c_name */
137 
138 /*
139  * Format of macro table
140  */
141 struct macel {
142           char       mac_name[9];       /* macro name */
143           char      *mac_start;         /* start of macro in macbuf */
144           char      *mac_end; /* end of macro in macbuf */
145 };
146 
147 /*
148  * Format of option table
149  */
150 struct option {
151           const char          *name;
152           char                *value;
153 };
154 
155 /*
156  * Indices to features[]; an array containing status of remote server
157  * features; -1 not known (FEAT failed), 0 absent, 1 present.
158  */
159 enum {
160           FEAT_FEAT = 0,                /* FEAT, OPTS */
161           FEAT_MDTM,                    /* MDTM */
162           FEAT_MLST,                    /* MLSD, MLST */
163           FEAT_REST_STREAM,   /* RESTart STREAM */
164           FEAT_SIZE,                    /* SIZE */
165           FEAT_TVFS,                    /* TVFS (not used) */
166           FEAT_max
167 };
168 
169 /*
170  * Custom HTTP headers
171  */
172 struct entry {
173           SLIST_ENTRY(entry)  entries;
174           const char                    *header;
175 };
176 SLIST_HEAD(http_headers, entry);
177 
178 /*
179  * Global defines
180  */
181 #define   FTPBUFLEN (16 * 1024)
182 #define   MAX_IN_PORT_T       0xffffU
183 
184 #define   HASHBYTES 1024      /* default mark for `hash' command */
185 #define   DEFAULTINCR         1024      /* default increment for `rate' command */
186 
187 #define   FTP_PORT  21        /* default if ! getservbyname("ftp/tcp") */
188 #define   HTTP_PORT 80        /* default if ! getservbyname("http/tcp") */
189 #define   HTTPS_PORT          443       /* default if ! getservbyname("https/tcp") */
190 #ifndef   GATE_PORT
191 #define   GATE_PORT 21        /* default if ! getservbyname("ftpgate/tcp") */
192 #endif
193 #ifndef   GATE_SERVER
194 #define   GATE_SERVER         ""        /* default server */
195 #endif
196 
197 #define   DEFAULTPAGER        "more"    /* default pager if $PAGER isn't set */
198 #define   DEFAULTPROMPT       "ftp> "   /* default prompt  if `set prompt' is empty */
199 #define   DEFAULTRPROMPT      ""        /* default rprompt if `set rprompt' is empty */
200 
201 #define   TMPFILE             "ftpXXXXXXXXXX"
202 
203 
204 #ifndef   GLOBAL
205 #define   GLOBAL    extern
206 #endif
207 
208 /*
209  * Options and other state info.
210  */
211 GLOBAL    int       trace;              /* trace packets exchanged */
212 GLOBAL    int       hash;               /* print # for each buffer transferred */
213 GLOBAL    int       mark;               /* number of bytes between hashes */
214 GLOBAL    int       sendport; /* use PORT/LPRT cmd for each data connection */
215 GLOBAL    int       connected;          /* 1 = connected to server, -1 = logged in */
216 GLOBAL    int       interactive;        /* interactively prompt on m* cmds */
217 GLOBAL    int       confirmrest;        /* confirm rest of current m* cmd */
218 GLOBAL    int       ftp_debug;          /* debugging level */
219 GLOBAL    int       bell;               /* ring bell on cmd completion */
220 GLOBAL    int       doglob;             /* glob local file names */
221 GLOBAL    int       autologin;          /* establish user account on connection */
222 GLOBAL    int       proxy;              /* proxy server connection active */
223 GLOBAL    int       proxflag; /* proxy connection exists */
224 GLOBAL    int       gatemode; /* use gate-ftp */
225 GLOBAL    const char *gateserver;       /* server to use for gate-ftp */
226 GLOBAL    int       sunique;  /* store files on server with unique name */
227 GLOBAL    int       runique;  /* store local files with unique name */
228 GLOBAL    int       mcase;              /* map upper to lower case for mget names */
229 GLOBAL    int       ntflag;             /* use ntin ntout tables for name translation */
230 GLOBAL    int       mapflag;  /* use mapin mapout templates on file names */
231 GLOBAL    int       preserve; /* preserve modification time on files */
232 GLOBAL    int       code;               /* return/reply code for ftp command */
233 GLOBAL    int       crflag;             /* if 1, strip car. rets. on ascii gets */
234 GLOBAL    int       passivemode;        /* passive mode enabled */
235 GLOBAL    int       activefallback;     /* fall back to active mode if passive fails */
236 GLOBAL    char   *altarg;               /* argv[1] with no shell-like preprocessing  */
237 GLOBAL    char      ntin[17]; /* input translation table */
238 GLOBAL    char      ntout[17];          /* output translation table */
239 GLOBAL    char      mapin[MAXPATHLEN]; /* input map template */
240 GLOBAL    char      mapout[MAXPATHLEN]; /* output map template */
241 GLOBAL    char      typename[32];       /* name of file transfer type */
242 GLOBAL    int       type;               /* requested file transfer type */
243 GLOBAL    int       curtype;  /* current file transfer type */
244 GLOBAL    char      structname[32];     /* name of file transfer structure */
245 GLOBAL    int       stru;               /* file transfer structure */
246 GLOBAL    char      formname[32];       /* name of file transfer format */
247 GLOBAL    int       form;               /* file transfer format */
248 GLOBAL    char      modename[32];       /* name of file transfer mode */
249 GLOBAL    int       mode;               /* file transfer mode */
250 GLOBAL    char      bytename[32];       /* local byte size in ascii */
251 GLOBAL    int       bytesize; /* local byte size in binary */
252 GLOBAL    int       anonftp;  /* automatic anonymous login */
253 GLOBAL    int       dirchange;          /* remote directory changed by cd command */
254 GLOBAL    int       flushcache;         /* set HTTP cache flush headers with request */
255 GLOBAL    int       rate_get; /* maximum get xfer rate */
256 GLOBAL    int       rate_get_incr;      /* increment for get xfer rate */
257 GLOBAL    int       rate_put; /* maximum put xfer rate */
258 GLOBAL    int       rate_put_incr;      /* increment for put xfer rate */
259 GLOBAL    int       retry_connect;      /* seconds between retrying connection */
260 GLOBAL    const char *tmpdir; /* temporary directory */
261 GLOBAL    int       epsv4;              /* use EPSV/EPRT on IPv4 connections */
262 GLOBAL    int       epsv4bad; /* EPSV doesn't work on the current server */
263 GLOBAL    int       epsv6;              /* use EPSV/EPRT on IPv6 connections */
264 GLOBAL    int       epsv6bad; /* EPSV doesn't work on the current server */
265 GLOBAL    int       editing;  /* command line editing enabled */
266 GLOBAL    int       features[FEAT_max]; /* remote FEATures supported */
267 
268 #ifndef NO_EDITCOMPLETE
269 GLOBAL    EditLine *el;                 /* editline(3) status structure */
270 GLOBAL    History  *hist;               /* editline(3) history structure */
271 GLOBAL    char       *cursor_pos;       /* cursor position we're looking for */
272 GLOBAL    size_t      cursor_argc;      /* location of cursor in margv */
273 GLOBAL    size_t      cursor_argo;      /* offset of cursor in margv[cursor_argc] */
274 #endif /* !NO_EDITCOMPLETE */
275 
276 GLOBAL    char   *hostname;   /* name of host connected to */
277 GLOBAL    int       unix_server;        /* server is unix, can use binary for ascii */
278 GLOBAL    int       unix_proxy;         /* proxy is unix, can use binary for ascii */
279 GLOBAL    char      localcwd[MAXPATHLEN];         /* local dir */
280 GLOBAL    char      remotecwd[MAXPATHLEN];        /* remote dir */
281 GLOBAL    int       remcwdvalid;                  /* remotecwd has been updated */
282 GLOBAL    char   *username;   /* name of user logged in as. (dynamic) */
283 
284 GLOBAL    sa_family_t family; /* address family to use for connections */
285 GLOBAL    const char *ftpport;          /* port number to use for FTP connections */
286 GLOBAL    const char *httpport;         /* port number to use for HTTP connections */
287 #ifdef WITH_SSL
288 GLOBAL    const char *httpsport;        /* port number to use for HTTPS connections */
289 #endif
290 GLOBAL    const char *gateport;         /* port number to use for gateftp connections */
291 GLOBAL    struct addrinfo *bindai; /* local address to bind as */
292 
293 GLOBAL    char   *outfile;    /* filename to output URLs to */
294 GLOBAL    int       restartautofetch; /* restart auto-fetch */
295 
296 GLOBAL    char      line[FTPBUFLEN]; /* input line buffer */
297 GLOBAL    char      *stringbase;        /* current scan point in line buffer */
298 GLOBAL    char      argbuf[FTPBUFLEN]; /* argument storage buffer */
299 GLOBAL    char      *argbase; /* current storage point in arg buffer */
300 GLOBAL    StringList *marg_sl;          /* stringlist containing margv */
301 GLOBAL    int       margc;              /* count of arguments on input line */
302 #define   margv (marg_sl->sl_str)       /* args parsed from input line */
303 GLOBAL    int     cpend;                /* flag: if != 0, then pending server reply */
304 GLOBAL    int       mflag;              /* flag: if != 0, then active multi command */
305 
306 GLOBAL    int       options;  /* used during socket creation */
307 
308 GLOBAL    int       sndbuf_size;        /* socket send buffer size */
309 GLOBAL    int       rcvbuf_size;        /* socket receive buffer size */
310 
311 GLOBAL    int       macnum;             /* number of defined macros */
312 GLOBAL    struct macel macros[16];
313 GLOBAL    char      macbuf[4096];
314 
315 GLOBAL    char      *localhome;                   /* local home directory */
316 GLOBAL    char      *localname;                   /* local user name */
317 GLOBAL    char       netrc[MAXPATHLEN]; /* path to .netrc file */
318 GLOBAL    char       reply_string[BUFSIZ];        /* first line of previous reply */
319 GLOBAL    void      (*reply_callback)(const char *);
320                                                   /*
321                                                    * function to call for each line in
322                                                    * the server's reply except for the
323                                                    * first (`xxx-') and last (`xxx ')
324                                                    */
325 
326 GLOBAL    volatile sig_atomic_t         sigint_raised;
327 
328 GLOBAL    FILE      *cin;
329 GLOBAL    FILE      *cout;
330 GLOBAL    int        data;
331 
332 extern    struct cmd                    cmdtab[];
333 extern    struct option                 optiontab[];
334 extern    struct http_headers custom_headers;
335 
336 extern    size_t ftp_buflen;
337 
338 #define   EMPTYSTRING(x)      ((x) == NULL || (*(x) == '\0'))
339 #define   FREEPTR(x)          if ((x) != NULL) { free(x); (x) = NULL; }
340 
341 #ifdef BSD4_4
342 # define HAVE_STRUCT_SOCKADDR_IN_SIN_LEN          1
343 #endif
344 
345 #ifdef NO_LONG_LONG
346 # define STRTOLL(x,y,z)       strtol(x,y,z)
347 #else
348 # define STRTOLL(x,y,z)       strtoll(x,y,z)
349 #endif
350 
351 #ifdef NO_DEBUG
352 #define DPRINTF(...)          (void)0
353 #define DWARN(...)  (void)0
354 #else
355 #define DWFTP(a)    do a; while (0)
356 #define DPRINTF(...)          DWFTP(if (ftp_debug) (void)fprintf(ttyout, __VA_ARGS__))
357 #define DWARN(...)  DWFTP(if (ftp_debug) warn(__VA_ARGS__))
358 #endif
359 
360 #define STRorNULL(s)          ((s) ? (s) : "<null>")
361 
362 #ifdef NO_USAGE
363 void xusage(void);
364 #define UPRINTF(...)          xusage()
365 #else
366 #define UPRINTF(...)          (void)fprintf(ttyout, __VA_ARGS__)
367 #endif
368