--- cpio/cpio.c | 10 +++++++--- libarchive/archive_write_disk.c | 8 +++++--- 2 files changed, 12 insertions(+), 6 deletions(-) Index: cpio/cpio.c =================================================================== --- cpio/cpio.c.orig +++ cpio/cpio.c @@ -38,8 +38,11 @@ __FBSDID("$FreeBSD: src/usr.bin/cpio/cpi #ifdef HAVE_SYS_STAT_H #include #endif -#ifdef HAVE_SYS_TIME_H -#include +#ifdef HAVE_SYS_UTIME_H +#include +#endif +#ifdef HAVE_UTIME_H +#include #endif #ifdef HAVE_ERRNO_H #include @@ -786,7 +789,8 @@ restore_time(struct cpio *cpio, struct a } #ifdef HAVE_LUTIMES - if (lutimes(name, times) != 0) + if ((lutimes(name, times) != 0) && (errno==ENOSYS) && + (!S_ISLNK(archive_entry_mode(entry)) && utimes(name, times) != 0)) #else if ((AE_IFLNK != archive_entry_filetype(entry)) && utimes(name, times) != 0) Index: libarchive/archive_write_disk.c =================================================================== --- libarchive/archive_write_disk.c.orig +++ libarchive/archive_write_disk.c @@ -1265,7 +1265,9 @@ _archive_write_close(struct archive *_a) times[1].tv_sec = p->mtime; times[1].tv_usec = p->mtime_nanos / 1000; #ifdef HAVE_LUTIMES - lutimes(p->name, times); + if ((lutimes(p->name, times) != 0) && (errno==ENOSYS) && (!S_ISLNK(p->mode))) { + utimes(p->name, times); + } #else utimes(p->name, times); #endif @@ -1886,8 +1888,8 @@ set_time(int fd, int mode, const char *n (void)fd; /* UNUSED */ #endif #ifdef HAVE_LUTIMES - (void)mode; /* UNUSED */ - return (lutimes(name, times)); + return ((lutimes(name, times) != 0) && (errno==ENOSYS) && + (!S_ISLNK(mode)) && (utimes(name,mode) != 0)); #else if (S_ISLNK(mode)) return (0);