Joachim, 2012/9/13 Joachim Schmitz <[email protected]>: > FYI, not sure whether it made it to the list,
it seems not. Thanks for the bug report. > -----Original Message----- > From: Joachim Schmitz [mailto:[email protected]] > Sent: Thursday, September 13, 2012 12:02 PM > To: '[email protected]' > Subject: patch-7.2: "make check" problem on HP NonStop: we can't open() a > symlink > > .patch-2.7/tests $ make check > make check-TESTS > . > PASS: crlf-handling > XFAIL: dash-o-append > PASS: empty-files > . > PASS: remember-reject-files > FAIL: symlinks > PASS: unmodified-files > ============================================================================ > Testsuite summary for GNU patch 2.7 > ============================================================================ > # TOTAL: 34 > # PASS: 32 > # SKIP: 0 > # XFAIL: 1 > # FAIL: 1 > # XPASS: 0 > # ERROR: 0 > ============================================================================ > See tests/test-suite.log > Please report to [email protected] > ./patch-2.7/tests $ cat test-suite.log > ========================================= > GNU patch 2.7: tests/test-suite.log > ========================================= > > # TOTAL: 34 > # PASS: 32 > # SKIP: 0 > # XFAIL: 1 > # FAIL: 1 > # XPASS: 0 > # ERROR: 0 > > .. contents:: :depth: 2 > > XFAIL: dash-o-append > ==================== > > * patch -o a.new a < a.diff > FAILED > expected: > patching file a > patching file a > got: > patching file a.new (read from a) > patching file a.new (read from a) > Hunk #1 FAILED at 1. > 1 out of 1 hunk FAILED -- saving rejects to file a.new.rej > * cat a.new > FAILED > expected: > two > three > got: > two > one > 2 tests (0 passed, 2 failed) > > FAIL: symlinks > ============== > > * ln -s f l > ok > * patch < create.diff || echo "Status: $?" > FAILED > expected: > File l is not a regular file -- can't patch > 1 out of 1 hunk ignored -- saving rejects to file l.rej > Status: 1 > got: > File l is not a regular file -- can't patch > ./patch-2.7/src/patch: **** Can't create temporary file ./l.oVcCGDA : Invalid > function argument > Status: 2 > * cat f > ok > * ln -s f l > ok > * patch < modify.diff || echo "Status: $?" > FAILED > expected: > File l is not a regular file -- can't patch > 1 out of 1 hunk ignored -- saving rejects to file l.rej > Status: 1 > got: > File l is not a regular file -- can't patch > ./patch-2.7/src/patch: **** Can't create temporary file ./l.oiCjgkU : Invalid > function argument > Status: 2 > * ln -s f l > ok > * patch < delete.diff || echo "Status: $?" > FAILED > expected: > File l is not a regular file -- can't patch > 1 out of 1 hunk ignored -- saving rejects to file l.rej > Status: 1 > got: > File l is not a regular file -- can't patch > ./patch-2.7/src/patch: **** Can't create temporary file ./l.olx81mW : Invalid > function argument > Status: 2 > * patch -p1 < create-symlink.diff || echo "Status: $?" > ok > * echo a > target1 && cat symlink > ok > * echo b > target1 && cat symlink > ok > * patch -p1 < modify-symlink.diff || echo "Status: $?" > FAILED > expected: > patching symbolic link symlink > got: > ./patch-2.7/src/patch: **** Can't create temporary file ./symlink.oTJw5jX : > Invalid function argument > Status: 2 > * echo a > target2 && cat symlink > FAILED > expected: > a > got: > cat: cannot open symlink > * echo b > target2 && cat symlink > FAILED > expected: > b > got: > cat: cannot open symlink > * patch -p1 < delete-symlink.diff || echo "Status: $?" > FAILED > expected: > patching symbolic link symlink > got: > ./patch-2.7/src/patch: **** Can't create temporary file ./symlink.otlv6CR : > Invalid function argument > Status: 2 > * test ! -L symlink > FAILED > * patch -p1 --backup < create-symlink.diff || echo "Status: $?" > FAILED > expected: > patching symbolic link symlink > got: > The next patch would create the file symlink, > which already exists! Assume -R? [n] > Apply anyway? [n] > Skipping patch. > ./patch-2.7/src/patch: **** Can't create temporary file /tmp/poUilvEh : > Invalid function argument > Status: 2 > * test -f symlink.orig && test ! -s symlink.orig > FAILED > * patch -p1 --backup < modify-symlink.diff || echo "Status: $?" > FAILED > expected: > patching symbolic link symlink > got: > ./patch-2.7/src/patch: **** Can't create temporary file ./symlink.oGNmIDV : > Invalid function argument > Status: 2 > * echo a > symlink.orig && cat target1 > FAILED > expected: > a > got: > cat: cannot open target1 > * echo b > symlink.orig && cat target1 > FAILED > expected: > b > got: > cat: cannot open target1 > * patch -p1 --backup < delete-symlink.diff || echo "Status: $?" > FAILED > expected: > patching symbolic link symlink > got: > ./patch-2.7/src/patch: **** Can't create temporary file ./symlink.osxQKXD : > Invalid function argument > Status: 2 > * echo a > symlink.orig && cat target2 > FAILED > expected: > a > got: > cat: cannot open target2 > * echo b > symlink.orig && cat target2 > FAILED > expected: > b > got: > cat: cannot open target2 > 23 tests (7 passed, 16 failed) > > .patch-2.7/tests $ > > That error gets generated on 2 places of scr/util.c, pretty close to one > another. > > for(;;) > { > int fd; > > if (gen_tempname (template, 0, flags, GT_NOCREATE)) > pfatal ("Can't create temporary file %s", template); > retry: > fd = open (template, O_CREAT | O_EXCL | flags, mode); > if (fd == -1) > { > if (errno == try_makedirs_errno) > { > makedirs (template); > /* FIXME: When patch fails, this may leave around empty > directories. */ > try_makedirs_errno = 0; > goto retry; > } > if (errno == EEXIST) > continue; > pfatal ("Can't create temporary file %s", template); > } > *name = template; > return fd; > } > > Further testing showed that we hit the 2nd occurrence. Seems the open() > doesn't like the mode parameter 0120777, and the S_IFLNK > part of it in particular, and indeed HP NonStop only supports the file type > bits S_IFREG, S_ISVTX and S_SYNC. > > Any ideas how to fix it? Is it fixable at all? Should I just ignore that > failed test? We only need to pass the file permissions here. How about this patch? diff --git a/src/patch.c b/src/patch.c index febfd42..1c6fb4b 100644 --- a/src/patch.c +++ b/src/patch.c @@ -297,7 +297,8 @@ main (int argc, char **argv) tmpoutst.st_size = -1; outfd = make_tempfile (&TMPOUTNAME, 'o', outname, - O_WRONLY | binary_transput, instat.st_mode); + O_WRONLY | binary_transput, + instat.st_mode & S_IRWXUGO); TMPOUTNAME_needs_removal = 1; if (diff_type == ED_DIFF) { outstate.zero_output = false; Thanks, Andreas
