Subject: bug#7324: coreutils on Solaris 10

From: Eric Blake <[email-masked]>
Date: Wed, 03 Nov 2010 11:25:15 -0600

[adding bug-gnulib]

On 11/03/2010 10:51 AM, Eric Blake wrote:
>> The problem appears to be happening when trying to set the times on
>> the new file.
>>
>> I suspect it's an updated patch which Oracle has provided, which has
>> broken this.
> 
> Thanks for the report.  Have you tried with the latest snapshot?
> http://lists.gnu.org/archive/html/coreutils/2010-11/msg00004.html
> since it includes some recent gnulib fixes for at least some Solaris 10
> bugs?
> 
> Also, can you provide a truss report of a failing command, so we can see
> exactly how Oracle has broken futimens/utimensat, assuming that you are
> correct that it is a bug in setting file times?

I've confirmed the failure on:

$ uname -a
SunOS xxx 5.10 Generic_142900-06 sun4u sparc SUNW,Sun-Fire-V440 Solaris

via gnulib's test-fdutimensat:

../../gltests/test-fdutimensat.c:56: assertion failed
/bin/bash: line 5: 25716 Abort                   EXEEXT=''
srcdir='../../gltests' MAKE='make' ${dir}$tst
FAIL: test-fdutimensat
skipping test: setting fd time not supported on this file system
SKIP: test-futimens

$ truss gltests/test-fdutimensat
...
futimesat(-3041965, "test-fdutimensat.tlink/", 0x00000000) Err#20 ENOTDIR
lstat("test-fdutimensat.tlink/", 0xFFBFE06C)    Err#20 ENOTDIR
openat(-3041965, "test-fdutimensat.tlink", O_WRONLY) = 3
fcntl(3, F_DUP2FD, 0x00000003)                  = 3
futimesat(-3041965, "test-fdutimensat.tlink", 0xFFBFE0E4) = 0
fcntl(3, F_DUP2FD, 0x00000003)                  = 3
lstat("test-fdutimensat.tlink", 0xFFBFE06C)     = 0
fstat64(2, 0xFFBFD520)                          = 0
../../gltests/test-fdutimensat.cwrite(2, " . . / . . / g l t e s t"..,
32)      = 32
:56write(2, " : 5 6", 3)                                = 3
: assertion failed
write(2, " :   a s s e r t i o n  ".., 19)      = 19
sigaction(SIGABRT, 0x00000000, 0xFFBFE3E0)      = 0
sigaction(SIGABRT, 0xFFBFE290, 0xFFBFE330)      = 0
lwp_sigmask(SIG_SETMASK, 0x00000000, 0x00000000) = 0xFFBFFEFF [0x0000FFFF]
lwp_kill(1, SIGABRT)                            = 0
    Received signal #6, SIGABRT [default]
      siginfo: SIGABRT pid=27650 uid=84137 code=-1

It looks like Solaris 10 may have broken their hack where
futimesat(fd,NULL,time) could set the timestamps of an open fd, which
coreutils is relying on since futimens and utimensat do not exist on
that platform.

I'm looking into it further, but wanted to send this out now.

-- 
Eric Blake   [email-masked]    +1-801-349-2682
Libvirt virtualization library http://libvirt.org