Ticket #3821: initialize struct stat st_[acm]tim.tv_nsec when present
commit243cdc175548c456661aabde4025a6ee2106b369
authorAndrey Gursky <andrey.gursky@e-mail.ua>
Tue, 18 Apr 2017 23:59:24 +0000 (19 01:59 +0200)
committerYury V. Zaytsev <yury@shurup.com>
Wed, 17 May 2017 19:18:58 +0000 (17 21:18 +0200)
treec15c72451f857ba2c2cfe400ce5c8cd33bca2812
parent71c8f5bedceafbf1e1253ad8884e7dc01856bebc
Ticket #3821: initialize struct stat st_[acm]tim.tv_nsec when present

struct stat in libc for Linux kernel contains few fields more since 14+
years [1]. From bits/stat.h:

```
        struct timespec st_atim; /* Time of last access.  */
        struct timespec st_mtim; /* Time of last modification.  */
        struct timespec st_ctim; /* Time of last status change.  */
    # define st_atime st_atim.tv_sec /* Backward compatibility.  */
    # define st_mtime st_mtim.tv_sec
    # define st_ctime st_ctim.tv_sec
```

The conventional fields became an alias.

POSIX.1-2008 made struct stat st_[acm]tim mandatory [2].

OS takes care to initialize struct stat properly [3]. By not using an OS
syscall or a libc wrapper to fill struct stat, we have to take care of
initializing all fields (or at least those being used later) explicitly.

[1]: https://www.sourceware.org/ml/libc-alpha/2002-12/msg00011.html
[2]: https://www.sourceware.org/ml/libc-alpha/2009-11/msg00102.html
[3]: https://www.sourceware.org/ml/libc-alpha/2002-12/msg00013.html

Fixes: file timestamps not preserved (https://mail.gnome.org/archives/mc-devel/2017-April/msg00000.html)
Reported-By: Nerijus Baliunas <nerijus@users.sourceforge.net>
Signed-off-by: Yury V. Zaytsev <yury@shurup.com>
configure.ac
src/vfs/cpio/cpio.c
src/vfs/tar/tar.c