utimensat
=========

POSIX specification: http://www.opengroup.org/onlinepubs/9699919799/functions/utimensat.html

Gnulib module: utimensat

Portability problems fixed by Gnulib:

  * This function is missing on some platforms: glibc 2.3.6, MacOS X 10.3, FreeBSD 6.0, NetBSD 3.0, OpenBSD 3.8, AIX 5.1, HP-UX 11, IRIX 6.5, OSF/1 5.1, Solaris 10, Cygwin 1.5.x, mingw, Interix 3.5, BeOS. However, the replacement function may end up truncating timestamps to less resolution than supported by the file system.  Furthermore, the replacement function is not safe to be used in libraries and is not multithread-safe.

  * This function returns a bogus value instead of failing with ENOSYS on some platforms: Linux kernel 2.6.21.

  * This function fails with ENOSYS if passed the flag AT_SYMLINK_NOFOLLOW on a regular file: Linux kernel 2.6.22.

  * When using UTIME_OMIT or UTIME_NOW, some systems require the tv_sec argument to be 0, and don't necessarily handle all file permissions in the manner required by POSIX: Linux kernel 2.6.25.

  * When using UTIME_OMIT for the modification time, but specifying an access time, some systems fail to update the change time: Linux kernel 2.6.32.

Portability problems not fixed by Gnulib:

  * On some platforms, timestamps of symbolic links cannot be modified, so the replacement fails with ENOSYS if passed the flag AT_SYMLINK_NOFOLLOW on a symlink.

  * The mere act of using lstat modifies the access time of symlinks on some platforms, so utimensat with AT_SYMLINK_NOFOLLOW can only effectively change modification time: Cygwin.

  * The mere act of using stat modifies the access time of directories on some platforms, so utimensat can only effectively change directory modification time: Cygwin 1.5.x.

The gnulib module fdutimensat provides a similar interface.