]> git.sesse.net Git - betaftpd/blob - ftpd.c
do_download(): Removed the check for f->upload :-D
[betaftpd] / ftpd.c
1 /*  ftpd.c: BetaFTPD main
2     Copyright (C) 1999-2000 Steinar H. Gunderson
3
4     This program is is free software; you can redistribute it and/or modify
5     it under the terms of the GNU General Public License, version 2 if the
6     License as published by the Free Software Foundation.
7
8     This program is distributed in the hope that it will be useful,
9     but WITHOUT ANY WARRANTY; without even the implied warranty of
10     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
11     GNU General Public License for more details.
12
13     You should have received a copy of the GNU General Public License
14     along with this program; if not, write to the Free Software
15     Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
16 */
17
18 /*
19  * Special note: this file has been overwritten by another (0-byte) file, been
20  * through the dead, and restored (with the help of dd, grep, gpm, vi and less)
21  * with a sucess rate of 99.9%. Show it a little respect -- don't add junk
22  * to it. :-)
23  */
24
25 #define _GNU_SOURCE
26
27 #if HAVE_CONFIG_H
28 #include <config.h>
29 #endif
30
31 #if HAVE_SYS_TYPES_H
32 #include <sys/types.h>
33 #endif
34
35 #if HAVE_ERRNO_H
36 #include <errno.h>
37 #endif
38
39 #if HAVE_STROPTS_H
40 #include <stropts.h>
41 #endif
42
43 #if HAVE_SYS_CONF_H
44 #include <sys/conf.h>
45 #endif
46
47 #if HAVE_FCNTL_H
48 #include <fcntl.h>
49 #endif
50
51 #if HAVE_STDIO_H
52 #include <stdio.h>
53 #endif
54
55 #if HAVE_ASSERT_H
56 #include <assert.h>
57 #endif
58
59 #if HAVE_STRING_H
60 #include <string.h>
61 #endif
62
63 #if HAVE_STRINGS_H
64 #include <strings.h>
65 #endif
66
67 #if HAVE_STDARG_H
68 #include <stdarg.h>
69 #endif
70
71 #if HAVE_STDLIB_H
72 #include <stdlib.h>
73 #endif
74
75 #if HAVE_UNISTD_H
76 #include <unistd.h>
77 #endif
78
79 #if HAVE_NETINET_IN_H
80 #include <netinet/in.h>
81 #endif
82
83 #if HAVE_ARPA_INET_H
84 #include <arpa/inet.h>
85 #endif
86
87 #if HAVE_SYS_STAT_H
88 #include <sys/stat.h>
89 #endif
90
91 #if HAVE_SYS_SOCKET_H
92 #include <sys/socket.h>
93 #endif
94
95 #if HAVE_SYS_IOCTL_H
96 #include <sys/ioctl.h>
97 #endif
98
99 #if HAVE_NETINET_IN_SYSTM_H
100 #include <netinet/in_systm.h>
101 #endif
102
103 #if HAVE_NETINET_IP_H
104 #include <netinet/ip.h>
105 #endif
106
107 #if HAVE_NETINET_TCP_H
108 #include <netinet/tcp.h>
109 #endif
110
111 #if HAVE_LINUX_SOCKET_H
112 #include <linux/socket.h>
113 #endif
114
115 #if HAVE_MMAP
116 #include <sys/mman.h>
117 #endif
118
119 #if HAVE_TIME_H
120 #include <time.h>
121 #endif
122
123 #if HAVE_SYS_TIME_H
124 #include <sys/time.h>
125 #endif
126
127 #if HAVE_SYS_TIME_H
128 #include <sys/time.h>
129 #endif
130
131 #if HAVE_SYS_FILIO_H
132 #include <sys/filio.h>
133 #endif
134
135 #if HAVE_NETDB_H
136 #include <netdb.h>
137 #endif
138
139 #if HAVE_SIGNAL_H
140 #include <signal.h>
141 #endif
142
143 #if HAVE_GLOB_H
144 #include <glob.h>
145 #endif
146
147 #if HAVE_SYS_SIGNAL_H
148 #include <sys/signal.h>
149 #endif
150
151 #if HAVE_SYS_POLL_H
152 #include <sys/poll.h>
153 #endif
154
155 #if HAVE_SYS_SENDFILE_H
156 #include <sys/sendfile.h>
157 #endif
158
159 /*
160  * <linux/socket.h> does not export this to glibc2 systems, and it isn't
161  * always defined anywhere else.
162  */
163 #if !defined(TCP_CORK) && defined(__linux__)
164 #define TCP_CORK 3
165 #endif
166
167 #include <ftpd.h>
168 #include <cmds.h>
169
170 #if WANT_ASCII
171 #include <ascii.h>
172 #endif
173
174 #ifndef MAP_FAILED
175 #define MAP_FAILED -1
176 #endif
177
178 struct conn *first_conn = NULL;
179 struct ftran *first_ftran = NULL;
180 #if WANT_DCACHE
181 struct dcache *first_dcache = NULL;
182 #endif
183
184 #if HAVE_POLL
185 unsigned int highest_fds = 0;
186
187 #define FD_MAX 1024
188 #define fds_send fds
189 struct pollfd fds[FD_MAX];
190
191 #define MAXCLIENTS FD_MAX
192 #else
193 fd_set master_fds, master_send_fds;
194 #define MAXCLIENTS FD_SETSIZE
195 #endif
196
197 #if WANT_XFERLOG
198 FILE *xferlog = NULL;
199 #endif
200
201 /*
202  * This variable specifies if it's soon time to check for timed out
203  * clients, and timed out directory listing cache entries. It is
204  * set to 1 by a signal handler every minute, and set to 0 when the
205  * checking has been performed.
206  */
207 int time_to_check = 1;
208
209 #ifndef HAVE_SPRINTF
210 /*
211  * snprintf():  snprintf() replacement for systems that miss it. Note
212  *              that this implementation does _not_ necessarily protect
213  *              against all buffer overflows. Get a real snprintf() in
214  *              your C library. That being said, the 8k limit is
215  *              substantially larger than any other string in BetaFTPD,
216  *              which should make such an attack harder.
217  */
218 int snprintf(char *str, size_t n, const char *format, ...)
219 {
220         char buf[8192];
221         va_list args;
222         int err;
223
224         va_start(args, format);
225         err = vsprintf(buf, format, args);
226         va_end(args);
227
228         buf[(int)n] = 0;
229         strcpy(str, buf);
230
231         return err;
232 }
233 #endif
234
235 #ifndef HAVE_VSNPRINTF
236 /*
237  * vsnprintf:   vsnprintf() replacement for systems that miss it. Please
238  *              see snprintf (above) for more information.
239  */
240 int vsnprintf(char *str, size_t n, const char *format, va_list ap)
241 {
242         char buf[8192];
243         int err;
244
245         err = vsprintf(buf, format, ap);
246         buf[(int)n] = 0;
247         strcpy(str, buf);
248         return err;
249 }
250 #endif
251
252 /*
253  * add_fd():    Add an fd to the set we monitor. Return 0 on success.
254  *              This code is shared between poll() and select() versions.
255  */
256 int add_fd(const int fd, const int events)
257 {
258 #if HAVE_POLL
259         if (fd >= FD_MAX) {
260                 printf("add_fd(%d, %x): failed\n", fd, events);
261                 return E2BIG;
262         }
263
264         fds[fd].fd = fd;
265         fds[fd].events = events;
266         if (highest_fds < fd) 
267                 highest_fds = fd;
268 #else 
269         if (fd >= FD_SETSIZE)
270                 return E2BIG;
271         if (events & POLLIN)
272                 FD_SET(fd, &master_fds);
273         if (events & POLLOUT)
274                 FD_SET(fd, &master_send_fds);
275 #endif
276         return 0;
277 }
278
279 /*
280  * del_fd():    Close and remove an fd from the set(s) we monitor. (See also add_fd().)
281  */
282 void del_fd(const int fd)
283 {
284 #if HAVE_POLL
285         if (fd >= FD_MAX)
286                 return;
287
288         fds[fd].fd = -1;
289         fds[fd].events = 0;
290
291         /* Reduce poll()'s workload by not making it watch past end of array */
292         while ((highest_fds > 0) && (fds[highest_fds].fd == -1))
293                 highest_fds--;
294 #else 
295         if (fd >= FD_SETSIZE)
296                 return;
297         FD_CLR(fd, &master_fds);
298         FD_CLR(fd, &master_send_fds);
299 #endif
300
301         close(fd);
302 }
303
304 #if 0
305 void list_clients()
306 {
307         struct conn *c = first_conn;
308         printf("list_clients:\n");
309         while (c && c->next_conn) {
310                 c = c->next_conn;
311                 printf("list_clients: fd %d\n", c->sock);
312         }
313 }
314 #endif
315
316 /*
317  * add_to_linked_list():
318  *              Inserts an element (conn, ftran or dcache) into its linked list.
319  *              The list is placed at the beginning, right after the (bogus)
320  *              first element of the list.
321  */
322 void add_to_linked_list(struct list_element * const first,
323                         struct list_element * const elem)
324 {
325         elem->prev = first;
326
327         if (first) {
328                 elem->next = first->next;
329                 if (elem->next) elem->next->prev = elem;
330                 first->next = elem;
331         } else {
332                 /* this is the bogus head of the list */
333                 elem->next = NULL;
334         }
335 }
336
337 /*
338  * remove_from_linked_list():
339  *              Removes an element (conn, ftran or dcache) from its linked list,
340  *              then frees it.
341  */
342 void remove_from_linked_list(struct list_element * const elem)
343 {
344         if (elem->prev != NULL) elem->prev->next = elem->next;
345         if (elem->next != NULL) elem->next->prev = elem->prev;
346         free(elem);
347 }
348
349 /*
350  * alloc_new_conn():
351  *              Allocates a new control connection (type `struct conn'),
352  *              initializes it, and adds it to the linked list. The connection
353  *              operates on the socket SOCK.
354  */
355 struct conn *alloc_new_conn(const int sock)
356 {
357         const unsigned int one = 1;
358         struct conn *c = (struct conn *)(malloc(sizeof(struct conn)));
359
360         if (c == NULL) return c;
361
362         if (sock != -1) {
363                 ioctl(sock, FIONBIO, &one);
364                 if (add_fd(sock, POLLIN) != 0) {
365                         /* temp unavail */
366                         send(sock, "230 Server too busy, please try again later.\r\n", 46, 0);
367                         close(sock);
368                         return NULL;
369                 }
370
371                 add_to_linked_list((struct list_element *)first_conn,
372                                    (struct list_element *)c);
373         } else {
374                 /* this is the bogus head of the list */
375                 c->next_conn = NULL;
376                 c->prev_conn = NULL;
377         }
378
379         c->transfer = NULL;
380         c->sock = sock;
381         c->buf_len = c->auth = c->rest_pos = 0;
382 #if WANT_ASCII
383         c->ascii_mode = 0;
384 #endif
385
386         /*
387          * equals:
388          * strcpy(c->curr_dir, "/");
389          * strcpy(c->last_cmd, "");
390          * strcpy(c->rename_from, "")
391          */
392         c->curr_dir[0] = '/';
393 #if WANT_FULLSCREEN
394         c->curr_dir[1] = c->last_cmd[0] = c->rename_from[0] = '\0';
395 #else
396         c->curr_dir[1] = c->rename_from[0] = '\0';
397 #endif
398
399         time(&(c->last_transfer));
400
401         /*list_clients();*/
402
403         return c;
404 }
405
406 /*
407  * alloc_new_ftran():
408  *              Allocates a new data connection (type `struct ftran'), and
409  *              adds it to the linked list. The connection operates on the
410  *              socket SOCK, and has the control connection C as its parent.
411  */
412 struct ftran *alloc_new_ftran(const int sock, const struct conn * const c)
413 {
414         struct ftran *f = (struct ftran *)(malloc(sizeof(struct ftran)));
415
416         if (f == NULL) return f;
417         if (c == NULL) {
418                 /* this is the bogus head of the list */
419                 f->next_ftran = NULL;
420                 f->prev_ftran = NULL;
421         } else {
422                 add_to_linked_list((struct list_element *)first_ftran,
423                                    (struct list_element *)f);
424         }
425
426 #if HAVE_MMAP
427         f->file_data = NULL;
428 #endif
429         f->owner = (struct conn * const)c;
430         f->sock = sock;
431         f->state = 0;
432         f->local_file = -1;
433
434 #if WANT_DCACHE
435         f->dir_cache = NULL;
436 #endif
437
438         f->dir_listing = 0;
439         return f;
440 }
441
442 #if WANT_DCACHE
443 /*
444  * alloc_new_dcache():
445  *              Allocates a new directory cache entry (type `struct dcache'),
446  *              and adds it to the linked list.
447  */
448 struct dcache *alloc_new_dcache()
449 {
450         struct dcache *d = (struct dcache *)(malloc(sizeof(struct dcache)));
451
452         if (d == NULL) return d;
453
454         d->use_count = 0;
455         d->last_used = 0;
456         strcpy(d->dir_name, "");
457         d->dir_data = NULL;
458
459         add_to_linked_list((struct list_element *)first_dcache,
460                            (struct list_element *)d);
461
462         return d;
463 }
464 #endif
465
466 /*
467  * destroy_conn():
468  *              Destroy a control connection, remove it from the linked
469  *              list, and clean up after it.
470  */
471 void destroy_conn(struct conn * const c)
472 {
473         if (c == NULL) return;
474         del_fd(c->sock);
475
476         destroy_ftran(c->transfer);
477         remove_from_linked_list((struct list_element *)c);
478 }
479
480 /*
481  * destroy_ftran():
482  *              Destroy a data connection, remove it from the linked list,
483  *              and clean up after it.
484  *
485  *              For some reason, TCP_CORK (Linux 2.2.x-only) doesn't flush
486  *              even _after_ the socket is closed, so we zero it just before
487  *              closing. We also zero just before sending the last packet,
488  *              as it seems to be needed on some systems.
489  *
490  *              If you wonder why I check for `defined(SOL_TCP)' and don't
491  *              provide an alternative, see the comments on init_file_transfer().
492  */
493 void destroy_ftran(struct ftran * const f)
494 {
495         const unsigned int zero = 0;
496
497         if (f == NULL) return;
498 #if defined(TCP_CORK) && defined(SOL_TCP)
499         setsockopt(f->sock, SOL_TCP, TCP_CORK, (void *)&zero, sizeof(zero));
500 #endif
501         del_fd(f->sock);
502
503 #if WANT_DCACHE
504         if (f->dir_cache) {
505                 time(&(f->dir_cache->last_used));
506                 f->dir_cache->use_count--;
507                 f->dir_cache = NULL;
508         } else
509 #endif
510 #if HAVE_MMAP
511                 if (f->file_data) {
512                         if (f->dir_listing) {
513                                 free(f->file_data);
514                                 f->file_data = NULL;
515                         } else {
516                                 munmap(f->file_data, f->size);
517                         }
518                 }
519
520         if (!f->dir_listing)
521 #endif
522                 if (f->local_file != -1) close(f->local_file);
523
524 #if !HAVE_MMAP
525         if (f->dir_listing) unlink(f->filename);
526 #endif
527
528         f->owner->transfer = NULL;
529
530 #if WANT_DCACHE
531         if (f->dir_cache != NULL) f->dir_cache->use_count--;
532 #endif
533
534         remove_from_linked_list((struct list_element *)f);
535 }
536
537 #if WANT_DCACHE
538 /*
539  * destroy_dcache():
540  *              Destroy a directory listing cache entry, remove it from the
541  *              linked list, and clean up after it.
542  *
543  *              If you free a cache entry that is in use (use_count > 0),
544  *              BetaFTPD will most likely crash (later). The thing you're supposed
545  *              to do when you're done with a dcache entry, is to decrement
546  *              its use_count, and let the timeout functions do the destroying
547  *              when it's time to do so.
548  */
549 void destroy_dcache(struct dcache * const d)
550 {
551         if (d == NULL) return;
552
553         if (d->dir_data != NULL) free(d->dir_data);
554         remove_from_linked_list((struct list_element *)d);
555 }
556 #endif
557
558 /*
559  * process_all_clients():
560  *              Processes all the _control_ connections in active_clients
561  *              (normally returned from a select(), there are at max
562  *              NUM_AC active connections in the set), sending them
563  *              through to the command parser if a command has been
564  *              entered.
565  */
566 #if HAVE_POLL
567 int process_all_clients(const int num_ac)
568 #else
569 int process_all_clients(const fd_set * const active_clients, const int num_ac)
570 #endif
571 {
572         struct conn *c = NULL, *next = first_conn->next_conn;
573         int checked_through = 0;
574
575         /* run through the linked list */
576         while (next != NULL && checked_through < num_ac) {
577                 int bytes_avail;
578
579                 c = next;
580                 next = c->next_conn;
581 #if HAVE_POLL
582                 if ((fds[c->sock].revents & (POLLIN|POLLERR|POLLHUP|POLLNVAL)) == 0) {
583                         continue;
584                 }
585 #else
586                 if (!FD_ISSET(c->sock, active_clients)) {
587                         continue;
588                 }
589 #endif
590
591                 checked_through++;
592
593                 bytes_avail = recv(c->sock, c->recv_buf + c->buf_len,
594                                    255 - c->buf_len, 0);
595                 if (bytes_avail <= 0) {
596                         /*
597                          * select() has already told us there's something about
598                          * this socket, so if we get a return value of zero, the
599                          * client has closed the socket. If we get a return value
600                          * of -1 (error), we close the socket ourselves.
601                          *
602                          * We do the same for poll(), even though we actually have
603                          * bits that tell us what is happening (in case of new 
604                          * input AND error/hangup at the same time, we do an
605                          * explicit check at the bottom of the loop as well).
606                          */
607                         destroy_conn(c);
608                         continue;
609                 }
610
611                 /* overrun = disconnect */
612                 if (c->buf_len + bytes_avail > 254) {
613                         numeric(c, 503, "Buffer overrun; disconnecting.");
614                         destroy_conn(c);
615                         continue;
616                 }
617
618                 c->buf_len += bytes_avail;
619                 parse_command(c);
620
621                 if (fds[c->sock].revents & (POLLERR|POLLHUP|POLLNVAL)) {
622                         destroy_conn(c);
623                 }
624         }
625         return checked_through;
626 }
627
628 /*
629  * process_all_sendfiles():
630  *              Sends data to all clients that are ready to receive it.
631  *              Also checks for data connections that are newly-connected,
632  *              and handler xferlog entries for the files that are finished.
633  */
634 #if HAVE_POLL
635 int process_all_sendfiles(const int num_ac)
636 #else
637 int process_all_sendfiles(fd_set * const active_clients, const int num_ac)
638 #endif
639 {
640         struct ftran *f = NULL, *next = first_ftran->next_ftran;
641         int checked_through = 0;
642         struct sockaddr tempaddr;
643         int tempaddr_len = sizeof(tempaddr);
644  
645         while (next != NULL && checked_through < num_ac) {
646                 f = next;
647                 next = f->next_ftran;
648
649 #if HAVE_POLL
650                 if (fds[f->sock].revents & (POLLHUP|POLLERR|POLLNVAL)) {
651                         destroy_ftran(f);
652                         continue;
653                 }
654 #endif
655
656                 /* state = 2: incoming PASV, state >3: send file */
657 #if HAVE_POLL
658                 if ((f->state < 2) || (f->state == 3) ||  (fds[f->sock].revents & (POLLIN|POLLOUT)) == 0) {
659 #else
660                 if ((f->state < 2) || (f->state == 3) || !FD_ISSET(f->sock, active_clients)) {
661 #endif
662                         continue;
663                 }
664
665                 checked_through++;
666
667 #if HAVE_POLL
668                 /* Nothing is needed for the poll() version? */
669 #else
670                 FD_CLR(f->sock, active_clients);
671 #endif
672
673                 if (f->state == 2) {            /* incoming PASV */
674                         const unsigned int one = 1;
675                         const int tempsock = accept(f->sock, (struct sockaddr *)&tempaddr,
676                                                         &tempaddr_len);
677
678                         del_fd(f->sock);
679
680                         if (tempsock == -1) {
681                                 destroy_ftran(f);
682                                 continue;
683                         }
684
685                         f->sock = tempsock;
686                         ioctl(f->sock, FIONBIO, &one);
687                         init_file_transfer(f);
688 #if WANT_UPLOAD
689                         if (f->upload) continue;
690 #endif
691                 }
692                 if (f->state < 5) {
693                         init_file_transfer(f);
694 #if WANT_UPLOAD
695                         if (f->upload) continue;
696 #endif
697                 }
698
699                 /* for download, we send the first packets right away */
700 #if WANT_UPLOAD
701                 if (f->upload) {
702                         if (do_upload(f)) continue;
703                 } else
704 #endif
705                         if (do_download(f)) continue;
706
707                 /* do_{upload,download} returned 0, the transfer is complete */
708                 numeric(f->owner, 226, "Transfer complete.");
709                 time(&(f->owner->last_transfer));
710
711 #if WANT_XFERLOG
712                 if (!f->dir_listing) {
713                         write_xferlog(f);
714                 }
715 #endif
716
717                 destroy_ftran(f);
718 #if WANT_FULLSCREEN
719                 update_display(first_conn);
720 #endif
721         }
722
723         return checked_through;
724 }
725
726 #if WANT_UPLOAD
727 int do_upload(struct ftran *f)
728 {
729         char upload_buf[16384];
730         int size;
731 #if WANT_ASCII
732         /* keep buffer size small in ascii transfers 
733            to prevent process stalling while filtering
734            data on slower computers */
735
736         /* 
737          * This isn't a big problem, since we won't get
738          * packets this big anyway, the biggest I've seen
739          * was 12kB on 100mbit (but that was from a Windows
740          * machine), so I've reduced the buffer from 64 kB
741          * to 16 kB :-) --Steinar
742          */
743         const int maxlen = (f->ascii_mode == 1) ? 4096 : 16384;
744 #else
745         const int maxlen = 16384;
746 #endif
747
748         errno = 0;
749         size = recv(f->sock, upload_buf, maxlen, 0);
750         if (size >= 0) {
751                 f->pos += size;
752         }
753 #if WANT_ASCII
754         if (size > 0 && f->ascii_mode == 1) {
755                 size = ascii_uploadfilter(upload_buf, size);
756         }
757 #endif
758         if (size > 0 && (write(f->local_file, upload_buf, size) == size)) {
759                 return 1;
760         } else if (size == -1) {
761                 /* don't write xferlog... or? */
762                 numeric(f->owner, 426, strerror(errno));
763                 destroy_ftran(f);
764                 return 1;
765         }
766         return 0;
767
768 #endif
769
770 int do_download(struct ftran *f)
771 {
772 #if defined(TCP_CORK) && defined(SOL_TCP)
773         unsigned int zero = 0;
774 #endif
775         char *sendfrom_buf;
776         int bytes_to_send;
777         int more_to_send = 0;
778
779 #if !HAVE_MMAP
780         char buf[MAX_BLOCK_SIZE];
781 #endif
782 #if WANT_ASCII
783         char buf2[MAX_BLOCK_SIZE * 2];
784 #endif
785         int size;
786
787 #if HAVE_LINUX_SENDFILE
788         /*
789          * We handle the optimal case first, which is sendfile().
790          * Here we use a rather simplified sending `algorithm',
791          * leaving most of the quirks to the system calls.
792          */
793         if (f->dir_listing == 0) {
794                 int err;
795                 size = f->size - f->pos;
796
797                 if (size > f->block_size) size = f->block_size;
798                 if (size < 0) size = 0;
799
800 #ifdef TCP_CORK
801                 if (size != f->block_size) {
802                         setsockopt(f->sock, SOL_TCP, TCP_CORK, (void *)&zero, sizeof(zero));
803                 }       
804 #endif
805
806                 err = sendfile(f->sock, f->local_file, &f->pos, size);
807                 return (f->pos < f->size) && (err > -1);
808         }
809 #endif
810
811 #if HAVE_MMAP
812         size = f->size - f->pos;
813
814         if (size > f->block_size) size = f->block_size;
815         if (size < 0) size = 0;
816
817         bytes_to_send = size;
818         sendfrom_buf = f->file_data + f->pos;
819 #else
820         bytes_to_send = read(f->local_file, buf, f->block_size);
821         sendfrom_buf = buf;
822 #endif
823
824         if (bytes_to_send == f->block_size) more_to_send = 1;
825
826 #if WANT_ASCII
827         if (f->ascii_mode == 1) {
828                 bytes_to_send = ascii_downloadfilter(sendfrom_buf,
829                                                      buf2, bytes_to_send);
830                 sendfrom_buf = buf2;
831         }
832 #endif /* WANT_ASCII */
833
834 #if defined(TCP_CORK) && defined(SOL_TCP)
835         /* if we believe this is the last packet, unset TCP_CORK */
836         if (more_to_send == 0) {
837                 setsockopt(f->sock, SOL_TCP, TCP_CORK, (void *)&zero, sizeof(zero));
838         }
839 #endif
840
841         size = send(f->sock, sendfrom_buf, bytes_to_send, 0);
842         if (size < bytes_to_send) more_to_send = 1;
843
844 #if WANT_ASCII
845         if (f->ascii_mode == 1 && size < bytes_to_send && size > 0) {
846                 size = ascii_findlength(sendfrom_buf, size);
847         }
848 #endif
849
850 #if HAVE_MMAP
851         if (size > 0) f->pos += size;
852 #endif
853
854         return more_to_send;
855 }
856
857 #if WANT_XFERLOG
858 void write_xferlog(struct ftran *f)
859 {
860         char temp[256];
861         time_t now = time(NULL);
862         struct tm *t = localtime(&now);
863
864         if (xferlog == NULL) return;
865
866         strftime(temp, 256, "%a %b %d %H:%M:%S %Y", t);
867 #if WANT_UPLOAD
868         fprintf(xferlog, "%s %u %s %lu %s b _ %c a %s ftp 0 * \n",
869 #else
870         fprintf(xferlog, "%s %u %s %lu %s b _ o a %s ftp 0 *\n",
871 #endif
872                 temp, (int)(difftime(now, f->tran_start)),
873                 inet_ntoa(f->sin.sin_addr), f->size,
874                 f->filename,
875 #if WANT_UPLOAD
876                 (f->upload) ? 'i' : 'o',
877 #endif
878                 f->owner->username);
879         fflush(xferlog);
880
881 #if 0
882         /* vim needs this to work properly :-( */
883         )
884 #endif
885 }
886 #endif
887
888 #if 0
889 /* Reallocate the buggers constantly */
890 void screw_clients()
891 {
892         struct conn *c = first_conn;
893         int maxloops = MAXCLIENTS;
894
895         while (c && c->next_conn) {
896                 struct conn *temp = malloc(sizeof(*temp));
897                 if (!temp) break;
898                 *temp = *(c->next_conn);
899                 if (temp->transfer) temp->transfer->owner = temp;
900                 memset(c->next_conn, 0, sizeof(struct conn));
901                 free(c->next_conn);
902                 temp->prev_conn = c;
903                 c->next_conn = temp;
904                 c = c->next_conn;
905                 maxloops--;
906                 assert(maxloops > 0);
907         }
908 }
909 #endif
910
911 /*
912  * main():      Main function. Does the initialization, and contains
913  *              the main server loop. Takes no command-line arguments
914  *              (see README for justification).
915  */
916 int main(void)
917 {
918         int server_sock;
919
920 #if HAVE_POLL
921         /* the sets are declared globally if we use poll() */
922 #else
923         fd_set fds, fds_send;
924 #endif
925
926         /*setlinebuf(stdout);*/
927         setvbuf(stdout, (char *)NULL, _IOLBF, 0); 
928
929         signal(SIGPIPE, SIG_IGN);
930
931         printf("BetaFTPD version %s, Copyright (C) 1999-2000 Steinar H. Gunderson\n", VERSION);
932         puts("BetaFTPD comes with ABSOLUTELY NO WARRANTY; for details see the file");
933         puts("COPYING. This is free software, and you are welcome to redistribute it");
934         puts("under certain conditions; again see the file COPYING for details.");
935         puts("");
936
937         /* we don't need stdin */
938         close(0);
939
940 #if HAVE_POLL
941         {
942                 int i;
943                 for (i = 0; i < FD_MAX; i++) {
944                         fds[i].fd = -1;
945                         fds[i].events = 0;
946                 }
947         }
948 #else
949         FD_ZERO(&master_fds);
950         FD_ZERO(&master_send_fds);
951 #endif
952
953         server_sock = create_server_socket();
954
955 #if WANT_FULLSCREEN
956         printf("%cc", (char)27);        /* reset and clear the screen */
957 #endif
958
959         /* init dummy first connection */
960         first_conn = alloc_new_conn(-1);
961         first_ftran = alloc_new_ftran(0, NULL);
962 #if WANT_DCACHE
963         first_dcache = alloc_new_dcache();
964 #endif
965
966 #if WANT_XFERLOG
967 #if WANT_NONROOT
968 #warning No xferlog support for nonroot yet
969 #else
970         /* open xferlog */
971         xferlog = fopen("/var/log/xferlog", "r+");
972         if (xferlog == NULL) xferlog = fopen("/usr/adm/xferlog", "r+");
973
974         if (xferlog != NULL) {
975                  fseek(xferlog, 0L, SEEK_END);
976         }
977 #endif
978 #endif
979
980 #if WANT_FORK
981         switch (fork()) {
982         case -1:
983                 perror("fork()");
984                 puts("fork() failed, exiting");
985                 exit(0);
986         case 0:
987                 break;
988         default:
989                 puts("BetaFTPD forked into the background");
990                 exit(0);
991         }
992 #else
993         puts("BetaFTPD active");
994 #endif
995
996         /* set timeout alarm here (after the fork) */
997         alarm(60);
998         signal(SIGALRM, handle_alarm);
999
1000         for ( ;; ) {
1001                 int i;
1002 #ifndef HAVE_POLL
1003                 struct timeval timeout;
1004 #endif
1005
1006                 /*screw_clients();       //look for memory errors */
1007
1008 #if WANT_FULLSCREEN
1009                 update_display(first_conn);
1010 #endif
1011
1012 #if HAVE_POLL
1013                 i = poll(fds, highest_fds + 1, 60000);
1014 #if 0
1015                 {
1016                         int j;
1017                         for (j=0; j<=highest_fds; j++) {
1018                                 if (fds[j].revents) printf("fds[%d].fd %d, .revents %x\n", j, fds[j].fd, fds[j].revents);
1019                         }
1020                 }
1021 #endif
1022 #else
1023                 /* reset fds (gets changed by select()) */
1024                 fds = master_fds;
1025                 fds_send = master_send_fds;
1026
1027                 /*
1028                  * wait up to 60 secs for any activity 
1029                  */
1030                 timeout.tv_sec = 60;
1031                 timeout.tv_usec = 0;
1032
1033                 i = select(FD_SETSIZE, &fds, &fds_send, NULL, &timeout);
1034 #endif
1035
1036                 if (i == -1) {
1037                         if (errno == EBADF) {
1038 #if !HAVE_POLL
1039                                 /* don't like this, but we have to */
1040                                 clear_bad_fds(&server_sock);
1041 #endif
1042                         } else if (errno != EINTR) {
1043 #if HAVE_POLL
1044                                 perror("poll()");
1045 #else
1046                                 perror("select()");
1047 #endif
1048                                 continue;
1049                         }
1050                 }
1051
1052 #if HAVE_POLL
1053                 /* fix an invalid server socket */
1054                 if (fds[server_sock].revents & POLLERR) {
1055                         del_fd(server_sock);
1056                         server_sock = create_server_socket();
1057                 }
1058 #endif
1059
1060                 /* remove any timed out sockets */
1061                 if (time_to_check) {
1062                         time_out_sockets();
1063 #if WANT_DCACHE
1064                         time_out_dcache();
1065 #endif
1066                         time_to_check = 0;
1067                 }
1068
1069                 if (i <= 0) continue;
1070
1071 #if HAVE_POLL
1072                 i -= process_all_sendfiles(i);
1073                 process_all_clients(i);
1074 #else
1075                 /* sends are given highest `priority' */
1076                 i -= process_all_sendfiles(&fds_send, i);
1077
1078                 /* incoming PASV connections and uploads */
1079                 i -= process_all_sendfiles(&fds, i);
1080
1081                 /*
1082                  * check the incoming PASV connections first, so
1083                  * process_all_clients() won't be confused.
1084                  */ 
1085                 process_all_clients(&fds, i);
1086 #endif
1087
1088 #if HAVE_POLL
1089                 if (fds[server_sock].revents & POLLIN) {
1090 #else
1091                 if (FD_ISSET(server_sock, &fds)) {
1092 #endif
1093                         accept_new_client(&server_sock);
1094                         i--;
1095                 }
1096         }
1097 }
1098
1099 /*
1100  * accept_new_client():
1101  *              Open a socket for the new client, say hello and put it in
1102  *              among the others.
1103  */
1104 void accept_new_client(int * const server_sock)
1105 {
1106         struct sockaddr_in tempaddr;
1107         int tempaddr_len = sizeof(tempaddr);
1108         const int tempsock = accept(*server_sock, (struct sockaddr *)&tempaddr, &tempaddr_len);
1109
1110         static int num_err = 0;
1111
1112         if (tempsock < 0) {
1113 #ifndef WANT_FORK
1114                 perror("accept()");
1115 #endif
1116                 close(tempsock);
1117                 if ((errno == EBADF || errno == EPIPE) && ++num_err >= 3) {
1118                         del_fd(*server_sock);
1119                         *server_sock = create_server_socket();
1120                 }
1121         } else {
1122                 struct conn * const c = alloc_new_conn(tempsock);
1123                 num_err = 0;
1124                 if (c != NULL) {
1125                         numeric(c, 220, "BetaFTPD " VERSION " ready.");
1126 #if WANT_STAT
1127                         memcpy(&(c->addr), &tempaddr, sizeof(struct sockaddr));
1128 #endif
1129                 }
1130         }
1131 }
1132
1133 /*
1134  * time_out_sockets():
1135  *              Times out any socket that has not had any transfer
1136  *              in the last 15 minutes (delay not customizable by FTP
1137  *              user -- you must change it in ftpd.h).
1138  *
1139  *              Note that RFC959 explicitly states that there are no
1140  *              `spontaneous' error replies, yet we have to do it to
1141  *              get the message through at all.
1142  *
1143  *              If we check this list for every accept() call, it's
1144  *              actually eating a lot of CPU time, so we only check
1145  *              it every minute. We used to do a time() call here,
1146  *              but we've changed to do use an alarm() call and set
1147  *              the time_to_check_flag in the SIGALRM handler.
1148  */
1149 RETSIGTYPE handle_alarm(int signum)
1150 {
1151         time_to_check = 1;
1152         alarm(60);
1153
1154         /* for libc5 */
1155         signal(SIGALRM, handle_alarm);
1156 }
1157
1158 void time_out_sockets()
1159 {
1160         struct conn *c = NULL, *next = first_conn->next_conn;
1161         time_t now = time(NULL);  
1162
1163         /* run through the linked list */
1164         while (next != NULL) {
1165                 c = next;
1166                 next = c->next_conn;
1167
1168                 if ((c->transfer == NULL || c->transfer->state != 5) &&
1169                     (now - c->last_transfer > TIMEOUT_SECS)) {
1170                         /* RFC violation? */
1171                         numeric(c, 421, "Timeout (%u minutes): Closing control connection.", TIMEOUT_SECS/60);
1172                         destroy_conn(c);
1173                 }
1174         }
1175 }
1176
1177 #if WANT_DCACHE
1178 /*
1179  * time_out_dcache():
1180  *              Time out expired directory listing cache entries.
1181  *              Uses much of the same code as time_out_sockets().
1182  */
1183 void time_out_dcache()
1184 {
1185         struct dcache *d = NULL, *next = first_dcache->next_dcache;
1186         time_t now = time(NULL);        
1187
1188         /* run through the linked list */
1189         while (next != NULL) {
1190                 d = next;
1191                 next = d->next_dcache;
1192
1193                 if (d->use_count == 0 && (now - d->last_used > 900)) {
1194                         destroy_dcache(d);
1195                 }
1196         }
1197 }
1198 #endif
1199
1200 /*
1201  * remove_bytes():
1202  *              Remove some bytes from the incoming buffer. This gives
1203  *              room for new data on the control connection, and should
1204  *              be called when the code has finished using the data.
1205  *              (This is done automatically for all commands, so you
1206  *              normally need not worry about it.)
1207  */
1208 void remove_bytes(struct conn * const c, const int num)
1209 {
1210         if (c->buf_len <= num) {
1211                 c->buf_len = 0;
1212         } else {
1213                 c->buf_len -= num;
1214                 memmove(c->recv_buf, c->recv_buf + num, c->buf_len);
1215         }
1216 }
1217
1218 /*
1219  * numeric():   Sends a numeric FTP reply to the client. Note that
1220  *              you can use this command much the same way as you
1221  *              would use a printf() (with all the normal %s, %d,
1222  *              etc.), since it actually uses printf() internally.
1223  */
1224 void numeric(struct conn * const c, const int numeric, const char * const format, ...)
1225 {
1226         char buf[256], fmt[256];
1227         va_list args;
1228         int i, err;
1229
1230         snprintf(fmt, 256, "%03u %s\r\n", numeric, format);
1231
1232         va_start(args, format);
1233         i = vsnprintf(buf, 256, fmt, args);
1234         va_end(args);
1235
1236         err = send(c->sock, buf, i, 0);
1237         if (err == -1 && errno == EPIPE) {
1238                 destroy_conn(c);
1239         }
1240 }
1241
1242 /*
1243  * init_file_transfer():
1244  *              Initiate a data connection for sending. This does not open
1245  *              any files etc., just does whatever is needed for the socket,
1246  *              if needed. It does, however, send the 150 reply to the client,
1247  *              and mmap()s if needed.
1248  *
1249  *              Linux systems (others?) define SOL_TCP right away, which saves us
1250  *              some grief and code size. Perhaps using getprotoent() is the `right'
1251  *              way, but it's bigger :-) (Optionally, we could figure it out at
1252  *              configure time, of course...)
1253  *
1254  *              For optimal speed, we use the Linux 2.2.x-only TCP_CORK flag if
1255  *              possible. Note that this is only defined in the first `arm' --
1256  *              we silently assume that Linux is the only OS supporting this
1257  *              flag. This might be an over-generalization, but I it looks like
1258  *              we'll have to depend on it other places as well, so we might
1259  *              just as well be evil here.
1260  */
1261 void init_file_transfer(struct ftran * const f)
1262 {
1263         struct linger ling;
1264         struct conn * const c = f->owner;
1265         const int mode = IPTOS_THROUGHPUT, zero = 0, one = 1;
1266         struct stat buf;
1267         int events;
1268
1269 #ifdef SOL_TCP
1270         /* we want max throughput */
1271         setsockopt(f->sock, SOL_IP, IP_TOS, (void *)&mode, sizeof(mode));
1272         setsockopt(f->sock, SOL_TCP, TCP_NODELAY, (void *)&zero, sizeof(zero));
1273 #ifdef TCP_CORK
1274         setsockopt(f->sock, SOL_TCP, TCP_CORK, (void *)&one, sizeof(one));
1275 #endif
1276 #else
1277         /* should these pointers be freed afterwards? */
1278         {
1279                 getprotoent();  /* legal? */
1280                 {
1281                         const struct protoent * const pe_ip  = getprotobyname("ip");
1282                         const struct protoent * const pe_tcp = getprotobyname("tcp");
1283                         setsockopt(f->sock, pe_ip->p_proto, IP_TOS, (void *)&mode, sizeof(mode));
1284                         setsockopt(f->sock, pe_tcp->p_proto, TCP_NODELAY, (void *)&zero, sizeof(zero));
1285                 }
1286                 endprotoent();
1287         }
1288 #endif
1289
1290         if (f->dir_listing) {
1291                 f->block_size = MAX_BLOCK_SIZE;
1292         } else {
1293 #if WANT_ASCII
1294                 f->ascii_mode = f->owner->ascii_mode;
1295 #endif
1296
1297                 /* find the preferred block size */
1298                 f->block_size = MAX_BLOCK_SIZE;
1299                 if (fstat(f->local_file, &buf) != -1 &&
1300                     buf.st_blksize < MAX_BLOCK_SIZE) {
1301                         f->block_size = buf.st_blksize;
1302                 }
1303         }
1304
1305         f->state = 5;
1306
1307         events = POLLOUT;
1308 #if WANT_UPLOAD
1309         if (f->upload) {
1310                 events = POLLIN;
1311         }
1312 #endif /* WANT_UPLOAD */
1313
1314         TRAP_ERROR(add_fd(f->sock, events), 500, return);
1315
1316         ling.l_onoff = 0;
1317         ling.l_linger = 0;
1318         setsockopt(f->sock, SOL_SOCKET, SO_LINGER, &ling, sizeof(ling));
1319
1320 #if !HAVE_POLL && WANT_UPLOAD
1321         /*
1322          * if we let an upload socket stay in master_send_fds, we would
1323          * get data that would fool us into closing the socket... (sigh)
1324          */
1325         if (f->upload) {
1326                 FD_CLR(f->sock, &master_send_fds);
1327                 FD_SET(f->sock, &master_fds);
1328         }
1329 #endif
1330
1331         time(&(f->owner->last_transfer));
1332         
1333         if (f->dir_listing) {
1334                 /* include size? */
1335                 numeric(f->owner, 150, "Opening ASCII mode data connection for directory listing.");
1336         } else {
1337                 /*
1338                  * slightly kludged -- perhaps we should kill the second arm,
1339                  * at the expense of code size? Or perhaps we could collapse
1340                  * the two possible replies into one?
1341                  */
1342 #if WANT_ASCII
1343                 if (f->ascii_mode
1344 #if WANT_UPLOAD
1345                         || f->upload
1346 #endif /* WANT_UPLOAD */
1347                 ) {
1348                         numeric(f->owner, 150, "Opening %s mode data connection for '%s'",
1349                                 (f->ascii_mode) ? "ASCII" : "BINARY", f->filename);
1350                 } else {
1351                         numeric(f->owner, 150, "Opening %s mode data connection for '%s' (%u bytes)",
1352                                 (f->ascii_mode) ? "ASCII" : "BINARY", f->filename,
1353                                 f->size); 
1354                 }
1355 #else /* !WANT_ASCII */
1356 #if WANT_UPLOAD
1357                 if (f->upload) {
1358                         numeric(f->owner, 150, "Opening BINARY mode data connection for '%s'", f->filename);
1359                 } else
1360 #endif /* WANT_UPLOAD */
1361                         numeric(f->owner, 150, "Opening BINARY mode data connection for '%s' (%u bytes)", f->filename, f->size);
1362 #endif /* !WANT_ASCII */
1363         }
1364
1365         /*
1366          * This section _could_ in theory be more optimized, but it's
1367          * much easier this way, and hopefully, the compiler will be
1368          * intelligent enough to optimize most of this away. The idea
1369          * is, some modes _require_ use of mmap (or not). The preferred
1370          * thing is using mmap() when we don't have sendfile(), and not
1371          * using mmap() when we have sendfile().
1372          */
1373 #if HAVE_MMAP
1374         if (f->dir_listing == 0) {
1375 #if HAVE_LINUX_SENDFILE
1376                 int do_mmap = 0;
1377 #else
1378                 int do_mmap = 1;
1379 #endif
1380 #if WANT_ASCII
1381                 if (f->ascii_mode == 1) do_mmap = 1;
1382 #endif
1383 #if WANT_UPLOAD
1384                 if (f->upload == 1) do_mmap = 0;
1385 #endif
1386  
1387                 if (do_mmap == 1) {
1388                         f->file_data = mmap(NULL, f->size, PROT_READ, MAP_SHARED, f->local_file, 0);
1389                         if (f->file_data == MAP_FAILED) f->file_data = NULL;
1390                 } else {
1391                         f->file_data = NULL;
1392                 }
1393                 f->pos = f->owner->rest_pos;
1394         }
1395 #else /* !HAVE_MMAP */
1396         lseek(f->local_file, f->owner->rest_pos, SEEK_SET);
1397 #endif
1398 }
1399
1400 /*
1401  * create_server_socket():
1402  *              Create and bind a server socket, that we can use to
1403  *              listen to new clients on.
1404  */
1405 int create_server_socket()
1406 {
1407         int server_sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
1408         const unsigned int one = 1;
1409         struct sockaddr_in addr;
1410         int err;
1411         
1412         /*
1413          * In the `perfect' world, if an address was in use, we could
1414          * just wait for the kernel to clear everything up, and everybody
1415          * would be happy. But when you just found out your server socket
1416          * was invalid, it has to be `re-made', and 3000 users are trying
1417          * to access your fileserver, I think it's nice that it comes
1418          * up right away... hence this option.
1419          */
1420         setsockopt(server_sock, SOL_SOCKET, SO_REUSEADDR, &one, sizeof(one));
1421         ioctl(server_sock, FIONBIO, &one);      /* just in case */
1422
1423         addr.sin_family = AF_INET;
1424         addr.sin_addr.s_addr = INADDR_ANY;
1425         addr.sin_port = htons(FTP_PORT);
1426
1427         do {
1428                 err = bind(server_sock, (struct sockaddr *)&addr, sizeof(struct sockaddr));
1429
1430                 if (err == -1) {
1431                         perror("bind()");
1432                 
1433                         /* try to recover from recoverable errors... */
1434                         if (errno == ENOMEM || errno == EADDRINUSE) {
1435                                 puts("Waiting 1 sec before trying again...");
1436                                 sleep(1);
1437                         } else {
1438                                 puts("Giving up.");
1439                                 exit(1); 
1440                         }
1441                 }
1442         } while (err == -1);
1443
1444         listen(server_sock, 20);
1445
1446         err = add_fd(server_sock, POLLIN);
1447         if (err) {
1448                 perror("add_fd");
1449                 return -1;
1450         }
1451
1452         return server_sock;
1453 }
1454
1455 #if !HAVE_POLL
1456 /*
1457  * clear_bad_fds():
1458  *              Try to find invalid socket descriptors, and clean them.
1459  *              The methods used are rather UGLY, but I can't think of
1460  *              any good way of checking e.g. server_sock without
1461  *              doing anything to it :-(
1462  *
1463  *              poll() is able to do this in a much cleaner way, which 
1464  *              we use if we use poll(). That checking isn't done here,
1465  *              though.
1466  */
1467 void clear_bad_fds(int * const server_sock)
1468 {
1469         {
1470                 fd_set fds;
1471                 struct timeval tv = { 0, 0 };
1472
1473                 FD_ZERO(&fds);
1474                 FD_SET(*server_sock, &fds); 
1475                 if (select(*server_sock, &fds, NULL, NULL, &tv) == -1) {
1476                         FD_CLR(*server_sock, &master_fds);
1477                         close(*server_sock);
1478                         *server_sock = create_server_socket();
1479                 }
1480         }
1481
1482         /* could do this (conn, ftran) in any order */
1483         {
1484                 struct conn *c = NULL, *next = first_conn->next_conn;
1485         
1486                 /* run through the linked list */
1487                 while (next != NULL) {
1488                         char buf[1];
1489
1490                         c = next;
1491                         next = c->next_conn;
1492
1493                         if (read(c->sock, &buf, 0) == -1 &&
1494                             errno == EBADF) {
1495                                 destroy_conn(c);
1496                         }
1497                 }
1498         }
1499
1500         {
1501                 struct ftran *f = NULL, *next = first_ftran->next_ftran;
1502         
1503                 while (next != NULL) {
1504                         char buf[1];
1505
1506                         f = next;
1507                         next = f->next_ftran;
1508
1509                         if (read(f->sock, &buf, 0) == -1 &&
1510                             errno == EBADF) {
1511                                 destroy_ftran(f);
1512                         }
1513                 }
1514         }       
1515 }
1516 #endif
1517
1518 #if WANT_MESSAGE
1519 /*
1520  * dump_file(): Dumps a file on the control connection. Used for
1521  *              welcome messages and the likes. Note that outbuf
1522  *              is so big, to prevent any crashing from users creating
1523  *              weird .message files (like 1024 LFs)... The size of
1524  *              the file is limited to 1024 bytes (by truncation).
1525  */
1526 void dump_file(struct conn * const c, const int num, const char * const filename)
1527 {
1528         char buf[1024], outbuf[5121];
1529         char *ptr = outbuf + 4;
1530         int i, j = -1;
1531
1532         const int dumpfile = open(filename, O_RDONLY);
1533         if (dumpfile == -1) return;
1534
1535         i = read(dumpfile, buf, 1024);
1536         if (i <= 0) {
1537                 close(dumpfile);
1538                 return;
1539         }
1540
1541         sprintf(outbuf, "%03u-", num);
1542         while (++j < i) {
1543                 *ptr++ = buf[j];
1544                 if (buf[j] == '\n') {
1545                         sprintf(ptr, "%03u-", num);
1546                         ptr += 4;
1547                 }
1548         }
1549         *ptr++ = '\n';
1550
1551         send(c->sock, outbuf, ptr - outbuf, 0);
1552         close(dumpfile);
1553 }
1554
1555
1556 /*
1557  * list_readme():
1558  *              Lists all README file in the current (ie. OS current)
1559  *              directory, in a 250- message.
1560  */
1561 void list_readmes(struct conn * const c)
1562 {
1563         glob_t pglob;
1564         const time_t now = time(NULL);
1565         int i;
1566
1567         if (glob("README*", 0, NULL, &pglob) != 0) return;
1568
1569         for (i = 0; i < pglob.gl_pathc; i++) {
1570                 struct stat buf;
1571                 char str[256];
1572                 char *tm;
1573
1574                 if (stat(pglob.gl_pathv[i], &buf) == -1) continue;
1575
1576                 /* remove trailing LF */
1577                 tm = ctime(&buf.st_mtime);
1578                 tm[strlen(tm) - 1] = 0;
1579
1580                 snprintf(str, 256, "250-Please read the file %s\r\n"
1581                                    "250-\tIt was last modified %s - %ld days ago\r\n",
1582                         pglob.gl_pathv[i], tm,
1583                         (now - buf.st_mtime) / 86400);
1584                 send(c->sock, str, strlen(str), 0);
1585         }
1586         globfree(&pglob);
1587 }
1588 #endif
1589