Skip to contentSkip to conversation

fix "aio_error" test

PATCH In review Mitani 3 participants 4 messages Sep 30, 2010 – Oct 13, 2010

lore
Share & tools
lore

Mitani

author
#0 lore raw

PATCH 1/1 fix "aio_error" test

Hi,

"conformance/interfaces/aio_error/3-1" failed with following message:
------------
conformance/interfaces/aio_error/3-1: execution: FAILED: Output:
aio_error/3-1.c bad aio_read return value()
------------

This testset seems to be the error root test for "aio_error()". Therefore, "aio_error()" must be called after failure of "aio_write()", I think.
But, "exit()" is called when expected failure of "aio_write()" occurred:
------------(3-1.c)

        if (aio_write(&aiocb) != 0)
 {
                printf(TNAME " bad aio_read return value()\n");
                exit(PTS_FAIL);

}
------------

I think that "exit()" must be called when "aio_write()" succeeded.

And the message of unexpected movement of "aio_write()" is "aio_read()"'s one.
And the indent of this program "3-1.c" seems to include both space and tab. I want to revise them, too.

============
---
a/testcases/open_posix_testsuite/conformance/interfaces/aio_error/3-1.c 2010
-09-22 22:31:24.000000000 +0900
+++
b/testcases/open_posix_testsuite/conformance/interfaces/aio_error/3-1.c 2010
-09-30 09:51:42.000000000 +0900
@@ -36,42 +36,41 @@

int main()
{
-
- char tmpfname[256];
+ char tmpfname[256];
#define BUF_SIZE 512

-        char buf[BUF_SIZE];
-        int fd;
-        struct aiocb aiocb;

+ char buf[BUF_SIZE];
+ int fd;
+ struct aiocb aiocb;
int ret=0;

if (sysconf(_SC_ASYNCHRONOUS_IO) != 200112L)
return PTS_UNSUPPORTED;

- snprintf(tmpfname, sizeof(tmpfname), "/tmp/pts_aio_error_3_1_%d",
- getpid());
- unlink(tmpfname);
- fd = open(tmpfname, O_CREAT | O_RDWR | O_EXCL,
- S_IRUSR | S_IWUSR);
- if (fd == -1)
- {
- printf(TNAME " Error at open(): %s\n",
- strerror(errno));
- exit(PTS_UNRESOLVED);
- }
+ snprintf(tmpfname, sizeof(tmpfname), "/tmp/pts_aio_error_3_1_%d",
+ getpid());
+ unlink(tmpfname);
+ fd = open(tmpfname, O_CREAT | O_RDWR | O_EXCL,
+ S_IRUSR | S_IWUSR);
+ if (fd == -1)
+ {
+ printf(TNAME " Error at open(): %s\n",
+ strerror(errno));
+ exit(PTS_UNRESOLVED);
+ }

- unlink(tmpfname);
+ unlink(tmpfname);

memset (&aiocb, 0, sizeof (struct aiocb));

-        aiocb.aio_fildes = fd;
-        aiocb.aio_buf = buf;
-        aiocb.aio_reqprio = -1;
-        aiocb.aio_nbytes = BUF_SIZE;

+ aiocb.aio_fildes = fd;
+ aiocb.aio_buf = buf;
+ aiocb.aio_reqprio = -1;
+ aiocb.aio_nbytes = BUF_SIZE;

- if (aio_write(&aiocb) != 0)
+ if (aio_write(&aiocb) == 0)
{
- printf(TNAME " bad aio_read return value()\n");
- exit(PTS_FAIL);
+ printf(TNAME " bad aio_write return value()\n");
+ exit(PTS_FAIL);
}

while (aio_error (&aiocb) == EINPROGRESS);
============

Regards--

-Tomonori Mitani

testcases/open_posix_testsuite/conformance/interfaces/aio_error/3-1.c +23 -24
@@ -36,42 +36,41 @@
 
 int main()
 {
-
-        char tmpfname[256];
+	char tmpfname[256];
 #define BUF_SIZE 512
-        char buf[BUF_SIZE];
-        int fd;
-        struct aiocb aiocb;
+	char buf[BUF_SIZE];
+	int fd;
+	struct aiocb aiocb;
 	int ret=0;
 
 	if (sysconf(_SC_ASYNCHRONOUS_IO) != 200112L)
 		return PTS_UNSUPPORTED;
 
-        snprintf(tmpfname, sizeof(tmpfname), "/tmp/pts_aio_error_3_1_%d",
-                  getpid());
-        unlink(tmpfname);
-        fd = open(tmpfname, O_CREAT | O_RDWR | O_EXCL,
-                  S_IRUSR | S_IWUSR);
-        if (fd == -1)
-        {
-                printf(TNAME " Error at open(): %s\n",
-                       strerror(errno));
-                exit(PTS_UNRESOLVED);
-        }
+	snprintf(tmpfname, sizeof(tmpfname), "/tmp/pts_aio_error_3_1_%d",
+			 getpid());
+	unlink(tmpfname);
+	fd = open(tmpfname, O_CREAT | O_RDWR | O_EXCL,
+			  S_IRUSR | S_IWUSR);
+	if (fd == -1)
+	{
+		printf(TNAME " Error at open(): %s\n",
+			   strerror(errno));
+		exit(PTS_UNRESOLVED);
+	}
 
-        unlink(tmpfname);
+	unlink(tmpfname);
 
 	memset (&aiocb, 0, sizeof (struct aiocb));
 
-        aiocb.aio_fildes = fd;
-        aiocb.aio_buf = buf;
-        aiocb.aio_reqprio = -1;
-        aiocb.aio_nbytes = BUF_SIZE;
+	aiocb.aio_fildes = fd;
+	aiocb.aio_buf = buf;
+	aiocb.aio_reqprio = -1;
+	aiocb.aio_nbytes = BUF_SIZE;
 
-        if (aio_write(&aiocb) != 0)
+	if (aio_write(&aiocb) == 0)
 	{
-                printf(TNAME " bad aio_read return value()\n");
-                exit(PTS_FAIL);
+		printf(TNAME " bad aio_write return value()\n");
+		exit(PTS_FAIL);
 	}
 
 	while (aio_error (&aiocb) == EINPROGRESS);

------------------------------------------------------------------------------
Start uncovering the many advantages of virtual appliances and start using them to simplify application deployment and accelerate your shift to cloud computing.
http://p.sf.net/sfu/novell-sfdev2dev

_______________________________________________
Ltp-list mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/ltp-list

#1 lore raw
Quoted 14 lines

Hi,

"conformance/interfaces/aio_error/3-1" failed with following message:
------------
conformance/interfaces/aio_error/3-1: execution: FAILED: Output:
aio_error/3-1.c bad aio_read return value()
------------

This testset seems to be the error root test for "aio_error()". Therefore, "aio_error()" must be called after failure of "aio_write()", I think.
But, "exit()" is called when expected failure of "aio_write()" occurred:
------------(3-1.c)

Quoted 9 lines
        if (aio_write(&aiocb) != 0)
 {
                printf(TNAME " bad aio_read return value()\n");
                exit(PTS_FAIL);

}
------------

I think that "exit()" must be called when "aio_write()" succeeded.

Agree.

Quoted 5 lines

And the message of unexpected movement of "aio_write()" is "aio_read()"'s one.
And the indent of this program "3-1.c" seems to include both space and tab. I want to revise them, too.

Another one should be fix like this.

	if (ret != EINVAL)
	{
-		printf(TNAME " errno is not EINVAL %s\n", strerror(errno));
+		printf(TNAME " errno is not EINVAL %s\n", strerror(ret));
		return PTS_FAIL;
	}
Quoted 98 lines

============
---
a/testcases/open_posix_testsuite/conformance/interfaces/aio_error/3-1.c 2010
-09-22 22:31:24.000000000 +0900
+++
b/testcases/open_posix_testsuite/conformance/interfaces/aio_error/3-1.c 2010
-09-30 09:51:42.000000000 +0900

testcases/open_posix_testsuite/conformance/interfaces/aio_error/3-1.c +23 -24
@@ -36,42 +36,41 @@
 
 int main()
 {
-
-        char tmpfname[256];
+	char tmpfname[256];
 #define BUF_SIZE 512
-        char buf[BUF_SIZE];
-        int fd;
-        struct aiocb aiocb;
+	char buf[BUF_SIZE];
+	int fd;
+	struct aiocb aiocb;
 	int ret=0;
 
 	if (sysconf(_SC_ASYNCHRONOUS_IO) != 200112L)
 		return PTS_UNSUPPORTED;
 
-        snprintf(tmpfname, sizeof(tmpfname), "/tmp/pts_aio_error_3_1_%d",
-                  getpid());
-        unlink(tmpfname);
-        fd = open(tmpfname, O_CREAT | O_RDWR | O_EXCL,
-                  S_IRUSR | S_IWUSR);
-        if (fd == -1)
-        {
-                printf(TNAME " Error at open(): %s\n",
-                       strerror(errno));
-                exit(PTS_UNRESOLVED);
-        }
+	snprintf(tmpfname, sizeof(tmpfname), "/tmp/pts_aio_error_3_1_%d",
+			 getpid());
+	unlink(tmpfname);
+	fd = open(tmpfname, O_CREAT | O_RDWR | O_EXCL,
+			  S_IRUSR | S_IWUSR);
+	if (fd == -1)
+	{
+		printf(TNAME " Error at open(): %s\n",
+			   strerror(errno));
+		exit(PTS_UNRESOLVED);
+	}
 
-        unlink(tmpfname);
+	unlink(tmpfname);
 
 	memset (&aiocb, 0, sizeof (struct aiocb));
 
-        aiocb.aio_fildes = fd;
-        aiocb.aio_buf = buf;
-        aiocb.aio_reqprio = -1;
-        aiocb.aio_nbytes = BUF_SIZE;
+	aiocb.aio_fildes = fd;
+	aiocb.aio_buf = buf;
+	aiocb.aio_reqprio = -1;
+	aiocb.aio_nbytes = BUF_SIZE;
 
-        if (aio_write(&aiocb) != 0)
+	if (aio_write(&aiocb) == 0)
 	{
-                printf(TNAME " bad aio_read return value()\n");
-                exit(PTS_FAIL);
+		printf(TNAME " bad aio_write return value()\n");
+		exit(PTS_FAIL);
 	}
 
 	while (aio_error (&aiocb) == EINPROGRESS);

============

Regards--

-Tomonori Mitani

------------------------------------------------------------------------

------------------------------------------------------------------------------
Start uncovering the many advantages of virtual appliances and start using them to simplify application deployment and accelerate your shift to cloud computing.
http://p.sf.net/sfu/novell-sfdev2dev

------------------------------------------------------------------------

_______________________________________________
Ltp-list mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/ltp-list

Signature · 14 lines
Regards
Bian Naimeng


------------------------------------------------------------------------------
Beautiful is writing same markup. Internet Explorer 9 supports
standards for HTML5, CSS3, SVG 1.1,  ECMAScript5, and DOM L2 & L3.
Spend less time writing and  rewriting code and more time creating great
experiences on the web. Be a part of the beta today.
http://p.sf.net/sfu/beautyoftheweb
_______________________________________________
Ltp-list mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/ltp-list
#2 lore raw

2010/10/8 Bian Naimeng <[email protected]>:

Quoted 115 lines
Quoted 21 lines

Hi,

"conformance/interfaces/aio_error/3-1" failed with following message:
------------
conformance/interfaces/aio_error/3-1: execution: FAILED: Output:
aio_error/3-1.c bad aio_read return value()
------------

This testset seems to be the error root test for "aio_error()". Therefore, "aio_error()" must be called after failure of "aio_write()", I think.
But, "exit()" is called when expected failure of "aio_write()" occurred:
------------(3-1.c)
        if (aio_write(&aiocb) != 0)
 {
                printf(TNAME " bad aio_read return value()\n"); exit(PTS_FAIL);
 }
------------

Quoted 2 lines

I think that "exit()" must be called when "aio_write()" succeeded.

 Agree.

Quoted 5 lines

And the message of unexpected movement of "aio_write()" is "aio_read()"'s one.
And the indent of this program "3-1.c" seems to include both space and tab. I want to revise them, too.

 Another one should be fix like this.

       if (ret != EINVAL)
       {
-               printf(TNAME " errno is not EINVAL %s\n", strerror(errno));
+               printf(TNAME " errno is not EINVAL %s\n", strerror(ret)); return PTS_FAIL;
       }

Quoted 74 lines

============
---
a/testcases/open_posix_testsuite/conformance/interfaces/aio_error/3-1.c       2010 -09-22 22:31:24.000000000 +0900
+++
b/testcases/open_posix_testsuite/conformance/interfaces/aio_error/3-1.c       2010 -09-30 09:51:42.000000000 +0900

testcases/open_posix_testsuite/conformance/interfaces/aio_error/3-1.c +23 -24
@@ -36,42 +36,41 @@
 
  int main()
  {
-
-        char tmpfname[256];
+     char tmpfname[256];
  #define BUF_SIZE 512
-        char buf[BUF_SIZE];
-        int fd;
-        struct aiocb aiocb;
+     char buf[BUF_SIZE];
+     int fd;
+     struct aiocb aiocb;
       int ret=0;
 
       if (sysconf(_SC_ASYNCHRONOUS_IO) != 200112L)
               return PTS_UNSUPPORTED;
 
-        snprintf(tmpfname, sizeof(tmpfname), "/tmp/pts_aio_error_3_1_%d",
-                  getpid());
-        unlink(tmpfname);
-        fd = open(tmpfname, O_CREAT | O_RDWR | O_EXCL,
-                  S_IRUSR | S_IWUSR);
-        if (fd == -1)
-        {
-                printf(TNAME " Error at open(): %s\n",
-                       strerror(errno));
-                exit(PTS_UNRESOLVED);
-        }
+     snprintf(tmpfname, sizeof(tmpfname), "/tmp/pts_aio_error_3_1_%d",
+                      getpid());
+     unlink(tmpfname);
+     fd = open(tmpfname, O_CREAT | O_RDWR | O_EXCL,
+                       S_IRUSR | S_IWUSR);
+     if (fd == -1)
+     {
+             printf(TNAME " Error at open(): %s\n",
+                        strerror(errno));
+             exit(PTS_UNRESOLVED);
+     }
 
-        unlink(tmpfname);
+     unlink(tmpfname);
 
       memset (&aiocb, 0, sizeof (struct aiocb));
 
-        aiocb.aio_fildes = fd;
-        aiocb.aio_buf = buf;
-        aiocb.aio_reqprio = -1;
-        aiocb.aio_nbytes = BUF_SIZE;
+     aiocb.aio_fildes = fd;
+     aiocb.aio_buf = buf;
+     aiocb.aio_reqprio = -1;
+     aiocb.aio_nbytes = BUF_SIZE;
 
-        if (aio_write(&aiocb) != 0)
+     if (aio_write(&aiocb) == 0)
       {
-                printf(TNAME " bad aio_read return value()\n");
-                exit(PTS_FAIL);
+             printf(TNAME " bad aio_write return value()\n");
+             exit(PTS_FAIL);
       }
 
Quoted 1 line

testcases/open_posix_testsuite/conformance/interfaces/aio_error/3-1.c line 76

Quoted 1 line
testcases/open_posix_testsuite/conformance/interfaces/aio_error/3-1.c +0 -0
       while (aio_error (&aiocb) == EINPROGRESS);

I'll respond to this sometime in the next couple of days after I
do some more investigation on the issue.
Thanks,
-Garrett

------------------------------------------------------------------------------
Beautiful is writing same markup. Internet Explorer 9 supports standards for HTML5, CSS3, SVG 1.1, ECMAScript5, and DOM L2 & L3. Spend less time writing and rewriting code and more time creating great experiences on the web. Be a part of the beta today.
http://p.sf.net/sfu/beautyoftheweb
_______________________________________________
Ltp-list mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/ltp-list

author
#3 lore raw
Quoted 135 lines

-----Original Message-----
From: Garrett Cooper [mailto:[email protected]]
Sent: Wednesday, October 13, 2010 5:24 AM
To: Bian Naimeng
Cc: Mitani; [email protected]; 當座 健市
Subject: Re: [LTP] [PATCH] fix "aio_error" test

2010/10/8 Bian Naimeng <[email protected]>:

Quoted 4 lines
Quoted 4 lines

Hi,

"conformance/interfaces/aio_error/3-1" failed with following

message:

Quoted 7 lines
Quoted 7 lines

------------
conformance/interfaces/aio_error/3-1: execution: FAILED: Output:
aio_error/3-1.c bad aio_read return value()
------------

This testset seems to be the error root test for "aio_error()". Therefore, "aio_error()" must be called after failure of

"aio_write()",

Quoted 2 lines
Quoted 2 lines

I think.
But, "exit()" is called when expected failure of "aio_write()"

occurred:

Quoted 8 lines
Quoted 8 lines

------------(3-1.c)

        if (aio_write(&aiocb) != 0)
 {
                printf(TNAME " bad aio_read return value()\n");
                exit(PTS_FAIL);

}
------------

Quoted 8 lines
Quoted 2 lines

I think that "exit()" must be called when "aio_write()" succeeded.

Agree.

Quoted 3 lines

And the message of unexpected movement of "aio_write()" is "aio_read()"'s one.
And the indent of this program "3-1.c" seems to include both space

and tab.

Quoted 8 lines
Quoted 2 lines

I want to revise them, too.

Another one should be fix like this.

       if (ret != EINVAL)
       {

- printf(TNAME " errno is not EINVAL %s\n",

strerror(errno));

Quoted 1 line

+ printf(TNAME " errno is not EINVAL %s\n",

strerror(ret));

Quoted 8 lines
               return PTS_FAIL;
       }
Quoted 5 lines

============
---

a/testcases/open_posix_testsuite/conformance/interfaces/aio_error/
3-1.c 2010

Quoted 3 lines
Quoted 3 lines

-09-22 22:31:24.000000000 +0900
+++

b/testcases/open_posix_testsuite/conformance/interfaces/aio_error/
3-1.c 2010

Quoted 17 lines
Quoted 17 lines

-09-30 09:51:42.000000000 +0900

(quoted diff) +4 -5
@@ -36,42 +36,41 @@
 
 int main()
 {
-
-        char tmpfname[256];
+     char tmpfname[256];
 #define BUF_SIZE 512
-        char buf[BUF_SIZE];
-        int fd;
-        struct aiocb aiocb;
+     char buf[BUF_SIZE];
+     int fd;
+     struct aiocb aiocb;
      int ret=0;
 
Quoted 4 lines

Review line 50

Quoted 4 lines
(quoted diff) +0 -1
      if (sysconf(_SC_ASYNCHRONOUS_IO) != 200112L)
              return PTS_UNSUPPORTED;
 
-        snprintf(tmpfname, sizeof(tmpfname),

"/tmp/pts_aio_error_3_1_%d",

Quoted 11 lines

Review line 49

Quoted 11 lines
(quoted diff) +1 -10
-                  getpid());
-        unlink(tmpfname);
-        fd = open(tmpfname, O_CREAT | O_RDWR | O_EXCL,
-                  S_IRUSR | S_IWUSR);
-        if (fd == -1)
-        {
-                printf(TNAME " Error at open(): %s\n",
-                       strerror(errno));
-                exit(PTS_UNRESOLVED);
-        }
+     snprintf(tmpfname, sizeof(tmpfname),

"/tmp/pts_aio_error_3_1_%d",

Quoted 34 lines
Quoted 34 lines
(quoted diff) +18 -8
+                      getpid());
+     unlink(tmpfname);
+     fd = open(tmpfname, O_CREAT | O_RDWR | O_EXCL,
+                       S_IRUSR | S_IWUSR);
+     if (fd == -1)
+     {
+             printf(TNAME " Error at open(): %s\n",
+                        strerror(errno));
+             exit(PTS_UNRESOLVED);
+     }
 
-        unlink(tmpfname);
+     unlink(tmpfname);
 
      memset (&aiocb, 0, sizeof (struct aiocb));
 
-        aiocb.aio_fildes = fd;
-        aiocb.aio_buf = buf;
-        aiocb.aio_reqprio = -1;
-        aiocb.aio_nbytes = BUF_SIZE;
+     aiocb.aio_fildes = fd;
+     aiocb.aio_buf = buf;
+     aiocb.aio_reqprio = -1;
+     aiocb.aio_nbytes = BUF_SIZE;
 
-        if (aio_write(&aiocb) != 0)
+     if (aio_write(&aiocb) == 0)
      {
-                printf(TNAME " bad aio_read return value()\n");
-                exit(PTS_FAIL);
+             printf(TNAME " bad aio_write return value()\n");
+             exit(PTS_FAIL);
      }
 
Quoted 6 lines
Quoted 1 line

Review line 76

Quoted 1 line
(quoted diff) +0 -0
      while (aio_error (&aiocb) == EINPROGRESS);

I'll respond to this sometime in the next couple of days after I
do some more investigation on the issue.
Thanks,
-Garrett

Hi,

I added Bian's following opinion to patch:
------------
Another one should be fix like this.

	if (ret != EINVAL)
	{
-		printf(TNAME " errno is not EINVAL %s\n", strerror(errno));
+		printf(TNAME " errno is not EINVAL %s\n", strerror(ret));
		return PTS_FAIL;
	}

------------

And I added following two modifications.

- Closing the file descriptor when exit.

- Clear "errno".
The first "unlink()" fails because the file doesn't exist. After that, ENOENT is set to "errno" and kept intact. I revised to clear "errno".

I noticed that there were similar problems in the other "aio-..." test programs. But I cannot judge whether other test programs must be revised.
I revise only "aio_error/3-1".

============

open_posix_testsuite/conformance/interfaces/aio_error/3-1.new renamed from open_posix_testsuite/conformance/interfaces/aio_error/3-1.c +27 -25
@@ -36,42 +36,43 @@
 
 int main()
 {
-
-        char tmpfname[256];
+	char tmpfname[256];
 #define BUF_SIZE 512
-        char buf[BUF_SIZE];
-        int fd;
-        struct aiocb aiocb;
+	char buf[BUF_SIZE];
+	int fd;
+	struct aiocb aiocb;
 	int ret=0;
 
 	if (sysconf(_SC_ASYNCHRONOUS_IO) != 200112L)
 		return PTS_UNSUPPORTED;
 
-        snprintf(tmpfname, sizeof(tmpfname), "/tmp/pts_aio_error_3_1_%d",
-                  getpid());
-        unlink(tmpfname);
-        fd = open(tmpfname, O_CREAT | O_RDWR | O_EXCL,
-                  S_IRUSR | S_IWUSR);
-        if (fd == -1)
-        {
-                printf(TNAME " Error at open(): %s\n",
-                       strerror(errno));
-                exit(PTS_UNRESOLVED);
-        }
+	snprintf(tmpfname, sizeof(tmpfname), "/tmp/pts_aio_error_3_1_%d",
+			 getpid());
+	unlink(tmpfname);
+	errno = 0;
+	fd = open(tmpfname, O_CREAT | O_RDWR | O_EXCL,
+			  S_IRUSR | S_IWUSR);
+	if (fd == -1)
+	{
+		printf(TNAME " Error at open(): %s\n",
+			   strerror(errno));
+		exit(PTS_UNRESOLVED);
+	}
 
-        unlink(tmpfname);
+	unlink(tmpfname);
 
 	memset (&aiocb, 0, sizeof (struct aiocb));
 
-        aiocb.aio_fildes = fd;
-        aiocb.aio_buf = buf;
-        aiocb.aio_reqprio = -1;
-        aiocb.aio_nbytes = BUF_SIZE;
+	aiocb.aio_fildes = fd;
+	aiocb.aio_buf = buf;
+	aiocb.aio_reqprio = -1;
+	aiocb.aio_nbytes = BUF_SIZE;
 
-        if (aio_write(&aiocb) != 0)
+	if (aio_write(&aiocb) == 0)
 	{
-                printf(TNAME " bad aio_read return value()\n");
-                exit(PTS_FAIL);
+		close(fd);
+		printf(TNAME " bad aio_write return value()\n");
+		exit(PTS_FAIL);
 	}
 
 	while (aio_error (&aiocb) == EINPROGRESS);
@@ -79,7 +80,8 @@
 
 	if (ret != EINVAL)
 	{
-		printf(TNAME " errno is not EINVAL %s\n", strerror(errno));
+		close(fd);
+		printf(TNAME " errno is not EINVAL %s\n", strerror(ret));
 		return PTS_FAIL;
 	}
 

============

Regards--

-Tomonori Mitani

open_posix_testsuite/conformance/interfaces/aio_error/3-1.new renamed from open_posix_testsuite/conformance/interfaces/aio_error/3-1.c +27 -25

76 lines not on this page · raw message

------------------------------------------------------------------------------
Beautiful is writing same markup. Internet Explorer 9 supports standards for HTML5, CSS3, SVG 1.1, ECMAScript5, and DOM L2 & L3. Spend less time writing and rewriting code and more time creating great experiences on the web. Be a part of the beta today.
http://p.sf.net/sfu/beautyoftheweb

_______________________________________________
Ltp-list mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/ltp-list