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.
Upstream-commit: 2c71710b74829787a0c78f7e02f45d31935a996f
Component: engine
This commit is contained in:
Alexander Larsson
2013-09-19 14:57:22 +02:00
committed by Tianon Gravi
parent 2af8abef3d
commit 6101a0a475

View File

@ -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