Package: libc0.3
Version: 2.19-11
Severity: normal
The futimens patch for the Hurd does not support UTIME_NOW or
UTIME_OMIT. POSIX says:
If the tv_nsec field of a timespec structure has the special value
UTIME_NOW, the file's relevant timestamp shall be set to the greatest
value supported by the file system that is not greater than the
current time. If the tv_nsec field has the special value UTIME_OMIT,
the file's relevant timestamp shall not be changed. In either case,
the tv_sec field shall be ignored.
This is the cause of the current man-db build failure:
https://buildd.debian.org/status/fetch.php?pkg=man-dbarch=hurd-i386ver=2.7.0.1-1stamp=1411530073
Gnulib defines UTIME_NOW to (-1) if it is not defined by the system.
But, since futimens doesn't specifically support it, setting the mtime
to {0, UTIME_NOW} just results in a timestamp one nanosecond less than
the epoch, which is not very useful. The attached test program, when
run with a file name argument, should result in a file whose
modification time is set to the current time.
I'll see if I can modify Gnulib or failing that man-db to work around
this, but of course it would be better for futimens to be fixed.
Thanks,
--
Colin Watson [cjwat...@debian.org]
#include sys/types.h
#include sys/stat.h
#include fcntl.h
#include stdio.h
#include stdlib.h
#include unistd.h
#define MUST(name, cond) \
do { \
if (!(cond)) { \
fprintf (stderr, name failed\n); \
abort (); \
} \
} while (0)
int main (int argc, char **argv)
{
int fd;
struct timespec times[2];
if (argc 2) {
fprintf (stderr, need file name\n);
exit (2);
}
fd = open (argv[1], O_RDWR | O_CREAT | O_TRUNC, 0666);
MUST (open, fd = 0);
times[0].tv_sec = 0;
times[0].tv_nsec = UTIME_NOW;
times[1].tv_sec = 0;
times[1].tv_nsec = UTIME_NOW;
MUST (futimens, futimens (fd, times) == 0);
MUST (close, close (fd) == 0);
return 0;
}