1 |
/* $NetBSD: tnftp.h,v 1.33 2009/11/14 08:32:42 lukem Exp $ */ |
2 |
|
3 |
#define FTP_PRODUCT PACKAGE_NAME |
4 |
#define FTP_VERSION PACKAGE_VERSION |
5 |
|
6 |
#include "tnftp_config.h" |
7 |
|
8 |
#include <stdio.h> |
9 |
#include <ctype.h> |
10 |
#include <errno.h> |
11 |
|
12 |
#if defined(HAVE_SYS_TYPES_H) |
13 |
# include <sys/types.h> |
14 |
#endif |
15 |
#if defined(STDC_HEADERS) |
16 |
# include <stdarg.h> |
17 |
# include <stdlib.h> |
18 |
# include <string.h> |
19 |
#endif |
20 |
#if defined(HAVE_LIBGEN_H) |
21 |
# include <libgen.h> |
22 |
#endif |
23 |
#if defined(HAVE_UNISTD_H) |
24 |
# include <unistd.h> |
25 |
#endif |
26 |
#if defined(HAVE_POLL_H) |
27 |
# include <poll.h> |
28 |
#elif defined(HAVE_SYS_POLL_H) |
29 |
# include <sys/poll.h> |
30 |
#endif |
31 |
#if defined(HAVE_SYS_SOCKET_H) |
32 |
# include <sys/socket.h> |
33 |
#endif |
34 |
#if defined(HAVE_NETINET_IN_H) |
35 |
# include <netinet/in.h> |
36 |
#endif |
37 |
#if defined(HAVE_NETINET_IN_SYSTM_H) |
38 |
# include <netinet/in_systm.h> |
39 |
#endif |
40 |
#if defined(HAVE_NETINET_IP_H) |
41 |
# include <netinet/ip.h> |
42 |
#endif |
43 |
#if defined(HAVE_NETDB_H) |
44 |
# if HAVE_DECL_AI_NUMERICHOST |
45 |
# include <netdb.h> |
46 |
# else /* !HAVE_DECL_AI_NUMERICHOST */ |
47 |
# define getaddrinfo non_rfc2553_getaddrinfo |
48 |
# include <netdb.h> |
49 |
# undef getaddrinfo |
50 |
# endif /* !HAVE_DECL_AI_NUMERICHOST */ |
51 |
#endif |
52 |
#if defined(HAVE_ARPA_INET_H) |
53 |
# include <arpa/inet.h> |
54 |
#endif |
55 |
#if defined(HAVE_DIRENT_H) |
56 |
# include <dirent.h> |
57 |
#else |
58 |
# define dirent direct |
59 |
# if defined(HAVE_SYS_NDIR_H) |
60 |
# include <sys/ndir.h> |
61 |
# endif |
62 |
# if defined(HAVE_SYS_DIR_H) |
63 |
# include <sys/dir.h> |
64 |
# endif |
65 |
# if defined(HAVE_NDIR_H) |
66 |
# include <ndir.h> |
67 |
# endif |
68 |
#endif |
69 |
|
70 |
#if defined(HAVE_SYS_IOCTL_H) |
71 |
# include <sys/ioctl.h> |
72 |
#endif |
73 |
#if defined(HAVE_SYS_PARAM_H) |
74 |
# include <sys/param.h> |
75 |
#endif |
76 |
#if defined(HAVE_SYS_STAT_H) |
77 |
# include <sys/stat.h> |
78 |
#endif |
79 |
#if defined(HAVE_SYS_SYSLIMITS_H) |
80 |
# include <sys/syslimits.h> |
81 |
#endif |
82 |
#if defined(HAVE_SYS_WAIT_H) |
83 |
# include <sys/wait.h> |
84 |
#endif |
85 |
|
86 |
#if defined(HAVE_ARPA_FTP_H) |
87 |
# include <arpa/ftp.h> |
88 |
#endif |
89 |
|
90 |
#if defined(HAVE_FCNTL_H) |
91 |
# include <fcntl.h> |
92 |
#endif |
93 |
#if defined(HAVE_LIMITS_H) |
94 |
# include <limits.h> |
95 |
#endif |
96 |
#if defined(HAVE_PWD_H) |
97 |
# include <pwd.h> |
98 |
#endif |
99 |
#if defined(HAVE_SETJMP_H) |
100 |
# include <setjmp.h> |
101 |
#endif |
102 |
#if defined(HAVE_SIGNAL_H) |
103 |
# include <signal.h> |
104 |
#endif |
105 |
#if defined(HAVE_STDDEF_H) |
106 |
# include <stddef.h> |
107 |
#endif |
108 |
#if defined(HAVE_TERMIOS_H) |
109 |
# include <termios.h> |
110 |
#endif |
111 |
|
112 |
#if defined(HAVE_POLL) |
113 |
/* we use poll */ |
114 |
#elif defined(HAVE_SELECT) |
115 |
/* we use select */ |
116 |
#else /* !defined(HAVE_POLL) && !defined(HAVE_SELECT) */ |
117 |
# error "no poll() or select() found" |
118 |
#endif |
119 |
#if !defined(POLLIN) |
120 |
# define POLLIN 0x0001 |
121 |
#endif |
122 |
#if !defined(POLLOUT) |
123 |
# define POLLOUT 0x0004 |
124 |
#endif |
125 |
#if !defined(POLLRDNORM) |
126 |
# define POLLRDNORM 0x0040 |
127 |
#endif |
128 |
#if !defined(POLLWRNORM) |
129 |
# define POLLWRNORM POLLOUT |
130 |
#endif |
131 |
#if !defined(POLLRDBAND) |
132 |
# define POLLRDBAND 0x0080 |
133 |
#endif |
134 |
#if !defined(INFTIM) |
135 |
# define INFTIM -1 |
136 |
#endif |
137 |
#if !defined(HAVE_STRUCT_POLLFD) |
138 |
struct pollfd { |
139 |
int fd; |
140 |
short events; |
141 |
short revents; |
142 |
}; |
143 |
#endif |
144 |
|
145 |
#if defined(TIME_WITH_SYS_TIME) |
146 |
# include <sys/time.h> |
147 |
# include <time.h> |
148 |
#else |
149 |
# if defined(HAVE_SYS_TIME_H) |
150 |
# include <sys/time.h> |
151 |
# else |
152 |
# include <time.h> |
153 |
# endif |
154 |
#endif |
155 |
|
156 |
#if defined(HAVE_ERR_H) |
157 |
# include <err.h> |
158 |
#endif |
159 |
|
160 |
#if defined(USE_GLOB_H) /* not set by configure; used by other build systems */ |
161 |
# include <glob.h> |
162 |
#else |
163 |
# include "ftpglob.h" |
164 |
#endif |
165 |
|
166 |
#if defined(HAVE_PATHS_H) |
167 |
# include <paths.h> |
168 |
#endif |
169 |
#if !defined(_PATH_BSHELL) |
170 |
# define _PATH_BSHELL "/bin/sh" |
171 |
#endif |
172 |
#if !defined(_PATH_TMP) |
173 |
# define _PATH_TMP "/tmp/" |
174 |
#endif |
175 |
|
176 |
typedef struct _stringlist { |
177 |
char **sl_str; |
178 |
size_t sl_max; |
179 |
size_t sl_cur; |
180 |
} StringList; |
181 |
|
182 |
StringList *sl_init(void); |
183 |
int sl_add(StringList *, char *); |
184 |
void sl_free(StringList *, int); |
185 |
char *sl_find(StringList *, char *); |
186 |
|
187 |
#if defined(HAVE_TERMCAP_H) |
188 |
# include <termcap.h> |
189 |
#else |
190 |
int tgetent(char *, const char *); |
191 |
char *tgetstr(const char *, char **); |
192 |
int tgetflag(const char *); |
193 |
int tgetnum(const char *); |
194 |
char *tgoto(const char *, int, int); |
195 |
void tputs(const char *, int, int (*)(int)); |
196 |
#endif /* !HAVE_TERMCAP_H */ |
197 |
|
198 |
#if defined(HAVE_VIS_H) && defined(HAVE_STRVIS) && defined(HAVE_STRUNVIS) |
199 |
# include <vis.h> |
200 |
#else |
201 |
# include "ftpvis.h" |
202 |
#endif |
203 |
|
204 |
#if !defined(HAVE_IN_PORT_T) |
205 |
typedef unsigned short in_port_t; |
206 |
#endif |
207 |
|
208 |
#if !defined(HAVE_SA_FAMILY_T) |
209 |
typedef unsigned short sa_family_t; |
210 |
#endif |
211 |
|
212 |
#if !defined(HAVE_SOCKLEN_T) |
213 |
typedef unsigned int socklen_t; |
214 |
#endif |
215 |
|
216 |
#if defined(USE_INET6) |
217 |
# define INET6 |
218 |
#endif |
219 |
|
220 |
#if !HAVE_DECL_AI_NUMERICHOST |
221 |
|
222 |
/* RFC 2553 */ |
223 |
#undef EAI_ADDRFAMILY |
224 |
#define EAI_ADDRFAMILY 1 /* address family for hostname not supported */ |
225 |
#undef EAI_AGAIN |
226 |
#define EAI_AGAIN 2 /* temporary failure in name resolution */ |
227 |
#undef EAI_BADFLAGS |
228 |
#define EAI_BADFLAGS 3 /* invalid value for ai_flags */ |
229 |
#undef EAI_FAIL |
230 |
#define EAI_FAIL 4 /* non-recoverable failure in name resolution */ |
231 |
#undef EAI_FAMILY |
232 |
#define EAI_FAMILY 5 /* ai_family not supported */ |
233 |
#undef EAI_MEMORY |
234 |
#define EAI_MEMORY 6 /* memory allocation failure */ |
235 |
#undef EAI_NODATA |
236 |
#define EAI_NODATA 7 /* no address associated with hostname */ |
237 |
#undef EAI_NONAME |
238 |
#define EAI_NONAME 8 /* hostname nor servname provided, or not known */ |
239 |
#undef EAI_SERVICE |
240 |
#define EAI_SERVICE 9 /* servname not supported for ai_socktype */ |
241 |
#undef EAI_SOCKTYPE |
242 |
#define EAI_SOCKTYPE 10 /* ai_socktype not supported */ |
243 |
#undef EAI_SYSTEM |
244 |
#define EAI_SYSTEM 11 /* system error returned in errno */ |
245 |
|
246 |
/* KAME extensions? */ |
247 |
#undef EAI_BADHINTS |
248 |
#define EAI_BADHINTS 12 |
249 |
#undef EAI_PROTOCOL |
250 |
#define EAI_PROTOCOL 13 |
251 |
#undef EAI_MAX |
252 |
#define EAI_MAX 14 |
253 |
|
254 |
/* RFC 2553 */ |
255 |
#undef NI_MAXHOST |
256 |
#define NI_MAXHOST 1025 |
257 |
#undef NI_MAXSERV |
258 |
#define NI_MAXSERV 32 |
259 |
|
260 |
#undef NI_NOFQDN |
261 |
#define NI_NOFQDN 0x00000001 |
262 |
#undef NI_NUMERICHOST |
263 |
#define NI_NUMERICHOST 0x00000002 |
264 |
#undef NI_NAMEREQD |
265 |
#define NI_NAMEREQD 0x00000004 |
266 |
#undef NI_NUMERICSERV |
267 |
#define NI_NUMERICSERV 0x00000008 |
268 |
#undef NI_DGRAM |
269 |
#define NI_DGRAM 0x00000010 |
270 |
|
271 |
/* RFC 2553 */ |
272 |
#undef AI_PASSIVE |
273 |
#define AI_PASSIVE 0x00000001 /* get address to use bind() */ |
274 |
#undef AI_CANONNAME |
275 |
#define AI_CANONNAME 0x00000002 /* fill ai_canonname */ |
276 |
|
277 |
/* KAME extensions ? */ |
278 |
#undef AI_NUMERICHOST |
279 |
#define AI_NUMERICHOST 0x00000004 /* prevent name resolution */ |
280 |
#undef AI_MASK |
281 |
#define AI_MASK (AI_PASSIVE | AI_CANONNAME | AI_NUMERICHOST) |
282 |
|
283 |
/* RFC 2553 */ |
284 |
#undef AI_ALL |
285 |
#define AI_ALL 0x00000100 /* IPv6 and IPv4-mapped (with AI_V4MAPPED) */ |
286 |
#undef AI_V4MAPPED_CFG |
287 |
#define AI_V4MAPPED_CFG 0x00000200 /* accept IPv4-mapped if kernel supports */ |
288 |
#undef AI_ADDRCONFIG |
289 |
#define AI_ADDRCONFIG 0x00000400 /* only if any address is assigned */ |
290 |
#undef AI_V4MAPPED |
291 |
#define AI_V4MAPPED 0x00000800 /* accept IPv4-mapped IPv6 address */ |
292 |
|
293 |
#endif /* !HAVE_DECL_AI_NUMERICHOST */ |
294 |
|
295 |
|
296 |
#if !HAVE_DECL_AI_NUMERICHOST && !defined(HAVE_STRUCT_ADDRINFO) \ |
297 |
&& !defined(USE_SOCKS) |
298 |
|
299 |
struct addrinfo { |
300 |
int ai_flags; /* AI_PASSIVE, AI_CANONNAME, AI_NUMERICHOST */ |
301 |
int ai_family; /* PF_xxx */ |
302 |
int ai_socktype; /* SOCK_xxx */ |
303 |
int ai_protocol; /* 0 or IPPROTO_xxx for IPv4 and IPv6 */ |
304 |
socklen_t ai_addrlen; /* length of ai_addr */ |
305 |
char *ai_canonname; /* canonical name for hostname */ |
306 |
struct sockaddr *ai_addr; /* binary address */ |
307 |
struct addrinfo *ai_next; /* next structure in linked list */ |
308 |
}; |
309 |
|
310 |
int getaddrinfo(const char *, const char *, |
311 |
const struct addrinfo *, struct addrinfo **); |
312 |
int getnameinfo(const struct sockaddr *, socklen_t, |
313 |
char *, size_t, char *, size_t, int); |
314 |
void freeaddrinfo(struct addrinfo *); |
315 |
const char *gai_strerror(int); |
316 |
|
317 |
#endif /* !HAVE_DECL_AI_NUMERICHOST && !defined(HAVE_STRUCT_ADDRINFO) \ |
318 |
&& !defined(USE_SOCKS) */ |
319 |
|
320 |
#if !defined(HAVE_STRUCT_DIRENT_D_NAMLEN) |
321 |
# define DIRENT_MISSING_D_NAMLEN |
322 |
#endif |
323 |
|
324 |
#if !HAVE_DECL_H_ERRNO |
325 |
extern int h_errno; |
326 |
#endif |
327 |
#define HAVE_H_ERRNO 1 /* XXX: an assumption for now... */ |
328 |
|
329 |
#if !HAVE_DECL_FCLOSE |
330 |
int fclose(FILE *); |
331 |
#endif |
332 |
|
333 |
#if !HAVE_DECL_GETPASS |
334 |
char *getpass(const char *); |
335 |
#endif |
336 |
|
337 |
#if !HAVE_DECL_OPTARG |
338 |
extern char *optarg; |
339 |
#endif |
340 |
|
341 |
#if !HAVE_DECL_OPTIND |
342 |
extern int optind; |
343 |
#endif |
344 |
|
345 |
#if !HAVE_DECL_PCLOSE |
346 |
int pclose(FILE *); |
347 |
#endif |
348 |
|
349 |
#if !HAVE_DECL_DIRNAME |
350 |
char *dirname(char *); |
351 |
#endif |
352 |
|
353 |
#if !defined(HAVE_ERR) |
354 |
void err(int, const char *, ...); |
355 |
void errx(int, const char *, ...); |
356 |
void warn(const char *, ...); |
357 |
void warnx(const char *, ...); |
358 |
#endif |
359 |
|
360 |
#if !defined(HAVE_FGETLN) |
361 |
char *fgetln(FILE *, size_t *); |
362 |
#endif |
363 |
|
364 |
#if !defined(HAVE_FSEEKO) |
365 |
int fseeko(FILE *, off_t, int); |
366 |
#endif |
367 |
|
368 |
#if !defined(HAVE_INET_NTOP) |
369 |
const char *inet_ntop(int, const void *, char *, socklen_t); |
370 |
#endif |
371 |
|
372 |
#if !defined(HAVE_INET_PTON) |
373 |
int inet_pton(int, const char *, void *); |
374 |
#endif |
375 |
|
376 |
#if !defined(HAVE_MKSTEMP) |
377 |
int mkstemp(char *); |
378 |
#endif |
379 |
|
380 |
#if !defined(HAVE_SETPROGNAME) |
381 |
const char *getprogname(void); |
382 |
void setprogname(const char *); |
383 |
#endif |
384 |
|
385 |
#if !defined(HAVE_SNPRINTF) |
386 |
int snprintf(char *, size_t, const char *, ...); |
387 |
#endif |
388 |
|
389 |
#if !defined(HAVE_STRDUP) |
390 |
char *strdup(const char *); |
391 |
#endif |
392 |
|
393 |
#if !defined(HAVE_STRERROR) |
394 |
char *strerror(int); |
395 |
#endif |
396 |
|
397 |
#if !defined(HAVE_STRPTIME) || !HAVE_DECL_STRPTIME |
398 |
char *strptime(const char *, const char *, struct tm *); |
399 |
#endif |
400 |
|
401 |
#if defined(HAVE_PRINTF_LONG_LONG) && defined(HAVE_LONG_LONG_INT) |
402 |
# if !defined(HAVE_STRTOLL) |
403 |
long long strtoll(const char *, char **, int); |
404 |
# endif |
405 |
# if !defined(LLONG_MIN) |
406 |
# define LLONG_MIN (-0x7fffffffffffffffLL-1) |
407 |
# endif |
408 |
# if !defined(LLONG_MAX) |
409 |
# define LLONG_MAX (0x7fffffffffffffffLL) |
410 |
# endif |
411 |
#else /* !(defined(HAVE_PRINTF_LONG_LONG) && defined(HAVE_LONG_LONG_INT)) */ |
412 |
# define NO_LONG_LONG 1 |
413 |
#endif /* !(defined(HAVE_PRINTF_LONG_LONG) && defined(HAVE_LONG_LONG_INT)) */ |
414 |
|
415 |
#if !defined(HAVE_TIMEGM) |
416 |
time_t timegm(struct tm *); |
417 |
#endif |
418 |
|
419 |
#if !defined(HAVE_STRLCAT) |
420 |
size_t strlcat(char *, const char *, size_t); |
421 |
#endif |
422 |
|
423 |
#if !defined(HAVE_STRLCPY) |
424 |
size_t strlcpy(char *, const char *, size_t); |
425 |
#endif |
426 |
|
427 |
#if !defined(HAVE_STRSEP) |
428 |
char *strsep(char **stringp, const char *delim); |
429 |
#endif |
430 |
|
431 |
#if !defined(HAVE_UTIMES) |
432 |
int utimes(const char *, const struct timeval *); |
433 |
#endif |
434 |
|
435 |
#if !defined(HAVE_MEMMOVE) |
436 |
# define memmove(a,b,c) bcopy((b),(a),(c)) |
437 |
/* XXX: add others #defines for borken systems? */ |
438 |
#endif |
439 |
|
440 |
#if defined(HAVE_GETPASSPHRASE) |
441 |
# define getpass getpassphrase |
442 |
#endif |
443 |
|
444 |
#if !defined(MIN) |
445 |
# define MIN(a, b) ((a) < (b) ? (a) : (b)) |
446 |
#endif |
447 |
#if !defined(MAX) |
448 |
# define MAX(a, b) ((a) < (b) ? (b) : (a)) |
449 |
#endif |
450 |
|
451 |
#if !defined(timersub) |
452 |
# define timersub(tvp, uvp, vvp) \ |
453 |
do { \ |
454 |
(vvp)->tv_sec = (tvp)->tv_sec - (uvp)->tv_sec; \ |
455 |
(vvp)->tv_usec = (tvp)->tv_usec - (uvp)->tv_usec; \ |
456 |
if ((vvp)->tv_usec < 0) { \ |
457 |
(vvp)->tv_sec--; \ |
458 |
(vvp)->tv_usec += 1000000; \ |
459 |
} \ |
460 |
} while (0) |
461 |
#endif |
462 |
|
463 |
#if !defined(S_ISLNK) |
464 |
# define S_ISLNK(m) ((m & S_IFMT) == S_IFLNK) |
465 |
#endif |
466 |
|
467 |
#define EPOCH_YEAR 1970 |
468 |
#define SECSPERHOUR 3600 |
469 |
#define SECSPERDAY 86400 |
470 |
#define TM_YEAR_BASE 1900 |
471 |
|
472 |
#if defined(USE_SOCKS) /* (Dante) SOCKS5 */ |
473 |
#define connect Rconnect |
474 |
#define bind Rbind |
475 |
#define getsockname Rgetsockname |
476 |
#define getpeername Rgetpeername |
477 |
#define accept Raccept |
478 |
#define rresvport Rrresvport |
479 |
#define bindresvport Rbindresvport |
480 |
#define gethostbyname Rgethostbyname |
481 |
#define gethostbyname2 Rgethostbyname2 |
482 |
#define sendto Rsendto |
483 |
#define recvfrom Rrecvfrom |
484 |
#define recvfrom Rrecvfrom |
485 |
#define write Rwrite |
486 |
#define writev Rwritev |
487 |
#define send Rsend |
488 |
#define sendmsg Rsendmsg |
489 |
#define read Rread |
490 |
#define readv Rreadv |
491 |
#define recv Rrecv |
492 |
#define recvmsg Rrecvmsg |
493 |
#define getaddrinfo Rgetaddrinfo |
494 |
#define getipnodebyname Rgetipnodebyname |
495 |
#endif /* defined(USE_SOCKS) */ |