1/* $Id: lukemftpd.h,v 1.20 2002/05/23 02:43:58 lukem Exp $ */ 2 3#define FTPD_VERSION "lukemftpd 1.2 beta 2" 4 5#include "config.h" 6 7#include <sys/types.h> 8#include <sys/param.h> 9#include <sys/ioctl.h> 10#include <sys/socket.h> 11#include <sys/stat.h> 12#include <sys/wait.h> 13#if HAVE_SYS_SYSMACROS_H 14# include <sys/sysmacros.h> 15#endif 16 17#include <netinet/in.h> 18#include <netinet/in_systm.h> 19#include <netinet/ip.h> 20 21#if HAVE_FTP_NAMES 22# include <arpa/ftp.h> 23#else 24# include "arpaftp.h" 25#endif 26#include <arpa/inet.h> 27 28#include <ctype.h> 29#include <errno.h> 30#include <fcntl.h> 31#include <grp.h> 32#include <limits.h> 33#include <locale.h> 34#include <netdb.h> 35#include <pwd.h> 36#include <setjmp.h> 37#include <signal.h> 38#include <stdarg.h> 39#include <stddef.h> 40#include <stdio.h> 41#include <stdlib.h> 42#include <string.h> 43#include <syslog.h> 44#include <termios.h> 45#include <unistd.h> 46#include <utmp.h> 47 48#if HAVE_DIRENT_H 49# include <dirent.h> 50#else 51# define dirent direct 52# if HAVE_SYS_NDIR_H 53# include <sys/ndir.h> 54# endif 55# if HAVE_SYS_DIR_H 56# include <sys/dir.h> 57# endif 58# if HAVE_NDIR_H 59# include <ndir.h> 60# endif 61#endif 62 63#if TIME_WITH_SYS_TIME 64# include <sys/time.h> 65# include <time.h> 66#else 67# if HAVE_SYS_TIME_H 68# include <sys/time.h> 69# else 70# include <time.h> 71# endif 72#endif 73 74#if HAVE_ERR_H 75# include <err.h> 76#endif 77 78#if HAVE_WORKING_GLOB 79# include <glob.h> 80#else 81# include "ftpglob.h" 82#endif 83 84#if HAVE_FNM_CASEFOLD 85# include <fnmatch.h> 86#else 87# include "ftpfnmatch.h" 88#endif 89 90#if HAVE_PATHS_H 91# include <paths.h> 92#endif 93#ifndef _PATH_BSHELL 94#define _PATH_BSHELL "/bin/sh" 95#endif 96#ifndef _PATH_CSHELL 97#define _PATH_CSHELL "/bin/csh" 98#endif 99#ifndef _PATH_SHELLS 100#define _PATH_SHELLS "/etc/shells" 101#endif 102#ifndef _PATH_DEVNULL 103#define _PATH_DEVNULL "/dev/null" 104#endif 105#ifndef _PATH_NOLOGIN 106#define _PATH_NOLOGIN "/etc/nologin" 107#endif 108 109#ifndef FTPD_LOGTYPE 110# ifdef LOG_FTP 111# define FTPD_LOGTYPE LOG_FTP 112# else 113# define FTPD_LOGTYPE LOG_DAEMON 114# endif 115#endif 116 117#ifndef LOG_AUTHPRIV 118# ifdef LOG_AUTH 119# define LOG_AUTHPRIV LOG_AUTH 120# else 121# define LOG_AUTHPRIV LOG_DAEMON 122# endif 123#endif 124 125typedef struct _stringlist { 126 char **sl_str; 127 size_t sl_max; 128 size_t sl_cur; 129} StringList; 130 131StringList *sl_init(void); 132int sl_add(StringList *, char *); 133void sl_free(StringList *, int); 134char *sl_find(StringList *, char *); 135 136#if HAVE_FTS_H 137# include <fts.h> 138#else 139# include "ftpfts.h" 140#endif 141 142#if HAVE_UTIL_H 143# include <util.h> 144#endif 145 146#if HAVE_LIBUTIL_H 147# include <libutil.h> 148#endif 149 150#if ! HAVE_IN_PORT_T 151typedef unsigned short in_port_t; 152#endif 153 154#if ! HAVE_SOCKLEN_T 155typedef unsigned int socklen_t; 156#endif 157 158#if HAVE_AF_INET6 && HAVE_SOCKADDR_IN6 159# define INET6 160#endif 161 162 163#if ! HAVE_RFC2553_NETDB 164 165 /* RFC 2553 */ 166#undef EAI_ADDRFAMILY 167#define EAI_ADDRFAMILY 1 /* address family for hostname not supported */ 168#undef EAI_AGAIN 169#define EAI_AGAIN 2 /* temporary failure in name resolution */ 170#undef EAI_BADFLAGS 171#define EAI_BADFLAGS 3 /* invalid value for ai_flags */ 172#undef EAI_FAIL 173#define EAI_FAIL 4 /* non-recoverable failure in name resolution */ 174#undef EAI_FAMILY 175#define EAI_FAMILY 5 /* ai_family not supported */ 176#undef EAI_MEMORY 177#define EAI_MEMORY 6 /* memory allocation failure */ 178#undef EAI_NODATA 179#define EAI_NODATA 7 /* no address associated with hostname */ 180#undef EAI_NONAME 181#define EAI_NONAME 8 /* hostname nor servname provided, or not known */ 182#undef EAI_SERVICE 183#define EAI_SERVICE 9 /* servname not supported for ai_socktype */ 184#undef EAI_SOCKTYPE 185#define EAI_SOCKTYPE 10 /* ai_socktype not supported */ 186#undef EAI_SYSTEM 187#define EAI_SYSTEM 11 /* system error returned in errno */ 188 189 /* KAME extensions? */ 190#undef EAI_BADHINTS 191#define EAI_BADHINTS 12 192#undef EAI_PROTOCOL 193#define EAI_PROTOCOL 13 194#undef EAI_MAX 195#define EAI_MAX 14 196 197 /* RFC 2553 */ 198#undef NI_MAXHOST 199#define NI_MAXHOST 1025 200#undef NI_MAXSERV 201#define NI_MAXSERV 32 202 203#undef NI_NOFQDN 204#define NI_NOFQDN 0x00000001 205#undef NI_NUMERICHOST 206#define NI_NUMERICHOST 0x00000002 207#undef NI_NAMEREQD 208#define NI_NAMEREQD 0x00000004 209#undef NI_NUMERICSERV 210#define NI_NUMERICSERV 0x00000008 211#undef NI_DGRAM 212#define NI_DGRAM 0x00000010 213 214 /* RFC 2553 */ 215#undef AI_PASSIVE 216#define AI_PASSIVE 0x00000001 /* get address to use bind() */ 217#undef AI_CANONNAME 218#define AI_CANONNAME 0x00000002 /* fill ai_canonname */ 219 220 /* KAME extensions ? */ 221#undef AI_NUMERICHOST 222#define AI_NUMERICHOST 0x00000004 /* prevent name resolution */ 223#undef AI_MASK 224#define AI_MASK (AI_PASSIVE | AI_CANONNAME | AI_NUMERICHOST) 225 226 /* RFC 2553 */ 227#undef AI_ALL 228#define AI_ALL 0x00000100 /* IPv6 and IPv4-mapped (with AI_V4MAPPED) */ 229#undef AI_V4MAPPED_CFG 230#define AI_V4MAPPED_CFG 0x00000200 /* accept IPv4-mapped if kernel supports */ 231#undef AI_ADDRCONFIG 232#define AI_ADDRCONFIG 0x00000400 /* only if any address is assigned */ 233#undef AI_V4MAPPED 234#define AI_V4MAPPED 0x00000800 /* accept IPv4-mapped IPv6 address */ 235 236#endif /* ! HAVE_RFC2553_NETDB */ 237 238 239#if ! HAVE_RFC2553_NETDB && ! HAVE_ADDRINFO 240 241struct addrinfo { 242 int ai_flags; /* AI_PASSIVE, AI_CANONNAME, AI_NUMERICHOST */ 243 int ai_family; /* PF_xxx */ 244 int ai_socktype; /* SOCK_xxx */ 245 int ai_protocol; /* 0 or IPPROTO_xxx for IPv4 and IPv6 */ 246 size_t ai_addrlen; /* length of ai_addr */ 247 char *ai_canonname; /* canonical name for hostname */ 248 struct sockaddr *ai_addr; /* binary address */ 249 struct addrinfo *ai_next; /* next structure in linked list */ 250}; 251 252int getaddrinfo(const char *, const char *, 253 const struct addrinfo *, struct addrinfo **); 254int getnameinfo(const struct sockaddr *, socklen_t, char *, 255 size_t, char *, size_t, int); 256void freeaddrinfo(struct addrinfo *); 257char *gai_strerror(int); 258 259#endif /* ! HAVE_RFC2553_NETDB && ! HAVE_ADDRINFO */ 260 261 262#if ! HAVE_D_NAMLEN 263# define DIRENT_MISSING_D_NAMLEN 264#endif 265 266#if ! HAVE_CRYPT_D 267char *crypt(const char *, const char *); 268#endif 269 270#if ! HAVE_FCLOSE_D 271int fclose(FILE *); 272#endif 273 274#if ! HAVE_OPTARG_D 275extern char *optarg; 276#endif 277 278#if ! HAVE_OPTIND_D 279extern int optind; 280#endif 281 282#if ! HAVE_PCLOSE_D 283int pclose(FILE *); 284#endif 285 286#if ! HAVE_ERR 287void err(int, const char *, ...); 288void errx(int, const char *, ...); 289void warn(const char *, ...); 290void warnx(const char *, ...); 291#endif 292 293#if ! HAVE_FGETLN 294char *fgetln(FILE *, size_t *); 295#endif 296 297#if ! HAVE_FPARSELN 298# define FPARSELN_UNESCESC 0x01 299# define FPARSELN_UNESCCONT 0x02 300# define FPARSELN_UNESCCOMM 0x04 301# define FPARSELN_UNESCREST 0x08 302# define FPARSELN_UNESCALL 0x0f 303char *fparseln(FILE *, size_t *, size_t *, const char[3], int); 304#endif 305 306#if ! HAVE_GETUSERSHELL || ! HAVE_GETUSERSHELL_D 307char *getusershell(void); 308void setusershell(void); 309void endusershell(void); 310#endif 311 312#if ! HAVE_INET_NTOP 313const char *inet_ntop(int, const void *, char *, size_t); 314#endif 315 316#if ! HAVE_INET_PTON 317int inet_pton(int, const char *, void *); 318#endif 319 320#if ! HAVE_MKSTEMP 321int mkstemp(const char *); 322#endif 323 324#if ! HAVE_SNPRINTF 325int snprintf(char *, size_t, const char *, ...); 326#endif 327 328#if ! HAVE_STRDUP 329char *strdup(const char *); 330#endif 331 332#if ! HAVE_STRERROR 333char *strerror(int); 334#endif 335 336#if HAVE_QUAD_SUPPORT 337# if ! HAVE_STRTOLL && HAVE_LONG_LONG 338long long strtoll(const char *, char **, int); 339# if ! defined(QUAD_MIN) 340# define QUAD_MIN (-0x7fffffffffffffffL-1) 341# endif 342# if ! defined(QUAD_MAX) 343# define QUAD_MAX (0x7fffffffffffffffL) 344# endif 345# endif 346#else /* ! HAVE_QUAD_SUPPORT */ 347# define NO_LONG_LONG 1 348#endif /* ! HAVE_QUAD_SUPPORT */ 349 350#if ! HAVE_STRLCAT 351size_t strlcat(char *, const char *, size_t); 352#endif 353 354#if ! HAVE_STRLCPY 355size_t strlcpy(char *, const char *, size_t); 356#endif 357 358#if ! HAVE_STRMODE 359void strmode(mode_t, char *); 360#endif 361 362#if ! HAVE_STRSEP 363char *strsep(char **, const char *); 364#endif 365 366#if ! HAVE_USER_FROM_UID 367const char *user_from_uid(uid_t, int); 368const char *group_from_gid(gid_t, int); 369#endif 370 371#if ! HAVE_VSYSLOG 372void vsyslog(int level, const char *, va_list); 373#endif 374 375 376#if ! defined(MIN) 377# define MIN(a, b) ((a) < (b) ? (a) : (b)) 378#endif 379#if ! defined(MAX) 380# define MAX(a, b) ((a) < (b) ? (b) : (a)) 381#endif 382 383#if ! defined(timersub) 384# define timersub(tvp, uvp, vvp) \ 385 do { \ 386 (vvp)->tv_sec = (tvp)->tv_sec - (uvp)->tv_sec; \ 387 (vvp)->tv_usec = (tvp)->tv_usec - (uvp)->tv_usec; \ 388 if ((vvp)->tv_usec < 0) { \ 389 (vvp)->tv_sec--; \ 390 (vvp)->tv_usec += 1000000; \ 391 } \ 392 } while (0) 393#endif 394 395#if ! defined(S_ISLNK) 396# define S_ISLNK(m) ((m & S_IFMT) == S_IFLNK) 397#endif 398 399#define DAYSPERNYEAR 365 400#define SECSPERDAY 86400 401#define TM_YEAR_BASE 1900 402