lukemftpd.h revision 267654
1230557Sjimharris/* $Id: lukemftpd.h,v 1.20 2002/05/23 02:43:58 lukem Exp $ */ 2230557Sjimharris 3230557Sjimharris#define FTPD_VERSION "lukemftpd 1.2 beta 2" 4230557Sjimharris 5230557Sjimharris#include "config.h" 6230557Sjimharris 7230557Sjimharris#include <sys/types.h> 8230557Sjimharris#include <sys/param.h> 9230557Sjimharris#include <sys/ioctl.h> 10230557Sjimharris#include <sys/socket.h> 11230557Sjimharris#include <sys/stat.h> 12230557Sjimharris#include <sys/wait.h> 13230557Sjimharris#if HAVE_SYS_SYSMACROS_H 14230557Sjimharris# include <sys/sysmacros.h> 15230557Sjimharris#endif 16230557Sjimharris 17230557Sjimharris#include <netinet/in.h> 18230557Sjimharris#include <netinet/in_systm.h> 19230557Sjimharris#include <netinet/ip.h> 20230557Sjimharris 21230557Sjimharris#if HAVE_FTP_NAMES 22230557Sjimharris# include <arpa/ftp.h> 23230557Sjimharris#else 24230557Sjimharris# include "arpaftp.h" 25230557Sjimharris#endif 26230557Sjimharris#include <arpa/inet.h> 27230557Sjimharris 28230557Sjimharris#include <ctype.h> 29230557Sjimharris#include <errno.h> 30230557Sjimharris#include <fcntl.h> 31230557Sjimharris#include <grp.h> 32230557Sjimharris#include <limits.h> 33230557Sjimharris#include <locale.h> 34230557Sjimharris#include <netdb.h> 35230557Sjimharris#include <pwd.h> 36230557Sjimharris#include <setjmp.h> 37230557Sjimharris#include <signal.h> 38230557Sjimharris#include <stdarg.h> 39230557Sjimharris#include <stddef.h> 40230557Sjimharris#include <stdio.h> 41230557Sjimharris#include <stdlib.h> 42230557Sjimharris#include <string.h> 43230557Sjimharris#include <syslog.h> 44230557Sjimharris#include <termios.h> 45230557Sjimharris#include <unistd.h> 46230557Sjimharris#include <utmp.h> 47230557Sjimharris 48230557Sjimharris#if HAVE_DIRENT_H 49230557Sjimharris# include <dirent.h> 50230557Sjimharris#else 51230557Sjimharris# define dirent direct 52230557Sjimharris# if HAVE_SYS_NDIR_H 53230557Sjimharris# include <sys/ndir.h> 54230557Sjimharris# endif 55230557Sjimharris# if HAVE_SYS_DIR_H 56230557Sjimharris# include <sys/dir.h> 57230557Sjimharris# endif 58230557Sjimharris# if HAVE_NDIR_H 59230557Sjimharris# include <ndir.h> 60230557Sjimharris# endif 61230557Sjimharris#endif 62230557Sjimharris 63230557Sjimharris#if TIME_WITH_SYS_TIME 64230557Sjimharris# include <sys/time.h> 65230557Sjimharris# include <time.h> 66230557Sjimharris#else 67230557Sjimharris# if HAVE_SYS_TIME_H 68230557Sjimharris# include <sys/time.h> 69230557Sjimharris# else 70230557Sjimharris# include <time.h> 71230557Sjimharris# endif 72230557Sjimharris#endif 73230557Sjimharris 74230557Sjimharris#if HAVE_ERR_H 75230557Sjimharris# include <err.h> 76230557Sjimharris#endif 77230557Sjimharris 78230557Sjimharris#if HAVE_WORKING_GLOB 79230557Sjimharris# include <glob.h> 80230557Sjimharris#else 81230557Sjimharris# include "ftpglob.h" 82230557Sjimharris#endif 83230557Sjimharris 84230557Sjimharris#if HAVE_FNM_CASEFOLD 85230557Sjimharris# include <fnmatch.h> 86230557Sjimharris#else 87230557Sjimharris# include "ftpfnmatch.h" 88230557Sjimharris#endif 89230557Sjimharris 90230557Sjimharris#if HAVE_PATHS_H 91230557Sjimharris# include <paths.h> 92230557Sjimharris#endif 93230557Sjimharris#ifndef _PATH_BSHELL 94230557Sjimharris#define _PATH_BSHELL "/bin/sh" 95230557Sjimharris#endif 96230557Sjimharris#ifndef _PATH_CSHELL 97230557Sjimharris#define _PATH_CSHELL "/bin/csh" 98230557Sjimharris#endif 99230557Sjimharris#ifndef _PATH_SHELLS 100230557Sjimharris#define _PATH_SHELLS "/etc/shells" 101230557Sjimharris#endif 102230557Sjimharris#ifndef _PATH_DEVNULL 103230557Sjimharris#define _PATH_DEVNULL "/dev/null" 104230557Sjimharris#endif 105230557Sjimharris#ifndef _PATH_NOLOGIN 106230557Sjimharris#define _PATH_NOLOGIN "/etc/nologin" 107230557Sjimharris#endif 108230557Sjimharris 109230557Sjimharris#ifndef FTPD_LOGTYPE 110230557Sjimharris# ifdef LOG_FTP 111230557Sjimharris# define FTPD_LOGTYPE LOG_FTP 112230557Sjimharris# else 113230557Sjimharris# define FTPD_LOGTYPE LOG_DAEMON 114230557Sjimharris# endif 115230557Sjimharris#endif 116230557Sjimharris 117230557Sjimharris#ifndef LOG_AUTHPRIV 118230557Sjimharris# ifdef LOG_AUTH 119230557Sjimharris# define LOG_AUTHPRIV LOG_AUTH 120230557Sjimharris# else 121230557Sjimharris# define LOG_AUTHPRIV LOG_DAEMON 122230557Sjimharris# endif 123230557Sjimharris#endif 124230557Sjimharris 125230557Sjimharristypedef struct _stringlist { 126230557Sjimharris char **sl_str; 127230557Sjimharris size_t sl_max; 128230557Sjimharris size_t sl_cur; 129230557Sjimharris} StringList; 130230557Sjimharris 131230557SjimharrisStringList *sl_init(void); 132230557Sjimharrisint sl_add(StringList *, char *); 133230557Sjimharrisvoid sl_free(StringList *, int); 134230557Sjimharrischar *sl_find(StringList *, char *); 135230557Sjimharris 136230557Sjimharris#if HAVE_FTS_H 137230557Sjimharris# include <fts.h> 138230557Sjimharris#else 139230557Sjimharris# include "ftpfts.h" 140230557Sjimharris#endif 141230557Sjimharris 142230557Sjimharris#if HAVE_UTIL_H 143230557Sjimharris# include <util.h> 144230557Sjimharris#endif 145230557Sjimharris 146230557Sjimharris#if HAVE_LIBUTIL_H 147230557Sjimharris# include <libutil.h> 148230557Sjimharris#endif 149230557Sjimharris 150230557Sjimharris#if ! HAVE_IN_PORT_T 151230557Sjimharristypedef unsigned short in_port_t; 152230557Sjimharris#endif 153230557Sjimharris 154230557Sjimharris#if ! HAVE_SOCKLEN_T 155230557Sjimharristypedef unsigned int socklen_t; 156230557Sjimharris#endif 157230557Sjimharris 158230557Sjimharris#if HAVE_AF_INET6 && HAVE_SOCKADDR_IN6 159230557Sjimharris# define INET6 160230557Sjimharris#endif 161230557Sjimharris 162230557Sjimharris 163230557Sjimharris#if ! HAVE_RFC2553_NETDB 164230557Sjimharris 165230557Sjimharris /* RFC 2553 */ 166230557Sjimharris#undef EAI_ADDRFAMILY 167230557Sjimharris#define EAI_ADDRFAMILY 1 /* address family for hostname not supported */ 168230557Sjimharris#undef EAI_AGAIN 169230557Sjimharris#define EAI_AGAIN 2 /* temporary failure in name resolution */ 170230557Sjimharris#undef EAI_BADFLAGS 171230557Sjimharris#define EAI_BADFLAGS 3 /* invalid value for ai_flags */ 172230557Sjimharris#undef EAI_FAIL 173230557Sjimharris#define EAI_FAIL 4 /* non-recoverable failure in name resolution */ 174230557Sjimharris#undef EAI_FAMILY 175230557Sjimharris#define EAI_FAMILY 5 /* ai_family not supported */ 176230557Sjimharris#undef EAI_MEMORY 177230557Sjimharris#define EAI_MEMORY 6 /* memory allocation failure */ 178230557Sjimharris#undef EAI_NODATA 179230557Sjimharris#define EAI_NODATA 7 /* no address associated with hostname */ 180230557Sjimharris#undef EAI_NONAME 181230557Sjimharris#define EAI_NONAME 8 /* hostname nor servname provided, or not known */ 182230557Sjimharris#undef EAI_SERVICE 183230557Sjimharris#define EAI_SERVICE 9 /* servname not supported for ai_socktype */ 184230557Sjimharris#undef EAI_SOCKTYPE 185230557Sjimharris#define EAI_SOCKTYPE 10 /* ai_socktype not supported */ 186230557Sjimharris#undef EAI_SYSTEM 187230557Sjimharris#define EAI_SYSTEM 11 /* system error returned in errno */ 188230557Sjimharris 189230557Sjimharris /* KAME extensions? */ 190230557Sjimharris#undef EAI_BADHINTS 191230557Sjimharris#define EAI_BADHINTS 12 192230557Sjimharris#undef EAI_PROTOCOL 193230557Sjimharris#define EAI_PROTOCOL 13 194230557Sjimharris#undef EAI_MAX 195230792Sjimharris#define EAI_MAX 14 196230792Sjimharris 197230557Sjimharris /* RFC 2553 */ 198230557Sjimharris#undef NI_MAXHOST 199230557Sjimharris#define NI_MAXHOST 1025 200230557Sjimharris#undef NI_MAXSERV 201230557Sjimharris#define NI_MAXSERV 32 202230557Sjimharris 203230557Sjimharris#undef NI_NOFQDN 204230557Sjimharris#define NI_NOFQDN 0x00000001 205230557Sjimharris#undef NI_NUMERICHOST 206230557Sjimharris#define NI_NUMERICHOST 0x00000002 207230557Sjimharris#undef NI_NAMEREQD 208230557Sjimharris#define NI_NAMEREQD 0x00000004 209230557Sjimharris#undef NI_NUMERICSERV 210230557Sjimharris#define NI_NUMERICSERV 0x00000008 211230557Sjimharris#undef NI_DGRAM 212230557Sjimharris#define NI_DGRAM 0x00000010 213230557Sjimharris 214230557Sjimharris /* RFC 2553 */ 215230557Sjimharris#undef AI_PASSIVE 216230557Sjimharris#define AI_PASSIVE 0x00000001 /* get address to use bind() */ 217230557Sjimharris#undef AI_CANONNAME 218230557Sjimharris#define AI_CANONNAME 0x00000002 /* fill ai_canonname */ 219230557Sjimharris 220230557Sjimharris /* KAME extensions ? */ 221230557Sjimharris#undef AI_NUMERICHOST 222230557Sjimharris#define AI_NUMERICHOST 0x00000004 /* prevent name resolution */ 223230557Sjimharris#undef AI_MASK 224230557Sjimharris#define AI_MASK (AI_PASSIVE | AI_CANONNAME | AI_NUMERICHOST) 225230557Sjimharris 226230557Sjimharris /* RFC 2553 */ 227230557Sjimharris#undef AI_ALL 228230557Sjimharris#define AI_ALL 0x00000100 /* IPv6 and IPv4-mapped (with AI_V4MAPPED) */ 229230557Sjimharris#undef AI_V4MAPPED_CFG 230230557Sjimharris#define AI_V4MAPPED_CFG 0x00000200 /* accept IPv4-mapped if kernel supports */ 231230557Sjimharris#undef AI_ADDRCONFIG 232230557Sjimharris#define AI_ADDRCONFIG 0x00000400 /* only if any address is assigned */ 233230557Sjimharris#undef AI_V4MAPPED 234230557Sjimharris#define AI_V4MAPPED 0x00000800 /* accept IPv4-mapped IPv6 address */ 235230557Sjimharris 236230557Sjimharris#endif /* ! HAVE_RFC2553_NETDB */ 237230557Sjimharris 238230557Sjimharris 239230557Sjimharris#if ! HAVE_RFC2553_NETDB && ! HAVE_ADDRINFO 240230557Sjimharris 241230557Sjimharrisstruct addrinfo { 242230557Sjimharris int ai_flags; /* AI_PASSIVE, AI_CANONNAME, AI_NUMERICHOST */ 243230557Sjimharris int ai_family; /* PF_xxx */ 244230557Sjimharris int ai_socktype; /* SOCK_xxx */ 245230557Sjimharris int ai_protocol; /* 0 or IPPROTO_xxx for IPv4 and IPv6 */ 246230557Sjimharris size_t ai_addrlen; /* length of ai_addr */ 247230557Sjimharris char *ai_canonname; /* canonical name for hostname */ 248230557Sjimharris struct sockaddr *ai_addr; /* binary address */ 249230557Sjimharris struct addrinfo *ai_next; /* next structure in linked list */ 250230557Sjimharris}; 251230557Sjimharris 252230557Sjimharrisint getaddrinfo(const char *, const char *, 253230557Sjimharris const struct addrinfo *, struct addrinfo **); 254230557Sjimharrisint getnameinfo(const struct sockaddr *, socklen_t, char *, 255230557Sjimharris size_t, char *, size_t, int); 256230557Sjimharrisvoid freeaddrinfo(struct addrinfo *); 257230557Sjimharrischar *gai_strerror(int); 258230557Sjimharris 259230557Sjimharris#endif /* ! HAVE_RFC2553_NETDB && ! HAVE_ADDRINFO */ 260230557Sjimharris 261230557Sjimharris 262230557Sjimharris#if ! HAVE_D_NAMLEN 263230557Sjimharris# define DIRENT_MISSING_D_NAMLEN 264230557Sjimharris#endif 265230557Sjimharris 266230557Sjimharris#if ! HAVE_CRYPT_D 267230557Sjimharrischar *crypt(const char *, const char *); 268230557Sjimharris#endif 269230557Sjimharris 270230557Sjimharris#if ! HAVE_FCLOSE_D 271230557Sjimharrisint fclose(FILE *); 272230557Sjimharris#endif 273230557Sjimharris 274230557Sjimharris#if ! HAVE_OPTARG_D 275230557Sjimharrisextern char *optarg; 276230557Sjimharris#endif 277230557Sjimharris 278230557Sjimharris#if ! HAVE_OPTIND_D 279230557Sjimharrisextern int optind; 280230557Sjimharris#endif 281230557Sjimharris 282230557Sjimharris#if ! HAVE_PCLOSE_D 283230557Sjimharrisint pclose(FILE *); 284230557Sjimharris#endif 285230557Sjimharris 286230557Sjimharris#if ! HAVE_ERR 287230557Sjimharrisvoid err(int, const char *, ...); 288230557Sjimharrisvoid errx(int, const char *, ...); 289230557Sjimharrisvoid warn(const char *, ...); 290230557Sjimharrisvoid warnx(const char *, ...); 291230557Sjimharris#endif 292230557Sjimharris 293230557Sjimharris#if ! HAVE_FGETLN 294230557Sjimharrischar *fgetln(FILE *, size_t *); 295230557Sjimharris#endif 296230557Sjimharris 297230557Sjimharris#if ! HAVE_FPARSELN 298230557Sjimharris# define FPARSELN_UNESCESC 0x01 299230557Sjimharris# define FPARSELN_UNESCCONT 0x02 300230557Sjimharris# define FPARSELN_UNESCCOMM 0x04 301230557Sjimharris# define FPARSELN_UNESCREST 0x08 302230557Sjimharris# define FPARSELN_UNESCALL 0x0f 303230557Sjimharrischar *fparseln(FILE *, size_t *, size_t *, const char[3], int); 304230557Sjimharris#endif 305230557Sjimharris 306230557Sjimharris#if ! HAVE_GETUSERSHELL || ! HAVE_GETUSERSHELL_D 307230557Sjimharrischar *getusershell(void); 308230557Sjimharrisvoid setusershell(void); 309230557Sjimharrisvoid endusershell(void); 310230557Sjimharris#endif 311230557Sjimharris 312230557Sjimharris#if ! HAVE_INET_NTOP 313230557Sjimharrisconst char *inet_ntop(int, const void *, char *, size_t); 314230557Sjimharris#endif 315230557Sjimharris 316230557Sjimharris#if ! HAVE_INET_PTON 317230557Sjimharrisint inet_pton(int, const char *, void *); 318230557Sjimharris#endif 319230557Sjimharris 320230557Sjimharris#if ! HAVE_MKSTEMP 321230557Sjimharrisint mkstemp(const char *); 322230557Sjimharris#endif 323230557Sjimharris 324230557Sjimharris#if ! HAVE_SNPRINTF 325230557Sjimharrisint snprintf(char *, size_t, const char *, ...); 326230557Sjimharris#endif 327230557Sjimharris 328230557Sjimharris#if ! HAVE_STRDUP 329230557Sjimharrischar *strdup(const char *); 330230557Sjimharris#endif 331230557Sjimharris 332230557Sjimharris#if ! HAVE_STRERROR 333230557Sjimharrischar *strerror(int); 334230557Sjimharris#endif 335230557Sjimharris 336230557Sjimharris#if HAVE_QUAD_SUPPORT 337230557Sjimharris# if ! HAVE_STRTOLL && HAVE_LONG_LONG 338230557Sjimharrislong long strtoll(const char *, char **, int); 339230557Sjimharris# if ! defined(QUAD_MIN) 340230557Sjimharris# define QUAD_MIN (-0x7fffffffffffffffL-1) 341230557Sjimharris# endif 342230557Sjimharris# if ! defined(QUAD_MAX) 343230557Sjimharris# define QUAD_MAX (0x7fffffffffffffffL) 344230557Sjimharris# endif 345230557Sjimharris# endif 346230557Sjimharris#else /* ! HAVE_QUAD_SUPPORT */ 347230557Sjimharris# define NO_LONG_LONG 1 348230557Sjimharris#endif /* ! HAVE_QUAD_SUPPORT */ 349230557Sjimharris 350230557Sjimharris#if ! HAVE_STRLCAT 351230557Sjimharrissize_t strlcat(char *, const char *, size_t); 352230557Sjimharris#endif 353230557Sjimharris 354230557Sjimharris#if ! HAVE_STRLCPY 355230557Sjimharrissize_t strlcpy(char *, const char *, size_t); 356230557Sjimharris#endif 357230557Sjimharris 358230557Sjimharris#if ! HAVE_STRMODE 359230557Sjimharrisvoid strmode(mode_t, char *); 360230557Sjimharris#endif 361230557Sjimharris 362230557Sjimharris#if ! HAVE_STRSEP 363230557Sjimharrischar *strsep(char **, const char *); 364230557Sjimharris#endif 365230557Sjimharris 366230557Sjimharris#if ! HAVE_USER_FROM_UID 367230557Sjimharrisconst char *user_from_uid(uid_t, int); 368230557Sjimharrisconst char *group_from_gid(gid_t, int); 369230557Sjimharris#endif 370230557Sjimharris 371230557Sjimharris#if ! HAVE_VSYSLOG 372230557Sjimharrisvoid vsyslog(int level, const char *, va_list); 373230557Sjimharris#endif 374230557Sjimharris 375230557Sjimharris 376230557Sjimharris#if ! defined(MIN) 377230557Sjimharris# define MIN(a, b) ((a) < (b) ? (a) : (b)) 378230557Sjimharris#endif 379230557Sjimharris#if ! defined(MAX) 380230557Sjimharris# define MAX(a, b) ((a) < (b) ? (b) : (a)) 381230557Sjimharris#endif 382230557Sjimharris 383230557Sjimharris#if ! defined(timersub) 384230557Sjimharris# define timersub(tvp, uvp, vvp) \ 385230557Sjimharris do { \ 386230557Sjimharris (vvp)->tv_sec = (tvp)->tv_sec - (uvp)->tv_sec; \ 387230557Sjimharris (vvp)->tv_usec = (tvp)->tv_usec - (uvp)->tv_usec; \ 388230557Sjimharris if ((vvp)->tv_usec < 0) { \ 389230557Sjimharris (vvp)->tv_sec--; \ 390230557Sjimharris (vvp)->tv_usec += 1000000; \ 391230557Sjimharris } \ 392230557Sjimharris } while (0) 393230557Sjimharris#endif 394230557Sjimharris 395230557Sjimharris#if ! defined(S_ISLNK) 396230557Sjimharris# define S_ISLNK(m) ((m & S_IFMT) == S_IFLNK) 397230557Sjimharris#endif 398230557Sjimharris 399230557Sjimharris#define DAYSPERNYEAR 365 400230557Sjimharris#define SECSPERDAY 86400 401230557Sjimharris#define TM_YEAR_BASE 1900 402230557Sjimharris