у меня есть 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
, когда не указана конкретная дата и должно использоваться текущее время.
Почему это? Какой правильный способ справиться с этим?
Сначала я уясню то, что мне сначала было непонятно, из вопроса: это реализация 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
Других решений пока нет …