В далекой-далекой галактике есть одна программа, набор утилит для работы с NetFlow flow-tools. Работает за милу душу на полудюжине серверов и в ус не дует. Начал запускать ее на FreeBSD/amd64. Валицо, суко, с ошибкой не могу открыть файл. И создает такого вида каталоги:


util# ls -l /usr/local/flow-data/
total 1046
drwxr-xr-x 3 root wheel 512 Jan 16 17:26 -725323
drwxr-xr-x 3 root wheel 512 Jan 16 18:05 -727501

(в этом месте должен был быть год)

Добавил отладочных сообщений. Смотрю что происходит.
Структура каталогов создается функцией ftfile_mkpath(), имя файла конструируется ftfile_pathname(). Вызовы идут один за другим:


flow-capture: ftfile_pathname() ftime=1169005111
flow-capture: ftfile_pathname() tm_year=107, tm_mon=0, tm_mday=17, tm_zone=KRAT
flow-capture: ftfile_mkpath() ftime=1169005111
flow-capture: ftfile_mkpath() tm_year=-729401, tm_mon=9, tm_mday=23, tm_zone=LMT
flow-capture: open(2007/2007-01/2007-01-17/tmp-v05.2007-01-17.103831+0700): No such file or directory

Заголовки:


int ftfile_mkpath(u_int32 ftime, int nest);
void ftfile_pathname(char *buf, int bsize, int nest, struct ftver ftv,
int done, u_int32 ftime);

Внутри этих функций localtime вызывается абсолютно идентично..


struct tm *tm;
...
if (!(tm = localtime ((time_t*)&ftime))) {

Вызовы функций идут один за другим. Путем множественных тестов добился исправления. Как? Охренеть просто как: добавил в ftfile_mkpath() одну строчку


time_t tmp = ftime; // dikiy
if (!(tm = localtime ((time_t*)&tmp))) {

т.е. ввел промежуточную переменную. Что за фигня? Ошибка компилятора? Неправильно делалось преобразование типа?

Ладно, прекрасно, программа запустилась и начала даже работать. Несколько минут. До тех пор пока не начала переименовывать временный файл в постоянный. Новое имя файла генерится все той же ftfile_pathname() которая до этого прекрано отработала. И что же? Опять получилась какая-то херня… Ввел точно такую же фиктивную переменную — все арбайтен.

На машинках под i386, напомню, все работает прекрасно…


util# uname -a
FreeBSD util.core.kran 6.1-RELEASE-p5 FreeBSD 6.1-RELEASE-p5 #0: Tue Sep 26 14:05:44 KRAST 2006 dikiy@:/usr/obj/usr/src/sys/GENERIC amd64
util# gcc -v
Using built-in specs.
Configured with: FreeBSD/amd64 system compiler
Thread model: posix
gcc version 3.4.4 [FreeBSD] 20050518

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *