Как правильно конвертировать timepec в timeval?

у меня есть struct timespec объект, который мне нужно преобразовать в struct timeval для использования с lutimes(...),

Я попытался следующее, но lutimes() жалуется.

const struct timespec ts; // originally provided as function parameter from FUSE
struct timeval tv;
tv.tv_sec = ts.tv_sec;
tv.tv_usec = ts.tv_nsec / 1000;
lutimes(path, tv); // returns -1; errno=EINVAL

Сейчас EINVAL от lutimes означает, что компонент usec находился вне 0 <= tv_usec < 1000000, что означает преобразование из timespec пошло не так. [источник]

Как правильно конвертировать из timespec в timeval?


Более тщательная отладка с touch команда, показывает, что timespec содержит tv_sec = 0 а также tv_nsec > 1000000000, когда не указана конкретная дата и должно использоваться текущее время.

Почему это? Какой правильный способ справиться с этим?

0

Решение

Сначала я уясню то, что мне сначала было непонятно, из вопроса: это реализация utimens работа в файловой системе fuse, и проблема в том, что иногда tv_nsec поле имеет значение, большее или равное 1 000 000 000.

Я предполагаю, что это одно из двух специальных значений: UTIME_NOW или же UTIME_OMIT,

Документация по предохранителям указывает на utimensat Страница справочника, в которой есть пояснения к этим особым значениям:
http://man7.org/linux/man-pages/man2/utimensat.2.html


Также проверьте nsec_valid функция в ядре Linux:

https://elixir.free-electrons.com/linux/v4.15.2/source/fs/utimes.c#L40

2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]