On 03/13/2013 08:47 PM, Gary V. Vaughan wrote: > Hi Eric, > > Thanks for working on this. >
>> >> * doc/m4.texi (Command line files): Skip tests on systems where it >> is impossible to start with stdin/out closed. >> Reported by Gary V. Vaughan. >> > Not quite, the test is not skipped with your patch applied as is: > > hppa11.31% /bin/cat <&- 2>/dev/null > hppa11.31% echo $? > 2 So the reopened stdin has properties that still make it unreadable. Oh well. > hppa11.11% /bin/cat <&- 2>/dev/null > hppa11.11% echo $? > 0 Are you sure that transcript is right? At any rate, all we are looking for is some witness of whether the system reopens standard streams; it's probably an all-or-none situation. > > And yet, per my original report: > > hppa11.31% echo | /bin/cat >&- 2>/dev/null > hppa11.31% echo $? > 0 > hppa11.11% echo | /bin/cat >&- 2>/dev/null > hppa11.11% echo > 1 Okay, then I'll use closed stdout as the witness, and push my modified patch. Thanks for testing. In the meantime, I realized I have an account on some HPUX machines (probably the same machines as you, now that I recall who referred me access to those machines), and wrote a little probe program to find out more: #include <unistd.h> int main(void) { int ret = 0; if (close(0)) ret |= 1; if (close(1)) ret |= 2; if (close(2)) ret |= 4; return ret; } hppa11.11% ./foo; echo $? 0 hppa11.11% ./foo <&-; echo $? 1 hppa11.11% ./foo >&- 2>&-; echo $? 6 hppa11.23% ./foo; echo $? 0 hppa11.23% ./foo <&-; echo $? 0 hppa11.23% ./foo >&- 2>&-; echo $? 0 and another probe program: #include <unistd.h> #include <fcntl.h> int main(void) { int ret = 0; int i; i = fcntl(0, F_GETFL); if (i >= 0) { switch (i & O_ACCMODE) { case O_RDONLY: ret |= 0001; break; case O_WRONLY: ret |= 0002; break; case O_RDWR: ret |= 0003; break; } } i = fcntl(1, F_GETFL); if (i >= 0) { switch (i & O_ACCMODE) { case O_RDONLY: ret |= 0010; break; case O_WRONLY: ret |= 0020; break; case O_RDWR: ret |= 0030; break; } } i = fcntl(2, F_GETFL); if (i >= 0) { switch (i & O_ACCMODE) { case O_RDONLY: ret |= 0100; break; case O_WRONLY: ret |= 0200; break; case O_RDWR: ret |= 0300; break; } } return ret; } On Linux, where terminals are opened O_RDWR: linux% ./foo; printf %o\\n $? 333 linux% ./foo </dev/null >/dev/null; printf %o\\n $? 321 linux% ./foo <&- >&-; printf %o\\n $? 300 and on HPUX: hppa11.11% ./foo; printf %o\\n $? 333 hppa11.11% ./foo </dev/null >/dev/null; printf %o\\n $? 321 hppa11.11% ./foo <&- >&-; printf %o\\n $? 300 hppa11.23% ./foo; printf %o\\n $? 333 hppa11.23% ./foo </dev/null >/dev/null; printf %o\\n $? 321 hppa11.23% ./foo <&- >&-; printf %o\\n $? 322 Aha! it opens stdin as an O_WRONLY file, explaining why 'cat <&-' still fails (it can't read an O_WRONLY file), but 'cat >&-' succeeds (an fd was forced open). > Taking into account the bizzare difference between stdin and stdout behaviour, Not so bizarre once you understand my probes. > this works for me: > > syscmd(`echo|cat >&- 2>/dev/null')ifelse(sysval, `0', > `errprint(` skipping: system does not allow closing stdout > ')m4exit(`77')')dnl Yep, that's my plan. > Of course this reveals some more gnulib testsuite failures on ia64*-hpux*, but > that's another story... ;) And one for gnulib to get involved with. -- Eric Blake eblake redhat com +1-919-301-3266 Libvirt virtualization library http://libvirt.org
signature.asc
Description: OpenPGP digital signature
_______________________________________________ M4-patches mailing list M4-patches@gnu.org https://lists.gnu.org/mailman/listinfo/m4-patches