Преамбула: легкий http-сервер, написанный на C на основе libevent v2 (evhttp), Linux, ARM, glibc2.3.4
Я пытаюсь обслуживать большие файлы (более 2 ГБ) с помощью evbuffer_add_file() в 32-битной системе. libevent был скомпилирован с флагом -D_FILE_OFFSET_BITS=64. Вот упрощенный код:
int fd = -1;
if ((fd = open(path, O_RDONLY)) < 0) {
// error handling
}
struct stat st;
if (fstat(fd, &st) < 0) {
// error handling
}
struct evbuffer *buffer = evbuffer_new();
evbuffer_set_flags(buffer, EVBUFFER_FLAG_DRAINS_TO_FD); // force using system's sendfile
evbuffer_add_file(buffer, fd, 0, st.st_size);
evhttp_send_reply(req, 200, NULL, buffer);
evbuffer_free(buffer);
st.st_size имеет правильное значение, в данном случае 4913809524, но заголовок ответа Content-Length имеет значение 618842228. Даже если я установлю для заголовка Content-Length соответствующее значение, передача файла остановится на 618842228...
Я пропустил или делаю что-то не так? Это вообще возможно?
заранее спасибо
(((ev_off_t)st.st_size) != st.st_size)
у вас проблемы? - person chux - Reinstate Monica   schedule 11.12.2013