From ed658156133862b3f181c9d3061be24b91435095 Mon Sep 17 00:00:00 2001 From: Alexander Larsson Date: Thu, 19 Sep 2013 14:57:22 +0200 Subject: [PATCH] image: Handle systems that don't support O_PATH when updating timestamp Older kernel can't handle O_PATH in open() so this will fail on dirs and symlinks. For dirs wa can fallback to the normal Utimes, but for symlinks there is not much to do but ignore their timestamps. --- image.go | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) diff --git a/image.go b/image.go index 7819873757..b3e8de3e55 100644 --- a/image.go +++ b/image.go @@ -336,11 +336,21 @@ func (image *Image) applyLayer(layer, target string) error { O_PATH := 010000000 // Not in syscall yet fd, err := syscall.Open(update.path, syscall.O_RDWR | O_PATH | syscall.O_NOFOLLOW, 0600) - if err != nil { - return err + if err == syscall.EISDIR || err == syscall.ELOOP { + // O_PATH not supported, use Utimes except on symlinks where Utimes doesn't work + if err != syscall.ELOOP { + err = syscall.Utimes(update.path, update.time) + if err != nil { + return err + } + } + } else { + if err != nil { + return err + } + syscall.Futimes(fd, update.time) + _ = syscall.Close(fd) } - syscall.Futimes(fd, update.time) - _ = syscall.Close(fd) } return nil