#include <hallo.h>
* Bill Allombert [Fri, Nov 17 2006, 04:48:11PM]:
> On Sat, Jun 11, 2005 at 12:23:33PM +0200, Eduard Bloch wrote:
> > Package: boa
> > Version: 0.94.14rc20-1.2
> > Severity: important
> >
> > Hello,
>
> Hello Eduard and Teófilo,
> I plan to NMU boa to fix most of the oustanding bugs.
>
> > a while ago I have sent you patches to enable LFS support.
> > Unfortunately, it is broken again. It cuts file size to
> > n mod 4GB which makes only the first hundred MiB of a DVD image
> > accessible, for example.
> >
> > Please fix that. You still have my patch, it should be easy to port it
> > to the current version.
>
> Well, I do not have them. Could you update them for boa 0.94.14rc21 ?
I could not find it here, and even if I could I doubt they would be
easily applicable. Instead, I took the current version in sid and
modified it again. The attached version is almost okay any still have
some little glitches:
- it was not tested on real data, only sparse file to /dev/null
transfer
- detection of LFS support is not added, I hardcoded good values into
config.h.in
- I have used off_t as the main type everywhere. On some places even
for "unsigned int" where it looked like it would not hurt at the
first glance
Eduard.
--
<LGS> Halloechen, ihr Spinner, so frueh auf?
<nusse> nein, wir schlafen alle im kollektiv
<knorke> mein alkoven ist kaputt
<teq> alkohol kaputt?
diff -urd boa-0.94.14rc20/debian/changelog
boa-0.94.14rc20.lfspatched/debian/changelog
--- boa-0.94.14rc20/debian/changelog 2006-01-01 00:01:59.000000000 +0100
+++ boa-0.94.14rc20.lfspatched/debian/changelog 2006-11-17 22:44:34.245211733
+0100
@@ -1,3 +1,10 @@
+boa (0.94.14rc20-1.4) unstable; urgency=low
+
+ * Non-maintainer upload.
+ * LFS fixes
+
+ -- Eduard Bloch <[EMAIL PROTECTED]> Fri, 17 Nov 2006 22:44:28 +0100
+
boa (0.94.14rc20-1.3) unstable; urgency=low
* Non Maintainer Upload
diff -urd boa-0.94.14rc20/debian/rules boa-0.94.14rc20.lfspatched/debian/rules
--- boa-0.94.14rc20/debian/rules 2006-01-01 00:01:59.000000000 +0100
+++ boa-0.94.14rc20.lfspatched/debian/rules 2006-11-18 00:49:05.668146486
+0100
@@ -18,7 +18,8 @@
build-stamp:
dh_testdir
- CFLAGS="-D_FILE_OFFSET_BITS=64 -D_LARGEFILE_SOURCE
-D_LARGEFILE64_SOURCE" ./configure;make
+ #CFLAGS="-D_FILE_OFFSET_BITS=64 -D_LARGEFILE_SOURCE
-D_LARGEFILE64_SOURCE"
+ ./configure;make
cd docs;make boa.html boa.info
touch build-stamp
diff -urd boa-0.94.14rc20/src/boa.h boa-0.94.14rc20.lfspatched/src/boa.h
--- boa-0.94.14rc20/src/boa.h 2006-01-01 00:01:59.000000000 +0100
+++ boa-0.94.14rc20.lfspatched/src/boa.h 2006-11-17 23:54:29.535400985
+0100
@@ -25,7 +25,9 @@
#ifndef _BOA_H
#define _BOA_H
+/* Important, include before anything else */
#include "config.h"
+
#include <errno.h>
#include <stdlib.h> /* malloc, free, etc. */
#include <stdio.h> /* stdin, stdout, stderr */
@@ -165,7 +167,7 @@
void clean_pathname(char *pathname);
char *get_commonlog_time(void);
void rfc822_time_buf(char *buf, time_t s);
-char *simple_itoa(unsigned int i);
+char *simple_itoa(uint64_t i);
int boa_atoi(const char *s);
int month2int(const char *month);
int modified_since(time_t * mtime, const char *if_modified_since);
diff -urd boa-0.94.14rc20/src/buffer.c boa-0.94.14rc20.lfspatched/src/buffer.c
--- boa-0.94.14rc20/src/buffer.c 2006-01-01 00:01:59.000000000 +0100
+++ boa-0.94.14rc20.lfspatched/src/buffer.c 2006-11-18 00:42:40.364066486
+0100
@@ -211,7 +211,7 @@
return -2;
if (bytes_to_write) {
- int bytes_written;
+ off_t bytes_written;
bytes_written = write(req->fd, req->buffer + req->buffer_start,
bytes_to_write);
diff -urd boa-0.94.14rc20/src/config.h.in
boa-0.94.14rc20.lfspatched/src/config.h.in
--- boa-0.94.14rc20/src/config.h.in 2006-01-01 00:01:59.000000000 +0100
+++ boa-0.94.14rc20.lfspatched/src/config.h.in 2006-11-17 23:40:54.980494485
+0100
@@ -205,3 +205,17 @@
/* Define to `int' if <sys/types.h> doesn't define. */
#undef uid_t
+
+#define LFS_ENABLED
+
+/* Those enable the LFS ready structures in the system headers */
+#ifdef LFS_ENABLED
+#define _FILE_OFFSET_BITS 64 /* glibc style */
+#define _LARGEFILE_SOURCE 1 /* To make ftello() visible (HP-UX 10.20). */
+#define _LARGE_FILES 1 /* Large file defined on AIX-style hosts. */
+
+#define _LARGEFILE64_SOURCE /* tell kernel headers to provide the O_LARGEFILE
value */
+#define PRINTF_SIZE_ARG "%lld"
+#else
+#define PRINTF_SIZE_ARG "%ld"
+#endif
diff -urd boa-0.94.14rc20/src/get.c boa-0.94.14rc20.lfspatched/src/get.c
--- boa-0.94.14rc20/src/get.c 2006-01-01 00:01:59.000000000 +0100
+++ boa-0.94.14rc20.lfspatched/src/get.c 2006-11-18 00:43:20.398568485
+0100
@@ -25,6 +25,10 @@
#include "boa.h"
#include "access.h"
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <fcntl.h>
+
#define STR(s) __STR(s)
#define __STR(s) #s
@@ -52,9 +56,9 @@
{
int data_fd, saved_errno;
struct stat statbuf;
- volatile unsigned int bytes_free;
+ volatile off_t bytes_free;
- data_fd = open(req->pathname, O_RDONLY);
+ data_fd = open(req->pathname, O_RDONLY|O_LARGEFILE);
saved_errno = errno; /* might not get used */
#ifdef GUNZIP
@@ -76,7 +80,7 @@
memcpy(gzip_pathname, req->pathname, len);
memcpy(gzip_pathname + len, ".gz", 3);
gzip_pathname[len + 3] = '\0';
- data_fd = open(gzip_pathname, O_RDONLY);
+ data_fd = open(gzip_pathname, O_RDONLY|O_LARGEFILE);
if (data_fd != -1) {
close(data_fd);
@@ -430,8 +434,8 @@
int process_get(request * req)
{
- int bytes_written;
- volatile unsigned int bytes_to_write;
+ off_t bytes_written;
+ volatile off_t bytes_to_write;
if (req->method == M_HEAD) {
return complete_response(req);
@@ -531,7 +535,7 @@
memcpy(pathname_with_index, req->pathname, l1); /* doesn't copy NUL */
memcpy(pathname_with_index + l1, directory_index, l2 + 1); /* does */
- data_fd = open(pathname_with_index, O_RDONLY);
+ data_fd = open(pathname_with_index, O_RDONLY|O_LARGEFILE);
if (data_fd != -1) { /* user's index file */
/* We have to assume that directory_index will fit, because
@@ -555,7 +559,7 @@
* try index.html.gz
*/
strcat(pathname_with_index, ".gz");
- data_fd = open(pathname_with_index, O_RDONLY);
+ data_fd = open(pathname_with_index, O_RDONLY|O_LARGEFILE);
if (data_fd != -1) { /* user's index file */
close(data_fd);
@@ -624,9 +628,9 @@
* include the NUL when calculating if the size is enough
*/
snprintf(pathname_with_index, sizeof(pathname_with_index),
- "%s/dir.%d.%ld", cachedir,
+ "%s/dir.%d." PRINTF_SIZE_ARG, cachedir,
(int) statbuf->st_dev, statbuf->st_ino);
- data_fd = open(pathname_with_index, O_RDONLY);
+ data_fd = open(pathname_with_index, O_RDONLY|O_LARGEFILE);
if (data_fd != -1) { /* index cache */
@@ -642,7 +646,7 @@
if (index_directory(req, pathname_with_index) == -1)
return -1;
- data_fd = open(pathname_with_index, O_RDONLY); /* Last chance */
+ data_fd = open(pathname_with_index, O_RDONLY|O_LARGEFILE); /* Last chance
*/
if (data_fd != -1) {
strcpy(req->request_uri, directory_index); /* for mimetype */
fstat(data_fd, statbuf);
@@ -671,7 +675,7 @@
DIR *request_dir;
FILE *fdstream;
struct dirent *dirbuf;
- int bytes = 0;
+ off_t bytes = 0;
char *escname = NULL;
if (chdir(req->pathname) == -1) {
diff -urd boa-0.94.14rc20/src/globals.h boa-0.94.14rc20.lfspatched/src/globals.h
--- boa-0.94.14rc20/src/globals.h 2006-01-01 00:01:59.000000000 +0100
+++ boa-0.94.14rc20.lfspatched/src/globals.h 2006-11-17 23:12:10.544723985
+0100
@@ -130,9 +130,9 @@
int numranges;
int data_fd; /* fd of data */
- unsigned long filesize; /* filesize */
- unsigned long filepos; /* position in file */
- unsigned long bytes_written; /* total bytes written (sans header) */
+ off_t filesize; /* filesize */
+ off_t filepos; /* position in file */
+ off_t bytes_written; /* total bytes written (sans header) */
char *data_mem; /* mmapped/malloced char array */
char *logline; /* line to log file */
diff -urd boa-0.94.14rc20/src/index_dir.c
boa-0.94.14rc20.lfspatched/src/index_dir.c
--- boa-0.94.14rc20/src/index_dir.c 2006-01-01 00:01:59.000000000 +0100
+++ boa-0.94.14rc20.lfspatched/src/index_dir.c 2006-11-17 23:41:36.707102235
+0100
@@ -19,6 +19,7 @@
/* $Id: index_dir.c,v 1.32.2.5 2004/03/05 04:19:00 jnelson Exp $*/
+#include "config.h"
#include <stdio.h>
#include <sys/stat.h>
#include <limits.h> /* for PATH_MAX */
@@ -262,10 +263,12 @@
printf("<tr>"
"<td width=\"40%%\"><a href=\"%s/\">%s/</a></td>"
"<td align=right>%s</td>"
- "<td align=right>%ld bytes</td>"
+ "<td align=right>"
+ PRINTF_SIZE_ARG
+ " bytes</td>"
"</tr>\n",
escaped_filename, html_filename,
- ctime(&statbuf.st_mtime), (long) statbuf.st_size);
+ ctime(&statbuf.st_mtime), (off_t) statbuf.st_size);
}
printf
@@ -308,19 +311,23 @@
"<td width=\"40%%\"><a href=\"%s\">%s</a> "
"<a href=\"%s.gz\">(.gz)</a></td>"
"<td align=right>%s</td>"
- "<td align=right>%ld bytes</td>"
+ "<td align=right>"
+ PRINTF_SIZE_ARG
+ " bytes</td>"
"</tr>\n",
escaped_filename, html_filename, http_filename,
- ctime(&statbuf.st_mtime), (long) statbuf.st_size);
+ ctime(&statbuf.st_mtime), (off_t) statbuf.st_size);
} else {
#endif
printf("<tr>"
"<td width=\"40%%\"><a href=\"%s\">%s</a></td>"
"<td align=right>%s</td>"
- "<td align=right>%ld bytes</td>"
+ "<td align=right>"
+ PRINTF_SIZE_ARG
+ " bytes</td>"
"</tr>\n",
escaped_filename, html_filename,
- ctime(&statbuf.st_mtime), (long) statbuf.st_size);
+ ctime(&statbuf.st_mtime), (off_t) statbuf.st_size);
#ifdef GUNZIP
}
#endif
diff -urd boa-0.94.14rc20/src/log.c boa-0.94.14rc20.lfspatched/src/log.c
--- boa-0.94.14rc20/src/log.c 2006-01-01 00:01:59.000000000 +0100
+++ boa-0.94.14rc20.lfspatched/src/log.c 2006-11-18 00:50:16.568577485
+0100
@@ -146,7 +146,7 @@
} else if (vhost_root) {
printf("%s ", (req->host ? req->host : "(null)"));
}
- printf("%s - - %s\"%s\" %d %ld \"%s\" \"%s\"\n",
+ printf("%s - - %s\"%s\" %d " PRINTF_SIZE_ARG " \"%s\" \"%s\"\n",
req->remote_ip_addr,
get_commonlog_time(),
req->logline ? req->logline : "-",
diff -urd boa-0.94.14rc20/src/mmap_cache.c
boa-0.94.14rc20.lfspatched/src/mmap_cache.c
--- boa-0.94.14rc20/src/mmap_cache.c 2006-01-01 00:01:59.000000000 +0100
+++ boa-0.94.14rc20.lfspatched/src/mmap_cache.c 2006-11-17 22:53:37.491162485
+0100
@@ -139,7 +139,7 @@
int data_fd;
struct stat statbuf;
struct mmap_entry *e;
- data_fd = open(fname, O_RDONLY);
+ data_fd = open(fname, O_RDONLY|O_LARGEFILE);
if (data_fd == -1) {
perror(fname);
return NULL;
diff -urd boa-0.94.14rc20/src/pipe.c boa-0.94.14rc20.lfspatched/src/pipe.c
--- boa-0.94.14rc20/src/pipe.c 2006-01-01 00:01:59.000000000 +0100
+++ boa-0.94.14rc20.lfspatched/src/pipe.c 2006-11-18 00:45:43.067484735
+0100
@@ -36,8 +36,8 @@
int read_from_pipe(request * req)
{
- int bytes_read; /* signed */
- unsigned int bytes_to_read; /* unsigned */
+ off_t bytes_read; /* signed */
+ off_t bytes_to_read; /* unsigned */ /* XXX really? */
bytes_to_read = BUFFER_SIZE - (req->header_end - req->buffer - 1);
@@ -127,8 +127,8 @@
int write_from_pipe(request * req)
{
- int bytes_written;
- unsigned int bytes_to_write = req->header_end - req->header_line;
+ off_t bytes_written;
+ off_t bytes_to_write = req->header_end - req->header_line;
if (bytes_to_write == 0) {
if (req->cgi_status == CGI_DONE)
@@ -169,8 +169,8 @@
#ifdef HAVE_SENDFILE
int io_shuffle_sendfile(request * req)
{
- int bytes_written;
- unsigned int bytes_to_write;
+ off_t bytes_written;
+ off_t bytes_to_write;
if (req->method == M_HEAD) {
return complete_response(req);
@@ -239,8 +239,8 @@
int io_shuffle(request * req)
{
- int bytes_to_read;
- int bytes_written, bytes_to_write;
+ off_t bytes_to_read;
+ off_t bytes_written, bytes_to_write;
if (req->method == M_HEAD) {
return complete_response(req);
@@ -260,7 +260,7 @@
bytes_to_read = bytes_to_write;
if (bytes_to_read > 0 && req->data_fd) {
- int bytes_read;
+ off_t bytes_read;
off_t temp;
temp = lseek(req->data_fd, req->ranges->start, SEEK_SET);
diff -urd boa-0.94.14rc20/src/range.c boa-0.94.14rc20.lfspatched/src/range.c
--- boa-0.94.14rc20/src/range.c 2006-01-01 00:01:59.000000000 +0100
+++ boa-0.94.14rc20.lfspatched/src/range.c 2006-11-17 23:56:33.211130236
+0100
@@ -147,7 +147,7 @@
* 5) start > stop && start != -1 :: invalid
*/
DEBUG(DEBUG_RANGE) {
- fprintf(stderr, "range.c: ranges_fixup: %lu-%lu\n", r->start,
r->stop);
+ fprintf(stderr, "range.c: ranges_fixup: " PRINTF_SIZE_ARG "-"
PRINTF_SIZE_ARG "\n", r->start, r->stop);
}
/* no stop range specified or stop is too big.
@@ -206,7 +206,7 @@
/* r->stop and r->start may be the same, however */
DEBUG(DEBUG_RANGE) {
- fprintf(stderr, "ending with start: %lu\tstop: %lu\n", r->start,
r->stop);
+ fprintf(stderr, "ending with start: "PRINTF_SIZE_ARG"\tstop:
"PRINTF_SIZE_ARG"\n", r->start, r->stop);
}
if (prev == NULL)
diff -urd boa-0.94.14rc20/src/read.c boa-0.94.14rc20.lfspatched/src/read.c
--- boa-0.94.14rc20/src/read.c 2006-01-01 00:01:59.000000000 +0100
+++ boa-0.94.14rc20.lfspatched/src/read.c 2006-11-18 00:51:02.579452986
+0100
@@ -38,7 +38,7 @@
int read_header(request * req)
{
- int bytes;
+ off_t bytes;
unsigned char *check, *buffer;
check = req->client_stream + req->parse_pos;
@@ -177,7 +177,7 @@
*/
if (req->content_length) {
- int content_length;
+ off_t content_length;
content_length = boa_atoi(req->content_length);
/* Is a content-length of 0 legal? */
@@ -193,7 +193,7 @@
&& content_length > single_post_limit) {
log_error_doc(req);
fprintf(stderr,
- "Content-Length [%d] > SinglePostLimit [%d] on
POST!\n",
+ "Content-Length [" PRINTF_SIZE_ARG "] >
SinglePostLimit [%d] on POST!\n",
content_length, single_post_limit);
send_r_bad_request(req);
return 0;
@@ -222,7 +222,7 @@
if (req->status < BODY_READ) {
/* only reached if request is split across more than one packet */
- unsigned int buf_bytes_left;
+ off_t buf_bytes_left;
buf_bytes_left = CLIENT_STREAM_SIZE - req->client_stream_pos;
if (buf_bytes_left < 1 || buf_bytes_left > CLIENT_STREAM_SIZE) {
@@ -271,7 +271,7 @@
DEBUG(DEBUG_HEADER_READ) {
log_error_time();
req->client_stream[req->client_stream_pos] = '\0';
- fprintf(stderr, "%s:%d -- We read %d bytes: \"%s\"\n",
+ fprintf(stderr, "%s:%d -- We read " PRINTF_SIZE_ARG " bytes:
\"%s\"\n",
__FILE__, __LINE__, bytes,
#ifdef VERY_FASCIST_LOGGING2
req->client_stream + req->client_stream_pos - bytes
@@ -307,8 +307,8 @@
int read_body(request * req)
{
- int bytes_read;
- unsigned int bytes_to_read, bytes_free;
+ off_t bytes_read;
+ off_t bytes_to_read, bytes_free;
bytes_free = BUFFER_SIZE - (req->header_end - req->header_line);
bytes_to_read = req->filesize - req->filepos;
@@ -365,8 +365,8 @@
int write_body(request * req)
{
- int bytes_written;
- unsigned int bytes_to_write = req->header_end - req->header_line;
+ off_t bytes_written;
+ off_t bytes_to_write = req->header_end - req->header_line;
if (req->filepos + bytes_to_write > req->filesize)
bytes_to_write = req->filesize - req->filepos;
@@ -400,7 +400,7 @@
}
DEBUG(DEBUG_HEADER_READ) {
log_error_time();
- fprintf(stderr, "%s:%d - wrote %d bytes of CGI body. %ld of %ld\n",
+ fprintf(stderr, "%s:%d - wrote " PRINTF_SIZE_ARG " bytes of CGI body.
" PRINTF_SIZE_ARG " of " PRINTF_SIZE_ARG "\n",
__FILE__, __LINE__,
bytes_written, req->filepos, req->filesize);
}
@@ -415,7 +415,7 @@
req->header_line[bytes_written] = '\0';
fprintf(stderr,
- "%s:%d - wrote %d bytes (%s). %lu of %lu\n",
+ "%s:%d - wrote " PRINTF_SIZE_ARG " bytes (%s). "
PRINTF_SIZE_ARG " of " PRINTF_SIZE_ARG "\n",
__FILE__, __LINE__, bytes_written,
req->header_line, req->filepos, req->filesize);
req->header_line[bytes_written] = c;
diff -urd boa-0.94.14rc20/src/request.c boa-0.94.14rc20.lfspatched/src/request.c
--- boa-0.94.14rc20/src/request.c 2006-01-01 00:01:59.000000000 +0100
+++ boa-0.94.14rc20.lfspatched/src/request.c 2006-11-18 00:51:34.625455735
+0100
@@ -259,14 +259,14 @@
static void sanitize_request(request * req, int new_req)
{
- static unsigned int bytes_to_zero = offsetof(request, fd);
+ static off_t bytes_to_zero = offsetof(request, fd);
if (new_req) {
req->kacount = ka_max;
req->time_last = current_time;
req->client_stream_pos = 0;
} else {
- unsigned int bytes_to_move =
+ off_t bytes_to_move =
req->client_stream_pos - req->parse_pos;
if (bytes_to_move) {
@@ -282,7 +282,7 @@
DEBUG(DEBUG_REQUEST) {
log_error_time();
- fprintf(stderr, "req: %p, offset: %u\n", (void *) req,
+ fprintf(stderr, "req: %p, offset: " PRINTF_SIZE_ARG "\n", (void *) req,
bytes_to_zero);
}
diff -urd boa-0.94.14rc20/src/util.c boa-0.94.14rc20.lfspatched/src/util.c
--- boa-0.94.14rc20/src/util.c 2006-01-01 00:01:59.000000000 +0100
+++ boa-0.94.14rc20.lfspatched/src/util.c 2006-11-17 23:54:24.287072985
+0100
@@ -502,7 +502,7 @@
memcpy(p, day_tab + t->tm_wday * 4, 4);
}
-char *simple_itoa(unsigned int i)
+char *simple_itoa(uint64_t i)
{
/* 21 digits plus null terminator, good for 64-bit or smaller ints
* for bigger ints, use a bigger buffer!