114062Swpaul/* $NetBSD: tnftp.h,v 1.33 2009/11/14 08:32:42 lukem Exp $ */ 214062Swpaul 314062Swpaul#define FTP_PRODUCT PACKAGE_NAME 414062Swpaul#define FTP_VERSION PACKAGE_VERSION 514062Swpaul 614062Swpaul#include "tnftp_config.h" 714062Swpaul 814062Swpaul#include <stdio.h> 914062Swpaul#include <ctype.h> 1014062Swpaul#include <errno.h> 1114062Swpaul 1214062Swpaul#if defined(HAVE_SYS_TYPES_H) 1314062Swpaul# include <sys/types.h> 1414062Swpaul#endif 1514062Swpaul#if defined(STDC_HEADERS) 1614062Swpaul# include <stdarg.h> 1714062Swpaul# include <stdlib.h> 1814062Swpaul# include <string.h> 1914062Swpaul#endif 2014062Swpaul#if defined(HAVE_LIBGEN_H) 2114062Swpaul# include <libgen.h> 2214062Swpaul#endif 2314062Swpaul#if defined(HAVE_UNISTD_H) 2414062Swpaul# include <unistd.h> 2514062Swpaul#endif 2614062Swpaul#if defined(HAVE_POLL_H) 2714062Swpaul# include <poll.h> 2814062Swpaul#elif defined(HAVE_SYS_POLL_H) 2914062Swpaul# include <sys/poll.h> 3014062Swpaul#endif 3114062Swpaul#if defined(HAVE_SYS_SOCKET_H) 3250479Speter# include <sys/socket.h> 3314062Swpaul#endif 3414062Swpaul#if defined(HAVE_NETINET_IN_H) 3596222Sdes# include <netinet/in.h> 3696222Sdes#endif 3714062Swpaul#if defined(HAVE_NETINET_IN_SYSTM_H) 3814062Swpaul# include <netinet/in_systm.h> 3914062Swpaul#endif 4014062Swpaul#if defined(HAVE_NETINET_IP_H) 4116649Swpaul# include <netinet/ip.h> 4216649Swpaul#endif 4316649Swpaul#if defined(HAVE_NETDB_H) 4416649Swpaul# if HAVE_DECL_AI_NUMERICHOST 4516649Swpaul# include <netdb.h> 4614062Swpaul# else /* !HAVE_DECL_AI_NUMERICHOST */ 4714062Swpaul# define getaddrinfo non_rfc2553_getaddrinfo 4814062Swpaul# include <netdb.h> 4914062Swpaul# undef getaddrinfo 5014062Swpaul# endif /* !HAVE_DECL_AI_NUMERICHOST */ 5190297Sdes#endif 5290297Sdes#if defined(HAVE_ARPA_INET_H) 5399824Salfred# include <arpa/inet.h> 5490297Sdes#endif 5590297Sdes#if defined(HAVE_DIRENT_H) 5699824Salfred# include <dirent.h> 5714062Swpaul#else 5814062Swpaul# define dirent direct 5914062Swpaul# if defined(HAVE_SYS_NDIR_H) 6014062Swpaul# include <sys/ndir.h> 6114062Swpaul# endif 6214062Swpaul# if defined(HAVE_SYS_DIR_H) 6314062Swpaul# include <sys/dir.h> 6414241Swpaul# endif 6516134Swpaul# if defined(HAVE_NDIR_H) 6614062Swpaul# include <ndir.h> 6790297Sdes# endif 6896222Sdes#endif 6996222Sdes 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) 138struct 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 176typedef struct _stringlist { 177 char **sl_str; 178 size_t sl_max; 179 size_t sl_cur; 180} StringList; 181 182StringList *sl_init(void); 183int sl_add(StringList *, char *); 184void sl_free(StringList *, int); 185char *sl_find(StringList *, char *); 186 187#if defined(HAVE_TERMCAP_H) 188# include <termcap.h> 189#else 190int tgetent(char *, const char *); 191char *tgetstr(const char *, char **); 192int tgetflag(const char *); 193int tgetnum(const char *); 194char *tgoto(const char *, int, int); 195void 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) 205typedef unsigned short in_port_t; 206#endif 207 208#if !defined(HAVE_SA_FAMILY_T) 209typedef unsigned short sa_family_t; 210#endif 211 212#if !defined(HAVE_SOCKLEN_T) 213typedef 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 299struct 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 310int getaddrinfo(const char *, const char *, 311 const struct addrinfo *, struct addrinfo **); 312int getnameinfo(const struct sockaddr *, socklen_t, 313 char *, size_t, char *, size_t, int); 314void freeaddrinfo(struct addrinfo *); 315const 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 325extern int h_errno; 326#endif 327#define HAVE_H_ERRNO 1 /* XXX: an assumption for now... */ 328 329#if !HAVE_DECL_FCLOSE 330int fclose(FILE *); 331#endif 332 333#if !HAVE_DECL_GETPASS 334char *getpass(const char *); 335#endif 336 337#if !HAVE_DECL_OPTARG 338extern char *optarg; 339#endif 340 341#if !HAVE_DECL_OPTIND 342extern int optind; 343#endif 344 345#if !HAVE_DECL_PCLOSE 346int pclose(FILE *); 347#endif 348 349#if !HAVE_DECL_DIRNAME 350char *dirname(char *); 351#endif 352 353#if !defined(HAVE_ERR) 354void err(int, const char *, ...); 355void errx(int, const char *, ...); 356void warn(const char *, ...); 357void warnx(const char *, ...); 358#endif 359 360#if !defined(HAVE_FGETLN) 361char *fgetln(FILE *, size_t *); 362#endif 363 364#if !defined(HAVE_FSEEKO) 365int fseeko(FILE *, off_t, int); 366#endif 367 368#if !defined(HAVE_INET_NTOP) 369const char *inet_ntop(int, const void *, char *, socklen_t); 370#endif 371 372#if !defined(HAVE_INET_PTON) 373int inet_pton(int, const char *, void *); 374#endif 375 376#if !defined(HAVE_MKSTEMP) 377int mkstemp(char *); 378#endif 379 380#if !defined(HAVE_SETPROGNAME) 381const char *getprogname(void); 382void setprogname(const char *); 383#endif 384 385#if !defined(HAVE_SNPRINTF) 386int snprintf(char *, size_t, const char *, ...); 387#endif 388 389#if !defined(HAVE_STRDUP) 390char *strdup(const char *); 391#endif 392 393#if !defined(HAVE_STRERROR) 394char *strerror(int); 395#endif 396 397#if !defined(HAVE_STRPTIME) || !HAVE_DECL_STRPTIME 398char *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) 403long 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) 416time_t timegm(struct tm *); 417#endif 418 419#if !defined(HAVE_STRLCAT) 420size_t strlcat(char *, const char *, size_t); 421#endif 422 423#if !defined(HAVE_STRLCPY) 424size_t strlcpy(char *, const char *, size_t); 425#endif 426 427#if !defined(HAVE_STRSEP) 428char *strsep(char **stringp, const char *delim); 429#endif 430 431#if !defined(HAVE_UTIMES) 432int 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) */ 496