do not pick free/unused port by chance
cover do not pick free/unused port by chance
I'm rarely seeing tests like bind01, connect01, recv01, recvfrom01, recvmsg01, send01, sendfile0X, sendmsg01 and sendto01 failing. All these are picking ports with
formula: (getpid() % 32768) + 11000, which occasionally collides with test harness (beah) used in automated environment, which is running on ports 12432/12434.
This series removes that formula and lets kernel pick random free unused port instead. If test has no intention of binding any server on that port, but still needs some unused port number it can use newly added tst_get_unused_port() function.
Jan Stancek (2):
add tst_get_unused_port()
do not pick free/unused port by chance
include/test.h | 7 ++ lib/tst_net.c | 81 +++++++++++++++++++++++ testcases/kernel/syscalls/bind/bind01.c | 2 +- testcases/kernel/syscalls/connect/connect01.c | 17 +++-- testcases/kernel/syscalls/recv/recv01.c | 15 +++-- testcases/kernel/syscalls/recvfrom/recvfrom01.c | 15 +++-- testcases/kernel/syscalls/recvmsg/recvmsg01.c | 12 ++- testcases/kernel/syscalls/send/send01.c | 15 +++-- testcases/kernel/syscalls/sendfile/sendfile02.c | 6 ++- testcases/kernel/syscalls/sendfile/sendfile04.c | 6 ++- testcases/kernel/syscalls/sendfile/sendfile05.c | 6 ++- testcases/kernel/syscalls/sendfile/sendfile06.c | 6 ++- testcases/kernel/syscalls/sendmsg/sendmsg01.c | 17 +++-- testcases/kernel/syscalls/sendto/sendto01.c | 15 +++-- 14 files changed, 173 insertions(+), 47 deletions(-) create mode 100644 lib/tst_net.c
------------------------------------------------------------------------------
Subversion Kills Productivity. Get off Subversion & Make the Move to Perforce. With Perforce, you get hassle-free workflows. Merge that actually works. Faster operations. Version large binaries. Built-in WAN optimization and the freedom to use Git, Perforce or both. Make the move to Perforce.
http://pubads.g.doubleclick.net/gampad/clk?id=122218951&iu=/4140/ostg.clktrk
_______________________________________________
Ltp-list mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/ltp-list
PATCH 1/2 add tst_get_unused_port()
Returns unused port number for specified domain/type.
--- include/test.h | 7 +++++ lib/tst_net.c | 81 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 88 insertions(+), 0 deletions(-) create mode 100644 lib/tst_net.c
include/test.h +7 -0
@@ -288,6 +288,13 @@ int tst_fill_file(const char *path, char pattern, size_t bs, size_t bcount);uid_t tst_get_unused_uid (void );gid_t tst_get_unused_gid (void ); +/* lib/tst_net.c +* +* Return unused port +*/ +unsigned short tst_get_unused_port (unsigned short family,int type, +void (cleanup_fn )(void )); +#ifdef TST_USE_COMPAT16_SYSCALL #define TCID_BIT_SUFFIX "_16"#elif TST_USE_NEWER64_SYSCALL
lib/tst_net.c new file +81 -0
81 lines not on this page · raw message
Signature · 13 lines
1.7.1 ------------------------------------------------------------------------------ Subversion Kills Productivity. Get off Subversion & Make the Move to Perforce. With Perforce, you get hassle-free workflows. Merge that actually works. Faster operations. Version large binaries. Built-in WAN optimization and the freedom to use Git, Perforce or both. Make the move to Perforce. http://pubads.g.doubleclick.net/gampad/clk?id=122218951&iu=/4140/ostg.clktrk _______________________________________________ Ltp-list mailing list [email protected] https://lists.sourceforge.net/lists/listinfo/ltp-list
Re: [LTP] [PATCH 1/2] add tst_get_unused_port()
Quoted 1 line · On Fri 07 Mar 2014 12:39:24 Jan Stancek wrote:
Returns unused port number for specified domain/type.
the new func isn't race free, but it is way better than the current code, and the race is pretty small. so LGTM.
lib/tst_net.c line 34
Quoted 6 lines
lib/tst_net.c new file +6
-0+unsigned short tst_get_unused_port (unsigned short family,int type, +void (cleanup_fn )(void )) +{ +int sock; +struct sockaddr_in addr4; +struct sockaddr_in6 addr6;
the current code works, but isn't the point of sockaddr_storage to avoid this duplicated storage logic ? so you could just do:
struct sockaddr_storage _addr; struct sockaddr *addr = (struct sockaddr *)&_addr; struct sockaddr_in *addr4 = (struct sockaddr_in *)addr; struct sockaddr_in6 *addr6 = (struct sockaddr_in6 *)addr;
-mike
------------------------------------------------------------------------------
Subversion Kills Productivity. Get off Subversion & Make the Move to Perforce. With Perforce, you get hassle-free workflows. Merge that actually works. Faster operations. Version large binaries. Built-in WAN optimization and the freedom to use Git, Perforce or both. Make the move to Perforce.
http://pubads.g.doubleclick.net/gampad/clk?id=122218951&iu=/4140/ostg.clktrk
_______________________________________________
Ltp-list mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/ltp-list
[LTP] (no subject)
In reply to Jan StancekFrom: Jan Stancek <[email protected]>
Date: Fri, 7 Mar 2014 10:08:30 +0100
Subject: [PATCH v2 1/2] add tst_get_unused_port()
Returns unused port number for specified domain/type.
--- include/test.h | 7 +++++ lib/tst_net.c | 80 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 87 insertions(+), 0 deletions(-) create mode 100644 lib/tst_net.c
Changes in v2:
- use sockaddr_storage as suggested by Mike
include/test.h +7 -0
@@ -288,6 +288,13 @@ int tst_fill_file(const char *path, char pattern, size_t bs, size_t bcount);uid_t tst_get_unused_uid (void );gid_t tst_get_unused_gid (void ); +/* lib/tst_net.c +* +* Return unused port +*/ +unsigned short tst_get_unused_port (unsigned short family,int type, +void (cleanup_fn )(void )); +#ifdef TST_USE_COMPAT16_SYSCALL #define TCID_BIT_SUFFIX "_16"#elif TST_USE_NEWER64_SYSCALL
lib/tst_net.c new file +80 -0
80 lines not on this page · raw message
Signature · 13 lines
1.7.1 ------------------------------------------------------------------------------ Learn Graph Databases - Download FREE O'Reilly Book "Graph Databases" is the definitive new guide to graph databases and their applications. Written by three acclaimed leaders in the field, this first edition is now available. Download your free book today! http://p.sf.net/sfu/13534_NeoTech _______________________________________________ Ltp-list mailing list [email protected] https://lists.sourceforge.net/lists/listinfo/ltp-list
PATCH v2 1/2 add tst_get_unused_port()
In reply to Jan StancekReturns unused port number for specified domain/type.
--- include/test.h | 7 +++++ lib/tst_net.c | 80 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 87 insertions(+), 0 deletions(-) create mode 100644 lib/tst_net.c
include/test.h +7 -0
@@ -288,6 +288,13 @@ int tst_fill_file(const char *path, char pattern, size_t bs, size_t bcount);uid_t tst_get_unused_uid (void );gid_t tst_get_unused_gid (void ); +/* lib/tst_net.c +* +* Return unused port +*/ +unsigned short tst_get_unused_port (unsigned short family,int type, +void (cleanup_fn )(void )); +#ifdef TST_USE_COMPAT16_SYSCALL #define TCID_BIT_SUFFIX "_16"#elif TST_USE_NEWER64_SYSCALL
lib/tst_net.c new file +80 -0
80 lines not on this page · raw message
Signature · 13 lines
1.7.1 ------------------------------------------------------------------------------ Learn Graph Databases - Download FREE O'Reilly Book "Graph Databases" is the definitive new guide to graph databases and their applications. Written by three acclaimed leaders in the field, this first edition is now available. Download your free book today! http://p.sf.net/sfu/13534_NeoTech _______________________________________________ Ltp-list mailing list [email protected] https://lists.sourceforge.net/lists/listinfo/ltp-list
Re: [LTP] [PATCH v2 1/2] add tst_get_unused_port()
Hi!
Quoted 14 lines
Returns unused port number for specified domain/type.
Signed-off-by Jan Stancek <[email protected]>--- include/test.h | 7 +++++ lib/tst_net.c | 80 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 87 insertions(+), 0 deletions(-) create mode 100644 lib/tst_net.cinclude/test.h +0
-0
include/test.h int tst_fill_file(const char *path, char pattern, size_t bs, size_t bcount); · line 296
Quoted 9 lines
include/test.h +6
-0@@ -288,6 +288,13 @@ int tst_fill_file(const char *path, char pattern, size_t bs, size_t bcount);uid_t tst_get_unused_uid (void );gid_t tst_get_unused_gid (void ); +/* lib/tst_net.c +* +* Return unused port +*/ +unsigned short tst_get_unused_port (unsigned short family,int type, +void (cleanup_fn )(void ));
Just am minor nit to the API. Most of the tst_ functions as well as SAFE_MACROS() have cleanup callback as first parameter. Let's be consistent with that.
Signature · 13 lines
Cyril Hrubis [email protected] ------------------------------------------------------------------------------ Learn Graph Databases - Download FREE O'Reilly Book "Graph Databases" is the definitive new guide to graph databases and their applications. Written by three acclaimed leaders in the field, this first edition is now available. Download your free book today! http://p.sf.net/sfu/13534_NeoTech _______________________________________________ Ltp-list mailing list [email protected] https://lists.sourceforge.net/lists/listinfo/ltp-list
PATCH 2/2 do not pick free/unused port by chance
In reply to Jan StancekLet the kernel pick free random port and do not rely on previously used
formula: (getpid() % 32768) + 11000 to provide unused port numbers.
If test only needs unused port number (without binding anything to it) get it with tst_get_unused_port().
--- testcases/kernel/syscalls/bind/bind01.c | 2 +- testcases/kernel/syscalls/connect/connect01.c | 17 ++++++++++------- testcases/kernel/syscalls/recv/recv01.c | 15 +++++++++------ testcases/kernel/syscalls/recvfrom/recvfrom01.c | 15 +++++++++------ testcases/kernel/syscalls/recvmsg/recvmsg01.c | 12 ++++++++---- testcases/kernel/syscalls/send/send01.c | 15 +++++++++------ testcases/kernel/syscalls/sendfile/sendfile02.c | 6 +++++- testcases/kernel/syscalls/sendfile/sendfile04.c | 6 +++++- testcases/kernel/syscalls/sendfile/sendfile05.c | 6 +++++- testcases/kernel/syscalls/sendfile/sendfile06.c | 6 +++++- testcases/kernel/syscalls/sendmsg/sendmsg01.c | 17 ++++++++++------- testcases/kernel/syscalls/sendto/sendto01.c | 15 +++++++++------ 12 files changed, 85 insertions(+), 47 deletions(-)
testcases/kernel/syscalls/bind/bind01.c +1 -1
@@ -162,7 +162,7 @@ void setup(void)/* initialize sockaddr's */ sin1.sin_family =AF_INET ;/* this port must be unused! */ - sin1.sin_port =htons ((getpid () %32768 ) +10000 ); + sin1.sin_port =tst_get_unused_port (AF_INET ,SOCK_STREAM ,NULL ); sin1.sin_addr.s_addr =INADDR_ANY ; sin2.sin_family =AF_INET ;
testcases/kernel/syscalls/connect/connect01.c +10 -7
@@ -175,15 +175,11 @@ void setup(void) {TEST_PAUSE ;/* if -p option specified */ -/* initialize sockaddr's */ - sin1.sin_family =AF_INET ; - sin1.sin_port =htons ((getpid () %32768 ) +11000 ); - sin1.sin_addr.s_addr =INADDR_ANY ; pid =start_server (&sin1); sin2.sin_family =AF_INET ;/* this port must be unused! */ - sin2.sin_port =htons ((getpid () %32768 ) +10000 ); + sin2.sin_port =tst_get_unused_port (AF_INET ,SOCK_STREAM ,NULL ); sin2.sin_addr.s_addr =INADDR_ANY ; sin3.sin_family =AF_INET ;
@@ -243,15 +239,19 @@ void setup2(void)pid_t start_server (struct sockaddr_in *sin0) { -struct sockaddr_in sin1 = *sin0;pid_t pid; +socklen_t slen =sizeof (*sin0); + + sin0->sin_family =AF_INET ; + sin0->sin_port =0 ;/* pick random free port */ + sin0->sin_addr.s_addr =INADDR_ANY ; sfd =socket (PF_INET ,SOCK_STREAM ,0 );if (sfd <0 ) {tst_brkm (TBROK |TERRNO , cleanup,"server socket failed" );return -1 ; } -if (bind (sfd, (struct sockaddr *)&sin1,sizeof (sin1)) <0 ) { +if (bind (sfd, (struct sockaddr *)sin0,sizeof (*sin0)) <0 ) {tst_brkm (TBROK |TERRNO , cleanup,"server bind failed" );return -1 ; }
@@ -259,6 +259,9 @@ pid_t start_server(struct sockaddr_in *sin0)tst_brkm (TBROK |TERRNO , cleanup,"server listen failed" );return -1 ; } +if (getsockname (sfd, (struct sockaddr *)sin0, &slen) ==-1 ) +tst_brkm (TBROK |TERRNO , cleanup,"getsockname failed" ); +switch ((pid =FORK_OR_VFORK ())) {case 0 :/* child */ #ifdef UCLINUX
testcases/kernel/syscalls/recv/recv01.c +9 -6
@@ -159,10 +159,6 @@ void setup(void) {TEST_PAUSE ; -/* initialize sockaddr's */ - sin1.sin_family =AF_INET ; - sin1.sin_port =htons ((getpid () %32768 ) +11000 ); - sin1.sin_addr.s_addr =INADDR_ANY ; pid =start_server (&sin1); (void )signal (SIGPIPE ,SIG_IGN );
@@ -221,15 +217,19 @@ void cleanup1(void)pid_t start_server (struct sockaddr_in *sin0) { -struct sockaddr_in sin1 = *sin0;pid_t pid; +socklen_t slen =sizeof (*sin0); + + sin0->sin_family =AF_INET ; + sin0->sin_port =0 ;/* pick random free port */ + sin0->sin_addr.s_addr =INADDR_ANY ; sfd =socket (PF_INET ,SOCK_STREAM ,0 );if (sfd <0 ) {tst_brkm (TBROK |TERRNO , cleanup,"server socket failed" );return -1 ; } -if (bind (sfd, (struct sockaddr *)&sin1,sizeof (sin1)) <0 ) { +if (bind (sfd, (struct sockaddr *)sin0,sizeof (*sin0)) <0 ) {tst_brkm (TBROK |TERRNO , cleanup,"server bind failed" );return -1 ; }
@@ -237,6 +237,9 @@ pid_t start_server(struct sockaddr_in *sin0)tst_brkm (TBROK |TERRNO , cleanup,"server listen failed" );return -1 ; } +if (getsockname (sfd, (struct sockaddr *)sin0, &slen) ==-1 ) +tst_brkm (TBROK |TERRNO , cleanup,"getsockname failed" ); +switch ((pid =FORK_OR_VFORK ())) {case 0 :/* child */ #ifdef UCLINUX
testcases/kernel/syscalls/recvfrom/recvfrom01.c +9 -6
@@ -181,10 +181,6 @@ void setup(void) {TEST_PAUSE ; -/* initialize sockaddr's */ - sin1.sin_family =AF_INET ; - sin1.sin_port =htons ((getpid () %32768 ) +11000 ); - sin1.sin_addr.s_addr =INADDR_ANY ; pid =start_server (&sin1); }
@@ -248,15 +244,19 @@ void cleanup1(void)pid_t start_server (struct sockaddr_in *sin0) { -struct sockaddr_in sin1 = *sin0;pid_t pid; +socklen_t slen =sizeof (*sin0); + + sin0->sin_family =AF_INET ; + sin0->sin_port =0 ;/* pick random free port */ + sin0->sin_addr.s_addr =INADDR_ANY ; sfd =socket (PF_INET ,SOCK_STREAM ,0 );if (sfd <0 ) {tst_brkm (TBROK |TERRNO , cleanup,"server socket failed" );return -1 ; } -if (bind (sfd, (struct sockaddr *)&sin1,sizeof (sin1)) <0 ) { +if (bind (sfd, (struct sockaddr *)sin0,sizeof (*sin0)) <0 ) {tst_brkm (TBROK |TERRNO , cleanup,"server bind failed" );return -1 ; }
@@ -264,6 +264,9 @@ pid_t start_server(struct sockaddr_in *sin0)tst_brkm (TBROK |TERRNO , cleanup,"server listen failed" );return -1 ; } +if (getsockname (sfd, (struct sockaddr *)sin0, &slen) ==-1 ) +tst_brkm (TBROK |TERRNO , cleanup,"getsockname failed" ); +switch ((pid =FORK_OR_VFORK ())) {case 0 :/* child */ #ifdef UCLINUX
testcases/kernel/syscalls/recvmsg/recvmsg01.c +8 -4
@@ -260,10 +260,6 @@ void setup(void)int tfd;TEST_PAUSE ; -/* initialize sockaddr's */ - sin1.sin_family =AF_INET ; - sin1.sin_port =htons ((getpid () %32768 ) +11000 ); - sin1.sin_addr.s_addr =INADDR_ANY ;tst_tmpdir (); (void )strcpy (tmpsunpath,"udsockXXXXXX" ); tfd =mkstemp (tmpsunpath);
@@ -380,6 +376,11 @@ void cleanup2(void)pid_t start_server (struct sockaddr_in *ssin,struct sockaddr_un *ssun) {pid_t pid; +socklen_t slen =sizeof (*ssin); + + ssin->sin_family =AF_INET ; + ssin->sin_port =0 ;/* pick random free port */ + ssin->sin_addr.s_addr =INADDR_ANY ;/* set up inet socket */ sfd =socket (PF_INET ,SOCK_STREAM ,0 );
@@ -395,6 +396,9 @@ pid_t start_server(struct sockaddr_in *ssin, struct sockaddr_un *ssun)tst_brkm (TBROK |TERRNO , cleanup,"server listen failed" );return -1 ; } +if (getsockname (sfd, (struct sockaddr *)ssin, &slen) ==-1 ) +tst_brkm (TBROK |TERRNO , cleanup,"getsockname failed" ); +/* set up UNIX-domain socket */ ufd =socket (PF_UNIX ,SOCK_STREAM ,0 );if (ufd <0 ) {
testcases/kernel/syscalls/send/send01.c +9 -6
@@ -165,15 +165,19 @@ static char *argv0;static pid_t start_server (struct sockaddr_in *sin0) { -struct sockaddr_in sin1 = *sin0;pid_t pid; +socklen_t slen =sizeof (*sin0); + + sin0->sin_family =AF_INET ; + sin0->sin_port =0 ;/* pick random free port */ + sin0->sin_addr.s_addr =INADDR_ANY ; sfd =socket (PF_INET ,SOCK_STREAM ,0 );if (sfd <0 ) {tst_brkm (TBROK |TERRNO , cleanup,"server socket failed" );return -1 ; } -if (bind (sfd, (struct sockaddr *)&sin1,sizeof (sin1)) <0 ) { +if (bind (sfd, (struct sockaddr *)sin0,sizeof (*sin0)) <0 ) {tst_brkm (TBROK |TERRNO , cleanup,"server bind failed" );return -1 ; }
@@ -181,6 +185,9 @@ static pid_t start_server(struct sockaddr_in *sin0)tst_brkm (TBROK |TERRNO , cleanup,"server listen failed" );return -1 ; } +if (getsockname (sfd, (struct sockaddr *)sin0, &slen) ==-1 ) +tst_brkm (TBROK |TERRNO , cleanup,"getsockname failed" ); +switch ((pid =FORK_OR_VFORK ())) {case 0 :#ifdef UCLINUX
@@ -299,10 +306,6 @@ static void setup(void) {TEST_PAUSE ; -/* initialize sockaddr's */ - sin1.sin_family =AF_INET ; - sin1.sin_port =htons ((getpid () %32768 ) +11000 ); - sin1.sin_addr.s_addr =INADDR_ANY ; server_pid =start_server (&sin1);signal (SIGPIPE ,SIG_IGN );
testcases/kernel/syscalls/sendfile/sendfile02.c +5 -1
@@ -232,6 +232,7 @@ void cleanup()int create_server (void ) {static int count =0 ; +socklen_t slen =sizeof (sin1); sockfd =socket (PF_INET ,SOCK_DGRAM ,0 );if (sockfd <0 ) {
@@ -240,7 +241,7 @@ int create_server(void)return -1 ; } sin1.sin_family =AF_INET ; - sin1.sin_port =htons (((getpid () *TST_TOTAL ) %32768 ) +11000 + count); + sin1.sin_port =0 ;/* pick random free port */ sin1.sin_addr.s_addr =INADDR_ANY ; count++;if (bind (sockfd, (struct sockaddr *)&sin1,sizeof (sin1)) <0 ) {
@@ -248,6 +249,9 @@ int create_server(void) strerror(errno));return -1 ; } +if (getsockname (sockfd, (struct sockaddr *)&sin1, &slen) ==-1 ) +tst_brkm (TBROK |TERRNO , cleanup,"getsockname failed" ); + child_pid =FORK_OR_VFORK ();if (child_pid <0 ) { tst_brkm(TBROK, cleanup, "client/server fork failed: %s",
testcases/kernel/syscalls/sendfile/sendfile04.c +5 -1
@@ -218,6 +218,7 @@ void cleanup()int create_server (void ) {static int count =0 ; +socklen_t slen =sizeof (sin1); sockfd =socket (PF_INET ,SOCK_DGRAM ,0 );if (sockfd <0 ) {
@@ -226,7 +227,7 @@ int create_server(void)return -1 ; } sin1.sin_family =AF_INET ; - sin1.sin_port =htons (((getpid () *TST_TOTAL ) %32768 ) +11000 + count); + sin1.sin_port =0 ;/* pick random free port */ sin1.sin_addr.s_addr =INADDR_ANY ; count++;if (bind (sockfd, (struct sockaddr *)&sin1,sizeof (sin1)) <0 ) {
@@ -234,6 +235,9 @@ int create_server(void) strerror(errno));return -1 ; } +if (getsockname (sockfd, (struct sockaddr *)&sin1, &slen) ==-1 ) +tst_brkm (TBROK |TERRNO , cleanup,"getsockname failed" ); + child_pid =FORK_OR_VFORK ();if (child_pid <0 ) { tst_brkm(TBROK, cleanup, "client/server fork failed: %s",
testcases/kernel/syscalls/sendfile/sendfile05.c +5 -1
@@ -182,6 +182,7 @@ void cleanup()int create_server (void ) {static int count =0 ; +socklen_t slen =sizeof (sin1); sockfd =socket (PF_INET ,SOCK_DGRAM ,0 );if (sockfd <0 ) {
@@ -190,7 +191,7 @@ int create_server(void)return -1 ; } sin1.sin_family =AF_INET ; - sin1.sin_port =htons ((getpid () %32768 ) +11000 + count); + sin1.sin_port =0 ;/* pick random free port */ sin1.sin_addr.s_addr =INADDR_ANY ; count++;if (bind (sockfd, (struct sockaddr *)&sin1,sizeof (sin1)) <0 ) {
@@ -198,6 +199,9 @@ int create_server(void) strerror(errno));return -1 ; } +if (getsockname (sockfd, (struct sockaddr *)&sin1, &slen) ==-1 ) +tst_brkm (TBROK |TERRNO , cleanup,"getsockname failed" ); + child_pid =FORK_OR_VFORK ();if (child_pid <0 ) { tst_brkm(TBROK, cleanup, "client/server fork failed: %s",
testcases/kernel/syscalls/sendfile/sendfile06.c +5 -1
@@ -204,6 +204,7 @@ void cleanup()int create_server (void ) {static int count =0 ; +socklen_t slen =sizeof (sin1); sockfd =socket (PF_INET ,SOCK_DGRAM ,0 );if (sockfd <0 ) {
@@ -212,7 +213,7 @@ int create_server(void)return -1 ; } sin1.sin_family =AF_INET ; - sin1.sin_port =htons ((getpid () %32768 ) +11000 + count); + sin1.sin_port =0 ;/* pick random free port */ sin1.sin_addr.s_addr =INADDR_ANY ; count++;if (bind (sockfd, (struct sockaddr *)&sin1,sizeof (sin1)) <0 ) {
@@ -220,6 +221,9 @@ int create_server(void) strerror(errno));return -1 ; } +if (getsockname (sockfd, (struct sockaddr *)&sin1, &slen) ==-1 ) +tst_brkm (TBROK |TERRNO , cleanup,"getsockname failed" ); + child_pid =FORK_OR_VFORK ();if (child_pid <0 ) { tst_brkm(TBROK, cleanup, "client/server fork failed: %s",
testcases/kernel/syscalls/sendmsg/sendmsg01.c +10 -7
@@ -461,8 +461,12 @@ int main(int argc, char *argv[])static pid_t start_server (struct sockaddr_in *sin0,struct sockaddr_un *sun0) { -struct sockaddr_in sin1 = *sin0;pid_t pid; +socklen_t slen =sizeof (*sin0); + + sin0->sin_family =AF_INET ; + sin0->sin_port =0 ;/* pick random free port */ + sin0->sin_addr.s_addr =INADDR_ANY ;/* set up inet socket */ sfd =socket (PF_INET ,SOCK_STREAM ,0 );
@@ -471,7 +475,7 @@ static pid_t start_server(struct sockaddr_in *sin0, struct sockaddr_un *sun0) strerror(errno));return -1 ; } -if (bind (sfd, (struct sockaddr *)&sin1,sizeof (sin1)) <0 ) { +if (bind (sfd, (struct sockaddr *)sin0,sizeof (*sin0)) <0 ) {tst_brkm (TBROK , cleanup,"server bind failed: %s" ,strerror (errno));return -1 ;
@@ -481,6 +485,9 @@ static pid_t start_server(struct sockaddr_in *sin0, struct sockaddr_un *sun0) strerror(errno));return -1 ; } +if (getsockname (sfd, (struct sockaddr *)sin0, &slen) ==-1 ) +tst_brkm (TBROK |TERRNO , cleanup,"getsockname failed" ); +/* set up UNIX-domain socket */ ufd =socket (PF_UNIX ,SOCK_DGRAM ,0 );if (ufd <0 ) {
@@ -577,10 +584,6 @@ static void setup(void)tst_sig (FORK ,DEF_HANDLER , cleanup);TEST_PAUSE ; -/* initialize sockaddr's */ - sin1.sin_family =AF_INET ; - sin1.sin_port =htons ((getpid () %32768 ) +11000 ); - sin1.sin_addr.s_addr =INADDR_ANY ;tst_tmpdir ();snprintf (tmpsunpath,1024 ,"udsock%ld" , (long )time (NULL ));
@@ -713,7 +716,7 @@ static void setup5(void)* 5-tuple than already connected */ sin2 = sin1; - sin2.sin_port++; + sin2.sin_port =tst_get_unused_port (AF_INET ,SOCK_STREAM ,NULL ); }static void setup6 (void )
testcases/kernel/syscalls/sendto/sendto01.c +9 -6
@@ -237,15 +237,19 @@ static char *argv0;static pid_t start_server (struct sockaddr_in *sin0) { -struct sockaddr_in sin1 = *sin0;pid_t pid; +socklen_t slen =sizeof (*sin0); + + sin0->sin_family =AF_INET ; + sin0->sin_port =0 ;/* pick random free port */ + sin0->sin_addr.s_addr =INADDR_ANY ; sfd =socket (PF_INET ,SOCK_STREAM ,0 );if (sfd <0 ) {tst_brkm (TBROK |TERRNO , cleanup,"server socket failed" );return -1 ; } -if (bind (sfd, (struct sockaddr *)&sin1,sizeof (sin1)) <0 ) { +if (bind (sfd, (struct sockaddr *)sin0,sizeof (*sin0)) <0 ) {tst_brkm (TBROK |TERRNO , cleanup,"server bind failed" );return -1 ; }
@@ -253,6 +257,9 @@ static pid_t start_server(struct sockaddr_in *sin0)tst_brkm (TBROK |TERRNO , cleanup,"server listen failed" );return -1 ; } +if (getsockname (sfd, (struct sockaddr *)sin0, &slen) ==-1 ) +tst_brkm (TBROK |TERRNO , cleanup,"getsockname failed" ); +switch ((pid =FORK_OR_VFORK ())) {case 0 :#ifdef UCLINUX
@@ -372,10 +379,6 @@ static void setup(void) {TEST_PAUSE ; -/* initialize sockaddr's */ - sin1.sin_family =AF_INET ; - sin1.sin_port =htons ((getpid () %32768 ) +11000 ); - sin1.sin_addr.s_addr =INADDR_ANY ; server_pid =start_server (&sin1);signal (SIGPIPE ,SIG_IGN );
Signature · 13 lines
1.7.1 ------------------------------------------------------------------------------ Subversion Kills Productivity. Get off Subversion & Make the Move to Perforce. With Perforce, you get hassle-free workflows. Merge that actually works. Faster operations. Version large binaries. Built-in WAN optimization and the freedom to use Git, Perforce or both. Make the move to Perforce. http://pubads.g.doubleclick.net/gampad/clk?id=122218951&iu=/4140/ostg.clktrk _______________________________________________ Ltp-list mailing list [email protected] https://lists.sourceforge.net/lists/listinfo/ltp-list