]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - contrib/lukemftpd/src/extern.h
This commit was generated by cvs2svn to compensate for changes in r161630,
[FreeBSD/FreeBSD.git] / contrib / lukemftpd / src / extern.h
1 /*      $NetBSD: extern.h,v 1.50 2004-08-09 12:56:47 lukem Exp $        */
2
3 /*-
4  * Copyright (c) 1992, 1993
5  *      The Regents of the University of California.  All rights reserved.
6  *
7  * Redistribution and use in source and binary forms, with or without
8  * modification, are permitted provided that the following conditions
9  * are met:
10  * 1. Redistributions of source code must retain the above copyright
11  *    notice, this list of conditions and the following disclaimer.
12  * 2. Redistributions in binary form must reproduce the above copyright
13  *    notice, this list of conditions and the following disclaimer in the
14  *    documentation and/or other materials provided with the distribution.
15  * 3. Neither the name of the University nor the names of its contributors
16  *    may be used to endorse or promote products derived from this software
17  *    without specific prior written permission.
18  *
19  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
20  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
21  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
22  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
23  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
24  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
25  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
26  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
27  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
28  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
29  * SUCH DAMAGE.
30  *
31  *      @(#)extern.h    8.2 (Berkeley) 4/4/94
32  */
33
34 /*-
35  * Copyright (c) 1997-2004 The NetBSD Foundation, Inc.
36  * All rights reserved.
37  *
38  * This code is derived from software contributed to The NetBSD Foundation
39  * by Luke Mewburn.
40  *
41  * Redistribution and use in source and binary forms, with or without
42  * modification, are permitted provided that the following conditions
43  * are met:
44  * 1. Redistributions of source code must retain the above copyright
45  *    notice, this list of conditions and the following disclaimer.
46  * 2. Redistributions in binary form must reproduce the above copyright
47  *    notice, this list of conditions and the following disclaimer in the
48  *    documentation and/or other materials provided with the distribution.
49  * 3. All advertising materials mentioning features or use of this software
50  *    must display the following acknowledgement:
51  *        This product includes software developed by the NetBSD
52  *        Foundation, Inc. and its contributors.
53  * 4. Neither the name of The NetBSD Foundation nor the names of its
54  *    contributors may be used to endorse or promote products derived
55  *    from this software without specific prior written permission.
56  *
57  * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
58  * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
59  * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
60  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
61  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
62  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
63  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
64  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
65  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
66  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
67  * POSSIBILITY OF SUCH DAMAGE.
68  */
69
70 /*
71  * Copyright (C) 1997 and 1998 WIDE Project.
72  * All rights reserved.
73  * 
74  * Redistribution and use in source and binary forms, with or without
75  * modification, are permitted provided that the following conditions
76  * are met:
77  * 1. Redistributions of source code must retain the above copyright
78  *    notice, this list of conditions and the following disclaimer.
79  * 2. Redistributions in binary form must reproduce the above copyright
80  *    notice, this list of conditions and the following disclaimer in the
81  *    documentation and/or other materials provided with the distribution.
82  * 3. Neither the name of the project nor the names of its contributors
83  *    may be used to endorse or promote products derived from this software
84  *    without specific prior written permission.
85  * 
86  * THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND
87  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
88  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
89  * ARE DISCLAIMED.  IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE
90  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
91  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
92  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
93  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
94  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
95  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
96  * SUCH DAMAGE.
97  */
98
99 #ifdef NO_LONG_LONG
100 # define LLF            "%ld"
101 # define LLFP(x)        "%" x "ld"
102 # define LLT            long
103 # define ULLF           "%lu"
104 # define ULLFP(x)       "%" x "lu"
105 # define ULLT           unsigned long
106 # define STRTOLL(x,y,z) strtol(x,y,z)
107 # define LLTMIN         LONG_MIN
108 # define LLTMAX         LONG_MAX
109 #else
110 # define LLF            "%lld"
111 # define LLFP(x)        "%" x "lld"
112 # define LLT            long long
113 # define ULLF           "%llu"
114 # define ULLFP(x)       "%" x "llu"
115 # define ULLT           unsigned long long
116 # define STRTOLL(x,y,z) strtoll(x,y,z)
117 # define LLTMIN         LLONG_MIN
118 # define LLTMAX         LLONG_MAX
119 #endif
120
121 #define FTP_BUFLEN      512
122
123 void    abor(void);
124 void    blkfree(char **);
125 void    closedataconn(FILE *);
126 char   *conffilename(const char *);
127 char  **copyblk(char **);
128 void    count_users(void);
129 void    cprintf(FILE *, const char *, ...)
130             __attribute__((__format__(__printf__, 2, 3)));
131 void    cwd(const char *);
132 FILE   *dataconn(const char *, off_t, const char *);
133 void    delete(const char *);
134 int     display_file(const char *, int);
135 char  **do_conversion(const char *);
136 void    dologout(int);
137 void    fatal(const char *);
138 void    feat(void);
139 void    format_path(char *, const char *);
140 int     ftpd_pclose(FILE *);
141 FILE   *ftpd_popen(char *[], const char *, int);
142 char   *getline(char *, int, FILE *);
143 void    init_curclass(void);
144 void    logxfer(const char *, off_t, const char *, const char *,
145             const struct timeval *, const char *);
146 struct tab *lookup(struct tab *, const char *);
147 void    makedir(const char *);
148 void    mlsd(const char *);
149 void    mlst(const char *);
150 void    opts(const char *);
151 void    parse_conf(const char *);
152 void    pass(const char *);
153 void    passive(void);
154 int     lpsvproto2af(int);
155 int     af2lpsvproto(int);
156 int     epsvproto2af(int);
157 int     af2epsvproto(int);
158 void    long_passive(char *, int);
159 int     extended_port(const char *);
160 void    epsv_protounsupp(const char *);
161 void    perror_reply(int, const char *);
162 void    pwd(void);
163 void    removedir(const char *);
164 void    renamecmd(const char *, const char *);
165 char   *renamefrom(const char *);
166 void    reply(int, const char *, ...)
167             __attribute__((__format__(__printf__, 2, 3)));
168 void    retrieve(char *[], const char *);
169 void    send_file_list(const char *);
170 void    show_chdir_messages(int);
171 void    sizecmd(const char *);
172 void    statcmd(void);
173 void    statfilecmd(const char *);
174 void    statxfer(void);
175 void    store(const char *, const char *, int);
176 void    user(const char *);
177 char   *xstrdup(const char *);
178 void    yyerror(char *);
179
180 #ifdef SUPPORT_UTMP
181 struct utmp;
182
183 void    ftpd_logwtmp(const char *, const char *, const char *);
184 void    ftpd_login(const struct utmp *ut);
185 int     ftpd_logout(const char *line);
186 #endif
187
188 #ifdef SUPPORT_UTMPX
189 struct utmpx;
190
191 void    ftpd_loginx(const struct utmpx *);
192 void    ftpd_logwtmpx(const char *, const char *, const char *, int, int);
193 #endif
194
195 #include <netinet/in.h>
196
197 #if defined(__NetBSD__)
198 # define HAVE_SETPROCTITLE      1
199 # define HAVE_SOCKADDR_SA_LEN   1
200 #endif
201
202 struct sockinet {
203         union sockunion {
204                 struct sockaddr_in  su_sin;
205 #ifdef INET6
206                 struct sockaddr_in6 su_sin6;
207 #endif
208         } si_su;
209 #if !HAVE_SOCKADDR_SA_LEN
210         int     si_len;
211 #endif
212 };
213
214 #if !HAVE_SOCKADDR_SA_LEN
215 # define su_len         si_len
216 #else
217 # define su_len         si_su.su_sin.sin_len
218 #endif
219 #define su_addr         si_su.su_sin.sin_addr
220 #define su_family       si_su.su_sin.sin_family
221 #define su_port         si_su.su_sin.sin_port
222 #ifdef INET6
223 # define su_6addr       si_su.su_sin6.sin6_addr
224 # define su_scope_id    si_su.su_sin6.sin6_scope_id
225 #endif
226
227 struct tab {
228         char    *name;
229         short    token;
230         short    state;
231         short    flags; /* 1 if command implemented, 2 if has options,
232                            4 if can occur OOB */
233         char    *help;
234         char    *options;
235 };
236
237 struct ftpconv {
238         struct ftpconv  *next;
239         char            *suffix;        /* Suffix of requested name */
240         char            *types;         /* Valid file types */
241         char            *disable;       /* File to disable conversions */
242         char            *command;       /* Command to do the conversion */
243 };
244
245 typedef enum {
246         CLASS_GUEST,
247         CLASS_CHROOT,
248         CLASS_REAL
249 } class_ft;
250
251 typedef enum {
252         FLAG_checkportcmd =     1<<0,   /* Check port commands */
253         FLAG_denyquick =        1<<1,   /* Check ftpusers(5) before PASS */
254         FLAG_modify =           1<<2,   /* Allow CHMOD, DELE, MKD, RMD, RNFR,
255                                            UMASK */
256         FLAG_passive =          1<<3,   /* Allow PASV mode */
257         FLAG_private =          1<<4,   /* Don't publish class info in STAT */
258         FLAG_sanenames =        1<<5,   /* Restrict names of uploaded files */ 
259         FLAG_upload =           1<<6,   /* As per modify, but also allow
260                                            APPE, STOR, STOU */
261 } classflag_t;
262
263 #define CURCLASS_FLAGS_SET(x)   (curclass.flags |=  (FLAG_ ## x))
264 #define CURCLASS_FLAGS_CLR(x)   (curclass.flags &= ~(FLAG_ ## x))
265 #define CURCLASS_FLAGS_ISSET(x) (curclass.flags &   (FLAG_ ## x))
266
267 struct ftpclass {
268         struct sockinet  advertise;     /* PASV address to advertise as */
269         char            *chroot;        /* Directory to chroot(2) to at login */
270         char            *classname;     /* Current class */
271         struct ftpconv  *conversions;   /* List of conversions */
272         char            *display;       /* File to display upon chdir */
273         char            *homedir;       /* Directory to chdir(2) to at login */
274         classflag_t      flags;         /* Flags; see classflag_t above */
275         LLT              limit;         /* Max connections (-1 = unlimited) */
276         char            *limitfile;     /* File to display if limit reached */
277         LLT              maxfilesize;   /* Maximum file size of uploads */
278         LLT              maxrateget;    /* Maximum get transfer rate throttle */
279         LLT              maxrateput;    /* Maximum put transfer rate throttle */
280         LLT              maxtimeout;    /* Maximum permitted timeout */
281         char            *motd;          /* MotD file to display after login */
282         char            *notify;        /* Files to notify about upon chdir */
283         LLT              portmin;       /* Minumum port for passive mode */
284         LLT              portmax;       /* Maximum port for passive mode */
285         LLT              rateget;       /* Get (RETR) transfer rate throttle */
286         LLT              rateput;       /* Put (STOR) transfer rate throttle */
287         LLT              timeout;       /* Default timeout */
288         class_ft         type;          /* Class type */
289         mode_t           umask;         /* Umask to use */
290         LLT              mmapsize;      /* mmap window size */
291         LLT              readsize;      /* data read size */
292         LLT              writesize;     /* data write size */
293         LLT              sendbufsize;   /* SO_SNDBUF size */
294         LLT              sendlowat;     /* SO_SNDLOWAT size */
295 };
296
297 extern void             ftp_loop(void) __attribute__ ((noreturn));
298 extern void             ftp_handle_line(char *);
299
300 #ifndef GLOBAL
301 #define GLOBAL  extern
302 #endif
303
304
305 GLOBAL  struct sockinet ctrl_addr;
306 GLOBAL  struct sockinet data_dest;
307 GLOBAL  struct sockinet data_source;
308 GLOBAL  struct sockinet his_addr;
309 GLOBAL  struct sockinet pasv_addr;
310 GLOBAL  int             connections;
311 GLOBAL  struct ftpclass curclass;
312 GLOBAL  int             debug;
313 GLOBAL  char            *emailaddr;
314 GLOBAL  int             form;
315 GLOBAL  int             gidcount;       /* number of entries in gidlist[] */
316 GLOBAL  gid_t           *gidlist;
317 GLOBAL  int             hasyyerrored;
318 GLOBAL  char            hostname[MAXHOSTNAMELEN+1];
319 GLOBAL  char            homedir[MAXPATHLEN];
320 #ifdef KERBEROS5
321 GLOBAL  krb5_context    kcontext;
322 #endif
323 GLOBAL  int             logged_in;
324 GLOBAL  int             logging;
325 GLOBAL  int             pdata;                  /* for passive mode */
326 #if HAVE_SETPROCTITLE
327 GLOBAL  char            proctitle[BUFSIZ];      /* initial part of title */
328 #endif
329 GLOBAL  struct passwd  *pw;
330 GLOBAL  int             quietmessages;
331 GLOBAL  char            remotehost[MAXHOSTNAMELEN+1];
332 GLOBAL  off_t           restart_point;
333 GLOBAL  char            tmpline[FTP_BUFLEN];
334 GLOBAL  int             type;
335 GLOBAL  int             usedefault;             /* for data transfers */
336 GLOBAL  const char     *version;
337 GLOBAL  int             is_oob;
338
339                                                 /* total file data bytes */
340 GLOBAL  off_t           total_data_in,  total_data_out,  total_data;
341                                                 /* total number of data files */
342 GLOBAL  off_t           total_files_in, total_files_out, total_files;
343                                                 /* total bytes */
344 GLOBAL  off_t           total_bytes_in, total_bytes_out, total_bytes;
345                                                 /* total number of xfers */
346 GLOBAL  off_t           total_xfers_in, total_xfers_out, total_xfers;
347
348 extern  struct tab      cmdtab[];
349
350 #define INTERNAL_LS     "/bin/ls"
351
352
353 #define CMD_IMPLEMENTED(x)      ((x)->flags != 0)
354 #define CMD_HAS_OPTIONS(x)      ((x)->flags & 0x2)
355 #define CMD_OOB(x)              ((x)->flags & 0x4)
356
357 #define CPUTC(c, f)     do { \
358                                 putc(c, f); total_bytes++; total_bytes_out++; \
359                         } while (0);
360
361 #define CURCLASSTYPE    curclass.type == CLASS_GUEST  ? "GUEST"  : \
362                         curclass.type == CLASS_CHROOT ? "CHROOT" : \
363                         curclass.type == CLASS_REAL   ? "REAL"   : \
364                         "<unknown>"
365
366 #define ISDOTDIR(x)     (x[0] == '.' && x[1] == '\0')
367 #define ISDOTDOTDIR(x)  (x[0] == '.' && x[1] == '.' && x[2] == '\0')
368
369 #define EMPTYSTR(p)     ((p) == NULL || *(p) == '\0')
370 #define NEXTWORD(P, W)  do { \
371                                 (W) = strsep(&(P), " \t"); \
372                         } while ((W) != NULL && *(W) == '\0')
373 #define PLURAL(s)       ((s) == 1 ? "" : "s")
374 #define REASSIGN(X,Y)   do { if (X) free(X); (X)=(Y); } while (/*CONSTCOND*/0)
375
376 #ifndef IPPORT_ANONMAX
377 # define IPPORT_ANONMAX 65535
378 #endif