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

Reply via email to