On Tue, Nov 9, 2010 at 7:32 PM, Caspar Zhang <[email protected]> wrote:
> Hi all,
>
> I met a strange error (only) in RHEL4, syscalls/sysconf
> failed the last test case because of the variable `actual'
> was not evaluated by `errno':
>
> sysconf01 56 TFAIL : sysconf correctly failed, but expected errno (22)
> != actual (0)
>
> I remov the var `actual' and use `errno' directly, seems it
> works. Re-test under RHEL4/5/6 and all of them pass the test.
>
> I have no idea why errno value couldn't be assigned to
> `actual', either not sure whether my patch works on other
> non-Red Hat distos. Please have a look at this patch if
> you want, thanks.
>
> Signed-off-by: Caspar Zhang <[email protected]>
>
> ---
> testcases/kernel/syscalls/sysconf/sysconf01.c | 9 ++++-----
> 1 files changed, 4 insertions(+), 5 deletions(-)
>
> diff --git a/testcases/kernel/syscalls/sysconf/sysconf01.c
> b/testcases/kernel/syscalls/sysconf/sysconf01.c
> index 783c6f5..42246f0 100644
> --- a/testcases/kernel/syscalls/sysconf/sysconf01.c
> +++ b/testcases/kernel/syscalls/sysconf/sysconf01.c
> @@ -153,19 +153,18 @@ int main()
>
> /* 56 */
> {
> - int retval, actual;
> + int retval;
> errno = 0;
> retval = sysconf(INVAL_FLAG);
> - actual = errno;
> if (retval != -1) {
> tst_resm(TFAIL,
> "sysconf succeeded for invalid flag (%i), "
> " retval=%d errno=%d: %s",
> - INVAL_FLAG, retval, actual,
> strerror(actual));
> - } else if (actual != EINVAL) {
> + INVAL_FLAG, retval, errno, strerror(errno));
> + } else if (errno != EINVAL) {
> tst_resm(TFAIL,
> "sysconf correctly failed, but expected "
> - "errno (%i) != actual (%i)", EINVAL, actual);
> + "errno (%i) != actual (%i)", EINVAL, errno);
> } else
> tst_resm(TPASS, "The invalid sysconf key was trapped "
> "appropriately");
Hmmm... well, for starters the definitions aren't the same:
extern int * __error();
#define errno (* __error())
I wonder if that has to do something with it... try out the following program:
#define _GNU_SOURCE 1
#include <errno.h>
#include <stdio.h>
int
main(void)
{
open(NULL, 0);
int actual = errno;
printf("%i %d %i %d\n", actual, actual, errno, errno);
return (0);
}
It spit out this on FreeBSD at least:
$ gcc -Wall -o test_errno_assignment test_errno_assignment.c
$ ./test_errno_assignment
14 14 14 14
HTH,
-Garrett
------------------------------------------------------------------------------
The Next 800 Companies to Lead America's Growth: New Video Whitepaper
David G. Thomson, author of the best-selling book "Blueprint to a
Billion" shares his insights and actions to help propel your
business during the next growth cycle. Listen Now!
http://p.sf.net/sfu/SAP-dev2dev
_______________________________________________
Ltp-list mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/ltp-list