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